聚合驱动的组件助手

组件助手允许驱动程序将一组子设备(包括它们绑定的驱动程序)收集到一个聚合驱动程序中。各种子系统已经提供了获取此类组件的函数,例如 of_clk_get_by_name()。当没有此类特定于子系统的方式来查找设备时,可以使用组件助手:组件助手填补了特定硬件的聚合驱动程序的空白,在这种情况下,进一步标准化到子系统中是不切实际的。常见的例子是当一个逻辑设备(例如 DRM 显示驱动程序)分布在 SoC 上的各个组件(扫描引擎、混合块、各种输出的转码器等)上时。

组件助手也不能解决运行时依赖关系,例如用于系统挂起和恢复操作。另请参阅 设备链接

组件使用 component_add() 注册,并使用 component_del() 取消注册,通常在驱动程序的探测和断开函数中。

聚合驱动程序首先使用 component_match_add() 组装一个它们需要的组件匹配列表。然后使用 component_master_add_with_match() 将其注册为聚合驱动程序,并使用 component_master_del() 取消注册。

API

struct component_ops

组件驱动程序的回调

定义:

struct component_ops {
    int (*bind)(struct device *comp, struct device *master, void *master_data);
    void (*unbind)(struct device *comp, struct device *master, void *master_data);
};

成员

bind

当聚合驱动程序准备好绑定整个驱动程序时,通过 component_bind_all() 调用。

unbind

当聚合驱动程序准备好绑定整个驱动程序时,或者当 component_bind_all() 在中途失败并且需要解除绑定一些已经绑定的组件时,通过 component_unbind_all() 调用。

描述

组件使用 component_add() 注册,并使用 component_del() 取消注册。

struct component_master_ops

聚合驱动程序的回调

定义:

struct component_master_ops {
    int (*bind)(struct device *master);
    void (*unbind)(struct device *master);
};

成员

bind

当传递给 component_master_add_with_match() 的匹配列表中指定的所有组件或聚合驱动程序都准备就绪时调用。通常,绑定聚合驱动程序有 3 个步骤

  1. 为聚合驱动程序分配一个结构体。

  2. 通过使用聚合驱动程序结构作为不透明的指针数据调用 component_bind_all(),将所有组件绑定到聚合驱动程序。

  3. 向子系统注册聚合驱动程序以发布其接口。

请注意,聚合驱动程序的生命周期与任何底层的 struct device 实例都不一致。因此,不能使用 devm,并且必须在 unbind 回调中显式释放在此回调中获取或分配的所有资源。

unbind

当使用 component_master_del() 取消注册聚合驱动程序,或者使用 component_del() 取消注册其组件之一时调用。

描述

聚合驱动程序使用 component_master_add_with_match() 注册,并使用 component_master_del() 取消注册。

void component_match_add(struct device *parent, struct component_match **matchptr, int (*compare)(struct device*, void*), void *compare_data)

添加组件匹配条目

参数

struct device *parent

带有聚合驱动程序的设备

struct component_match **matchptr

指向组件匹配列表的指针

int (*compare)(struct device *, void *)

用于匹配所有组件的比较函数

void *compare_data

传递给 compare 函数的不透明指针

描述

将新的组件匹配添加到存储在 matchptr 中的列表中,parent 聚合驱动程序需要该列表才能正常工作。在添加第一个匹配项之前,指向 matchptr 的组件匹配列表必须初始化为 NULL。这仅与使用 component_add() 添加的组件匹配。

matchptr 中分配的匹配列表将使用 devm 操作自动释放。

另请参阅 component_match_add_release()component_match_add_typed()

int component_compare_of(struct device *dev, void *data)

用于 of_node 的常见组件比较函数

参数

struct device *dev

组件设备

void *data

来自 component_match_add_release()compare_data

描述

当 compare_data 是设备的 of_node 时,常见的比较函数。例如 component_match_add_release(masterdev, match, component_release_of, component_compare_of, component_dev_of_node)

void component_release_of(struct device *dev, void *data)

of_node 的通用组件释放函数。

参数

struct device *dev

组件设备

void *data

来自 component_match_add_release()compare_data

描述

关于示例,请参阅 component_compare_of()

int component_compare_dev(struct device *dev, void *data)

dev 的通用组件比较函数。

参数

struct device *dev

组件设备

void *data

来自 component_match_add_release()compare_data

描述

当 compare_data 是结构体 device 时的通用比较函数。例如:component_match_add(masterdev, match, component_compare_dev, component_dev)

int component_compare_dev_name(struct device *dev, void *data)

设备名称的通用组件比较函数。

参数

struct device *dev

组件设备

void *data

来自 component_match_add_release()compare_data

描述

当 compare_data 是设备名称字符串时的通用比较函数。例如:component_match_add(masterdev, match, component_compare_dev_name, “component_dev_name”)

void component_match_add_release(struct device *parent, struct component_match **matchptr, void (*release)(struct device*, void*), int (*compare)(struct device*, void*), void *compare_data)

添加带有释放回调的组件匹配条目。

参数

