资源、时钟、复位、PM 与子节点生命周期
1. Parent-first原则
Bus controller通常是children访问硬件的前提。Probe必须先完成parent资源,再创建child:
1 | regulator/genpd |
of_platform_populate()不是无条件的第一步。
2. Managed资源
devm_*适合MMIO、clock引用和普通分配,但不能自动表达所有硬件停机顺序。例如:
- devm释放IRQ前仍可能有DMA;
- devm关clock前child仍可能访问;
- bus type上的device引用可能晚于parent remove;
- workqueue/timer必须显式cancel/flush。
3. Clock
外部总线timing通常由clock频率换算。若clock rate在runtime变化:
- timing寄存器可能需要重新计算;
- divider字段必须检查上下限;
- clock notifier与I/O需串行;
- resume后先恢复clock再恢复register。
只在probe计算一次不一定适合动态DVFS。
4. Reset
安全顺序通常为:
1 | assert reset |
具体硬件可能要求先clock后reset。必须按binding/TRM,而不是机械套模板。
Remove/suspend前若assert parent reset,需先停止所有children和DMA。
5. Runtime PM
Bus parent runtime suspend条件:
- child均已suspend;
- 无pending command/ring;
- 无wake transaction;
- IRQ已处理或设为wake;
- register context已保存。
Child runtime get通过parent-child PM依赖或device link向上传播。若自定义bus没有正确父子关系,parent可能过早断电。
6. Child Populate
OF容器常用:
1 | of_platform_populate(np, NULL, lookup, &pdev->dev); |
关键参数:
- root node;
- match table;
- auxdata;
- parent device。
Parent参数决定sysfs层次和PM依赖。传错或设NULL可能破坏runtime PM排序。
7. 动态枚举
MHI/FSL-MC不依赖静态OF child,而由hardware/firmware状态创建device。它们必须处理:
- late appearance;
- reset后重新枚举;
- object/channel消失;
- driver正在probe时controller错误;
- userspace持有设备节点。
8. Deferred Probe
Bus driver可能等待:
- clock/reset/regulator;
- syscon;
- genpd;
- firmware;
- IOMMU/MSI domain。
返回-EPROBE_DEFER前不得populate不可用的children。否则children反复probe并访问未准备好的parent。
9. Remove
建议逆序:
1 | block new child creation |
simple-pm-bus源码remove仅disable runtime PM,是透明OF容器的简化实现,不应推广到有硬件状态的controller。
10. System Sleep
系统suspend与runtime suspend不完全相同:
- console/wakeup bus可能保持;
- firmware-managed bus可能需要handshake;
- MHI需进入M3;
- 外部总线可能丢失timing context;
- abort/error monitor可能要保持捕获wake fault。
Resume需在children之前恢复parent寄存器。
11. 常见错误
- clock enable后probe失败未disable;
- deassert reset后未等待ready;
- children先创建、timing后写;
- remove未depopulate;
- suspend未停DMA;
- error IRQ清除顺序错误;
- runtime PM引用不配对;
- 动态clock后timing未更新。
正在加载留言…