1af873fceSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
22744e8afSLinus Walleij /*
32744e8afSLinus Walleij * Core driver for the pin control subsystem
42744e8afSLinus Walleij *
5befe5bdfSLinus Walleij * Copyright (C) 2011-2012 ST-Ericsson SA
62744e8afSLinus Walleij * Written on behalf of Linaro for ST-Ericsson
72744e8afSLinus Walleij * Based on bits of regulator core, gpio core and clk core
82744e8afSLinus Walleij *
92744e8afSLinus Walleij * Author: Linus Walleij <linus.walleij@linaro.org>
102744e8afSLinus Walleij *
11b2b3e66eSStephen Warren * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
122744e8afSLinus Walleij */
132744e8afSLinus Walleij #define pr_fmt(fmt) "pinctrl core: " fmt
142744e8afSLinus Walleij
15e5530adcSAndy Shevchenko #include <linux/debugfs.h>
16e5530adcSAndy Shevchenko #include <linux/device.h>
17e5530adcSAndy Shevchenko #include <linux/err.h>
18a5a697cdSStephen Rothwell #include <linux/export.h>
192744e8afSLinus Walleij #include <linux/init.h>
20e5530adcSAndy Shevchenko #include <linux/kernel.h>
21e5530adcSAndy Shevchenko #include <linux/kref.h>
222744e8afSLinus Walleij #include <linux/list.h>
232744e8afSLinus Walleij #include <linux/seq_file.h>
24e5530adcSAndy Shevchenko #include <linux/slab.h>
25e5530adcSAndy Shevchenko
266d4ca1fbSStephen Warren #include <linux/pinctrl/consumer.h>
27e5530adcSAndy Shevchenko #include <linux/pinctrl/devinfo.h>
282744e8afSLinus Walleij #include <linux/pinctrl/machine.h>
29e5530adcSAndy Shevchenko #include <linux/pinctrl/pinctrl.h>
302afe8229SHaojian Zhuang
312afe8229SHaojian Zhuang #ifdef CONFIG_GPIOLIB
32f1b206cfSDrew Fustini #include "../gpio/gpiolib.h"
332afe8229SHaojian Zhuang #endif
342afe8229SHaojian Zhuang
352744e8afSLinus Walleij #include "core.h"
3657291ce2SStephen Warren #include "devicetree.h"
37ae6b4d85SLinus Walleij #include "pinconf.h"
38e5530adcSAndy Shevchenko #include "pinmux.h"
39b2b3e66eSStephen Warren
405b3aa5f7SDong Aisheng static bool pinctrl_dummy_state;
415b3aa5f7SDong Aisheng
4242fed7baSPatrice Chotard /* Mutex taken to protect pinctrl_list */
43843aec96SSachin Kamat static DEFINE_MUTEX(pinctrl_list_mutex);
4442fed7baSPatrice Chotard
4542fed7baSPatrice Chotard /* Mutex taken to protect pinctrl_maps */
4642fed7baSPatrice Chotard DEFINE_MUTEX(pinctrl_maps_mutex);
4742fed7baSPatrice Chotard
4842fed7baSPatrice Chotard /* Mutex taken to protect pinctrldev_list */
49843aec96SSachin Kamat static DEFINE_MUTEX(pinctrldev_list_mutex);
5057b676f9SStephen Warren
5157b676f9SStephen Warren /* Global list of pin control devices (struct pinctrl_dev) */
5242fed7baSPatrice Chotard static LIST_HEAD(pinctrldev_list);
532744e8afSLinus Walleij
5457b676f9SStephen Warren /* List of pin controller handles (struct pinctrl) */
55befe5bdfSLinus Walleij static LIST_HEAD(pinctrl_list);
56befe5bdfSLinus Walleij
5757b676f9SStephen Warren /* List of pinctrl maps (struct pinctrl_maps) */
586f9e41f4SLaurent Meunier LIST_HEAD(pinctrl_maps);
59b2b3e66eSStephen Warren
60befe5bdfSLinus Walleij
615b3aa5f7SDong Aisheng /**
625b3aa5f7SDong Aisheng * pinctrl_provide_dummies() - indicate if pinctrl provides dummy state support
635b3aa5f7SDong Aisheng *
645b3aa5f7SDong Aisheng * Usually this function is called by platforms without pinctrl driver support
655b3aa5f7SDong Aisheng * but run with some shared drivers using pinctrl APIs.
665b3aa5f7SDong Aisheng * After calling this function, the pinctrl core will return successfully
675b3aa5f7SDong Aisheng * with creating a dummy state for the driver to keep going smoothly.
685b3aa5f7SDong Aisheng */
pinctrl_provide_dummies(void)695b3aa5f7SDong Aisheng void pinctrl_provide_dummies(void)
705b3aa5f7SDong Aisheng {
715b3aa5f7SDong Aisheng pinctrl_dummy_state = true;
725b3aa5f7SDong Aisheng }
735b3aa5f7SDong Aisheng
pinctrl_dev_get_name(struct pinctrl_dev * pctldev)742744e8afSLinus Walleij const char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev)
752744e8afSLinus Walleij {
762744e8afSLinus Walleij /* We're not allowed to register devices without name */
772744e8afSLinus Walleij return pctldev->desc->name;
782744e8afSLinus Walleij }
792744e8afSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_dev_get_name);
802744e8afSLinus Walleij
pinctrl_dev_get_devname(struct pinctrl_dev * pctldev)81d6e99abbSHaojian Zhuang const char *pinctrl_dev_get_devname(struct pinctrl_dev *pctldev)
82d6e99abbSHaojian Zhuang {
83d6e99abbSHaojian Zhuang return dev_name(pctldev->dev);
84d6e99abbSHaojian Zhuang }
85d6e99abbSHaojian Zhuang EXPORT_SYMBOL_GPL(pinctrl_dev_get_devname);
86d6e99abbSHaojian Zhuang
pinctrl_dev_get_drvdata(struct pinctrl_dev * pctldev)872744e8afSLinus Walleij void *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev)
882744e8afSLinus Walleij {
892744e8afSLinus Walleij return pctldev->driver_data;
902744e8afSLinus Walleij }
912744e8afSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_dev_get_drvdata);
922744e8afSLinus Walleij
932744e8afSLinus Walleij /**
949dfac4fdSLinus Walleij * get_pinctrl_dev_from_devname() - look up pin controller device
959dfac4fdSLinus Walleij * @devname: the name of a device instance, as returned by dev_name()
962744e8afSLinus Walleij *
972744e8afSLinus Walleij * Looks up a pin control device matching a certain device name or pure device
982744e8afSLinus Walleij * pointer, the pure device pointer will take precedence.
992744e8afSLinus Walleij */
get_pinctrl_dev_from_devname(const char * devname)1009dfac4fdSLinus Walleij struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *devname)
1012744e8afSLinus Walleij {
1026cadafb3SMasahiro Yamada struct pinctrl_dev *pctldev;
1032744e8afSLinus Walleij
1049dfac4fdSLinus Walleij if (!devname)
1059dfac4fdSLinus Walleij return NULL;
1069dfac4fdSLinus Walleij
10744d5f7bbSLinus Walleij mutex_lock(&pinctrldev_list_mutex);
10844d5f7bbSLinus Walleij
1092744e8afSLinus Walleij list_for_each_entry(pctldev, &pinctrldev_list, node) {
1109dfac4fdSLinus Walleij if (!strcmp(dev_name(pctldev->dev), devname)) {
1112744e8afSLinus Walleij /* Matched on device name */
11244d5f7bbSLinus Walleij mutex_unlock(&pinctrldev_list_mutex);
11344d5f7bbSLinus Walleij return pctldev;
1142744e8afSLinus Walleij }
1152744e8afSLinus Walleij }
1162744e8afSLinus Walleij
11744d5f7bbSLinus Walleij mutex_unlock(&pinctrldev_list_mutex);
11844d5f7bbSLinus Walleij
11944d5f7bbSLinus Walleij return NULL;
1202744e8afSLinus Walleij }
1212744e8afSLinus Walleij
get_pinctrl_dev_from_of_node(struct device_node * np)12242fed7baSPatrice Chotard struct pinctrl_dev *get_pinctrl_dev_from_of_node(struct device_node *np)
12342fed7baSPatrice Chotard {
12442fed7baSPatrice Chotard struct pinctrl_dev *pctldev;
12542fed7baSPatrice Chotard
12642fed7baSPatrice Chotard mutex_lock(&pinctrldev_list_mutex);
12742fed7baSPatrice Chotard
12842fed7baSPatrice Chotard list_for_each_entry(pctldev, &pinctrldev_list, node)
12903da7f98SAndy Shevchenko if (device_match_of_node(pctldev->dev, np)) {
13042fed7baSPatrice Chotard mutex_unlock(&pinctrldev_list_mutex);
13142fed7baSPatrice Chotard return pctldev;
13242fed7baSPatrice Chotard }
13342fed7baSPatrice Chotard
134d463f82dSDaniel Mack mutex_unlock(&pinctrldev_list_mutex);
13542fed7baSPatrice Chotard
13642fed7baSPatrice Chotard return NULL;
13742fed7baSPatrice Chotard }
13842fed7baSPatrice Chotard
1392744e8afSLinus Walleij /**
140ae6b4d85SLinus Walleij * pin_get_from_name() - look up a pin number from a name
141ae6b4d85SLinus Walleij * @pctldev: the pin control device to lookup the pin on
142ae6b4d85SLinus Walleij * @name: the name of the pin to look up
143ae6b4d85SLinus Walleij */
pin_get_from_name(struct pinctrl_dev * pctldev,const char * name)144ae6b4d85SLinus Walleij int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name)
145ae6b4d85SLinus Walleij {
146706e8520SChanho Park unsigned i, pin;
147ae6b4d85SLinus Walleij
148706e8520SChanho Park /* The pin number can be retrived from the pin controller descriptor */
149706e8520SChanho Park for (i = 0; i < pctldev->desc->npins; i++) {
150ae6b4d85SLinus Walleij struct pin_desc *desc;
151ae6b4d85SLinus Walleij
152706e8520SChanho Park pin = pctldev->desc->pins[i].number;
153ae6b4d85SLinus Walleij desc = pin_desc_get(pctldev, pin);
154ae6b4d85SLinus Walleij /* Pin space may be sparse */
1556c325f87SAxel Lin if (desc && !strcmp(name, desc->name))
156ae6b4d85SLinus Walleij return pin;
157ae6b4d85SLinus Walleij }
158ae6b4d85SLinus Walleij
159ae6b4d85SLinus Walleij return -EINVAL;
160ae6b4d85SLinus Walleij }
161ae6b4d85SLinus Walleij
162ae6b4d85SLinus Walleij /**
16311f054c1SAndy Shevchenko * pin_get_name() - look up a pin name from a pin id
164dcb5dbc3SDong Aisheng * @pctldev: the pin control device to lookup the pin on
1659c340bbbSLee Jones * @pin: pin number/id to look up
166dcb5dbc3SDong Aisheng */
pin_get_name(struct pinctrl_dev * pctldev,const unsigned pin)167dcb5dbc3SDong Aisheng const char *pin_get_name(struct pinctrl_dev *pctldev, const unsigned pin)
168dcb5dbc3SDong Aisheng {
169dcb5dbc3SDong Aisheng const struct pin_desc *desc;
170dcb5dbc3SDong Aisheng
171dcb5dbc3SDong Aisheng desc = pin_desc_get(pctldev, pin);
172cea234e9SMarkus Elfring if (!desc) {
173dcb5dbc3SDong Aisheng dev_err(pctldev->dev, "failed to get pin(%d) name\n",
174dcb5dbc3SDong Aisheng pin);
175dcb5dbc3SDong Aisheng return NULL;
176dcb5dbc3SDong Aisheng }
177dcb5dbc3SDong Aisheng
178dcb5dbc3SDong Aisheng return desc->name;
179dcb5dbc3SDong Aisheng }
180b88d1451SBaolin Wang EXPORT_SYMBOL_GPL(pin_get_name);
181dcb5dbc3SDong Aisheng
1822744e8afSLinus Walleij /* Deletes a range of pin descriptors */
pinctrl_free_pindescs(struct pinctrl_dev * pctldev,const struct pinctrl_pin_desc * pins,unsigned num_pins)1832744e8afSLinus Walleij static void pinctrl_free_pindescs(struct pinctrl_dev *pctldev,
1842744e8afSLinus Walleij const struct pinctrl_pin_desc *pins,
1852744e8afSLinus Walleij unsigned num_pins)
1862744e8afSLinus Walleij {
1872744e8afSLinus Walleij int i;
1882744e8afSLinus Walleij
1892744e8afSLinus Walleij for (i = 0; i < num_pins; i++) {
1902744e8afSLinus Walleij struct pin_desc *pindesc;
1912744e8afSLinus Walleij
1922744e8afSLinus Walleij pindesc = radix_tree_lookup(&pctldev->pin_desc_tree,
1932744e8afSLinus Walleij pins[i].number);
194cea234e9SMarkus Elfring if (pindesc) {
1952744e8afSLinus Walleij radix_tree_delete(&pctldev->pin_desc_tree,
1962744e8afSLinus Walleij pins[i].number);
197ca53c5f1SLinus Walleij if (pindesc->dynamic_name)
198ca53c5f1SLinus Walleij kfree(pindesc->name);
1992744e8afSLinus Walleij }
2002744e8afSLinus Walleij kfree(pindesc);
2012744e8afSLinus Walleij }
2022744e8afSLinus Walleij }
2032744e8afSLinus Walleij
pinctrl_register_one_pin(struct pinctrl_dev * pctldev,const struct pinctrl_pin_desc * pin)2042744e8afSLinus Walleij static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
205cd8f61f1SMasahiro Yamada const struct pinctrl_pin_desc *pin)
2062744e8afSLinus Walleij {
2072744e8afSLinus Walleij struct pin_desc *pindesc;
208ecfe9a01SSergey Shtylyov int error;
2092744e8afSLinus Walleij
210cd8f61f1SMasahiro Yamada pindesc = pin_desc_get(pctldev, pin->number);
211cea234e9SMarkus Elfring if (pindesc) {
212cd8f61f1SMasahiro Yamada dev_err(pctldev->dev, "pin %d already registered\n",
213cd8f61f1SMasahiro Yamada pin->number);
2142744e8afSLinus Walleij return -EINVAL;
2152744e8afSLinus Walleij }
2162744e8afSLinus Walleij
2172744e8afSLinus Walleij pindesc = kzalloc(sizeof(*pindesc), GFP_KERNEL);
2182104d12dSBjorn Andersson if (!pindesc)
2192744e8afSLinus Walleij return -ENOMEM;
220ae6b4d85SLinus Walleij
2212744e8afSLinus Walleij /* Set owner */
2222744e8afSLinus Walleij pindesc->pctldev = pctldev;
223*2da32aedSMukesh Ojha #ifdef CONFIG_PINMUX
224*2da32aedSMukesh Ojha mutex_init(&pindesc->mux_lock);
225*2da32aedSMukesh Ojha #endif
2262744e8afSLinus Walleij
2279af1e44fSStephen Warren /* Copy basic pin info */
228cd8f61f1SMasahiro Yamada if (pin->name) {
229cd8f61f1SMasahiro Yamada pindesc->name = pin->name;
230ca53c5f1SLinus Walleij } else {
231cd8f61f1SMasahiro Yamada pindesc->name = kasprintf(GFP_KERNEL, "PIN%u", pin->number);
232cea234e9SMarkus Elfring if (!pindesc->name) {
233ecfe9a01SSergey Shtylyov error = -ENOMEM;
234ecfe9a01SSergey Shtylyov goto failed;
235eb26cc9cSSachin Kamat }
236ca53c5f1SLinus Walleij pindesc->dynamic_name = true;
237ca53c5f1SLinus Walleij }
2382744e8afSLinus Walleij
239cd8f61f1SMasahiro Yamada pindesc->drv_data = pin->drv_data;
240cd8f61f1SMasahiro Yamada
241ecfe9a01SSergey Shtylyov error = radix_tree_insert(&pctldev->pin_desc_tree, pin->number, pindesc);
242ecfe9a01SSergey Shtylyov if (error)
243ecfe9a01SSergey Shtylyov goto failed;
244ecfe9a01SSergey Shtylyov
2452744e8afSLinus Walleij pr_debug("registered pin %d (%s) on %s\n",
246cd8f61f1SMasahiro Yamada pin->number, pindesc->name, pctldev->desc->name);
2472744e8afSLinus Walleij return 0;
248ecfe9a01SSergey Shtylyov
249ecfe9a01SSergey Shtylyov failed:
250ecfe9a01SSergey Shtylyov kfree(pindesc);
251ecfe9a01SSergey Shtylyov return error;
2522744e8afSLinus Walleij }
2532744e8afSLinus Walleij
pinctrl_register_pins(struct pinctrl_dev * pctldev,const struct pinctrl_pin_desc * pins,unsigned num_descs)2542744e8afSLinus Walleij static int pinctrl_register_pins(struct pinctrl_dev *pctldev,
2553f713b7cSMasahiro Yamada const struct pinctrl_pin_desc *pins,
2562744e8afSLinus Walleij unsigned num_descs)
2572744e8afSLinus Walleij {
2582744e8afSLinus Walleij unsigned i;
2592744e8afSLinus Walleij int ret = 0;
2602744e8afSLinus Walleij
2612744e8afSLinus Walleij for (i = 0; i < num_descs; i++) {
262cd8f61f1SMasahiro Yamada ret = pinctrl_register_one_pin(pctldev, &pins[i]);
2632744e8afSLinus Walleij if (ret)
2642744e8afSLinus Walleij return ret;
2652744e8afSLinus Walleij }
2662744e8afSLinus Walleij
2672744e8afSLinus Walleij return 0;
2682744e8afSLinus Walleij }
2692744e8afSLinus Walleij
2702744e8afSLinus Walleij /**
271c8587eeeSChristian Ruppert * gpio_to_pin() - GPIO range GPIO number to pin number translation
272c8587eeeSChristian Ruppert * @range: GPIO range used for the translation
273c8587eeeSChristian Ruppert * @gpio: gpio pin to translate to a pin number
274c8587eeeSChristian Ruppert *
275c8587eeeSChristian Ruppert * Finds the pin number for a given GPIO using the specified GPIO range
276c8587eeeSChristian Ruppert * as a base for translation. The distinction between linear GPIO ranges
277c8587eeeSChristian Ruppert * and pin list based GPIO ranges is managed correctly by this function.
278c8587eeeSChristian Ruppert *
279c8587eeeSChristian Ruppert * This function assumes the gpio is part of the specified GPIO range, use
280c8587eeeSChristian Ruppert * only after making sure this is the case (e.g. by calling it on the
281c8587eeeSChristian Ruppert * result of successful pinctrl_get_device_gpio_range calls)!
282c8587eeeSChristian Ruppert */
gpio_to_pin(struct pinctrl_gpio_range * range,unsigned int gpio)283c8587eeeSChristian Ruppert static inline int gpio_to_pin(struct pinctrl_gpio_range *range,
284c8587eeeSChristian Ruppert unsigned int gpio)
285c8587eeeSChristian Ruppert {
286c8587eeeSChristian Ruppert unsigned int offset = gpio - range->base;
287c8587eeeSChristian Ruppert if (range->pins)
288c8587eeeSChristian Ruppert return range->pins[offset];
289c8587eeeSChristian Ruppert else
290c8587eeeSChristian Ruppert return range->pin_base + offset;
291c8587eeeSChristian Ruppert }
292c8587eeeSChristian Ruppert
293c8587eeeSChristian Ruppert /**
2942744e8afSLinus Walleij * pinctrl_match_gpio_range() - check if a certain GPIO pin is in range
2952744e8afSLinus Walleij * @pctldev: pin controller device to check
2962744e8afSLinus Walleij * @gpio: gpio pin to check taken from the global GPIO pin space
2972744e8afSLinus Walleij *
2982744e8afSLinus Walleij * Tries to match a GPIO pin number to the ranges handled by a certain pin
2992744e8afSLinus Walleij * controller, return the range or NULL
3002744e8afSLinus Walleij */
3012744e8afSLinus Walleij static struct pinctrl_gpio_range *
pinctrl_match_gpio_range(struct pinctrl_dev * pctldev,unsigned gpio)3022744e8afSLinus Walleij pinctrl_match_gpio_range(struct pinctrl_dev *pctldev, unsigned gpio)
3032744e8afSLinus Walleij {
3046cadafb3SMasahiro Yamada struct pinctrl_gpio_range *range;
3052744e8afSLinus Walleij
30642fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
3072744e8afSLinus Walleij /* Loop over the ranges */
3082744e8afSLinus Walleij list_for_each_entry(range, &pctldev->gpio_ranges, node) {
3092744e8afSLinus Walleij /* Check if we're in the valid range */
3102744e8afSLinus Walleij if (gpio >= range->base &&
3112744e8afSLinus Walleij gpio < range->base + range->npins) {
31242fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
3132744e8afSLinus Walleij return range;
3142744e8afSLinus Walleij }
3152744e8afSLinus Walleij }
31642fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
3172744e8afSLinus Walleij return NULL;
3182744e8afSLinus Walleij }
3192744e8afSLinus Walleij
3202744e8afSLinus Walleij /**
32151e13c24SHaojian Zhuang * pinctrl_ready_for_gpio_range() - check if other GPIO pins of
32251e13c24SHaojian Zhuang * the same GPIO chip are in range
32351e13c24SHaojian Zhuang * @gpio: gpio pin to check taken from the global GPIO pin space
32451e13c24SHaojian Zhuang *
32551e13c24SHaojian Zhuang * This function is complement of pinctrl_match_gpio_range(). If the return
32651e13c24SHaojian Zhuang * value of pinctrl_match_gpio_range() is NULL, this function could be used
32751e13c24SHaojian Zhuang * to check whether pinctrl device is ready or not. Maybe some GPIO pins
32851e13c24SHaojian Zhuang * of the same GPIO chip don't have back-end pinctrl interface.
32951e13c24SHaojian Zhuang * If the return value is true, it means that pinctrl device is ready & the
33051e13c24SHaojian Zhuang * certain GPIO pin doesn't have back-end pinctrl device. If the return value
33151e13c24SHaojian Zhuang * is false, it means that pinctrl device may not be ready.
33251e13c24SHaojian Zhuang */
3332afe8229SHaojian Zhuang #ifdef CONFIG_GPIOLIB
pinctrl_ready_for_gpio_range(unsigned gpio)33451e13c24SHaojian Zhuang static bool pinctrl_ready_for_gpio_range(unsigned gpio)
33551e13c24SHaojian Zhuang {
33651e13c24SHaojian Zhuang struct pinctrl_dev *pctldev;
33751e13c24SHaojian Zhuang struct pinctrl_gpio_range *range = NULL;
338e3863fa1SLinus Walleij /*
339e3863fa1SLinus Walleij * FIXME: "gpio" here is a number in the global GPIO numberspace.
340e3863fa1SLinus Walleij * get rid of this from the ranges eventually and get the GPIO
341e3863fa1SLinus Walleij * descriptor from the gpio_chip.
342e3863fa1SLinus Walleij */
343e3863fa1SLinus Walleij struct gpio_chip *chip = gpiod_to_chip(gpio_to_desc(gpio));
34451e13c24SHaojian Zhuang
345942cde72STony Lindgren if (WARN(!chip, "no gpio_chip for gpio%i?", gpio))
346942cde72STony Lindgren return false;
347942cde72STony Lindgren
34844d5f7bbSLinus Walleij mutex_lock(&pinctrldev_list_mutex);
34944d5f7bbSLinus Walleij
35051e13c24SHaojian Zhuang /* Loop over the pin controllers */
35151e13c24SHaojian Zhuang list_for_each_entry(pctldev, &pinctrldev_list, node) {
35251e13c24SHaojian Zhuang /* Loop over the ranges */
3535ffbe2e6SAxel Lin mutex_lock(&pctldev->mutex);
35451e13c24SHaojian Zhuang list_for_each_entry(range, &pctldev->gpio_ranges, node) {
35551e13c24SHaojian Zhuang /* Check if any gpio range overlapped with gpio chip */
35651e13c24SHaojian Zhuang if (range->base + range->npins - 1 < chip->base ||
35751e13c24SHaojian Zhuang range->base > chip->base + chip->ngpio - 1)
35851e13c24SHaojian Zhuang continue;
3595ffbe2e6SAxel Lin mutex_unlock(&pctldev->mutex);
36044d5f7bbSLinus Walleij mutex_unlock(&pinctrldev_list_mutex);
36151e13c24SHaojian Zhuang return true;
36251e13c24SHaojian Zhuang }
3635ffbe2e6SAxel Lin mutex_unlock(&pctldev->mutex);
36451e13c24SHaojian Zhuang }
36544d5f7bbSLinus Walleij
36644d5f7bbSLinus Walleij mutex_unlock(&pinctrldev_list_mutex);
36744d5f7bbSLinus Walleij
36851e13c24SHaojian Zhuang return false;
36951e13c24SHaojian Zhuang }
3702afe8229SHaojian Zhuang #else
pinctrl_ready_for_gpio_range(unsigned gpio)3712afe8229SHaojian Zhuang static bool pinctrl_ready_for_gpio_range(unsigned gpio) { return true; }
3722afe8229SHaojian Zhuang #endif
37351e13c24SHaojian Zhuang
37451e13c24SHaojian Zhuang /**
3752744e8afSLinus Walleij * pinctrl_get_device_gpio_range() - find device for GPIO range
3762744e8afSLinus Walleij * @gpio: the pin to locate the pin controller for
3772744e8afSLinus Walleij * @outdev: the pin control device if found
3782744e8afSLinus Walleij * @outrange: the GPIO range if found
3792744e8afSLinus Walleij *
3802744e8afSLinus Walleij * Find the pin controller handling a certain GPIO pin from the pinspace of
3812744e8afSLinus Walleij * the GPIO subsystem, return the device and the matching GPIO range. Returns
3824650b7cbSDong Aisheng * -EPROBE_DEFER if the GPIO range could not be found in any device since it
3834650b7cbSDong Aisheng * may still have not been registered.
3842744e8afSLinus Walleij */
pinctrl_get_device_gpio_range(unsigned gpio,struct pinctrl_dev ** outdev,struct pinctrl_gpio_range ** outrange)3854ecce45dSStephen Warren static int pinctrl_get_device_gpio_range(unsigned gpio,
3862744e8afSLinus Walleij struct pinctrl_dev **outdev,
3872744e8afSLinus Walleij struct pinctrl_gpio_range **outrange)
3882744e8afSLinus Walleij {
3896cadafb3SMasahiro Yamada struct pinctrl_dev *pctldev;
3902744e8afSLinus Walleij
391f0059021SAxel Lin mutex_lock(&pinctrldev_list_mutex);
392f0059021SAxel Lin
3932744e8afSLinus Walleij /* Loop over the pin controllers */
3942744e8afSLinus Walleij list_for_each_entry(pctldev, &pinctrldev_list, node) {
3952744e8afSLinus Walleij struct pinctrl_gpio_range *range;
3962744e8afSLinus Walleij
3972744e8afSLinus Walleij range = pinctrl_match_gpio_range(pctldev, gpio);
398cea234e9SMarkus Elfring if (range) {
3992744e8afSLinus Walleij *outdev = pctldev;
4002744e8afSLinus Walleij *outrange = range;
401f0059021SAxel Lin mutex_unlock(&pinctrldev_list_mutex);
4022744e8afSLinus Walleij return 0;
4032744e8afSLinus Walleij }
4042744e8afSLinus Walleij }
4052744e8afSLinus Walleij
406f0059021SAxel Lin mutex_unlock(&pinctrldev_list_mutex);
407f0059021SAxel Lin
4084650b7cbSDong Aisheng return -EPROBE_DEFER;
4092744e8afSLinus Walleij }
4102744e8afSLinus Walleij
4112744e8afSLinus Walleij /**
4122744e8afSLinus Walleij * pinctrl_add_gpio_range() - register a GPIO range for a controller
4132744e8afSLinus Walleij * @pctldev: pin controller device to add the range to
4142744e8afSLinus Walleij * @range: the GPIO range to add
4152744e8afSLinus Walleij *
4162744e8afSLinus Walleij * This adds a range of GPIOs to be handled by a certain pin controller. Call
4172744e8afSLinus Walleij * this to register handled ranges after registering your pin controller.
4182744e8afSLinus Walleij */
pinctrl_add_gpio_range(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range)4192744e8afSLinus Walleij void pinctrl_add_gpio_range(struct pinctrl_dev *pctldev,
4202744e8afSLinus Walleij struct pinctrl_gpio_range *range)
4212744e8afSLinus Walleij {
42242fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
4238b9c139fSStephen Warren list_add_tail(&range->node, &pctldev->gpio_ranges);
42442fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
4252744e8afSLinus Walleij }
4264ecce45dSStephen Warren EXPORT_SYMBOL_GPL(pinctrl_add_gpio_range);
4272744e8afSLinus Walleij
pinctrl_add_gpio_ranges(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * ranges,unsigned nranges)4283e5e00b6SDong Aisheng void pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev,
4293e5e00b6SDong Aisheng struct pinctrl_gpio_range *ranges,
4303e5e00b6SDong Aisheng unsigned nranges)
4313e5e00b6SDong Aisheng {
4323e5e00b6SDong Aisheng int i;
4333e5e00b6SDong Aisheng
4343e5e00b6SDong Aisheng for (i = 0; i < nranges; i++)
4353e5e00b6SDong Aisheng pinctrl_add_gpio_range(pctldev, &ranges[i]);
4363e5e00b6SDong Aisheng }
4373e5e00b6SDong Aisheng EXPORT_SYMBOL_GPL(pinctrl_add_gpio_ranges);
4383e5e00b6SDong Aisheng
pinctrl_find_and_add_gpio_range(const char * devname,struct pinctrl_gpio_range * range)439192c369cSLinus Walleij struct pinctrl_dev *pinctrl_find_and_add_gpio_range(const char *devname,
440f23f1516SShiraz Hashim struct pinctrl_gpio_range *range)
441f23f1516SShiraz Hashim {
44242fed7baSPatrice Chotard struct pinctrl_dev *pctldev;
44342fed7baSPatrice Chotard
44442fed7baSPatrice Chotard pctldev = get_pinctrl_dev_from_devname(devname);
445f23f1516SShiraz Hashim
446dfa97515SLinus Walleij /*
447dfa97515SLinus Walleij * If we can't find this device, let's assume that is because
448dfa97515SLinus Walleij * it has not probed yet, so the driver trying to register this
449dfa97515SLinus Walleij * range need to defer probing.
450dfa97515SLinus Walleij */
45142fed7baSPatrice Chotard if (!pctldev) {
452dfa97515SLinus Walleij return ERR_PTR(-EPROBE_DEFER);
45342fed7baSPatrice Chotard }
454f23f1516SShiraz Hashim pinctrl_add_gpio_range(pctldev, range);
45542fed7baSPatrice Chotard
456f23f1516SShiraz Hashim return pctldev;
457f23f1516SShiraz Hashim }
458192c369cSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_find_and_add_gpio_range);
459f23f1516SShiraz Hashim
pinctrl_get_group_pins(struct pinctrl_dev * pctldev,const char * pin_group,const unsigned ** pins,unsigned * num_pins)460586a87e6SChristian Ruppert int pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group,
461586a87e6SChristian Ruppert const unsigned **pins, unsigned *num_pins)
462586a87e6SChristian Ruppert {
463586a87e6SChristian Ruppert const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
464586a87e6SChristian Ruppert int gs;
465586a87e6SChristian Ruppert
466e5b3b2d9SAntoine Ténart if (!pctlops->get_group_pins)
467e5b3b2d9SAntoine Ténart return -EINVAL;
468e5b3b2d9SAntoine Ténart
469586a87e6SChristian Ruppert gs = pinctrl_get_group_selector(pctldev, pin_group);
470586a87e6SChristian Ruppert if (gs < 0)
471586a87e6SChristian Ruppert return gs;
472586a87e6SChristian Ruppert
473586a87e6SChristian Ruppert return pctlops->get_group_pins(pctldev, gs, pins, num_pins);
474586a87e6SChristian Ruppert }
475586a87e6SChristian Ruppert EXPORT_SYMBOL_GPL(pinctrl_get_group_pins);
476586a87e6SChristian Ruppert
477b18537cdSJoachim Eastwood struct pinctrl_gpio_range *
pinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev * pctldev,unsigned int pin)478b18537cdSJoachim Eastwood pinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev *pctldev,
479b18537cdSJoachim Eastwood unsigned int pin)
480b18537cdSJoachim Eastwood {
481b18537cdSJoachim Eastwood struct pinctrl_gpio_range *range;
482b18537cdSJoachim Eastwood
483b18537cdSJoachim Eastwood /* Loop over the ranges */
484b18537cdSJoachim Eastwood list_for_each_entry(range, &pctldev->gpio_ranges, node) {
485b18537cdSJoachim Eastwood /* Check if we're in the valid range */
486b18537cdSJoachim Eastwood if (range->pins) {
487b18537cdSJoachim Eastwood int a;
488b18537cdSJoachim Eastwood for (a = 0; a < range->npins; a++) {
489b18537cdSJoachim Eastwood if (range->pins[a] == pin)
490b18537cdSJoachim Eastwood return range;
491b18537cdSJoachim Eastwood }
492b18537cdSJoachim Eastwood } else if (pin >= range->pin_base &&
493b18537cdSJoachim Eastwood pin < range->pin_base + range->npins)
494b18537cdSJoachim Eastwood return range;
495b18537cdSJoachim Eastwood }
496b18537cdSJoachim Eastwood
497b18537cdSJoachim Eastwood return NULL;
498b18537cdSJoachim Eastwood }
499b18537cdSJoachim Eastwood EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin_nolock);
500b18537cdSJoachim Eastwood
5012744e8afSLinus Walleij /**
5029afbefb2SLinus Walleij * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin
5039afbefb2SLinus Walleij * @pctldev: the pin controller device to look in
5049afbefb2SLinus Walleij * @pin: a controller-local number to find the range for
5059afbefb2SLinus Walleij */
5069afbefb2SLinus Walleij struct pinctrl_gpio_range *
pinctrl_find_gpio_range_from_pin(struct pinctrl_dev * pctldev,unsigned int pin)5079afbefb2SLinus Walleij pinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev,
5089afbefb2SLinus Walleij unsigned int pin)
5099afbefb2SLinus Walleij {
510c8f50e86SWei Yongjun struct pinctrl_gpio_range *range;
5119afbefb2SLinus Walleij
51242fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
513b18537cdSJoachim Eastwood range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin);
51442fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
515b18537cdSJoachim Eastwood
5169afbefb2SLinus Walleij return range;
5179afbefb2SLinus Walleij }
5189afbefb2SLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin);
5199afbefb2SLinus Walleij
5209afbefb2SLinus Walleij /**
52150842cbdSCharles Keepax * pinctrl_remove_gpio_range() - remove a range of GPIOs from a pin controller
5227e10ee68SViresh Kumar * @pctldev: pin controller device to remove the range from
5237e10ee68SViresh Kumar * @range: the GPIO range to remove
5247e10ee68SViresh Kumar */
pinctrl_remove_gpio_range(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range)5257e10ee68SViresh Kumar void pinctrl_remove_gpio_range(struct pinctrl_dev *pctldev,
5267e10ee68SViresh Kumar struct pinctrl_gpio_range *range)
5277e10ee68SViresh Kumar {
52842fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
5297e10ee68SViresh Kumar list_del(&range->node);
53042fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
5317e10ee68SViresh Kumar }
5327e10ee68SViresh Kumar EXPORT_SYMBOL_GPL(pinctrl_remove_gpio_range);
5337e10ee68SViresh Kumar
534c033a718SLinus Walleij #ifdef CONFIG_GENERIC_PINCTRL_GROUPS
535c7059c5aSTony Lindgren
536c7059c5aSTony Lindgren /**
537c7059c5aSTony Lindgren * pinctrl_generic_get_group_count() - returns the number of pin groups
538c7059c5aSTony Lindgren * @pctldev: pin controller device
539c7059c5aSTony Lindgren */
pinctrl_generic_get_group_count(struct pinctrl_dev * pctldev)540c7059c5aSTony Lindgren int pinctrl_generic_get_group_count(struct pinctrl_dev *pctldev)
541c7059c5aSTony Lindgren {
542c7059c5aSTony Lindgren return pctldev->num_groups;
543c7059c5aSTony Lindgren }
544c7059c5aSTony Lindgren EXPORT_SYMBOL_GPL(pinctrl_generic_get_group_count);
545c7059c5aSTony Lindgren
546c7059c5aSTony Lindgren /**
547c7059c5aSTony Lindgren * pinctrl_generic_get_group_name() - returns the name of a pin group
548c7059c5aSTony Lindgren * @pctldev: pin controller device
549c7059c5aSTony Lindgren * @selector: group number
550c7059c5aSTony Lindgren */
pinctrl_generic_get_group_name(struct pinctrl_dev * pctldev,unsigned int selector)551c7059c5aSTony Lindgren const char *pinctrl_generic_get_group_name(struct pinctrl_dev *pctldev,
552c7059c5aSTony Lindgren unsigned int selector)
553c7059c5aSTony Lindgren {
554c7059c5aSTony Lindgren struct group_desc *group;
555c7059c5aSTony Lindgren
556c7059c5aSTony Lindgren group = radix_tree_lookup(&pctldev->pin_group_tree,
557c7059c5aSTony Lindgren selector);
558c7059c5aSTony Lindgren if (!group)
559c7059c5aSTony Lindgren return NULL;
560c7059c5aSTony Lindgren
561c7059c5aSTony Lindgren return group->name;
562c7059c5aSTony Lindgren }
563c7059c5aSTony Lindgren EXPORT_SYMBOL_GPL(pinctrl_generic_get_group_name);
564c7059c5aSTony Lindgren
565c7059c5aSTony Lindgren /**
566c7059c5aSTony Lindgren * pinctrl_generic_get_group_pins() - gets the pin group pins
567c7059c5aSTony Lindgren * @pctldev: pin controller device
568c7059c5aSTony Lindgren * @selector: group number
569c7059c5aSTony Lindgren * @pins: pins in the group
570c7059c5aSTony Lindgren * @num_pins: number of pins in the group
571c7059c5aSTony Lindgren */
pinctrl_generic_get_group_pins(struct pinctrl_dev * pctldev,unsigned int selector,const unsigned int ** pins,unsigned int * num_pins)572c7059c5aSTony Lindgren int pinctrl_generic_get_group_pins(struct pinctrl_dev *pctldev,
573c7059c5aSTony Lindgren unsigned int selector,
574c7059c5aSTony Lindgren const unsigned int **pins,
575c7059c5aSTony Lindgren unsigned int *num_pins)
576c7059c5aSTony Lindgren {
577c7059c5aSTony Lindgren struct group_desc *group;
578c7059c5aSTony Lindgren
579c7059c5aSTony Lindgren group = radix_tree_lookup(&pctldev->pin_group_tree,
580c7059c5aSTony Lindgren selector);
581c7059c5aSTony Lindgren if (!group) {
582c7059c5aSTony Lindgren dev_err(pctldev->dev, "%s could not find pingroup%i\n",
583c7059c5aSTony Lindgren __func__, selector);
584c7059c5aSTony Lindgren return -EINVAL;
585c7059c5aSTony Lindgren }
586c7059c5aSTony Lindgren
587c7059c5aSTony Lindgren *pins = group->pins;
588c7059c5aSTony Lindgren *num_pins = group->num_pins;
589c7059c5aSTony Lindgren
590c7059c5aSTony Lindgren return 0;
591c7059c5aSTony Lindgren }
592c7059c5aSTony Lindgren EXPORT_SYMBOL_GPL(pinctrl_generic_get_group_pins);
593c7059c5aSTony Lindgren
594c7059c5aSTony Lindgren /**
595c7059c5aSTony Lindgren * pinctrl_generic_get_group() - returns a pin group based on the number
596c7059c5aSTony Lindgren * @pctldev: pin controller device
5979c340bbbSLee Jones * @selector: group number
598c7059c5aSTony Lindgren */
pinctrl_generic_get_group(struct pinctrl_dev * pctldev,unsigned int selector)599c7059c5aSTony Lindgren struct group_desc *pinctrl_generic_get_group(struct pinctrl_dev *pctldev,
600c7059c5aSTony Lindgren unsigned int selector)
601c7059c5aSTony Lindgren {
602c7059c5aSTony Lindgren struct group_desc *group;
603c7059c5aSTony Lindgren
604c7059c5aSTony Lindgren group = radix_tree_lookup(&pctldev->pin_group_tree,
605c7059c5aSTony Lindgren selector);
606c7059c5aSTony Lindgren if (!group)
607c7059c5aSTony Lindgren return NULL;
608c7059c5aSTony Lindgren
609c7059c5aSTony Lindgren return group;
610c7059c5aSTony Lindgren }
611c7059c5aSTony Lindgren EXPORT_SYMBOL_GPL(pinctrl_generic_get_group);
612c7059c5aSTony Lindgren
pinctrl_generic_group_name_to_selector(struct pinctrl_dev * pctldev,const char * function)613a203728aSTony Lindgren static int pinctrl_generic_group_name_to_selector(struct pinctrl_dev *pctldev,
614a203728aSTony Lindgren const char *function)
615a203728aSTony Lindgren {
616a203728aSTony Lindgren const struct pinctrl_ops *ops = pctldev->desc->pctlops;
617a203728aSTony Lindgren int ngroups = ops->get_groups_count(pctldev);
618a203728aSTony Lindgren int selector = 0;
619a203728aSTony Lindgren
620a203728aSTony Lindgren /* See if this pctldev has this group */
621a203728aSTony Lindgren while (selector < ngroups) {
622a203728aSTony Lindgren const char *gname = ops->get_group_name(pctldev, selector);
623a203728aSTony Lindgren
62454a58185SYanjiang Jin if (gname && !strcmp(function, gname))
625a203728aSTony Lindgren return selector;
626a203728aSTony Lindgren
627a203728aSTony Lindgren selector++;
628a203728aSTony Lindgren }
629a203728aSTony Lindgren
630a203728aSTony Lindgren return -EINVAL;
631a203728aSTony Lindgren }
632a203728aSTony Lindgren
633c7059c5aSTony Lindgren /**
634c7059c5aSTony Lindgren * pinctrl_generic_add_group() - adds a new pin group
635c7059c5aSTony Lindgren * @pctldev: pin controller device
636c7059c5aSTony Lindgren * @name: name of the pin group
637c7059c5aSTony Lindgren * @pins: pins in the pin group
638c7059c5aSTony Lindgren * @num_pins: number of pins in the pin group
639c7059c5aSTony Lindgren * @data: pin controller driver specific data
640c7059c5aSTony Lindgren *
641c7059c5aSTony Lindgren * Note that the caller must take care of locking.
642c7059c5aSTony Lindgren */
pinctrl_generic_add_group(struct pinctrl_dev * pctldev,const char * name,int * pins,int num_pins,void * data)643c7059c5aSTony Lindgren int pinctrl_generic_add_group(struct pinctrl_dev *pctldev, const char *name,
644c7059c5aSTony Lindgren int *pins, int num_pins, void *data)
645c7059c5aSTony Lindgren {
646c7059c5aSTony Lindgren struct group_desc *group;
647b56e23bfSSergey Shtylyov int selector, error;
648a203728aSTony Lindgren
649a203728aSTony Lindgren if (!name)
650a203728aSTony Lindgren return -EINVAL;
651a203728aSTony Lindgren
652a203728aSTony Lindgren selector = pinctrl_generic_group_name_to_selector(pctldev, name);
653a203728aSTony Lindgren if (selector >= 0)
654a203728aSTony Lindgren return selector;
655a203728aSTony Lindgren
656a203728aSTony Lindgren selector = pctldev->num_groups;
657c7059c5aSTony Lindgren
658c7059c5aSTony Lindgren group = devm_kzalloc(pctldev->dev, sizeof(*group), GFP_KERNEL);
659c7059c5aSTony Lindgren if (!group)
660c7059c5aSTony Lindgren return -ENOMEM;
661c7059c5aSTony Lindgren
662c7059c5aSTony Lindgren group->name = name;
663c7059c5aSTony Lindgren group->pins = pins;
664c7059c5aSTony Lindgren group->num_pins = num_pins;
665c7059c5aSTony Lindgren group->data = data;
666c7059c5aSTony Lindgren
667b56e23bfSSergey Shtylyov error = radix_tree_insert(&pctldev->pin_group_tree, selector, group);
668b56e23bfSSergey Shtylyov if (error)
669b56e23bfSSergey Shtylyov return error;
670c7059c5aSTony Lindgren
671c7059c5aSTony Lindgren pctldev->num_groups++;
672c7059c5aSTony Lindgren
673a203728aSTony Lindgren return selector;
674c7059c5aSTony Lindgren }
675c7059c5aSTony Lindgren EXPORT_SYMBOL_GPL(pinctrl_generic_add_group);
676c7059c5aSTony Lindgren
677c7059c5aSTony Lindgren /**
678c7059c5aSTony Lindgren * pinctrl_generic_remove_group() - removes a numbered pin group
679c7059c5aSTony Lindgren * @pctldev: pin controller device
680c7059c5aSTony Lindgren * @selector: group number
681c7059c5aSTony Lindgren *
682c7059c5aSTony Lindgren * Note that the caller must take care of locking.
683c7059c5aSTony Lindgren */
pinctrl_generic_remove_group(struct pinctrl_dev * pctldev,unsigned int selector)684c7059c5aSTony Lindgren int pinctrl_generic_remove_group(struct pinctrl_dev *pctldev,
685c7059c5aSTony Lindgren unsigned int selector)
686c7059c5aSTony Lindgren {
687c7059c5aSTony Lindgren struct group_desc *group;
688c7059c5aSTony Lindgren
689c7059c5aSTony Lindgren group = radix_tree_lookup(&pctldev->pin_group_tree,
690c7059c5aSTony Lindgren selector);
691c7059c5aSTony Lindgren if (!group)
692c7059c5aSTony Lindgren return -ENOENT;
693c7059c5aSTony Lindgren
694c7059c5aSTony Lindgren radix_tree_delete(&pctldev->pin_group_tree, selector);
695c7059c5aSTony Lindgren devm_kfree(pctldev->dev, group);
696c7059c5aSTony Lindgren
697c7059c5aSTony Lindgren pctldev->num_groups--;
698c7059c5aSTony Lindgren
699c7059c5aSTony Lindgren return 0;
700c7059c5aSTony Lindgren }
701c7059c5aSTony Lindgren EXPORT_SYMBOL_GPL(pinctrl_generic_remove_group);
702c7059c5aSTony Lindgren
703c7059c5aSTony Lindgren /**
704c7059c5aSTony Lindgren * pinctrl_generic_free_groups() - removes all pin groups
705c7059c5aSTony Lindgren * @pctldev: pin controller device
706c7059c5aSTony Lindgren *
707664b7c47STony Lindgren * Note that the caller must take care of locking. The pinctrl groups
708664b7c47STony Lindgren * are allocated with devm_kzalloc() so no need to free them here.
709c7059c5aSTony Lindgren */
pinctrl_generic_free_groups(struct pinctrl_dev * pctldev)710c7059c5aSTony Lindgren static void pinctrl_generic_free_groups(struct pinctrl_dev *pctldev)
711c7059c5aSTony Lindgren {
712c7059c5aSTony Lindgren struct radix_tree_iter iter;
713906a2a39SMasahiro Yamada void __rcu **slot;
714c7059c5aSTony Lindgren
715c7059c5aSTony Lindgren radix_tree_for_each_slot(slot, &pctldev->pin_group_tree, &iter, 0)
716664b7c47STony Lindgren radix_tree_delete(&pctldev->pin_group_tree, iter.index);
717c7059c5aSTony Lindgren
718c7059c5aSTony Lindgren pctldev->num_groups = 0;
719c7059c5aSTony Lindgren }
720c7059c5aSTony Lindgren
721c7059c5aSTony Lindgren #else
pinctrl_generic_free_groups(struct pinctrl_dev * pctldev)722c7059c5aSTony Lindgren static inline void pinctrl_generic_free_groups(struct pinctrl_dev *pctldev)
723c7059c5aSTony Lindgren {
724c7059c5aSTony Lindgren }
725c033a718SLinus Walleij #endif /* CONFIG_GENERIC_PINCTRL_GROUPS */
726c7059c5aSTony Lindgren
7277e10ee68SViresh Kumar /**
7287afde8baSLinus Walleij * pinctrl_get_group_selector() - returns the group selector for a group
7297afde8baSLinus Walleij * @pctldev: the pin controller handling the group
7307afde8baSLinus Walleij * @pin_group: the pin group to look up
7317afde8baSLinus Walleij */
pinctrl_get_group_selector(struct pinctrl_dev * pctldev,const char * pin_group)7327afde8baSLinus Walleij int pinctrl_get_group_selector(struct pinctrl_dev *pctldev,
7337afde8baSLinus Walleij const char *pin_group)
7347afde8baSLinus Walleij {
7357afde8baSLinus Walleij const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
736d1e90e9eSViresh Kumar unsigned ngroups = pctlops->get_groups_count(pctldev);
7377afde8baSLinus Walleij unsigned group_selector = 0;
7387afde8baSLinus Walleij
739d1e90e9eSViresh Kumar while (group_selector < ngroups) {
7407afde8baSLinus Walleij const char *gname = pctlops->get_group_name(pctldev,
7417afde8baSLinus Walleij group_selector);
74254a58185SYanjiang Jin if (gname && !strcmp(gname, pin_group)) {
74351cd24eeSStephen Warren dev_dbg(pctldev->dev,
7447afde8baSLinus Walleij "found group selector %u for %s\n",
7457afde8baSLinus Walleij group_selector,
7467afde8baSLinus Walleij pin_group);
7477afde8baSLinus Walleij return group_selector;
7487afde8baSLinus Walleij }
7497afde8baSLinus Walleij
7507afde8baSLinus Walleij group_selector++;
7517afde8baSLinus Walleij }
7527afde8baSLinus Walleij
75351cd24eeSStephen Warren dev_err(pctldev->dev, "does not have pin group %s\n",
7547afde8baSLinus Walleij pin_group);
7557afde8baSLinus Walleij
7567afde8baSLinus Walleij return -EINVAL;
7577afde8baSLinus Walleij }
7587afde8baSLinus Walleij
pinctrl_gpio_can_use_line(unsigned gpio)759472a61e7SStefan Wahren bool pinctrl_gpio_can_use_line(unsigned gpio)
760472a61e7SStefan Wahren {
761472a61e7SStefan Wahren struct pinctrl_dev *pctldev;
762472a61e7SStefan Wahren struct pinctrl_gpio_range *range;
763472a61e7SStefan Wahren bool result;
764472a61e7SStefan Wahren int pin;
765472a61e7SStefan Wahren
766472a61e7SStefan Wahren /*
767472a61e7SStefan Wahren * Try to obtain GPIO range, if it fails
768472a61e7SStefan Wahren * we're probably dealing with GPIO driver
769472a61e7SStefan Wahren * without a backing pin controller - bail out.
770472a61e7SStefan Wahren */
771472a61e7SStefan Wahren if (pinctrl_get_device_gpio_range(gpio, &pctldev, &range))
772472a61e7SStefan Wahren return true;
773472a61e7SStefan Wahren
774472a61e7SStefan Wahren mutex_lock(&pctldev->mutex);
775472a61e7SStefan Wahren
776472a61e7SStefan Wahren /* Convert to the pin controllers number space */
777472a61e7SStefan Wahren pin = gpio_to_pin(range, gpio);
778472a61e7SStefan Wahren
779472a61e7SStefan Wahren result = pinmux_can_be_used_for_gpio(pctldev, pin);
780472a61e7SStefan Wahren
781472a61e7SStefan Wahren mutex_unlock(&pctldev->mutex);
782472a61e7SStefan Wahren
783472a61e7SStefan Wahren return result;
784472a61e7SStefan Wahren }
785472a61e7SStefan Wahren EXPORT_SYMBOL_GPL(pinctrl_gpio_can_use_line);
786472a61e7SStefan Wahren
787befe5bdfSLinus Walleij /**
788a9a1d2a7SLinus Walleij * pinctrl_gpio_request() - request a single pin to be used as GPIO
789befe5bdfSLinus Walleij * @gpio: the GPIO pin number from the GPIO subsystem number space
790befe5bdfSLinus Walleij *
791befe5bdfSLinus Walleij * This function should *ONLY* be used from gpiolib-based GPIO drivers,
792befe5bdfSLinus Walleij * as part of their gpio_request() semantics, platforms and individual drivers
793befe5bdfSLinus Walleij * shall *NOT* request GPIO pins to be muxed in.
794befe5bdfSLinus Walleij */
pinctrl_gpio_request(unsigned gpio)795a9a1d2a7SLinus Walleij int pinctrl_gpio_request(unsigned gpio)
796befe5bdfSLinus Walleij {
797befe5bdfSLinus Walleij struct pinctrl_dev *pctldev;
798befe5bdfSLinus Walleij struct pinctrl_gpio_range *range;
799befe5bdfSLinus Walleij int ret;
800befe5bdfSLinus Walleij int pin;
801befe5bdfSLinus Walleij
802befe5bdfSLinus Walleij ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
80357b676f9SStephen Warren if (ret) {
80451e13c24SHaojian Zhuang if (pinctrl_ready_for_gpio_range(gpio))
80551e13c24SHaojian Zhuang ret = 0;
8064650b7cbSDong Aisheng return ret;
80757b676f9SStephen Warren }
808befe5bdfSLinus Walleij
8099b77ace4SAxel Lin mutex_lock(&pctldev->mutex);
8109b77ace4SAxel Lin
811befe5bdfSLinus Walleij /* Convert to the pin controllers number space */
812c8587eeeSChristian Ruppert pin = gpio_to_pin(range, gpio);
813befe5bdfSLinus Walleij
81457b676f9SStephen Warren ret = pinmux_request_gpio(pctldev, range, pin, gpio);
81557b676f9SStephen Warren
8169b77ace4SAxel Lin mutex_unlock(&pctldev->mutex);
8179b77ace4SAxel Lin
81857b676f9SStephen Warren return ret;
819befe5bdfSLinus Walleij }
820a9a1d2a7SLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_gpio_request);
821befe5bdfSLinus Walleij
822befe5bdfSLinus Walleij /**
823a9a1d2a7SLinus Walleij * pinctrl_gpio_free() - free control on a single pin, currently used as GPIO
824befe5bdfSLinus Walleij * @gpio: the GPIO pin number from the GPIO subsystem number space
825befe5bdfSLinus Walleij *
826befe5bdfSLinus Walleij * This function should *ONLY* be used from gpiolib-based GPIO drivers,
827befe5bdfSLinus Walleij * as part of their gpio_free() semantics, platforms and individual drivers
828befe5bdfSLinus Walleij * shall *NOT* request GPIO pins to be muxed out.
829befe5bdfSLinus Walleij */
pinctrl_gpio_free(unsigned gpio)830a9a1d2a7SLinus Walleij void pinctrl_gpio_free(unsigned gpio)
831befe5bdfSLinus Walleij {
832befe5bdfSLinus Walleij struct pinctrl_dev *pctldev;
833befe5bdfSLinus Walleij struct pinctrl_gpio_range *range;
834befe5bdfSLinus Walleij int ret;
835befe5bdfSLinus Walleij int pin;
836befe5bdfSLinus Walleij
837befe5bdfSLinus Walleij ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
83857b676f9SStephen Warren if (ret) {
839befe5bdfSLinus Walleij return;
84057b676f9SStephen Warren }
84142fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
842befe5bdfSLinus Walleij
843befe5bdfSLinus Walleij /* Convert to the pin controllers number space */
844c8587eeeSChristian Ruppert pin = gpio_to_pin(range, gpio);
845befe5bdfSLinus Walleij
84657b676f9SStephen Warren pinmux_free_gpio(pctldev, pin, range);
84757b676f9SStephen Warren
84842fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
849befe5bdfSLinus Walleij }
850a9a1d2a7SLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_gpio_free);
851befe5bdfSLinus Walleij
pinctrl_gpio_direction(unsigned gpio,bool input)852befe5bdfSLinus Walleij static int pinctrl_gpio_direction(unsigned gpio, bool input)
853befe5bdfSLinus Walleij {
854befe5bdfSLinus Walleij struct pinctrl_dev *pctldev;
855befe5bdfSLinus Walleij struct pinctrl_gpio_range *range;
856befe5bdfSLinus Walleij int ret;
857befe5bdfSLinus Walleij int pin;
858befe5bdfSLinus Walleij
859befe5bdfSLinus Walleij ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
86042fed7baSPatrice Chotard if (ret) {
861befe5bdfSLinus Walleij return ret;
86242fed7baSPatrice Chotard }
86342fed7baSPatrice Chotard
86442fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
865befe5bdfSLinus Walleij
866befe5bdfSLinus Walleij /* Convert to the pin controllers number space */
867c8587eeeSChristian Ruppert pin = gpio_to_pin(range, gpio);
86842fed7baSPatrice Chotard ret = pinmux_gpio_direction(pctldev, range, pin, input);
869befe5bdfSLinus Walleij
87042fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
87142fed7baSPatrice Chotard
87242fed7baSPatrice Chotard return ret;
873befe5bdfSLinus Walleij }
874befe5bdfSLinus Walleij
875befe5bdfSLinus Walleij /**
876befe5bdfSLinus Walleij * pinctrl_gpio_direction_input() - request a GPIO pin to go into input mode
877befe5bdfSLinus Walleij * @gpio: the GPIO pin number from the GPIO subsystem number space
878befe5bdfSLinus Walleij *
879befe5bdfSLinus Walleij * This function should *ONLY* be used from gpiolib-based GPIO drivers,
880befe5bdfSLinus Walleij * as part of their gpio_direction_input() semantics, platforms and individual
881befe5bdfSLinus Walleij * drivers shall *NOT* touch pin control GPIO calls.
882befe5bdfSLinus Walleij */
pinctrl_gpio_direction_input(unsigned gpio)883befe5bdfSLinus Walleij int pinctrl_gpio_direction_input(unsigned gpio)
884befe5bdfSLinus Walleij {
88542fed7baSPatrice Chotard return pinctrl_gpio_direction(gpio, true);
886befe5bdfSLinus Walleij }
887befe5bdfSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_gpio_direction_input);
888befe5bdfSLinus Walleij
889befe5bdfSLinus Walleij /**
890befe5bdfSLinus Walleij * pinctrl_gpio_direction_output() - request a GPIO pin to go into output mode
891befe5bdfSLinus Walleij * @gpio: the GPIO pin number from the GPIO subsystem number space
892befe5bdfSLinus Walleij *
893befe5bdfSLinus Walleij * This function should *ONLY* be used from gpiolib-based GPIO drivers,
894befe5bdfSLinus Walleij * as part of their gpio_direction_output() semantics, platforms and individual
895befe5bdfSLinus Walleij * drivers shall *NOT* touch pin control GPIO calls.
896befe5bdfSLinus Walleij */
pinctrl_gpio_direction_output(unsigned gpio)897befe5bdfSLinus Walleij int pinctrl_gpio_direction_output(unsigned gpio)
898befe5bdfSLinus Walleij {
89942fed7baSPatrice Chotard return pinctrl_gpio_direction(gpio, false);
900befe5bdfSLinus Walleij }
901befe5bdfSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_gpio_direction_output);
902befe5bdfSLinus Walleij
90315381bc7SMika Westerberg /**
90415381bc7SMika Westerberg * pinctrl_gpio_set_config() - Apply config to given GPIO pin
90515381bc7SMika Westerberg * @gpio: the GPIO pin number from the GPIO subsystem number space
90615381bc7SMika Westerberg * @config: the configuration to apply to the GPIO
90715381bc7SMika Westerberg *
90815381bc7SMika Westerberg * This function should *ONLY* be used from gpiolib-based GPIO drivers, if
90915381bc7SMika Westerberg * they need to call the underlying pin controller to change GPIO config
91015381bc7SMika Westerberg * (for example set debounce time).
91115381bc7SMika Westerberg */
pinctrl_gpio_set_config(unsigned gpio,unsigned long config)91215381bc7SMika Westerberg int pinctrl_gpio_set_config(unsigned gpio, unsigned long config)
91315381bc7SMika Westerberg {
91415381bc7SMika Westerberg unsigned long configs[] = { config };
91515381bc7SMika Westerberg struct pinctrl_gpio_range *range;
91615381bc7SMika Westerberg struct pinctrl_dev *pctldev;
91715381bc7SMika Westerberg int ret, pin;
91815381bc7SMika Westerberg
91915381bc7SMika Westerberg ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
92015381bc7SMika Westerberg if (ret)
92115381bc7SMika Westerberg return ret;
92215381bc7SMika Westerberg
92315381bc7SMika Westerberg mutex_lock(&pctldev->mutex);
92415381bc7SMika Westerberg pin = gpio_to_pin(range, gpio);
92515381bc7SMika Westerberg ret = pinconf_set_config(pctldev, pin, configs, ARRAY_SIZE(configs));
92615381bc7SMika Westerberg mutex_unlock(&pctldev->mutex);
92715381bc7SMika Westerberg
92815381bc7SMika Westerberg return ret;
92915381bc7SMika Westerberg }
93015381bc7SMika Westerberg EXPORT_SYMBOL_GPL(pinctrl_gpio_set_config);
93115381bc7SMika Westerberg
find_state(struct pinctrl * p,const char * name)9326e5e959dSStephen Warren static struct pinctrl_state *find_state(struct pinctrl *p,
9336e5e959dSStephen Warren const char *name)
934befe5bdfSLinus Walleij {
9356e5e959dSStephen Warren struct pinctrl_state *state;
9366e5e959dSStephen Warren
9376e5e959dSStephen Warren list_for_each_entry(state, &p->states, node)
9386e5e959dSStephen Warren if (!strcmp(state->name, name))
9396e5e959dSStephen Warren return state;
9406e5e959dSStephen Warren
9416e5e959dSStephen Warren return NULL;
9426e5e959dSStephen Warren }
9436e5e959dSStephen Warren
create_state(struct pinctrl * p,const char * name)9446e5e959dSStephen Warren static struct pinctrl_state *create_state(struct pinctrl *p,
9456e5e959dSStephen Warren const char *name)
9466e5e959dSStephen Warren {
9476e5e959dSStephen Warren struct pinctrl_state *state;
9486e5e959dSStephen Warren
9496e5e959dSStephen Warren state = kzalloc(sizeof(*state), GFP_KERNEL);
9502104d12dSBjorn Andersson if (!state)
9516e5e959dSStephen Warren return ERR_PTR(-ENOMEM);
9526e5e959dSStephen Warren
9536e5e959dSStephen Warren state->name = name;
9546e5e959dSStephen Warren INIT_LIST_HEAD(&state->settings);
9556e5e959dSStephen Warren
9566e5e959dSStephen Warren list_add_tail(&state->node, &p->states);
9576e5e959dSStephen Warren
9586e5e959dSStephen Warren return state;
9596e5e959dSStephen Warren }
9606e5e959dSStephen Warren
add_setting(struct pinctrl * p,struct pinctrl_dev * pctldev,const struct pinctrl_map * map)96199e4f675STony Lindgren static int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev,
9623f713b7cSMasahiro Yamada const struct pinctrl_map *map)
9636e5e959dSStephen Warren {
9646e5e959dSStephen Warren struct pinctrl_state *state;
9656e5e959dSStephen Warren struct pinctrl_setting *setting;
9667ecdb16fSStephen Warren int ret;
9676e5e959dSStephen Warren
9686e5e959dSStephen Warren state = find_state(p, map->name);
9696e5e959dSStephen Warren if (!state)
9706e5e959dSStephen Warren state = create_state(p, map->name);
9716e5e959dSStephen Warren if (IS_ERR(state))
9726e5e959dSStephen Warren return PTR_ERR(state);
9736e5e959dSStephen Warren
9741e2082b5SStephen Warren if (map->type == PIN_MAP_TYPE_DUMMY_STATE)
9751e2082b5SStephen Warren return 0;
9761e2082b5SStephen Warren
9776e5e959dSStephen Warren setting = kzalloc(sizeof(*setting), GFP_KERNEL);
9782104d12dSBjorn Andersson if (!setting)
9796e5e959dSStephen Warren return -ENOMEM;
9806e5e959dSStephen Warren
9811e2082b5SStephen Warren setting->type = map->type;
9821e2082b5SStephen Warren
98399e4f675STony Lindgren if (pctldev)
98499e4f675STony Lindgren setting->pctldev = pctldev;
98599e4f675STony Lindgren else
98699e4f675STony Lindgren setting->pctldev =
98799e4f675STony Lindgren get_pinctrl_dev_from_devname(map->ctrl_dev_name);
988cea234e9SMarkus Elfring if (!setting->pctldev) {
9896e5e959dSStephen Warren kfree(setting);
99089216494SLinus Walleij /* Do not defer probing of hogs (circular loop) */
99189216494SLinus Walleij if (!strcmp(map->ctrl_dev_name, map->dev_name))
99289216494SLinus Walleij return -ENODEV;
993c05127c4SLinus Walleij /*
994c05127c4SLinus Walleij * OK let us guess that the driver is not there yet, and
995c05127c4SLinus Walleij * let's defer obtaining this pinctrl handle to later...
996c05127c4SLinus Walleij */
99789216494SLinus Walleij dev_info(p->dev, "unknown pinctrl device %s in map entry, deferring probe",
99889216494SLinus Walleij map->ctrl_dev_name);
999c05127c4SLinus Walleij return -EPROBE_DEFER;
10006e5e959dSStephen Warren }
10016e5e959dSStephen Warren
10021a78958dSLinus Walleij setting->dev_name = map->dev_name;
10031a78958dSLinus Walleij
10041e2082b5SStephen Warren switch (map->type) {
10051e2082b5SStephen Warren case PIN_MAP_TYPE_MUX_GROUP:
10066e5e959dSStephen Warren ret = pinmux_map_to_setting(map, setting);
10071e2082b5SStephen Warren break;
10081e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_PIN:
10091e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_GROUP:
10101e2082b5SStephen Warren ret = pinconf_map_to_setting(map, setting);
10111e2082b5SStephen Warren break;
10121e2082b5SStephen Warren default:
10131e2082b5SStephen Warren ret = -EINVAL;
10141e2082b5SStephen Warren break;
10151e2082b5SStephen Warren }
10166e5e959dSStephen Warren if (ret < 0) {
10176e5e959dSStephen Warren kfree(setting);
10186e5e959dSStephen Warren return ret;
10196e5e959dSStephen Warren }
10206e5e959dSStephen Warren
10216e5e959dSStephen Warren list_add_tail(&setting->node, &state->settings);
10226e5e959dSStephen Warren
10236e5e959dSStephen Warren return 0;
10246e5e959dSStephen Warren }
10256e5e959dSStephen Warren
find_pinctrl(struct device * dev)10266e5e959dSStephen Warren static struct pinctrl *find_pinctrl(struct device *dev)
10276e5e959dSStephen Warren {
102862140a1eSAndy Shevchenko struct pinctrl *p;
10296e5e959dSStephen Warren
103042fed7baSPatrice Chotard mutex_lock(&pinctrl_list_mutex);
103162140a1eSAndy Shevchenko list_for_each_entry(p, &pinctrl_list, node)
103262140a1eSAndy Shevchenko if (p->dev == dev) {
103362140a1eSAndy Shevchenko mutex_unlock(&pinctrl_list_mutex);
103462140a1eSAndy Shevchenko return p;
103542fed7baSPatrice Chotard }
10366e5e959dSStephen Warren
103742fed7baSPatrice Chotard mutex_unlock(&pinctrl_list_mutex);
103862140a1eSAndy Shevchenko return NULL;
10396e5e959dSStephen Warren }
10406e5e959dSStephen Warren
104142fed7baSPatrice Chotard static void pinctrl_free(struct pinctrl *p, bool inlist);
10426e5e959dSStephen Warren
create_pinctrl(struct device * dev,struct pinctrl_dev * pctldev)104399e4f675STony Lindgren static struct pinctrl *create_pinctrl(struct device *dev,
104499e4f675STony Lindgren struct pinctrl_dev *pctldev)
10456e5e959dSStephen Warren {
10466e5e959dSStephen Warren struct pinctrl *p;
10476e5e959dSStephen Warren const char *devname;
1048b2b3e66eSStephen Warren struct pinctrl_maps *maps_node;
10493f713b7cSMasahiro Yamada const struct pinctrl_map *map;
10506e5e959dSStephen Warren int ret;
1051befe5bdfSLinus Walleij
1052befe5bdfSLinus Walleij /*
1053befe5bdfSLinus Walleij * create the state cookie holder struct pinctrl for each
1054befe5bdfSLinus Walleij * mapping, this is what consumers will get when requesting
1055befe5bdfSLinus Walleij * a pin control handle with pinctrl_get()
1056befe5bdfSLinus Walleij */
105702f5b989SStephen Warren p = kzalloc(sizeof(*p), GFP_KERNEL);
10582104d12dSBjorn Andersson if (!p)
1059befe5bdfSLinus Walleij return ERR_PTR(-ENOMEM);
10607ecdb16fSStephen Warren p->dev = dev;
10616e5e959dSStephen Warren INIT_LIST_HEAD(&p->states);
106257291ce2SStephen Warren INIT_LIST_HEAD(&p->dt_maps);
106357291ce2SStephen Warren
106499e4f675STony Lindgren ret = pinctrl_dt_to_map(p, pctldev);
106557291ce2SStephen Warren if (ret < 0) {
106657291ce2SStephen Warren kfree(p);
106757291ce2SStephen Warren return ERR_PTR(ret);
106857291ce2SStephen Warren }
10696e5e959dSStephen Warren
10706e5e959dSStephen Warren devname = dev_name(dev);
1071befe5bdfSLinus Walleij
107242fed7baSPatrice Chotard mutex_lock(&pinctrl_maps_mutex);
1073befe5bdfSLinus Walleij /* Iterate over the pin control maps to locate the right ones */
107406de5193SAndy Shevchenko for_each_pin_map(maps_node, map) {
10751681f5aeSStephen Warren /* Map must be for this device */
10761681f5aeSStephen Warren if (strcmp(map->dev_name, devname))
10771681f5aeSStephen Warren continue;
10787f0ff06cSNikita Yushchenko /*
10797f0ff06cSNikita Yushchenko * If pctldev is not null, we are claiming hog for it,
10807f0ff06cSNikita Yushchenko * that means, setting that is served by pctldev by itself.
10817f0ff06cSNikita Yushchenko *
10827f0ff06cSNikita Yushchenko * Thus we must skip map that is for this device but is served
10837f0ff06cSNikita Yushchenko * by other device.
10847f0ff06cSNikita Yushchenko */
10857f0ff06cSNikita Yushchenko if (pctldev &&
10867f0ff06cSNikita Yushchenko strcmp(dev_name(pctldev->dev), map->ctrl_dev_name))
10877f0ff06cSNikita Yushchenko continue;
10881681f5aeSStephen Warren
108999e4f675STony Lindgren ret = add_setting(p, pctldev, map);
109089216494SLinus Walleij /*
109189216494SLinus Walleij * At this point the adding of a setting may:
109289216494SLinus Walleij *
109389216494SLinus Walleij * - Defer, if the pinctrl device is not yet available
109489216494SLinus Walleij * - Fail, if the pinctrl device is not yet available,
109589216494SLinus Walleij * AND the setting is a hog. We cannot defer that, since
109689216494SLinus Walleij * the hog will kick in immediately after the device
109789216494SLinus Walleij * is registered.
109889216494SLinus Walleij *
109989216494SLinus Walleij * If the error returned was not -EPROBE_DEFER then we
110089216494SLinus Walleij * accumulate the errors to see if we end up with
110189216494SLinus Walleij * an -EPROBE_DEFER later, as that is the worst case.
110289216494SLinus Walleij */
110389216494SLinus Walleij if (ret == -EPROBE_DEFER) {
110442fed7baSPatrice Chotard mutex_unlock(&pinctrl_maps_mutex);
11054038c57bSHagar Hemdan pinctrl_free(p, false);
11066e5e959dSStephen Warren return ERR_PTR(ret);
1107befe5bdfSLinus Walleij }
11087ecdb16fSStephen Warren }
110942fed7baSPatrice Chotard mutex_unlock(&pinctrl_maps_mutex);
111042fed7baSPatrice Chotard
111189216494SLinus Walleij if (ret < 0) {
11123ec440e3SAndy Shevchenko /* If some other error than deferral occurred, return here */
111342fed7baSPatrice Chotard pinctrl_free(p, false);
111489216494SLinus Walleij return ERR_PTR(ret);
111589216494SLinus Walleij }
11167ecdb16fSStephen Warren
1117ab78029eSLinus Walleij kref_init(&p->users);
1118ab78029eSLinus Walleij
1119b0666ba4SLinus Walleij /* Add the pinctrl handle to the global list */
11207b320cb1SStanislaw Gruszka mutex_lock(&pinctrl_list_mutex);
11218b9c139fSStephen Warren list_add_tail(&p->node, &pinctrl_list);
11227b320cb1SStanislaw Gruszka mutex_unlock(&pinctrl_list_mutex);
1123befe5bdfSLinus Walleij
1124befe5bdfSLinus Walleij return p;
11256e5e959dSStephen Warren }
11267ecdb16fSStephen Warren
112742fed7baSPatrice Chotard /**
112842fed7baSPatrice Chotard * pinctrl_get() - retrieves the pinctrl handle for a device
112942fed7baSPatrice Chotard * @dev: the device to obtain the handle for
113042fed7baSPatrice Chotard */
pinctrl_get(struct device * dev)113142fed7baSPatrice Chotard struct pinctrl *pinctrl_get(struct device *dev)
11326e5e959dSStephen Warren {
11336e5e959dSStephen Warren struct pinctrl *p;
11347ecdb16fSStephen Warren
11356e5e959dSStephen Warren if (WARN_ON(!dev))
11366e5e959dSStephen Warren return ERR_PTR(-EINVAL);
11377ecdb16fSStephen Warren
1138ab78029eSLinus Walleij /*
1139ab78029eSLinus Walleij * See if somebody else (such as the device core) has already
1140ab78029eSLinus Walleij * obtained a handle to the pinctrl for this device. In that case,
1141ab78029eSLinus Walleij * return another pointer to it.
1142ab78029eSLinus Walleij */
11436e5e959dSStephen Warren p = find_pinctrl(dev);
1144cea234e9SMarkus Elfring if (p) {
1145ab78029eSLinus Walleij dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
114662140a1eSAndy Shevchenko kref_get(&p->users);
1147ab78029eSLinus Walleij return p;
1148ab78029eSLinus Walleij }
11496e5e959dSStephen Warren
115099e4f675STony Lindgren return create_pinctrl(dev, NULL);
1151befe5bdfSLinus Walleij }
1152befe5bdfSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_get);
1153befe5bdfSLinus Walleij
pinctrl_free_setting(bool disable_setting,struct pinctrl_setting * setting)1154d3cee830SRichard Genoud static void pinctrl_free_setting(bool disable_setting,
1155d3cee830SRichard Genoud struct pinctrl_setting *setting)
115657b676f9SStephen Warren {
11571e2082b5SStephen Warren switch (setting->type) {
11581e2082b5SStephen Warren case PIN_MAP_TYPE_MUX_GROUP:
1159d3cee830SRichard Genoud if (disable_setting)
11606e5e959dSStephen Warren pinmux_disable_setting(setting);
11617ecdb16fSStephen Warren pinmux_free_setting(setting);
11621e2082b5SStephen Warren break;
11631e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_PIN:
11641e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_GROUP:
11651e2082b5SStephen Warren pinconf_free_setting(setting);
11661e2082b5SStephen Warren break;
11671e2082b5SStephen Warren default:
11681e2082b5SStephen Warren break;
11691e2082b5SStephen Warren }
1170d3cee830SRichard Genoud }
1171d3cee830SRichard Genoud
pinctrl_free(struct pinctrl * p,bool inlist)117242fed7baSPatrice Chotard static void pinctrl_free(struct pinctrl *p, bool inlist)
1173d3cee830SRichard Genoud {
1174d3cee830SRichard Genoud struct pinctrl_state *state, *n1;
1175d3cee830SRichard Genoud struct pinctrl_setting *setting, *n2;
1176d3cee830SRichard Genoud
117742fed7baSPatrice Chotard mutex_lock(&pinctrl_list_mutex);
1178d3cee830SRichard Genoud list_for_each_entry_safe(state, n1, &p->states, node) {
1179d3cee830SRichard Genoud list_for_each_entry_safe(setting, n2, &state->settings, node) {
1180d3cee830SRichard Genoud pinctrl_free_setting(state == p->state, setting);
11817ecdb16fSStephen Warren list_del(&setting->node);
11827ecdb16fSStephen Warren kfree(setting);
11837ecdb16fSStephen Warren }
11846e5e959dSStephen Warren list_del(&state->node);
11856e5e959dSStephen Warren kfree(state);
11866e5e959dSStephen Warren }
118757b676f9SStephen Warren
118857291ce2SStephen Warren pinctrl_dt_free_maps(p);
118957291ce2SStephen Warren
11906e5e959dSStephen Warren if (inlist)
119157b676f9SStephen Warren list_del(&p->node);
119257b676f9SStephen Warren kfree(p);
119342fed7baSPatrice Chotard mutex_unlock(&pinctrl_list_mutex);
119457b676f9SStephen Warren }
119557b676f9SStephen Warren
1196befe5bdfSLinus Walleij /**
1197ab78029eSLinus Walleij * pinctrl_release() - release the pinctrl handle
1198ab78029eSLinus Walleij * @kref: the kref in the pinctrl being released
1199ab78029eSLinus Walleij */
pinctrl_release(struct kref * kref)12002917e833SSachin Kamat static void pinctrl_release(struct kref *kref)
1201ab78029eSLinus Walleij {
1202ab78029eSLinus Walleij struct pinctrl *p = container_of(kref, struct pinctrl, users);
1203ab78029eSLinus Walleij
120442fed7baSPatrice Chotard pinctrl_free(p, true);
1205ab78029eSLinus Walleij }
1206ab78029eSLinus Walleij
1207ab78029eSLinus Walleij /**
1208ab78029eSLinus Walleij * pinctrl_put() - decrease use count on a previously claimed pinctrl handle
12096e5e959dSStephen Warren * @p: the pinctrl handle to release
1210befe5bdfSLinus Walleij */
pinctrl_put(struct pinctrl * p)1211befe5bdfSLinus Walleij void pinctrl_put(struct pinctrl *p)
1212befe5bdfSLinus Walleij {
1213ab78029eSLinus Walleij kref_put(&p->users, pinctrl_release);
1214befe5bdfSLinus Walleij }
1215befe5bdfSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_put);
1216befe5bdfSLinus Walleij
121742fed7baSPatrice Chotard /**
121842fed7baSPatrice Chotard * pinctrl_lookup_state() - retrieves a state handle from a pinctrl handle
121942fed7baSPatrice Chotard * @p: the pinctrl handle to retrieve the state from
122042fed7baSPatrice Chotard * @name: the state name to retrieve
122142fed7baSPatrice Chotard */
pinctrl_lookup_state(struct pinctrl * p,const char * name)122242fed7baSPatrice Chotard struct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p,
12236e5e959dSStephen Warren const char *name)
122457b676f9SStephen Warren {
12256e5e959dSStephen Warren struct pinctrl_state *state;
12266e5e959dSStephen Warren
12276e5e959dSStephen Warren state = find_state(p, name);
12285b3aa5f7SDong Aisheng if (!state) {
12295b3aa5f7SDong Aisheng if (pinctrl_dummy_state) {
12305b3aa5f7SDong Aisheng /* create dummy state */
12315b3aa5f7SDong Aisheng dev_dbg(p->dev, "using pinctrl dummy state (%s)\n",
12325b3aa5f7SDong Aisheng name);
12335b3aa5f7SDong Aisheng state = create_state(p, name);
1234d599bfb3SRichard Genoud } else
1235d599bfb3SRichard Genoud state = ERR_PTR(-ENODEV);
12365b3aa5f7SDong Aisheng }
12376e5e959dSStephen Warren
12386e5e959dSStephen Warren return state;
12396e5e959dSStephen Warren }
12406e5e959dSStephen Warren EXPORT_SYMBOL_GPL(pinctrl_lookup_state);
12416e5e959dSStephen Warren
pinctrl_link_add(struct pinctrl_dev * pctldev,struct device * consumer)1242036f394dSBenjamin Gaignard static void pinctrl_link_add(struct pinctrl_dev *pctldev,
1243036f394dSBenjamin Gaignard struct device *consumer)
1244036f394dSBenjamin Gaignard {
1245036f394dSBenjamin Gaignard if (pctldev->desc->link_consumers)
1246036f394dSBenjamin Gaignard device_link_add(consumer, pctldev->dev,
1247036f394dSBenjamin Gaignard DL_FLAG_PM_RUNTIME |
1248036f394dSBenjamin Gaignard DL_FLAG_AUTOREMOVE_CONSUMER);
1249036f394dSBenjamin Gaignard }
1250036f394dSBenjamin Gaignard
125142fed7baSPatrice Chotard /**
1252981ed1bfSFlorian Fainelli * pinctrl_commit_state() - select/activate/program a pinctrl state to HW
125342fed7baSPatrice Chotard * @p: the pinctrl handle for the device that requests configuration
125442fed7baSPatrice Chotard * @state: the state handle to select/activate/program
125542fed7baSPatrice Chotard */
pinctrl_commit_state(struct pinctrl * p,struct pinctrl_state * state)1256981ed1bfSFlorian Fainelli static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
12576e5e959dSStephen Warren {
12586e5e959dSStephen Warren struct pinctrl_setting *setting, *setting2;
1259106d5556SMaria Yu struct pinctrl_state *old_state = READ_ONCE(p->state);
12607ecdb16fSStephen Warren int ret;
126157b676f9SStephen Warren
1262106d5556SMaria Yu if (old_state) {
12636e5e959dSStephen Warren /*
12642243a87dSFan Wu * For each pinmux setting in the old state, forget SW's record
12652243a87dSFan Wu * of mux owner for that pingroup. Any pingroups which are
12662243a87dSFan Wu * still owned by the new state will be re-acquired by the call
12672243a87dSFan Wu * to pinmux_enable_setting() in the loop below.
12686e5e959dSStephen Warren */
1269106d5556SMaria Yu list_for_each_entry(setting, &old_state->settings, node) {
12701e2082b5SStephen Warren if (setting->type != PIN_MAP_TYPE_MUX_GROUP)
12711e2082b5SStephen Warren continue;
12726e5e959dSStephen Warren pinmux_disable_setting(setting);
12736e5e959dSStephen Warren }
12746e5e959dSStephen Warren }
12756e5e959dSStephen Warren
12763102a76cSRichard Genoud p->state = NULL;
12776e5e959dSStephen Warren
1278b991f8c3SMichal Simek /* Apply all the settings for the new state - pinmux first */
12796e5e959dSStephen Warren list_for_each_entry(setting, &state->settings, node) {
12801e2082b5SStephen Warren switch (setting->type) {
12811e2082b5SStephen Warren case PIN_MAP_TYPE_MUX_GROUP:
12827ecdb16fSStephen Warren ret = pinmux_enable_setting(setting);
12831e2082b5SStephen Warren break;
12841e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_PIN:
12851e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_GROUP:
12866a37d750SMichal Simek ret = 0;
1287b991f8c3SMichal Simek break;
1288b991f8c3SMichal Simek default:
1289b991f8c3SMichal Simek ret = -EINVAL;
1290b991f8c3SMichal Simek break;
1291b991f8c3SMichal Simek }
1292b991f8c3SMichal Simek
1293b991f8c3SMichal Simek if (ret < 0)
1294b991f8c3SMichal Simek goto unapply_new_state;
1295b991f8c3SMichal Simek
1296b991f8c3SMichal Simek /* Do not link hogs (circular dependency) */
1297b991f8c3SMichal Simek if (p != setting->pctldev->p)
1298b991f8c3SMichal Simek pinctrl_link_add(setting->pctldev, p->dev);
1299b991f8c3SMichal Simek }
1300b991f8c3SMichal Simek
1301b991f8c3SMichal Simek /* Apply all the settings for the new state - pinconf after */
1302b991f8c3SMichal Simek list_for_each_entry(setting, &state->settings, node) {
1303b991f8c3SMichal Simek switch (setting->type) {
1304b991f8c3SMichal Simek case PIN_MAP_TYPE_MUX_GROUP:
13056a37d750SMichal Simek ret = 0;
1306b991f8c3SMichal Simek break;
1307b991f8c3SMichal Simek case PIN_MAP_TYPE_CONFIGS_PIN:
1308b991f8c3SMichal Simek case PIN_MAP_TYPE_CONFIGS_GROUP:
13091e2082b5SStephen Warren ret = pinconf_apply_setting(setting);
13101e2082b5SStephen Warren break;
13111e2082b5SStephen Warren default:
13121e2082b5SStephen Warren ret = -EINVAL;
13131e2082b5SStephen Warren break;
13141e2082b5SStephen Warren }
13153102a76cSRichard Genoud
131642fed7baSPatrice Chotard if (ret < 0) {
13173102a76cSRichard Genoud goto unapply_new_state;
13187ecdb16fSStephen Warren }
1319036f394dSBenjamin Gaignard
1320b672a87aSLinus Walleij /* Do not link hogs (circular dependency) */
1321b672a87aSLinus Walleij if (p != setting->pctldev->p)
1322036f394dSBenjamin Gaignard pinctrl_link_add(setting->pctldev, p->dev);
132342fed7baSPatrice Chotard }
132457b676f9SStephen Warren
13253102a76cSRichard Genoud p->state = state;
13263102a76cSRichard Genoud
13277ecdb16fSStephen Warren return 0;
13283102a76cSRichard Genoud
13293102a76cSRichard Genoud unapply_new_state:
1330da58751cSRichard Genoud dev_err(p->dev, "Error applying setting, reverse things back\n");
13313102a76cSRichard Genoud
13323102a76cSRichard Genoud list_for_each_entry(setting2, &state->settings, node) {
13333102a76cSRichard Genoud if (&setting2->node == &setting->node)
13343102a76cSRichard Genoud break;
1335af606177SRichard Genoud /*
1336af606177SRichard Genoud * All we can do here is pinmux_disable_setting.
1337af606177SRichard Genoud * That means that some pins are muxed differently now
1338af606177SRichard Genoud * than they were before applying the setting (We can't
1339af606177SRichard Genoud * "unmux a pin"!), but it's not a big deal since the pins
1340af606177SRichard Genoud * are free to be muxed by another apply_setting.
1341af606177SRichard Genoud */
1342af606177SRichard Genoud if (setting2->type == PIN_MAP_TYPE_MUX_GROUP)
1343af606177SRichard Genoud pinmux_disable_setting(setting2);
13443102a76cSRichard Genoud }
13458009d5ffSRichard Genoud
1346385d9424SRichard Genoud /* There's no infinite recursive loop here because p->state is NULL */
1347385d9424SRichard Genoud if (old_state)
134842fed7baSPatrice Chotard pinctrl_select_state(p, old_state);
13496e5e959dSStephen Warren
1350befe5bdfSLinus Walleij return ret;
1351befe5bdfSLinus Walleij }
1352981ed1bfSFlorian Fainelli
1353981ed1bfSFlorian Fainelli /**
1354981ed1bfSFlorian Fainelli * pinctrl_select_state() - select/activate/program a pinctrl state to HW
1355981ed1bfSFlorian Fainelli * @p: the pinctrl handle for the device that requests configuration
1356981ed1bfSFlorian Fainelli * @state: the state handle to select/activate/program
1357981ed1bfSFlorian Fainelli */
pinctrl_select_state(struct pinctrl * p,struct pinctrl_state * state)1358981ed1bfSFlorian Fainelli int pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
1359981ed1bfSFlorian Fainelli {
1360981ed1bfSFlorian Fainelli if (p->state == state)
1361981ed1bfSFlorian Fainelli return 0;
1362981ed1bfSFlorian Fainelli
1363981ed1bfSFlorian Fainelli return pinctrl_commit_state(p, state);
1364981ed1bfSFlorian Fainelli }
13656e5e959dSStephen Warren EXPORT_SYMBOL_GPL(pinctrl_select_state);
1366befe5bdfSLinus Walleij
devm_pinctrl_release(struct device * dev,void * res)13676d4ca1fbSStephen Warren static void devm_pinctrl_release(struct device *dev, void *res)
13686d4ca1fbSStephen Warren {
13696d4ca1fbSStephen Warren pinctrl_put(*(struct pinctrl **)res);
13706d4ca1fbSStephen Warren }
13716d4ca1fbSStephen Warren
13726d4ca1fbSStephen Warren /**
13739c340bbbSLee Jones * devm_pinctrl_get() - Resource managed pinctrl_get()
13746d4ca1fbSStephen Warren * @dev: the device to obtain the handle for
13756d4ca1fbSStephen Warren *
13766d4ca1fbSStephen Warren * If there is a need to explicitly destroy the returned struct pinctrl,
13776d4ca1fbSStephen Warren * devm_pinctrl_put() should be used, rather than plain pinctrl_put().
13786d4ca1fbSStephen Warren */
devm_pinctrl_get(struct device * dev)13796d4ca1fbSStephen Warren struct pinctrl *devm_pinctrl_get(struct device *dev)
13806d4ca1fbSStephen Warren {
13816d4ca1fbSStephen Warren struct pinctrl **ptr, *p;
13826d4ca1fbSStephen Warren
13836d4ca1fbSStephen Warren ptr = devres_alloc(devm_pinctrl_release, sizeof(*ptr), GFP_KERNEL);
13846d4ca1fbSStephen Warren if (!ptr)
13856d4ca1fbSStephen Warren return ERR_PTR(-ENOMEM);
13866d4ca1fbSStephen Warren
13876d4ca1fbSStephen Warren p = pinctrl_get(dev);
13886d4ca1fbSStephen Warren if (!IS_ERR(p)) {
13896d4ca1fbSStephen Warren *ptr = p;
13906d4ca1fbSStephen Warren devres_add(dev, ptr);
13916d4ca1fbSStephen Warren } else {
13926d4ca1fbSStephen Warren devres_free(ptr);
13936d4ca1fbSStephen Warren }
13946d4ca1fbSStephen Warren
13956d4ca1fbSStephen Warren return p;
13966d4ca1fbSStephen Warren }
13976d4ca1fbSStephen Warren EXPORT_SYMBOL_GPL(devm_pinctrl_get);
13986d4ca1fbSStephen Warren
devm_pinctrl_match(struct device * dev,void * res,void * data)13996d4ca1fbSStephen Warren static int devm_pinctrl_match(struct device *dev, void *res, void *data)
14006d4ca1fbSStephen Warren {
14016d4ca1fbSStephen Warren struct pinctrl **p = res;
14026d4ca1fbSStephen Warren
14036d4ca1fbSStephen Warren return *p == data;
14046d4ca1fbSStephen Warren }
14056d4ca1fbSStephen Warren
14066d4ca1fbSStephen Warren /**
14076d4ca1fbSStephen Warren * devm_pinctrl_put() - Resource managed pinctrl_put()
14086d4ca1fbSStephen Warren * @p: the pinctrl handle to release
14096d4ca1fbSStephen Warren *
14106d4ca1fbSStephen Warren * Deallocate a struct pinctrl obtained via devm_pinctrl_get(). Normally
14116d4ca1fbSStephen Warren * this function will not need to be called and the resource management
14126d4ca1fbSStephen Warren * code will ensure that the resource is freed.
14136d4ca1fbSStephen Warren */
devm_pinctrl_put(struct pinctrl * p)14146d4ca1fbSStephen Warren void devm_pinctrl_put(struct pinctrl *p)
14156d4ca1fbSStephen Warren {
1416a72149e8SJingoo Han WARN_ON(devres_release(p->dev, devm_pinctrl_release,
14176d4ca1fbSStephen Warren devm_pinctrl_match, p));
14186d4ca1fbSStephen Warren }
14196d4ca1fbSStephen Warren EXPORT_SYMBOL_GPL(devm_pinctrl_put);
14206d4ca1fbSStephen Warren
1421c72bed23SHans de Goede /**
1422c72bed23SHans de Goede * pinctrl_register_mappings() - register a set of pin controller mappings
1423c72bed23SHans de Goede * @maps: the pincontrol mappings table to register. Note the pinctrl-core
1424c72bed23SHans de Goede * keeps a reference to the passed in maps, so they should _not_ be
1425c72bed23SHans de Goede * marked with __initdata.
1426c72bed23SHans de Goede * @num_maps: the number of maps in the mapping table
1427c72bed23SHans de Goede */
pinctrl_register_mappings(const struct pinctrl_map * maps,unsigned num_maps)1428c72bed23SHans de Goede int pinctrl_register_mappings(const struct pinctrl_map *maps,
1429c72bed23SHans de Goede unsigned num_maps)
1430befe5bdfSLinus Walleij {
14311e2082b5SStephen Warren int i, ret;
1432b2b3e66eSStephen Warren struct pinctrl_maps *maps_node;
1433befe5bdfSLinus Walleij
14347e9236ffSMasahiro Yamada pr_debug("add %u pinctrl maps\n", num_maps);
1435befe5bdfSLinus Walleij
1436befe5bdfSLinus Walleij /* First sanity check the new mapping */
1437befe5bdfSLinus Walleij for (i = 0; i < num_maps; i++) {
14381e2082b5SStephen Warren if (!maps[i].dev_name) {
14391e2082b5SStephen Warren pr_err("failed to register map %s (%d): no device given\n",
14401e2082b5SStephen Warren maps[i].name, i);
14411e2082b5SStephen Warren return -EINVAL;
14421e2082b5SStephen Warren }
14431e2082b5SStephen Warren
1444befe5bdfSLinus Walleij if (!maps[i].name) {
1445befe5bdfSLinus Walleij pr_err("failed to register map %d: no map name given\n",
1446befe5bdfSLinus Walleij i);
1447befe5bdfSLinus Walleij return -EINVAL;
1448befe5bdfSLinus Walleij }
1449befe5bdfSLinus Walleij
14501e2082b5SStephen Warren if (maps[i].type != PIN_MAP_TYPE_DUMMY_STATE &&
14511e2082b5SStephen Warren !maps[i].ctrl_dev_name) {
1452befe5bdfSLinus Walleij pr_err("failed to register map %s (%d): no pin control device given\n",
1453befe5bdfSLinus Walleij maps[i].name, i);
1454befe5bdfSLinus Walleij return -EINVAL;
1455befe5bdfSLinus Walleij }
1456befe5bdfSLinus Walleij
14571e2082b5SStephen Warren switch (maps[i].type) {
14581e2082b5SStephen Warren case PIN_MAP_TYPE_DUMMY_STATE:
14591e2082b5SStephen Warren break;
14601e2082b5SStephen Warren case PIN_MAP_TYPE_MUX_GROUP:
14611e2082b5SStephen Warren ret = pinmux_validate_map(&maps[i], i);
14621e2082b5SStephen Warren if (ret < 0)
1463fde04f41SStephen Warren return ret;
14641e2082b5SStephen Warren break;
14651e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_PIN:
14661e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_GROUP:
14671e2082b5SStephen Warren ret = pinconf_validate_map(&maps[i], i);
14681e2082b5SStephen Warren if (ret < 0)
1469fde04f41SStephen Warren return ret;
14701e2082b5SStephen Warren break;
14711e2082b5SStephen Warren default:
14721e2082b5SStephen Warren pr_err("failed to register map %s (%d): invalid type given\n",
14731681f5aeSStephen Warren maps[i].name, i);
14741681f5aeSStephen Warren return -EINVAL;
14751681f5aeSStephen Warren }
1476befe5bdfSLinus Walleij }
1477befe5bdfSLinus Walleij
1478b2b3e66eSStephen Warren maps_node = kzalloc(sizeof(*maps_node), GFP_KERNEL);
14792104d12dSBjorn Andersson if (!maps_node)
1480befe5bdfSLinus Walleij return -ENOMEM;
1481befe5bdfSLinus Walleij
148257291ce2SStephen Warren maps_node->maps = maps;
1483c72bed23SHans de Goede maps_node->num_maps = num_maps;
1484b2b3e66eSStephen Warren
148542fed7baSPatrice Chotard mutex_lock(&pinctrl_maps_mutex);
1486b2b3e66eSStephen Warren list_add_tail(&maps_node->node, &pinctrl_maps);
148742fed7baSPatrice Chotard mutex_unlock(&pinctrl_maps_mutex);
1488b2b3e66eSStephen Warren
1489befe5bdfSLinus Walleij return 0;
1490befe5bdfSLinus Walleij }
14918b1b2dc7SRichard Fitzgerald EXPORT_SYMBOL_GPL(pinctrl_register_mappings);
149257291ce2SStephen Warren
1493c72bed23SHans de Goede /**
1494c72bed23SHans de Goede * pinctrl_unregister_mappings() - unregister a set of pin controller mappings
14959c340bbbSLee Jones * @map: the pincontrol mappings table passed to pinctrl_register_mappings()
1496c72bed23SHans de Goede * when registering the mappings.
1497c72bed23SHans de Goede */
pinctrl_unregister_mappings(const struct pinctrl_map * map)1498c72bed23SHans de Goede void pinctrl_unregister_mappings(const struct pinctrl_map *map)
149957291ce2SStephen Warren {
150057291ce2SStephen Warren struct pinctrl_maps *maps_node;
150157291ce2SStephen Warren
150242fed7baSPatrice Chotard mutex_lock(&pinctrl_maps_mutex);
150357291ce2SStephen Warren list_for_each_entry(maps_node, &pinctrl_maps, node) {
150457291ce2SStephen Warren if (maps_node->maps == map) {
150557291ce2SStephen Warren list_del(&maps_node->node);
1506db6c2c69SLinus Walleij kfree(maps_node);
150742fed7baSPatrice Chotard mutex_unlock(&pinctrl_maps_mutex);
150857291ce2SStephen Warren return;
150957291ce2SStephen Warren }
151057291ce2SStephen Warren }
151142fed7baSPatrice Chotard mutex_unlock(&pinctrl_maps_mutex);
151257291ce2SStephen Warren }
1513c72bed23SHans de Goede EXPORT_SYMBOL_GPL(pinctrl_unregister_mappings);
151457291ce2SStephen Warren
1515840a47baSJulien Delacou /**
1516840a47baSJulien Delacou * pinctrl_force_sleep() - turn a given controller device into sleep state
1517840a47baSJulien Delacou * @pctldev: pin controller device
1518840a47baSJulien Delacou */
pinctrl_force_sleep(struct pinctrl_dev * pctldev)1519840a47baSJulien Delacou int pinctrl_force_sleep(struct pinctrl_dev *pctldev)
1520840a47baSJulien Delacou {
1521840a47baSJulien Delacou if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_sleep))
1522981ed1bfSFlorian Fainelli return pinctrl_commit_state(pctldev->p, pctldev->hog_sleep);
1523840a47baSJulien Delacou return 0;
1524840a47baSJulien Delacou }
1525840a47baSJulien Delacou EXPORT_SYMBOL_GPL(pinctrl_force_sleep);
1526840a47baSJulien Delacou
1527840a47baSJulien Delacou /**
1528840a47baSJulien Delacou * pinctrl_force_default() - turn a given controller device into default state
1529840a47baSJulien Delacou * @pctldev: pin controller device
1530840a47baSJulien Delacou */
pinctrl_force_default(struct pinctrl_dev * pctldev)1531840a47baSJulien Delacou int pinctrl_force_default(struct pinctrl_dev *pctldev)
1532840a47baSJulien Delacou {
1533840a47baSJulien Delacou if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_default))
1534981ed1bfSFlorian Fainelli return pinctrl_commit_state(pctldev->p, pctldev->hog_default);
1535840a47baSJulien Delacou return 0;
1536840a47baSJulien Delacou }
1537840a47baSJulien Delacou EXPORT_SYMBOL_GPL(pinctrl_force_default);
1538840a47baSJulien Delacou
1539ef0eebc0SDouglas Anderson /**
1540ef0eebc0SDouglas Anderson * pinctrl_init_done() - tell pinctrl probe is done
1541ef0eebc0SDouglas Anderson *
1542ef0eebc0SDouglas Anderson * We'll use this time to switch the pins from "init" to "default" unless the
1543ef0eebc0SDouglas Anderson * driver selected some other state.
1544ef0eebc0SDouglas Anderson *
1545ef0eebc0SDouglas Anderson * @dev: device to that's done probing
1546ef0eebc0SDouglas Anderson */
pinctrl_init_done(struct device * dev)1547ef0eebc0SDouglas Anderson int pinctrl_init_done(struct device *dev)
1548ef0eebc0SDouglas Anderson {
1549ef0eebc0SDouglas Anderson struct dev_pin_info *pins = dev->pins;
1550ef0eebc0SDouglas Anderson int ret;
1551ef0eebc0SDouglas Anderson
1552ef0eebc0SDouglas Anderson if (!pins)
1553ef0eebc0SDouglas Anderson return 0;
1554ef0eebc0SDouglas Anderson
1555ef0eebc0SDouglas Anderson if (IS_ERR(pins->init_state))
1556ef0eebc0SDouglas Anderson return 0; /* No such state */
1557ef0eebc0SDouglas Anderson
1558ef0eebc0SDouglas Anderson if (pins->p->state != pins->init_state)
1559ef0eebc0SDouglas Anderson return 0; /* Not at init anyway */
1560ef0eebc0SDouglas Anderson
1561ef0eebc0SDouglas Anderson if (IS_ERR(pins->default_state))
1562ef0eebc0SDouglas Anderson return 0; /* No default state */
1563ef0eebc0SDouglas Anderson
1564ef0eebc0SDouglas Anderson ret = pinctrl_select_state(pins->p, pins->default_state);
1565ef0eebc0SDouglas Anderson if (ret)
1566ef0eebc0SDouglas Anderson dev_err(dev, "failed to activate default pinctrl state\n");
1567ef0eebc0SDouglas Anderson
1568ef0eebc0SDouglas Anderson return ret;
1569ef0eebc0SDouglas Anderson }
1570ef0eebc0SDouglas Anderson
pinctrl_select_bound_state(struct device * dev,struct pinctrl_state * state)157155d54d1eSUlf Hansson static int pinctrl_select_bound_state(struct device *dev,
1572f3333497STony Lindgren struct pinctrl_state *state)
1573f3333497STony Lindgren {
1574f3333497STony Lindgren struct dev_pin_info *pins = dev->pins;
1575f3333497STony Lindgren int ret;
1576f3333497STony Lindgren
1577f3333497STony Lindgren if (IS_ERR(state))
1578f3333497STony Lindgren return 0; /* No such state */
1579f3333497STony Lindgren ret = pinctrl_select_state(pins->p, state);
1580f3333497STony Lindgren if (ret)
1581f3333497STony Lindgren dev_err(dev, "failed to activate pinctrl state %s\n",
1582f3333497STony Lindgren state->name);
1583f3333497STony Lindgren return ret;
1584f3333497STony Lindgren }
1585f3333497STony Lindgren
1586f3333497STony Lindgren /**
158755d54d1eSUlf Hansson * pinctrl_select_default_state() - select default pinctrl state
158855d54d1eSUlf Hansson * @dev: device to select default state for
158955d54d1eSUlf Hansson */
pinctrl_select_default_state(struct device * dev)159055d54d1eSUlf Hansson int pinctrl_select_default_state(struct device *dev)
159155d54d1eSUlf Hansson {
159255d54d1eSUlf Hansson if (!dev->pins)
159355d54d1eSUlf Hansson return 0;
159455d54d1eSUlf Hansson
159555d54d1eSUlf Hansson return pinctrl_select_bound_state(dev, dev->pins->default_state);
159655d54d1eSUlf Hansson }
159755d54d1eSUlf Hansson EXPORT_SYMBOL_GPL(pinctrl_select_default_state);
159855d54d1eSUlf Hansson
159955d54d1eSUlf Hansson #ifdef CONFIG_PM
160055d54d1eSUlf Hansson
160155d54d1eSUlf Hansson /**
160214005ee2SLinus Walleij * pinctrl_pm_select_default_state() - select default pinctrl state for PM
160314005ee2SLinus Walleij * @dev: device to select default state for
160414005ee2SLinus Walleij */
pinctrl_pm_select_default_state(struct device * dev)160514005ee2SLinus Walleij int pinctrl_pm_select_default_state(struct device *dev)
160614005ee2SLinus Walleij {
160755d54d1eSUlf Hansson return pinctrl_select_default_state(dev);
160814005ee2SLinus Walleij }
1609f472deadSArnd Bergmann EXPORT_SYMBOL_GPL(pinctrl_pm_select_default_state);
161014005ee2SLinus Walleij
161114005ee2SLinus Walleij /**
161214005ee2SLinus Walleij * pinctrl_pm_select_sleep_state() - select sleep pinctrl state for PM
161314005ee2SLinus Walleij * @dev: device to select sleep state for
161414005ee2SLinus Walleij */
pinctrl_pm_select_sleep_state(struct device * dev)161514005ee2SLinus Walleij int pinctrl_pm_select_sleep_state(struct device *dev)
161614005ee2SLinus Walleij {
1617f3333497STony Lindgren if (!dev->pins)
161814005ee2SLinus Walleij return 0;
1619f3333497STony Lindgren
162055d54d1eSUlf Hansson return pinctrl_select_bound_state(dev, dev->pins->sleep_state);
162114005ee2SLinus Walleij }
1622f472deadSArnd Bergmann EXPORT_SYMBOL_GPL(pinctrl_pm_select_sleep_state);
162314005ee2SLinus Walleij
162414005ee2SLinus Walleij /**
162514005ee2SLinus Walleij * pinctrl_pm_select_idle_state() - select idle pinctrl state for PM
162614005ee2SLinus Walleij * @dev: device to select idle state for
162714005ee2SLinus Walleij */
pinctrl_pm_select_idle_state(struct device * dev)162814005ee2SLinus Walleij int pinctrl_pm_select_idle_state(struct device *dev)
162914005ee2SLinus Walleij {
1630f3333497STony Lindgren if (!dev->pins)
163114005ee2SLinus Walleij return 0;
1632f3333497STony Lindgren
163355d54d1eSUlf Hansson return pinctrl_select_bound_state(dev, dev->pins->idle_state);
163414005ee2SLinus Walleij }
1635f472deadSArnd Bergmann EXPORT_SYMBOL_GPL(pinctrl_pm_select_idle_state);
163614005ee2SLinus Walleij #endif
163714005ee2SLinus Walleij
16382744e8afSLinus Walleij #ifdef CONFIG_DEBUG_FS
16392744e8afSLinus Walleij
pinctrl_pins_show(struct seq_file * s,void * what)16402744e8afSLinus Walleij static int pinctrl_pins_show(struct seq_file *s, void *what)
16412744e8afSLinus Walleij {
16422744e8afSLinus Walleij struct pinctrl_dev *pctldev = s->private;
16432744e8afSLinus Walleij const struct pinctrl_ops *ops = pctldev->desc->pctlops;
1644706e8520SChanho Park unsigned i, pin;
1645b507cb92SHe Zhe #ifdef CONFIG_GPIOLIB
1646f1b206cfSDrew Fustini struct pinctrl_gpio_range *range;
1647f1b206cfSDrew Fustini struct gpio_chip *chip;
1648482715ffSAndy Shevchenko int gpio_num;
1649b507cb92SHe Zhe #endif
16502744e8afSLinus Walleij
16512744e8afSLinus Walleij seq_printf(s, "registered pins: %d\n", pctldev->desc->npins);
16522744e8afSLinus Walleij
165342fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
165457b676f9SStephen Warren
1655706e8520SChanho Park /* The pin number can be retrived from the pin controller descriptor */
1656706e8520SChanho Park for (i = 0; i < pctldev->desc->npins; i++) {
16572744e8afSLinus Walleij struct pin_desc *desc;
16582744e8afSLinus Walleij
1659706e8520SChanho Park pin = pctldev->desc->pins[i].number;
16602744e8afSLinus Walleij desc = pin_desc_get(pctldev, pin);
16612744e8afSLinus Walleij /* Pin space may be sparse */
1662cea234e9SMarkus Elfring if (!desc)
16632744e8afSLinus Walleij continue;
16642744e8afSLinus Walleij
1665cf9d994dSMasahiro Yamada seq_printf(s, "pin %d (%s) ", pin, desc->name);
16662744e8afSLinus Walleij
1667f1b206cfSDrew Fustini #ifdef CONFIG_GPIOLIB
1668482715ffSAndy Shevchenko gpio_num = -1;
1669f1b206cfSDrew Fustini list_for_each_entry(range, &pctldev->gpio_ranges, node) {
1670f1b206cfSDrew Fustini if ((pin >= range->pin_base) &&
1671f1b206cfSDrew Fustini (pin < (range->pin_base + range->npins))) {
1672f1b206cfSDrew Fustini gpio_num = range->base + (pin - range->pin_base);
1673f1b206cfSDrew Fustini break;
1674f1b206cfSDrew Fustini }
1675f1b206cfSDrew Fustini }
1676482715ffSAndy Shevchenko if (gpio_num >= 0)
1677e3863fa1SLinus Walleij /*
1678e3863fa1SLinus Walleij * FIXME: gpio_num comes from the global GPIO numberspace.
1679e3863fa1SLinus Walleij * we need to get rid of the range->base eventually and
1680e3863fa1SLinus Walleij * get the descriptor directly from the gpio_chip.
1681e3863fa1SLinus Walleij */
1682e3863fa1SLinus Walleij chip = gpiod_to_chip(gpio_to_desc(gpio_num));
1683482715ffSAndy Shevchenko else
1684482715ffSAndy Shevchenko chip = NULL;
1685482715ffSAndy Shevchenko if (chip)
1686482715ffSAndy Shevchenko seq_printf(s, "%u:%s ", gpio_num - chip->gpiodev->base, chip->label);
1687f1b206cfSDrew Fustini else
1688f1b206cfSDrew Fustini seq_puts(s, "0:? ");
1689f1b206cfSDrew Fustini #endif
1690f1b206cfSDrew Fustini
16912744e8afSLinus Walleij /* Driver-specific info per pin */
16922744e8afSLinus Walleij if (ops->pin_dbg_show)
16932744e8afSLinus Walleij ops->pin_dbg_show(pctldev, s, pin);
16942744e8afSLinus Walleij
16952744e8afSLinus Walleij seq_puts(s, "\n");
16962744e8afSLinus Walleij }
16972744e8afSLinus Walleij
169842fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
169957b676f9SStephen Warren
17002744e8afSLinus Walleij return 0;
17012744e8afSLinus Walleij }
1702b5520891SAndy Shevchenko DEFINE_SHOW_ATTRIBUTE(pinctrl_pins);
17032744e8afSLinus Walleij
pinctrl_groups_show(struct seq_file * s,void * what)17042744e8afSLinus Walleij static int pinctrl_groups_show(struct seq_file *s, void *what)
17052744e8afSLinus Walleij {
17062744e8afSLinus Walleij struct pinctrl_dev *pctldev = s->private;
17072744e8afSLinus Walleij const struct pinctrl_ops *ops = pctldev->desc->pctlops;
1708d1e90e9eSViresh Kumar unsigned ngroups, selector = 0;
17092744e8afSLinus Walleij
171042fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
171142fed7baSPatrice Chotard
1712d1e90e9eSViresh Kumar ngroups = ops->get_groups_count(pctldev);
171357b676f9SStephen Warren
17142744e8afSLinus Walleij seq_puts(s, "registered pin groups:\n");
1715d1e90e9eSViresh Kumar while (selector < ngroups) {
1716e5b3b2d9SAntoine Ténart const unsigned *pins = NULL;
1717e5b3b2d9SAntoine Ténart unsigned num_pins = 0;
17182744e8afSLinus Walleij const char *gname = ops->get_group_name(pctldev, selector);
1719dcb5dbc3SDong Aisheng const char *pname;
1720e5b3b2d9SAntoine Ténart int ret = 0;
17212744e8afSLinus Walleij int i;
17222744e8afSLinus Walleij
1723e5b3b2d9SAntoine Ténart if (ops->get_group_pins)
17242744e8afSLinus Walleij ret = ops->get_group_pins(pctldev, selector,
17252744e8afSLinus Walleij &pins, &num_pins);
17262744e8afSLinus Walleij if (ret)
17272744e8afSLinus Walleij seq_printf(s, "%s [ERROR GETTING PINS]\n",
17282744e8afSLinus Walleij gname);
17292744e8afSLinus Walleij else {
1730dcb5dbc3SDong Aisheng seq_printf(s, "group: %s\n", gname);
1731dcb5dbc3SDong Aisheng for (i = 0; i < num_pins; i++) {
1732dcb5dbc3SDong Aisheng pname = pin_get_name(pctldev, pins[i]);
1733b4dd784bSWei Yongjun if (WARN_ON(!pname)) {
173442fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
1735dcb5dbc3SDong Aisheng return -EINVAL;
1736b4dd784bSWei Yongjun }
1737dcb5dbc3SDong Aisheng seq_printf(s, "pin %d (%s)\n", pins[i], pname);
1738dcb5dbc3SDong Aisheng }
1739dcb5dbc3SDong Aisheng seq_puts(s, "\n");
17402744e8afSLinus Walleij }
17412744e8afSLinus Walleij selector++;
17422744e8afSLinus Walleij }
17432744e8afSLinus Walleij
174442fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
17452744e8afSLinus Walleij
17462744e8afSLinus Walleij return 0;
17472744e8afSLinus Walleij }
1748b5520891SAndy Shevchenko DEFINE_SHOW_ATTRIBUTE(pinctrl_groups);
17492744e8afSLinus Walleij
pinctrl_gpioranges_show(struct seq_file * s,void * what)17502744e8afSLinus Walleij static int pinctrl_gpioranges_show(struct seq_file *s, void *what)
17512744e8afSLinus Walleij {
17522744e8afSLinus Walleij struct pinctrl_dev *pctldev = s->private;
17536cadafb3SMasahiro Yamada struct pinctrl_gpio_range *range;
17542744e8afSLinus Walleij
17552744e8afSLinus Walleij seq_puts(s, "GPIO ranges handled:\n");
17562744e8afSLinus Walleij
175742fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
175857b676f9SStephen Warren
17592744e8afSLinus Walleij /* Loop over the ranges */
17602744e8afSLinus Walleij list_for_each_entry(range, &pctldev->gpio_ranges, node) {
1761c8587eeeSChristian Ruppert if (range->pins) {
1762c8587eeeSChristian Ruppert int a;
1763c8587eeeSChristian Ruppert seq_printf(s, "%u: %s GPIOS [%u - %u] PINS {",
1764c8587eeeSChristian Ruppert range->id, range->name,
1765c8587eeeSChristian Ruppert range->base, (range->base + range->npins - 1));
1766c8587eeeSChristian Ruppert for (a = 0; a < range->npins - 1; a++)
1767c8587eeeSChristian Ruppert seq_printf(s, "%u, ", range->pins[a]);
1768c8587eeeSChristian Ruppert seq_printf(s, "%u}\n", range->pins[a]);
1769c8587eeeSChristian Ruppert }
1770c8587eeeSChristian Ruppert else
177175d6642aSLinus Walleij seq_printf(s, "%u: %s GPIOS [%u - %u] PINS [%u - %u]\n",
177275d6642aSLinus Walleij range->id, range->name,
177375d6642aSLinus Walleij range->base, (range->base + range->npins - 1),
177475d6642aSLinus Walleij range->pin_base,
177575d6642aSLinus Walleij (range->pin_base + range->npins - 1));
17762744e8afSLinus Walleij }
177757b676f9SStephen Warren
177842fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
17792744e8afSLinus Walleij
17802744e8afSLinus Walleij return 0;
17812744e8afSLinus Walleij }
1782b5520891SAndy Shevchenko DEFINE_SHOW_ATTRIBUTE(pinctrl_gpioranges);
17832744e8afSLinus Walleij
pinctrl_devices_show(struct seq_file * s,void * what)17842744e8afSLinus Walleij static int pinctrl_devices_show(struct seq_file *s, void *what)
17852744e8afSLinus Walleij {
17862744e8afSLinus Walleij struct pinctrl_dev *pctldev;
17872744e8afSLinus Walleij
1788ae6b4d85SLinus Walleij seq_puts(s, "name [pinmux] [pinconf]\n");
178957b676f9SStephen Warren
179042fed7baSPatrice Chotard mutex_lock(&pinctrldev_list_mutex);
179157b676f9SStephen Warren
17922744e8afSLinus Walleij list_for_each_entry(pctldev, &pinctrldev_list, node) {
17932744e8afSLinus Walleij seq_printf(s, "%s ", pctldev->desc->name);
17942744e8afSLinus Walleij if (pctldev->desc->pmxops)
17952744e8afSLinus Walleij seq_puts(s, "yes ");
17962744e8afSLinus Walleij else
17972744e8afSLinus Walleij seq_puts(s, "no ");
1798ae6b4d85SLinus Walleij if (pctldev->desc->confops)
1799ae6b4d85SLinus Walleij seq_puts(s, "yes");
1800ae6b4d85SLinus Walleij else
1801ae6b4d85SLinus Walleij seq_puts(s, "no");
18022744e8afSLinus Walleij seq_puts(s, "\n");
18032744e8afSLinus Walleij }
180457b676f9SStephen Warren
180542fed7baSPatrice Chotard mutex_unlock(&pinctrldev_list_mutex);
18062744e8afSLinus Walleij
18072744e8afSLinus Walleij return 0;
18082744e8afSLinus Walleij }
1809b5520891SAndy Shevchenko DEFINE_SHOW_ATTRIBUTE(pinctrl_devices);
18102744e8afSLinus Walleij
map_type(enum pinctrl_map_type type)18111e2082b5SStephen Warren static inline const char *map_type(enum pinctrl_map_type type)
18121e2082b5SStephen Warren {
18131e2082b5SStephen Warren static const char * const names[] = {
18141e2082b5SStephen Warren "INVALID",
18151e2082b5SStephen Warren "DUMMY_STATE",
18161e2082b5SStephen Warren "MUX_GROUP",
18171e2082b5SStephen Warren "CONFIGS_PIN",
18181e2082b5SStephen Warren "CONFIGS_GROUP",
18191e2082b5SStephen Warren };
18201e2082b5SStephen Warren
18211e2082b5SStephen Warren if (type >= ARRAY_SIZE(names))
18221e2082b5SStephen Warren return "UNKNOWN";
18231e2082b5SStephen Warren
18241e2082b5SStephen Warren return names[type];
18251e2082b5SStephen Warren }
18261e2082b5SStephen Warren
pinctrl_maps_show(struct seq_file * s,void * what)18273eedb437SStephen Warren static int pinctrl_maps_show(struct seq_file *s, void *what)
18283eedb437SStephen Warren {
18293eedb437SStephen Warren struct pinctrl_maps *maps_node;
18303f713b7cSMasahiro Yamada const struct pinctrl_map *map;
18313eedb437SStephen Warren
18323eedb437SStephen Warren seq_puts(s, "Pinctrl maps:\n");
18333eedb437SStephen Warren
183442fed7baSPatrice Chotard mutex_lock(&pinctrl_maps_mutex);
183506de5193SAndy Shevchenko for_each_pin_map(maps_node, map) {
18361e2082b5SStephen Warren seq_printf(s, "device %s\nstate %s\ntype %s (%d)\n",
18371e2082b5SStephen Warren map->dev_name, map->name, map_type(map->type),
18381e2082b5SStephen Warren map->type);
18391e2082b5SStephen Warren
18401e2082b5SStephen Warren if (map->type != PIN_MAP_TYPE_DUMMY_STATE)
18411e2082b5SStephen Warren seq_printf(s, "controlling device %s\n",
18421e2082b5SStephen Warren map->ctrl_dev_name);
18431e2082b5SStephen Warren
18441e2082b5SStephen Warren switch (map->type) {
18451e2082b5SStephen Warren case PIN_MAP_TYPE_MUX_GROUP:
18461e2082b5SStephen Warren pinmux_show_map(s, map);
18471e2082b5SStephen Warren break;
18481e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_PIN:
18491e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_GROUP:
18501e2082b5SStephen Warren pinconf_show_map(s, map);
18511e2082b5SStephen Warren break;
18521e2082b5SStephen Warren default:
18531e2082b5SStephen Warren break;
18541e2082b5SStephen Warren }
18551e2082b5SStephen Warren
1856390e1046SMarkus Elfring seq_putc(s, '\n');
18573eedb437SStephen Warren }
185842fed7baSPatrice Chotard mutex_unlock(&pinctrl_maps_mutex);
18593eedb437SStephen Warren
18603eedb437SStephen Warren return 0;
18613eedb437SStephen Warren }
1862b5520891SAndy Shevchenko DEFINE_SHOW_ATTRIBUTE(pinctrl_maps);
18633eedb437SStephen Warren
pinctrl_show(struct seq_file * s,void * what)1864befe5bdfSLinus Walleij static int pinctrl_show(struct seq_file *s, void *what)
1865befe5bdfSLinus Walleij {
1866befe5bdfSLinus Walleij struct pinctrl *p;
18676e5e959dSStephen Warren struct pinctrl_state *state;
18687ecdb16fSStephen Warren struct pinctrl_setting *setting;
1869befe5bdfSLinus Walleij
1870befe5bdfSLinus Walleij seq_puts(s, "Requested pin control handlers their pinmux maps:\n");
187157b676f9SStephen Warren
187242fed7baSPatrice Chotard mutex_lock(&pinctrl_list_mutex);
187357b676f9SStephen Warren
1874befe5bdfSLinus Walleij list_for_each_entry(p, &pinctrl_list, node) {
18756e5e959dSStephen Warren seq_printf(s, "device: %s current state: %s\n",
18766e5e959dSStephen Warren dev_name(p->dev),
18776e5e959dSStephen Warren p->state ? p->state->name : "none");
1878befe5bdfSLinus Walleij
18796e5e959dSStephen Warren list_for_each_entry(state, &p->states, node) {
18806e5e959dSStephen Warren seq_printf(s, " state: %s\n", state->name);
18816e5e959dSStephen Warren
18826e5e959dSStephen Warren list_for_each_entry(setting, &state->settings, node) {
18831e2082b5SStephen Warren struct pinctrl_dev *pctldev = setting->pctldev;
18841e2082b5SStephen Warren
18851e2082b5SStephen Warren seq_printf(s, " type: %s controller %s ",
18861e2082b5SStephen Warren map_type(setting->type),
18871e2082b5SStephen Warren pinctrl_dev_get_name(pctldev));
18881e2082b5SStephen Warren
18891e2082b5SStephen Warren switch (setting->type) {
18901e2082b5SStephen Warren case PIN_MAP_TYPE_MUX_GROUP:
18911e2082b5SStephen Warren pinmux_show_setting(s, setting);
18921e2082b5SStephen Warren break;
18931e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_PIN:
18941e2082b5SStephen Warren case PIN_MAP_TYPE_CONFIGS_GROUP:
18951e2082b5SStephen Warren pinconf_show_setting(s, setting);
18961e2082b5SStephen Warren break;
18971e2082b5SStephen Warren default:
18981e2082b5SStephen Warren break;
18991e2082b5SStephen Warren }
1900befe5bdfSLinus Walleij }
1901befe5bdfSLinus Walleij }
19026e5e959dSStephen Warren }
1903befe5bdfSLinus Walleij
190442fed7baSPatrice Chotard mutex_unlock(&pinctrl_list_mutex);
190557b676f9SStephen Warren
1906befe5bdfSLinus Walleij return 0;
1907befe5bdfSLinus Walleij }
1908b5520891SAndy Shevchenko DEFINE_SHOW_ATTRIBUTE(pinctrl);
1909befe5bdfSLinus Walleij
19102744e8afSLinus Walleij static struct dentry *debugfs_root;
19112744e8afSLinus Walleij
pinctrl_init_device_debugfs(struct pinctrl_dev * pctldev)19122744e8afSLinus Walleij static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)
19132744e8afSLinus Walleij {
191402157160STony Lindgren struct dentry *device_root;
19151781af56SJan Kundrát const char *debugfs_name;
19162744e8afSLinus Walleij
19171781af56SJan Kundrát if (pctldev->desc->name &&
19181781af56SJan Kundrát strcmp(dev_name(pctldev->dev), pctldev->desc->name)) {
19191781af56SJan Kundrát debugfs_name = devm_kasprintf(pctldev->dev, GFP_KERNEL,
19201781af56SJan Kundrát "%s-%s", dev_name(pctldev->dev),
19211781af56SJan Kundrát pctldev->desc->name);
19221781af56SJan Kundrát if (!debugfs_name) {
19231781af56SJan Kundrát pr_warn("failed to determine debugfs dir name for %s\n",
19241781af56SJan Kundrát dev_name(pctldev->dev));
19251781af56SJan Kundrát return;
19261781af56SJan Kundrát }
19271781af56SJan Kundrát } else {
19281781af56SJan Kundrát debugfs_name = dev_name(pctldev->dev);
19291781af56SJan Kundrát }
19301781af56SJan Kundrát
19311781af56SJan Kundrát device_root = debugfs_create_dir(debugfs_name, debugfs_root);
193202157160STony Lindgren pctldev->device_root = device_root;
193302157160STony Lindgren
19342744e8afSLinus Walleij if (IS_ERR(device_root) || !device_root) {
19352744e8afSLinus Walleij pr_warn("failed to create debugfs directory for %s\n",
193651cd24eeSStephen Warren dev_name(pctldev->dev));
19372744e8afSLinus Walleij return;
19382744e8afSLinus Walleij }
193947473813SDrew Fustini debugfs_create_file("pins", 0444,
1940b5520891SAndy Shevchenko device_root, pctldev, &pinctrl_pins_fops);
194147473813SDrew Fustini debugfs_create_file("pingroups", 0444,
1942b5520891SAndy Shevchenko device_root, pctldev, &pinctrl_groups_fops);
194347473813SDrew Fustini debugfs_create_file("gpio-ranges", 0444,
1944b5520891SAndy Shevchenko device_root, pctldev, &pinctrl_gpioranges_fops);
1945e7f2a444SFlorian Vaussard if (pctldev->desc->pmxops)
19462744e8afSLinus Walleij pinmux_init_device_debugfs(device_root, pctldev);
1947e7f2a444SFlorian Vaussard if (pctldev->desc->confops)
1948ae6b4d85SLinus Walleij pinconf_init_device_debugfs(device_root, pctldev);
19492744e8afSLinus Walleij }
19502744e8afSLinus Walleij
pinctrl_remove_device_debugfs(struct pinctrl_dev * pctldev)195102157160STony Lindgren static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev)
195202157160STony Lindgren {
195302157160STony Lindgren debugfs_remove_recursive(pctldev->device_root);
195402157160STony Lindgren }
195502157160STony Lindgren
pinctrl_init_debugfs(void)19562744e8afSLinus Walleij static void pinctrl_init_debugfs(void)
19572744e8afSLinus Walleij {
19582744e8afSLinus Walleij debugfs_root = debugfs_create_dir("pinctrl", NULL);
19592744e8afSLinus Walleij if (IS_ERR(debugfs_root) || !debugfs_root) {
19602744e8afSLinus Walleij pr_warn("failed to create debugfs directory\n");
19612744e8afSLinus Walleij debugfs_root = NULL;
19622744e8afSLinus Walleij return;
19632744e8afSLinus Walleij }
19642744e8afSLinus Walleij
196547473813SDrew Fustini debugfs_create_file("pinctrl-devices", 0444,
1966b5520891SAndy Shevchenko debugfs_root, NULL, &pinctrl_devices_fops);
196747473813SDrew Fustini debugfs_create_file("pinctrl-maps", 0444,
1968b5520891SAndy Shevchenko debugfs_root, NULL, &pinctrl_maps_fops);
196947473813SDrew Fustini debugfs_create_file("pinctrl-handles", 0444,
1970b5520891SAndy Shevchenko debugfs_root, NULL, &pinctrl_fops);
19712744e8afSLinus Walleij }
19722744e8afSLinus Walleij
19732744e8afSLinus Walleij #else /* CONFIG_DEBUG_FS */
19742744e8afSLinus Walleij
pinctrl_init_device_debugfs(struct pinctrl_dev * pctldev)19752744e8afSLinus Walleij static void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)
19762744e8afSLinus Walleij {
19772744e8afSLinus Walleij }
19782744e8afSLinus Walleij
pinctrl_init_debugfs(void)19792744e8afSLinus Walleij static void pinctrl_init_debugfs(void)
19802744e8afSLinus Walleij {
19812744e8afSLinus Walleij }
19822744e8afSLinus Walleij
pinctrl_remove_device_debugfs(struct pinctrl_dev * pctldev)198302157160STony Lindgren static void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev)
198402157160STony Lindgren {
198502157160STony Lindgren }
198602157160STony Lindgren
19872744e8afSLinus Walleij #endif
19882744e8afSLinus Walleij
pinctrl_check_ops(struct pinctrl_dev * pctldev)1989d26bc49fSStephen Warren static int pinctrl_check_ops(struct pinctrl_dev *pctldev)
1990d26bc49fSStephen Warren {
1991d26bc49fSStephen Warren const struct pinctrl_ops *ops = pctldev->desc->pctlops;
1992d26bc49fSStephen Warren
1993d26bc49fSStephen Warren if (!ops ||
1994d1e90e9eSViresh Kumar !ops->get_groups_count ||
1995e5b3b2d9SAntoine Ténart !ops->get_group_name)
1996d26bc49fSStephen Warren return -EINVAL;
1997d26bc49fSStephen Warren
1998d26bc49fSStephen Warren return 0;
1999d26bc49fSStephen Warren }
2000d26bc49fSStephen Warren
20012744e8afSLinus Walleij /**
2002950b0d91STony Lindgren * pinctrl_init_controller() - init a pin controller device
20032744e8afSLinus Walleij * @pctldesc: descriptor for this pin controller
20042744e8afSLinus Walleij * @dev: parent device for this pin controller
20052744e8afSLinus Walleij * @driver_data: private pin controller data for this pin controller
20062744e8afSLinus Walleij */
20070ca4921fSAndy Shevchenko static struct pinctrl_dev *
pinctrl_init_controller(struct pinctrl_desc * pctldesc,struct device * dev,void * driver_data)20080ca4921fSAndy Shevchenko pinctrl_init_controller(struct pinctrl_desc *pctldesc, struct device *dev,
2009950b0d91STony Lindgren void *driver_data)
20102744e8afSLinus Walleij {
20112744e8afSLinus Walleij struct pinctrl_dev *pctldev;
20122744e8afSLinus Walleij int ret;
20132744e8afSLinus Walleij
2014da9aecb0SDevendra Naga if (!pctldesc)
2015323de9efSMasahiro Yamada return ERR_PTR(-EINVAL);
2016da9aecb0SDevendra Naga if (!pctldesc->name)
2017323de9efSMasahiro Yamada return ERR_PTR(-EINVAL);
20182744e8afSLinus Walleij
201902f5b989SStephen Warren pctldev = kzalloc(sizeof(*pctldev), GFP_KERNEL);
20202104d12dSBjorn Andersson if (!pctldev)
2021323de9efSMasahiro Yamada return ERR_PTR(-ENOMEM);
20222744e8afSLinus Walleij
20232744e8afSLinus Walleij /* Initialize pin control device struct */
20242744e8afSLinus Walleij pctldev->owner = pctldesc->owner;
20252744e8afSLinus Walleij pctldev->desc = pctldesc;
20262744e8afSLinus Walleij pctldev->driver_data = driver_data;
20272744e8afSLinus Walleij INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL);
2028c033a718SLinus Walleij #ifdef CONFIG_GENERIC_PINCTRL_GROUPS
2029c7059c5aSTony Lindgren INIT_RADIX_TREE(&pctldev->pin_group_tree, GFP_KERNEL);
2030c033a718SLinus Walleij #endif
2031a76edc89STony Lindgren #ifdef CONFIG_GENERIC_PINMUX_FUNCTIONS
2032a76edc89STony Lindgren INIT_RADIX_TREE(&pctldev->pin_function_tree, GFP_KERNEL);
2033a76edc89STony Lindgren #endif
20342744e8afSLinus Walleij INIT_LIST_HEAD(&pctldev->gpio_ranges);
203546daed6eSThierry Reding INIT_LIST_HEAD(&pctldev->node);
203651cd24eeSStephen Warren pctldev->dev = dev;
203742fed7baSPatrice Chotard mutex_init(&pctldev->mutex);
20382744e8afSLinus Walleij
2039d26bc49fSStephen Warren /* check core ops for sanity */
2040323de9efSMasahiro Yamada ret = pinctrl_check_ops(pctldev);
2041323de9efSMasahiro Yamada if (ret) {
2042ad6e1107SJohn Crispin dev_err(dev, "pinctrl ops lacks necessary functions\n");
2043d26bc49fSStephen Warren goto out_err;
2044d26bc49fSStephen Warren }
2045d26bc49fSStephen Warren
2046b9130b77STony Lindgren /* If we're implementing pinmuxing, check the ops for sanity */
2047b9130b77STony Lindgren if (pctldesc->pmxops) {
2048323de9efSMasahiro Yamada ret = pinmux_check_ops(pctldev);
2049323de9efSMasahiro Yamada if (ret)
2050b9130b77STony Lindgren goto out_err;
2051b9130b77STony Lindgren }
2052b9130b77STony Lindgren
2053b9130b77STony Lindgren /* If we're implementing pinconfig, check the ops for sanity */
2054b9130b77STony Lindgren if (pctldesc->confops) {
2055323de9efSMasahiro Yamada ret = pinconf_check_ops(pctldev);
2056323de9efSMasahiro Yamada if (ret)
2057b9130b77STony Lindgren goto out_err;
2058b9130b77STony Lindgren }
2059b9130b77STony Lindgren
20602744e8afSLinus Walleij /* Register all the pins */
2061ad6e1107SJohn Crispin dev_dbg(dev, "try to register %d pins ...\n", pctldesc->npins);
20622744e8afSLinus Walleij ret = pinctrl_register_pins(pctldev, pctldesc->pins, pctldesc->npins);
20632744e8afSLinus Walleij if (ret) {
2064ad6e1107SJohn Crispin dev_err(dev, "error during pin registration\n");
20652744e8afSLinus Walleij pinctrl_free_pindescs(pctldev, pctldesc->pins,
20662744e8afSLinus Walleij pctldesc->npins);
206751cd24eeSStephen Warren goto out_err;
20682744e8afSLinus Walleij }
20692744e8afSLinus Walleij
20702744e8afSLinus Walleij return pctldev;
20712744e8afSLinus Walleij
207251cd24eeSStephen Warren out_err:
207342fed7baSPatrice Chotard mutex_destroy(&pctldev->mutex);
207451cd24eeSStephen Warren kfree(pctldev);
2075323de9efSMasahiro Yamada return ERR_PTR(ret);
20762744e8afSLinus Walleij }
2077950b0d91STony Lindgren
pinctrl_uninit_controller(struct pinctrl_dev * pctldev,struct pinctrl_desc * pctldesc)207899ae0689SYang Yingliang static void pinctrl_uninit_controller(struct pinctrl_dev *pctldev, struct pinctrl_desc *pctldesc)
207999ae0689SYang Yingliang {
208099ae0689SYang Yingliang pinctrl_free_pindescs(pctldev, pctldesc->pins,
208199ae0689SYang Yingliang pctldesc->npins);
208299ae0689SYang Yingliang mutex_destroy(&pctldev->mutex);
208399ae0689SYang Yingliang kfree(pctldev);
208499ae0689SYang Yingliang }
208599ae0689SYang Yingliang
pinctrl_claim_hogs(struct pinctrl_dev * pctldev)208661187142STony Lindgren static int pinctrl_claim_hogs(struct pinctrl_dev *pctldev)
2087950b0d91STony Lindgren {
2088950b0d91STony Lindgren pctldev->p = create_pinctrl(pctldev->dev, pctldev);
208961187142STony Lindgren if (PTR_ERR(pctldev->p) == -ENODEV) {
209061187142STony Lindgren dev_dbg(pctldev->dev, "no hogs found\n");
209161187142STony Lindgren
209261187142STony Lindgren return 0;
209361187142STony Lindgren }
209461187142STony Lindgren
209561187142STony Lindgren if (IS_ERR(pctldev->p)) {
209661187142STony Lindgren dev_err(pctldev->dev, "error claiming hogs: %li\n",
209761187142STony Lindgren PTR_ERR(pctldev->p));
209861187142STony Lindgren
209961187142STony Lindgren return PTR_ERR(pctldev->p);
210061187142STony Lindgren }
210161187142STony Lindgren
2102950b0d91STony Lindgren pctldev->hog_default =
2103950b0d91STony Lindgren pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT);
2104950b0d91STony Lindgren if (IS_ERR(pctldev->hog_default)) {
2105950b0d91STony Lindgren dev_dbg(pctldev->dev,
2106950b0d91STony Lindgren "failed to lookup the default state\n");
2107950b0d91STony Lindgren } else {
2108950b0d91STony Lindgren if (pinctrl_select_state(pctldev->p,
2109950b0d91STony Lindgren pctldev->hog_default))
2110950b0d91STony Lindgren dev_err(pctldev->dev,
2111950b0d91STony Lindgren "failed to select default state\n");
2112950b0d91STony Lindgren }
2113950b0d91STony Lindgren
2114950b0d91STony Lindgren pctldev->hog_sleep =
2115950b0d91STony Lindgren pinctrl_lookup_state(pctldev->p,
2116950b0d91STony Lindgren PINCTRL_STATE_SLEEP);
2117950b0d91STony Lindgren if (IS_ERR(pctldev->hog_sleep))
2118950b0d91STony Lindgren dev_dbg(pctldev->dev,
2119950b0d91STony Lindgren "failed to lookup the sleep state\n");
212061187142STony Lindgren
212161187142STony Lindgren return 0;
212261187142STony Lindgren }
212361187142STony Lindgren
pinctrl_enable(struct pinctrl_dev * pctldev)212461187142STony Lindgren int pinctrl_enable(struct pinctrl_dev *pctldev)
212561187142STony Lindgren {
212661187142STony Lindgren int error;
212761187142STony Lindgren
212861187142STony Lindgren error = pinctrl_claim_hogs(pctldev);
212961187142STony Lindgren if (error) {
2130558c8039SDan Carpenter dev_err(pctldev->dev, "could not claim hogs: %i\n", error);
213161187142STony Lindgren return error;
2132950b0d91STony Lindgren }
2133950b0d91STony Lindgren
2134950b0d91STony Lindgren mutex_lock(&pinctrldev_list_mutex);
2135950b0d91STony Lindgren list_add_tail(&pctldev->node, &pinctrldev_list);
2136950b0d91STony Lindgren mutex_unlock(&pinctrldev_list_mutex);
2137950b0d91STony Lindgren
2138950b0d91STony Lindgren pinctrl_init_device_debugfs(pctldev);
2139950b0d91STony Lindgren
2140950b0d91STony Lindgren return 0;
2141950b0d91STony Lindgren }
214261187142STony Lindgren EXPORT_SYMBOL_GPL(pinctrl_enable);
2143950b0d91STony Lindgren
2144950b0d91STony Lindgren /**
2145950b0d91STony Lindgren * pinctrl_register() - register a pin controller device
2146950b0d91STony Lindgren * @pctldesc: descriptor for this pin controller
2147950b0d91STony Lindgren * @dev: parent device for this pin controller
2148950b0d91STony Lindgren * @driver_data: private pin controller data for this pin controller
2149950b0d91STony Lindgren *
2150950b0d91STony Lindgren * Note that pinctrl_register() is known to have problems as the pin
2151950b0d91STony Lindgren * controller driver functions are called before the driver has a
2152950b0d91STony Lindgren * struct pinctrl_dev handle. To avoid issues later on, please use the
2153950b0d91STony Lindgren * new pinctrl_register_and_init() below instead.
2154950b0d91STony Lindgren */
pinctrl_register(struct pinctrl_desc * pctldesc,struct device * dev,void * driver_data)2155950b0d91STony Lindgren struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
2156950b0d91STony Lindgren struct device *dev, void *driver_data)
2157950b0d91STony Lindgren {
2158950b0d91STony Lindgren struct pinctrl_dev *pctldev;
2159950b0d91STony Lindgren int error;
2160950b0d91STony Lindgren
2161950b0d91STony Lindgren pctldev = pinctrl_init_controller(pctldesc, dev, driver_data);
2162950b0d91STony Lindgren if (IS_ERR(pctldev))
2163950b0d91STony Lindgren return pctldev;
2164950b0d91STony Lindgren
216561187142STony Lindgren error = pinctrl_enable(pctldev);
216699ae0689SYang Yingliang if (error) {
216799ae0689SYang Yingliang pinctrl_uninit_controller(pctldev, pctldesc);
2168950b0d91STony Lindgren return ERR_PTR(error);
216999ae0689SYang Yingliang }
2170950b0d91STony Lindgren
2171950b0d91STony Lindgren return pctldev;
2172950b0d91STony Lindgren }
21732744e8afSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_register);
21742744e8afSLinus Walleij
217561187142STony Lindgren /**
217661187142STony Lindgren * pinctrl_register_and_init() - register and init pin controller device
217761187142STony Lindgren * @pctldesc: descriptor for this pin controller
217861187142STony Lindgren * @dev: parent device for this pin controller
217961187142STony Lindgren * @driver_data: private pin controller data for this pin controller
218061187142STony Lindgren * @pctldev: pin controller device
218161187142STony Lindgren *
218261187142STony Lindgren * Note that pinctrl_enable() still needs to be manually called after
218361187142STony Lindgren * this once the driver is ready.
218461187142STony Lindgren */
pinctrl_register_and_init(struct pinctrl_desc * pctldesc,struct device * dev,void * driver_data,struct pinctrl_dev ** pctldev)2185950b0d91STony Lindgren int pinctrl_register_and_init(struct pinctrl_desc *pctldesc,
2186950b0d91STony Lindgren struct device *dev, void *driver_data,
2187950b0d91STony Lindgren struct pinctrl_dev **pctldev)
2188950b0d91STony Lindgren {
2189950b0d91STony Lindgren struct pinctrl_dev *p;
2190950b0d91STony Lindgren
2191950b0d91STony Lindgren p = pinctrl_init_controller(pctldesc, dev, driver_data);
2192950b0d91STony Lindgren if (IS_ERR(p))
2193950b0d91STony Lindgren return PTR_ERR(p);
2194950b0d91STony Lindgren
2195950b0d91STony Lindgren /*
2196950b0d91STony Lindgren * We have pinctrl_start() call functions in the pin controller
2197950b0d91STony Lindgren * driver with create_pinctrl() for at least dt_node_to_map(). So
2198950b0d91STony Lindgren * let's make sure pctldev is properly initialized for the
2199950b0d91STony Lindgren * pin controller driver before we do anything.
2200950b0d91STony Lindgren */
2201950b0d91STony Lindgren *pctldev = p;
2202950b0d91STony Lindgren
2203950b0d91STony Lindgren return 0;
2204950b0d91STony Lindgren }
2205950b0d91STony Lindgren EXPORT_SYMBOL_GPL(pinctrl_register_and_init);
2206950b0d91STony Lindgren
22072744e8afSLinus Walleij /**
22082744e8afSLinus Walleij * pinctrl_unregister() - unregister pinmux
22092744e8afSLinus Walleij * @pctldev: pin controller to unregister
22102744e8afSLinus Walleij *
22112744e8afSLinus Walleij * Called by pinmux drivers to unregister a pinmux.
22122744e8afSLinus Walleij */
pinctrl_unregister(struct pinctrl_dev * pctldev)22132744e8afSLinus Walleij void pinctrl_unregister(struct pinctrl_dev *pctldev)
22142744e8afSLinus Walleij {
22155d589b09SDong Aisheng struct pinctrl_gpio_range *range, *n;
22163429fb3cSJon Hunter
2217cea234e9SMarkus Elfring if (!pctldev)
22182744e8afSLinus Walleij return;
22192744e8afSLinus Walleij
222042fed7baSPatrice Chotard mutex_lock(&pctldev->mutex);
222102157160STony Lindgren pinctrl_remove_device_debugfs(pctldev);
2222db93facfSJim Lin mutex_unlock(&pctldev->mutex);
222357b676f9SStephen Warren
22243429fb3cSJon Hunter if (!IS_ERR_OR_NULL(pctldev->p))
222542fed7baSPatrice Chotard pinctrl_put(pctldev->p);
222657b676f9SStephen Warren
2227db93facfSJim Lin mutex_lock(&pinctrldev_list_mutex);
2228db93facfSJim Lin mutex_lock(&pctldev->mutex);
22292744e8afSLinus Walleij /* TODO: check that no pinmuxes are still active? */
223046daed6eSThierry Reding list_del(&pctldev->node);
2231a76edc89STony Lindgren pinmux_generic_free_functions(pctldev);
2232c7059c5aSTony Lindgren pinctrl_generic_free_groups(pctldev);
22332744e8afSLinus Walleij /* Destroy descriptor tree */
22342744e8afSLinus Walleij pinctrl_free_pindescs(pctldev, pctldev->desc->pins,
22352744e8afSLinus Walleij pctldev->desc->npins);
22365d589b09SDong Aisheng /* remove gpio ranges map */
22375d589b09SDong Aisheng list_for_each_entry_safe(range, n, &pctldev->gpio_ranges, node)
22385d589b09SDong Aisheng list_del(&range->node);
22395d589b09SDong Aisheng
224042fed7baSPatrice Chotard mutex_unlock(&pctldev->mutex);
224142fed7baSPatrice Chotard mutex_destroy(&pctldev->mutex);
224251cd24eeSStephen Warren kfree(pctldev);
224342fed7baSPatrice Chotard mutex_unlock(&pinctrldev_list_mutex);
22442744e8afSLinus Walleij }
22452744e8afSLinus Walleij EXPORT_SYMBOL_GPL(pinctrl_unregister);
22462744e8afSLinus Walleij
devm_pinctrl_dev_release(struct device * dev,void * res)224780e0f8d9SLaxman Dewangan static void devm_pinctrl_dev_release(struct device *dev, void *res)
224880e0f8d9SLaxman Dewangan {
224980e0f8d9SLaxman Dewangan struct pinctrl_dev *pctldev = *(struct pinctrl_dev **)res;
225080e0f8d9SLaxman Dewangan
225180e0f8d9SLaxman Dewangan pinctrl_unregister(pctldev);
225280e0f8d9SLaxman Dewangan }
225380e0f8d9SLaxman Dewangan
devm_pinctrl_dev_match(struct device * dev,void * res,void * data)225480e0f8d9SLaxman Dewangan static int devm_pinctrl_dev_match(struct device *dev, void *res, void *data)
225580e0f8d9SLaxman Dewangan {
225680e0f8d9SLaxman Dewangan struct pctldev **r = res;
225780e0f8d9SLaxman Dewangan
22583024f920SLaxman Dewangan if (WARN_ON(!r || !*r))
225980e0f8d9SLaxman Dewangan return 0;
226080e0f8d9SLaxman Dewangan
226180e0f8d9SLaxman Dewangan return *r == data;
226280e0f8d9SLaxman Dewangan }
226380e0f8d9SLaxman Dewangan
226480e0f8d9SLaxman Dewangan /**
226580e0f8d9SLaxman Dewangan * devm_pinctrl_register() - Resource managed version of pinctrl_register().
226680e0f8d9SLaxman Dewangan * @dev: parent device for this pin controller
226780e0f8d9SLaxman Dewangan * @pctldesc: descriptor for this pin controller
226880e0f8d9SLaxman Dewangan * @driver_data: private pin controller data for this pin controller
226980e0f8d9SLaxman Dewangan *
227080e0f8d9SLaxman Dewangan * Returns an error pointer if pincontrol register failed. Otherwise
227180e0f8d9SLaxman Dewangan * it returns valid pinctrl handle.
227280e0f8d9SLaxman Dewangan *
227380e0f8d9SLaxman Dewangan * The pinctrl device will be automatically released when the device is unbound.
227480e0f8d9SLaxman Dewangan */
devm_pinctrl_register(struct device * dev,struct pinctrl_desc * pctldesc,void * driver_data)227580e0f8d9SLaxman Dewangan struct pinctrl_dev *devm_pinctrl_register(struct device *dev,
227680e0f8d9SLaxman Dewangan struct pinctrl_desc *pctldesc,
227780e0f8d9SLaxman Dewangan void *driver_data)
227880e0f8d9SLaxman Dewangan {
227980e0f8d9SLaxman Dewangan struct pinctrl_dev **ptr, *pctldev;
228080e0f8d9SLaxman Dewangan
228180e0f8d9SLaxman Dewangan ptr = devres_alloc(devm_pinctrl_dev_release, sizeof(*ptr), GFP_KERNEL);
228280e0f8d9SLaxman Dewangan if (!ptr)
228380e0f8d9SLaxman Dewangan return ERR_PTR(-ENOMEM);
228480e0f8d9SLaxman Dewangan
228580e0f8d9SLaxman Dewangan pctldev = pinctrl_register(pctldesc, dev, driver_data);
228680e0f8d9SLaxman Dewangan if (IS_ERR(pctldev)) {
228780e0f8d9SLaxman Dewangan devres_free(ptr);
228880e0f8d9SLaxman Dewangan return pctldev;
228980e0f8d9SLaxman Dewangan }
229080e0f8d9SLaxman Dewangan
229180e0f8d9SLaxman Dewangan *ptr = pctldev;
229280e0f8d9SLaxman Dewangan devres_add(dev, ptr);
229380e0f8d9SLaxman Dewangan
229480e0f8d9SLaxman Dewangan return pctldev;
229580e0f8d9SLaxman Dewangan }
229680e0f8d9SLaxman Dewangan EXPORT_SYMBOL_GPL(devm_pinctrl_register);
229780e0f8d9SLaxman Dewangan
229880e0f8d9SLaxman Dewangan /**
2299950b0d91STony Lindgren * devm_pinctrl_register_and_init() - Resource managed pinctrl register and init
2300950b0d91STony Lindgren * @dev: parent device for this pin controller
2301950b0d91STony Lindgren * @pctldesc: descriptor for this pin controller
2302950b0d91STony Lindgren * @driver_data: private pin controller data for this pin controller
23039c340bbbSLee Jones * @pctldev: pin controller device
2304950b0d91STony Lindgren *
23059c340bbbSLee Jones * Returns zero on success or an error number on failure.
2306950b0d91STony Lindgren *
2307950b0d91STony Lindgren * The pinctrl device will be automatically released when the device is unbound.
2308950b0d91STony Lindgren */
devm_pinctrl_register_and_init(struct device * dev,struct pinctrl_desc * pctldesc,void * driver_data,struct pinctrl_dev ** pctldev)2309950b0d91STony Lindgren int devm_pinctrl_register_and_init(struct device *dev,
2310950b0d91STony Lindgren struct pinctrl_desc *pctldesc,
2311950b0d91STony Lindgren void *driver_data,
2312950b0d91STony Lindgren struct pinctrl_dev **pctldev)
2313950b0d91STony Lindgren {
2314950b0d91STony Lindgren struct pinctrl_dev **ptr;
2315950b0d91STony Lindgren int error;
2316950b0d91STony Lindgren
2317950b0d91STony Lindgren ptr = devres_alloc(devm_pinctrl_dev_release, sizeof(*ptr), GFP_KERNEL);
2318950b0d91STony Lindgren if (!ptr)
2319950b0d91STony Lindgren return -ENOMEM;
2320950b0d91STony Lindgren
2321950b0d91STony Lindgren error = pinctrl_register_and_init(pctldesc, dev, driver_data, pctldev);
2322950b0d91STony Lindgren if (error) {
2323950b0d91STony Lindgren devres_free(ptr);
2324950b0d91STony Lindgren return error;
2325950b0d91STony Lindgren }
2326950b0d91STony Lindgren
2327950b0d91STony Lindgren *ptr = *pctldev;
2328950b0d91STony Lindgren devres_add(dev, ptr);
2329950b0d91STony Lindgren
2330950b0d91STony Lindgren return 0;
2331950b0d91STony Lindgren }
2332950b0d91STony Lindgren EXPORT_SYMBOL_GPL(devm_pinctrl_register_and_init);
2333950b0d91STony Lindgren
2334950b0d91STony Lindgren /**
233580e0f8d9SLaxman Dewangan * devm_pinctrl_unregister() - Resource managed version of pinctrl_unregister().
2336129803e6SMichal Simek * @dev: device for which resource was allocated
233780e0f8d9SLaxman Dewangan * @pctldev: the pinctrl device to unregister.
233880e0f8d9SLaxman Dewangan */
devm_pinctrl_unregister(struct device * dev,struct pinctrl_dev * pctldev)233980e0f8d9SLaxman Dewangan void devm_pinctrl_unregister(struct device *dev, struct pinctrl_dev *pctldev)
234080e0f8d9SLaxman Dewangan {
234180e0f8d9SLaxman Dewangan WARN_ON(devres_release(dev, devm_pinctrl_dev_release,
234280e0f8d9SLaxman Dewangan devm_pinctrl_dev_match, pctldev));
234380e0f8d9SLaxman Dewangan }
234480e0f8d9SLaxman Dewangan EXPORT_SYMBOL_GPL(devm_pinctrl_unregister);
234580e0f8d9SLaxman Dewangan
pinctrl_init(void)23462744e8afSLinus Walleij static int __init pinctrl_init(void)
23472744e8afSLinus Walleij {
23482744e8afSLinus Walleij pr_info("initialized pinctrl subsystem\n");
23492744e8afSLinus Walleij pinctrl_init_debugfs();
23502744e8afSLinus Walleij return 0;
23512744e8afSLinus Walleij }
23522744e8afSLinus Walleij
23532744e8afSLinus Walleij /* init early since many drivers really need to initialized pinmux early */
23542744e8afSLinus Walleij core_initcall(pinctrl_init);
2355