xref: /openbmc/linux/drivers/pinctrl/core.c (revision 278002edb19bce2c628fafb0af936e77000f3a5b)
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