英语

通用输入/输出 (GPIO)

目录

核心

struct gpio_irq_chip

GPIO 中断控制器

定义:

struct gpio_irq_chip {
    struct irq_chip *chip;
    struct irq_domain *domain;
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY;
    struct fwnode_handle *fwnode;
    struct irq_domain *parent_domain;
    int (*child_to_parent_hwirq)(struct gpio_chip *gc,unsigned int child_hwirq,unsigned int child_type,unsigned int *parent_hwirq, unsigned int *parent_type);
    int (*populate_parent_alloc_arg)(struct gpio_chip *gc,union gpio_irq_fwspec *fwspec,unsigned int parent_hwirq, unsigned int parent_type);
    unsigned int (*child_offset_to_irq)(struct gpio_chip *gc, unsigned int pin);
    struct irq_domain_ops child_irq_domain_ops;
#endif;
    irq_flow_handler_t handler;
    unsigned int default_type;
    struct lock_class_key *lock_key;
    struct lock_class_key *request_key;
    irq_flow_handler_t parent_handler;
    union {
        void *parent_handler_data;
        void **parent_handler_data_array;
    };
    unsigned int num_parents;
    unsigned int *parents;
    unsigned int *map;
    bool threaded;
    bool per_parent_data;
    bool initialized;
    bool domain_is_allocated_externally;
    int (*init_hw)(struct gpio_chip *gc);
    void (*init_valid_mask)(struct gpio_chip *gc,unsigned long *valid_mask, unsigned int ngpios);
    unsigned long *valid_mask;
    unsigned int first;
    void (*irq_enable)(struct irq_data *data);
    void (*irq_disable)(struct irq_data *data);
    void (*irq_unmask)(struct irq_data *data);
    void (*irq_mask)(struct irq_data *data);
};

成员

chip

GPIO IRQ 芯片实现,由 GPIO 驱动程序提供。

domain

中断转换域;负责在 GPIO hwirq 编号和 Linux IRQ 编号之间进行映射。

fwnode

与此 gpiochip/irqchip 对应的固件节点,对于分层 irqdomain 支持是必需的。

parent_domain

如果非 NULL,将设置为此 GPIO 中断控制器的 IRQ 域的父域,以建立分层中断域。 它的存在将激活分层中断支持。

child_to_parent_hwirq

此回调将子硬件 IRQ 偏移量转换为分层中断芯片上的父硬件 IRQ 偏移量。 子硬件 IRQ 对应于 GPIO 索引 0..ngpio-1(请参阅 struct gpio_chip 的 ngpio 字段),相应的父硬件 IRQ 和类型(例如 IRQ_TYPE_*)应由驱动程序返回。 驱动程序可以从偏移量或使用查找表或最适合此芯片的任何方法来计算此值。 在驱动程序中成功转换后返回 0。

如果某些硬件 IRQ 范围没有相应的父 HWIRQ,则返回 -EINVAL,但也要确保填写 **valid_mask** 和 **need_valid_mask** 以使这些 GPIO 线无法用于转换。

populate_parent_alloc_arg

此可选回调分配并填充父级的 IRQ 域的特定结构。 如果未指定,则将使用 gpiochip_populate_parent_fwspec_twocell。 还有一个名为 gpiochip_populate_parent_fwspec_fourcell 的四单元变体可用。

child_offset_to_irq

此可选回调用于将 GPIO 芯片上的子 GPIO 线偏移量转换为 GPIO to_irq() 回调的 IRQ 编号。 如果未指定,则将提供一个默认回调,该回调将返回行偏移量。

child_irq_domain_ops

将用于此 GPIO IRQ 芯片的 IRQ 域操作。 如果未提供任何操作,则将填充默认回调以设置 IRQ 层次结构。 一些驱动程序需要提供自己的转换函数。

handler

用于 GPIO IRQ 的 IRQ 处理程序(通常是预定义 IRQ 核心函数),由 GPIO 驱动程序提供。

default_type

在 GPIO 驱动程序初始化期间应用的默认 IRQ 触发类型,由 GPIO 驱动程序提供。

lock_key

每个 GPIO IRQ 芯片的 lockdep 类用于 IRQ 锁定。

request_key

每个 GPIO IRQ 芯片的 lockdep 类用于 IRQ 请求。

parent_handler

GPIO 芯片的父中断的中断处理程序,如果父中断是嵌套的而不是级联的,则可以为 NULL。

{unnamed_union}

anonymous

parent_handler_data

如果 per_parent_data 为 false,则 parent_handler_data 是一个用作与每个父中断关联的数据的单个指针。

parent_handler_data_array

如果 per_parent_data 为 true,则 parent_handler_data_array 是一个 num_parents 指针数组,用于为每个父级关联不同的数据。 如果 per_parent_data 为 true,则不能为 NULL。

num_parents

GPIO 芯片的父中断的数量。

parents

GPIO 芯片的父中断列表。 这由驱动程序拥有,因此核心只会引用此列表,而不会修改它。

map

GPIO 芯片的每条线的父中断列表。

threaded

如果设置了中断处理使用嵌套线程,则为 True。

per_parent_data

如果 parent_handler_data_array 描述一个要用作父数据的 num_parents 大小的数组,则为 True。

initialized

跟踪 GPIO 芯片 irq 成员初始化的标志。 此标志将确保在初始化之前不使用 GPIO 芯片 irq 成员。

domain_is_allocated_externally

如果 irq_domain 是在 gpiolib 之外分配的,则为 True,在这种情况下,gpiolib 不会自行释放 irq_domain。

init_hw

在添加 IRQ 芯片之前初始化硬件的可选例程。 当特定驱动程序想要清除 IRQ 相关寄存器以避免不必要的事件时,这非常有用。

init_valid_mask

用于初始化 valid_mask 的可选例程,如果不是所有 GPIO 线都是有效的中断,则使用该例程。 有时,某些线只是无法触发中断,并且此例程(如果已定义)会在 “valid_mask” 中传递一个位图,并且它将从 0..(ngpios-1) 设置 ngpios 位为 “1”,就像有效一样。 然后,回调可以直接将某些位设置为 “0”,如果它们不能用于中断。

valid_mask

如果不是 NULL,则保存位掩码,指示哪些 GPIO 可以包含在芯片的 IRQ 域中。

first

静态 IRQ 分配所必需。 如果设置,irq_domain_create_simple() 将在初始化期间分配和映射所有 IRQ。

irq_enable

存储旧的 irq_chip irq_enable 回调

irq_disable

存储旧的 irq_chip irq_disable 回调

irq_unmask

存储旧的 irq_chip irq_unmask 回调

irq_mask

存储旧的 irq_chip irq_mask 回调

struct gpio_chip

抽象 GPIO 控制器

定义:

