Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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 */