forked from mirrors/linux
GPIO core:
- use more lock guards where applicable
- refactor GPIO ACPI code and shrink it in the process by 8%
- move GPIO ACPI quirks into a separate file
- remove unneeded #ifdef
- convert GPIO devres helpers to using devm_add_action() where applicable
which shrinks and simplifies the code
- refactor GPIO descriptor validation in GPIO consumer interfaces
- don't allow setting values on input lines in the GPIO core which will
take off the burden from GPIO drivers of checking this down the line
- provide gpiod_is_equal() as a way of safely comparing two GPIO
descriptors (the only current user is in regulator core)
New drivers:
- add the GPIO module for the max77759 multifunction device
- add the GPIO driver for the VeriSilicon BLZP1600 GPIO controller
- add the GPIO driver for the Spacemit K1 SoC
Driver improvements:
- convert more drivers to using the new GPIO line value setter callbacks
- convert more drivers to making the irq_chip immutable as is recommended
by the interrupt subsystem
- extend build testing coverage by enabling more modules to be built with
COMPILE_TEST=y
- extend the gpio-aggregator module with a configfs interface that makes
the setup easier for user-space than the existing driver-level sysfs
attributes and also adds more advanced configuration features (such as
referring to aggregated lines by their original names or modifying
their names as exposed by the aggregated chip)
- add a missing mutex_destroy() in gpio-imx-scu
- add an OF polarity quirk for s5m8767
- allow building gpio-vf610 as a loadable module
- make gpio-mxc not hardcode its GPIO base number with GPIO SYSFS
interface disabled (another small step towards getting rid of the global
GPIO numberspace)
- add support for level-triggered interrupts to gpio-pca953x
- don't double-check the ngpios property in gpio-ds4520 as GPIO core
already does it
- don't double-check the number of GPIOs in gpio-imx-scu as GPIO core
already does it
- remove unused callbacks from gpio-max3191x
DT bindings:
- add device-tree bindings for max77759, spacemit,k1 and blzp1600 (new
drivers added this cycle)
- document more properties for gpio-vf610 and gpio-tegra186
- document a new pca95xx variant
- fix style of examples in several GPIO DT-binding documents
Misc:
- TODO list updates
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEFp3rbAvDxGAT0sefEacuoBRx13IFAmg0NtQACgkQEacuoBRx
13Iolg/+P8fe1hTek+UgdKm/EAQ1Mn3oijNE1Ix15VD8Iqacu+URyB2SJMFcg27n
S/tsuwogQeQmdgXPfYDJkQmiZEyln/ytWf5W2lNwYhGfGujVa8h1FueB7Wb8Zs7G
PNMnobyAIGivodJfvikDEyczMuxhkOH04ZOT7UpTSPI47BSGsujX/1vgmRQLid1Z
3wFDJ0yDhVcuxit/VC+LzFpHIV0MiRzGpvHzYid5jjEaGSiRMpHixf27VJGc0gG1
IJLkhNkwZ3InisWVGvqdRg/FUNErRYKYQSARb4AjCU+/y1H0SWdB0R6sZDTZpP+e
YqAc8FW31Lw1L7PWBLRTaVS3KT868tdXDCsArNzfBbb3u/WikO2GY/AXuzveZatp
pHwyPA0JS9QvxaTXU9yjCpGqdNfjbrmU5OkZxTTe+Nyz84fUfiURiE8g4Rl6riy4
fNzaywRBmVZlEECWSWGzyNw9ZEYDRPZ1ZHmOA+8FWE+/XKJIsVf8w3x2QIC5b/HO
hYKH4mar8oiEYJFZqoko3iQURJq+AD9wILCNpws5bSsi//VyyNT0mZV/q5hj7+Xx
pqeEGDInvycN5fDWWJlkN1lj5dDyHZi4uus05mYI9Ec+eX3XNWRUHXUskbpzdgCs
XepjP9kFQmMSL7y4z2d7tLd7gFup/uGny7o/KyMsIPDw7qVL5rY=
=PQqp
-----END PGP SIGNATURE-----
Merge tag 'gpio-updates-for-v6.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux
Pull gpio updates from Bartosz Golaszewski:
"We have three new drivers, some refactoring in the GPIO core, lots of
various changes across many drivers, new configfs interface for the
virtual gpio-aggregator module and DT-bindings updates.
The treewide conversion of GPIO drivers to using the new value setter
callbacks is ongoing with another round of GPIO drivers updated. You
will also see these commits coming in from other subsystems as with
the relevant changes merged into mainline last cycle, I've started
converting GPIO providers located elsewhere than drivers/gpio/.
GPIO core:
- use more lock guards where applicable
- refactor GPIO ACPI code and shrink it in the process by 8%
- move GPIO ACPI quirks into a separate file
- remove unneeded #ifdef
- convert GPIO devres helpers to using devm_add_action() where
applicable which shrinks and simplifies the code
- refactor GPIO descriptor validation in GPIO consumer interfaces
- don't allow setting values on input lines in the GPIO core which
will take off the burden from GPIO drivers of checking this down
the line
- provide gpiod_is_equal() as a way of safely comparing two GPIO
descriptors (the only current user is in regulator core)
New drivers:
- add the GPIO module for the max77759 multifunction device
- add the GPIO driver for the VeriSilicon BLZP1600 GPIO controller
- add the GPIO driver for the Spacemit K1 SoC
Driver improvements:
- convert more drivers to using the new GPIO line value setter
callbacks
- convert more drivers to making the irq_chip immutable as is
recommended by the interrupt subsystem
- extend build testing coverage by enabling more modules to be built
with COMPILE_TEST=y
- extend the gpio-aggregator module with a configfs interface that
makes the setup easier for user-space than the existing
driver-level sysfs attributes and also adds more advanced
configuration features (such as referring to aggregated lines by
their original names or modifying their names as exposed by the
aggregated chip)
- add a missing mutex_destroy() in gpio-imx-scu
- add an OF polarity quirk for s5m8767
- allow building gpio-vf610 as a loadable module
- make gpio-mxc not hardcode its GPIO base number with GPIO SYSFS
interface disabled (another small step towards getting rid of the
global GPIO numberspace)
- add support for level-triggered interrupts to gpio-pca953x
- don't double-check the ngpios property in gpio-ds4520 as GPIO core
already does it
- don't double-check the number of GPIOs in gpio-imx-scu as GPIO core
already does it
- remove unused callbacks from gpio-max3191x
DT bindings:
- add device-tree bindings for max77759, spacemit,k1 and blzp1600
(new drivers added this cycle)
- document more properties for gpio-vf610 and gpio-tegra186
- document a new pca95xx variant
- fix style of examples in several GPIO DT-binding documents
Misc:
- TODO list updates"
* tag 'gpio-updates-for-v6.16-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux: (123 commits)
gpio: timberdale: select GPIOLIB_IRQCHIP
gpio: lpc18xx: select GPIOLIB_IRQCHIP
gpio: grgpio: select GPIOLIB_IRQCHIP
gpio: bcm-kona: select GPIOLIB_IRQCHIP
dt-bindings: gpio: vf610: add ngpios and gpio-reserved-ranges
gpio: davinci: select GPIOLIB_IRQCHIP
gpiolib-acpi: Update file references in the Documentation and MAINTAINERS
gpiolib: acpi: Move quirks to a separate file
gpiolib: acpi: Add acpi_gpio_need_run_edge_events_on_boot() getter
gpiolib: acpi: Handle deferred list via new API
gpiolib: acpi: Make sure we fill struct acpi_gpio_info
gpiolib: acpi: Switch to use enum in acpi_gpio_in_ignore_list()
gpiolib: acpi: Use temporary variable for struct acpi_gpio_info
gpiolib: remove unneeded #ifdef
gpio: mpc8xxx: select GPIOLIB_IRQCHIP
gpio: pxa: select GPIOLIB_IRQCHIP
gpio: pxa: Make irq_chip immutable
gpio: timberdale: Make irq_chip immutable
gpio: xgene-sb: Make irq_chip immutable
gpio: davinci: Make irq_chip immutable
...
688 lines
19 KiB
C
688 lines
19 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __LINUX_GPIO_CONSUMER_H
|
|
#define __LINUX_GPIO_CONSUMER_H
|
|
|
|
#include <linux/bits.h>
|
|
#include <linux/err.h>
|
|
#include <linux/types.h>
|
|
|
|
struct acpi_device;
|
|
struct device;
|
|
struct fwnode_handle;
|
|
|
|
struct gpio_array;
|
|
struct gpio_desc;
|
|
|
|
/**
|
|
* struct gpio_descs - Struct containing an array of descriptors that can be
|
|
* obtained using gpiod_get_array()
|
|
*
|
|
* @info: Pointer to the opaque gpio_array structure
|
|
* @ndescs: Number of held descriptors
|
|
* @desc: Array of pointers to GPIO descriptors
|
|
*/
|
|
struct gpio_descs {
|
|
struct gpio_array *info;
|
|
unsigned int ndescs;
|
|
struct gpio_desc *desc[];
|
|
};
|
|
|
|
#define GPIOD_FLAGS_BIT_DIR_SET BIT(0)
|
|
#define GPIOD_FLAGS_BIT_DIR_OUT BIT(1)
|
|
#define GPIOD_FLAGS_BIT_DIR_VAL BIT(2)
|
|
#define GPIOD_FLAGS_BIT_OPEN_DRAIN BIT(3)
|
|
/* GPIOD_FLAGS_BIT_NONEXCLUSIVE is DEPRECATED, don't use in new code. */
|
|
#define GPIOD_FLAGS_BIT_NONEXCLUSIVE BIT(4)
|
|
|
|
/**
|
|
* enum gpiod_flags - Optional flags that can be passed to one of gpiod_* to
|
|
* configure direction and output value. These values
|
|
* cannot be OR'd.
|
|
*
|
|
* @GPIOD_ASIS: Don't change anything
|
|
* @GPIOD_IN: Set lines to input mode
|
|
* @GPIOD_OUT_LOW: Set lines to output and drive them low
|
|
* @GPIOD_OUT_HIGH: Set lines to output and drive them high
|
|
* @GPIOD_OUT_LOW_OPEN_DRAIN: Set lines to open-drain output and drive them low
|
|
* @GPIOD_OUT_HIGH_OPEN_DRAIN: Set lines to open-drain output and drive them high
|
|
*/
|
|
enum gpiod_flags {
|
|
GPIOD_ASIS = 0,
|
|
GPIOD_IN = GPIOD_FLAGS_BIT_DIR_SET,
|
|
GPIOD_OUT_LOW = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT,
|
|
GPIOD_OUT_HIGH = GPIOD_FLAGS_BIT_DIR_SET | GPIOD_FLAGS_BIT_DIR_OUT |
|
|
GPIOD_FLAGS_BIT_DIR_VAL,
|
|
GPIOD_OUT_LOW_OPEN_DRAIN = GPIOD_OUT_LOW | GPIOD_FLAGS_BIT_OPEN_DRAIN,
|
|
GPIOD_OUT_HIGH_OPEN_DRAIN = GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_OPEN_DRAIN,
|
|
};
|
|
|
|
#ifdef CONFIG_GPIOLIB
|
|
|
|
/* Return the number of GPIOs associated with a device / function */
|
|
int gpiod_count(struct device *dev, const char *con_id);
|
|
|
|
/* Acquire and dispose GPIOs */
|
|
struct gpio_desc *__must_check gpiod_get(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags);
|
|
struct gpio_desc *__must_check gpiod_get_index(struct device *dev,
|
|
const char *con_id,
|
|
unsigned int idx,
|
|
enum gpiod_flags flags);
|
|
struct gpio_desc *__must_check gpiod_get_optional(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags);
|
|
struct gpio_desc *__must_check gpiod_get_index_optional(struct device *dev,
|
|
const char *con_id,
|
|
unsigned int index,
|
|
enum gpiod_flags flags);
|
|
struct gpio_descs *__must_check gpiod_get_array(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags);
|
|
struct gpio_descs *__must_check gpiod_get_array_optional(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags);
|
|
void gpiod_put(struct gpio_desc *desc);
|
|
void gpiod_put_array(struct gpio_descs *descs);
|
|
|
|
struct gpio_desc *__must_check devm_gpiod_get(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags);
|
|
struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev,
|
|
const char *con_id,
|
|
unsigned int idx,
|
|
enum gpiod_flags flags);
|
|
struct gpio_desc *__must_check devm_gpiod_get_optional(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags);
|
|
struct gpio_desc *__must_check
|
|
devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
|
|
unsigned int index, enum gpiod_flags flags);
|
|
struct gpio_descs *__must_check devm_gpiod_get_array(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags);
|
|
struct gpio_descs *__must_check
|
|
devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
|
|
enum gpiod_flags flags);
|
|
void devm_gpiod_put(struct device *dev, struct gpio_desc *desc);
|
|
void devm_gpiod_unhinge(struct device *dev, struct gpio_desc *desc);
|
|
void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs);
|
|
|
|
int gpiod_get_direction(struct gpio_desc *desc);
|
|
int gpiod_direction_input(struct gpio_desc *desc);
|
|
int gpiod_direction_output(struct gpio_desc *desc, int value);
|
|
int gpiod_direction_output_raw(struct gpio_desc *desc, int value);
|
|
|
|
/* Value get/set from non-sleeping context */
|
|
int gpiod_get_value(const struct gpio_desc *desc);
|
|
int gpiod_get_array_value(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap);
|
|
int gpiod_set_value(struct gpio_desc *desc, int value);
|
|
int gpiod_set_array_value(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap);
|
|
int gpiod_get_raw_value(const struct gpio_desc *desc);
|
|
int gpiod_get_raw_array_value(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap);
|
|
int gpiod_set_raw_value(struct gpio_desc *desc, int value);
|
|
int gpiod_set_raw_array_value(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap);
|
|
|
|
/* Value get/set from sleeping context */
|
|
int gpiod_get_value_cansleep(const struct gpio_desc *desc);
|
|
int gpiod_get_array_value_cansleep(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap);
|
|
int gpiod_set_value_cansleep(struct gpio_desc *desc, int value);
|
|
int gpiod_set_array_value_cansleep(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap);
|
|
int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc);
|
|
int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap);
|
|
int gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value);
|
|
int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap);
|
|
|
|
int gpiod_set_config(struct gpio_desc *desc, unsigned long config);
|
|
int gpiod_set_debounce(struct gpio_desc *desc, unsigned int debounce);
|
|
void gpiod_toggle_active_low(struct gpio_desc *desc);
|
|
|
|
int gpiod_is_active_low(const struct gpio_desc *desc);
|
|
int gpiod_cansleep(const struct gpio_desc *desc);
|
|
|
|
int gpiod_to_irq(const struct gpio_desc *desc);
|
|
int gpiod_set_consumer_name(struct gpio_desc *desc, const char *name);
|
|
|
|
/* Convert between the old gpio_ and new gpiod_ interfaces */
|
|
struct gpio_desc *gpio_to_desc(unsigned gpio);
|
|
int desc_to_gpio(const struct gpio_desc *desc);
|
|
|
|
struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
|
|
const char *con_id, int index,
|
|
enum gpiod_flags flags,
|
|
const char *label);
|
|
struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
|
|
struct fwnode_handle *child,
|
|
const char *con_id, int index,
|
|
enum gpiod_flags flags,
|
|
const char *label);
|
|
|
|
bool gpiod_is_equal(struct gpio_desc *desc, struct gpio_desc *other);
|
|
|
|
#else /* CONFIG_GPIOLIB */
|
|
|
|
#include <linux/bug.h>
|
|
#include <linux/kernel.h>
|
|
|
|
static inline int gpiod_count(struct device *dev, const char *con_id)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline struct gpio_desc *__must_check gpiod_get(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
static inline struct gpio_desc *__must_check
|
|
gpiod_get_index(struct device *dev,
|
|
const char *con_id,
|
|
unsigned int idx,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
|
|
static inline struct gpio_desc *__must_check
|
|
gpiod_get_optional(struct device *dev, const char *con_id,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline struct gpio_desc *__must_check
|
|
gpiod_get_index_optional(struct device *dev, const char *con_id,
|
|
unsigned int index, enum gpiod_flags flags)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline struct gpio_descs *__must_check
|
|
gpiod_get_array(struct device *dev, const char *con_id,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
|
|
static inline struct gpio_descs *__must_check
|
|
gpiod_get_array_optional(struct device *dev, const char *con_id,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void gpiod_put(struct gpio_desc *desc)
|
|
{
|
|
might_sleep();
|
|
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
}
|
|
|
|
static inline void devm_gpiod_unhinge(struct device *dev,
|
|
struct gpio_desc *desc)
|
|
{
|
|
might_sleep();
|
|
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
}
|
|
|
|
static inline void gpiod_put_array(struct gpio_descs *descs)
|
|
{
|
|
might_sleep();
|
|
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(descs);
|
|
}
|
|
|
|
static inline struct gpio_desc *__must_check
|
|
devm_gpiod_get(struct device *dev,
|
|
const char *con_id,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
static inline
|
|
struct gpio_desc *__must_check
|
|
devm_gpiod_get_index(struct device *dev,
|
|
const char *con_id,
|
|
unsigned int idx,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
|
|
static inline struct gpio_desc *__must_check
|
|
devm_gpiod_get_optional(struct device *dev, const char *con_id,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline struct gpio_desc *__must_check
|
|
devm_gpiod_get_index_optional(struct device *dev, const char *con_id,
|
|
unsigned int index, enum gpiod_flags flags)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline struct gpio_descs *__must_check
|
|
devm_gpiod_get_array(struct device *dev, const char *con_id,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
|
|
static inline struct gpio_descs *__must_check
|
|
devm_gpiod_get_array_optional(struct device *dev, const char *con_id,
|
|
enum gpiod_flags flags)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)
|
|
{
|
|
might_sleep();
|
|
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
}
|
|
|
|
static inline void devm_gpiod_put_array(struct device *dev,
|
|
struct gpio_descs *descs)
|
|
{
|
|
might_sleep();
|
|
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(descs);
|
|
}
|
|
|
|
|
|
static inline int gpiod_get_direction(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -ENOSYS;
|
|
}
|
|
static inline int gpiod_direction_input(struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -ENOSYS;
|
|
}
|
|
static inline int gpiod_direction_output(struct gpio_desc *desc, int value)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -ENOSYS;
|
|
}
|
|
static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -ENOSYS;
|
|
}
|
|
static inline int gpiod_get_value(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_get_array_value(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc_array);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_set_value(struct gpio_desc *desc, int value)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_set_array_value(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc_array);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_get_raw_value(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_get_raw_array_value(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc_array);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_set_raw_value(struct gpio_desc *desc, int value)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_set_raw_array_value(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc_array);
|
|
return 0;
|
|
}
|
|
|
|
static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_get_array_value_cansleep(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc_array);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_set_array_value_cansleep(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc_array);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc_array);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_set_raw_value_cansleep(struct gpio_desc *desc,
|
|
int value)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
|
|
struct gpio_desc **desc_array,
|
|
struct gpio_array *array_info,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc_array);
|
|
return 0;
|
|
}
|
|
|
|
static inline int gpiod_set_config(struct gpio_desc *desc, unsigned long config)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -ENOSYS;
|
|
}
|
|
|
|
static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned int debounce)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -ENOSYS;
|
|
}
|
|
|
|
static inline void gpiod_toggle_active_low(struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
}
|
|
|
|
static inline int gpiod_is_active_low(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
static inline int gpiod_cansleep(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return 0;
|
|
}
|
|
|
|
static inline int gpiod_to_irq(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline int gpiod_set_consumer_name(struct gpio_desc *desc,
|
|
const char *name)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline struct gpio_desc *gpio_to_desc(unsigned gpio)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline int desc_to_gpio(const struct gpio_desc *desc)
|
|
{
|
|
/* GPIO can never have been requested */
|
|
WARN_ON(desc);
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline
|
|
struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
|
|
const char *con_id, int index,
|
|
enum gpiod_flags flags,
|
|
const char *label)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
|
|
static inline
|
|
struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
|
|
struct fwnode_handle *fwnode,
|
|
const char *con_id, int index,
|
|
enum gpiod_flags flags,
|
|
const char *label)
|
|
{
|
|
return ERR_PTR(-ENOSYS);
|
|
}
|
|
|
|
static inline bool
|
|
gpiod_is_equal(struct gpio_desc *desc, struct gpio_desc *other)
|
|
{
|
|
WARN_ON(desc || other);
|
|
return false;
|
|
}
|
|
|
|
#endif /* CONFIG_GPIOLIB */
|
|
|
|
#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_HTE)
|
|
int gpiod_enable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags);
|
|
int gpiod_disable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags);
|
|
#else
|
|
|
|
#include <linux/bug.h>
|
|
|
|
static inline int gpiod_enable_hw_timestamp_ns(struct gpio_desc *desc,
|
|
unsigned long flags)
|
|
{
|
|
if (!IS_ENABLED(CONFIG_GPIOLIB))
|
|
WARN_ON(desc);
|
|
|
|
return -ENOSYS;
|
|
}
|
|
static inline int gpiod_disable_hw_timestamp_ns(struct gpio_desc *desc,
|
|
unsigned long flags)
|
|
{
|
|
if (!IS_ENABLED(CONFIG_GPIOLIB))
|
|
WARN_ON(desc);
|
|
|
|
return -ENOSYS;
|
|
}
|
|
#endif /* CONFIG_GPIOLIB && CONFIG_HTE */
|
|
|
|
static inline
|
|
struct gpio_desc *devm_fwnode_gpiod_get(struct device *dev,
|
|
struct fwnode_handle *fwnode,
|
|
const char *con_id,
|
|
enum gpiod_flags flags,
|
|
const char *label)
|
|
{
|
|
return devm_fwnode_gpiod_get_index(dev, fwnode, con_id, 0,
|
|
flags, label);
|
|
}
|
|
|
|
struct acpi_gpio_params {
|
|
unsigned int crs_entry_index;
|
|
unsigned short line_index;
|
|
bool active_low;
|
|
};
|
|
|
|
struct acpi_gpio_mapping {
|
|
const char *name;
|
|
const struct acpi_gpio_params *data;
|
|
unsigned int size;
|
|
|
|
/* Ignore IoRestriction field */
|
|
#define ACPI_GPIO_QUIRK_NO_IO_RESTRICTION BIT(0)
|
|
/*
|
|
* When ACPI GPIO mapping table is in use the index parameter inside it
|
|
* refers to the GPIO resource in _CRS method. That index has no
|
|
* distinction of actual type of the resource. When consumer wants to
|
|
* get GpioIo type explicitly, this quirk may be used.
|
|
*/
|
|
#define ACPI_GPIO_QUIRK_ONLY_GPIOIO BIT(1)
|
|
/* Use given pin as an absolute GPIO number in the system */
|
|
#define ACPI_GPIO_QUIRK_ABSOLUTE_NUMBER BIT(2)
|
|
|
|
unsigned int quirks;
|
|
};
|
|
|
|
#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_ACPI)
|
|
|
|
int acpi_dev_add_driver_gpios(struct acpi_device *adev,
|
|
const struct acpi_gpio_mapping *gpios);
|
|
void acpi_dev_remove_driver_gpios(struct acpi_device *adev);
|
|
|
|
int devm_acpi_dev_add_driver_gpios(struct device *dev,
|
|
const struct acpi_gpio_mapping *gpios);
|
|
|
|
#else /* CONFIG_GPIOLIB && CONFIG_ACPI */
|
|
|
|
static inline int acpi_dev_add_driver_gpios(struct acpi_device *adev,
|
|
const struct acpi_gpio_mapping *gpios)
|
|
{
|
|
return -ENXIO;
|
|
}
|
|
static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev) {}
|
|
|
|
static inline int devm_acpi_dev_add_driver_gpios(struct device *dev,
|
|
const struct acpi_gpio_mapping *gpios)
|
|
{
|
|
return -ENXIO;
|
|
}
|
|
|
|
#endif /* CONFIG_GPIOLIB && CONFIG_ACPI */
|
|
|
|
|
|
#if IS_ENABLED(CONFIG_GPIOLIB) && IS_ENABLED(CONFIG_GPIO_SYSFS)
|
|
|
|
int gpiod_export(struct gpio_desc *desc, bool direction_may_change);
|
|
int gpiod_export_link(struct device *dev, const char *name,
|
|
struct gpio_desc *desc);
|
|
void gpiod_unexport(struct gpio_desc *desc);
|
|
|
|
#else /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
|
|
|
|
static inline int gpiod_export(struct gpio_desc *desc,
|
|
bool direction_may_change)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
static inline int gpiod_export_link(struct device *dev, const char *name,
|
|
struct gpio_desc *desc)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
static inline void gpiod_unexport(struct gpio_desc *desc)
|
|
{
|
|
}
|
|
|
|
#endif /* CONFIG_GPIOLIB && CONFIG_GPIO_SYSFS */
|
|
|
|
static inline int gpiod_multi_set_value_cansleep(struct gpio_descs *descs,
|
|
unsigned long *value_bitmap)
|
|
{
|
|
if (IS_ERR_OR_NULL(descs))
|
|
return PTR_ERR_OR_ZERO(descs);
|
|
|
|
return gpiod_set_array_value_cansleep(descs->ndescs, descs->desc,
|
|
descs->info, value_bitmap);
|
|
}
|
|
|
|
#endif
|