资源、时钟、复位、PM 与子节点生命周期

资源、时钟、复位、PM 与子节点生命周期

1. Parent-first原则

Bus controller通常是children访问硬件的前提。Probe必须先完成parent资源,再创建child:

1
2
3
4
5
6
regulator/genpd
-> clocks
-> reset
-> MMIO/timing/windows
-> IRQ/error masks
-> register/populate children

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
2
3
4
5
assert reset
-> enable clock/power
-> deassert reset
-> wait ready
-> program controller

具体硬件可能要求先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
2
3
4
5
6
7
block new child creation
-> unregister/depopulate children
-> flush work/timers
-> disable IRQ
-> stop DMA/rings
-> assert reset
-> disable clocks/power

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未更新。

文章互动

阅读 --

留言

0 条留言

正在加载留言…