struct device *parent

聚合驱动程序的父设备。

struct component_match **matchptr

指向组件匹配列表的指针

void (*release)(struct device *, void *)

用于 compare_data 的释放函数。

int (*compare)(struct device *, void *)

用于匹配所有组件的比较函数

void *compare_data

传递给 compare 函数的不透明指针

描述

向存储在 matchptr 中的列表添加新的组件匹配项,聚合驱动程序需要该列表才能正常工作。在添加第一个匹配项之前,matchptr 指向的组件匹配列表必须初始化为 NULL。这仅与使用 component_add() 添加的组件匹配。

matchptr 中分配的匹配列表使用 devm 操作自动释放,此时将调用 release 来释放 compare_data 持有的任何引用,例如,当 compare_data 是一个 device_node 时,必须使用 of_node_put() 释放。

另请参阅 component_match_add()component_match_add_typed()

void component_match_add_typed(struct device *parent, struct component_match **matchptr, int (*compare_typed)(struct device*, int, void*), void *compare_data)

为类型化组件添加组件匹配条目。

参数

struct device *parent

聚合驱动程序的父设备。

struct component_match **matchptr

指向组件匹配列表的指针

int (*compare_typed)(struct device *, int, void *)

用于匹配所有类型化组件的比较函数。

void *compare_data

传递给 compare 函数的不透明指针

描述

向存储在 matchptr 中的列表添加新的组件匹配项,聚合驱动程序需要该列表才能正常工作。在添加第一个匹配项之前,matchptr 指向的组件匹配列表必须初始化为 NULL。这仅与使用 component_add_typed() 添加的组件匹配。

matchptr 中分配的匹配列表将使用 devm 操作自动释放。

另请参阅 component_match_add_release()component_match_add_typed()

int component_master_add_with_match(struct device *parent, const struct component_master_ops *ops, struct component_match *match)

注册一个聚合驱动程序。

参数

struct device *parent

聚合驱动程序的父设备。

const struct component_master_ops *ops

聚合驱动程序的回调函数。

struct component_match *match

聚合驱动程序的组件匹配列表。

描述

注册一个新的聚合驱动程序,该驱动程序由通过调用 component_match_add() 函数之一添加到 match 的组件组成。一旦 match 中的所有组件都可用,它将通过从 ops 调用 component_master_ops.bind 进行组装。必须通过调用 component_master_del() 来注销。

void component_master_del(struct device *parent, const struct component_master_ops *ops)

注销一个聚合驱动程序。

参数

struct device *parent

聚合驱动程序的父设备。

const struct component_master_ops *ops

聚合驱动程序的回调函数。

描述

注销通过 component_master_add_with_match() 注册的聚合驱动程序。如果必要,首先通过从 ops 调用 component_master_ops.unbind 来拆卸聚合驱动程序。

void component_unbind_all(struct device *parent, void *data)

取消绑定聚合驱动程序的所有组件。

参数

struct device *parent

聚合驱动程序的父设备。

void *data

传递给所有组件的不透明指针。

描述

通过将 data 传递给它们的 component_ops.unbind 函数来取消绑定聚合设备的所有组件。应从 component_master_ops.unbind 调用。

int component_bind_all(struct device *parent, void *data)

绑定聚合驱动的所有组件

参数

struct device *parent

聚合驱动程序的父设备。

void *data

传递给所有组件的不透明指针。

描述

通过将 data 传递给它们的 component_ops.bind 函数来绑定聚合 **dev** 的所有组件。应该从 component_master_ops.bind 中调用。

int component_add_typed(struct device *dev, const struct component_ops *ops, int subcomponent)

注册一个组件

参数

struct device *dev

组件设备

const struct component_ops *ops

组件回调函数

int subcomponent

子组件的非零标识符

描述

dev 注册一个新组件。当聚合驱动准备好通过调用 component_bind_all() 来绑定整个驱动时,将调用 ops 中的函数。另请参阅 struct component_ops

**subcomponent** 必须为非零值,用于区分在同一设备 dev 上注册的多个组件。这些组件使用 component_match_add_typed() 进行匹配。

组件需要在驱动卸载/断开连接时通过调用 component_del() 来取消注册。

另请参阅 component_add()

int component_add(struct device *dev, const struct component_ops *ops)

注册一个组件

参数

struct device *dev

组件设备

const struct component_ops *ops

组件回调函数

描述

dev 注册一个新组件。当聚合驱动准备好通过调用 component_bind_all() 来绑定整个驱动时,将调用 ops 中的函数。另请参阅 struct component_ops

组件需要在驱动卸载/断开连接时通过调用 component_del() 来取消注册。

另请参阅 component_add_typed(),它允许在同一设备上注册多个不同的组件。

void component_del(struct device *dev, const struct component_ops *ops)

取消注册一个组件

参数

struct device *dev

组件设备

const struct component_ops *ops

组件回调函数

描述

取消注册使用 component_add() 添加的组件。如果组件已绑定到聚合驱动程序中,这将强制整个聚合驱动程序(包括其所有组件)解除绑定。