0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/io.h>
0009 #include <linux/init.h>
0010 #include <linux/pinctrl/pinctrl.h>
0011 #include <linux/platform_device.h>
0012 #include <linux/slab.h>
0013
0014 #include "pinctrl-wmt.h"
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 static const struct wmt_pinctrl_bank_registers wm8650_banks[] = {
0025 WMT_PINCTRL_BANK(0x40, 0x80, 0xC0, 0x00, 0x480, 0x4C0),
0026 WMT_PINCTRL_BANK(0x44, 0x84, 0xC4, 0x04, 0x484, 0x4C4),
0027 WMT_PINCTRL_BANK(0x48, 0x88, 0xC8, 0x08, 0x488, 0x4C8),
0028 WMT_PINCTRL_BANK(0x4C, 0x8C, 0xCC, 0x0C, 0x48C, 0x4CC),
0029 WMT_PINCTRL_BANK(0x50, 0x90, 0xD0, 0x10, 0x490, 0x4D0),
0030 WMT_PINCTRL_BANK(0x54, 0x94, 0xD4, 0x14, 0x494, 0x4D4),
0031 WMT_PINCTRL_BANK(0x58, 0x98, 0xD8, 0x18, 0x498, 0x4D8),
0032 WMT_PINCTRL_BANK(0x5C, 0x9C, 0xDC, 0x1C, 0x49C, 0x4DC),
0033 };
0034
0035
0036 #define WMT_PIN_EXTGPIO0 WMT_PIN(0, 0)
0037 #define WMT_PIN_EXTGPIO1 WMT_PIN(0, 1)
0038 #define WMT_PIN_EXTGPIO2 WMT_PIN(0, 2)
0039 #define WMT_PIN_EXTGPIO3 WMT_PIN(0, 3)
0040 #define WMT_PIN_EXTGPIO4 WMT_PIN(0, 4)
0041 #define WMT_PIN_EXTGPIO5 WMT_PIN(0, 5)
0042 #define WMT_PIN_EXTGPIO6 WMT_PIN(0, 6)
0043 #define WMT_PIN_EXTGPIO7 WMT_PIN(0, 7)
0044 #define WMT_PIN_WAKEUP0 WMT_PIN(0, 16)
0045 #define WMT_PIN_WAKEUP1 WMT_PIN(0, 17)
0046 #define WMT_PIN_SUSGPIO0 WMT_PIN(0, 21)
0047 #define WMT_PIN_SD0CD WMT_PIN(0, 28)
0048 #define WMT_PIN_SD1CD WMT_PIN(0, 29)
0049 #define WMT_PIN_VDOUT0 WMT_PIN(1, 0)
0050 #define WMT_PIN_VDOUT1 WMT_PIN(1, 1)
0051 #define WMT_PIN_VDOUT2 WMT_PIN(1, 2)
0052 #define WMT_PIN_VDOUT3 WMT_PIN(1, 3)
0053 #define WMT_PIN_VDOUT4 WMT_PIN(1, 4)
0054 #define WMT_PIN_VDOUT5 WMT_PIN(1, 5)
0055 #define WMT_PIN_VDOUT6 WMT_PIN(1, 6)
0056 #define WMT_PIN_VDOUT7 WMT_PIN(1, 7)
0057 #define WMT_PIN_VDOUT8 WMT_PIN(1, 8)
0058 #define WMT_PIN_VDOUT9 WMT_PIN(1, 9)
0059 #define WMT_PIN_VDOUT10 WMT_PIN(1, 10)
0060 #define WMT_PIN_VDOUT11 WMT_PIN(1, 11)
0061 #define WMT_PIN_VDOUT12 WMT_PIN(1, 12)
0062 #define WMT_PIN_VDOUT13 WMT_PIN(1, 13)
0063 #define WMT_PIN_VDOUT14 WMT_PIN(1, 14)
0064 #define WMT_PIN_VDOUT15 WMT_PIN(1, 15)
0065 #define WMT_PIN_VDOUT16 WMT_PIN(1, 16)
0066 #define WMT_PIN_VDOUT17 WMT_PIN(1, 17)
0067 #define WMT_PIN_VDOUT18 WMT_PIN(1, 18)
0068 #define WMT_PIN_VDOUT19 WMT_PIN(1, 19)
0069 #define WMT_PIN_VDOUT20 WMT_PIN(1, 20)
0070 #define WMT_PIN_VDOUT21 WMT_PIN(1, 21)
0071 #define WMT_PIN_VDOUT22 WMT_PIN(1, 22)
0072 #define WMT_PIN_VDOUT23 WMT_PIN(1, 23)
0073 #define WMT_PIN_VDIN0 WMT_PIN(2, 0)
0074 #define WMT_PIN_VDIN1 WMT_PIN(2, 1)
0075 #define WMT_PIN_VDIN2 WMT_PIN(2, 2)
0076 #define WMT_PIN_VDIN3 WMT_PIN(2, 3)
0077 #define WMT_PIN_VDIN4 WMT_PIN(2, 4)
0078 #define WMT_PIN_VDIN5 WMT_PIN(2, 5)
0079 #define WMT_PIN_VDIN6 WMT_PIN(2, 6)
0080 #define WMT_PIN_VDIN7 WMT_PIN(2, 7)
0081 #define WMT_PIN_I2C1SCL WMT_PIN(2, 12)
0082 #define WMT_PIN_I2C1SDA WMT_PIN(2, 13)
0083 #define WMT_PIN_SPI0MOSI WMT_PIN(2, 24)
0084 #define WMT_PIN_SPI0MISO WMT_PIN(2, 25)
0085 #define WMT_PIN_SPI0SS0 WMT_PIN(2, 26)
0086 #define WMT_PIN_SPI0CLK WMT_PIN(2, 27)
0087 #define WMT_PIN_SD0DATA0 WMT_PIN(3, 8)
0088 #define WMT_PIN_SD0DATA1 WMT_PIN(3, 9)
0089 #define WMT_PIN_SD0DATA2 WMT_PIN(3, 10)
0090 #define WMT_PIN_SD0DATA3 WMT_PIN(3, 11)
0091 #define WMT_PIN_SD0CLK WMT_PIN(3, 12)
0092 #define WMT_PIN_SD0WP WMT_PIN(3, 13)
0093 #define WMT_PIN_SD0CMD WMT_PIN(3, 14)
0094 #define WMT_PIN_SD1DATA0 WMT_PIN(3, 24)
0095 #define WMT_PIN_SD1DATA1 WMT_PIN(3, 25)
0096 #define WMT_PIN_SD1DATA2 WMT_PIN(3, 26)
0097 #define WMT_PIN_SD1DATA3 WMT_PIN(3, 27)
0098 #define WMT_PIN_SD1DATA4 WMT_PIN(3, 28)
0099 #define WMT_PIN_SD1DATA5 WMT_PIN(3, 29)
0100 #define WMT_PIN_SD1DATA6 WMT_PIN(3, 30)
0101 #define WMT_PIN_SD1DATA7 WMT_PIN(3, 31)
0102 #define WMT_PIN_I2C0SCL WMT_PIN(5, 8)
0103 #define WMT_PIN_I2C0SDA WMT_PIN(5, 9)
0104 #define WMT_PIN_UART0RTS WMT_PIN(5, 16)
0105 #define WMT_PIN_UART0TXD WMT_PIN(5, 17)
0106 #define WMT_PIN_UART0CTS WMT_PIN(5, 18)
0107 #define WMT_PIN_UART0RXD WMT_PIN(5, 19)
0108 #define WMT_PIN_UART1RTS WMT_PIN(5, 20)
0109 #define WMT_PIN_UART1TXD WMT_PIN(5, 21)
0110 #define WMT_PIN_UART1CTS WMT_PIN(5, 22)
0111 #define WMT_PIN_UART1RXD WMT_PIN(5, 23)
0112 #define WMT_PIN_UART2RTS WMT_PIN(5, 24)
0113 #define WMT_PIN_UART2TXD WMT_PIN(5, 25)
0114 #define WMT_PIN_UART2CTS WMT_PIN(5, 26)
0115 #define WMT_PIN_UART2RXD WMT_PIN(5, 27)
0116 #define WMT_PIN_UART3RTS WMT_PIN(5, 28)
0117 #define WMT_PIN_UART3TXD WMT_PIN(5, 29)
0118 #define WMT_PIN_UART3CTS WMT_PIN(5, 30)
0119 #define WMT_PIN_UART3RXD WMT_PIN(5, 31)
0120 #define WMT_PIN_KPADROW0 WMT_PIN(6, 16)
0121 #define WMT_PIN_KPADROW1 WMT_PIN(6, 17)
0122 #define WMT_PIN_KPADCOL0 WMT_PIN(6, 18)
0123 #define WMT_PIN_KPADCOL1 WMT_PIN(6, 19)
0124 #define WMT_PIN_SD1CLK WMT_PIN(7, 0)
0125 #define WMT_PIN_SD1CMD WMT_PIN(7, 1)
0126 #define WMT_PIN_SD1WP WMT_PIN(7, 13)
0127
0128 static const struct pinctrl_pin_desc wm8650_pins[] = {
0129 PINCTRL_PIN(WMT_PIN_EXTGPIO0, "extgpio0"),
0130 PINCTRL_PIN(WMT_PIN_EXTGPIO1, "extgpio1"),
0131 PINCTRL_PIN(WMT_PIN_EXTGPIO2, "extgpio2"),
0132 PINCTRL_PIN(WMT_PIN_EXTGPIO3, "extgpio3"),
0133 PINCTRL_PIN(WMT_PIN_EXTGPIO4, "extgpio4"),
0134 PINCTRL_PIN(WMT_PIN_EXTGPIO5, "extgpio5"),
0135 PINCTRL_PIN(WMT_PIN_EXTGPIO6, "extgpio6"),
0136 PINCTRL_PIN(WMT_PIN_EXTGPIO7, "extgpio7"),
0137 PINCTRL_PIN(WMT_PIN_WAKEUP0, "wakeup0"),
0138 PINCTRL_PIN(WMT_PIN_WAKEUP1, "wakeup1"),
0139 PINCTRL_PIN(WMT_PIN_SUSGPIO0, "susgpio0"),
0140 PINCTRL_PIN(WMT_PIN_SD0CD, "sd0_cd"),
0141 PINCTRL_PIN(WMT_PIN_SD1CD, "sd1_cd"),
0142 PINCTRL_PIN(WMT_PIN_VDOUT0, "vdout0"),
0143 PINCTRL_PIN(WMT_PIN_VDOUT1, "vdout1"),
0144 PINCTRL_PIN(WMT_PIN_VDOUT2, "vdout2"),
0145 PINCTRL_PIN(WMT_PIN_VDOUT3, "vdout3"),
0146 PINCTRL_PIN(WMT_PIN_VDOUT4, "vdout4"),
0147 PINCTRL_PIN(WMT_PIN_VDOUT5, "vdout5"),
0148 PINCTRL_PIN(WMT_PIN_VDOUT6, "vdout6"),
0149 PINCTRL_PIN(WMT_PIN_VDOUT7, "vdout7"),
0150 PINCTRL_PIN(WMT_PIN_VDOUT8, "vdout8"),
0151 PINCTRL_PIN(WMT_PIN_VDOUT9, "vdout9"),
0152 PINCTRL_PIN(WMT_PIN_VDOUT10, "vdout10"),
0153 PINCTRL_PIN(WMT_PIN_VDOUT11, "vdout11"),
0154 PINCTRL_PIN(WMT_PIN_VDOUT12, "vdout12"),
0155 PINCTRL_PIN(WMT_PIN_VDOUT13, "vdout13"),
0156 PINCTRL_PIN(WMT_PIN_VDOUT14, "vdout14"),
0157 PINCTRL_PIN(WMT_PIN_VDOUT15, "vdout15"),
0158 PINCTRL_PIN(WMT_PIN_VDOUT16, "vdout16"),
0159 PINCTRL_PIN(WMT_PIN_VDOUT17, "vdout17"),
0160 PINCTRL_PIN(WMT_PIN_VDOUT18, "vdout18"),
0161 PINCTRL_PIN(WMT_PIN_VDOUT19, "vdout19"),
0162 PINCTRL_PIN(WMT_PIN_VDOUT20, "vdout20"),
0163 PINCTRL_PIN(WMT_PIN_VDOUT21, "vdout21"),
0164 PINCTRL_PIN(WMT_PIN_VDOUT22, "vdout22"),
0165 PINCTRL_PIN(WMT_PIN_VDOUT23, "vdout23"),
0166 PINCTRL_PIN(WMT_PIN_VDIN0, "vdin0"),
0167 PINCTRL_PIN(WMT_PIN_VDIN1, "vdin1"),
0168 PINCTRL_PIN(WMT_PIN_VDIN2, "vdin2"),
0169 PINCTRL_PIN(WMT_PIN_VDIN3, "vdin3"),
0170 PINCTRL_PIN(WMT_PIN_VDIN4, "vdin4"),
0171 PINCTRL_PIN(WMT_PIN_VDIN5, "vdin5"),
0172 PINCTRL_PIN(WMT_PIN_VDIN6, "vdin6"),
0173 PINCTRL_PIN(WMT_PIN_VDIN7, "vdin7"),
0174 PINCTRL_PIN(WMT_PIN_I2C1SCL, "i2c1_scl"),
0175 PINCTRL_PIN(WMT_PIN_I2C1SDA, "i2c1_sda"),
0176 PINCTRL_PIN(WMT_PIN_SPI0MOSI, "spi0_mosi"),
0177 PINCTRL_PIN(WMT_PIN_SPI0MISO, "spi0_miso"),
0178 PINCTRL_PIN(WMT_PIN_SPI0SS0, "spi0_ss0"),
0179 PINCTRL_PIN(WMT_PIN_SPI0CLK, "spi0_clk"),
0180 PINCTRL_PIN(WMT_PIN_SD0DATA0, "sd0_data0"),
0181 PINCTRL_PIN(WMT_PIN_SD0DATA1, "sd0_data1"),
0182 PINCTRL_PIN(WMT_PIN_SD0DATA2, "sd0_data2"),
0183 PINCTRL_PIN(WMT_PIN_SD0DATA3, "sd0_data3"),
0184 PINCTRL_PIN(WMT_PIN_SD0CLK, "sd0_clk"),
0185 PINCTRL_PIN(WMT_PIN_SD0WP, "sd0_wp"),
0186 PINCTRL_PIN(WMT_PIN_SD0CMD, "sd0_cmd"),
0187 PINCTRL_PIN(WMT_PIN_SD1DATA0, "sd1_data0"),
0188 PINCTRL_PIN(WMT_PIN_SD1DATA1, "sd1_data1"),
0189 PINCTRL_PIN(WMT_PIN_SD1DATA2, "sd1_data2"),
0190 PINCTRL_PIN(WMT_PIN_SD1DATA3, "sd1_data3"),
0191 PINCTRL_PIN(WMT_PIN_SD1DATA4, "sd1_data4"),
0192 PINCTRL_PIN(WMT_PIN_SD1DATA5, "sd1_data5"),
0193 PINCTRL_PIN(WMT_PIN_SD1DATA6, "sd1_data6"),
0194 PINCTRL_PIN(WMT_PIN_SD1DATA7, "sd1_data7"),
0195 PINCTRL_PIN(WMT_PIN_I2C0SCL, "i2c0_scl"),
0196 PINCTRL_PIN(WMT_PIN_I2C0SDA, "i2c0_sda"),
0197 PINCTRL_PIN(WMT_PIN_UART0RTS, "uart0_rts"),
0198 PINCTRL_PIN(WMT_PIN_UART0TXD, "uart0_txd"),
0199 PINCTRL_PIN(WMT_PIN_UART0CTS, "uart0_cts"),
0200 PINCTRL_PIN(WMT_PIN_UART0RXD, "uart0_rxd"),
0201 PINCTRL_PIN(WMT_PIN_UART1RTS, "uart1_rts"),
0202 PINCTRL_PIN(WMT_PIN_UART1TXD, "uart1_txd"),
0203 PINCTRL_PIN(WMT_PIN_UART1CTS, "uart1_cts"),
0204 PINCTRL_PIN(WMT_PIN_UART1RXD, "uart1_rxd"),
0205 PINCTRL_PIN(WMT_PIN_UART2RTS, "uart2_rts"),
0206 PINCTRL_PIN(WMT_PIN_UART2TXD, "uart2_txd"),
0207 PINCTRL_PIN(WMT_PIN_UART2CTS, "uart2_cts"),
0208 PINCTRL_PIN(WMT_PIN_UART2RXD, "uart2_rxd"),
0209 PINCTRL_PIN(WMT_PIN_UART3RTS, "uart3_rts"),
0210 PINCTRL_PIN(WMT_PIN_UART3TXD, "uart3_txd"),
0211 PINCTRL_PIN(WMT_PIN_UART3CTS, "uart3_cts"),
0212 PINCTRL_PIN(WMT_PIN_UART3RXD, "uart3_rxd"),
0213 PINCTRL_PIN(WMT_PIN_KPADROW0, "kpadrow0"),
0214 PINCTRL_PIN(WMT_PIN_KPADROW1, "kpadrow1"),
0215 PINCTRL_PIN(WMT_PIN_KPADCOL0, "kpadcol0"),
0216 PINCTRL_PIN(WMT_PIN_KPADCOL1, "kpadcol1"),
0217 PINCTRL_PIN(WMT_PIN_SD1CLK, "sd1_clk"),
0218 PINCTRL_PIN(WMT_PIN_SD1CMD, "sd1_cmd"),
0219 PINCTRL_PIN(WMT_PIN_SD1WP, "sd1_wp"),
0220 };
0221
0222
0223 static const char * const wm8650_groups[] = {
0224 "extgpio0",
0225 "extgpio1",
0226 "extgpio2",
0227 "extgpio3",
0228 "extgpio4",
0229 "extgpio5",
0230 "extgpio6",
0231 "extgpio7",
0232 "wakeup0",
0233 "wakeup1",
0234 "susgpio0",
0235 "sd0_cd",
0236 "sd1_cd",
0237 "vdout0",
0238 "vdout1",
0239 "vdout2",
0240 "vdout3",
0241 "vdout4",
0242 "vdout5",
0243 "vdout6",
0244 "vdout7",
0245 "vdout8",
0246 "vdout9",
0247 "vdout10",
0248 "vdout11",
0249 "vdout12",
0250 "vdout13",
0251 "vdout14",
0252 "vdout15",
0253 "vdout16",
0254 "vdout17",
0255 "vdout18",
0256 "vdout19",
0257 "vdout20",
0258 "vdout21",
0259 "vdout22",
0260 "vdout23",
0261 "vdin0",
0262 "vdin1",
0263 "vdin2",
0264 "vdin3",
0265 "vdin4",
0266 "vdin5",
0267 "vdin6",
0268 "vdin7",
0269 "i2c1_scl",
0270 "i2c1_sda",
0271 "spi0_mosi",
0272 "spi0_miso",
0273 "spi0_ss0",
0274 "spi0_clk",
0275 "sd0_data0",
0276 "sd0_data1",
0277 "sd0_data2",
0278 "sd0_data3",
0279 "sd0_clk",
0280 "sd0_wp",
0281 "sd0_cmd",
0282 "sd1_data0",
0283 "sd1_data1",
0284 "sd1_data2",
0285 "sd1_data3",
0286 "sd1_data4",
0287 "sd1_data5",
0288 "sd1_data6",
0289 "sd1_data7",
0290 "i2c0_scl",
0291 "i2c0_sda",
0292 "uart0_rts",
0293 "uart0_txd",
0294 "uart0_cts",
0295 "uart0_rxd",
0296 "uart1_rts",
0297 "uart1_txd",
0298 "uart1_cts",
0299 "uart1_rxd",
0300 "uart2_rts",
0301 "uart2_txd",
0302 "uart2_cts",
0303 "uart2_rxd",
0304 "uart3_rts",
0305 "uart3_txd",
0306 "uart3_cts",
0307 "uart3_rxd",
0308 "kpadrow0",
0309 "kpadrow1",
0310 "kpadcol0",
0311 "kpadcol1",
0312 "sd1_clk",
0313 "sd1_cmd",
0314 "sd1_wp",
0315 };
0316
0317 static int wm8650_pinctrl_probe(struct platform_device *pdev)
0318 {
0319 struct wmt_pinctrl_data *data;
0320
0321 data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
0322 if (!data)
0323 return -ENOMEM;
0324
0325 data->banks = wm8650_banks;
0326 data->nbanks = ARRAY_SIZE(wm8650_banks);
0327 data->pins = wm8650_pins;
0328 data->npins = ARRAY_SIZE(wm8650_pins);
0329 data->groups = wm8650_groups;
0330 data->ngroups = ARRAY_SIZE(wm8650_groups);
0331
0332 return wmt_pinctrl_probe(pdev, data);
0333 }
0334
0335 static const struct of_device_id wmt_pinctrl_of_match[] = {
0336 { .compatible = "wm,wm8650-pinctrl" },
0337 { },
0338 };
0339
0340 static struct platform_driver wmt_pinctrl_driver = {
0341 .probe = wm8650_pinctrl_probe,
0342 .driver = {
0343 .name = "pinctrl-wm8650",
0344 .of_match_table = wmt_pinctrl_of_match,
0345 .suppress_bind_attrs = true,
0346 },
0347 };
0348 builtin_platform_driver(wmt_pinctrl_driver);