struct gpio_chip {
    const char              *label;
    struct gpio_device      *gpiodev;
    struct device           *parent;
    struct fwnode_handle    *fwnode;
    struct module           *owner;
    int (*request)(struct gpio_chip *gc, unsigned int offset);
    void (*free)(struct gpio_chip *gc, unsigned int offset);
    int (*get_direction)(struct gpio_chip *gc, unsigned int offset);
    int (*direction_input)(struct gpio_chip *gc, unsigned int offset);
    int (*direction_output)(struct gpio_chip *gc, unsigned int offset, int value);
    int (*get)(struct gpio_chip *gc, unsigned int offset);
    int (*get_multiple)(struct gpio_chip *gc,unsigned long *mask, unsigned long *bits);
    void (*set)(struct gpio_chip *gc, unsigned int offset, int value);
    void (*set_multiple)(struct gpio_chip *gc,unsigned long *mask, unsigned long *bits);
    int (*set_rv)(struct gpio_chip *gc,unsigned int offset, int value);
    int (*set_multiple_rv)(struct gpio_chip *gc,unsigned long *mask, unsigned long *bits);
    int (*set_config)(struct gpio_chip *gc,unsigned int offset, unsigned long config);
    int (*to_irq)(struct gpio_chip *gc, unsigned int offset);
    void (*dbg_show)(struct seq_file *s, struct gpio_chip *gc);
    int (*init_valid_mask)(struct gpio_chip *gc,unsigned long *valid_mask, unsigned int ngpios);
    int (*add_pin_ranges)(struct gpio_chip *gc);
    int (*en_hw_timestamp)(struct gpio_chip *gc,u32 offset, unsigned long flags);
    int (*dis_hw_timestamp)(struct gpio_chip *gc,u32 offset, unsigned long flags);
    int base;
    u16 ngpio;
    u16 offset;
    const char              *const *names;
    bool can_sleep;
#if IS_ENABLED(CONFIG_GPIO_GENERIC);
    unsigned long (*read_reg)(void __iomem *reg);
    void (*write_reg)(void __iomem *reg, unsigned long data);
    bool be_bits;
    void __iomem *reg_dat;
    void __iomem *reg_set;
    void __iomem *reg_clr;
    void __iomem *reg_dir_out;
    void __iomem *reg_dir_in;
    bool bgpio_dir_unreadable;
    bool bgpio_pinctrl;
    int bgpio_bits;
    raw_spinlock_t bgpio_lock;
    unsigned long bgpio_data;
    unsigned long bgpio_dir;
#endif ;
#ifdef CONFIG_GPIOLIB_IRQCHIP;
    struct gpio_irq_chip irq;
#endif ;
#if defined(CONFIG_OF_GPIO);
    unsigned int of_gpio_n_cells;
    bool (*of_node_instance_match)(struct gpio_chip *gc, unsigned int i);
    int (*of_xlate)(struct gpio_chip *gc, const struct of_phandle_args *gpiospec, u32 *flags);
#endif ;
};

成员

label

GPIO 设备的功能名称,例如零件号或实现它的 SoC IP 块的名称。

gpiodev

内部状态保持器,不透明结构

parent

提供 GPIO 的可选父设备

fwnode

可选的 fwnode 提供此控制器的属性

owner

有助于防止删除导出活动 GPIO 的模块

request

芯片特定激活的可选钩子,例如启用模块电源和时钟;可能会休眠;成功时必须返回 0,失败时返回负错误编号

free

芯片特定停用的可选钩子,例如禁用模块电源和时钟;可能会休眠

get_direction

返回信号 “offset” 的方向,0=输出,1=输入(与 GPIO_LINE_DIRECTION_OUT / GPIO_LINE_DIRECTION_IN 相同),或负错误。 建议始终实现此函数,即使在仅输入或仅输出 gpio 芯片上也是如此。

direction_input

将信号 “offset” 配置为输入,成功时返回 0 或负错误编号。 可以在仅输入或仅输出 gpio 芯片上省略此项。

direction_output

将信号 “offset” 配置为输出,成功时返回 0 或负错误编号。 可以在仅输入或仅输出 gpio 芯片上省略此项。

get

返回信号 “offset” 的值,0=低,1=高,或负错误

get_multiple

读取由 “mask” 定义的多个信号的值,并将它们存储在 “bits” 中,成功时返回 0 或负错误

set

已弃用 - 请改用 set_rv()

set_multiple

已弃用 - 请改用 set_multiple_rv()

set_rv

分配信号 “offset” 的输出值,成功时返回 0 或负错误值

set_multiple_rv

分配由 “mask” 定义的多个信号的输出值,成功时返回 0 或负错误值

set_config

用于各种设置的可选钩子。 使用与通用 pinconf 相同的打包配置格式。 成功时必须返回 0,失败时返回负错误编号。

to_irq

支持非静态 gpiod_to_irq() 映射的可选钩子;实现可能不会休眠

dbg_show

在 debugfs 中显示内容的可选例程;省略此项时将使用默认代码,但自定义代码可以显示额外的状态(例如上拉/下拉配置)。

init_valid_mask

用于初始化 valid_mask 的可选例程,如果不是所有 GPIO 都有效,则使用该例程。

add_pin_ranges

初始化引脚范围的可选例程,当需要提供 GPIO 功能的引脚的特殊映射时使用。 它在添加 GPIO 芯片之后和添加 IRQ 芯片之前调用。

en_hw_timestamp

依赖于 GPIO 芯片,用于启用硬件时间戳的可选例程。

dis_hw_timestamp

依赖于 GPIO 芯片,用于禁用硬件时间戳的可选例程。

base

标识此芯片处理的第一个 GPIO 编号;或者,如果在注册期间为负,则请求动态 ID 分配。 弃用:提供任何非负值并锁定 GPIO 芯片的基本偏移量已弃用。 请传递 -1 作为 base,以便 gpiolib 在所有可能的情况下选择芯片 base。 我们希望从长远来看摆脱静态 GPIO 编号空间。

ngpio

此控制器处理的 GPIO 的数量;处理的最后一个 GPIO 是 (base + ngpio - 1)。

offset

当多个 gpio 芯片属于同一设备时,可以使用此值作为设备中的偏移量,以便可以正确分配友好的名称。

names

如果设置,则必须是要用作此芯片中 GPIO 的备用名称的字符串数组。 如果 GPIO 没有别名,则数组中的任何条目都可以为 NULL,但是数组的长度必须为 ngpio 条目。

can_sleep

如果 get()/set() 方法休眠,则必须设置标志,因为它们必须通过 I2C 或 SPI 访问 GPIO 扩展芯片时休眠。 这意味着如果芯片支持 IRQ,则需要对这些 IRQ 进行线程处理,因为芯片访问可能会在休眠时(例如,读取 IRQ 状态寄存器)休眠。

read_reg

通用 GPIO 的读取器函数

write_reg

通用 GPIO 的写入器函数

be_bits

如果通用 GPIO 具有大端位顺序(位 31 表示行 0,位 30 表示行 1 ... 位 0 表示行 31),则通用 GPIO 核心会将其设置为 true。 它仅用于内部管理。

reg_dat

通用 GPIO 的数据(输入)寄存器

reg_set

通用 GPIO 的输出设置寄存器(输出=高)

reg_clr

通用 GPIO 的输出清除寄存器(输出=低)

reg_dir_out

通用 GPIO 的方向输出设置寄存器

reg_dir_in

通用 GPIO 的方向输入设置寄存器

bgpio_dir_unreadable

指示方向寄存器无法读取,我们需要依赖于我们的内部状态跟踪。

bgpio_pinctrl

通用 GPIO 使用引脚控制后端。

bgpio_bits

用于通用 GPIO 的寄存器位数,即 <寄存器宽度> * 8

bgpio_lock

用于锁定 chip->bgpio_data。 此外,需要将阴影数据寄存器和实际数据寄存器写入在一起。

bgpio_data

通用 GPIO 的阴影数据寄存器,用于安全地清除/设置位。

bgpio_dir

通用 GPIO 的阴影方向寄存器,用于安全地清除/设置方向。 此字中的 “1” 表示该行设置为输出。

irq

将中断芯片功能与 GPIO 芯片集成。 可用于处理大多数实际情况的 IRQ。

of_gpio_n_cells

用于形成 GPIO 说明符的单元格数。 标准为 2 个单元格

