Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Pinctrl data for Wondermedia WM8850 SoC
0004  *
0005  * Copyright (c) 2013 Tony Prisk <linux@prisktech.co.nz>
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  * Describe the register offsets within the GPIO memory space
0018  * The dedicated external GPIO's should always be listed in bank 0
0019  * so they are exported in the 0..31 range which is what users
0020  * expect.
0021  *
0022  * Do not reorder these banks as it will change the pin numbering
0023  */
0024 static const struct wmt_pinctrl_bank_registers wm8850_banks[] = {
0025     WMT_PINCTRL_BANK(0x40, 0x80, 0xC0, 0x00, 0x480, 0x4C0),     /* 0 */
0026     WMT_PINCTRL_BANK(0x44, 0x84, 0xC4, 0x04, 0x484, 0x4C4),     /* 1 */
0027     WMT_PINCTRL_BANK(0x48, 0x88, 0xC8, 0x08, 0x488, 0x4C8),     /* 2 */
0028     WMT_PINCTRL_BANK(0x4C, 0x8C, 0xCC, 0x0C, 0x48C, 0x4CC),     /* 3 */
0029     WMT_PINCTRL_BANK(0x50, 0x90, 0xD0, 0x10, 0x490, 0x4D0),     /* 4 */
0030     WMT_PINCTRL_BANK(0x54, 0x94, 0xD4, 0x14, 0x494, 0x4D4),     /* 5 */
0031     WMT_PINCTRL_BANK(0x58, 0x98, 0xD8, 0x18, 0x498, 0x4D8),     /* 6 */
0032     WMT_PINCTRL_BANK(0x5C, 0x9C, 0xDC, 0x1C, 0x49C, 0x4DC),     /* 7 */
0033     WMT_PINCTRL_BANK(0x60, 0xA0, 0xE0, 0x20, 0x4A0, 0x4E0),     /* 8 */
0034     WMT_PINCTRL_BANK(0x70, 0xB0, 0xF0, 0x30, 0x4B0, 0x4F0),     /* 9 */
0035     WMT_PINCTRL_BANK(0x7C, 0xBC, 0xDC, 0x3C, 0x4BC, 0x4FC),     /* 10 */
0036 };
0037 
0038 /* Please keep sorted by bank/bit */
0039 #define WMT_PIN_EXTGPIO0    WMT_PIN(0, 0)
0040 #define WMT_PIN_EXTGPIO1    WMT_PIN(0, 1)
0041 #define WMT_PIN_EXTGPIO2    WMT_PIN(0, 2)
0042 #define WMT_PIN_EXTGPIO3    WMT_PIN(0, 3)
0043 #define WMT_PIN_EXTGPIO4    WMT_PIN(0, 4)
0044 #define WMT_PIN_EXTGPIO5    WMT_PIN(0, 5)
0045 #define WMT_PIN_EXTGPIO6    WMT_PIN(0, 6)
0046 #define WMT_PIN_EXTGPIO7    WMT_PIN(0, 7)
0047 #define WMT_PIN_WAKEUP0     WMT_PIN(0, 16)
0048 #define WMT_PIN_WAKEUP1     WMT_PIN(0, 17)
0049 #define WMT_PIN_WAKEUP2     WMT_PIN(0, 18)
0050 #define WMT_PIN_WAKEUP3     WMT_PIN(0, 19)
0051 #define WMT_PIN_SUSGPIO0    WMT_PIN(0, 21)
0052 #define WMT_PIN_SUSGPIO1    WMT_PIN(0, 22)
0053 #define WMT_PIN_SD0CD       WMT_PIN(0, 28)
0054 #define WMT_PIN_VDOUT0      WMT_PIN(1, 0)
0055 #define WMT_PIN_VDOUT1      WMT_PIN(1, 1)
0056 #define WMT_PIN_VDOUT2      WMT_PIN(1, 2)
0057 #define WMT_PIN_VDOUT3      WMT_PIN(1, 3)
0058 #define WMT_PIN_VDOUT4      WMT_PIN(1, 4)
0059 #define WMT_PIN_VDOUT5      WMT_PIN(1, 5)
0060 #define WMT_PIN_VDOUT6      WMT_PIN(1, 6)
0061 #define WMT_PIN_VDOUT7      WMT_PIN(1, 7)
0062 #define WMT_PIN_VDOUT8      WMT_PIN(1, 8)
0063 #define WMT_PIN_VDOUT9      WMT_PIN(1, 9)
0064 #define WMT_PIN_VDOUT10     WMT_PIN(1, 10)
0065 #define WMT_PIN_VDOUT11     WMT_PIN(1, 11)
0066 #define WMT_PIN_VDOUT12     WMT_PIN(1, 12)
0067 #define WMT_PIN_VDOUT13     WMT_PIN(1, 13)
0068 #define WMT_PIN_VDOUT14     WMT_PIN(1, 14)
0069 #define WMT_PIN_VDOUT15     WMT_PIN(1, 15)
0070 #define WMT_PIN_VDOUT16     WMT_PIN(1, 16)
0071 #define WMT_PIN_VDOUT17     WMT_PIN(1, 17)
0072 #define WMT_PIN_VDOUT18     WMT_PIN(1, 18)
0073 #define WMT_PIN_VDOUT19     WMT_PIN(1, 19)
0074 #define WMT_PIN_VDOUT20     WMT_PIN(1, 20)
0075 #define WMT_PIN_VDOUT21     WMT_PIN(1, 21)
0076 #define WMT_PIN_VDOUT22     WMT_PIN(1, 22)
0077 #define WMT_PIN_VDOUT23     WMT_PIN(1, 23)
0078 #define WMT_PIN_VDIN0       WMT_PIN(2, 0)
0079 #define WMT_PIN_VDIN1       WMT_PIN(2, 1)
0080 #define WMT_PIN_VDIN2       WMT_PIN(2, 2)
0081 #define WMT_PIN_VDIN3       WMT_PIN(2, 3)
0082 #define WMT_PIN_VDIN4       WMT_PIN(2, 4)
0083 #define WMT_PIN_VDIN5       WMT_PIN(2, 5)
0084 #define WMT_PIN_VDIN6       WMT_PIN(2, 6)
0085 #define WMT_PIN_VDIN7       WMT_PIN(2, 7)
0086 #define WMT_PIN_SPI0_MOSI   WMT_PIN(2, 24)
0087 #define WMT_PIN_SPI0_MISO   WMT_PIN(2, 25)
0088 #define WMT_PIN_SPI0_SS     WMT_PIN(2, 26)
0089 #define WMT_PIN_SPI0_CLK    WMT_PIN(2, 27)
0090 #define WMT_PIN_SPI0_SSB    WMT_PIN(2, 28)
0091 #define WMT_PIN_SD0CLK      WMT_PIN(3, 17)
0092 #define WMT_PIN_SD0CMD      WMT_PIN(3, 18)
0093 #define WMT_PIN_SD0WP       WMT_PIN(3, 19)
0094 #define WMT_PIN_SD0DATA0    WMT_PIN(3, 20)
0095 #define WMT_PIN_SD0DATA1    WMT_PIN(3, 21)
0096 #define WMT_PIN_SD0DATA2    WMT_PIN(3, 22)
0097 #define WMT_PIN_SD0DATA3    WMT_PIN(3, 23)
0098 #define WMT_PIN_SD1DATA0    WMT_PIN(3, 24)
0099 #define WMT_PIN_SD1DATA1    WMT_PIN(3, 25)
0100 #define WMT_PIN_SD1DATA2    WMT_PIN(3, 26)
0101 #define WMT_PIN_SD1DATA3    WMT_PIN(3, 27)
0102 #define WMT_PIN_SD1DATA4    WMT_PIN(3, 28)
0103 #define WMT_PIN_SD1DATA5    WMT_PIN(3, 29)
0104 #define WMT_PIN_SD1DATA6    WMT_PIN(3, 30)
0105 #define WMT_PIN_SD1DATA7    WMT_PIN(3, 31)
0106 #define WMT_PIN_I2C0_SCL    WMT_PIN(5, 8)
0107 #define WMT_PIN_I2C0_SDA    WMT_PIN(5, 9)
0108 #define WMT_PIN_I2C1_SCL    WMT_PIN(5, 10)
0109 #define WMT_PIN_I2C1_SDA    WMT_PIN(5, 11)
0110 #define WMT_PIN_I2C2_SCL    WMT_PIN(5, 12)
0111 #define WMT_PIN_I2C2_SDA    WMT_PIN(5, 13)
0112 #define WMT_PIN_UART0_RTS   WMT_PIN(5, 16)
0113 #define WMT_PIN_UART0_TXD   WMT_PIN(5, 17)
0114 #define WMT_PIN_UART0_CTS   WMT_PIN(5, 18)
0115 #define WMT_PIN_UART0_RXD   WMT_PIN(5, 19)
0116 #define WMT_PIN_UART1_RTS   WMT_PIN(5, 20)
0117 #define WMT_PIN_UART1_TXD   WMT_PIN(5, 21)
0118 #define WMT_PIN_UART1_CTS   WMT_PIN(5, 22)
0119 #define WMT_PIN_UART1_RXD   WMT_PIN(5, 23)
0120 #define WMT_PIN_UART2_RTS   WMT_PIN(5, 24)
0121 #define WMT_PIN_UART2_TXD   WMT_PIN(5, 25)
0122 #define WMT_PIN_UART2_CTS   WMT_PIN(5, 26)
0123 #define WMT_PIN_UART2_RXD   WMT_PIN(5, 27)
0124 #define WMT_PIN_SD2WP       WMT_PIN(6, 3)
0125 #define WMT_PIN_SD2CMD      WMT_PIN(6, 6)
0126 #define WMT_PIN_SD2CLK      WMT_PIN(6, 7)
0127 #define WMT_PIN_SD2PWR      WMT_PIN(6, 9)
0128 #define WMT_PIN_SD1CLK      WMT_PIN(7, 0)
0129 #define WMT_PIN_SD1CMD      WMT_PIN(7, 1)
0130 #define WMT_PIN_SD1PWR      WMT_PIN(7, 10)
0131 #define WMT_PIN_SD1WP       WMT_PIN(7, 11)
0132 #define WMT_PIN_SD1CD       WMT_PIN(7, 12)
0133 #define WMT_PIN_PWMOUT1     WMT_PIN(7, 26)
0134 #define WMT_PIN_PWMOUT0     WMT_PIN(7, 27)
0135 
0136 static const struct pinctrl_pin_desc wm8850_pins[] = {
0137     PINCTRL_PIN(WMT_PIN_EXTGPIO0, "extgpio0"),
0138     PINCTRL_PIN(WMT_PIN_EXTGPIO1, "extgpio1"),
0139     PINCTRL_PIN(WMT_PIN_EXTGPIO2, "extgpio2"),
0140     PINCTRL_PIN(WMT_PIN_EXTGPIO3, "extgpio3"),
0141     PINCTRL_PIN(WMT_PIN_EXTGPIO4, "extgpio4"),
0142     PINCTRL_PIN(WMT_PIN_EXTGPIO5, "extgpio5"),
0143     PINCTRL_PIN(WMT_PIN_EXTGPIO6, "extgpio6"),
0144     PINCTRL_PIN(WMT_PIN_EXTGPIO7, "extgpio7"),
0145     PINCTRL_PIN(WMT_PIN_WAKEUP0, "wakeup0"),
0146     PINCTRL_PIN(WMT_PIN_WAKEUP1, "wakeup1"),
0147     PINCTRL_PIN(WMT_PIN_WAKEUP2, "wakeup2"),
0148     PINCTRL_PIN(WMT_PIN_WAKEUP3, "wakeup3"),
0149     PINCTRL_PIN(WMT_PIN_SUSGPIO0, "susgpio0"),
0150     PINCTRL_PIN(WMT_PIN_SUSGPIO1, "susgpio1"),
0151     PINCTRL_PIN(WMT_PIN_SD0CD, "sd0_cd"),
0152     PINCTRL_PIN(WMT_PIN_VDOUT0, "vdout0"),
0153     PINCTRL_PIN(WMT_PIN_VDOUT1, "vdout1"),
0154     PINCTRL_PIN(WMT_PIN_VDOUT2, "vdout2"),
0155     PINCTRL_PIN(WMT_PIN_VDOUT3, "vdout3"),
0156     PINCTRL_PIN(WMT_PIN_VDOUT4, "vdout4"),
0157     PINCTRL_PIN(WMT_PIN_VDOUT5, "vdout5"),
0158     PINCTRL_PIN(WMT_PIN_VDOUT6, "vdout6"),
0159     PINCTRL_PIN(WMT_PIN_VDOUT7, "vdout7"),
0160     PINCTRL_PIN(WMT_PIN_VDOUT8, "vdout8"),
0161     PINCTRL_PIN(WMT_PIN_VDOUT9, "vdout9"),
0162     PINCTRL_PIN(WMT_PIN_VDOUT10, "vdout10"),
0163     PINCTRL_PIN(WMT_PIN_VDOUT11, "vdout11"),
0164     PINCTRL_PIN(WMT_PIN_VDOUT12, "vdout12"),
0165     PINCTRL_PIN(WMT_PIN_VDOUT13, "vdout13"),
0166     PINCTRL_PIN(WMT_PIN_VDOUT14, "vdout14"),
0167     PINCTRL_PIN(WMT_PIN_VDOUT15, "vdout15"),
0168     PINCTRL_PIN(WMT_PIN_VDOUT16, "vdout16"),
0169     PINCTRL_PIN(WMT_PIN_VDOUT17, "vdout17"),
0170     PINCTRL_PIN(WMT_PIN_VDOUT18, "vdout18"),
0171     PINCTRL_PIN(WMT_PIN_VDOUT19, "vdout19"),
0172     PINCTRL_PIN(WMT_PIN_VDOUT20, "vdout20"),
0173     PINCTRL_PIN(WMT_PIN_VDOUT21, "vdout21"),
0174     PINCTRL_PIN(WMT_PIN_VDOUT22, "vdout22"),
0175     PINCTRL_PIN(WMT_PIN_VDOUT23, "vdout23"),
0176     PINCTRL_PIN(WMT_PIN_VDIN0, "vdin0"),
0177     PINCTRL_PIN(WMT_PIN_VDIN1, "vdin1"),
0178     PINCTRL_PIN(WMT_PIN_VDIN2, "vdin2"),
0179     PINCTRL_PIN(WMT_PIN_VDIN3, "vdin3"),
0180     PINCTRL_PIN(WMT_PIN_VDIN4, "vdin4"),
0181     PINCTRL_PIN(WMT_PIN_VDIN5, "vdin5"),
0182     PINCTRL_PIN(WMT_PIN_VDIN6, "vdin6"),
0183     PINCTRL_PIN(WMT_PIN_VDIN7, "vdin7"),
0184     PINCTRL_PIN(WMT_PIN_SPI0_MOSI, "spi0_mosi"),
0185     PINCTRL_PIN(WMT_PIN_SPI0_MISO, "spi0_miso"),
0186     PINCTRL_PIN(WMT_PIN_SPI0_SS, "spi0_ss"),
0187     PINCTRL_PIN(WMT_PIN_SPI0_CLK, "spi0_clk"),
0188     PINCTRL_PIN(WMT_PIN_SPI0_SSB, "spi0_ssb"),
0189     PINCTRL_PIN(WMT_PIN_SD0CLK, "sd0_clk"),
0190     PINCTRL_PIN(WMT_PIN_SD0CMD, "sd0_cmd"),
0191     PINCTRL_PIN(WMT_PIN_SD0WP, "sd0_wp"),
0192     PINCTRL_PIN(WMT_PIN_SD0DATA0, "sd0_data0"),
0193     PINCTRL_PIN(WMT_PIN_SD0DATA1, "sd0_data1"),
0194     PINCTRL_PIN(WMT_PIN_SD0DATA2, "sd0_data2"),
0195     PINCTRL_PIN(WMT_PIN_SD0DATA3, "sd0_data3"),
0196     PINCTRL_PIN(WMT_PIN_SD1DATA0, "sd1_data0"),
0197     PINCTRL_PIN(WMT_PIN_SD1DATA1, "sd1_data1"),
0198     PINCTRL_PIN(WMT_PIN_SD1DATA2, "sd1_data2"),
0199     PINCTRL_PIN(WMT_PIN_SD1DATA3, "sd1_data3"),
0200     PINCTRL_PIN(WMT_PIN_SD1DATA4, "sd1_data4"),
0201     PINCTRL_PIN(WMT_PIN_SD1DATA5, "sd1_data5"),
0202     PINCTRL_PIN(WMT_PIN_SD1DATA6, "sd1_data6"),
0203     PINCTRL_PIN(WMT_PIN_SD1DATA7, "sd1_data7"),
0204     PINCTRL_PIN(WMT_PIN_I2C0_SCL, "i2c0_scl"),
0205     PINCTRL_PIN(WMT_PIN_I2C0_SDA, "i2c0_sda"),
0206     PINCTRL_PIN(WMT_PIN_I2C1_SCL, "i2c1_scl"),
0207     PINCTRL_PIN(WMT_PIN_I2C1_SDA, "i2c1_sda"),
0208     PINCTRL_PIN(WMT_PIN_I2C2_SCL, "i2c2_scl"),
0209     PINCTRL_PIN(WMT_PIN_I2C2_SDA, "i2c2_sda"),
0210     PINCTRL_PIN(WMT_PIN_UART0_RTS, "uart0_rts"),
0211     PINCTRL_PIN(WMT_PIN_UART0_TXD, "uart0_txd"),
0212     PINCTRL_PIN(WMT_PIN_UART0_CTS, "uart0_cts"),
0213     PINCTRL_PIN(WMT_PIN_UART0_RXD, "uart0_rxd"),
0214     PINCTRL_PIN(WMT_PIN_UART1_RTS, "uart1_rts"),
0215     PINCTRL_PIN(WMT_PIN_UART1_TXD, "uart1_txd"),
0216     PINCTRL_PIN(WMT_PIN_UART1_CTS, "uart1_cts"),
0217     PINCTRL_PIN(WMT_PIN_UART1_RXD, "uart1_rxd"),
0218     PINCTRL_PIN(WMT_PIN_UART2_RTS, "uart2_rts"),
0219     PINCTRL_PIN(WMT_PIN_UART2_TXD, "uart2_txd"),
0220     PINCTRL_PIN(WMT_PIN_UART2_CTS, "uart2_cts"),
0221     PINCTRL_PIN(WMT_PIN_UART2_RXD, "uart2_rxd"),
0222     PINCTRL_PIN(WMT_PIN_SD2WP, "sd2_wp"),
0223     PINCTRL_PIN(WMT_PIN_SD2CMD, "sd2_cmd"),
0224     PINCTRL_PIN(WMT_PIN_SD2CLK, "sd2_clk"),
0225     PINCTRL_PIN(WMT_PIN_SD2PWR, "sd2_pwr"),
0226     PINCTRL_PIN(WMT_PIN_SD1CLK, "sd1_clk"),
0227     PINCTRL_PIN(WMT_PIN_SD1CMD, "sd1_cmd"),
0228     PINCTRL_PIN(WMT_PIN_SD1PWR, "sd1_pwr"),
0229     PINCTRL_PIN(WMT_PIN_SD1WP, "sd1_wp"),
0230     PINCTRL_PIN(WMT_PIN_SD1CD, "sd1_cd"),
0231     PINCTRL_PIN(WMT_PIN_PWMOUT1, "pwmout1"),
0232     PINCTRL_PIN(WMT_PIN_PWMOUT0, "pwmout0"),
0233 };
0234 
0235 /* Order of these names must match the above list */
0236 static const char * const wm8850_groups[] = {
0237     "extgpio0",
0238     "extgpio1",
0239     "extgpio2",
0240     "extgpio3",
0241     "extgpio4",
0242     "extgpio5",
0243     "extgpio6",
0244     "extgpio7",
0245     "wakeup0",
0246     "wakeup1",
0247     "wakeup2",
0248     "wakeup3",
0249     "susgpio0",
0250     "susgpio1",
0251     "sd0_cd",
0252     "vdout0",
0253     "vdout1",
0254     "vdout2",
0255     "vdout3",
0256     "vdout4",
0257     "vdout5",
0258     "vdout6",
0259     "vdout7",
0260     "vdout8",
0261     "vdout9",
0262     "vdout10",
0263     "vdout11",
0264     "vdout12",
0265     "vdout13",
0266     "vdout14",
0267     "vdout15",
0268     "vdout16",
0269     "vdout17",
0270     "vdout18",
0271     "vdout19",
0272     "vdout20",
0273     "vdout21",
0274     "vdout22",
0275     "vdout23",
0276     "vdin0",
0277     "vdin1",
0278     "vdin2",
0279     "vdin3",
0280     "vdin4",
0281     "vdin5",
0282     "vdin6",
0283     "vdin7",
0284     "spi0_mosi",
0285     "spi0_miso",
0286     "spi0_ss",
0287     "spi0_clk",
0288     "spi0_ssb",
0289     "sd0_clk",
0290     "sd0_cmd",
0291     "sd0_wp",
0292     "sd0_data0",
0293     "sd0_data1",
0294     "sd0_data2",
0295     "sd0_data3",
0296     "sd1_data0",
0297     "sd1_data1",
0298     "sd1_data2",
0299     "sd1_data3",
0300     "sd1_data4",
0301     "sd1_data5",
0302     "sd1_data6",
0303     "sd1_data7",
0304     "i2c0_scl",
0305     "i2c0_sda",
0306     "i2c1_scl",
0307     "i2c1_sda",
0308     "i2c2_scl",
0309     "i2c2_sda",
0310     "uart0_rts",
0311     "uart0_txd",
0312     "uart0_cts",
0313     "uart0_rxd",
0314     "uart1_rts",
0315     "uart1_txd",
0316     "uart1_cts",
0317     "uart1_rxd",
0318     "uart2_rts",
0319     "uart2_txd",
0320     "uart2_cts",
0321     "uart2_rxd",
0322     "sd2_wp",
0323     "sd2_cmd",
0324     "sd2_clk",
0325     "sd2_pwr",
0326     "sd1_clk",
0327     "sd1_cmd",
0328     "sd1_pwr",
0329     "sd1_wp",
0330     "sd1_cd",
0331     "pwmout1",
0332     "pwmout0",
0333 };
0334 
0335 static int wm8850_pinctrl_probe(struct platform_device *pdev)
0336 {
0337     struct wmt_pinctrl_data *data;
0338 
0339     data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
0340     if (!data)
0341         return -ENOMEM;
0342 
0343     data->banks = wm8850_banks;
0344     data->nbanks = ARRAY_SIZE(wm8850_banks);
0345     data->pins = wm8850_pins;
0346     data->npins = ARRAY_SIZE(wm8850_pins);
0347     data->groups = wm8850_groups;
0348     data->ngroups = ARRAY_SIZE(wm8850_groups);
0349 
0350     return wmt_pinctrl_probe(pdev, data);
0351 }
0352 
0353 static const struct of_device_id wmt_pinctrl_of_match[] = {
0354     { .compatible = "wm,wm8850-pinctrl" },
0355     { /* sentinel */ },
0356 };
0357 
0358 static struct platform_driver wmt_pinctrl_driver = {
0359     .probe  = wm8850_pinctrl_probe,
0360     .driver = {
0361         .name   = "pinctrl-wm8850",
0362         .of_match_table = wmt_pinctrl_of_match,
0363         .suppress_bind_attrs = true,
0364     },
0365 };
0366 builtin_platform_driver(wmt_pinctrl_driver);