Index: head/sys/mips/mediatek/mtk_pinctrl.c =================================================================== --- head/sys/mips/mediatek/mtk_pinctrl.c (revision 325230) +++ head/sys/mips/mediatek/mtk_pinctrl.c (revision 325231) @@ -1,237 +1,240 @@ /*- * Copyright (c) 2016 Stanislav Galabov * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer, * without modification, immediately at the beginning of the file. * 2. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * */ #include __FBSDID("$FreeBSD$"); #include #include #include #include #include #include #include #include #include #include #include #include #include "fdt_pinctrl_if.h" static const struct ofw_compat_data compat_data[] = { { "ralink,rt2880-pinmux", 1 }, /* Sentinel */ { NULL, 0 } }; static int mtk_pinctrl_probe(device_t dev) { if (!ofw_bus_status_okay(dev)) return (ENXIO); if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) return (ENXIO); device_set_desc(dev, "MTK Pin Controller"); return (0); } static int mtk_pinctrl_attach(device_t dev) { if (device_get_unit(dev) != 0) { device_printf(dev, "Only one pin control allowed\n"); return (ENXIO); } if (bootverbose) device_printf(dev, "GPIO mode start: 0x%08x\n", mtk_sysctl_get(SYSCTL_GPIOMODE)); fdt_pinctrl_register(dev, NULL); fdt_pinctrl_configure_tree(dev); if (bootverbose) device_printf(dev, "GPIO mode end : 0x%08x\n", mtk_sysctl_get(SYSCTL_GPIOMODE)); return (0); } static int mtk_pinctrl_process_entry(device_t dev, struct mtk_pin_group *table, const char *group, char *func) { uint32_t val; int found = 0, i, j; for (i = 0; table[i].name != NULL; i++) { if (strcmp(table[i].name, group) == 0) { found = 1; break; } } if (!found) return (ENOENT); for (j = 0; j < table[i].funcnum; j++) { if (strcmp(table[i].functions[j].name, func) == 0) { val = mtk_sysctl_get(table[i].sysc_reg); val &= ~(table[i].mask << table[i].offset); val |= (table[i].functions[j].value << table[i].offset); mtk_sysctl_set(table[i].sysc_reg, val); return (0); } } return (ENOENT); } static int mtk_pinctrl_process_node(device_t dev, struct mtk_pin_group *table, phandle_t node) { const char **group_list = NULL; char *pin_function = NULL; int ret, num_groups, i; ret = 0; num_groups = ofw_bus_string_list_to_array(node, "ralink,group", &group_list); if (num_groups <= 0) return (ENOENT); if (OF_getprop_alloc(node, "ralink,function", sizeof(*pin_function), (void **)&pin_function) == -1) { ret = ENOENT; goto out; } for (i = 0; i < num_groups; i++) { if ((ret = mtk_pinctrl_process_entry(dev, table, group_list[i], pin_function)) != 0) goto out; } out: OF_prop_free(group_list); OF_prop_free(pin_function); return (ret); } static int mtk_pinctrl_configure(device_t dev, phandle_t cfgxref) { struct mtk_pin_group *pintable; phandle_t node, child; uint32_t socid; int ret; node = OF_node_from_xref(cfgxref); ret = 0; /* Now, get the system type, so we can get the proper GPIO mode array */ socid = mtk_soc_get_socid(); switch (socid) { + case MTK_SOC_RT2880: + pintable = rt2880_pintable; + break; case MTK_SOC_RT3050: /* fallthrough */ case MTK_SOC_RT3052: case MTK_SOC_RT3350: pintable = rt3050_pintable; break; case MTK_SOC_RT3352: pintable = rt3352_pintable; break; case MTK_SOC_RT3662: /* fallthrough */ case MTK_SOC_RT3883: pintable = rt3883_pintable; break; case MTK_SOC_RT5350: pintable = rt5350_pintable; break; case MTK_SOC_MT7620A: /* fallthrough */ case MTK_SOC_MT7620N: pintable = mt7620_pintable; break; case MTK_SOC_MT7628: /* fallthrough */ case MTK_SOC_MT7688: pintable = mt7628_pintable; break; case MTK_SOC_MT7621: pintable = mt7621_pintable; break; default: ret = ENOENT; goto out; } /* * OpenWRT dts files have single child within the pinctrl nodes, which * contains the 'ralink,group' and 'ralink,function' properties. */ for (child = OF_child(node); child != 0 && child != -1; child = OF_peer(child)) { if ((ret = mtk_pinctrl_process_node(dev, pintable, child)) != 0) return (ret); } out: return (ret); } static device_method_t mtk_pinctrl_methods[] = { DEVMETHOD(device_probe, mtk_pinctrl_probe), DEVMETHOD(device_attach, mtk_pinctrl_attach), /* fdt_pinctrl interface */ DEVMETHOD(fdt_pinctrl_configure, mtk_pinctrl_configure), DEVMETHOD_END }; static driver_t mtk_pinctrl_driver = { "pinctrl", mtk_pinctrl_methods, 0, }; static devclass_t mtk_pinctrl_devclass; EARLY_DRIVER_MODULE(mtk_pinctrl, simplebus, mtk_pinctrl_driver, mtk_pinctrl_devclass, 0, 0, BUS_PASS_INTERRUPT + BUS_PASS_ORDER_EARLY); MODULE_DEPEND(mtk_pinctrl, mtk_sysctl, 1, 1, 1); Index: head/sys/mips/mediatek/mtk_pinctrl.h =================================================================== --- head/sys/mips/mediatek/mtk_pinctrl.h (revision 325230) +++ head/sys/mips/mediatek/mtk_pinctrl.h (revision 325231) @@ -1,354 +1,374 @@ /*- * Copyright (c) 2016 Stanislav Galabov. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice unmodified, this list of conditions, and the following * disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $FreeBSD$ */ #ifndef _MTK_PINCTRL_H_ #define _MTK_PINCTRL_H_ struct mtk_pin_function { const char *name; uint32_t value; }; struct mtk_pin_group { const char *name; uint32_t sysc_reg; uint32_t offset; uint32_t mask; struct mtk_pin_function *functions; uint32_t funcnum; }; #define FUNC(_name, _value) \ { .name = (_name), .value = (_value) } #define GROUP(_name, _reg, _off, _mask, _funcs) \ { .name = (_name), .sysc_reg = (_reg), .offset = (_off), \ .mask = (_mask), .functions = (_funcs), .funcnum = nitems(_funcs) } #define GROUP_END { NULL, 0, 0, 0, NULL, 0 } #define DECL_FUNC(_name) \ static struct mtk_pin_function _name[] #define DECL_TABLE(_name) \ static struct mtk_pin_group _name[] /* Pin function declarations */ DECL_FUNC(i2c_func) = { FUNC("i2c", 0), FUNC("gpio", 1) }; DECL_FUNC(spi_func) = { FUNC("spi", 0), FUNC("gpio", 1) }; DECL_FUNC(uartf_func) = { FUNC("uartf", 0), FUNC("pcm uartf", 1), FUNC("pcm i2s", 2), FUNC("i2s uartf", 3), FUNC("pcm gpio", 4), FUNC("gpio uartf", 5), FUNC("gpio i2s", 6), FUNC("gpio", 7) }; DECL_FUNC(wdt_func) = { FUNC("wdt rst", 0), FUNC("wdt", 0), FUNC("wdt refclk", 1), FUNC("gpio", 2) }; DECL_FUNC(uartlite_func) = { FUNC("uartlite", 0), FUNC("gpio", 1) }; DECL_FUNC(jtag_func) = { FUNC("jtag", 0), FUNC("gpio", 1) }; DECL_FUNC(mdio_func) = { FUNC("mdio", 0), FUNC("gpio", 1) }; DECL_FUNC(led_func) = { FUNC("led", 0), FUNC("gpio", 1), FUNC("bt", 2) }; DECL_FUNC(cs1_func) = { FUNC("spi_cs1", 0), FUNC("wdt_cs1", 1), FUNC("gpio", 2) }; DECL_FUNC(sdram_func) = { FUNC("sdram", 0), FUNC("gpio", 1) }; DECL_FUNC(rgmii_func) = { FUNC("rgmii", 0), FUNC("rgmii1", 0), FUNC("rgmii2", 0), FUNC("gpio", 1) }; DECL_FUNC(lna_func) = { FUNC("lna", 0), FUNC("gpio", 1) }; DECL_FUNC(pa_func) = { FUNC("pa", 0), FUNC("gpio", 1) }; DECL_FUNC(gex_func) = { FUNC("ge1", 0), FUNC("ge2", 0), FUNC("gpio", 1) }; +DECL_FUNC(rt2880_uartf_func) = { + FUNC("uartf", 0), FUNC("gpio", 1) +}; + +DECL_FUNC(rt2880_pci_func) = { + FUNC("pci", 0), FUNC("gpio", 1) +}; + DECL_FUNC(rt3883_pci_func) = { FUNC("pci-dev", 0), FUNC("pci-host2", 1), FUNC("pci-host1", 2), FUNC("pci-fnc", 3), FUNC("gpio", 7) }; DECL_FUNC(mt7620_pcie_func) = { FUNC("pcie rst", 0), FUNC("pcie refclk", 1), FUNC("gpio", 2) }; DECL_FUNC(lna_a_func) = { FUNC("lna a", 0), FUNC("lna g", 0), FUNC("codec", 2), FUNC("gpio", 3) }; DECL_FUNC(nd_sd_func) = { FUNC("nand", 0), FUNC("sd", 1), FUNC("gpio", 2) }; DECL_FUNC(mt7620_mdio_func) = { FUNC("mdio", 0), FUNC("mdio refclk", 1), FUNC("gpio", 2) }; DECL_FUNC(spi_refclk_func) = { FUNC("spi refclk", 0), FUNC("gpio", 1) }; DECL_FUNC(wled_func) = { FUNC("wled", 0), FUNC("gpio", 1) }; DECL_FUNC(ephy_func) = { FUNC("ephy", 0), FUNC("gpio", 1) }; DECL_FUNC(mt7628_gpio_func) = { FUNC("gpio", 0), FUNC("gpio", 1), FUNC("refclk", 2), FUNC("pcie", 3) }; DECL_FUNC(mt7628_spis_func) = { FUNC("spis", 0), FUNC("gpio", 1), FUNC("utif", 2), FUNC("pwm", 3) }; DECL_FUNC(mt7628_spi_cs1_func) = { FUNC("spi", 0), FUNC("gpio", 1), FUNC("refclk", 2), FUNC("-", 3) }; DECL_FUNC(mt7628_i2s_func) = { FUNC("i2s", 0), FUNC("gpio", 1), FUNC("pcm", 2), FUNC("anttenna", 3) }; DECL_FUNC(mt7628_uart0_func) = { FUNC("uart0", 0), FUNC("gpio", 1), FUNC("-", 2), FUNC("-", 3) }; DECL_FUNC(mt7628_sd_func) = { FUNC("sdxc", 0), FUNC("gpio", 1), FUNC("utif", 2), FUNC("jtag", 3) }; DECL_FUNC(mt7628_perst_func) = { FUNC("perst", 0), FUNC("gpio", 1) }; DECL_FUNC(mt7628_refclk_func) = { FUNC("refclk", 0), FUNC("gpio", 1) }; DECL_FUNC(mt7628_i2c_func) = { FUNC("i2c", 0), FUNC("gpio", 1), FUNC("debug", 2), FUNC("-", 3) }; DECL_FUNC(mt7628_uart1_func) = { FUNC("uart1", 0), FUNC("gpio", 1), FUNC("pwm", 2), FUNC("sw r", 3) }; DECL_FUNC(mt7628_uart2_func) = { FUNC("uart2", 0), FUNC("gpio", 1), FUNC("pwm", 2), FUNC("sdxc", 3) }; DECL_FUNC(mt7628_pwm0_func) = { FUNC("pwm", 0), FUNC("gpio", 1), FUNC("utif", 2), FUNC("sdxc", 3) }; DECL_FUNC(mt7621_uart1_func) = { FUNC("uart1", 0), FUNC("gpio", 1) }; DECL_FUNC(mt7621_i2c_func) = { FUNC("i2c", 0), FUNC("gpio", 1) }; DECL_FUNC(mt7621_uart3_func) = { FUNC("uart3", 0), FUNC("gpio", 1), FUNC("i2s", 2), FUNC("spdif3", 3) }; DECL_FUNC(mt7621_uart2_func) = { FUNC("uart2", 0), FUNC("gpio", 1), FUNC("pcm", 2), FUNC("spdif2", 3) }; DECL_FUNC(mt7621_jtag_func) = { FUNC("jtag", 0), FUNC("gpio", 1) }; DECL_FUNC(mt7621_wdt_func) = { FUNC("wdt rst", 0), FUNC("gpio", 1), FUNC("wdt refclk", 2), FUNC("-", 3) }; DECL_FUNC(mt7621_pcie_func) = { FUNC("pcie rst", 0), FUNC("gpio", 1), FUNC("pcie refclk", 2), FUNC("-", 3) }; DECL_FUNC(mt7621_mdio_func) = { FUNC("mdio", 0), FUNC("gpio", 1), FUNC("-", 2), FUNC("-", 3) }; DECL_FUNC(mt7621_rgmii_func) = { FUNC("rgmii1", 0), FUNC("rgmii2", 0), FUNC("gpio", 1) }; DECL_FUNC(mt7621_spi_func) = { FUNC("spi", 0), FUNC("gpio", 1), FUNC("nand1", 2), FUNC("-", 3) }; DECL_FUNC(mt7621_sdhci_func) = { FUNC("sdhci", 0), FUNC("gpio", 1), FUNC("nand1", 2), FUNC("-", 3) }; /* Pin groups declarations */ DECL_TABLE(mt7628_pintable) = { GROUP("gpio", SYSCTL_GPIOMODE, 0, 3, mt7628_gpio_func), GROUP("spis", SYSCTL_GPIOMODE, 2, 3, mt7628_spis_func), GROUP("spi cs1", SYSCTL_GPIOMODE, 4, 3, mt7628_spi_cs1_func), GROUP("i2s", SYSCTL_GPIOMODE, 6, 3, mt7628_i2s_func), GROUP("uart0", SYSCTL_GPIOMODE, 8, 3, mt7628_uart0_func), GROUP("sdmode", SYSCTL_GPIOMODE, 10, 3, mt7628_sd_func), GROUP("spi", SYSCTL_GPIOMODE, 12, 1, spi_func), GROUP("wdt", SYSCTL_GPIOMODE, 14, 1, wdt_func), GROUP("perst", SYSCTL_GPIOMODE, 16, 1, mt7628_perst_func), GROUP("refclk", SYSCTL_GPIOMODE, 18, 1, mt7628_refclk_func), GROUP("i2c", SYSCTL_GPIOMODE, 20, 3, mt7628_i2c_func), GROUP("uart1", SYSCTL_GPIOMODE, 24, 3, mt7628_uart1_func), GROUP("uart2", SYSCTL_GPIOMODE, 26, 3, mt7628_uart2_func), GROUP("pwm0", SYSCTL_GPIOMODE, 28, 3, mt7628_pwm0_func), GROUP("pwm1", SYSCTL_GPIOMODE, 30, 3, mt7628_pwm0_func), GROUP_END }; DECL_TABLE(mt7621_pintable) = { GROUP("uart1", SYSCTL_GPIOMODE, 1, 1, mt7621_uart1_func), GROUP("i2c", SYSCTL_GPIOMODE, 2, 1, mt7621_i2c_func), GROUP("uart3", SYSCTL_GPIOMODE, 3, 3, mt7621_uart3_func), GROUP("uart2", SYSCTL_GPIOMODE, 5, 3, mt7621_uart2_func), GROUP("jtag", SYSCTL_GPIOMODE, 7, 1, mt7621_jtag_func), GROUP("wdt", SYSCTL_GPIOMODE, 8, 3, mt7621_wdt_func), GROUP("pcie", SYSCTL_GPIOMODE, 10, 3, mt7621_pcie_func), GROUP("mdio", SYSCTL_GPIOMODE, 12, 3, mt7621_mdio_func), GROUP("rgmii2", SYSCTL_GPIOMODE, 15, 1, mt7621_rgmii_func), GROUP("spi", SYSCTL_GPIOMODE, 16, 3, mt7621_spi_func), GROUP("sdhci", SYSCTL_GPIOMODE, 18, 3, mt7621_sdhci_func), GROUP("rgmii1", SYSCTL_GPIOMODE, 14, 1, mt7621_rgmii_func), GROUP_END }; DECL_TABLE(mt7620_pintable) = { GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), GROUP("mdio", SYSCTL_GPIOMODE, 7, 3, mt7620_mdio_func), GROUP("rgmii1", SYSCTL_GPIOMODE, 9, 1, rgmii_func), GROUP("rgmii2", SYSCTL_GPIOMODE, 10, 1, rgmii_func), GROUP("spi", SYSCTL_GPIOMODE, 11, 1, spi_func), GROUP("spi refclk", SYSCTL_GPIOMODE, 12, 1, spi_refclk_func), GROUP("wled", SYSCTL_GPIOMODE, 13, 1, wled_func), GROUP("ephy", SYSCTL_GPIOMODE, 15, 1, ephy_func), GROUP("pcie", SYSCTL_GPIOMODE, 16, 3, mt7620_pcie_func), GROUP("nd_sd", SYSCTL_GPIOMODE, 18, 3, nd_sd_func), GROUP("pa", SYSCTL_GPIOMODE, 20, 1, pa_func), GROUP("wdt", SYSCTL_GPIOMODE, 21, 3, wdt_func), + GROUP_END +}; + +DECL_TABLE(rt2880_pintable) = { + GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), + GROUP("uartf", SYSCTL_GPIOMODE, 1, 1, rt2880_uartf_func), + GROUP("spi", SYSCTL_GPIOMODE, 2, 1, spi_func), + GROUP("uartlite", SYSCTL_GPIOMODE, 3, 1, uartlite_func), + GROUP("jtag", SYSCTL_GPIOMODE, 4, 1, jtag_func), + GROUP("mdio", SYSCTL_GPIOMODE, 5, 1, mdio_func), + GROUP("sdram", SYSCTL_GPIOMODE, 6, 1, sdram_func), + GROUP("pci", SYSCTL_GPIOMODE, 7, 1, rt2880_pci_func), GROUP_END }; DECL_TABLE(rt3050_pintable) = { GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), GROUP("spi", SYSCTL_GPIOMODE, 1, 1, spi_func), GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), GROUP("jtag", SYSCTL_GPIOMODE, 6, 1, jtag_func), GROUP("mdio", SYSCTL_GPIOMODE, 7, 1, mdio_func), GROUP("sdram", SYSCTL_GPIOMODE, 8, 1, sdram_func), GROUP("rgmii", SYSCTL_GPIOMODE, 9, 1, rgmii_func), GROUP_END }; DECL_TABLE(rt3352_pintable) = { GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), GROUP("spi", SYSCTL_GPIOMODE, 1, 1, i2c_func), GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), GROUP("jtag", SYSCTL_GPIOMODE, 6, 1, jtag_func), GROUP("mdio", SYSCTL_GPIOMODE, 7, 1, mdio_func), GROUP("rgmii", SYSCTL_GPIOMODE, 9, 1, rgmii_func), GROUP("led", SYSCTL_GPIOMODE, 14, 3, led_func), GROUP("lna", SYSCTL_GPIOMODE, 18, 1, lna_func), GROUP("pa", SYSCTL_GPIOMODE, 20, 1, pa_func), GROUP("spi_cs1", SYSCTL_GPIOMODE, 21, 3, cs1_func), GROUP_END }; DECL_TABLE(rt3883_pintable) = { GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), GROUP("spi", SYSCTL_GPIOMODE, 1, 1, spi_func), GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), GROUP("jtag", SYSCTL_GPIOMODE, 6, 1, jtag_func), GROUP("mdio", SYSCTL_GPIOMODE, 7, 1, mdio_func), GROUP("lna a", SYSCTL_GPIOMODE, 16, 3, lna_a_func), GROUP("lna g", SYSCTL_GPIOMODE, 18, 3, lna_a_func), GROUP("pci", SYSCTL_GPIOMODE, 11, 7, rt3883_pci_func), GROUP("ge1", SYSCTL_GPIOMODE, 9, 1, gex_func), GROUP("ge2", SYSCTL_GPIOMODE, 10, 1, gex_func), GROUP_END }; DECL_TABLE(rt5350_pintable) = { GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), GROUP("spi", SYSCTL_GPIOMODE, 1, 1, spi_func), GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), GROUP("jtag", SYSCTL_GPIOMODE, 6, 1, jtag_func), GROUP("led", SYSCTL_GPIOMODE, 14, 3, led_func), GROUP("spi_cs1", SYSCTL_GPIOMODE, 21, 3, cs1_func), GROUP_END }; #endif /* _MTK_PINCTRL_H_ */