gpios = <gpio 偏移量标志>;

一些复杂的 GPIO 控制器为每个设备树节点实例化多个芯片,并具有 3 个单元格

gpios = <gpio 实例偏移量标志>;

旧式 GPIO 控制器甚至可能具有 1 个单元格

gpios = <gpio 偏移量>;

of_node_instance_match

确定芯片是否是正确的实例。 必须由每个设备树节点使用多个 gpio_chip 的任何驱动程序实现。 如果 gc 是 i 指示的实例(这是 GPIO 线和 gpio-ranges 的 phandles 中的第一个单元格),则返回 true。

of_xlate

回调以将设备树 GPIO 说明符转换为芯片相关的 GPIO 编号和标志。

描述

gpio_chip 可以帮助平台抽象各种 GPIO 源,以便可以通过通用编程接口访问它们。 示例源包括 SOC 控制器、FPGA、多功能芯片、专用 GPIO 扩展器等。

每个芯片控制多个信号,这些信号在方法调用中由 0..(ngpio - 1) 范围内的 “offset” 值标识。 当通过诸如 gpio_get_value(gpio) 之类的调用引用这些信号时,offset 是通过从 gpio 编号中减去 base 来计算的。

for_each_hwgpio_in_range

for_each_hwgpio_in_range (_chip, _i, _base, _size, _label)

迭代给定范围内的所有 GPIO

参数

_chip

要迭代的芯片。

_i

循环计数器。

_base

游侠中的第一个 GPIO。

_size

要从 base 开始检查的 GPIO 的数量。

_label

如果请求了 GPIO,则存储标签地址的位置。 对于未使用的 GPIO,设置为 NULL。

for_each_hwgpio

for_each_hwgpio (_chip, _i, _label)

迭代给定芯片的所有 GPIO。

参数

_chip

要迭代的芯片。

_i

循环计数器。

_label

如果请求了 GPIO,则存储标签地址的位置。 对于未使用的 GPIO,设置为 NULL。

for_each_requested_gpio_in_range

for_each_requested_gpio_in_range (_chip, _i, _base, _size, _label)

迭代给定范围内的已请求 GPIO

参数

_chip

要查询的芯片

_i

循环变量

_base

范围内的第一个 GPIO

_size

要从 base 开始检查的 GPIO 的数量

_label

当前 GPIO 的标签

gpiochip_add_data

gpiochip_add_data (gc, data)

注册一个 gpio_chip

参数

gc

要注册的芯片,需要初始化 gc->base

data

与此芯片关联的驱动私有数据

上下文

可能在中断工作之前

描述

gpiochip_add_data() 在启动过程中很早被调用,以便可以自由使用 GPIO,gc->parent 设备必须在 gpio 框架的 arch_initcall() 之前注册。否则,GPIO 的 sysfs 初始化将粗鲁地失败。

gpiochip_add_data() 必须仅在 gpiolib 初始化之后调用,即在 core_initcall() 之后。

如果 gc->base 为负,则表示请求动态分配一系列有效的 GPIO。

返回值

如果无法注册芯片,则返回一个负 errno,例如因为 gc->base 无效或已与不同的芯片关联。 否则,它返回零作为成功代码。

struct gpio_pin_range

由 gpio 芯片控制的引脚范围

定义:

struct gpio_pin_range {
    struct list_head node;
    struct pinctrl_dev *pctldev;
    struct pinctrl_gpio_range range;
};

成员

node

用于维护引脚范围集的列表,内部使用

pctldev

处理相应引脚的 pinctrl 设备

range

由 GPIO 控制器控制的实际引脚范围

struct gpio_desc *gpio_to_desc(unsigned gpio)

将 GPIO 编号转换为其描述符

参数

unsigned gpio

全局 GPIO 编号

返回值

与给定 GPIO 关联的 GPIO 描述符。如果系统中不存在具有给定编号的 GPIO,则为 NULL

struct gpio_desc *gpio_device_get_desc(struct gpio_device *gdev, unsigned int hwnum)

获取此 GPIO 设备的给定硬件编号对应的 GPIO 描述符

参数

struct gpio_device *gdev

从中获取描述符的 GPIO 设备

unsigned int hwnum

此芯片的 GPIO 的硬件编号

返回值

指向 GPIO 描述符的指针。如果指定硬件编号的给定芯片中不存在 GPIO,则为 EINVAL。如果基础芯片已消失,则为 ENODEV

描述

struct gpio_device 的引用计数NOT增加,就像请求 GPIO 以供独占使用时一样。调用者需要确保 GPIO 设备与其返回的描述符一起保持活动状态。

int desc_to_gpio(const struct gpio_desc *desc)

将 GPIO 描述符转换为整数命名空间

参数

const struct gpio_desc *desc

GPIO 描述符

描述

这应该在将来消失,但由于我们仍然使用 GPIO 编号进行错误消息和 sysfs 节点,因此是必需的。

返回值

由其描述符指定的 GPIO 的全局 GPIO 编号。

struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc)

返回 GPIO 描述符所属的 GPIO 芯片

参数

const struct gpio_desc *desc

要返回芯片的描述符

描述

已弃用 此函数不安全,不应使用。 在不采用 SRCU 读取锁的情况下使用芯片地址可能会导致取消引用悬空指针。

返回值

支持此设备的 GPIO 芯片的地址。

struct gpio_device *gpiod_to_gpio_device(struct gpio_desc *desc)

返回此描述符所属的 GPIO 设备。

参数

struct gpio_desc *desc

要返回 GPIO 设备的描述符。

描述

DOES NOT增加 GPIO 设备的引用计数,因为期望请求描述符,并且用户已经持有对设备的引用。

返回值

拥有此描述符的 GPIO 设备的地址。

bool gpiod_is_equal(struct gpio_desc *desc, struct gpio_desc *other)

检查两个 GPIO 描述符是否引用同一个引脚。

参数

struct gpio_desc *desc

要比较的描述符。

struct gpio_desc *other

要比较的第二个描述符。

返回值

如果描述符引用同一个物理引脚,则为 True。否则为 False。

int gpio_device_get_base(struct gpio_device *gdev)

获取此设备分配的基本 GPIO 编号

参数

struct gpio_device *gdev

GPIO 设备

返回值

此设备在全局 GPIO 编号空间中的第一个 GPIO 编号。

const char *gpio_device_get_label(struct gpio_device *gdev)

获取此 GPIO 设备的标签

参数

struct gpio_device *gdev

GPIO 设备

返回值

指向包含 GPIO 设备标签的字符串的指针。字符串的生存期与基础 GPIO 设备的生存期相关联。

struct gpio_chip *gpio_device_get_chip(struct gpio_device *gdev)

获取此 GPIO 设备的 gpio_chip 实现

参数

struct gpio_device *gdev

GPIO 设备

返回值

支持此设备的 GPIO 芯片的地址。

描述

已弃用 在我们可以摆脱 struct gpio_chip 的所有非驱动程序用户之前,我们必须提供一种从 struct gpio_device 检索指向它的指针的方法。这NOT安全,因为 GPIO API 被认为是可热插拔的,并且芯片可能随时消失(与引用计数的 struct gpio_device 不同)。

使用风险自负。

int gpiod_get_direction(struct gpio_desc *desc)

返回 GPIO 的当前方向

参数

struct gpio_desc *desc

要获取方向的 GPIO

返回值

输出为 0,输入为 1,如果出错,则为错误代码。

描述

如果 gpiod_cansleep() 为真,此函数可能会睡眠。

const unsigned long *gpiochip_query_valid_mask(const struct gpio_chip *gc)

