]> Git Repo - J-linux.git/blob - drivers/pinctrl/pinctrl-th1520.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / pinctrl / pinctrl-th1520.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Pinctrl driver for the T-Head TH1520 SoC
4  *
5  * Copyright (C) 2023 Emil Renner Berthing <[email protected]>
6  */
7
8 #include <linux/array_size.h>
9 #include <linux/bits.h>
10 #include <linux/cleanup.h>
11 #include <linux/clk.h>
12 #include <linux/device.h>
13 #include <linux/io.h>
14 #include <linux/mod_devicetable.h>
15 #include <linux/module.h>
16 #include <linux/mutex.h>
17 #include <linux/of.h>
18 #include <linux/platform_device.h>
19 #include <linux/seq_file.h>
20 #include <linux/spinlock.h>
21
22 #include <linux/of_address.h>
23 #include <linux/of_device.h>
24
25 #include <linux/pinctrl/pinconf.h>
26 #include <linux/pinctrl/pinconf-generic.h>
27 #include <linux/pinctrl/pinctrl.h>
28 #include <linux/pinctrl/pinmux.h>
29
30 #include "core.h"
31 #include "pinmux.h"
32 #include "pinconf.h"
33
34 #define TH1520_PADCFG_IE        BIT(9)
35 #define TH1520_PADCFG_SL        BIT(8)
36 #define TH1520_PADCFG_ST        BIT(7)
37 #define TH1520_PADCFG_SPU       BIT(6)
38 #define TH1520_PADCFG_PS        BIT(5)
39 #define TH1520_PADCFG_PE        BIT(4)
40 #define TH1520_PADCFG_BIAS      (TH1520_PADCFG_SPU | TH1520_PADCFG_PS | TH1520_PADCFG_PE)
41 #define TH1520_PADCFG_DS        GENMASK(3, 0)
42
43 #define TH1520_PULL_DOWN_OHM    44000 /* typ. 44kOhm */
44 #define TH1520_PULL_UP_OHM      48000 /* typ. 48kOhm */
45 #define TH1520_PULL_STRONG_OHM   2100 /* typ. 2.1kOhm */
46
47 #define TH1520_PAD_NO_PADCFG    BIT(30)
48 #define TH1520_PAD_MUXDATA      GENMASK(29, 0)
49
50 struct th1520_pad_group {
51         const char *name;
52         const struct pinctrl_pin_desc *pins;
53         unsigned int npins;
54 };
55
56 struct th1520_pinctrl {
57         struct pinctrl_desc desc;
58         struct mutex mutex;     /* serialize adding functions */
59         raw_spinlock_t lock;    /* serialize register access */
60         void __iomem *base;
61         struct pinctrl_dev *pctl;
62 };
63
64 static void __iomem *th1520_padcfg(struct th1520_pinctrl *thp,
65                                    unsigned int pin)
66 {
67         return thp->base + 4 * (pin / 2);
68 }
69
70 static unsigned int th1520_padcfg_shift(unsigned int pin)
71 {
72         return 16 * (pin & BIT(0));
73 }
74
75 static void __iomem *th1520_muxcfg(struct th1520_pinctrl *thp,
76                                    unsigned int pin)
77 {
78         return thp->base + 0x400 + 4 * (pin / 8);
79 }
80
81 static unsigned int th1520_muxcfg_shift(unsigned int pin)
82 {
83         return 4 * (pin & GENMASK(2, 0));
84 }
85
86 enum th1520_muxtype {
87         TH1520_MUX_____,
88         TH1520_MUX_GPIO,
89         TH1520_MUX_PWM,
90         TH1520_MUX_UART,
91         TH1520_MUX_IR,
92         TH1520_MUX_I2C,
93         TH1520_MUX_SPI,
94         TH1520_MUX_QSPI,
95         TH1520_MUX_SDIO,
96         TH1520_MUX_AUD,
97         TH1520_MUX_I2S,
98         TH1520_MUX_MAC0,
99         TH1520_MUX_MAC1,
100         TH1520_MUX_DPU0,
101         TH1520_MUX_DPU1,
102         TH1520_MUX_ISP,
103         TH1520_MUX_HDMI,
104         TH1520_MUX_BSEL,
105         TH1520_MUX_DBG,
106         TH1520_MUX_CLK,
107         TH1520_MUX_JTAG,
108         TH1520_MUX_ISO,
109         TH1520_MUX_FUSE,
110         TH1520_MUX_RST,
111 };
112
113 static const char *const th1520_muxtype_string[] = {
114         [TH1520_MUX_GPIO] = "gpio",
115         [TH1520_MUX_PWM]  = "pwm",
116         [TH1520_MUX_UART] = "uart",
117         [TH1520_MUX_IR]   = "ir",
118         [TH1520_MUX_I2C]  = "i2c",
119         [TH1520_MUX_SPI]  = "spi",
120         [TH1520_MUX_QSPI] = "qspi",
121         [TH1520_MUX_SDIO] = "sdio",
122         [TH1520_MUX_AUD]  = "audio",
123         [TH1520_MUX_I2S]  = "i2s",
124         [TH1520_MUX_MAC0] = "gmac0",
125         [TH1520_MUX_MAC1] = "gmac1",
126         [TH1520_MUX_DPU0] = "dpu0",
127         [TH1520_MUX_DPU1] = "dpu1",
128         [TH1520_MUX_ISP]  = "isp",
129         [TH1520_MUX_HDMI] = "hdmi",
130         [TH1520_MUX_BSEL] = "bootsel",
131         [TH1520_MUX_DBG]  = "debug",
132         [TH1520_MUX_CLK]  = "clock",
133         [TH1520_MUX_JTAG] = "jtag",
134         [TH1520_MUX_ISO]  = "iso7816",
135         [TH1520_MUX_FUSE] = "efuse",
136         [TH1520_MUX_RST]  = "reset",
137 };
138
139 static enum th1520_muxtype th1520_muxtype_get(const char *str)
140 {
141         enum th1520_muxtype mt;
142
143         for (mt = TH1520_MUX_GPIO; mt < ARRAY_SIZE(th1520_muxtype_string); mt++) {
144                 if (!strcmp(str, th1520_muxtype_string[mt]))
145                         return mt;
146         }
147         return TH1520_MUX_____;
148 }
149
150 #define TH1520_PAD(_nr, _name, m0, m1, m2, m3, m4, m5, _flags) \
151         { .number = _nr, .name = #_name, .drv_data = (void *)((_flags) | \
152                 (TH1520_MUX_##m0 <<  0) | (TH1520_MUX_##m1 <<  5) | (TH1520_MUX_##m2 << 10) | \
153                 (TH1520_MUX_##m3 << 15) | (TH1520_MUX_##m4 << 20) | (TH1520_MUX_##m5 << 25)) }
154
155 static unsigned long th1520_pad_muxdata(void *drv_data)
156 {
157         return (uintptr_t)drv_data & TH1520_PAD_MUXDATA;
158 }
159
160 static bool th1520_pad_no_padcfg(void *drv_data)
161 {
162         return (uintptr_t)drv_data & TH1520_PAD_NO_PADCFG;
163 }
164
165 static const struct pinctrl_pin_desc th1520_group1_pins[] = {
166         TH1520_PAD(0,  OSC_CLK_IN,    ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
167         TH1520_PAD(1,  OSC_CLK_OUT,   ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
168         TH1520_PAD(2,  SYS_RST_N,     ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
169         TH1520_PAD(3,  RTC_CLK_IN,    ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
170         TH1520_PAD(4,  RTC_CLK_OUT,   ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
171         /* skip number 5 so we can calculate register offsets and shifts from the pin number */
172         TH1520_PAD(6,  TEST_MODE,     ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
173         TH1520_PAD(7,  DEBUG_MODE,    DBG,  ____, ____, GPIO, ____, ____, TH1520_PAD_NO_PADCFG),
174         TH1520_PAD(8,  POR_SEL,       ____, ____, ____, ____, ____, ____, TH1520_PAD_NO_PADCFG),
175         TH1520_PAD(9,  I2C_AON_SCL,   I2C,  ____, ____, GPIO, ____, ____, 0),
176         TH1520_PAD(10, I2C_AON_SDA,   I2C,  ____, ____, GPIO, ____, ____, 0),
177         TH1520_PAD(11, CPU_JTG_TCLK,  JTAG, ____, ____, GPIO, ____, ____, 0),
178         TH1520_PAD(12, CPU_JTG_TMS,   JTAG, ____, ____, GPIO, ____, ____, 0),
179         TH1520_PAD(13, CPU_JTG_TDI,   JTAG, ____, ____, GPIO, ____, ____, 0),
180         TH1520_PAD(14, CPU_JTG_TDO,   JTAG, ____, ____, GPIO, ____, ____, 0),
181         TH1520_PAD(15, CPU_JTG_TRST,  JTAG, ____, ____, GPIO, ____, ____, 0),
182         TH1520_PAD(16, AOGPIO_7,      CLK,  AUD,  ____, GPIO, ____, ____, 0),
183         TH1520_PAD(17, AOGPIO_8,      UART, AUD,  IR,   GPIO, ____, ____, 0),
184         TH1520_PAD(18, AOGPIO_9,      UART, AUD,  IR,   GPIO, ____, ____, 0),
185         TH1520_PAD(19, AOGPIO_10,     CLK,  AUD,  ____, GPIO, ____, ____, 0),
186         TH1520_PAD(20, AOGPIO_11,     GPIO, AUD,  ____, ____, ____, ____, 0),
187         TH1520_PAD(21, AOGPIO_12,     GPIO, AUD,  ____, ____, ____, ____, 0),
188         TH1520_PAD(22, AOGPIO_13,     GPIO, AUD,  ____, ____, ____, ____, 0),
189         TH1520_PAD(23, AOGPIO_14,     GPIO, AUD,  ____, ____, ____, ____, 0),
190         TH1520_PAD(24, AOGPIO_15,     GPIO, AUD,  ____, ____, ____, ____, 0),
191         TH1520_PAD(25, AUDIO_PA0,     AUD,  ____, ____, GPIO, ____, ____, 0),
192         TH1520_PAD(26, AUDIO_PA1,     AUD,  ____, ____, GPIO, ____, ____, 0),
193         TH1520_PAD(27, AUDIO_PA2,     AUD,  ____, ____, GPIO, ____, ____, 0),
194         TH1520_PAD(28, AUDIO_PA3,     AUD,  ____, ____, GPIO, ____, ____, 0),
195         TH1520_PAD(29, AUDIO_PA4,     AUD,  ____, ____, GPIO, ____, ____, 0),
196         TH1520_PAD(30, AUDIO_PA5,     AUD,  ____, ____, GPIO, ____, ____, 0),
197         TH1520_PAD(31, AUDIO_PA6,     AUD,  ____, ____, GPIO, ____, ____, 0),
198         TH1520_PAD(32, AUDIO_PA7,     AUD,  ____, ____, GPIO, ____, ____, 0),
199         TH1520_PAD(33, AUDIO_PA8,     AUD,  ____, ____, GPIO, ____, ____, 0),
200         TH1520_PAD(34, AUDIO_PA9,     AUD,  ____, ____, GPIO, ____, ____, 0),
201         TH1520_PAD(35, AUDIO_PA10,    AUD,  ____, ____, GPIO, ____, ____, 0),
202         TH1520_PAD(36, AUDIO_PA11,    AUD,  ____, ____, GPIO, ____, ____, 0),
203         TH1520_PAD(37, AUDIO_PA12,    AUD,  ____, ____, GPIO, ____, ____, 0),
204         TH1520_PAD(38, AUDIO_PA13,    AUD,  ____, ____, GPIO, ____, ____, 0),
205         TH1520_PAD(39, AUDIO_PA14,    AUD,  ____, ____, GPIO, ____, ____, 0),
206         TH1520_PAD(40, AUDIO_PA15,    AUD,  ____, ____, GPIO, ____, ____, 0),
207         TH1520_PAD(41, AUDIO_PA16,    AUD,  ____, ____, GPIO, ____, ____, 0),
208         TH1520_PAD(42, AUDIO_PA17,    AUD,  ____, ____, GPIO, ____, ____, 0),
209         TH1520_PAD(43, AUDIO_PA27,    AUD,  ____, ____, GPIO, ____, ____, 0),
210         TH1520_PAD(44, AUDIO_PA28,    AUD,  ____, ____, GPIO, ____, ____, 0),
211         TH1520_PAD(45, AUDIO_PA29,    AUD,  ____, ____, GPIO, ____, ____, 0),
212         TH1520_PAD(46, AUDIO_PA30,    AUD,  RST,  ____, GPIO, ____, ____, 0),
213 };
214
215 static const struct pinctrl_pin_desc th1520_group2_pins[] = {
216         TH1520_PAD(0,  QSPI1_SCLK,    QSPI, ISO,  ____, GPIO, FUSE, ____, 0),
217         TH1520_PAD(1,  QSPI1_CSN0,    QSPI, ____, I2C,  GPIO, FUSE, ____, 0),
218         TH1520_PAD(2,  QSPI1_D0_MOSI, QSPI, ISO,  I2C,  GPIO, FUSE, ____, 0),
219         TH1520_PAD(3,  QSPI1_D1_MISO, QSPI, ISO,  ____, GPIO, FUSE, ____, 0),
220         TH1520_PAD(4,  QSPI1_D2_WP,   QSPI, ISO,  UART, GPIO, FUSE, ____, 0),
221         TH1520_PAD(5,  QSPI1_D3_HOLD, QSPI, ISO,  UART, GPIO, ____, ____, 0),
222         TH1520_PAD(6,  I2C0_SCL,      I2C,  ____, ____, GPIO, ____, ____, 0),
223         TH1520_PAD(7,  I2C0_SDA,      I2C,  ____, ____, GPIO, ____, ____, 0),
224         TH1520_PAD(8,  I2C1_SCL,      I2C,  ____, ____, GPIO, ____, ____, 0),
225         TH1520_PAD(9,  I2C1_SDA,      I2C,  ____, ____, GPIO, ____, ____, 0),
226         TH1520_PAD(10, UART1_TXD,     UART, ____, ____, GPIO, ____, ____, 0),
227         TH1520_PAD(11, UART1_RXD,     UART, ____, ____, GPIO, ____, ____, 0),
228         TH1520_PAD(12, UART4_TXD,     UART, ____, ____, GPIO, ____, ____, 0),
229         TH1520_PAD(13, UART4_RXD,     UART, ____, ____, GPIO, ____, ____, 0),
230         TH1520_PAD(14, UART4_CTSN,    UART, ____, ____, GPIO, ____, ____, 0),
231         TH1520_PAD(15, UART4_RTSN,    UART, ____, ____, GPIO, ____, ____, 0),
232         TH1520_PAD(16, UART3_TXD,     DBG,  UART, ____, GPIO, ____, ____, 0),
233         TH1520_PAD(17, UART3_RXD,     DBG,  UART, ____, GPIO, ____, ____, 0),
234         TH1520_PAD(18, GPIO0_18,      GPIO, I2C,  ____, ____, DPU0, DPU1, 0),
235         TH1520_PAD(19, GPIO0_19,      GPIO, I2C,  ____, ____, DPU0, DPU1, 0),
236         TH1520_PAD(20, GPIO0_20,      GPIO, UART, IR,   ____, DPU0, DPU1, 0),
237         TH1520_PAD(21, GPIO0_21,      GPIO, UART, IR,   ____, DPU0, DPU1, 0),
238         TH1520_PAD(22, GPIO0_22,      GPIO, JTAG, I2C,  ____, DPU0, DPU1, 0),
239         TH1520_PAD(23, GPIO0_23,      GPIO, JTAG, I2C,  ____, DPU0, DPU1, 0),
240         TH1520_PAD(24, GPIO0_24,      GPIO, JTAG, QSPI, ____, DPU0, DPU1, 0),
241         TH1520_PAD(25, GPIO0_25,      GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
242         TH1520_PAD(26, GPIO0_26,      GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
243         TH1520_PAD(27, GPIO0_27,      GPIO, ____, I2C,  ____, DPU0, DPU1, 0),
244         TH1520_PAD(28, GPIO0_28,      GPIO, ____, I2C,  ____, DPU0, DPU1, 0),
245         TH1520_PAD(29, GPIO0_29,      GPIO, ____, ____, ____, DPU0, DPU1, 0),
246         TH1520_PAD(30, GPIO0_30,      GPIO, ____, ____, ____, DPU0, DPU1, 0),
247         TH1520_PAD(31, GPIO0_31,      GPIO, ____, ____, ____, DPU0, DPU1, 0),
248         TH1520_PAD(32, GPIO1_0,       GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
249         TH1520_PAD(33, GPIO1_1,       GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
250         TH1520_PAD(34, GPIO1_2,       GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
251         TH1520_PAD(35, GPIO1_3,       GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
252         TH1520_PAD(36, GPIO1_4,       GPIO, JTAG, ____, ____, DPU0, DPU1, 0),
253         TH1520_PAD(37, GPIO1_5,       GPIO, ____, ____, ____, DPU0, DPU1, 0),
254         TH1520_PAD(38, GPIO1_6,       GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
255         TH1520_PAD(39, GPIO1_7,       GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
256         TH1520_PAD(40, GPIO1_8,       GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
257         TH1520_PAD(41, GPIO1_9,       GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
258         TH1520_PAD(42, GPIO1_10,      GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
259         TH1520_PAD(43, GPIO1_11,      GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
260         TH1520_PAD(44, GPIO1_12,      GPIO, QSPI, ____, ____, DPU0, DPU1, 0),
261         TH1520_PAD(45, GPIO1_13,      GPIO, UART, ____, ____, DPU0, DPU1, 0),
262         TH1520_PAD(46, GPIO1_14,      GPIO, UART, ____, ____, DPU0, DPU1, 0),
263         TH1520_PAD(47, GPIO1_15,      GPIO, UART, ____, ____, DPU0, DPU1, 0),
264         TH1520_PAD(48, GPIO1_16,      GPIO, UART, ____, ____, DPU0, DPU1, 0),
265         TH1520_PAD(49, CLK_OUT_0,     BSEL, CLK,  ____, GPIO, ____, ____, 0),
266         TH1520_PAD(50, CLK_OUT_1,     BSEL, CLK,  ____, GPIO, ____, ____, 0),
267         TH1520_PAD(51, CLK_OUT_2,     BSEL, CLK,  ____, GPIO, ____, ____, 0),
268         TH1520_PAD(52, CLK_OUT_3,     BSEL, CLK,  ____, GPIO, ____, ____, 0),
269         TH1520_PAD(53, GPIO1_21,      JTAG, ____, ISP,  GPIO, ____, ____, 0),
270         TH1520_PAD(54, GPIO1_22,      JTAG, ____, ISP,  GPIO, ____, ____, 0),
271         TH1520_PAD(55, GPIO1_23,      JTAG, ____, ISP,  GPIO, ____, ____, 0),
272         TH1520_PAD(56, GPIO1_24,      JTAG, ____, ISP,  GPIO, ____, ____, 0),
273         TH1520_PAD(57, GPIO1_25,      JTAG, ____, ISP,  GPIO, ____, ____, 0),
274         TH1520_PAD(58, GPIO1_26,      GPIO, ____, ISP,  ____, ____, ____, 0),
275         TH1520_PAD(59, GPIO1_27,      GPIO, ____, ISP,  ____, ____, ____, 0),
276         TH1520_PAD(60, GPIO1_28,      GPIO, ____, ISP,  ____, ____, ____, 0),
277         TH1520_PAD(61, GPIO1_29,      GPIO, ____, ISP,  ____, ____, ____, 0),
278         TH1520_PAD(62, GPIO1_30,      GPIO, ____, ISP,  ____, ____, ____, 0),
279 };
280
281 static const struct pinctrl_pin_desc th1520_group3_pins[] = {
282         TH1520_PAD(0,  UART0_TXD,     UART, ____, ____, GPIO, ____, ____, 0),
283         TH1520_PAD(1,  UART0_RXD,     UART, ____, ____, GPIO, ____, ____, 0),
284         TH1520_PAD(2,  QSPI0_SCLK,    QSPI, PWM,  I2S,  GPIO, ____, ____, 0),
285         TH1520_PAD(3,  QSPI0_CSN0,    QSPI, PWM,  I2S,  GPIO, ____, ____, 0),
286         TH1520_PAD(4,  QSPI0_CSN1,    QSPI, PWM,  I2S,  GPIO, ____, ____, 0),
287         TH1520_PAD(5,  QSPI0_D0_MOSI, QSPI, PWM,  I2S,  GPIO, ____, ____, 0),
288         TH1520_PAD(6,  QSPI0_D1_MISO, QSPI, PWM,  I2S,  GPIO, ____, ____, 0),
289         TH1520_PAD(7,  QSPI0_D2_WP,   QSPI, PWM,  I2S,  GPIO, ____, ____, 0),
290         TH1520_PAD(8,  QSPI1_D3_HOLD, QSPI, ____, I2S,  GPIO, ____, ____, 0),
291         TH1520_PAD(9,  I2C2_SCL,      I2C,  UART, ____, GPIO, ____, ____, 0),
292         TH1520_PAD(10, I2C2_SDA,      I2C,  UART, ____, GPIO, ____, ____, 0),
293         TH1520_PAD(11, I2C3_SCL,      I2C,  ____, ____, GPIO, ____, ____, 0),
294         TH1520_PAD(12, I2C3_SDA,      I2C,  ____, ____, GPIO, ____, ____, 0),
295         TH1520_PAD(13, GPIO2_13,      GPIO, SPI,  ____, ____, ____, ____, 0),
296         TH1520_PAD(14, SPI_SCLK,      SPI,  UART, IR,   GPIO, ____, ____, 0),
297         TH1520_PAD(15, SPI_CSN,       SPI,  UART, IR,   GPIO, ____, ____, 0),
298         TH1520_PAD(16, SPI_MOSI,      SPI,  ____, ____, GPIO, ____, ____, 0),
299         TH1520_PAD(17, SPI_MISO,      SPI,  ____, ____, GPIO, ____, ____, 0),
300         TH1520_PAD(18, GPIO2_18,      GPIO, MAC1, ____, ____, ____, ____, 0),
301         TH1520_PAD(19, GPIO2_19,      GPIO, MAC1, ____, ____, ____, ____, 0),
302         TH1520_PAD(20, GPIO2_20,      GPIO, MAC1, ____, ____, ____, ____, 0),
303         TH1520_PAD(21, GPIO2_21,      GPIO, MAC1, ____, ____, ____, ____, 0),
304         TH1520_PAD(22, GPIO2_22,      GPIO, MAC1, ____, ____, ____, ____, 0),
305         TH1520_PAD(23, GPIO2_23,      GPIO, MAC1, ____, ____, ____, ____, 0),
306         TH1520_PAD(24, GPIO2_24,      GPIO, MAC1, ____, ____, ____, ____, 0),
307         TH1520_PAD(25, GPIO2_25,      GPIO, MAC1, ____, ____, ____, ____, 0),
308         TH1520_PAD(26, SDIO0_WPRTN,   SDIO, ____, ____, GPIO, ____, ____, 0),
309         TH1520_PAD(27, SDIO0_DETN,    SDIO, ____, ____, GPIO, ____, ____, 0),
310         TH1520_PAD(28, SDIO1_WPRTN,   SDIO, ____, ____, GPIO, ____, ____, 0),
311         TH1520_PAD(29, SDIO1_DETN,    SDIO, ____, ____, GPIO, ____, ____, 0),
312         TH1520_PAD(30, GPIO2_30,      GPIO, MAC1, ____, ____, ____, ____, 0),
313         TH1520_PAD(31, GPIO2_31,      GPIO, MAC1, ____, ____, ____, ____, 0),
314         TH1520_PAD(32, GPIO3_0,       GPIO, MAC1, ____, ____, ____, ____, 0),
315         TH1520_PAD(33, GPIO3_1,       GPIO, MAC1, ____, ____, ____, ____, 0),
316         TH1520_PAD(34, GPIO3_2,       GPIO, PWM,  ____, ____, ____, ____, 0),
317         TH1520_PAD(35, GPIO3_3,       GPIO, PWM,  ____, ____, ____, ____, 0),
318         TH1520_PAD(36, HDMI_SCL,      HDMI, PWM,  ____, GPIO, ____, ____, 0),
319         TH1520_PAD(37, HDMI_SDA,      HDMI, PWM,  ____, GPIO, ____, ____, 0),
320         TH1520_PAD(38, HDMI_CEC,      HDMI, ____, ____, GPIO, ____, ____, 0),
321         TH1520_PAD(39, GMAC0_TX_CLK,  MAC0, ____, ____, GPIO, ____, ____, 0),
322         TH1520_PAD(40, GMAC0_RX_CLK,  MAC0, ____, ____, GPIO, ____, ____, 0),
323         TH1520_PAD(41, GMAC0_TXEN,    MAC0, UART, ____, GPIO, ____, ____, 0),
324         TH1520_PAD(42, GMAC0_TXD0,    MAC0, UART, ____, GPIO, ____, ____, 0),
325         TH1520_PAD(43, GMAC0_TXD1,    MAC0, UART, ____, GPIO, ____, ____, 0),
326         TH1520_PAD(44, GMAC0_TXD2,    MAC0, UART, ____, GPIO, ____, ____, 0),
327         TH1520_PAD(45, GMAC0_TXD3,    MAC0, I2C,  ____, GPIO, ____, ____, 0),
328         TH1520_PAD(46, GMAC0_RXDV,    MAC0, I2C,  ____, GPIO, ____, ____, 0),
329         TH1520_PAD(47, GMAC0_RXD0,    MAC0, I2C,  ____, GPIO, ____, ____, 0),
330         TH1520_PAD(48, GMAC0_RXD1,    MAC0, I2C,  ____, GPIO, ____, ____, 0),
331         TH1520_PAD(49, GMAC0_RXD2,    MAC0, SPI,  ____, GPIO, ____, ____, 0),
332         TH1520_PAD(50, GMAC0_RXD3,    MAC0, SPI,  ____, GPIO, ____, ____, 0),
333         TH1520_PAD(51, GMAC0_MDC,     MAC0, SPI,  MAC1, GPIO, ____, ____, 0),
334         TH1520_PAD(52, GMAC0_MDIO,    MAC0, SPI,  MAC1, GPIO, ____, ____, 0),
335         TH1520_PAD(53, GMAC0_COL,     MAC0, PWM,  ____, GPIO, ____, ____, 0),
336         TH1520_PAD(54, GMAC0_CRS,     MAC0, PWM,  ____, GPIO, ____, ____, 0),
337 };
338
339 static const struct th1520_pad_group th1520_group1 = {
340         .name = "th1520-group1",
341         .pins = th1520_group1_pins,
342         .npins = ARRAY_SIZE(th1520_group1_pins),
343 };
344
345 static const struct th1520_pad_group th1520_group2 = {
346         .name = "th1520-group2",
347         .pins = th1520_group2_pins,
348         .npins = ARRAY_SIZE(th1520_group2_pins),
349 };
350
351 static const struct th1520_pad_group th1520_group3 = {
352         .name = "th1520-group3",
353         .pins = th1520_group3_pins,
354         .npins = ARRAY_SIZE(th1520_group3_pins),
355 };
356
357 static int th1520_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
358 {
359         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
360
361         return thp->desc.npins;
362 }
363
364 static const char *th1520_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
365                                                  unsigned int gsel)
366 {
367         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
368
369         return thp->desc.pins[gsel].name;
370 }
371
372 static int th1520_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
373                                          unsigned int gsel,
374                                          const unsigned int **pins,
375                                          unsigned int *npins)
376 {
377         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
378
379         *pins = &thp->desc.pins[gsel].number;
380         *npins = 1;
381         return 0;
382 }
383
384 #ifdef CONFIG_DEBUG_FS
385 static void th1520_pin_dbg_show(struct pinctrl_dev *pctldev,
386                                 struct seq_file *s, unsigned int pin)
387 {
388         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
389         void __iomem *padcfg = th1520_padcfg(thp, pin);
390         void __iomem *muxcfg = th1520_muxcfg(thp, pin);
391         u32 pad;
392         u32 mux;
393
394         scoped_guard(raw_spinlock_irqsave, &thp->lock) {
395                 pad = readl_relaxed(padcfg);
396                 mux = readl_relaxed(muxcfg);
397         }
398
399         seq_printf(s, "[PADCFG_%03u:0x%x=0x%07x MUXCFG_%03u:0x%x=0x%08x]",
400                    1 + pin / 2, 0x000 + 4 * (pin / 2), pad,
401                    1 + pin / 8, 0x400 + 4 * (pin / 8), mux);
402 }
403 #else
404 #define th1520_pin_dbg_show NULL
405 #endif
406
407 static void th1520_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
408                                        struct pinctrl_map *map, unsigned int nmaps)
409 {
410         unsigned long *seen = NULL;
411         unsigned int i;
412
413         for (i = 0; i < nmaps; i++) {
414                 if (map[i].type == PIN_MAP_TYPE_CONFIGS_PIN &&
415                     map[i].data.configs.configs != seen) {
416                         seen = map[i].data.configs.configs;
417                         kfree(seen);
418                 }
419         }
420
421         kfree(map);
422 }
423
424 static int th1520_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
425                                          struct device_node *np,
426                                          struct pinctrl_map **maps,
427                                          unsigned int *num_maps)
428 {
429         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
430         struct pinctrl_map *map;
431         unsigned long *configs;
432         unsigned int nconfigs;
433         unsigned int nmaps;
434         int ret;
435
436         nmaps = 0;
437         for_each_available_child_of_node_scoped(np, child) {
438                 int npins = of_property_count_strings(child, "pins");
439
440                 if (npins <= 0) {
441                         dev_err(thp->pctl->dev, "no pins selected for %pOFn.%pOFn\n",
442                                 np, child);
443                         return -EINVAL;
444                 }
445                 nmaps += npins;
446                 if (of_property_present(child, "function"))
447                         nmaps += npins;
448         }
449
450         map = kcalloc(nmaps, sizeof(*map), GFP_KERNEL);
451         if (!map)
452                 return -ENOMEM;
453
454         nmaps = 0;
455         guard(mutex)(&thp->mutex);
456         for_each_available_child_of_node_scoped(np, child) {
457                 unsigned int rollback = nmaps;
458                 enum th1520_muxtype muxtype;
459                 struct property *prop;
460                 const char *funcname;
461                 const char **pgnames;
462                 const char *pinname;
463                 int npins;
464
465                 ret = pinconf_generic_parse_dt_config(child, pctldev, &configs, &nconfigs);
466                 if (ret) {
467                         dev_err(thp->pctl->dev, "%pOFn.%pOFn: error parsing pin config\n",
468                                 np, child);
469                         goto free_map;
470                 }
471
472                 if (!of_property_read_string(child, "function", &funcname)) {
473                         muxtype = th1520_muxtype_get(funcname);
474                         if (!muxtype) {
475                                 dev_err(thp->pctl->dev, "%pOFn.%pOFn: unknown function '%s'\n",
476                                         np, child, funcname);
477                                 ret = -EINVAL;
478                                 goto free_configs;
479                         }
480
481                         funcname = devm_kasprintf(thp->pctl->dev, GFP_KERNEL, "%pOFn.%pOFn",
482                                                   np, child);
483                         if (!funcname) {
484                                 ret = -ENOMEM;
485                                 goto free_configs;
486                         }
487
488                         npins = of_property_count_strings(child, "pins");
489                         pgnames = devm_kcalloc(thp->pctl->dev, npins, sizeof(*pgnames), GFP_KERNEL);
490                         if (!pgnames) {
491                                 ret = -ENOMEM;
492                                 goto free_configs;
493                         }
494                 } else {
495                         funcname = NULL;
496                 }
497
498                 npins = 0;
499                 of_property_for_each_string(child, "pins", prop, pinname) {
500                         unsigned int i;
501
502                         for (i = 0; i < thp->desc.npins; i++) {
503                                 if (!strcmp(pinname, thp->desc.pins[i].name))
504                                         break;
505                         }
506                         if (i == thp->desc.npins) {
507                                 nmaps = rollback;
508                                 dev_err(thp->pctl->dev, "%pOFn.%pOFn: unknown pin '%s'\n",
509                                         np, child, pinname);
510                                 ret = -EINVAL;
511                                 goto free_configs;
512                         }
513
514                         if (nconfigs) {
515                                 map[nmaps].type = PIN_MAP_TYPE_CONFIGS_PIN;
516                                 map[nmaps].data.configs.group_or_pin = thp->desc.pins[i].name;
517                                 map[nmaps].data.configs.configs = configs;
518                                 map[nmaps].data.configs.num_configs = nconfigs;
519                                 nmaps += 1;
520                         }
521                         if (funcname) {
522                                 pgnames[npins++] = thp->desc.pins[i].name;
523                                 map[nmaps].type = PIN_MAP_TYPE_MUX_GROUP;
524                                 map[nmaps].data.mux.function = funcname;
525                                 map[nmaps].data.mux.group = thp->desc.pins[i].name;
526                                 nmaps += 1;
527                         }
528                 }
529
530                 if (funcname) {
531                         ret = pinmux_generic_add_function(pctldev, funcname, pgnames,
532                                                           npins, (void *)muxtype);
533                         if (ret < 0) {
534                                 dev_err(thp->pctl->dev, "error adding function %s\n", funcname);
535                                 goto free_map;
536                         }
537                 }
538         }
539
540         *maps = map;
541         *num_maps = nmaps;
542         return 0;
543
544 free_configs:
545         kfree(configs);
546 free_map:
547         th1520_pinctrl_dt_free_map(pctldev, map, nmaps);
548         return ret;
549 }
550
551 static const struct pinctrl_ops th1520_pinctrl_ops = {
552         .get_groups_count = th1520_pinctrl_get_groups_count,
553         .get_group_name = th1520_pinctrl_get_group_name,
554         .get_group_pins = th1520_pinctrl_get_group_pins,
555         .pin_dbg_show = th1520_pin_dbg_show,
556         .dt_node_to_map = th1520_pinctrl_dt_node_to_map,
557         .dt_free_map = th1520_pinctrl_dt_free_map,
558 };
559
560 static const u8 th1520_drive_strength_in_ma[16] = {
561         1, 2, 3, 5, 7, 8, 10, 12, 13, 15, 16, 18, 20, 21, 23, 25,
562 };
563
564 static u16 th1520_drive_strength_from_ma(u32 arg)
565 {
566         u16 ds;
567
568         for (ds = 0; ds < TH1520_PADCFG_DS; ds++) {
569                 if (arg <= th1520_drive_strength_in_ma[ds])
570                         return ds;
571         }
572         return TH1520_PADCFG_DS;
573 }
574
575 static int th1520_padcfg_rmw(struct th1520_pinctrl *thp, unsigned int pin,
576                              u32 mask, u32 value)
577 {
578         void __iomem *padcfg = th1520_padcfg(thp, pin);
579         unsigned int shift = th1520_padcfg_shift(pin);
580         u32 tmp;
581
582         mask <<= shift;
583         value <<= shift;
584
585         scoped_guard(raw_spinlock_irqsave, &thp->lock) {
586                 tmp = readl_relaxed(padcfg);
587                 tmp = (tmp & ~mask) | value;
588                 writel_relaxed(tmp, padcfg);
589         }
590         return 0;
591 }
592
593 static int th1520_pinconf_get(struct pinctrl_dev *pctldev,
594                               unsigned int pin, unsigned long *config)
595 {
596         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
597         const struct pin_desc *desc = pin_desc_get(pctldev, pin);
598         bool enabled;
599         int param;
600         u32 value;
601         u32 arg;
602
603         if (th1520_pad_no_padcfg(desc->drv_data))
604                 return -ENOTSUPP;
605
606         value = readl_relaxed(th1520_padcfg(thp, pin));
607         value = (value >> th1520_padcfg_shift(pin)) & GENMASK(9, 0);
608
609         param = pinconf_to_config_param(*config);
610         switch (param) {
611         case PIN_CONFIG_BIAS_DISABLE:
612                 enabled = !(value & (TH1520_PADCFG_SPU | TH1520_PADCFG_PE));
613                 arg = 0;
614                 break;
615         case PIN_CONFIG_BIAS_PULL_DOWN:
616                 enabled = (value & TH1520_PADCFG_BIAS) == TH1520_PADCFG_PE;
617                 arg = enabled ? TH1520_PULL_DOWN_OHM : 0;
618                 break;
619         case PIN_CONFIG_BIAS_PULL_UP:
620                 if (value & TH1520_PADCFG_SPU) {
621                         enabled = true;
622                         arg = TH1520_PULL_STRONG_OHM;
623                 } else if ((value & (TH1520_PADCFG_PE | TH1520_PADCFG_PS)) ==
624                                     (TH1520_PADCFG_PE | TH1520_PADCFG_PS)) {
625                         enabled = true;
626                         arg = TH1520_PULL_UP_OHM;
627                 } else {
628                         enabled = false;
629                         arg = 0;
630                 }
631                 break;
632         case PIN_CONFIG_DRIVE_STRENGTH:
633                 enabled = true;
634                 arg = th1520_drive_strength_in_ma[value & TH1520_PADCFG_DS];
635                 break;
636         case PIN_CONFIG_INPUT_ENABLE:
637                 enabled = value & TH1520_PADCFG_IE;
638                 arg = enabled ? 1 : 0;
639                 break;
640         case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
641                 enabled = value & TH1520_PADCFG_ST;
642                 arg = enabled ? 1 : 0;
643                 break;
644         case PIN_CONFIG_SLEW_RATE:
645                 enabled = value & TH1520_PADCFG_SL;
646                 arg = enabled ? 1 : 0;
647                 break;
648         default:
649                 return -ENOTSUPP;
650         }
651
652         *config = pinconf_to_config_packed(param, arg);
653         return enabled ? 0 : -EINVAL;
654 }
655
656 static int th1520_pinconf_group_get(struct pinctrl_dev *pctldev,
657                                     unsigned int gsel, unsigned long *config)
658 {
659         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
660         unsigned int pin = thp->desc.pins[gsel].number;
661
662         return th1520_pinconf_get(pctldev, pin, config);
663 }
664
665 static int th1520_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin,
666                               unsigned long *configs, unsigned int num_configs)
667 {
668         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
669         const struct pin_desc *desc = pin_desc_get(pctldev, pin);
670         unsigned int i;
671         u16 mask, value;
672
673         if (th1520_pad_no_padcfg(desc->drv_data))
674                 return -ENOTSUPP;
675
676         mask = 0;
677         value = 0;
678         for (i = 0; i < num_configs; i++) {
679                 int param = pinconf_to_config_param(configs[i]);
680                 u32 arg = pinconf_to_config_argument(configs[i]);
681
682                 switch (param) {
683                 case PIN_CONFIG_BIAS_DISABLE:
684                         mask |= TH1520_PADCFG_BIAS;
685                         value &= ~TH1520_PADCFG_BIAS;
686                         break;
687                 case PIN_CONFIG_BIAS_PULL_DOWN:
688                         if (arg == 0)
689                                 return -ENOTSUPP;
690                         mask |= TH1520_PADCFG_BIAS;
691                         value &= ~TH1520_PADCFG_BIAS;
692                         value |= TH1520_PADCFG_PE;
693                         break;
694                 case PIN_CONFIG_BIAS_PULL_UP:
695                         if (arg == 0)
696                                 return -ENOTSUPP;
697                         mask |= TH1520_PADCFG_BIAS;
698                         value &= ~TH1520_PADCFG_BIAS;
699                         if (arg == TH1520_PULL_STRONG_OHM)
700                                 value |= TH1520_PADCFG_SPU;
701                         else
702                                 value |= TH1520_PADCFG_PE | TH1520_PADCFG_PS;
703                         break;
704                 case PIN_CONFIG_DRIVE_STRENGTH:
705                         mask |= TH1520_PADCFG_DS;
706                         value &= ~TH1520_PADCFG_DS;
707                         value |= th1520_drive_strength_from_ma(arg);
708                         break;
709                 case PIN_CONFIG_INPUT_ENABLE:
710                         mask |= TH1520_PADCFG_IE;
711                         if (arg)
712                                 value |= TH1520_PADCFG_IE;
713                         else
714                                 value &= ~TH1520_PADCFG_IE;
715                         break;
716                 case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
717                         mask |= TH1520_PADCFG_ST;
718                         if (arg)
719                                 value |= TH1520_PADCFG_ST;
720                         else
721                                 value &= ~TH1520_PADCFG_ST;
722                         break;
723                 case PIN_CONFIG_SLEW_RATE:
724                         mask |= TH1520_PADCFG_SL;
725                         if (arg)
726                                 value |= TH1520_PADCFG_SL;
727                         else
728                                 value &= ~TH1520_PADCFG_SL;
729                         break;
730                 default:
731                         return -ENOTSUPP;
732                 }
733         }
734
735         return th1520_padcfg_rmw(thp, pin, mask, value);
736 }
737
738 static int th1520_pinconf_group_set(struct pinctrl_dev *pctldev,
739                                     unsigned int gsel,
740                                     unsigned long *configs,
741                                     unsigned int num_configs)
742 {
743         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
744         unsigned int pin = thp->desc.pins[gsel].number;
745
746         return th1520_pinconf_set(pctldev, pin, configs, num_configs);
747 }
748
749 #ifdef CONFIG_DEBUG_FS
750 static void th1520_pinconf_dbg_show(struct pinctrl_dev *pctldev,
751                                     struct seq_file *s, unsigned int pin)
752 {
753         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
754         u32 value = readl_relaxed(th1520_padcfg(thp, pin));
755
756         value = (value >> th1520_padcfg_shift(pin)) & GENMASK(9, 0);
757
758         seq_printf(s, " [0x%03x]", value);
759 }
760 #else
761 #define th1520_pinconf_dbg_show NULL
762 #endif
763
764 static const struct pinconf_ops th1520_pinconf_ops = {
765         .pin_config_get = th1520_pinconf_get,
766         .pin_config_group_get = th1520_pinconf_group_get,
767         .pin_config_set = th1520_pinconf_set,
768         .pin_config_group_set = th1520_pinconf_group_set,
769         .pin_config_dbg_show = th1520_pinconf_dbg_show,
770         .is_generic = true,
771 };
772
773 static int th1520_pinmux_set(struct th1520_pinctrl *thp, unsigned int pin,
774                              unsigned long muxdata, enum th1520_muxtype muxtype)
775 {
776         void __iomem *muxcfg = th1520_muxcfg(thp, pin);
777         unsigned int shift = th1520_muxcfg_shift(pin);
778         u32 mask, value, tmp;
779
780         for (value = 0; muxdata; muxdata >>= 5, value++) {
781                 if ((muxdata & GENMASK(4, 0)) == muxtype)
782                         break;
783         }
784         if (!muxdata) {
785                 dev_err(thp->pctl->dev, "invalid mux %s for pin %s\n",
786                         th1520_muxtype_string[muxtype], pin_get_name(thp->pctl, pin));
787                 return -EINVAL;
788         }
789
790         mask = GENMASK(3, 0) << shift;
791         value = value << shift;
792
793         scoped_guard(raw_spinlock_irqsave, &thp->lock) {
794                 tmp = readl_relaxed(muxcfg);
795                 tmp = (tmp & ~mask) | value;
796                 writel_relaxed(tmp, muxcfg);
797         }
798         return 0;
799 }
800
801 static int th1520_pinmux_set_mux(struct pinctrl_dev *pctldev,
802                                  unsigned int fsel, unsigned int gsel)
803 {
804         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
805         const struct function_desc *func = pinmux_generic_get_function(pctldev, fsel);
806         enum th1520_muxtype muxtype;
807
808         if (!func)
809                 return -EINVAL;
810
811         muxtype = (uintptr_t)func->data;
812         return th1520_pinmux_set(thp, thp->desc.pins[gsel].number,
813                                  th1520_pad_muxdata(thp->desc.pins[gsel].drv_data),
814                                  muxtype);
815 }
816
817 static int th1520_gpio_request_enable(struct pinctrl_dev *pctldev,
818                                       struct pinctrl_gpio_range *range,
819                                       unsigned int offset)
820 {
821         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
822         const struct pin_desc *desc = pin_desc_get(pctldev, offset);
823
824         return th1520_pinmux_set(thp, offset,
825                                  th1520_pad_muxdata(desc->drv_data),
826                                  TH1520_MUX_GPIO);
827 }
828
829 static int th1520_gpio_set_direction(struct pinctrl_dev *pctldev,
830                                      struct pinctrl_gpio_range *range,
831                                      unsigned int offset, bool input)
832 {
833         struct th1520_pinctrl *thp = pinctrl_dev_get_drvdata(pctldev);
834
835         return th1520_padcfg_rmw(thp, offset, TH1520_PADCFG_IE,
836                                  input ? TH1520_PADCFG_IE : 0);
837 }
838
839 static const struct pinmux_ops th1520_pinmux_ops = {
840         .get_functions_count = pinmux_generic_get_function_count,
841         .get_function_name = pinmux_generic_get_function_name,
842         .get_function_groups = pinmux_generic_get_function_groups,
843         .set_mux = th1520_pinmux_set_mux,
844         .gpio_request_enable = th1520_gpio_request_enable,
845         .gpio_set_direction = th1520_gpio_set_direction,
846         .strict = true,
847 };
848
849 static int th1520_pinctrl_probe(struct platform_device *pdev)
850 {
851         struct device *dev = &pdev->dev;
852         const struct th1520_pad_group *group;
853         struct device_node *np = dev->of_node;
854         struct th1520_pinctrl *thp;
855         struct clk *clk;
856         u32 pin_group;
857         int ret;
858
859         thp = devm_kzalloc(dev, sizeof(*thp), GFP_KERNEL);
860         if (!thp)
861                 return -ENOMEM;
862
863         thp->base = devm_platform_ioremap_resource(pdev, 0);
864         if (IS_ERR(thp->base))
865                 return PTR_ERR(thp->base);
866
867         clk = devm_clk_get_enabled(dev, NULL);
868         if (IS_ERR(clk))
869                 return dev_err_probe(dev, PTR_ERR(clk), "error getting clock\n");
870
871         ret = of_property_read_u32(np, "thead,pad-group", &pin_group);
872         if (ret)
873                 return dev_err_probe(dev, ret, "failed to read the thead,pad-group property\n");
874
875         if (pin_group == 1)
876                 group = &th1520_group1;
877         else if (pin_group == 2)
878                 group = &th1520_group2;
879         else if (pin_group == 3)
880                 group = &th1520_group3;
881         else
882                 return dev_err_probe(dev, -EINVAL, "unit address did not match any pad group\n");
883
884         thp->desc.name = group->name;
885         thp->desc.pins = group->pins;
886         thp->desc.npins = group->npins;
887         thp->desc.pctlops = &th1520_pinctrl_ops;
888         thp->desc.pmxops = &th1520_pinmux_ops;
889         thp->desc.confops = &th1520_pinconf_ops;
890         thp->desc.owner = THIS_MODULE;
891         mutex_init(&thp->mutex);
892         raw_spin_lock_init(&thp->lock);
893
894         ret = devm_pinctrl_register_and_init(dev, &thp->desc, thp, &thp->pctl);
895         if (ret)
896                 return dev_err_probe(dev, ret, "could not register pinctrl driver\n");
897
898         return pinctrl_enable(thp->pctl);
899 }
900
901 static const struct of_device_id th1520_pinctrl_of_match[] = {
902         { .compatible = "thead,th1520-pinctrl"},
903         { /* sentinel */ }
904 };
905 MODULE_DEVICE_TABLE(of, th1520_pinctrl_of_match);
906
907 static struct platform_driver th1520_pinctrl_driver = {
908         .probe = th1520_pinctrl_probe,
909         .driver = {
910                 .name = "pinctrl-th1520",
911                 .of_match_table = th1520_pinctrl_of_match,
912         },
913 };
914 module_platform_driver(th1520_pinctrl_driver);
915
916 MODULE_DESCRIPTION("Pinctrl driver for the T-Head TH1520 SoC");
917 MODULE_AUTHOR("Emil Renner Berthing <[email protected]>");
918 MODULE_LICENSE("GPL");
This page took 0.079377 seconds and 4 git commands to generate.