Pinctrl Core 对象、注册与生命周期
1. Controller
pinctrl_desc包含:
- name/owner;
pinctrl_pin_desc[];pctlops;pmxops;confops;- link_consumers;
- strict。
注册后形成 pinctrl_dev并加入全局 controller list。
2. Ops
pinctrl_ops:
- groups count/name/pins;
- dt_node_to_map/free_map;
- pin_dbg_show。
pinmux_ops:
- functions/groups;
- set_mux;
- gpio_request_enable/disable;
- strict;
- request/free。
pinconf_ops:
- pin_config_get/set;
- group_config_get/set;
- generic。
3. Consumer handle
每个 device可有一个 struct pinctrl:
- dev;
- states list;
- current state;
- DT maps;
- users。
devm_pinctrl_get()随 device detach自动 put。
4. State
State按 name组织 settings:
1 | default |
同一 state可引用多个 controllers和多个 group。
5. Map
Map类型:
- DUMMY_STATE;
- MUX_GROUP;
- CONFIGS_PIN;
- CONFIGS_GROUP。
DT parser把 phandle node转成这些运行时 settings。
6. Select
pinctrl_select_state():
1.先处理当前 state与新 state的 mux差异;
2. enable新 mux;
3.应用 pin/group config;
4.更新 current state;
5.失败时尽力回滚。
不要假设复杂硬件切换是完全原子事务。
7. Controller删除
devm注销时:
-移除 hog;
-检查/释放 mappings;
-从全局 list删除;
-debugfs清理;
-释放 pins/groups。
Consumer若仍引用 controller会导致生命周期错误,因此 controller通常是不可热拔的 SoC基础设施。
8. 锁
Core分别用mutex保护controller list、consumer handle list和map list,controller还有自身mutex。但pinctrl_select_state()的commit路径不持controller mutex,GPIO路径则持有它,因此两者并非由统一锁串行化。Driver set_mux/config可能再进入regmap锁;调用方应在设备层串行化且不能从atomic上下文任意select state。
正在加载留言…