xref: /linux/drivers/pinctrl/spacemit/pinctrl-k1.c (revision a83c29e1d145cca5240952100acd1cd60f25fb5f)
1*a83c29e1SYixun Lan // SPDX-License-Identifier: GPL-2.0
2*a83c29e1SYixun Lan /* Copyright (c) 2024 Yixun Lan <dlan@gentoo.org> */
3*a83c29e1SYixun Lan 
4*a83c29e1SYixun Lan #include <linux/bits.h>
5*a83c29e1SYixun Lan #include <linux/cleanup.h>
6*a83c29e1SYixun Lan #include <linux/io.h>
7*a83c29e1SYixun Lan #include <linux/of.h>
8*a83c29e1SYixun Lan #include <linux/platform_device.h>
9*a83c29e1SYixun Lan #include <linux/seq_file.h>
10*a83c29e1SYixun Lan #include <linux/spinlock.h>
11*a83c29e1SYixun Lan #include <linux/module.h>
12*a83c29e1SYixun Lan 
13*a83c29e1SYixun Lan #include <linux/pinctrl/pinconf-generic.h>
14*a83c29e1SYixun Lan #include <linux/pinctrl/pinconf.h>
15*a83c29e1SYixun Lan #include <linux/pinctrl/pinctrl.h>
16*a83c29e1SYixun Lan #include <linux/pinctrl/pinmux.h>
17*a83c29e1SYixun Lan 
18*a83c29e1SYixun Lan #include "../core.h"
19*a83c29e1SYixun Lan #include "../pinctrl-utils.h"
20*a83c29e1SYixun Lan #include "../pinconf.h"
21*a83c29e1SYixun Lan #include "../pinmux.h"
22*a83c29e1SYixun Lan #include "pinctrl-k1.h"
23*a83c29e1SYixun Lan 
24*a83c29e1SYixun Lan /*
25*a83c29e1SYixun Lan  * +---------+----------+-----------+--------+--------+----------+--------+
26*a83c29e1SYixun Lan  * |   pull  |   drive  | schmitter |  slew  |  edge  |  strong  |   mux  |
27*a83c29e1SYixun Lan  * | up/down | strength |  trigger  |  rate  | detect |   pull   |  mode  |
28*a83c29e1SYixun Lan  * +---------+----------+-----------+--------+--------+----------+--------+
29*a83c29e1SYixun Lan  *   3 bits     3 bits     2 bits     1 bit    3 bits     1 bit    3 bits
30*a83c29e1SYixun Lan  */
31*a83c29e1SYixun Lan 
32*a83c29e1SYixun Lan #define PAD_MUX			GENMASK(2, 0)
33*a83c29e1SYixun Lan #define PAD_STRONG_PULL		BIT(3)
34*a83c29e1SYixun Lan #define PAD_EDGE_RISE		BIT(4)
35*a83c29e1SYixun Lan #define PAD_EDGE_FALL		BIT(5)
36*a83c29e1SYixun Lan #define PAD_EDGE_CLEAR		BIT(6)
37*a83c29e1SYixun Lan #define PAD_SLEW_RATE		GENMASK(12, 11)
38*a83c29e1SYixun Lan #define PAD_SLEW_RATE_EN	BIT(7)
39*a83c29e1SYixun Lan #define PAD_SCHMITT		GENMASK(9, 8)
40*a83c29e1SYixun Lan #define PAD_DRIVE		GENMASK(12, 10)
41*a83c29e1SYixun Lan #define PAD_PULLDOWN		BIT(13)
42*a83c29e1SYixun Lan #define PAD_PULLUP		BIT(14)
43*a83c29e1SYixun Lan #define PAD_PULL_EN		BIT(15)
44*a83c29e1SYixun Lan 
45*a83c29e1SYixun Lan struct spacemit_pin {
46*a83c29e1SYixun Lan 	u16				pin;
47*a83c29e1SYixun Lan 	u16				flags;
48*a83c29e1SYixun Lan 	u8				gpiofunc;
49*a83c29e1SYixun Lan };
50*a83c29e1SYixun Lan 
51*a83c29e1SYixun Lan struct spacemit_pinctrl {
52*a83c29e1SYixun Lan 	struct device				*dev;
53*a83c29e1SYixun Lan 	struct pinctrl_dev			*pctl_dev;
54*a83c29e1SYixun Lan 	const struct spacemit_pinctrl_data	*data;
55*a83c29e1SYixun Lan 	struct pinctrl_desc			pdesc;
56*a83c29e1SYixun Lan 
57*a83c29e1SYixun Lan 	struct mutex				mutex;
58*a83c29e1SYixun Lan 	raw_spinlock_t				lock;
59*a83c29e1SYixun Lan 
60*a83c29e1SYixun Lan 	void __iomem				*regs;
61*a83c29e1SYixun Lan };
62*a83c29e1SYixun Lan 
63*a83c29e1SYixun Lan struct spacemit_pinctrl_data {
64*a83c29e1SYixun Lan 	const struct pinctrl_pin_desc   *pins;
65*a83c29e1SYixun Lan 	const struct spacemit_pin	*data;
66*a83c29e1SYixun Lan 	u16				npins;
67*a83c29e1SYixun Lan };
68*a83c29e1SYixun Lan 
69*a83c29e1SYixun Lan struct spacemit_pin_mux_config {
70*a83c29e1SYixun Lan 	const struct spacemit_pin	*pin;
71*a83c29e1SYixun Lan 	u32				config;
72*a83c29e1SYixun Lan };
73*a83c29e1SYixun Lan 
74*a83c29e1SYixun Lan struct spacemit_pin_drv_strength {
75*a83c29e1SYixun Lan 	u8		val;
76*a83c29e1SYixun Lan 	u32		mA;
77*a83c29e1SYixun Lan };
78*a83c29e1SYixun Lan 
79*a83c29e1SYixun Lan /* map pin id to pinctrl register offset, refer MFPR definition */
80*a83c29e1SYixun Lan static unsigned int spacemit_pin_to_offset(unsigned int pin)
81*a83c29e1SYixun Lan {
82*a83c29e1SYixun Lan 	unsigned int offset = 0;
83*a83c29e1SYixun Lan 
84*a83c29e1SYixun Lan 	switch (pin) {
85*a83c29e1SYixun Lan 	case 0 ... 85:
86*a83c29e1SYixun Lan 		offset = pin + 1;
87*a83c29e1SYixun Lan 		break;
88*a83c29e1SYixun Lan 	case 86 ... 92:
89*a83c29e1SYixun Lan 		offset = pin + 37;
90*a83c29e1SYixun Lan 		break;
91*a83c29e1SYixun Lan 	case 93 ... 97:
92*a83c29e1SYixun Lan 		offset = pin + 24;
93*a83c29e1SYixun Lan 		break;
94*a83c29e1SYixun Lan 	case 98:
95*a83c29e1SYixun Lan 		offset = 93;
96*a83c29e1SYixun Lan 		break;
97*a83c29e1SYixun Lan 	case 99:
98*a83c29e1SYixun Lan 		offset = 92;
99*a83c29e1SYixun Lan 		break;
100*a83c29e1SYixun Lan 	case 100:
101*a83c29e1SYixun Lan 		offset = 91;
102*a83c29e1SYixun Lan 		break;
103*a83c29e1SYixun Lan 	case 101:
104*a83c29e1SYixun Lan 		offset = 90;
105*a83c29e1SYixun Lan 		break;
106*a83c29e1SYixun Lan 	case 102:
107*a83c29e1SYixun Lan 		offset = 95;
108*a83c29e1SYixun Lan 		break;
109*a83c29e1SYixun Lan 	case 103:
110*a83c29e1SYixun Lan 		offset = 94;
111*a83c29e1SYixun Lan 		break;
112*a83c29e1SYixun Lan 	case 104 ... 110:
113*a83c29e1SYixun Lan 		offset = pin + 6;
114*a83c29e1SYixun Lan 		break;
115*a83c29e1SYixun Lan 	case 111 ... 127:
116*a83c29e1SYixun Lan 		offset = pin + 20;
117*a83c29e1SYixun Lan 		break;
118*a83c29e1SYixun Lan 	default:
119*a83c29e1SYixun Lan 		break;
120*a83c29e1SYixun Lan 	}
121*a83c29e1SYixun Lan 
122*a83c29e1SYixun Lan 	return offset << 2;
123*a83c29e1SYixun Lan }
124*a83c29e1SYixun Lan 
125*a83c29e1SYixun Lan static inline void __iomem *spacemit_pin_to_reg(struct spacemit_pinctrl *pctrl,
126*a83c29e1SYixun Lan 						unsigned int pin)
127*a83c29e1SYixun Lan {
128*a83c29e1SYixun Lan 	return pctrl->regs + spacemit_pin_to_offset(pin);
129*a83c29e1SYixun Lan }
130*a83c29e1SYixun Lan 
131*a83c29e1SYixun Lan static u16 spacemit_dt_get_pin(u32 value)
132*a83c29e1SYixun Lan {
133*a83c29e1SYixun Lan 	return value >> 16;
134*a83c29e1SYixun Lan }
135*a83c29e1SYixun Lan 
136*a83c29e1SYixun Lan static u16 spacemit_dt_get_pin_mux(u32 value)
137*a83c29e1SYixun Lan {
138*a83c29e1SYixun Lan 	return value & GENMASK(15, 0);
139*a83c29e1SYixun Lan }
140*a83c29e1SYixun Lan 
141*a83c29e1SYixun Lan static const struct spacemit_pin *spacemit_get_pin(struct spacemit_pinctrl *pctrl,
142*a83c29e1SYixun Lan 						   unsigned long pin)
143*a83c29e1SYixun Lan {
144*a83c29e1SYixun Lan 	const struct spacemit_pin *pdata = pctrl->data->data;
145*a83c29e1SYixun Lan 	int i;
146*a83c29e1SYixun Lan 
147*a83c29e1SYixun Lan 	for (i = 0; i < pctrl->data->npins; i++) {
148*a83c29e1SYixun Lan 		if (pin == pdata[i].pin)
149*a83c29e1SYixun Lan 			return &pdata[i];
150*a83c29e1SYixun Lan 	}
151*a83c29e1SYixun Lan 
152*a83c29e1SYixun Lan 	return NULL;
153*a83c29e1SYixun Lan }
154*a83c29e1SYixun Lan 
155*a83c29e1SYixun Lan static inline enum spacemit_pin_io_type spacemit_to_pin_io_type(
156*a83c29e1SYixun Lan 	const struct spacemit_pin *pin)
157*a83c29e1SYixun Lan {
158*a83c29e1SYixun Lan 	return K1_PIN_GET_IO_TYPE(pin->flags);
159*a83c29e1SYixun Lan }
160*a83c29e1SYixun Lan 
161*a83c29e1SYixun Lan /* External: IO voltage via external source, can be 1.8V or 3.3V */
162*a83c29e1SYixun Lan static const char * const io_type_desc[] = {
163*a83c29e1SYixun Lan 	"None",
164*a83c29e1SYixun Lan 	"Fixed/1V8",
165*a83c29e1SYixun Lan 	"Fixed/3V3",
166*a83c29e1SYixun Lan 	"External",
167*a83c29e1SYixun Lan };
168*a83c29e1SYixun Lan 
169*a83c29e1SYixun Lan static void spacemit_pctrl_dbg_show(struct pinctrl_dev *pctldev,
170*a83c29e1SYixun Lan 				    struct seq_file *seq, unsigned int pin)
171*a83c29e1SYixun Lan {
172*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
173*a83c29e1SYixun Lan 	const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin);
174*a83c29e1SYixun Lan 	enum spacemit_pin_io_type type = spacemit_to_pin_io_type(spin);
175*a83c29e1SYixun Lan 	void __iomem *reg;
176*a83c29e1SYixun Lan 	u32 value;
177*a83c29e1SYixun Lan 
178*a83c29e1SYixun Lan 	seq_printf(seq, "offset: 0x%04x ", spacemit_pin_to_offset(pin));
179*a83c29e1SYixun Lan 	seq_printf(seq, "type: %s ", io_type_desc[type]);
180*a83c29e1SYixun Lan 
181*a83c29e1SYixun Lan 	reg = spacemit_pin_to_reg(pctrl, pin);
182*a83c29e1SYixun Lan 	value = readl(reg);
183*a83c29e1SYixun Lan 	seq_printf(seq, "mux: %ld reg: 0x%04x", (value & PAD_MUX), value);
184*a83c29e1SYixun Lan }
185*a83c29e1SYixun Lan 
186*a83c29e1SYixun Lan /* use IO high level output current as the table */
187*a83c29e1SYixun Lan static struct spacemit_pin_drv_strength spacemit_ds_1v8_tbl[4] = {
188*a83c29e1SYixun Lan 	{ 0, 11 },
189*a83c29e1SYixun Lan 	{ 2, 21 },
190*a83c29e1SYixun Lan 	{ 4, 32 },
191*a83c29e1SYixun Lan 	{ 6, 42 },
192*a83c29e1SYixun Lan };
193*a83c29e1SYixun Lan 
194*a83c29e1SYixun Lan static struct spacemit_pin_drv_strength spacemit_ds_3v3_tbl[8] = {
195*a83c29e1SYixun Lan 	{ 0,  7 },
196*a83c29e1SYixun Lan 	{ 2, 10 },
197*a83c29e1SYixun Lan 	{ 4, 13 },
198*a83c29e1SYixun Lan 	{ 6, 16 },
199*a83c29e1SYixun Lan 	{ 1, 19 },
200*a83c29e1SYixun Lan 	{ 3, 23 },
201*a83c29e1SYixun Lan 	{ 5, 26 },
202*a83c29e1SYixun Lan 	{ 7, 29 },
203*a83c29e1SYixun Lan };
204*a83c29e1SYixun Lan 
205*a83c29e1SYixun Lan static inline u8 spacemit_get_ds_value(struct spacemit_pin_drv_strength *tbl,
206*a83c29e1SYixun Lan 				       u32 num, u32 mA)
207*a83c29e1SYixun Lan {
208*a83c29e1SYixun Lan 	int i;
209*a83c29e1SYixun Lan 
210*a83c29e1SYixun Lan 	for (i = 0; i < num; i++)
211*a83c29e1SYixun Lan 		if (mA <= tbl[i].mA)
212*a83c29e1SYixun Lan 			return tbl[i].val;
213*a83c29e1SYixun Lan 
214*a83c29e1SYixun Lan 	return tbl[num - 1].val;
215*a83c29e1SYixun Lan }
216*a83c29e1SYixun Lan 
217*a83c29e1SYixun Lan static inline u32 spacemit_get_ds_mA(struct spacemit_pin_drv_strength *tbl,
218*a83c29e1SYixun Lan 				     u32 num, u32 val)
219*a83c29e1SYixun Lan {
220*a83c29e1SYixun Lan 	int i;
221*a83c29e1SYixun Lan 
222*a83c29e1SYixun Lan 	for (i = 0; i < num; i++)
223*a83c29e1SYixun Lan 		if (val == tbl[i].val)
224*a83c29e1SYixun Lan 			return tbl[i].mA;
225*a83c29e1SYixun Lan 
226*a83c29e1SYixun Lan 	return 0;
227*a83c29e1SYixun Lan }
228*a83c29e1SYixun Lan 
229*a83c29e1SYixun Lan static inline u8 spacemit_get_driver_strength(enum spacemit_pin_io_type type,
230*a83c29e1SYixun Lan 					      u32 mA)
231*a83c29e1SYixun Lan {
232*a83c29e1SYixun Lan 	switch (type) {
233*a83c29e1SYixun Lan 	case IO_TYPE_1V8:
234*a83c29e1SYixun Lan 		return spacemit_get_ds_value(spacemit_ds_1v8_tbl,
235*a83c29e1SYixun Lan 					     ARRAY_SIZE(spacemit_ds_1v8_tbl),
236*a83c29e1SYixun Lan 					     mA);
237*a83c29e1SYixun Lan 	case IO_TYPE_3V3:
238*a83c29e1SYixun Lan 		return spacemit_get_ds_value(spacemit_ds_3v3_tbl,
239*a83c29e1SYixun Lan 					     ARRAY_SIZE(spacemit_ds_3v3_tbl),
240*a83c29e1SYixun Lan 					     mA);
241*a83c29e1SYixun Lan 	default:
242*a83c29e1SYixun Lan 		return 0;
243*a83c29e1SYixun Lan 	}
244*a83c29e1SYixun Lan }
245*a83c29e1SYixun Lan 
246*a83c29e1SYixun Lan static inline u32 spacemit_get_drive_strength_mA(enum spacemit_pin_io_type type,
247*a83c29e1SYixun Lan 						 u32 value)
248*a83c29e1SYixun Lan {
249*a83c29e1SYixun Lan 	switch (type) {
250*a83c29e1SYixun Lan 	case IO_TYPE_1V8:
251*a83c29e1SYixun Lan 		return spacemit_get_ds_mA(spacemit_ds_1v8_tbl,
252*a83c29e1SYixun Lan 					  ARRAY_SIZE(spacemit_ds_1v8_tbl),
253*a83c29e1SYixun Lan 					  value & 0x6);
254*a83c29e1SYixun Lan 	case IO_TYPE_3V3:
255*a83c29e1SYixun Lan 		return spacemit_get_ds_mA(spacemit_ds_3v3_tbl,
256*a83c29e1SYixun Lan 					  ARRAY_SIZE(spacemit_ds_3v3_tbl),
257*a83c29e1SYixun Lan 					  value);
258*a83c29e1SYixun Lan 	default:
259*a83c29e1SYixun Lan 		return 0;
260*a83c29e1SYixun Lan 	}
261*a83c29e1SYixun Lan }
262*a83c29e1SYixun Lan 
263*a83c29e1SYixun Lan static int spacemit_pctrl_check_power(struct pinctrl_dev *pctldev,
264*a83c29e1SYixun Lan 				      struct device_node *dn,
265*a83c29e1SYixun Lan 				      struct spacemit_pin_mux_config *pinmuxs,
266*a83c29e1SYixun Lan 				      int num_pins, const char *grpname)
267*a83c29e1SYixun Lan {
268*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
269*a83c29e1SYixun Lan 	struct device *dev = pctrl->dev;
270*a83c29e1SYixun Lan 	enum spacemit_pin_io_type type;
271*a83c29e1SYixun Lan 	u32 power = 0, i;
272*a83c29e1SYixun Lan 
273*a83c29e1SYixun Lan 	of_property_read_u32(dn, "power-source", &power);
274*a83c29e1SYixun Lan 
275*a83c29e1SYixun Lan 	for (i = 0; i < num_pins; i++) {
276*a83c29e1SYixun Lan 		type = spacemit_to_pin_io_type(pinmuxs[i].pin);
277*a83c29e1SYixun Lan 
278*a83c29e1SYixun Lan 		if (type != IO_TYPE_EXTERNAL)
279*a83c29e1SYixun Lan 			continue;
280*a83c29e1SYixun Lan 
281*a83c29e1SYixun Lan 		switch (power) {
282*a83c29e1SYixun Lan 		case PIN_POWER_STATE_1V8:
283*a83c29e1SYixun Lan 		case PIN_POWER_STATE_3V3:
284*a83c29e1SYixun Lan 			break;
285*a83c29e1SYixun Lan 		default:
286*a83c29e1SYixun Lan 			dev_err(dev, "group %s has unsupported power\n",
287*a83c29e1SYixun Lan 				grpname);
288*a83c29e1SYixun Lan 			return -ENOTSUPP;
289*a83c29e1SYixun Lan 		}
290*a83c29e1SYixun Lan 	}
291*a83c29e1SYixun Lan 
292*a83c29e1SYixun Lan 	return 0;
293*a83c29e1SYixun Lan }
294*a83c29e1SYixun Lan 
295*a83c29e1SYixun Lan static int spacemit_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
296*a83c29e1SYixun Lan 					 struct device_node *np,
297*a83c29e1SYixun Lan 					 struct pinctrl_map **maps,
298*a83c29e1SYixun Lan 					 unsigned int *num_maps)
299*a83c29e1SYixun Lan {
300*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
301*a83c29e1SYixun Lan 	struct device *dev = pctrl->dev;
302*a83c29e1SYixun Lan 	struct device_node *child;
303*a83c29e1SYixun Lan 	struct pinctrl_map *map;
304*a83c29e1SYixun Lan 	const char **grpnames;
305*a83c29e1SYixun Lan 	const char *grpname;
306*a83c29e1SYixun Lan 	int ngroups = 0;
307*a83c29e1SYixun Lan 	int nmaps = 0;
308*a83c29e1SYixun Lan 	int ret;
309*a83c29e1SYixun Lan 
310*a83c29e1SYixun Lan 	for_each_available_child_of_node(np, child)
311*a83c29e1SYixun Lan 		ngroups += 1;
312*a83c29e1SYixun Lan 
313*a83c29e1SYixun Lan 	grpnames = devm_kcalloc(dev, ngroups, sizeof(*grpnames), GFP_KERNEL);
314*a83c29e1SYixun Lan 	if (!grpnames)
315*a83c29e1SYixun Lan 		return -ENOMEM;
316*a83c29e1SYixun Lan 
317*a83c29e1SYixun Lan 	map = devm_kcalloc(dev, ngroups * 2, sizeof(*map), GFP_KERNEL);
318*a83c29e1SYixun Lan 	if (!map)
319*a83c29e1SYixun Lan 		return -ENOMEM;
320*a83c29e1SYixun Lan 
321*a83c29e1SYixun Lan 	ngroups = 0;
322*a83c29e1SYixun Lan 	guard(mutex)(&pctrl->mutex);
323*a83c29e1SYixun Lan 	for_each_available_child_of_node_scoped(np, child) {
324*a83c29e1SYixun Lan 		struct spacemit_pin_mux_config *pinmuxs;
325*a83c29e1SYixun Lan 		unsigned int config, *pins;
326*a83c29e1SYixun Lan 		int i, npins;
327*a83c29e1SYixun Lan 
328*a83c29e1SYixun Lan 		npins = of_property_count_u32_elems(child, "pinmux");
329*a83c29e1SYixun Lan 
330*a83c29e1SYixun Lan 		if (npins < 1) {
331*a83c29e1SYixun Lan 			dev_err(dev, "invalid pinctrl group %pOFn.%pOFn\n",
332*a83c29e1SYixun Lan 				np, child);
333*a83c29e1SYixun Lan 			return -EINVAL;
334*a83c29e1SYixun Lan 		}
335*a83c29e1SYixun Lan 
336*a83c29e1SYixun Lan 		grpname = devm_kasprintf(dev, GFP_KERNEL, "%pOFn.%pOFn",
337*a83c29e1SYixun Lan 					 np, child);
338*a83c29e1SYixun Lan 		if (!grpname)
339*a83c29e1SYixun Lan 			return -ENOMEM;
340*a83c29e1SYixun Lan 
341*a83c29e1SYixun Lan 		grpnames[ngroups++] = grpname;
342*a83c29e1SYixun Lan 
343*a83c29e1SYixun Lan 		pins = devm_kcalloc(dev, npins, sizeof(*pins), GFP_KERNEL);
344*a83c29e1SYixun Lan 		if (!pins)
345*a83c29e1SYixun Lan 			return -ENOMEM;
346*a83c29e1SYixun Lan 
347*a83c29e1SYixun Lan 		pinmuxs = devm_kcalloc(dev, npins, sizeof(*pinmuxs), GFP_KERNEL);
348*a83c29e1SYixun Lan 		if (!pinmuxs)
349*a83c29e1SYixun Lan 			return -ENOMEM;
350*a83c29e1SYixun Lan 
351*a83c29e1SYixun Lan 		for (i = 0; i < npins; i++) {
352*a83c29e1SYixun Lan 			ret = of_property_read_u32_index(child, "pinmux",
353*a83c29e1SYixun Lan 							 i, &config);
354*a83c29e1SYixun Lan 
355*a83c29e1SYixun Lan 			if (ret)
356*a83c29e1SYixun Lan 				return -EINVAL;
357*a83c29e1SYixun Lan 
358*a83c29e1SYixun Lan 			pins[i] = spacemit_dt_get_pin(config);
359*a83c29e1SYixun Lan 			pinmuxs[i].config = config;
360*a83c29e1SYixun Lan 			pinmuxs[i].pin = spacemit_get_pin(pctrl, pins[i]);
361*a83c29e1SYixun Lan 
362*a83c29e1SYixun Lan 			if (!pinmuxs[i].pin)
363*a83c29e1SYixun Lan 				return dev_err_probe(dev, -ENODEV, "failed to get pin %d\n", pins[i]);
364*a83c29e1SYixun Lan 		}
365*a83c29e1SYixun Lan 
366*a83c29e1SYixun Lan 		ret = spacemit_pctrl_check_power(pctldev, child, pinmuxs,
367*a83c29e1SYixun Lan 						 npins, grpname);
368*a83c29e1SYixun Lan 		if (ret < 0)
369*a83c29e1SYixun Lan 			return ret;
370*a83c29e1SYixun Lan 
371*a83c29e1SYixun Lan 		map[nmaps].type = PIN_MAP_TYPE_MUX_GROUP;
372*a83c29e1SYixun Lan 		map[nmaps].data.mux.function = np->name;
373*a83c29e1SYixun Lan 		map[nmaps].data.mux.group = grpname;
374*a83c29e1SYixun Lan 		nmaps += 1;
375*a83c29e1SYixun Lan 
376*a83c29e1SYixun Lan 		ret = pinctrl_generic_add_group(pctldev, grpname,
377*a83c29e1SYixun Lan 						pins, npins, pinmuxs);
378*a83c29e1SYixun Lan 		if (ret < 0)
379*a83c29e1SYixun Lan 			return dev_err_probe(dev, ret, "failed to add group %s: %d\n", grpname, ret);
380*a83c29e1SYixun Lan 
381*a83c29e1SYixun Lan 		ret = pinconf_generic_parse_dt_config(child, pctldev,
382*a83c29e1SYixun Lan 						      &map[nmaps].data.configs.configs,
383*a83c29e1SYixun Lan 						      &map[nmaps].data.configs.num_configs);
384*a83c29e1SYixun Lan 		if (ret)
385*a83c29e1SYixun Lan 			return dev_err_probe(dev, ret, "failed to parse pin config of group %s\n",
386*a83c29e1SYixun Lan 				grpname);
387*a83c29e1SYixun Lan 
388*a83c29e1SYixun Lan 		if (map[nmaps].data.configs.num_configs == 0)
389*a83c29e1SYixun Lan 			continue;
390*a83c29e1SYixun Lan 
391*a83c29e1SYixun Lan 		map[nmaps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
392*a83c29e1SYixun Lan 		map[nmaps].data.configs.group_or_pin = grpname;
393*a83c29e1SYixun Lan 		nmaps += 1;
394*a83c29e1SYixun Lan 	}
395*a83c29e1SYixun Lan 
396*a83c29e1SYixun Lan 	ret = pinmux_generic_add_function(pctldev, np->name,
397*a83c29e1SYixun Lan 					  grpnames, ngroups, NULL);
398*a83c29e1SYixun Lan 	if (ret < 0) {
399*a83c29e1SYixun Lan 		pinctrl_utils_free_map(pctldev, map, nmaps);
400*a83c29e1SYixun Lan 		return dev_err_probe(dev, ret, "error adding function %s\n", np->name);
401*a83c29e1SYixun Lan 	}
402*a83c29e1SYixun Lan 
403*a83c29e1SYixun Lan 	*maps = map;
404*a83c29e1SYixun Lan 	*num_maps = nmaps;
405*a83c29e1SYixun Lan 
406*a83c29e1SYixun Lan 	return 0;
407*a83c29e1SYixun Lan }
408*a83c29e1SYixun Lan 
409*a83c29e1SYixun Lan static const struct pinctrl_ops spacemit_pctrl_ops = {
410*a83c29e1SYixun Lan 	.get_groups_count	= pinctrl_generic_get_group_count,
411*a83c29e1SYixun Lan 	.get_group_name		= pinctrl_generic_get_group_name,
412*a83c29e1SYixun Lan 	.get_group_pins		= pinctrl_generic_get_group_pins,
413*a83c29e1SYixun Lan 	.pin_dbg_show		= spacemit_pctrl_dbg_show,
414*a83c29e1SYixun Lan 	.dt_node_to_map		= spacemit_pctrl_dt_node_to_map,
415*a83c29e1SYixun Lan 	.dt_free_map		= pinctrl_utils_free_map,
416*a83c29e1SYixun Lan };
417*a83c29e1SYixun Lan 
418*a83c29e1SYixun Lan static int spacemit_pmx_set_mux(struct pinctrl_dev *pctldev,
419*a83c29e1SYixun Lan 				unsigned int fsel, unsigned int gsel)
420*a83c29e1SYixun Lan {
421*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
422*a83c29e1SYixun Lan 	const struct group_desc *group;
423*a83c29e1SYixun Lan 	const struct spacemit_pin_mux_config *configs;
424*a83c29e1SYixun Lan 	unsigned int i, mux;
425*a83c29e1SYixun Lan 	void __iomem *reg;
426*a83c29e1SYixun Lan 
427*a83c29e1SYixun Lan 	group = pinctrl_generic_get_group(pctldev, gsel);
428*a83c29e1SYixun Lan 	if (!group)
429*a83c29e1SYixun Lan 		return -EINVAL;
430*a83c29e1SYixun Lan 
431*a83c29e1SYixun Lan 	configs = group->data;
432*a83c29e1SYixun Lan 
433*a83c29e1SYixun Lan 	for (i = 0; i < group->grp.npins; i++) {
434*a83c29e1SYixun Lan 		const struct spacemit_pin *spin = configs[i].pin;
435*a83c29e1SYixun Lan 		u32 value = configs[i].config;
436*a83c29e1SYixun Lan 
437*a83c29e1SYixun Lan 		reg = spacemit_pin_to_reg(pctrl, spin->pin);
438*a83c29e1SYixun Lan 		mux = spacemit_dt_get_pin_mux(value);
439*a83c29e1SYixun Lan 
440*a83c29e1SYixun Lan 		guard(raw_spinlock_irqsave)(&pctrl->lock);
441*a83c29e1SYixun Lan 		value = readl_relaxed(reg) & ~PAD_MUX;
442*a83c29e1SYixun Lan 		writel_relaxed(mux | value, reg);
443*a83c29e1SYixun Lan 	}
444*a83c29e1SYixun Lan 
445*a83c29e1SYixun Lan 	return 0;
446*a83c29e1SYixun Lan }
447*a83c29e1SYixun Lan 
448*a83c29e1SYixun Lan static int spacemit_request_gpio(struct pinctrl_dev *pctldev,
449*a83c29e1SYixun Lan 				 struct pinctrl_gpio_range *range,
450*a83c29e1SYixun Lan 				 unsigned int pin)
451*a83c29e1SYixun Lan {
452*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
453*a83c29e1SYixun Lan 	const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin);
454*a83c29e1SYixun Lan 	void __iomem *reg;
455*a83c29e1SYixun Lan 
456*a83c29e1SYixun Lan 	reg = spacemit_pin_to_reg(pctrl, pin);
457*a83c29e1SYixun Lan 	guard(raw_spinlock_irqsave)(&pctrl->lock);
458*a83c29e1SYixun Lan 	writel_relaxed(spin->gpiofunc, reg);
459*a83c29e1SYixun Lan 
460*a83c29e1SYixun Lan 	return 0;
461*a83c29e1SYixun Lan }
462*a83c29e1SYixun Lan 
463*a83c29e1SYixun Lan static const struct pinmux_ops spacemit_pmx_ops = {
464*a83c29e1SYixun Lan 	.get_functions_count	= pinmux_generic_get_function_count,
465*a83c29e1SYixun Lan 	.get_function_name	= pinmux_generic_get_function_name,
466*a83c29e1SYixun Lan 	.get_function_groups	= pinmux_generic_get_function_groups,
467*a83c29e1SYixun Lan 	.set_mux		= spacemit_pmx_set_mux,
468*a83c29e1SYixun Lan 	.gpio_request_enable	= spacemit_request_gpio,
469*a83c29e1SYixun Lan 	.strict			= true,
470*a83c29e1SYixun Lan };
471*a83c29e1SYixun Lan 
472*a83c29e1SYixun Lan static int spacemit_pinconf_get(struct pinctrl_dev *pctldev,
473*a83c29e1SYixun Lan 				unsigned int pin, unsigned long *config)
474*a83c29e1SYixun Lan {
475*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
476*a83c29e1SYixun Lan 	int param = pinconf_to_config_param(*config);
477*a83c29e1SYixun Lan 	u32 value, arg = 0;
478*a83c29e1SYixun Lan 
479*a83c29e1SYixun Lan 	if (!pin)
480*a83c29e1SYixun Lan 		return -EINVAL;
481*a83c29e1SYixun Lan 
482*a83c29e1SYixun Lan 	value = readl(spacemit_pin_to_reg(pctrl, pin));
483*a83c29e1SYixun Lan 
484*a83c29e1SYixun Lan 	switch (param) {
485*a83c29e1SYixun Lan 	case PIN_CONFIG_SLEW_RATE:
486*a83c29e1SYixun Lan 		if (FIELD_GET(PAD_SLEW_RATE_EN, value))
487*a83c29e1SYixun Lan 			arg = FIELD_GET(PAD_SLEW_RATE, value) + 2;
488*a83c29e1SYixun Lan 		else
489*a83c29e1SYixun Lan 			arg = 0;
490*a83c29e1SYixun Lan 		break;
491*a83c29e1SYixun Lan 	default:
492*a83c29e1SYixun Lan 		return -EINVAL;
493*a83c29e1SYixun Lan 	}
494*a83c29e1SYixun Lan 
495*a83c29e1SYixun Lan 	*config = pinconf_to_config_packed(param, arg);
496*a83c29e1SYixun Lan 
497*a83c29e1SYixun Lan 	return 0;
498*a83c29e1SYixun Lan }
499*a83c29e1SYixun Lan 
500*a83c29e1SYixun Lan #define ENABLE_DRV_STRENGTH	BIT(1)
501*a83c29e1SYixun Lan #define ENABLE_SLEW_RATE	BIT(2)
502*a83c29e1SYixun Lan static int spacemit_pinconf_generate_config(const struct spacemit_pin *spin,
503*a83c29e1SYixun Lan 					    unsigned long *configs,
504*a83c29e1SYixun Lan 					    unsigned int num_configs,
505*a83c29e1SYixun Lan 					    u32 *value)
506*a83c29e1SYixun Lan {
507*a83c29e1SYixun Lan 	enum spacemit_pin_io_type type;
508*a83c29e1SYixun Lan 	int i, param;
509*a83c29e1SYixun Lan 	u32 v = 0, voltage = 0, arg, val;
510*a83c29e1SYixun Lan 	u32 flag = 0, drv_strength, slew_rate;
511*a83c29e1SYixun Lan 
512*a83c29e1SYixun Lan 	if (!spin)
513*a83c29e1SYixun Lan 		return -EINVAL;
514*a83c29e1SYixun Lan 
515*a83c29e1SYixun Lan 	for (i = 0; i < num_configs; i++) {
516*a83c29e1SYixun Lan 		param = pinconf_to_config_param(configs[i]);
517*a83c29e1SYixun Lan 		arg = pinconf_to_config_argument(configs[i]);
518*a83c29e1SYixun Lan 
519*a83c29e1SYixun Lan 		switch (param) {
520*a83c29e1SYixun Lan 		case PIN_CONFIG_BIAS_DISABLE:
521*a83c29e1SYixun Lan 			v &= ~(PAD_PULL_EN | PAD_PULLDOWN | PAD_PULLUP);
522*a83c29e1SYixun Lan 			v &= ~PAD_STRONG_PULL;
523*a83c29e1SYixun Lan 			break;
524*a83c29e1SYixun Lan 		case PIN_CONFIG_BIAS_PULL_DOWN:
525*a83c29e1SYixun Lan 			v &= ~(PAD_PULLUP | PAD_STRONG_PULL);
526*a83c29e1SYixun Lan 			v |= (PAD_PULL_EN | PAD_PULLDOWN);
527*a83c29e1SYixun Lan 			break;
528*a83c29e1SYixun Lan 		case PIN_CONFIG_BIAS_PULL_UP:
529*a83c29e1SYixun Lan 			v &= ~PAD_PULLDOWN;
530*a83c29e1SYixun Lan 			v |= (PAD_PULL_EN | PAD_PULLUP);
531*a83c29e1SYixun Lan 
532*a83c29e1SYixun Lan 			if (arg == 1)
533*a83c29e1SYixun Lan 				v |= PAD_STRONG_PULL;
534*a83c29e1SYixun Lan 			break;
535*a83c29e1SYixun Lan 		case PIN_CONFIG_DRIVE_STRENGTH:
536*a83c29e1SYixun Lan 			flag |= ENABLE_DRV_STRENGTH;
537*a83c29e1SYixun Lan 			drv_strength = arg;
538*a83c29e1SYixun Lan 			break;
539*a83c29e1SYixun Lan 		case PIN_CONFIG_INPUT_SCHMITT:
540*a83c29e1SYixun Lan 			v &= ~PAD_SCHMITT;
541*a83c29e1SYixun Lan 			v |= FIELD_PREP(PAD_SCHMITT, arg);
542*a83c29e1SYixun Lan 			break;
543*a83c29e1SYixun Lan 		case PIN_CONFIG_POWER_SOURCE:
544*a83c29e1SYixun Lan 			voltage = arg;
545*a83c29e1SYixun Lan 			break;
546*a83c29e1SYixun Lan 		case PIN_CONFIG_SLEW_RATE:
547*a83c29e1SYixun Lan 			if (arg) {
548*a83c29e1SYixun Lan 				flag |= ENABLE_SLEW_RATE;
549*a83c29e1SYixun Lan 				v |= PAD_SLEW_RATE_EN;
550*a83c29e1SYixun Lan 				slew_rate = arg;
551*a83c29e1SYixun Lan 			} else {
552*a83c29e1SYixun Lan 				v &= ~PAD_SLEW_RATE_EN;
553*a83c29e1SYixun Lan 			}
554*a83c29e1SYixun Lan 			break;
555*a83c29e1SYixun Lan 		default:
556*a83c29e1SYixun Lan 			return -EINVAL;
557*a83c29e1SYixun Lan 		}
558*a83c29e1SYixun Lan 	}
559*a83c29e1SYixun Lan 
560*a83c29e1SYixun Lan 	if (flag & ENABLE_DRV_STRENGTH) {
561*a83c29e1SYixun Lan 		type = spacemit_to_pin_io_type(spin);
562*a83c29e1SYixun Lan 
563*a83c29e1SYixun Lan 		/* fix external io type */
564*a83c29e1SYixun Lan 		if (type == IO_TYPE_EXTERNAL) {
565*a83c29e1SYixun Lan 			switch (voltage) {
566*a83c29e1SYixun Lan 			case 1800:
567*a83c29e1SYixun Lan 				type = IO_TYPE_1V8;
568*a83c29e1SYixun Lan 				break;
569*a83c29e1SYixun Lan 			case 3300:
570*a83c29e1SYixun Lan 				type = IO_TYPE_3V3;
571*a83c29e1SYixun Lan 				break;
572*a83c29e1SYixun Lan 			default:
573*a83c29e1SYixun Lan 				return -EINVAL;
574*a83c29e1SYixun Lan 			}
575*a83c29e1SYixun Lan 		}
576*a83c29e1SYixun Lan 
577*a83c29e1SYixun Lan 		val = spacemit_get_driver_strength(type, drv_strength);
578*a83c29e1SYixun Lan 
579*a83c29e1SYixun Lan 		v &= ~PAD_DRIVE;
580*a83c29e1SYixun Lan 		v |= FIELD_PREP(PAD_DRIVE, val);
581*a83c29e1SYixun Lan 	}
582*a83c29e1SYixun Lan 
583*a83c29e1SYixun Lan 	if (flag & ENABLE_SLEW_RATE) {
584*a83c29e1SYixun Lan 		/* check, driver strength & slew rate */
585*a83c29e1SYixun Lan 		if (flag & ENABLE_DRV_STRENGTH) {
586*a83c29e1SYixun Lan 			val = FIELD_GET(PAD_SLEW_RATE, v) + 2;
587*a83c29e1SYixun Lan 			if (slew_rate > 1 && slew_rate != val) {
588*a83c29e1SYixun Lan 				pr_err("slew rate conflict with drive strength\n");
589*a83c29e1SYixun Lan 				return -EINVAL;
590*a83c29e1SYixun Lan 			}
591*a83c29e1SYixun Lan 		} else {
592*a83c29e1SYixun Lan 			v &= ~PAD_SLEW_RATE;
593*a83c29e1SYixun Lan 			slew_rate = slew_rate > 1 ? (slew_rate - 2) : 0;
594*a83c29e1SYixun Lan 			v |= FIELD_PREP(PAD_SLEW_RATE, slew_rate);
595*a83c29e1SYixun Lan 		}
596*a83c29e1SYixun Lan 	}
597*a83c29e1SYixun Lan 
598*a83c29e1SYixun Lan 	*value = v;
599*a83c29e1SYixun Lan 
600*a83c29e1SYixun Lan 	return 0;
601*a83c29e1SYixun Lan }
602*a83c29e1SYixun Lan 
603*a83c29e1SYixun Lan static int spacemit_pin_set_config(struct spacemit_pinctrl *pctrl,
604*a83c29e1SYixun Lan 				   unsigned int pin, u32 value)
605*a83c29e1SYixun Lan {
606*a83c29e1SYixun Lan 	const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin);
607*a83c29e1SYixun Lan 	void __iomem *reg;
608*a83c29e1SYixun Lan 	unsigned int mux;
609*a83c29e1SYixun Lan 
610*a83c29e1SYixun Lan 	if (!pin)
611*a83c29e1SYixun Lan 		return -EINVAL;
612*a83c29e1SYixun Lan 
613*a83c29e1SYixun Lan 	reg = spacemit_pin_to_reg(pctrl, spin->pin);
614*a83c29e1SYixun Lan 
615*a83c29e1SYixun Lan 	guard(raw_spinlock_irqsave)(&pctrl->lock);
616*a83c29e1SYixun Lan 	mux = readl_relaxed(reg) & PAD_MUX;
617*a83c29e1SYixun Lan 	writel_relaxed(mux | value, reg);
618*a83c29e1SYixun Lan 
619*a83c29e1SYixun Lan 	return 0;
620*a83c29e1SYixun Lan }
621*a83c29e1SYixun Lan 
622*a83c29e1SYixun Lan static int spacemit_pinconf_set(struct pinctrl_dev *pctldev,
623*a83c29e1SYixun Lan 				unsigned int pin, unsigned long *configs,
624*a83c29e1SYixun Lan 				unsigned int num_configs)
625*a83c29e1SYixun Lan {
626*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
627*a83c29e1SYixun Lan 	const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin);
628*a83c29e1SYixun Lan 	u32 value;
629*a83c29e1SYixun Lan 
630*a83c29e1SYixun Lan 	if (spacemit_pinconf_generate_config(spin, configs, num_configs, &value))
631*a83c29e1SYixun Lan 		return -EINVAL;
632*a83c29e1SYixun Lan 
633*a83c29e1SYixun Lan 	return spacemit_pin_set_config(pctrl, pin, value);
634*a83c29e1SYixun Lan }
635*a83c29e1SYixun Lan 
636*a83c29e1SYixun Lan static int spacemit_pinconf_group_set(struct pinctrl_dev *pctldev,
637*a83c29e1SYixun Lan 				      unsigned int gsel,
638*a83c29e1SYixun Lan 				      unsigned long *configs,
639*a83c29e1SYixun Lan 				      unsigned int num_configs)
640*a83c29e1SYixun Lan {
641*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
642*a83c29e1SYixun Lan 	const struct spacemit_pin *spin;
643*a83c29e1SYixun Lan 	const struct group_desc *group;
644*a83c29e1SYixun Lan 	u32 value;
645*a83c29e1SYixun Lan 	int i;
646*a83c29e1SYixun Lan 
647*a83c29e1SYixun Lan 	group = pinctrl_generic_get_group(pctldev, gsel);
648*a83c29e1SYixun Lan 	if (!group)
649*a83c29e1SYixun Lan 		return -EINVAL;
650*a83c29e1SYixun Lan 
651*a83c29e1SYixun Lan 	spin = spacemit_get_pin(pctrl, group->grp.pins[0]);
652*a83c29e1SYixun Lan 	if (spacemit_pinconf_generate_config(spin, configs, num_configs, &value))
653*a83c29e1SYixun Lan 		return -EINVAL;
654*a83c29e1SYixun Lan 
655*a83c29e1SYixun Lan 	for (i = 0; i < group->grp.npins; i++)
656*a83c29e1SYixun Lan 		spacemit_pin_set_config(pctrl, group->grp.pins[i], value);
657*a83c29e1SYixun Lan 
658*a83c29e1SYixun Lan 	return 0;
659*a83c29e1SYixun Lan }
660*a83c29e1SYixun Lan 
661*a83c29e1SYixun Lan static void spacemit_pinconf_dbg_pull(struct seq_file *seq, unsigned int value)
662*a83c29e1SYixun Lan {
663*a83c29e1SYixun Lan 	u32 normal, strong;
664*a83c29e1SYixun Lan 
665*a83c29e1SYixun Lan 	if (!FIELD_GET(PAD_PULL_EN, value)) {
666*a83c29e1SYixun Lan 		seq_puts(seq, ", bias pull disabled");
667*a83c29e1SYixun Lan 		return;
668*a83c29e1SYixun Lan 	}
669*a83c29e1SYixun Lan 
670*a83c29e1SYixun Lan 	if (FIELD_GET(PAD_PULLDOWN, value))
671*a83c29e1SYixun Lan 		seq_puts(seq, ", bias pull down");
672*a83c29e1SYixun Lan 
673*a83c29e1SYixun Lan 	normal = FIELD_GET(PAD_PULLUP, value);
674*a83c29e1SYixun Lan 	strong = FIELD_GET(PAD_STRONG_PULL, value);
675*a83c29e1SYixun Lan 
676*a83c29e1SYixun Lan 	if (normal && strong)
677*a83c29e1SYixun Lan 		seq_puts(seq, ", bias strong pull up");
678*a83c29e1SYixun Lan 	else if (normal)
679*a83c29e1SYixun Lan 		seq_puts(seq, ", bias normal pull up");
680*a83c29e1SYixun Lan }
681*a83c29e1SYixun Lan 
682*a83c29e1SYixun Lan static void spacemit_pinconf_dbg_show(struct pinctrl_dev *pctldev,
683*a83c29e1SYixun Lan 				      struct seq_file *seq, unsigned int pin)
684*a83c29e1SYixun Lan {
685*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
686*a83c29e1SYixun Lan 	const struct spacemit_pin *spin = spacemit_get_pin(pctrl, pin);
687*a83c29e1SYixun Lan 	enum spacemit_pin_io_type type = spacemit_to_pin_io_type(spin);
688*a83c29e1SYixun Lan 	void __iomem *reg = spacemit_pin_to_reg(pctrl, pin);
689*a83c29e1SYixun Lan 	u32 value, tmp, mA;
690*a83c29e1SYixun Lan 
691*a83c29e1SYixun Lan 	value = readl(reg);
692*a83c29e1SYixun Lan 	spacemit_pinconf_dbg_pull(seq, value);
693*a83c29e1SYixun Lan 
694*a83c29e1SYixun Lan 	seq_printf(seq, ", io type (%s)", io_type_desc[type]);
695*a83c29e1SYixun Lan 
696*a83c29e1SYixun Lan 	tmp = FIELD_GET(PAD_DRIVE, value);
697*a83c29e1SYixun Lan 	if (type == IO_TYPE_1V8 || type == IO_TYPE_3V3) {
698*a83c29e1SYixun Lan 		mA = spacemit_get_drive_strength_mA(type, tmp);
699*a83c29e1SYixun Lan 		seq_printf(seq, ", drive strength (%d mA)", mA);
700*a83c29e1SYixun Lan 	}
701*a83c29e1SYixun Lan 
702*a83c29e1SYixun Lan 	/* drive strength depend on power source, so show all values */
703*a83c29e1SYixun Lan 	if (type == IO_TYPE_EXTERNAL)
704*a83c29e1SYixun Lan 		seq_printf(seq, ", drive strength (%d or %d mA)",
705*a83c29e1SYixun Lan 			   spacemit_get_drive_strength_mA(IO_TYPE_1V8, tmp),
706*a83c29e1SYixun Lan 			   spacemit_get_drive_strength_mA(IO_TYPE_3V3, tmp));
707*a83c29e1SYixun Lan 
708*a83c29e1SYixun Lan 	seq_printf(seq, ", register (0x%04x)\n", value);
709*a83c29e1SYixun Lan }
710*a83c29e1SYixun Lan 
711*a83c29e1SYixun Lan static const struct pinconf_ops spacemit_pinconf_ops = {
712*a83c29e1SYixun Lan 	.pin_config_get			= spacemit_pinconf_get,
713*a83c29e1SYixun Lan 	.pin_config_set			= spacemit_pinconf_set,
714*a83c29e1SYixun Lan 	.pin_config_group_set		= spacemit_pinconf_group_set,
715*a83c29e1SYixun Lan 	.pin_config_dbg_show		= spacemit_pinconf_dbg_show,
716*a83c29e1SYixun Lan 	.is_generic			= true,
717*a83c29e1SYixun Lan };
718*a83c29e1SYixun Lan 
719*a83c29e1SYixun Lan static int spacemit_pinctrl_probe(struct platform_device *pdev)
720*a83c29e1SYixun Lan {
721*a83c29e1SYixun Lan 	struct device *dev = &pdev->dev;
722*a83c29e1SYixun Lan 	struct spacemit_pinctrl *pctrl;
723*a83c29e1SYixun Lan 	const struct spacemit_pinctrl_data *pctrl_data;
724*a83c29e1SYixun Lan 	int ret;
725*a83c29e1SYixun Lan 
726*a83c29e1SYixun Lan 	pctrl_data = device_get_match_data(dev);
727*a83c29e1SYixun Lan 	if (!pctrl_data)
728*a83c29e1SYixun Lan 		return -ENODEV;
729*a83c29e1SYixun Lan 
730*a83c29e1SYixun Lan 	if (pctrl_data->npins == 0)
731*a83c29e1SYixun Lan 		return dev_err_probe(dev, -EINVAL, "invalid pin data\n");
732*a83c29e1SYixun Lan 
733*a83c29e1SYixun Lan 	pctrl = devm_kzalloc(dev, sizeof(*pctrl), GFP_KERNEL);
734*a83c29e1SYixun Lan 	if (!pctrl)
735*a83c29e1SYixun Lan 		return -ENOMEM;
736*a83c29e1SYixun Lan 
737*a83c29e1SYixun Lan 	pctrl->regs = devm_platform_ioremap_resource(pdev, 0);
738*a83c29e1SYixun Lan 	if (IS_ERR(pctrl->regs))
739*a83c29e1SYixun Lan 		return PTR_ERR(pctrl->regs);
740*a83c29e1SYixun Lan 
741*a83c29e1SYixun Lan 	pctrl->pdesc.name = dev_name(dev);
742*a83c29e1SYixun Lan 	pctrl->pdesc.pins = pctrl_data->pins;
743*a83c29e1SYixun Lan 	pctrl->pdesc.npins = pctrl_data->npins;
744*a83c29e1SYixun Lan 	pctrl->pdesc.pctlops = &spacemit_pctrl_ops;
745*a83c29e1SYixun Lan 	pctrl->pdesc.pmxops = &spacemit_pmx_ops;
746*a83c29e1SYixun Lan 	pctrl->pdesc.confops = &spacemit_pinconf_ops;
747*a83c29e1SYixun Lan 	pctrl->pdesc.owner = THIS_MODULE;
748*a83c29e1SYixun Lan 
749*a83c29e1SYixun Lan 	pctrl->data = pctrl_data;
750*a83c29e1SYixun Lan 	pctrl->dev = dev;
751*a83c29e1SYixun Lan 	raw_spin_lock_init(&pctrl->lock);
752*a83c29e1SYixun Lan 	mutex_init(&pctrl->mutex);
753*a83c29e1SYixun Lan 
754*a83c29e1SYixun Lan 	platform_set_drvdata(pdev, pctrl);
755*a83c29e1SYixun Lan 
756*a83c29e1SYixun Lan 	ret = devm_pinctrl_register_and_init(dev, &pctrl->pdesc,
757*a83c29e1SYixun Lan 					     pctrl, &pctrl->pctl_dev);
758*a83c29e1SYixun Lan 	if (ret)
759*a83c29e1SYixun Lan 		return dev_err_probe(dev, ret,
760*a83c29e1SYixun Lan 				     "fail to register pinctrl driver\n");
761*a83c29e1SYixun Lan 
762*a83c29e1SYixun Lan 	return pinctrl_enable(pctrl->pctl_dev);
763*a83c29e1SYixun Lan }
764*a83c29e1SYixun Lan 
765*a83c29e1SYixun Lan static const struct pinctrl_pin_desc k1_pin_desc[] = {
766*a83c29e1SYixun Lan 	PINCTRL_PIN(0, "GPIO_00"),
767*a83c29e1SYixun Lan 	PINCTRL_PIN(1, "GPIO_01"),
768*a83c29e1SYixun Lan 	PINCTRL_PIN(2, "GPIO_02"),
769*a83c29e1SYixun Lan 	PINCTRL_PIN(3, "GPIO_03"),
770*a83c29e1SYixun Lan 	PINCTRL_PIN(4, "GPIO_04"),
771*a83c29e1SYixun Lan 	PINCTRL_PIN(5, "GPIO_05"),
772*a83c29e1SYixun Lan 	PINCTRL_PIN(6, "GPIO_06"),
773*a83c29e1SYixun Lan 	PINCTRL_PIN(7, "GPIO_07"),
774*a83c29e1SYixun Lan 	PINCTRL_PIN(8, "GPIO_08"),
775*a83c29e1SYixun Lan 	PINCTRL_PIN(9, "GPIO_09"),
776*a83c29e1SYixun Lan 	PINCTRL_PIN(10, "GPIO_10"),
777*a83c29e1SYixun Lan 	PINCTRL_PIN(11, "GPIO_11"),
778*a83c29e1SYixun Lan 	PINCTRL_PIN(12, "GPIO_12"),
779*a83c29e1SYixun Lan 	PINCTRL_PIN(13, "GPIO_13"),
780*a83c29e1SYixun Lan 	PINCTRL_PIN(14, "GPIO_14"),
781*a83c29e1SYixun Lan 	PINCTRL_PIN(15, "GPIO_15"),
782*a83c29e1SYixun Lan 	PINCTRL_PIN(16, "GPIO_16"),
783*a83c29e1SYixun Lan 	PINCTRL_PIN(17, "GPIO_17"),
784*a83c29e1SYixun Lan 	PINCTRL_PIN(18, "GPIO_18"),
785*a83c29e1SYixun Lan 	PINCTRL_PIN(19, "GPIO_19"),
786*a83c29e1SYixun Lan 	PINCTRL_PIN(20, "GPIO_20"),
787*a83c29e1SYixun Lan 	PINCTRL_PIN(21, "GPIO_21"),
788*a83c29e1SYixun Lan 	PINCTRL_PIN(22, "GPIO_22"),
789*a83c29e1SYixun Lan 	PINCTRL_PIN(23, "GPIO_23"),
790*a83c29e1SYixun Lan 	PINCTRL_PIN(24, "GPIO_24"),
791*a83c29e1SYixun Lan 	PINCTRL_PIN(25, "GPIO_25"),
792*a83c29e1SYixun Lan 	PINCTRL_PIN(26, "GPIO_26"),
793*a83c29e1SYixun Lan 	PINCTRL_PIN(27, "GPIO_27"),
794*a83c29e1SYixun Lan 	PINCTRL_PIN(28, "GPIO_28"),
795*a83c29e1SYixun Lan 	PINCTRL_PIN(29, "GPIO_29"),
796*a83c29e1SYixun Lan 	PINCTRL_PIN(30, "GPIO_30"),
797*a83c29e1SYixun Lan 	PINCTRL_PIN(31, "GPIO_31"),
798*a83c29e1SYixun Lan 	PINCTRL_PIN(32, "GPIO_32"),
799*a83c29e1SYixun Lan 	PINCTRL_PIN(33, "GPIO_33"),
800*a83c29e1SYixun Lan 	PINCTRL_PIN(34, "GPIO_34"),
801*a83c29e1SYixun Lan 	PINCTRL_PIN(35, "GPIO_35"),
802*a83c29e1SYixun Lan 	PINCTRL_PIN(36, "GPIO_36"),
803*a83c29e1SYixun Lan 	PINCTRL_PIN(37, "GPIO_37"),
804*a83c29e1SYixun Lan 	PINCTRL_PIN(38, "GPIO_38"),
805*a83c29e1SYixun Lan 	PINCTRL_PIN(39, "GPIO_39"),
806*a83c29e1SYixun Lan 	PINCTRL_PIN(40, "GPIO_40"),
807*a83c29e1SYixun Lan 	PINCTRL_PIN(41, "GPIO_41"),
808*a83c29e1SYixun Lan 	PINCTRL_PIN(42, "GPIO_42"),
809*a83c29e1SYixun Lan 	PINCTRL_PIN(43, "GPIO_43"),
810*a83c29e1SYixun Lan 	PINCTRL_PIN(44, "GPIO_44"),
811*a83c29e1SYixun Lan 	PINCTRL_PIN(45, "GPIO_45"),
812*a83c29e1SYixun Lan 	PINCTRL_PIN(46, "GPIO_46"),
813*a83c29e1SYixun Lan 	PINCTRL_PIN(47, "GPIO_47"),
814*a83c29e1SYixun Lan 	PINCTRL_PIN(48, "GPIO_48"),
815*a83c29e1SYixun Lan 	PINCTRL_PIN(49, "GPIO_49"),
816*a83c29e1SYixun Lan 	PINCTRL_PIN(50, "GPIO_50"),
817*a83c29e1SYixun Lan 	PINCTRL_PIN(51, "GPIO_51"),
818*a83c29e1SYixun Lan 	PINCTRL_PIN(52, "GPIO_52"),
819*a83c29e1SYixun Lan 	PINCTRL_PIN(53, "GPIO_53"),
820*a83c29e1SYixun Lan 	PINCTRL_PIN(54, "GPIO_54"),
821*a83c29e1SYixun Lan 	PINCTRL_PIN(55, "GPIO_55"),
822*a83c29e1SYixun Lan 	PINCTRL_PIN(56, "GPIO_56"),
823*a83c29e1SYixun Lan 	PINCTRL_PIN(57, "GPIO_57"),
824*a83c29e1SYixun Lan 	PINCTRL_PIN(58, "GPIO_58"),
825*a83c29e1SYixun Lan 	PINCTRL_PIN(59, "GPIO_59"),
826*a83c29e1SYixun Lan 	PINCTRL_PIN(60, "GPIO_60"),
827*a83c29e1SYixun Lan 	PINCTRL_PIN(61, "GPIO_61"),
828*a83c29e1SYixun Lan 	PINCTRL_PIN(62, "GPIO_62"),
829*a83c29e1SYixun Lan 	PINCTRL_PIN(63, "GPIO_63"),
830*a83c29e1SYixun Lan 	PINCTRL_PIN(64, "GPIO_64"),
831*a83c29e1SYixun Lan 	PINCTRL_PIN(65, "GPIO_65"),
832*a83c29e1SYixun Lan 	PINCTRL_PIN(66, "GPIO_66"),
833*a83c29e1SYixun Lan 	PINCTRL_PIN(67, "GPIO_67"),
834*a83c29e1SYixun Lan 	PINCTRL_PIN(68, "GPIO_68"),
835*a83c29e1SYixun Lan 	PINCTRL_PIN(69, "GPIO_69"),
836*a83c29e1SYixun Lan 	PINCTRL_PIN(70, "GPIO_70/PRI_DTI"),
837*a83c29e1SYixun Lan 	PINCTRL_PIN(71, "GPIO_71/PRI_TMS"),
838*a83c29e1SYixun Lan 	PINCTRL_PIN(72, "GPIO_72/PRI_TCK"),
839*a83c29e1SYixun Lan 	PINCTRL_PIN(73, "GPIO_73/PRI_TDO"),
840*a83c29e1SYixun Lan 	PINCTRL_PIN(74, "GPIO_74"),
841*a83c29e1SYixun Lan 	PINCTRL_PIN(75, "GPIO_75"),
842*a83c29e1SYixun Lan 	PINCTRL_PIN(76, "GPIO_76"),
843*a83c29e1SYixun Lan 	PINCTRL_PIN(77, "GPIO_77"),
844*a83c29e1SYixun Lan 	PINCTRL_PIN(78, "GPIO_78"),
845*a83c29e1SYixun Lan 	PINCTRL_PIN(79, "GPIO_79"),
846*a83c29e1SYixun Lan 	PINCTRL_PIN(80, "GPIO_80"),
847*a83c29e1SYixun Lan 	PINCTRL_PIN(81, "GPIO_81"),
848*a83c29e1SYixun Lan 	PINCTRL_PIN(82, "GPIO_82"),
849*a83c29e1SYixun Lan 	PINCTRL_PIN(83, "GPIO_83"),
850*a83c29e1SYixun Lan 	PINCTRL_PIN(84, "GPIO_84"),
851*a83c29e1SYixun Lan 	PINCTRL_PIN(85, "GPIO_85"),
852*a83c29e1SYixun Lan 	PINCTRL_PIN(86, "GPIO_86"),
853*a83c29e1SYixun Lan 	PINCTRL_PIN(87, "GPIO_87"),
854*a83c29e1SYixun Lan 	PINCTRL_PIN(88, "GPIO_88"),
855*a83c29e1SYixun Lan 	PINCTRL_PIN(89, "GPIO_89"),
856*a83c29e1SYixun Lan 	PINCTRL_PIN(90, "GPIO_90"),
857*a83c29e1SYixun Lan 	PINCTRL_PIN(91, "GPIO_91"),
858*a83c29e1SYixun Lan 	PINCTRL_PIN(92, "GPIO_92"),
859*a83c29e1SYixun Lan 	PINCTRL_PIN(93, "GPIO_93/PWR_SCL"),
860*a83c29e1SYixun Lan 	PINCTRL_PIN(94, "GPIO_94/PWR_SDA"),
861*a83c29e1SYixun Lan 	PINCTRL_PIN(95, "GPIO_95/VCX0_EN"),
862*a83c29e1SYixun Lan 	PINCTRL_PIN(96, "GPIO_96/DVL0"),
863*a83c29e1SYixun Lan 	PINCTRL_PIN(97, "GPIO_97/DVL1"),
864*a83c29e1SYixun Lan 	PINCTRL_PIN(98,  "GPIO_98/QSPI_DAT3"),
865*a83c29e1SYixun Lan 	PINCTRL_PIN(99,  "GPIO_99/QSPI_DAT2"),
866*a83c29e1SYixun Lan 	PINCTRL_PIN(100, "GPIO_100/QSPI_DAT1"),
867*a83c29e1SYixun Lan 	PINCTRL_PIN(101, "GPIO_101/QSPI_DAT0"),
868*a83c29e1SYixun Lan 	PINCTRL_PIN(102, "GPIO_102/QSPI_CLK"),
869*a83c29e1SYixun Lan 	PINCTRL_PIN(103, "GPIO_103/QSPI_CS1"),
870*a83c29e1SYixun Lan 	PINCTRL_PIN(104, "GPIO_104/MMC1_DAT3"),
871*a83c29e1SYixun Lan 	PINCTRL_PIN(105, "GPIO_105/MMC1_DAT2"),
872*a83c29e1SYixun Lan 	PINCTRL_PIN(106, "GPIO_106/MMC1_DAT1"),
873*a83c29e1SYixun Lan 	PINCTRL_PIN(107, "GPIO_107/MMC1_DAT0"),
874*a83c29e1SYixun Lan 	PINCTRL_PIN(108, "GPIO_108/MMC1_CMD"),
875*a83c29e1SYixun Lan 	PINCTRL_PIN(109, "GPIO_109/MMC1_CLK"),
876*a83c29e1SYixun Lan 	PINCTRL_PIN(110, "GPIO_110"),
877*a83c29e1SYixun Lan 	PINCTRL_PIN(111, "GPIO_111"),
878*a83c29e1SYixun Lan 	PINCTRL_PIN(112, "GPIO_112"),
879*a83c29e1SYixun Lan 	PINCTRL_PIN(113, "GPIO_113"),
880*a83c29e1SYixun Lan 	PINCTRL_PIN(114, "GPIO_114"),
881*a83c29e1SYixun Lan 	PINCTRL_PIN(115, "GPIO_115"),
882*a83c29e1SYixun Lan 	PINCTRL_PIN(116, "GPIO_116"),
883*a83c29e1SYixun Lan 	PINCTRL_PIN(117, "GPIO_117"),
884*a83c29e1SYixun Lan 	PINCTRL_PIN(118, "GPIO_118"),
885*a83c29e1SYixun Lan 	PINCTRL_PIN(119, "GPIO_119"),
886*a83c29e1SYixun Lan 	PINCTRL_PIN(120, "GPIO_120"),
887*a83c29e1SYixun Lan 	PINCTRL_PIN(121, "GPIO_121"),
888*a83c29e1SYixun Lan 	PINCTRL_PIN(122, "GPIO_122"),
889*a83c29e1SYixun Lan 	PINCTRL_PIN(123, "GPIO_123"),
890*a83c29e1SYixun Lan 	PINCTRL_PIN(124, "GPIO_124"),
891*a83c29e1SYixun Lan 	PINCTRL_PIN(125, "GPIO_125"),
892*a83c29e1SYixun Lan 	PINCTRL_PIN(126, "GPIO_126"),
893*a83c29e1SYixun Lan 	PINCTRL_PIN(127, "GPIO_127"),
894*a83c29e1SYixun Lan };
895*a83c29e1SYixun Lan 
896*a83c29e1SYixun Lan static const struct spacemit_pin k1_pin_data[ARRAY_SIZE(k1_pin_desc)] = {
897*a83c29e1SYixun Lan 	K1_FUNC_PIN(0, 0, IO_TYPE_1V8),
898*a83c29e1SYixun Lan 	K1_FUNC_PIN(1, 0, IO_TYPE_1V8),
899*a83c29e1SYixun Lan 	K1_FUNC_PIN(2, 0, IO_TYPE_1V8),
900*a83c29e1SYixun Lan 	K1_FUNC_PIN(3, 0, IO_TYPE_1V8),
901*a83c29e1SYixun Lan 	K1_FUNC_PIN(4, 0, IO_TYPE_1V8),
902*a83c29e1SYixun Lan 	K1_FUNC_PIN(5, 0, IO_TYPE_1V8),
903*a83c29e1SYixun Lan 	K1_FUNC_PIN(6, 0, IO_TYPE_1V8),
904*a83c29e1SYixun Lan 	K1_FUNC_PIN(7, 0, IO_TYPE_1V8),
905*a83c29e1SYixun Lan 	K1_FUNC_PIN(8, 0, IO_TYPE_1V8),
906*a83c29e1SYixun Lan 	K1_FUNC_PIN(9, 0, IO_TYPE_1V8),
907*a83c29e1SYixun Lan 	K1_FUNC_PIN(10, 0, IO_TYPE_1V8),
908*a83c29e1SYixun Lan 	K1_FUNC_PIN(11, 0, IO_TYPE_1V8),
909*a83c29e1SYixun Lan 	K1_FUNC_PIN(12, 0, IO_TYPE_1V8),
910*a83c29e1SYixun Lan 	K1_FUNC_PIN(13, 0, IO_TYPE_1V8),
911*a83c29e1SYixun Lan 	K1_FUNC_PIN(14, 0, IO_TYPE_1V8),
912*a83c29e1SYixun Lan 	K1_FUNC_PIN(15, 0, IO_TYPE_1V8),
913*a83c29e1SYixun Lan 	K1_FUNC_PIN(16, 0, IO_TYPE_1V8),
914*a83c29e1SYixun Lan 	K1_FUNC_PIN(17, 0, IO_TYPE_1V8),
915*a83c29e1SYixun Lan 	K1_FUNC_PIN(18, 0, IO_TYPE_1V8),
916*a83c29e1SYixun Lan 	K1_FUNC_PIN(19, 0, IO_TYPE_1V8),
917*a83c29e1SYixun Lan 	K1_FUNC_PIN(20, 0, IO_TYPE_1V8),
918*a83c29e1SYixun Lan 	K1_FUNC_PIN(21, 0, IO_TYPE_1V8),
919*a83c29e1SYixun Lan 	K1_FUNC_PIN(22, 0, IO_TYPE_1V8),
920*a83c29e1SYixun Lan 	K1_FUNC_PIN(23, 0, IO_TYPE_1V8),
921*a83c29e1SYixun Lan 	K1_FUNC_PIN(24, 0, IO_TYPE_1V8),
922*a83c29e1SYixun Lan 	K1_FUNC_PIN(25, 0, IO_TYPE_1V8),
923*a83c29e1SYixun Lan 	K1_FUNC_PIN(26, 0, IO_TYPE_1V8),
924*a83c29e1SYixun Lan 	K1_FUNC_PIN(27, 0, IO_TYPE_1V8),
925*a83c29e1SYixun Lan 	K1_FUNC_PIN(28, 0, IO_TYPE_1V8),
926*a83c29e1SYixun Lan 	K1_FUNC_PIN(29, 0, IO_TYPE_1V8),
927*a83c29e1SYixun Lan 	K1_FUNC_PIN(30, 0, IO_TYPE_1V8),
928*a83c29e1SYixun Lan 	K1_FUNC_PIN(31, 0, IO_TYPE_1V8),
929*a83c29e1SYixun Lan 	K1_FUNC_PIN(32, 0, IO_TYPE_1V8),
930*a83c29e1SYixun Lan 	K1_FUNC_PIN(33, 0, IO_TYPE_1V8),
931*a83c29e1SYixun Lan 	K1_FUNC_PIN(34, 0, IO_TYPE_1V8),
932*a83c29e1SYixun Lan 	K1_FUNC_PIN(35, 0, IO_TYPE_1V8),
933*a83c29e1SYixun Lan 	K1_FUNC_PIN(36, 0, IO_TYPE_1V8),
934*a83c29e1SYixun Lan 	K1_FUNC_PIN(37, 0, IO_TYPE_1V8),
935*a83c29e1SYixun Lan 	K1_FUNC_PIN(38, 0, IO_TYPE_1V8),
936*a83c29e1SYixun Lan 	K1_FUNC_PIN(39, 0, IO_TYPE_1V8),
937*a83c29e1SYixun Lan 	K1_FUNC_PIN(40, 0, IO_TYPE_1V8),
938*a83c29e1SYixun Lan 	K1_FUNC_PIN(41, 0, IO_TYPE_1V8),
939*a83c29e1SYixun Lan 	K1_FUNC_PIN(42, 0, IO_TYPE_1V8),
940*a83c29e1SYixun Lan 	K1_FUNC_PIN(43, 0, IO_TYPE_1V8),
941*a83c29e1SYixun Lan 	K1_FUNC_PIN(44, 0, IO_TYPE_1V8),
942*a83c29e1SYixun Lan 	K1_FUNC_PIN(45, 0, IO_TYPE_1V8),
943*a83c29e1SYixun Lan 	K1_FUNC_PIN(46, 0, IO_TYPE_1V8),
944*a83c29e1SYixun Lan 	K1_FUNC_PIN(47, 0, IO_TYPE_EXTERNAL),
945*a83c29e1SYixun Lan 	K1_FUNC_PIN(48, 0, IO_TYPE_EXTERNAL),
946*a83c29e1SYixun Lan 	K1_FUNC_PIN(49, 0, IO_TYPE_EXTERNAL),
947*a83c29e1SYixun Lan 	K1_FUNC_PIN(50, 0, IO_TYPE_EXTERNAL),
948*a83c29e1SYixun Lan 	K1_FUNC_PIN(51, 0, IO_TYPE_EXTERNAL),
949*a83c29e1SYixun Lan 	K1_FUNC_PIN(52, 0, IO_TYPE_EXTERNAL),
950*a83c29e1SYixun Lan 	K1_FUNC_PIN(53, 0, IO_TYPE_1V8),
951*a83c29e1SYixun Lan 	K1_FUNC_PIN(54, 0, IO_TYPE_1V8),
952*a83c29e1SYixun Lan 	K1_FUNC_PIN(55, 0, IO_TYPE_1V8),
953*a83c29e1SYixun Lan 	K1_FUNC_PIN(56, 0, IO_TYPE_1V8),
954*a83c29e1SYixun Lan 	K1_FUNC_PIN(57, 0, IO_TYPE_1V8),
955*a83c29e1SYixun Lan 	K1_FUNC_PIN(58, 0, IO_TYPE_1V8),
956*a83c29e1SYixun Lan 	K1_FUNC_PIN(59, 0, IO_TYPE_1V8),
957*a83c29e1SYixun Lan 	K1_FUNC_PIN(60, 0, IO_TYPE_1V8),
958*a83c29e1SYixun Lan 	K1_FUNC_PIN(61, 0, IO_TYPE_1V8),
959*a83c29e1SYixun Lan 	K1_FUNC_PIN(62, 0, IO_TYPE_1V8),
960*a83c29e1SYixun Lan 	K1_FUNC_PIN(63, 0, IO_TYPE_1V8),
961*a83c29e1SYixun Lan 	K1_FUNC_PIN(64, 0, IO_TYPE_1V8),
962*a83c29e1SYixun Lan 	K1_FUNC_PIN(65, 0, IO_TYPE_1V8),
963*a83c29e1SYixun Lan 	K1_FUNC_PIN(66, 0, IO_TYPE_1V8),
964*a83c29e1SYixun Lan 	K1_FUNC_PIN(67, 0, IO_TYPE_1V8),
965*a83c29e1SYixun Lan 	K1_FUNC_PIN(68, 0, IO_TYPE_1V8),
966*a83c29e1SYixun Lan 	K1_FUNC_PIN(69, 0, IO_TYPE_1V8),
967*a83c29e1SYixun Lan 	K1_FUNC_PIN(70, 1, IO_TYPE_1V8),
968*a83c29e1SYixun Lan 	K1_FUNC_PIN(71, 1, IO_TYPE_1V8),
969*a83c29e1SYixun Lan 	K1_FUNC_PIN(72, 1, IO_TYPE_1V8),
970*a83c29e1SYixun Lan 	K1_FUNC_PIN(73, 1, IO_TYPE_1V8),
971*a83c29e1SYixun Lan 	K1_FUNC_PIN(74, 0, IO_TYPE_1V8),
972*a83c29e1SYixun Lan 	K1_FUNC_PIN(75, 0, IO_TYPE_EXTERNAL),
973*a83c29e1SYixun Lan 	K1_FUNC_PIN(76, 0, IO_TYPE_EXTERNAL),
974*a83c29e1SYixun Lan 	K1_FUNC_PIN(77, 0, IO_TYPE_EXTERNAL),
975*a83c29e1SYixun Lan 	K1_FUNC_PIN(78, 0, IO_TYPE_EXTERNAL),
976*a83c29e1SYixun Lan 	K1_FUNC_PIN(79, 0, IO_TYPE_EXTERNAL),
977*a83c29e1SYixun Lan 	K1_FUNC_PIN(80, 0, IO_TYPE_EXTERNAL),
978*a83c29e1SYixun Lan 	K1_FUNC_PIN(81, 0, IO_TYPE_1V8),
979*a83c29e1SYixun Lan 	K1_FUNC_PIN(82, 0, IO_TYPE_1V8),
980*a83c29e1SYixun Lan 	K1_FUNC_PIN(83, 0, IO_TYPE_1V8),
981*a83c29e1SYixun Lan 	K1_FUNC_PIN(84, 0, IO_TYPE_1V8),
982*a83c29e1SYixun Lan 	K1_FUNC_PIN(85, 0, IO_TYPE_1V8),
983*a83c29e1SYixun Lan 	K1_FUNC_PIN(86, 0, IO_TYPE_1V8),
984*a83c29e1SYixun Lan 	K1_FUNC_PIN(87, 0, IO_TYPE_1V8),
985*a83c29e1SYixun Lan 	K1_FUNC_PIN(88, 0, IO_TYPE_1V8),
986*a83c29e1SYixun Lan 	K1_FUNC_PIN(89, 0, IO_TYPE_1V8),
987*a83c29e1SYixun Lan 	K1_FUNC_PIN(90, 0, IO_TYPE_1V8),
988*a83c29e1SYixun Lan 	K1_FUNC_PIN(91, 0, IO_TYPE_1V8),
989*a83c29e1SYixun Lan 	K1_FUNC_PIN(92, 0, IO_TYPE_1V8),
990*a83c29e1SYixun Lan 	K1_FUNC_PIN(93, 1, IO_TYPE_1V8),
991*a83c29e1SYixun Lan 	K1_FUNC_PIN(94, 1, IO_TYPE_1V8),
992*a83c29e1SYixun Lan 	K1_FUNC_PIN(95, 1, IO_TYPE_1V8),
993*a83c29e1SYixun Lan 	K1_FUNC_PIN(96, 1, IO_TYPE_1V8),
994*a83c29e1SYixun Lan 	K1_FUNC_PIN(97, 1, IO_TYPE_1V8),
995*a83c29e1SYixun Lan 	K1_FUNC_PIN(98, 1, IO_TYPE_EXTERNAL),
996*a83c29e1SYixun Lan 	K1_FUNC_PIN(99, 1, IO_TYPE_EXTERNAL),
997*a83c29e1SYixun Lan 	K1_FUNC_PIN(100, 1, IO_TYPE_EXTERNAL),
998*a83c29e1SYixun Lan 	K1_FUNC_PIN(101, 1, IO_TYPE_EXTERNAL),
999*a83c29e1SYixun Lan 	K1_FUNC_PIN(102, 1, IO_TYPE_EXTERNAL),
1000*a83c29e1SYixun Lan 	K1_FUNC_PIN(103, 1, IO_TYPE_EXTERNAL),
1001*a83c29e1SYixun Lan 	K1_FUNC_PIN(104, 4, IO_TYPE_EXTERNAL),
1002*a83c29e1SYixun Lan 	K1_FUNC_PIN(105, 4, IO_TYPE_EXTERNAL),
1003*a83c29e1SYixun Lan 	K1_FUNC_PIN(106, 4, IO_TYPE_EXTERNAL),
1004*a83c29e1SYixun Lan 	K1_FUNC_PIN(107, 4, IO_TYPE_EXTERNAL),
1005*a83c29e1SYixun Lan 	K1_FUNC_PIN(108, 4, IO_TYPE_EXTERNAL),
1006*a83c29e1SYixun Lan 	K1_FUNC_PIN(109, 4, IO_TYPE_EXTERNAL),
1007*a83c29e1SYixun Lan 	K1_FUNC_PIN(110, 0, IO_TYPE_1V8),
1008*a83c29e1SYixun Lan 	K1_FUNC_PIN(111, 0, IO_TYPE_1V8),
1009*a83c29e1SYixun Lan 	K1_FUNC_PIN(112, 0, IO_TYPE_1V8),
1010*a83c29e1SYixun Lan 	K1_FUNC_PIN(113, 0, IO_TYPE_1V8),
1011*a83c29e1SYixun Lan 	K1_FUNC_PIN(114, 0, IO_TYPE_1V8),
1012*a83c29e1SYixun Lan 	K1_FUNC_PIN(115, 0, IO_TYPE_1V8),
1013*a83c29e1SYixun Lan 	K1_FUNC_PIN(116, 0, IO_TYPE_1V8),
1014*a83c29e1SYixun Lan 	K1_FUNC_PIN(117, 0, IO_TYPE_1V8),
1015*a83c29e1SYixun Lan 	K1_FUNC_PIN(118, 0, IO_TYPE_1V8),
1016*a83c29e1SYixun Lan 	K1_FUNC_PIN(119, 0, IO_TYPE_1V8),
1017*a83c29e1SYixun Lan 	K1_FUNC_PIN(120, 0, IO_TYPE_1V8),
1018*a83c29e1SYixun Lan 	K1_FUNC_PIN(121, 0, IO_TYPE_1V8),
1019*a83c29e1SYixun Lan 	K1_FUNC_PIN(122, 0, IO_TYPE_1V8),
1020*a83c29e1SYixun Lan 	K1_FUNC_PIN(123, 0, IO_TYPE_1V8),
1021*a83c29e1SYixun Lan 	K1_FUNC_PIN(124, 0, IO_TYPE_1V8),
1022*a83c29e1SYixun Lan 	K1_FUNC_PIN(125, 0, IO_TYPE_1V8),
1023*a83c29e1SYixun Lan 	K1_FUNC_PIN(126, 0, IO_TYPE_1V8),
1024*a83c29e1SYixun Lan 	K1_FUNC_PIN(127, 0, IO_TYPE_1V8),
1025*a83c29e1SYixun Lan };
1026*a83c29e1SYixun Lan 
1027*a83c29e1SYixun Lan static const struct spacemit_pinctrl_data k1_pinctrl_data = {
1028*a83c29e1SYixun Lan 	.pins = k1_pin_desc,
1029*a83c29e1SYixun Lan 	.data = k1_pin_data,
1030*a83c29e1SYixun Lan 	.npins = ARRAY_SIZE(k1_pin_desc),
1031*a83c29e1SYixun Lan };
1032*a83c29e1SYixun Lan 
1033*a83c29e1SYixun Lan static const struct of_device_id k1_pinctrl_ids[] = {
1034*a83c29e1SYixun Lan 	{ .compatible = "spacemit,k1-pinctrl", .data = &k1_pinctrl_data },
1035*a83c29e1SYixun Lan 	{ /* sentinel */ }
1036*a83c29e1SYixun Lan };
1037*a83c29e1SYixun Lan MODULE_DEVICE_TABLE(of, k1_pinctrl_ids);
1038*a83c29e1SYixun Lan 
1039*a83c29e1SYixun Lan static struct platform_driver k1_pinctrl_driver = {
1040*a83c29e1SYixun Lan 	.probe	= spacemit_pinctrl_probe,
1041*a83c29e1SYixun Lan 	.driver	= {
1042*a83c29e1SYixun Lan 		.name			= "k1-pinctrl",
1043*a83c29e1SYixun Lan 		.suppress_bind_attrs	= true,
1044*a83c29e1SYixun Lan 		.of_match_table		= k1_pinctrl_ids,
1045*a83c29e1SYixun Lan 	},
1046*a83c29e1SYixun Lan };
1047*a83c29e1SYixun Lan module_platform_driver(k1_pinctrl_driver);
1048*a83c29e1SYixun Lan 
1049*a83c29e1SYixun Lan MODULE_AUTHOR("Yixun Lan <dlan@gentoo.org>");
1050*a83c29e1SYixun Lan MODULE_DESCRIPTION("Pinctrl driver for the SpacemiT K1 SoC");
1051*a83c29e1SYixun Lan MODULE_LICENSE("GPL");
1052