设备 Probe、休眠与 Pinctrl 状态切换

设备 Probe、休眠与 Pinctrl 状态切换

1. Probe前

Driver Core really_probe()调用:

1
2
3
4
pinctrl_bind_pins(dev)
-> devm_pinctrl_get
-> lookup init/default
-> select init 或 default

所以 driver probe通常看到 pins已在 default状态。

2. Init与Default

若同时存在:

  • probe前选 init;
  • probe完成后 pinctrl_init_done()切到 default。

适合先保持 reset/safe状态,driver配置硬件后再进入完整功能。

3. Probe失败

Core cleanup释放 pinctrl handle,mux ownership被撤销。硬件寄存器不一定自动恢复 bootloader原值,controller disable语义依 driver。

4. System PM helper

标准 helpers:

  • pinctrl_pm_select_sleep_state;
  • pinctrl_pm_select_default_state;
  • pinctrl_pm_select_idle_state。

Bus/driver PM callback可调用。

5. Runtime PM

Runtime suspend不自动选择 sleep state。Driver需明确在 runtime suspend/resume切换,且考虑 register访问、IRQ wake和 latency。

6. Wakeup

Wake pin在 sleep state必须:

-保持 GPIO/IRQ输入 mux;
-正确 pull;
-Schmitt按需;
-GPIO bank clock/IRQ wake可用;
-不被 power domain断电。

把 wake pin切到高阻错误功能会导致无法唤醒。

7. GPIO IRQ

Pinctrl sleep state与 GPIO irq type是两层配置。切 mux前应 mask IRQ,恢复后清 pending并 unmask。

8. Console

Console UART pin通常不能在系统 suspend中过早切走;earlycon、FIQ debugger和正常 UART可能使用不同 pin group。RK3588 UART2常由 FIQ debugger占用。

9. Remove

Driver remove应:

1.停止 DMA/IRQ;
2.让外设置安全;
3.可选选择 idle/sleep;
4.释放 consumer handle。

不能依赖 devm释放顺序自动产生电气安全状态。

文章互动

阅读 --

留言

0 条留言

正在加载留言…