xref: /linux/drivers/pinctrl/renesas/pinctrl-rzg2l.c (revision eafd95ea74846eda3e3eac6b2bb7f34619d8a6f8)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Renesas RZ/G2L Pin Control and GPIO driver core
4  *
5  * Copyright (C) 2021 Renesas Electronics Corporation.
6  */
7 
8 #include <linux/bitfield.h>
9 #include <linux/bitops.h>
10 #include <linux/clk.h>
11 #include <linux/gpio/driver.h>
12 #include <linux/interrupt.h>
13 #include <linux/io.h>
14 #include <linux/module.h>
15 #include <linux/mutex.h>
16 #include <linux/of.h>
17 #include <linux/of_irq.h>
18 #include <linux/platform_device.h>
19 #include <linux/property.h>
20 #include <linux/seq_file.h>
21 #include <linux/spinlock.h>
22 
23 #include <linux/pinctrl/consumer.h>
24 #include <linux/pinctrl/pinconf-generic.h>
25 #include <linux/pinctrl/pinconf.h>
26 #include <linux/pinctrl/pinctrl.h>
27 #include <linux/pinctrl/pinmux.h>
28 
29 #include <dt-bindings/pinctrl/renesas,r9a09g047-pinctrl.h>
30 #include <dt-bindings/pinctrl/renesas,r9a09g057-pinctrl.h>
31 #include <dt-bindings/pinctrl/rzg2l-pinctrl.h>
32 
33 #include "../core.h"
34 #include "../pinconf.h"
35 #include "../pinmux.h"
36 
37 #define DRV_NAME	"pinctrl-rzg2l"
38 
39 /*
40  * Use 16 lower bits [15:0] for pin identifier
41  * Use 16 higher bits [31:16] for pin mux function
42  */
43 #define MUX_PIN_ID_MASK		GENMASK(15, 0)
44 #define MUX_FUNC_MASK		GENMASK(31, 16)
45 
46 /* PIN capabilities */
47 #define PIN_CFG_IOLH_A			BIT(0)
48 #define PIN_CFG_IOLH_B			BIT(1)
49 #define PIN_CFG_SR			BIT(2)
50 #define PIN_CFG_IEN			BIT(3)
51 #define PIN_CFG_PUPD			BIT(4)
52 #define PIN_CFG_IO_VMC_SD0		BIT(5)
53 #define PIN_CFG_IO_VMC_SD1		BIT(6)
54 #define PIN_CFG_IO_VMC_QSPI		BIT(7)
55 #define PIN_CFG_IO_VMC_ETH0		BIT(8)
56 #define PIN_CFG_IO_VMC_ETH1		BIT(9)
57 #define PIN_CFG_NF			BIT(10)	/* Digital noise filter */
58 #define PIN_CFG_IOLH_C			BIT(11)
59 #define PIN_CFG_SOFT_PS			BIT(12)
60 #define PIN_CFG_OEN			BIT(13)
61 #define PIN_CFG_NOGPIO_INT		BIT(14)
62 #define PIN_CFG_NOD			BIT(15)	/* N-ch Open Drain */
63 #define PIN_CFG_SMT			BIT(16)	/* Schmitt-trigger input control */
64 #define PIN_CFG_ELC			BIT(17)
65 #define PIN_CFG_IOLH_RZV2H		BIT(18)
66 
67 #define RZG2L_SINGLE_PIN		BIT_ULL(63)	/* Dedicated pin */
68 #define RZG2L_VARIABLE_CFG		BIT_ULL(62)	/* Variable cfg for port pins */
69 
70 #define RZG2L_MPXED_COMMON_PIN_FUNCS(group) \
71 					(PIN_CFG_IOLH_##group | \
72 					 PIN_CFG_PUPD | \
73 					 PIN_CFG_NF)
74 
75 #define RZG2L_MPXED_PIN_FUNCS		(RZG2L_MPXED_COMMON_PIN_FUNCS(A) | \
76 					 PIN_CFG_SR)
77 
78 #define RZG3S_MPXED_PIN_FUNCS(group)	(RZG2L_MPXED_COMMON_PIN_FUNCS(group) | \
79 					 PIN_CFG_SOFT_PS)
80 
81 #define RZV2H_MPXED_PIN_FUNCS		(RZG2L_MPXED_COMMON_PIN_FUNCS(RZV2H) | \
82 					 PIN_CFG_NOD | \
83 					 PIN_CFG_SR | \
84 					 PIN_CFG_SMT)
85 
86 #define RZG2L_MPXED_ETH_PIN_FUNCS(x)	((x) | PIN_CFG_NF)
87 
88 #define PIN_CFG_PIN_MAP_MASK		GENMASK_ULL(61, 54)
89 #define PIN_CFG_PIN_REG_MASK		GENMASK_ULL(53, 46)
90 #define PIN_CFG_MASK			GENMASK_ULL(31, 0)
91 
92 /*
93  * m indicates the bitmap of supported pins, a is the register index
94  * and f is pin configuration capabilities supported.
95  */
96 #define RZG2L_GPIO_PORT_SPARSE_PACK(m, a, f)	(FIELD_PREP_CONST(PIN_CFG_PIN_MAP_MASK, (m)) | \
97 						 FIELD_PREP_CONST(PIN_CFG_PIN_REG_MASK, (a)) | \
98 						 FIELD_PREP_CONST(PIN_CFG_MASK, (f)))
99 #define RZG2L_GPIO_PORT_SPARSE_PACK_VARIABLE(m, a)	\
100 						(RZG2L_VARIABLE_CFG | \
101 						 RZG2L_GPIO_PORT_SPARSE_PACK(m, a, 0))
102 
103 /*
104  * n indicates number of pins in the port, a is the register index
105  * and f is pin configuration capabilities supported.
106  */
107 #define RZG2L_GPIO_PORT_PACK(n, a, f)	RZG2L_GPIO_PORT_SPARSE_PACK((1ULL << (n)) - 1, (a), (f))
108 #define RZG2L_GPIO_PORT_PACK_VARIABLE(n, a)	(RZG2L_VARIABLE_CFG | \
109 						 RZG2L_GPIO_PORT_PACK(n, a, 0))
110 
111 #define RZG2L_SINGLE_PIN_INDEX_MASK	GENMASK_ULL(62, 56)
112 #define RZG2L_SINGLE_PIN_BITS_MASK	GENMASK_ULL(55, 53)
113 /*
114  * p is the register index while referencing to SR/IEN/IOLH/FILxx
115  * registers, b is the register bits (b * 8) and f is the pin
116  * configuration capabilities supported.
117  */
118 #define RZG2L_SINGLE_PIN_PACK(p, b, f)	(RZG2L_SINGLE_PIN | \
119 					 FIELD_PREP_CONST(RZG2L_SINGLE_PIN_INDEX_MASK, (p)) | \
120 					 FIELD_PREP_CONST(RZG2L_SINGLE_PIN_BITS_MASK, (b)) | \
121 					 FIELD_PREP_CONST(PIN_CFG_MASK, (f)))
122 
123 #define RZG2L_PIN_CFG_TO_PORT_OFFSET(cfg)	((cfg) & RZG2L_SINGLE_PIN ? \
124 						 FIELD_GET(RZG2L_SINGLE_PIN_INDEX_MASK, (cfg)) : \
125 						 FIELD_GET(PIN_CFG_PIN_REG_MASK, (cfg)))
126 
127 #define VARIABLE_PIN_CFG_PIN_MASK		GENMASK_ULL(54, 52)
128 #define VARIABLE_PIN_CFG_PORT_MASK		GENMASK_ULL(51, 47)
129 #define RZG2L_VARIABLE_PIN_CFG_PACK(port, pin, cfg) \
130 	(FIELD_PREP_CONST(VARIABLE_PIN_CFG_PIN_MASK, (pin)) | \
131 	 FIELD_PREP_CONST(VARIABLE_PIN_CFG_PORT_MASK, (port)) | \
132 	 FIELD_PREP_CONST(PIN_CFG_MASK, (cfg)))
133 
134 #define P(off)			(0x0000 + (off))
135 #define PM(off)			(0x0100 + (off) * 2)
136 #define PMC(off)		(0x0200 + (off))
137 #define PFC(off)		(0x0400 + (off) * 4)
138 #define PIN(off)		(0x0800 + (off))
139 #define IOLH(off)		(0x1000 + (off) * 8)
140 #define SR(off)			(0x1400 + (off) * 8)
141 #define IEN(off)		(0x1800 + (off) * 8)
142 #define PUPD(off)		(0x1C00 + (off) * 8)
143 #define ISEL(off)		(0x2C00 + (off) * 8)
144 #define NOD(off)		(0x3000 + (off) * 8)
145 #define SMT(off)		(0x3400 + (off) * 8)
146 #define SD_CH(off, ch)		((off) + (ch) * 4)
147 #define ETH_POC(off, ch)	((off) + (ch) * 4)
148 #define QSPI			(0x3008)
149 #define ETH_MODE		(0x3018)
150 #define PFC_OEN			(0x3C40) /* known on RZ/V2H(P) only */
151 
152 #define PVDD_2500		2	/* I/O domain voltage 2.5V */
153 #define PVDD_1800		1	/* I/O domain voltage <= 1.8V */
154 #define PVDD_3300		0	/* I/O domain voltage >= 3.3V */
155 
156 #define PWPR_B0WI		BIT(7)	/* Bit Write Disable */
157 #define PWPR_PFCWE		BIT(6)	/* PFC Register Write Enable */
158 #define PWPR_REGWE_A		BIT(6)	/* PFC and PMC Register Write Enable on RZ/V2H(P) */
159 #define PWPR_REGWE_B		BIT(5)	/* OEN Register Write Enable, known only in RZ/V2H(P) */
160 
161 #define PM_MASK			0x03
162 #define PFC_MASK		0x0f
163 #define IEN_MASK		0x01
164 #define IOLH_MASK		0x03
165 #define SR_MASK			0x01
166 #define PUPD_MASK		0x03
167 #define NOD_MASK		0x01
168 #define SMT_MASK		0x01
169 
170 #define PM_INPUT		0x1
171 #define PM_OUTPUT		0x2
172 
173 #define RZG2L_PIN_ID_TO_PORT(id)	((id) / RZG2L_PINS_PER_PORT)
174 #define RZG2L_PIN_ID_TO_PIN(id)		((id) % RZG2L_PINS_PER_PORT)
175 
176 #define RZG2L_TINT_MAX_INTERRUPT	32
177 #define RZG2L_PACK_HWIRQ(t, i)		(((t) << 16) | (i))
178 
179 /* Custom pinconf parameters */
180 #define RENESAS_RZV2H_PIN_CONFIG_OUTPUT_IMPEDANCE	(PIN_CONFIG_END + 1)
181 
182 static const struct pinconf_generic_params renesas_rzv2h_custom_bindings[] = {
183 	{ "renesas,output-impedance", RENESAS_RZV2H_PIN_CONFIG_OUTPUT_IMPEDANCE, 1 },
184 };
185 
186 #ifdef CONFIG_DEBUG_FS
187 static const struct pin_config_item renesas_rzv2h_conf_items[] = {
188 	PCONFDUMP(RENESAS_RZV2H_PIN_CONFIG_OUTPUT_IMPEDANCE, "output-impedance", "x", true),
189 };
190 #endif
191 
192 /* Read/write 8 bits register */
193 #define RZG2L_PCTRL_REG_ACCESS8(_read, _addr, _val)	\
194 	do {						\
195 		if (_read)				\
196 			_val = readb(_addr);		\
197 		else					\
198 			writeb(_val, _addr);		\
199 	} while (0)
200 
201 /* Read/write 16 bits register */
202 #define RZG2L_PCTRL_REG_ACCESS16(_read, _addr, _val)	\
203 	do {						\
204 		if (_read)				\
205 			_val = readw(_addr);		\
206 		else					\
207 			writew(_val, _addr);		\
208 	} while (0)
209 
210 /* Read/write 32 bits register */
211 #define RZG2L_PCTRL_REG_ACCESS32(_read, _addr, _val)	\
212 	do {						\
213 		if (_read)				\
214 			_val = readl(_addr);		\
215 		else					\
216 			writel(_val, _addr);		\
217 	} while (0)
218 
219 /**
220  * struct rzg2l_register_offsets - specific register offsets
221  * @pwpr: PWPR register offset
222  * @sd_ch: SD_CH register offset
223  * @eth_poc: ETH_POC register offset
224  */
225 struct rzg2l_register_offsets {
226 	u16 pwpr;
227 	u16 sd_ch;
228 	u16 eth_poc;
229 };
230 
231 /**
232  * enum rzg2l_iolh_index - starting indices in IOLH specific arrays
233  * @RZG2L_IOLH_IDX_1V8: starting index for 1V8 power source
234  * @RZG2L_IOLH_IDX_2V5: starting index for 2V5 power source
235  * @RZG2L_IOLH_IDX_3V3: starting index for 3V3 power source
236  * @RZG2L_IOLH_IDX_MAX: maximum index
237  */
238 enum rzg2l_iolh_index {
239 	RZG2L_IOLH_IDX_1V8 = 0,
240 	RZG2L_IOLH_IDX_2V5 = 4,
241 	RZG2L_IOLH_IDX_3V3 = 8,
242 	RZG2L_IOLH_IDX_MAX = 12,
243 };
244 
245 /* Maximum number of driver strength entries per power source. */
246 #define RZG2L_IOLH_MAX_DS_ENTRIES	(4)
247 
248 /**
249  * struct rzg2l_hwcfg - hardware configuration data structure
250  * @regs: hardware specific register offsets
251  * @iolh_groupa_ua: IOLH group A uA specific values
252  * @iolh_groupb_ua: IOLH group B uA specific values
253  * @iolh_groupc_ua: IOLH group C uA specific values
254  * @iolh_groupb_oi: IOLH group B output impedance specific values
255  * @tint_start_index: the start index for the TINT interrupts
256  * @drive_strength_ua: drive strength in uA is supported (otherwise mA is supported)
257  * @func_base: base number for port function (see register PFC)
258  * @oen_max_pin: the maximum pin number supporting output enable
259  * @oen_max_port: the maximum port number supporting output enable
260  */
261 struct rzg2l_hwcfg {
262 	const struct rzg2l_register_offsets regs;
263 	u16 iolh_groupa_ua[RZG2L_IOLH_IDX_MAX];
264 	u16 iolh_groupb_ua[RZG2L_IOLH_IDX_MAX];
265 	u16 iolh_groupc_ua[RZG2L_IOLH_IDX_MAX];
266 	u16 iolh_groupb_oi[4];
267 	u16 tint_start_index;
268 	bool drive_strength_ua;
269 	u8 func_base;
270 	u8 oen_max_pin;
271 	u8 oen_max_port;
272 };
273 
274 struct rzg2l_dedicated_configs {
275 	const char *name;
276 	u64 config;
277 };
278 
279 struct rzg2l_pinctrl;
280 
281 struct rzg2l_pinctrl_data {
282 	const char * const *port_pins;
283 	const u64 *port_pin_configs;
284 	unsigned int n_ports;
285 	const struct rzg2l_dedicated_configs *dedicated_pins;
286 	unsigned int n_port_pins;
287 	unsigned int n_dedicated_pins;
288 	const struct rzg2l_hwcfg *hwcfg;
289 	const u64 *variable_pin_cfg;
290 	unsigned int n_variable_pin_cfg;
291 	unsigned int num_custom_params;
292 	const struct pinconf_generic_params *custom_params;
293 #ifdef CONFIG_DEBUG_FS
294 	const struct pin_config_item *custom_conf_items;
295 #endif
296 	void (*pwpr_pfc_lock_unlock)(struct rzg2l_pinctrl *pctrl, bool lock);
297 	void (*pmc_writeb)(struct rzg2l_pinctrl *pctrl, u8 val, u16 offset);
298 	u32 (*oen_read)(struct rzg2l_pinctrl *pctrl, unsigned int _pin);
299 	int (*oen_write)(struct rzg2l_pinctrl *pctrl, unsigned int _pin, u8 oen);
300 	int (*hw_to_bias_param)(unsigned int val);
301 	int (*bias_param_to_hw)(enum pin_config_param param);
302 };
303 
304 /**
305  * struct rzg2l_pinctrl_pin_settings - pin data
306  * @power_source: power source
307  * @drive_strength_ua: drive strength (in micro amps)
308  */
309 struct rzg2l_pinctrl_pin_settings {
310 	u16 power_source;
311 	u16 drive_strength_ua;
312 };
313 
314 /**
315  * struct rzg2l_pinctrl_reg_cache - register cache structure (to be used in suspend/resume)
316  * @p: P registers cache
317  * @pm: PM registers cache
318  * @pmc: PMC registers cache
319  * @pfc: PFC registers cache
320  * @iolh: IOLH registers cache
321  * @pupd: PUPD registers cache
322  * @ien: IEN registers cache
323  * @sd_ch: SD_CH registers cache
324  * @eth_poc: ET_POC registers cache
325  * @eth_mode: ETH_MODE register cache
326  * @qspi: QSPI registers cache
327  */
328 struct rzg2l_pinctrl_reg_cache {
329 	u8	*p;
330 	u16	*pm;
331 	u8	*pmc;
332 	u32	*pfc;
333 	u32	*iolh[2];
334 	u32	*ien[2];
335 	u32	*pupd[2];
336 	u8	sd_ch[2];
337 	u8	eth_poc[2];
338 	u8	eth_mode;
339 	u8	qspi;
340 };
341 
342 struct rzg2l_pinctrl {
343 	struct pinctrl_dev		*pctl;
344 	struct pinctrl_desc		desc;
345 	struct pinctrl_pin_desc		*pins;
346 
347 	const struct rzg2l_pinctrl_data	*data;
348 	void __iomem			*base;
349 	struct device			*dev;
350 
351 	struct clk			*clk;
352 
353 	struct gpio_chip		gpio_chip;
354 	struct pinctrl_gpio_range	gpio_range;
355 	DECLARE_BITMAP(tint_slot, RZG2L_TINT_MAX_INTERRUPT);
356 	spinlock_t			bitmap_lock; /* protect tint_slot bitmap */
357 	unsigned int			hwirq[RZG2L_TINT_MAX_INTERRUPT];
358 
359 	spinlock_t			lock; /* lock read/write registers */
360 	struct mutex			mutex; /* serialize adding groups and functions */
361 
362 	struct rzg2l_pinctrl_pin_settings *settings;
363 	struct rzg2l_pinctrl_reg_cache	*cache;
364 	struct rzg2l_pinctrl_reg_cache	*dedicated_cache;
365 	atomic_t			wakeup_path;
366 };
367 
368 static const u16 available_ps[] = { 1800, 2500, 3300 };
369 
rzg2l_pinctrl_get_variable_pin_cfg(struct rzg2l_pinctrl * pctrl,u64 pincfg,unsigned int port,u8 pin)370 static u64 rzg2l_pinctrl_get_variable_pin_cfg(struct rzg2l_pinctrl *pctrl,
371 					      u64 pincfg,
372 					      unsigned int port,
373 					      u8 pin)
374 {
375 	unsigned int i;
376 
377 	for (i = 0; i < pctrl->data->n_variable_pin_cfg; i++) {
378 		u64 cfg = pctrl->data->variable_pin_cfg[i];
379 
380 		if (FIELD_GET(VARIABLE_PIN_CFG_PORT_MASK, cfg) == port &&
381 		    FIELD_GET(VARIABLE_PIN_CFG_PIN_MASK, cfg) == pin)
382 			return (pincfg & ~RZG2L_VARIABLE_CFG) | FIELD_GET(PIN_CFG_MASK, cfg);
383 	}
384 
385 	return 0;
386 }
387 
388 static const u64 r9a09g047_variable_pin_cfg[] = {
389 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 0, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
390 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 1, RZV2H_MPXED_PIN_FUNCS),
391 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 2, RZV2H_MPXED_PIN_FUNCS),
392 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 3, RZV2H_MPXED_PIN_FUNCS),
393 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 4, RZV2H_MPXED_PIN_FUNCS),
394 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 5, RZV2H_MPXED_PIN_FUNCS),
395 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 6, RZV2H_MPXED_PIN_FUNCS),
396 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PA, 7, RZV2H_MPXED_PIN_FUNCS),
397 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 0, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
398 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 1, RZV2H_MPXED_PIN_FUNCS),
399 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 2, RZV2H_MPXED_PIN_FUNCS),
400 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 3, RZV2H_MPXED_PIN_FUNCS),
401 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 4, RZV2H_MPXED_PIN_FUNCS),
402 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 5, RZV2H_MPXED_PIN_FUNCS),
403 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 6, RZV2H_MPXED_PIN_FUNCS),
404 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PD, 7, RZV2H_MPXED_PIN_FUNCS),
405 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 0, RZV2H_MPXED_PIN_FUNCS),
406 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 1, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
407 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 2, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
408 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 3, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
409 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 4, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
410 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 5, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
411 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 6, RZV2H_MPXED_PIN_FUNCS),
412 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PG, 7, RZV2H_MPXED_PIN_FUNCS),
413 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 0, RZV2H_MPXED_PIN_FUNCS),
414 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 1, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
415 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 2, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
416 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 3, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
417 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 4, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
418 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PH, 5, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
419 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 0, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
420 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 1, RZV2H_MPXED_PIN_FUNCS),
421 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 2, RZV2H_MPXED_PIN_FUNCS),
422 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 3, RZV2H_MPXED_PIN_FUNCS),
423 	RZG2L_VARIABLE_PIN_CFG_PACK(RZG3E_PJ, 4, RZV2H_MPXED_PIN_FUNCS),
424 };
425 
426 static const u64 r9a09g057_variable_pin_cfg[] = {
427 	RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 0, RZV2H_MPXED_PIN_FUNCS),
428 	RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 1, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
429 	RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 2, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
430 	RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 3, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
431 	RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 4, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
432 	RZG2L_VARIABLE_PIN_CFG_PACK(RZV2H_PB, 5, RZV2H_MPXED_PIN_FUNCS | PIN_CFG_IEN),
433 };
434 
435 #ifdef CONFIG_RISCV
436 static const u64 r9a07g043f_variable_pin_cfg[] = {
437 	RZG2L_VARIABLE_PIN_CFG_PACK(20, 0, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
438 					   PIN_CFG_NF |
439 					   PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),
440 	RZG2L_VARIABLE_PIN_CFG_PACK(20, 1, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
441 					   PIN_CFG_NF |
442 					   PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),
443 	RZG2L_VARIABLE_PIN_CFG_PACK(20, 2, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
444 					   PIN_CFG_NF |
445 					   PIN_CFG_IEN  | PIN_CFG_NOGPIO_INT),
446 	RZG2L_VARIABLE_PIN_CFG_PACK(20, 3, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
447 					   PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),
448 	RZG2L_VARIABLE_PIN_CFG_PACK(20, 4, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
449 					   PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),
450 	RZG2L_VARIABLE_PIN_CFG_PACK(20, 5, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
451 					   PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),
452 	RZG2L_VARIABLE_PIN_CFG_PACK(20, 6, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
453 					   PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),
454 	RZG2L_VARIABLE_PIN_CFG_PACK(20, 7, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
455 					   PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),
456 	RZG2L_VARIABLE_PIN_CFG_PACK(23, 1, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
457 					   PIN_CFG_NOGPIO_INT),
458 	RZG2L_VARIABLE_PIN_CFG_PACK(23, 2, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
459 					   PIN_CFG_NOGPIO_INT),
460 	RZG2L_VARIABLE_PIN_CFG_PACK(23, 3, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
461 					   PIN_CFG_NOGPIO_INT),
462 	RZG2L_VARIABLE_PIN_CFG_PACK(23, 4, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
463 					   PIN_CFG_NOGPIO_INT),
464 	RZG2L_VARIABLE_PIN_CFG_PACK(23, 5, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_NOGPIO_INT),
465 	RZG2L_VARIABLE_PIN_CFG_PACK(24, 0, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_NOGPIO_INT),
466 	RZG2L_VARIABLE_PIN_CFG_PACK(24, 1, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
467 					   PIN_CFG_NOGPIO_INT),
468 	RZG2L_VARIABLE_PIN_CFG_PACK(24, 2, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
469 					   PIN_CFG_NOGPIO_INT),
470 	RZG2L_VARIABLE_PIN_CFG_PACK(24, 3, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
471 					   PIN_CFG_NOGPIO_INT),
472 	RZG2L_VARIABLE_PIN_CFG_PACK(24, 4, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
473 					   PIN_CFG_NOGPIO_INT),
474 	RZG2L_VARIABLE_PIN_CFG_PACK(24, 5, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
475 					   PIN_CFG_NF |
476 					   PIN_CFG_NOGPIO_INT),
477 };
478 #endif
479 
rzg2l_pmc_writeb(struct rzg2l_pinctrl * pctrl,u8 val,u16 offset)480 static void rzg2l_pmc_writeb(struct rzg2l_pinctrl *pctrl, u8 val, u16 offset)
481 {
482 	writeb(val, pctrl->base + offset);
483 }
484 
rzv2h_pmc_writeb(struct rzg2l_pinctrl * pctrl,u8 val,u16 offset)485 static void rzv2h_pmc_writeb(struct rzg2l_pinctrl *pctrl, u8 val, u16 offset)
486 {
487 	const struct rzg2l_register_offsets *regs = &pctrl->data->hwcfg->regs;
488 	u8 pwpr;
489 
490 	pwpr = readb(pctrl->base + regs->pwpr);
491 	writeb(pwpr | PWPR_REGWE_A, pctrl->base + regs->pwpr);
492 	writeb(val, pctrl->base + offset);
493 	writeb(pwpr & ~PWPR_REGWE_A, pctrl->base + regs->pwpr);
494 }
495 
rzg2l_pinctrl_set_pfc_mode(struct rzg2l_pinctrl * pctrl,u8 pin,u8 off,u8 func)496 static void rzg2l_pinctrl_set_pfc_mode(struct rzg2l_pinctrl *pctrl,
497 				       u8 pin, u8 off, u8 func)
498 {
499 	unsigned long flags;
500 	u32 reg;
501 
502 	spin_lock_irqsave(&pctrl->lock, flags);
503 
504 	/* Set pin to 'Non-use (Hi-Z input protection)'  */
505 	reg = readw(pctrl->base + PM(off));
506 	reg &= ~(PM_MASK << (pin * 2));
507 	writew(reg, pctrl->base + PM(off));
508 
509 	pctrl->data->pwpr_pfc_lock_unlock(pctrl, false);
510 
511 	/* Temporarily switch to GPIO mode with PMC register */
512 	reg = readb(pctrl->base + PMC(off));
513 	writeb(reg & ~BIT(pin), pctrl->base + PMC(off));
514 
515 	/* Select Pin function mode with PFC register */
516 	reg = readl(pctrl->base + PFC(off));
517 	reg &= ~(PFC_MASK << (pin * 4));
518 	writel(reg | (func << (pin * 4)), pctrl->base + PFC(off));
519 
520 	/* Switch to Peripheral pin function with PMC register */
521 	reg = readb(pctrl->base + PMC(off));
522 	writeb(reg | BIT(pin), pctrl->base + PMC(off));
523 
524 	pctrl->data->pwpr_pfc_lock_unlock(pctrl, true);
525 
526 	spin_unlock_irqrestore(&pctrl->lock, flags);
527 };
528 
rzg2l_pinctrl_set_mux(struct pinctrl_dev * pctldev,unsigned int func_selector,unsigned int group_selector)529 static int rzg2l_pinctrl_set_mux(struct pinctrl_dev *pctldev,
530 				 unsigned int func_selector,
531 				 unsigned int group_selector)
532 {
533 	struct rzg2l_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
534 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
535 	struct function_desc *func;
536 	unsigned int i, *psel_val;
537 	struct group_desc *group;
538 	const unsigned int *pins;
539 
540 	func = pinmux_generic_get_function(pctldev, func_selector);
541 	if (!func)
542 		return -EINVAL;
543 	group = pinctrl_generic_get_group(pctldev, group_selector);
544 	if (!group)
545 		return -EINVAL;
546 
547 	psel_val = func->data;
548 	pins = group->grp.pins;
549 
550 	for (i = 0; i < group->grp.npins; i++) {
551 		u64 *pin_data = pctrl->desc.pins[pins[i]].drv_data;
552 		u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
553 		u32 pin = RZG2L_PIN_ID_TO_PIN(pins[i]);
554 
555 		dev_dbg(pctrl->dev, "port:%u pin: %u off:%x PSEL:%u\n",
556 			RZG2L_PIN_ID_TO_PORT(pins[i]), pin, off, psel_val[i] - hwcfg->func_base);
557 
558 		rzg2l_pinctrl_set_pfc_mode(pctrl, pin, off, psel_val[i] - hwcfg->func_base);
559 	}
560 
561 	return 0;
562 };
563 
rzg2l_map_add_config(struct pinctrl_map * map,const char * group_or_pin,enum pinctrl_map_type type,unsigned long * configs,unsigned int num_configs)564 static int rzg2l_map_add_config(struct pinctrl_map *map,
565 				const char *group_or_pin,
566 				enum pinctrl_map_type type,
567 				unsigned long *configs,
568 				unsigned int num_configs)
569 {
570 	unsigned long *cfgs;
571 
572 	cfgs = kmemdup_array(configs, num_configs, sizeof(*cfgs), GFP_KERNEL);
573 	if (!cfgs)
574 		return -ENOMEM;
575 
576 	map->type = type;
577 	map->data.configs.group_or_pin = group_or_pin;
578 	map->data.configs.configs = cfgs;
579 	map->data.configs.num_configs = num_configs;
580 
581 	return 0;
582 }
583 
rzg2l_dt_subnode_to_map(struct pinctrl_dev * pctldev,struct device_node * np,struct device_node * parent,struct pinctrl_map ** map,unsigned int * num_maps,unsigned int * index)584 static int rzg2l_dt_subnode_to_map(struct pinctrl_dev *pctldev,
585 				   struct device_node *np,
586 				   struct device_node *parent,
587 				   struct pinctrl_map **map,
588 				   unsigned int *num_maps,
589 				   unsigned int *index)
590 {
591 	struct rzg2l_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
592 	struct pinctrl_map *maps = *map;
593 	unsigned int nmaps = *num_maps;
594 	unsigned long *configs = NULL;
595 	unsigned int *pins, *psel_val;
596 	unsigned int num_pinmux = 0;
597 	unsigned int idx = *index;
598 	unsigned int num_pins, i;
599 	unsigned int num_configs;
600 	struct property *pinmux;
601 	struct property *prop;
602 	int ret, gsel, fsel;
603 	const char **pin_fn;
604 	const char *name;
605 	const char *pin;
606 
607 	pinmux = of_find_property(np, "pinmux", NULL);
608 	if (pinmux)
609 		num_pinmux = pinmux->length / sizeof(u32);
610 
611 	ret = of_property_count_strings(np, "pins");
612 	if (ret == -EINVAL) {
613 		num_pins = 0;
614 	} else if (ret < 0) {
615 		dev_err(pctrl->dev, "Invalid pins list in DT\n");
616 		return ret;
617 	} else {
618 		num_pins = ret;
619 	}
620 
621 	if (!num_pinmux && !num_pins)
622 		return 0;
623 
624 	if (num_pinmux && num_pins) {
625 		dev_err(pctrl->dev,
626 			"DT node must contain either a pinmux or pins and not both\n");
627 		return -EINVAL;
628 	}
629 
630 	ret = pinconf_generic_parse_dt_config(np, pctldev, &configs, &num_configs);
631 	if (ret < 0)
632 		return ret;
633 
634 	if (num_pins && !num_configs) {
635 		dev_err(pctrl->dev, "DT node must contain a config\n");
636 		ret = -ENODEV;
637 		goto done;
638 	}
639 
640 	if (num_pinmux) {
641 		nmaps += 1;
642 		if (num_configs)
643 			nmaps += 1;
644 	}
645 
646 	if (num_pins)
647 		nmaps += num_pins;
648 
649 	maps = krealloc_array(maps, nmaps, sizeof(*maps), GFP_KERNEL);
650 	if (!maps) {
651 		ret = -ENOMEM;
652 		goto done;
653 	}
654 
655 	*map = maps;
656 	*num_maps = nmaps;
657 	if (num_pins) {
658 		of_property_for_each_string(np, "pins", prop, pin) {
659 			ret = rzg2l_map_add_config(&maps[idx], pin,
660 						   PIN_MAP_TYPE_CONFIGS_PIN,
661 						   configs, num_configs);
662 			if (ret < 0)
663 				goto done;
664 
665 			idx++;
666 		}
667 		ret = 0;
668 		goto done;
669 	}
670 
671 	pins = devm_kcalloc(pctrl->dev, num_pinmux, sizeof(*pins), GFP_KERNEL);
672 	psel_val = devm_kcalloc(pctrl->dev, num_pinmux, sizeof(*psel_val),
673 				GFP_KERNEL);
674 	pin_fn = devm_kzalloc(pctrl->dev, sizeof(*pin_fn), GFP_KERNEL);
675 	if (!pins || !psel_val || !pin_fn) {
676 		ret = -ENOMEM;
677 		goto done;
678 	}
679 
680 	/* Collect pin locations and mux settings from DT properties */
681 	for (i = 0; i < num_pinmux; ++i) {
682 		u32 value;
683 
684 		ret = of_property_read_u32_index(np, "pinmux", i, &value);
685 		if (ret)
686 			goto done;
687 		pins[i] = FIELD_GET(MUX_PIN_ID_MASK, value);
688 		psel_val[i] = FIELD_GET(MUX_FUNC_MASK, value);
689 	}
690 
691 	if (parent) {
692 		name = devm_kasprintf(pctrl->dev, GFP_KERNEL, "%pOFn.%pOFn",
693 				      parent, np);
694 		if (!name) {
695 			ret = -ENOMEM;
696 			goto done;
697 		}
698 	} else {
699 		name = np->name;
700 	}
701 
702 	if (num_configs) {
703 		ret = rzg2l_map_add_config(&maps[idx], name,
704 					   PIN_MAP_TYPE_CONFIGS_GROUP,
705 					   configs, num_configs);
706 		if (ret < 0)
707 			goto done;
708 
709 		idx++;
710 	}
711 
712 	mutex_lock(&pctrl->mutex);
713 
714 	/* Register a single pin group listing all the pins we read from DT */
715 	gsel = pinctrl_generic_add_group(pctldev, name, pins, num_pinmux, NULL);
716 	if (gsel < 0) {
717 		ret = gsel;
718 		goto unlock;
719 	}
720 
721 	/*
722 	 * Register a single group function where the 'data' is an array PSEL
723 	 * register values read from DT.
724 	 */
725 	pin_fn[0] = name;
726 	fsel = pinmux_generic_add_function(pctldev, name, pin_fn, 1, psel_val);
727 	if (fsel < 0) {
728 		ret = fsel;
729 		goto remove_group;
730 	}
731 
732 	mutex_unlock(&pctrl->mutex);
733 
734 	maps[idx].type = PIN_MAP_TYPE_MUX_GROUP;
735 	maps[idx].data.mux.group = name;
736 	maps[idx].data.mux.function = name;
737 	idx++;
738 
739 	dev_dbg(pctrl->dev, "Parsed %pOF with %d pins\n", np, num_pinmux);
740 	ret = 0;
741 	goto done;
742 
743 remove_group:
744 	pinctrl_generic_remove_group(pctldev, gsel);
745 unlock:
746 	mutex_unlock(&pctrl->mutex);
747 done:
748 	*index = idx;
749 	kfree(configs);
750 	return ret;
751 }
752 
rzg2l_dt_free_map(struct pinctrl_dev * pctldev,struct pinctrl_map * map,unsigned int num_maps)753 static void rzg2l_dt_free_map(struct pinctrl_dev *pctldev,
754 			      struct pinctrl_map *map,
755 			      unsigned int num_maps)
756 {
757 	unsigned int i;
758 
759 	if (!map)
760 		return;
761 
762 	for (i = 0; i < num_maps; ++i) {
763 		if (map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP ||
764 		    map[i].type == PIN_MAP_TYPE_CONFIGS_PIN)
765 			kfree(map[i].data.configs.configs);
766 	}
767 	kfree(map);
768 }
769 
rzg2l_dt_node_to_map(struct pinctrl_dev * pctldev,struct device_node * np,struct pinctrl_map ** map,unsigned int * num_maps)770 static int rzg2l_dt_node_to_map(struct pinctrl_dev *pctldev,
771 				struct device_node *np,
772 				struct pinctrl_map **map,
773 				unsigned int *num_maps)
774 {
775 	struct rzg2l_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
776 	unsigned int index;
777 	int ret;
778 
779 	*map = NULL;
780 	*num_maps = 0;
781 	index = 0;
782 
783 	for_each_child_of_node_scoped(np, child) {
784 		ret = rzg2l_dt_subnode_to_map(pctldev, child, np, map,
785 					      num_maps, &index);
786 		if (ret < 0)
787 			goto done;
788 	}
789 
790 	if (*num_maps == 0) {
791 		ret = rzg2l_dt_subnode_to_map(pctldev, np, NULL, map,
792 					      num_maps, &index);
793 		if (ret < 0)
794 			goto done;
795 	}
796 
797 	if (*num_maps)
798 		return 0;
799 
800 	dev_err(pctrl->dev, "no mapping found in node %pOF\n", np);
801 	ret = -EINVAL;
802 
803 done:
804 	rzg2l_dt_free_map(pctldev, *map, *num_maps);
805 
806 	return ret;
807 }
808 
rzg2l_validate_gpio_pin(struct rzg2l_pinctrl * pctrl,u64 cfg,u32 port,u8 bit)809 static int rzg2l_validate_gpio_pin(struct rzg2l_pinctrl *pctrl,
810 				   u64 cfg, u32 port, u8 bit)
811 {
812 	u8 pinmap = FIELD_GET(PIN_CFG_PIN_MAP_MASK, cfg);
813 	u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(cfg);
814 	u64 data;
815 
816 	if (!(pinmap & BIT(bit)) || port >= pctrl->data->n_port_pins)
817 		return -EINVAL;
818 
819 	data = pctrl->data->port_pin_configs[port];
820 	if (off != RZG2L_PIN_CFG_TO_PORT_OFFSET(data))
821 		return -EINVAL;
822 
823 	return 0;
824 }
825 
rzg2l_read_pin_config(struct rzg2l_pinctrl * pctrl,u32 offset,u8 bit,u32 mask)826 static u32 rzg2l_read_pin_config(struct rzg2l_pinctrl *pctrl, u32 offset,
827 				 u8 bit, u32 mask)
828 {
829 	void __iomem *addr = pctrl->base + offset;
830 
831 	/* handle _L/_H for 32-bit register read/write */
832 	if (bit >= 4) {
833 		bit -= 4;
834 		addr += 4;
835 	}
836 
837 	return (readl(addr) >> (bit * 8)) & mask;
838 }
839 
rzg2l_rmw_pin_config(struct rzg2l_pinctrl * pctrl,u32 offset,u8 bit,u32 mask,u32 val)840 static void rzg2l_rmw_pin_config(struct rzg2l_pinctrl *pctrl, u32 offset,
841 				 u8 bit, u32 mask, u32 val)
842 {
843 	void __iomem *addr = pctrl->base + offset;
844 	unsigned long flags;
845 	u32 reg;
846 
847 	/* handle _L/_H for 32-bit register read/write */
848 	if (bit >= 4) {
849 		bit -= 4;
850 		addr += 4;
851 	}
852 
853 	spin_lock_irqsave(&pctrl->lock, flags);
854 	reg = readl(addr) & ~(mask << (bit * 8));
855 	writel(reg | (val << (bit * 8)), addr);
856 	spin_unlock_irqrestore(&pctrl->lock, flags);
857 }
858 
rzg2l_caps_to_pwr_reg(const struct rzg2l_register_offsets * regs,u32 caps)859 static int rzg2l_caps_to_pwr_reg(const struct rzg2l_register_offsets *regs, u32 caps)
860 {
861 	if (caps & PIN_CFG_IO_VMC_SD0)
862 		return SD_CH(regs->sd_ch, 0);
863 	if (caps & PIN_CFG_IO_VMC_SD1)
864 		return SD_CH(regs->sd_ch, 1);
865 	if (caps & PIN_CFG_IO_VMC_ETH0)
866 		return ETH_POC(regs->eth_poc, 0);
867 	if (caps & PIN_CFG_IO_VMC_ETH1)
868 		return ETH_POC(regs->eth_poc, 1);
869 	if (caps & PIN_CFG_IO_VMC_QSPI)
870 		return QSPI;
871 
872 	return -EINVAL;
873 }
874 
rzg2l_get_power_source(struct rzg2l_pinctrl * pctrl,u32 pin,u32 caps)875 static int rzg2l_get_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps)
876 {
877 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
878 	const struct rzg2l_register_offsets *regs = &hwcfg->regs;
879 	int pwr_reg;
880 	u8 val;
881 
882 	if (caps & PIN_CFG_SOFT_PS)
883 		return pctrl->settings[pin].power_source;
884 
885 	pwr_reg = rzg2l_caps_to_pwr_reg(regs, caps);
886 	if (pwr_reg < 0)
887 		return pwr_reg;
888 
889 	val = readb(pctrl->base + pwr_reg);
890 	switch (val) {
891 	case PVDD_1800:
892 		return 1800;
893 	case PVDD_2500:
894 		return 2500;
895 	case PVDD_3300:
896 		return 3300;
897 	default:
898 		/* Should not happen. */
899 		return -EINVAL;
900 	}
901 }
902 
rzg2l_set_power_source(struct rzg2l_pinctrl * pctrl,u32 pin,u32 caps,u32 ps)903 static int rzg2l_set_power_source(struct rzg2l_pinctrl *pctrl, u32 pin, u32 caps, u32 ps)
904 {
905 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
906 	const struct rzg2l_register_offsets *regs = &hwcfg->regs;
907 	int pwr_reg;
908 	u8 val;
909 
910 	if (caps & PIN_CFG_SOFT_PS) {
911 		pctrl->settings[pin].power_source = ps;
912 		return 0;
913 	}
914 
915 	switch (ps) {
916 	case 1800:
917 		val = PVDD_1800;
918 		break;
919 	case 2500:
920 		if (!(caps & (PIN_CFG_IO_VMC_ETH0 | PIN_CFG_IO_VMC_ETH1)))
921 			return -EINVAL;
922 		val = PVDD_2500;
923 		break;
924 	case 3300:
925 		val = PVDD_3300;
926 		break;
927 	default:
928 		return -EINVAL;
929 	}
930 
931 	pwr_reg = rzg2l_caps_to_pwr_reg(regs, caps);
932 	if (pwr_reg < 0)
933 		return pwr_reg;
934 
935 	writeb(val, pctrl->base + pwr_reg);
936 	pctrl->settings[pin].power_source = ps;
937 
938 	return 0;
939 }
940 
rzg2l_ps_is_supported(u16 ps)941 static bool rzg2l_ps_is_supported(u16 ps)
942 {
943 	unsigned int i;
944 
945 	for (i = 0; i < ARRAY_SIZE(available_ps); i++) {
946 		if (available_ps[i] == ps)
947 			return true;
948 	}
949 
950 	return false;
951 }
952 
rzg2l_ps_to_iolh_idx(u16 ps)953 static enum rzg2l_iolh_index rzg2l_ps_to_iolh_idx(u16 ps)
954 {
955 	unsigned int i;
956 
957 	for (i = 0; i < ARRAY_SIZE(available_ps); i++) {
958 		if (available_ps[i] == ps)
959 			break;
960 	}
961 
962 	/*
963 	 * We multiply with RZG2L_IOLH_MAX_DS_ENTRIES as we have
964 	 * RZG2L_IOLH_MAX_DS_ENTRIES DS values per power source
965 	 */
966 	return i * RZG2L_IOLH_MAX_DS_ENTRIES;
967 }
968 
rzg2l_iolh_val_to_ua(const struct rzg2l_hwcfg * hwcfg,u32 caps,u8 val)969 static u16 rzg2l_iolh_val_to_ua(const struct rzg2l_hwcfg *hwcfg, u32 caps, u8 val)
970 {
971 	if (caps & PIN_CFG_IOLH_A)
972 		return hwcfg->iolh_groupa_ua[val];
973 
974 	if (caps & PIN_CFG_IOLH_B)
975 		return hwcfg->iolh_groupb_ua[val];
976 
977 	if (caps & PIN_CFG_IOLH_C)
978 		return hwcfg->iolh_groupc_ua[val];
979 
980 	/* Should not happen. */
981 	return 0;
982 }
983 
rzg2l_iolh_ua_to_val(const struct rzg2l_hwcfg * hwcfg,u32 caps,enum rzg2l_iolh_index ps_index,u16 ua)984 static int rzg2l_iolh_ua_to_val(const struct rzg2l_hwcfg *hwcfg, u32 caps,
985 				enum rzg2l_iolh_index ps_index, u16 ua)
986 {
987 	const u16 *array = NULL;
988 	unsigned int i;
989 
990 	if (caps & PIN_CFG_IOLH_A)
991 		array = &hwcfg->iolh_groupa_ua[ps_index];
992 
993 	if (caps & PIN_CFG_IOLH_B)
994 		array = &hwcfg->iolh_groupb_ua[ps_index];
995 
996 	if (caps & PIN_CFG_IOLH_C)
997 		array = &hwcfg->iolh_groupc_ua[ps_index];
998 
999 	if (!array)
1000 		return -EINVAL;
1001 
1002 	for (i = 0; i < RZG2L_IOLH_MAX_DS_ENTRIES; i++) {
1003 		if (array[i] == ua)
1004 			return i;
1005 	}
1006 
1007 	return -EINVAL;
1008 }
1009 
rzg2l_ds_is_supported(struct rzg2l_pinctrl * pctrl,u32 caps,enum rzg2l_iolh_index iolh_idx,u16 ds)1010 static bool rzg2l_ds_is_supported(struct rzg2l_pinctrl *pctrl, u32 caps,
1011 				  enum rzg2l_iolh_index iolh_idx,
1012 				  u16 ds)
1013 {
1014 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
1015 	const u16 *array = NULL;
1016 	unsigned int i;
1017 
1018 	if (caps & PIN_CFG_IOLH_A)
1019 		array = hwcfg->iolh_groupa_ua;
1020 
1021 	if (caps & PIN_CFG_IOLH_B)
1022 		array = hwcfg->iolh_groupb_ua;
1023 
1024 	if (caps & PIN_CFG_IOLH_C)
1025 		array = hwcfg->iolh_groupc_ua;
1026 
1027 	/* Should not happen. */
1028 	if (!array)
1029 		return false;
1030 
1031 	if (!array[iolh_idx])
1032 		return false;
1033 
1034 	for (i = 0; i < RZG2L_IOLH_MAX_DS_ENTRIES; i++) {
1035 		if (array[iolh_idx + i] == ds)
1036 			return true;
1037 	}
1038 
1039 	return false;
1040 }
1041 
rzg2l_pin_to_oen_bit(struct rzg2l_pinctrl * pctrl,unsigned int _pin)1042 static int rzg2l_pin_to_oen_bit(struct rzg2l_pinctrl *pctrl, unsigned int _pin)
1043 {
1044 	u64 *pin_data = pctrl->desc.pins[_pin].drv_data;
1045 	u64 caps = FIELD_GET(PIN_CFG_MASK, *pin_data);
1046 	u8 pin = RZG2L_PIN_ID_TO_PIN(_pin);
1047 
1048 	if (pin > pctrl->data->hwcfg->oen_max_pin)
1049 		return -EINVAL;
1050 
1051 	/*
1052 	 * We can determine which Ethernet interface we're dealing with from
1053 	 * the caps.
1054 	 */
1055 	if (caps & PIN_CFG_IO_VMC_ETH0)
1056 		return 0;
1057 	if (caps & PIN_CFG_IO_VMC_ETH1)
1058 		return 1;
1059 
1060 	return -EINVAL;
1061 }
1062 
rzg2l_read_oen(struct rzg2l_pinctrl * pctrl,unsigned int _pin)1063 static u32 rzg2l_read_oen(struct rzg2l_pinctrl *pctrl, unsigned int _pin)
1064 {
1065 	int bit;
1066 
1067 	bit = rzg2l_pin_to_oen_bit(pctrl, _pin);
1068 	if (bit < 0)
1069 		return 0;
1070 
1071 	return !(readb(pctrl->base + ETH_MODE) & BIT(bit));
1072 }
1073 
rzg2l_write_oen(struct rzg2l_pinctrl * pctrl,unsigned int _pin,u8 oen)1074 static int rzg2l_write_oen(struct rzg2l_pinctrl *pctrl, unsigned int _pin, u8 oen)
1075 {
1076 	unsigned long flags;
1077 	int bit;
1078 	u8 val;
1079 
1080 	bit = rzg2l_pin_to_oen_bit(pctrl, _pin);
1081 	if (bit < 0)
1082 		return bit;
1083 
1084 	spin_lock_irqsave(&pctrl->lock, flags);
1085 	val = readb(pctrl->base + ETH_MODE);
1086 	if (oen)
1087 		val &= ~BIT(bit);
1088 	else
1089 		val |= BIT(bit);
1090 	writeb(val, pctrl->base + ETH_MODE);
1091 	spin_unlock_irqrestore(&pctrl->lock, flags);
1092 
1093 	return 0;
1094 }
1095 
rzg3s_pin_to_oen_bit(struct rzg2l_pinctrl * pctrl,unsigned int _pin)1096 static int rzg3s_pin_to_oen_bit(struct rzg2l_pinctrl *pctrl, unsigned int _pin)
1097 {
1098 	u64 *pin_data = pctrl->desc.pins[_pin].drv_data;
1099 	u8 port, pin, bit;
1100 
1101 	if (*pin_data & RZG2L_SINGLE_PIN)
1102 		return -EINVAL;
1103 
1104 	port = RZG2L_PIN_ID_TO_PORT(_pin);
1105 	pin = RZG2L_PIN_ID_TO_PIN(_pin);
1106 	if (pin > pctrl->data->hwcfg->oen_max_pin)
1107 		return -EINVAL;
1108 
1109 	bit = pin * 2;
1110 	if (port == pctrl->data->hwcfg->oen_max_port)
1111 		bit += 1;
1112 
1113 	return bit;
1114 }
1115 
rzg3s_oen_read(struct rzg2l_pinctrl * pctrl,unsigned int _pin)1116 static u32 rzg3s_oen_read(struct rzg2l_pinctrl *pctrl, unsigned int _pin)
1117 {
1118 	int bit;
1119 
1120 	bit = rzg3s_pin_to_oen_bit(pctrl, _pin);
1121 	if (bit < 0)
1122 		return bit;
1123 
1124 	return !(readb(pctrl->base + ETH_MODE) & BIT(bit));
1125 }
1126 
rzg3s_oen_write(struct rzg2l_pinctrl * pctrl,unsigned int _pin,u8 oen)1127 static int rzg3s_oen_write(struct rzg2l_pinctrl *pctrl, unsigned int _pin, u8 oen)
1128 {
1129 	unsigned long flags;
1130 	int bit;
1131 	u8 val;
1132 
1133 	bit = rzg3s_pin_to_oen_bit(pctrl, _pin);
1134 	if (bit < 0)
1135 		return bit;
1136 
1137 	spin_lock_irqsave(&pctrl->lock, flags);
1138 	val = readb(pctrl->base + ETH_MODE);
1139 	if (oen)
1140 		val &= ~BIT(bit);
1141 	else
1142 		val |= BIT(bit);
1143 	writeb(val, pctrl->base + ETH_MODE);
1144 	spin_unlock_irqrestore(&pctrl->lock, flags);
1145 
1146 	return 0;
1147 }
1148 
rzg2l_hw_to_bias_param(unsigned int bias)1149 static int rzg2l_hw_to_bias_param(unsigned int bias)
1150 {
1151 	switch (bias) {
1152 	case 0:
1153 		return PIN_CONFIG_BIAS_DISABLE;
1154 	case 1:
1155 		return PIN_CONFIG_BIAS_PULL_UP;
1156 	case 2:
1157 		return PIN_CONFIG_BIAS_PULL_DOWN;
1158 	default:
1159 		break;
1160 	}
1161 
1162 	return -EINVAL;
1163 }
1164 
rzg2l_bias_param_to_hw(enum pin_config_param param)1165 static int rzg2l_bias_param_to_hw(enum pin_config_param param)
1166 {
1167 	switch (param) {
1168 	case PIN_CONFIG_BIAS_DISABLE:
1169 		return 0;
1170 	case PIN_CONFIG_BIAS_PULL_UP:
1171 		return 1;
1172 	case PIN_CONFIG_BIAS_PULL_DOWN:
1173 		return 2;
1174 	default:
1175 		break;
1176 	}
1177 
1178 	return -EINVAL;
1179 }
1180 
rzv2h_hw_to_bias_param(unsigned int bias)1181 static int rzv2h_hw_to_bias_param(unsigned int bias)
1182 {
1183 	switch (bias) {
1184 	case 0:
1185 	case 1:
1186 		return PIN_CONFIG_BIAS_DISABLE;
1187 	case 2:
1188 		return PIN_CONFIG_BIAS_PULL_DOWN;
1189 	case 3:
1190 		return PIN_CONFIG_BIAS_PULL_UP;
1191 	default:
1192 		break;
1193 	}
1194 
1195 	return -EINVAL;
1196 }
1197 
rzv2h_bias_param_to_hw(enum pin_config_param param)1198 static int rzv2h_bias_param_to_hw(enum pin_config_param param)
1199 {
1200 	switch (param) {
1201 	case PIN_CONFIG_BIAS_DISABLE:
1202 		return 0;
1203 	case PIN_CONFIG_BIAS_PULL_DOWN:
1204 		return 2;
1205 	case PIN_CONFIG_BIAS_PULL_UP:
1206 		return 3;
1207 	default:
1208 		break;
1209 	}
1210 
1211 	return -EINVAL;
1212 }
1213 
rzv2h_pin_to_oen_bit(struct rzg2l_pinctrl * pctrl,unsigned int _pin)1214 static u8 rzv2h_pin_to_oen_bit(struct rzg2l_pinctrl *pctrl, unsigned int _pin)
1215 {
1216 	static const char * const pin_names[] = { "ET0_TXC_TXCLK", "ET1_TXC_TXCLK",
1217 						  "XSPI0_RESET0N", "XSPI0_CS0N",
1218 						  "XSPI0_CKN", "XSPI0_CKP" };
1219 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[_pin];
1220 	unsigned int i;
1221 
1222 	for (i = 0; i < ARRAY_SIZE(pin_names); i++) {
1223 		if (!strcmp(pin_desc->name, pin_names[i]))
1224 			return i;
1225 	}
1226 
1227 	/* Should not happen. */
1228 	return 0;
1229 }
1230 
rzv2h_oen_read(struct rzg2l_pinctrl * pctrl,unsigned int _pin)1231 static u32 rzv2h_oen_read(struct rzg2l_pinctrl *pctrl, unsigned int _pin)
1232 {
1233 	u8 bit;
1234 
1235 	bit = rzv2h_pin_to_oen_bit(pctrl, _pin);
1236 
1237 	return !(readb(pctrl->base + PFC_OEN) & BIT(bit));
1238 }
1239 
rzv2h_oen_write(struct rzg2l_pinctrl * pctrl,unsigned int _pin,u8 oen)1240 static int rzv2h_oen_write(struct rzg2l_pinctrl *pctrl, unsigned int _pin, u8 oen)
1241 {
1242 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
1243 	const struct rzg2l_register_offsets *regs = &hwcfg->regs;
1244 	unsigned long flags;
1245 	u8 val, bit;
1246 	u8 pwpr;
1247 
1248 	bit = rzv2h_pin_to_oen_bit(pctrl, _pin);
1249 	spin_lock_irqsave(&pctrl->lock, flags);
1250 	val = readb(pctrl->base + PFC_OEN);
1251 	if (oen)
1252 		val &= ~BIT(bit);
1253 	else
1254 		val |= BIT(bit);
1255 
1256 	pwpr = readb(pctrl->base + regs->pwpr);
1257 	writeb(pwpr | PWPR_REGWE_B, pctrl->base + regs->pwpr);
1258 	writeb(val, pctrl->base + PFC_OEN);
1259 	writeb(pwpr & ~PWPR_REGWE_B, pctrl->base + regs->pwpr);
1260 	spin_unlock_irqrestore(&pctrl->lock, flags);
1261 
1262 	return 0;
1263 }
1264 
rzg2l_pinctrl_pinconf_get(struct pinctrl_dev * pctldev,unsigned int _pin,unsigned long * config)1265 static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
1266 				     unsigned int _pin,
1267 				     unsigned long *config)
1268 {
1269 	struct rzg2l_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
1270 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
1271 	const struct pinctrl_pin_desc *pin = &pctrl->desc.pins[_pin];
1272 	u32 param = pinconf_to_config_param(*config);
1273 	u64 *pin_data = pin->drv_data;
1274 	unsigned int arg = 0;
1275 	u32 off;
1276 	u32 cfg;
1277 	int ret;
1278 	u8 bit;
1279 
1280 	if (!pin_data)
1281 		return -EINVAL;
1282 
1283 	off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
1284 	cfg = FIELD_GET(PIN_CFG_MASK, *pin_data);
1285 	if (*pin_data & RZG2L_SINGLE_PIN) {
1286 		bit = FIELD_GET(RZG2L_SINGLE_PIN_BITS_MASK, *pin_data);
1287 	} else {
1288 		bit = RZG2L_PIN_ID_TO_PIN(_pin);
1289 
1290 		if (rzg2l_validate_gpio_pin(pctrl, *pin_data, RZG2L_PIN_ID_TO_PORT(_pin), bit))
1291 			return -EINVAL;
1292 	}
1293 
1294 	switch (param) {
1295 	case PIN_CONFIG_INPUT_ENABLE:
1296 		if (!(cfg & PIN_CFG_IEN))
1297 			return -EINVAL;
1298 		arg = rzg2l_read_pin_config(pctrl, IEN(off), bit, IEN_MASK);
1299 		if (!arg)
1300 			return -EINVAL;
1301 		break;
1302 
1303 	case PIN_CONFIG_OUTPUT_ENABLE:
1304 		if (!(cfg & PIN_CFG_OEN))
1305 			return -EINVAL;
1306 		if (!pctrl->data->oen_read)
1307 			return -EOPNOTSUPP;
1308 		arg = pctrl->data->oen_read(pctrl, _pin);
1309 		if (!arg)
1310 			return -EINVAL;
1311 		break;
1312 
1313 	case PIN_CONFIG_POWER_SOURCE:
1314 		ret = rzg2l_get_power_source(pctrl, _pin, cfg);
1315 		if (ret < 0)
1316 			return ret;
1317 		arg = ret;
1318 		break;
1319 
1320 	case PIN_CONFIG_SLEW_RATE:
1321 		if (!(cfg & PIN_CFG_SR))
1322 			return -EINVAL;
1323 
1324 		arg = rzg2l_read_pin_config(pctrl, SR(off), bit, SR_MASK);
1325 		break;
1326 
1327 	case PIN_CONFIG_BIAS_DISABLE:
1328 	case PIN_CONFIG_BIAS_PULL_UP:
1329 	case PIN_CONFIG_BIAS_PULL_DOWN:
1330 		if (!(cfg & PIN_CFG_PUPD))
1331 			return -EINVAL;
1332 
1333 		arg = rzg2l_read_pin_config(pctrl, PUPD(off), bit, PUPD_MASK);
1334 		ret = pctrl->data->hw_to_bias_param(arg);
1335 		if (ret < 0)
1336 			return ret;
1337 
1338 		if (ret != param)
1339 			return -EINVAL;
1340 		/* for PIN_CONFIG_BIAS_PULL_UP/DOWN when enabled we just return 1 */
1341 		arg = 1;
1342 		break;
1343 
1344 	case PIN_CONFIG_DRIVE_STRENGTH: {
1345 		unsigned int index;
1346 
1347 		if (!(cfg & PIN_CFG_IOLH_A) || hwcfg->drive_strength_ua)
1348 			return -EINVAL;
1349 
1350 		index = rzg2l_read_pin_config(pctrl, IOLH(off), bit, IOLH_MASK);
1351 		/*
1352 		 * Drive strenght mA is supported only by group A and only
1353 		 * for 3V3 port source.
1354 		 */
1355 		arg = hwcfg->iolh_groupa_ua[index + RZG2L_IOLH_IDX_3V3] / 1000;
1356 		break;
1357 	}
1358 
1359 	case PIN_CONFIG_DRIVE_STRENGTH_UA: {
1360 		enum rzg2l_iolh_index iolh_idx;
1361 		u8 val;
1362 
1363 		if (!(cfg & (PIN_CFG_IOLH_A | PIN_CFG_IOLH_B | PIN_CFG_IOLH_C)) ||
1364 		    !hwcfg->drive_strength_ua)
1365 			return -EINVAL;
1366 
1367 		ret = rzg2l_get_power_source(pctrl, _pin, cfg);
1368 		if (ret < 0)
1369 			return ret;
1370 		iolh_idx = rzg2l_ps_to_iolh_idx(ret);
1371 		val = rzg2l_read_pin_config(pctrl, IOLH(off), bit, IOLH_MASK);
1372 		arg = rzg2l_iolh_val_to_ua(hwcfg, cfg, iolh_idx + val);
1373 		break;
1374 	}
1375 
1376 	case PIN_CONFIG_OUTPUT_IMPEDANCE_OHMS: {
1377 		unsigned int index;
1378 
1379 		if (!(cfg & PIN_CFG_IOLH_B) || !hwcfg->iolh_groupb_oi[0])
1380 			return -EINVAL;
1381 
1382 		index = rzg2l_read_pin_config(pctrl, IOLH(off), bit, IOLH_MASK);
1383 		arg = hwcfg->iolh_groupb_oi[index];
1384 		break;
1385 	}
1386 
1387 	case PIN_CONFIG_DRIVE_OPEN_DRAIN:
1388 	case PIN_CONFIG_DRIVE_PUSH_PULL:
1389 		if (!(cfg & PIN_CFG_NOD))
1390 			return -EINVAL;
1391 
1392 		arg = rzg2l_read_pin_config(pctrl, NOD(off), bit, NOD_MASK);
1393 		if (!arg && param != PIN_CONFIG_DRIVE_PUSH_PULL)
1394 			return -EINVAL;
1395 		if (arg && param != PIN_CONFIG_DRIVE_OPEN_DRAIN)
1396 			return -EINVAL;
1397 		break;
1398 
1399 	case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1400 		if (!(cfg & PIN_CFG_SMT))
1401 			return -EINVAL;
1402 
1403 		arg = rzg2l_read_pin_config(pctrl, SMT(off), bit, SMT_MASK);
1404 		if (!arg)
1405 			return -EINVAL;
1406 		break;
1407 
1408 	case RENESAS_RZV2H_PIN_CONFIG_OUTPUT_IMPEDANCE:
1409 		if (!(cfg & PIN_CFG_IOLH_RZV2H))
1410 			return -EINVAL;
1411 
1412 		arg = rzg2l_read_pin_config(pctrl, IOLH(off), bit, IOLH_MASK);
1413 		break;
1414 
1415 	default:
1416 		return -ENOTSUPP;
1417 	}
1418 
1419 	*config = pinconf_to_config_packed(param, arg);
1420 
1421 	return 0;
1422 };
1423 
rzg2l_pinctrl_pinconf_set(struct pinctrl_dev * pctldev,unsigned int _pin,unsigned long * _configs,unsigned int num_configs)1424 static int rzg2l_pinctrl_pinconf_set(struct pinctrl_dev *pctldev,
1425 				     unsigned int _pin,
1426 				     unsigned long *_configs,
1427 				     unsigned int num_configs)
1428 {
1429 	struct rzg2l_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
1430 	const struct pinctrl_pin_desc *pin = &pctrl->desc.pins[_pin];
1431 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
1432 	struct rzg2l_pinctrl_pin_settings settings = pctrl->settings[_pin];
1433 	u64 *pin_data = pin->drv_data;
1434 	unsigned int i, arg, index;
1435 	u32 off, param;
1436 	u32 cfg;
1437 	int ret;
1438 	u8 bit;
1439 
1440 	if (!pin_data)
1441 		return -EINVAL;
1442 
1443 	off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
1444 	cfg = FIELD_GET(PIN_CFG_MASK, *pin_data);
1445 	if (*pin_data & RZG2L_SINGLE_PIN) {
1446 		bit = FIELD_GET(RZG2L_SINGLE_PIN_BITS_MASK, *pin_data);
1447 	} else {
1448 		bit = RZG2L_PIN_ID_TO_PIN(_pin);
1449 
1450 		if (rzg2l_validate_gpio_pin(pctrl, *pin_data, RZG2L_PIN_ID_TO_PORT(_pin), bit))
1451 			return -EINVAL;
1452 	}
1453 
1454 	for (i = 0; i < num_configs; i++) {
1455 		param = pinconf_to_config_param(_configs[i]);
1456 		arg = pinconf_to_config_argument(_configs[i]);
1457 		switch (param) {
1458 		case PIN_CONFIG_INPUT_ENABLE:
1459 
1460 			if (!(cfg & PIN_CFG_IEN))
1461 				return -EINVAL;
1462 
1463 			rzg2l_rmw_pin_config(pctrl, IEN(off), bit, IEN_MASK, !!arg);
1464 			break;
1465 
1466 		case PIN_CONFIG_OUTPUT_ENABLE:
1467 			if (!(cfg & PIN_CFG_OEN))
1468 				return -EINVAL;
1469 			if (!pctrl->data->oen_write)
1470 				return -EOPNOTSUPP;
1471 			ret = pctrl->data->oen_write(pctrl, _pin, !!arg);
1472 			if (ret)
1473 				return ret;
1474 			break;
1475 
1476 		case PIN_CONFIG_POWER_SOURCE:
1477 			settings.power_source = arg;
1478 			break;
1479 
1480 		case PIN_CONFIG_SLEW_RATE:
1481 			if (!(cfg & PIN_CFG_SR) || arg > 1)
1482 				return -EINVAL;
1483 
1484 			rzg2l_rmw_pin_config(pctrl, SR(off), bit, SR_MASK, arg);
1485 			break;
1486 
1487 		case PIN_CONFIG_BIAS_DISABLE:
1488 		case PIN_CONFIG_BIAS_PULL_UP:
1489 		case PIN_CONFIG_BIAS_PULL_DOWN:
1490 			if (!(cfg & PIN_CFG_PUPD))
1491 				return -EINVAL;
1492 
1493 			ret = pctrl->data->bias_param_to_hw(param);
1494 			if (ret < 0)
1495 				return ret;
1496 
1497 			rzg2l_rmw_pin_config(pctrl, PUPD(off), bit, PUPD_MASK, ret);
1498 			break;
1499 
1500 		case PIN_CONFIG_DRIVE_STRENGTH:
1501 			if (!(cfg & PIN_CFG_IOLH_A) || hwcfg->drive_strength_ua)
1502 				return -EINVAL;
1503 
1504 			for (index = RZG2L_IOLH_IDX_3V3;
1505 			     index < RZG2L_IOLH_IDX_3V3 + RZG2L_IOLH_MAX_DS_ENTRIES; index++) {
1506 				if (arg == (hwcfg->iolh_groupa_ua[index] / 1000))
1507 					break;
1508 			}
1509 			if (index == (RZG2L_IOLH_IDX_3V3 + RZG2L_IOLH_MAX_DS_ENTRIES))
1510 				return -EINVAL;
1511 
1512 			rzg2l_rmw_pin_config(pctrl, IOLH(off), bit, IOLH_MASK, index);
1513 			break;
1514 
1515 		case PIN_CONFIG_DRIVE_STRENGTH_UA:
1516 			if (!(cfg & (PIN_CFG_IOLH_A | PIN_CFG_IOLH_B | PIN_CFG_IOLH_C)) ||
1517 			    !hwcfg->drive_strength_ua)
1518 				return -EINVAL;
1519 
1520 			settings.drive_strength_ua = arg;
1521 			break;
1522 
1523 		case PIN_CONFIG_OUTPUT_IMPEDANCE_OHMS:
1524 			if (!(cfg & PIN_CFG_IOLH_B) || !hwcfg->iolh_groupb_oi[0])
1525 				return -EINVAL;
1526 
1527 			for (index = 0; index < ARRAY_SIZE(hwcfg->iolh_groupb_oi); index++) {
1528 				if (arg == hwcfg->iolh_groupb_oi[index])
1529 					break;
1530 			}
1531 			if (index == ARRAY_SIZE(hwcfg->iolh_groupb_oi))
1532 				return -EINVAL;
1533 
1534 			rzg2l_rmw_pin_config(pctrl, IOLH(off), bit, IOLH_MASK, index);
1535 			break;
1536 
1537 		case PIN_CONFIG_DRIVE_OPEN_DRAIN:
1538 		case PIN_CONFIG_DRIVE_PUSH_PULL:
1539 			if (!(cfg & PIN_CFG_NOD))
1540 				return -EINVAL;
1541 
1542 			rzg2l_rmw_pin_config(pctrl, NOD(off), bit, NOD_MASK,
1543 					     param == PIN_CONFIG_DRIVE_OPEN_DRAIN ? 1 : 0);
1544 			break;
1545 
1546 		case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
1547 			if (!(cfg & PIN_CFG_SMT))
1548 				return -EINVAL;
1549 
1550 			rzg2l_rmw_pin_config(pctrl, SMT(off), bit, SMT_MASK, arg);
1551 			break;
1552 
1553 		case RENESAS_RZV2H_PIN_CONFIG_OUTPUT_IMPEDANCE:
1554 			if (!(cfg & PIN_CFG_IOLH_RZV2H))
1555 				return -EINVAL;
1556 
1557 			if (arg > 3)
1558 				return -EINVAL;
1559 			rzg2l_rmw_pin_config(pctrl, IOLH(off), bit, IOLH_MASK, arg);
1560 			break;
1561 
1562 		default:
1563 			return -EOPNOTSUPP;
1564 		}
1565 	}
1566 
1567 	/* Apply power source. */
1568 	if (settings.power_source != pctrl->settings[_pin].power_source) {
1569 		ret = rzg2l_ps_is_supported(settings.power_source);
1570 		if (!ret)
1571 			return -EINVAL;
1572 
1573 		/* Apply power source. */
1574 		ret = rzg2l_set_power_source(pctrl, _pin, cfg, settings.power_source);
1575 		if (ret)
1576 			return ret;
1577 	}
1578 
1579 	/* Apply drive strength. */
1580 	if (settings.drive_strength_ua != pctrl->settings[_pin].drive_strength_ua) {
1581 		enum rzg2l_iolh_index iolh_idx;
1582 		int val;
1583 
1584 		iolh_idx = rzg2l_ps_to_iolh_idx(settings.power_source);
1585 		ret = rzg2l_ds_is_supported(pctrl, cfg, iolh_idx,
1586 					    settings.drive_strength_ua);
1587 		if (!ret)
1588 			return -EINVAL;
1589 
1590 		/* Get register value for this PS/DS tuple. */
1591 		val = rzg2l_iolh_ua_to_val(hwcfg, cfg, iolh_idx, settings.drive_strength_ua);
1592 		if (val < 0)
1593 			return val;
1594 
1595 		/* Apply drive strength. */
1596 		rzg2l_rmw_pin_config(pctrl, IOLH(off), bit, IOLH_MASK, val);
1597 		pctrl->settings[_pin].drive_strength_ua = settings.drive_strength_ua;
1598 	}
1599 
1600 	return 0;
1601 }
1602 
rzg2l_pinctrl_pinconf_group_set(struct pinctrl_dev * pctldev,unsigned int group,unsigned long * configs,unsigned int num_configs)1603 static int rzg2l_pinctrl_pinconf_group_set(struct pinctrl_dev *pctldev,
1604 					   unsigned int group,
1605 					   unsigned long *configs,
1606 					   unsigned int num_configs)
1607 {
1608 	const unsigned int *pins;
1609 	unsigned int i, npins;
1610 	int ret;
1611 
1612 	ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
1613 	if (ret)
1614 		return ret;
1615 
1616 	for (i = 0; i < npins; i++) {
1617 		ret = rzg2l_pinctrl_pinconf_set(pctldev, pins[i], configs,
1618 						num_configs);
1619 		if (ret)
1620 			return ret;
1621 	}
1622 
1623 	return 0;
1624 };
1625 
rzg2l_pinctrl_pinconf_group_get(struct pinctrl_dev * pctldev,unsigned int group,unsigned long * config)1626 static int rzg2l_pinctrl_pinconf_group_get(struct pinctrl_dev *pctldev,
1627 					   unsigned int group,
1628 					   unsigned long *config)
1629 {
1630 	const unsigned int *pins;
1631 	unsigned int i, npins, prev_config = 0;
1632 	int ret;
1633 
1634 	ret = pinctrl_generic_get_group_pins(pctldev, group, &pins, &npins);
1635 	if (ret)
1636 		return ret;
1637 
1638 	for (i = 0; i < npins; i++) {
1639 		ret = rzg2l_pinctrl_pinconf_get(pctldev, pins[i], config);
1640 		if (ret)
1641 			return ret;
1642 
1643 		/* Check config matching between to pin  */
1644 		if (i && prev_config != *config)
1645 			return -EOPNOTSUPP;
1646 
1647 		prev_config = *config;
1648 	}
1649 
1650 	return 0;
1651 };
1652 
1653 static const struct pinctrl_ops rzg2l_pinctrl_pctlops = {
1654 	.get_groups_count = pinctrl_generic_get_group_count,
1655 	.get_group_name = pinctrl_generic_get_group_name,
1656 	.get_group_pins = pinctrl_generic_get_group_pins,
1657 	.dt_node_to_map = rzg2l_dt_node_to_map,
1658 	.dt_free_map = rzg2l_dt_free_map,
1659 };
1660 
1661 static const struct pinmux_ops rzg2l_pinctrl_pmxops = {
1662 	.get_functions_count = pinmux_generic_get_function_count,
1663 	.get_function_name = pinmux_generic_get_function_name,
1664 	.get_function_groups = pinmux_generic_get_function_groups,
1665 	.set_mux = rzg2l_pinctrl_set_mux,
1666 	.strict = true,
1667 };
1668 
1669 static const struct pinconf_ops rzg2l_pinctrl_confops = {
1670 	.is_generic = true,
1671 	.pin_config_get = rzg2l_pinctrl_pinconf_get,
1672 	.pin_config_set = rzg2l_pinctrl_pinconf_set,
1673 	.pin_config_group_set = rzg2l_pinctrl_pinconf_group_set,
1674 	.pin_config_group_get = rzg2l_pinctrl_pinconf_group_get,
1675 	.pin_config_config_dbg_show = pinconf_generic_dump_config,
1676 };
1677 
rzg2l_gpio_request(struct gpio_chip * chip,unsigned int offset)1678 static int rzg2l_gpio_request(struct gpio_chip *chip, unsigned int offset)
1679 {
1680 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
1681 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[offset];
1682 	u64 *pin_data = pin_desc->drv_data;
1683 	u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
1684 	u32 port = RZG2L_PIN_ID_TO_PORT(offset);
1685 	u8 bit = RZG2L_PIN_ID_TO_PIN(offset);
1686 	unsigned long flags;
1687 	u8 reg8;
1688 	int ret;
1689 
1690 	ret = rzg2l_validate_gpio_pin(pctrl, *pin_data, port, bit);
1691 	if (ret)
1692 		return ret;
1693 
1694 	ret = pinctrl_gpio_request(chip, offset);
1695 	if (ret)
1696 		return ret;
1697 
1698 	spin_lock_irqsave(&pctrl->lock, flags);
1699 
1700 	/* Select GPIO mode in PMC Register */
1701 	reg8 = readb(pctrl->base + PMC(off));
1702 	reg8 &= ~BIT(bit);
1703 	pctrl->data->pmc_writeb(pctrl, reg8, PMC(off));
1704 
1705 	spin_unlock_irqrestore(&pctrl->lock, flags);
1706 
1707 	return 0;
1708 }
1709 
rzg2l_gpio_set_direction(struct rzg2l_pinctrl * pctrl,u32 offset,bool output)1710 static void rzg2l_gpio_set_direction(struct rzg2l_pinctrl *pctrl, u32 offset,
1711 				     bool output)
1712 {
1713 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[offset];
1714 	u64 *pin_data = pin_desc->drv_data;
1715 	u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
1716 	u8 bit = RZG2L_PIN_ID_TO_PIN(offset);
1717 	unsigned long flags;
1718 	u16 reg16;
1719 
1720 	spin_lock_irqsave(&pctrl->lock, flags);
1721 
1722 	reg16 = readw(pctrl->base + PM(off));
1723 	reg16 &= ~(PM_MASK << (bit * 2));
1724 
1725 	reg16 |= (output ? PM_OUTPUT : PM_INPUT) << (bit * 2);
1726 	writew(reg16, pctrl->base + PM(off));
1727 
1728 	spin_unlock_irqrestore(&pctrl->lock, flags);
1729 }
1730 
rzg2l_gpio_get_direction(struct gpio_chip * chip,unsigned int offset)1731 static int rzg2l_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
1732 {
1733 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
1734 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[offset];
1735 	u64 *pin_data = pin_desc->drv_data;
1736 	u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
1737 	u8 bit = RZG2L_PIN_ID_TO_PIN(offset);
1738 
1739 	if (!(readb(pctrl->base + PMC(off)) & BIT(bit))) {
1740 		u16 reg16;
1741 
1742 		reg16 = readw(pctrl->base + PM(off));
1743 		reg16 = (reg16 >> (bit * 2)) & PM_MASK;
1744 		if (reg16 == PM_OUTPUT)
1745 			return GPIO_LINE_DIRECTION_OUT;
1746 	}
1747 
1748 	return GPIO_LINE_DIRECTION_IN;
1749 }
1750 
rzg2l_gpio_direction_input(struct gpio_chip * chip,unsigned int offset)1751 static int rzg2l_gpio_direction_input(struct gpio_chip *chip,
1752 				      unsigned int offset)
1753 {
1754 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
1755 
1756 	rzg2l_gpio_set_direction(pctrl, offset, false);
1757 
1758 	return 0;
1759 }
1760 
rzg2l_gpio_set(struct gpio_chip * chip,unsigned int offset,int value)1761 static void rzg2l_gpio_set(struct gpio_chip *chip, unsigned int offset,
1762 			   int value)
1763 {
1764 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
1765 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[offset];
1766 	u64 *pin_data = pin_desc->drv_data;
1767 	u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
1768 	u8 bit = RZG2L_PIN_ID_TO_PIN(offset);
1769 	unsigned long flags;
1770 	u8 reg8;
1771 
1772 	spin_lock_irqsave(&pctrl->lock, flags);
1773 
1774 	reg8 = readb(pctrl->base + P(off));
1775 
1776 	if (value)
1777 		writeb(reg8 | BIT(bit), pctrl->base + P(off));
1778 	else
1779 		writeb(reg8 & ~BIT(bit), pctrl->base + P(off));
1780 
1781 	spin_unlock_irqrestore(&pctrl->lock, flags);
1782 }
1783 
rzg2l_gpio_direction_output(struct gpio_chip * chip,unsigned int offset,int value)1784 static int rzg2l_gpio_direction_output(struct gpio_chip *chip,
1785 				       unsigned int offset, int value)
1786 {
1787 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
1788 
1789 	rzg2l_gpio_set(chip, offset, value);
1790 	rzg2l_gpio_set_direction(pctrl, offset, true);
1791 
1792 	return 0;
1793 }
1794 
rzg2l_gpio_get(struct gpio_chip * chip,unsigned int offset)1795 static int rzg2l_gpio_get(struct gpio_chip *chip, unsigned int offset)
1796 {
1797 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
1798 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[offset];
1799 	u64 *pin_data = pin_desc->drv_data;
1800 	u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
1801 	u8 bit = RZG2L_PIN_ID_TO_PIN(offset);
1802 	u16 reg16;
1803 
1804 	reg16 = readw(pctrl->base + PM(off));
1805 	reg16 = (reg16 >> (bit * 2)) & PM_MASK;
1806 
1807 	if (reg16 == PM_INPUT)
1808 		return !!(readb(pctrl->base + PIN(off)) & BIT(bit));
1809 	else if (reg16 == PM_OUTPUT)
1810 		return !!(readb(pctrl->base + P(off)) & BIT(bit));
1811 	else
1812 		return -EINVAL;
1813 }
1814 
rzg2l_gpio_free(struct gpio_chip * chip,unsigned int offset)1815 static void rzg2l_gpio_free(struct gpio_chip *chip, unsigned int offset)
1816 {
1817 	unsigned int virq;
1818 
1819 	pinctrl_gpio_free(chip, offset);
1820 
1821 	virq = irq_find_mapping(chip->irq.domain, offset);
1822 	if (virq)
1823 		irq_dispose_mapping(virq);
1824 
1825 	/*
1826 	 * Set the GPIO as an input to ensure that the next GPIO request won't
1827 	 * drive the GPIO pin as an output.
1828 	 */
1829 	rzg2l_gpio_direction_input(chip, offset);
1830 }
1831 
1832 static const char * const rzg2l_gpio_names[] = {
1833 	"P0_0", "P0_1", "P0_2", "P0_3", "P0_4", "P0_5", "P0_6", "P0_7",
1834 	"P1_0", "P1_1", "P1_2", "P1_3", "P1_4", "P1_5", "P1_6", "P1_7",
1835 	"P2_0", "P2_1", "P2_2", "P2_3", "P2_4", "P2_5", "P2_6", "P2_7",
1836 	"P3_0", "P3_1", "P3_2", "P3_3", "P3_4", "P3_5", "P3_6", "P3_7",
1837 	"P4_0", "P4_1", "P4_2", "P4_3", "P4_4", "P4_5", "P4_6", "P4_7",
1838 	"P5_0", "P5_1", "P5_2", "P5_3", "P5_4", "P5_5", "P5_6", "P5_7",
1839 	"P6_0", "P6_1", "P6_2", "P6_3", "P6_4", "P6_5", "P6_6", "P6_7",
1840 	"P7_0", "P7_1", "P7_2", "P7_3", "P7_4", "P7_5", "P7_6", "P7_7",
1841 	"P8_0", "P8_1", "P8_2", "P8_3", "P8_4", "P8_5", "P8_6", "P8_7",
1842 	"P9_0", "P9_1", "P9_2", "P9_3", "P9_4", "P9_5", "P9_6", "P9_7",
1843 	"P10_0", "P10_1", "P10_2", "P10_3", "P10_4", "P10_5", "P10_6", "P10_7",
1844 	"P11_0", "P11_1", "P11_2", "P11_3", "P11_4", "P11_5", "P11_6", "P11_7",
1845 	"P12_0", "P12_1", "P12_2", "P12_3", "P12_4", "P12_5", "P12_6", "P12_7",
1846 	"P13_0", "P13_1", "P13_2", "P13_3", "P13_4", "P13_5", "P13_6", "P13_7",
1847 	"P14_0", "P14_1", "P14_2", "P14_3", "P14_4", "P14_5", "P14_6", "P14_7",
1848 	"P15_0", "P15_1", "P15_2", "P15_3", "P15_4", "P15_5", "P15_6", "P15_7",
1849 	"P16_0", "P16_1", "P16_2", "P16_3", "P16_4", "P16_5", "P16_6", "P16_7",
1850 	"P17_0", "P17_1", "P17_2", "P17_3", "P17_4", "P17_5", "P17_6", "P17_7",
1851 	"P18_0", "P18_1", "P18_2", "P18_3", "P18_4", "P18_5", "P18_6", "P18_7",
1852 	"P19_0", "P19_1", "P19_2", "P19_3", "P19_4", "P19_5", "P19_6", "P19_7",
1853 	"P20_0", "P20_1", "P20_2", "P20_3", "P20_4", "P20_5", "P20_6", "P20_7",
1854 	"P21_0", "P21_1", "P21_2", "P21_3", "P21_4", "P21_5", "P21_6", "P21_7",
1855 	"P22_0", "P22_1", "P22_2", "P22_3", "P22_4", "P22_5", "P22_6", "P22_7",
1856 	"P23_0", "P23_1", "P23_2", "P23_3", "P23_4", "P23_5", "P23_6", "P23_7",
1857 	"P24_0", "P24_1", "P24_2", "P24_3", "P24_4", "P24_5", "P24_6", "P24_7",
1858 	"P25_0", "P25_1", "P25_2", "P25_3", "P25_4", "P25_5", "P25_6", "P25_7",
1859 	"P26_0", "P26_1", "P26_2", "P26_3", "P26_4", "P26_5", "P26_6", "P26_7",
1860 	"P27_0", "P27_1", "P27_2", "P27_3", "P27_4", "P27_5", "P27_6", "P27_7",
1861 	"P28_0", "P28_1", "P28_2", "P28_3", "P28_4", "P28_5", "P28_6", "P28_7",
1862 	"P29_0", "P29_1", "P29_2", "P29_3", "P29_4", "P29_5", "P29_6", "P29_7",
1863 	"P30_0", "P30_1", "P30_2", "P30_3", "P30_4", "P30_5", "P30_6", "P30_7",
1864 	"P31_0", "P31_1", "P31_2", "P31_3", "P31_4", "P31_5", "P31_6", "P31_7",
1865 	"P32_0", "P32_1", "P32_2", "P32_3", "P32_4", "P32_5", "P32_6", "P32_7",
1866 	"P33_0", "P33_1", "P33_2", "P33_3", "P33_4", "P33_5", "P33_6", "P33_7",
1867 	"P34_0", "P34_1", "P34_2", "P34_3", "P34_4", "P34_5", "P34_6", "P34_7",
1868 	"P35_0", "P35_1", "P35_2", "P35_3", "P35_4", "P35_5", "P35_6", "P35_7",
1869 	"P36_0", "P36_1", "P36_2", "P36_3", "P36_4", "P36_5", "P36_6", "P36_7",
1870 	"P37_0", "P37_1", "P37_2", "P37_3", "P37_4", "P37_5", "P37_6", "P37_7",
1871 	"P38_0", "P38_1", "P38_2", "P38_3", "P38_4", "P38_5", "P38_6", "P38_7",
1872 	"P39_0", "P39_1", "P39_2", "P39_3", "P39_4", "P39_5", "P39_6", "P39_7",
1873 	"P40_0", "P40_1", "P40_2", "P40_3", "P40_4", "P40_5", "P40_6", "P40_7",
1874 	"P41_0", "P41_1", "P41_2", "P41_3", "P41_4", "P41_5", "P41_6", "P41_7",
1875 	"P42_0", "P42_1", "P42_2", "P42_3", "P42_4", "P42_5", "P42_6", "P42_7",
1876 	"P43_0", "P43_1", "P43_2", "P43_3", "P43_4", "P43_5", "P43_6", "P43_7",
1877 	"P44_0", "P44_1", "P44_2", "P44_3", "P44_4", "P44_5", "P44_6", "P44_7",
1878 	"P45_0", "P45_1", "P45_2", "P45_3", "P45_4", "P45_5", "P45_6", "P45_7",
1879 	"P46_0", "P46_1", "P46_2", "P46_3", "P46_4", "P46_5", "P46_6", "P46_7",
1880 	"P47_0", "P47_1", "P47_2", "P47_3", "P47_4", "P47_5", "P47_6", "P47_7",
1881 	"P48_0", "P48_1", "P48_2", "P48_3", "P48_4", "P48_5", "P48_6", "P48_7",
1882 };
1883 
1884 static const u64 r9a07g044_gpio_configs[] = {
1885 	RZG2L_GPIO_PORT_PACK(2, 0x10, RZG2L_MPXED_PIN_FUNCS),
1886 	RZG2L_GPIO_PORT_PACK(2, 0x11, RZG2L_MPXED_PIN_FUNCS),
1887 	RZG2L_GPIO_PORT_PACK(2, 0x12, RZG2L_MPXED_PIN_FUNCS),
1888 	RZG2L_GPIO_PORT_PACK(2, 0x13, RZG2L_MPXED_PIN_FUNCS),
1889 	RZG2L_GPIO_PORT_PACK(2, 0x14, RZG2L_MPXED_PIN_FUNCS),
1890 	RZG2L_GPIO_PORT_PACK(3, 0x15, RZG2L_MPXED_PIN_FUNCS),
1891 	RZG2L_GPIO_PORT_PACK(2, 0x16, RZG2L_MPXED_PIN_FUNCS),
1892 	RZG2L_GPIO_PORT_PACK(3, 0x17, RZG2L_MPXED_PIN_FUNCS),
1893 	RZG2L_GPIO_PORT_PACK(3, 0x18, RZG2L_MPXED_PIN_FUNCS),
1894 	RZG2L_GPIO_PORT_PACK(2, 0x19, RZG2L_MPXED_PIN_FUNCS),
1895 	RZG2L_GPIO_PORT_PACK(2, 0x1a, RZG2L_MPXED_PIN_FUNCS),
1896 	RZG2L_GPIO_PORT_PACK(2, 0x1b, RZG2L_MPXED_PIN_FUNCS),
1897 	RZG2L_GPIO_PORT_PACK(2, 0x1c, RZG2L_MPXED_PIN_FUNCS),
1898 	RZG2L_GPIO_PORT_PACK(3, 0x1d, RZG2L_MPXED_PIN_FUNCS),
1899 	RZG2L_GPIO_PORT_PACK(2, 0x1e, RZG2L_MPXED_PIN_FUNCS),
1900 	RZG2L_GPIO_PORT_PACK(2, 0x1f, RZG2L_MPXED_PIN_FUNCS),
1901 	RZG2L_GPIO_PORT_PACK(2, 0x20, RZG2L_MPXED_PIN_FUNCS),
1902 	RZG2L_GPIO_PORT_PACK(3, 0x21, RZG2L_MPXED_PIN_FUNCS),
1903 	RZG2L_GPIO_PORT_PACK(2, 0x22, RZG2L_MPXED_PIN_FUNCS),
1904 	RZG2L_GPIO_PORT_PACK(2, 0x23, RZG2L_MPXED_PIN_FUNCS),
1905 	RZG2L_GPIO_PORT_PACK(3, 0x24, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0) | PIN_CFG_OEN),
1906 	RZG2L_GPIO_PORT_PACK(2, 0x25, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1907 	RZG2L_GPIO_PORT_PACK(2, 0x26, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1908 	RZG2L_GPIO_PORT_PACK(2, 0x27, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1909 	RZG2L_GPIO_PORT_PACK(2, 0x28, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1910 	RZG2L_GPIO_PORT_PACK(2, 0x29, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1911 	RZG2L_GPIO_PORT_PACK(2, 0x2a, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1912 	RZG2L_GPIO_PORT_PACK(2, 0x2b, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1913 	RZG2L_GPIO_PORT_PACK(2, 0x2c, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1914 	RZG2L_GPIO_PORT_PACK(2, 0x2d, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1) | PIN_CFG_OEN),
1915 	RZG2L_GPIO_PORT_PACK(2, 0x2e, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1916 	RZG2L_GPIO_PORT_PACK(2, 0x2f, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1917 	RZG2L_GPIO_PORT_PACK(2, 0x30, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1918 	RZG2L_GPIO_PORT_PACK(2, 0x31, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1919 	RZG2L_GPIO_PORT_PACK(2, 0x32, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1920 	RZG2L_GPIO_PORT_PACK(2, 0x33, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1921 	RZG2L_GPIO_PORT_PACK(2, 0x34, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1922 	RZG2L_GPIO_PORT_PACK(3, 0x35, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1923 	RZG2L_GPIO_PORT_PACK(2, 0x36, RZG2L_MPXED_PIN_FUNCS),
1924 	RZG2L_GPIO_PORT_PACK(3, 0x37, RZG2L_MPXED_PIN_FUNCS),
1925 	RZG2L_GPIO_PORT_PACK(3, 0x38, RZG2L_MPXED_PIN_FUNCS),
1926 	RZG2L_GPIO_PORT_PACK(2, 0x39, RZG2L_MPXED_PIN_FUNCS),
1927 	RZG2L_GPIO_PORT_PACK(5, 0x3a, RZG2L_MPXED_PIN_FUNCS),
1928 	RZG2L_GPIO_PORT_PACK(4, 0x3b, RZG2L_MPXED_PIN_FUNCS),
1929 	RZG2L_GPIO_PORT_PACK(4, 0x3c, RZG2L_MPXED_PIN_FUNCS),
1930 	RZG2L_GPIO_PORT_PACK(4, 0x3d, RZG2L_MPXED_PIN_FUNCS),
1931 	RZG2L_GPIO_PORT_PACK(4, 0x3e, RZG2L_MPXED_PIN_FUNCS),
1932 	RZG2L_GPIO_PORT_PACK(4, 0x3f, RZG2L_MPXED_PIN_FUNCS),
1933 	RZG2L_GPIO_PORT_PACK(5, 0x40, RZG2L_MPXED_PIN_FUNCS),
1934 };
1935 
1936 static const u64 r9a07g043_gpio_configs[] = {
1937 	RZG2L_GPIO_PORT_PACK(4, 0x10, RZG2L_MPXED_PIN_FUNCS),
1938 	RZG2L_GPIO_PORT_PACK(5, 0x11, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0) | PIN_CFG_OEN),
1939 	RZG2L_GPIO_PORT_PACK(4, 0x12, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1940 	RZG2L_GPIO_PORT_PACK(4, 0x13, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1941 	RZG2L_GPIO_PORT_PACK(6, 0x14, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH0)),
1942 	RZG2L_GPIO_PORT_PACK(5, 0x15, RZG2L_MPXED_PIN_FUNCS),
1943 	RZG2L_GPIO_PORT_PACK(5, 0x16, RZG2L_MPXED_PIN_FUNCS),
1944 	RZG2L_GPIO_PORT_PACK(5, 0x17, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1) | PIN_CFG_OEN),
1945 	RZG2L_GPIO_PORT_PACK(5, 0x18, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1946 	RZG2L_GPIO_PORT_PACK(4, 0x19, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1947 	RZG2L_GPIO_PORT_PACK(5, 0x1a, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IO_VMC_ETH1)),
1948 	RZG2L_GPIO_PORT_PACK(4, 0x1b, RZG2L_MPXED_PIN_FUNCS),
1949 	RZG2L_GPIO_PORT_PACK(2, 0x1c, RZG2L_MPXED_PIN_FUNCS),
1950 	RZG2L_GPIO_PORT_PACK(5, 0x1d, RZG2L_MPXED_PIN_FUNCS),
1951 	RZG2L_GPIO_PORT_PACK(3, 0x1e, RZG2L_MPXED_PIN_FUNCS),
1952 	RZG2L_GPIO_PORT_PACK(4, 0x1f, RZG2L_MPXED_PIN_FUNCS),
1953 	RZG2L_GPIO_PORT_PACK(2, 0x20, RZG2L_MPXED_PIN_FUNCS),
1954 	RZG2L_GPIO_PORT_PACK(4, 0x21, RZG2L_MPXED_PIN_FUNCS),
1955 	RZG2L_GPIO_PORT_PACK(6, 0x22, RZG2L_MPXED_PIN_FUNCS),
1956 #ifdef CONFIG_RISCV
1957 	/* Below additional port pins (P19 - P28) are exclusively available on RZ/Five SoC only */
1958 	RZG2L_GPIO_PORT_SPARSE_PACK(0x2, 0x06, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
1959 				    PIN_CFG_NF | PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),	/* P19 */
1960 	RZG2L_GPIO_PORT_PACK_VARIABLE(8, 0x07),						/* P20 */
1961 	RZG2L_GPIO_PORT_SPARSE_PACK(0x2, 0x08, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
1962 				    PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),			/* P21 */
1963 	RZG2L_GPIO_PORT_PACK(4, 0x09, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_PUPD |
1964 			     PIN_CFG_IEN | PIN_CFG_NOGPIO_INT),				/* P22 */
1965 	RZG2L_GPIO_PORT_SPARSE_PACK_VARIABLE(0x3e, 0x0a),				/* P23 */
1966 	RZG2L_GPIO_PORT_PACK_VARIABLE(6, 0x0b),						/* P24 */
1967 	RZG2L_GPIO_PORT_SPARSE_PACK(0x2, 0x0c, PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_NF |
1968 				    PIN_CFG_NOGPIO_INT),				/* P25 */
1969 	0x0,										/* P26 */
1970 	0x0,										/* P27 */
1971 	RZG2L_GPIO_PORT_PACK(6, 0x0f, RZG2L_MPXED_PIN_FUNCS | PIN_CFG_NOGPIO_INT),	/* P28 */
1972 #endif
1973 };
1974 
1975 static const u64 r9a08g045_gpio_configs[] = {
1976 	RZG2L_GPIO_PORT_PACK(4, 0x20, RZG3S_MPXED_PIN_FUNCS(A)),			/* P0  */
1977 	RZG2L_GPIO_PORT_PACK(5, 0x30, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
1978 								PIN_CFG_IO_VMC_ETH0)) |
1979 				      PIN_CFG_OEN | PIN_CFG_IEN,			/* P1 */
1980 	RZG2L_GPIO_PORT_PACK(4, 0x31, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
1981 								PIN_CFG_IO_VMC_ETH0)),	/* P2 */
1982 	RZG2L_GPIO_PORT_PACK(4, 0x32, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
1983 								PIN_CFG_IO_VMC_ETH0)),	/* P3 */
1984 	RZG2L_GPIO_PORT_PACK(6, 0x33, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
1985 								PIN_CFG_IO_VMC_ETH0)),	/* P4 */
1986 	RZG2L_GPIO_PORT_PACK(5, 0x21, RZG3S_MPXED_PIN_FUNCS(A)),			/* P5  */
1987 	RZG2L_GPIO_PORT_PACK(5, 0x22, RZG3S_MPXED_PIN_FUNCS(A)),			/* P6  */
1988 	RZG2L_GPIO_PORT_PACK(5, 0x34, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
1989 								PIN_CFG_IO_VMC_ETH1)) |
1990 				      PIN_CFG_OEN | PIN_CFG_IEN,			/* P7 */
1991 	RZG2L_GPIO_PORT_PACK(5, 0x35, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
1992 								PIN_CFG_IO_VMC_ETH1)),	/* P8 */
1993 	RZG2L_GPIO_PORT_PACK(4, 0x36, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
1994 								PIN_CFG_IO_VMC_ETH1)),	/* P9 */
1995 	RZG2L_GPIO_PORT_PACK(5, 0x37, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
1996 								PIN_CFG_IO_VMC_ETH1)),	/* P10 */
1997 	RZG2L_GPIO_PORT_PACK(4, 0x23, RZG3S_MPXED_PIN_FUNCS(B) | PIN_CFG_IEN),		/* P11  */
1998 	RZG2L_GPIO_PORT_PACK(2, 0x24, RZG3S_MPXED_PIN_FUNCS(B) | PIN_CFG_IEN),		/* P12  */
1999 	RZG2L_GPIO_PORT_PACK(5, 0x25, RZG3S_MPXED_PIN_FUNCS(A)),			/* P13  */
2000 	RZG2L_GPIO_PORT_PACK(3, 0x26, RZG3S_MPXED_PIN_FUNCS(A)),			/* P14  */
2001 	RZG2L_GPIO_PORT_PACK(4, 0x27, RZG3S_MPXED_PIN_FUNCS(A)),			/* P15  */
2002 	RZG2L_GPIO_PORT_PACK(2, 0x28, RZG3S_MPXED_PIN_FUNCS(A)),			/* P16  */
2003 	RZG2L_GPIO_PORT_PACK(4, 0x29, RZG3S_MPXED_PIN_FUNCS(A)),			/* P17  */
2004 	RZG2L_GPIO_PORT_PACK(6, 0x2a, RZG3S_MPXED_PIN_FUNCS(A)),			/* P18 */
2005 };
2006 
2007 static const char * const rzg3e_gpio_names[] = {
2008 	"P00", "P01", "P02", "P03", "P04", "P05", "P06", "P07",
2009 	"P10", "P11", "P12", "P13", "P14", "P15", "P16", "P17",
2010 	"P20", "P21", "P22", "P23", "P24", "P25", "P26", "P27",
2011 	"P30", "P31", "P32", "P33", "P34", "P35", "P36", "P37",
2012 	"P40", "P41", "P42", "P43", "P44", "P45", "P46", "P47",
2013 	"P50", "P51", "P52", "P53", "P54", "P55", "P56", "P57",
2014 	"P60", "P61", "P62", "P63", "P64", "P65", "P66", "P67",
2015 	"P70", "P71", "P72", "P73", "P74", "P75", "P76", "P77",
2016 	"P80", "P81", "P82", "P83", "P84", "P85", "P86", "P87",
2017 	"",    "",    "",    "",    "",    "",    "",    "",
2018 	"PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7",
2019 	"PB0", "PB1", "PB2", "PB3", "PB4", "PB5", "PB6", "PB7",
2020 	"PC0", "PC1", "PC2", "PC3", "PC4", "PC5", "PC6", "PC7",
2021 	"PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7",
2022 	"PE0", "PE1", "PE2", "PE3", "PE4", "PE5", "PE6", "PE7",
2023 	"PF0", "PF1", "PF2", "PF3", "PF4", "PF5", "PF6", "PF7",
2024 	"PG0", "PG1", "PG2", "PG3", "PG4", "PG5", "PG6", "PG7",
2025 	"PH0", "PH1", "PH2", "PH3", "PH4", "PH5", "PH6", "PH7",
2026 	"",    "",    "",    "",    "",    "",    "",    "",
2027 	"PJ0", "PJ1", "PJ2", "PJ3", "PJ4", "PJ5", "PJ6", "PJ7",
2028 	"PK0", "PK1", "PK2", "PK3", "PK4", "PK5", "PK6", "PK7",
2029 	"PL0", "PL1", "PL2", "PL3", "PL4", "PL5", "PL6", "PL7",
2030 	"PM0", "PM1", "PM2", "PM3", "PM4", "PM5", "PM6", "PM7",
2031 	"",    "",    "",    "",    "",    "",    "",    "",
2032 	"",    "",    "",    "",    "",    "",    "",    "",
2033 	"",    "",    "",    "",    "",    "",    "",    "",
2034 	"",    "",    "",    "",    "",    "",    "",    "",
2035 	"",    "",    "",    "",    "",    "",    "",    "",
2036 	"PS0", "PS1", "PS2", "PS3", "PS4", "PS5", "PS6", "PS7",
2037 };
2038 
2039 static const u64 r9a09g047_gpio_configs[] = {
2040 	RZG2L_GPIO_PORT_PACK(8, 0x20, RZV2H_MPXED_PIN_FUNCS),	/* P0 */
2041 	RZG2L_GPIO_PORT_PACK(8, 0x21, RZV2H_MPXED_PIN_FUNCS |
2042 				      PIN_CFG_ELC),		/* P1 */
2043 	RZG2L_GPIO_PORT_PACK(2, 0x22, RZG2L_MPXED_COMMON_PIN_FUNCS(RZV2H) |
2044 				      PIN_CFG_NOD),		/* P2 */
2045 	RZG2L_GPIO_PORT_PACK(8, 0x23, RZV2H_MPXED_PIN_FUNCS),	/* P3 */
2046 	RZG2L_GPIO_PORT_PACK(6, 0x24, RZV2H_MPXED_PIN_FUNCS),	/* P4 */
2047 	RZG2L_GPIO_PORT_PACK(7, 0x25, RZV2H_MPXED_PIN_FUNCS),	/* P5 */
2048 	RZG2L_GPIO_PORT_PACK(7, 0x26, RZV2H_MPXED_PIN_FUNCS),	/* P6 */
2049 	RZG2L_GPIO_PORT_PACK(8, 0x27, RZV2H_MPXED_PIN_FUNCS |
2050 				      PIN_CFG_ELC),		/* P7 */
2051 	RZG2L_GPIO_PORT_PACK(6, 0x28, RZV2H_MPXED_PIN_FUNCS),	/* P8 */
2052 	0x0,
2053 	RZG2L_GPIO_PORT_PACK_VARIABLE(8, 0x2a),			/* PA */
2054 	RZG2L_GPIO_PORT_PACK(8, 0x2b, RZV2H_MPXED_PIN_FUNCS),	/* PB */
2055 	RZG2L_GPIO_PORT_PACK(3, 0x2c, RZV2H_MPXED_PIN_FUNCS),	/* PC */
2056 	RZG2L_GPIO_PORT_PACK_VARIABLE(8, 0x2d),			/* PD */
2057 	RZG2L_GPIO_PORT_PACK(8, 0x2e, RZV2H_MPXED_PIN_FUNCS),	/* PE */
2058 	RZG2L_GPIO_PORT_PACK(3, 0x2f, RZV2H_MPXED_PIN_FUNCS),	/* PF */
2059 	RZG2L_GPIO_PORT_PACK_VARIABLE(8, 0x30),			/* PG */
2060 	RZG2L_GPIO_PORT_PACK_VARIABLE(6, 0x31),			/* PH */
2061 	0x0,
2062 	RZG2L_GPIO_PORT_PACK_VARIABLE(5, 0x33),			/* PJ */
2063 	RZG2L_GPIO_PORT_PACK(4, 0x34, RZV2H_MPXED_PIN_FUNCS),	/* PK */
2064 	RZG2L_GPIO_PORT_PACK(8, 0x35, RZV2H_MPXED_PIN_FUNCS),	/* PL */
2065 	RZG2L_GPIO_PORT_PACK(8, 0x36, RZV2H_MPXED_PIN_FUNCS),	/* PM */
2066 	0x0,
2067 	0x0,
2068 	0x0,
2069 	0x0,
2070 	0x0,
2071 	RZG2L_GPIO_PORT_PACK(4, 0x3c, RZV2H_MPXED_PIN_FUNCS),	/* PS */
2072 };
2073 
2074 static const char * const rzv2h_gpio_names[] = {
2075 	"P00", "P01", "P02", "P03", "P04", "P05", "P06", "P07",
2076 	"P10", "P11", "P12", "P13", "P14", "P15", "P16", "P17",
2077 	"P20", "P21", "P22", "P23", "P24", "P25", "P26", "P27",
2078 	"P30", "P31", "P32", "P33", "P34", "P35", "P36", "P37",
2079 	"P40", "P41", "P42", "P43", "P44", "P45", "P46", "P47",
2080 	"P50", "P51", "P52", "P53", "P54", "P55", "P56", "P57",
2081 	"P60", "P61", "P62", "P63", "P64", "P65", "P66", "P67",
2082 	"P70", "P71", "P72", "P73", "P74", "P75", "P76", "P77",
2083 	"P80", "P81", "P82", "P83", "P84", "P85", "P86", "P87",
2084 	"P90", "P91", "P92", "P93", "P94", "P95", "P96", "P97",
2085 	"PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7",
2086 	"PB0", "PB1", "PB2", "PB3", "PB4", "PB5", "PB6", "PB7",
2087 };
2088 
2089 static const u64 r9a09g057_gpio_configs[] = {
2090 	RZG2L_GPIO_PORT_PACK(8, 0x20, RZV2H_MPXED_PIN_FUNCS),	/* P0 */
2091 	RZG2L_GPIO_PORT_PACK(6, 0x21, RZV2H_MPXED_PIN_FUNCS),	/* P1 */
2092 	RZG2L_GPIO_PORT_PACK(2, 0x22, RZG2L_MPXED_COMMON_PIN_FUNCS(RZV2H) |
2093 				      PIN_CFG_NOD),		/* P2 */
2094 	RZG2L_GPIO_PORT_PACK(8, 0x23, RZV2H_MPXED_PIN_FUNCS),	/* P3 */
2095 	RZG2L_GPIO_PORT_PACK(8, 0x24, RZV2H_MPXED_PIN_FUNCS),	/* P4 */
2096 	RZG2L_GPIO_PORT_PACK(8, 0x25, RZV2H_MPXED_PIN_FUNCS),	/* P5 */
2097 	RZG2L_GPIO_PORT_PACK(8, 0x26, RZV2H_MPXED_PIN_FUNCS |
2098 				      PIN_CFG_ELC),		/* P6 */
2099 	RZG2L_GPIO_PORT_PACK(8, 0x27, RZV2H_MPXED_PIN_FUNCS),	/* P7 */
2100 	RZG2L_GPIO_PORT_PACK(8, 0x28, RZV2H_MPXED_PIN_FUNCS |
2101 				      PIN_CFG_ELC),		/* P8 */
2102 	RZG2L_GPIO_PORT_PACK(8, 0x29, RZV2H_MPXED_PIN_FUNCS),	/* P9 */
2103 	RZG2L_GPIO_PORT_PACK(8, 0x2a, RZV2H_MPXED_PIN_FUNCS),	/* PA */
2104 	RZG2L_GPIO_PORT_PACK_VARIABLE(6, 0x2b),			/* PB */
2105 };
2106 
2107 static const struct {
2108 	struct rzg2l_dedicated_configs common[35];
2109 	struct rzg2l_dedicated_configs rzg2l_pins[7];
2110 } rzg2l_dedicated_pins = {
2111 	.common = {
2112 		{ "NMI", RZG2L_SINGLE_PIN_PACK(0x1, 0, PIN_CFG_NF) },
2113 		{ "TMS/SWDIO", RZG2L_SINGLE_PIN_PACK(0x2, 0,
2114 		 (PIN_CFG_IOLH_A | PIN_CFG_SR | PIN_CFG_IEN)) },
2115 		{ "TDO", RZG2L_SINGLE_PIN_PACK(0x3, 0,
2116 		 (PIN_CFG_IOLH_A | PIN_CFG_SR | PIN_CFG_IEN)) },
2117 		{ "AUDIO_CLK1", RZG2L_SINGLE_PIN_PACK(0x4, 0, PIN_CFG_IEN) },
2118 		{ "AUDIO_CLK2", RZG2L_SINGLE_PIN_PACK(0x4, 1, PIN_CFG_IEN) },
2119 		{ "SD0_CLK", RZG2L_SINGLE_PIN_PACK(0x6, 0,
2120 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_SD0)) },
2121 		{ "SD0_CMD", RZG2L_SINGLE_PIN_PACK(0x6, 1,
2122 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2123 		{ "SD0_RST#", RZG2L_SINGLE_PIN_PACK(0x6, 2,
2124 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_SD0)) },
2125 		{ "SD0_DATA0", RZG2L_SINGLE_PIN_PACK(0x7, 0,
2126 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2127 		{ "SD0_DATA1", RZG2L_SINGLE_PIN_PACK(0x7, 1,
2128 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2129 		{ "SD0_DATA2", RZG2L_SINGLE_PIN_PACK(0x7, 2,
2130 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2131 		{ "SD0_DATA3", RZG2L_SINGLE_PIN_PACK(0x7, 3,
2132 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2133 		{ "SD0_DATA4", RZG2L_SINGLE_PIN_PACK(0x7, 4,
2134 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2135 		{ "SD0_DATA5", RZG2L_SINGLE_PIN_PACK(0x7, 5,
2136 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2137 		{ "SD0_DATA6", RZG2L_SINGLE_PIN_PACK(0x7, 6,
2138 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2139 		{ "SD0_DATA7", RZG2L_SINGLE_PIN_PACK(0x7, 7,
2140 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD0)) },
2141 		{ "SD1_CLK", RZG2L_SINGLE_PIN_PACK(0x8, 0,
2142 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_SD1)) },
2143 		{ "SD1_CMD", RZG2L_SINGLE_PIN_PACK(0x8, 1,
2144 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD1)) },
2145 		{ "SD1_DATA0", RZG2L_SINGLE_PIN_PACK(0x9, 0,
2146 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD1)) },
2147 		{ "SD1_DATA1", RZG2L_SINGLE_PIN_PACK(0x9, 1,
2148 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD1)) },
2149 		{ "SD1_DATA2", RZG2L_SINGLE_PIN_PACK(0x9, 2,
2150 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD1)) },
2151 		{ "SD1_DATA3", RZG2L_SINGLE_PIN_PACK(0x9, 3,
2152 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_IO_VMC_SD1)) },
2153 		{ "QSPI0_SPCLK", RZG2L_SINGLE_PIN_PACK(0xa, 0,
2154 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2155 		{ "QSPI0_IO0", RZG2L_SINGLE_PIN_PACK(0xa, 1,
2156 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2157 		{ "QSPI0_IO1", RZG2L_SINGLE_PIN_PACK(0xa, 2,
2158 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2159 		{ "QSPI0_IO2", RZG2L_SINGLE_PIN_PACK(0xa, 3,
2160 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2161 		{ "QSPI0_IO3", RZG2L_SINGLE_PIN_PACK(0xa, 4,
2162 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2163 		{ "QSPI0_SSL", RZG2L_SINGLE_PIN_PACK(0xa, 5,
2164 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2165 		{ "QSPI_RESET#", RZG2L_SINGLE_PIN_PACK(0xc, 0,
2166 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2167 		{ "QSPI_WP#", RZG2L_SINGLE_PIN_PACK(0xc, 1,
2168 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2169 		{ "WDTOVF_PERROUT#", RZG2L_SINGLE_PIN_PACK(0xd, 0, (PIN_CFG_IOLH_A | PIN_CFG_SR)) },
2170 		{ "RIIC0_SDA", RZG2L_SINGLE_PIN_PACK(0xe, 0, PIN_CFG_IEN) },
2171 		{ "RIIC0_SCL", RZG2L_SINGLE_PIN_PACK(0xe, 1, PIN_CFG_IEN) },
2172 		{ "RIIC1_SDA", RZG2L_SINGLE_PIN_PACK(0xe, 2, PIN_CFG_IEN) },
2173 		{ "RIIC1_SCL", RZG2L_SINGLE_PIN_PACK(0xe, 3, PIN_CFG_IEN) },
2174 	},
2175 	.rzg2l_pins = {
2176 		{ "QSPI_INT#", RZG2L_SINGLE_PIN_PACK(0xc, 2, (PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2177 		{ "QSPI1_SPCLK", RZG2L_SINGLE_PIN_PACK(0xb, 0,
2178 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2179 		{ "QSPI1_IO0", RZG2L_SINGLE_PIN_PACK(0xb, 1,
2180 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2181 		{ "QSPI1_IO1", RZG2L_SINGLE_PIN_PACK(0xb, 2,
2182 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2183 		{ "QSPI1_IO2", RZG2L_SINGLE_PIN_PACK(0xb, 3,
2184 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2185 		{ "QSPI1_IO3", RZG2L_SINGLE_PIN_PACK(0xb, 4,
2186 		 (PIN_CFG_IOLH_B | PIN_CFG_SR  | PIN_CFG_IO_VMC_QSPI)) },
2187 		{ "QSPI1_SSL", RZG2L_SINGLE_PIN_PACK(0xb, 5,
2188 		 (PIN_CFG_IOLH_B | PIN_CFG_SR | PIN_CFG_IO_VMC_QSPI)) },
2189 	}
2190 };
2191 
2192 static const struct rzg2l_dedicated_configs rzg3s_dedicated_pins[] = {
2193 	{ "NMI", RZG2L_SINGLE_PIN_PACK(0x0, 0, PIN_CFG_NF) },
2194 	{ "TMS/SWDIO", RZG2L_SINGLE_PIN_PACK(0x1, 0, (PIN_CFG_IOLH_A | PIN_CFG_IEN |
2195 						      PIN_CFG_SOFT_PS)) },
2196 	{ "TDO", RZG2L_SINGLE_PIN_PACK(0x1, 1, (PIN_CFG_IOLH_A | PIN_CFG_SOFT_PS)) },
2197 	{ "AUDIO_CLK1", RZG2L_SINGLE_PIN_PACK(0x2, 0, PIN_CFG_IEN) },
2198 	{ "AUDIO_CLK2", RZG2L_SINGLE_PIN_PACK(0x2, 1, PIN_CFG_IEN) },
2199 	{ "WDTOVF_PERROUT#", RZG2L_SINGLE_PIN_PACK(0x6, 0, PIN_CFG_IOLH_A | PIN_CFG_SOFT_PS) },
2200 	{ "SD0_CLK", RZG2L_SINGLE_PIN_PACK(0x10, 0, (PIN_CFG_IOLH_B | PIN_CFG_IO_VMC_SD0)) },
2201 	{ "SD0_CMD", RZG2L_SINGLE_PIN_PACK(0x10, 1, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2202 						     PIN_CFG_IO_VMC_SD0)) },
2203 	{ "SD0_RST#", RZG2L_SINGLE_PIN_PACK(0x10, 2, (PIN_CFG_IOLH_B | PIN_CFG_IO_VMC_SD0)) },
2204 	{ "SD0_DATA0", RZG2L_SINGLE_PIN_PACK(0x11, 0, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2205 						       PIN_CFG_IO_VMC_SD0)) },
2206 	{ "SD0_DATA1", RZG2L_SINGLE_PIN_PACK(0x11, 1, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2207 						       PIN_CFG_IO_VMC_SD0)) },
2208 	{ "SD0_DATA2", RZG2L_SINGLE_PIN_PACK(0x11, 2, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2209 						       PIN_CFG_IO_VMC_SD0)) },
2210 	{ "SD0_DATA3", RZG2L_SINGLE_PIN_PACK(0x11, 3, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2211 						       PIN_CFG_IO_VMC_SD0)) },
2212 	{ "SD0_DATA4", RZG2L_SINGLE_PIN_PACK(0x11, 4, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2213 						       PIN_CFG_IO_VMC_SD0)) },
2214 	{ "SD0_DATA5", RZG2L_SINGLE_PIN_PACK(0x11, 5, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2215 						       PIN_CFG_IO_VMC_SD0)) },
2216 	{ "SD0_DATA6", RZG2L_SINGLE_PIN_PACK(0x11, 6, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2217 						       PIN_CFG_IO_VMC_SD0)) },
2218 	{ "SD0_DATA7", RZG2L_SINGLE_PIN_PACK(0x11, 7, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2219 						       PIN_CFG_IO_VMC_SD0)) },
2220 	{ "SD1_CLK", RZG2L_SINGLE_PIN_PACK(0x12, 0, (PIN_CFG_IOLH_B | PIN_CFG_IO_VMC_SD1)) },
2221 	{ "SD1_CMD", RZG2L_SINGLE_PIN_PACK(0x12, 1, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2222 						     PIN_CFG_IO_VMC_SD1)) },
2223 	{ "SD1_DATA0", RZG2L_SINGLE_PIN_PACK(0x13, 0, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2224 						       PIN_CFG_IO_VMC_SD1)) },
2225 	{ "SD1_DATA1", RZG2L_SINGLE_PIN_PACK(0x13, 1, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2226 						       PIN_CFG_IO_VMC_SD1)) },
2227 	{ "SD1_DATA2", RZG2L_SINGLE_PIN_PACK(0x13, 2, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2228 						       PIN_CFG_IO_VMC_SD1)) },
2229 	{ "SD1_DATA3", RZG2L_SINGLE_PIN_PACK(0x13, 3, (PIN_CFG_IOLH_B | PIN_CFG_IEN |
2230 						       PIN_CFG_IO_VMC_SD1)) },
2231 };
2232 
2233 static const struct {
2234 	struct rzg2l_dedicated_configs common[77];
2235 	struct rzg2l_dedicated_configs pcie1[1];
2236 } rzv2h_dedicated_pins = {
2237 	.common = {
2238 		{ "NMI", RZG2L_SINGLE_PIN_PACK(0x1, 0, PIN_CFG_NF) },
2239 		{ "TMS_SWDIO", RZG2L_SINGLE_PIN_PACK(0x3, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2240 							      PIN_CFG_IEN)) },
2241 		{ "TDO", RZG2L_SINGLE_PIN_PACK(0x3, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
2242 		{ "WDTUDFCA", RZG2L_SINGLE_PIN_PACK(0x5, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2243 							     PIN_CFG_PUPD | PIN_CFG_NOD)) },
2244 		{ "WDTUDFCM", RZG2L_SINGLE_PIN_PACK(0x5, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2245 							     PIN_CFG_PUPD | PIN_CFG_NOD)) },
2246 		{ "SCIF_RXD", RZG2L_SINGLE_PIN_PACK(0x6, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2247 							     PIN_CFG_PUPD)) },
2248 		{ "SCIF_TXD", RZG2L_SINGLE_PIN_PACK(0x6, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2249 							     PIN_CFG_PUPD)) },
2250 		{ "XSPI0_CKP", RZG2L_SINGLE_PIN_PACK(0x7, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2251 							      PIN_CFG_PUPD | PIN_CFG_OEN)) },
2252 		{ "XSPI0_CKN", RZG2L_SINGLE_PIN_PACK(0x7, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2253 							      PIN_CFG_PUPD | PIN_CFG_OEN)) },
2254 		{ "XSPI0_CS0N", RZG2L_SINGLE_PIN_PACK(0x7, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2255 							       PIN_CFG_PUPD | PIN_CFG_OEN)) },
2256 		{ "XSPI0_DS", RZG2L_SINGLE_PIN_PACK(0x7, 3, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2257 							     PIN_CFG_PUPD)) },
2258 		{ "XSPI0_RESET0N", RZG2L_SINGLE_PIN_PACK(0x7, 4, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2259 								  PIN_CFG_PUPD | PIN_CFG_OEN)) },
2260 		{ "XSPI0_RSTO0N", RZG2L_SINGLE_PIN_PACK(0x7, 5, (PIN_CFG_PUPD)) },
2261 		{ "XSPI0_INT0N", RZG2L_SINGLE_PIN_PACK(0x7, 6, (PIN_CFG_PUPD)) },
2262 		{ "XSPI0_ECS0N", RZG2L_SINGLE_PIN_PACK(0x7, 7, (PIN_CFG_PUPD)) },
2263 		{ "XSPI0_IO0", RZG2L_SINGLE_PIN_PACK(0x8, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2264 							      PIN_CFG_PUPD)) },
2265 		{ "XSPI0_IO1", RZG2L_SINGLE_PIN_PACK(0x8, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2266 							      PIN_CFG_PUPD)) },
2267 		{ "XSPI0_IO2", RZG2L_SINGLE_PIN_PACK(0x8, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2268 							      PIN_CFG_PUPD)) },
2269 		{ "XSPI0_IO3", RZG2L_SINGLE_PIN_PACK(0x8, 3, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2270 							      PIN_CFG_PUPD)) },
2271 		{ "XSPI0_IO4", RZG2L_SINGLE_PIN_PACK(0x8, 4, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2272 							      PIN_CFG_PUPD)) },
2273 		{ "XSPI0_IO5", RZG2L_SINGLE_PIN_PACK(0x8, 5, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2274 							      PIN_CFG_PUPD)) },
2275 		{ "XSPI0_IO6", RZG2L_SINGLE_PIN_PACK(0x8, 6, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2276 							      PIN_CFG_PUPD)) },
2277 		{ "XSPI0_IO7", RZG2L_SINGLE_PIN_PACK(0x8, 7, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2278 							      PIN_CFG_PUPD)) },
2279 		{ "SD0CLK", RZG2L_SINGLE_PIN_PACK(0x9, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
2280 		{ "SD0CMD", RZG2L_SINGLE_PIN_PACK(0x9, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2281 							   PIN_CFG_IEN | PIN_CFG_PUPD)) },
2282 		{ "SD0RSTN", RZG2L_SINGLE_PIN_PACK(0x9, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
2283 		{ "SD0DAT0", RZG2L_SINGLE_PIN_PACK(0xa, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2284 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2285 		{ "SD0DAT1", RZG2L_SINGLE_PIN_PACK(0xa, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2286 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2287 		{ "SD0DAT2", RZG2L_SINGLE_PIN_PACK(0xa, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2288 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2289 		{ "SD0DAT3", RZG2L_SINGLE_PIN_PACK(0xa, 3, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2290 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2291 		{ "SD0DAT4", RZG2L_SINGLE_PIN_PACK(0xa, 4, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2292 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2293 		{ "SD0DAT5", RZG2L_SINGLE_PIN_PACK(0xa, 5, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2294 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2295 		{ "SD0DAT6", RZG2L_SINGLE_PIN_PACK(0xa, 6, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2296 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2297 		{ "SD0DAT7", RZG2L_SINGLE_PIN_PACK(0xa, 7, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2298 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2299 		{ "SD1CLK", RZG2L_SINGLE_PIN_PACK(0xb, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
2300 		{ "SD1CMD", RZG2L_SINGLE_PIN_PACK(0xb, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2301 							   PIN_CFG_IEN | PIN_CFG_PUPD)) },
2302 		{ "SD1DAT0", RZG2L_SINGLE_PIN_PACK(0xc, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2303 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2304 		{ "SD1DAT1", RZG2L_SINGLE_PIN_PACK(0xc, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2305 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2306 		{ "SD1DAT2", RZG2L_SINGLE_PIN_PACK(0xc, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2307 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2308 		{ "SD1DAT3", RZG2L_SINGLE_PIN_PACK(0xc, 3, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2309 							    PIN_CFG_IEN | PIN_CFG_PUPD)) },
2310 		{ "PCIE0_RSTOUTB", RZG2L_SINGLE_PIN_PACK(0xe, 0, (PIN_CFG_IOLH_RZV2H |
2311 								  PIN_CFG_SR)) },
2312 		{ "ET0_MDIO", RZG2L_SINGLE_PIN_PACK(0xf, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2313 							     PIN_CFG_IEN | PIN_CFG_PUPD)) },
2314 		{ "ET0_MDC", RZG2L_SINGLE_PIN_PACK(0xf, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2315 							    PIN_CFG_PUPD)) },
2316 		{ "ET0_RXCTL_RXDV", RZG2L_SINGLE_PIN_PACK(0x10, 0, (PIN_CFG_PUPD)) },
2317 		{ "ET0_TXCTL_TXEN", RZG2L_SINGLE_PIN_PACK(0x10, 1, (PIN_CFG_IOLH_RZV2H |
2318 								    PIN_CFG_SR |
2319 								    PIN_CFG_PUPD)) },
2320 		{ "ET0_TXER", RZG2L_SINGLE_PIN_PACK(0x10, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2321 							      PIN_CFG_PUPD)) },
2322 		{ "ET0_RXER", RZG2L_SINGLE_PIN_PACK(0x10, 3, (PIN_CFG_PUPD)) },
2323 		{ "ET0_RXC_RXCLK", RZG2L_SINGLE_PIN_PACK(0x10, 4, (PIN_CFG_PUPD)) },
2324 		{ "ET0_TXC_TXCLK", RZG2L_SINGLE_PIN_PACK(0x10, 5, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2325 								   PIN_CFG_PUPD | PIN_CFG_OEN)) },
2326 		{ "ET0_CRS", RZG2L_SINGLE_PIN_PACK(0x10, 6, (PIN_CFG_PUPD)) },
2327 		{ "ET0_COL", RZG2L_SINGLE_PIN_PACK(0x10, 7, (PIN_CFG_PUPD)) },
2328 		{ "ET0_TXD0", RZG2L_SINGLE_PIN_PACK(0x11, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2329 							      PIN_CFG_PUPD)) },
2330 		{ "ET0_TXD1", RZG2L_SINGLE_PIN_PACK(0x11, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2331 							      PIN_CFG_PUPD)) },
2332 		{ "ET0_TXD2", RZG2L_SINGLE_PIN_PACK(0x11, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2333 							      PIN_CFG_PUPD)) },
2334 		{ "ET0_TXD3", RZG2L_SINGLE_PIN_PACK(0x11, 3, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2335 							      PIN_CFG_PUPD)) },
2336 		{ "ET0_RXD0", RZG2L_SINGLE_PIN_PACK(0x11, 4, (PIN_CFG_PUPD)) },
2337 		{ "ET0_RXD1", RZG2L_SINGLE_PIN_PACK(0x11, 5, (PIN_CFG_PUPD)) },
2338 		{ "ET0_RXD2", RZG2L_SINGLE_PIN_PACK(0x11, 6, (PIN_CFG_PUPD)) },
2339 		{ "ET0_RXD3", RZG2L_SINGLE_PIN_PACK(0x11, 7, (PIN_CFG_PUPD)) },
2340 		{ "ET1_MDIO", RZG2L_SINGLE_PIN_PACK(0x12, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2341 							      PIN_CFG_IEN | PIN_CFG_PUPD)) },
2342 		{ "ET1_MDC", RZG2L_SINGLE_PIN_PACK(0x12, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2343 							     PIN_CFG_PUPD)) },
2344 		{ "ET1_RXCTL_RXDV", RZG2L_SINGLE_PIN_PACK(0x13, 0, (PIN_CFG_PUPD)) },
2345 		{ "ET1_TXCTL_TXEN", RZG2L_SINGLE_PIN_PACK(0x13, 1, (PIN_CFG_IOLH_RZV2H |
2346 								    PIN_CFG_SR |
2347 								    PIN_CFG_PUPD)) },
2348 		{ "ET1_TXER", RZG2L_SINGLE_PIN_PACK(0x13, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2349 							       PIN_CFG_PUPD)) },
2350 		{ "ET1_RXER", RZG2L_SINGLE_PIN_PACK(0x13, 3, (PIN_CFG_PUPD)) },
2351 		{ "ET1_RXC_RXCLK", RZG2L_SINGLE_PIN_PACK(0x13, 4, (PIN_CFG_PUPD)) },
2352 		{ "ET1_TXC_TXCLK", RZG2L_SINGLE_PIN_PACK(0x13, 5, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2353 								   PIN_CFG_PUPD | PIN_CFG_OEN)) },
2354 		{ "ET1_CRS", RZG2L_SINGLE_PIN_PACK(0x13, 6, (PIN_CFG_PUPD)) },
2355 		{ "ET1_COL", RZG2L_SINGLE_PIN_PACK(0x13, 7, (PIN_CFG_PUPD)) },
2356 		{ "ET1_TXD0", RZG2L_SINGLE_PIN_PACK(0x14, 0, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2357 							      PIN_CFG_PUPD)) },
2358 		{ "ET1_TXD1", RZG2L_SINGLE_PIN_PACK(0x14, 1, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2359 							      PIN_CFG_PUPD)) },
2360 		{ "ET1_TXD2", RZG2L_SINGLE_PIN_PACK(0x14, 2, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2361 							      PIN_CFG_PUPD)) },
2362 		{ "ET1_TXD3", RZG2L_SINGLE_PIN_PACK(0x14, 3, (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR |
2363 							      PIN_CFG_PUPD)) },
2364 		{ "ET1_RXD0", RZG2L_SINGLE_PIN_PACK(0x14, 4, (PIN_CFG_PUPD)) },
2365 		{ "ET1_RXD1", RZG2L_SINGLE_PIN_PACK(0x14, 5, (PIN_CFG_PUPD)) },
2366 		{ "ET1_RXD2", RZG2L_SINGLE_PIN_PACK(0x14, 6, (PIN_CFG_PUPD)) },
2367 		{ "ET1_RXD3", RZG2L_SINGLE_PIN_PACK(0x14, 7, (PIN_CFG_PUPD)) },
2368 		},
2369 	.pcie1 = {
2370 		{ "PCIE1_RSTOUTB", RZG2L_SINGLE_PIN_PACK(0xe, 1, (PIN_CFG_IOLH_RZV2H |
2371 								  PIN_CFG_SR)) },
2372 	},
2373 };
2374 
2375 static struct rzg2l_dedicated_configs rzg3e_dedicated_pins[] = {
2376 	{ "WDTUDFCA", RZG2L_SINGLE_PIN_PACK(0x5, 0,
2377 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_PUPD | PIN_CFG_NOD)) },
2378 	{ "WDTUDFCM", RZG2L_SINGLE_PIN_PACK(0x5, 1,
2379 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_PUPD | PIN_CFG_NOD)) },
2380 	{ "SCIF_RXD", RZG2L_SINGLE_PIN_PACK(0x6, 0,
2381 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_PUPD)) },
2382 	{ "SCIF_TXD", RZG2L_SINGLE_PIN_PACK(0x6, 1,
2383 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_PUPD)) },
2384 	{ "SD0CLK", RZG2L_SINGLE_PIN_PACK(0x9, 0,
2385 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
2386 	{ "SD0CMD", RZG2L_SINGLE_PIN_PACK(0x9, 1,
2387 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2388 	{ "SD0RSTN", RZG2L_SINGLE_PIN_PACK(0x9, 2,
2389 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
2390 	{ "SD0PWEN", RZG2L_SINGLE_PIN_PACK(0x9, 3,
2391 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
2392 	{ "SD0IOVS", RZG2L_SINGLE_PIN_PACK(0x9, 4,
2393 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR)) },
2394 	{ "SD0DAT0", RZG2L_SINGLE_PIN_PACK(0xa, 0,
2395 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2396 	{ "SD0DAT1", RZG2L_SINGLE_PIN_PACK(0xa, 1,
2397 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2398 	{ "SD0DAT2", RZG2L_SINGLE_PIN_PACK(0xa, 2,
2399 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2400 	{ "SD0DAT3", RZG2L_SINGLE_PIN_PACK(0xa, 3,
2401 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2402 	{ "SD0DAT4", RZG2L_SINGLE_PIN_PACK(0xa, 4,
2403 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2404 	{ "SD0DAT5", RZG2L_SINGLE_PIN_PACK(0xa, 5,
2405 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2406 	{ "SD0DAT6", RZG2L_SINGLE_PIN_PACK(0xa, 6,
2407 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2408 	{ "SD0DAT7", RZG2L_SINGLE_PIN_PACK(0xa, 7,
2409 	 (PIN_CFG_IOLH_RZV2H | PIN_CFG_SR | PIN_CFG_IEN | PIN_CFG_PUPD)) },
2410 };
2411 
rzg2l_gpio_get_gpioint(unsigned int virq,struct rzg2l_pinctrl * pctrl)2412 static int rzg2l_gpio_get_gpioint(unsigned int virq, struct rzg2l_pinctrl *pctrl)
2413 {
2414 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[virq];
2415 	const struct rzg2l_pinctrl_data *data = pctrl->data;
2416 	u64 *pin_data = pin_desc->drv_data;
2417 	unsigned int gpioint;
2418 	unsigned int i;
2419 	u32 port, bit;
2420 
2421 	if (*pin_data & PIN_CFG_NOGPIO_INT)
2422 		return -EINVAL;
2423 
2424 	port = virq / 8;
2425 	bit = virq % 8;
2426 
2427 	if (port >= data->n_ports ||
2428 	    bit >= hweight8(FIELD_GET(PIN_CFG_PIN_MAP_MASK, data->port_pin_configs[port])))
2429 		return -EINVAL;
2430 
2431 	gpioint = bit;
2432 	for (i = 0; i < port; i++)
2433 		gpioint += hweight8(FIELD_GET(PIN_CFG_PIN_MAP_MASK, data->port_pin_configs[i]));
2434 
2435 	return gpioint;
2436 }
2437 
rzg2l_gpio_irq_endisable(struct rzg2l_pinctrl * pctrl,unsigned int hwirq,bool enable)2438 static void rzg2l_gpio_irq_endisable(struct rzg2l_pinctrl *pctrl,
2439 				     unsigned int hwirq, bool enable)
2440 {
2441 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[hwirq];
2442 	u64 *pin_data = pin_desc->drv_data;
2443 	u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
2444 	u8 bit = RZG2L_PIN_ID_TO_PIN(hwirq);
2445 	unsigned long flags;
2446 	void __iomem *addr;
2447 
2448 	addr = pctrl->base + ISEL(off);
2449 	if (bit >= 4) {
2450 		bit -= 4;
2451 		addr += 4;
2452 	}
2453 
2454 	spin_lock_irqsave(&pctrl->lock, flags);
2455 	if (enable)
2456 		writel(readl(addr) | BIT(bit * 8), addr);
2457 	else
2458 		writel(readl(addr) & ~BIT(bit * 8), addr);
2459 	spin_unlock_irqrestore(&pctrl->lock, flags);
2460 }
2461 
rzg2l_gpio_irq_disable(struct irq_data * d)2462 static void rzg2l_gpio_irq_disable(struct irq_data *d)
2463 {
2464 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
2465 	unsigned int hwirq = irqd_to_hwirq(d);
2466 
2467 	irq_chip_disable_parent(d);
2468 	gpiochip_disable_irq(gc, hwirq);
2469 }
2470 
rzg2l_gpio_irq_enable(struct irq_data * d)2471 static void rzg2l_gpio_irq_enable(struct irq_data *d)
2472 {
2473 	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
2474 	unsigned int hwirq = irqd_to_hwirq(d);
2475 
2476 	gpiochip_enable_irq(gc, hwirq);
2477 	irq_chip_enable_parent(d);
2478 }
2479 
rzg2l_gpio_irq_set_type(struct irq_data * d,unsigned int type)2480 static int rzg2l_gpio_irq_set_type(struct irq_data *d, unsigned int type)
2481 {
2482 	return irq_chip_set_type_parent(d, type);
2483 }
2484 
rzg2l_gpio_irqc_eoi(struct irq_data * d)2485 static void rzg2l_gpio_irqc_eoi(struct irq_data *d)
2486 {
2487 	irq_chip_eoi_parent(d);
2488 }
2489 
rzg2l_gpio_irq_print_chip(struct irq_data * data,struct seq_file * p)2490 static void rzg2l_gpio_irq_print_chip(struct irq_data *data, struct seq_file *p)
2491 {
2492 	struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
2493 
2494 	seq_puts(p, dev_name(gc->parent));
2495 }
2496 
rzg2l_gpio_irq_set_wake(struct irq_data * data,unsigned int on)2497 static int rzg2l_gpio_irq_set_wake(struct irq_data *data, unsigned int on)
2498 {
2499 	struct gpio_chip *gc = irq_data_get_irq_chip_data(data);
2500 	struct rzg2l_pinctrl *pctrl = container_of(gc, struct rzg2l_pinctrl, gpio_chip);
2501 	int ret;
2502 
2503 	/* It should not happen. */
2504 	if (!data->parent_data)
2505 		return -EOPNOTSUPP;
2506 
2507 	ret = irq_chip_set_wake_parent(data, on);
2508 	if (ret)
2509 		return ret;
2510 
2511 	if (on)
2512 		atomic_inc(&pctrl->wakeup_path);
2513 	else
2514 		atomic_dec(&pctrl->wakeup_path);
2515 
2516 	return 0;
2517 }
2518 
2519 static const struct irq_chip rzg2l_gpio_irqchip = {
2520 	.name = "rzg2l-gpio",
2521 	.irq_disable = rzg2l_gpio_irq_disable,
2522 	.irq_enable = rzg2l_gpio_irq_enable,
2523 	.irq_mask = irq_chip_mask_parent,
2524 	.irq_unmask = irq_chip_unmask_parent,
2525 	.irq_set_type = rzg2l_gpio_irq_set_type,
2526 	.irq_eoi = rzg2l_gpio_irqc_eoi,
2527 	.irq_print_chip = rzg2l_gpio_irq_print_chip,
2528 	.irq_set_affinity = irq_chip_set_affinity_parent,
2529 	.irq_set_wake = rzg2l_gpio_irq_set_wake,
2530 	.flags = IRQCHIP_IMMUTABLE,
2531 	GPIOCHIP_IRQ_RESOURCE_HELPERS,
2532 };
2533 
rzg2l_gpio_interrupt_input_mode(struct gpio_chip * chip,unsigned int offset)2534 static int rzg2l_gpio_interrupt_input_mode(struct gpio_chip *chip, unsigned int offset)
2535 {
2536 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(chip);
2537 	const struct pinctrl_pin_desc *pin_desc = &pctrl->desc.pins[offset];
2538 	u64 *pin_data = pin_desc->drv_data;
2539 	u32 off = RZG2L_PIN_CFG_TO_PORT_OFFSET(*pin_data);
2540 	u8 bit = RZG2L_PIN_ID_TO_PIN(offset);
2541 	u8 reg8;
2542 	int ret;
2543 
2544 	reg8 = readb(pctrl->base + PMC(off));
2545 	if (reg8 & BIT(bit)) {
2546 		ret = rzg2l_gpio_request(chip, offset);
2547 		if (ret)
2548 			return ret;
2549 	}
2550 
2551 	return rzg2l_gpio_direction_input(chip, offset);
2552 }
2553 
rzg2l_gpio_child_to_parent_hwirq(struct gpio_chip * gc,unsigned int child,unsigned int child_type,unsigned int * parent,unsigned int * parent_type)2554 static int rzg2l_gpio_child_to_parent_hwirq(struct gpio_chip *gc,
2555 					    unsigned int child,
2556 					    unsigned int child_type,
2557 					    unsigned int *parent,
2558 					    unsigned int *parent_type)
2559 {
2560 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(gc);
2561 	unsigned long flags;
2562 	int gpioint, irq;
2563 	int ret;
2564 
2565 	gpioint = rzg2l_gpio_get_gpioint(child, pctrl);
2566 	if (gpioint < 0)
2567 		return gpioint;
2568 
2569 	ret = rzg2l_gpio_interrupt_input_mode(gc, child);
2570 	if (ret)
2571 		return ret;
2572 
2573 	spin_lock_irqsave(&pctrl->bitmap_lock, flags);
2574 	irq = bitmap_find_free_region(pctrl->tint_slot, RZG2L_TINT_MAX_INTERRUPT, get_order(1));
2575 	spin_unlock_irqrestore(&pctrl->bitmap_lock, flags);
2576 	if (irq < 0) {
2577 		ret = -ENOSPC;
2578 		goto err;
2579 	}
2580 
2581 	rzg2l_gpio_irq_endisable(pctrl, child, true);
2582 	pctrl->hwirq[irq] = child;
2583 	irq += pctrl->data->hwcfg->tint_start_index;
2584 
2585 	/* All these interrupts are level high in the CPU */
2586 	*parent_type = IRQ_TYPE_LEVEL_HIGH;
2587 	*parent = RZG2L_PACK_HWIRQ(gpioint, irq);
2588 	return 0;
2589 
2590 err:
2591 	rzg2l_gpio_free(gc, child);
2592 	return ret;
2593 }
2594 
rzg2l_gpio_irq_restore(struct rzg2l_pinctrl * pctrl)2595 static void rzg2l_gpio_irq_restore(struct rzg2l_pinctrl *pctrl)
2596 {
2597 	struct irq_domain *domain = pctrl->gpio_chip.irq.domain;
2598 
2599 	for (unsigned int i = 0; i < RZG2L_TINT_MAX_INTERRUPT; i++) {
2600 		struct irq_data *data;
2601 		unsigned long flags;
2602 		unsigned int virq;
2603 		int ret;
2604 
2605 		if (!pctrl->hwirq[i])
2606 			continue;
2607 
2608 		virq = irq_find_mapping(domain, pctrl->hwirq[i]);
2609 		if (!virq) {
2610 			dev_crit(pctrl->dev, "Failed to find IRQ mapping for hwirq %u\n",
2611 				 pctrl->hwirq[i]);
2612 			continue;
2613 		}
2614 
2615 		data = irq_domain_get_irq_data(domain, virq);
2616 		if (!data) {
2617 			dev_crit(pctrl->dev, "Failed to get IRQ data for virq=%u\n", virq);
2618 			continue;
2619 		}
2620 
2621 		/*
2622 		 * This has to be atomically executed to protect against a concurrent
2623 		 * interrupt.
2624 		 */
2625 		spin_lock_irqsave(&pctrl->lock, flags);
2626 		ret = rzg2l_gpio_irq_set_type(data, irqd_get_trigger_type(data));
2627 		if (!ret && !irqd_irq_disabled(data))
2628 			rzg2l_gpio_irq_enable(data);
2629 		spin_unlock_irqrestore(&pctrl->lock, flags);
2630 
2631 		if (ret)
2632 			dev_crit(pctrl->dev, "Failed to set IRQ type for virq=%u\n", virq);
2633 	}
2634 }
2635 
rzg2l_gpio_irq_domain_free(struct irq_domain * domain,unsigned int virq,unsigned int nr_irqs)2636 static void rzg2l_gpio_irq_domain_free(struct irq_domain *domain, unsigned int virq,
2637 				       unsigned int nr_irqs)
2638 {
2639 	struct irq_data *d;
2640 
2641 	d = irq_domain_get_irq_data(domain, virq);
2642 	if (d) {
2643 		struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
2644 		struct rzg2l_pinctrl *pctrl = container_of(gc, struct rzg2l_pinctrl, gpio_chip);
2645 		irq_hw_number_t hwirq = irqd_to_hwirq(d);
2646 		unsigned long flags;
2647 		unsigned int i;
2648 
2649 		for (i = 0; i < RZG2L_TINT_MAX_INTERRUPT; i++) {
2650 			if (pctrl->hwirq[i] == hwirq) {
2651 				rzg2l_gpio_irq_endisable(pctrl, hwirq, false);
2652 				rzg2l_gpio_free(gc, hwirq);
2653 				spin_lock_irqsave(&pctrl->bitmap_lock, flags);
2654 				bitmap_release_region(pctrl->tint_slot, i, get_order(1));
2655 				spin_unlock_irqrestore(&pctrl->bitmap_lock, flags);
2656 				pctrl->hwirq[i] = 0;
2657 				break;
2658 			}
2659 		}
2660 	}
2661 	irq_domain_free_irqs_common(domain, virq, nr_irqs);
2662 }
2663 
rzg2l_init_irq_valid_mask(struct gpio_chip * gc,unsigned long * valid_mask,unsigned int ngpios)2664 static void rzg2l_init_irq_valid_mask(struct gpio_chip *gc,
2665 				      unsigned long *valid_mask,
2666 				      unsigned int ngpios)
2667 {
2668 	struct rzg2l_pinctrl *pctrl = gpiochip_get_data(gc);
2669 	struct gpio_chip *chip = &pctrl->gpio_chip;
2670 	unsigned int offset;
2671 
2672 	/* Forbid unused lines to be mapped as IRQs */
2673 	for (offset = 0; offset < chip->ngpio; offset++) {
2674 		u32 port, bit;
2675 
2676 		port = offset / 8;
2677 		bit = offset % 8;
2678 
2679 		if (port >= pctrl->data->n_ports ||
2680 		    bit >= hweight8(FIELD_GET(PIN_CFG_PIN_MAP_MASK,
2681 					      pctrl->data->port_pin_configs[port])))
2682 			clear_bit(offset, valid_mask);
2683 	}
2684 }
2685 
rzg2l_pinctrl_reg_cache_alloc(struct rzg2l_pinctrl * pctrl)2686 static int rzg2l_pinctrl_reg_cache_alloc(struct rzg2l_pinctrl *pctrl)
2687 {
2688 	u32 nports = pctrl->data->n_port_pins / RZG2L_PINS_PER_PORT;
2689 	struct rzg2l_pinctrl_reg_cache *cache, *dedicated_cache;
2690 
2691 	cache = devm_kzalloc(pctrl->dev, sizeof(*cache), GFP_KERNEL);
2692 	if (!cache)
2693 		return -ENOMEM;
2694 
2695 	dedicated_cache = devm_kzalloc(pctrl->dev, sizeof(*dedicated_cache), GFP_KERNEL);
2696 	if (!dedicated_cache)
2697 		return -ENOMEM;
2698 
2699 	cache->p = devm_kcalloc(pctrl->dev, nports, sizeof(*cache->p), GFP_KERNEL);
2700 	if (!cache->p)
2701 		return -ENOMEM;
2702 
2703 	cache->pm = devm_kcalloc(pctrl->dev, nports, sizeof(*cache->pm), GFP_KERNEL);
2704 	if (!cache->pm)
2705 		return -ENOMEM;
2706 
2707 	cache->pmc = devm_kcalloc(pctrl->dev, nports, sizeof(*cache->pmc), GFP_KERNEL);
2708 	if (!cache->pmc)
2709 		return -ENOMEM;
2710 
2711 	cache->pfc = devm_kcalloc(pctrl->dev, nports, sizeof(*cache->pfc), GFP_KERNEL);
2712 	if (!cache->pfc)
2713 		return -ENOMEM;
2714 
2715 	for (u8 i = 0; i < 2; i++) {
2716 		u32 n_dedicated_pins = pctrl->data->n_dedicated_pins;
2717 
2718 		cache->iolh[i] = devm_kcalloc(pctrl->dev, nports, sizeof(*cache->iolh[i]),
2719 					      GFP_KERNEL);
2720 		if (!cache->iolh[i])
2721 			return -ENOMEM;
2722 
2723 		cache->ien[i] = devm_kcalloc(pctrl->dev, nports, sizeof(*cache->ien[i]),
2724 					     GFP_KERNEL);
2725 		if (!cache->ien[i])
2726 			return -ENOMEM;
2727 
2728 		cache->pupd[i] = devm_kcalloc(pctrl->dev, nports, sizeof(*cache->pupd[i]),
2729 					      GFP_KERNEL);
2730 		if (!cache->pupd[i])
2731 			return -ENOMEM;
2732 
2733 		/* Allocate dedicated cache. */
2734 		dedicated_cache->iolh[i] = devm_kcalloc(pctrl->dev, n_dedicated_pins,
2735 							sizeof(*dedicated_cache->iolh[i]),
2736 							GFP_KERNEL);
2737 		if (!dedicated_cache->iolh[i])
2738 			return -ENOMEM;
2739 
2740 		dedicated_cache->ien[i] = devm_kcalloc(pctrl->dev, n_dedicated_pins,
2741 						       sizeof(*dedicated_cache->ien[i]),
2742 						       GFP_KERNEL);
2743 		if (!dedicated_cache->ien[i])
2744 			return -ENOMEM;
2745 	}
2746 
2747 	pctrl->cache = cache;
2748 	pctrl->dedicated_cache = dedicated_cache;
2749 
2750 	return 0;
2751 }
2752 
rzg2l_gpio_register(struct rzg2l_pinctrl * pctrl)2753 static int rzg2l_gpio_register(struct rzg2l_pinctrl *pctrl)
2754 {
2755 	struct device_node *np = pctrl->dev->of_node;
2756 	struct gpio_chip *chip = &pctrl->gpio_chip;
2757 	const char *name = dev_name(pctrl->dev);
2758 	struct irq_domain *parent_domain;
2759 	struct of_phandle_args of_args;
2760 	struct device_node *parent_np;
2761 	struct gpio_irq_chip *girq;
2762 	int ret;
2763 
2764 	parent_np = of_irq_find_parent(np);
2765 	if (!parent_np)
2766 		return -ENXIO;
2767 
2768 	parent_domain = irq_find_host(parent_np);
2769 	of_node_put(parent_np);
2770 	if (!parent_domain)
2771 		return -EPROBE_DEFER;
2772 
2773 	ret = of_parse_phandle_with_fixed_args(np, "gpio-ranges", 3, 0, &of_args);
2774 	if (ret)
2775 		return dev_err_probe(pctrl->dev, ret, "Unable to parse gpio-ranges\n");
2776 
2777 	of_node_put(of_args.np);
2778 
2779 	if (of_args.args[0] != 0 || of_args.args[1] != 0 ||
2780 	    of_args.args[2] != pctrl->data->n_port_pins)
2781 		return dev_err_probe(pctrl->dev, -EINVAL,
2782 				     "gpio-ranges does not match selected SOC\n");
2783 
2784 	chip->names = pctrl->data->port_pins;
2785 	chip->request = rzg2l_gpio_request;
2786 	chip->free = rzg2l_gpio_free;
2787 	chip->get_direction = rzg2l_gpio_get_direction;
2788 	chip->direction_input = rzg2l_gpio_direction_input;
2789 	chip->direction_output = rzg2l_gpio_direction_output;
2790 	chip->get = rzg2l_gpio_get;
2791 	chip->set = rzg2l_gpio_set;
2792 	chip->label = name;
2793 	chip->parent = pctrl->dev;
2794 	chip->owner = THIS_MODULE;
2795 	chip->base = -1;
2796 	chip->ngpio = of_args.args[2];
2797 
2798 	girq = &chip->irq;
2799 	gpio_irq_chip_set_chip(girq, &rzg2l_gpio_irqchip);
2800 	girq->fwnode = dev_fwnode(pctrl->dev);
2801 	girq->parent_domain = parent_domain;
2802 	girq->child_to_parent_hwirq = rzg2l_gpio_child_to_parent_hwirq;
2803 	girq->populate_parent_alloc_arg = gpiochip_populate_parent_fwspec_twocell;
2804 	girq->child_irq_domain_ops.free = rzg2l_gpio_irq_domain_free;
2805 	girq->init_valid_mask = rzg2l_init_irq_valid_mask;
2806 
2807 	pctrl->gpio_range.id = 0;
2808 	pctrl->gpio_range.pin_base = 0;
2809 	pctrl->gpio_range.base = 0;
2810 	pctrl->gpio_range.npins = chip->ngpio;
2811 	pctrl->gpio_range.name = chip->label;
2812 	pctrl->gpio_range.gc = chip;
2813 	ret = devm_gpiochip_add_data(pctrl->dev, chip, pctrl);
2814 	if (ret)
2815 		return dev_err_probe(pctrl->dev, ret, "failed to add GPIO controller\n");
2816 
2817 	dev_dbg(pctrl->dev, "Registered gpio controller\n");
2818 
2819 	return 0;
2820 }
2821 
rzg2l_pinctrl_register(struct rzg2l_pinctrl * pctrl)2822 static int rzg2l_pinctrl_register(struct rzg2l_pinctrl *pctrl)
2823 {
2824 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
2825 	struct pinctrl_pin_desc *pins;
2826 	unsigned int i, j;
2827 	u64 *pin_data;
2828 	int ret;
2829 
2830 	pctrl->desc.name = DRV_NAME;
2831 	pctrl->desc.npins = pctrl->data->n_port_pins + pctrl->data->n_dedicated_pins;
2832 	pctrl->desc.pctlops = &rzg2l_pinctrl_pctlops;
2833 	pctrl->desc.pmxops = &rzg2l_pinctrl_pmxops;
2834 	pctrl->desc.confops = &rzg2l_pinctrl_confops;
2835 	pctrl->desc.owner = THIS_MODULE;
2836 	if (pctrl->data->num_custom_params) {
2837 		pctrl->desc.num_custom_params = pctrl->data->num_custom_params;
2838 		pctrl->desc.custom_params = pctrl->data->custom_params;
2839 #ifdef CONFIG_DEBUG_FS
2840 		pctrl->desc.custom_conf_items = pctrl->data->custom_conf_items;
2841 #endif
2842 	}
2843 
2844 	pins = devm_kcalloc(pctrl->dev, pctrl->desc.npins, sizeof(*pins), GFP_KERNEL);
2845 	if (!pins)
2846 		return -ENOMEM;
2847 
2848 	pin_data = devm_kcalloc(pctrl->dev, pctrl->desc.npins,
2849 				sizeof(*pin_data), GFP_KERNEL);
2850 	if (!pin_data)
2851 		return -ENOMEM;
2852 
2853 	pctrl->pins = pins;
2854 	pctrl->desc.pins = pins;
2855 
2856 	for (i = 0, j = 0; i < pctrl->data->n_port_pins; i++) {
2857 		pins[i].number = i;
2858 		pins[i].name = pctrl->data->port_pins[i];
2859 		if (i && !(i % RZG2L_PINS_PER_PORT))
2860 			j++;
2861 		pin_data[i] = pctrl->data->port_pin_configs[j];
2862 		if (pin_data[i] & RZG2L_VARIABLE_CFG)
2863 			pin_data[i] = rzg2l_pinctrl_get_variable_pin_cfg(pctrl,
2864 									 pin_data[i],
2865 									 j,
2866 									 i % RZG2L_PINS_PER_PORT);
2867 		pins[i].drv_data = &pin_data[i];
2868 	}
2869 
2870 	for (i = 0; i < pctrl->data->n_dedicated_pins; i++) {
2871 		unsigned int index = pctrl->data->n_port_pins + i;
2872 
2873 		pins[index].number = index;
2874 		pins[index].name = pctrl->data->dedicated_pins[i].name;
2875 		pin_data[index] = pctrl->data->dedicated_pins[i].config;
2876 		pins[index].drv_data = &pin_data[index];
2877 	}
2878 
2879 	pctrl->settings = devm_kcalloc(pctrl->dev, pctrl->desc.npins, sizeof(*pctrl->settings),
2880 				       GFP_KERNEL);
2881 	if (!pctrl->settings)
2882 		return -ENOMEM;
2883 
2884 	for (i = 0; hwcfg->drive_strength_ua && i < pctrl->desc.npins; i++) {
2885 		if (pin_data[i] & PIN_CFG_SOFT_PS) {
2886 			pctrl->settings[i].power_source = 3300;
2887 		} else {
2888 			ret = rzg2l_get_power_source(pctrl, i, pin_data[i]);
2889 			if (ret < 0)
2890 				continue;
2891 			pctrl->settings[i].power_source = ret;
2892 		}
2893 	}
2894 
2895 	ret = rzg2l_pinctrl_reg_cache_alloc(pctrl);
2896 	if (ret)
2897 		return ret;
2898 
2899 	ret = devm_pinctrl_register_and_init(pctrl->dev, &pctrl->desc, pctrl,
2900 					     &pctrl->pctl);
2901 	if (ret)
2902 		return dev_err_probe(pctrl->dev, ret, "pinctrl registration failed\n");
2903 
2904 	ret = pinctrl_enable(pctrl->pctl);
2905 	if (ret)
2906 		return dev_err_probe(pctrl->dev, ret, "pinctrl enable failed\n");
2907 
2908 	ret = rzg2l_gpio_register(pctrl);
2909 	if (ret)
2910 		return dev_err_probe(pctrl->dev, ret, "failed to add GPIO chip\n");
2911 
2912 	return 0;
2913 }
2914 
rzg2l_pinctrl_probe(struct platform_device * pdev)2915 static int rzg2l_pinctrl_probe(struct platform_device *pdev)
2916 {
2917 	struct rzg2l_pinctrl *pctrl;
2918 	int ret;
2919 
2920 	BUILD_BUG_ON(ARRAY_SIZE(r9a07g044_gpio_configs) * RZG2L_PINS_PER_PORT >
2921 		     ARRAY_SIZE(rzg2l_gpio_names));
2922 
2923 	BUILD_BUG_ON(ARRAY_SIZE(r9a07g043_gpio_configs) * RZG2L_PINS_PER_PORT >
2924 		     ARRAY_SIZE(rzg2l_gpio_names));
2925 
2926 	BUILD_BUG_ON(ARRAY_SIZE(r9a08g045_gpio_configs) * RZG2L_PINS_PER_PORT >
2927 		     ARRAY_SIZE(rzg2l_gpio_names));
2928 
2929 	BUILD_BUG_ON(ARRAY_SIZE(r9a09g047_gpio_configs) * RZG2L_PINS_PER_PORT >
2930 		     ARRAY_SIZE(rzg3e_gpio_names));
2931 
2932 	BUILD_BUG_ON(ARRAY_SIZE(r9a09g057_gpio_configs) * RZG2L_PINS_PER_PORT >
2933 		     ARRAY_SIZE(rzv2h_gpio_names));
2934 
2935 	pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
2936 	if (!pctrl)
2937 		return -ENOMEM;
2938 
2939 	pctrl->dev = &pdev->dev;
2940 
2941 	pctrl->data = of_device_get_match_data(&pdev->dev);
2942 	if (!pctrl->data)
2943 		return -EINVAL;
2944 
2945 	pctrl->base = devm_platform_ioremap_resource(pdev, 0);
2946 	if (IS_ERR(pctrl->base))
2947 		return PTR_ERR(pctrl->base);
2948 
2949 	pctrl->clk = devm_clk_get_enabled(pctrl->dev, NULL);
2950 	if (IS_ERR(pctrl->clk)) {
2951 		return dev_err_probe(pctrl->dev, PTR_ERR(pctrl->clk),
2952 				     "failed to enable GPIO clk\n");
2953 	}
2954 
2955 	spin_lock_init(&pctrl->lock);
2956 	spin_lock_init(&pctrl->bitmap_lock);
2957 	mutex_init(&pctrl->mutex);
2958 	atomic_set(&pctrl->wakeup_path, 0);
2959 
2960 	platform_set_drvdata(pdev, pctrl);
2961 
2962 	ret = rzg2l_pinctrl_register(pctrl);
2963 	if (ret)
2964 		return ret;
2965 
2966 	dev_info(pctrl->dev, "%s support registered\n", DRV_NAME);
2967 	return 0;
2968 }
2969 
rzg2l_pinctrl_pm_setup_regs(struct rzg2l_pinctrl * pctrl,bool suspend)2970 static void rzg2l_pinctrl_pm_setup_regs(struct rzg2l_pinctrl *pctrl, bool suspend)
2971 {
2972 	u32 nports = pctrl->data->n_port_pins / RZG2L_PINS_PER_PORT;
2973 	struct rzg2l_pinctrl_reg_cache *cache = pctrl->cache;
2974 
2975 	for (u32 port = 0; port < nports; port++) {
2976 		bool has_iolh, has_ien, has_pupd;
2977 		u32 off, caps;
2978 		u8 pincnt;
2979 		u64 cfg;
2980 
2981 		cfg = pctrl->data->port_pin_configs[port];
2982 		off = RZG2L_PIN_CFG_TO_PORT_OFFSET(cfg);
2983 		pincnt = hweight8(FIELD_GET(PIN_CFG_PIN_MAP_MASK, cfg));
2984 
2985 		caps = FIELD_GET(PIN_CFG_MASK, cfg);
2986 		has_iolh = !!(caps & (PIN_CFG_IOLH_A | PIN_CFG_IOLH_B | PIN_CFG_IOLH_C));
2987 		has_ien = !!(caps & PIN_CFG_IEN);
2988 		has_pupd = !!(caps & PIN_CFG_PUPD);
2989 
2990 		if (suspend)
2991 			RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + PFC(off), cache->pfc[port]);
2992 
2993 		/*
2994 		 * Now cache the registers or set them in the order suggested by
2995 		 * HW manual (section "Operation for GPIO Function").
2996 		 */
2997 		RZG2L_PCTRL_REG_ACCESS8(suspend, pctrl->base + PMC(off), cache->pmc[port]);
2998 		if (has_iolh) {
2999 			RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + IOLH(off),
3000 						 cache->iolh[0][port]);
3001 			if (pincnt >= 4) {
3002 				RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + IOLH(off) + 4,
3003 							 cache->iolh[1][port]);
3004 			}
3005 		}
3006 
3007 		if (has_pupd) {
3008 			RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + PUPD(off),
3009 						 cache->pupd[0][port]);
3010 			if (pincnt >= 4) {
3011 				RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + PUPD(off),
3012 							 cache->pupd[1][port]);
3013 			}
3014 		}
3015 
3016 		RZG2L_PCTRL_REG_ACCESS16(suspend, pctrl->base + PM(off), cache->pm[port]);
3017 		RZG2L_PCTRL_REG_ACCESS8(suspend, pctrl->base + P(off), cache->p[port]);
3018 
3019 		if (has_ien) {
3020 			RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + IEN(off),
3021 						 cache->ien[0][port]);
3022 			if (pincnt >= 4) {
3023 				RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + IEN(off) + 4,
3024 							 cache->ien[1][port]);
3025 			}
3026 		}
3027 	}
3028 }
3029 
rzg2l_pinctrl_pm_setup_dedicated_regs(struct rzg2l_pinctrl * pctrl,bool suspend)3030 static void rzg2l_pinctrl_pm_setup_dedicated_regs(struct rzg2l_pinctrl *pctrl, bool suspend)
3031 {
3032 	struct rzg2l_pinctrl_reg_cache *cache = pctrl->dedicated_cache;
3033 	u32 caps;
3034 	u32 i;
3035 
3036 	/*
3037 	 * Make sure entries in pctrl->data->n_dedicated_pins[] having the same
3038 	 * port offset are close together.
3039 	 */
3040 	for (i = 0, caps = 0; i < pctrl->data->n_dedicated_pins; i++) {
3041 		bool has_iolh, has_ien;
3042 		u32 off, next_off = 0;
3043 		u64 cfg, next_cfg;
3044 		u8 pincnt;
3045 
3046 		cfg = pctrl->data->dedicated_pins[i].config;
3047 		off = RZG2L_PIN_CFG_TO_PORT_OFFSET(cfg);
3048 		if (i + 1 < pctrl->data->n_dedicated_pins) {
3049 			next_cfg = pctrl->data->dedicated_pins[i + 1].config;
3050 			next_off = RZG2L_PIN_CFG_TO_PORT_OFFSET(next_cfg);
3051 		}
3052 
3053 		if (off == next_off) {
3054 			/* Gather caps of all port pins. */
3055 			caps |= FIELD_GET(PIN_CFG_MASK, cfg);
3056 			continue;
3057 		}
3058 
3059 		/* And apply them in a single shot. */
3060 		has_iolh = !!(caps & (PIN_CFG_IOLH_A | PIN_CFG_IOLH_B | PIN_CFG_IOLH_C));
3061 		has_ien = !!(caps & PIN_CFG_IEN);
3062 		pincnt = hweight8(FIELD_GET(RZG2L_SINGLE_PIN_BITS_MASK, cfg));
3063 
3064 		if (has_iolh) {
3065 			RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + IOLH(off),
3066 						 cache->iolh[0][i]);
3067 		}
3068 		if (has_ien) {
3069 			RZG2L_PCTRL_REG_ACCESS32(suspend, pctrl->base + IEN(off),
3070 						 cache->ien[0][i]);
3071 		}
3072 
3073 		if (pincnt >= 4) {
3074 			if (has_iolh) {
3075 				RZG2L_PCTRL_REG_ACCESS32(suspend,
3076 							 pctrl->base + IOLH(off) + 4,
3077 							 cache->iolh[1][i]);
3078 			}
3079 			if (has_ien) {
3080 				RZG2L_PCTRL_REG_ACCESS32(suspend,
3081 							 pctrl->base + IEN(off) + 4,
3082 							 cache->ien[1][i]);
3083 			}
3084 		}
3085 		caps = 0;
3086 	}
3087 }
3088 
rzg2l_pinctrl_pm_setup_pfc(struct rzg2l_pinctrl * pctrl)3089 static void rzg2l_pinctrl_pm_setup_pfc(struct rzg2l_pinctrl *pctrl)
3090 {
3091 	u32 nports = pctrl->data->n_port_pins / RZG2L_PINS_PER_PORT;
3092 	unsigned long flags;
3093 
3094 	spin_lock_irqsave(&pctrl->lock, flags);
3095 	pctrl->data->pwpr_pfc_lock_unlock(pctrl, false);
3096 
3097 	/* Restore port registers. */
3098 	for (u32 port = 0; port < nports; port++) {
3099 		unsigned long pinmap;
3100 		u8 pmc = 0, max_pin;
3101 		u32 off, pfc = 0;
3102 		u64 cfg;
3103 		u16 pm;
3104 		u8 pin;
3105 
3106 		cfg = pctrl->data->port_pin_configs[port];
3107 		off = RZG2L_PIN_CFG_TO_PORT_OFFSET(cfg);
3108 		pinmap = FIELD_GET(PIN_CFG_PIN_MAP_MASK, cfg);
3109 		max_pin = fls(pinmap);
3110 
3111 		pm = readw(pctrl->base + PM(off));
3112 		for_each_set_bit(pin, &pinmap, max_pin) {
3113 			struct rzg2l_pinctrl_reg_cache *cache = pctrl->cache;
3114 
3115 			/* Nothing to do if PFC was not configured before. */
3116 			if (!(cache->pmc[port] & BIT(pin)))
3117 				continue;
3118 
3119 			/* Set pin to 'Non-use (Hi-Z input protection)' */
3120 			pm &= ~(PM_MASK << (pin * 2));
3121 			writew(pm, pctrl->base + PM(off));
3122 
3123 			/* Temporarily switch to GPIO mode with PMC register */
3124 			pmc &= ~BIT(pin);
3125 			writeb(pmc, pctrl->base + PMC(off));
3126 
3127 			/* Select Pin function mode. */
3128 			pfc &= ~(PFC_MASK << (pin * 4));
3129 			pfc |= (cache->pfc[port] & (PFC_MASK << (pin * 4)));
3130 			writel(pfc, pctrl->base + PFC(off));
3131 
3132 			/* Switch to Peripheral pin function. */
3133 			pmc |= BIT(pin);
3134 			writeb(pmc, pctrl->base + PMC(off));
3135 		}
3136 	}
3137 
3138 	pctrl->data->pwpr_pfc_lock_unlock(pctrl, true);
3139 	spin_unlock_irqrestore(&pctrl->lock, flags);
3140 }
3141 
rzg2l_pinctrl_suspend_noirq(struct device * dev)3142 static int rzg2l_pinctrl_suspend_noirq(struct device *dev)
3143 {
3144 	struct rzg2l_pinctrl *pctrl = dev_get_drvdata(dev);
3145 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
3146 	const struct rzg2l_register_offsets *regs = &hwcfg->regs;
3147 	struct rzg2l_pinctrl_reg_cache *cache = pctrl->cache;
3148 
3149 	rzg2l_pinctrl_pm_setup_regs(pctrl, true);
3150 	rzg2l_pinctrl_pm_setup_dedicated_regs(pctrl, true);
3151 
3152 	for (u8 i = 0; i < 2; i++) {
3153 		if (regs->sd_ch)
3154 			cache->sd_ch[i] = readb(pctrl->base + SD_CH(regs->sd_ch, i));
3155 		if (regs->eth_poc)
3156 			cache->eth_poc[i] = readb(pctrl->base + ETH_POC(regs->eth_poc, i));
3157 	}
3158 
3159 	cache->qspi = readb(pctrl->base + QSPI);
3160 	cache->eth_mode = readb(pctrl->base + ETH_MODE);
3161 
3162 	if (!atomic_read(&pctrl->wakeup_path))
3163 		clk_disable_unprepare(pctrl->clk);
3164 	else
3165 		device_set_wakeup_path(dev);
3166 
3167 	return 0;
3168 }
3169 
rzg2l_pinctrl_resume_noirq(struct device * dev)3170 static int rzg2l_pinctrl_resume_noirq(struct device *dev)
3171 {
3172 	struct rzg2l_pinctrl *pctrl = dev_get_drvdata(dev);
3173 	const struct rzg2l_hwcfg *hwcfg = pctrl->data->hwcfg;
3174 	const struct rzg2l_register_offsets *regs = &hwcfg->regs;
3175 	struct rzg2l_pinctrl_reg_cache *cache = pctrl->cache;
3176 	int ret;
3177 
3178 	if (!atomic_read(&pctrl->wakeup_path)) {
3179 		ret = clk_prepare_enable(pctrl->clk);
3180 		if (ret)
3181 			return ret;
3182 	}
3183 
3184 	writeb(cache->qspi, pctrl->base + QSPI);
3185 	writeb(cache->eth_mode, pctrl->base + ETH_MODE);
3186 	for (u8 i = 0; i < 2; i++) {
3187 		if (regs->sd_ch)
3188 			writeb(cache->sd_ch[i], pctrl->base + SD_CH(regs->sd_ch, i));
3189 		if (regs->eth_poc)
3190 			writeb(cache->eth_poc[i], pctrl->base + ETH_POC(regs->eth_poc, i));
3191 	}
3192 
3193 	rzg2l_pinctrl_pm_setup_pfc(pctrl);
3194 	rzg2l_pinctrl_pm_setup_regs(pctrl, false);
3195 	rzg2l_pinctrl_pm_setup_dedicated_regs(pctrl, false);
3196 	rzg2l_gpio_irq_restore(pctrl);
3197 
3198 	return 0;
3199 }
3200 
rzg2l_pwpr_pfc_lock_unlock(struct rzg2l_pinctrl * pctrl,bool lock)3201 static void rzg2l_pwpr_pfc_lock_unlock(struct rzg2l_pinctrl *pctrl, bool lock)
3202 {
3203 	const struct rzg2l_register_offsets *regs = &pctrl->data->hwcfg->regs;
3204 
3205 	if (lock) {
3206 		/* Set the PWPR register to be write-protected */
3207 		writel(0x0, pctrl->base + regs->pwpr);		/* B0WI=0, PFCWE=0 */
3208 		writel(PWPR_B0WI, pctrl->base + regs->pwpr);	/* B0WI=1, PFCWE=0 */
3209 	} else {
3210 		/* Set the PWPR register to allow PFC register to write */
3211 		writel(0x0, pctrl->base + regs->pwpr);		/* B0WI=0, PFCWE=0 */
3212 		writel(PWPR_PFCWE, pctrl->base + regs->pwpr);	/* B0WI=0, PFCWE=1 */
3213 	}
3214 }
3215 
rzv2h_pwpr_pfc_lock_unlock(struct rzg2l_pinctrl * pctrl,bool lock)3216 static void rzv2h_pwpr_pfc_lock_unlock(struct rzg2l_pinctrl *pctrl, bool lock)
3217 {
3218 	const struct rzg2l_register_offsets *regs = &pctrl->data->hwcfg->regs;
3219 	u8 pwpr;
3220 
3221 	if (lock) {
3222 		/* Set the PWPR register to be write-protected */
3223 		pwpr = readb(pctrl->base + regs->pwpr);
3224 		writeb(pwpr & ~PWPR_REGWE_A, pctrl->base + regs->pwpr);
3225 	} else {
3226 		/* Set the PWPR register to allow PFC and PMC register to write */
3227 		pwpr = readb(pctrl->base + regs->pwpr);
3228 		writeb(PWPR_REGWE_A | pwpr, pctrl->base + regs->pwpr);
3229 	}
3230 }
3231 
3232 static const struct rzg2l_hwcfg rzg2l_hwcfg = {
3233 	.regs = {
3234 		.pwpr = 0x3014,
3235 		.sd_ch = 0x3000,
3236 		.eth_poc = 0x300c,
3237 	},
3238 	.iolh_groupa_ua = {
3239 		/* 3v3 power source */
3240 		[RZG2L_IOLH_IDX_3V3] = 2000, 4000, 8000, 12000,
3241 	},
3242 	.iolh_groupb_oi = { 100, 66, 50, 33, },
3243 	.tint_start_index = 9,
3244 	.oen_max_pin = 0,
3245 };
3246 
3247 static const struct rzg2l_hwcfg rzg3s_hwcfg = {
3248 	.regs = {
3249 		.pwpr = 0x3000,
3250 		.sd_ch = 0x3004,
3251 		.eth_poc = 0x3010,
3252 	},
3253 	.iolh_groupa_ua = {
3254 		/* 1v8 power source */
3255 		[RZG2L_IOLH_IDX_1V8] = 2200, 4400, 9000, 10000,
3256 		/* 3v3 power source */
3257 		[RZG2L_IOLH_IDX_3V3] = 1900, 4000, 8000, 9000,
3258 	},
3259 	.iolh_groupb_ua = {
3260 		/* 1v8 power source */
3261 		[RZG2L_IOLH_IDX_1V8] = 7000, 8000, 9000, 10000,
3262 		/* 3v3 power source */
3263 		[RZG2L_IOLH_IDX_3V3] = 4000, 6000, 8000, 9000,
3264 	},
3265 	.iolh_groupc_ua = {
3266 		/* 1v8 power source */
3267 		[RZG2L_IOLH_IDX_1V8] = 5200, 6000, 6550, 6800,
3268 		/* 2v5 source */
3269 		[RZG2L_IOLH_IDX_2V5] = 4700, 5300, 5800, 6100,
3270 		/* 3v3 power source */
3271 		[RZG2L_IOLH_IDX_3V3] = 4500, 5200, 5700, 6050,
3272 	},
3273 	.tint_start_index = 9,
3274 	.drive_strength_ua = true,
3275 	.func_base = 1,
3276 	.oen_max_pin = 1, /* Pin 1 of P0 and P7 is the maximum OEN pin. */
3277 	.oen_max_port = 7, /* P7_1 is the maximum OEN port. */
3278 };
3279 
3280 static const struct rzg2l_hwcfg rzv2h_hwcfg = {
3281 	.regs = {
3282 		.pwpr = 0x3c04,
3283 	},
3284 	.tint_start_index = 17,
3285 };
3286 
3287 static struct rzg2l_pinctrl_data r9a07g043_data = {
3288 	.port_pins = rzg2l_gpio_names,
3289 	.port_pin_configs = r9a07g043_gpio_configs,
3290 	.n_ports = ARRAY_SIZE(r9a07g043_gpio_configs),
3291 	.dedicated_pins = rzg2l_dedicated_pins.common,
3292 	.n_port_pins = ARRAY_SIZE(r9a07g043_gpio_configs) * RZG2L_PINS_PER_PORT,
3293 	.n_dedicated_pins = ARRAY_SIZE(rzg2l_dedicated_pins.common),
3294 	.hwcfg = &rzg2l_hwcfg,
3295 #ifdef CONFIG_RISCV
3296 	.variable_pin_cfg = r9a07g043f_variable_pin_cfg,
3297 	.n_variable_pin_cfg = ARRAY_SIZE(r9a07g043f_variable_pin_cfg),
3298 #endif
3299 	.pwpr_pfc_lock_unlock = &rzg2l_pwpr_pfc_lock_unlock,
3300 	.pmc_writeb = &rzg2l_pmc_writeb,
3301 	.oen_read = &rzg2l_read_oen,
3302 	.oen_write = &rzg2l_write_oen,
3303 	.hw_to_bias_param = &rzg2l_hw_to_bias_param,
3304 	.bias_param_to_hw = &rzg2l_bias_param_to_hw,
3305 };
3306 
3307 static struct rzg2l_pinctrl_data r9a07g044_data = {
3308 	.port_pins = rzg2l_gpio_names,
3309 	.port_pin_configs = r9a07g044_gpio_configs,
3310 	.n_ports = ARRAY_SIZE(r9a07g044_gpio_configs),
3311 	.dedicated_pins = rzg2l_dedicated_pins.common,
3312 	.n_port_pins = ARRAY_SIZE(r9a07g044_gpio_configs) * RZG2L_PINS_PER_PORT,
3313 	.n_dedicated_pins = ARRAY_SIZE(rzg2l_dedicated_pins.common) +
3314 		ARRAY_SIZE(rzg2l_dedicated_pins.rzg2l_pins),
3315 	.hwcfg = &rzg2l_hwcfg,
3316 	.pwpr_pfc_lock_unlock = &rzg2l_pwpr_pfc_lock_unlock,
3317 	.pmc_writeb = &rzg2l_pmc_writeb,
3318 	.oen_read = &rzg2l_read_oen,
3319 	.oen_write = &rzg2l_write_oen,
3320 	.hw_to_bias_param = &rzg2l_hw_to_bias_param,
3321 	.bias_param_to_hw = &rzg2l_bias_param_to_hw,
3322 };
3323 
3324 static struct rzg2l_pinctrl_data r9a08g045_data = {
3325 	.port_pins = rzg2l_gpio_names,
3326 	.port_pin_configs = r9a08g045_gpio_configs,
3327 	.n_ports = ARRAY_SIZE(r9a08g045_gpio_configs),
3328 	.dedicated_pins = rzg3s_dedicated_pins,
3329 	.n_port_pins = ARRAY_SIZE(r9a08g045_gpio_configs) * RZG2L_PINS_PER_PORT,
3330 	.n_dedicated_pins = ARRAY_SIZE(rzg3s_dedicated_pins),
3331 	.hwcfg = &rzg3s_hwcfg,
3332 	.pwpr_pfc_lock_unlock = &rzg2l_pwpr_pfc_lock_unlock,
3333 	.pmc_writeb = &rzg2l_pmc_writeb,
3334 	.oen_read = &rzg3s_oen_read,
3335 	.oen_write = &rzg3s_oen_write,
3336 	.hw_to_bias_param = &rzg2l_hw_to_bias_param,
3337 	.bias_param_to_hw = &rzg2l_bias_param_to_hw,
3338 };
3339 
3340 static struct rzg2l_pinctrl_data r9a09g047_data = {
3341 	.port_pins = rzg3e_gpio_names,
3342 	.port_pin_configs = r9a09g047_gpio_configs,
3343 	.n_ports = ARRAY_SIZE(r9a09g047_gpio_configs),
3344 	.dedicated_pins = rzg3e_dedicated_pins,
3345 	.n_port_pins = ARRAY_SIZE(r9a09g047_gpio_configs) * RZG2L_PINS_PER_PORT,
3346 	.n_dedicated_pins = ARRAY_SIZE(rzg3e_dedicated_pins),
3347 	.hwcfg = &rzv2h_hwcfg,
3348 	.variable_pin_cfg = r9a09g047_variable_pin_cfg,
3349 	.n_variable_pin_cfg = ARRAY_SIZE(r9a09g047_variable_pin_cfg),
3350 	.num_custom_params = ARRAY_SIZE(renesas_rzv2h_custom_bindings),
3351 	.custom_params = renesas_rzv2h_custom_bindings,
3352 #ifdef CONFIG_DEBUG_FS
3353 	.custom_conf_items = renesas_rzv2h_conf_items,
3354 #endif
3355 	.pwpr_pfc_lock_unlock = &rzv2h_pwpr_pfc_lock_unlock,
3356 	.pmc_writeb = &rzv2h_pmc_writeb,
3357 	.oen_read = &rzv2h_oen_read,
3358 	.oen_write = &rzv2h_oen_write,
3359 	.hw_to_bias_param = &rzv2h_hw_to_bias_param,
3360 	.bias_param_to_hw = &rzv2h_bias_param_to_hw,
3361 };
3362 
3363 static struct rzg2l_pinctrl_data r9a09g056_data = {
3364 	.port_pins = rzv2h_gpio_names,
3365 	.port_pin_configs = r9a09g057_gpio_configs,
3366 	.n_ports = ARRAY_SIZE(r9a09g057_gpio_configs),
3367 	.dedicated_pins = rzv2h_dedicated_pins.common,
3368 	.n_port_pins = ARRAY_SIZE(r9a09g057_gpio_configs) * RZG2L_PINS_PER_PORT,
3369 	.n_dedicated_pins = ARRAY_SIZE(rzv2h_dedicated_pins.common),
3370 	.hwcfg = &rzv2h_hwcfg,
3371 	.variable_pin_cfg = r9a09g057_variable_pin_cfg,
3372 	.n_variable_pin_cfg = ARRAY_SIZE(r9a09g057_variable_pin_cfg),
3373 	.num_custom_params = ARRAY_SIZE(renesas_rzv2h_custom_bindings),
3374 	.custom_params = renesas_rzv2h_custom_bindings,
3375 #ifdef CONFIG_DEBUG_FS
3376 	.custom_conf_items = renesas_rzv2h_conf_items,
3377 #endif
3378 	.pwpr_pfc_lock_unlock = &rzv2h_pwpr_pfc_lock_unlock,
3379 	.pmc_writeb = &rzv2h_pmc_writeb,
3380 	.oen_read = &rzv2h_oen_read,
3381 	.oen_write = &rzv2h_oen_write,
3382 	.hw_to_bias_param = &rzv2h_hw_to_bias_param,
3383 	.bias_param_to_hw = &rzv2h_bias_param_to_hw,
3384 };
3385 
3386 static struct rzg2l_pinctrl_data r9a09g057_data = {
3387 	.port_pins = rzv2h_gpio_names,
3388 	.port_pin_configs = r9a09g057_gpio_configs,
3389 	.n_ports = ARRAY_SIZE(r9a09g057_gpio_configs),
3390 	.dedicated_pins = rzv2h_dedicated_pins.common,
3391 	.n_port_pins = ARRAY_SIZE(r9a09g057_gpio_configs) * RZG2L_PINS_PER_PORT,
3392 	.n_dedicated_pins = ARRAY_SIZE(rzv2h_dedicated_pins.common) +
3393 			    ARRAY_SIZE(rzv2h_dedicated_pins.pcie1),
3394 	.hwcfg = &rzv2h_hwcfg,
3395 	.variable_pin_cfg = r9a09g057_variable_pin_cfg,
3396 	.n_variable_pin_cfg = ARRAY_SIZE(r9a09g057_variable_pin_cfg),
3397 	.num_custom_params = ARRAY_SIZE(renesas_rzv2h_custom_bindings),
3398 	.custom_params = renesas_rzv2h_custom_bindings,
3399 #ifdef CONFIG_DEBUG_FS
3400 	.custom_conf_items = renesas_rzv2h_conf_items,
3401 #endif
3402 	.pwpr_pfc_lock_unlock = &rzv2h_pwpr_pfc_lock_unlock,
3403 	.pmc_writeb = &rzv2h_pmc_writeb,
3404 	.oen_read = &rzv2h_oen_read,
3405 	.oen_write = &rzv2h_oen_write,
3406 	.hw_to_bias_param = &rzv2h_hw_to_bias_param,
3407 	.bias_param_to_hw = &rzv2h_bias_param_to_hw,
3408 };
3409 
3410 static const struct of_device_id rzg2l_pinctrl_of_table[] = {
3411 	{
3412 		.compatible = "renesas,r9a07g043-pinctrl",
3413 		.data = &r9a07g043_data,
3414 	},
3415 	{
3416 		.compatible = "renesas,r9a07g044-pinctrl",
3417 		.data = &r9a07g044_data,
3418 	},
3419 	{
3420 		.compatible = "renesas,r9a08g045-pinctrl",
3421 		.data = &r9a08g045_data,
3422 	},
3423 	{
3424 		.compatible = "renesas,r9a09g047-pinctrl",
3425 		.data = &r9a09g047_data,
3426 	},
3427 	{
3428 		.compatible = "renesas,r9a09g056-pinctrl",
3429 		.data = &r9a09g056_data,
3430 	},
3431 	{
3432 		.compatible = "renesas,r9a09g057-pinctrl",
3433 		.data = &r9a09g057_data,
3434 	},
3435 	{ /* sentinel */ }
3436 };
3437 
3438 static const struct dev_pm_ops rzg2l_pinctrl_pm_ops = {
3439 	NOIRQ_SYSTEM_SLEEP_PM_OPS(rzg2l_pinctrl_suspend_noirq, rzg2l_pinctrl_resume_noirq)
3440 };
3441 
3442 static struct platform_driver rzg2l_pinctrl_driver = {
3443 	.driver = {
3444 		.name = DRV_NAME,
3445 		.of_match_table = of_match_ptr(rzg2l_pinctrl_of_table),
3446 		.pm = pm_sleep_ptr(&rzg2l_pinctrl_pm_ops),
3447 		.suppress_bind_attrs = true,
3448 	},
3449 	.probe = rzg2l_pinctrl_probe,
3450 };
3451 
rzg2l_pinctrl_init(void)3452 static int __init rzg2l_pinctrl_init(void)
3453 {
3454 	return platform_driver_register(&rzg2l_pinctrl_driver);
3455 }
3456 core_initcall(rzg2l_pinctrl_init);
3457 
3458 MODULE_AUTHOR("Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>");
3459 MODULE_DESCRIPTION("Pin and gpio controller driver for RZ/G2L family");
3460