聚合驱动的组件助手¶
组件助手允许驱动程序将一组子设备(包括它们绑定的驱动程序)收集到一个聚合驱动程序中。各种子系统已经提供了获取此类组件的函数,例如 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 个步骤为聚合驱动程序分配一个结构体。
通过使用聚合驱动程序结构作为不透明的指针数据调用
component_bind_all()
,将所有组件绑定到聚合驱动程序。向子系统注册聚合驱动程序以发布其接口。
请注意,聚合驱动程序的生命周期与任何底层的
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()
。
参数
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)
参数
struct device *dev
组件设备
void *data
来自
component_match_add_release()
的 compare_data
描述
关于示例,请参阅 component_compare_of()
。
参数
struct device *dev
组件设备
void *data
来自
component_match_add_release()
的 compare_data
描述
当 compare_data 是结构体 device 时的通用比较函数。例如:component_match_add(masterdev, match
, component_compare_dev, component_dev)
参数
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()
释放。
-
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
来拆卸聚合驱动程序。
参数
struct device *parent
聚合驱动程序的父设备。
void *data
传递给所有组件的不透明指针。
描述
通过将 data 传递给它们的 component_ops.unbind
函数来取消绑定聚合设备的所有组件。应从 component_master_ops.unbind
调用。
参数
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()
添加的组件。如果组件已绑定到聚合驱动程序中,这将强制整个聚合驱动程序(包括其所有组件)解除绑定。