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