blob: c31f4626915de3936c1daf89c559738eb475040a [file] [log] [blame]
Linus Walleijdae5f0a2018-09-25 09:08:48 +02001/* SPDX-License-Identifier: GPL-2.0 */
Mika Westerberg664e3e52014-01-08 12:40:54 +02002/*
3 * Internal GPIO functions.
4 *
5 * Copyright (C) 2013, Intel Corporation
6 * Author: Mika Westerberg <mika.westerberg@linux.intel.com>
Mika Westerberg664e3e52014-01-08 12:40:54 +02007 */
8
9#ifndef GPIOLIB_H
10#define GPIOLIB_H
11
Linus Walleijff2b1352015-10-20 11:10:38 +020012#include <linux/gpio/driver.h>
Linus Walleij63f2dc02018-02-08 17:57:43 +010013#include <linux/gpio/consumer.h> /* for enum gpiod_flags */
Mika Westerberg5ccff852014-01-08 12:40:56 +020014#include <linux/err.h>
15#include <linux/device.h>
Linus Walleijff2b1352015-10-20 11:10:38 +020016#include <linux/module.h>
17#include <linux/cdev.h>
Mika Westerberg5ccff852014-01-08 12:40:56 +020018
Geert Uytterhoevenddd88912019-11-27 09:42:47 +010019#define GPIOCHIP_NAME "gpiochip"
20
Mika Westerberg5ccff852014-01-08 12:40:56 +020021/**
Linus Walleijff2b1352015-10-20 11:10:38 +020022 * struct gpio_device - internal state container for GPIO devices
23 * @id: numerical ID number for the GPIO chip
24 * @dev: the GPIO device struct
Linus Walleij3c702e92015-10-21 15:29:53 +020025 * @chrdev: character device for the GPIO device
Linus Walleijafbc4f32016-02-09 13:21:06 +010026 * @mockdev: class device used by the deprecated sysfs interface (may be
27 * NULL)
Linus Walleijff2b1352015-10-20 11:10:38 +020028 * @owner: helps prevent removal of modules exporting active GPIOs
29 * @chip: pointer to the corresponding gpiochip, holding static
30 * data for this device
Linus Walleij1c3cdb12016-02-09 13:51:59 +010031 * @descs: array of ngpio descriptors.
Linus Walleijfdeb8e12016-02-10 10:57:36 +010032 * @ngpio: the number of GPIO lines on this GPIO device, equal to the size
33 * of the @descs array.
34 * @base: GPIO base in the DEPRECATED global Linux GPIO numberspace, assigned
35 * at device creation time.
Linus Walleijdf4878e2016-02-12 14:48:23 +010036 * @label: a descriptive name for the GPIO device, such as the part number
37 * or name of the IP component in a System on Chip.
Linus Walleij43c54ec2016-02-11 11:37:48 +010038 * @data: per-instance data assigned by the driver
Linus Walleijff2b1352015-10-20 11:10:38 +020039 * @list: links gpio_device:s together for traversal
40 *
41 * This state container holds most of the runtime variable data
42 * for a GPIO device and can hold references and live on after the
43 * GPIO chip has been removed, if it is still being used from
44 * userspace.
45 */
46struct gpio_device {
47 int id;
48 struct device dev;
Linus Walleij3c702e92015-10-21 15:29:53 +020049 struct cdev chrdev;
Linus Walleijafbc4f32016-02-09 13:21:06 +010050 struct device *mockdev;
Linus Walleijff2b1352015-10-20 11:10:38 +020051 struct module *owner;
52 struct gpio_chip *chip;
Linus Walleij1c3cdb12016-02-09 13:51:59 +010053 struct gpio_desc *descs;
Linus Walleijfdeb8e12016-02-10 10:57:36 +010054 int base;
55 u16 ngpio;
Bartosz Golaszewski3b469b02017-12-13 12:25:19 +010056 const char *label;
Linus Walleij43c54ec2016-02-11 11:37:48 +010057 void *data;
Linus Walleijff2b1352015-10-20 11:10:38 +020058 struct list_head list;
Kent Gibson6accc372020-07-08 12:15:51 +080059 struct blocking_notifier_head notifier;
Linus Walleij20ec3e32016-02-11 11:03:06 +010060
61#ifdef CONFIG_PINCTRL
62 /*
63 * If CONFIG_PINCTRL is enabled, then gpio controllers can optionally
64 * describe the actual pin range which they serve in an SoC. This
65 * information would be used by pinctrl subsystem to configure
66 * corresponding pins for gpio usage.
67 */
68 struct list_head pin_ranges;
69#endif
Linus Walleijff2b1352015-10-20 11:10:38 +020070};
71
Rojhalat Ibrahim7f2e5532015-02-11 17:27:55 +010072/* gpio suffixes used for ACPI and device tree lookup */
Andy Shevchenkob23ec592018-07-09 21:47:27 +030073static __maybe_unused const char * const gpio_suffixes[] = { "gpios", "gpio" };
Rojhalat Ibrahim7f2e5532015-02-11 17:27:55 +010074
Janusz Krzysztofikbf9346f2018-09-05 23:50:06 +020075struct 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};
83
Geert Uytterhoevena5e93432020-04-24 16:15:17 +020084struct gpio_desc *gpiochip_get_desc(struct gpio_chip *gc, unsigned int hwnum);
Lukas Wunnereec1d562017-10-12 12:40:10 +020085int gpiod_get_array_value_complex(bool raw, bool can_sleep,
86 unsigned int array_size,
87 struct gpio_desc **desc_array,
Janusz Krzysztofik77588c12018-09-05 23:50:07 +020088 struct gpio_array *array_info,
Janusz Krzysztofikb9762be2018-09-05 23:50:05 +020089 unsigned long *value_bitmap);
Laura Abbott30277432018-05-21 10:57:07 -070090int gpiod_set_array_value_complex(bool raw, bool can_sleep,
Geert Uytterhoeven3c940662018-09-27 13:38:10 +020091 unsigned int array_size,
92 struct gpio_desc **desc_array,
93 struct gpio_array *array_info,
94 unsigned long *value_bitmap);
Alexandre Courbot1bd6b602014-07-22 16:17:41 +090095
Sebastian Andrzej Siewiorf0b40862019-07-04 17:38:03 +020096extern spinlock_t gpio_lock;
Linus Walleijff2b1352015-10-20 11:10:38 +020097extern struct list_head gpio_devices;
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +090098
99struct gpio_desc {
Linus Walleijfdeb8e12016-02-10 10:57:36 +0100100 struct gpio_device *gdev;
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900101 unsigned long flags;
102/* flag symbols are bit numbers */
103#define FLAG_REQUESTED 0
104#define FLAG_IS_OUT 1
105#define FLAG_EXPORT 2 /* protected by sysfs_lock */
106#define FLAG_SYSFS 3 /* exported via /sys/class/gpio/control */
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900107#define FLAG_ACTIVE_LOW 6 /* value has active low */
108#define FLAG_OPEN_DRAIN 7 /* Gpio is open drain type */
109#define FLAG_OPEN_SOURCE 8 /* Gpio is open source type */
110#define FLAG_USED_AS_IRQ 9 /* GPIO is connected to an IRQ */
Hans Verkuil4e9439d2018-09-08 11:23:16 +0200111#define FLAG_IRQ_IS_ENABLED 10 /* GPIO is connected to an enabled IRQ */
Benoit Parrotf625d462015-02-02 11:44:44 -0600112#define FLAG_IS_HOGGED 11 /* GPIO is hogged */
Andrew Jefferye10f72b2017-11-30 14:25:24 +1030113#define FLAG_TRANSITORY 12 /* GPIO may lose value in sleep or reset */
Thomas Petazzonid4499912019-02-07 17:28:58 +0100114#define FLAG_PULL_UP 13 /* GPIO has pull up enabled */
115#define FLAG_PULL_DOWN 14 /* GPIO has pull down enabled */
Kent Gibson2148ad72019-11-05 10:04:25 +0800116#define FLAG_BIAS_DISABLE 15 /* GPIO has pull disabled */
Kent Gibson73e03412020-09-28 08:27:56 +0800117#define FLAG_EDGE_RISING 16 /* GPIO CDEV detects rising edge events */
118#define FLAG_EDGE_FALLING 17 /* GPIO CDEV detects falling edge events */
Kent Gibson26d060e2020-10-15 07:11:56 +0800119#define FLAG_EVENT_CLOCK_REALTIME 18 /* GPIO CDEV reports REALTIME timestamps in events */
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900120
Markus Pargmannc0017ed2015-08-14 16:10:59 +0200121 /* Connection label */
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900122 const char *label;
Markus Pargmannc0017ed2015-08-14 16:10:59 +0200123 /* Name of the GPIO */
124 const char *name;
Geert Uytterhoeven63636d92020-02-20 14:01:49 +0100125#ifdef CONFIG_OF_DYNAMIC
126 struct device_node *hog;
127#endif
Kent Gibson65cff702020-09-28 08:27:59 +0800128#ifdef CONFIG_GPIO_CDEV
129 /* debounce period in microseconds */
130 unsigned int debounce_period_us;
131#endif
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900132};
133
Andy Shevchenko7b586962020-10-21 17:25:28 +0300134#define gpiod_not_found(desc) (IS_ERR(desc) && PTR_ERR(desc) == -ENOENT)
135
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900136int gpiod_request(struct gpio_desc *desc, const char *label);
137void gpiod_free(struct gpio_desc *desc);
Andy Shevchenko95a4eed2022-02-01 17:27:55 +0200138
139static inline int gpiod_request_user(struct gpio_desc *desc, const char *label)
140{
141 int ret;
142
143 ret = gpiod_request(desc, label);
144 if (ret == -EPROBE_DEFER)
145 ret = -ENODEV;
146
147 return ret;
148}
149
Andy Shevchenkoc29fd9e2017-05-23 20:03:16 +0300150int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
151 unsigned long lflags, enum gpiod_flags dflags);
Andy Shevchenkof725edd2020-11-09 22:53:23 +0200152int gpio_set_debounce_timeout(struct gpio_desc *desc, unsigned int debounce);
Benoit Parrotf625d462015-02-02 11:44:44 -0600153int gpiod_hog(struct gpio_desc *desc, const char *name,
154 unsigned long lflags, enum gpiod_flags dflags);
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900155
156/*
157 * Return the GPIO number of the passed descriptor relative to its chip
158 */
Masahiro Yamada4a5c8862017-07-11 23:41:43 +0900159static inline int gpio_chip_hwgpio(const struct gpio_desc *desc)
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900160{
Linus Walleijfdeb8e12016-02-10 10:57:36 +0100161 return desc - &desc->gdev->descs[0];
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900162}
163
164/* With descriptor prefix */
165
166#define gpiod_emerg(desc, fmt, ...) \
167 pr_emerg("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\
168 ##__VA_ARGS__)
169#define gpiod_crit(desc, fmt, ...) \
170 pr_crit("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \
171 ##__VA_ARGS__)
172#define gpiod_err(desc, fmt, ...) \
173 pr_err("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \
174 ##__VA_ARGS__)
175#define gpiod_warn(desc, fmt, ...) \
176 pr_warn("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \
177 ##__VA_ARGS__)
178#define gpiod_info(desc, fmt, ...) \
179 pr_info("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \
180 ##__VA_ARGS__)
181#define gpiod_dbg(desc, fmt, ...) \
182 pr_debug("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\
183 ##__VA_ARGS__)
184
185/* With chip prefix */
186
Geert Uytterhoevena5e93432020-04-24 16:15:17 +0200187#define chip_emerg(gc, fmt, ...) \
188 dev_emerg(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__)
189#define chip_crit(gc, fmt, ...) \
190 dev_crit(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__)
191#define chip_err(gc, fmt, ...) \
192 dev_err(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__)
193#define chip_warn(gc, fmt, ...) \
194 dev_warn(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__)
195#define chip_info(gc, fmt, ...) \
196 dev_info(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__)
197#define chip_dbg(gc, fmt, ...) \
198 dev_dbg(&gc->gpiodev->dev, "(%s): " fmt, gc->label, ##__VA_ARGS__)
Alexandre Courbot0eb4c6c2014-07-01 14:45:15 +0900199
Mika Westerberg664e3e52014-01-08 12:40:54 +0200200#endif /* GPIOLIB_H */