子设备驱动绑定父设备前如何获取父设备struct device句柄?
问题描述
设备树片段
&bus { child_1 : childNode@50 { cell-index = <0>; .......... status "ok"; }; child_2 : childNode@70 { cell-index = <1>; .......... status "ok"; }; };
需求与疑问
在子设备(child_1/child_2)的驱动probe阶段,需要调用电源管理API将父设备bus保持在高功耗状态,完成probe后再让父设备挂起,用到的内核API如下:
pm_runtime_getsync(struct device *bus_handle); /* bus_handle为父设备bus的句柄*/ ..........子设备probe完成后..... pm_runtime_putsync(struct device *bus_handle);
目前已知可通过struct device_node *parent_node = of_get_parent(child_node);获取父设备的device_node,但需要将其转换为struct device类型,想确认是否有更简洁的实现方式?
解决方案
直接转换的简洁实现
可以使用of_find_device_by_node()函数直接将父设备的struct device_node转换为struct device*,结合of_get_parent()可一步完成父设备句柄的获取,示例代码如下:
// 从子设备的platform_device获取对应的device_node struct device_node *child_node = dev_of_node(&pdev->dev); // 获取父设备的device_node struct device_node *parent_node = of_get_parent(child_node); // 直接转换为struct device句柄 struct device *bus_handle = of_find_device_by_node(parent_node); if (bus_handle) { pm_runtime_getsync(bus_handle); // 执行子设备probe的核心逻辑 pm_runtime_putsync(bus_handle); put_device(bus_handle); // 必须调用释放引用,避免内存泄漏 }
更高效的替代方案
如果子设备的struct device已经完成父设备关联,可直接通过子设备的dev.parent成员获取父设备句柄,无需处理device_node转换:
struct device *bus_handle = pdev->dev.parent; if (bus_handle) { pm_runtime_getsync(bus_handle); // probe逻辑 pm_runtime_putsync(bus_handle); }
注意:这种方式仅适用于驱动绑定流程中dev.parent已被正确赋值的阶段,若在绑定早期调用,可能返回NULL,此时仍需依赖device_node转换的方式。
关键注意事项
of_find_device_by_node()会增加设备的引用计数,使用完成后必须调用put_device()释放,否则会导致内存泄漏。- 若父设备
bus尚未完成probe或未注册到系统,of_find_device_by_node()会返回NULL,此时需确保父设备驱动先于子设备完成初始化,或在子设备probe中添加等待父设备就绪的逻辑。
内容的提问来源于stack exchange,提问作者StarkSpec
相关产品推荐
相关产品推荐

