1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Core driver for the pin muxing portions of the pin control subsystem
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2011-2012 ST-Ericsson SA
6*4882a593Smuzhiyun * Written on behalf of Linaro for ST-Ericsson
7*4882a593Smuzhiyun * Based on bits of regulator core, gpio core and clk core
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Author: Linus Walleij <linus.walleij@linaro.org>
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun #define pr_fmt(fmt) "pinmux core: " fmt
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun #include <linux/kernel.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun #include <linux/init.h>
18*4882a593Smuzhiyun #include <linux/device.h>
19*4882a593Smuzhiyun #include <linux/slab.h>
20*4882a593Smuzhiyun #include <linux/radix-tree.h>
21*4882a593Smuzhiyun #include <linux/err.h>
22*4882a593Smuzhiyun #include <linux/list.h>
23*4882a593Smuzhiyun #include <linux/string.h>
24*4882a593Smuzhiyun #include <linux/debugfs.h>
25*4882a593Smuzhiyun #include <linux/seq_file.h>
26*4882a593Smuzhiyun #include <linux/pinctrl/machine.h>
27*4882a593Smuzhiyun #include <linux/pinctrl/pinmux.h>
28*4882a593Smuzhiyun #include "core.h"
29*4882a593Smuzhiyun #include "pinmux.h"
30*4882a593Smuzhiyun
pinmux_check_ops(struct pinctrl_dev * pctldev)31*4882a593Smuzhiyun int pinmux_check_ops(struct pinctrl_dev *pctldev)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun const struct pinmux_ops *ops = pctldev->desc->pmxops;
34*4882a593Smuzhiyun unsigned nfuncs;
35*4882a593Smuzhiyun unsigned selector = 0;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /* Check that we implement required operations */
38*4882a593Smuzhiyun if (!ops ||
39*4882a593Smuzhiyun !ops->get_functions_count ||
40*4882a593Smuzhiyun !ops->get_function_name ||
41*4882a593Smuzhiyun !ops->get_function_groups ||
42*4882a593Smuzhiyun !ops->set_mux) {
43*4882a593Smuzhiyun dev_err(pctldev->dev, "pinmux ops lacks necessary functions\n");
44*4882a593Smuzhiyun return -EINVAL;
45*4882a593Smuzhiyun }
46*4882a593Smuzhiyun /* Check that all functions registered have names */
47*4882a593Smuzhiyun nfuncs = ops->get_functions_count(pctldev);
48*4882a593Smuzhiyun while (selector < nfuncs) {
49*4882a593Smuzhiyun const char *fname = ops->get_function_name(pctldev,
50*4882a593Smuzhiyun selector);
51*4882a593Smuzhiyun if (!fname) {
52*4882a593Smuzhiyun dev_err(pctldev->dev, "pinmux ops has no name for function%u\n",
53*4882a593Smuzhiyun selector);
54*4882a593Smuzhiyun return -EINVAL;
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun selector++;
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun return 0;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun
pinmux_validate_map(const struct pinctrl_map * map,int i)62*4882a593Smuzhiyun int pinmux_validate_map(const struct pinctrl_map *map, int i)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun if (!map->data.mux.function) {
65*4882a593Smuzhiyun pr_err("failed to register map %s (%d): no function given\n",
66*4882a593Smuzhiyun map->name, i);
67*4882a593Smuzhiyun return -EINVAL;
68*4882a593Smuzhiyun }
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun return 0;
71*4882a593Smuzhiyun }
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun /**
74*4882a593Smuzhiyun * pinmux_can_be_used_for_gpio() - check if a specific pin
75*4882a593Smuzhiyun * is either muxed to a different function or used as gpio.
76*4882a593Smuzhiyun *
77*4882a593Smuzhiyun * @pctldev: the associated pin controller device
78*4882a593Smuzhiyun * @pin: the pin number in the global pin space
79*4882a593Smuzhiyun *
80*4882a593Smuzhiyun * Controllers not defined as strict will always return true,
81*4882a593Smuzhiyun * menaning that the gpio can be used.
82*4882a593Smuzhiyun */
pinmux_can_be_used_for_gpio(struct pinctrl_dev * pctldev,unsigned pin)83*4882a593Smuzhiyun bool pinmux_can_be_used_for_gpio(struct pinctrl_dev *pctldev, unsigned pin)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun struct pin_desc *desc = pin_desc_get(pctldev, pin);
86*4882a593Smuzhiyun const struct pinmux_ops *ops = pctldev->desc->pmxops;
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun /* Can't inspect pin, assume it can be used */
89*4882a593Smuzhiyun if (!desc || !ops)
90*4882a593Smuzhiyun return true;
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun if (ops->strict && desc->mux_usecount)
93*4882a593Smuzhiyun return false;
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun return !(ops->strict && !!desc->gpio_owner);
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun /**
99*4882a593Smuzhiyun * pin_request() - request a single pin to be muxed in, typically for GPIO
100*4882a593Smuzhiyun * @pctldev: the associated pin controller device
101*4882a593Smuzhiyun * @pin: the pin number in the global pin space
102*4882a593Smuzhiyun * @owner: a representation of the owner of this pin; typically the device
103*4882a593Smuzhiyun * name that controls its mux function, or the requested GPIO name
104*4882a593Smuzhiyun * @gpio_range: the range matching the GPIO pin if this is a request for a
105*4882a593Smuzhiyun * single GPIO pin
106*4882a593Smuzhiyun */
pin_request(struct pinctrl_dev * pctldev,int pin,const char * owner,struct pinctrl_gpio_range * gpio_range)107*4882a593Smuzhiyun static int pin_request(struct pinctrl_dev *pctldev,
108*4882a593Smuzhiyun int pin, const char *owner,
109*4882a593Smuzhiyun struct pinctrl_gpio_range *gpio_range)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun struct pin_desc *desc;
112*4882a593Smuzhiyun const struct pinmux_ops *ops = pctldev->desc->pmxops;
113*4882a593Smuzhiyun int status = -EINVAL;
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun desc = pin_desc_get(pctldev, pin);
116*4882a593Smuzhiyun if (desc == NULL) {
117*4882a593Smuzhiyun dev_err(pctldev->dev,
118*4882a593Smuzhiyun "pin %d is not registered so it cannot be requested\n",
119*4882a593Smuzhiyun pin);
120*4882a593Smuzhiyun goto out;
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun dev_dbg(pctldev->dev, "request pin %d (%s) for %s\n",
124*4882a593Smuzhiyun pin, desc->name, owner);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun if ((!gpio_range || ops->strict) &&
127*4882a593Smuzhiyun desc->mux_usecount && strcmp(desc->mux_owner, owner)) {
128*4882a593Smuzhiyun dev_err(pctldev->dev,
129*4882a593Smuzhiyun "pin %s already requested by %s; cannot claim for %s\n",
130*4882a593Smuzhiyun desc->name, desc->mux_owner, owner);
131*4882a593Smuzhiyun goto out;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun if ((gpio_range || ops->strict) && desc->gpio_owner) {
135*4882a593Smuzhiyun dev_err(pctldev->dev,
136*4882a593Smuzhiyun "pin %s already requested by %s; cannot claim for %s\n",
137*4882a593Smuzhiyun desc->name, desc->gpio_owner, owner);
138*4882a593Smuzhiyun goto out;
139*4882a593Smuzhiyun }
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun if (gpio_range) {
142*4882a593Smuzhiyun desc->gpio_owner = owner;
143*4882a593Smuzhiyun } else {
144*4882a593Smuzhiyun desc->mux_usecount++;
145*4882a593Smuzhiyun if (desc->mux_usecount > 1)
146*4882a593Smuzhiyun return 0;
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun desc->mux_owner = owner;
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun /* Let each pin increase references to this module */
152*4882a593Smuzhiyun if (!try_module_get(pctldev->owner)) {
153*4882a593Smuzhiyun dev_err(pctldev->dev,
154*4882a593Smuzhiyun "could not increase module refcount for pin %d\n",
155*4882a593Smuzhiyun pin);
156*4882a593Smuzhiyun status = -EINVAL;
157*4882a593Smuzhiyun goto out_free_pin;
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun /*
161*4882a593Smuzhiyun * If there is no kind of request function for the pin we just assume
162*4882a593Smuzhiyun * we got it by default and proceed.
163*4882a593Smuzhiyun */
164*4882a593Smuzhiyun if (gpio_range && ops->gpio_request_enable)
165*4882a593Smuzhiyun /* This requests and enables a single GPIO pin */
166*4882a593Smuzhiyun status = ops->gpio_request_enable(pctldev, gpio_range, pin);
167*4882a593Smuzhiyun else if (ops->request)
168*4882a593Smuzhiyun status = ops->request(pctldev, pin);
169*4882a593Smuzhiyun else
170*4882a593Smuzhiyun status = 0;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun if (status) {
173*4882a593Smuzhiyun dev_err(pctldev->dev, "request() failed for pin %d\n", pin);
174*4882a593Smuzhiyun module_put(pctldev->owner);
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun out_free_pin:
178*4882a593Smuzhiyun if (status) {
179*4882a593Smuzhiyun if (gpio_range) {
180*4882a593Smuzhiyun desc->gpio_owner = NULL;
181*4882a593Smuzhiyun } else {
182*4882a593Smuzhiyun desc->mux_usecount--;
183*4882a593Smuzhiyun if (!desc->mux_usecount)
184*4882a593Smuzhiyun desc->mux_owner = NULL;
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun out:
188*4882a593Smuzhiyun if (status)
189*4882a593Smuzhiyun dev_err(pctldev->dev, "pin-%d (%s) status %d\n",
190*4882a593Smuzhiyun pin, owner, status);
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun return status;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun
195*4882a593Smuzhiyun /**
196*4882a593Smuzhiyun * pin_free() - release a single muxed in pin so something else can be muxed
197*4882a593Smuzhiyun * @pctldev: pin controller device handling this pin
198*4882a593Smuzhiyun * @pin: the pin to free
199*4882a593Smuzhiyun * @gpio_range: the range matching the GPIO pin if this is a request for a
200*4882a593Smuzhiyun * single GPIO pin
201*4882a593Smuzhiyun *
202*4882a593Smuzhiyun * This function returns a pointer to the previous owner. This is used
203*4882a593Smuzhiyun * for callers that dynamically allocate an owner name so it can be freed
204*4882a593Smuzhiyun * once the pin is free. This is done for GPIO request functions.
205*4882a593Smuzhiyun */
pin_free(struct pinctrl_dev * pctldev,int pin,struct pinctrl_gpio_range * gpio_range)206*4882a593Smuzhiyun static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
207*4882a593Smuzhiyun struct pinctrl_gpio_range *gpio_range)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun const struct pinmux_ops *ops = pctldev->desc->pmxops;
210*4882a593Smuzhiyun struct pin_desc *desc;
211*4882a593Smuzhiyun const char *owner;
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun desc = pin_desc_get(pctldev, pin);
214*4882a593Smuzhiyun if (desc == NULL) {
215*4882a593Smuzhiyun dev_err(pctldev->dev,
216*4882a593Smuzhiyun "pin is not registered so it cannot be freed\n");
217*4882a593Smuzhiyun return NULL;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun if (!gpio_range) {
221*4882a593Smuzhiyun /*
222*4882a593Smuzhiyun * A pin should not be freed more times than allocated.
223*4882a593Smuzhiyun */
224*4882a593Smuzhiyun if (WARN_ON(!desc->mux_usecount))
225*4882a593Smuzhiyun return NULL;
226*4882a593Smuzhiyun desc->mux_usecount--;
227*4882a593Smuzhiyun if (desc->mux_usecount)
228*4882a593Smuzhiyun return NULL;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun /*
232*4882a593Smuzhiyun * If there is no kind of request function for the pin we just assume
233*4882a593Smuzhiyun * we got it by default and proceed.
234*4882a593Smuzhiyun */
235*4882a593Smuzhiyun if (gpio_range && ops->gpio_disable_free)
236*4882a593Smuzhiyun ops->gpio_disable_free(pctldev, gpio_range, pin);
237*4882a593Smuzhiyun else if (ops->free)
238*4882a593Smuzhiyun ops->free(pctldev, pin);
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun if (gpio_range) {
241*4882a593Smuzhiyun owner = desc->gpio_owner;
242*4882a593Smuzhiyun desc->gpio_owner = NULL;
243*4882a593Smuzhiyun } else {
244*4882a593Smuzhiyun owner = desc->mux_owner;
245*4882a593Smuzhiyun desc->mux_owner = NULL;
246*4882a593Smuzhiyun desc->mux_setting = NULL;
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun module_put(pctldev->owner);
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun return owner;
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun /**
255*4882a593Smuzhiyun * pinmux_request_gpio() - request pinmuxing for a GPIO pin
256*4882a593Smuzhiyun * @pctldev: pin controller device affected
257*4882a593Smuzhiyun * @pin: the pin to mux in for GPIO
258*4882a593Smuzhiyun * @range: the applicable GPIO range
259*4882a593Smuzhiyun * @gpio: number of requested GPIO
260*4882a593Smuzhiyun */
pinmux_request_gpio(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range,unsigned pin,unsigned gpio)261*4882a593Smuzhiyun int pinmux_request_gpio(struct pinctrl_dev *pctldev,
262*4882a593Smuzhiyun struct pinctrl_gpio_range *range,
263*4882a593Smuzhiyun unsigned pin, unsigned gpio)
264*4882a593Smuzhiyun {
265*4882a593Smuzhiyun const char *owner;
266*4882a593Smuzhiyun int ret;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun /* Conjure some name stating what chip and pin this is taken by */
269*4882a593Smuzhiyun owner = kasprintf(GFP_KERNEL, "%s:%d", range->name, gpio);
270*4882a593Smuzhiyun if (!owner)
271*4882a593Smuzhiyun return -ENOMEM;
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun ret = pin_request(pctldev, pin, owner, range);
274*4882a593Smuzhiyun if (ret < 0)
275*4882a593Smuzhiyun kfree(owner);
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun return ret;
278*4882a593Smuzhiyun }
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun /**
281*4882a593Smuzhiyun * pinmux_free_gpio() - release a pin from GPIO muxing
282*4882a593Smuzhiyun * @pctldev: the pin controller device for the pin
283*4882a593Smuzhiyun * @pin: the affected currently GPIO-muxed in pin
284*4882a593Smuzhiyun * @range: applicable GPIO range
285*4882a593Smuzhiyun */
pinmux_free_gpio(struct pinctrl_dev * pctldev,unsigned pin,struct pinctrl_gpio_range * range)286*4882a593Smuzhiyun void pinmux_free_gpio(struct pinctrl_dev *pctldev, unsigned pin,
287*4882a593Smuzhiyun struct pinctrl_gpio_range *range)
288*4882a593Smuzhiyun {
289*4882a593Smuzhiyun const char *owner;
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun owner = pin_free(pctldev, pin, range);
292*4882a593Smuzhiyun kfree(owner);
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun
295*4882a593Smuzhiyun /**
296*4882a593Smuzhiyun * pinmux_gpio_direction() - set the direction of a single muxed-in GPIO pin
297*4882a593Smuzhiyun * @pctldev: the pin controller handling this pin
298*4882a593Smuzhiyun * @range: applicable GPIO range
299*4882a593Smuzhiyun * @pin: the affected GPIO pin in this controller
300*4882a593Smuzhiyun * @input: true if we set the pin as input, false for output
301*4882a593Smuzhiyun */
pinmux_gpio_direction(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range,unsigned pin,bool input)302*4882a593Smuzhiyun int pinmux_gpio_direction(struct pinctrl_dev *pctldev,
303*4882a593Smuzhiyun struct pinctrl_gpio_range *range,
304*4882a593Smuzhiyun unsigned pin, bool input)
305*4882a593Smuzhiyun {
306*4882a593Smuzhiyun const struct pinmux_ops *ops;
307*4882a593Smuzhiyun int ret;
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun ops = pctldev->desc->pmxops;
310*4882a593Smuzhiyun
311*4882a593Smuzhiyun if (ops->gpio_set_direction)
312*4882a593Smuzhiyun ret = ops->gpio_set_direction(pctldev, range, pin, input);
313*4882a593Smuzhiyun else
314*4882a593Smuzhiyun ret = 0;
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun return ret;
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun
pinmux_func_name_to_selector(struct pinctrl_dev * pctldev,const char * function)319*4882a593Smuzhiyun static int pinmux_func_name_to_selector(struct pinctrl_dev *pctldev,
320*4882a593Smuzhiyun const char *function)
321*4882a593Smuzhiyun {
322*4882a593Smuzhiyun const struct pinmux_ops *ops = pctldev->desc->pmxops;
323*4882a593Smuzhiyun unsigned nfuncs = ops->get_functions_count(pctldev);
324*4882a593Smuzhiyun unsigned selector = 0;
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun /* See if this pctldev has this function */
327*4882a593Smuzhiyun while (selector < nfuncs) {
328*4882a593Smuzhiyun const char *fname = ops->get_function_name(pctldev, selector);
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun if (!strcmp(function, fname))
331*4882a593Smuzhiyun return selector;
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun selector++;
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun return -EINVAL;
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun
pinmux_map_to_setting(const struct pinctrl_map * map,struct pinctrl_setting * setting)339*4882a593Smuzhiyun int pinmux_map_to_setting(const struct pinctrl_map *map,
340*4882a593Smuzhiyun struct pinctrl_setting *setting)
341*4882a593Smuzhiyun {
342*4882a593Smuzhiyun struct pinctrl_dev *pctldev = setting->pctldev;
343*4882a593Smuzhiyun const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
344*4882a593Smuzhiyun char const * const *groups;
345*4882a593Smuzhiyun unsigned num_groups;
346*4882a593Smuzhiyun int ret;
347*4882a593Smuzhiyun const char *group;
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun if (!pmxops) {
350*4882a593Smuzhiyun dev_err(pctldev->dev, "does not support mux function\n");
351*4882a593Smuzhiyun return -EINVAL;
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun ret = pinmux_func_name_to_selector(pctldev, map->data.mux.function);
355*4882a593Smuzhiyun if (ret < 0) {
356*4882a593Smuzhiyun dev_err(pctldev->dev, "invalid function %s in map table\n",
357*4882a593Smuzhiyun map->data.mux.function);
358*4882a593Smuzhiyun return ret;
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun setting->data.mux.func = ret;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun ret = pmxops->get_function_groups(pctldev, setting->data.mux.func,
363*4882a593Smuzhiyun &groups, &num_groups);
364*4882a593Smuzhiyun if (ret < 0) {
365*4882a593Smuzhiyun dev_err(pctldev->dev, "can't query groups for function %s\n",
366*4882a593Smuzhiyun map->data.mux.function);
367*4882a593Smuzhiyun return ret;
368*4882a593Smuzhiyun }
369*4882a593Smuzhiyun if (!num_groups) {
370*4882a593Smuzhiyun dev_err(pctldev->dev,
371*4882a593Smuzhiyun "function %s can't be selected on any group\n",
372*4882a593Smuzhiyun map->data.mux.function);
373*4882a593Smuzhiyun return -EINVAL;
374*4882a593Smuzhiyun }
375*4882a593Smuzhiyun if (map->data.mux.group) {
376*4882a593Smuzhiyun group = map->data.mux.group;
377*4882a593Smuzhiyun ret = match_string(groups, num_groups, group);
378*4882a593Smuzhiyun if (ret < 0) {
379*4882a593Smuzhiyun dev_err(pctldev->dev,
380*4882a593Smuzhiyun "invalid group \"%s\" for function \"%s\"\n",
381*4882a593Smuzhiyun group, map->data.mux.function);
382*4882a593Smuzhiyun return ret;
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun } else {
385*4882a593Smuzhiyun group = groups[0];
386*4882a593Smuzhiyun }
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun ret = pinctrl_get_group_selector(pctldev, group);
389*4882a593Smuzhiyun if (ret < 0) {
390*4882a593Smuzhiyun dev_err(pctldev->dev, "invalid group %s in map table\n",
391*4882a593Smuzhiyun map->data.mux.group);
392*4882a593Smuzhiyun return ret;
393*4882a593Smuzhiyun }
394*4882a593Smuzhiyun setting->data.mux.group = ret;
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun return 0;
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun
pinmux_free_setting(const struct pinctrl_setting * setting)399*4882a593Smuzhiyun void pinmux_free_setting(const struct pinctrl_setting *setting)
400*4882a593Smuzhiyun {
401*4882a593Smuzhiyun /* This function is currently unused */
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun
pinmux_enable_setting(const struct pinctrl_setting * setting)404*4882a593Smuzhiyun int pinmux_enable_setting(const struct pinctrl_setting *setting)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun struct pinctrl_dev *pctldev = setting->pctldev;
407*4882a593Smuzhiyun const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
408*4882a593Smuzhiyun const struct pinmux_ops *ops = pctldev->desc->pmxops;
409*4882a593Smuzhiyun int ret = 0;
410*4882a593Smuzhiyun const unsigned *pins = NULL;
411*4882a593Smuzhiyun unsigned num_pins = 0;
412*4882a593Smuzhiyun int i;
413*4882a593Smuzhiyun struct pin_desc *desc;
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun if (pctlops->get_group_pins)
416*4882a593Smuzhiyun ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
417*4882a593Smuzhiyun &pins, &num_pins);
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun if (ret) {
420*4882a593Smuzhiyun const char *gname;
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun /* errors only affect debug data, so just warn */
423*4882a593Smuzhiyun gname = pctlops->get_group_name(pctldev,
424*4882a593Smuzhiyun setting->data.mux.group);
425*4882a593Smuzhiyun dev_warn(pctldev->dev,
426*4882a593Smuzhiyun "could not get pins for group %s\n",
427*4882a593Smuzhiyun gname);
428*4882a593Smuzhiyun num_pins = 0;
429*4882a593Smuzhiyun }
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun /* Try to allocate all pins in this group, one by one */
432*4882a593Smuzhiyun for (i = 0; i < num_pins; i++) {
433*4882a593Smuzhiyun ret = pin_request(pctldev, pins[i], setting->dev_name, NULL);
434*4882a593Smuzhiyun if (ret) {
435*4882a593Smuzhiyun const char *gname;
436*4882a593Smuzhiyun const char *pname;
437*4882a593Smuzhiyun
438*4882a593Smuzhiyun desc = pin_desc_get(pctldev, pins[i]);
439*4882a593Smuzhiyun pname = desc ? desc->name : "non-existing";
440*4882a593Smuzhiyun gname = pctlops->get_group_name(pctldev,
441*4882a593Smuzhiyun setting->data.mux.group);
442*4882a593Smuzhiyun dev_err(pctldev->dev,
443*4882a593Smuzhiyun "could not request pin %d (%s) from group %s "
444*4882a593Smuzhiyun " on device %s\n",
445*4882a593Smuzhiyun pins[i], pname, gname,
446*4882a593Smuzhiyun pinctrl_dev_get_name(pctldev));
447*4882a593Smuzhiyun goto err_pin_request;
448*4882a593Smuzhiyun }
449*4882a593Smuzhiyun }
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun /* Now that we have acquired the pins, encode the mux setting */
452*4882a593Smuzhiyun for (i = 0; i < num_pins; i++) {
453*4882a593Smuzhiyun desc = pin_desc_get(pctldev, pins[i]);
454*4882a593Smuzhiyun if (desc == NULL) {
455*4882a593Smuzhiyun dev_warn(pctldev->dev,
456*4882a593Smuzhiyun "could not get pin desc for pin %d\n",
457*4882a593Smuzhiyun pins[i]);
458*4882a593Smuzhiyun continue;
459*4882a593Smuzhiyun }
460*4882a593Smuzhiyun desc->mux_setting = &(setting->data.mux);
461*4882a593Smuzhiyun }
462*4882a593Smuzhiyun
463*4882a593Smuzhiyun ret = ops->set_mux(pctldev, setting->data.mux.func,
464*4882a593Smuzhiyun setting->data.mux.group);
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun if (ret)
467*4882a593Smuzhiyun goto err_set_mux;
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun return 0;
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun err_set_mux:
472*4882a593Smuzhiyun for (i = 0; i < num_pins; i++) {
473*4882a593Smuzhiyun desc = pin_desc_get(pctldev, pins[i]);
474*4882a593Smuzhiyun if (desc)
475*4882a593Smuzhiyun desc->mux_setting = NULL;
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun err_pin_request:
478*4882a593Smuzhiyun /* On error release all taken pins */
479*4882a593Smuzhiyun while (--i >= 0)
480*4882a593Smuzhiyun pin_free(pctldev, pins[i], NULL);
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun return ret;
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun
pinmux_disable_setting(const struct pinctrl_setting * setting)485*4882a593Smuzhiyun void pinmux_disable_setting(const struct pinctrl_setting *setting)
486*4882a593Smuzhiyun {
487*4882a593Smuzhiyun struct pinctrl_dev *pctldev = setting->pctldev;
488*4882a593Smuzhiyun const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
489*4882a593Smuzhiyun int ret = 0;
490*4882a593Smuzhiyun const unsigned *pins = NULL;
491*4882a593Smuzhiyun unsigned num_pins = 0;
492*4882a593Smuzhiyun int i;
493*4882a593Smuzhiyun struct pin_desc *desc;
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun if (pctlops->get_group_pins)
496*4882a593Smuzhiyun ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
497*4882a593Smuzhiyun &pins, &num_pins);
498*4882a593Smuzhiyun if (ret) {
499*4882a593Smuzhiyun const char *gname;
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun /* errors only affect debug data, so just warn */
502*4882a593Smuzhiyun gname = pctlops->get_group_name(pctldev,
503*4882a593Smuzhiyun setting->data.mux.group);
504*4882a593Smuzhiyun dev_warn(pctldev->dev,
505*4882a593Smuzhiyun "could not get pins for group %s\n",
506*4882a593Smuzhiyun gname);
507*4882a593Smuzhiyun num_pins = 0;
508*4882a593Smuzhiyun }
509*4882a593Smuzhiyun
510*4882a593Smuzhiyun /* Flag the descs that no setting is active */
511*4882a593Smuzhiyun for (i = 0; i < num_pins; i++) {
512*4882a593Smuzhiyun desc = pin_desc_get(pctldev, pins[i]);
513*4882a593Smuzhiyun if (desc == NULL) {
514*4882a593Smuzhiyun dev_warn(pctldev->dev,
515*4882a593Smuzhiyun "could not get pin desc for pin %d\n",
516*4882a593Smuzhiyun pins[i]);
517*4882a593Smuzhiyun continue;
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun if (desc->mux_setting == &(setting->data.mux)) {
520*4882a593Smuzhiyun pin_free(pctldev, pins[i], NULL);
521*4882a593Smuzhiyun } else {
522*4882a593Smuzhiyun const char *gname;
523*4882a593Smuzhiyun
524*4882a593Smuzhiyun gname = pctlops->get_group_name(pctldev,
525*4882a593Smuzhiyun setting->data.mux.group);
526*4882a593Smuzhiyun dev_warn(pctldev->dev,
527*4882a593Smuzhiyun "not freeing pin %d (%s) as part of "
528*4882a593Smuzhiyun "deactivating group %s - it is already "
529*4882a593Smuzhiyun "used for some other setting",
530*4882a593Smuzhiyun pins[i], desc->name, gname);
531*4882a593Smuzhiyun }
532*4882a593Smuzhiyun }
533*4882a593Smuzhiyun }
534*4882a593Smuzhiyun
535*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_FS
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun /* Called from pincontrol core */
pinmux_functions_show(struct seq_file * s,void * what)538*4882a593Smuzhiyun static int pinmux_functions_show(struct seq_file *s, void *what)
539*4882a593Smuzhiyun {
540*4882a593Smuzhiyun struct pinctrl_dev *pctldev = s->private;
541*4882a593Smuzhiyun const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
542*4882a593Smuzhiyun unsigned nfuncs;
543*4882a593Smuzhiyun unsigned func_selector = 0;
544*4882a593Smuzhiyun
545*4882a593Smuzhiyun if (!pmxops)
546*4882a593Smuzhiyun return 0;
547*4882a593Smuzhiyun
548*4882a593Smuzhiyun mutex_lock(&pctldev->mutex);
549*4882a593Smuzhiyun nfuncs = pmxops->get_functions_count(pctldev);
550*4882a593Smuzhiyun while (func_selector < nfuncs) {
551*4882a593Smuzhiyun const char *func = pmxops->get_function_name(pctldev,
552*4882a593Smuzhiyun func_selector);
553*4882a593Smuzhiyun const char * const *groups;
554*4882a593Smuzhiyun unsigned num_groups;
555*4882a593Smuzhiyun int ret;
556*4882a593Smuzhiyun int i;
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun ret = pmxops->get_function_groups(pctldev, func_selector,
559*4882a593Smuzhiyun &groups, &num_groups);
560*4882a593Smuzhiyun if (ret) {
561*4882a593Smuzhiyun seq_printf(s, "function %s: COULD NOT GET GROUPS\n",
562*4882a593Smuzhiyun func);
563*4882a593Smuzhiyun func_selector++;
564*4882a593Smuzhiyun continue;
565*4882a593Smuzhiyun }
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun seq_printf(s, "function: %s, groups = [ ", func);
568*4882a593Smuzhiyun for (i = 0; i < num_groups; i++)
569*4882a593Smuzhiyun seq_printf(s, "%s ", groups[i]);
570*4882a593Smuzhiyun seq_puts(s, "]\n");
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun func_selector++;
573*4882a593Smuzhiyun }
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun mutex_unlock(&pctldev->mutex);
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun return 0;
578*4882a593Smuzhiyun }
579*4882a593Smuzhiyun
pinmux_pins_show(struct seq_file * s,void * what)580*4882a593Smuzhiyun static int pinmux_pins_show(struct seq_file *s, void *what)
581*4882a593Smuzhiyun {
582*4882a593Smuzhiyun struct pinctrl_dev *pctldev = s->private;
583*4882a593Smuzhiyun const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
584*4882a593Smuzhiyun const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
585*4882a593Smuzhiyun unsigned i, pin;
586*4882a593Smuzhiyun
587*4882a593Smuzhiyun if (!pmxops)
588*4882a593Smuzhiyun return 0;
589*4882a593Smuzhiyun
590*4882a593Smuzhiyun seq_puts(s, "Pinmux settings per pin\n");
591*4882a593Smuzhiyun if (pmxops->strict)
592*4882a593Smuzhiyun seq_puts(s,
593*4882a593Smuzhiyun "Format: pin (name): mux_owner|gpio_owner (strict) hog?\n");
594*4882a593Smuzhiyun else
595*4882a593Smuzhiyun seq_puts(s,
596*4882a593Smuzhiyun "Format: pin (name): mux_owner gpio_owner hog?\n");
597*4882a593Smuzhiyun
598*4882a593Smuzhiyun mutex_lock(&pctldev->mutex);
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun /* The pin number can be retrived from the pin controller descriptor */
601*4882a593Smuzhiyun for (i = 0; i < pctldev->desc->npins; i++) {
602*4882a593Smuzhiyun struct pin_desc *desc;
603*4882a593Smuzhiyun bool is_hog = false;
604*4882a593Smuzhiyun
605*4882a593Smuzhiyun pin = pctldev->desc->pins[i].number;
606*4882a593Smuzhiyun desc = pin_desc_get(pctldev, pin);
607*4882a593Smuzhiyun /* Skip if we cannot search the pin */
608*4882a593Smuzhiyun if (desc == NULL)
609*4882a593Smuzhiyun continue;
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun if (desc->mux_owner &&
612*4882a593Smuzhiyun !strcmp(desc->mux_owner, pinctrl_dev_get_name(pctldev)))
613*4882a593Smuzhiyun is_hog = true;
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun if (pmxops->strict) {
616*4882a593Smuzhiyun if (desc->mux_owner)
617*4882a593Smuzhiyun seq_printf(s, "pin %d (%s): device %s%s",
618*4882a593Smuzhiyun pin, desc->name, desc->mux_owner,
619*4882a593Smuzhiyun is_hog ? " (HOG)" : "");
620*4882a593Smuzhiyun else if (desc->gpio_owner)
621*4882a593Smuzhiyun seq_printf(s, "pin %d (%s): GPIO %s",
622*4882a593Smuzhiyun pin, desc->name, desc->gpio_owner);
623*4882a593Smuzhiyun else
624*4882a593Smuzhiyun seq_printf(s, "pin %d (%s): UNCLAIMED",
625*4882a593Smuzhiyun pin, desc->name);
626*4882a593Smuzhiyun } else {
627*4882a593Smuzhiyun /* For non-strict controllers */
628*4882a593Smuzhiyun seq_printf(s, "pin %d (%s): %s %s%s", pin, desc->name,
629*4882a593Smuzhiyun desc->mux_owner ? desc->mux_owner
630*4882a593Smuzhiyun : "(MUX UNCLAIMED)",
631*4882a593Smuzhiyun desc->gpio_owner ? desc->gpio_owner
632*4882a593Smuzhiyun : "(GPIO UNCLAIMED)",
633*4882a593Smuzhiyun is_hog ? " (HOG)" : "");
634*4882a593Smuzhiyun }
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun /* If mux: print function+group claiming the pin */
637*4882a593Smuzhiyun if (desc->mux_setting)
638*4882a593Smuzhiyun seq_printf(s, " function %s group %s\n",
639*4882a593Smuzhiyun pmxops->get_function_name(pctldev,
640*4882a593Smuzhiyun desc->mux_setting->func),
641*4882a593Smuzhiyun pctlops->get_group_name(pctldev,
642*4882a593Smuzhiyun desc->mux_setting->group));
643*4882a593Smuzhiyun else
644*4882a593Smuzhiyun seq_putc(s, '\n');
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun
647*4882a593Smuzhiyun mutex_unlock(&pctldev->mutex);
648*4882a593Smuzhiyun
649*4882a593Smuzhiyun return 0;
650*4882a593Smuzhiyun }
651*4882a593Smuzhiyun
pinmux_show_map(struct seq_file * s,const struct pinctrl_map * map)652*4882a593Smuzhiyun void pinmux_show_map(struct seq_file *s, const struct pinctrl_map *map)
653*4882a593Smuzhiyun {
654*4882a593Smuzhiyun seq_printf(s, "group %s\nfunction %s\n",
655*4882a593Smuzhiyun map->data.mux.group ? map->data.mux.group : "(default)",
656*4882a593Smuzhiyun map->data.mux.function);
657*4882a593Smuzhiyun }
658*4882a593Smuzhiyun
pinmux_show_setting(struct seq_file * s,const struct pinctrl_setting * setting)659*4882a593Smuzhiyun void pinmux_show_setting(struct seq_file *s,
660*4882a593Smuzhiyun const struct pinctrl_setting *setting)
661*4882a593Smuzhiyun {
662*4882a593Smuzhiyun struct pinctrl_dev *pctldev = setting->pctldev;
663*4882a593Smuzhiyun const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
664*4882a593Smuzhiyun const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
665*4882a593Smuzhiyun
666*4882a593Smuzhiyun seq_printf(s, "group: %s (%u) function: %s (%u)\n",
667*4882a593Smuzhiyun pctlops->get_group_name(pctldev, setting->data.mux.group),
668*4882a593Smuzhiyun setting->data.mux.group,
669*4882a593Smuzhiyun pmxops->get_function_name(pctldev, setting->data.mux.func),
670*4882a593Smuzhiyun setting->data.mux.func);
671*4882a593Smuzhiyun }
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(pinmux_functions);
674*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(pinmux_pins);
675*4882a593Smuzhiyun
pinmux_init_device_debugfs(struct dentry * devroot,struct pinctrl_dev * pctldev)676*4882a593Smuzhiyun void pinmux_init_device_debugfs(struct dentry *devroot,
677*4882a593Smuzhiyun struct pinctrl_dev *pctldev)
678*4882a593Smuzhiyun {
679*4882a593Smuzhiyun debugfs_create_file("pinmux-functions", S_IFREG | S_IRUGO,
680*4882a593Smuzhiyun devroot, pctldev, &pinmux_functions_fops);
681*4882a593Smuzhiyun debugfs_create_file("pinmux-pins", S_IFREG | S_IRUGO,
682*4882a593Smuzhiyun devroot, pctldev, &pinmux_pins_fops);
683*4882a593Smuzhiyun }
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun #endif /* CONFIG_DEBUG_FS */
686*4882a593Smuzhiyun
687*4882a593Smuzhiyun #ifdef CONFIG_GENERIC_PINMUX_FUNCTIONS
688*4882a593Smuzhiyun
689*4882a593Smuzhiyun /**
690*4882a593Smuzhiyun * pinmux_generic_get_function_count() - returns number of functions
691*4882a593Smuzhiyun * @pctldev: pin controller device
692*4882a593Smuzhiyun */
pinmux_generic_get_function_count(struct pinctrl_dev * pctldev)693*4882a593Smuzhiyun int pinmux_generic_get_function_count(struct pinctrl_dev *pctldev)
694*4882a593Smuzhiyun {
695*4882a593Smuzhiyun return pctldev->num_functions;
696*4882a593Smuzhiyun }
697*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pinmux_generic_get_function_count);
698*4882a593Smuzhiyun
699*4882a593Smuzhiyun /**
700*4882a593Smuzhiyun * pinmux_generic_get_function_name() - returns the function name
701*4882a593Smuzhiyun * @pctldev: pin controller device
702*4882a593Smuzhiyun * @selector: function number
703*4882a593Smuzhiyun */
704*4882a593Smuzhiyun const char *
pinmux_generic_get_function_name(struct pinctrl_dev * pctldev,unsigned int selector)705*4882a593Smuzhiyun pinmux_generic_get_function_name(struct pinctrl_dev *pctldev,
706*4882a593Smuzhiyun unsigned int selector)
707*4882a593Smuzhiyun {
708*4882a593Smuzhiyun struct function_desc *function;
709*4882a593Smuzhiyun
710*4882a593Smuzhiyun function = radix_tree_lookup(&pctldev->pin_function_tree,
711*4882a593Smuzhiyun selector);
712*4882a593Smuzhiyun if (!function)
713*4882a593Smuzhiyun return NULL;
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun return function->name;
716*4882a593Smuzhiyun }
717*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pinmux_generic_get_function_name);
718*4882a593Smuzhiyun
719*4882a593Smuzhiyun /**
720*4882a593Smuzhiyun * pinmux_generic_get_function_groups() - gets the function groups
721*4882a593Smuzhiyun * @pctldev: pin controller device
722*4882a593Smuzhiyun * @selector: function number
723*4882a593Smuzhiyun * @groups: array of pin groups
724*4882a593Smuzhiyun * @num_groups: number of pin groups
725*4882a593Smuzhiyun */
pinmux_generic_get_function_groups(struct pinctrl_dev * pctldev,unsigned int selector,const char * const ** groups,unsigned * const num_groups)726*4882a593Smuzhiyun int pinmux_generic_get_function_groups(struct pinctrl_dev *pctldev,
727*4882a593Smuzhiyun unsigned int selector,
728*4882a593Smuzhiyun const char * const **groups,
729*4882a593Smuzhiyun unsigned * const num_groups)
730*4882a593Smuzhiyun {
731*4882a593Smuzhiyun struct function_desc *function;
732*4882a593Smuzhiyun
733*4882a593Smuzhiyun function = radix_tree_lookup(&pctldev->pin_function_tree,
734*4882a593Smuzhiyun selector);
735*4882a593Smuzhiyun if (!function) {
736*4882a593Smuzhiyun dev_err(pctldev->dev, "%s could not find function%i\n",
737*4882a593Smuzhiyun __func__, selector);
738*4882a593Smuzhiyun return -EINVAL;
739*4882a593Smuzhiyun }
740*4882a593Smuzhiyun *groups = function->group_names;
741*4882a593Smuzhiyun *num_groups = function->num_group_names;
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun return 0;
744*4882a593Smuzhiyun }
745*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pinmux_generic_get_function_groups);
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun /**
748*4882a593Smuzhiyun * pinmux_generic_get_function() - returns a function based on the number
749*4882a593Smuzhiyun * @pctldev: pin controller device
750*4882a593Smuzhiyun * @selector: function number
751*4882a593Smuzhiyun */
pinmux_generic_get_function(struct pinctrl_dev * pctldev,unsigned int selector)752*4882a593Smuzhiyun struct function_desc *pinmux_generic_get_function(struct pinctrl_dev *pctldev,
753*4882a593Smuzhiyun unsigned int selector)
754*4882a593Smuzhiyun {
755*4882a593Smuzhiyun struct function_desc *function;
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun function = radix_tree_lookup(&pctldev->pin_function_tree,
758*4882a593Smuzhiyun selector);
759*4882a593Smuzhiyun if (!function)
760*4882a593Smuzhiyun return NULL;
761*4882a593Smuzhiyun
762*4882a593Smuzhiyun return function;
763*4882a593Smuzhiyun }
764*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pinmux_generic_get_function);
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun /**
767*4882a593Smuzhiyun * pinmux_generic_add_function() - adds a function group
768*4882a593Smuzhiyun * @pctldev: pin controller device
769*4882a593Smuzhiyun * @name: name of the function
770*4882a593Smuzhiyun * @groups: array of pin groups
771*4882a593Smuzhiyun * @num_groups: number of pin groups
772*4882a593Smuzhiyun * @data: pin controller driver specific data
773*4882a593Smuzhiyun */
pinmux_generic_add_function(struct pinctrl_dev * pctldev,const char * name,const char ** groups,const unsigned int num_groups,void * data)774*4882a593Smuzhiyun int pinmux_generic_add_function(struct pinctrl_dev *pctldev,
775*4882a593Smuzhiyun const char *name,
776*4882a593Smuzhiyun const char **groups,
777*4882a593Smuzhiyun const unsigned int num_groups,
778*4882a593Smuzhiyun void *data)
779*4882a593Smuzhiyun {
780*4882a593Smuzhiyun struct function_desc *function;
781*4882a593Smuzhiyun int selector;
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun if (!name)
784*4882a593Smuzhiyun return -EINVAL;
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun selector = pinmux_func_name_to_selector(pctldev, name);
787*4882a593Smuzhiyun if (selector >= 0)
788*4882a593Smuzhiyun return selector;
789*4882a593Smuzhiyun
790*4882a593Smuzhiyun selector = pctldev->num_functions;
791*4882a593Smuzhiyun
792*4882a593Smuzhiyun function = devm_kzalloc(pctldev->dev, sizeof(*function), GFP_KERNEL);
793*4882a593Smuzhiyun if (!function)
794*4882a593Smuzhiyun return -ENOMEM;
795*4882a593Smuzhiyun
796*4882a593Smuzhiyun function->name = name;
797*4882a593Smuzhiyun function->group_names = groups;
798*4882a593Smuzhiyun function->num_group_names = num_groups;
799*4882a593Smuzhiyun function->data = data;
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun radix_tree_insert(&pctldev->pin_function_tree, selector, function);
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun pctldev->num_functions++;
804*4882a593Smuzhiyun
805*4882a593Smuzhiyun return selector;
806*4882a593Smuzhiyun }
807*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pinmux_generic_add_function);
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun /**
810*4882a593Smuzhiyun * pinmux_generic_remove_function() - removes a numbered function
811*4882a593Smuzhiyun * @pctldev: pin controller device
812*4882a593Smuzhiyun * @selector: function number
813*4882a593Smuzhiyun *
814*4882a593Smuzhiyun * Note that the caller must take care of locking.
815*4882a593Smuzhiyun */
pinmux_generic_remove_function(struct pinctrl_dev * pctldev,unsigned int selector)816*4882a593Smuzhiyun int pinmux_generic_remove_function(struct pinctrl_dev *pctldev,
817*4882a593Smuzhiyun unsigned int selector)
818*4882a593Smuzhiyun {
819*4882a593Smuzhiyun struct function_desc *function;
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun function = radix_tree_lookup(&pctldev->pin_function_tree,
822*4882a593Smuzhiyun selector);
823*4882a593Smuzhiyun if (!function)
824*4882a593Smuzhiyun return -ENOENT;
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun radix_tree_delete(&pctldev->pin_function_tree, selector);
827*4882a593Smuzhiyun devm_kfree(pctldev->dev, function);
828*4882a593Smuzhiyun
829*4882a593Smuzhiyun pctldev->num_functions--;
830*4882a593Smuzhiyun
831*4882a593Smuzhiyun return 0;
832*4882a593Smuzhiyun }
833*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pinmux_generic_remove_function);
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun /**
836*4882a593Smuzhiyun * pinmux_generic_free_functions() - removes all functions
837*4882a593Smuzhiyun * @pctldev: pin controller device
838*4882a593Smuzhiyun *
839*4882a593Smuzhiyun * Note that the caller must take care of locking. The pinctrl
840*4882a593Smuzhiyun * functions are allocated with devm_kzalloc() so no need to free
841*4882a593Smuzhiyun * them here.
842*4882a593Smuzhiyun */
pinmux_generic_free_functions(struct pinctrl_dev * pctldev)843*4882a593Smuzhiyun void pinmux_generic_free_functions(struct pinctrl_dev *pctldev)
844*4882a593Smuzhiyun {
845*4882a593Smuzhiyun struct radix_tree_iter iter;
846*4882a593Smuzhiyun void __rcu **slot;
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun radix_tree_for_each_slot(slot, &pctldev->pin_function_tree, &iter, 0)
849*4882a593Smuzhiyun radix_tree_delete(&pctldev->pin_function_tree, iter.index);
850*4882a593Smuzhiyun
851*4882a593Smuzhiyun pctldev->num_functions = 0;
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun
854*4882a593Smuzhiyun #endif /* CONFIG_GENERIC_PINMUX_FUNCTIONS */
855