Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * Pinctrl data for Wondermedia WM8650 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 wm8650_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 };
0034 
0035 /* Please keep sorted by bank/bit */
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 /* Order of these names must match the above list */
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     { /* sentinel */ },
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);