Branch data Line data Source code
1 : : /* SPDX-License-Identifier: GPL-2.0 */ 2 : : /* 3 : : * Internal GPIO functions. 4 : : * 5 : : * Copyright (C) 2013, Intel Corporation 6 : : * Author: Mika Westerberg <mika.westerberg@linux.intel.com> 7 : : */ 8 : : 9 : : #ifndef GPIOLIB_H 10 : : #define GPIOLIB_H 11 : : 12 : : #include <linux/gpio/driver.h> 13 : : #include <linux/gpio/consumer.h> /* for enum gpiod_flags */ 14 : : #include <linux/err.h> 15 : : #include <linux/device.h> 16 : : #include <linux/module.h> 17 : : #include <linux/cdev.h> 18 : : 19 : : /** 20 : : * struct gpio_device - internal state container for GPIO devices 21 : : * @id: numerical ID number for the GPIO chip 22 : : * @dev: the GPIO device struct 23 : : * @chrdev: character device for the GPIO device 24 : : * @mockdev: class device used by the deprecated sysfs interface (may be 25 : : * NULL) 26 : : * @owner: helps prevent removal of modules exporting active GPIOs 27 : : * @chip: pointer to the corresponding gpiochip, holding static 28 : : * data for this device 29 : : * @descs: array of ngpio descriptors. 30 : : * @ngpio: the number of GPIO lines on this GPIO device, equal to the size 31 : : * of the @descs array. 32 : : * @base: GPIO base in the DEPRECATED global Linux GPIO numberspace, assigned 33 : : * at device creation time. 34 : : * @label: a descriptive name for the GPIO device, such as the part number 35 : : * or name of the IP component in a System on Chip. 36 : : * @data: per-instance data assigned by the driver 37 : : * @list: links gpio_device:s together for traversal 38 : : * 39 : : * This state container holds most of the runtime variable data 40 : : * for a GPIO device and can hold references and live on after the 41 : : * GPIO chip has been removed, if it is still being used from 42 : : * userspace. 43 : : */ 44 : : struct gpio_device { 45 : : int id; 46 : : struct device dev; 47 : : struct cdev chrdev; 48 : : struct device *mockdev; 49 : : struct module *owner; 50 : : struct gpio_chip *chip; 51 : : struct gpio_desc *descs; 52 : : int base; 53 : : u16 ngpio; 54 : : const char *label; 55 : : void *data; 56 : : struct list_head list; 57 : : 58 : : #ifdef CONFIG_PINCTRL 59 : : /* 60 : : * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally 61 : : * describe the actual pin range which they serve in an SoC. This 62 : : * information would be used by pinctrl subsystem to configure 63 : : * corresponding pins for gpio usage. 64 : : */ 65 : : struct list_head pin_ranges; 66 : : #endif 67 : : }; 68 : : 69 : : /* gpio suffixes used for ACPI and device tree lookup */ 70 : : static __maybe_unused const char * const gpio_suffixes[] = { "gpios", "gpio" }; 71 : : 72 : : struct gpio_array { 73 : : struct gpio_desc **desc; 74 : : unsigned int size; 75 : : struct gpio_chip *chip; 76 : : unsigned long *get_mask; 77 : : unsigned long *set_mask; 78 : : unsigned long invert_mask[]; 79 : : }; 80 : : 81 : : struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum); 82 : : int gpiod_get_array_value_complex(bool raw, bool can_sleep, 83 : : unsigned int array_size, 84 : : struct gpio_desc **desc_array, 85 : : struct gpio_array *array_info, 86 : : unsigned long *value_bitmap); 87 : : int gpiod_set_array_value_complex(bool raw, bool can_sleep, 88 : : unsigned int array_size, 89 : : struct gpio_desc **desc_array, 90 : : struct gpio_array *array_info, 91 : : unsigned long *value_bitmap); 92 : : 93 : : extern spinlock_t gpio_lock; 94 : : extern struct list_head gpio_devices; 95 : : 96 : : struct gpio_desc { 97 : : struct gpio_device *gdev; 98 : : unsigned long flags; 99 : : /* flag symbols are bit numbers */ 100 : : #define FLAG_REQUESTED 0 101 : : #define FLAG_IS_OUT 1 102 : : #define FLAG_EXPORT 2 /* protected by sysfs_lock */ 103 : : #define FLAG_SYSFS 3 /* exported via /sys/class/gpio/control */ 104 : : #define FLAG_ACTIVE_LOW 6 /* value has active low */ 105 : : #define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */ 106 : : #define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */ 107 : : #define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */ 108 : : #define FLAG_IRQ_IS_ENABLED 10 /* GPIO is connected to an enabled IRQ */ 109 : : #define FLAG_IS_HOGGED 11 /* GPIO is hogged */ 110 : : #define FLAG_TRANSITORY 12 /* GPIO may lose value in sleep or reset */ 111 : : #define FLAG_PULL_UP 13 /* GPIO has pull up enabled */ 112 : : #define FLAG_PULL_DOWN 14 /* GPIO has pull down enabled */ 113 : : 114 : : /* Connection label */ 115 : : const char *label; 116 : : /* Name of the GPIO */ 117 : : const char *name; 118 : : }; 119 : : 120 : : int gpiod_request(struct gpio_desc *desc, const char *label); 121 : : void gpiod_free(struct gpio_desc *desc); 122 : : int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id, 123 : : unsigned long lflags, enum gpiod_flags dflags); 124 : : int gpiod_hog(struct gpio_desc *desc, const char *name, 125 : : unsigned long lflags, enum gpiod_flags dflags); 126 : : 127 : : /* 128 : : * Return the GPIO number of the passed descriptor relative to its chip 129 : : */ 130 : : static inline int gpio_chip_hwgpio(const struct gpio_desc *desc) 131 : : { 132 : 3 : return desc - &desc->gdev->descs[0]; 133 : : } 134 : : 135 : : /* With descriptor prefix */ 136 : : 137 : : #define gpiod_emerg(desc, fmt, ...) \ 138 : : pr_emerg("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\ 139 : : ##__VA_ARGS__) 140 : : #define gpiod_crit(desc, fmt, ...) \ 141 : : pr_crit("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ 142 : : ##__VA_ARGS__) 143 : : #define gpiod_err(desc, fmt, ...) \ 144 : : pr_err("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ 145 : : ##__VA_ARGS__) 146 : : #define gpiod_warn(desc, fmt, ...) \ 147 : : pr_warn("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ 148 : : ##__VA_ARGS__) 149 : : #define gpiod_info(desc, fmt, ...) \ 150 : : pr_info("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ 151 : : ##__VA_ARGS__) 152 : : #define gpiod_dbg(desc, fmt, ...) \ 153 : : pr_debug("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\ 154 : : ##__VA_ARGS__) 155 : : 156 : : /* With chip prefix */ 157 : : 158 : : #define chip_emerg(chip, fmt, ...) \ 159 : : dev_emerg(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 160 : : #define chip_crit(chip, fmt, ...) \ 161 : : dev_crit(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 162 : : #define chip_err(chip, fmt, ...) \ 163 : : dev_err(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 164 : : #define chip_warn(chip, fmt, ...) \ 165 : : dev_warn(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 166 : : #define chip_info(chip, fmt, ...) \ 167 : : dev_info(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 168 : : #define chip_dbg(chip, fmt, ...) \ 169 : : dev_dbg(&chip->gpiodev->dev, "(%s): " fmt, chip->label, ##__VA_ARGS__) 170 : : 171 : : #ifdef CONFIG_GPIO_SYSFS 172 : : 173 : : int gpiochip_sysfs_register(struct gpio_device *gdev); 174 : : void gpiochip_sysfs_unregister(struct gpio_device *gdev); 175 : : 176 : : #else 177 : : 178 : : static inline int gpiochip_sysfs_register(struct gpio_device *gdev) 179 : : { 180 : : return 0; 181 : : } 182 : : 183 : : static inline void gpiochip_sysfs_unregister(struct gpio_device *gdev) 184 : : { 185 : : } 186 : : 187 : : #endif /* CONFIG_GPIO_SYSFS */ 188 : : 189 : : #endif /* GPIOLIB_H */