dts 属性 pinctrl-names = “default“ 作用

博客内容涉及Linux内核中设备驱动程序的pinctrl机制。在设备初始化阶段,pinctrl_bind_pins函数被调用来绑定引脚配置,该函数尝试获取并设置默认和初始化状态。如果找不到pinctrl节点属性,则不会进行设置,且不会影响设备的继续探测。这个过程对于确保设备正确配置其引脚功能至关重要。
摘要由CSDN通过智能技术生成

之前一直有困惑 这属性 到底有没用,到底设置了没有

[    2.198826] Call trace:
[    2.198852]  dump_backtrace+0x0/0x178
[    2.198863]  show_stack+0x14/0x20
[    2.198891]  dump_stack+0x94/0xb4
[    2.198912]  pinctrl_commit_state+0xf8/0x158
[    2.198925]  pinctrl_select_state+0x18/0x28
[    2.198942]  pinctrl_bind_pins+0x13c/0x150
[    2.198958]  really_probe+0xcc/0x2a0
[    2.198969]  driver_probe_device+0x58/0x100
[    2.198980]  device_driver_attach+0x6c/0x78
[    2.198990]  __driver_attach+0xb0/0xf0
[    2.199002]  bus_for_each_dev+0x68/0xc8
[    2.199013]  driver_attach+0x20/0x28
[    2.199023]  bus_add_driver+0xf8/0x1f0
[    2.199036]  driver_register+0x60/0x110
[    2.199047]  __platform_driver_register+0x40/0x48
[    2.199065]  xxxxx_init+0x18/0x20
[    2.199078]  do_one_initcall+0x48/0x240
[    2.199092]  kernel_init_freeable+0x210/0x37c
[    2.199100]  kernel_init+0x10/0x108
[    2.199112]  ret_from_fork+0x10/0x18

drivers/base/dd.c:489:  ret = pinctrl_bind_pins(dev);
drivers/base/pinctrl.c:18: * pinctrl_bind_pins() - called by the device core before probe
drivers/base/pinctrl.c:21:int pinctrl_bind_pins(struct device *dev)

static int really_probe(struct device *dev, struct device_driver *drv)
{

。。。。。。

    /* If using pinctrl, bind pins now before probing */
    ret = pinctrl_bind_pins(dev);
    if (ret)
        goto pinctrl_bind_failed;

。。。。

}

/**
 * pinctrl_bind_pins() - called by the device core before probe
 * @dev: the device that is just about to probe
 */
int pinctrl_bind_pins(struct device *dev)
{
    int ret;

    if (dev->of_node_reused)
        return 0;

    dev->pins = devm_kzalloc(dev, sizeof(*(dev->pins)), GFP_KERNEL);
    if (!dev->pins)
        return -ENOMEM;

    dev->pins->p = devm_pinctrl_get(dev);
    if (IS_ERR(dev->pins->p)) {
        dev_dbg(dev, "no pinctrl handle\n");
        ret = PTR_ERR(dev->pins->p);
        goto cleanup_alloc;
    }

    dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,
                    PINCTRL_STATE_DEFAULT);
    if (IS_ERR(dev->pins->default_state)) {
        dev_dbg(dev, "no default pinctrl state\n");
        ret = 0;
        goto cleanup_get;
    }

    dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,
                    PINCTRL_STATE_INIT);
    if (IS_ERR(dev->pins->init_state)) {
        /* Not supplying this state is perfectly legal */
        dev_dbg(dev, "no init pinctrl state\n");

        ret = pinctrl_select_state(dev->pins->p,
                       dev->pins->default_state);
    } else {
        ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);
    }

    if (ret) {
        dev_dbg(dev, "failed to activate initial pinctrl state\n");
        goto cleanup_get;
    }

    return 0;  //找到就想设置,设置失败probe就失败,没有这个pinctrl 节点属性就算了

。。。。。。。
}
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值