Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Driver core interface to the pinctrl subsystem.
0004  *
0005  * Copyright (C) 2012 ST-Ericsson SA
0006  * Written on behalf of Linaro for ST-Ericsson
0007  * Based on bits of regulator core, gpio core and clk core
0008  *
0009  * Author: Linus Walleij <linus.walleij@linaro.org>
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  * pinctrl_bind_pins() - called by the device core before probe
0019  * @dev: the device that is just about to probe
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         /* Not supplying this state is perfectly legal */
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      * If power management is enabled, we also look for the optional
0067      * sleep and idle pin states, with semantics as defined in
0068      * <linux/pinctrl/pinctrl-state.h>
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         /* Not supplying this state is perfectly legal */
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         /* Not supplying this state is perfectly legal */
0080         dev_dbg(dev, "no idle pinctrl state\n");
0081 #endif
0082 
0083     return 0;
0084 
0085     /*
0086      * If no pinctrl handle or default state was found for this device,
0087      * let's explicitly free the pin container in the device, there is
0088      * no point in keeping it around.
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     /* Return deferrals */
0097     if (ret == -EPROBE_DEFER)
0098         return ret;
0099     /* Return serious errors */
0100     if (ret == -EINVAL)
0101         return ret;
0102     /* We ignore errors like -ENOENT meaning no pinctrl state */
0103 
0104     return 0;
0105 }