You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子设备驱动绑定父设备前如何获取父设备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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:12:34