返回 GPIO 有效性信息

参数

const struct gpio_chip *gc

查询其有效性信息的 GPIO 芯片

返回值

表示有效 GPIO 的位图。如果所有 GPIO 都有效,则为 NULL。

描述

某些 GPIO 芯片可能支持某些引脚不可用的配置。 这些芯片可以设置 valid_mask 以表示有效的 GPIO。 此函数可用于检索此信息。

void *gpiochip_get_data(struct gpio_chip *gc)

获取芯片的每个子驱动程序数据

参数

struct gpio_chip *gc

GPIO 芯片

返回值

芯片的每个子驱动程序数据。

void gpiochip_remove(struct gpio_chip *gc)

注销一个 gpio_chip

参数

struct gpio_chip *gc

要注销的芯片

描述

不能删除具有任何仍被请求的 GPIO 的 gpio_chip。

struct gpio_device *gpio_device_find(const void *data, int (*match)(struct gpio_chip *gc, const void *data))

查找特定的 GPIO 设备

参数

const void *data

要传递给匹配函数的数据

int (*match)(struct gpio_chip *gc, const void *data)

用于检查 gpio_chip 的回调函数

返回值

struct gpio_device 的新引用。

描述

类似于 bus_find_device()。它根据用户提供的 match 回调返回对 gpio_device 的引用。如果设备不匹配,回调应返回 0,如果匹配,则返回非零值。如果回调返回非零值,则此函数将返回给调用者,并且不会遍历任何更多的 gpio_devices。

回调函数将 GPIO 芯片结构作为参数。在回调函数执行期间,芯片受到保护,免于被释放。TODO:这实际上尚未实现。

如果该函数返回非 NULL,则必须使用 gpio_device_put()释放返回的引用。

struct gpio_device *gpio_device_find_by_label(const char *label)

围绕 gpio_device_find() 的包装器,通过其支持芯片的标签查找 GPIO 设备

参数

const char *label

要查找的标签

返回值

对 GPIO 设备或 NULL 的引用。必须使用 gpio_device_put()释放引用。

struct gpio_device *gpio_device_find_by_fwnode(const struct fwnode_handle *fwnode)

围绕 gpio_device_find() 的包装器,通过其 fwnode 查找 GPIO 设备

参数

const struct fwnode_handle *fwnode

要查找的固件节点

返回值

对 GPIO 设备或 NULL 的引用。必须使用 gpio_device_put()释放引用。

struct gpio_device *gpio_device_get(struct gpio_device *gdev)

增加此 GPIO 设备的引用计数

参数

struct gpio_device *gdev

要增加引用计数的 GPIO 设备

返回值

指向 gdev 的指针。

void gpio_device_put(struct gpio_device *gdev)

减少此 GPIO 设备的引用计数,并可能释放与之关联的所有资源。

参数

struct gpio_device *gdev

要减少引用计数的 GPIO 设备

struct device *gpio_device_to_device(struct gpio_device *gdev)

检索基础 struct device 的地址。

参数

struct gpio_device *gdev

要返回地址的 GPIO 设备。

描述

这不会增加 GPIO 设备或基础 struct device 的引用计数。

返回值

支持此 GPIO 设备的 struct device 的地址。

int gpiochip_irqchip_add_domain(struct gpio_chip *gc, struct irq_domain *domain)

将一个 irqdomain 添加到一个 gpiochip

参数

struct gpio_chip *gc

要向其添加 irqchip 的 gpiochip

struct irq_domain *domain

要添加到 gpiochip 的 irqdomain

描述

此函数将一个 IRQ 域添加到 gpiochip。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiochip_generic_request(struct gpio_chip *gc, unsigned int offset)

为引脚请求 gpio 功能

参数

struct gpio_chip *gc

拥有 GPIO 的 gpiochip

unsigned int offset

要为 GPIO 功能请求的 GPIO 偏移量

返回值

成功时返回 0,失败时返回负的 errno。

void gpiochip_generic_free(struct gpio_chip *gc, unsigned int offset)

从引脚释放 gpio 功能

参数

struct gpio_chip *gc

要为其请求 gpio 功能的 gpiochip

unsigned int offset

要从 GPIO 功能释放的 GPIO 偏移量

int gpiochip_generic_config(struct gpio_chip *gc, unsigned int offset, unsigned long config)

应用引脚的配置

参数

struct gpio_chip *gc

拥有 GPIO 的 gpiochip

unsigned int offset

要应用配置的 GPIO 偏移量

unsigned long config

要应用的配置

返回值

成功时返回 0,失败时返回负的 errno。

int gpiochip_add_pingroup_range(struct gpio_chip *gc, struct pinctrl_dev *pctldev, unsigned int gpio_offset, const char *pin_group)

添加 GPIO <-> 引脚映射的范围

参数

struct gpio_chip *gc

要为其添加范围的 gpiochip

struct pinctrl_dev *pctldev

要映射到的引脚控制器

unsigned int gpio_offset

当前 gpio_chip 编号空间中的起始偏移量

const char *pin_group

引脚控制器内的引脚组的名称

描述

直接从 DeviceTree 支持的 pinctrl 驱动程序调用此函数已被弃用。请参阅 Documentation/devicetree/bindings/gpio/gpio.txt 的第 2.1 节,了解如何通过 “gpio-ranges” 属性绑定 pinctrl 和 gpio 驱动程序。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiochip_add_pin_range(struct gpio_chip *gc, const char *pinctl_name, unsigned int gpio_offset, unsigned int pin_offset, unsigned int npins)

添加 GPIO <-> 引脚映射的范围

参数

struct gpio_chip *gc

要为其添加范围的 gpiochip

const char *pinctl_name

要映射到的引脚控制器的 dev_name()

unsigned int gpio_offset

当前 gpio_chip 编号空间中的起始偏移量

unsigned int pin_offset

引脚控制器编号空间中的起始偏移量

unsigned int npins

从每个引脚空间(GPIO 和引脚控制器)的偏移量开始,在此范围内累积的引脚数

描述

直接从 DeviceTree 支持的 pinctrl 驱动程序调用此函数已被弃用。请参阅 Documentation/devicetree/bindings/gpio/gpio.txt 的第 2.1 节,了解如何通过 “gpio-ranges” 属性绑定 pinctrl 和 gpio 驱动程序。

返回值

成功时返回 0,失败时返回负的 errno。

void gpiochip_remove_pin_ranges(struct gpio_chip *gc)

删除所有 GPIO <-> 引脚映射

参数

struct gpio_chip *gc

要为其删除所有映射的芯片

char *gpiochip_dup_line_label(struct gpio_chip *gc, unsigned int offset)

获取使用者标签的副本。

参数

struct gpio_chip *gc

控制此行的 GPIO 芯片。

unsigned int offset

该行的硬件偏移量。

返回值

指向使用者标签副本的指针(如果已请求该行),否则为 NULL。如果返回了有效的指针,则必须使用 kfree() 释放它。如果发生内存分配错误,该函数将返回 ENOMEM

描述

不得从原子上下文中调用。

struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *gc, unsigned int hwnum, const char *label, enum gpio_lookup_flags lflags, enum gpiod_flags dflags)

允许 GPIO 芯片请求自己的描述符

参数

struct gpio_chip *gc

GPIO 芯片

unsigned int hwnum

要为其请求描述符的 GPIO 的硬件编号

const char *label

GPIO 的标签

enum gpio_lookup_flags lflags

此 GPIO 的查找标志,如果为默认值则为 0,这可用于指定诸如具有机器标志(例如 GPIO_OUT_LOW)的线路反转语义

