英语

通用输入/输出(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_maskneed_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

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

default_type

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

lock_key

每个 GPIO IRQ 芯片的 IRQ 锁的 lockdep 类。

request_key

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

parent_handler

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

{unnamed_union}

匿名

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) 设置为 “1” 的 ngpios 位,表示有效。然后,回调可以直接将某些位设置为 “0”,如果它们不能用于中断。

valid_mask

如果不是 NULL,则保存 GPIO 的位掩码,这些 GPIO 有效包含在芯片的 IRQ 域中。

first

静态 IRQ 分配所必需的。如果设置,irq_domain_add_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_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;
    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 ;
    unsigned long *valid_mask;
#if defined(CONFIG_OF_GPIO);
    unsigned int of_gpio_n_cells;
    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,提供此控制器的属性

所有者

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

请求

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

释放

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

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

为信号“offset”分配输出值

set_multiple

为由“mask”定义的多个信号分配输出值

set_config

适用于各种设置的可选钩子。使用与通用 pinconf 相同的打包配置格式。

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 作为基本值,以便 gpiolib 在所有可能的情况下选择芯片基本值。我们希望从长远来看摆脱静态 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_bits

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

bgpio_lock

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

bgpio_data

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

bgpio_dir

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

irq

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

valid_mask

如果不是 NULL,则保存芯片中可用的 GPIO 的位掩码。

of_gpio_n_cells

用于形成 GPIO 说明符的单元格数。

of_xlate

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

描述

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

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

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

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

上下文

可能在 irq 工作之前

描述

当在启动期间很早调用 gpiochip_add_data() 时,以便可以自由使用 GPIO,gc->父设备必须在 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 设备的描述符。

描述

此操作不会增加 GPIO 设备的引用计数,因为期望描述符已被请求,并且用户已经持有对该设备的引用。

返回

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

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 中检索其指针的方法。这是安全的,因为 GPIO API 被认为是热插拔的,并且芯片可能随时消失(与引用计数的 struct gpio_device 不同)。

使用风险自负。

int gpiod_get_direction(struct gpio_desc *desc)

返回 GPIO 的当前方向

参数

struct gpio_desc *desc

要获取方向的 GPIO

返回

0 表示输出,1 表示输入,或者在发生错误时返回错误代码。

描述

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

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)

向 gpiochip 添加一个 irqdomain

参数

struct gpio_chip *gc

要向其添加 irqchip 的 gpiochip

struct irq_domain *domain

要添加到 gpiochip 的 irqdomain

描述

此函数向 gpiochip 添加一个 IRQ 域。

返回

成功时返回 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

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

描述

直接从设备树支持的 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 和引脚控制器)的偏移量中的引脚数

描述

直接从设备树支持的 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

与通用引脚配置相同的打包配置格式

返回

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

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

为 GPIO 设置 debounce 时间

参数

struct gpio_desc *desc

要设置防抖时间的 GPIO 的描述符

unsigned int debounce

以微秒为单位的防抖时间

返回

成功时为 0,如果控制器不支持设置防抖时间,则返回 -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。

void gpiod_set_raw_value(struct gpio_desc *desc, int value)

分配一个 GPIO 的原始值

参数

struct gpio_desc *desc

将要分配值的 GPIO

int value

要分配的值

描述

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

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

void 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 芯片函数可能休眠,则会报错。

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)

锁定要用作 IRQ 的 GPIO

参数

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。

void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)

分配一个 GPIO 的原始值

参数

struct gpio_desc *desc

将要分配值的 GPIO

int value

要分配的值

描述

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

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

void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)

分配一个 GPIO 的值

参数

struct gpio_desc *desc

将要分配值的 GPIO

int value

要分配的值

描述

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

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

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()

返回

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

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 描述符,如果未为请求的函数和/或索引分配 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 类。

上下文

可能在 irq 工作之前

描述

当设备解除绑定时,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() 的隐式操作。