0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/stringify.h>
0011 #include <linux/pinctrl/pinctrl.h>
0012 #include <linux/pinctrl/pinmux.h>
0013 #include <linux/pinctrl/machine.h>
0014 #include <linux/platform_device.h>
0015 #include <linux/module.h>
0016 #include <linux/mutex.h>
0017 #include <linux/err.h>
0018 #include <linux/io.h>
0019 #include <linux/of.h>
0020 #include <linux/slab.h>
0021
0022 #include "pinctrl-utils.h"
0023
0024 #define TB10X_PORT1 (0)
0025 #define TB10X_PORT2 (16)
0026 #define TB10X_PORT3 (32)
0027 #define TB10X_PORT4 (48)
0028 #define TB10X_PORT5 (128)
0029 #define TB10X_PORT6 (64)
0030 #define TB10X_PORT7 (80)
0031 #define TB10X_PORT8 (96)
0032 #define TB10X_PORT9 (112)
0033 #define TB10X_GPIOS (256)
0034
0035 #define PCFG_PORT_BITWIDTH (2)
0036 #define PCFG_PORT_MASK(PORT) \
0037 (((1 << PCFG_PORT_BITWIDTH) - 1) << (PCFG_PORT_BITWIDTH * (PORT)))
0038
0039 static const struct pinctrl_pin_desc tb10x_pins[] = {
0040
0041 PINCTRL_PIN(TB10X_PORT1 + 0, "MICLK_S0"),
0042 PINCTRL_PIN(TB10X_PORT1 + 1, "MISTRT_S0"),
0043 PINCTRL_PIN(TB10X_PORT1 + 2, "MIVAL_S0"),
0044 PINCTRL_PIN(TB10X_PORT1 + 3, "MDI_S0"),
0045 PINCTRL_PIN(TB10X_PORT1 + 4, "GPIOA0"),
0046 PINCTRL_PIN(TB10X_PORT1 + 5, "GPIOA1"),
0047 PINCTRL_PIN(TB10X_PORT1 + 6, "GPIOA2"),
0048 PINCTRL_PIN(TB10X_PORT1 + 7, "MDI_S1"),
0049 PINCTRL_PIN(TB10X_PORT1 + 8, "MIVAL_S1"),
0050 PINCTRL_PIN(TB10X_PORT1 + 9, "MISTRT_S1"),
0051 PINCTRL_PIN(TB10X_PORT1 + 10, "MICLK_S1"),
0052
0053 PINCTRL_PIN(TB10X_PORT2 + 0, "MICLK_S2"),
0054 PINCTRL_PIN(TB10X_PORT2 + 1, "MISTRT_S2"),
0055 PINCTRL_PIN(TB10X_PORT2 + 2, "MIVAL_S2"),
0056 PINCTRL_PIN(TB10X_PORT2 + 3, "MDI_S2"),
0057 PINCTRL_PIN(TB10X_PORT2 + 4, "GPIOC0"),
0058 PINCTRL_PIN(TB10X_PORT2 + 5, "GPIOC1"),
0059 PINCTRL_PIN(TB10X_PORT2 + 6, "GPIOC2"),
0060 PINCTRL_PIN(TB10X_PORT2 + 7, "MDI_S3"),
0061 PINCTRL_PIN(TB10X_PORT2 + 8, "MIVAL_S3"),
0062 PINCTRL_PIN(TB10X_PORT2 + 9, "MISTRT_S3"),
0063 PINCTRL_PIN(TB10X_PORT2 + 10, "MICLK_S3"),
0064
0065 PINCTRL_PIN(TB10X_PORT3 + 0, "MICLK_S4"),
0066 PINCTRL_PIN(TB10X_PORT3 + 1, "MISTRT_S4"),
0067 PINCTRL_PIN(TB10X_PORT3 + 2, "MIVAL_S4"),
0068 PINCTRL_PIN(TB10X_PORT3 + 3, "MDI_S4"),
0069 PINCTRL_PIN(TB10X_PORT3 + 4, "GPIOE0"),
0070 PINCTRL_PIN(TB10X_PORT3 + 5, "GPIOE1"),
0071 PINCTRL_PIN(TB10X_PORT3 + 6, "GPIOE2"),
0072 PINCTRL_PIN(TB10X_PORT3 + 7, "MDI_S5"),
0073 PINCTRL_PIN(TB10X_PORT3 + 8, "MIVAL_S5"),
0074 PINCTRL_PIN(TB10X_PORT3 + 9, "MISTRT_S5"),
0075 PINCTRL_PIN(TB10X_PORT3 + 10, "MICLK_S5"),
0076
0077 PINCTRL_PIN(TB10X_PORT4 + 0, "MICLK_S6"),
0078 PINCTRL_PIN(TB10X_PORT4 + 1, "MISTRT_S6"),
0079 PINCTRL_PIN(TB10X_PORT4 + 2, "MIVAL_S6"),
0080 PINCTRL_PIN(TB10X_PORT4 + 3, "MDI_S6"),
0081 PINCTRL_PIN(TB10X_PORT4 + 4, "GPIOG0"),
0082 PINCTRL_PIN(TB10X_PORT4 + 5, "GPIOG1"),
0083 PINCTRL_PIN(TB10X_PORT4 + 6, "GPIOG2"),
0084 PINCTRL_PIN(TB10X_PORT4 + 7, "MDI_S7"),
0085 PINCTRL_PIN(TB10X_PORT4 + 8, "MIVAL_S7"),
0086 PINCTRL_PIN(TB10X_PORT4 + 9, "MISTRT_S7"),
0087 PINCTRL_PIN(TB10X_PORT4 + 10, "MICLK_S7"),
0088
0089 PINCTRL_PIN(TB10X_PORT5 + 0, "PC_CE1N"),
0090 PINCTRL_PIN(TB10X_PORT5 + 1, "PC_CE2N"),
0091 PINCTRL_PIN(TB10X_PORT5 + 2, "PC_REGN"),
0092 PINCTRL_PIN(TB10X_PORT5 + 3, "PC_INPACKN"),
0093 PINCTRL_PIN(TB10X_PORT5 + 4, "PC_OEN"),
0094 PINCTRL_PIN(TB10X_PORT5 + 5, "PC_WEN"),
0095 PINCTRL_PIN(TB10X_PORT5 + 6, "PC_IORDN"),
0096 PINCTRL_PIN(TB10X_PORT5 + 7, "PC_IOWRN"),
0097 PINCTRL_PIN(TB10X_PORT5 + 8, "PC_RDYIRQN"),
0098 PINCTRL_PIN(TB10X_PORT5 + 9, "PC_WAITN"),
0099 PINCTRL_PIN(TB10X_PORT5 + 10, "PC_A0"),
0100 PINCTRL_PIN(TB10X_PORT5 + 11, "PC_A1"),
0101 PINCTRL_PIN(TB10X_PORT5 + 12, "PC_A2"),
0102 PINCTRL_PIN(TB10X_PORT5 + 13, "PC_A3"),
0103 PINCTRL_PIN(TB10X_PORT5 + 14, "PC_A4"),
0104 PINCTRL_PIN(TB10X_PORT5 + 15, "PC_A5"),
0105 PINCTRL_PIN(TB10X_PORT5 + 16, "PC_A6"),
0106 PINCTRL_PIN(TB10X_PORT5 + 17, "PC_A7"),
0107 PINCTRL_PIN(TB10X_PORT5 + 18, "PC_A8"),
0108 PINCTRL_PIN(TB10X_PORT5 + 19, "PC_A9"),
0109 PINCTRL_PIN(TB10X_PORT5 + 20, "PC_A10"),
0110 PINCTRL_PIN(TB10X_PORT5 + 21, "PC_A11"),
0111 PINCTRL_PIN(TB10X_PORT5 + 22, "PC_A12"),
0112 PINCTRL_PIN(TB10X_PORT5 + 23, "PC_A13"),
0113 PINCTRL_PIN(TB10X_PORT5 + 24, "PC_A14"),
0114 PINCTRL_PIN(TB10X_PORT5 + 25, "PC_D0"),
0115 PINCTRL_PIN(TB10X_PORT5 + 26, "PC_D1"),
0116 PINCTRL_PIN(TB10X_PORT5 + 27, "PC_D2"),
0117 PINCTRL_PIN(TB10X_PORT5 + 28, "PC_D3"),
0118 PINCTRL_PIN(TB10X_PORT5 + 29, "PC_D4"),
0119 PINCTRL_PIN(TB10X_PORT5 + 30, "PC_D5"),
0120 PINCTRL_PIN(TB10X_PORT5 + 31, "PC_D6"),
0121 PINCTRL_PIN(TB10X_PORT5 + 32, "PC_D7"),
0122 PINCTRL_PIN(TB10X_PORT5 + 33, "PC_MOSTRT"),
0123 PINCTRL_PIN(TB10X_PORT5 + 34, "PC_MOVAL"),
0124 PINCTRL_PIN(TB10X_PORT5 + 35, "PC_MDO0"),
0125 PINCTRL_PIN(TB10X_PORT5 + 36, "PC_MDO1"),
0126 PINCTRL_PIN(TB10X_PORT5 + 37, "PC_MDO2"),
0127 PINCTRL_PIN(TB10X_PORT5 + 38, "PC_MDO3"),
0128 PINCTRL_PIN(TB10X_PORT5 + 39, "PC_MDO4"),
0129 PINCTRL_PIN(TB10X_PORT5 + 40, "PC_MDO5"),
0130 PINCTRL_PIN(TB10X_PORT5 + 41, "PC_MDO6"),
0131 PINCTRL_PIN(TB10X_PORT5 + 42, "PC_MDO7"),
0132 PINCTRL_PIN(TB10X_PORT5 + 43, "PC_MISTRT"),
0133 PINCTRL_PIN(TB10X_PORT5 + 44, "PC_MIVAL"),
0134 PINCTRL_PIN(TB10X_PORT5 + 45, "PC_MDI0"),
0135 PINCTRL_PIN(TB10X_PORT5 + 46, "PC_MDI1"),
0136 PINCTRL_PIN(TB10X_PORT5 + 47, "PC_MDI2"),
0137 PINCTRL_PIN(TB10X_PORT5 + 48, "PC_MDI3"),
0138 PINCTRL_PIN(TB10X_PORT5 + 49, "PC_MDI4"),
0139 PINCTRL_PIN(TB10X_PORT5 + 50, "PC_MDI5"),
0140 PINCTRL_PIN(TB10X_PORT5 + 51, "PC_MDI6"),
0141 PINCTRL_PIN(TB10X_PORT5 + 52, "PC_MDI7"),
0142 PINCTRL_PIN(TB10X_PORT5 + 53, "PC_MICLK"),
0143
0144 PINCTRL_PIN(TB10X_PORT6 + 0, "T_MOSTRT_S0"),
0145 PINCTRL_PIN(TB10X_PORT6 + 1, "T_MOVAL_S0"),
0146 PINCTRL_PIN(TB10X_PORT6 + 2, "T_MDO_S0"),
0147 PINCTRL_PIN(TB10X_PORT6 + 3, "T_MOSTRT_S1"),
0148 PINCTRL_PIN(TB10X_PORT6 + 4, "T_MOVAL_S1"),
0149 PINCTRL_PIN(TB10X_PORT6 + 5, "T_MDO_S1"),
0150 PINCTRL_PIN(TB10X_PORT6 + 6, "T_MOSTRT_S2"),
0151 PINCTRL_PIN(TB10X_PORT6 + 7, "T_MOVAL_S2"),
0152 PINCTRL_PIN(TB10X_PORT6 + 8, "T_MDO_S2"),
0153 PINCTRL_PIN(TB10X_PORT6 + 9, "T_MOSTRT_S3"),
0154
0155 PINCTRL_PIN(TB10X_PORT7 + 0, "UART0_TXD"),
0156 PINCTRL_PIN(TB10X_PORT7 + 1, "UART0_RXD"),
0157 PINCTRL_PIN(TB10X_PORT7 + 2, "UART0_CTS"),
0158 PINCTRL_PIN(TB10X_PORT7 + 3, "UART0_RTS"),
0159 PINCTRL_PIN(TB10X_PORT7 + 4, "UART1_TXD"),
0160 PINCTRL_PIN(TB10X_PORT7 + 5, "UART1_RXD"),
0161 PINCTRL_PIN(TB10X_PORT7 + 6, "UART1_CTS"),
0162 PINCTRL_PIN(TB10X_PORT7 + 7, "UART1_RTS"),
0163
0164 PINCTRL_PIN(TB10X_PORT8 + 0, "SPI3_CLK"),
0165 PINCTRL_PIN(TB10X_PORT8 + 1, "SPI3_MISO"),
0166 PINCTRL_PIN(TB10X_PORT8 + 2, "SPI3_MOSI"),
0167 PINCTRL_PIN(TB10X_PORT8 + 3, "SPI3_SSN"),
0168
0169 PINCTRL_PIN(TB10X_PORT9 + 0, "SPI1_CLK"),
0170 PINCTRL_PIN(TB10X_PORT9 + 1, "SPI1_MISO"),
0171 PINCTRL_PIN(TB10X_PORT9 + 2, "SPI1_MOSI"),
0172 PINCTRL_PIN(TB10X_PORT9 + 3, "SPI1_SSN0"),
0173 PINCTRL_PIN(TB10X_PORT9 + 4, "SPI1_SSN1"),
0174
0175 PINCTRL_PIN(TB10X_GPIOS + 0, "GPIOB0"),
0176 PINCTRL_PIN(TB10X_GPIOS + 1, "GPIOB1"),
0177
0178 PINCTRL_PIN(TB10X_GPIOS + 2, "GPIOD0"),
0179 PINCTRL_PIN(TB10X_GPIOS + 3, "GPIOD1"),
0180
0181 PINCTRL_PIN(TB10X_GPIOS + 4, "GPIOF0"),
0182 PINCTRL_PIN(TB10X_GPIOS + 5, "GPIOF1"),
0183
0184 PINCTRL_PIN(TB10X_GPIOS + 6, "GPIOH0"),
0185 PINCTRL_PIN(TB10X_GPIOS + 7, "GPIOH1"),
0186
0187 PINCTRL_PIN(TB10X_GPIOS + 8, "GPIOI0"),
0188 PINCTRL_PIN(TB10X_GPIOS + 9, "GPIOI1"),
0189 PINCTRL_PIN(TB10X_GPIOS + 10, "GPIOI2"),
0190 PINCTRL_PIN(TB10X_GPIOS + 11, "GPIOI3"),
0191 PINCTRL_PIN(TB10X_GPIOS + 12, "GPIOI4"),
0192 PINCTRL_PIN(TB10X_GPIOS + 13, "GPIOI5"),
0193 PINCTRL_PIN(TB10X_GPIOS + 14, "GPIOI6"),
0194 PINCTRL_PIN(TB10X_GPIOS + 15, "GPIOI7"),
0195 PINCTRL_PIN(TB10X_GPIOS + 16, "GPIOI8"),
0196 PINCTRL_PIN(TB10X_GPIOS + 17, "GPIOI9"),
0197 PINCTRL_PIN(TB10X_GPIOS + 18, "GPIOI10"),
0198 PINCTRL_PIN(TB10X_GPIOS + 19, "GPIOI11"),
0199
0200 PINCTRL_PIN(TB10X_GPIOS + 20, "GPION0"),
0201 PINCTRL_PIN(TB10X_GPIOS + 21, "GPION1"),
0202 PINCTRL_PIN(TB10X_GPIOS + 22, "GPION2"),
0203 PINCTRL_PIN(TB10X_GPIOS + 23, "GPION3"),
0204 #define MAX_PIN (TB10X_GPIOS + 24)
0205 PINCTRL_PIN(MAX_PIN, "GPION4"),
0206 };
0207
0208
0209
0210 static const unsigned mis0_pins[] = { TB10X_PORT1 + 0, TB10X_PORT1 + 1,
0211 TB10X_PORT1 + 2, TB10X_PORT1 + 3};
0212 static const unsigned gpioa_pins[] = { TB10X_PORT1 + 4, TB10X_PORT1 + 5,
0213 TB10X_PORT1 + 6};
0214 static const unsigned mis1_pins[] = { TB10X_PORT1 + 7, TB10X_PORT1 + 8,
0215 TB10X_PORT1 + 9, TB10X_PORT1 + 10};
0216 static const unsigned mip1_pins[] = { TB10X_PORT1 + 0, TB10X_PORT1 + 1,
0217 TB10X_PORT1 + 2, TB10X_PORT1 + 3,
0218 TB10X_PORT1 + 4, TB10X_PORT1 + 5,
0219 TB10X_PORT1 + 6, TB10X_PORT1 + 7,
0220 TB10X_PORT1 + 8, TB10X_PORT1 + 9,
0221 TB10X_PORT1 + 10};
0222
0223
0224 static const unsigned mis2_pins[] = { TB10X_PORT2 + 0, TB10X_PORT2 + 1,
0225 TB10X_PORT2 + 2, TB10X_PORT2 + 3};
0226 static const unsigned gpioc_pins[] = { TB10X_PORT2 + 4, TB10X_PORT2 + 5,
0227 TB10X_PORT2 + 6};
0228 static const unsigned mis3_pins[] = { TB10X_PORT2 + 7, TB10X_PORT2 + 8,
0229 TB10X_PORT2 + 9, TB10X_PORT2 + 10};
0230 static const unsigned mip3_pins[] = { TB10X_PORT2 + 0, TB10X_PORT2 + 1,
0231 TB10X_PORT2 + 2, TB10X_PORT2 + 3,
0232 TB10X_PORT2 + 4, TB10X_PORT2 + 5,
0233 TB10X_PORT2 + 6, TB10X_PORT2 + 7,
0234 TB10X_PORT2 + 8, TB10X_PORT2 + 9,
0235 TB10X_PORT2 + 10};
0236
0237
0238 static const unsigned mis4_pins[] = { TB10X_PORT3 + 0, TB10X_PORT3 + 1,
0239 TB10X_PORT3 + 2, TB10X_PORT3 + 3};
0240 static const unsigned gpioe_pins[] = { TB10X_PORT3 + 4, TB10X_PORT3 + 5,
0241 TB10X_PORT3 + 6};
0242 static const unsigned mis5_pins[] = { TB10X_PORT3 + 7, TB10X_PORT3 + 8,
0243 TB10X_PORT3 + 9, TB10X_PORT3 + 10};
0244 static const unsigned mip5_pins[] = { TB10X_PORT3 + 0, TB10X_PORT3 + 1,
0245 TB10X_PORT3 + 2, TB10X_PORT3 + 3,
0246 TB10X_PORT3 + 4, TB10X_PORT3 + 5,
0247 TB10X_PORT3 + 6, TB10X_PORT3 + 7,
0248 TB10X_PORT3 + 8, TB10X_PORT3 + 9,
0249 TB10X_PORT3 + 10};
0250
0251
0252 static const unsigned mis6_pins[] = { TB10X_PORT4 + 0, TB10X_PORT4 + 1,
0253 TB10X_PORT4 + 2, TB10X_PORT4 + 3};
0254 static const unsigned gpiog_pins[] = { TB10X_PORT4 + 4, TB10X_PORT4 + 5,
0255 TB10X_PORT4 + 6};
0256 static const unsigned mis7_pins[] = { TB10X_PORT4 + 7, TB10X_PORT4 + 8,
0257 TB10X_PORT4 + 9, TB10X_PORT4 + 10};
0258 static const unsigned mip7_pins[] = { TB10X_PORT4 + 0, TB10X_PORT4 + 1,
0259 TB10X_PORT4 + 2, TB10X_PORT4 + 3,
0260 TB10X_PORT4 + 4, TB10X_PORT4 + 5,
0261 TB10X_PORT4 + 6, TB10X_PORT4 + 7,
0262 TB10X_PORT4 + 8, TB10X_PORT4 + 9,
0263 TB10X_PORT4 + 10};
0264
0265
0266 static const unsigned mop_pins[] = { TB10X_PORT6 + 0, TB10X_PORT6 + 1,
0267 TB10X_PORT6 + 2, TB10X_PORT6 + 3,
0268 TB10X_PORT6 + 4, TB10X_PORT6 + 5,
0269 TB10X_PORT6 + 6, TB10X_PORT6 + 7,
0270 TB10X_PORT6 + 8, TB10X_PORT6 + 9};
0271 static const unsigned mos0_pins[] = { TB10X_PORT6 + 0, TB10X_PORT6 + 1,
0272 TB10X_PORT6 + 2};
0273 static const unsigned mos1_pins[] = { TB10X_PORT6 + 3, TB10X_PORT6 + 4,
0274 TB10X_PORT6 + 5};
0275 static const unsigned mos2_pins[] = { TB10X_PORT6 + 6, TB10X_PORT6 + 7,
0276 TB10X_PORT6 + 8};
0277 static const unsigned mos3_pins[] = { TB10X_PORT6 + 9};
0278
0279
0280 static const unsigned uart0_pins[] = { TB10X_PORT7 + 0, TB10X_PORT7 + 1,
0281 TB10X_PORT7 + 2, TB10X_PORT7 + 3};
0282 static const unsigned uart1_pins[] = { TB10X_PORT7 + 4, TB10X_PORT7 + 5,
0283 TB10X_PORT7 + 6, TB10X_PORT7 + 7};
0284 static const unsigned gpiol_pins[] = { TB10X_PORT7 + 0, TB10X_PORT7 + 1,
0285 TB10X_PORT7 + 2, TB10X_PORT7 + 3};
0286 static const unsigned gpiom_pins[] = { TB10X_PORT7 + 4, TB10X_PORT7 + 5,
0287 TB10X_PORT7 + 6, TB10X_PORT7 + 7};
0288
0289
0290 static const unsigned spi3_pins[] = { TB10X_PORT8 + 0, TB10X_PORT8 + 1,
0291 TB10X_PORT8 + 2, TB10X_PORT8 + 3};
0292 static const unsigned jtag_pins[] = { TB10X_PORT8 + 0, TB10X_PORT8 + 1,
0293 TB10X_PORT8 + 2, TB10X_PORT8 + 3};
0294
0295
0296 static const unsigned spi1_pins[] = { TB10X_PORT9 + 0, TB10X_PORT9 + 1,
0297 TB10X_PORT9 + 2, TB10X_PORT9 + 3,
0298 TB10X_PORT9 + 4};
0299 static const unsigned gpion_pins[] = { TB10X_PORT9 + 0, TB10X_PORT9 + 1,
0300 TB10X_PORT9 + 2, TB10X_PORT9 + 3,
0301 TB10X_PORT9 + 4};
0302
0303
0304 static const unsigned gpioj_pins[] = { TB10X_PORT5 + 0, TB10X_PORT5 + 1,
0305 TB10X_PORT5 + 2, TB10X_PORT5 + 3,
0306 TB10X_PORT5 + 4, TB10X_PORT5 + 5,
0307 TB10X_PORT5 + 6, TB10X_PORT5 + 7,
0308 TB10X_PORT5 + 8, TB10X_PORT5 + 9,
0309 TB10X_PORT5 + 10, TB10X_PORT5 + 11,
0310 TB10X_PORT5 + 12, TB10X_PORT5 + 13,
0311 TB10X_PORT5 + 14, TB10X_PORT5 + 15,
0312 TB10X_PORT5 + 16, TB10X_PORT5 + 17,
0313 TB10X_PORT5 + 18, TB10X_PORT5 + 19,
0314 TB10X_PORT5 + 20, TB10X_PORT5 + 21,
0315 TB10X_PORT5 + 22, TB10X_PORT5 + 23,
0316 TB10X_PORT5 + 24, TB10X_PORT5 + 25,
0317 TB10X_PORT5 + 26, TB10X_PORT5 + 27,
0318 TB10X_PORT5 + 28, TB10X_PORT5 + 29,
0319 TB10X_PORT5 + 30, TB10X_PORT5 + 31};
0320 static const unsigned gpiok_pins[] = { TB10X_PORT5 + 32, TB10X_PORT5 + 33,
0321 TB10X_PORT5 + 34, TB10X_PORT5 + 35,
0322 TB10X_PORT5 + 36, TB10X_PORT5 + 37,
0323 TB10X_PORT5 + 38, TB10X_PORT5 + 39,
0324 TB10X_PORT5 + 40, TB10X_PORT5 + 41,
0325 TB10X_PORT5 + 42, TB10X_PORT5 + 43,
0326 TB10X_PORT5 + 44, TB10X_PORT5 + 45,
0327 TB10X_PORT5 + 46, TB10X_PORT5 + 47,
0328 TB10X_PORT5 + 48, TB10X_PORT5 + 49,
0329 TB10X_PORT5 + 50, TB10X_PORT5 + 51,
0330 TB10X_PORT5 + 52, TB10X_PORT5 + 53};
0331 static const unsigned ciplus_pins[] = { TB10X_PORT5 + 0, TB10X_PORT5 + 1,
0332 TB10X_PORT5 + 2, TB10X_PORT5 + 3,
0333 TB10X_PORT5 + 4, TB10X_PORT5 + 5,
0334 TB10X_PORT5 + 6, TB10X_PORT5 + 7,
0335 TB10X_PORT5 + 8, TB10X_PORT5 + 9,
0336 TB10X_PORT5 + 10, TB10X_PORT5 + 11,
0337 TB10X_PORT5 + 12, TB10X_PORT5 + 13,
0338 TB10X_PORT5 + 14, TB10X_PORT5 + 15,
0339 TB10X_PORT5 + 16, TB10X_PORT5 + 17,
0340 TB10X_PORT5 + 18, TB10X_PORT5 + 19,
0341 TB10X_PORT5 + 20, TB10X_PORT5 + 21,
0342 TB10X_PORT5 + 22, TB10X_PORT5 + 23,
0343 TB10X_PORT5 + 24, TB10X_PORT5 + 25,
0344 TB10X_PORT5 + 26, TB10X_PORT5 + 27,
0345 TB10X_PORT5 + 28, TB10X_PORT5 + 29,
0346 TB10X_PORT5 + 30, TB10X_PORT5 + 31,
0347 TB10X_PORT5 + 32, TB10X_PORT5 + 33,
0348 TB10X_PORT5 + 34, TB10X_PORT5 + 35,
0349 TB10X_PORT5 + 36, TB10X_PORT5 + 37,
0350 TB10X_PORT5 + 38, TB10X_PORT5 + 39,
0351 TB10X_PORT5 + 40, TB10X_PORT5 + 41,
0352 TB10X_PORT5 + 42, TB10X_PORT5 + 43,
0353 TB10X_PORT5 + 44, TB10X_PORT5 + 45,
0354 TB10X_PORT5 + 46, TB10X_PORT5 + 47,
0355 TB10X_PORT5 + 48, TB10X_PORT5 + 49,
0356 TB10X_PORT5 + 50, TB10X_PORT5 + 51,
0357 TB10X_PORT5 + 52, TB10X_PORT5 + 53};
0358 static const unsigned mcard_pins[] = { TB10X_PORT5 + 3, TB10X_PORT5 + 10,
0359 TB10X_PORT5 + 11, TB10X_PORT5 + 12,
0360 TB10X_PORT5 + 22, TB10X_PORT5 + 23,
0361 TB10X_PORT5 + 33, TB10X_PORT5 + 35,
0362 TB10X_PORT5 + 36, TB10X_PORT5 + 37,
0363 TB10X_PORT5 + 38, TB10X_PORT5 + 39,
0364 TB10X_PORT5 + 40, TB10X_PORT5 + 41,
0365 TB10X_PORT5 + 42, TB10X_PORT5 + 43,
0366 TB10X_PORT5 + 45, TB10X_PORT5 + 46,
0367 TB10X_PORT5 + 47, TB10X_PORT5 + 48,
0368 TB10X_PORT5 + 49, TB10X_PORT5 + 50,
0369 TB10X_PORT5 + 51, TB10X_PORT5 + 52,
0370 TB10X_PORT5 + 53};
0371 static const unsigned stc0_pins[] = { TB10X_PORT5 + 34, TB10X_PORT5 + 35,
0372 TB10X_PORT5 + 36, TB10X_PORT5 + 37,
0373 TB10X_PORT5 + 38, TB10X_PORT5 + 39,
0374 TB10X_PORT5 + 40};
0375 static const unsigned stc1_pins[] = { TB10X_PORT5 + 25, TB10X_PORT5 + 26,
0376 TB10X_PORT5 + 27, TB10X_PORT5 + 28,
0377 TB10X_PORT5 + 29, TB10X_PORT5 + 30,
0378 TB10X_PORT5 + 44};
0379
0380
0381 static const unsigned gpiob_pins[] = { TB10X_GPIOS + 0, TB10X_GPIOS + 1};
0382 static const unsigned gpiod_pins[] = { TB10X_GPIOS + 2, TB10X_GPIOS + 3};
0383 static const unsigned gpiof_pins[] = { TB10X_GPIOS + 4, TB10X_GPIOS + 5};
0384 static const unsigned gpioh_pins[] = { TB10X_GPIOS + 6, TB10X_GPIOS + 7};
0385 static const unsigned gpioi_pins[] = { TB10X_GPIOS + 8, TB10X_GPIOS + 9,
0386 TB10X_GPIOS + 10, TB10X_GPIOS + 11,
0387 TB10X_GPIOS + 12, TB10X_GPIOS + 13,
0388 TB10X_GPIOS + 14, TB10X_GPIOS + 15,
0389 TB10X_GPIOS + 16, TB10X_GPIOS + 17,
0390 TB10X_GPIOS + 18, TB10X_GPIOS + 19};
0391
0392 struct tb10x_pinfuncgrp {
0393 const char *name;
0394 const unsigned int *pins;
0395 const unsigned int pincnt;
0396 const int port;
0397 const unsigned int mode;
0398 const int isgpio;
0399 };
0400 #define DEFPINFUNCGRP(NAME, PORT, MODE, ISGPIO) { \
0401 .name = __stringify(NAME), \
0402 .pins = NAME##_pins, .pincnt = ARRAY_SIZE(NAME##_pins), \
0403 .port = (PORT), .mode = (MODE), \
0404 .isgpio = (ISGPIO), \
0405 }
0406 static const struct tb10x_pinfuncgrp tb10x_pingroups[] = {
0407 DEFPINFUNCGRP(mis0, 0, 0, 0),
0408 DEFPINFUNCGRP(gpioa, 0, 0, 1),
0409 DEFPINFUNCGRP(mis1, 0, 0, 0),
0410 DEFPINFUNCGRP(mip1, 0, 1, 0),
0411 DEFPINFUNCGRP(mis2, 1, 0, 0),
0412 DEFPINFUNCGRP(gpioc, 1, 0, 1),
0413 DEFPINFUNCGRP(mis3, 1, 0, 0),
0414 DEFPINFUNCGRP(mip3, 1, 1, 0),
0415 DEFPINFUNCGRP(mis4, 2, 0, 0),
0416 DEFPINFUNCGRP(gpioe, 2, 0, 1),
0417 DEFPINFUNCGRP(mis5, 2, 0, 0),
0418 DEFPINFUNCGRP(mip5, 2, 1, 0),
0419 DEFPINFUNCGRP(mis6, 3, 0, 0),
0420 DEFPINFUNCGRP(gpiog, 3, 0, 1),
0421 DEFPINFUNCGRP(mis7, 3, 0, 0),
0422 DEFPINFUNCGRP(mip7, 3, 1, 0),
0423 DEFPINFUNCGRP(gpioj, 4, 0, 1),
0424 DEFPINFUNCGRP(gpiok, 4, 0, 1),
0425 DEFPINFUNCGRP(ciplus, 4, 1, 0),
0426 DEFPINFUNCGRP(mcard, 4, 2, 0),
0427 DEFPINFUNCGRP(stc0, 4, 3, 0),
0428 DEFPINFUNCGRP(stc1, 4, 3, 0),
0429 DEFPINFUNCGRP(mop, 5, 0, 0),
0430 DEFPINFUNCGRP(mos0, 5, 1, 0),
0431 DEFPINFUNCGRP(mos1, 5, 1, 0),
0432 DEFPINFUNCGRP(mos2, 5, 1, 0),
0433 DEFPINFUNCGRP(mos3, 5, 1, 0),
0434 DEFPINFUNCGRP(uart0, 6, 0, 0),
0435 DEFPINFUNCGRP(uart1, 6, 0, 0),
0436 DEFPINFUNCGRP(gpiol, 6, 1, 1),
0437 DEFPINFUNCGRP(gpiom, 6, 1, 1),
0438 DEFPINFUNCGRP(spi3, 7, 0, 0),
0439 DEFPINFUNCGRP(jtag, 7, 1, 0),
0440 DEFPINFUNCGRP(spi1, 8, 0, 0),
0441 DEFPINFUNCGRP(gpion, 8, 1, 1),
0442 DEFPINFUNCGRP(gpiob, -1, 0, 1),
0443 DEFPINFUNCGRP(gpiod, -1, 0, 1),
0444 DEFPINFUNCGRP(gpiof, -1, 0, 1),
0445 DEFPINFUNCGRP(gpioh, -1, 0, 1),
0446 DEFPINFUNCGRP(gpioi, -1, 0, 1),
0447 };
0448 #undef DEFPINFUNCGRP
0449
0450 struct tb10x_of_pinfunc {
0451 const char *name;
0452 const char *group;
0453 };
0454
0455 #define TB10X_PORTS (9)
0456
0457
0458
0459
0460
0461
0462
0463 struct tb10x_port {
0464 unsigned int mode;
0465 unsigned int count;
0466 };
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480 struct tb10x_pinctrl {
0481 struct pinctrl_dev *pctl;
0482 void *base;
0483 const struct tb10x_pinfuncgrp *pingroups;
0484 unsigned int pinfuncgrpcnt;
0485 unsigned int pinfuncnt;
0486 struct mutex mutex;
0487 struct tb10x_port ports[TB10X_PORTS];
0488 DECLARE_BITMAP(gpios, MAX_PIN + 1);
0489 struct tb10x_of_pinfunc pinfuncs[];
0490 };
0491
0492 static inline void tb10x_pinctrl_set_config(struct tb10x_pinctrl *state,
0493 unsigned int port, unsigned int mode)
0494 {
0495 u32 pcfg;
0496
0497 if (state->ports[port].count)
0498 return;
0499
0500 state->ports[port].mode = mode;
0501
0502 pcfg = ioread32(state->base) & ~(PCFG_PORT_MASK(port));
0503 pcfg |= (mode << (PCFG_PORT_BITWIDTH * port)) & PCFG_PORT_MASK(port);
0504 iowrite32(pcfg, state->base);
0505 }
0506
0507 static inline unsigned int tb10x_pinctrl_get_config(
0508 struct tb10x_pinctrl *state,
0509 unsigned int port)
0510 {
0511 return (ioread32(state->base) & PCFG_PORT_MASK(port))
0512 >> (PCFG_PORT_BITWIDTH * port);
0513 }
0514
0515 static int tb10x_get_groups_count(struct pinctrl_dev *pctl)
0516 {
0517 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0518 return state->pinfuncgrpcnt;
0519 }
0520
0521 static const char *tb10x_get_group_name(struct pinctrl_dev *pctl, unsigned n)
0522 {
0523 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0524 return state->pingroups[n].name;
0525 }
0526
0527 static int tb10x_get_group_pins(struct pinctrl_dev *pctl, unsigned n,
0528 unsigned const **pins,
0529 unsigned * const num_pins)
0530 {
0531 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0532
0533 *pins = state->pingroups[n].pins;
0534 *num_pins = state->pingroups[n].pincnt;
0535
0536 return 0;
0537 }
0538
0539 static int tb10x_dt_node_to_map(struct pinctrl_dev *pctl,
0540 struct device_node *np_config,
0541 struct pinctrl_map **map, unsigned *num_maps)
0542 {
0543 const char *string;
0544 unsigned reserved_maps = 0;
0545 int ret = 0;
0546
0547 if (of_property_read_string(np_config, "abilis,function", &string)) {
0548 pr_err("%pOF: No abilis,function property in device tree.\n",
0549 np_config);
0550 return -EINVAL;
0551 }
0552
0553 *map = NULL;
0554 *num_maps = 0;
0555
0556 ret = pinctrl_utils_reserve_map(pctl, map, &reserved_maps,
0557 num_maps, 1);
0558 if (ret)
0559 goto out;
0560
0561 ret = pinctrl_utils_add_map_mux(pctl, map, &reserved_maps,
0562 num_maps, string, np_config->name);
0563
0564 out:
0565 return ret;
0566 }
0567
0568 static const struct pinctrl_ops tb10x_pinctrl_ops = {
0569 .get_groups_count = tb10x_get_groups_count,
0570 .get_group_name = tb10x_get_group_name,
0571 .get_group_pins = tb10x_get_group_pins,
0572 .dt_node_to_map = tb10x_dt_node_to_map,
0573 .dt_free_map = pinctrl_utils_free_map,
0574 };
0575
0576 static int tb10x_get_functions_count(struct pinctrl_dev *pctl)
0577 {
0578 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0579 return state->pinfuncnt;
0580 }
0581
0582 static const char *tb10x_get_function_name(struct pinctrl_dev *pctl,
0583 unsigned n)
0584 {
0585 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0586 return state->pinfuncs[n].name;
0587 }
0588
0589 static int tb10x_get_function_groups(struct pinctrl_dev *pctl,
0590 unsigned n, const char * const **groups,
0591 unsigned * const num_groups)
0592 {
0593 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0594
0595 *groups = &state->pinfuncs[n].group;
0596 *num_groups = 1;
0597
0598 return 0;
0599 }
0600
0601 static int tb10x_gpio_request_enable(struct pinctrl_dev *pctl,
0602 struct pinctrl_gpio_range *range,
0603 unsigned pin)
0604 {
0605 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0606 int muxport = -1;
0607 int muxmode = -1;
0608 int i;
0609
0610 mutex_lock(&state->mutex);
0611
0612
0613
0614
0615
0616
0617
0618 for (i = 0; i < state->pinfuncgrpcnt; i++) {
0619 const struct tb10x_pinfuncgrp *pfg = &state->pingroups[i];
0620 unsigned int mode = pfg->mode;
0621 int j, port = pfg->port;
0622
0623
0624
0625
0626
0627 if (port < 0)
0628 continue;
0629
0630 for (j = 0; j < pfg->pincnt; j++) {
0631 if (pin == pfg->pins[j]) {
0632 if (pfg->isgpio) {
0633
0634
0635
0636
0637 muxport = port;
0638 muxmode = mode;
0639 } else if (state->ports[port].count
0640 && (state->ports[port].mode == mode)) {
0641
0642
0643
0644
0645 mutex_unlock(&state->mutex);
0646 return -EBUSY;
0647 }
0648 break;
0649 }
0650 }
0651 }
0652
0653
0654
0655
0656
0657
0658
0659 set_bit(pin, state->gpios);
0660
0661
0662
0663
0664
0665
0666
0667 if (muxport >= 0)
0668 tb10x_pinctrl_set_config(state, muxport, muxmode);
0669
0670 mutex_unlock(&state->mutex);
0671
0672 return 0;
0673 }
0674
0675 static void tb10x_gpio_disable_free(struct pinctrl_dev *pctl,
0676 struct pinctrl_gpio_range *range,
0677 unsigned pin)
0678 {
0679 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0680
0681 mutex_lock(&state->mutex);
0682
0683 clear_bit(pin, state->gpios);
0684
0685 mutex_unlock(&state->mutex);
0686 }
0687
0688 static int tb10x_pctl_set_mux(struct pinctrl_dev *pctl,
0689 unsigned func_selector, unsigned group_selector)
0690 {
0691 struct tb10x_pinctrl *state = pinctrl_dev_get_drvdata(pctl);
0692 const struct tb10x_pinfuncgrp *grp = &state->pingroups[group_selector];
0693 int i;
0694
0695 if (grp->port < 0)
0696 return 0;
0697
0698 mutex_lock(&state->mutex);
0699
0700
0701
0702
0703
0704 if (state->ports[grp->port].count
0705 && (state->ports[grp->port].mode != grp->mode)) {
0706 mutex_unlock(&state->mutex);
0707 return -EBUSY;
0708 }
0709
0710
0711
0712
0713
0714 for (i = 0; i < grp->pincnt; i++)
0715 if (test_bit(grp->pins[i], state->gpios)) {
0716 mutex_unlock(&state->mutex);
0717 return -EBUSY;
0718 }
0719
0720 tb10x_pinctrl_set_config(state, grp->port, grp->mode);
0721
0722 state->ports[grp->port].count++;
0723
0724 mutex_unlock(&state->mutex);
0725
0726 return 0;
0727 }
0728
0729 static const struct pinmux_ops tb10x_pinmux_ops = {
0730 .get_functions_count = tb10x_get_functions_count,
0731 .get_function_name = tb10x_get_function_name,
0732 .get_function_groups = tb10x_get_function_groups,
0733 .gpio_request_enable = tb10x_gpio_request_enable,
0734 .gpio_disable_free = tb10x_gpio_disable_free,
0735 .set_mux = tb10x_pctl_set_mux,
0736 };
0737
0738 static struct pinctrl_desc tb10x_pindesc = {
0739 .name = "TB10x",
0740 .pins = tb10x_pins,
0741 .npins = ARRAY_SIZE(tb10x_pins),
0742 .owner = THIS_MODULE,
0743 .pctlops = &tb10x_pinctrl_ops,
0744 .pmxops = &tb10x_pinmux_ops,
0745 };
0746
0747 static int tb10x_pinctrl_probe(struct platform_device *pdev)
0748 {
0749 int ret = -EINVAL;
0750 struct device *dev = &pdev->dev;
0751 struct device_node *of_node = dev->of_node;
0752 struct device_node *child;
0753 struct tb10x_pinctrl *state;
0754 int i;
0755
0756 if (!of_node) {
0757 dev_err(dev, "No device tree node found.\n");
0758 return -EINVAL;
0759 }
0760
0761 state = devm_kzalloc(dev, struct_size(state, pinfuncs,
0762 of_get_child_count(of_node)),
0763 GFP_KERNEL);
0764 if (!state)
0765 return -ENOMEM;
0766
0767 platform_set_drvdata(pdev, state);
0768 mutex_init(&state->mutex);
0769
0770 state->base = devm_platform_ioremap_resource(pdev, 0);
0771 if (IS_ERR(state->base)) {
0772 ret = PTR_ERR(state->base);
0773 goto fail;
0774 }
0775
0776 state->pingroups = tb10x_pingroups;
0777 state->pinfuncgrpcnt = ARRAY_SIZE(tb10x_pingroups);
0778
0779 for (i = 0; i < TB10X_PORTS; i++)
0780 state->ports[i].mode = tb10x_pinctrl_get_config(state, i);
0781
0782 for_each_child_of_node(of_node, child) {
0783 const char *name;
0784
0785 if (!of_property_read_string(child, "abilis,function",
0786 &name)) {
0787 state->pinfuncs[state->pinfuncnt].name = child->name;
0788 state->pinfuncs[state->pinfuncnt].group = name;
0789 state->pinfuncnt++;
0790 }
0791 }
0792
0793 state->pctl = devm_pinctrl_register(dev, &tb10x_pindesc, state);
0794 if (IS_ERR(state->pctl)) {
0795 dev_err(dev, "could not register TB10x pin driver\n");
0796 ret = PTR_ERR(state->pctl);
0797 goto fail;
0798 }
0799
0800 return 0;
0801
0802 fail:
0803 mutex_destroy(&state->mutex);
0804 return ret;
0805 }
0806
0807 static int tb10x_pinctrl_remove(struct platform_device *pdev)
0808 {
0809 struct tb10x_pinctrl *state = platform_get_drvdata(pdev);
0810
0811 mutex_destroy(&state->mutex);
0812
0813 return 0;
0814 }
0815
0816
0817 static const struct of_device_id tb10x_pinctrl_dt_ids[] = {
0818 { .compatible = "abilis,tb10x-iomux" },
0819 { }
0820 };
0821 MODULE_DEVICE_TABLE(of, tb10x_pinctrl_dt_ids);
0822
0823 static struct platform_driver tb10x_pinctrl_pdrv = {
0824 .probe = tb10x_pinctrl_probe,
0825 .remove = tb10x_pinctrl_remove,
0826 .driver = {
0827 .name = "tb10x_pinctrl",
0828 .of_match_table = of_match_ptr(tb10x_pinctrl_dt_ids),
0829 }
0830 };
0831
0832 module_platform_driver(tb10x_pinctrl_pdrv);
0833
0834 MODULE_AUTHOR("Christian Ruppert <christian.ruppert@abilis.com>");
0835 MODULE_LICENSE("GPL");