at v4.1 14 kB view raw
1#ifndef __LINUX_GPIO_CONSUMER_H 2#define __LINUX_GPIO_CONSUMER_H 3 4#include <linux/bug.h> 5#include <linux/err.h> 6#include <linux/kernel.h> 7 8struct device; 9 10/** 11 * Opaque descriptor for a GPIO. These are obtained using gpiod_get() and are 12 * preferable to the old integer-based handles. 13 * 14 * Contrary to integers, a pointer to a gpio_desc is guaranteed to be valid 15 * until the GPIO is released. 16 */ 17struct gpio_desc; 18 19/** 20 * Struct containing an array of descriptors that can be obtained using 21 * gpiod_get_array(). 22 */ 23struct gpio_descs { 24 unsigned int ndescs; 25 struct gpio_desc *desc[]; 26}; 27 28#define GPIOD_FLAGS_BIT_DIR_SET BIT(0) 29#define GPIOD_FLAGS_BIT_DIR_OUT BIT(1) 30#define GPIOD_FLAGS_BIT_DIR_VAL BIT(2) 31 32/** 33 * Optional flags that can be passed to one of gpiod_* to configure direction 34 * and output value. These values cannot be OR'd. 35 */ 36enum gpiod_flags { 37 GPIOD_ASIS = 0, 38 GPIOD_IN = GPIOD_FLAGS_BIT_DIR_SET, 39 GPIOD_OUT_LOW = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT, 40 GPIOD_OUT_HIGH = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT | 41 GPIOD_FLAGS_BIT_DIR_VAL, 42}; 43 44#ifdef CONFIG_GPIOLIB 45 46/* Return the number of GPIOs associated with a device / function */ 47int gpiod_count(struct device *dev, const char *con_id); 48 49/* Acquire and dispose GPIOs */ 50struct gpio_desc *__must_check __gpiod_get(struct device *dev, 51 const char *con_id, 52 enum gpiod_flags flags); 53struct gpio_desc *__must_check __gpiod_get_index(struct device *dev, 54 const char *con_id, 55 unsigned int idx, 56 enum gpiod_flags flags); 57struct gpio_desc *__must_check __gpiod_get_optional(struct device *dev, 58 const char *con_id, 59 enum gpiod_flags flags); 60struct gpio_desc *__must_check __gpiod_get_index_optional(struct device *dev, 61 const char *con_id, 62 unsigned int index, 63 enum gpiod_flags flags); 64struct gpio_descs *__must_check gpiod_get_array(struct device *dev, 65 const char *con_id, 66 enum gpiod_flags flags); 67struct gpio_descs *__must_check gpiod_get_array_optional(struct device *dev, 68 const char *con_id, 69 enum gpiod_flags flags); 70void gpiod_put(struct gpio_desc *desc); 71void gpiod_put_array(struct gpio_descs *descs); 72 73struct gpio_desc *__must_check __devm_gpiod_get(struct device *dev, 74 const char *con_id, 75 enum gpiod_flags flags); 76struct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev, 77 const char *con_id, 78 unsigned int idx, 79 enum gpiod_flags flags); 80struct gpio_desc *__must_check __devm_gpiod_get_optional(struct device *dev, 81 const char *con_id, 82 enum gpiod_flags flags); 83struct gpio_desc *__must_check 84__devm_gpiod_get_index_optional(struct device *dev, const char *con_id, 85 unsigned int index, enum gpiod_flags flags); 86struct gpio_descs *__must_check devm_gpiod_get_array(struct device *dev, 87 const char *con_id, 88 enum gpiod_flags flags); 89struct gpio_descs *__must_check 90devm_gpiod_get_array_optional(struct device *dev, const char *con_id, 91 enum gpiod_flags flags); 92void devm_gpiod_put(struct device *dev, struct gpio_desc *desc); 93void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs); 94 95int gpiod_get_direction(struct gpio_desc *desc); 96int gpiod_direction_input(struct gpio_desc *desc); 97int gpiod_direction_output(struct gpio_desc *desc, int value); 98int gpiod_direction_output_raw(struct gpio_desc *desc, int value); 99 100/* Value get/set from non-sleeping context */ 101int gpiod_get_value(const struct gpio_desc *desc); 102void gpiod_set_value(struct gpio_desc *desc, int value); 103void gpiod_set_array(unsigned int array_size, 104 struct gpio_desc **desc_array, int *value_array); 105int gpiod_get_raw_value(const struct gpio_desc *desc); 106void gpiod_set_raw_value(struct gpio_desc *desc, int value); 107void gpiod_set_raw_array(unsigned int array_size, 108 struct gpio_desc **desc_array, int *value_array); 109 110/* Value get/set from sleeping context */ 111int gpiod_get_value_cansleep(const struct gpio_desc *desc); 112void gpiod_set_value_cansleep(struct gpio_desc *desc, int value); 113void gpiod_set_array_cansleep(unsigned int array_size, 114 struct gpio_desc **desc_array, 115 int *value_array); 116int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc); 117void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value); 118void gpiod_set_raw_array_cansleep(unsigned int array_size, 119 struct gpio_desc **desc_array, 120 int *value_array); 121 122int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce); 123 124int gpiod_is_active_low(const struct gpio_desc *desc); 125int gpiod_cansleep(const struct gpio_desc *desc); 126 127int gpiod_to_irq(const struct gpio_desc *desc); 128 129/* Convert between the old gpio_ and new gpiod_ interfaces */ 130struct gpio_desc *gpio_to_desc(unsigned gpio); 131int desc_to_gpio(const struct gpio_desc *desc); 132 133/* Child properties interface */ 134struct fwnode_handle; 135 136struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode, 137 const char *propname); 138struct gpio_desc *devm_get_gpiod_from_child(struct device *dev, 139 const char *con_id, 140 struct fwnode_handle *child); 141#else /* CONFIG_GPIOLIB */ 142 143static inline int gpiod_count(struct device *dev, const char *con_id) 144{ 145 return 0; 146} 147 148static inline struct gpio_desc *__must_check __gpiod_get(struct device *dev, 149 const char *con_id, 150 enum gpiod_flags flags) 151{ 152 return ERR_PTR(-ENOSYS); 153} 154static inline struct gpio_desc *__must_check 155__gpiod_get_index(struct device *dev, 156 const char *con_id, 157 unsigned int idx, 158 enum gpiod_flags flags) 159{ 160 return ERR_PTR(-ENOSYS); 161} 162 163static inline struct gpio_desc *__must_check 164__gpiod_get_optional(struct device *dev, const char *con_id, 165 enum gpiod_flags flags) 166{ 167 return ERR_PTR(-ENOSYS); 168} 169 170static inline struct gpio_desc *__must_check 171__gpiod_get_index_optional(struct device *dev, const char *con_id, 172 unsigned int index, enum gpiod_flags flags) 173{ 174 return ERR_PTR(-ENOSYS); 175} 176 177static inline struct gpio_descs *__must_check 178gpiod_get_array(struct device *dev, const char *con_id, 179 enum gpiod_flags flags) 180{ 181 return ERR_PTR(-ENOSYS); 182} 183 184static inline struct gpio_descs *__must_check 185gpiod_get_array_optional(struct device *dev, const char *con_id, 186 enum gpiod_flags flags) 187{ 188 return ERR_PTR(-ENOSYS); 189} 190 191static inline void gpiod_put(struct gpio_desc *desc) 192{ 193 might_sleep(); 194 195 /* GPIO can never have been requested */ 196 WARN_ON(1); 197} 198 199static inline void gpiod_put_array(struct gpio_descs *descs) 200{ 201 might_sleep(); 202 203 /* GPIO can never have been requested */ 204 WARN_ON(1); 205} 206 207static inline struct gpio_desc *__must_check 208__devm_gpiod_get(struct device *dev, 209 const char *con_id, 210 enum gpiod_flags flags) 211{ 212 return ERR_PTR(-ENOSYS); 213} 214static inline 215struct gpio_desc *__must_check 216__devm_gpiod_get_index(struct device *dev, 217 const char *con_id, 218 unsigned int idx, 219 enum gpiod_flags flags) 220{ 221 return ERR_PTR(-ENOSYS); 222} 223 224static inline struct gpio_desc *__must_check 225__devm_gpiod_get_optional(struct device *dev, const char *con_id, 226 enum gpiod_flags flags) 227{ 228 return ERR_PTR(-ENOSYS); 229} 230 231static inline struct gpio_desc *__must_check 232__devm_gpiod_get_index_optional(struct device *dev, const char *con_id, 233 unsigned int index, enum gpiod_flags flags) 234{ 235 return ERR_PTR(-ENOSYS); 236} 237 238static inline struct gpio_descs *__must_check 239devm_gpiod_get_array(struct device *dev, const char *con_id, 240 enum gpiod_flags flags) 241{ 242 return ERR_PTR(-ENOSYS); 243} 244 245static inline struct gpio_descs *__must_check 246devm_gpiod_get_array_optional(struct device *dev, const char *con_id, 247 enum gpiod_flags flags) 248{ 249 return ERR_PTR(-ENOSYS); 250} 251 252static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc) 253{ 254 might_sleep(); 255 256 /* GPIO can never have been requested */ 257 WARN_ON(1); 258} 259 260static inline void devm_gpiod_put_array(struct device *dev, 261 struct gpio_descs *descs) 262{ 263 might_sleep(); 264 265 /* GPIO can never have been requested */ 266 WARN_ON(1); 267} 268 269 270static inline int gpiod_get_direction(const struct gpio_desc *desc) 271{ 272 /* GPIO can never have been requested */ 273 WARN_ON(1); 274 return -ENOSYS; 275} 276static inline int gpiod_direction_input(struct gpio_desc *desc) 277{ 278 /* GPIO can never have been requested */ 279 WARN_ON(1); 280 return -ENOSYS; 281} 282static inline int gpiod_direction_output(struct gpio_desc *desc, int value) 283{ 284 /* GPIO can never have been requested */ 285 WARN_ON(1); 286 return -ENOSYS; 287} 288static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) 289{ 290 /* GPIO can never have been requested */ 291 WARN_ON(1); 292 return -ENOSYS; 293} 294 295 296static inline int gpiod_get_value(const struct gpio_desc *desc) 297{ 298 /* GPIO can never have been requested */ 299 WARN_ON(1); 300 return 0; 301} 302static inline void gpiod_set_value(struct gpio_desc *desc, int value) 303{ 304 /* GPIO can never have been requested */ 305 WARN_ON(1); 306} 307static inline void gpiod_set_array(unsigned int array_size, 308 struct gpio_desc **desc_array, 309 int *value_array) 310{ 311 /* GPIO can never have been requested */ 312 WARN_ON(1); 313} 314static inline int gpiod_get_raw_value(const struct gpio_desc *desc) 315{ 316 /* GPIO can never have been requested */ 317 WARN_ON(1); 318 return 0; 319} 320static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value) 321{ 322 /* GPIO can never have been requested */ 323 WARN_ON(1); 324} 325static inline void gpiod_set_raw_array(unsigned int array_size, 326 struct gpio_desc **desc_array, 327 int *value_array) 328{ 329 /* GPIO can never have been requested */ 330 WARN_ON(1); 331} 332 333static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc) 334{ 335 /* GPIO can never have been requested */ 336 WARN_ON(1); 337 return 0; 338} 339static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) 340{ 341 /* GPIO can never have been requested */ 342 WARN_ON(1); 343} 344static inline void gpiod_set_array_cansleep(unsigned int array_size, 345 struct gpio_desc **desc_array, 346 int *value_array) 347{ 348 /* GPIO can never have been requested */ 349 WARN_ON(1); 350} 351static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc) 352{ 353 /* GPIO can never have been requested */ 354 WARN_ON(1); 355 return 0; 356} 357static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, 358 int value) 359{ 360 /* GPIO can never have been requested */ 361 WARN_ON(1); 362} 363static inline void gpiod_set_raw_array_cansleep(unsigned int array_size, 364 struct gpio_desc **desc_array, 365 int *value_array) 366{ 367 /* GPIO can never have been requested */ 368 WARN_ON(1); 369} 370 371static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce) 372{ 373 /* GPIO can never have been requested */ 374 WARN_ON(1); 375 return -ENOSYS; 376} 377 378static inline int gpiod_is_active_low(const struct gpio_desc *desc) 379{ 380 /* GPIO can never have been requested */ 381 WARN_ON(1); 382 return 0; 383} 384static inline int gpiod_cansleep(const struct gpio_desc *desc) 385{ 386 /* GPIO can never have been requested */ 387 WARN_ON(1); 388 return 0; 389} 390 391static inline int gpiod_to_irq(const struct gpio_desc *desc) 392{ 393 /* GPIO can never have been requested */ 394 WARN_ON(1); 395 return -EINVAL; 396} 397 398static inline struct gpio_desc *gpio_to_desc(unsigned gpio) 399{ 400 return ERR_PTR(-EINVAL); 401} 402static inline int desc_to_gpio(const struct gpio_desc *desc) 403{ 404 /* GPIO can never have been requested */ 405 WARN_ON(1); 406 return -EINVAL; 407} 408 409#endif /* CONFIG_GPIOLIB */ 410 411/* 412 * Vararg-hacks! This is done to transition the kernel to always pass 413 * the options flags argument to the below functions. During a transition 414 * phase these vararg macros make both old-and-newstyle code compile, 415 * but when all calls to the elder API are removed, these should go away 416 * and the __gpiod_get() etc functions above be renamed just gpiod_get() 417 * etc. 418 */ 419#define __gpiod_get(dev, con_id, flags, ...) __gpiod_get(dev, con_id, flags) 420#define gpiod_get(varargs...) __gpiod_get(varargs, GPIOD_ASIS) 421#define __gpiod_get_index(dev, con_id, index, flags, ...) \ 422 __gpiod_get_index(dev, con_id, index, flags) 423#define gpiod_get_index(varargs...) __gpiod_get_index(varargs, GPIOD_ASIS) 424#define __gpiod_get_optional(dev, con_id, flags, ...) \ 425 __gpiod_get_optional(dev, con_id, flags) 426#define gpiod_get_optional(varargs...) __gpiod_get_optional(varargs, GPIOD_ASIS) 427#define __gpiod_get_index_optional(dev, con_id, index, flags, ...) \ 428 __gpiod_get_index_optional(dev, con_id, index, flags) 429#define gpiod_get_index_optional(varargs...) \ 430 __gpiod_get_index_optional(varargs, GPIOD_ASIS) 431#define __devm_gpiod_get(dev, con_id, flags, ...) \ 432 __devm_gpiod_get(dev, con_id, flags) 433#define devm_gpiod_get(varargs...) __devm_gpiod_get(varargs, GPIOD_ASIS) 434#define __devm_gpiod_get_index(dev, con_id, index, flags, ...) \ 435 __devm_gpiod_get_index(dev, con_id, index, flags) 436#define devm_gpiod_get_index(varargs...) \ 437 __devm_gpiod_get_index(varargs, GPIOD_ASIS) 438#define __devm_gpiod_get_optional(dev, con_id, flags, ...) \ 439 __devm_gpiod_get_optional(dev, con_id, flags) 440#define devm_gpiod_get_optional(varargs...) \ 441 __devm_gpiod_get_optional(varargs, GPIOD_ASIS) 442#define __devm_gpiod_get_index_optional(dev, con_id, index, flags, ...) \ 443 __devm_gpiod_get_index_optional(dev, con_id, index, flags) 444#define devm_gpiod_get_index_optional(varargs...) \ 445 __devm_gpiod_get_index_optional(varargs, GPIOD_ASIS) 446 447#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS) 448 449int gpiod_export(struct gpio_desc *desc, bool direction_may_change); 450int gpiod_export_link(struct device *dev, const char *name, 451 struct gpio_desc *desc); 452int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value); 453void gpiod_unexport(struct gpio_desc *desc); 454 455#else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */ 456 457static inline int gpiod_export(struct gpio_desc *desc, 458 bool direction_may_change) 459{ 460 return -ENOSYS; 461} 462 463static inline int gpiod_export_link(struct device *dev, const char *name, 464 struct gpio_desc *desc) 465{ 466 return -ENOSYS; 467} 468 469static inline int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) 470{ 471 return -ENOSYS; 472} 473 474static inline void gpiod_unexport(struct gpio_desc *desc) 475{ 476} 477 478#endif /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */ 479 480#endif