Pinctrl Core 对象、注册与生命周期

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
2
3
4
5
default
init
sleep
idle
自定义

同一 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。

文章互动

阅读 --

留言

0 条留言

正在加载留言…