mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
d449991c4d
This commit adds support for configuring the pull-up and pull-down resistors available in some GPIO controllers. While configuring pull-up/pull-down is already possible through the pinctrl subsystem, some GPIO controllers, especially simple ones such as GPIO expanders on I2C, don't have any pinmuxing capability and therefore do not use the pinctrl subsystem. This commit implements the GPIO_PULL_UP and GPIO_PULL_DOWN flags, which can be used from the Device Tree, to enable a pull-up or pull-down resistor on a given GPIO. The flag is simply propagated all the way to the core GPIO subsystem, where it is used to call the gpio_chip ->set_config callback with the appropriate existing PIN_CONFIG_BIAS_* values. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
109 lines
3.6 KiB
C
109 lines
3.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __LINUX_GPIO_MACHINE_H
|
|
#define __LINUX_GPIO_MACHINE_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/list.h>
|
|
|
|
enum gpio_lookup_flags {
|
|
GPIO_ACTIVE_HIGH = (0 << 0),
|
|
GPIO_ACTIVE_LOW = (1 << 0),
|
|
GPIO_OPEN_DRAIN = (1 << 1),
|
|
GPIO_OPEN_SOURCE = (1 << 2),
|
|
GPIO_PERSISTENT = (0 << 3),
|
|
GPIO_TRANSITORY = (1 << 3),
|
|
GPIO_PULL_UP = (1 << 4),
|
|
GPIO_PULL_DOWN = (1 << 5),
|
|
};
|
|
|
|
/**
|
|
* struct gpiod_lookup - lookup table
|
|
* @chip_label: name of the chip the GPIO belongs to
|
|
* @chip_hwnum: hardware number (i.e. relative to the chip) of the GPIO
|
|
* @con_id: name of the GPIO from the device's point of view
|
|
* @idx: index of the GPIO in case several GPIOs share the same name
|
|
* @flags: mask of GPIO_* values
|
|
*
|
|
* gpiod_lookup is a lookup table for associating GPIOs to specific devices and
|
|
* functions using platform data.
|
|
*/
|
|
struct gpiod_lookup {
|
|
const char *chip_label;
|
|
u16 chip_hwnum;
|
|
const char *con_id;
|
|
unsigned int idx;
|
|
enum gpio_lookup_flags flags;
|
|
};
|
|
|
|
struct gpiod_lookup_table {
|
|
struct list_head list;
|
|
const char *dev_id;
|
|
struct gpiod_lookup table[];
|
|
};
|
|
|
|
/**
|
|
* struct gpiod_hog - GPIO line hog table
|
|
* @chip_label: name of the chip the GPIO belongs to
|
|
* @chip_hwnum: hardware number (i.e. relative to the chip) of the GPIO
|
|
* @line_name: consumer name for the hogged line
|
|
* @lflags: mask of GPIO lookup flags
|
|
* @dflags: GPIO flags used to specify the direction and value
|
|
*/
|
|
struct gpiod_hog {
|
|
struct list_head list;
|
|
const char *chip_label;
|
|
u16 chip_hwnum;
|
|
const char *line_name;
|
|
enum gpio_lookup_flags lflags;
|
|
int dflags;
|
|
};
|
|
|
|
/*
|
|
* Simple definition of a single GPIO under a con_id
|
|
*/
|
|
#define GPIO_LOOKUP(_chip_label, _chip_hwnum, _con_id, _flags) \
|
|
GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _con_id, 0, _flags)
|
|
|
|
/*
|
|
* Use this macro if you need to have several GPIOs under the same con_id.
|
|
* Each GPIO needs to use a different index and can be accessed using
|
|
* gpiod_get_index()
|
|
*/
|
|
#define GPIO_LOOKUP_IDX(_chip_label, _chip_hwnum, _con_id, _idx, _flags) \
|
|
{ \
|
|
.chip_label = _chip_label, \
|
|
.chip_hwnum = _chip_hwnum, \
|
|
.con_id = _con_id, \
|
|
.idx = _idx, \
|
|
.flags = _flags, \
|
|
}
|
|
|
|
/*
|
|
* Simple definition of a single GPIO hog in an array.
|
|
*/
|
|
#define GPIO_HOG(_chip_label, _chip_hwnum, _line_name, _lflags, _dflags) \
|
|
{ \
|
|
.chip_label = _chip_label, \
|
|
.chip_hwnum = _chip_hwnum, \
|
|
.line_name = _line_name, \
|
|
.lflags = _lflags, \
|
|
.dflags = _dflags, \
|
|
}
|
|
|
|
#ifdef CONFIG_GPIOLIB
|
|
void gpiod_add_lookup_table(struct gpiod_lookup_table *table);
|
|
void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n);
|
|
void gpiod_remove_lookup_table(struct gpiod_lookup_table *table);
|
|
void gpiod_add_hogs(struct gpiod_hog *hogs);
|
|
#else
|
|
static inline
|
|
void gpiod_add_lookup_table(struct gpiod_lookup_table *table) {}
|
|
static inline
|
|
void gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n) {}
|
|
static inline
|
|
void gpiod_remove_lookup_table(struct gpiod_lookup_table *table) {}
|
|
static inline void gpiod_add_hogs(struct gpiod_hog *hogs) {}
|
|
#endif
|
|
|
|
#endif /* __LINUX_GPIO_MACHINE_H */
|