1 /* 2 * Internal GPIO functions. 3 * 4 * Copyright (C) 2013, Intel Corporation 5 * Author: Mika Westerberg <mika.westerberg@linux.intel.com> 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 */ 11 12 #ifndef GPIOLIB_H 13 #define GPIOLIB_H 14 15 #include <linux/gpio/driver.h> 16 #include <linux/err.h> 17 #include <linux/device.h> 18 #include <linux/module.h> 19 #include <linux/cdev.h> 20 21 enum of_gpio_flags; 22 enum gpiod_flags; 23 enum gpio_lookup_flags; 24 struct acpi_device; 25 26 /** 27 * struct gpio_device - internal state container for GPIO devices 28 * @id: numerical ID number for the GPIO chip 29 * @dev: the GPIO device struct 30 * @chrdev: character device for the GPIO device 31 * @mockdev: class device used by the deprecated sysfs interface (may be 32 * NULL) 33 * @owner: helps prevent removal of modules exporting active GPIOs 34 * @chip: pointer to the corresponding gpiochip, holding static 35 * data for this device 36 * @descs: array of ngpio descriptors. 37 * @ngpio: the number of GPIO lines on this GPIO device, equal to the size 38 * of the @descs array. 39 * @base: GPIO base in the DEPRECATED global Linux GPIO numberspace, assigned 40 * at device creation time. 41 * @label: a descriptive name for the GPIO device, such as the part number 42 * or name of the IP component in a System on Chip. 43 * @data: per-instance data assigned by the driver 44 * @list: links gpio_device:s together for traversal 45 * 46 * This state container holds most of the runtime variable data 47 * for a GPIO device and can hold references and live on after the 48 * GPIO chip has been removed, if it is still being used from 49 * userspace. 50 */ 51 struct gpio_device { 52 int id; 53 struct device dev; 54 struct cdev chrdev; 55 struct device *mockdev; 56 struct module *owner; 57 struct gpio_chip *chip; 58 struct gpio_desc *descs; 59 int base; 60 u16 ngpio; 61 const char *label; 62 void *data; 63 struct list_head list; 64 65 #ifdef CONFIG_PINCTRL 66 /* 67 * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally 68 * describe the actual pin range which they serve in an SoC. This 69 * information would be used by pinctrl subsystem to configure 70 * corresponding pins for gpio usage. 71 */ 72 struct list_head pin_ranges; 73 #endif 74 }; 75 76 /** 77 * struct acpi_gpio_info - ACPI GPIO specific information 78 * @adev: reference to ACPI device which consumes GPIO resource 79 * @flags: GPIO initialization flags 80 * @gpioint: if %true this GPIO is of type GpioInt otherwise type is GpioIo 81 * @polarity: interrupt polarity as provided by ACPI 82 * @triggering: triggering type as provided by ACPI 83 * @quirks: Linux specific quirks as provided by struct acpi_gpio_mapping 84 */ 85 struct acpi_gpio_info { 86 struct acpi_device *adev; 87 enum gpiod_flags flags; 88 bool gpioint; 89 int polarity; 90 int triggering; 91 unsigned int quirks; 92 }; 93 94 /* gpio suffixes used for ACPI and device tree lookup */ 95 static const char * const gpio_suffixes[] = { "gpios", "gpio" }; 96 97 #ifdef CONFIG_OF_GPIO 98 struct gpio_desc *of_find_gpio(struct device *dev, 99 const char *con_id, 100 unsigned int idx, 101 enum gpio_lookup_flags *flags); 102 struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np, 103 const char *list_name, int index, enum of_gpio_flags *flags); 104 int of_gpiochip_add(struct gpio_chip *gc); 105 void of_gpiochip_remove(struct gpio_chip *gc); 106 #else 107 static inline struct gpio_desc *of_find_gpio(struct device *dev, 108 const char *con_id, 109 unsigned int idx, 110 enum gpio_lookup_flags *flags) 111 { 112 return ERR_PTR(-ENOENT); 113 } 114 static inline struct gpio_desc *of_get_named_gpiod_flags(struct device_node *np, 115 const char *list_name, int index, enum of_gpio_flags *flags) 116 { 117 return ERR_PTR(-ENOENT); 118 } 119 static inline int of_gpiochip_add(struct gpio_chip *gc) { return 0; } 120 static inline void of_gpiochip_remove(struct gpio_chip *gc) { } 121 #endif /* CONFIG_OF_GPIO */ 122 123 #ifdef CONFIG_ACPI 124 void acpi_gpiochip_add(struct gpio_chip *chip); 125 void acpi_gpiochip_remove(struct gpio_chip *chip); 126 127 void acpi_gpiochip_request_interrupts(struct gpio_chip *chip); 128 void acpi_gpiochip_free_interrupts(struct gpio_chip *chip); 129 130 int acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, 131 struct acpi_gpio_info *info); 132 133 struct gpio_desc *acpi_find_gpio(struct device *dev, 134 const char *con_id, 135 unsigned int idx, 136 enum gpiod_flags *dflags, 137 enum gpio_lookup_flags *lookupflags); 138 struct gpio_desc *acpi_node_get_gpiod(struct fwnode_handle *fwnode, 139 const char *propname, int index, 140 struct acpi_gpio_info *info); 141 142 int acpi_gpio_count(struct device *dev, const char *con_id); 143 144 bool acpi_can_fallback_to_crs(struct acpi_device *adev, const char *con_id); 145 #else 146 static inline void acpi_gpiochip_add(struct gpio_chip *chip) { } 147 static inline void acpi_gpiochip_remove(struct gpio_chip *chip) { } 148 149 static inline void 150 acpi_gpiochip_request_interrupts(struct gpio_chip *chip) { } 151 152 static inline void 153 acpi_gpiochip_free_interrupts(struct gpio_chip *chip) { } 154 155 static inline int 156 acpi_gpio_update_gpiod_flags(enum gpiod_flags *flags, struct acpi_gpio_info *info) 157 { 158 return 0; 159 } 160 161 static inline struct gpio_desc * 162 acpi_find_gpio(struct device *dev, const char *con_id, 163 unsigned int idx, enum gpiod_flags *dflags, 164 enum gpio_lookup_flags *lookupflags) 165 { 166 return ERR_PTR(-ENOENT); 167 } 168 static inline struct gpio_desc * 169 acpi_node_get_gpiod(struct fwnode_handle *fwnode, const char *propname, 170 int index, struct acpi_gpio_info *info) 171 { 172 return ERR_PTR(-ENXIO); 173 } 174 static inline int acpi_gpio_count(struct device *dev, const char *con_id) 175 { 176 return -ENODEV; 177 } 178 179 static inline bool acpi_can_fallback_to_crs(struct acpi_device *adev, 180 const char *con_id) 181 { 182 return false; 183 } 184 #endif 185 186 struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum); 187 int gpiod_get_array_value_complex(bool raw, bool can_sleep, 188 unsigned int array_size, 189 struct gpio_desc **desc_array, 190 int *value_array); 191 void gpiod_set_array_value_complex(bool raw, bool can_sleep, 192 unsigned int array_size, 193 struct gpio_desc **desc_array, 194 int *value_array); 195 196 /* This is just passed between gpiolib and devres */ 197 struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, 198 const char *propname, int index, 199 enum gpiod_flags dflags, 200 const char *label); 201 202 extern struct spinlock gpio_lock; 203 extern struct list_head gpio_devices; 204 205 struct gpio_desc { 206 struct gpio_device *gdev; 207 unsigned long flags; 208 /* flag symbols are bit numbers */ 209 #define FLAG_REQUESTED 0 210 #define FLAG_IS_OUT 1 211 #define FLAG_EXPORT 2 /* protected by sysfs_lock */ 212 #define FLAG_SYSFS 3 /* exported via /sys/class/gpio/control */ 213 #define FLAG_ACTIVE_LOW 6 /* value has active low */ 214 #define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */ 215 #define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */ 216 #define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */ 217 #define FLAG_IS_HOGGED 11 /* GPIO is hogged */ 218 #define FLAG_TRANSITORY 12 /* GPIO may lose value in sleep or reset */ 219 220 /* Connection label */ 221 const char *label; 222 /* Name of the GPIO */ 223 const char *name; 224 }; 225 226 int gpiod_request(struct gpio_desc *desc, const char *label); 227 void gpiod_free(struct gpio_desc *desc); 228 int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id, 229 unsigned long lflags, enum gpiod_flags dflags); 230 int gpiod_hog(struct gpio_desc *desc, const char *name, 231 unsigned long lflags, enum gpiod_flags dflags); 232 233 /* 234 * Return the GPIO number of the passed descriptor relative to its chip 235 */ 236 static inline int gpio_chip_hwgpio(const struct gpio_desc *desc) 237 { 238 return desc - &desc->gdev->descs[0]; 239 } 240 241 void devprop_gpiochip_set_names(struct gpio_chip *chip, 242 const struct fwnode_handle *fwnode); 243 244 /* With descriptor prefix */ 245 246 #define gpiod_emerg(desc, fmt, ...) \ 247 pr_emerg("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\ 248 ##__VA_ARGS__) 249 #define gpiod_crit(desc, fmt, ...) \ 250 pr_crit("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ 251 ##__VA_ARGS__) 252 #define gpiod_err(desc, fmt, ...) \ 253 pr_err("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ 254 ##__VA_ARGS__) 255 #define gpiod_warn(desc, fmt, ...) \ 256 pr_warn("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ 257 ##__VA_ARGS__) 258 #define gpiod_info(desc, fmt, ...) \ 259 pr_info("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ 260 ##__VA_ARGS__) 261 #define gpiod_dbg(desc, fmt, ...) \ 262 pr_debug("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\ 263 ##__VA_ARGS__) 264 265 /* With chip prefix */ 266 267 #define chip_emerg(chip, fmt, ...) \ 268 dev_emerg(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 269 #define chip_crit(chip, fmt, ...) \ 270 dev_crit(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 271 #define chip_err(chip, fmt, ...) \ 272 dev_err(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 273 #define chip_warn(chip, fmt, ...) \ 274 dev_warn(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 275 #define chip_info(chip, fmt, ...) \ 276 dev_info(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 277 #define chip_dbg(chip, fmt, ...) \ 278 dev_dbg(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 279 280 #ifdef CONFIG_GPIO_SYSFS 281 282 int gpiochip_sysfs_register(struct gpio_device *gdev); 283 void gpiochip_sysfs_unregister(struct gpio_device *gdev); 284 285 #else 286 287 static inline int gpiochip_sysfs_register(struct gpio_device *gdev) 288 { 289 return 0; 290 } 291 292 static inline void gpiochip_sysfs_unregister(struct gpio_device *gdev) 293 { 294 } 295 296 #endif /* CONFIG_GPIO_SYSFS */ 297 298 #endif /* GPIOLIB_H */ 299