| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0 */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Internal GPIO functions. |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2013, Intel Corporation |
|---|
| 5 | 6 | * 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 | 7 | */ |
|---|
| 11 | 8 | |
|---|
| 12 | 9 | #ifndef GPIOLIB_H |
|---|
| .. | .. |
|---|
| 19 | 16 | #include <linux/module.h> |
|---|
| 20 | 17 | #include <linux/cdev.h> |
|---|
| 21 | 18 | |
|---|
| 22 | | -enum of_gpio_flags; |
|---|
| 23 | | -enum gpio_lookup_flags; |
|---|
| 24 | | -struct acpi_device; |
|---|
| 19 | +#define GPIOCHIP_NAME "gpiochip" |
|---|
| 25 | 20 | |
|---|
| 26 | 21 | /** |
|---|
| 27 | 22 | * struct gpio_device - internal state container for GPIO devices |
|---|
| .. | .. |
|---|
| 61 | 56 | const char *label; |
|---|
| 62 | 57 | void *data; |
|---|
| 63 | 58 | struct list_head list; |
|---|
| 59 | + struct blocking_notifier_head notifier; |
|---|
| 64 | 60 | |
|---|
| 65 | 61 | #ifdef CONFIG_PINCTRL |
|---|
| 66 | 62 | /* |
|---|
| .. | .. |
|---|
| 73 | 69 | #endif |
|---|
| 74 | 70 | }; |
|---|
| 75 | 71 | |
|---|
| 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 | 72 | /* gpio suffixes used for ACPI and device tree lookup */ |
|---|
| 95 | 73 | static __maybe_unused const char * const gpio_suffixes[] = { "gpios", "gpio" }; |
|---|
| 96 | 74 | |
|---|
| 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 */ |
|---|
| 75 | +struct gpio_array { |
|---|
| 76 | + struct gpio_desc **desc; |
|---|
| 77 | + unsigned int size; |
|---|
| 78 | + struct gpio_chip *chip; |
|---|
| 79 | + unsigned long *get_mask; |
|---|
| 80 | + unsigned long *set_mask; |
|---|
| 81 | + unsigned long invert_mask[]; |
|---|
| 82 | +}; |
|---|
| 122 | 83 | |
|---|
| 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); |
|---|
| 84 | +struct gpio_desc *gpiochip_get_desc(struct gpio_chip *gc, unsigned int hwnum); |
|---|
| 187 | 85 | int gpiod_get_array_value_complex(bool raw, bool can_sleep, |
|---|
| 188 | 86 | unsigned int array_size, |
|---|
| 189 | 87 | struct gpio_desc **desc_array, |
|---|
| 190 | | - int *value_array); |
|---|
| 88 | + struct gpio_array *array_info, |
|---|
| 89 | + unsigned long *value_bitmap); |
|---|
| 191 | 90 | int 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); |
|---|
| 91 | + unsigned int array_size, |
|---|
| 92 | + struct gpio_desc **desc_array, |
|---|
| 93 | + struct gpio_array *array_info, |
|---|
| 94 | + unsigned long *value_bitmap); |
|---|
| 195 | 95 | |
|---|
| 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; |
|---|
| 96 | +extern spinlock_t gpio_lock; |
|---|
| 203 | 97 | extern struct list_head gpio_devices; |
|---|
| 204 | 98 | |
|---|
| 205 | 99 | struct gpio_desc { |
|---|
| .. | .. |
|---|
| 214 | 108 | #define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */ |
|---|
| 215 | 109 | #define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */ |
|---|
| 216 | 110 | #define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */ |
|---|
| 111 | +#define FLAG_IRQ_IS_ENABLED 10 /* GPIO is connected to an enabled IRQ */ |
|---|
| 217 | 112 | #define FLAG_IS_HOGGED 11 /* GPIO is hogged */ |
|---|
| 218 | 113 | #define FLAG_TRANSITORY 12 /* GPIO may lose value in sleep or reset */ |
|---|
| 114 | +#define FLAG_PULL_UP 13 /* GPIO has pull up enabled */ |
|---|
| 115 | +#define FLAG_PULL_DOWN 14 /* GPIO has pull down enabled */ |
|---|
| 116 | +#define FLAG_BIAS_DISABLE 15 /* GPIO has pull disabled */ |
|---|
| 117 | +#define FLAG_EDGE_RISING 16 /* GPIO CDEV detects rising edge events */ |
|---|
| 118 | +#define FLAG_EDGE_FALLING 17 /* GPIO CDEV detects falling edge events */ |
|---|
| 219 | 119 | |
|---|
| 220 | 120 | /* Connection label */ |
|---|
| 221 | 121 | const char *label; |
|---|
| 222 | 122 | /* Name of the GPIO */ |
|---|
| 223 | 123 | const char *name; |
|---|
| 124 | +#ifdef CONFIG_OF_DYNAMIC |
|---|
| 125 | + struct device_node *hog; |
|---|
| 126 | +#endif |
|---|
| 127 | +#ifdef CONFIG_GPIO_CDEV |
|---|
| 128 | + /* debounce period in microseconds */ |
|---|
| 129 | + unsigned int debounce_period_us; |
|---|
| 130 | +#endif |
|---|
| 224 | 131 | }; |
|---|
| 225 | 132 | |
|---|
| 226 | 133 | int gpiod_request(struct gpio_desc *desc, const char *label); |
|---|
| .. | .. |
|---|
| 237 | 144 | { |
|---|
| 238 | 145 | return desc - &desc->gdev->descs[0]; |
|---|
| 239 | 146 | } |
|---|
| 240 | | - |
|---|
| 241 | | -void devprop_gpiochip_set_names(struct gpio_chip *chip, |
|---|
| 242 | | - const struct fwnode_handle *fwnode); |
|---|
| 243 | 147 | |
|---|
| 244 | 148 | /* With descriptor prefix */ |
|---|
| 245 | 149 | |
|---|
| .. | .. |
|---|
| 264 | 168 | |
|---|
| 265 | 169 | /* With chip prefix */ |
|---|
| 266 | 170 | |
|---|
| 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 */ |
|---|
| 171 | +#define chip_emerg(gc, fmt, ...) \ |
|---|
| 172 | + dev_emerg(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
|---|
| 173 | +#define chip_crit(gc, fmt, ...) \ |
|---|
| 174 | + dev_crit(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
|---|
| 175 | +#define chip_err(gc, fmt, ...) \ |
|---|
| 176 | + dev_err(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
|---|
| 177 | +#define chip_warn(gc, fmt, ...) \ |
|---|
| 178 | + dev_warn(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
|---|
| 179 | +#define chip_info(gc, fmt, ...) \ |
|---|
| 180 | + dev_info(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
|---|
| 181 | +#define chip_dbg(gc, fmt, ...) \ |
|---|
| 182 | + dev_dbg(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__) |
|---|
| 297 | 183 | |
|---|
| 298 | 184 | #endif /* GPIOLIB_H */ |
|---|