Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
pinmux-sh7757.c
Go to the documentation of this file.
1 /*
2  * SH7757 (B0 step) Pinmux
3  *
4  * Copyright (C) 2009-2010 Renesas Solutions Corp.
5  *
6  * Author : Yoshihiro Shimoda <[email protected]>
7  *
8  * Based on SH7723 Pinmux
9  * Copyright (C) 2008 Magnus Damm
10  *
11  * This file is subject to the terms and conditions of the GNU General Public
12  * License. See the file "COPYING" in the main directory of this archive
13  * for more details.
14  */
15 
16 #include <linux/init.h>
17 #include <linux/kernel.h>
18 #include <linux/gpio.h>
19 #include <cpu/sh7757.h>
20 
21 enum {
23 
78 
133 
173 
228 
282 
297 
302 
310 
322 
334 
345 
362 
375 
385 
387  /* PTA (mobule: LBSC, RGMII) */
390 
391  /* PTB (mobule: INTC, ONFI, TMU) */
396 
397  /* PTC (mobule: IRQ, PWMU) */
402 
403  /* PTD (mobule: SPI0, DMAC) */
407 
408  /* PTE (mobule: RMII) */
413 
414  /* PTF (mobule: RMII, SerMux) */
420 
421  /* PTG (mobule: system, LBSC, LPC, WDT, LPC, eMMC) */
425 
426  /* PTH (mobule: SPI1, LPC, DMAC, ADC) */
431 
432  /* PTI (mobule: LBSC, SDHI) */
437 
438  /* PTJ (mobule: SCIF234) */
441 
442  /* PTK (mobule: SERMUX, LBSC, SCIF) */
446 
447  /* PTL (mobule: SERMUX, SCIF, LBSC, AUD) */
452 
453  /* PTM (mobule: LBSC, IIC) */
456 
457  /* PTN (mobule: USB, JMC, SGPIO, WDT) */
462 
463  /* PTO (mobule: SGPIO, SerMux) */
468 
469  /* PTQ (mobule: LPC) */
472 
473  /* PTR (mobule: GRA, IIC) */
477 
478  /* PTS (mobule: GRA, IIC) */
482 
483  /* PTT (mobule: PWMX, AUD) */
488 
489  /* PTU (mobule: LPC, APM) */
495 
496  /* PTV (mobule: LBSC, SerMux, R-SPI, EVC, GRA) */
503 
504  /* PTW (mobule: LBSC, EVC, SCIF) */
509 
510  /* PTX (mobule: LBSC, SCIF, SIM) */
514 
515  /* PTY (mobule: LBSC) */
518 
519  /* PTZ (mobule: eMMC, ONFI) */
524 
526 };
527 
528 static pinmux_enum_t pinmux_data[] = {
529  /* PTA GPIO */
538 
539  /* PTB GPIO */
548 
549  /* PTC GPIO */
558 
559  /* PTD GPIO */
568 
569  /* PTE GPIO */
578 
579  /* PTF GPIO */
588 
589  /* PTG GPIO */
598 
599  /* PTH GPIO */
608 
609  /* PTI GPIO */
618 
619  /* PTJ GPIO */
627 
628  /* PTK GPIO */
637 
638  /* PTL GPIO */
646 
647  /* PTM GPIO */
655 
656  /* PTN GPIO */
664 
665  /* PTO GPIO */
674 
675  /* PTQ GPIO */
683 
684  /* PTR GPIO */
693 
694  /* PTS GPIO */
703 
704  /* PTT GPIO */
713 
714  /* PTU GPIO */
723 
724  /* PTV GPIO */
733 
734  /* PTW GPIO */
743 
744  /* PTX GPIO */
753 
754  /* PTY GPIO */
763 
764  /* PTZ GPIO */
773 
774  /* PTA FN */
783 
784  /* PTB FN */
801 
802  /* PTC FN */
817 
818  /* PTD FN */
830 
831  /* PTE FN */
840 
841  /* PTF FN */
851 
852  /* PTG FN */
863 
864  /* PTH FN */
878 
879  /* PTI FN */
896 
897  /* PTJ FN */
905 
906  /* PTK FN */
918 
919  /* PTL FN */
933 
934  /* PTM FN */
943 
944  /* PTN FN */
957 
958  /* PTO FN */
971 
972  /* PTP FN */
973 
974  /* PTQ FN */
982 
983  /* PTR FN */
984  PINMUX_DATA(SDA8_MARK, PTR7_FN), /* DDC3? */
985  PINMUX_DATA(SCL8_MARK, PTR6_FN), /* DDC2? */
992 
993  /* PTS FN */
994  PINMUX_DATA(SDA9_MARK, PTS7_FN), /* DDC1? */
995  PINMUX_DATA(SCL9_MARK, PTS6_FN), /* DDC0? */
1002 
1003  /* PTT FN */
1018 
1019  /* PTU FN */
1036 
1037  /* PTV FN */
1054 
1055  /* PTW FN */
1072 
1073  /* PTX FN */
1086 
1087  /* PTY FN */
1096 
1097  /* PTZ FN */
1114 };
1115 
1116 static struct pinmux_gpio pinmux_gpios[] = {
1117  /* PTA */
1126 
1127  /* PTB */
1136 
1137  /* PTC */
1146 
1147  /* PTD */
1156 
1157  /* PTE */
1166 
1167  /* PTF */
1176 
1177  /* PTG */
1186 
1187  /* PTH */
1196 
1197  /* PTI */
1206 
1207  /* PTJ */
1215 
1216  /* PTK */
1225 
1226  /* PTL */
1234 
1235  /* PTM */
1244 
1245  /* PTN */
1253 
1254  /* PTO */
1263 
1264  /* PTP */
1273 
1274  /* PTQ */
1282 
1283  /* PTR */
1292 
1293  /* PTS */
1302 
1303  /* PTT */
1312 
1313  /* PTU */
1322 
1323  /* PTV */
1332 
1333  /* PTW */
1342 
1343  /* PTX */
1352 
1353  /* PTY */
1362 
1363  /* PTZ */
1372 
1373  /* PTA (mobule: LBSC, RGMII) */
1382 
1383  /* PTB (mobule: INTC, ONFI, TMU) */
1400 
1401  /* PTC (mobule: IRQ, PWMU) */
1416 
1417  /* PTD (mobule: SPI0, DMAC) */
1429 
1430  /* PTE (mobule: RMII) */
1439 
1440  /* PTF (mobule: RMII, SerMux) */
1450 
1451  /* PTG (mobule: system, LBSC, LPC, WDT, LPC, eMMC) */
1462 
1463  /* PTH (mobule: SPI1, LPC, DMAC, ADC) */
1477 
1478  /* PTI (mobule: LBSC, SDHI) */
1495 
1496  /* PTJ (mobule: SCIF234, SERMUX) */
1504 
1505  /* PTK (mobule: SERMUX, LBSC, SCIF) */
1517 
1518  /* PTL (mobule: SERMUX, SCIF, LBSC, AUD) */
1532 
1533  /* PTM (mobule: LBSC, IIC) */
1542 
1543  /* PTN (mobule: USB, JMC, SGPIO, WDT) */
1556 
1557  /* PTO (mobule: SGPIO, SerMux) */
1570 
1571  /* PTP (mobule: EVC, ADC) */
1572 
1573  /* PTQ (mobule: LPC) */
1581 
1582  /* PTR (mobule: GRA, IIC) */
1593 
1594  /* PTS (mobule: GRA, IIC) */
1605 
1606  /* PTT (mobule: PWMX, AUD) */
1621 
1622  /* PTU (mobule: LPC, APM) */
1639 
1640  /* PTV (mobule: LBSC, SerMux, R-SPI, EVC, GRA) */
1661 
1662  /* PTW (mobule: LBSC, EVC, SCIF) */
1680 
1681  /* PTX (mobule: LBSC) */
1694 
1695  /* PTY (mobule: LBSC) */
1704 
1705  /* PTZ (mobule: eMMC, ONFI) */
1722  };
1723 
1724 static struct pinmux_cfg_reg pinmux_config_regs[] = {
1725  { PINMUX_CFG_REG("PACR", 0xffec0000, 16, 2) {
1734  },
1735  { PINMUX_CFG_REG("PBCR", 0xffec0002, 16, 2) {
1736  PTB7_FN, PTB7_OUT, PTB7_IN, 0,
1737  PTB6_FN, PTB6_OUT, PTB6_IN, 0,
1738  PTB5_FN, PTB5_OUT, PTB5_IN, 0,
1739  PTB4_FN, PTB4_OUT, PTB4_IN, 0,
1740  PTB3_FN, PTB3_OUT, PTB3_IN, 0,
1741  PTB2_FN, PTB2_OUT, PTB2_IN, 0,
1742  PTB1_FN, PTB1_OUT, PTB1_IN, 0,
1743  PTB0_FN, PTB0_OUT, PTB0_IN, 0 }
1744  },
1745  { PINMUX_CFG_REG("PCCR", 0xffec0004, 16, 2) {
1746  PTC7_FN, PTC7_OUT, PTC7_IN, 0,
1747  PTC6_FN, PTC6_OUT, PTC6_IN, 0,
1748  PTC5_FN, PTC5_OUT, PTC5_IN, 0,
1749  PTC4_FN, PTC4_OUT, PTC4_IN, 0,
1750  PTC3_FN, PTC3_OUT, PTC3_IN, 0,
1751  PTC2_FN, PTC2_OUT, PTC2_IN, 0,
1752  PTC1_FN, PTC1_OUT, PTC1_IN, 0,
1753  PTC0_FN, PTC0_OUT, PTC0_IN, 0 }
1754  },
1755  { PINMUX_CFG_REG("PDCR", 0xffec0006, 16, 2) {
1764  },
1765  { PINMUX_CFG_REG("PECR", 0xffec0008, 16, 2) {
1774  },
1775  { PINMUX_CFG_REG("PFCR", 0xffec000a, 16, 2) {
1784  },
1785  { PINMUX_CFG_REG("PGCR", 0xffec000c, 16, 2) {
1788  PTG5_FN, PTG5_OUT, PTG5_IN, 0,
1790  PTG3_FN, PTG3_OUT, PTG3_IN, 0,
1791  PTG2_FN, PTG2_OUT, PTG2_IN, 0,
1792  PTG1_FN, PTG1_OUT, PTG1_IN, 0,
1793  PTG0_FN, PTG0_OUT, PTG0_IN, 0 }
1794  },
1795  { PINMUX_CFG_REG("PHCR", 0xffec000e, 16, 2) {
1804  },
1805  { PINMUX_CFG_REG("PICR", 0xffec0010, 16, 2) {
1808  PTI5_FN, PTI5_OUT, PTI5_IN, 0,
1814  },
1815  { PINMUX_CFG_REG("PJCR", 0xffec0012, 16, 2) {
1816  0, 0, 0, 0, /* reserved: always set 1 */
1824  },
1825  { PINMUX_CFG_REG("PKCR", 0xffec0014, 16, 2) {
1834  },
1835  { PINMUX_CFG_REG("PLCR", 0xffec0016, 16, 2) {
1836  0, 0, 0, 0, /* reserved: always set 1 */
1844  },
1845  { PINMUX_CFG_REG("PMCR", 0xffec0018, 16, 2) {
1850  PTM3_FN, PTM3_OUT, PTM3_IN, 0,
1851  PTM2_FN, PTM2_OUT, PTM2_IN, 0,
1852  PTM1_FN, PTM1_OUT, PTM1_IN, 0,
1853  PTM0_FN, PTM0_OUT, PTM0_IN, 0 }
1854  },
1855  { PINMUX_CFG_REG("PNCR", 0xffec001a, 16, 2) {
1856  0, 0, 0, 0, /* reserved: always set 1 */
1857  PTN6_FN, PTN6_OUT, PTN6_IN, 0,
1858  PTN5_FN, PTN5_OUT, PTN5_IN, 0,
1864  },
1865  { PINMUX_CFG_REG("POCR", 0xffec001c, 16, 2) {
1874  },
1875 #if 0 /* FIXME: Remove it? */
1876  { PINMUX_CFG_REG("PPCR", 0xffec001e, 16, 2) {
1877  0, 0, 0, 0, /* reserved: always set 1 */
1878  PTP6_FN, PTP6_OUT, PTP6_IN, 0,
1879  PTP5_FN, PTP5_OUT, PTP5_IN, 0,
1880  PTP4_FN, PTP4_OUT, PTP4_IN, 0,
1881  PTP3_FN, PTP3_OUT, PTP3_IN, 0,
1882  PTP2_FN, PTP2_OUT, PTP2_IN, 0,
1883  PTP1_FN, PTP1_OUT, PTP1_IN, 0,
1884  PTP0_FN, PTP0_OUT, PTP0_IN, 0 }
1885  },
1886 #endif
1887  { PINMUX_CFG_REG("PQCR", 0xffec0020, 16, 2) {
1888  0, 0, 0, 0, /* reserved: always set 1 */
1889  PTQ6_FN, PTQ6_OUT, PTQ6_IN, 0,
1890  PTQ5_FN, PTQ5_OUT, PTQ5_IN, 0,
1891  PTQ4_FN, PTQ4_OUT, PTQ4_IN, 0,
1892  PTQ3_FN, PTQ3_OUT, PTQ3_IN, 0,
1893  PTQ2_FN, PTQ2_OUT, PTQ2_IN, 0,
1894  PTQ1_FN, PTQ1_OUT, PTQ1_IN, 0,
1895  PTQ0_FN, PTQ0_OUT, PTQ0_IN, 0 }
1896  },
1897  { PINMUX_CFG_REG("PRCR", 0xffec0022, 16, 2) {
1898  PTR7_FN, PTR7_OUT, PTR7_IN, 0,
1899  PTR6_FN, PTR6_OUT, PTR6_IN, 0,
1900  PTR5_FN, PTR5_OUT, PTR5_IN, 0,
1901  PTR4_FN, PTR4_OUT, PTR4_IN, 0,
1902  PTR3_FN, PTR3_OUT, PTR3_IN, 0,
1903  PTR2_FN, PTR2_OUT, PTR2_IN, 0,
1904  PTR1_FN, PTR1_OUT, PTR1_IN, 0,
1905  PTR0_FN, PTR0_OUT, PTR0_IN, 0 }
1906  },
1907  { PINMUX_CFG_REG("PSCR", 0xffec0024, 16, 2) {
1908  PTS7_FN, PTS7_OUT, PTS7_IN, 0,
1909  PTS6_FN, PTS6_OUT, PTS6_IN, 0,
1910  PTS5_FN, PTS5_OUT, PTS5_IN, 0,
1911  PTS4_FN, PTS4_OUT, PTS4_IN, 0,
1912  PTS3_FN, PTS3_OUT, PTS3_IN, 0,
1913  PTS2_FN, PTS2_OUT, PTS2_IN, 0,
1914  PTS1_FN, PTS1_OUT, PTS1_IN, 0,
1915  PTS0_FN, PTS0_OUT, PTS0_IN, 0 }
1916  },
1917  { PINMUX_CFG_REG("PTCR", 0xffec0026, 16, 2) {
1926  },
1927  { PINMUX_CFG_REG("PUCR", 0xffec0028, 16, 2) {
1936  },
1937  { PINMUX_CFG_REG("PVCR", 0xffec002a, 16, 2) {
1944  PTV1_FN, PTV1_OUT, PTV1_IN, 0,
1945  PTV0_FN, PTV0_OUT, PTV0_IN, 0 }
1946  },
1947  { PINMUX_CFG_REG("PWCR", 0xffec002c, 16, 2) {
1948  PTW7_FN, PTW7_OUT, PTW7_IN, 0,
1949  PTW6_FN, PTW6_OUT, PTW6_IN, 0,
1950  PTW5_FN, PTW5_OUT, PTW5_IN, 0,
1951  PTW4_FN, PTW4_OUT, PTW4_IN, 0,
1952  PTW3_FN, PTW3_OUT, PTW3_IN, 0,
1953  PTW2_FN, PTW2_OUT, PTW2_IN, 0,
1956  },
1957  { PINMUX_CFG_REG("PXCR", 0xffec002e, 16, 2) {
1966  },
1967  { PINMUX_CFG_REG("PYCR", 0xffec0030, 16, 2) {
1976  },
1977  { PINMUX_CFG_REG("PZCR", 0xffec0032, 16, 2) {
1978  PTZ7_FN, PTZ7_OUT, PTZ7_IN, 0,
1979  PTZ6_FN, PTZ6_OUT, PTZ6_IN, 0,
1980  PTZ5_FN, PTZ5_OUT, PTZ5_IN, 0,
1981  PTZ4_FN, PTZ4_OUT, PTZ4_IN, 0,
1982  PTZ3_FN, PTZ3_OUT, PTZ3_IN, 0,
1983  PTZ2_FN, PTZ2_OUT, PTZ2_IN, 0,
1984  PTZ1_FN, PTZ1_OUT, PTZ1_IN, 0,
1985  PTZ0_FN, PTZ0_OUT, PTZ0_IN, 0 }
1986  },
1987 
1988  { PINMUX_CFG_REG("PSEL0", 0xffec0070, 16, 1) {
2003  0, 0,
2004  0, 0, }
2005  },
2006  { PINMUX_CFG_REG("PSEL1", 0xffec0072, 16, 1) {
2007  0, 0,
2008  0, 0,
2009  0, 0,
2010  0, 0,
2011  0, 0,
2015  0, 0,
2016  0, 0,
2017  0, 0,
2018  0, 0,
2019  0, 0,
2021  0, 0,
2022  0, 0, }
2023  },
2024  { PINMUX_CFG_REG("PSEL2", 0xffec0074, 16, 1) {
2025  0, 0,
2026  0, 0,
2029  0, 0,
2030  0, 0,
2031  0, 0,
2032  0, 0,
2037  0, 0,
2039  0, 0,
2040  0, 0, }
2041  },
2042  { PINMUX_CFG_REG("PSEL3", 0xffec0076, 16, 1) {
2052  0, 0,
2053  0, 0,
2054  0, 0,
2055  0, 0,
2058  0, 0, }
2059  },
2060 
2061  { PINMUX_CFG_REG("PSEL4", 0xffec0078, 16, 1) {
2062  0, 0,
2066  0, 0,
2070  0, 0,
2071  0, 0,
2072  0, 0,
2077  PS4_0_FN1, PS4_0_FN2, }
2078  },
2079  { PINMUX_CFG_REG("PSEL5", 0xffec007a, 16, 1) {
2080  0, 0,
2081  0, 0,
2082  0, 0,
2083  0, 0,
2094  0, 0,
2095  0, 0, }
2096  },
2097  { PINMUX_CFG_REG("PSEL6", 0xffec007c, 16, 1) {
2113  PS6_0_FN1, PS6_0_FN2, }
2114  },
2115  { PINMUX_CFG_REG("PSEL7", 0xffec0082, 16, 1) {
2127  0, 0,
2128  0, 0,
2129  0, 0,
2130  0, 0,
2131  0, 0, }
2132  },
2133  { PINMUX_CFG_REG("PSEL8", 0xffec0084, 16, 1) {
2142  0, 0,
2143  0, 0,
2144  0, 0,
2145  0, 0,
2146  0, 0,
2147  0, 0,
2148  0, 0,
2149  0, 0, }
2150  },
2151  {}
2152 };
2153 
2154 static struct pinmux_data_reg pinmux_data_regs[] = {
2155  { PINMUX_DATA_REG("PADR", 0xffec0034, 8) {
2158  },
2159  { PINMUX_DATA_REG("PBDR", 0xffec0036, 8) {
2162  },
2163  { PINMUX_DATA_REG("PCDR", 0xffec0038, 8) {
2166  },
2167  { PINMUX_DATA_REG("PDDR", 0xffec003a, 8) {
2170  },
2171  { PINMUX_DATA_REG("PEDR", 0xffec003c, 8) {
2174  },
2175  { PINMUX_DATA_REG("PFDR", 0xffec003e, 8) {
2178  },
2179  { PINMUX_DATA_REG("PGDR", 0xffec0040, 8) {
2182  },
2183  { PINMUX_DATA_REG("PHDR", 0xffec0042, 8) {
2186  },
2187  { PINMUX_DATA_REG("PIDR", 0xffec0044, 8) {
2190  },
2191  { PINMUX_DATA_REG("PJDR", 0xffec0046, 8) {
2194  },
2195  { PINMUX_DATA_REG("PKDR", 0xffec0048, 8) {
2198  },
2199  { PINMUX_DATA_REG("PLDR", 0xffec004a, 8) {
2202  },
2203  { PINMUX_DATA_REG("PMDR", 0xffec004c, 8) {
2206  },
2207  { PINMUX_DATA_REG("PNDR", 0xffec004e, 8) {
2210  },
2211  { PINMUX_DATA_REG("PODR", 0xffec0050, 8) {
2214  },
2215  { PINMUX_DATA_REG("PPDR", 0xffec0052, 8) {
2218  },
2219  { PINMUX_DATA_REG("PQDR", 0xffec0054, 8) {
2222  },
2223  { PINMUX_DATA_REG("PRDR", 0xffec0056, 8) {
2226  },
2227  { PINMUX_DATA_REG("PSDR", 0xffec0058, 8) {
2230  },
2231  { PINMUX_DATA_REG("PTDR", 0xffec005a, 8) {
2234  },
2235  { PINMUX_DATA_REG("PUDR", 0xffec005c, 8) {
2238  },
2239  { PINMUX_DATA_REG("PVDR", 0xffec005e, 8) {
2242  },
2243  { PINMUX_DATA_REG("PWDR", 0xffec0060, 8) {
2246  },
2247  { PINMUX_DATA_REG("PXDR", 0xffec0062, 8) {
2250  },
2251  { PINMUX_DATA_REG("PYDR", 0xffec0064, 8) {
2254  },
2255  { PINMUX_DATA_REG("PZDR", 0xffec0066, 8) {
2258  },
2259  { },
2260 };
2261 
2262 static struct pinmux_info sh7757_pinmux_info = {
2263  .name = "sh7757_pfc",
2264  .reserved_id = PINMUX_RESERVED,
2265  .data = { PINMUX_DATA_BEGIN, PINMUX_DATA_END },
2266  .input = { PINMUX_INPUT_BEGIN, PINMUX_INPUT_END },
2268  .output = { PINMUX_OUTPUT_BEGIN, PINMUX_OUTPUT_END },
2269  .mark = { PINMUX_MARK_BEGIN, PINMUX_MARK_END },
2270  .function = { PINMUX_FUNCTION_BEGIN, PINMUX_FUNCTION_END },
2271 
2272  .first_gpio = GPIO_PTA0,
2273  .last_gpio = GPIO_FN_ON_DQ0,
2274 
2275  .gpios = pinmux_gpios,
2276  .cfg_regs = pinmux_config_regs,
2277  .data_regs = pinmux_data_regs,
2278 
2279  .gpio_data = pinmux_data,
2280  .gpio_data_size = ARRAY_SIZE(pinmux_data),
2281 };
2282 
2283 static int __init plat_pinmux_setup(void)
2284 {
2285  return register_pinmux(&sh7757_pinmux_info);
2286 }
2287 arch_initcall(plat_pinmux_setup);