设备驱动-【转载】pinctrl-dts 属性 pinctrl-names="default" 与probe函数

 

相关文档: register_driver 到 probe 函数调用

https://www.cnblogs.com/zhangzhiwei122/p/16125014.html

 

register_driver 函数,检查 dts 中是否有对应的设备,如果有匹配的设备,就调用 really_probe 函数。 pinctrl-names = "default" 就在 really_probe 中起作用。

 

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 节点属性就算了

}

 

posted @ 2022-04-17 19:40  张志伟122  阅读(525)  评论(0编辑  收藏  举报