enum gpiod_flags dflags

此 GPIO 的描述符请求标志,如果为默认值则为 0,这可用于指定使用者语义,例如开漏

描述

函数允许 GPIO 芯片驱动程序通过 gpiolib API 请求并使用它们自己的 GPIO 描述符。与 gpiod_request() 的区别在于,此函数不会增加 GPIO 芯片模块的引用计数。这允许根据需要卸载 GPIO 芯片模块(我们假设 GPIO 芯片驱动程序处理释放它已请求的 GPIO)。

返回值

指向 GPIO 描述符的指针,或者指向 ERR_PTR() 编码的负错误代码(如果失败)。

void gpiochip_free_own_desc(struct gpio_desc *desc)

释放芯片驱动程序请求的 GPIO

参数

struct gpio_desc *desc

要释放的 GPIO 描述符

描述

函数释放先前使用 gpiochip_request_own_desc() 请求的给定 GPIO。

int gpiod_direction_input(struct gpio_desc *desc)

将 GPIO 方向设置为输入

参数

struct gpio_desc *desc

要设置为输入的 GPIO

描述

将传递的 GPIO 的方向设置为输入,例如可以在其上安全地调用 gpiod_get_value()

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_direction_output_raw(struct gpio_desc *desc, int value)

将 GPIO 方向设置为输出

参数

struct gpio_desc *desc

要设置为输出的 GPIO

int value

GPIO 的初始输出值

描述

将传递的 GPIO 的方向设置为输出,例如可以在其上安全地调用 gpiod_set_value()。输出的初始值必须指定为物理线路上的原始值,而不考虑 ACTIVE_LOW 状态。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_direction_output(struct gpio_desc *desc, int value)

将 GPIO 方向设置为输出

参数

struct gpio_desc *desc

要设置为输出的 GPIO

int value

GPIO 的初始输出值

描述

将传递的 GPIO 的方向设置为输出,例如可以在其上安全地调用 gpiod_set_value()。输出的初始值必须指定为 GPIO 的逻辑值,即考虑其 ACTIVE_LOW 状态。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_enable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags)

以纳秒为单位启用硬件时间戳。

参数

struct gpio_desc *desc

要启用的 GPIO。

unsigned long flags

与 GPIO 边沿相关的标志。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_disable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags)

禁用硬件时间戳。

参数

struct gpio_desc *desc

要禁用的 GPIO。

unsigned long flags

与 GPIO 边沿相关的标志,与启用调用期间使用的值相同。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_set_config(struct gpio_desc *desc, unsigned long config)

为 GPIO 设置 config

参数

struct gpio_desc *desc

要为其设置配置的 GPIO 的描述符

unsigned long config

与通用 pinconf 相同的压缩配置格式

返回值

成功时返回 0,如果控制器不支持设置配置,则返回 -ENOTSUPP

int gpiod_set_debounce(struct gpio_desc *desc, unsigned int debounce)

为 GPIO 设置 debounce 时间

参数

struct gpio_desc *desc

要为其设置 debounce 时间的 GPIO 的描述符

unsigned int debounce

以微秒为单位的 debounce 时间

返回值

成功时返回 0,如果控制器不支持设置 debounce 时间,则返回 -ENOTSUPP

int gpiod_is_active_low(const struct gpio_desc *desc)

测试 GPIO 是否为低电平有效

参数

const struct gpio_desc *desc

要测试的 gpio 描述符

返回值

如果 GPIO 为低电平有效,则返回 1,否则返回 0。

void gpiod_toggle_active_low(struct gpio_desc *desc)

切换 GPIO 是否为低电平有效

参数

struct gpio_desc *desc

要更改的 gpio 描述符

int gpiod_get_raw_value(const struct gpio_desc *desc)

返回 gpio 的原始值

参数

const struct gpio_desc *desc

将返回其值的 gpio

返回值

GPIO 的原始值,即物理线路的值,不考虑其 ACTIVE_LOW 状态,如果失败,则返回负的 errno。

描述

此函数可以从我们无法休眠的上下文中调用,并且如果 GPIO 芯片函数可能休眠,则会发出警告。

int gpiod_get_value(const struct gpio_desc *desc)

返回 gpio 的值

参数

const struct gpio_desc *desc

将返回其值的 gpio

返回值

GPIO 的逻辑值,即考虑 ACTIVE_LOW 状态,如果失败,则返回负的 errno。

描述

此函数可以从我们无法休眠的上下文中调用,并且如果 GPIO 芯片函数可能休眠,则会发出警告。

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 数组读取原始值

参数

unsigned int array_size

描述符数组/值位图中的元素数量

struct gpio_desc **desc_array

将要读取值的 GPIO 描述符数组

struct gpio_array *array_info

关于快速位图处理路径的适用性的信息

unsigned long *value_bitmap

用于存储读取的值的位图

描述

读取 GPIO 的原始值,即物理线路的值,而不考虑其 ACTIVE_LOW 状态。

此函数可以从我们无法睡眠的上下文调用,如果 GPIO 芯片函数可能睡眠,它会报错。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_get_array_value(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)

从 GPIO 数组读取值

参数

unsigned int array_size

描述符数组/值位图中的元素数量

struct gpio_desc **desc_array

将要读取值的 GPIO 描述符数组

struct gpio_array *array_info

关于快速位图处理路径的适用性的信息

unsigned long *value_bitmap

用于存储读取的值的位图

描述

读取 GPIO 的逻辑值,即考虑其 ACTIVE_LOW 状态。

此函数可以从我们无法睡眠的上下文调用,如果 GPIO 芯片函数可能睡眠,它会报错。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_set_raw_value(struct gpio_desc *desc, int value)

分配 GPIO 的原始值

参数

struct gpio_desc *desc

将要分配值的 GPIO

int value

要分配的值

描述

设置 GPIO 的原始值,即物理线路的值,而不考虑其 ACTIVE_LOW 状态。

此函数可以从我们无法休眠的上下文中调用,并且如果 GPIO 芯片函数可能休眠,则会发出警告。

返回值

成功时为 0,失败时为负错误号。

int gpiod_set_value(struct gpio_desc *desc, int value)

分配 GPIO 的值

参数

struct gpio_desc *desc

将要分配值的 GPIO

int value

要分配的值

描述

设置 GPIO 的逻辑值,即考虑其 ACTIVE_LOW、OPEN_DRAIN 和 OPEN_SOURCE 标志。

此函数可以从我们无法休眠的上下文中调用,并且如果 GPIO 芯片函数可能休眠,则会发出警告。

返回值

成功时为 0,失败时为负错误号。

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 数组分配值

参数

unsigned int array_size

描述符数组/值位图中的元素数量

struct gpio_desc **desc_array

将要分配值的 GPIO 描述符数组

struct gpio_array *array_info

关于快速位图处理路径的适用性的信息

unsigned long *value_bitmap

要分配的值的位图

描述

设置 GPIO 的原始值,即物理线路的值,而不考虑其 ACTIVE_LOW 状态。

此函数可以从我们无法休眠的上下文中调用,并且如果 GPIO 芯片函数可能休眠,则会发出警告。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_set_array_value(unsigned int array_size, struct gpio_desc **desc_array, struct gpio_array *array_info, unsigned long *value_bitmap)

为 GPIO 数组分配值

参数

unsigned int array_size

描述符数组/值位图中的元素数量

struct gpio_desc **desc_array

将要分配值的 GPIO 描述符数组

struct gpio_array *array_info

关于快速位图处理路径的适用性的信息

unsigned long *value_bitmap

