1 /*- 2 * Copyright (c) 2016 Stanislav Galabov. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $FreeBSD$ 28 */ 29 30 #ifndef _MTK_PINCTRL_H_ 31 #define _MTK_PINCTRL_H_ 32 33 struct mtk_pin_function { 34 const char *name; 35 uint32_t value; 36 }; 37 38 struct mtk_pin_group { 39 const char *name; 40 uint32_t sysc_reg; 41 uint32_t offset; 42 uint32_t mask; 43 struct mtk_pin_function *functions; 44 uint32_t funcnum; 45 }; 46 47 #define FUNC(_name, _value) \ 48 { .name = (_name), .value = (_value) } 49 50 #define GROUP(_name, _reg, _off, _mask, _funcs) \ 51 { .name = (_name), .sysc_reg = (_reg), .offset = (_off), \ 52 .mask = (_mask), .functions = (_funcs), .funcnum = nitems(_funcs) } 53 #define GROUP_END { NULL, 0, 0, 0, NULL, 0 } 54 55 #define DECL_FUNC(_name) \ 56 static struct mtk_pin_function _name[] 57 #define DECL_TABLE(_name) \ 58 static struct mtk_pin_group _name[] 59 60 /* Pin function declarations */ 61 DECL_FUNC(i2c_func) = { 62 FUNC("i2c", 0), FUNC("gpio", 1) 63 }; 64 65 DECL_FUNC(spi_func) = { 66 FUNC("spi", 0), FUNC("gpio", 1) 67 }; 68 69 DECL_FUNC(uartf_func) = { 70 FUNC("uartf", 0), FUNC("pcm uartf", 1), FUNC("pcm i2s", 2), 71 FUNC("i2s uartf", 3), FUNC("pcm gpio", 4), FUNC("gpio uartf", 5), 72 FUNC("gpio i2s", 6), FUNC("gpio", 7) 73 }; 74 75 DECL_FUNC(wdt_func) = { 76 FUNC("wdt rst", 0), FUNC("wdt", 0), FUNC("wdt refclk", 1), 77 FUNC("gpio", 2) 78 }; 79 80 DECL_FUNC(uartlite_func) = { 81 FUNC("uartlite", 0), FUNC("gpio", 1) 82 }; 83 84 DECL_FUNC(jtag_func) = { 85 FUNC("jtag", 0), FUNC("gpio", 1) 86 }; 87 88 DECL_FUNC(mdio_func) = { 89 FUNC("mdio", 0), FUNC("gpio", 1) 90 }; 91 92 DECL_FUNC(led_func) = { 93 FUNC("led", 0), FUNC("gpio", 1), FUNC("bt", 2) 94 }; 95 96 DECL_FUNC(cs1_func) = { 97 FUNC("spi_cs1", 0), FUNC("wdt_cs1", 1), FUNC("gpio", 2) 98 }; 99 100 DECL_FUNC(sdram_func) = { 101 FUNC("sdram", 0), FUNC("gpio", 1) 102 }; 103 104 DECL_FUNC(rgmii_func) = { 105 FUNC("rgmii", 0), FUNC("rgmii1", 0), FUNC("rgmii2", 0), FUNC("gpio", 1) 106 }; 107 108 DECL_FUNC(lna_func) = { 109 FUNC("lna", 0), FUNC("gpio", 1) 110 }; 111 112 DECL_FUNC(pa_func) = { 113 FUNC("pa", 0), FUNC("gpio", 1) 114 }; 115 116 DECL_FUNC(gex_func) = { 117 FUNC("ge1", 0), FUNC("ge2", 0), FUNC("gpio", 1) 118 }; 119 120 DECL_FUNC(rt2880_uartf_func) = { 121 FUNC("uartf", 0), FUNC("gpio", 1) 122 }; 123 124 DECL_FUNC(rt2880_pci_func) = { 125 FUNC("pci", 0), FUNC("gpio", 1) 126 }; 127 128 DECL_FUNC(rt3883_pci_func) = { 129 FUNC("pci-dev", 0), FUNC("pci-host2", 1), FUNC("pci-host1", 2), 130 FUNC("pci-fnc", 3), FUNC("gpio", 7) 131 }; 132 133 DECL_FUNC(mt7620_pcie_func) = { 134 FUNC("pcie rst", 0), FUNC("pcie refclk", 1), FUNC("gpio", 2) 135 }; 136 137 DECL_FUNC(lna_a_func) = { 138 FUNC("lna a", 0), FUNC("lna g", 0), FUNC("codec", 2), FUNC("gpio", 3) 139 }; 140 141 DECL_FUNC(nd_sd_func) = { 142 FUNC("nand", 0), FUNC("sd", 1), FUNC("gpio", 2) 143 }; 144 145 DECL_FUNC(mt7620_mdio_func) = { 146 FUNC("mdio", 0), FUNC("mdio refclk", 1), FUNC("gpio", 2) 147 }; 148 149 DECL_FUNC(spi_refclk_func) = { 150 FUNC("spi refclk", 0), FUNC("gpio", 1) 151 }; 152 153 DECL_FUNC(wled_func) = { 154 FUNC("wled", 0), FUNC("gpio", 1) 155 }; 156 157 DECL_FUNC(ephy_func) = { 158 FUNC("ephy", 0), FUNC("gpio", 1) 159 }; 160 161 DECL_FUNC(mt7628_gpio_func) = { 162 FUNC("gpio", 0), FUNC("gpio", 1), FUNC("refclk", 2), FUNC("pcie", 3) 163 }; 164 165 DECL_FUNC(mt7628_spis_func) = { 166 FUNC("spis", 0), FUNC("gpio", 1), FUNC("utif", 2), FUNC("pwm", 3) 167 }; 168 169 DECL_FUNC(mt7628_spi_cs1_func) = { 170 FUNC("spi", 0), FUNC("gpio", 1), FUNC("refclk", 2), FUNC("-", 3) 171 }; 172 173 DECL_FUNC(mt7628_i2s_func) = { 174 FUNC("i2s", 0), FUNC("gpio", 1), FUNC("pcm", 2), FUNC("anttenna", 3) 175 }; 176 177 DECL_FUNC(mt7628_uart0_func) = { 178 FUNC("uart0", 0), FUNC("gpio", 1), FUNC("-", 2), FUNC("-", 3) 179 }; 180 181 DECL_FUNC(mt7628_sd_func) = { 182 FUNC("sdxc", 0), FUNC("gpio", 1), FUNC("utif", 2), FUNC("jtag", 3) 183 }; 184 185 DECL_FUNC(mt7628_perst_func) = { 186 FUNC("perst", 0), FUNC("gpio", 1) 187 }; 188 189 DECL_FUNC(mt7628_refclk_func) = { 190 FUNC("refclk", 0), FUNC("gpio", 1) 191 }; 192 193 DECL_FUNC(mt7628_i2c_func) = { 194 FUNC("i2c", 0), FUNC("gpio", 1), FUNC("debug", 2), FUNC("-", 3) 195 }; 196 197 DECL_FUNC(mt7628_uart1_func) = { 198 FUNC("uart1", 0), FUNC("gpio", 1), FUNC("pwm", 2), FUNC("sw r", 3) 199 }; 200 201 DECL_FUNC(mt7628_uart2_func) = { 202 FUNC("uart2", 0), FUNC("gpio", 1), FUNC("pwm", 2), FUNC("sdxc", 3) 203 }; 204 205 DECL_FUNC(mt7628_pwm0_func) = { 206 FUNC("pwm", 0), FUNC("gpio", 1), FUNC("utif", 2), FUNC("sdxc", 3) 207 }; 208 209 DECL_FUNC(mt7621_uart1_func) = { 210 FUNC("uart1", 0), FUNC("gpio", 1) 211 }; 212 213 DECL_FUNC(mt7621_i2c_func) = { 214 FUNC("i2c", 0), FUNC("gpio", 1) 215 }; 216 217 DECL_FUNC(mt7621_uart3_func) = { 218 FUNC("uart3", 0), FUNC("gpio", 1), FUNC("i2s", 2), FUNC("spdif3", 3) 219 }; 220 221 DECL_FUNC(mt7621_uart2_func) = { 222 FUNC("uart2", 0), FUNC("gpio", 1), FUNC("pcm", 2), FUNC("spdif2", 3) 223 }; 224 225 DECL_FUNC(mt7621_jtag_func) = { 226 FUNC("jtag", 0), FUNC("gpio", 1) 227 }; 228 229 DECL_FUNC(mt7621_wdt_func) = { 230 FUNC("wdt rst", 0), FUNC("gpio", 1), FUNC("wdt refclk", 2), FUNC("-", 3) 231 }; 232 233 DECL_FUNC(mt7621_pcie_func) = { 234 FUNC("pcie rst", 0), FUNC("gpio", 1), FUNC("pcie refclk", 2), 235 FUNC("-", 3) 236 }; 237 238 DECL_FUNC(mt7621_mdio_func) = { 239 FUNC("mdio", 0), FUNC("gpio", 1), FUNC("-", 2), FUNC("-", 3) 240 }; 241 242 DECL_FUNC(mt7621_rgmii_func) = { 243 FUNC("rgmii1", 0), FUNC("rgmii2", 0), FUNC("gpio", 1) 244 }; 245 246 DECL_FUNC(mt7621_spi_func) = { 247 FUNC("spi", 0), FUNC("gpio", 1), FUNC("nand1", 2), FUNC("-", 3) 248 }; 249 250 DECL_FUNC(mt7621_sdhci_func) = { 251 FUNC("sdhci", 0), FUNC("gpio", 1), FUNC("nand1", 2), FUNC("-", 3) 252 }; 253 254 /* Pin groups declarations */ 255 DECL_TABLE(mt7628_pintable) = { 256 GROUP("gpio", SYSCTL_GPIOMODE, 0, 3, mt7628_gpio_func), 257 GROUP("spis", SYSCTL_GPIOMODE, 2, 3, mt7628_spis_func), 258 GROUP("spi cs1", SYSCTL_GPIOMODE, 4, 3, mt7628_spi_cs1_func), 259 GROUP("i2s", SYSCTL_GPIOMODE, 6, 3, mt7628_i2s_func), 260 GROUP("uart0", SYSCTL_GPIOMODE, 8, 3, mt7628_uart0_func), 261 GROUP("sdmode", SYSCTL_GPIOMODE, 10, 3, mt7628_sd_func), 262 GROUP("spi", SYSCTL_GPIOMODE, 12, 1, spi_func), 263 GROUP("wdt", SYSCTL_GPIOMODE, 14, 1, wdt_func), 264 GROUP("perst", SYSCTL_GPIOMODE, 16, 1, mt7628_perst_func), 265 GROUP("refclk", SYSCTL_GPIOMODE, 18, 1, mt7628_refclk_func), 266 GROUP("i2c", SYSCTL_GPIOMODE, 20, 3, mt7628_i2c_func), 267 GROUP("uart1", SYSCTL_GPIOMODE, 24, 3, mt7628_uart1_func), 268 GROUP("uart2", SYSCTL_GPIOMODE, 26, 3, mt7628_uart2_func), 269 GROUP("pwm0", SYSCTL_GPIOMODE, 28, 3, mt7628_pwm0_func), 270 GROUP("pwm1", SYSCTL_GPIOMODE, 30, 3, mt7628_pwm0_func), 271 GROUP_END 272 }; 273 274 DECL_TABLE(mt7621_pintable) = { 275 GROUP("uart1", SYSCTL_GPIOMODE, 1, 1, mt7621_uart1_func), 276 GROUP("i2c", SYSCTL_GPIOMODE, 2, 1, mt7621_i2c_func), 277 GROUP("uart3", SYSCTL_GPIOMODE, 3, 3, mt7621_uart3_func), 278 GROUP("uart2", SYSCTL_GPIOMODE, 5, 3, mt7621_uart2_func), 279 GROUP("jtag", SYSCTL_GPIOMODE, 7, 1, mt7621_jtag_func), 280 GROUP("wdt", SYSCTL_GPIOMODE, 8, 3, mt7621_wdt_func), 281 GROUP("pcie", SYSCTL_GPIOMODE, 10, 3, mt7621_pcie_func), 282 GROUP("mdio", SYSCTL_GPIOMODE, 12, 3, mt7621_mdio_func), 283 GROUP("rgmii2", SYSCTL_GPIOMODE, 15, 1, mt7621_rgmii_func), 284 GROUP("spi", SYSCTL_GPIOMODE, 16, 3, mt7621_spi_func), 285 GROUP("sdhci", SYSCTL_GPIOMODE, 18, 3, mt7621_sdhci_func), 286 GROUP("rgmii1", SYSCTL_GPIOMODE, 14, 1, mt7621_rgmii_func), 287 GROUP_END 288 }; 289 290 DECL_TABLE(mt7620_pintable) = { 291 GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), 292 GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), 293 GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), 294 GROUP("mdio", SYSCTL_GPIOMODE, 7, 3, mt7620_mdio_func), 295 GROUP("rgmii1", SYSCTL_GPIOMODE, 9, 1, rgmii_func), 296 GROUP("rgmii2", SYSCTL_GPIOMODE, 10, 1, rgmii_func), 297 GROUP("spi", SYSCTL_GPIOMODE, 11, 1, spi_func), 298 GROUP("spi refclk", SYSCTL_GPIOMODE, 12, 1, spi_refclk_func), 299 GROUP("wled", SYSCTL_GPIOMODE, 13, 1, wled_func), 300 GROUP("ephy", SYSCTL_GPIOMODE, 15, 1, ephy_func), 301 GROUP("pcie", SYSCTL_GPIOMODE, 16, 3, mt7620_pcie_func), 302 GROUP("nd_sd", SYSCTL_GPIOMODE, 18, 3, nd_sd_func), 303 GROUP("pa", SYSCTL_GPIOMODE, 20, 1, pa_func), 304 GROUP("wdt", SYSCTL_GPIOMODE, 21, 3, wdt_func), 305 GROUP_END 306 }; 307 308 DECL_TABLE(rt2880_pintable) = { 309 GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), 310 GROUP("uartf", SYSCTL_GPIOMODE, 1, 1, rt2880_uartf_func), 311 GROUP("spi", SYSCTL_GPIOMODE, 2, 1, spi_func), 312 GROUP("uartlite", SYSCTL_GPIOMODE, 3, 1, uartlite_func), 313 GROUP("jtag", SYSCTL_GPIOMODE, 4, 1, jtag_func), 314 GROUP("mdio", SYSCTL_GPIOMODE, 5, 1, mdio_func), 315 GROUP("sdram", SYSCTL_GPIOMODE, 6, 1, sdram_func), 316 GROUP("pci", SYSCTL_GPIOMODE, 7, 1, rt2880_pci_func), 317 GROUP_END 318 }; 319 320 DECL_TABLE(rt3050_pintable) = { 321 GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), 322 GROUP("spi", SYSCTL_GPIOMODE, 1, 1, spi_func), 323 GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), 324 GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), 325 GROUP("jtag", SYSCTL_GPIOMODE, 6, 1, jtag_func), 326 GROUP("mdio", SYSCTL_GPIOMODE, 7, 1, mdio_func), 327 GROUP("sdram", SYSCTL_GPIOMODE, 8, 1, sdram_func), 328 GROUP("rgmii", SYSCTL_GPIOMODE, 9, 1, rgmii_func), 329 GROUP_END 330 }; 331 332 DECL_TABLE(rt3352_pintable) = { 333 GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), 334 GROUP("spi", SYSCTL_GPIOMODE, 1, 1, i2c_func), 335 GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), 336 GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), 337 GROUP("jtag", SYSCTL_GPIOMODE, 6, 1, jtag_func), 338 GROUP("mdio", SYSCTL_GPIOMODE, 7, 1, mdio_func), 339 GROUP("rgmii", SYSCTL_GPIOMODE, 9, 1, rgmii_func), 340 GROUP("led", SYSCTL_GPIOMODE, 14, 3, led_func), 341 GROUP("lna", SYSCTL_GPIOMODE, 18, 1, lna_func), 342 GROUP("pa", SYSCTL_GPIOMODE, 20, 1, pa_func), 343 GROUP("spi_cs1", SYSCTL_GPIOMODE, 21, 3, cs1_func), 344 GROUP_END 345 }; 346 347 DECL_TABLE(rt3883_pintable) = { 348 GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), 349 GROUP("spi", SYSCTL_GPIOMODE, 1, 1, spi_func), 350 GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), 351 GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), 352 GROUP("jtag", SYSCTL_GPIOMODE, 6, 1, jtag_func), 353 GROUP("mdio", SYSCTL_GPIOMODE, 7, 1, mdio_func), 354 GROUP("lna a", SYSCTL_GPIOMODE, 16, 3, lna_a_func), 355 GROUP("lna g", SYSCTL_GPIOMODE, 18, 3, lna_a_func), 356 GROUP("pci", SYSCTL_GPIOMODE, 11, 7, rt3883_pci_func), 357 GROUP("ge1", SYSCTL_GPIOMODE, 9, 1, gex_func), 358 GROUP("ge2", SYSCTL_GPIOMODE, 10, 1, gex_func), 359 GROUP_END 360 }; 361 362 DECL_TABLE(rt5350_pintable) = { 363 GROUP("i2c", SYSCTL_GPIOMODE, 0, 1, i2c_func), 364 GROUP("spi", SYSCTL_GPIOMODE, 1, 1, spi_func), 365 GROUP("uartf", SYSCTL_GPIOMODE, 2, 7, uartf_func), 366 GROUP("uartlite", SYSCTL_GPIOMODE, 5, 1, uartlite_func), 367 GROUP("jtag", SYSCTL_GPIOMODE, 6, 1, jtag_func), 368 GROUP("led", SYSCTL_GPIOMODE, 14, 3, led_func), 369 GROUP("spi_cs1", SYSCTL_GPIOMODE, 21, 3, cs1_func), 370 GROUP_END 371 }; 372 373 #endif /* _MTK_PINCTRL_H_ */ 374