设备 Probe、休眠与 Pinctrl 状态切换
1. Probe前
Driver Core really_probe()调用:
1 | pinctrl_bind_pins(dev) |
所以 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释放顺序自动产生电气安全状态。
正在加载留言…