并发、锁、寄存器写与生命周期
1. Core锁
- controller/consumer全局表由 mutex保护;
- controller、consumer和map分别有全局mutex,controller还有自身mutex;
- pin mux owner和GPIO owner在 Core中记录;
- map注册/注销需遵守引用关系。
pinctrl_select_state()的commit路径并不持有pctldev->mutex,而GPIO direction/config路径会持有;两者缺少统一大锁,consumer必须在设备层串行化状态切换,避免与GPIO操作竞态。
2. Rockchip锁
gpio-rockchip.c的每个GPIO bank用raw spinlock保护GPIO/IRQ寄存器;pinctrl侧deferred output另有mutex。Syscon regmap负责pad寄存器访问序列化。
3. Write-mask
Rockchip GRF/IOC通常高16位作为低16位的写使能,可避免普通 read-modify-write竞态。跨16位边界字段或特殊寄存器仍需 driver单独处理。
4. Ordering
输出功能切换的安全顺序依设备:
1 | 先设置安全输出值/方向 |
Rockchip deferred output用于协调 pinconf output与 GPIO bank尚未probe的时序。
5. IRQ并发
IRQ mask/type/ack在spinlock/irqchip约束下执行。RK3588 GPIO V2使用原生both-edge;旧版GPIO的软件polarity翻转才存在采样竞态。
6. Clock
GPIO bank register访问依赖 PCLK;debounce依赖 DBCLK。Runtime/system PM不能在仍有 IRQ/GPIO操作时关闭必要 clock。
7. Probe顺序
Pinctrl controller早期注册;GPIO bank为子节点并关联共同数据。Consumer可能 deferred probe直到 controller/map可用。
8. Remove
SoC pinctrl通常常驻。模块卸载需无 active consumer/GPIO/IRQ;生产内核宜 built-in,防止基础 pins在运行中失去管理。
9. Firmware
Bootloader先配置 pins,Linux接管时 default state会覆盖。若 Linux没有描述某 pin,它可能保持 firmware值,但这不是稳定ABI,休眠/复位后可能变化。
10. Direct register access
用户态 /dev/mem或其它驱动直接写 IOC会绕过 ownership、锁和状态缓存,造成不可诊断竞态,禁止用于产品方案。
正在加载留言…