xref: /OK3568_Linux_fs/kernel/drivers/pinctrl/actions/pinctrl-owl.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * OWL SoC's Pinctrl definitions
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2014 Actions Semi Inc.
6*4882a593Smuzhiyun  * Author: David Liu <liuwei@actions-semi.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Copyright (c) 2018 Linaro Ltd.
9*4882a593Smuzhiyun  * Author: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef __PINCTRL_OWL_H__
13*4882a593Smuzhiyun #define __PINCTRL_OWL_H__
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun #define OWL_PINCONF_SLEW_SLOW 0
16*4882a593Smuzhiyun #define OWL_PINCONF_SLEW_FAST 1
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #define MUX_PG(group_name, reg, shift, width)				\
19*4882a593Smuzhiyun 	{								\
20*4882a593Smuzhiyun 		.name = #group_name,					\
21*4882a593Smuzhiyun 		.pads = group_name##_pads,				\
22*4882a593Smuzhiyun 		.npads = ARRAY_SIZE(group_name##_pads),			\
23*4882a593Smuzhiyun 		.funcs = group_name##_funcs,				\
24*4882a593Smuzhiyun 		.nfuncs = ARRAY_SIZE(group_name##_funcs),		\
25*4882a593Smuzhiyun 		.mfpctl_reg  = MFCTL##reg,				\
26*4882a593Smuzhiyun 		.mfpctl_shift = shift,					\
27*4882a593Smuzhiyun 		.mfpctl_width = width,					\
28*4882a593Smuzhiyun 		.drv_reg = -1,						\
29*4882a593Smuzhiyun 		.drv_shift = -1,					\
30*4882a593Smuzhiyun 		.drv_width = -1,					\
31*4882a593Smuzhiyun 		.sr_reg = -1,						\
32*4882a593Smuzhiyun 		.sr_shift = -1,						\
33*4882a593Smuzhiyun 		.sr_width = -1,						\
34*4882a593Smuzhiyun 	}
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #define DRV_PG(group_name, reg, shift, width)				\
37*4882a593Smuzhiyun 	{								\
38*4882a593Smuzhiyun 		.name = #group_name,					\
39*4882a593Smuzhiyun 		.pads = group_name##_pads,				\
40*4882a593Smuzhiyun 		.npads = ARRAY_SIZE(group_name##_pads),			\
41*4882a593Smuzhiyun 		.mfpctl_reg  = -1,					\
42*4882a593Smuzhiyun 		.mfpctl_shift = -1,					\
43*4882a593Smuzhiyun 		.mfpctl_width = -1,					\
44*4882a593Smuzhiyun 		.drv_reg = PAD_DRV##reg,				\
45*4882a593Smuzhiyun 		.drv_shift = shift,					\
46*4882a593Smuzhiyun 		.drv_width = width,					\
47*4882a593Smuzhiyun 		.sr_reg = -1,						\
48*4882a593Smuzhiyun 		.sr_shift = -1,						\
49*4882a593Smuzhiyun 		.sr_width = -1,						\
50*4882a593Smuzhiyun 	}
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define SR_PG(group_name, reg, shift, width)				\
53*4882a593Smuzhiyun 	{								\
54*4882a593Smuzhiyun 		.name = #group_name,					\
55*4882a593Smuzhiyun 		.pads = group_name##_pads,				\
56*4882a593Smuzhiyun 		.npads = ARRAY_SIZE(group_name##_pads),			\
57*4882a593Smuzhiyun 		.mfpctl_reg  = -1,					\
58*4882a593Smuzhiyun 		.mfpctl_shift = -1,					\
59*4882a593Smuzhiyun 		.mfpctl_width = -1,					\
60*4882a593Smuzhiyun 		.drv_reg = -1,						\
61*4882a593Smuzhiyun 		.drv_shift = -1,					\
62*4882a593Smuzhiyun 		.drv_width = -1,					\
63*4882a593Smuzhiyun 		.sr_reg = PAD_SR##reg,					\
64*4882a593Smuzhiyun 		.sr_shift = shift,					\
65*4882a593Smuzhiyun 		.sr_width = width,					\
66*4882a593Smuzhiyun 	}
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define FUNCTION(fname)					\
69*4882a593Smuzhiyun 	{						\
70*4882a593Smuzhiyun 		.name = #fname,				\
71*4882a593Smuzhiyun 		.groups = fname##_groups,		\
72*4882a593Smuzhiyun 		.ngroups = ARRAY_SIZE(fname##_groups),	\
73*4882a593Smuzhiyun 	}
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun /* PAD PULL UP/DOWN CONFIGURES */
76*4882a593Smuzhiyun #define PULLCTL_CONF(pull_reg, pull_sft, pull_wdt)	\
77*4882a593Smuzhiyun 	{						\
78*4882a593Smuzhiyun 		.reg = PAD_PULLCTL##pull_reg,		\
79*4882a593Smuzhiyun 		.shift = pull_sft,			\
80*4882a593Smuzhiyun 		.width = pull_wdt,			\
81*4882a593Smuzhiyun 	}
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun #define PAD_PULLCTL_CONF(pad_name, pull_reg, pull_sft, pull_wdt)	\
84*4882a593Smuzhiyun 	struct owl_pullctl pad_name##_pullctl_conf			\
85*4882a593Smuzhiyun 		= PULLCTL_CONF(pull_reg, pull_sft, pull_wdt)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun #define ST_CONF(st_reg, st_sft, st_wdt)			\
88*4882a593Smuzhiyun 	{						\
89*4882a593Smuzhiyun 		.reg = PAD_ST##st_reg,			\
90*4882a593Smuzhiyun 		.shift = st_sft,			\
91*4882a593Smuzhiyun 		.width = st_wdt,			\
92*4882a593Smuzhiyun 	}
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun #define PAD_ST_CONF(pad_name, st_reg, st_sft, st_wdt)	\
95*4882a593Smuzhiyun 	struct owl_st pad_name##_st_conf		\
96*4882a593Smuzhiyun 		= ST_CONF(st_reg, st_sft, st_wdt)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun #define PAD_INFO(name)					\
99*4882a593Smuzhiyun 	{						\
100*4882a593Smuzhiyun 		.pad = name,				\
101*4882a593Smuzhiyun 		.pullctl = NULL,			\
102*4882a593Smuzhiyun 		.st = NULL,				\
103*4882a593Smuzhiyun 	}
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun #define PAD_INFO_ST(name)				\
106*4882a593Smuzhiyun 	{						\
107*4882a593Smuzhiyun 		.pad = name,				\
108*4882a593Smuzhiyun 		.pullctl = NULL,			\
109*4882a593Smuzhiyun 		.st = &name##_st_conf,			\
110*4882a593Smuzhiyun 	}
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun #define PAD_INFO_PULLCTL(name)				\
113*4882a593Smuzhiyun 	{						\
114*4882a593Smuzhiyun 		.pad = name,				\
115*4882a593Smuzhiyun 		.pullctl = &name##_pullctl_conf,	\
116*4882a593Smuzhiyun 		.st = NULL,				\
117*4882a593Smuzhiyun 	}
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun #define PAD_INFO_PULLCTL_ST(name)			\
120*4882a593Smuzhiyun 	{						\
121*4882a593Smuzhiyun 		.pad = name,				\
122*4882a593Smuzhiyun 		.pullctl = &name##_pullctl_conf,	\
123*4882a593Smuzhiyun 		.st = &name##_st_conf,			\
124*4882a593Smuzhiyun 	}
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun #define OWL_GPIO_PORT_A		0
127*4882a593Smuzhiyun #define OWL_GPIO_PORT_B		1
128*4882a593Smuzhiyun #define OWL_GPIO_PORT_C		2
129*4882a593Smuzhiyun #define OWL_GPIO_PORT_D		3
130*4882a593Smuzhiyun #define OWL_GPIO_PORT_E		4
131*4882a593Smuzhiyun #define OWL_GPIO_PORT_F		5
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define OWL_GPIO_PORT(port, base, count, _outen, _inen, _dat, _intc_ctl,\
134*4882a593Smuzhiyun 			_intc_pd, _intc_msk, _intc_type, _share)	\
135*4882a593Smuzhiyun 	[OWL_GPIO_PORT_##port] = {				\
136*4882a593Smuzhiyun 		.offset = base,					\
137*4882a593Smuzhiyun 		.pins = count,					\
138*4882a593Smuzhiyun 		.outen = _outen,				\
139*4882a593Smuzhiyun 		.inen = _inen,					\
140*4882a593Smuzhiyun 		.dat = _dat,					\
141*4882a593Smuzhiyun 		.intc_ctl = _intc_ctl,				\
142*4882a593Smuzhiyun 		.intc_pd = _intc_pd,				\
143*4882a593Smuzhiyun 		.intc_msk = _intc_msk,				\
144*4882a593Smuzhiyun 		.intc_type = _intc_type,			\
145*4882a593Smuzhiyun 		.shared_ctl_offset = _share,			\
146*4882a593Smuzhiyun 	}
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun enum owl_pinconf_drv {
149*4882a593Smuzhiyun 	OWL_PINCONF_DRV_2MA,
150*4882a593Smuzhiyun 	OWL_PINCONF_DRV_4MA,
151*4882a593Smuzhiyun 	OWL_PINCONF_DRV_8MA,
152*4882a593Smuzhiyun 	OWL_PINCONF_DRV_12MA,
153*4882a593Smuzhiyun };
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun /* GPIO CTRL Bit Definition */
156*4882a593Smuzhiyun #define OWL_GPIO_CTLR_PENDING		0
157*4882a593Smuzhiyun #define OWL_GPIO_CTLR_ENABLE		1
158*4882a593Smuzhiyun #define OWL_GPIO_CTLR_SAMPLE_CLK_24M	2
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun /* GPIO TYPE Bit Definition */
161*4882a593Smuzhiyun #define OWL_GPIO_INT_LEVEL_HIGH		0
162*4882a593Smuzhiyun #define OWL_GPIO_INT_LEVEL_LOW		1
163*4882a593Smuzhiyun #define OWL_GPIO_INT_EDGE_RISING	2
164*4882a593Smuzhiyun #define OWL_GPIO_INT_EDGE_FALLING	3
165*4882a593Smuzhiyun #define OWL_GPIO_INT_MASK		3
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun /**
168*4882a593Smuzhiyun  * struct owl_pullctl - Actions pad pull control register
169*4882a593Smuzhiyun  * @reg: offset to the pull control register
170*4882a593Smuzhiyun  * @shift: shift value of the register
171*4882a593Smuzhiyun  * @width: width of the register
172*4882a593Smuzhiyun  */
173*4882a593Smuzhiyun struct owl_pullctl {
174*4882a593Smuzhiyun 	int reg;
175*4882a593Smuzhiyun 	unsigned int shift;
176*4882a593Smuzhiyun 	unsigned int width;
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun /**
180*4882a593Smuzhiyun  * struct owl_st - Actions pad schmitt trigger enable register
181*4882a593Smuzhiyun  * @reg: offset to the schmitt trigger enable register
182*4882a593Smuzhiyun  * @shift: shift value of the register
183*4882a593Smuzhiyun  * @width: width of the register
184*4882a593Smuzhiyun  */
185*4882a593Smuzhiyun struct owl_st {
186*4882a593Smuzhiyun 	int reg;
187*4882a593Smuzhiyun 	unsigned int shift;
188*4882a593Smuzhiyun 	unsigned int width;
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun /**
192*4882a593Smuzhiyun  * struct owl_pingroup - Actions pingroup definition
193*4882a593Smuzhiyun  * @name: name of the  pin group
194*4882a593Smuzhiyun  * @pads: list of pins assigned to this pingroup
195*4882a593Smuzhiyun  * @npads: size of @pads array
196*4882a593Smuzhiyun  * @funcs: list of pinmux functions for this pingroup
197*4882a593Smuzhiyun  * @nfuncs: size of @funcs array
198*4882a593Smuzhiyun  * @mfpctl_reg: multiplexing control register offset
199*4882a593Smuzhiyun  * @mfpctl_shift: multiplexing control register bit mask
200*4882a593Smuzhiyun  * @mfpctl_width: multiplexing control register width
201*4882a593Smuzhiyun  * @drv_reg: drive control register offset
202*4882a593Smuzhiyun  * @drv_shift: drive control register bit mask
203*4882a593Smuzhiyun  * @drv_width: driver control register width
204*4882a593Smuzhiyun  * @sr_reg: slew rate control register offset
205*4882a593Smuzhiyun  * @sr_shift: slew rate control register bit mask
206*4882a593Smuzhiyun  * @sr_width: slew rate control register width
207*4882a593Smuzhiyun  */
208*4882a593Smuzhiyun struct owl_pingroup {
209*4882a593Smuzhiyun 	const char *name;
210*4882a593Smuzhiyun 	unsigned int *pads;
211*4882a593Smuzhiyun 	unsigned int npads;
212*4882a593Smuzhiyun 	unsigned int *funcs;
213*4882a593Smuzhiyun 	unsigned int nfuncs;
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	int mfpctl_reg;
216*4882a593Smuzhiyun 	unsigned int mfpctl_shift;
217*4882a593Smuzhiyun 	unsigned int mfpctl_width;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	int drv_reg;
220*4882a593Smuzhiyun 	unsigned int drv_shift;
221*4882a593Smuzhiyun 	unsigned int drv_width;
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun 	int sr_reg;
224*4882a593Smuzhiyun 	unsigned int sr_shift;
225*4882a593Smuzhiyun 	unsigned int sr_width;
226*4882a593Smuzhiyun };
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun /**
229*4882a593Smuzhiyun  * struct owl_padinfo - Actions pinctrl pad info
230*4882a593Smuzhiyun  * @pad: pad name of the SoC
231*4882a593Smuzhiyun  * @pullctl: pull control register info
232*4882a593Smuzhiyun  * @st: schmitt trigger register info
233*4882a593Smuzhiyun  */
234*4882a593Smuzhiyun struct owl_padinfo {
235*4882a593Smuzhiyun 	int pad;
236*4882a593Smuzhiyun 	struct owl_pullctl *pullctl;
237*4882a593Smuzhiyun 	struct owl_st *st;
238*4882a593Smuzhiyun };
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun /**
241*4882a593Smuzhiyun  * struct owl_pinmux_func - Actions pinctrl mux functions
242*4882a593Smuzhiyun  * @name: name of the pinmux function.
243*4882a593Smuzhiyun  * @groups: array of pin groups that may select this function.
244*4882a593Smuzhiyun  * @ngroups: number of entries in @groups.
245*4882a593Smuzhiyun  */
246*4882a593Smuzhiyun struct owl_pinmux_func {
247*4882a593Smuzhiyun 	const char *name;
248*4882a593Smuzhiyun 	const char * const *groups;
249*4882a593Smuzhiyun 	unsigned int ngroups;
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun /**
253*4882a593Smuzhiyun  * struct owl_gpio_port - Actions GPIO port info
254*4882a593Smuzhiyun  * @offset: offset of the GPIO port.
255*4882a593Smuzhiyun  * @pins: number of pins belongs to the GPIO port.
256*4882a593Smuzhiyun  * @outen: offset of the output enable register.
257*4882a593Smuzhiyun  * @inen: offset of the input enable register.
258*4882a593Smuzhiyun  * @dat: offset of the data register.
259*4882a593Smuzhiyun  * @intc_ctl: offset of the interrupt control register.
260*4882a593Smuzhiyun  * @intc_pd: offset of the interrupt pending register.
261*4882a593Smuzhiyun  * @intc_msk: offset of the interrupt mask register.
262*4882a593Smuzhiyun  * @intc_type: offset of the interrupt type register.
263*4882a593Smuzhiyun  */
264*4882a593Smuzhiyun struct owl_gpio_port {
265*4882a593Smuzhiyun 	unsigned int offset;
266*4882a593Smuzhiyun 	unsigned int pins;
267*4882a593Smuzhiyun 	unsigned int outen;
268*4882a593Smuzhiyun 	unsigned int inen;
269*4882a593Smuzhiyun 	unsigned int dat;
270*4882a593Smuzhiyun 	unsigned int intc_ctl;
271*4882a593Smuzhiyun 	unsigned int intc_pd;
272*4882a593Smuzhiyun 	unsigned int intc_msk;
273*4882a593Smuzhiyun 	unsigned int intc_type;
274*4882a593Smuzhiyun 	u8 shared_ctl_offset;
275*4882a593Smuzhiyun };
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun /**
278*4882a593Smuzhiyun  * struct owl_pinctrl_soc_data - Actions pin controller driver configuration
279*4882a593Smuzhiyun  * @pins: array describing all pins of the pin controller.
280*4882a593Smuzhiyun  * @npins: number of entries in @pins.
281*4882a593Smuzhiyun  * @functions: array describing all mux functions of this SoC.
282*4882a593Smuzhiyun  * @nfunction: number of entries in @functions.
283*4882a593Smuzhiyun  * @groups: array describing all pin groups of this SoC.
284*4882a593Smuzhiyun  * @ngroups: number of entries in @groups.
285*4882a593Smuzhiyun  * @padinfo: array describing the pad info of this SoC.
286*4882a593Smuzhiyun  * @ngpios: number of pingroups the driver should expose as GPIOs.
287*4882a593Smuzhiyun  * @ports: array describing all GPIO ports of this SoC.
288*4882a593Smuzhiyun  * @nports: number of GPIO ports in this SoC.
289*4882a593Smuzhiyun  */
290*4882a593Smuzhiyun struct owl_pinctrl_soc_data {
291*4882a593Smuzhiyun 	const struct pinctrl_pin_desc *pins;
292*4882a593Smuzhiyun 	unsigned int npins;
293*4882a593Smuzhiyun 	const struct owl_pinmux_func *functions;
294*4882a593Smuzhiyun 	unsigned int nfunctions;
295*4882a593Smuzhiyun 	const struct owl_pingroup *groups;
296*4882a593Smuzhiyun 	unsigned int ngroups;
297*4882a593Smuzhiyun 	const struct owl_padinfo *padinfo;
298*4882a593Smuzhiyun 	unsigned int ngpios;
299*4882a593Smuzhiyun 	const struct owl_gpio_port *ports;
300*4882a593Smuzhiyun 	unsigned int nports;
301*4882a593Smuzhiyun 	int (*padctl_val2arg)(const struct owl_padinfo *padinfo,
302*4882a593Smuzhiyun 				unsigned int param,
303*4882a593Smuzhiyun 				u32 *arg);
304*4882a593Smuzhiyun 	int (*padctl_arg2val)(const struct owl_padinfo *info,
305*4882a593Smuzhiyun 				unsigned int param,
306*4882a593Smuzhiyun 				u32 *arg);
307*4882a593Smuzhiyun };
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun int owl_pinctrl_probe(struct platform_device *pdev,
310*4882a593Smuzhiyun 		struct owl_pinctrl_soc_data *soc_data);
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun #endif /* __PINCTRL_OWL_H__ */
313