162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Core driver for the pin control subsystem
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2011-2012 ST-Ericsson SA
662306a36Sopenharmony_ci * Written on behalf of Linaro for ST-Ericsson
762306a36Sopenharmony_ci * Based on bits of regulator core, gpio core and clk core
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci * Author: Linus Walleij <linus.walleij@linaro.org>
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci#define pr_fmt(fmt) "pinctrl core: " fmt
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <linux/debugfs.h>
1662306a36Sopenharmony_ci#include <linux/device.h>
1762306a36Sopenharmony_ci#include <linux/err.h>
1862306a36Sopenharmony_ci#include <linux/export.h>
1962306a36Sopenharmony_ci#include <linux/init.h>
2062306a36Sopenharmony_ci#include <linux/kernel.h>
2162306a36Sopenharmony_ci#include <linux/kref.h>
2262306a36Sopenharmony_ci#include <linux/list.h>
2362306a36Sopenharmony_ci#include <linux/seq_file.h>
2462306a36Sopenharmony_ci#include <linux/slab.h>
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci#include <linux/pinctrl/consumer.h>
2762306a36Sopenharmony_ci#include <linux/pinctrl/devinfo.h>
2862306a36Sopenharmony_ci#include <linux/pinctrl/machine.h>
2962306a36Sopenharmony_ci#include <linux/pinctrl/pinctrl.h>
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB
3262306a36Sopenharmony_ci#include "../gpio/gpiolib.h"
3362306a36Sopenharmony_ci#endif
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#include "core.h"
3662306a36Sopenharmony_ci#include "devicetree.h"
3762306a36Sopenharmony_ci#include "pinconf.h"
3862306a36Sopenharmony_ci#include "pinmux.h"
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic bool pinctrl_dummy_state;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci/* Mutex taken to protect pinctrl_list */
4362306a36Sopenharmony_cistatic DEFINE_MUTEX(pinctrl_list_mutex);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci/* Mutex taken to protect pinctrl_maps */
4662306a36Sopenharmony_ciDEFINE_MUTEX(pinctrl_maps_mutex);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* Mutex taken to protect pinctrldev_list */
4962306a36Sopenharmony_cistatic DEFINE_MUTEX(pinctrldev_list_mutex);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* Global list of pin control devices (struct pinctrl_dev) */
5262306a36Sopenharmony_cistatic LIST_HEAD(pinctrldev_list);
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci/* List of pin controller handles (struct pinctrl) */
5562306a36Sopenharmony_cistatic LIST_HEAD(pinctrl_list);
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci/* List of pinctrl maps (struct pinctrl_maps) */
5862306a36Sopenharmony_ciLIST_HEAD(pinctrl_maps);
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci/**
6262306a36Sopenharmony_ci * pinctrl_provide_dummies() - indicate if pinctrl provides dummy state support
6362306a36Sopenharmony_ci *
6462306a36Sopenharmony_ci * Usually this function is called by platforms without pinctrl driver support
6562306a36Sopenharmony_ci * but run with some shared drivers using pinctrl APIs.
6662306a36Sopenharmony_ci * After calling this function, the pinctrl core will return successfully
6762306a36Sopenharmony_ci * with creating a dummy state for the driver to keep going smoothly.
6862306a36Sopenharmony_ci */
6962306a36Sopenharmony_civoid pinctrl_provide_dummies(void)
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	pinctrl_dummy_state = true;
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ciconst char *pinctrl_dev_get_name(struct pinctrl_dev *pctldev)
7562306a36Sopenharmony_ci{
7662306a36Sopenharmony_ci	/* We're not allowed to register devices without name */
7762306a36Sopenharmony_ci	return pctldev->desc->name;
7862306a36Sopenharmony_ci}
7962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_dev_get_name);
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciconst char *pinctrl_dev_get_devname(struct pinctrl_dev *pctldev)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	return dev_name(pctldev->dev);
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_dev_get_devname);
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_civoid *pinctrl_dev_get_drvdata(struct pinctrl_dev *pctldev)
8862306a36Sopenharmony_ci{
8962306a36Sopenharmony_ci	return pctldev->driver_data;
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_dev_get_drvdata);
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/**
9462306a36Sopenharmony_ci * get_pinctrl_dev_from_devname() - look up pin controller device
9562306a36Sopenharmony_ci * @devname: the name of a device instance, as returned by dev_name()
9662306a36Sopenharmony_ci *
9762306a36Sopenharmony_ci * Looks up a pin control device matching a certain device name or pure device
9862306a36Sopenharmony_ci * pointer, the pure device pointer will take precedence.
9962306a36Sopenharmony_ci */
10062306a36Sopenharmony_cistruct pinctrl_dev *get_pinctrl_dev_from_devname(const char *devname)
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	if (!devname)
10562306a36Sopenharmony_ci		return NULL;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	mutex_lock(&pinctrldev_list_mutex);
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	list_for_each_entry(pctldev, &pinctrldev_list, node) {
11062306a36Sopenharmony_ci		if (!strcmp(dev_name(pctldev->dev), devname)) {
11162306a36Sopenharmony_ci			/* Matched on device name */
11262306a36Sopenharmony_ci			mutex_unlock(&pinctrldev_list_mutex);
11362306a36Sopenharmony_ci			return pctldev;
11462306a36Sopenharmony_ci		}
11562306a36Sopenharmony_ci	}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	mutex_unlock(&pinctrldev_list_mutex);
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci	return NULL;
12062306a36Sopenharmony_ci}
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistruct pinctrl_dev *get_pinctrl_dev_from_of_node(struct device_node *np)
12362306a36Sopenharmony_ci{
12462306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	mutex_lock(&pinctrldev_list_mutex);
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	list_for_each_entry(pctldev, &pinctrldev_list, node)
12962306a36Sopenharmony_ci		if (device_match_of_node(pctldev->dev, np)) {
13062306a36Sopenharmony_ci			mutex_unlock(&pinctrldev_list_mutex);
13162306a36Sopenharmony_ci			return pctldev;
13262306a36Sopenharmony_ci		}
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	mutex_unlock(&pinctrldev_list_mutex);
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_ci	return NULL;
13762306a36Sopenharmony_ci}
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci/**
14062306a36Sopenharmony_ci * pin_get_from_name() - look up a pin number from a name
14162306a36Sopenharmony_ci * @pctldev: the pin control device to lookup the pin on
14262306a36Sopenharmony_ci * @name: the name of the pin to look up
14362306a36Sopenharmony_ci */
14462306a36Sopenharmony_ciint pin_get_from_name(struct pinctrl_dev *pctldev, const char *name)
14562306a36Sopenharmony_ci{
14662306a36Sopenharmony_ci	unsigned i, pin;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	/* The pin number can be retrived from the pin controller descriptor */
14962306a36Sopenharmony_ci	for (i = 0; i < pctldev->desc->npins; i++) {
15062306a36Sopenharmony_ci		struct pin_desc *desc;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci		pin = pctldev->desc->pins[i].number;
15362306a36Sopenharmony_ci		desc = pin_desc_get(pctldev, pin);
15462306a36Sopenharmony_ci		/* Pin space may be sparse */
15562306a36Sopenharmony_ci		if (desc && !strcmp(name, desc->name))
15662306a36Sopenharmony_ci			return pin;
15762306a36Sopenharmony_ci	}
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	return -EINVAL;
16062306a36Sopenharmony_ci}
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci/**
16362306a36Sopenharmony_ci * pin_get_name() - look up a pin name from a pin id
16462306a36Sopenharmony_ci * @pctldev: the pin control device to lookup the pin on
16562306a36Sopenharmony_ci * @pin: pin number/id to look up
16662306a36Sopenharmony_ci */
16762306a36Sopenharmony_ciconst char *pin_get_name(struct pinctrl_dev *pctldev, const unsigned pin)
16862306a36Sopenharmony_ci{
16962306a36Sopenharmony_ci	const struct pin_desc *desc;
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci	desc = pin_desc_get(pctldev, pin);
17262306a36Sopenharmony_ci	if (!desc) {
17362306a36Sopenharmony_ci		dev_err(pctldev->dev, "failed to get pin(%d) name\n",
17462306a36Sopenharmony_ci			pin);
17562306a36Sopenharmony_ci		return NULL;
17662306a36Sopenharmony_ci	}
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci	return desc->name;
17962306a36Sopenharmony_ci}
18062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pin_get_name);
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci/* Deletes a range of pin descriptors */
18362306a36Sopenharmony_cistatic void pinctrl_free_pindescs(struct pinctrl_dev *pctldev,
18462306a36Sopenharmony_ci				  const struct pinctrl_pin_desc *pins,
18562306a36Sopenharmony_ci				  unsigned num_pins)
18662306a36Sopenharmony_ci{
18762306a36Sopenharmony_ci	int i;
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	for (i = 0; i < num_pins; i++) {
19062306a36Sopenharmony_ci		struct pin_desc *pindesc;
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci		pindesc = radix_tree_lookup(&pctldev->pin_desc_tree,
19362306a36Sopenharmony_ci					    pins[i].number);
19462306a36Sopenharmony_ci		if (pindesc) {
19562306a36Sopenharmony_ci			radix_tree_delete(&pctldev->pin_desc_tree,
19662306a36Sopenharmony_ci					  pins[i].number);
19762306a36Sopenharmony_ci			if (pindesc->dynamic_name)
19862306a36Sopenharmony_ci				kfree(pindesc->name);
19962306a36Sopenharmony_ci		}
20062306a36Sopenharmony_ci		kfree(pindesc);
20162306a36Sopenharmony_ci	}
20262306a36Sopenharmony_ci}
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_cistatic int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
20562306a36Sopenharmony_ci				    const struct pinctrl_pin_desc *pin)
20662306a36Sopenharmony_ci{
20762306a36Sopenharmony_ci	struct pin_desc *pindesc;
20862306a36Sopenharmony_ci	int error;
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	pindesc = pin_desc_get(pctldev, pin->number);
21162306a36Sopenharmony_ci	if (pindesc) {
21262306a36Sopenharmony_ci		dev_err(pctldev->dev, "pin %d already registered\n",
21362306a36Sopenharmony_ci			pin->number);
21462306a36Sopenharmony_ci		return -EINVAL;
21562306a36Sopenharmony_ci	}
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	pindesc = kzalloc(sizeof(*pindesc), GFP_KERNEL);
21862306a36Sopenharmony_ci	if (!pindesc)
21962306a36Sopenharmony_ci		return -ENOMEM;
22062306a36Sopenharmony_ci
22162306a36Sopenharmony_ci	/* Set owner */
22262306a36Sopenharmony_ci	pindesc->pctldev = pctldev;
22362306a36Sopenharmony_ci
22462306a36Sopenharmony_ci	/* Copy basic pin info */
22562306a36Sopenharmony_ci	if (pin->name) {
22662306a36Sopenharmony_ci		pindesc->name = pin->name;
22762306a36Sopenharmony_ci	} else {
22862306a36Sopenharmony_ci		pindesc->name = kasprintf(GFP_KERNEL, "PIN%u", pin->number);
22962306a36Sopenharmony_ci		if (!pindesc->name) {
23062306a36Sopenharmony_ci			error = -ENOMEM;
23162306a36Sopenharmony_ci			goto failed;
23262306a36Sopenharmony_ci		}
23362306a36Sopenharmony_ci		pindesc->dynamic_name = true;
23462306a36Sopenharmony_ci	}
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	pindesc->drv_data = pin->drv_data;
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	error = radix_tree_insert(&pctldev->pin_desc_tree, pin->number, pindesc);
23962306a36Sopenharmony_ci	if (error)
24062306a36Sopenharmony_ci		goto failed;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	pr_debug("registered pin %d (%s) on %s\n",
24362306a36Sopenharmony_ci		 pin->number, pindesc->name, pctldev->desc->name);
24462306a36Sopenharmony_ci	return 0;
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_cifailed:
24762306a36Sopenharmony_ci	kfree(pindesc);
24862306a36Sopenharmony_ci	return error;
24962306a36Sopenharmony_ci}
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_cistatic int pinctrl_register_pins(struct pinctrl_dev *pctldev,
25262306a36Sopenharmony_ci				 const struct pinctrl_pin_desc *pins,
25362306a36Sopenharmony_ci				 unsigned num_descs)
25462306a36Sopenharmony_ci{
25562306a36Sopenharmony_ci	unsigned i;
25662306a36Sopenharmony_ci	int ret = 0;
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci	for (i = 0; i < num_descs; i++) {
25962306a36Sopenharmony_ci		ret = pinctrl_register_one_pin(pctldev, &pins[i]);
26062306a36Sopenharmony_ci		if (ret)
26162306a36Sopenharmony_ci			return ret;
26262306a36Sopenharmony_ci	}
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci	return 0;
26562306a36Sopenharmony_ci}
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci/**
26862306a36Sopenharmony_ci * gpio_to_pin() - GPIO range GPIO number to pin number translation
26962306a36Sopenharmony_ci * @range: GPIO range used for the translation
27062306a36Sopenharmony_ci * @gpio: gpio pin to translate to a pin number
27162306a36Sopenharmony_ci *
27262306a36Sopenharmony_ci * Finds the pin number for a given GPIO using the specified GPIO range
27362306a36Sopenharmony_ci * as a base for translation. The distinction between linear GPIO ranges
27462306a36Sopenharmony_ci * and pin list based GPIO ranges is managed correctly by this function.
27562306a36Sopenharmony_ci *
27662306a36Sopenharmony_ci * This function assumes the gpio is part of the specified GPIO range, use
27762306a36Sopenharmony_ci * only after making sure this is the case (e.g. by calling it on the
27862306a36Sopenharmony_ci * result of successful pinctrl_get_device_gpio_range calls)!
27962306a36Sopenharmony_ci */
28062306a36Sopenharmony_cistatic inline int gpio_to_pin(struct pinctrl_gpio_range *range,
28162306a36Sopenharmony_ci				unsigned int gpio)
28262306a36Sopenharmony_ci{
28362306a36Sopenharmony_ci	unsigned int offset = gpio - range->base;
28462306a36Sopenharmony_ci	if (range->pins)
28562306a36Sopenharmony_ci		return range->pins[offset];
28662306a36Sopenharmony_ci	else
28762306a36Sopenharmony_ci		return range->pin_base + offset;
28862306a36Sopenharmony_ci}
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci/**
29162306a36Sopenharmony_ci * pinctrl_match_gpio_range() - check if a certain GPIO pin is in range
29262306a36Sopenharmony_ci * @pctldev: pin controller device to check
29362306a36Sopenharmony_ci * @gpio: gpio pin to check taken from the global GPIO pin space
29462306a36Sopenharmony_ci *
29562306a36Sopenharmony_ci * Tries to match a GPIO pin number to the ranges handled by a certain pin
29662306a36Sopenharmony_ci * controller, return the range or NULL
29762306a36Sopenharmony_ci */
29862306a36Sopenharmony_cistatic struct pinctrl_gpio_range *
29962306a36Sopenharmony_cipinctrl_match_gpio_range(struct pinctrl_dev *pctldev, unsigned gpio)
30062306a36Sopenharmony_ci{
30162306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
30462306a36Sopenharmony_ci	/* Loop over the ranges */
30562306a36Sopenharmony_ci	list_for_each_entry(range, &pctldev->gpio_ranges, node) {
30662306a36Sopenharmony_ci		/* Check if we're in the valid range */
30762306a36Sopenharmony_ci		if (gpio >= range->base &&
30862306a36Sopenharmony_ci		    gpio < range->base + range->npins) {
30962306a36Sopenharmony_ci			mutex_unlock(&pctldev->mutex);
31062306a36Sopenharmony_ci			return range;
31162306a36Sopenharmony_ci		}
31262306a36Sopenharmony_ci	}
31362306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
31462306a36Sopenharmony_ci	return NULL;
31562306a36Sopenharmony_ci}
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci/**
31862306a36Sopenharmony_ci * pinctrl_ready_for_gpio_range() - check if other GPIO pins of
31962306a36Sopenharmony_ci * the same GPIO chip are in range
32062306a36Sopenharmony_ci * @gpio: gpio pin to check taken from the global GPIO pin space
32162306a36Sopenharmony_ci *
32262306a36Sopenharmony_ci * This function is complement of pinctrl_match_gpio_range(). If the return
32362306a36Sopenharmony_ci * value of pinctrl_match_gpio_range() is NULL, this function could be used
32462306a36Sopenharmony_ci * to check whether pinctrl device is ready or not. Maybe some GPIO pins
32562306a36Sopenharmony_ci * of the same GPIO chip don't have back-end pinctrl interface.
32662306a36Sopenharmony_ci * If the return value is true, it means that pinctrl device is ready & the
32762306a36Sopenharmony_ci * certain GPIO pin doesn't have back-end pinctrl device. If the return value
32862306a36Sopenharmony_ci * is false, it means that pinctrl device may not be ready.
32962306a36Sopenharmony_ci */
33062306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB
33162306a36Sopenharmony_cistatic bool pinctrl_ready_for_gpio_range(unsigned gpio)
33262306a36Sopenharmony_ci{
33362306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
33462306a36Sopenharmony_ci	struct pinctrl_gpio_range *range = NULL;
33562306a36Sopenharmony_ci	/*
33662306a36Sopenharmony_ci	 * FIXME: "gpio" here is a number in the global GPIO numberspace.
33762306a36Sopenharmony_ci	 * get rid of this from the ranges eventually and get the GPIO
33862306a36Sopenharmony_ci	 * descriptor from the gpio_chip.
33962306a36Sopenharmony_ci	 */
34062306a36Sopenharmony_ci	struct gpio_chip *chip = gpiod_to_chip(gpio_to_desc(gpio));
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	if (WARN(!chip, "no gpio_chip for gpio%i?", gpio))
34362306a36Sopenharmony_ci		return false;
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	mutex_lock(&pinctrldev_list_mutex);
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	/* Loop over the pin controllers */
34862306a36Sopenharmony_ci	list_for_each_entry(pctldev, &pinctrldev_list, node) {
34962306a36Sopenharmony_ci		/* Loop over the ranges */
35062306a36Sopenharmony_ci		mutex_lock(&pctldev->mutex);
35162306a36Sopenharmony_ci		list_for_each_entry(range, &pctldev->gpio_ranges, node) {
35262306a36Sopenharmony_ci			/* Check if any gpio range overlapped with gpio chip */
35362306a36Sopenharmony_ci			if (range->base + range->npins - 1 < chip->base ||
35462306a36Sopenharmony_ci			    range->base > chip->base + chip->ngpio - 1)
35562306a36Sopenharmony_ci				continue;
35662306a36Sopenharmony_ci			mutex_unlock(&pctldev->mutex);
35762306a36Sopenharmony_ci			mutex_unlock(&pinctrldev_list_mutex);
35862306a36Sopenharmony_ci			return true;
35962306a36Sopenharmony_ci		}
36062306a36Sopenharmony_ci		mutex_unlock(&pctldev->mutex);
36162306a36Sopenharmony_ci	}
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci	mutex_unlock(&pinctrldev_list_mutex);
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	return false;
36662306a36Sopenharmony_ci}
36762306a36Sopenharmony_ci#else
36862306a36Sopenharmony_cistatic bool pinctrl_ready_for_gpio_range(unsigned gpio) { return true; }
36962306a36Sopenharmony_ci#endif
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci/**
37262306a36Sopenharmony_ci * pinctrl_get_device_gpio_range() - find device for GPIO range
37362306a36Sopenharmony_ci * @gpio: the pin to locate the pin controller for
37462306a36Sopenharmony_ci * @outdev: the pin control device if found
37562306a36Sopenharmony_ci * @outrange: the GPIO range if found
37662306a36Sopenharmony_ci *
37762306a36Sopenharmony_ci * Find the pin controller handling a certain GPIO pin from the pinspace of
37862306a36Sopenharmony_ci * the GPIO subsystem, return the device and the matching GPIO range. Returns
37962306a36Sopenharmony_ci * -EPROBE_DEFER if the GPIO range could not be found in any device since it
38062306a36Sopenharmony_ci * may still have not been registered.
38162306a36Sopenharmony_ci */
38262306a36Sopenharmony_cistatic int pinctrl_get_device_gpio_range(unsigned gpio,
38362306a36Sopenharmony_ci					 struct pinctrl_dev **outdev,
38462306a36Sopenharmony_ci					 struct pinctrl_gpio_range **outrange)
38562306a36Sopenharmony_ci{
38662306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci	mutex_lock(&pinctrldev_list_mutex);
38962306a36Sopenharmony_ci
39062306a36Sopenharmony_ci	/* Loop over the pin controllers */
39162306a36Sopenharmony_ci	list_for_each_entry(pctldev, &pinctrldev_list, node) {
39262306a36Sopenharmony_ci		struct pinctrl_gpio_range *range;
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci		range = pinctrl_match_gpio_range(pctldev, gpio);
39562306a36Sopenharmony_ci		if (range) {
39662306a36Sopenharmony_ci			*outdev = pctldev;
39762306a36Sopenharmony_ci			*outrange = range;
39862306a36Sopenharmony_ci			mutex_unlock(&pinctrldev_list_mutex);
39962306a36Sopenharmony_ci			return 0;
40062306a36Sopenharmony_ci		}
40162306a36Sopenharmony_ci	}
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci	mutex_unlock(&pinctrldev_list_mutex);
40462306a36Sopenharmony_ci
40562306a36Sopenharmony_ci	return -EPROBE_DEFER;
40662306a36Sopenharmony_ci}
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci/**
40962306a36Sopenharmony_ci * pinctrl_add_gpio_range() - register a GPIO range for a controller
41062306a36Sopenharmony_ci * @pctldev: pin controller device to add the range to
41162306a36Sopenharmony_ci * @range: the GPIO range to add
41262306a36Sopenharmony_ci *
41362306a36Sopenharmony_ci * This adds a range of GPIOs to be handled by a certain pin controller. Call
41462306a36Sopenharmony_ci * this to register handled ranges after registering your pin controller.
41562306a36Sopenharmony_ci */
41662306a36Sopenharmony_civoid pinctrl_add_gpio_range(struct pinctrl_dev *pctldev,
41762306a36Sopenharmony_ci			    struct pinctrl_gpio_range *range)
41862306a36Sopenharmony_ci{
41962306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
42062306a36Sopenharmony_ci	list_add_tail(&range->node, &pctldev->gpio_ranges);
42162306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
42262306a36Sopenharmony_ci}
42362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_add_gpio_range);
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_civoid pinctrl_add_gpio_ranges(struct pinctrl_dev *pctldev,
42662306a36Sopenharmony_ci			     struct pinctrl_gpio_range *ranges,
42762306a36Sopenharmony_ci			     unsigned nranges)
42862306a36Sopenharmony_ci{
42962306a36Sopenharmony_ci	int i;
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci	for (i = 0; i < nranges; i++)
43262306a36Sopenharmony_ci		pinctrl_add_gpio_range(pctldev, &ranges[i]);
43362306a36Sopenharmony_ci}
43462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_add_gpio_ranges);
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_cistruct pinctrl_dev *pinctrl_find_and_add_gpio_range(const char *devname,
43762306a36Sopenharmony_ci		struct pinctrl_gpio_range *range)
43862306a36Sopenharmony_ci{
43962306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci	pctldev = get_pinctrl_dev_from_devname(devname);
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	/*
44462306a36Sopenharmony_ci	 * If we can't find this device, let's assume that is because
44562306a36Sopenharmony_ci	 * it has not probed yet, so the driver trying to register this
44662306a36Sopenharmony_ci	 * range need to defer probing.
44762306a36Sopenharmony_ci	 */
44862306a36Sopenharmony_ci	if (!pctldev) {
44962306a36Sopenharmony_ci		return ERR_PTR(-EPROBE_DEFER);
45062306a36Sopenharmony_ci	}
45162306a36Sopenharmony_ci	pinctrl_add_gpio_range(pctldev, range);
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	return pctldev;
45462306a36Sopenharmony_ci}
45562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_find_and_add_gpio_range);
45662306a36Sopenharmony_ci
45762306a36Sopenharmony_ciint pinctrl_get_group_pins(struct pinctrl_dev *pctldev, const char *pin_group,
45862306a36Sopenharmony_ci				const unsigned **pins, unsigned *num_pins)
45962306a36Sopenharmony_ci{
46062306a36Sopenharmony_ci	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
46162306a36Sopenharmony_ci	int gs;
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ci	if (!pctlops->get_group_pins)
46462306a36Sopenharmony_ci		return -EINVAL;
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci	gs = pinctrl_get_group_selector(pctldev, pin_group);
46762306a36Sopenharmony_ci	if (gs < 0)
46862306a36Sopenharmony_ci		return gs;
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci	return pctlops->get_group_pins(pctldev, gs, pins, num_pins);
47162306a36Sopenharmony_ci}
47262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_get_group_pins);
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_cistruct pinctrl_gpio_range *
47562306a36Sopenharmony_cipinctrl_find_gpio_range_from_pin_nolock(struct pinctrl_dev *pctldev,
47662306a36Sopenharmony_ci					unsigned int pin)
47762306a36Sopenharmony_ci{
47862306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_ci	/* Loop over the ranges */
48162306a36Sopenharmony_ci	list_for_each_entry(range, &pctldev->gpio_ranges, node) {
48262306a36Sopenharmony_ci		/* Check if we're in the valid range */
48362306a36Sopenharmony_ci		if (range->pins) {
48462306a36Sopenharmony_ci			int a;
48562306a36Sopenharmony_ci			for (a = 0; a < range->npins; a++) {
48662306a36Sopenharmony_ci				if (range->pins[a] == pin)
48762306a36Sopenharmony_ci					return range;
48862306a36Sopenharmony_ci			}
48962306a36Sopenharmony_ci		} else if (pin >= range->pin_base &&
49062306a36Sopenharmony_ci			   pin < range->pin_base + range->npins)
49162306a36Sopenharmony_ci			return range;
49262306a36Sopenharmony_ci	}
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci	return NULL;
49562306a36Sopenharmony_ci}
49662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin_nolock);
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci/**
49962306a36Sopenharmony_ci * pinctrl_find_gpio_range_from_pin() - locate the GPIO range for a pin
50062306a36Sopenharmony_ci * @pctldev: the pin controller device to look in
50162306a36Sopenharmony_ci * @pin: a controller-local number to find the range for
50262306a36Sopenharmony_ci */
50362306a36Sopenharmony_cistruct pinctrl_gpio_range *
50462306a36Sopenharmony_cipinctrl_find_gpio_range_from_pin(struct pinctrl_dev *pctldev,
50562306a36Sopenharmony_ci				 unsigned int pin)
50662306a36Sopenharmony_ci{
50762306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
51062306a36Sopenharmony_ci	range = pinctrl_find_gpio_range_from_pin_nolock(pctldev, pin);
51162306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci	return range;
51462306a36Sopenharmony_ci}
51562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_find_gpio_range_from_pin);
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci/**
51862306a36Sopenharmony_ci * pinctrl_remove_gpio_range() - remove a range of GPIOs from a pin controller
51962306a36Sopenharmony_ci * @pctldev: pin controller device to remove the range from
52062306a36Sopenharmony_ci * @range: the GPIO range to remove
52162306a36Sopenharmony_ci */
52262306a36Sopenharmony_civoid pinctrl_remove_gpio_range(struct pinctrl_dev *pctldev,
52362306a36Sopenharmony_ci			       struct pinctrl_gpio_range *range)
52462306a36Sopenharmony_ci{
52562306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
52662306a36Sopenharmony_ci	list_del(&range->node);
52762306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
52862306a36Sopenharmony_ci}
52962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_remove_gpio_range);
53062306a36Sopenharmony_ci
53162306a36Sopenharmony_ci#ifdef CONFIG_GENERIC_PINCTRL_GROUPS
53262306a36Sopenharmony_ci
53362306a36Sopenharmony_ci/**
53462306a36Sopenharmony_ci * pinctrl_generic_get_group_count() - returns the number of pin groups
53562306a36Sopenharmony_ci * @pctldev: pin controller device
53662306a36Sopenharmony_ci */
53762306a36Sopenharmony_ciint pinctrl_generic_get_group_count(struct pinctrl_dev *pctldev)
53862306a36Sopenharmony_ci{
53962306a36Sopenharmony_ci	return pctldev->num_groups;
54062306a36Sopenharmony_ci}
54162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_generic_get_group_count);
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci/**
54462306a36Sopenharmony_ci * pinctrl_generic_get_group_name() - returns the name of a pin group
54562306a36Sopenharmony_ci * @pctldev: pin controller device
54662306a36Sopenharmony_ci * @selector: group number
54762306a36Sopenharmony_ci */
54862306a36Sopenharmony_ciconst char *pinctrl_generic_get_group_name(struct pinctrl_dev *pctldev,
54962306a36Sopenharmony_ci					   unsigned int selector)
55062306a36Sopenharmony_ci{
55162306a36Sopenharmony_ci	struct group_desc *group;
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_ci	group = radix_tree_lookup(&pctldev->pin_group_tree,
55462306a36Sopenharmony_ci				  selector);
55562306a36Sopenharmony_ci	if (!group)
55662306a36Sopenharmony_ci		return NULL;
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci	return group->name;
55962306a36Sopenharmony_ci}
56062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_generic_get_group_name);
56162306a36Sopenharmony_ci
56262306a36Sopenharmony_ci/**
56362306a36Sopenharmony_ci * pinctrl_generic_get_group_pins() - gets the pin group pins
56462306a36Sopenharmony_ci * @pctldev: pin controller device
56562306a36Sopenharmony_ci * @selector: group number
56662306a36Sopenharmony_ci * @pins: pins in the group
56762306a36Sopenharmony_ci * @num_pins: number of pins in the group
56862306a36Sopenharmony_ci */
56962306a36Sopenharmony_ciint pinctrl_generic_get_group_pins(struct pinctrl_dev *pctldev,
57062306a36Sopenharmony_ci				   unsigned int selector,
57162306a36Sopenharmony_ci				   const unsigned int **pins,
57262306a36Sopenharmony_ci				   unsigned int *num_pins)
57362306a36Sopenharmony_ci{
57462306a36Sopenharmony_ci	struct group_desc *group;
57562306a36Sopenharmony_ci
57662306a36Sopenharmony_ci	group = radix_tree_lookup(&pctldev->pin_group_tree,
57762306a36Sopenharmony_ci				  selector);
57862306a36Sopenharmony_ci	if (!group) {
57962306a36Sopenharmony_ci		dev_err(pctldev->dev, "%s could not find pingroup%i\n",
58062306a36Sopenharmony_ci			__func__, selector);
58162306a36Sopenharmony_ci		return -EINVAL;
58262306a36Sopenharmony_ci	}
58362306a36Sopenharmony_ci
58462306a36Sopenharmony_ci	*pins = group->pins;
58562306a36Sopenharmony_ci	*num_pins = group->num_pins;
58662306a36Sopenharmony_ci
58762306a36Sopenharmony_ci	return 0;
58862306a36Sopenharmony_ci}
58962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_generic_get_group_pins);
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_ci/**
59262306a36Sopenharmony_ci * pinctrl_generic_get_group() - returns a pin group based on the number
59362306a36Sopenharmony_ci * @pctldev: pin controller device
59462306a36Sopenharmony_ci * @selector: group number
59562306a36Sopenharmony_ci */
59662306a36Sopenharmony_cistruct group_desc *pinctrl_generic_get_group(struct pinctrl_dev *pctldev,
59762306a36Sopenharmony_ci					     unsigned int selector)
59862306a36Sopenharmony_ci{
59962306a36Sopenharmony_ci	struct group_desc *group;
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ci	group = radix_tree_lookup(&pctldev->pin_group_tree,
60262306a36Sopenharmony_ci				  selector);
60362306a36Sopenharmony_ci	if (!group)
60462306a36Sopenharmony_ci		return NULL;
60562306a36Sopenharmony_ci
60662306a36Sopenharmony_ci	return group;
60762306a36Sopenharmony_ci}
60862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_generic_get_group);
60962306a36Sopenharmony_ci
61062306a36Sopenharmony_cistatic int pinctrl_generic_group_name_to_selector(struct pinctrl_dev *pctldev,
61162306a36Sopenharmony_ci						  const char *function)
61262306a36Sopenharmony_ci{
61362306a36Sopenharmony_ci	const struct pinctrl_ops *ops = pctldev->desc->pctlops;
61462306a36Sopenharmony_ci	int ngroups = ops->get_groups_count(pctldev);
61562306a36Sopenharmony_ci	int selector = 0;
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_ci	/* See if this pctldev has this group */
61862306a36Sopenharmony_ci	while (selector < ngroups) {
61962306a36Sopenharmony_ci		const char *gname = ops->get_group_name(pctldev, selector);
62062306a36Sopenharmony_ci
62162306a36Sopenharmony_ci		if (gname && !strcmp(function, gname))
62262306a36Sopenharmony_ci			return selector;
62362306a36Sopenharmony_ci
62462306a36Sopenharmony_ci		selector++;
62562306a36Sopenharmony_ci	}
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ci	return -EINVAL;
62862306a36Sopenharmony_ci}
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci/**
63162306a36Sopenharmony_ci * pinctrl_generic_add_group() - adds a new pin group
63262306a36Sopenharmony_ci * @pctldev: pin controller device
63362306a36Sopenharmony_ci * @name: name of the pin group
63462306a36Sopenharmony_ci * @pins: pins in the pin group
63562306a36Sopenharmony_ci * @num_pins: number of pins in the pin group
63662306a36Sopenharmony_ci * @data: pin controller driver specific data
63762306a36Sopenharmony_ci *
63862306a36Sopenharmony_ci * Note that the caller must take care of locking.
63962306a36Sopenharmony_ci */
64062306a36Sopenharmony_ciint pinctrl_generic_add_group(struct pinctrl_dev *pctldev, const char *name,
64162306a36Sopenharmony_ci			      int *pins, int num_pins, void *data)
64262306a36Sopenharmony_ci{
64362306a36Sopenharmony_ci	struct group_desc *group;
64462306a36Sopenharmony_ci	int selector, error;
64562306a36Sopenharmony_ci
64662306a36Sopenharmony_ci	if (!name)
64762306a36Sopenharmony_ci		return -EINVAL;
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci	selector = pinctrl_generic_group_name_to_selector(pctldev, name);
65062306a36Sopenharmony_ci	if (selector >= 0)
65162306a36Sopenharmony_ci		return selector;
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci	selector = pctldev->num_groups;
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_ci	group = devm_kzalloc(pctldev->dev, sizeof(*group), GFP_KERNEL);
65662306a36Sopenharmony_ci	if (!group)
65762306a36Sopenharmony_ci		return -ENOMEM;
65862306a36Sopenharmony_ci
65962306a36Sopenharmony_ci	group->name = name;
66062306a36Sopenharmony_ci	group->pins = pins;
66162306a36Sopenharmony_ci	group->num_pins = num_pins;
66262306a36Sopenharmony_ci	group->data = data;
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci	error = radix_tree_insert(&pctldev->pin_group_tree, selector, group);
66562306a36Sopenharmony_ci	if (error)
66662306a36Sopenharmony_ci		return error;
66762306a36Sopenharmony_ci
66862306a36Sopenharmony_ci	pctldev->num_groups++;
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci	return selector;
67162306a36Sopenharmony_ci}
67262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_generic_add_group);
67362306a36Sopenharmony_ci
67462306a36Sopenharmony_ci/**
67562306a36Sopenharmony_ci * pinctrl_generic_remove_group() - removes a numbered pin group
67662306a36Sopenharmony_ci * @pctldev: pin controller device
67762306a36Sopenharmony_ci * @selector: group number
67862306a36Sopenharmony_ci *
67962306a36Sopenharmony_ci * Note that the caller must take care of locking.
68062306a36Sopenharmony_ci */
68162306a36Sopenharmony_ciint pinctrl_generic_remove_group(struct pinctrl_dev *pctldev,
68262306a36Sopenharmony_ci				 unsigned int selector)
68362306a36Sopenharmony_ci{
68462306a36Sopenharmony_ci	struct group_desc *group;
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_ci	group = radix_tree_lookup(&pctldev->pin_group_tree,
68762306a36Sopenharmony_ci				  selector);
68862306a36Sopenharmony_ci	if (!group)
68962306a36Sopenharmony_ci		return -ENOENT;
69062306a36Sopenharmony_ci
69162306a36Sopenharmony_ci	radix_tree_delete(&pctldev->pin_group_tree, selector);
69262306a36Sopenharmony_ci	devm_kfree(pctldev->dev, group);
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ci	pctldev->num_groups--;
69562306a36Sopenharmony_ci
69662306a36Sopenharmony_ci	return 0;
69762306a36Sopenharmony_ci}
69862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_generic_remove_group);
69962306a36Sopenharmony_ci
70062306a36Sopenharmony_ci/**
70162306a36Sopenharmony_ci * pinctrl_generic_free_groups() - removes all pin groups
70262306a36Sopenharmony_ci * @pctldev: pin controller device
70362306a36Sopenharmony_ci *
70462306a36Sopenharmony_ci * Note that the caller must take care of locking. The pinctrl groups
70562306a36Sopenharmony_ci * are allocated with devm_kzalloc() so no need to free them here.
70662306a36Sopenharmony_ci */
70762306a36Sopenharmony_cistatic void pinctrl_generic_free_groups(struct pinctrl_dev *pctldev)
70862306a36Sopenharmony_ci{
70962306a36Sopenharmony_ci	struct radix_tree_iter iter;
71062306a36Sopenharmony_ci	void __rcu **slot;
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_ci	radix_tree_for_each_slot(slot, &pctldev->pin_group_tree, &iter, 0)
71362306a36Sopenharmony_ci		radix_tree_delete(&pctldev->pin_group_tree, iter.index);
71462306a36Sopenharmony_ci
71562306a36Sopenharmony_ci	pctldev->num_groups = 0;
71662306a36Sopenharmony_ci}
71762306a36Sopenharmony_ci
71862306a36Sopenharmony_ci#else
71962306a36Sopenharmony_cistatic inline void pinctrl_generic_free_groups(struct pinctrl_dev *pctldev)
72062306a36Sopenharmony_ci{
72162306a36Sopenharmony_ci}
72262306a36Sopenharmony_ci#endif /* CONFIG_GENERIC_PINCTRL_GROUPS */
72362306a36Sopenharmony_ci
72462306a36Sopenharmony_ci/**
72562306a36Sopenharmony_ci * pinctrl_get_group_selector() - returns the group selector for a group
72662306a36Sopenharmony_ci * @pctldev: the pin controller handling the group
72762306a36Sopenharmony_ci * @pin_group: the pin group to look up
72862306a36Sopenharmony_ci */
72962306a36Sopenharmony_ciint pinctrl_get_group_selector(struct pinctrl_dev *pctldev,
73062306a36Sopenharmony_ci			       const char *pin_group)
73162306a36Sopenharmony_ci{
73262306a36Sopenharmony_ci	const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
73362306a36Sopenharmony_ci	unsigned ngroups = pctlops->get_groups_count(pctldev);
73462306a36Sopenharmony_ci	unsigned group_selector = 0;
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci	while (group_selector < ngroups) {
73762306a36Sopenharmony_ci		const char *gname = pctlops->get_group_name(pctldev,
73862306a36Sopenharmony_ci							    group_selector);
73962306a36Sopenharmony_ci		if (gname && !strcmp(gname, pin_group)) {
74062306a36Sopenharmony_ci			dev_dbg(pctldev->dev,
74162306a36Sopenharmony_ci				"found group selector %u for %s\n",
74262306a36Sopenharmony_ci				group_selector,
74362306a36Sopenharmony_ci				pin_group);
74462306a36Sopenharmony_ci			return group_selector;
74562306a36Sopenharmony_ci		}
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci		group_selector++;
74862306a36Sopenharmony_ci	}
74962306a36Sopenharmony_ci
75062306a36Sopenharmony_ci	dev_err(pctldev->dev, "does not have pin group %s\n",
75162306a36Sopenharmony_ci		pin_group);
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_ci	return -EINVAL;
75462306a36Sopenharmony_ci}
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_cibool pinctrl_gpio_can_use_line(unsigned gpio)
75762306a36Sopenharmony_ci{
75862306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
75962306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
76062306a36Sopenharmony_ci	bool result;
76162306a36Sopenharmony_ci	int pin;
76262306a36Sopenharmony_ci
76362306a36Sopenharmony_ci	/*
76462306a36Sopenharmony_ci	 * Try to obtain GPIO range, if it fails
76562306a36Sopenharmony_ci	 * we're probably dealing with GPIO driver
76662306a36Sopenharmony_ci	 * without a backing pin controller - bail out.
76762306a36Sopenharmony_ci	 */
76862306a36Sopenharmony_ci	if (pinctrl_get_device_gpio_range(gpio, &pctldev, &range))
76962306a36Sopenharmony_ci		return true;
77062306a36Sopenharmony_ci
77162306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci	/* Convert to the pin controllers number space */
77462306a36Sopenharmony_ci	pin = gpio_to_pin(range, gpio);
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci	result = pinmux_can_be_used_for_gpio(pctldev, pin);
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
77962306a36Sopenharmony_ci
78062306a36Sopenharmony_ci	return result;
78162306a36Sopenharmony_ci}
78262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_gpio_can_use_line);
78362306a36Sopenharmony_ci
78462306a36Sopenharmony_ci/**
78562306a36Sopenharmony_ci * pinctrl_gpio_request() - request a single pin to be used as GPIO
78662306a36Sopenharmony_ci * @gpio: the GPIO pin number from the GPIO subsystem number space
78762306a36Sopenharmony_ci *
78862306a36Sopenharmony_ci * This function should *ONLY* be used from gpiolib-based GPIO drivers,
78962306a36Sopenharmony_ci * as part of their gpio_request() semantics, platforms and individual drivers
79062306a36Sopenharmony_ci * shall *NOT* request GPIO pins to be muxed in.
79162306a36Sopenharmony_ci */
79262306a36Sopenharmony_ciint pinctrl_gpio_request(unsigned gpio)
79362306a36Sopenharmony_ci{
79462306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
79562306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
79662306a36Sopenharmony_ci	int ret;
79762306a36Sopenharmony_ci	int pin;
79862306a36Sopenharmony_ci
79962306a36Sopenharmony_ci	ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
80062306a36Sopenharmony_ci	if (ret) {
80162306a36Sopenharmony_ci		if (pinctrl_ready_for_gpio_range(gpio))
80262306a36Sopenharmony_ci			ret = 0;
80362306a36Sopenharmony_ci		return ret;
80462306a36Sopenharmony_ci	}
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci	/* Convert to the pin controllers number space */
80962306a36Sopenharmony_ci	pin = gpio_to_pin(range, gpio);
81062306a36Sopenharmony_ci
81162306a36Sopenharmony_ci	ret = pinmux_request_gpio(pctldev, range, pin, gpio);
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
81462306a36Sopenharmony_ci
81562306a36Sopenharmony_ci	return ret;
81662306a36Sopenharmony_ci}
81762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_gpio_request);
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_ci/**
82062306a36Sopenharmony_ci * pinctrl_gpio_free() - free control on a single pin, currently used as GPIO
82162306a36Sopenharmony_ci * @gpio: the GPIO pin number from the GPIO subsystem number space
82262306a36Sopenharmony_ci *
82362306a36Sopenharmony_ci * This function should *ONLY* be used from gpiolib-based GPIO drivers,
82462306a36Sopenharmony_ci * as part of their gpio_free() semantics, platforms and individual drivers
82562306a36Sopenharmony_ci * shall *NOT* request GPIO pins to be muxed out.
82662306a36Sopenharmony_ci */
82762306a36Sopenharmony_civoid pinctrl_gpio_free(unsigned gpio)
82862306a36Sopenharmony_ci{
82962306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
83062306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
83162306a36Sopenharmony_ci	int ret;
83262306a36Sopenharmony_ci	int pin;
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_ci	ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
83562306a36Sopenharmony_ci	if (ret) {
83662306a36Sopenharmony_ci		return;
83762306a36Sopenharmony_ci	}
83862306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
83962306a36Sopenharmony_ci
84062306a36Sopenharmony_ci	/* Convert to the pin controllers number space */
84162306a36Sopenharmony_ci	pin = gpio_to_pin(range, gpio);
84262306a36Sopenharmony_ci
84362306a36Sopenharmony_ci	pinmux_free_gpio(pctldev, pin, range);
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
84662306a36Sopenharmony_ci}
84762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_gpio_free);
84862306a36Sopenharmony_ci
84962306a36Sopenharmony_cistatic int pinctrl_gpio_direction(unsigned gpio, bool input)
85062306a36Sopenharmony_ci{
85162306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
85262306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
85362306a36Sopenharmony_ci	int ret;
85462306a36Sopenharmony_ci	int pin;
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ci	ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
85762306a36Sopenharmony_ci	if (ret) {
85862306a36Sopenharmony_ci		return ret;
85962306a36Sopenharmony_ci	}
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
86262306a36Sopenharmony_ci
86362306a36Sopenharmony_ci	/* Convert to the pin controllers number space */
86462306a36Sopenharmony_ci	pin = gpio_to_pin(range, gpio);
86562306a36Sopenharmony_ci	ret = pinmux_gpio_direction(pctldev, range, pin, input);
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
86862306a36Sopenharmony_ci
86962306a36Sopenharmony_ci	return ret;
87062306a36Sopenharmony_ci}
87162306a36Sopenharmony_ci
87262306a36Sopenharmony_ci/**
87362306a36Sopenharmony_ci * pinctrl_gpio_direction_input() - request a GPIO pin to go into input mode
87462306a36Sopenharmony_ci * @gpio: the GPIO pin number from the GPIO subsystem number space
87562306a36Sopenharmony_ci *
87662306a36Sopenharmony_ci * This function should *ONLY* be used from gpiolib-based GPIO drivers,
87762306a36Sopenharmony_ci * as part of their gpio_direction_input() semantics, platforms and individual
87862306a36Sopenharmony_ci * drivers shall *NOT* touch pin control GPIO calls.
87962306a36Sopenharmony_ci */
88062306a36Sopenharmony_ciint pinctrl_gpio_direction_input(unsigned gpio)
88162306a36Sopenharmony_ci{
88262306a36Sopenharmony_ci	return pinctrl_gpio_direction(gpio, true);
88362306a36Sopenharmony_ci}
88462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_gpio_direction_input);
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_ci/**
88762306a36Sopenharmony_ci * pinctrl_gpio_direction_output() - request a GPIO pin to go into output mode
88862306a36Sopenharmony_ci * @gpio: the GPIO pin number from the GPIO subsystem number space
88962306a36Sopenharmony_ci *
89062306a36Sopenharmony_ci * This function should *ONLY* be used from gpiolib-based GPIO drivers,
89162306a36Sopenharmony_ci * as part of their gpio_direction_output() semantics, platforms and individual
89262306a36Sopenharmony_ci * drivers shall *NOT* touch pin control GPIO calls.
89362306a36Sopenharmony_ci */
89462306a36Sopenharmony_ciint pinctrl_gpio_direction_output(unsigned gpio)
89562306a36Sopenharmony_ci{
89662306a36Sopenharmony_ci	return pinctrl_gpio_direction(gpio, false);
89762306a36Sopenharmony_ci}
89862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_gpio_direction_output);
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_ci/**
90162306a36Sopenharmony_ci * pinctrl_gpio_set_config() - Apply config to given GPIO pin
90262306a36Sopenharmony_ci * @gpio: the GPIO pin number from the GPIO subsystem number space
90362306a36Sopenharmony_ci * @config: the configuration to apply to the GPIO
90462306a36Sopenharmony_ci *
90562306a36Sopenharmony_ci * This function should *ONLY* be used from gpiolib-based GPIO drivers, if
90662306a36Sopenharmony_ci * they need to call the underlying pin controller to change GPIO config
90762306a36Sopenharmony_ci * (for example set debounce time).
90862306a36Sopenharmony_ci */
90962306a36Sopenharmony_ciint pinctrl_gpio_set_config(unsigned gpio, unsigned long config)
91062306a36Sopenharmony_ci{
91162306a36Sopenharmony_ci	unsigned long configs[] = { config };
91262306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
91362306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
91462306a36Sopenharmony_ci	int ret, pin;
91562306a36Sopenharmony_ci
91662306a36Sopenharmony_ci	ret = pinctrl_get_device_gpio_range(gpio, &pctldev, &range);
91762306a36Sopenharmony_ci	if (ret)
91862306a36Sopenharmony_ci		return ret;
91962306a36Sopenharmony_ci
92062306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
92162306a36Sopenharmony_ci	pin = gpio_to_pin(range, gpio);
92262306a36Sopenharmony_ci	ret = pinconf_set_config(pctldev, pin, configs, ARRAY_SIZE(configs));
92362306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
92462306a36Sopenharmony_ci
92562306a36Sopenharmony_ci	return ret;
92662306a36Sopenharmony_ci}
92762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_gpio_set_config);
92862306a36Sopenharmony_ci
92962306a36Sopenharmony_cistatic struct pinctrl_state *find_state(struct pinctrl *p,
93062306a36Sopenharmony_ci					const char *name)
93162306a36Sopenharmony_ci{
93262306a36Sopenharmony_ci	struct pinctrl_state *state;
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci	list_for_each_entry(state, &p->states, node)
93562306a36Sopenharmony_ci		if (!strcmp(state->name, name))
93662306a36Sopenharmony_ci			return state;
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci	return NULL;
93962306a36Sopenharmony_ci}
94062306a36Sopenharmony_ci
94162306a36Sopenharmony_cistatic struct pinctrl_state *create_state(struct pinctrl *p,
94262306a36Sopenharmony_ci					  const char *name)
94362306a36Sopenharmony_ci{
94462306a36Sopenharmony_ci	struct pinctrl_state *state;
94562306a36Sopenharmony_ci
94662306a36Sopenharmony_ci	state = kzalloc(sizeof(*state), GFP_KERNEL);
94762306a36Sopenharmony_ci	if (!state)
94862306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
94962306a36Sopenharmony_ci
95062306a36Sopenharmony_ci	state->name = name;
95162306a36Sopenharmony_ci	INIT_LIST_HEAD(&state->settings);
95262306a36Sopenharmony_ci
95362306a36Sopenharmony_ci	list_add_tail(&state->node, &p->states);
95462306a36Sopenharmony_ci
95562306a36Sopenharmony_ci	return state;
95662306a36Sopenharmony_ci}
95762306a36Sopenharmony_ci
95862306a36Sopenharmony_cistatic int add_setting(struct pinctrl *p, struct pinctrl_dev *pctldev,
95962306a36Sopenharmony_ci		       const struct pinctrl_map *map)
96062306a36Sopenharmony_ci{
96162306a36Sopenharmony_ci	struct pinctrl_state *state;
96262306a36Sopenharmony_ci	struct pinctrl_setting *setting;
96362306a36Sopenharmony_ci	int ret;
96462306a36Sopenharmony_ci
96562306a36Sopenharmony_ci	state = find_state(p, map->name);
96662306a36Sopenharmony_ci	if (!state)
96762306a36Sopenharmony_ci		state = create_state(p, map->name);
96862306a36Sopenharmony_ci	if (IS_ERR(state))
96962306a36Sopenharmony_ci		return PTR_ERR(state);
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci	if (map->type == PIN_MAP_TYPE_DUMMY_STATE)
97262306a36Sopenharmony_ci		return 0;
97362306a36Sopenharmony_ci
97462306a36Sopenharmony_ci	setting = kzalloc(sizeof(*setting), GFP_KERNEL);
97562306a36Sopenharmony_ci	if (!setting)
97662306a36Sopenharmony_ci		return -ENOMEM;
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_ci	setting->type = map->type;
97962306a36Sopenharmony_ci
98062306a36Sopenharmony_ci	if (pctldev)
98162306a36Sopenharmony_ci		setting->pctldev = pctldev;
98262306a36Sopenharmony_ci	else
98362306a36Sopenharmony_ci		setting->pctldev =
98462306a36Sopenharmony_ci			get_pinctrl_dev_from_devname(map->ctrl_dev_name);
98562306a36Sopenharmony_ci	if (!setting->pctldev) {
98662306a36Sopenharmony_ci		kfree(setting);
98762306a36Sopenharmony_ci		/* Do not defer probing of hogs (circular loop) */
98862306a36Sopenharmony_ci		if (!strcmp(map->ctrl_dev_name, map->dev_name))
98962306a36Sopenharmony_ci			return -ENODEV;
99062306a36Sopenharmony_ci		/*
99162306a36Sopenharmony_ci		 * OK let us guess that the driver is not there yet, and
99262306a36Sopenharmony_ci		 * let's defer obtaining this pinctrl handle to later...
99362306a36Sopenharmony_ci		 */
99462306a36Sopenharmony_ci		dev_info(p->dev, "unknown pinctrl device %s in map entry, deferring probe",
99562306a36Sopenharmony_ci			map->ctrl_dev_name);
99662306a36Sopenharmony_ci		return -EPROBE_DEFER;
99762306a36Sopenharmony_ci	}
99862306a36Sopenharmony_ci
99962306a36Sopenharmony_ci	setting->dev_name = map->dev_name;
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_ci	switch (map->type) {
100262306a36Sopenharmony_ci	case PIN_MAP_TYPE_MUX_GROUP:
100362306a36Sopenharmony_ci		ret = pinmux_map_to_setting(map, setting);
100462306a36Sopenharmony_ci		break;
100562306a36Sopenharmony_ci	case PIN_MAP_TYPE_CONFIGS_PIN:
100662306a36Sopenharmony_ci	case PIN_MAP_TYPE_CONFIGS_GROUP:
100762306a36Sopenharmony_ci		ret = pinconf_map_to_setting(map, setting);
100862306a36Sopenharmony_ci		break;
100962306a36Sopenharmony_ci	default:
101062306a36Sopenharmony_ci		ret = -EINVAL;
101162306a36Sopenharmony_ci		break;
101262306a36Sopenharmony_ci	}
101362306a36Sopenharmony_ci	if (ret < 0) {
101462306a36Sopenharmony_ci		kfree(setting);
101562306a36Sopenharmony_ci		return ret;
101662306a36Sopenharmony_ci	}
101762306a36Sopenharmony_ci
101862306a36Sopenharmony_ci	list_add_tail(&setting->node, &state->settings);
101962306a36Sopenharmony_ci
102062306a36Sopenharmony_ci	return 0;
102162306a36Sopenharmony_ci}
102262306a36Sopenharmony_ci
102362306a36Sopenharmony_cistatic struct pinctrl *find_pinctrl(struct device *dev)
102462306a36Sopenharmony_ci{
102562306a36Sopenharmony_ci	struct pinctrl *p;
102662306a36Sopenharmony_ci
102762306a36Sopenharmony_ci	mutex_lock(&pinctrl_list_mutex);
102862306a36Sopenharmony_ci	list_for_each_entry(p, &pinctrl_list, node)
102962306a36Sopenharmony_ci		if (p->dev == dev) {
103062306a36Sopenharmony_ci			mutex_unlock(&pinctrl_list_mutex);
103162306a36Sopenharmony_ci			return p;
103262306a36Sopenharmony_ci		}
103362306a36Sopenharmony_ci
103462306a36Sopenharmony_ci	mutex_unlock(&pinctrl_list_mutex);
103562306a36Sopenharmony_ci	return NULL;
103662306a36Sopenharmony_ci}
103762306a36Sopenharmony_ci
103862306a36Sopenharmony_cistatic void pinctrl_free(struct pinctrl *p, bool inlist);
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_cistatic struct pinctrl *create_pinctrl(struct device *dev,
104162306a36Sopenharmony_ci				      struct pinctrl_dev *pctldev)
104262306a36Sopenharmony_ci{
104362306a36Sopenharmony_ci	struct pinctrl *p;
104462306a36Sopenharmony_ci	const char *devname;
104562306a36Sopenharmony_ci	struct pinctrl_maps *maps_node;
104662306a36Sopenharmony_ci	const struct pinctrl_map *map;
104762306a36Sopenharmony_ci	int ret;
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_ci	/*
105062306a36Sopenharmony_ci	 * create the state cookie holder struct pinctrl for each
105162306a36Sopenharmony_ci	 * mapping, this is what consumers will get when requesting
105262306a36Sopenharmony_ci	 * a pin control handle with pinctrl_get()
105362306a36Sopenharmony_ci	 */
105462306a36Sopenharmony_ci	p = kzalloc(sizeof(*p), GFP_KERNEL);
105562306a36Sopenharmony_ci	if (!p)
105662306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
105762306a36Sopenharmony_ci	p->dev = dev;
105862306a36Sopenharmony_ci	INIT_LIST_HEAD(&p->states);
105962306a36Sopenharmony_ci	INIT_LIST_HEAD(&p->dt_maps);
106062306a36Sopenharmony_ci
106162306a36Sopenharmony_ci	ret = pinctrl_dt_to_map(p, pctldev);
106262306a36Sopenharmony_ci	if (ret < 0) {
106362306a36Sopenharmony_ci		kfree(p);
106462306a36Sopenharmony_ci		return ERR_PTR(ret);
106562306a36Sopenharmony_ci	}
106662306a36Sopenharmony_ci
106762306a36Sopenharmony_ci	devname = dev_name(dev);
106862306a36Sopenharmony_ci
106962306a36Sopenharmony_ci	mutex_lock(&pinctrl_maps_mutex);
107062306a36Sopenharmony_ci	/* Iterate over the pin control maps to locate the right ones */
107162306a36Sopenharmony_ci	for_each_pin_map(maps_node, map) {
107262306a36Sopenharmony_ci		/* Map must be for this device */
107362306a36Sopenharmony_ci		if (strcmp(map->dev_name, devname))
107462306a36Sopenharmony_ci			continue;
107562306a36Sopenharmony_ci		/*
107662306a36Sopenharmony_ci		 * If pctldev is not null, we are claiming hog for it,
107762306a36Sopenharmony_ci		 * that means, setting that is served by pctldev by itself.
107862306a36Sopenharmony_ci		 *
107962306a36Sopenharmony_ci		 * Thus we must skip map that is for this device but is served
108062306a36Sopenharmony_ci		 * by other device.
108162306a36Sopenharmony_ci		 */
108262306a36Sopenharmony_ci		if (pctldev &&
108362306a36Sopenharmony_ci		    strcmp(dev_name(pctldev->dev), map->ctrl_dev_name))
108462306a36Sopenharmony_ci			continue;
108562306a36Sopenharmony_ci
108662306a36Sopenharmony_ci		ret = add_setting(p, pctldev, map);
108762306a36Sopenharmony_ci		/*
108862306a36Sopenharmony_ci		 * At this point the adding of a setting may:
108962306a36Sopenharmony_ci		 *
109062306a36Sopenharmony_ci		 * - Defer, if the pinctrl device is not yet available
109162306a36Sopenharmony_ci		 * - Fail, if the pinctrl device is not yet available,
109262306a36Sopenharmony_ci		 *   AND the setting is a hog. We cannot defer that, since
109362306a36Sopenharmony_ci		 *   the hog will kick in immediately after the device
109462306a36Sopenharmony_ci		 *   is registered.
109562306a36Sopenharmony_ci		 *
109662306a36Sopenharmony_ci		 * If the error returned was not -EPROBE_DEFER then we
109762306a36Sopenharmony_ci		 * accumulate the errors to see if we end up with
109862306a36Sopenharmony_ci		 * an -EPROBE_DEFER later, as that is the worst case.
109962306a36Sopenharmony_ci		 */
110062306a36Sopenharmony_ci		if (ret == -EPROBE_DEFER) {
110162306a36Sopenharmony_ci			pinctrl_free(p, false);
110262306a36Sopenharmony_ci			mutex_unlock(&pinctrl_maps_mutex);
110362306a36Sopenharmony_ci			return ERR_PTR(ret);
110462306a36Sopenharmony_ci		}
110562306a36Sopenharmony_ci	}
110662306a36Sopenharmony_ci	mutex_unlock(&pinctrl_maps_mutex);
110762306a36Sopenharmony_ci
110862306a36Sopenharmony_ci	if (ret < 0) {
110962306a36Sopenharmony_ci		/* If some other error than deferral occurred, return here */
111062306a36Sopenharmony_ci		pinctrl_free(p, false);
111162306a36Sopenharmony_ci		return ERR_PTR(ret);
111262306a36Sopenharmony_ci	}
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci	kref_init(&p->users);
111562306a36Sopenharmony_ci
111662306a36Sopenharmony_ci	/* Add the pinctrl handle to the global list */
111762306a36Sopenharmony_ci	mutex_lock(&pinctrl_list_mutex);
111862306a36Sopenharmony_ci	list_add_tail(&p->node, &pinctrl_list);
111962306a36Sopenharmony_ci	mutex_unlock(&pinctrl_list_mutex);
112062306a36Sopenharmony_ci
112162306a36Sopenharmony_ci	return p;
112262306a36Sopenharmony_ci}
112362306a36Sopenharmony_ci
112462306a36Sopenharmony_ci/**
112562306a36Sopenharmony_ci * pinctrl_get() - retrieves the pinctrl handle for a device
112662306a36Sopenharmony_ci * @dev: the device to obtain the handle for
112762306a36Sopenharmony_ci */
112862306a36Sopenharmony_cistruct pinctrl *pinctrl_get(struct device *dev)
112962306a36Sopenharmony_ci{
113062306a36Sopenharmony_ci	struct pinctrl *p;
113162306a36Sopenharmony_ci
113262306a36Sopenharmony_ci	if (WARN_ON(!dev))
113362306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
113462306a36Sopenharmony_ci
113562306a36Sopenharmony_ci	/*
113662306a36Sopenharmony_ci	 * See if somebody else (such as the device core) has already
113762306a36Sopenharmony_ci	 * obtained a handle to the pinctrl for this device. In that case,
113862306a36Sopenharmony_ci	 * return another pointer to it.
113962306a36Sopenharmony_ci	 */
114062306a36Sopenharmony_ci	p = find_pinctrl(dev);
114162306a36Sopenharmony_ci	if (p) {
114262306a36Sopenharmony_ci		dev_dbg(dev, "obtain a copy of previously claimed pinctrl\n");
114362306a36Sopenharmony_ci		kref_get(&p->users);
114462306a36Sopenharmony_ci		return p;
114562306a36Sopenharmony_ci	}
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_ci	return create_pinctrl(dev, NULL);
114862306a36Sopenharmony_ci}
114962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_get);
115062306a36Sopenharmony_ci
115162306a36Sopenharmony_cistatic void pinctrl_free_setting(bool disable_setting,
115262306a36Sopenharmony_ci				 struct pinctrl_setting *setting)
115362306a36Sopenharmony_ci{
115462306a36Sopenharmony_ci	switch (setting->type) {
115562306a36Sopenharmony_ci	case PIN_MAP_TYPE_MUX_GROUP:
115662306a36Sopenharmony_ci		if (disable_setting)
115762306a36Sopenharmony_ci			pinmux_disable_setting(setting);
115862306a36Sopenharmony_ci		pinmux_free_setting(setting);
115962306a36Sopenharmony_ci		break;
116062306a36Sopenharmony_ci	case PIN_MAP_TYPE_CONFIGS_PIN:
116162306a36Sopenharmony_ci	case PIN_MAP_TYPE_CONFIGS_GROUP:
116262306a36Sopenharmony_ci		pinconf_free_setting(setting);
116362306a36Sopenharmony_ci		break;
116462306a36Sopenharmony_ci	default:
116562306a36Sopenharmony_ci		break;
116662306a36Sopenharmony_ci	}
116762306a36Sopenharmony_ci}
116862306a36Sopenharmony_ci
116962306a36Sopenharmony_cistatic void pinctrl_free(struct pinctrl *p, bool inlist)
117062306a36Sopenharmony_ci{
117162306a36Sopenharmony_ci	struct pinctrl_state *state, *n1;
117262306a36Sopenharmony_ci	struct pinctrl_setting *setting, *n2;
117362306a36Sopenharmony_ci
117462306a36Sopenharmony_ci	mutex_lock(&pinctrl_list_mutex);
117562306a36Sopenharmony_ci	list_for_each_entry_safe(state, n1, &p->states, node) {
117662306a36Sopenharmony_ci		list_for_each_entry_safe(setting, n2, &state->settings, node) {
117762306a36Sopenharmony_ci			pinctrl_free_setting(state == p->state, setting);
117862306a36Sopenharmony_ci			list_del(&setting->node);
117962306a36Sopenharmony_ci			kfree(setting);
118062306a36Sopenharmony_ci		}
118162306a36Sopenharmony_ci		list_del(&state->node);
118262306a36Sopenharmony_ci		kfree(state);
118362306a36Sopenharmony_ci	}
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_ci	pinctrl_dt_free_maps(p);
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci	if (inlist)
118862306a36Sopenharmony_ci		list_del(&p->node);
118962306a36Sopenharmony_ci	kfree(p);
119062306a36Sopenharmony_ci	mutex_unlock(&pinctrl_list_mutex);
119162306a36Sopenharmony_ci}
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci/**
119462306a36Sopenharmony_ci * pinctrl_release() - release the pinctrl handle
119562306a36Sopenharmony_ci * @kref: the kref in the pinctrl being released
119662306a36Sopenharmony_ci */
119762306a36Sopenharmony_cistatic void pinctrl_release(struct kref *kref)
119862306a36Sopenharmony_ci{
119962306a36Sopenharmony_ci	struct pinctrl *p = container_of(kref, struct pinctrl, users);
120062306a36Sopenharmony_ci
120162306a36Sopenharmony_ci	pinctrl_free(p, true);
120262306a36Sopenharmony_ci}
120362306a36Sopenharmony_ci
120462306a36Sopenharmony_ci/**
120562306a36Sopenharmony_ci * pinctrl_put() - decrease use count on a previously claimed pinctrl handle
120662306a36Sopenharmony_ci * @p: the pinctrl handle to release
120762306a36Sopenharmony_ci */
120862306a36Sopenharmony_civoid pinctrl_put(struct pinctrl *p)
120962306a36Sopenharmony_ci{
121062306a36Sopenharmony_ci	kref_put(&p->users, pinctrl_release);
121162306a36Sopenharmony_ci}
121262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_put);
121362306a36Sopenharmony_ci
121462306a36Sopenharmony_ci/**
121562306a36Sopenharmony_ci * pinctrl_lookup_state() - retrieves a state handle from a pinctrl handle
121662306a36Sopenharmony_ci * @p: the pinctrl handle to retrieve the state from
121762306a36Sopenharmony_ci * @name: the state name to retrieve
121862306a36Sopenharmony_ci */
121962306a36Sopenharmony_cistruct pinctrl_state *pinctrl_lookup_state(struct pinctrl *p,
122062306a36Sopenharmony_ci						 const char *name)
122162306a36Sopenharmony_ci{
122262306a36Sopenharmony_ci	struct pinctrl_state *state;
122362306a36Sopenharmony_ci
122462306a36Sopenharmony_ci	state = find_state(p, name);
122562306a36Sopenharmony_ci	if (!state) {
122662306a36Sopenharmony_ci		if (pinctrl_dummy_state) {
122762306a36Sopenharmony_ci			/* create dummy state */
122862306a36Sopenharmony_ci			dev_dbg(p->dev, "using pinctrl dummy state (%s)\n",
122962306a36Sopenharmony_ci				name);
123062306a36Sopenharmony_ci			state = create_state(p, name);
123162306a36Sopenharmony_ci		} else
123262306a36Sopenharmony_ci			state = ERR_PTR(-ENODEV);
123362306a36Sopenharmony_ci	}
123462306a36Sopenharmony_ci
123562306a36Sopenharmony_ci	return state;
123662306a36Sopenharmony_ci}
123762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_lookup_state);
123862306a36Sopenharmony_ci
123962306a36Sopenharmony_cistatic void pinctrl_link_add(struct pinctrl_dev *pctldev,
124062306a36Sopenharmony_ci			     struct device *consumer)
124162306a36Sopenharmony_ci{
124262306a36Sopenharmony_ci	if (pctldev->desc->link_consumers)
124362306a36Sopenharmony_ci		device_link_add(consumer, pctldev->dev,
124462306a36Sopenharmony_ci				DL_FLAG_PM_RUNTIME |
124562306a36Sopenharmony_ci				DL_FLAG_AUTOREMOVE_CONSUMER);
124662306a36Sopenharmony_ci}
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_ci/**
124962306a36Sopenharmony_ci * pinctrl_commit_state() - select/activate/program a pinctrl state to HW
125062306a36Sopenharmony_ci * @p: the pinctrl handle for the device that requests configuration
125162306a36Sopenharmony_ci * @state: the state handle to select/activate/program
125262306a36Sopenharmony_ci */
125362306a36Sopenharmony_cistatic int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state)
125462306a36Sopenharmony_ci{
125562306a36Sopenharmony_ci	struct pinctrl_setting *setting, *setting2;
125662306a36Sopenharmony_ci	struct pinctrl_state *old_state = READ_ONCE(p->state);
125762306a36Sopenharmony_ci	int ret;
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_ci	if (old_state) {
126062306a36Sopenharmony_ci		/*
126162306a36Sopenharmony_ci		 * For each pinmux setting in the old state, forget SW's record
126262306a36Sopenharmony_ci		 * of mux owner for that pingroup. Any pingroups which are
126362306a36Sopenharmony_ci		 * still owned by the new state will be re-acquired by the call
126462306a36Sopenharmony_ci		 * to pinmux_enable_setting() in the loop below.
126562306a36Sopenharmony_ci		 */
126662306a36Sopenharmony_ci		list_for_each_entry(setting, &old_state->settings, node) {
126762306a36Sopenharmony_ci			if (setting->type != PIN_MAP_TYPE_MUX_GROUP)
126862306a36Sopenharmony_ci				continue;
126962306a36Sopenharmony_ci			pinmux_disable_setting(setting);
127062306a36Sopenharmony_ci		}
127162306a36Sopenharmony_ci	}
127262306a36Sopenharmony_ci
127362306a36Sopenharmony_ci	p->state = NULL;
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	/* Apply all the settings for the new state - pinmux first */
127662306a36Sopenharmony_ci	list_for_each_entry(setting, &state->settings, node) {
127762306a36Sopenharmony_ci		switch (setting->type) {
127862306a36Sopenharmony_ci		case PIN_MAP_TYPE_MUX_GROUP:
127962306a36Sopenharmony_ci			ret = pinmux_enable_setting(setting);
128062306a36Sopenharmony_ci			break;
128162306a36Sopenharmony_ci		case PIN_MAP_TYPE_CONFIGS_PIN:
128262306a36Sopenharmony_ci		case PIN_MAP_TYPE_CONFIGS_GROUP:
128362306a36Sopenharmony_ci			ret = 0;
128462306a36Sopenharmony_ci			break;
128562306a36Sopenharmony_ci		default:
128662306a36Sopenharmony_ci			ret = -EINVAL;
128762306a36Sopenharmony_ci			break;
128862306a36Sopenharmony_ci		}
128962306a36Sopenharmony_ci
129062306a36Sopenharmony_ci		if (ret < 0)
129162306a36Sopenharmony_ci			goto unapply_new_state;
129262306a36Sopenharmony_ci
129362306a36Sopenharmony_ci		/* Do not link hogs (circular dependency) */
129462306a36Sopenharmony_ci		if (p != setting->pctldev->p)
129562306a36Sopenharmony_ci			pinctrl_link_add(setting->pctldev, p->dev);
129662306a36Sopenharmony_ci	}
129762306a36Sopenharmony_ci
129862306a36Sopenharmony_ci	/* Apply all the settings for the new state - pinconf after */
129962306a36Sopenharmony_ci	list_for_each_entry(setting, &state->settings, node) {
130062306a36Sopenharmony_ci		switch (setting->type) {
130162306a36Sopenharmony_ci		case PIN_MAP_TYPE_MUX_GROUP:
130262306a36Sopenharmony_ci			ret = 0;
130362306a36Sopenharmony_ci			break;
130462306a36Sopenharmony_ci		case PIN_MAP_TYPE_CONFIGS_PIN:
130562306a36Sopenharmony_ci		case PIN_MAP_TYPE_CONFIGS_GROUP:
130662306a36Sopenharmony_ci			ret = pinconf_apply_setting(setting);
130762306a36Sopenharmony_ci			break;
130862306a36Sopenharmony_ci		default:
130962306a36Sopenharmony_ci			ret = -EINVAL;
131062306a36Sopenharmony_ci			break;
131162306a36Sopenharmony_ci		}
131262306a36Sopenharmony_ci
131362306a36Sopenharmony_ci		if (ret < 0) {
131462306a36Sopenharmony_ci			goto unapply_new_state;
131562306a36Sopenharmony_ci		}
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_ci		/* Do not link hogs (circular dependency) */
131862306a36Sopenharmony_ci		if (p != setting->pctldev->p)
131962306a36Sopenharmony_ci			pinctrl_link_add(setting->pctldev, p->dev);
132062306a36Sopenharmony_ci	}
132162306a36Sopenharmony_ci
132262306a36Sopenharmony_ci	p->state = state;
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_ci	return 0;
132562306a36Sopenharmony_ci
132662306a36Sopenharmony_ciunapply_new_state:
132762306a36Sopenharmony_ci	dev_err(p->dev, "Error applying setting, reverse things back\n");
132862306a36Sopenharmony_ci
132962306a36Sopenharmony_ci	list_for_each_entry(setting2, &state->settings, node) {
133062306a36Sopenharmony_ci		if (&setting2->node == &setting->node)
133162306a36Sopenharmony_ci			break;
133262306a36Sopenharmony_ci		/*
133362306a36Sopenharmony_ci		 * All we can do here is pinmux_disable_setting.
133462306a36Sopenharmony_ci		 * That means that some pins are muxed differently now
133562306a36Sopenharmony_ci		 * than they were before applying the setting (We can't
133662306a36Sopenharmony_ci		 * "unmux a pin"!), but it's not a big deal since the pins
133762306a36Sopenharmony_ci		 * are free to be muxed by another apply_setting.
133862306a36Sopenharmony_ci		 */
133962306a36Sopenharmony_ci		if (setting2->type == PIN_MAP_TYPE_MUX_GROUP)
134062306a36Sopenharmony_ci			pinmux_disable_setting(setting2);
134162306a36Sopenharmony_ci	}
134262306a36Sopenharmony_ci
134362306a36Sopenharmony_ci	/* There's no infinite recursive loop here because p->state is NULL */
134462306a36Sopenharmony_ci	if (old_state)
134562306a36Sopenharmony_ci		pinctrl_select_state(p, old_state);
134662306a36Sopenharmony_ci
134762306a36Sopenharmony_ci	return ret;
134862306a36Sopenharmony_ci}
134962306a36Sopenharmony_ci
135062306a36Sopenharmony_ci/**
135162306a36Sopenharmony_ci * pinctrl_select_state() - select/activate/program a pinctrl state to HW
135262306a36Sopenharmony_ci * @p: the pinctrl handle for the device that requests configuration
135362306a36Sopenharmony_ci * @state: the state handle to select/activate/program
135462306a36Sopenharmony_ci */
135562306a36Sopenharmony_ciint pinctrl_select_state(struct pinctrl *p, struct pinctrl_state *state)
135662306a36Sopenharmony_ci{
135762306a36Sopenharmony_ci	if (p->state == state)
135862306a36Sopenharmony_ci		return 0;
135962306a36Sopenharmony_ci
136062306a36Sopenharmony_ci	return pinctrl_commit_state(p, state);
136162306a36Sopenharmony_ci}
136262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_select_state);
136362306a36Sopenharmony_ci
136462306a36Sopenharmony_cistatic void devm_pinctrl_release(struct device *dev, void *res)
136562306a36Sopenharmony_ci{
136662306a36Sopenharmony_ci	pinctrl_put(*(struct pinctrl **)res);
136762306a36Sopenharmony_ci}
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_ci/**
137062306a36Sopenharmony_ci * devm_pinctrl_get() - Resource managed pinctrl_get()
137162306a36Sopenharmony_ci * @dev: the device to obtain the handle for
137262306a36Sopenharmony_ci *
137362306a36Sopenharmony_ci * If there is a need to explicitly destroy the returned struct pinctrl,
137462306a36Sopenharmony_ci * devm_pinctrl_put() should be used, rather than plain pinctrl_put().
137562306a36Sopenharmony_ci */
137662306a36Sopenharmony_cistruct pinctrl *devm_pinctrl_get(struct device *dev)
137762306a36Sopenharmony_ci{
137862306a36Sopenharmony_ci	struct pinctrl **ptr, *p;
137962306a36Sopenharmony_ci
138062306a36Sopenharmony_ci	ptr = devres_alloc(devm_pinctrl_release, sizeof(*ptr), GFP_KERNEL);
138162306a36Sopenharmony_ci	if (!ptr)
138262306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
138362306a36Sopenharmony_ci
138462306a36Sopenharmony_ci	p = pinctrl_get(dev);
138562306a36Sopenharmony_ci	if (!IS_ERR(p)) {
138662306a36Sopenharmony_ci		*ptr = p;
138762306a36Sopenharmony_ci		devres_add(dev, ptr);
138862306a36Sopenharmony_ci	} else {
138962306a36Sopenharmony_ci		devres_free(ptr);
139062306a36Sopenharmony_ci	}
139162306a36Sopenharmony_ci
139262306a36Sopenharmony_ci	return p;
139362306a36Sopenharmony_ci}
139462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_pinctrl_get);
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_cistatic int devm_pinctrl_match(struct device *dev, void *res, void *data)
139762306a36Sopenharmony_ci{
139862306a36Sopenharmony_ci	struct pinctrl **p = res;
139962306a36Sopenharmony_ci
140062306a36Sopenharmony_ci	return *p == data;
140162306a36Sopenharmony_ci}
140262306a36Sopenharmony_ci
140362306a36Sopenharmony_ci/**
140462306a36Sopenharmony_ci * devm_pinctrl_put() - Resource managed pinctrl_put()
140562306a36Sopenharmony_ci * @p: the pinctrl handle to release
140662306a36Sopenharmony_ci *
140762306a36Sopenharmony_ci * Deallocate a struct pinctrl obtained via devm_pinctrl_get(). Normally
140862306a36Sopenharmony_ci * this function will not need to be called and the resource management
140962306a36Sopenharmony_ci * code will ensure that the resource is freed.
141062306a36Sopenharmony_ci */
141162306a36Sopenharmony_civoid devm_pinctrl_put(struct pinctrl *p)
141262306a36Sopenharmony_ci{
141362306a36Sopenharmony_ci	WARN_ON(devres_release(p->dev, devm_pinctrl_release,
141462306a36Sopenharmony_ci			       devm_pinctrl_match, p));
141562306a36Sopenharmony_ci}
141662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_pinctrl_put);
141762306a36Sopenharmony_ci
141862306a36Sopenharmony_ci/**
141962306a36Sopenharmony_ci * pinctrl_register_mappings() - register a set of pin controller mappings
142062306a36Sopenharmony_ci * @maps: the pincontrol mappings table to register. Note the pinctrl-core
142162306a36Sopenharmony_ci *	keeps a reference to the passed in maps, so they should _not_ be
142262306a36Sopenharmony_ci *	marked with __initdata.
142362306a36Sopenharmony_ci * @num_maps: the number of maps in the mapping table
142462306a36Sopenharmony_ci */
142562306a36Sopenharmony_ciint pinctrl_register_mappings(const struct pinctrl_map *maps,
142662306a36Sopenharmony_ci			      unsigned num_maps)
142762306a36Sopenharmony_ci{
142862306a36Sopenharmony_ci	int i, ret;
142962306a36Sopenharmony_ci	struct pinctrl_maps *maps_node;
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci	pr_debug("add %u pinctrl maps\n", num_maps);
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci	/* First sanity check the new mapping */
143462306a36Sopenharmony_ci	for (i = 0; i < num_maps; i++) {
143562306a36Sopenharmony_ci		if (!maps[i].dev_name) {
143662306a36Sopenharmony_ci			pr_err("failed to register map %s (%d): no device given\n",
143762306a36Sopenharmony_ci			       maps[i].name, i);
143862306a36Sopenharmony_ci			return -EINVAL;
143962306a36Sopenharmony_ci		}
144062306a36Sopenharmony_ci
144162306a36Sopenharmony_ci		if (!maps[i].name) {
144262306a36Sopenharmony_ci			pr_err("failed to register map %d: no map name given\n",
144362306a36Sopenharmony_ci			       i);
144462306a36Sopenharmony_ci			return -EINVAL;
144562306a36Sopenharmony_ci		}
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_ci		if (maps[i].type != PIN_MAP_TYPE_DUMMY_STATE &&
144862306a36Sopenharmony_ci				!maps[i].ctrl_dev_name) {
144962306a36Sopenharmony_ci			pr_err("failed to register map %s (%d): no pin control device given\n",
145062306a36Sopenharmony_ci			       maps[i].name, i);
145162306a36Sopenharmony_ci			return -EINVAL;
145262306a36Sopenharmony_ci		}
145362306a36Sopenharmony_ci
145462306a36Sopenharmony_ci		switch (maps[i].type) {
145562306a36Sopenharmony_ci		case PIN_MAP_TYPE_DUMMY_STATE:
145662306a36Sopenharmony_ci			break;
145762306a36Sopenharmony_ci		case PIN_MAP_TYPE_MUX_GROUP:
145862306a36Sopenharmony_ci			ret = pinmux_validate_map(&maps[i], i);
145962306a36Sopenharmony_ci			if (ret < 0)
146062306a36Sopenharmony_ci				return ret;
146162306a36Sopenharmony_ci			break;
146262306a36Sopenharmony_ci		case PIN_MAP_TYPE_CONFIGS_PIN:
146362306a36Sopenharmony_ci		case PIN_MAP_TYPE_CONFIGS_GROUP:
146462306a36Sopenharmony_ci			ret = pinconf_validate_map(&maps[i], i);
146562306a36Sopenharmony_ci			if (ret < 0)
146662306a36Sopenharmony_ci				return ret;
146762306a36Sopenharmony_ci			break;
146862306a36Sopenharmony_ci		default:
146962306a36Sopenharmony_ci			pr_err("failed to register map %s (%d): invalid type given\n",
147062306a36Sopenharmony_ci			       maps[i].name, i);
147162306a36Sopenharmony_ci			return -EINVAL;
147262306a36Sopenharmony_ci		}
147362306a36Sopenharmony_ci	}
147462306a36Sopenharmony_ci
147562306a36Sopenharmony_ci	maps_node = kzalloc(sizeof(*maps_node), GFP_KERNEL);
147662306a36Sopenharmony_ci	if (!maps_node)
147762306a36Sopenharmony_ci		return -ENOMEM;
147862306a36Sopenharmony_ci
147962306a36Sopenharmony_ci	maps_node->maps = maps;
148062306a36Sopenharmony_ci	maps_node->num_maps = num_maps;
148162306a36Sopenharmony_ci
148262306a36Sopenharmony_ci	mutex_lock(&pinctrl_maps_mutex);
148362306a36Sopenharmony_ci	list_add_tail(&maps_node->node, &pinctrl_maps);
148462306a36Sopenharmony_ci	mutex_unlock(&pinctrl_maps_mutex);
148562306a36Sopenharmony_ci
148662306a36Sopenharmony_ci	return 0;
148762306a36Sopenharmony_ci}
148862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_register_mappings);
148962306a36Sopenharmony_ci
149062306a36Sopenharmony_ci/**
149162306a36Sopenharmony_ci * pinctrl_unregister_mappings() - unregister a set of pin controller mappings
149262306a36Sopenharmony_ci * @map: the pincontrol mappings table passed to pinctrl_register_mappings()
149362306a36Sopenharmony_ci *	when registering the mappings.
149462306a36Sopenharmony_ci */
149562306a36Sopenharmony_civoid pinctrl_unregister_mappings(const struct pinctrl_map *map)
149662306a36Sopenharmony_ci{
149762306a36Sopenharmony_ci	struct pinctrl_maps *maps_node;
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci	mutex_lock(&pinctrl_maps_mutex);
150062306a36Sopenharmony_ci	list_for_each_entry(maps_node, &pinctrl_maps, node) {
150162306a36Sopenharmony_ci		if (maps_node->maps == map) {
150262306a36Sopenharmony_ci			list_del(&maps_node->node);
150362306a36Sopenharmony_ci			kfree(maps_node);
150462306a36Sopenharmony_ci			mutex_unlock(&pinctrl_maps_mutex);
150562306a36Sopenharmony_ci			return;
150662306a36Sopenharmony_ci		}
150762306a36Sopenharmony_ci	}
150862306a36Sopenharmony_ci	mutex_unlock(&pinctrl_maps_mutex);
150962306a36Sopenharmony_ci}
151062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_unregister_mappings);
151162306a36Sopenharmony_ci
151262306a36Sopenharmony_ci/**
151362306a36Sopenharmony_ci * pinctrl_force_sleep() - turn a given controller device into sleep state
151462306a36Sopenharmony_ci * @pctldev: pin controller device
151562306a36Sopenharmony_ci */
151662306a36Sopenharmony_ciint pinctrl_force_sleep(struct pinctrl_dev *pctldev)
151762306a36Sopenharmony_ci{
151862306a36Sopenharmony_ci	if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_sleep))
151962306a36Sopenharmony_ci		return pinctrl_commit_state(pctldev->p, pctldev->hog_sleep);
152062306a36Sopenharmony_ci	return 0;
152162306a36Sopenharmony_ci}
152262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_force_sleep);
152362306a36Sopenharmony_ci
152462306a36Sopenharmony_ci/**
152562306a36Sopenharmony_ci * pinctrl_force_default() - turn a given controller device into default state
152662306a36Sopenharmony_ci * @pctldev: pin controller device
152762306a36Sopenharmony_ci */
152862306a36Sopenharmony_ciint pinctrl_force_default(struct pinctrl_dev *pctldev)
152962306a36Sopenharmony_ci{
153062306a36Sopenharmony_ci	if (!IS_ERR(pctldev->p) && !IS_ERR(pctldev->hog_default))
153162306a36Sopenharmony_ci		return pinctrl_commit_state(pctldev->p, pctldev->hog_default);
153262306a36Sopenharmony_ci	return 0;
153362306a36Sopenharmony_ci}
153462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_force_default);
153562306a36Sopenharmony_ci
153662306a36Sopenharmony_ci/**
153762306a36Sopenharmony_ci * pinctrl_init_done() - tell pinctrl probe is done
153862306a36Sopenharmony_ci *
153962306a36Sopenharmony_ci * We'll use this time to switch the pins from "init" to "default" unless the
154062306a36Sopenharmony_ci * driver selected some other state.
154162306a36Sopenharmony_ci *
154262306a36Sopenharmony_ci * @dev: device to that's done probing
154362306a36Sopenharmony_ci */
154462306a36Sopenharmony_ciint pinctrl_init_done(struct device *dev)
154562306a36Sopenharmony_ci{
154662306a36Sopenharmony_ci	struct dev_pin_info *pins = dev->pins;
154762306a36Sopenharmony_ci	int ret;
154862306a36Sopenharmony_ci
154962306a36Sopenharmony_ci	if (!pins)
155062306a36Sopenharmony_ci		return 0;
155162306a36Sopenharmony_ci
155262306a36Sopenharmony_ci	if (IS_ERR(pins->init_state))
155362306a36Sopenharmony_ci		return 0; /* No such state */
155462306a36Sopenharmony_ci
155562306a36Sopenharmony_ci	if (pins->p->state != pins->init_state)
155662306a36Sopenharmony_ci		return 0; /* Not at init anyway */
155762306a36Sopenharmony_ci
155862306a36Sopenharmony_ci	if (IS_ERR(pins->default_state))
155962306a36Sopenharmony_ci		return 0; /* No default state */
156062306a36Sopenharmony_ci
156162306a36Sopenharmony_ci	ret = pinctrl_select_state(pins->p, pins->default_state);
156262306a36Sopenharmony_ci	if (ret)
156362306a36Sopenharmony_ci		dev_err(dev, "failed to activate default pinctrl state\n");
156462306a36Sopenharmony_ci
156562306a36Sopenharmony_ci	return ret;
156662306a36Sopenharmony_ci}
156762306a36Sopenharmony_ci
156862306a36Sopenharmony_cistatic int pinctrl_select_bound_state(struct device *dev,
156962306a36Sopenharmony_ci				      struct pinctrl_state *state)
157062306a36Sopenharmony_ci{
157162306a36Sopenharmony_ci	struct dev_pin_info *pins = dev->pins;
157262306a36Sopenharmony_ci	int ret;
157362306a36Sopenharmony_ci
157462306a36Sopenharmony_ci	if (IS_ERR(state))
157562306a36Sopenharmony_ci		return 0; /* No such state */
157662306a36Sopenharmony_ci	ret = pinctrl_select_state(pins->p, state);
157762306a36Sopenharmony_ci	if (ret)
157862306a36Sopenharmony_ci		dev_err(dev, "failed to activate pinctrl state %s\n",
157962306a36Sopenharmony_ci			state->name);
158062306a36Sopenharmony_ci	return ret;
158162306a36Sopenharmony_ci}
158262306a36Sopenharmony_ci
158362306a36Sopenharmony_ci/**
158462306a36Sopenharmony_ci * pinctrl_select_default_state() - select default pinctrl state
158562306a36Sopenharmony_ci * @dev: device to select default state for
158662306a36Sopenharmony_ci */
158762306a36Sopenharmony_ciint pinctrl_select_default_state(struct device *dev)
158862306a36Sopenharmony_ci{
158962306a36Sopenharmony_ci	if (!dev->pins)
159062306a36Sopenharmony_ci		return 0;
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_ci	return pinctrl_select_bound_state(dev, dev->pins->default_state);
159362306a36Sopenharmony_ci}
159462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_select_default_state);
159562306a36Sopenharmony_ci
159662306a36Sopenharmony_ci#ifdef CONFIG_PM
159762306a36Sopenharmony_ci
159862306a36Sopenharmony_ci/**
159962306a36Sopenharmony_ci * pinctrl_pm_select_default_state() - select default pinctrl state for PM
160062306a36Sopenharmony_ci * @dev: device to select default state for
160162306a36Sopenharmony_ci */
160262306a36Sopenharmony_ciint pinctrl_pm_select_default_state(struct device *dev)
160362306a36Sopenharmony_ci{
160462306a36Sopenharmony_ci	return pinctrl_select_default_state(dev);
160562306a36Sopenharmony_ci}
160662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_pm_select_default_state);
160762306a36Sopenharmony_ci
160862306a36Sopenharmony_ci/**
160962306a36Sopenharmony_ci * pinctrl_pm_select_sleep_state() - select sleep pinctrl state for PM
161062306a36Sopenharmony_ci * @dev: device to select sleep state for
161162306a36Sopenharmony_ci */
161262306a36Sopenharmony_ciint pinctrl_pm_select_sleep_state(struct device *dev)
161362306a36Sopenharmony_ci{
161462306a36Sopenharmony_ci	if (!dev->pins)
161562306a36Sopenharmony_ci		return 0;
161662306a36Sopenharmony_ci
161762306a36Sopenharmony_ci	return pinctrl_select_bound_state(dev, dev->pins->sleep_state);
161862306a36Sopenharmony_ci}
161962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_pm_select_sleep_state);
162062306a36Sopenharmony_ci
162162306a36Sopenharmony_ci/**
162262306a36Sopenharmony_ci * pinctrl_pm_select_idle_state() - select idle pinctrl state for PM
162362306a36Sopenharmony_ci * @dev: device to select idle state for
162462306a36Sopenharmony_ci */
162562306a36Sopenharmony_ciint pinctrl_pm_select_idle_state(struct device *dev)
162662306a36Sopenharmony_ci{
162762306a36Sopenharmony_ci	if (!dev->pins)
162862306a36Sopenharmony_ci		return 0;
162962306a36Sopenharmony_ci
163062306a36Sopenharmony_ci	return pinctrl_select_bound_state(dev, dev->pins->idle_state);
163162306a36Sopenharmony_ci}
163262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_pm_select_idle_state);
163362306a36Sopenharmony_ci#endif
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
163662306a36Sopenharmony_ci
163762306a36Sopenharmony_cistatic int pinctrl_pins_show(struct seq_file *s, void *what)
163862306a36Sopenharmony_ci{
163962306a36Sopenharmony_ci	struct pinctrl_dev *pctldev = s->private;
164062306a36Sopenharmony_ci	const struct pinctrl_ops *ops = pctldev->desc->pctlops;
164162306a36Sopenharmony_ci	unsigned i, pin;
164262306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB
164362306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
164462306a36Sopenharmony_ci	struct gpio_chip *chip;
164562306a36Sopenharmony_ci	int gpio_num;
164662306a36Sopenharmony_ci#endif
164762306a36Sopenharmony_ci
164862306a36Sopenharmony_ci	seq_printf(s, "registered pins: %d\n", pctldev->desc->npins);
164962306a36Sopenharmony_ci
165062306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
165162306a36Sopenharmony_ci
165262306a36Sopenharmony_ci	/* The pin number can be retrived from the pin controller descriptor */
165362306a36Sopenharmony_ci	for (i = 0; i < pctldev->desc->npins; i++) {
165462306a36Sopenharmony_ci		struct pin_desc *desc;
165562306a36Sopenharmony_ci
165662306a36Sopenharmony_ci		pin = pctldev->desc->pins[i].number;
165762306a36Sopenharmony_ci		desc = pin_desc_get(pctldev, pin);
165862306a36Sopenharmony_ci		/* Pin space may be sparse */
165962306a36Sopenharmony_ci		if (!desc)
166062306a36Sopenharmony_ci			continue;
166162306a36Sopenharmony_ci
166262306a36Sopenharmony_ci		seq_printf(s, "pin %d (%s) ", pin, desc->name);
166362306a36Sopenharmony_ci
166462306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB
166562306a36Sopenharmony_ci		gpio_num = -1;
166662306a36Sopenharmony_ci		list_for_each_entry(range, &pctldev->gpio_ranges, node) {
166762306a36Sopenharmony_ci			if ((pin >= range->pin_base) &&
166862306a36Sopenharmony_ci			    (pin < (range->pin_base + range->npins))) {
166962306a36Sopenharmony_ci				gpio_num = range->base + (pin - range->pin_base);
167062306a36Sopenharmony_ci				break;
167162306a36Sopenharmony_ci			}
167262306a36Sopenharmony_ci		}
167362306a36Sopenharmony_ci		if (gpio_num >= 0)
167462306a36Sopenharmony_ci			/*
167562306a36Sopenharmony_ci			 * FIXME: gpio_num comes from the global GPIO numberspace.
167662306a36Sopenharmony_ci			 * we need to get rid of the range->base eventually and
167762306a36Sopenharmony_ci			 * get the descriptor directly from the gpio_chip.
167862306a36Sopenharmony_ci			 */
167962306a36Sopenharmony_ci			chip = gpiod_to_chip(gpio_to_desc(gpio_num));
168062306a36Sopenharmony_ci		else
168162306a36Sopenharmony_ci			chip = NULL;
168262306a36Sopenharmony_ci		if (chip)
168362306a36Sopenharmony_ci			seq_printf(s, "%u:%s ", gpio_num - chip->gpiodev->base, chip->label);
168462306a36Sopenharmony_ci		else
168562306a36Sopenharmony_ci			seq_puts(s, "0:? ");
168662306a36Sopenharmony_ci#endif
168762306a36Sopenharmony_ci
168862306a36Sopenharmony_ci		/* Driver-specific info per pin */
168962306a36Sopenharmony_ci		if (ops->pin_dbg_show)
169062306a36Sopenharmony_ci			ops->pin_dbg_show(pctldev, s, pin);
169162306a36Sopenharmony_ci
169262306a36Sopenharmony_ci		seq_puts(s, "\n");
169362306a36Sopenharmony_ci	}
169462306a36Sopenharmony_ci
169562306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
169662306a36Sopenharmony_ci
169762306a36Sopenharmony_ci	return 0;
169862306a36Sopenharmony_ci}
169962306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(pinctrl_pins);
170062306a36Sopenharmony_ci
170162306a36Sopenharmony_cistatic int pinctrl_groups_show(struct seq_file *s, void *what)
170262306a36Sopenharmony_ci{
170362306a36Sopenharmony_ci	struct pinctrl_dev *pctldev = s->private;
170462306a36Sopenharmony_ci	const struct pinctrl_ops *ops = pctldev->desc->pctlops;
170562306a36Sopenharmony_ci	unsigned ngroups, selector = 0;
170662306a36Sopenharmony_ci
170762306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
170862306a36Sopenharmony_ci
170962306a36Sopenharmony_ci	ngroups = ops->get_groups_count(pctldev);
171062306a36Sopenharmony_ci
171162306a36Sopenharmony_ci	seq_puts(s, "registered pin groups:\n");
171262306a36Sopenharmony_ci	while (selector < ngroups) {
171362306a36Sopenharmony_ci		const unsigned *pins = NULL;
171462306a36Sopenharmony_ci		unsigned num_pins = 0;
171562306a36Sopenharmony_ci		const char *gname = ops->get_group_name(pctldev, selector);
171662306a36Sopenharmony_ci		const char *pname;
171762306a36Sopenharmony_ci		int ret = 0;
171862306a36Sopenharmony_ci		int i;
171962306a36Sopenharmony_ci
172062306a36Sopenharmony_ci		if (ops->get_group_pins)
172162306a36Sopenharmony_ci			ret = ops->get_group_pins(pctldev, selector,
172262306a36Sopenharmony_ci						  &pins, &num_pins);
172362306a36Sopenharmony_ci		if (ret)
172462306a36Sopenharmony_ci			seq_printf(s, "%s [ERROR GETTING PINS]\n",
172562306a36Sopenharmony_ci				   gname);
172662306a36Sopenharmony_ci		else {
172762306a36Sopenharmony_ci			seq_printf(s, "group: %s\n", gname);
172862306a36Sopenharmony_ci			for (i = 0; i < num_pins; i++) {
172962306a36Sopenharmony_ci				pname = pin_get_name(pctldev, pins[i]);
173062306a36Sopenharmony_ci				if (WARN_ON(!pname)) {
173162306a36Sopenharmony_ci					mutex_unlock(&pctldev->mutex);
173262306a36Sopenharmony_ci					return -EINVAL;
173362306a36Sopenharmony_ci				}
173462306a36Sopenharmony_ci				seq_printf(s, "pin %d (%s)\n", pins[i], pname);
173562306a36Sopenharmony_ci			}
173662306a36Sopenharmony_ci			seq_puts(s, "\n");
173762306a36Sopenharmony_ci		}
173862306a36Sopenharmony_ci		selector++;
173962306a36Sopenharmony_ci	}
174062306a36Sopenharmony_ci
174162306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
174262306a36Sopenharmony_ci
174362306a36Sopenharmony_ci	return 0;
174462306a36Sopenharmony_ci}
174562306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(pinctrl_groups);
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_cistatic int pinctrl_gpioranges_show(struct seq_file *s, void *what)
174862306a36Sopenharmony_ci{
174962306a36Sopenharmony_ci	struct pinctrl_dev *pctldev = s->private;
175062306a36Sopenharmony_ci	struct pinctrl_gpio_range *range;
175162306a36Sopenharmony_ci
175262306a36Sopenharmony_ci	seq_puts(s, "GPIO ranges handled:\n");
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
175562306a36Sopenharmony_ci
175662306a36Sopenharmony_ci	/* Loop over the ranges */
175762306a36Sopenharmony_ci	list_for_each_entry(range, &pctldev->gpio_ranges, node) {
175862306a36Sopenharmony_ci		if (range->pins) {
175962306a36Sopenharmony_ci			int a;
176062306a36Sopenharmony_ci			seq_printf(s, "%u: %s GPIOS [%u - %u] PINS {",
176162306a36Sopenharmony_ci				range->id, range->name,
176262306a36Sopenharmony_ci				range->base, (range->base + range->npins - 1));
176362306a36Sopenharmony_ci			for (a = 0; a < range->npins - 1; a++)
176462306a36Sopenharmony_ci				seq_printf(s, "%u, ", range->pins[a]);
176562306a36Sopenharmony_ci			seq_printf(s, "%u}\n", range->pins[a]);
176662306a36Sopenharmony_ci		}
176762306a36Sopenharmony_ci		else
176862306a36Sopenharmony_ci			seq_printf(s, "%u: %s GPIOS [%u - %u] PINS [%u - %u]\n",
176962306a36Sopenharmony_ci				range->id, range->name,
177062306a36Sopenharmony_ci				range->base, (range->base + range->npins - 1),
177162306a36Sopenharmony_ci				range->pin_base,
177262306a36Sopenharmony_ci				(range->pin_base + range->npins - 1));
177362306a36Sopenharmony_ci	}
177462306a36Sopenharmony_ci
177562306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
177662306a36Sopenharmony_ci
177762306a36Sopenharmony_ci	return 0;
177862306a36Sopenharmony_ci}
177962306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(pinctrl_gpioranges);
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_cistatic int pinctrl_devices_show(struct seq_file *s, void *what)
178262306a36Sopenharmony_ci{
178362306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
178462306a36Sopenharmony_ci
178562306a36Sopenharmony_ci	seq_puts(s, "name [pinmux] [pinconf]\n");
178662306a36Sopenharmony_ci
178762306a36Sopenharmony_ci	mutex_lock(&pinctrldev_list_mutex);
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci	list_for_each_entry(pctldev, &pinctrldev_list, node) {
179062306a36Sopenharmony_ci		seq_printf(s, "%s ", pctldev->desc->name);
179162306a36Sopenharmony_ci		if (pctldev->desc->pmxops)
179262306a36Sopenharmony_ci			seq_puts(s, "yes ");
179362306a36Sopenharmony_ci		else
179462306a36Sopenharmony_ci			seq_puts(s, "no ");
179562306a36Sopenharmony_ci		if (pctldev->desc->confops)
179662306a36Sopenharmony_ci			seq_puts(s, "yes");
179762306a36Sopenharmony_ci		else
179862306a36Sopenharmony_ci			seq_puts(s, "no");
179962306a36Sopenharmony_ci		seq_puts(s, "\n");
180062306a36Sopenharmony_ci	}
180162306a36Sopenharmony_ci
180262306a36Sopenharmony_ci	mutex_unlock(&pinctrldev_list_mutex);
180362306a36Sopenharmony_ci
180462306a36Sopenharmony_ci	return 0;
180562306a36Sopenharmony_ci}
180662306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(pinctrl_devices);
180762306a36Sopenharmony_ci
180862306a36Sopenharmony_cistatic inline const char *map_type(enum pinctrl_map_type type)
180962306a36Sopenharmony_ci{
181062306a36Sopenharmony_ci	static const char * const names[] = {
181162306a36Sopenharmony_ci		"INVALID",
181262306a36Sopenharmony_ci		"DUMMY_STATE",
181362306a36Sopenharmony_ci		"MUX_GROUP",
181462306a36Sopenharmony_ci		"CONFIGS_PIN",
181562306a36Sopenharmony_ci		"CONFIGS_GROUP",
181662306a36Sopenharmony_ci	};
181762306a36Sopenharmony_ci
181862306a36Sopenharmony_ci	if (type >= ARRAY_SIZE(names))
181962306a36Sopenharmony_ci		return "UNKNOWN";
182062306a36Sopenharmony_ci
182162306a36Sopenharmony_ci	return names[type];
182262306a36Sopenharmony_ci}
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_cistatic int pinctrl_maps_show(struct seq_file *s, void *what)
182562306a36Sopenharmony_ci{
182662306a36Sopenharmony_ci	struct pinctrl_maps *maps_node;
182762306a36Sopenharmony_ci	const struct pinctrl_map *map;
182862306a36Sopenharmony_ci
182962306a36Sopenharmony_ci	seq_puts(s, "Pinctrl maps:\n");
183062306a36Sopenharmony_ci
183162306a36Sopenharmony_ci	mutex_lock(&pinctrl_maps_mutex);
183262306a36Sopenharmony_ci	for_each_pin_map(maps_node, map) {
183362306a36Sopenharmony_ci		seq_printf(s, "device %s\nstate %s\ntype %s (%d)\n",
183462306a36Sopenharmony_ci			   map->dev_name, map->name, map_type(map->type),
183562306a36Sopenharmony_ci			   map->type);
183662306a36Sopenharmony_ci
183762306a36Sopenharmony_ci		if (map->type != PIN_MAP_TYPE_DUMMY_STATE)
183862306a36Sopenharmony_ci			seq_printf(s, "controlling device %s\n",
183962306a36Sopenharmony_ci				   map->ctrl_dev_name);
184062306a36Sopenharmony_ci
184162306a36Sopenharmony_ci		switch (map->type) {
184262306a36Sopenharmony_ci		case PIN_MAP_TYPE_MUX_GROUP:
184362306a36Sopenharmony_ci			pinmux_show_map(s, map);
184462306a36Sopenharmony_ci			break;
184562306a36Sopenharmony_ci		case PIN_MAP_TYPE_CONFIGS_PIN:
184662306a36Sopenharmony_ci		case PIN_MAP_TYPE_CONFIGS_GROUP:
184762306a36Sopenharmony_ci			pinconf_show_map(s, map);
184862306a36Sopenharmony_ci			break;
184962306a36Sopenharmony_ci		default:
185062306a36Sopenharmony_ci			break;
185162306a36Sopenharmony_ci		}
185262306a36Sopenharmony_ci
185362306a36Sopenharmony_ci		seq_putc(s, '\n');
185462306a36Sopenharmony_ci	}
185562306a36Sopenharmony_ci	mutex_unlock(&pinctrl_maps_mutex);
185662306a36Sopenharmony_ci
185762306a36Sopenharmony_ci	return 0;
185862306a36Sopenharmony_ci}
185962306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(pinctrl_maps);
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_cistatic int pinctrl_show(struct seq_file *s, void *what)
186262306a36Sopenharmony_ci{
186362306a36Sopenharmony_ci	struct pinctrl *p;
186462306a36Sopenharmony_ci	struct pinctrl_state *state;
186562306a36Sopenharmony_ci	struct pinctrl_setting *setting;
186662306a36Sopenharmony_ci
186762306a36Sopenharmony_ci	seq_puts(s, "Requested pin control handlers their pinmux maps:\n");
186862306a36Sopenharmony_ci
186962306a36Sopenharmony_ci	mutex_lock(&pinctrl_list_mutex);
187062306a36Sopenharmony_ci
187162306a36Sopenharmony_ci	list_for_each_entry(p, &pinctrl_list, node) {
187262306a36Sopenharmony_ci		seq_printf(s, "device: %s current state: %s\n",
187362306a36Sopenharmony_ci			   dev_name(p->dev),
187462306a36Sopenharmony_ci			   p->state ? p->state->name : "none");
187562306a36Sopenharmony_ci
187662306a36Sopenharmony_ci		list_for_each_entry(state, &p->states, node) {
187762306a36Sopenharmony_ci			seq_printf(s, "  state: %s\n", state->name);
187862306a36Sopenharmony_ci
187962306a36Sopenharmony_ci			list_for_each_entry(setting, &state->settings, node) {
188062306a36Sopenharmony_ci				struct pinctrl_dev *pctldev = setting->pctldev;
188162306a36Sopenharmony_ci
188262306a36Sopenharmony_ci				seq_printf(s, "    type: %s controller %s ",
188362306a36Sopenharmony_ci					   map_type(setting->type),
188462306a36Sopenharmony_ci					   pinctrl_dev_get_name(pctldev));
188562306a36Sopenharmony_ci
188662306a36Sopenharmony_ci				switch (setting->type) {
188762306a36Sopenharmony_ci				case PIN_MAP_TYPE_MUX_GROUP:
188862306a36Sopenharmony_ci					pinmux_show_setting(s, setting);
188962306a36Sopenharmony_ci					break;
189062306a36Sopenharmony_ci				case PIN_MAP_TYPE_CONFIGS_PIN:
189162306a36Sopenharmony_ci				case PIN_MAP_TYPE_CONFIGS_GROUP:
189262306a36Sopenharmony_ci					pinconf_show_setting(s, setting);
189362306a36Sopenharmony_ci					break;
189462306a36Sopenharmony_ci				default:
189562306a36Sopenharmony_ci					break;
189662306a36Sopenharmony_ci				}
189762306a36Sopenharmony_ci			}
189862306a36Sopenharmony_ci		}
189962306a36Sopenharmony_ci	}
190062306a36Sopenharmony_ci
190162306a36Sopenharmony_ci	mutex_unlock(&pinctrl_list_mutex);
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci	return 0;
190462306a36Sopenharmony_ci}
190562306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(pinctrl);
190662306a36Sopenharmony_ci
190762306a36Sopenharmony_cistatic struct dentry *debugfs_root;
190862306a36Sopenharmony_ci
190962306a36Sopenharmony_cistatic void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)
191062306a36Sopenharmony_ci{
191162306a36Sopenharmony_ci	struct dentry *device_root;
191262306a36Sopenharmony_ci	const char *debugfs_name;
191362306a36Sopenharmony_ci
191462306a36Sopenharmony_ci	if (pctldev->desc->name &&
191562306a36Sopenharmony_ci			strcmp(dev_name(pctldev->dev), pctldev->desc->name)) {
191662306a36Sopenharmony_ci		debugfs_name = devm_kasprintf(pctldev->dev, GFP_KERNEL,
191762306a36Sopenharmony_ci				"%s-%s", dev_name(pctldev->dev),
191862306a36Sopenharmony_ci				pctldev->desc->name);
191962306a36Sopenharmony_ci		if (!debugfs_name) {
192062306a36Sopenharmony_ci			pr_warn("failed to determine debugfs dir name for %s\n",
192162306a36Sopenharmony_ci				dev_name(pctldev->dev));
192262306a36Sopenharmony_ci			return;
192362306a36Sopenharmony_ci		}
192462306a36Sopenharmony_ci	} else {
192562306a36Sopenharmony_ci		debugfs_name = dev_name(pctldev->dev);
192662306a36Sopenharmony_ci	}
192762306a36Sopenharmony_ci
192862306a36Sopenharmony_ci	device_root = debugfs_create_dir(debugfs_name, debugfs_root);
192962306a36Sopenharmony_ci	pctldev->device_root = device_root;
193062306a36Sopenharmony_ci
193162306a36Sopenharmony_ci	if (IS_ERR(device_root) || !device_root) {
193262306a36Sopenharmony_ci		pr_warn("failed to create debugfs directory for %s\n",
193362306a36Sopenharmony_ci			dev_name(pctldev->dev));
193462306a36Sopenharmony_ci		return;
193562306a36Sopenharmony_ci	}
193662306a36Sopenharmony_ci	debugfs_create_file("pins", 0444,
193762306a36Sopenharmony_ci			    device_root, pctldev, &pinctrl_pins_fops);
193862306a36Sopenharmony_ci	debugfs_create_file("pingroups", 0444,
193962306a36Sopenharmony_ci			    device_root, pctldev, &pinctrl_groups_fops);
194062306a36Sopenharmony_ci	debugfs_create_file("gpio-ranges", 0444,
194162306a36Sopenharmony_ci			    device_root, pctldev, &pinctrl_gpioranges_fops);
194262306a36Sopenharmony_ci	if (pctldev->desc->pmxops)
194362306a36Sopenharmony_ci		pinmux_init_device_debugfs(device_root, pctldev);
194462306a36Sopenharmony_ci	if (pctldev->desc->confops)
194562306a36Sopenharmony_ci		pinconf_init_device_debugfs(device_root, pctldev);
194662306a36Sopenharmony_ci}
194762306a36Sopenharmony_ci
194862306a36Sopenharmony_cistatic void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev)
194962306a36Sopenharmony_ci{
195062306a36Sopenharmony_ci	debugfs_remove_recursive(pctldev->device_root);
195162306a36Sopenharmony_ci}
195262306a36Sopenharmony_ci
195362306a36Sopenharmony_cistatic void pinctrl_init_debugfs(void)
195462306a36Sopenharmony_ci{
195562306a36Sopenharmony_ci	debugfs_root = debugfs_create_dir("pinctrl", NULL);
195662306a36Sopenharmony_ci	if (IS_ERR(debugfs_root) || !debugfs_root) {
195762306a36Sopenharmony_ci		pr_warn("failed to create debugfs directory\n");
195862306a36Sopenharmony_ci		debugfs_root = NULL;
195962306a36Sopenharmony_ci		return;
196062306a36Sopenharmony_ci	}
196162306a36Sopenharmony_ci
196262306a36Sopenharmony_ci	debugfs_create_file("pinctrl-devices", 0444,
196362306a36Sopenharmony_ci			    debugfs_root, NULL, &pinctrl_devices_fops);
196462306a36Sopenharmony_ci	debugfs_create_file("pinctrl-maps", 0444,
196562306a36Sopenharmony_ci			    debugfs_root, NULL, &pinctrl_maps_fops);
196662306a36Sopenharmony_ci	debugfs_create_file("pinctrl-handles", 0444,
196762306a36Sopenharmony_ci			    debugfs_root, NULL, &pinctrl_fops);
196862306a36Sopenharmony_ci}
196962306a36Sopenharmony_ci
197062306a36Sopenharmony_ci#else /* CONFIG_DEBUG_FS */
197162306a36Sopenharmony_ci
197262306a36Sopenharmony_cistatic void pinctrl_init_device_debugfs(struct pinctrl_dev *pctldev)
197362306a36Sopenharmony_ci{
197462306a36Sopenharmony_ci}
197562306a36Sopenharmony_ci
197662306a36Sopenharmony_cistatic void pinctrl_init_debugfs(void)
197762306a36Sopenharmony_ci{
197862306a36Sopenharmony_ci}
197962306a36Sopenharmony_ci
198062306a36Sopenharmony_cistatic void pinctrl_remove_device_debugfs(struct pinctrl_dev *pctldev)
198162306a36Sopenharmony_ci{
198262306a36Sopenharmony_ci}
198362306a36Sopenharmony_ci
198462306a36Sopenharmony_ci#endif
198562306a36Sopenharmony_ci
198662306a36Sopenharmony_cistatic int pinctrl_check_ops(struct pinctrl_dev *pctldev)
198762306a36Sopenharmony_ci{
198862306a36Sopenharmony_ci	const struct pinctrl_ops *ops = pctldev->desc->pctlops;
198962306a36Sopenharmony_ci
199062306a36Sopenharmony_ci	if (!ops ||
199162306a36Sopenharmony_ci	    !ops->get_groups_count ||
199262306a36Sopenharmony_ci	    !ops->get_group_name)
199362306a36Sopenharmony_ci		return -EINVAL;
199462306a36Sopenharmony_ci
199562306a36Sopenharmony_ci	return 0;
199662306a36Sopenharmony_ci}
199762306a36Sopenharmony_ci
199862306a36Sopenharmony_ci/**
199962306a36Sopenharmony_ci * pinctrl_init_controller() - init a pin controller device
200062306a36Sopenharmony_ci * @pctldesc: descriptor for this pin controller
200162306a36Sopenharmony_ci * @dev: parent device for this pin controller
200262306a36Sopenharmony_ci * @driver_data: private pin controller data for this pin controller
200362306a36Sopenharmony_ci */
200462306a36Sopenharmony_cistatic struct pinctrl_dev *
200562306a36Sopenharmony_cipinctrl_init_controller(struct pinctrl_desc *pctldesc, struct device *dev,
200662306a36Sopenharmony_ci			void *driver_data)
200762306a36Sopenharmony_ci{
200862306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
200962306a36Sopenharmony_ci	int ret;
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_ci	if (!pctldesc)
201262306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
201362306a36Sopenharmony_ci	if (!pctldesc->name)
201462306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
201562306a36Sopenharmony_ci
201662306a36Sopenharmony_ci	pctldev = kzalloc(sizeof(*pctldev), GFP_KERNEL);
201762306a36Sopenharmony_ci	if (!pctldev)
201862306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
201962306a36Sopenharmony_ci
202062306a36Sopenharmony_ci	/* Initialize pin control device struct */
202162306a36Sopenharmony_ci	pctldev->owner = pctldesc->owner;
202262306a36Sopenharmony_ci	pctldev->desc = pctldesc;
202362306a36Sopenharmony_ci	pctldev->driver_data = driver_data;
202462306a36Sopenharmony_ci	INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL);
202562306a36Sopenharmony_ci#ifdef CONFIG_GENERIC_PINCTRL_GROUPS
202662306a36Sopenharmony_ci	INIT_RADIX_TREE(&pctldev->pin_group_tree, GFP_KERNEL);
202762306a36Sopenharmony_ci#endif
202862306a36Sopenharmony_ci#ifdef CONFIG_GENERIC_PINMUX_FUNCTIONS
202962306a36Sopenharmony_ci	INIT_RADIX_TREE(&pctldev->pin_function_tree, GFP_KERNEL);
203062306a36Sopenharmony_ci#endif
203162306a36Sopenharmony_ci	INIT_LIST_HEAD(&pctldev->gpio_ranges);
203262306a36Sopenharmony_ci	INIT_LIST_HEAD(&pctldev->node);
203362306a36Sopenharmony_ci	pctldev->dev = dev;
203462306a36Sopenharmony_ci	mutex_init(&pctldev->mutex);
203562306a36Sopenharmony_ci
203662306a36Sopenharmony_ci	/* check core ops for sanity */
203762306a36Sopenharmony_ci	ret = pinctrl_check_ops(pctldev);
203862306a36Sopenharmony_ci	if (ret) {
203962306a36Sopenharmony_ci		dev_err(dev, "pinctrl ops lacks necessary functions\n");
204062306a36Sopenharmony_ci		goto out_err;
204162306a36Sopenharmony_ci	}
204262306a36Sopenharmony_ci
204362306a36Sopenharmony_ci	/* If we're implementing pinmuxing, check the ops for sanity */
204462306a36Sopenharmony_ci	if (pctldesc->pmxops) {
204562306a36Sopenharmony_ci		ret = pinmux_check_ops(pctldev);
204662306a36Sopenharmony_ci		if (ret)
204762306a36Sopenharmony_ci			goto out_err;
204862306a36Sopenharmony_ci	}
204962306a36Sopenharmony_ci
205062306a36Sopenharmony_ci	/* If we're implementing pinconfig, check the ops for sanity */
205162306a36Sopenharmony_ci	if (pctldesc->confops) {
205262306a36Sopenharmony_ci		ret = pinconf_check_ops(pctldev);
205362306a36Sopenharmony_ci		if (ret)
205462306a36Sopenharmony_ci			goto out_err;
205562306a36Sopenharmony_ci	}
205662306a36Sopenharmony_ci
205762306a36Sopenharmony_ci	/* Register all the pins */
205862306a36Sopenharmony_ci	dev_dbg(dev, "try to register %d pins ...\n",  pctldesc->npins);
205962306a36Sopenharmony_ci	ret = pinctrl_register_pins(pctldev, pctldesc->pins, pctldesc->npins);
206062306a36Sopenharmony_ci	if (ret) {
206162306a36Sopenharmony_ci		dev_err(dev, "error during pin registration\n");
206262306a36Sopenharmony_ci		pinctrl_free_pindescs(pctldev, pctldesc->pins,
206362306a36Sopenharmony_ci				      pctldesc->npins);
206462306a36Sopenharmony_ci		goto out_err;
206562306a36Sopenharmony_ci	}
206662306a36Sopenharmony_ci
206762306a36Sopenharmony_ci	return pctldev;
206862306a36Sopenharmony_ci
206962306a36Sopenharmony_ciout_err:
207062306a36Sopenharmony_ci	mutex_destroy(&pctldev->mutex);
207162306a36Sopenharmony_ci	kfree(pctldev);
207262306a36Sopenharmony_ci	return ERR_PTR(ret);
207362306a36Sopenharmony_ci}
207462306a36Sopenharmony_ci
207562306a36Sopenharmony_cistatic int pinctrl_claim_hogs(struct pinctrl_dev *pctldev)
207662306a36Sopenharmony_ci{
207762306a36Sopenharmony_ci	pctldev->p = create_pinctrl(pctldev->dev, pctldev);
207862306a36Sopenharmony_ci	if (PTR_ERR(pctldev->p) == -ENODEV) {
207962306a36Sopenharmony_ci		dev_dbg(pctldev->dev, "no hogs found\n");
208062306a36Sopenharmony_ci
208162306a36Sopenharmony_ci		return 0;
208262306a36Sopenharmony_ci	}
208362306a36Sopenharmony_ci
208462306a36Sopenharmony_ci	if (IS_ERR(pctldev->p)) {
208562306a36Sopenharmony_ci		dev_err(pctldev->dev, "error claiming hogs: %li\n",
208662306a36Sopenharmony_ci			PTR_ERR(pctldev->p));
208762306a36Sopenharmony_ci
208862306a36Sopenharmony_ci		return PTR_ERR(pctldev->p);
208962306a36Sopenharmony_ci	}
209062306a36Sopenharmony_ci
209162306a36Sopenharmony_ci	pctldev->hog_default =
209262306a36Sopenharmony_ci		pinctrl_lookup_state(pctldev->p, PINCTRL_STATE_DEFAULT);
209362306a36Sopenharmony_ci	if (IS_ERR(pctldev->hog_default)) {
209462306a36Sopenharmony_ci		dev_dbg(pctldev->dev,
209562306a36Sopenharmony_ci			"failed to lookup the default state\n");
209662306a36Sopenharmony_ci	} else {
209762306a36Sopenharmony_ci		if (pinctrl_select_state(pctldev->p,
209862306a36Sopenharmony_ci					 pctldev->hog_default))
209962306a36Sopenharmony_ci			dev_err(pctldev->dev,
210062306a36Sopenharmony_ci				"failed to select default state\n");
210162306a36Sopenharmony_ci	}
210262306a36Sopenharmony_ci
210362306a36Sopenharmony_ci	pctldev->hog_sleep =
210462306a36Sopenharmony_ci		pinctrl_lookup_state(pctldev->p,
210562306a36Sopenharmony_ci				     PINCTRL_STATE_SLEEP);
210662306a36Sopenharmony_ci	if (IS_ERR(pctldev->hog_sleep))
210762306a36Sopenharmony_ci		dev_dbg(pctldev->dev,
210862306a36Sopenharmony_ci			"failed to lookup the sleep state\n");
210962306a36Sopenharmony_ci
211062306a36Sopenharmony_ci	return 0;
211162306a36Sopenharmony_ci}
211262306a36Sopenharmony_ci
211362306a36Sopenharmony_ciint pinctrl_enable(struct pinctrl_dev *pctldev)
211462306a36Sopenharmony_ci{
211562306a36Sopenharmony_ci	int error;
211662306a36Sopenharmony_ci
211762306a36Sopenharmony_ci	error = pinctrl_claim_hogs(pctldev);
211862306a36Sopenharmony_ci	if (error) {
211962306a36Sopenharmony_ci		dev_err(pctldev->dev, "could not claim hogs: %i\n",
212062306a36Sopenharmony_ci			error);
212162306a36Sopenharmony_ci		pinctrl_free_pindescs(pctldev, pctldev->desc->pins,
212262306a36Sopenharmony_ci				      pctldev->desc->npins);
212362306a36Sopenharmony_ci		mutex_destroy(&pctldev->mutex);
212462306a36Sopenharmony_ci		kfree(pctldev);
212562306a36Sopenharmony_ci
212662306a36Sopenharmony_ci		return error;
212762306a36Sopenharmony_ci	}
212862306a36Sopenharmony_ci
212962306a36Sopenharmony_ci	mutex_lock(&pinctrldev_list_mutex);
213062306a36Sopenharmony_ci	list_add_tail(&pctldev->node, &pinctrldev_list);
213162306a36Sopenharmony_ci	mutex_unlock(&pinctrldev_list_mutex);
213262306a36Sopenharmony_ci
213362306a36Sopenharmony_ci	pinctrl_init_device_debugfs(pctldev);
213462306a36Sopenharmony_ci
213562306a36Sopenharmony_ci	return 0;
213662306a36Sopenharmony_ci}
213762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_enable);
213862306a36Sopenharmony_ci
213962306a36Sopenharmony_ci/**
214062306a36Sopenharmony_ci * pinctrl_register() - register a pin controller device
214162306a36Sopenharmony_ci * @pctldesc: descriptor for this pin controller
214262306a36Sopenharmony_ci * @dev: parent device for this pin controller
214362306a36Sopenharmony_ci * @driver_data: private pin controller data for this pin controller
214462306a36Sopenharmony_ci *
214562306a36Sopenharmony_ci * Note that pinctrl_register() is known to have problems as the pin
214662306a36Sopenharmony_ci * controller driver functions are called before the driver has a
214762306a36Sopenharmony_ci * struct pinctrl_dev handle. To avoid issues later on, please use the
214862306a36Sopenharmony_ci * new pinctrl_register_and_init() below instead.
214962306a36Sopenharmony_ci */
215062306a36Sopenharmony_cistruct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
215162306a36Sopenharmony_ci				    struct device *dev, void *driver_data)
215262306a36Sopenharmony_ci{
215362306a36Sopenharmony_ci	struct pinctrl_dev *pctldev;
215462306a36Sopenharmony_ci	int error;
215562306a36Sopenharmony_ci
215662306a36Sopenharmony_ci	pctldev = pinctrl_init_controller(pctldesc, dev, driver_data);
215762306a36Sopenharmony_ci	if (IS_ERR(pctldev))
215862306a36Sopenharmony_ci		return pctldev;
215962306a36Sopenharmony_ci
216062306a36Sopenharmony_ci	error = pinctrl_enable(pctldev);
216162306a36Sopenharmony_ci	if (error)
216262306a36Sopenharmony_ci		return ERR_PTR(error);
216362306a36Sopenharmony_ci
216462306a36Sopenharmony_ci	return pctldev;
216562306a36Sopenharmony_ci}
216662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_register);
216762306a36Sopenharmony_ci
216862306a36Sopenharmony_ci/**
216962306a36Sopenharmony_ci * pinctrl_register_and_init() - register and init pin controller device
217062306a36Sopenharmony_ci * @pctldesc: descriptor for this pin controller
217162306a36Sopenharmony_ci * @dev: parent device for this pin controller
217262306a36Sopenharmony_ci * @driver_data: private pin controller data for this pin controller
217362306a36Sopenharmony_ci * @pctldev: pin controller device
217462306a36Sopenharmony_ci *
217562306a36Sopenharmony_ci * Note that pinctrl_enable() still needs to be manually called after
217662306a36Sopenharmony_ci * this once the driver is ready.
217762306a36Sopenharmony_ci */
217862306a36Sopenharmony_ciint pinctrl_register_and_init(struct pinctrl_desc *pctldesc,
217962306a36Sopenharmony_ci			      struct device *dev, void *driver_data,
218062306a36Sopenharmony_ci			      struct pinctrl_dev **pctldev)
218162306a36Sopenharmony_ci{
218262306a36Sopenharmony_ci	struct pinctrl_dev *p;
218362306a36Sopenharmony_ci
218462306a36Sopenharmony_ci	p = pinctrl_init_controller(pctldesc, dev, driver_data);
218562306a36Sopenharmony_ci	if (IS_ERR(p))
218662306a36Sopenharmony_ci		return PTR_ERR(p);
218762306a36Sopenharmony_ci
218862306a36Sopenharmony_ci	/*
218962306a36Sopenharmony_ci	 * We have pinctrl_start() call functions in the pin controller
219062306a36Sopenharmony_ci	 * driver with create_pinctrl() for at least dt_node_to_map(). So
219162306a36Sopenharmony_ci	 * let's make sure pctldev is properly initialized for the
219262306a36Sopenharmony_ci	 * pin controller driver before we do anything.
219362306a36Sopenharmony_ci	 */
219462306a36Sopenharmony_ci	*pctldev = p;
219562306a36Sopenharmony_ci
219662306a36Sopenharmony_ci	return 0;
219762306a36Sopenharmony_ci}
219862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_register_and_init);
219962306a36Sopenharmony_ci
220062306a36Sopenharmony_ci/**
220162306a36Sopenharmony_ci * pinctrl_unregister() - unregister pinmux
220262306a36Sopenharmony_ci * @pctldev: pin controller to unregister
220362306a36Sopenharmony_ci *
220462306a36Sopenharmony_ci * Called by pinmux drivers to unregister a pinmux.
220562306a36Sopenharmony_ci */
220662306a36Sopenharmony_civoid pinctrl_unregister(struct pinctrl_dev *pctldev)
220762306a36Sopenharmony_ci{
220862306a36Sopenharmony_ci	struct pinctrl_gpio_range *range, *n;
220962306a36Sopenharmony_ci
221062306a36Sopenharmony_ci	if (!pctldev)
221162306a36Sopenharmony_ci		return;
221262306a36Sopenharmony_ci
221362306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
221462306a36Sopenharmony_ci	pinctrl_remove_device_debugfs(pctldev);
221562306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
221662306a36Sopenharmony_ci
221762306a36Sopenharmony_ci	if (!IS_ERR_OR_NULL(pctldev->p))
221862306a36Sopenharmony_ci		pinctrl_put(pctldev->p);
221962306a36Sopenharmony_ci
222062306a36Sopenharmony_ci	mutex_lock(&pinctrldev_list_mutex);
222162306a36Sopenharmony_ci	mutex_lock(&pctldev->mutex);
222262306a36Sopenharmony_ci	/* TODO: check that no pinmuxes are still active? */
222362306a36Sopenharmony_ci	list_del(&pctldev->node);
222462306a36Sopenharmony_ci	pinmux_generic_free_functions(pctldev);
222562306a36Sopenharmony_ci	pinctrl_generic_free_groups(pctldev);
222662306a36Sopenharmony_ci	/* Destroy descriptor tree */
222762306a36Sopenharmony_ci	pinctrl_free_pindescs(pctldev, pctldev->desc->pins,
222862306a36Sopenharmony_ci			      pctldev->desc->npins);
222962306a36Sopenharmony_ci	/* remove gpio ranges map */
223062306a36Sopenharmony_ci	list_for_each_entry_safe(range, n, &pctldev->gpio_ranges, node)
223162306a36Sopenharmony_ci		list_del(&range->node);
223262306a36Sopenharmony_ci
223362306a36Sopenharmony_ci	mutex_unlock(&pctldev->mutex);
223462306a36Sopenharmony_ci	mutex_destroy(&pctldev->mutex);
223562306a36Sopenharmony_ci	kfree(pctldev);
223662306a36Sopenharmony_ci	mutex_unlock(&pinctrldev_list_mutex);
223762306a36Sopenharmony_ci}
223862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(pinctrl_unregister);
223962306a36Sopenharmony_ci
224062306a36Sopenharmony_cistatic void devm_pinctrl_dev_release(struct device *dev, void *res)
224162306a36Sopenharmony_ci{
224262306a36Sopenharmony_ci	struct pinctrl_dev *pctldev = *(struct pinctrl_dev **)res;
224362306a36Sopenharmony_ci
224462306a36Sopenharmony_ci	pinctrl_unregister(pctldev);
224562306a36Sopenharmony_ci}
224662306a36Sopenharmony_ci
224762306a36Sopenharmony_cistatic int devm_pinctrl_dev_match(struct device *dev, void *res, void *data)
224862306a36Sopenharmony_ci{
224962306a36Sopenharmony_ci	struct pctldev **r = res;
225062306a36Sopenharmony_ci
225162306a36Sopenharmony_ci	if (WARN_ON(!r || !*r))
225262306a36Sopenharmony_ci		return 0;
225362306a36Sopenharmony_ci
225462306a36Sopenharmony_ci	return *r == data;
225562306a36Sopenharmony_ci}
225662306a36Sopenharmony_ci
225762306a36Sopenharmony_ci/**
225862306a36Sopenharmony_ci * devm_pinctrl_register() - Resource managed version of pinctrl_register().
225962306a36Sopenharmony_ci * @dev: parent device for this pin controller
226062306a36Sopenharmony_ci * @pctldesc: descriptor for this pin controller
226162306a36Sopenharmony_ci * @driver_data: private pin controller data for this pin controller
226262306a36Sopenharmony_ci *
226362306a36Sopenharmony_ci * Returns an error pointer if pincontrol register failed. Otherwise
226462306a36Sopenharmony_ci * it returns valid pinctrl handle.
226562306a36Sopenharmony_ci *
226662306a36Sopenharmony_ci * The pinctrl device will be automatically released when the device is unbound.
226762306a36Sopenharmony_ci */
226862306a36Sopenharmony_cistruct pinctrl_dev *devm_pinctrl_register(struct device *dev,
226962306a36Sopenharmony_ci					  struct pinctrl_desc *pctldesc,
227062306a36Sopenharmony_ci					  void *driver_data)
227162306a36Sopenharmony_ci{
227262306a36Sopenharmony_ci	struct pinctrl_dev **ptr, *pctldev;
227362306a36Sopenharmony_ci
227462306a36Sopenharmony_ci	ptr = devres_alloc(devm_pinctrl_dev_release, sizeof(*ptr), GFP_KERNEL);
227562306a36Sopenharmony_ci	if (!ptr)
227662306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
227762306a36Sopenharmony_ci
227862306a36Sopenharmony_ci	pctldev = pinctrl_register(pctldesc, dev, driver_data);
227962306a36Sopenharmony_ci	if (IS_ERR(pctldev)) {
228062306a36Sopenharmony_ci		devres_free(ptr);
228162306a36Sopenharmony_ci		return pctldev;
228262306a36Sopenharmony_ci	}
228362306a36Sopenharmony_ci
228462306a36Sopenharmony_ci	*ptr = pctldev;
228562306a36Sopenharmony_ci	devres_add(dev, ptr);
228662306a36Sopenharmony_ci
228762306a36Sopenharmony_ci	return pctldev;
228862306a36Sopenharmony_ci}
228962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_pinctrl_register);
229062306a36Sopenharmony_ci
229162306a36Sopenharmony_ci/**
229262306a36Sopenharmony_ci * devm_pinctrl_register_and_init() - Resource managed pinctrl register and init
229362306a36Sopenharmony_ci * @dev: parent device for this pin controller
229462306a36Sopenharmony_ci * @pctldesc: descriptor for this pin controller
229562306a36Sopenharmony_ci * @driver_data: private pin controller data for this pin controller
229662306a36Sopenharmony_ci * @pctldev: pin controller device
229762306a36Sopenharmony_ci *
229862306a36Sopenharmony_ci * Returns zero on success or an error number on failure.
229962306a36Sopenharmony_ci *
230062306a36Sopenharmony_ci * The pinctrl device will be automatically released when the device is unbound.
230162306a36Sopenharmony_ci */
230262306a36Sopenharmony_ciint devm_pinctrl_register_and_init(struct device *dev,
230362306a36Sopenharmony_ci				   struct pinctrl_desc *pctldesc,
230462306a36Sopenharmony_ci				   void *driver_data,
230562306a36Sopenharmony_ci				   struct pinctrl_dev **pctldev)
230662306a36Sopenharmony_ci{
230762306a36Sopenharmony_ci	struct pinctrl_dev **ptr;
230862306a36Sopenharmony_ci	int error;
230962306a36Sopenharmony_ci
231062306a36Sopenharmony_ci	ptr = devres_alloc(devm_pinctrl_dev_release, sizeof(*ptr), GFP_KERNEL);
231162306a36Sopenharmony_ci	if (!ptr)
231262306a36Sopenharmony_ci		return -ENOMEM;
231362306a36Sopenharmony_ci
231462306a36Sopenharmony_ci	error = pinctrl_register_and_init(pctldesc, dev, driver_data, pctldev);
231562306a36Sopenharmony_ci	if (error) {
231662306a36Sopenharmony_ci		devres_free(ptr);
231762306a36Sopenharmony_ci		return error;
231862306a36Sopenharmony_ci	}
231962306a36Sopenharmony_ci
232062306a36Sopenharmony_ci	*ptr = *pctldev;
232162306a36Sopenharmony_ci	devres_add(dev, ptr);
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_ci	return 0;
232462306a36Sopenharmony_ci}
232562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_pinctrl_register_and_init);
232662306a36Sopenharmony_ci
232762306a36Sopenharmony_ci/**
232862306a36Sopenharmony_ci * devm_pinctrl_unregister() - Resource managed version of pinctrl_unregister().
232962306a36Sopenharmony_ci * @dev: device for which resource was allocated
233062306a36Sopenharmony_ci * @pctldev: the pinctrl device to unregister.
233162306a36Sopenharmony_ci */
233262306a36Sopenharmony_civoid devm_pinctrl_unregister(struct device *dev, struct pinctrl_dev *pctldev)
233362306a36Sopenharmony_ci{
233462306a36Sopenharmony_ci	WARN_ON(devres_release(dev, devm_pinctrl_dev_release,
233562306a36Sopenharmony_ci			       devm_pinctrl_dev_match, pctldev));
233662306a36Sopenharmony_ci}
233762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(devm_pinctrl_unregister);
233862306a36Sopenharmony_ci
233962306a36Sopenharmony_cistatic int __init pinctrl_init(void)
234062306a36Sopenharmony_ci{
234162306a36Sopenharmony_ci	pr_info("initialized pinctrl subsystem\n");
234262306a36Sopenharmony_ci	pinctrl_init_debugfs();
234362306a36Sopenharmony_ci	return 0;
234462306a36Sopenharmony_ci}
234562306a36Sopenharmony_ci
234662306a36Sopenharmony_ci/* init early since many drivers really need to initialized pinmux early */
234762306a36Sopenharmony_cicore_initcall(pinctrl_init);
2348