要分配的值的位图

描述

设置 GPIO 的逻辑值,即考虑其 ACTIVE_LOW 状态。

此函数可以从我们无法休眠的上下文中调用,并且如果 GPIO 芯片函数可能休眠,则会发出警告。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_cansleep(const struct gpio_desc *desc)

报告 GPIO 值访问是否可能睡眠

参数

const struct gpio_desc *desc

要检查的 GPIO

返回值

不可睡眠时为 0,可睡眠时为 1,如果出错则为错误代码。

int gpiod_set_consumer_name(struct gpio_desc *desc, const char *name)

设置描述符的使用者名称

参数

struct gpio_desc *desc

要在其上设置使用者名称的 GPIO

const char *name

新的使用者名称

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_to_irq(const struct gpio_desc *desc)

返回与 GPIO 对应的 IRQ

参数

const struct gpio_desc *desc

将返回其 IRQ 的 GPIO(已请求)

返回值

与传递的 GPIO 对应的 IRQ,如果出错则为错误代码。

int gpiochip_lock_as_irq(struct gpio_chip *gc, unsigned int offset)

锁定 GPIO 以用作 IRQ

参数

struct gpio_chip *gc

要锁定的 GPIO 所属的芯片

unsigned int offset

要锁定为 IRQ 的 GPIO 的偏移量

描述

这由希望锁定某个 GPIO 线路以用于 IRQ 的 GPIO 驱动程序直接使用。

返回值

成功时返回 0,失败时返回负的 errno。

void gpiochip_unlock_as_irq(struct gpio_chip *gc, unsigned int offset)

解锁用作 IRQ 的 GPIO

参数

struct gpio_chip *gc

要锁定的 GPIO 所属的芯片

unsigned int offset

要锁定为 IRQ 的 GPIO 的偏移量

描述

这由希望指示某个 GPIO 不再专门用于 IRQ 的 GPIO 驱动程序直接使用。

int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)

返回 gpio 的原始值

参数

const struct gpio_desc *desc

将返回其值的 gpio

返回值

GPIO 的原始值,即物理线路的值,不考虑其 ACTIVE_LOW 状态,如果失败,则返回负的 errno。

描述

此函数应从可以睡眠的上下文调用。

int gpiod_get_value_cansleep(const struct gpio_desc *desc)

返回 gpio 的值

参数

const struct gpio_desc *desc

将返回其值的 gpio

返回值

GPIO 的逻辑值,即考虑 ACTIVE_LOW 状态,如果失败,则返回负的 errno。

描述

此函数应从可以睡眠的上下文调用。

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 数组读取原始值

参数

unsigned int array_size

描述符数组/值位图中的元素数量

struct gpio_desc **desc_array

将要读取值的 GPIO 描述符数组

struct gpio_array *array_info

关于快速位图处理路径的适用性的信息

unsigned long *value_bitmap

用于存储读取的值的位图

描述

读取 GPIO 的原始值,即物理线路的值,而不考虑其 ACTIVE_LOW 状态。

此函数应从可以睡眠的上下文调用。

返回值

成功时返回 0,失败时返回负的 errno。

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 数组读取值

参数

unsigned int array_size

描述符数组/值位图中的元素数量

struct gpio_desc **desc_array

将要读取值的 GPIO 描述符数组

struct gpio_array *array_info

关于快速位图处理路径的适用性的信息

unsigned long *value_bitmap

用于存储读取的值的位图

描述

读取 GPIO 的逻辑值,即考虑其 ACTIVE_LOW 状态。

此函数应从可以睡眠的上下文调用。

返回值

成功时返回 0,失败时返回负的 errno。

int gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)

分配 GPIO 的原始值

参数

struct gpio_desc *desc

将要分配值的 GPIO

int value

要分配的值

描述

设置 GPIO 的原始值,即物理线路的值,而不考虑其 ACTIVE_LOW 状态。

此函数应从可以睡眠的上下文调用。

返回值

成功时为 0,失败时为负错误号。

int gpiod_set_value_cansleep(struct gpio_desc *desc, int value)

分配 GPIO 的值

参数

struct gpio_desc *desc

将要分配值的 GPIO

int value

要分配的值

描述

设置 GPIO 的逻辑值,即考虑其 ACTIVE_LOW 状态

此函数应从可以睡眠的上下文调用。

返回值

成功时为 0,失败时为负错误号。

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 数组分配值

参数

unsigned int array_size

描述符数组/值位图中的元素数量

struct gpio_desc **desc_array

将要分配值的 GPIO 描述符数组

struct gpio_array *array_info

关于快速位图处理路径的适用性的信息

unsigned long *value_bitmap

要分配的值的位图

描述

设置 GPIO 的原始值,即物理线路的值,而不考虑其 ACTIVE_LOW 状态。

此函数应从可以睡眠的上下文调用。

返回值

成功时返回 0,失败时返回负的 errno。

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 数组分配值

参数

unsigned int array_size

描述符数组/值位图中的元素数量

struct gpio_desc **desc_array

将要分配值的 GPIO 描述符数组

struct gpio_array *array_info

关于快速位图处理路径的适用性的信息

unsigned long *value_bitmap

要分配的值的位图

描述

设置 GPIO 的逻辑值,即考虑其 ACTIVE_LOW 状态。

此函数应从可以睡眠的上下文调用。

返回值

成功时返回 0,失败时返回负的 errno。

void gpiod_add_lookup_table(struct gpiod_lookup_table *table)

注册 GPIO 设备使用者

参数

struct gpiod_lookup_table *table

要注册的使用者表

void gpiod_remove_lookup_table(struct gpiod_lookup_table *table)

注销 GPIO 设备使用者

参数

struct gpiod_lookup_table *table

要注销的使用者表

void gpiod_add_hogs(struct gpiod_hog *hogs)

从机器代码注册一组 GPIO hogs

参数

struct gpiod_hog *hogs

GPIO hog 条目的表,末尾有一个置零的哨兵

struct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode, const char *con_id, int index, enum gpiod_flags flags, const char *label)

从固件节点获取 GPIO

参数

struct fwnode_handle *fwnode

固件节点的句柄

const char *con_id

GPIO 使用者内部的函数

int index

为使用者获取的 GPIO 的索引

enum gpiod_flags flags

GPIO 初始化标志

const char *label

附加到请求的 GPIO 的标签

描述

此函数可用于从不透明固件获取其配置的驱动程序。

该函数正确地使用任何底层固件接口查找相应的 GPIO,然后确保在将 GPIO 描述符返回给调用者之前请求它。

如果发生错误,则返回 ERR_PTR()

返回值

成功请求后,GPIO 引脚将根据提供的 flags 进行配置。

int gpiod_count(struct device *dev, const char *con_id)

返回与设备/功能关联的 GPIO 的数量

参数

struct device *dev

GPIO 使用者,对于系统全局 GPIO 可以为 NULL

const char *con_id

GPIO 使用者内部的函数

返回值

与设备/功能关联的 GPIO 的数量,如果请求的功能未分配 GPIO,则返回 -ENOENT。

struct gpio_desc *gpiod_get(struct device *dev, const char *con_id, enum gpiod_flags flags)

获取给定 GPIO 功能的 GPIO

参数

struct device *dev

GPIO 使用者,对于系统全局 GPIO 可以为 NULL

const char *con_id

GPIO 使用者内部的函数

enum gpiod_flags flags

可选的 GPIO 初始化标志

返回值

对应于设备 dev 的函数 con_id 的 GPIO 描述符;如果请求的功能未分配 GPIO,则返回 -ENOENT;如果尝试获取 GPIO 时发生错误,则返回另一个 IS_ERR() 代码。

