gpio_chip
gpio_chip用于抽象一个gpio控制器,包含struct gpio_devic和一系列gpio操作函数,控制器驱动需要实现这些gpio操作函数,将其注册到gpiolib,供gpiolib调用。
gpio_desc
gpio_desc描述一个具体的gpio口。
gpio_device
用于连接gpio_chip和gpio_desc。
gpio控制器驱动框架
以rk3399 GPIO控制器驱动为例。gpio-rockchip.c
rk3399 gpio控制器驱动定义rockchip_pin_bank。
struct rockchip_pin_bank {
struct device *dev;
void __iomem *reg_base;
struct regmap *regmap_pull;
struct clk *clk;
struct clk *db_clk;
int irq;
u32 saved_masks;
u32 pin_base;
u8 nr_pins;
char *name;
u8 bank_num;
struct rockchip_iomux iomux[4];
struct rockchip_drv drv[4];
enum rockchip_pin_pull_type pull_type[4];
struct device_node *of_node;
struct rockchip_pinctrl *drvdata;
struct irq_domain *domain;
struct gpio_chip gpio_chip;
struct pinctrl_gpio_range grange;
raw_spinlock_t slock;
const struct rockchip_gpio_regs *gpio_regs;
u32 gpio_type;
u32 toggle_edge_mode;
u32 recalced_mask;
u32 route_mask;
};
gpio_chip代表rk3399 gpio控制器,platform_driver匹配成功之后执行probe函数。probe函数中rockchip_gpiolib_register()->rockchip_pin_bank->gpio_chip = static const gpio_chip (gpio-rockchip.c中定义的一个结构体将gpio-rockchip.c中的函数赋给该gpio_chip)->gpiochip_add_data()(相当于完成gpio_chip的注册)。
思考:pinctrl子系统中的pinmux_ops中已经实现了pinctrl_gpio_request一系列操作gpio的函数,gpio子系统也提供了一系列操作gpio的函数,二者的关系是什么?
驱动程序中调用gpiod_request()申请gpio,返回一个gpio_desc的描述符,其内部调用为gpiod_request->gpiod_request_commit->gpiochip_generic_request->pinctrl_gpio_request。free的情况与其类似。
调用gpiod_direction_input()->rockchip_gpio_direction_input,未调用pinctrl中的pinctrl_gpio_direction_input。
可以理解为gpio子系统向pinctrl子系统申请要用到的gpio,用gpio控制器向gpiolib中注册的操作函数来实现gpio的操作。