0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #include <linux/module.h>
0019 #include <linux/platform_device.h>
0020 #include <linux/of.h>
0021 #include <linux/of_device.h>
0022 #include <linux/pinctrl/pinctrl.h>
0023
0024 #include "pinctrl-sunxi.h"
0025
0026 static const struct sunxi_desc_pin sun50i_h5_pins[] = {
0027 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 0),
0028 SUNXI_FUNCTION(0x0, "gpio_in"),
0029 SUNXI_FUNCTION(0x1, "gpio_out"),
0030 SUNXI_FUNCTION(0x2, "uart2"),
0031 SUNXI_FUNCTION(0x3, "jtag"),
0032 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)),
0033 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 1),
0034 SUNXI_FUNCTION(0x0, "gpio_in"),
0035 SUNXI_FUNCTION(0x1, "gpio_out"),
0036 SUNXI_FUNCTION(0x2, "uart2"),
0037 SUNXI_FUNCTION(0x3, "jtag"),
0038 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)),
0039 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 2),
0040 SUNXI_FUNCTION(0x0, "gpio_in"),
0041 SUNXI_FUNCTION(0x1, "gpio_out"),
0042 SUNXI_FUNCTION(0x2, "uart2"),
0043 SUNXI_FUNCTION(0x3, "jtag"),
0044 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)),
0045 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 3),
0046 SUNXI_FUNCTION(0x0, "gpio_in"),
0047 SUNXI_FUNCTION(0x1, "gpio_out"),
0048 SUNXI_FUNCTION(0x2, "uart2"),
0049 SUNXI_FUNCTION(0x3, "jtag"),
0050 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)),
0051 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 4),
0052 SUNXI_FUNCTION(0x0, "gpio_in"),
0053 SUNXI_FUNCTION(0x1, "gpio_out"),
0054 SUNXI_FUNCTION(0x2, "uart0"),
0055 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)),
0056 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 5),
0057 SUNXI_FUNCTION(0x0, "gpio_in"),
0058 SUNXI_FUNCTION(0x1, "gpio_out"),
0059 SUNXI_FUNCTION(0x2, "uart0"),
0060 SUNXI_FUNCTION(0x3, "pwm0"),
0061 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)),
0062 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 6),
0063 SUNXI_FUNCTION(0x0, "gpio_in"),
0064 SUNXI_FUNCTION(0x1, "gpio_out"),
0065 SUNXI_FUNCTION(0x2, "sim"),
0066 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)),
0067 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 7),
0068 SUNXI_FUNCTION(0x0, "gpio_in"),
0069 SUNXI_FUNCTION(0x1, "gpio_out"),
0070 SUNXI_FUNCTION(0x2, "sim"),
0071 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)),
0072 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 8),
0073 SUNXI_FUNCTION(0x0, "gpio_in"),
0074 SUNXI_FUNCTION(0x1, "gpio_out"),
0075 SUNXI_FUNCTION(0x2, "sim"),
0076 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)),
0077 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 9),
0078 SUNXI_FUNCTION(0x0, "gpio_in"),
0079 SUNXI_FUNCTION(0x1, "gpio_out"),
0080 SUNXI_FUNCTION(0x2, "sim"),
0081 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)),
0082 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 10),
0083 SUNXI_FUNCTION(0x0, "gpio_in"),
0084 SUNXI_FUNCTION(0x1, "gpio_out"),
0085 SUNXI_FUNCTION(0x2, "sim"),
0086 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 10)),
0087 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 11),
0088 SUNXI_FUNCTION(0x0, "gpio_in"),
0089 SUNXI_FUNCTION(0x1, "gpio_out"),
0090 SUNXI_FUNCTION(0x2, "i2c0"),
0091 SUNXI_FUNCTION(0x3, "di"),
0092 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 11)),
0093 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 12),
0094 SUNXI_FUNCTION(0x0, "gpio_in"),
0095 SUNXI_FUNCTION(0x1, "gpio_out"),
0096 SUNXI_FUNCTION(0x2, "i2c0"),
0097 SUNXI_FUNCTION(0x3, "di"),
0098 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 12)),
0099 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 13),
0100 SUNXI_FUNCTION(0x0, "gpio_in"),
0101 SUNXI_FUNCTION(0x1, "gpio_out"),
0102 SUNXI_FUNCTION(0x2, "spi1"),
0103 SUNXI_FUNCTION(0x3, "uart3"),
0104 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 13)),
0105 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 14),
0106 SUNXI_FUNCTION(0x0, "gpio_in"),
0107 SUNXI_FUNCTION(0x1, "gpio_out"),
0108 SUNXI_FUNCTION(0x2, "spi1"),
0109 SUNXI_FUNCTION(0x3, "uart3"),
0110 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 14)),
0111 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 15),
0112 SUNXI_FUNCTION(0x0, "gpio_in"),
0113 SUNXI_FUNCTION(0x1, "gpio_out"),
0114 SUNXI_FUNCTION(0x2, "spi1"),
0115 SUNXI_FUNCTION(0x3, "uart3"),
0116 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 15)),
0117 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 16),
0118 SUNXI_FUNCTION(0x0, "gpio_in"),
0119 SUNXI_FUNCTION(0x1, "gpio_out"),
0120 SUNXI_FUNCTION(0x2, "spi1"),
0121 SUNXI_FUNCTION(0x3, "uart3"),
0122 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 16)),
0123 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 17),
0124 SUNXI_FUNCTION(0x0, "gpio_in"),
0125 SUNXI_FUNCTION(0x1, "gpio_out"),
0126 SUNXI_FUNCTION(0x2, "spdif"),
0127 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 17)),
0128 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 18),
0129 SUNXI_FUNCTION(0x0, "gpio_in"),
0130 SUNXI_FUNCTION(0x1, "gpio_out"),
0131 SUNXI_FUNCTION(0x2, "i2s0"),
0132 SUNXI_FUNCTION(0x3, "i2c1"),
0133 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 18)),
0134 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 19),
0135 SUNXI_FUNCTION(0x0, "gpio_in"),
0136 SUNXI_FUNCTION(0x1, "gpio_out"),
0137 SUNXI_FUNCTION(0x2, "i2s0"),
0138 SUNXI_FUNCTION(0x3, "i2c1"),
0139 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 19)),
0140 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 20),
0141 SUNXI_FUNCTION(0x0, "gpio_in"),
0142 SUNXI_FUNCTION(0x1, "gpio_out"),
0143 SUNXI_FUNCTION(0x2, "i2s0"),
0144 SUNXI_FUNCTION(0x3, "sim"),
0145 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 20)),
0146 SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 21),
0147 SUNXI_FUNCTION(0x0, "gpio_in"),
0148 SUNXI_FUNCTION(0x1, "gpio_out"),
0149 SUNXI_FUNCTION(0x2, "i2s0"),
0150 SUNXI_FUNCTION(0x3, "sim"),
0151 SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 21)),
0152
0153 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0),
0154 SUNXI_FUNCTION(0x0, "gpio_in"),
0155 SUNXI_FUNCTION(0x1, "gpio_out"),
0156 SUNXI_FUNCTION(0x2, "nand0"),
0157 SUNXI_FUNCTION(0x3, "spi0")),
0158 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1),
0159 SUNXI_FUNCTION(0x0, "gpio_in"),
0160 SUNXI_FUNCTION(0x1, "gpio_out"),
0161 SUNXI_FUNCTION(0x2, "nand0"),
0162 SUNXI_FUNCTION(0x3, "spi0"),
0163 SUNXI_FUNCTION(0x4, "mmc2")),
0164 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2),
0165 SUNXI_FUNCTION(0x0, "gpio_in"),
0166 SUNXI_FUNCTION(0x1, "gpio_out"),
0167 SUNXI_FUNCTION(0x2, "nand0"),
0168 SUNXI_FUNCTION(0x3, "spi0")),
0169 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3),
0170 SUNXI_FUNCTION(0x0, "gpio_in"),
0171 SUNXI_FUNCTION(0x1, "gpio_out"),
0172 SUNXI_FUNCTION(0x2, "nand0"),
0173 SUNXI_FUNCTION(0x3, "spi0")),
0174 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 4),
0175 SUNXI_FUNCTION(0x0, "gpio_in"),
0176 SUNXI_FUNCTION(0x1, "gpio_out"),
0177 SUNXI_FUNCTION(0x2, "nand0"),
0178 SUNXI_FUNCTION(0x4, "spi0")),
0179 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 5),
0180 SUNXI_FUNCTION(0x0, "gpio_in"),
0181 SUNXI_FUNCTION(0x1, "gpio_out"),
0182 SUNXI_FUNCTION(0x2, "nand0"),
0183 SUNXI_FUNCTION(0x3, "mmc2")),
0184 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 6),
0185 SUNXI_FUNCTION(0x0, "gpio_in"),
0186 SUNXI_FUNCTION(0x1, "gpio_out"),
0187 SUNXI_FUNCTION(0x2, "nand0"),
0188 SUNXI_FUNCTION(0x3, "mmc2")),
0189 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 7),
0190 SUNXI_FUNCTION(0x0, "gpio_in"),
0191 SUNXI_FUNCTION(0x1, "gpio_out"),
0192 SUNXI_FUNCTION(0x2, "nand0")),
0193 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 8),
0194 SUNXI_FUNCTION(0x0, "gpio_in"),
0195 SUNXI_FUNCTION(0x1, "gpio_out"),
0196 SUNXI_FUNCTION(0x2, "nand0"),
0197 SUNXI_FUNCTION(0x3, "mmc2")),
0198 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 9),
0199 SUNXI_FUNCTION(0x0, "gpio_in"),
0200 SUNXI_FUNCTION(0x1, "gpio_out"),
0201 SUNXI_FUNCTION(0x2, "nand0"),
0202 SUNXI_FUNCTION(0x3, "mmc2")),
0203 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 10),
0204 SUNXI_FUNCTION(0x0, "gpio_in"),
0205 SUNXI_FUNCTION(0x1, "gpio_out"),
0206 SUNXI_FUNCTION(0x2, "nand0"),
0207 SUNXI_FUNCTION(0x3, "mmc2")),
0208 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 11),
0209 SUNXI_FUNCTION(0x0, "gpio_in"),
0210 SUNXI_FUNCTION(0x1, "gpio_out"),
0211 SUNXI_FUNCTION(0x2, "nand0"),
0212 SUNXI_FUNCTION(0x3, "mmc2")),
0213 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 12),
0214 SUNXI_FUNCTION(0x0, "gpio_in"),
0215 SUNXI_FUNCTION(0x1, "gpio_out"),
0216 SUNXI_FUNCTION(0x2, "nand0"),
0217 SUNXI_FUNCTION(0x3, "mmc2")),
0218 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 13),
0219 SUNXI_FUNCTION(0x0, "gpio_in"),
0220 SUNXI_FUNCTION(0x1, "gpio_out"),
0221 SUNXI_FUNCTION(0x2, "nand0"),
0222 SUNXI_FUNCTION(0x3, "mmc2")),
0223 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14),
0224 SUNXI_FUNCTION(0x0, "gpio_in"),
0225 SUNXI_FUNCTION(0x1, "gpio_out"),
0226 SUNXI_FUNCTION(0x2, "nand0"),
0227 SUNXI_FUNCTION(0x3, "mmc2")),
0228 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15),
0229 SUNXI_FUNCTION(0x0, "gpio_in"),
0230 SUNXI_FUNCTION(0x1, "gpio_out"),
0231 SUNXI_FUNCTION(0x2, "nand0"),
0232 SUNXI_FUNCTION(0x3, "mmc2")),
0233 SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 16),
0234 SUNXI_FUNCTION(0x0, "gpio_in"),
0235 SUNXI_FUNCTION(0x1, "gpio_out"),
0236 SUNXI_FUNCTION(0x2, "nand0"),
0237 SUNXI_FUNCTION(0x3, "mmc2")),
0238
0239 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 0),
0240 SUNXI_FUNCTION(0x0, "gpio_in"),
0241 SUNXI_FUNCTION(0x1, "gpio_out"),
0242 SUNXI_FUNCTION(0x2, "emac"),
0243 SUNXI_FUNCTION(0x3, "di"),
0244 SUNXI_FUNCTION(0x4, "ts2")),
0245 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 1),
0246 SUNXI_FUNCTION(0x0, "gpio_in"),
0247 SUNXI_FUNCTION(0x1, "gpio_out"),
0248 SUNXI_FUNCTION(0x2, "emac"),
0249 SUNXI_FUNCTION(0x3, "di"),
0250 SUNXI_FUNCTION(0x4, "ts2")),
0251 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2),
0252 SUNXI_FUNCTION(0x0, "gpio_in"),
0253 SUNXI_FUNCTION(0x1, "gpio_out"),
0254 SUNXI_FUNCTION(0x2, "emac"),
0255 SUNXI_FUNCTION(0x4, "ts2")),
0256 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 3),
0257 SUNXI_FUNCTION(0x0, "gpio_in"),
0258 SUNXI_FUNCTION(0x1, "gpio_out"),
0259 SUNXI_FUNCTION(0x2, "emac"),
0260 SUNXI_FUNCTION(0x4, "ts2")),
0261 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 4),
0262 SUNXI_FUNCTION(0x0, "gpio_in"),
0263 SUNXI_FUNCTION(0x1, "gpio_out"),
0264 SUNXI_FUNCTION(0x2, "emac"),
0265 SUNXI_FUNCTION(0x4, "ts2")),
0266 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 5),
0267 SUNXI_FUNCTION(0x0, "gpio_in"),
0268 SUNXI_FUNCTION(0x1, "gpio_out"),
0269 SUNXI_FUNCTION(0x2, "emac"),
0270 SUNXI_FUNCTION(0x4, "ts2")),
0271 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 6),
0272 SUNXI_FUNCTION(0x0, "gpio_in"),
0273 SUNXI_FUNCTION(0x1, "gpio_out"),
0274 SUNXI_FUNCTION(0x2, "emac"),
0275 SUNXI_FUNCTION(0x4, "ts2")),
0276 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 7),
0277 SUNXI_FUNCTION(0x0, "gpio_in"),
0278 SUNXI_FUNCTION(0x1, "gpio_out"),
0279 SUNXI_FUNCTION(0x2, "emac"),
0280 SUNXI_FUNCTION(0x4, "ts2"),
0281 SUNXI_FUNCTION(0x5, "ts3")),
0282 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 8),
0283 SUNXI_FUNCTION(0x0, "gpio_in"),
0284 SUNXI_FUNCTION(0x1, "gpio_out"),
0285 SUNXI_FUNCTION(0x2, "emac"),
0286 SUNXI_FUNCTION(0x4, "ts2"),
0287 SUNXI_FUNCTION(0x5, "ts3")),
0288 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9),
0289 SUNXI_FUNCTION(0x0, "gpio_in"),
0290 SUNXI_FUNCTION(0x1, "gpio_out"),
0291 SUNXI_FUNCTION(0x2, "emac"),
0292 SUNXI_FUNCTION(0x4, "ts2"),
0293 SUNXI_FUNCTION(0x5, "ts3")),
0294 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10),
0295 SUNXI_FUNCTION(0x0, "gpio_in"),
0296 SUNXI_FUNCTION(0x1, "gpio_out"),
0297 SUNXI_FUNCTION(0x2, "emac"),
0298 SUNXI_FUNCTION(0x4, "ts2"),
0299 SUNXI_FUNCTION(0x5, "ts3")),
0300 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11),
0301 SUNXI_FUNCTION(0x0, "gpio_in"),
0302 SUNXI_FUNCTION(0x1, "gpio_out"),
0303 SUNXI_FUNCTION(0x2, "emac"),
0304 SUNXI_FUNCTION(0x4, "ts2"),
0305 SUNXI_FUNCTION(0x5, "ts3")),
0306 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12),
0307 SUNXI_FUNCTION(0x0, "gpio_in"),
0308 SUNXI_FUNCTION(0x1, "gpio_out"),
0309 SUNXI_FUNCTION(0x2, "emac"),
0310 SUNXI_FUNCTION(0x4, "sim")),
0311 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13),
0312 SUNXI_FUNCTION(0x0, "gpio_in"),
0313 SUNXI_FUNCTION(0x1, "gpio_out"),
0314 SUNXI_FUNCTION(0x2, "emac"),
0315 SUNXI_FUNCTION(0x4, "sim")),
0316 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14),
0317 SUNXI_FUNCTION(0x0, "gpio_in"),
0318 SUNXI_FUNCTION(0x1, "gpio_out"),
0319 SUNXI_FUNCTION(0x2, "emac"),
0320 SUNXI_FUNCTION(0x4, "sim")),
0321 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15),
0322 SUNXI_FUNCTION(0x0, "gpio_in"),
0323 SUNXI_FUNCTION(0x1, "gpio_out"),
0324 SUNXI_FUNCTION(0x2, "emac"),
0325 SUNXI_FUNCTION(0x4, "sim")),
0326 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16),
0327 SUNXI_FUNCTION(0x0, "gpio_in"),
0328 SUNXI_FUNCTION(0x1, "gpio_out"),
0329 SUNXI_FUNCTION(0x2, "emac"),
0330 SUNXI_FUNCTION(0x4, "sim")),
0331 SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17),
0332 SUNXI_FUNCTION(0x0, "gpio_in"),
0333 SUNXI_FUNCTION(0x1, "gpio_out"),
0334 SUNXI_FUNCTION(0x2, "emac")),
0335
0336 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0),
0337 SUNXI_FUNCTION(0x0, "gpio_in"),
0338 SUNXI_FUNCTION(0x1, "gpio_out"),
0339 SUNXI_FUNCTION(0x2, "csi"),
0340 SUNXI_FUNCTION(0x3, "ts0")),
0341 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1),
0342 SUNXI_FUNCTION(0x0, "gpio_in"),
0343 SUNXI_FUNCTION(0x1, "gpio_out"),
0344 SUNXI_FUNCTION(0x2, "csi"),
0345 SUNXI_FUNCTION(0x3, "ts0")),
0346 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2),
0347 SUNXI_FUNCTION(0x0, "gpio_in"),
0348 SUNXI_FUNCTION(0x1, "gpio_out"),
0349 SUNXI_FUNCTION(0x2, "csi"),
0350 SUNXI_FUNCTION(0x3, "ts0")),
0351 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3),
0352 SUNXI_FUNCTION(0x0, "gpio_in"),
0353 SUNXI_FUNCTION(0x1, "gpio_out"),
0354 SUNXI_FUNCTION(0x2, "csi"),
0355 SUNXI_FUNCTION(0x3, "ts0")),
0356 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4),
0357 SUNXI_FUNCTION(0x0, "gpio_in"),
0358 SUNXI_FUNCTION(0x1, "gpio_out"),
0359 SUNXI_FUNCTION(0x2, "csi"),
0360 SUNXI_FUNCTION(0x3, "ts0")),
0361 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5),
0362 SUNXI_FUNCTION(0x0, "gpio_in"),
0363 SUNXI_FUNCTION(0x1, "gpio_out"),
0364 SUNXI_FUNCTION(0x2, "csi"),
0365 SUNXI_FUNCTION(0x3, "ts0")),
0366 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6),
0367 SUNXI_FUNCTION(0x0, "gpio_in"),
0368 SUNXI_FUNCTION(0x1, "gpio_out"),
0369 SUNXI_FUNCTION(0x2, "csi"),
0370 SUNXI_FUNCTION(0x3, "ts0")),
0371 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7),
0372 SUNXI_FUNCTION(0x0, "gpio_in"),
0373 SUNXI_FUNCTION(0x1, "gpio_out"),
0374 SUNXI_FUNCTION(0x2, "csi"),
0375 SUNXI_FUNCTION(0x3, "ts0"),
0376 SUNXI_FUNCTION(0x4, "ts1")),
0377 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8),
0378 SUNXI_FUNCTION(0x0, "gpio_in"),
0379 SUNXI_FUNCTION(0x1, "gpio_out"),
0380 SUNXI_FUNCTION(0x2, "csi"),
0381 SUNXI_FUNCTION(0x3, "ts0"),
0382 SUNXI_FUNCTION(0x4, "ts1")),
0383 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9),
0384 SUNXI_FUNCTION(0x0, "gpio_in"),
0385 SUNXI_FUNCTION(0x1, "gpio_out"),
0386 SUNXI_FUNCTION(0x2, "csi"),
0387 SUNXI_FUNCTION(0x3, "ts0"),
0388 SUNXI_FUNCTION(0x4, "ts1")),
0389 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10),
0390 SUNXI_FUNCTION(0x0, "gpio_in"),
0391 SUNXI_FUNCTION(0x1, "gpio_out"),
0392 SUNXI_FUNCTION(0x2, "csi"),
0393 SUNXI_FUNCTION(0x3, "ts0"),
0394 SUNXI_FUNCTION(0x4, "ts1")),
0395 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11),
0396 SUNXI_FUNCTION(0x0, "gpio_in"),
0397 SUNXI_FUNCTION(0x1, "gpio_out"),
0398 SUNXI_FUNCTION(0x2, "csi"),
0399 SUNXI_FUNCTION(0x3, "ts"),
0400 SUNXI_FUNCTION(0x4, "ts1")),
0401 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 12),
0402 SUNXI_FUNCTION(0x0, "gpio_in"),
0403 SUNXI_FUNCTION(0x1, "gpio_out"),
0404 SUNXI_FUNCTION(0x2, "csi"),
0405 SUNXI_FUNCTION(0x3, "i2c2")),
0406 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 13),
0407 SUNXI_FUNCTION(0x0, "gpio_in"),
0408 SUNXI_FUNCTION(0x1, "gpio_out"),
0409 SUNXI_FUNCTION(0x2, "csi"),
0410 SUNXI_FUNCTION(0x3, "i2c2")),
0411 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 14),
0412 SUNXI_FUNCTION(0x0, "gpio_in"),
0413 SUNXI_FUNCTION(0x1, "gpio_out"),
0414 SUNXI_FUNCTION(0x3, "sim")),
0415 SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 15),
0416 SUNXI_FUNCTION(0x0, "gpio_in"),
0417 SUNXI_FUNCTION(0x1, "gpio_out"),
0418 SUNXI_FUNCTION(0x3, "sim")),
0419
0420 SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0),
0421 SUNXI_FUNCTION(0x0, "gpio_in"),
0422 SUNXI_FUNCTION(0x1, "gpio_out"),
0423 SUNXI_FUNCTION(0x2, "mmc0"),
0424 SUNXI_FUNCTION(0x3, "jtag"),
0425 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 0)),
0426 SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1),
0427 SUNXI_FUNCTION(0x0, "gpio_in"),
0428 SUNXI_FUNCTION(0x1, "gpio_out"),
0429 SUNXI_FUNCTION(0x2, "mmc0"),
0430 SUNXI_FUNCTION(0x3, "jtag"),
0431 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 1)),
0432 SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2),
0433 SUNXI_FUNCTION(0x0, "gpio_in"),
0434 SUNXI_FUNCTION(0x1, "gpio_out"),
0435 SUNXI_FUNCTION(0x2, "mmc0"),
0436 SUNXI_FUNCTION(0x3, "uart0"),
0437 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 2)),
0438 SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3),
0439 SUNXI_FUNCTION(0x0, "gpio_in"),
0440 SUNXI_FUNCTION(0x1, "gpio_out"),
0441 SUNXI_FUNCTION(0x2, "mmc0"),
0442 SUNXI_FUNCTION(0x3, "jtag"),
0443 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 3)),
0444 SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4),
0445 SUNXI_FUNCTION(0x0, "gpio_in"),
0446 SUNXI_FUNCTION(0x1, "gpio_out"),
0447 SUNXI_FUNCTION(0x2, "mmc0"),
0448 SUNXI_FUNCTION(0x3, "uart0"),
0449 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 4)),
0450 SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5),
0451 SUNXI_FUNCTION(0x0, "gpio_in"),
0452 SUNXI_FUNCTION(0x1, "gpio_out"),
0453 SUNXI_FUNCTION(0x2, "mmc0"),
0454 SUNXI_FUNCTION(0x3, "jtag"),
0455 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 5)),
0456 SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 6),
0457 SUNXI_FUNCTION(0x0, "gpio_in"),
0458 SUNXI_FUNCTION(0x1, "gpio_out"),
0459 SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 6)),
0460
0461 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0),
0462 SUNXI_FUNCTION(0x0, "gpio_in"),
0463 SUNXI_FUNCTION(0x1, "gpio_out"),
0464 SUNXI_FUNCTION(0x2, "mmc1"),
0465 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 0)),
0466 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1),
0467 SUNXI_FUNCTION(0x0, "gpio_in"),
0468 SUNXI_FUNCTION(0x1, "gpio_out"),
0469 SUNXI_FUNCTION(0x2, "mmc1"),
0470 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 1)),
0471 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2),
0472 SUNXI_FUNCTION(0x0, "gpio_in"),
0473 SUNXI_FUNCTION(0x1, "gpio_out"),
0474 SUNXI_FUNCTION(0x2, "mmc1"),
0475 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 2)),
0476 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3),
0477 SUNXI_FUNCTION(0x0, "gpio_in"),
0478 SUNXI_FUNCTION(0x1, "gpio_out"),
0479 SUNXI_FUNCTION(0x2, "mmc1"),
0480 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 3)),
0481 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4),
0482 SUNXI_FUNCTION(0x0, "gpio_in"),
0483 SUNXI_FUNCTION(0x1, "gpio_out"),
0484 SUNXI_FUNCTION(0x2, "mmc1"),
0485 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 4)),
0486 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),
0487 SUNXI_FUNCTION(0x0, "gpio_in"),
0488 SUNXI_FUNCTION(0x1, "gpio_out"),
0489 SUNXI_FUNCTION(0x2, "mmc1"),
0490 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 5)),
0491 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 6),
0492 SUNXI_FUNCTION(0x0, "gpio_in"),
0493 SUNXI_FUNCTION(0x1, "gpio_out"),
0494 SUNXI_FUNCTION(0x2, "uart1"),
0495 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 6)),
0496 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 7),
0497 SUNXI_FUNCTION(0x0, "gpio_in"),
0498 SUNXI_FUNCTION(0x1, "gpio_out"),
0499 SUNXI_FUNCTION(0x2, "uart1"),
0500 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 7)),
0501 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8),
0502 SUNXI_FUNCTION(0x0, "gpio_in"),
0503 SUNXI_FUNCTION(0x1, "gpio_out"),
0504 SUNXI_FUNCTION(0x2, "uart1"),
0505 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 8)),
0506 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9),
0507 SUNXI_FUNCTION(0x0, "gpio_in"),
0508 SUNXI_FUNCTION(0x1, "gpio_out"),
0509 SUNXI_FUNCTION(0x2, "uart1"),
0510 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 9)),
0511 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10),
0512 SUNXI_FUNCTION(0x0, "gpio_in"),
0513 SUNXI_FUNCTION(0x1, "gpio_out"),
0514 SUNXI_FUNCTION(0x2, "i2s1"),
0515 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 10)),
0516 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11),
0517 SUNXI_FUNCTION(0x0, "gpio_in"),
0518 SUNXI_FUNCTION(0x1, "gpio_out"),
0519 SUNXI_FUNCTION(0x2, "i2s1"),
0520 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 11)),
0521 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 12),
0522 SUNXI_FUNCTION(0x0, "gpio_in"),
0523 SUNXI_FUNCTION(0x1, "gpio_out"),
0524 SUNXI_FUNCTION(0x2, "i2s1"),
0525 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 12)),
0526 SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 13),
0527 SUNXI_FUNCTION(0x0, "gpio_in"),
0528 SUNXI_FUNCTION(0x1, "gpio_out"),
0529 SUNXI_FUNCTION(0x2, "i2s1"),
0530 SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 13)),
0531 };
0532
0533 static const struct sunxi_pinctrl_desc sun50i_h5_pinctrl_data_broken = {
0534 .pins = sun50i_h5_pins,
0535 .npins = ARRAY_SIZE(sun50i_h5_pins),
0536 .irq_banks = 2,
0537 .irq_read_needs_mux = true,
0538 .disable_strict_mode = true,
0539 };
0540
0541 static const struct sunxi_pinctrl_desc sun50i_h5_pinctrl_data = {
0542 .pins = sun50i_h5_pins,
0543 .npins = ARRAY_SIZE(sun50i_h5_pins),
0544 .irq_banks = 3,
0545 .irq_read_needs_mux = true,
0546 .disable_strict_mode = true,
0547 };
0548
0549 static int sun50i_h5_pinctrl_probe(struct platform_device *pdev)
0550 {
0551 int ret;
0552
0553 ret = platform_irq_count(pdev);
0554 if (ret < 0) {
0555 if (ret != -EPROBE_DEFER)
0556 dev_err(&pdev->dev, "Couldn't determine irq count: %pe\n",
0557 ERR_PTR(ret));
0558 return ret;
0559 }
0560
0561 switch (ret) {
0562 case 2:
0563 dev_warn(&pdev->dev,
0564 "Your device tree's pinctrl node is broken, which has no IRQ of PG bank routed.\n");
0565 dev_warn(&pdev->dev,
0566 "Please update the device tree, otherwise PG bank IRQ won't work.\n");
0567 return sunxi_pinctrl_init(pdev,
0568 &sun50i_h5_pinctrl_data_broken);
0569 case 3:
0570 return sunxi_pinctrl_init(pdev,
0571 &sun50i_h5_pinctrl_data);
0572 default:
0573 return -EINVAL;
0574 }
0575 }
0576
0577 static const struct of_device_id sun50i_h5_pinctrl_match[] = {
0578 { .compatible = "allwinner,sun50i-h5-pinctrl", },
0579 {}
0580 };
0581
0582 static struct platform_driver sun50i_h5_pinctrl_driver = {
0583 .probe = sun50i_h5_pinctrl_probe,
0584 .driver = {
0585 .name = "sun50i-h5-pinctrl",
0586 .of_match_table = sun50i_h5_pinctrl_match,
0587 },
0588 };
0589 builtin_platform_driver(sun50i_h5_pinctrl_driver);