struct gpio_desc *gpiod_get_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)

获取给定 GPIO 功能的可选 GPIO

参数

struct device *dev

GPIO 使用者,对于系统全局 GPIO 可以为 NULL

const char *con_id

GPIO 使用者内部的函数

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

这等效于 gpiod_get(),不同之处在于当没有 GPIO 分配给请求的功能时,它将返回 NULL。 这对于需要处理可选 GPIO 的驱动程序来说很方便。

返回值

对应于设备 dev 的函数 con_id 的 GPIO 描述符;如果请求的功能未分配 GPIO,则返回 NULL;如果尝试获取 GPIO 时发生错误,则返回另一个 IS_ERR() 代码。

struct gpio_desc *gpiod_get_index(struct device *dev, const char *con_id, unsigned int idx, enum gpiod_flags flags)

从多索引 GPIO 功能获取 GPIO

参数

struct device *dev

GPIO 使用者,对于系统全局 GPIO 可以为 NULL

const char *con_id

GPIO 使用者内部的函数

unsigned int idx

在使用者中要获取的 GPIO 的索引

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

gpiod_get() 的变体允许访问为定义了多个 GPIO 的函数定义的第一个以外的 GPIO。

返回值

有效的 GPIO 描述符;如果请求的功能和/或索引未分配 GPIO,则返回 -ENOENT;如果尝试获取 GPIO 时发生错误,则返回另一个 IS_ERR() 代码。

struct gpio_desc *gpiod_get_index_optional(struct device *dev, const char *con_id, unsigned int index, enum gpiod_flags flags)

从多索引 GPIO 功能获取可选 GPIO

参数

struct device *dev

GPIO 使用者,对于系统全局 GPIO 可以为 NULL

const char *con_id

GPIO 使用者内部的函数

unsigned int index

在使用者中要获取的 GPIO 的索引

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

这等效于 gpiod_get_index(),不同之处在于当没有具有指定索引的 GPIO 分配给请求的功能时,它将返回 NULL。 这对于需要处理可选 GPIO 的驱动程序来说很方便。

返回值

有效的 GPIO 描述符;如果请求的功能和/或索引未分配 GPIO,则返回 NULL;如果尝试获取 GPIO 时发生错误,则返回另一个 IS_ERR() 代码。

struct gpio_descs *gpiod_get_array(struct device *dev, const char *con_id, enum gpiod_flags flags)

从多索引 GPIO 功能获取多个 GPIO

参数

struct device *dev

GPIO 使用者,对于系统全局 GPIO 可以为 NULL

const char *con_id

GPIO 使用者内部的函数

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

此函数获取在给定功能下定义的所有 GPIO。

返回值

对应于设备 dev 的函数 con_id 的 GPIO 描述符;如果请求的功能未分配 GPIO,则返回 -ENOENT;如果尝试获取 GPIO 时发生错误,则返回另一个 IS_ERR() 代码。

struct gpio_descs *gpiod_get_array_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)

从多索引 GPIO 功能获取多个 GPIO

参数

struct device *dev

GPIO 使用者,对于系统全局 GPIO 可以为 NULL

const char *con_id

GPIO 使用者内部的函数

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

这等效于 gpiod_get_array(),不同之处在于当没有 GPIO 分配给请求的功能时,它将返回 NULL。

返回值

对应于设备 dev 的函数 con_id 的 GPIO 描述符;如果请求的功能未分配 GPIO,则返回 NULL;如果尝试获取 GPIO 时发生错误,则返回另一个 IS_ERR() 代码。

void gpiod_put(struct gpio_desc *desc)

处置 GPIO 描述符

参数

struct gpio_desc *desc

要处置的 GPIO 描述符

描述

在调用 gpiod_put() 之后,任何描述符都不能使用。

void gpiod_put_array(struct gpio_descs *descs)

处置多个 GPIO 描述符

参数

struct gpio_descs *descs

包含描述符数组的 struct gpio_descs

ACPI 支持

bool acpi_gpio_get_io_resource(struct acpi_resource *ares, struct acpi_resource_gpio **agpio)

如果 ACPI 资源是 GPIO I/O 资源,则获取其详细信息,否则返回 False。

参数

struct acpi_resource *ares

指向要获取的 ACPI 资源的指针

struct acpi_resource_gpio **agpio

指向 struct acpi_resource_gpio 的指针,用于存储输出指针

返回值

如果找到 GpioIo 资源,则返回 true,否则返回 false

void acpi_gpiochip_request_interrupts(struct gpio_chip *chip)

为 GPIO 芯片 ACPI 事件注册 isr

参数

struct gpio_chip *chip

GPIO 芯片

描述

ACPI5 平台可以使用 GPIO 信号 ACPI 事件。 这些 GPIO 中断由 ACPI 事件方法处理,这些方法需要从 GPIO 芯片的中断处理程序中调用。 acpi_gpiochip_request_interrupts() 找出哪些 GPIO 引脚具有 ACPI 事件方法,并分配调用这些引脚的 ACPI 事件方法的中断处理程序。

void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)

释放 GPIO ACPI 事件中断。

参数

struct gpio_chip *chip

GPIO 芯片

描述

释放与给定 GPIO 芯片的 GPIO ACPI 事件方法关联的中断。

int acpi_dev_gpio_irq_wake_get_by(struct acpi_device *adev, const char *con_id, int index, bool *wake_capable)

查找 GpioInt 并将其转换为 Linux IRQ 编号

参数

struct acpi_device *adev

指向要从中获取 IRQ 的 ACPI 设备的指针

const char *con_id

GpioInt 资源的可选名称

int index

GpioInt 资源的索引(从 0 开始)

bool *wake_capable

如果 IRQ 具有唤醒功能,则设置为 true

描述

如果设备具有一个或多个 GpioInt 资源,则可以使用此函数将资源中的 GPIO 偏移量转换为 Linux IRQ 编号。

该函数是幂等的,但每次运行它都会根据 GpioInt 资源中的标志配置 GPIO 引脚方向。

该函数采用可选的 con_id 参数。 如果资源在属性中具有 con_id,则只会考虑这些资源。

如果 GpioInt 资源指定 SharedAndWake 或 ExclusiveAndWake,则认为 GPIO 具有唤醒功能。

返回值

成功时返回 Linux IRQ 编号(> 0),失败时返回负 errno。

设备树支持

int of_get_named_gpio(const struct device_node *np, const char *propname, int index)

获取用于 GPIO API 的 GPIO 编号

参数

const struct device_node *np

要从中获取 GPIO 的设备节点

const char *propname

包含 gpio 说明符的属性的名称

int index

GPIO 的索引

描述

已弃用 此函数已弃用,不得在新代码中使用。

返回值

要与 Linux 通用 GPIO API 结合使用的 GPIO 编号,或者错误情况下返回的 errno 值之一。

int of_mm_gpiochip_add_data(struct device_node *np, struct of_mm_gpio_chip *mm_gc, void *data)

添加内存映射 GPIO 芯片(库)

参数

struct device_node *np

GPIO 芯片的设备节点

struct of_mm_gpio_chip *mm_gc

指向已分配的 of_mm_gpio_chip 结构的指针

void *data

要存储在 struct gpio_chip 中的驱动程序数据

描述

要使用此函数,应分配并填充 mm_gc,其中包含

  1. 在 gpio_chip 结构中: - 所有回调 - of_gpio_n_cells - of_xlate 回调(可选)

  1. 在 of_mm_gpio_chip 结构中: - save_regs 回调(可选)

