root/drivers/base/pinctrl.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pinctrl_bind_pins

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * Driver core interface to the pinctrl subsystem.
   4  *
   5  * Copyright (C) 2012 ST-Ericsson SA
   6  * Written on behalf of Linaro for ST-Ericsson
   7  * Based on bits of regulator core, gpio core and clk core
   8  *
   9  * Author: Linus Walleij <linus.walleij@linaro.org>
  10  */
  11 
  12 #include <linux/device.h>
  13 #include <linux/pinctrl/devinfo.h>
  14 #include <linux/pinctrl/consumer.h>
  15 #include <linux/slab.h>
  16 
  17 /**
  18  * pinctrl_bind_pins() - called by the device core before probe
  19  * @dev: the device that is just about to probe
  20  */
  21 int pinctrl_bind_pins(struct device *dev)
  22 {
  23         int ret;
  24 
  25         if (dev->of_node_reused)
  26                 return 0;
  27 
  28         dev->pins = devm_kzalloc(dev, sizeof(*(dev->pins)), GFP_KERNEL);
  29         if (!dev->pins)
  30                 return -ENOMEM;
  31 
  32         dev->pins->p = devm_pinctrl_get(dev);
  33         if (IS_ERR(dev->pins->p)) {
  34                 dev_dbg(dev, "no pinctrl handle\n");
  35                 ret = PTR_ERR(dev->pins->p);
  36                 goto cleanup_alloc;
  37         }
  38 
  39         dev->pins->default_state = pinctrl_lookup_state(dev->pins->p,
  40                                         PINCTRL_STATE_DEFAULT);
  41         if (IS_ERR(dev->pins->default_state)) {
  42                 dev_dbg(dev, "no default pinctrl state\n");
  43                 ret = 0;
  44                 goto cleanup_get;
  45         }
  46 
  47         dev->pins->init_state = pinctrl_lookup_state(dev->pins->p,
  48                                         PINCTRL_STATE_INIT);
  49         if (IS_ERR(dev->pins->init_state)) {
  50                 /* Not supplying this state is perfectly legal */
  51                 dev_dbg(dev, "no init pinctrl state\n");
  52 
  53                 ret = pinctrl_select_state(dev->pins->p,
  54                                            dev->pins->default_state);
  55         } else {
  56                 ret = pinctrl_select_state(dev->pins->p, dev->pins->init_state);
  57         }
  58 
  59         if (ret) {
  60                 dev_dbg(dev, "failed to activate initial pinctrl state\n");
  61                 goto cleanup_get;
  62         }
  63 
  64 #ifdef CONFIG_PM
  65         /*
  66          * If power management is enabled, we also look for the optional
  67          * sleep and idle pin states, with semantics as defined in
  68          * <linux/pinctrl/pinctrl-state.h>
  69          */
  70         dev->pins->sleep_state = pinctrl_lookup_state(dev->pins->p,
  71                                         PINCTRL_STATE_SLEEP);
  72         if (IS_ERR(dev->pins->sleep_state))
  73                 /* Not supplying this state is perfectly legal */
  74                 dev_dbg(dev, "no sleep pinctrl state\n");
  75 
  76         dev->pins->idle_state = pinctrl_lookup_state(dev->pins->p,
  77                                         PINCTRL_STATE_IDLE);
  78         if (IS_ERR(dev->pins->idle_state))
  79                 /* Not supplying this state is perfectly legal */
  80                 dev_dbg(dev, "no idle pinctrl state\n");
  81 #endif
  82 
  83         return 0;
  84 
  85         /*
  86          * If no pinctrl handle or default state was found for this device,
  87          * let's explicitly free the pin container in the device, there is
  88          * no point in keeping it around.
  89          */
  90 cleanup_get:
  91         devm_pinctrl_put(dev->pins->p);
  92 cleanup_alloc:
  93         devm_kfree(dev, dev->pins);
  94         dev->pins = NULL;
  95 
  96         /* Return deferrals */
  97         if (ret == -EPROBE_DEFER)
  98                 return ret;
  99         /* Return serious errors */
 100         if (ret == -EINVAL)
 101                 return ret;
 102         /* We ignore errors like -ENOENT meaning no pinctrl state */
 103 
 104         return 0;
 105 }

/* [<][>][^][v][top][bottom][index][help] */