linux/drivers/base/pinctrl.c
<<
>>
Prefs
   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 */
  21int 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         */
  90cleanup_get:
  91        devm_pinctrl_put(dev->pins->p);
  92cleanup_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}
 106