如果成功,此函数将映射库的内存,并为您完成所有必要的工作。 然后,您将能够使用 .regs 从回调管理 GPIO。

返回值

成功时返回 0,失败时返回负的 errno。

void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc)

移除内存映射 GPIO 芯片(组)

参数

struct of_mm_gpio_chip *mm_gc

指向已分配的 of_mm_gpio_chip 结构的指针

设备管理 API

struct gpio_desc *devm_gpiod_get(struct device *dev, const char *con_id, enum gpiod_flags flags)

资源管理 gpiod_get()

参数

struct device *dev

GPIO 使用者

const char *con_id

GPIO 使用者内部的函数

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

托管的 gpiod_get()。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get()

返回值

与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将任何 GPIO 分配给所请求的函数,则为 -ENOENT,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR() 代码。

struct gpio_desc *devm_gpiod_get_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)

资源管理 gpiod_get_optional()

参数

struct device *dev

GPIO 使用者

const char *con_id

GPIO 使用者内部的函数

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

托管的 gpiod_get_optional()。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_optional()

返回值

对应于设备 dev 的函数 con_id 的 GPIO 描述符;如果请求的功能未分配 GPIO,则返回 NULL;如果尝试获取 GPIO 时发生错误,则返回另一个 IS_ERR() 代码。

struct gpio_desc *devm_gpiod_get_index(struct device *dev, const char *con_id, unsigned int idx, enum gpiod_flags flags)

资源管理 gpiod_get_index()

参数

struct device *dev

GPIO 使用者

const char *con_id

GPIO 使用者内部的函数

unsigned int idx

在使用者中要获取的 GPIO 的索引

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

托管的 gpiod_get_index()。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_index()

返回值

与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将任何 GPIO 分配给所请求的函数,则为 -ENOENT,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR() 代码。

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)

从给定节点获取 GPIO 描述符

参数

struct device *dev

GPIO 使用者

struct fwnode_handle *fwnode

包含 GPIO 引用的固件节点

const char *con_id

GPIO 使用者内部的函数

int index

在使用者中要获取的 GPIO 的索引

enum gpiod_flags flags

GPIO 初始化标志

const char *label

附加到请求的 GPIO 的标签

描述

从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。

返回值

与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将任何 GPIO 分配给所请求的函数,则为 -ENOENT,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR() 代码。

struct gpio_desc *devm_gpiod_get_index_optional(struct device *dev, const char *con_id, unsigned int index, enum gpiod_flags flags)

资源管理 gpiod_get_index_optional()

参数

struct device *dev

GPIO 使用者

const char *con_id

GPIO 使用者内部的函数

unsigned int index

在使用者中要获取的 GPIO 的索引

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

托管的 gpiod_get_index_optional()。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_index_optional()

返回值

与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将任何 GPIO 分配给所请求的函数,则为 NULL,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR() 代码。

struct gpio_descs *devm_gpiod_get_array(struct device *dev, const char *con_id, enum gpiod_flags flags)

资源管理 gpiod_get_array()

参数

struct device *dev

GPIO 使用者

const char *con_id

GPIO 使用者内部的函数

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

托管的 gpiod_get_array()。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_array()

返回值

与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将任何 GPIO 分配给所请求的函数,则为 -ENOENT,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR() 代码。

struct gpio_descs *devm_gpiod_get_array_optional(struct device *dev, const char *con_id, enum gpiod_flags flags)

资源管理 gpiod_get_array_optional()

参数

struct device *dev

GPIO 使用者

const char *con_id

GPIO 使用者内部的函数

enum gpiod_flags flags

可选的 GPIO 初始化标志

描述

托管的 gpiod_get_array_optional()。从此函数返回的 GPIO 描述符会在驱动程序分离时自动释放。有关行为和返回值的详细信息,请参阅 gpiod_get_array_optional()

返回值

与设备 dev 的函数 con_id 对应的 GPIO 描述符,如果未将任何 GPIO 分配给所请求的函数,则为 NULL,如果在尝试获取 GPIO 时发生错误,则为另一个 IS_ERR() 代码。

void devm_gpiod_put(struct device *dev, struct gpio_desc *desc)

资源管理 gpiod_put()

参数

struct device *dev

GPIO 使用者

struct gpio_desc *desc

要处置的 GPIO 描述符

描述

释放使用 devm_gpiod_get()devm_gpiod_get_index() 获取的 GPIO 描述符。通常不会调用此函数,因为 GPIO 将由资源管理代码释放。

void devm_gpiod_unhinge(struct device *dev, struct gpio_desc *desc)

从 GPIO 描述符中移除资源管理

参数

struct device *dev

GPIO 使用者

struct gpio_desc *desc

要从中移除资源管理的 GPIO 描述符

描述

已弃用 不应使用此函数。它作为调节器框架中资源所有权问题的变通方法提供,应该用更好的解决方案代替。

从 GPIO 描述符中移除资源管理。当您想将描述符的生命周期管理交给另一种机制时,需要这样做。

void devm_gpiod_put_array(struct device *dev, struct gpio_descs *descs)

资源管理 gpiod_put_array()

参数

struct device *dev

GPIO 使用者

struct gpio_descs *descs

要释放的 GPIO 描述符数组

描述

释放使用 devm_gpiod_get_array() 获取的 GPIO 描述符数组。通常不会调用此函数,因为 GPIO 将由资源管理代码释放。

int devm_gpiochip_add_data_with_key(struct device *dev, struct gpio_chip *gc, void *data, struct lock_class_key *lock_key, struct lock_class_key *request_key)

资源管理 gpiochip_add_data_with_key()

参数

struct device *dev

gpio_chip 所属设备的指针。

struct gpio_chip *gc

要注册的 GPIO 芯片

void *data

与此芯片关联的驱动私有数据

struct lock_class_key *lock_key

IRQ 锁的 lockdep 类

struct lock_class_key *request_key

IRQ 请求的 lockdep 类

上下文

可能在中断工作之前

描述

当设备解除绑定时,gpio 芯片会自动释放。

返回值

如果无法注册芯片,则返回一个负 errno,例如因为 gc->base 无效或已与不同的芯片关联。 否则,它返回零作为成功代码。

sysfs 助手

int gpiod_export(struct gpio_desc *desc, bool direction_may_change)

通过 sysfs 导出 GPIO

参数

struct gpio_desc *desc

要提供的 GPIO,已请求

bool direction_may_change

如果用户空间可以更改 GPIO 方向,则为 true

上下文

arch_initcall 或更高版本

描述

当驱动程序想要在请求 GPIO 后使其可供用户空间访问时(可能是在调试时,或者作为其公共接口的一部分),它们可以使用此例程。如果 GPIO 可以更改方向(有些不能)并且调用者允许,用户空间将看到可用于更改 GPIO 方向的“direction” sysfs 属性。始终会提供“value”属性。

返回值

成功时返回 0,失败时返回负的 errno。

创建一个指向已导出 GPIO 节点的 sysfs 链接

参数

struct device *dev

创建符号链接的设备

const char *name

符号链接的名称

struct gpio_desc *desc

要创建符号链接的目标 GPIO,必须已导出

描述

创建一个从 /sys/.../dev/name 到 /sys/class/gpio/gpioN 节点的符号链接。调用者负责取消链接。

返回值

成功时返回 0,失败时返回负的 errno。

void gpiod_unexport(struct gpio_desc *desc)

撤销 gpiod_export() 的效果

参数

struct gpio_desc *desc

要设为不可用的 GPIO

描述

这在 gpiod_free() 上是隐式的。