pin function和pin group:iomuxc节点解析始末
设备树iomuxc节点层次
-
iomuxc
-
function
-
group
fsl,pins = < xxx xxx >;
…
-
group
-
…
-
-
function
-
…
-
层次关系说明
- iomuxc:pinctrl子系统的设备树节点
- function:芯片具有外设功能,一个 功能对应一个或多个IO组配置信息
- 比如说i2c有几个功能,一个功能用一组IO引脚,另一个功能用另一组引脚
- group:IO组中每个IO的配置信息
- fsl,pins:imx6ull中,功能和IO组的标识属性
imx_pinctrl_probe_dt()函数
drivers/pinctrl/freescale/pinctrl-imx.c
static int imx_pinctrl_probe_dt(struct platform_device *pdev,
struct imx_pinctrl *ipctl)
{
//iomux节点
struct device_node *np = pdev->dev.of_node;
struct device_node *child;
struct pinctrl_dev *pctl = ipctl->pctl;
//用于判断iomuxc节点下面有几个fuction
flat_funcs = imx_pinctrl_dt_is_flat_functions(np);
//如果返回的是true说明只有一个function
if (flat_funcs) {
nfuncs = 1;
} else {
nfuncs = of_get_child_count(np);
if (nfuncs == 0) {
dev_err(&pdev->dev, "no functions defined\n");
return -EINVAL;
}
}
//创建func_desc,并加入func的基数树中
for (i = 0; i < nfuncs; i++) {
struct function_desc *function;
function = devm_kzalloc(&pdev->dev, sizeof(*function),
GFP_KERNEL);
if (!function)
return -ENOMEM;
mutex_lock(&ipctl->mutex);
radix_tree_insert(&pctl->pin_function_tree, i, function);
//在pin_function_tree中插入一个function_desc节点
mutex_unlock(&ipctl->mutex);
}
pctl->num_functions = nfuncs;
ipctl->group_index = 0;
if (flat_funcs) {
//获取function的子节点数量,即group数量
pctl->num_groups = of_get_child_count(np);
} else