0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/device.h>
0013 #include <linux/pinctrl/devinfo.h>
0014 #include <linux/pinctrl/consumer.h>
0015 #include <linux/slab.h>
0016
0017
0018
0019
0020
0021 int pinctrl_bind_pins(struct device *dev)
0022 {
0023 int ret;
0024
0025 if (dev->of_node_reused)
0026 return 0;
0027
0028 dev->pins = devm_kzalloc(dev, sizeof(*(dev->pins)), GFP_KERNEL);
0029 if (!dev->pins)
0030 return -ENOMEM;
0031
0032 dev->pins->p = devm_pinctrl_get(dev);
0033 if (IS_ERR(dev->pins->p)) {
0034 dev_dbg(dev, "no pinctrl handle\n");
0035 ret = PTR_ERR(dev->pins->p);
0036 goto cleanup_alloc;
0037 }
0038
0039 dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,
0040 PINCTRL_STATE_DEFAULT);
0041 if (IS_ERR(dev->pins->default_state)) {
0042 dev_dbg(dev, "no default pinctrl state\n");
0043 ret = 0;
0044 goto cleanup_get;
0045 }
0046
0047 dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,
0048 PINCTRL_STATE_INIT);
0049 if (IS_ERR(dev->pins->init_state)) {
0050
0051 dev_dbg(dev, "no init pinctrl state\n");
0052
0053 ret = pinctrl_select_state(dev->pins->p,
0054 dev->pins->default_state);
0055 } else {
0056 ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);
0057 }
0058
0059 if (ret) {
0060 dev_dbg(dev, "failed to activate initial pinctrl state\n");
0061 goto cleanup_get;
0062 }
0063
0064 #ifdef CONFIG_PM
0065
0066
0067
0068
0069
0070 dev->pins->sleep_state = pinctrl_lookup_state(dev->pins->p,
0071 PINCTRL_STATE_SLEEP);
0072 if (IS_ERR(dev->pins->sleep_state))
0073
0074 dev_dbg(dev, "no sleep pinctrl state\n");
0075
0076 dev->pins->idle_state = pinctrl_lookup_state(dev->pins->p,
0077 PINCTRL_STATE_IDLE);
0078 if (IS_ERR(dev->pins->idle_state))
0079
0080 dev_dbg(dev, "no idle pinctrl state\n");
0081 #endif
0082
0083 return 0;
0084
0085
0086
0087
0088
0089
0090 cleanup_get:
0091 devm_pinctrl_put(dev->pins->p);
0092 cleanup_alloc:
0093 devm_kfree(dev, dev->pins);
0094 dev->pins = NULL;
0095
0096
0097 if (ret == -EPROBE_DEFER)
0098 return ret;
0099
0100 if (ret == -EINVAL)
0101 return ret;
0102
0103
0104 return 0;
0105 }