Lines Matching +full:pinctrl +full:- +full:pin +full:- +full:array
15 * a group based selection. The gpio_a 8 - 11 are muxed with gpio_b and pwm.
18 * gpio_a (8 - 11)
19 * +----------
21 * gpio_a (8-11) | gpio_b (0 - 3)
22 * ------------------------+-------+----------
24 * | pwm (0 - 3)
25 * +----------
31 #include <linux/pinctrl/pinconf.h>
32 #include <linux/pinctrl/pinconf-generic.h>
33 #include <linux/pinctrl/pinctrl.h>
34 #include <linux/pinctrl/pinmux.h>
39 #include "../pinctrl-utils.h"
75 * @pins: array of pins used by this group
87 * nsp mux function and supported pin groups
90 * @groups: array of groups that can be supported by this function
100 * nsp IOMUX pinctrl core
107 * @groups: pointer to array of groups
109 * @functions: pointer to array of functions
111 * @mux_log: pointer to the array of mux logs
129 * Description of a pin in nsp
131 * @pin: pin number
132 * @name: pin name
136 unsigned int pin; member
143 .pin = p, \
241 * List of nsp pin groups
320 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_get_groups_count() local
322 return pinctrl->num_groups; in nsp_get_groups_count()
328 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_get_group_name() local
330 return pinctrl->groups[selector].name; in nsp_get_group_name()
337 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_get_group_pins() local
339 *pins = pinctrl->groups[selector].pins; in nsp_get_group_pins()
340 *num_pins = pinctrl->groups[selector].num_pins; in nsp_get_group_pins()
348 seq_printf(s, " %s", dev_name(pctrl_dev->dev)); in nsp_pin_dbg_show()
362 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_get_functions_count() local
364 return pinctrl->num_functions; in nsp_get_functions_count()
370 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_get_function_name() local
372 return pinctrl->functions[selector].name; in nsp_get_function_name()
380 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_get_function_groups() local
382 *groups = pinctrl->functions[selector].groups; in nsp_get_function_groups()
383 *num_groups = pinctrl->functions[selector].num_groups; in nsp_get_function_groups()
388 static int nsp_pinmux_set(struct nsp_pinctrl *pinctrl, in nsp_pinmux_set() argument
393 const struct nsp_mux *mux = &grp->mux; in nsp_pinmux_set()
399 for (i = 0; i < pinctrl->num_groups; i++) { in nsp_pinmux_set()
400 if ((mux->shift != mux_log[i].mux.shift) || in nsp_pinmux_set()
401 (mux->base != mux_log[i].mux.base)) in nsp_pinmux_set()
412 if (mux_log[i].mux.alt != mux->alt) { in nsp_pinmux_set()
413 dev_err(pinctrl->dev, in nsp_pinmux_set()
415 dev_err(pinctrl->dev, "func:%s grp:%s\n", in nsp_pinmux_set()
416 func->name, grp->name); in nsp_pinmux_set()
417 return -EINVAL; in nsp_pinmux_set()
422 if (i == pinctrl->num_groups) in nsp_pinmux_set()
423 return -EINVAL; in nsp_pinmux_set()
425 mask = mux->mask; in nsp_pinmux_set()
426 mux_log[i].mux.alt = mux->alt; in nsp_pinmux_set()
429 switch (mux->base) { in nsp_pinmux_set()
431 base_address = pinctrl->base0; in nsp_pinmux_set()
435 base_address = pinctrl->base1; in nsp_pinmux_set()
439 base_address = pinctrl->base2; in nsp_pinmux_set()
443 return -EINVAL; in nsp_pinmux_set()
446 spin_lock_irqsave(&pinctrl->lock, flags); in nsp_pinmux_set()
448 val &= ~(mask << grp->mux.shift); in nsp_pinmux_set()
449 val |= grp->mux.alt << grp->mux.shift; in nsp_pinmux_set()
451 spin_unlock_irqrestore(&pinctrl->lock, flags); in nsp_pinmux_set()
459 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_pinmux_enable() local
463 if (grp_select >= pinctrl->num_groups || in nsp_pinmux_enable()
464 func_select >= pinctrl->num_functions) in nsp_pinmux_enable()
465 return -EINVAL; in nsp_pinmux_enable()
467 func = &pinctrl->functions[func_select]; in nsp_pinmux_enable()
468 grp = &pinctrl->groups[grp_select]; in nsp_pinmux_enable()
470 dev_dbg(pctrl_dev->dev, "func:%u name:%s grp:%u name:%s\n", in nsp_pinmux_enable()
471 func_select, func->name, grp_select, grp->name); in nsp_pinmux_enable()
473 dev_dbg(pctrl_dev->dev, "shift:%u alt:%u\n", grp->mux.shift, in nsp_pinmux_enable()
474 grp->mux.alt); in nsp_pinmux_enable()
476 return nsp_pinmux_set(pinctrl, func, grp, pinctrl->mux_log); in nsp_pinmux_enable()
482 unsigned int pin) in nsp_gpio_request_enable() argument
484 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_gpio_request_enable() local
485 u32 *gpio_select = pctrl_dev->desc->pins[pin].drv_data; in nsp_gpio_request_enable()
489 spin_lock_irqsave(&pinctrl->lock, flags); in nsp_gpio_request_enable()
490 val = readl(pinctrl->base0); in nsp_gpio_request_enable()
491 if ((val & BIT(pin)) != (*gpio_select << pin)) { in nsp_gpio_request_enable()
492 val &= ~BIT(pin); in nsp_gpio_request_enable()
493 val |= *gpio_select << pin; in nsp_gpio_request_enable()
494 writel(val, pinctrl->base0); in nsp_gpio_request_enable()
496 spin_unlock_irqrestore(&pinctrl->lock, flags); in nsp_gpio_request_enable()
503 unsigned int pin) in nsp_gpio_disable_free() argument
505 struct nsp_pinctrl *pinctrl = pinctrl_dev_get_drvdata(pctrl_dev); in nsp_gpio_disable_free() local
506 u32 *gpio_select = pctrl_dev->desc->pins[pin].drv_data; in nsp_gpio_disable_free()
510 spin_lock_irqsave(&pinctrl->lock, flags); in nsp_gpio_disable_free()
511 val = readl(pinctrl->base0); in nsp_gpio_disable_free()
512 if ((val & (1 << pin)) == (*gpio_select << pin)) { in nsp_gpio_disable_free()
513 val &= ~(1 << pin); in nsp_gpio_disable_free()
515 val |= (1 << pin); in nsp_gpio_disable_free()
516 writel(val, pinctrl->base0); in nsp_gpio_disable_free()
518 spin_unlock_irqrestore(&pinctrl->lock, flags); in nsp_gpio_disable_free()
531 .name = "nsp-pinmux",
536 static int nsp_mux_log_init(struct nsp_pinctrl *pinctrl) in nsp_mux_log_init() argument
542 pinctrl->mux_log = devm_kcalloc(pinctrl->dev, no_of_groups, in nsp_mux_log_init()
545 if (!pinctrl->mux_log) in nsp_mux_log_init()
546 return -ENOMEM; in nsp_mux_log_init()
549 log = &pinctrl->mux_log[i]; in nsp_mux_log_init()
550 log->mux.base = nsp_pin_groups[i].mux.base; in nsp_mux_log_init()
551 log->mux.shift = nsp_pin_groups[i].mux.shift; in nsp_mux_log_init()
552 log->mux.alt = 0; in nsp_mux_log_init()
553 log->is_configured = false; in nsp_mux_log_init()
561 struct nsp_pinctrl *pinctrl; in nsp_pinmux_probe() local
567 pinctrl = devm_kzalloc(&pdev->dev, sizeof(*pinctrl), GFP_KERNEL); in nsp_pinmux_probe()
568 if (!pinctrl) in nsp_pinmux_probe()
569 return -ENOMEM; in nsp_pinmux_probe()
570 pinctrl->dev = &pdev->dev; in nsp_pinmux_probe()
571 platform_set_drvdata(pdev, pinctrl); in nsp_pinmux_probe()
572 spin_lock_init(&pinctrl->lock); in nsp_pinmux_probe()
574 pinctrl->base0 = devm_platform_ioremap_resource(pdev, 0); in nsp_pinmux_probe()
575 if (IS_ERR(pinctrl->base0)) in nsp_pinmux_probe()
576 return PTR_ERR(pinctrl->base0); in nsp_pinmux_probe()
580 return -EINVAL; in nsp_pinmux_probe()
581 pinctrl->base1 = devm_ioremap(&pdev->dev, res->start, in nsp_pinmux_probe()
583 if (!pinctrl->base1) { in nsp_pinmux_probe()
584 dev_err(&pdev->dev, "unable to map I/O space\n"); in nsp_pinmux_probe()
585 return -ENOMEM; in nsp_pinmux_probe()
588 pinctrl->base2 = devm_platform_ioremap_resource(pdev, 2); in nsp_pinmux_probe()
589 if (IS_ERR(pinctrl->base2)) in nsp_pinmux_probe()
590 return PTR_ERR(pinctrl->base2); in nsp_pinmux_probe()
592 ret = nsp_mux_log_init(pinctrl); in nsp_pinmux_probe()
594 dev_err(&pdev->dev, "unable to initialize IOMUX log\n"); in nsp_pinmux_probe()
598 pins = devm_kcalloc(&pdev->dev, num_pins, sizeof(*pins), GFP_KERNEL); in nsp_pinmux_probe()
600 return -ENOMEM; in nsp_pinmux_probe()
603 pins[i].number = nsp_pins[i].pin; in nsp_pinmux_probe()
608 pinctrl->groups = nsp_pin_groups; in nsp_pinmux_probe()
609 pinctrl->num_groups = ARRAY_SIZE(nsp_pin_groups); in nsp_pinmux_probe()
610 pinctrl->functions = nsp_pin_functions; in nsp_pinmux_probe()
611 pinctrl->num_functions = ARRAY_SIZE(nsp_pin_functions); in nsp_pinmux_probe()
615 pinctrl->pctl = devm_pinctrl_register(&pdev->dev, &nsp_pinctrl_desc, in nsp_pinmux_probe()
616 pinctrl); in nsp_pinmux_probe()
617 if (IS_ERR(pinctrl->pctl)) { in nsp_pinmux_probe()
618 dev_err(&pdev->dev, "unable to register nsp IOMUX pinctrl\n"); in nsp_pinmux_probe()
619 return PTR_ERR(pinctrl->pctl); in nsp_pinmux_probe()
626 { .compatible = "brcm,nsp-pinmux" },
632 .name = "nsp-pinmux",