pinctrl: error if mapping table's control dev can't be found
[deliverable/linux.git] / drivers / pinctrl / pinmux.c
CommitLineData
2744e8af
LW
1/*
2 * Core driver for the pin muxing portions of the pin control subsystem
3 *
e93bcee0 4 * Copyright (C) 2011-2012 ST-Ericsson SA
2744e8af
LW
5 * Written on behalf of Linaro for ST-Ericsson
6 * Based on bits of regulator core, gpio core and clk core
7 *
8 * Author: Linus Walleij <linus.walleij@linaro.org>
9 *
10 * License terms: GNU General Public License (GPL) version 2
11 */
12#define pr_fmt(fmt) "pinmux core: " fmt
13
14#include <linux/kernel.h>
15#include <linux/module.h>
16#include <linux/init.h>
17#include <linux/device.h>
18#include <linux/slab.h>
19#include <linux/radix-tree.h>
20#include <linux/err.h>
21#include <linux/list.h>
22#include <linux/mutex.h>
23#include <linux/spinlock.h>
97607d15 24#include <linux/string.h>
2744e8af
LW
25#include <linux/sysfs.h>
26#include <linux/debugfs.h>
27#include <linux/seq_file.h>
28#include <linux/pinctrl/machine.h>
29#include <linux/pinctrl/pinmux.h>
30#include "core.h"
befe5bdf 31#include "pinmux.h"
2744e8af
LW
32
33/**
34 * struct pinmux_group - group list item for pinmux groups
35 * @node: pinmux group list node
36 * @group_selector: the group selector for this group
37 */
38struct pinmux_group {
39 struct list_head node;
40 unsigned group_selector;
41};
42
03665e0f
SW
43int pinmux_check_ops(struct pinctrl_dev *pctldev)
44{
45 const struct pinmux_ops *ops = pctldev->desc->pmxops;
46 unsigned selector = 0;
47
48 /* Check that we implement required operations */
49 if (!ops->list_functions ||
50 !ops->get_function_name ||
51 !ops->get_function_groups ||
52 !ops->enable ||
53 !ops->disable)
54 return -EINVAL;
55
56 /* Check that all functions registered have names */
57 while (ops->list_functions(pctldev, selector) >= 0) {
58 const char *fname = ops->get_function_name(pctldev,
59 selector);
60 if (!fname) {
61 pr_err("pinmux ops has no name for function%u\n",
62 selector);
63 return -EINVAL;
64 }
65 selector++;
66 }
67
68 return 0;
69}
70
2744e8af
LW
71/**
72 * pin_request() - request a single pin to be muxed in, typically for GPIO
73 * @pin: the pin number in the global pin space
74 * @function: a functional name to give to this pin, passed to the driver
75 * so it knows what function to mux in, e.g. the string "gpioNN"
76 * means that you want to mux in the pin for use as GPIO number NN
2744e8af
LW
77 * @gpio_range: the range matching the GPIO pin if this is a request for a
78 * single GPIO pin
79 */
80static int pin_request(struct pinctrl_dev *pctldev,
3712a3c4 81 int pin, const char *function,
2744e8af
LW
82 struct pinctrl_gpio_range *gpio_range)
83{
84 struct pin_desc *desc;
85 const struct pinmux_ops *ops = pctldev->desc->pmxops;
86 int status = -EINVAL;
87
51cd24ee 88 dev_dbg(pctldev->dev, "request pin %d for %s\n", pin, function);
2744e8af 89
2744e8af
LW
90 desc = pin_desc_get(pctldev, pin);
91 if (desc == NULL) {
51cd24ee 92 dev_err(pctldev->dev,
2744e8af
LW
93 "pin is not registered so it cannot be requested\n");
94 goto out;
95 }
96
d2f6a1c6 97 if (!function) {
51cd24ee 98 dev_err(pctldev->dev, "no function name given\n");
d2f6a1c6
MB
99 return -EINVAL;
100 }
101
2744e8af 102 spin_lock(&desc->lock);
5d2eaf80 103 if (desc->mux_function) {
2744e8af 104 spin_unlock(&desc->lock);
51cd24ee 105 dev_err(pctldev->dev,
2744e8af
LW
106 "pin already requested\n");
107 goto out;
108 }
5d2eaf80 109 desc->mux_function = function;
2744e8af
LW
110 spin_unlock(&desc->lock);
111
112 /* Let each pin increase references to this module */
113 if (!try_module_get(pctldev->owner)) {
51cd24ee 114 dev_err(pctldev->dev,
2744e8af
LW
115 "could not increase module refcount for pin %d\n",
116 pin);
117 status = -EINVAL;
118 goto out_free_pin;
119 }
120
121 /*
122 * If there is no kind of request function for the pin we just assume
123 * we got it by default and proceed.
124 */
3712a3c4 125 if (gpio_range && ops->gpio_request_enable)
2744e8af
LW
126 /* This requests and enables a single GPIO pin */
127 status = ops->gpio_request_enable(pctldev, gpio_range, pin);
128 else if (ops->request)
129 status = ops->request(pctldev, pin);
130 else
131 status = 0;
132
133 if (status)
f9d41d7c 134 dev_err(pctldev->dev, "->request on device %s failed for pin %d\n",
2744e8af
LW
135 pctldev->desc->name, pin);
136out_free_pin:
137 if (status) {
138 spin_lock(&desc->lock);
5d2eaf80 139 desc->mux_function = NULL;
2744e8af
LW
140 spin_unlock(&desc->lock);
141 }
142out:
143 if (status)
51cd24ee 144 dev_err(pctldev->dev, "pin-%d (%s) status %d\n",
2744e8af
LW
145 pin, function ? : "?", status);
146
147 return status;
148}
149
150/**
151 * pin_free() - release a single muxed in pin so something else can be muxed
152 * @pctldev: pin controller device handling this pin
153 * @pin: the pin to free
3712a3c4
SW
154 * @gpio_range: the range matching the GPIO pin if this is a request for a
155 * single GPIO pin
336cdba0
LW
156 *
157 * This function returns a pointer to the function name in use. This is used
158 * for callers that dynamically allocate a function name so it can be freed
159 * once the pin is free. This is done for GPIO request functions.
2744e8af 160 */
3712a3c4
SW
161static const char *pin_free(struct pinctrl_dev *pctldev, int pin,
162 struct pinctrl_gpio_range *gpio_range)
2744e8af
LW
163{
164 const struct pinmux_ops *ops = pctldev->desc->pmxops;
165 struct pin_desc *desc;
3712a3c4 166 const char *func;
2744e8af
LW
167
168 desc = pin_desc_get(pctldev, pin);
169 if (desc == NULL) {
51cd24ee 170 dev_err(pctldev->dev,
2744e8af 171 "pin is not registered so it cannot be freed\n");
3712a3c4 172 return NULL;
2744e8af
LW
173 }
174
3712a3c4
SW
175 /*
176 * If there is no kind of request function for the pin we just assume
177 * we got it by default and proceed.
178 */
179 if (gpio_range && ops->gpio_disable_free)
180 ops->gpio_disable_free(pctldev, gpio_range, pin);
181 else if (ops->free)
2744e8af
LW
182 ops->free(pctldev, pin);
183
184 spin_lock(&desc->lock);
3712a3c4 185 func = desc->mux_function;
5d2eaf80 186 desc->mux_function = NULL;
2744e8af
LW
187 spin_unlock(&desc->lock);
188 module_put(pctldev->owner);
3712a3c4
SW
189
190 return func;
2744e8af
LW
191}
192
193/**
befe5bdf
LW
194 * pinmux_request_gpio() - request pinmuxing for a GPIO pin
195 * @pctldev: pin controller device affected
196 * @pin: the pin to mux in for GPIO
197 * @range: the applicable GPIO range
2744e8af 198 */
befe5bdf
LW
199int pinmux_request_gpio(struct pinctrl_dev *pctldev,
200 struct pinctrl_gpio_range *range,
201 unsigned pin, unsigned gpio)
2744e8af
LW
202{
203 char gpiostr[16];
5d2eaf80 204 const char *function;
2744e8af 205 int ret;
2744e8af
LW
206
207 /* Conjure some name stating what chip and pin this is taken by */
208 snprintf(gpiostr, 15, "%s:%d", range->name, gpio);
209
5d2eaf80
SW
210 function = kstrdup(gpiostr, GFP_KERNEL);
211 if (!function)
212 return -EINVAL;
213
3712a3c4 214 ret = pin_request(pctldev, pin, function, range);
5d2eaf80
SW
215 if (ret < 0)
216 kfree(function);
217
218 return ret;
2744e8af 219}
2744e8af
LW
220
221/**
befe5bdf
LW
222 * pinmux_free_gpio() - release a pin from GPIO muxing
223 * @pctldev: the pin controller device for the pin
224 * @pin: the affected currently GPIO-muxed in pin
225 * @range: applicable GPIO range
2744e8af 226 */
befe5bdf
LW
227void pinmux_free_gpio(struct pinctrl_dev *pctldev, unsigned pin,
228 struct pinctrl_gpio_range *range)
2744e8af 229{
3712a3c4 230 const char *func;
2744e8af 231
3712a3c4
SW
232 func = pin_free(pctldev, pin, range);
233 kfree(func);
2744e8af 234}
2744e8af 235
befe5bdf
LW
236/**
237 * pinmux_gpio_direction() - set the direction of a single muxed-in GPIO pin
238 * @pctldev: the pin controller handling this pin
239 * @range: applicable GPIO range
240 * @pin: the affected GPIO pin in this controller
241 * @input: true if we set the pin as input, false for output
242 */
243int pinmux_gpio_direction(struct pinctrl_dev *pctldev,
244 struct pinctrl_gpio_range *range,
245 unsigned pin, bool input)
542e704f 246{
542e704f
LW
247 const struct pinmux_ops *ops;
248 int ret;
542e704f
LW
249
250 ops = pctldev->desc->pmxops;
251
542e704f
LW
252 if (ops->gpio_set_direction)
253 ret = ops->gpio_set_direction(pctldev, range, pin, input);
254 else
255 ret = 0;
256
257 return ret;
258}
259
2744e8af 260/**
de849eec 261 * acquire_pins() - acquire all the pins for a certain function on a pinmux
2744e8af
LW
262 * @pctldev: the device to take the pins on
263 * @func_selector: the function selector to acquire the pins for
264 * @group_selector: the group selector containing the pins to acquire
265 */
266static int acquire_pins(struct pinctrl_dev *pctldev,
267 unsigned func_selector,
268 unsigned group_selector)
269{
270 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
271 const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
272 const char *func = pmxops->get_function_name(pctldev,
273 func_selector);
a5818a8b 274 const unsigned *pins;
2744e8af
LW
275 unsigned num_pins;
276 int ret;
277 int i;
278
279 ret = pctlops->get_group_pins(pctldev, group_selector,
280 &pins, &num_pins);
281 if (ret)
282 return ret;
283
51cd24ee 284 dev_dbg(pctldev->dev, "requesting the %u pins from group %u\n",
2744e8af
LW
285 num_pins, group_selector);
286
287 /* Try to allocate all pins in this group, one by one */
288 for (i = 0; i < num_pins; i++) {
3712a3c4 289 ret = pin_request(pctldev, pins[i], func, NULL);
2744e8af 290 if (ret) {
51cd24ee 291 dev_err(pctldev->dev,
f9d41d7c 292 "could not get pin %d for function %s on device %s - conflicting mux mappings?\n",
2744e8af
LW
293 pins[i], func ? : "(undefined)",
294 pinctrl_dev_get_name(pctldev));
295 /* On error release all taken pins */
296 i--; /* this pin just failed */
297 for (; i >= 0; i--)
3712a3c4 298 pin_free(pctldev, pins[i], NULL);
2744e8af
LW
299 return -ENODEV;
300 }
301 }
302 return 0;
303}
304
305/**
306 * release_pins() - release pins taken by earlier acquirement
de849eec 307 * @pctldev: the device to free the pins on
2744e8af
LW
308 * @group_selector: the group selector containing the pins to free
309 */
310static void release_pins(struct pinctrl_dev *pctldev,
311 unsigned group_selector)
312{
313 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
a5818a8b 314 const unsigned *pins;
2744e8af
LW
315 unsigned num_pins;
316 int ret;
317 int i;
318
319 ret = pctlops->get_group_pins(pctldev, group_selector,
320 &pins, &num_pins);
321 if (ret) {
f9d41d7c 322 dev_err(pctldev->dev, "could not get pins to release for group selector %d\n",
2744e8af
LW
323 group_selector);
324 return;
325 }
326 for (i = 0; i < num_pins; i++)
3712a3c4 327 pin_free(pctldev, pins[i], NULL);
2744e8af
LW
328}
329
2744e8af
LW
330/**
331 * pinmux_check_pin_group() - check function and pin group combo
332 * @pctldev: device to check the pin group vs function for
333 * @func_selector: the function selector to check the pin group for, we have
334 * already looked this up in the calling function
335 * @pin_group: the pin group to match to the function
336 *
337 * This function will check that the pinmux driver can supply the
338 * selected pin group for a certain function, returns the group selector if
339 * the group and function selector will work fine together, else returns
340 * negative
341 */
342static int pinmux_check_pin_group(struct pinctrl_dev *pctldev,
343 unsigned func_selector,
344 const char *pin_group)
345{
346 const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
347 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
348 int ret;
349
350 /*
351 * If the driver does not support different pin groups for the
352 * functions, we only support group 0, and assume this exists.
353 */
354 if (!pctlops || !pctlops->list_groups)
355 return 0;
356
357 /*
358 * Passing NULL (no specific group) will select the first and
359 * hopefully only group of pins available for this function.
360 */
361 if (!pin_group) {
362 char const * const *groups;
363 unsigned num_groups;
364
365 ret = pmxops->get_function_groups(pctldev, func_selector,
366 &groups, &num_groups);
367 if (ret)
368 return ret;
369 if (num_groups < 1)
370 return -EINVAL;
7afde8ba 371 ret = pinctrl_get_group_selector(pctldev, groups[0]);
2744e8af 372 if (ret < 0) {
51cd24ee 373 dev_err(pctldev->dev,
f9d41d7c 374 "function %s wants group %s but the pin controller does not seem to have that group\n",
2744e8af
LW
375 pmxops->get_function_name(pctldev, func_selector),
376 groups[0]);
377 return ret;
378 }
379
380 if (num_groups > 1)
51cd24ee 381 dev_dbg(pctldev->dev,
f9d41d7c 382 "function %s support more than one group, default-selecting first group %s (%d)\n",
2744e8af
LW
383 pmxops->get_function_name(pctldev, func_selector),
384 groups[0],
385 ret);
386
387 return ret;
388 }
389
51cd24ee 390 dev_dbg(pctldev->dev,
2744e8af
LW
391 "check if we have pin group %s on controller %s\n",
392 pin_group, pinctrl_dev_get_name(pctldev));
393
7afde8ba 394 ret = pinctrl_get_group_selector(pctldev, pin_group);
2744e8af 395 if (ret < 0) {
51cd24ee 396 dev_dbg(pctldev->dev,
2744e8af
LW
397 "%s does not support pin group %s with function %s\n",
398 pinctrl_dev_get_name(pctldev),
399 pin_group,
400 pmxops->get_function_name(pctldev, func_selector));
401 }
402 return ret;
403}
404
405/**
406 * pinmux_search_function() - check pin control driver for a certain function
407 * @pctldev: device to check for function and position
408 * @map: function map containing the function and position to look for
409 * @func_selector: returns the applicable function selector if found
410 * @group_selector: returns the applicable group selector if found
411 *
412 * This will search the pinmux driver for an applicable
413 * function with a specific pin group, returns 0 if these can be mapped
414 * negative otherwise
415 */
416static int pinmux_search_function(struct pinctrl_dev *pctldev,
e93bcee0 417 struct pinctrl_map const *map,
2744e8af
LW
418 unsigned *func_selector,
419 unsigned *group_selector)
420{
421 const struct pinmux_ops *ops = pctldev->desc->pmxops;
422 unsigned selector = 0;
423
424 /* See if this pctldev has this function */
425 while (ops->list_functions(pctldev, selector) >= 0) {
426 const char *fname = ops->get_function_name(pctldev,
427 selector);
428 int ret;
429
430 if (!strcmp(map->function, fname)) {
431 /* Found the function, check pin group */
432 ret = pinmux_check_pin_group(pctldev, selector,
433 map->group);
434 if (ret < 0)
435 return ret;
436
437 /* This function and group selector can be used */
438 *func_selector = selector;
439 *group_selector = ret;
440 return 0;
441
442 }
443 selector++;
444 }
445
446 pr_err("%s does not support function %s\n",
447 pinctrl_dev_get_name(pctldev), map->function);
448 return -EINVAL;
449}
450
451/**
452 * pinmux_enable_muxmap() - enable a map entry for a certain pinmux
453 */
454static int pinmux_enable_muxmap(struct pinctrl_dev *pctldev,
e93bcee0 455 struct pinctrl *p,
2744e8af
LW
456 struct device *dev,
457 const char *devname,
e93bcee0 458 struct pinctrl_map const *map)
2744e8af
LW
459{
460 unsigned func_selector;
461 unsigned group_selector;
462 struct pinmux_group *grp;
463 int ret;
464
465 /*
466 * Note that we're not locking the pinmux mutex here, because
467 * this is only called at pinmux initialization time when it
468 * has not been added to any list and thus is not reachable
469 * by anyone else.
470 */
471
e93bcee0 472 if (p->pctldev && p->pctldev != pctldev) {
51cd24ee 473 dev_err(pctldev->dev,
f9d41d7c
UKK
474 "different pin control devices given for device %s, function %s\n",
475 devname, map->function);
2744e8af
LW
476 return -EINVAL;
477 }
e93bcee0
LW
478 p->dev = dev;
479 p->pctldev = pctldev;
2744e8af
LW
480
481 /* Now go into the driver and try to match a function and group */
482 ret = pinmux_search_function(pctldev, map, &func_selector,
483 &group_selector);
484 if (ret < 0)
485 return ret;
486
487 /*
488 * If the function selector is already set, it needs to be identical,
489 * we support several groups with one function but not several
490 * functions with one or several groups in the same pinmux.
491 */
e93bcee0
LW
492 if (p->func_selector != UINT_MAX &&
493 p->func_selector != func_selector) {
51cd24ee 494 dev_err(pctldev->dev,
2744e8af
LW
495 "dual function defines in the map for device %s\n",
496 devname);
497 return -EINVAL;
498 }
e93bcee0 499 p->func_selector = func_selector;
2744e8af
LW
500
501 /* Now add this group selector, we may have many of them */
502 grp = kmalloc(sizeof(struct pinmux_group), GFP_KERNEL);
503 if (!grp)
504 return -ENOMEM;
505 grp->group_selector = group_selector;
506 ret = acquire_pins(pctldev, func_selector, group_selector);
507 if (ret) {
508 kfree(grp);
509 return ret;
510 }
8b9c139f 511 list_add_tail(&grp->node, &p->groups);
2744e8af
LW
512
513 return 0;
514}
515
2744e8af 516/**
befe5bdf 517 * pinmux_apply_muxmap() - apply a certain mux mapping entry
2744e8af 518 */
befe5bdf
LW
519int pinmux_apply_muxmap(struct pinctrl_dev *pctldev,
520 struct pinctrl *p,
521 struct device *dev,
522 const char *devname,
523 struct pinctrl_map const *map)
2744e8af 524{
befe5bdf 525 int ret;
2744e8af 526
befe5bdf
LW
527 ret = pinmux_enable_muxmap(pctldev, p, dev,
528 devname, map);
529 if (ret) {
530 pinmux_put(p);
531 return ret;
2744e8af
LW
532 }
533
befe5bdf 534 return 0;
2744e8af 535}
2744e8af
LW
536
537/**
befe5bdf 538 * pinmux_put() - free up the pinmux portions of a pin controller handle
2744e8af 539 */
befe5bdf 540void pinmux_put(struct pinctrl *p)
2744e8af 541{
befe5bdf 542 struct list_head *node, *tmp;
2744e8af 543
befe5bdf
LW
544 list_for_each_safe(node, tmp, &p->groups) {
545 struct pinmux_group *grp =
546 list_entry(node, struct pinmux_group, node);
547 /* Release all pins taken by this group */
548 release_pins(p->pctldev, grp->group_selector);
549 list_del(node);
550 kfree(grp);
551 }
2744e8af 552}
2744e8af
LW
553
554/**
befe5bdf 555 * pinmux_enable() - enable the pinmux portion of a pin control handle
2744e8af 556 */
befe5bdf 557int pinmux_enable(struct pinctrl *p)
2744e8af 558{
befe5bdf
LW
559 struct pinctrl_dev *pctldev = p->pctldev;
560 const struct pinmux_ops *ops = pctldev->desc->pmxops;
561 struct pinmux_group *grp;
562 int ret;
2744e8af 563
befe5bdf
LW
564 list_for_each_entry(grp, &p->groups, node) {
565 ret = ops->enable(pctldev, p->func_selector,
566 grp->group_selector);
567 if (ret)
568 /*
569 * TODO: call disable() on all groups we called
570 * enable() on to this point?
571 */
572 return ret;
2744e8af 573 }
befe5bdf 574 return 0;
2744e8af 575}
2744e8af
LW
576
577/**
befe5bdf 578 * pinmux_disable() - disable the pinmux portions of a pin control handle
2744e8af 579 */
befe5bdf 580void pinmux_disable(struct pinctrl *p)
2744e8af 581{
befe5bdf
LW
582 struct pinctrl_dev *pctldev = p->pctldev;
583 const struct pinmux_ops *ops = pctldev->desc->pmxops;
584 struct pinmux_group *grp;
2744e8af 585
befe5bdf
LW
586 list_for_each_entry(grp, &p->groups, node) {
587 ops->disable(pctldev, p->func_selector,
588 grp->group_selector);
2744e8af 589 }
2744e8af 590}
2744e8af 591
2744e8af
LW
592#ifdef CONFIG_DEBUG_FS
593
594/* Called from pincontrol core */
595static int pinmux_functions_show(struct seq_file *s, void *what)
596{
597 struct pinctrl_dev *pctldev = s->private;
598 const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
599 unsigned func_selector = 0;
600
601 while (pmxops->list_functions(pctldev, func_selector) >= 0) {
602 const char *func = pmxops->get_function_name(pctldev,
603 func_selector);
604 const char * const *groups;
605 unsigned num_groups;
606 int ret;
607 int i;
608
609 ret = pmxops->get_function_groups(pctldev, func_selector,
610 &groups, &num_groups);
611 if (ret)
612 seq_printf(s, "function %s: COULD NOT GET GROUPS\n",
613 func);
614
615 seq_printf(s, "function: %s, groups = [ ", func);
616 for (i = 0; i < num_groups; i++)
617 seq_printf(s, "%s ", groups[i]);
618 seq_puts(s, "]\n");
619
620 func_selector++;
621
622 }
623
624 return 0;
625}
626
627static int pinmux_pins_show(struct seq_file *s, void *what)
628{
629 struct pinctrl_dev *pctldev = s->private;
706e8520 630 unsigned i, pin;
2744e8af
LW
631
632 seq_puts(s, "Pinmux settings per pin\n");
633 seq_puts(s, "Format: pin (name): pinmuxfunction\n");
634
706e8520
CP
635 /* The pin number can be retrived from the pin controller descriptor */
636 for (i = 0; i < pctldev->desc->npins; i++) {
2744e8af
LW
637
638 struct pin_desc *desc;
639
706e8520 640 pin = pctldev->desc->pins[i].number;
2744e8af 641 desc = pin_desc_get(pctldev, pin);
706e8520 642 /* Skip if we cannot search the pin */
2744e8af
LW
643 if (desc == NULL)
644 continue;
645
646 seq_printf(s, "pin %d (%s): %s\n", pin,
647 desc->name ? desc->name : "unnamed",
5d2eaf80
SW
648 desc->mux_function ? desc->mux_function
649 : "UNCLAIMED");
2744e8af
LW
650 }
651
652 return 0;
653}
654
befe5bdf 655void pinmux_dbg_show(struct seq_file *s, struct pinctrl *p)
2744e8af 656{
befe5bdf
LW
657 struct pinctrl_dev *pctldev = p->pctldev;
658 const struct pinmux_ops *pmxops;
659 const struct pinctrl_ops *pctlops;
660 struct pinmux_group *grp;
2744e8af 661
befe5bdf
LW
662 pmxops = pctldev->desc->pmxops;
663 pctlops = pctldev->desc->pctlops;
2744e8af 664
befe5bdf
LW
665 seq_printf(s, " function: %s (%u),",
666 pmxops->get_function_name(pctldev,
667 p->func_selector),
668 p->func_selector);
2744e8af 669
befe5bdf
LW
670 seq_printf(s, " groups: [");
671 list_for_each_entry(grp, &p->groups, node) {
672 seq_printf(s, " %s (%u)",
673 pctlops->get_group_name(pctldev,
674 grp->group_selector),
675 grp->group_selector);
2744e8af 676 }
befe5bdf 677 seq_printf(s, " ]");
2744e8af
LW
678}
679
680static int pinmux_functions_open(struct inode *inode, struct file *file)
681{
682 return single_open(file, pinmux_functions_show, inode->i_private);
683}
684
685static int pinmux_pins_open(struct inode *inode, struct file *file)
686{
687 return single_open(file, pinmux_pins_show, inode->i_private);
688}
689
2744e8af
LW
690static const struct file_operations pinmux_functions_ops = {
691 .open = pinmux_functions_open,
692 .read = seq_read,
693 .llseek = seq_lseek,
694 .release = single_release,
695};
696
697static const struct file_operations pinmux_pins_ops = {
698 .open = pinmux_pins_open,
699 .read = seq_read,
700 .llseek = seq_lseek,
701 .release = single_release,
702};
703
2744e8af
LW
704void pinmux_init_device_debugfs(struct dentry *devroot,
705 struct pinctrl_dev *pctldev)
706{
707 debugfs_create_file("pinmux-functions", S_IFREG | S_IRUGO,
708 devroot, pctldev, &pinmux_functions_ops);
709 debugfs_create_file("pinmux-pins", S_IFREG | S_IRUGO,
710 devroot, pctldev, &pinmux_pins_ops);
2744e8af
LW
711}
712
713#endif /* CONFIG_DEBUG_FS */
This page took 0.105865 seconds and 5 git commands to generate.