pinctrl子系统(三):pin寄存器地址与参数的解析与存储

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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值