Simple PM Bus 与 OF 子设备枚举
1. 用途
simple-pm-bus.c处理“本身几乎透明,但子设备访问前必须给父域上电”的DT容器。它不定义新的bus_type,children仍是platform devices。
2. Match表
1 | simple-pm-bus -> 真正执行PM与populate |
后四项带ONLY_BUS标记。它们通常已由OF Core自动populate;驱动只在自身compatible是节点最具体匹配时返回0,否则返回-ENODEV,避免抢占有专用driver的设备。
3. Probe
真正simple-pm-bus路径:
1 | simple_pm_bus_probe |
可通过platform data传入of_dev_auxdata,给特定child补legacy name/data。
驱动不直接:
- 获取clock;
- 控制reset;
- 调用runtime get;
- 编程寄存器;
- 建立独立地址转换。
电源资源由通用PM domain/clock等device links与父子关系协作。
4. Driver Override
如果用户通过driver_override强制绑定透明bus节点,probe立即返回0,不执行runtime PM或populate。这是调试逃生口,不能视为正常DT绑定方式。
5. Remove
remove只调用pm_runtime_disable()。OF创建的children通常由platform/OF生命周期处理;驱动本身没有显式of_platform_depopulate()。
因此不适合被频繁动态unbind。若父driver解除而children仍存在,必须确保平台Core的设备移除顺序不会让child访问失去管理的父资源。
6. Runtime PM语义
pm_runtime_enable()仅启用框架,不等于立即上电或自动对每次child I/O计数。实际效果依赖:
- 父节点是否挂genpd;
- child和parent的runtime PM关系;
- child driver是否正确get/put;
- clock是否由runtime PM callback管理。
若只写compatible = "simple-pm-bus"但没有有效PM资源,驱动主要只承担child populate。
7. DT示意
1 | domain-bus { |
若vendor,specific-domain有专用driver,simple-pm-bus不会越过更具体匹配抢占。
8. RK3588
在本树rk3588*.dts*中未发现simple-pm-bus compatible。大量普通simple-bus层次由OF平台枚举机制处理,并不意味着绑定了本驱动。
RK3588多数功能域通过rockchip,rk3588-power-controller及子设备power-domains引用管理,不依赖本文件建立总线。
9. 排障
1 | ls /sys/bus/platform/drivers/simple-pm-bus |
child未probe时先分辨:
- child platform device是否创建;
- compatible是否匹配child driver;
- 父genpd是否可用;
- 专用父driver是否抢占;
- 是否因父probe失败而未populate。
正在加载留言…