1. 程式人生 > 其它 >裝置驅動-【轉載】pinctrl-dts 屬性 pinctrl-names="default" 與probe函式

裝置驅動-【轉載】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 節點屬性就算了 }