Lines Matching +full:gpio1 +full:- +full:cfg

1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2016-2018 Nuvoton Technology corporation.
21 #include <linux/pinctrl/pinconf-generic.h>
51 #define NPCM7XX_GP_N_PU 0x1c /* Pull-up */
52 #define NPCM7XX_GP_N_PD 0x20 /* Pull-down */
110 raw_spin_lock_irqsave(&gc->bgpio_lock, flags); in npcm_gpio_set()
115 raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); in npcm_gpio_set()
124 raw_spin_lock_irqsave(&gc->bgpio_lock, flags); in npcm_gpio_clr()
129 raw_spin_unlock_irqrestore(&gc->bgpio_lock, flags); in npcm_gpio_clr()
136 seq_printf(s, "-- module %d [gpio%d - %d]\n", in npcmgpio_dbg_show()
137 bank->gc.base / bank->gc.ngpio, in npcmgpio_dbg_show()
138 bank->gc.base, in npcmgpio_dbg_show()
139 bank->gc.base + bank->gc.ngpio); in npcmgpio_dbg_show()
141 ioread32(bank->base + NPCM7XX_GP_N_DIN), in npcmgpio_dbg_show()
142 ioread32(bank->base + NPCM7XX_GP_N_DOUT), in npcmgpio_dbg_show()
143 ioread32(bank->base + NPCM7XX_GP_N_IEM), in npcmgpio_dbg_show()
144 ioread32(bank->base + NPCM7XX_GP_N_OE)); in npcmgpio_dbg_show()
146 ioread32(bank->base + NPCM7XX_GP_N_PU), in npcmgpio_dbg_show()
147 ioread32(bank->base + NPCM7XX_GP_N_PD), in npcmgpio_dbg_show()
148 ioread32(bank->base + NPCM7XX_GP_N_DBNC), in npcmgpio_dbg_show()
149 ioread32(bank->base + NPCM7XX_GP_N_POL)); in npcmgpio_dbg_show()
151 ioread32(bank->base + NPCM7XX_GP_N_EVTYP), in npcmgpio_dbg_show()
152 ioread32(bank->base + NPCM7XX_GP_N_EVBE), in npcmgpio_dbg_show()
153 ioread32(bank->base + NPCM7XX_GP_N_EVEN), in npcmgpio_dbg_show()
154 ioread32(bank->base + NPCM7XX_GP_N_EVST)); in npcmgpio_dbg_show()
156 ioread32(bank->base + NPCM7XX_GP_N_OTYP), in npcmgpio_dbg_show()
157 ioread32(bank->base + NPCM7XX_GP_N_OSRC), in npcmgpio_dbg_show()
158 ioread32(bank->base + NPCM7XX_GP_N_ODSC)); in npcmgpio_dbg_show()
160 ioread32(bank->base + NPCM7XX_GP_N_OBL0), in npcmgpio_dbg_show()
161 ioread32(bank->base + NPCM7XX_GP_N_OBL1), in npcmgpio_dbg_show()
162 ioread32(bank->base + NPCM7XX_GP_N_OBL2), in npcmgpio_dbg_show()
163 ioread32(bank->base + NPCM7XX_GP_N_OBL3)); in npcmgpio_dbg_show()
165 ioread32(bank->base + NPCM7XX_GP_N_SPLCK), in npcmgpio_dbg_show()
166 ioread32(bank->base + NPCM7XX_GP_N_MPLCK)); in npcmgpio_dbg_show()
178 return bank->direction_input(chip, offset); in npcmgpio_direction_input()
188 dev_dbg(chip->parent, "gpio_direction_output: offset%d = %x\n", offset, in npcmgpio_direction_output()
195 return bank->direction_output(chip, offset, value); in npcmgpio_direction_output()
203 dev_dbg(chip->parent, "gpio_request: offset%d\n", offset); in npcmgpio_gpio_request()
208 return bank->request(chip, offset); in npcmgpio_gpio_request()
223 sts = ioread32(bank->base + NPCM7XX_GP_N_EVST); in npcmgpio_irq_handler()
224 en = ioread32(bank->base + NPCM7XX_GP_N_EVEN); in npcmgpio_irq_handler()
225 dev_dbg(bank->gc.parent, "==> got irq sts %.8lx %.8lx\n", sts, in npcmgpio_irq_handler()
230 generic_handle_domain_irq(gc->irq.domain, bit); in npcmgpio_irq_handler()
240 dev_dbg(bank->gc.parent, "setirqtype: %u.%u = %u\n", gpio, in npcmgpio_set_irq_type()
241 d->irq, type); in npcmgpio_set_irq_type()
244 dev_dbg(bank->gc.parent, "edge.rising\n"); in npcmgpio_set_irq_type()
245 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_EVBE, gpio); in npcmgpio_set_irq_type()
246 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_POL, gpio); in npcmgpio_set_irq_type()
249 dev_dbg(bank->gc.parent, "edge.falling\n"); in npcmgpio_set_irq_type()
250 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_EVBE, gpio); in npcmgpio_set_irq_type()
251 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_POL, gpio); in npcmgpio_set_irq_type()
254 dev_dbg(bank->gc.parent, "edge.both\n"); in npcmgpio_set_irq_type()
255 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_EVBE, gpio); in npcmgpio_set_irq_type()
258 dev_dbg(bank->gc.parent, "level.low\n"); in npcmgpio_set_irq_type()
259 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_POL, gpio); in npcmgpio_set_irq_type()
262 dev_dbg(bank->gc.parent, "level.high\n"); in npcmgpio_set_irq_type()
263 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_POL, gpio); in npcmgpio_set_irq_type()
266 dev_dbg(bank->gc.parent, "invalid irq type\n"); in npcmgpio_set_irq_type()
267 return -EINVAL; in npcmgpio_set_irq_type()
271 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_EVTYP, gpio); in npcmgpio_set_irq_type()
275 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_EVTYP, gpio); in npcmgpio_set_irq_type()
288 dev_dbg(bank->gc.parent, "irq_ack: %u.%u\n", gpio, d->irq); in npcmgpio_irq_ack()
289 iowrite32(BIT(gpio), bank->base + NPCM7XX_GP_N_EVST); in npcmgpio_irq_ack()
300 dev_dbg(bank->gc.parent, "irq_mask: %u.%u\n", gpio, d->irq); in npcmgpio_irq_mask()
301 iowrite32(BIT(gpio), bank->base + NPCM7XX_GP_N_EVENC); in npcmgpio_irq_mask()
314 dev_dbg(bank->gc.parent, "irq_unmask: %u.%u\n", gpio, d->irq); in npcmgpio_irq_unmask()
315 iowrite32(BIT(gpio), bank->base + NPCM7XX_GP_N_EVENS); in npcmgpio_irq_unmask()
323 /* active-high, input, clear interrupt, enable interrupt */ in npcmgpio_irq_startup()
324 dev_dbg(gc->parent, "startup: %u.%u\n", gpio, d->irq); in npcmgpio_irq_startup()
333 .name = "NPCM7XX-GPIO-IRQ",
1172 PINCTRL_PIN(1, "GPIO1/IOX1LD"),
1415 const struct npcm7xx_pincfg *cfg; in npcm7xx_setfunc() local
1419 cfg = &pincfg[pin[i]]; in npcm7xx_setfunc()
1420 if (mode == fn_gpio || cfg->fn0 == mode || cfg->fn1 == mode || cfg->fn2 == mode) { in npcm7xx_setfunc()
1421 if (cfg->reg0) in npcm7xx_setfunc()
1422 regmap_update_bits(gcr_regmap, cfg->reg0, in npcm7xx_setfunc()
1423 BIT(cfg->bit0), in npcm7xx_setfunc()
1424 !!(cfg->fn0 == mode) ? in npcm7xx_setfunc()
1425 BIT(cfg->bit0) : 0); in npcm7xx_setfunc()
1426 if (cfg->reg1) in npcm7xx_setfunc()
1427 regmap_update_bits(gcr_regmap, cfg->reg1, in npcm7xx_setfunc()
1428 BIT(cfg->bit1), in npcm7xx_setfunc()
1429 !!(cfg->fn1 == mode) ? in npcm7xx_setfunc()
1430 BIT(cfg->bit1) : 0); in npcm7xx_setfunc()
1431 if (cfg->reg2) in npcm7xx_setfunc()
1432 regmap_update_bits(gcr_regmap, cfg->reg2, in npcm7xx_setfunc()
1433 BIT(cfg->bit2), in npcm7xx_setfunc()
1434 !!(cfg->fn2 == mode) ? in npcm7xx_setfunc()
1435 BIT(cfg->bit2) : 0); in npcm7xx_setfunc()
1445 int gpio = (pin % bank->gc.ngpio); in npcm7xx_get_slew_rate()
1449 return ioread32(bank->base + NPCM7XX_GP_N_OSRC) in npcm7xx_get_slew_rate()
1457 return -EINVAL; in npcm7xx_get_slew_rate()
1465 int gpio = BIT(pin % bank->gc.ngpio); in npcm7xx_set_slew_rate()
1470 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_OSRC, in npcm7xx_set_slew_rate()
1474 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_OSRC, in npcm7xx_set_slew_rate()
1478 return -EINVAL; in npcm7xx_set_slew_rate()
1493 return -EINVAL; in npcm7xx_set_slew_rate()
1497 return -EINVAL; in npcm7xx_set_slew_rate()
1506 &npcm->gpio_bank[pin / NPCM7XX_GPIO_PER_BANK]; in npcm7xx_get_drive_strength()
1507 int gpio = (pin % bank->gc.ngpio); in npcm7xx_get_drive_strength()
1515 val = ioread32(bank->base + NPCM7XX_GP_N_ODSC) in npcm7xx_get_drive_strength()
1518 dev_dbg(bank->gc.parent, in npcm7xx_get_drive_strength()
1523 return -EINVAL; in npcm7xx_get_drive_strength()
1532 &npcm->gpio_bank[pin / NPCM7XX_GPIO_PER_BANK]; in npcm7xx_set_drive_strength()
1533 int gpio = BIT(pin % bank->gc.ngpio); in npcm7xx_set_drive_strength()
1537 return -ENOTSUPP; in npcm7xx_set_drive_strength()
1539 dev_dbg(bank->gc.parent, in npcm7xx_set_drive_strength()
1541 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_ODSC, gpio); in npcm7xx_set_drive_strength()
1544 dev_dbg(bank->gc.parent, in npcm7xx_set_drive_strength()
1546 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_ODSC, gpio); in npcm7xx_set_drive_strength()
1550 return -ENOTSUPP; in npcm7xx_set_drive_strength()
1564 dev_dbg(npcm->dev, "group size: %zu\n", ARRAY_SIZE(npcm7xx_groups)); in npcm7xx_get_groups_count()
1629 dev_dbg(npcm->dev, "set_mux: %d, %d[%s]\n", function, group, in npcm7xx_pinmux_set_mux()
1632 npcm7xx_setfunc(npcm->gcr_regmap, npcm7xx_groups[group].pins, in npcm7xx_pinmux_set_mux()
1645 dev_err(npcm->dev, "invalid range\n"); in npcm7xx_gpio_request_enable()
1646 return -EINVAL; in npcm7xx_gpio_request_enable()
1648 if (!range->gc) { in npcm7xx_gpio_request_enable()
1649 dev_err(npcm->dev, "invalid gpiochip\n"); in npcm7xx_gpio_request_enable()
1650 return -EINVAL; in npcm7xx_gpio_request_enable()
1653 npcm7xx_setfunc(npcm->gcr_regmap, &offset, 1, fn_gpio); in npcm7xx_gpio_request_enable()
1666 virq = irq_find_mapping(npcm->domain, offset); in npcm7xx_gpio_request_free()
1678 &npcm->gpio_bank[offset / NPCM7XX_GPIO_PER_BANK]; in npcm_gpio_set_direction()
1679 int gpio = BIT(offset % bank->gc.ngpio); in npcm_gpio_set_direction()
1681 dev_dbg(bank->gc.parent, "GPIO Set Direction: %d = %d\n", offset, in npcm_gpio_set_direction()
1684 iowrite32(gpio, bank->base + NPCM7XX_GP_N_OEC); in npcm_gpio_set_direction()
1686 iowrite32(gpio, bank->base + NPCM7XX_GP_N_OES); in npcm_gpio_set_direction()
1708 &npcm->gpio_bank[pin / NPCM7XX_GPIO_PER_BANK]; in npcm7xx_config_get()
1709 int gpio = (pin % bank->gc.ngpio); in npcm7xx_config_get()
1718 pu = ioread32(bank->base + NPCM7XX_GP_N_PU) & pinmask; in npcm7xx_config_get()
1719 pd = ioread32(bank->base + NPCM7XX_GP_N_PD) & pinmask; in npcm7xx_config_get()
1729 ie = ioread32(bank->base + NPCM7XX_GP_N_IEM) & pinmask; in npcm7xx_config_get()
1730 oe = ioread32(bank->base + NPCM7XX_GP_N_OE) & pinmask; in npcm7xx_config_get()
1737 rc = !(ioread32(bank->base + NPCM7XX_GP_N_OTYP) & pinmask); in npcm7xx_config_get()
1740 rc = ioread32(bank->base + NPCM7XX_GP_N_OTYP) & pinmask; in npcm7xx_config_get()
1743 rc = ioread32(bank->base + NPCM7XX_GP_N_DBNC) & pinmask; in npcm7xx_config_get()
1751 rc = npcm7xx_get_slew_rate(bank, npcm->gcr_regmap, pin); in npcm7xx_config_get()
1756 return -ENOTSUPP; in npcm7xx_config_get()
1760 return -EINVAL; in npcm7xx_config_get()
1771 &npcm->gpio_bank[pin / NPCM7XX_GPIO_PER_BANK]; in npcm7xx_config_set_one()
1772 int gpio = BIT(pin % bank->gc.ngpio); in npcm7xx_config_set_one()
1774 dev_dbg(bank->gc.parent, "param=%d %d[GPIO]\n", param, pin); in npcm7xx_config_set_one()
1777 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_PU, gpio); in npcm7xx_config_set_one()
1778 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_PD, gpio); in npcm7xx_config_set_one()
1781 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_PU, gpio); in npcm7xx_config_set_one()
1782 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_PD, gpio); in npcm7xx_config_set_one()
1785 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_PD, gpio); in npcm7xx_config_set_one()
1786 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_PU, gpio); in npcm7xx_config_set_one()
1789 iowrite32(gpio, bank->base + NPCM7XX_GP_N_OEC); in npcm7xx_config_set_one()
1790 bank->direction_input(&bank->gc, pin % bank->gc.ngpio); in npcm7xx_config_set_one()
1793 bank->direction_output(&bank->gc, pin % bank->gc.ngpio, arg); in npcm7xx_config_set_one()
1794 iowrite32(gpio, bank->base + NPCM7XX_GP_N_OES); in npcm7xx_config_set_one()
1797 npcm_gpio_clr(&bank->gc, bank->base + NPCM7XX_GP_N_OTYP, gpio); in npcm7xx_config_set_one()
1800 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_OTYP, gpio); in npcm7xx_config_set_one()
1803 npcm_gpio_set(&bank->gc, bank->base + NPCM7XX_GP_N_DBNC, gpio); in npcm7xx_config_set_one()
1806 return npcm7xx_set_slew_rate(bank, npcm->gcr_regmap, pin, arg); in npcm7xx_config_set_one()
1810 return -ENOTSUPP; in npcm7xx_config_set_one()
1823 while (num_configs--) { in npcm7xx_config_set()
1840 .name = "npcm7xx-pinctrl",
1851 int ret = -ENXIO; in npcm7xx_gpio_of()
1853 struct device *dev = pctrl->dev; in npcm7xx_gpio_of()
1867 pctrl->gpio_bank[id].base = ioremap(res.start, resource_size(&res)); in npcm7xx_gpio_of()
1868 if (!pctrl->gpio_bank[id].base) in npcm7xx_gpio_of()
1869 return -EINVAL; in npcm7xx_gpio_of()
1871 ret = bgpio_init(&pctrl->gpio_bank[id].gc, dev, 4, in npcm7xx_gpio_of()
1872 pctrl->gpio_bank[id].base + NPCM7XX_GP_N_DIN, in npcm7xx_gpio_of()
1873 pctrl->gpio_bank[id].base + NPCM7XX_GP_N_DOUT, in npcm7xx_gpio_of()
1876 pctrl->gpio_bank[id].base + NPCM7XX_GP_N_IEM, in npcm7xx_gpio_of()
1883 ret = fwnode_property_get_reference_args(child, "gpio-ranges", NULL, 3, 0, &args); in npcm7xx_gpio_of()
1885 dev_err(dev, "gpio-ranges fail for GPIO bank %u\n", id); in npcm7xx_gpio_of()
1892 return -EINVAL; in npcm7xx_gpio_of()
1894 pctrl->gpio_bank[id].irq = ret; in npcm7xx_gpio_of()
1895 pctrl->gpio_bank[id].irqbase = id * NPCM7XX_GPIO_PER_BANK; in npcm7xx_gpio_of()
1896 pctrl->gpio_bank[id].pinctrl_id = args.args[0]; in npcm7xx_gpio_of()
1897 pctrl->gpio_bank[id].gc.base = args.args[1]; in npcm7xx_gpio_of()
1898 pctrl->gpio_bank[id].gc.ngpio = args.args[2]; in npcm7xx_gpio_of()
1899 pctrl->gpio_bank[id].gc.owner = THIS_MODULE; in npcm7xx_gpio_of()
1900 pctrl->gpio_bank[id].gc.parent = dev; in npcm7xx_gpio_of()
1901 pctrl->gpio_bank[id].gc.fwnode = child; in npcm7xx_gpio_of()
1902 pctrl->gpio_bank[id].gc.label = devm_kasprintf(dev, GFP_KERNEL, "%pfw", child); in npcm7xx_gpio_of()
1903 if (pctrl->gpio_bank[id].gc.label == NULL) in npcm7xx_gpio_of()
1904 return -ENOMEM; in npcm7xx_gpio_of()
1906 pctrl->gpio_bank[id].gc.dbg_show = npcmgpio_dbg_show; in npcm7xx_gpio_of()
1907 pctrl->gpio_bank[id].direction_input = pctrl->gpio_bank[id].gc.direction_input; in npcm7xx_gpio_of()
1908 pctrl->gpio_bank[id].gc.direction_input = npcmgpio_direction_input; in npcm7xx_gpio_of()
1909 pctrl->gpio_bank[id].direction_output = pctrl->gpio_bank[id].gc.direction_output; in npcm7xx_gpio_of()
1910 pctrl->gpio_bank[id].gc.direction_output = npcmgpio_direction_output; in npcm7xx_gpio_of()
1911 pctrl->gpio_bank[id].request = pctrl->gpio_bank[id].gc.request; in npcm7xx_gpio_of()
1912 pctrl->gpio_bank[id].gc.request = npcmgpio_gpio_request; in npcm7xx_gpio_of()
1913 pctrl->gpio_bank[id].gc.free = pinctrl_gpio_free; in npcm7xx_gpio_of()
1917 pctrl->bank_num = id; in npcm7xx_gpio_of()
1925 for (id = 0 ; id < pctrl->bank_num ; id++) { in npcm7xx_gpio_register()
1928 girq = &pctrl->gpio_bank[id].gc.irq; in npcm7xx_gpio_register()
1930 girq->parent_handler = npcmgpio_irq_handler; in npcm7xx_gpio_register()
1931 girq->num_parents = 1; in npcm7xx_gpio_register()
1932 girq->parents = devm_kcalloc(pctrl->dev, 1, in npcm7xx_gpio_register()
1933 sizeof(*girq->parents), in npcm7xx_gpio_register()
1935 if (!girq->parents) { in npcm7xx_gpio_register()
1936 ret = -ENOMEM; in npcm7xx_gpio_register()
1939 girq->parents[0] = pctrl->gpio_bank[id].irq; in npcm7xx_gpio_register()
1940 girq->default_type = IRQ_TYPE_NONE; in npcm7xx_gpio_register()
1941 girq->handler = handle_level_irq; in npcm7xx_gpio_register()
1942 ret = devm_gpiochip_add_data(pctrl->dev, in npcm7xx_gpio_register()
1943 &pctrl->gpio_bank[id].gc, in npcm7xx_gpio_register()
1944 &pctrl->gpio_bank[id]); in npcm7xx_gpio_register()
1946 dev_err(pctrl->dev, "Failed to add GPIO chip %u\n", id); in npcm7xx_gpio_register()
1950 ret = gpiochip_add_pin_range(&pctrl->gpio_bank[id].gc, in npcm7xx_gpio_register()
1951 dev_name(pctrl->dev), in npcm7xx_gpio_register()
1952 pctrl->gpio_bank[id].pinctrl_id, in npcm7xx_gpio_register()
1953 pctrl->gpio_bank[id].gc.base, in npcm7xx_gpio_register()
1954 pctrl->gpio_bank[id].gc.ngpio); in npcm7xx_gpio_register()
1956 dev_err(pctrl->dev, "Failed to add GPIO bank %u\n", id); in npcm7xx_gpio_register()
1957 gpiochip_remove(&pctrl->gpio_bank[id].gc); in npcm7xx_gpio_register()
1965 for (; id > 0; id--) in npcm7xx_gpio_register()
1966 gpiochip_remove(&pctrl->gpio_bank[id - 1].gc); in npcm7xx_gpio_register()
1976 pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL); in npcm7xx_pinctrl_probe()
1978 return -ENOMEM; in npcm7xx_pinctrl_probe()
1980 pctrl->dev = &pdev->dev; in npcm7xx_pinctrl_probe()
1981 dev_set_drvdata(&pdev->dev, pctrl); in npcm7xx_pinctrl_probe()
1983 pctrl->gcr_regmap = in npcm7xx_pinctrl_probe()
1984 syscon_regmap_lookup_by_compatible("nuvoton,npcm750-gcr"); in npcm7xx_pinctrl_probe()
1985 if (IS_ERR(pctrl->gcr_regmap)) { in npcm7xx_pinctrl_probe()
1986 dev_err(pctrl->dev, "didn't find nuvoton,npcm750-gcr\n"); in npcm7xx_pinctrl_probe()
1987 return PTR_ERR(pctrl->gcr_regmap); in npcm7xx_pinctrl_probe()
1992 dev_err(pctrl->dev, "Failed to gpio dt-binding %u\n", ret); in npcm7xx_pinctrl_probe()
1996 pctrl->pctldev = devm_pinctrl_register(&pdev->dev, in npcm7xx_pinctrl_probe()
1998 if (IS_ERR(pctrl->pctldev)) { in npcm7xx_pinctrl_probe()
1999 dev_err(&pdev->dev, "Failed to register pinctrl device\n"); in npcm7xx_pinctrl_probe()
2000 return PTR_ERR(pctrl->pctldev); in npcm7xx_pinctrl_probe()
2005 dev_err(pctrl->dev, "Failed to register gpio %u\n", ret); in npcm7xx_pinctrl_probe()
2014 { .compatible = "nuvoton,npcm750-pinctrl" },
2022 .name = "npcm7xx-pinctrl",