0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/err.h>
0011 #include <linux/init.h>
0012 #include <linux/io.h>
0013 #include <linux/mfd/syscon.h>
0014 #include <linux/of.h>
0015 #include <linux/of_device.h>
0016 #include <linux/pinctrl/pinctrl.h>
0017 #include <linux/platform_device.h>
0018
0019 #include "pinctrl-mvebu.h"
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 enum {
0032 V_ARMADA_7K = BIT(0),
0033 V_ARMADA_8K_CPM = BIT(1),
0034 V_ARMADA_8K_CPS = BIT(2),
0035 V_CP115_STANDALONE = BIT(3),
0036 V_ARMADA_7K_8K_CPM = (V_ARMADA_7K | V_ARMADA_8K_CPM),
0037 V_ARMADA_7K_8K_CPS = (V_ARMADA_7K | V_ARMADA_8K_CPS),
0038 };
0039
0040 static struct mvebu_mpp_mode armada_cp110_mpp_modes[] = {
0041 MPP_MODE(0,
0042 MPP_FUNCTION(0, "gpio", NULL),
0043 MPP_FUNCTION(1, "dev", "ale1"),
0044 MPP_FUNCTION(2, "au", "i2smclk"),
0045 MPP_FUNCTION(3, "ge0", "rxd3"),
0046 MPP_FUNCTION(4, "tdm", "pclk"),
0047 MPP_FUNCTION(6, "ptp", "pulse"),
0048 MPP_FUNCTION(7, "mss_i2c", "sda"),
0049 MPP_FUNCTION(8, "uart0", "rxd"),
0050 MPP_FUNCTION(9, "sata0", "present_act"),
0051 MPP_FUNCTION(10, "ge", "mdio")),
0052 MPP_MODE(1,
0053 MPP_FUNCTION(0, "gpio", NULL),
0054 MPP_FUNCTION(1, "dev", "ale0"),
0055 MPP_FUNCTION(2, "au", "i2sdo_spdifo"),
0056 MPP_FUNCTION(3, "ge0", "rxd2"),
0057 MPP_FUNCTION(4, "tdm", "drx"),
0058 MPP_FUNCTION(6, "ptp", "clk"),
0059 MPP_FUNCTION(7, "mss_i2c", "sck"),
0060 MPP_FUNCTION(8, "uart0", "txd"),
0061 MPP_FUNCTION(9, "sata1", "present_act"),
0062 MPP_FUNCTION(10, "ge", "mdc")),
0063 MPP_MODE(2,
0064 MPP_FUNCTION(0, "gpio", NULL),
0065 MPP_FUNCTION(1, "dev", "ad15"),
0066 MPP_FUNCTION(2, "au", "i2sextclk"),
0067 MPP_FUNCTION(3, "ge0", "rxd1"),
0068 MPP_FUNCTION(4, "tdm", "dtx"),
0069 MPP_FUNCTION(5, "mss_uart", "rxd"),
0070 MPP_FUNCTION(6, "ptp", "pclk_out"),
0071 MPP_FUNCTION(7, "i2c1", "sck"),
0072 MPP_FUNCTION(8, "uart1", "rxd"),
0073 MPP_FUNCTION(9, "sata0", "present_act"),
0074 MPP_FUNCTION(10, "xg", "mdc")),
0075 MPP_MODE(3,
0076 MPP_FUNCTION(0, "gpio", NULL),
0077 MPP_FUNCTION(1, "dev", "ad14"),
0078 MPP_FUNCTION(2, "au", "i2slrclk"),
0079 MPP_FUNCTION(3, "ge0", "rxd0"),
0080 MPP_FUNCTION(4, "tdm", "fsync"),
0081 MPP_FUNCTION(5, "mss_uart", "txd"),
0082 MPP_FUNCTION(6, "pcie", "rstoutn"),
0083 MPP_FUNCTION(7, "i2c1", "sda"),
0084 MPP_FUNCTION(8, "uart1", "txd"),
0085 MPP_FUNCTION(9, "sata1", "present_act"),
0086 MPP_FUNCTION(10, "xg", "mdio")),
0087 MPP_MODE(4,
0088 MPP_FUNCTION(0, "gpio", NULL),
0089 MPP_FUNCTION(1, "dev", "ad13"),
0090 MPP_FUNCTION(2, "au", "i2sbclk"),
0091 MPP_FUNCTION(3, "ge0", "rxctl"),
0092 MPP_FUNCTION(4, "tdm", "rstn"),
0093 MPP_FUNCTION(5, "mss_uart", "rxd"),
0094 MPP_FUNCTION(6, "uart1", "cts"),
0095 MPP_FUNCTION(7, "pcie0", "clkreq"),
0096 MPP_FUNCTION(8, "uart3", "rxd"),
0097 MPP_FUNCTION(10, "ge", "mdc")),
0098 MPP_MODE(5,
0099 MPP_FUNCTION(0, "gpio", NULL),
0100 MPP_FUNCTION(1, "dev", "ad12"),
0101 MPP_FUNCTION(2, "au", "i2sdi"),
0102 MPP_FUNCTION(3, "ge0", "rxclk"),
0103 MPP_FUNCTION(4, "tdm", "intn"),
0104 MPP_FUNCTION(5, "mss_uart", "txd"),
0105 MPP_FUNCTION(6, "uart1", "rts"),
0106 MPP_FUNCTION(7, "pcie1", "clkreq"),
0107 MPP_FUNCTION(8, "uart3", "txd"),
0108 MPP_FUNCTION(10, "ge", "mdio")),
0109 MPP_MODE(6,
0110 MPP_FUNCTION(0, "gpio", NULL),
0111 MPP_FUNCTION(1, "dev", "ad11"),
0112 MPP_FUNCTION(3, "ge0", "txd3"),
0113 MPP_FUNCTION(4, "spi0", "csn2"),
0114 MPP_FUNCTION(5, "au", "i2sextclk"),
0115 MPP_FUNCTION(6, "sata1", "present_act"),
0116 MPP_FUNCTION(7, "pcie2", "clkreq"),
0117 MPP_FUNCTION(8, "uart0", "rxd"),
0118 MPP_FUNCTION(9, "ptp", "pulse")),
0119 MPP_MODE(7,
0120 MPP_FUNCTION(0, "gpio", NULL),
0121 MPP_FUNCTION(1, "dev", "ad10"),
0122 MPP_FUNCTION(3, "ge0", "txd2"),
0123 MPP_FUNCTION(4, "spi0", "csn1"),
0124 MPP_FUNCTION(5, "spi1", "csn1"),
0125 MPP_FUNCTION(6, "sata0", "present_act"),
0126 MPP_FUNCTION(7, "led", "data"),
0127 MPP_FUNCTION(8, "uart0", "txd"),
0128 MPP_FUNCTION(9, "ptp", "clk")),
0129 MPP_MODE(8,
0130 MPP_FUNCTION(0, "gpio", NULL),
0131 MPP_FUNCTION(1, "dev", "ad9"),
0132 MPP_FUNCTION(3, "ge0", "txd1"),
0133 MPP_FUNCTION(4, "spi0", "csn0"),
0134 MPP_FUNCTION(5, "spi1", "csn0"),
0135 MPP_FUNCTION(6, "uart0", "cts"),
0136 MPP_FUNCTION(7, "led", "stb"),
0137 MPP_FUNCTION(8, "uart2", "rxd"),
0138 MPP_FUNCTION(9, "ptp", "pclk_out"),
0139 MPP_FUNCTION(10, "synce1", "clk")),
0140 MPP_MODE(9,
0141 MPP_FUNCTION(0, "gpio", NULL),
0142 MPP_FUNCTION(1, "dev", "ad8"),
0143 MPP_FUNCTION(3, "ge0", "txd0"),
0144 MPP_FUNCTION(4, "spi0", "mosi"),
0145 MPP_FUNCTION(5, "spi1", "mosi"),
0146 MPP_FUNCTION(7, "pcie", "rstoutn"),
0147 MPP_FUNCTION(10, "synce2", "clk")),
0148 MPP_MODE(10,
0149 MPP_FUNCTION(0, "gpio", NULL),
0150 MPP_FUNCTION(1, "dev", "readyn"),
0151 MPP_FUNCTION(3, "ge0", "txctl"),
0152 MPP_FUNCTION(4, "spi0", "miso"),
0153 MPP_FUNCTION(5, "spi1", "miso"),
0154 MPP_FUNCTION(6, "uart0", "cts"),
0155 MPP_FUNCTION(7, "sata1", "present_act")),
0156 MPP_MODE(11,
0157 MPP_FUNCTION(0, "gpio", NULL),
0158 MPP_FUNCTION(1, "dev", "wen1"),
0159 MPP_FUNCTION(3, "ge0", "txclkout"),
0160 MPP_FUNCTION(4, "spi0", "clk"),
0161 MPP_FUNCTION(5, "spi1", "clk"),
0162 MPP_FUNCTION(6, "uart0", "rts"),
0163 MPP_FUNCTION(7, "led", "clk"),
0164 MPP_FUNCTION(8, "uart2", "txd"),
0165 MPP_FUNCTION(9, "sata0", "present_act")),
0166 MPP_MODE(12,
0167 MPP_FUNCTION(0, "gpio", NULL),
0168 MPP_FUNCTION(1, "dev", "clk_out"),
0169 MPP_FUNCTION(2, "nf", "rbn1"),
0170 MPP_FUNCTION(3, "spi1", "csn1"),
0171 MPP_FUNCTION(4, "ge0", "rxclk")),
0172 MPP_MODE(13,
0173 MPP_FUNCTION(0, "gpio", NULL),
0174 MPP_FUNCTION(1, "dev", "burstn"),
0175 MPP_FUNCTION(2, "nf", "rbn0"),
0176 MPP_FUNCTION(3, "spi1", "miso"),
0177 MPP_FUNCTION(4, "ge0", "rxctl"),
0178 MPP_FUNCTION(8, "mss_spi", "miso")),
0179 MPP_MODE(14,
0180 MPP_FUNCTION(0, "gpio", NULL),
0181 MPP_FUNCTION(1, "dev", "bootcsn"),
0182 MPP_FUNCTION(2, "dev", "csn0"),
0183 MPP_FUNCTION(3, "spi1", "csn0"),
0184 MPP_FUNCTION(4, "spi0", "csn3"),
0185 MPP_FUNCTION(5, "au", "i2sextclk"),
0186 MPP_FUNCTION(6, "spi0", "miso"),
0187 MPP_FUNCTION(7, "sata0", "present_act"),
0188 MPP_FUNCTION(8, "mss_spi", "csn")),
0189 MPP_MODE(15,
0190 MPP_FUNCTION(0, "gpio", NULL),
0191 MPP_FUNCTION(1, "dev", "ad7"),
0192 MPP_FUNCTION(3, "spi1", "mosi"),
0193 MPP_FUNCTION(6, "spi0", "mosi"),
0194 MPP_FUNCTION(8, "mss_spi", "mosi"),
0195 MPP_FUNCTION(11, "ptp", "pulse_cp2cp")),
0196 MPP_MODE(16,
0197 MPP_FUNCTION(0, "gpio", NULL),
0198 MPP_FUNCTION(1, "dev", "ad6"),
0199 MPP_FUNCTION(3, "spi1", "clk"),
0200 MPP_FUNCTION(8, "mss_spi", "clk")),
0201 MPP_MODE(17,
0202 MPP_FUNCTION(0, "gpio", NULL),
0203 MPP_FUNCTION(1, "dev", "ad5"),
0204 MPP_FUNCTION(4, "ge0", "txd3")),
0205 MPP_MODE(18,
0206 MPP_FUNCTION(0, "gpio", NULL),
0207 MPP_FUNCTION(1, "dev", "ad4"),
0208 MPP_FUNCTION(4, "ge0", "txd2"),
0209 MPP_FUNCTION(11, "ptp", "clk_cp2cp")),
0210 MPP_MODE(19,
0211 MPP_FUNCTION(0, "gpio", NULL),
0212 MPP_FUNCTION(1, "dev", "ad3"),
0213 MPP_FUNCTION(4, "ge0", "txd1"),
0214 MPP_FUNCTION(11, "wakeup", "out_cp2cp")),
0215 MPP_MODE(20,
0216 MPP_FUNCTION(0, "gpio", NULL),
0217 MPP_FUNCTION(1, "dev", "ad2"),
0218 MPP_FUNCTION(4, "ge0", "txd0")),
0219 MPP_MODE(21,
0220 MPP_FUNCTION(0, "gpio", NULL),
0221 MPP_FUNCTION(1, "dev", "ad1"),
0222 MPP_FUNCTION(4, "ge0", "txctl"),
0223 MPP_FUNCTION(11, "sei", "in_cp2cp")),
0224 MPP_MODE(22,
0225 MPP_FUNCTION(0, "gpio", NULL),
0226 MPP_FUNCTION(1, "dev", "ad0"),
0227 MPP_FUNCTION(4, "ge0", "txclkout"),
0228 MPP_FUNCTION(11, "wakeup", "in_cp2cp")),
0229 MPP_MODE(23,
0230 MPP_FUNCTION(0, "gpio", NULL),
0231 MPP_FUNCTION(1, "dev", "a1"),
0232 MPP_FUNCTION(5, "au", "i2smclk"),
0233 MPP_FUNCTION(11, "link", "rd_in_cp2cp")),
0234 MPP_MODE(24,
0235 MPP_FUNCTION(0, "gpio", NULL),
0236 MPP_FUNCTION(1, "dev", "a0"),
0237 MPP_FUNCTION(5, "au", "i2slrclk")),
0238 MPP_MODE(25,
0239 MPP_FUNCTION(0, "gpio", NULL),
0240 MPP_FUNCTION(1, "dev", "oen"),
0241 MPP_FUNCTION(5, "au", "i2sdo_spdifo")),
0242 MPP_MODE(26,
0243 MPP_FUNCTION(0, "gpio", NULL),
0244 MPP_FUNCTION(1, "dev", "wen0"),
0245 MPP_FUNCTION(5, "au", "i2sbclk")),
0246 MPP_MODE(27,
0247 MPP_FUNCTION(0, "gpio", NULL),
0248 MPP_FUNCTION(1, "dev", "csn0"),
0249 MPP_FUNCTION(2, "spi1", "miso"),
0250 MPP_FUNCTION(3, "mss_gpio4", NULL),
0251 MPP_FUNCTION(4, "ge0", "rxd3"),
0252 MPP_FUNCTION(5, "spi0", "csn4"),
0253 MPP_FUNCTION(8, "ge", "mdio"),
0254 MPP_FUNCTION(9, "sata0", "present_act"),
0255 MPP_FUNCTION(10, "uart0", "rts"),
0256 MPP_FUNCTION(11, "rei", "in_cp2cp")),
0257 MPP_MODE(28,
0258 MPP_FUNCTION(0, "gpio", NULL),
0259 MPP_FUNCTION(1, "dev", "csn1"),
0260 MPP_FUNCTION(2, "spi1", "csn0"),
0261 MPP_FUNCTION(3, "mss_gpio5", NULL),
0262 MPP_FUNCTION(4, "ge0", "rxd2"),
0263 MPP_FUNCTION(5, "spi0", "csn5"),
0264 MPP_FUNCTION(6, "pcie2", "clkreq"),
0265 MPP_FUNCTION(7, "ptp", "pulse"),
0266 MPP_FUNCTION(8, "ge", "mdc"),
0267 MPP_FUNCTION(9, "sata1", "present_act"),
0268 MPP_FUNCTION(10, "uart0", "cts"),
0269 MPP_FUNCTION(11, "led", "data")),
0270 MPP_MODE(29,
0271 MPP_FUNCTION(0, "gpio", NULL),
0272 MPP_FUNCTION(1, "dev", "csn2"),
0273 MPP_FUNCTION(2, "spi1", "mosi"),
0274 MPP_FUNCTION(3, "mss_gpio6", NULL),
0275 MPP_FUNCTION(4, "ge0", "rxd1"),
0276 MPP_FUNCTION(5, "spi0", "csn6"),
0277 MPP_FUNCTION(6, "pcie1", "clkreq"),
0278 MPP_FUNCTION(7, "ptp", "clk"),
0279 MPP_FUNCTION(8, "mss_i2c", "sda"),
0280 MPP_FUNCTION(9, "sata0", "present_act"),
0281 MPP_FUNCTION(10, "uart0", "rxd"),
0282 MPP_FUNCTION(11, "led", "stb")),
0283 MPP_MODE(30,
0284 MPP_FUNCTION(0, "gpio", NULL),
0285 MPP_FUNCTION(1, "dev", "csn3"),
0286 MPP_FUNCTION(2, "spi1", "clk"),
0287 MPP_FUNCTION(3, "mss_gpio7", NULL),
0288 MPP_FUNCTION(4, "ge0", "rxd0"),
0289 MPP_FUNCTION(5, "spi0", "csn7"),
0290 MPP_FUNCTION(6, "pcie0", "clkreq"),
0291 MPP_FUNCTION(7, "ptp", "pclk_out"),
0292 MPP_FUNCTION(8, "mss_i2c", "sck"),
0293 MPP_FUNCTION(9, "sata1", "present_act"),
0294 MPP_FUNCTION(10, "uart0", "txd"),
0295 MPP_FUNCTION(11, "led", "clk")),
0296 MPP_MODE(31,
0297 MPP_FUNCTION(0, "gpio", NULL),
0298 MPP_FUNCTION(1, "dev", "a2"),
0299 MPP_FUNCTION(3, "mss_gpio4", NULL),
0300 MPP_FUNCTION(6, "pcie", "rstoutn"),
0301 MPP_FUNCTION(8, "ge", "mdc")),
0302 MPP_MODE(32,
0303 MPP_FUNCTION(0, "gpio", NULL),
0304 MPP_FUNCTION(1, "mii", "col"),
0305 MPP_FUNCTION(2, "mii", "txerr"),
0306 MPP_FUNCTION(3, "mss_spi", "miso"),
0307 MPP_FUNCTION(4, "tdm", "drx"),
0308 MPP_FUNCTION(5, "au", "i2sextclk"),
0309 MPP_FUNCTION(6, "au", "i2sdi"),
0310 MPP_FUNCTION(7, "ge", "mdio"),
0311 MPP_FUNCTION(8, "sdio", "v18_en"),
0312 MPP_FUNCTION(9, "pcie1", "clkreq"),
0313 MPP_FUNCTION(10, "mss_gpio0", NULL)),
0314 MPP_MODE(33,
0315 MPP_FUNCTION(0, "gpio", NULL),
0316 MPP_FUNCTION(1, "mii", "txclk"),
0317 MPP_FUNCTION(2, "sdio", "pwr10"),
0318 MPP_FUNCTION(3, "mss_spi", "csn"),
0319 MPP_FUNCTION(4, "tdm", "fsync"),
0320 MPP_FUNCTION(5, "au", "i2smclk"),
0321 MPP_FUNCTION(6, "sdio", "bus_pwr"),
0322 MPP_FUNCTION(8, "xg", "mdio"),
0323 MPP_FUNCTION(9, "pcie2", "clkreq"),
0324 MPP_FUNCTION(10, "mss_gpio1", NULL)),
0325 MPP_MODE(34,
0326 MPP_FUNCTION(0, "gpio", NULL),
0327 MPP_FUNCTION(1, "mii", "rxerr"),
0328 MPP_FUNCTION(2, "sdio", "pwr11"),
0329 MPP_FUNCTION(3, "mss_spi", "mosi"),
0330 MPP_FUNCTION(4, "tdm", "dtx"),
0331 MPP_FUNCTION(5, "au", "i2slrclk"),
0332 MPP_FUNCTION(6, "sdio", "wr_protect"),
0333 MPP_FUNCTION(7, "ge", "mdc"),
0334 MPP_FUNCTION(9, "pcie0", "clkreq"),
0335 MPP_FUNCTION(10, "mss_gpio2", NULL)),
0336 MPP_MODE(35,
0337 MPP_FUNCTION(0, "gpio", NULL),
0338 MPP_FUNCTION(1, "sata1", "present_act"),
0339 MPP_FUNCTION(2, "i2c1", "sda"),
0340 MPP_FUNCTION(3, "mss_spi", "clk"),
0341 MPP_FUNCTION(4, "tdm", "pclk"),
0342 MPP_FUNCTION(5, "au", "i2sdo_spdifo"),
0343 MPP_FUNCTION(6, "sdio", "card_detect"),
0344 MPP_FUNCTION(7, "xg", "mdio"),
0345 MPP_FUNCTION(8, "ge", "mdio"),
0346 MPP_FUNCTION(9, "pcie", "rstoutn"),
0347 MPP_FUNCTION(10, "mss_gpio3", NULL)),
0348 MPP_MODE(36,
0349 MPP_FUNCTION(0, "gpio", NULL),
0350 MPP_FUNCTION(1, "synce2", "clk"),
0351 MPP_FUNCTION(2, "i2c1", "sck"),
0352 MPP_FUNCTION(3, "ptp", "clk"),
0353 MPP_FUNCTION(4, "synce1", "clk"),
0354 MPP_FUNCTION(5, "au", "i2sbclk"),
0355 MPP_FUNCTION(6, "sata0", "present_act"),
0356 MPP_FUNCTION(7, "xg", "mdc"),
0357 MPP_FUNCTION(8, "ge", "mdc"),
0358 MPP_FUNCTION(9, "pcie2", "clkreq"),
0359 MPP_FUNCTION(10, "mss_gpio5", NULL)),
0360 MPP_MODE(37,
0361 MPP_FUNCTION(0, "gpio", NULL),
0362 MPP_FUNCTION(1, "uart2", "rxd"),
0363 MPP_FUNCTION(2, "i2c0", "sck"),
0364 MPP_FUNCTION(3, "ptp", "pclk_out"),
0365 MPP_FUNCTION(4, "tdm", "intn"),
0366 MPP_FUNCTION(5, "mss_i2c", "sck"),
0367 MPP_FUNCTION(6, "sata1", "present_act"),
0368 MPP_FUNCTION(7, "ge", "mdc"),
0369 MPP_FUNCTION(8, "xg", "mdc"),
0370 MPP_FUNCTION(9, "pcie1", "clkreq"),
0371 MPP_FUNCTION(10, "mss_gpio6", NULL),
0372 MPP_FUNCTION(11, "link", "rd_out_cp2cp")),
0373 MPP_MODE(38,
0374 MPP_FUNCTION(0, "gpio", NULL),
0375 MPP_FUNCTION(1, "uart2", "txd"),
0376 MPP_FUNCTION(2, "i2c0", "sda"),
0377 MPP_FUNCTION(3, "ptp", "pulse"),
0378 MPP_FUNCTION(4, "tdm", "rstn"),
0379 MPP_FUNCTION(5, "mss_i2c", "sda"),
0380 MPP_FUNCTION(6, "sata0", "present_act"),
0381 MPP_FUNCTION(7, "ge", "mdio"),
0382 MPP_FUNCTION(8, "xg", "mdio"),
0383 MPP_FUNCTION(9, "au", "i2sextclk"),
0384 MPP_FUNCTION(10, "mss_gpio7", NULL),
0385 MPP_FUNCTION(11, "ptp", "pulse_cp2cp")),
0386 MPP_MODE(39,
0387 MPP_FUNCTION(0, "gpio", NULL),
0388 MPP_FUNCTION(1, "sdio", "wr_protect"),
0389 MPP_FUNCTION(4, "au", "i2sbclk"),
0390 MPP_FUNCTION(5, "ptp", "clk"),
0391 MPP_FUNCTION(6, "spi0", "csn1"),
0392 MPP_FUNCTION(9, "sata1", "present_act"),
0393 MPP_FUNCTION(10, "mss_gpio0", NULL)),
0394 MPP_MODE(40,
0395 MPP_FUNCTION(0, "gpio", NULL),
0396 MPP_FUNCTION(1, "sdio", "pwr11"),
0397 MPP_FUNCTION(2, "synce1", "clk"),
0398 MPP_FUNCTION(3, "mss_i2c", "sda"),
0399 MPP_FUNCTION(4, "au", "i2sdo_spdifo"),
0400 MPP_FUNCTION(5, "ptp", "pclk_out"),
0401 MPP_FUNCTION(6, "spi0", "clk"),
0402 MPP_FUNCTION(7, "uart1", "txd"),
0403 MPP_FUNCTION(8, "ge", "mdio"),
0404 MPP_FUNCTION(9, "sata0", "present_act"),
0405 MPP_FUNCTION(10, "mss_gpio1", NULL)),
0406 MPP_MODE(41,
0407 MPP_FUNCTION(0, "gpio", NULL),
0408 MPP_FUNCTION(1, "sdio", "pwr10"),
0409 MPP_FUNCTION(2, "sdio", "bus_pwr"),
0410 MPP_FUNCTION(3, "mss_i2c", "sck"),
0411 MPP_FUNCTION(4, "au", "i2slrclk"),
0412 MPP_FUNCTION(5, "ptp", "pulse"),
0413 MPP_FUNCTION(6, "spi0", "mosi"),
0414 MPP_FUNCTION(7, "uart1", "rxd"),
0415 MPP_FUNCTION(8, "ge", "mdc"),
0416 MPP_FUNCTION(9, "sata1", "present_act"),
0417 MPP_FUNCTION(10, "mss_gpio2", NULL),
0418 MPP_FUNCTION(11, "rei", "out_cp2cp")),
0419 MPP_MODE(42,
0420 MPP_FUNCTION(0, "gpio", NULL),
0421 MPP_FUNCTION(1, "sdio", "v18_en"),
0422 MPP_FUNCTION(2, "sdio", "wr_protect"),
0423 MPP_FUNCTION(3, "synce2", "clk"),
0424 MPP_FUNCTION(4, "au", "i2smclk"),
0425 MPP_FUNCTION(5, "mss_uart", "txd"),
0426 MPP_FUNCTION(6, "spi0", "miso"),
0427 MPP_FUNCTION(7, "uart1", "cts"),
0428 MPP_FUNCTION(8, "xg", "mdc"),
0429 MPP_FUNCTION(9, "sata0", "present_act"),
0430 MPP_FUNCTION(10, "mss_gpio4", NULL)),
0431 MPP_MODE(43,
0432 MPP_FUNCTION(0, "gpio", NULL),
0433 MPP_FUNCTION(1, "sdio", "card_detect"),
0434 MPP_FUNCTION(3, "synce1", "clk"),
0435 MPP_FUNCTION(4, "au", "i2sextclk"),
0436 MPP_FUNCTION(5, "mss_uart", "rxd"),
0437 MPP_FUNCTION(6, "spi0", "csn0"),
0438 MPP_FUNCTION(7, "uart1", "rts"),
0439 MPP_FUNCTION(8, "xg", "mdio"),
0440 MPP_FUNCTION(9, "sata1", "present_act"),
0441 MPP_FUNCTION(10, "mss_gpio5", NULL),
0442 MPP_FUNCTION(11, "wakeup", "out_cp2cp")),
0443 MPP_MODE(44,
0444 MPP_FUNCTION(0, "gpio", NULL),
0445 MPP_FUNCTION(1, "ge1", "txd2"),
0446 MPP_FUNCTION(7, "uart0", "rts"),
0447 MPP_FUNCTION(11, "ptp", "clk_cp2cp")),
0448 MPP_MODE(45,
0449 MPP_FUNCTION(0, "gpio", NULL),
0450 MPP_FUNCTION(1, "ge1", "txd3"),
0451 MPP_FUNCTION(7, "uart0", "txd"),
0452 MPP_FUNCTION(9, "pcie", "rstoutn")),
0453 MPP_MODE(46,
0454 MPP_FUNCTION(0, "gpio", NULL),
0455 MPP_FUNCTION(1, "ge1", "txd1"),
0456 MPP_FUNCTION(7, "uart1", "rts")),
0457 MPP_MODE(47,
0458 MPP_FUNCTION(0, "gpio", NULL),
0459 MPP_FUNCTION(1, "ge1", "txd0"),
0460 MPP_FUNCTION(5, "spi1", "clk"),
0461 MPP_FUNCTION(7, "uart1", "txd"),
0462 MPP_FUNCTION(8, "ge", "mdc")),
0463 MPP_MODE(48,
0464 MPP_FUNCTION(0, "gpio", NULL),
0465 MPP_FUNCTION(1, "ge1", "txctl_txen"),
0466 MPP_FUNCTION(5, "spi1", "mosi"),
0467 MPP_FUNCTION(8, "xg", "mdc"),
0468 MPP_FUNCTION(11, "wakeup", "in_cp2cp")),
0469 MPP_MODE(49,
0470 MPP_FUNCTION(0, "gpio", NULL),
0471 MPP_FUNCTION(1, "ge1", "txclkout"),
0472 MPP_FUNCTION(2, "mii", "crs"),
0473 MPP_FUNCTION(5, "spi1", "miso"),
0474 MPP_FUNCTION(7, "uart1", "rxd"),
0475 MPP_FUNCTION(8, "ge", "mdio"),
0476 MPP_FUNCTION(9, "pcie0", "clkreq"),
0477 MPP_FUNCTION(10, "sdio", "v18_en"),
0478 MPP_FUNCTION(11, "sei", "out_cp2cp")),
0479 MPP_MODE(50,
0480 MPP_FUNCTION(0, "gpio", NULL),
0481 MPP_FUNCTION(1, "ge1", "rxclk"),
0482 MPP_FUNCTION(2, "mss_i2c", "sda"),
0483 MPP_FUNCTION(5, "spi1", "csn0"),
0484 MPP_FUNCTION(6, "uart2", "txd"),
0485 MPP_FUNCTION(7, "uart0", "rxd"),
0486 MPP_FUNCTION(8, "xg", "mdio"),
0487 MPP_FUNCTION(10, "sdio", "pwr11")),
0488 MPP_MODE(51,
0489 MPP_FUNCTION(0, "gpio", NULL),
0490 MPP_FUNCTION(1, "ge1", "rxd0"),
0491 MPP_FUNCTION(2, "mss_i2c", "sck"),
0492 MPP_FUNCTION(5, "spi1", "csn1"),
0493 MPP_FUNCTION(6, "uart2", "rxd"),
0494 MPP_FUNCTION(7, "uart0", "cts"),
0495 MPP_FUNCTION(10, "sdio", "pwr10")),
0496 MPP_MODE(52,
0497 MPP_FUNCTION(0, "gpio", NULL),
0498 MPP_FUNCTION(1, "ge1", "rxd1"),
0499 MPP_FUNCTION(2, "synce1", "clk"),
0500 MPP_FUNCTION(4, "synce2", "clk"),
0501 MPP_FUNCTION(5, "spi1", "csn2"),
0502 MPP_FUNCTION(7, "uart1", "cts"),
0503 MPP_FUNCTION(8, "led", "clk"),
0504 MPP_FUNCTION(9, "pcie", "rstoutn"),
0505 MPP_FUNCTION(10, "pcie0", "clkreq")),
0506 MPP_MODE(53,
0507 MPP_FUNCTION(0, "gpio", NULL),
0508 MPP_FUNCTION(1, "ge1", "rxd2"),
0509 MPP_FUNCTION(3, "ptp", "clk"),
0510 MPP_FUNCTION(5, "spi1", "csn3"),
0511 MPP_FUNCTION(7, "uart1", "rxd"),
0512 MPP_FUNCTION(8, "led", "stb"),
0513 MPP_FUNCTION(11, "sdio", "led")),
0514 MPP_MODE(54,
0515 MPP_FUNCTION(0, "gpio", NULL),
0516 MPP_FUNCTION(1, "ge1", "rxd3"),
0517 MPP_FUNCTION(2, "synce2", "clk"),
0518 MPP_FUNCTION(3, "ptp", "pclk_out"),
0519 MPP_FUNCTION(4, "synce1", "clk"),
0520 MPP_FUNCTION(8, "led", "data"),
0521 MPP_FUNCTION(10, "sdio", "hw_rst"),
0522 MPP_FUNCTION(11, "sdio_wp", "wr_protect")),
0523 MPP_MODE(55,
0524 MPP_FUNCTION(0, "gpio", NULL),
0525 MPP_FUNCTION(1, "ge1", "rxctl_rxdv"),
0526 MPP_FUNCTION(3, "ptp", "pulse"),
0527 MPP_FUNCTION(10, "sdio", "led"),
0528 MPP_FUNCTION(11, "sdio_cd", "card_detect")),
0529 MPP_MODE(56,
0530 MPP_FUNCTION(0, "gpio", NULL),
0531 MPP_FUNCTION(4, "tdm", "drx"),
0532 MPP_FUNCTION(5, "au", "i2sdo_spdifo"),
0533 MPP_FUNCTION(6, "spi0", "clk"),
0534 MPP_FUNCTION(7, "uart1", "rxd"),
0535 MPP_FUNCTION(9, "sata1", "present_act"),
0536 MPP_FUNCTION(14, "sdio", "clk")),
0537 MPP_MODE(57,
0538 MPP_FUNCTION(0, "gpio", NULL),
0539 MPP_FUNCTION(2, "mss_i2c", "sda"),
0540 MPP_FUNCTION(3, "ptp", "pclk_out"),
0541 MPP_FUNCTION(4, "tdm", "intn"),
0542 MPP_FUNCTION(5, "au", "i2sbclk"),
0543 MPP_FUNCTION(6, "spi0", "mosi"),
0544 MPP_FUNCTION(7, "uart1", "txd"),
0545 MPP_FUNCTION(9, "sata0", "present_act"),
0546 MPP_FUNCTION(14, "sdio", "cmd")),
0547 MPP_MODE(58,
0548 MPP_FUNCTION(0, "gpio", NULL),
0549 MPP_FUNCTION(2, "mss_i2c", "sck"),
0550 MPP_FUNCTION(3, "ptp", "clk"),
0551 MPP_FUNCTION(4, "tdm", "rstn"),
0552 MPP_FUNCTION(5, "au", "i2sdi"),
0553 MPP_FUNCTION(6, "spi0", "miso"),
0554 MPP_FUNCTION(7, "uart1", "cts"),
0555 MPP_FUNCTION(8, "led", "clk"),
0556 MPP_FUNCTION(14, "sdio", "d0")),
0557 MPP_MODE(59,
0558 MPP_FUNCTION(0, "gpio", NULL),
0559 MPP_FUNCTION(1, "mss_gpio7", NULL),
0560 MPP_FUNCTION(2, "synce2", "clk"),
0561 MPP_FUNCTION(4, "tdm", "fsync"),
0562 MPP_FUNCTION(5, "au", "i2slrclk"),
0563 MPP_FUNCTION(6, "spi0", "csn0"),
0564 MPP_FUNCTION(7, "uart0", "cts"),
0565 MPP_FUNCTION(8, "led", "stb"),
0566 MPP_FUNCTION(9, "uart1", "txd"),
0567 MPP_FUNCTION(14, "sdio", "d1")),
0568 MPP_MODE(60,
0569 MPP_FUNCTION(0, "gpio", NULL),
0570 MPP_FUNCTION(1, "mss_gpio6", NULL),
0571 MPP_FUNCTION(3, "ptp", "pulse"),
0572 MPP_FUNCTION(4, "tdm", "dtx"),
0573 MPP_FUNCTION(5, "au", "i2smclk"),
0574 MPP_FUNCTION(6, "spi0", "csn1"),
0575 MPP_FUNCTION(7, "uart0", "rts"),
0576 MPP_FUNCTION(8, "led", "data"),
0577 MPP_FUNCTION(9, "uart1", "rxd"),
0578 MPP_FUNCTION(14, "sdio", "d2")),
0579 MPP_MODE(61,
0580 MPP_FUNCTION(0, "gpio", NULL),
0581 MPP_FUNCTION(1, "mss_gpio5", NULL),
0582 MPP_FUNCTION(3, "ptp", "clk"),
0583 MPP_FUNCTION(4, "tdm", "pclk"),
0584 MPP_FUNCTION(5, "au", "i2sextclk"),
0585 MPP_FUNCTION(6, "spi0", "csn2"),
0586 MPP_FUNCTION(7, "uart0", "txd"),
0587 MPP_FUNCTION(8, "uart2", "txd"),
0588 MPP_FUNCTION(9, "sata1", "present_act"),
0589 MPP_FUNCTION(10, "ge", "mdio"),
0590 MPP_FUNCTION(14, "sdio", "d3")),
0591 MPP_MODE(62,
0592 MPP_FUNCTION(0, "gpio", NULL),
0593 MPP_FUNCTION(1, "mss_gpio4", NULL),
0594 MPP_FUNCTION(2, "synce1", "clk"),
0595 MPP_FUNCTION(3, "ptp", "pclk_out"),
0596 MPP_FUNCTION(5, "sata1", "present_act"),
0597 MPP_FUNCTION(6, "spi0", "csn3"),
0598 MPP_FUNCTION(7, "uart0", "rxd"),
0599 MPP_FUNCTION(8, "uart2", "rxd"),
0600 MPP_FUNCTION(9, "sata0", "present_act"),
0601 MPP_FUNCTION(10, "ge", "mdc"),
0602 MPP_FUNCTION(14, "sdio", "ds")),
0603 };
0604
0605 static const struct of_device_id armada_cp110_pinctrl_of_match[] = {
0606 {
0607 .compatible = "marvell,armada-7k-pinctrl",
0608 .data = (void *) V_ARMADA_7K,
0609 },
0610 {
0611 .compatible = "marvell,armada-8k-cpm-pinctrl",
0612 .data = (void *) V_ARMADA_8K_CPM,
0613 },
0614 {
0615 .compatible = "marvell,armada-8k-cps-pinctrl",
0616 .data = (void *) V_ARMADA_8K_CPS,
0617 },
0618 {
0619 .compatible = "marvell,cp115-standalone-pinctrl",
0620 .data = (void *) V_CP115_STANDALONE,
0621 },
0622 { },
0623 };
0624
0625 static const struct mvebu_mpp_ctrl armada_cp110_mpp_controls[] = {
0626 MPP_FUNC_CTRL(0, 62, NULL, mvebu_regmap_mpp_ctrl),
0627 };
0628
0629 static void mvebu_pinctrl_assign_variant(struct mvebu_mpp_mode *m,
0630 u8 variant)
0631 {
0632 struct mvebu_mpp_ctrl_setting *s;
0633
0634 for (s = m->settings ; s->name ; s++)
0635 s->variant = variant;
0636 }
0637
0638 static int armada_cp110_pinctrl_probe(struct platform_device *pdev)
0639 {
0640 struct mvebu_pinctrl_soc_info *soc;
0641 const struct of_device_id *match =
0642 of_match_device(armada_cp110_pinctrl_of_match, &pdev->dev);
0643 int i;
0644
0645 if (!pdev->dev.parent)
0646 return -ENODEV;
0647
0648 soc = devm_kzalloc(&pdev->dev,
0649 sizeof(struct mvebu_pinctrl_soc_info), GFP_KERNEL);
0650 if (!soc)
0651 return -ENOMEM;
0652
0653 soc->variant = (unsigned long) match->data & 0xff;
0654 soc->controls = armada_cp110_mpp_controls;
0655 soc->ncontrols = ARRAY_SIZE(armada_cp110_mpp_controls);
0656 soc->modes = armada_cp110_mpp_modes;
0657 soc->nmodes = ARRAY_SIZE(armada_cp110_mpp_modes);
0658 for (i = 0; i < ARRAY_SIZE(armada_cp110_mpp_modes); i++) {
0659 struct mvebu_mpp_mode *m = &armada_cp110_mpp_modes[i];
0660
0661 switch (i) {
0662 case 0 ... 31:
0663 mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPS |
0664 V_CP115_STANDALONE));
0665 break;
0666 case 32 ... 38:
0667 mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPM |
0668 V_CP115_STANDALONE));
0669 break;
0670 case 39 ... 43:
0671 mvebu_pinctrl_assign_variant(m, (V_ARMADA_8K_CPM |
0672 V_CP115_STANDALONE));
0673 break;
0674 case 44 ... 62:
0675 mvebu_pinctrl_assign_variant(m, (V_ARMADA_7K_8K_CPM |
0676 V_CP115_STANDALONE));
0677 break;
0678 }
0679 }
0680 pdev->dev.platform_data = soc;
0681
0682 return mvebu_pinctrl_simple_regmap_probe(pdev, pdev->dev.parent, 0);
0683 }
0684
0685 static struct platform_driver armada_cp110_pinctrl_driver = {
0686 .driver = {
0687 .name = "armada-cp110-pinctrl",
0688 .of_match_table = of_match_ptr(armada_cp110_pinctrl_of_match),
0689 },
0690 .probe = armada_cp110_pinctrl_probe,
0691 };
0692
0693 builtin_platform_driver(armada_cp110_pinctrl_driver);