xref: /OK3568_Linux_fs/kernel/drivers/pinctrl/pinctrl-lantiq.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  *  linux/drivers/pinctrl/pinctrl-lantiq.h
4*4882a593Smuzhiyun  *  based on linux/drivers/pinctrl/pinctrl-pxa3xx.h
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *  Copyright (C) 2012 John Crispin <john@phrozen.org>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef __PINCTRL_LANTIQ_H
10*4882a593Smuzhiyun #define __PINCTRL_LANTIQ_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/clkdev.h>
13*4882a593Smuzhiyun #include <linux/pinctrl/pinctrl.h>
14*4882a593Smuzhiyun #include <linux/pinctrl/pinconf.h>
15*4882a593Smuzhiyun #include <linux/pinctrl/pinmux.h>
16*4882a593Smuzhiyun #include <linux/pinctrl/consumer.h>
17*4882a593Smuzhiyun #include <linux/pinctrl/machine.h>
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun #include "core.h"
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define ARRAY_AND_SIZE(x)	(x), ARRAY_SIZE(x)
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define LTQ_MAX_MUX		4
24*4882a593Smuzhiyun #define MFPR_FUNC_MASK		0x3
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define LTQ_PINCONF_PACK(param, arg)		((param) << 16 | (arg))
27*4882a593Smuzhiyun #define LTQ_PINCONF_UNPACK_PARAM(conf)		((conf) >> 16)
28*4882a593Smuzhiyun #define LTQ_PINCONF_UNPACK_ARG(conf)		((conf) & 0xffff)
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun enum ltq_pinconf_param {
31*4882a593Smuzhiyun 	LTQ_PINCONF_PARAM_PULL,
32*4882a593Smuzhiyun 	LTQ_PINCONF_PARAM_OPEN_DRAIN,
33*4882a593Smuzhiyun 	LTQ_PINCONF_PARAM_DRIVE_CURRENT,
34*4882a593Smuzhiyun 	LTQ_PINCONF_PARAM_SLEW_RATE,
35*4882a593Smuzhiyun 	LTQ_PINCONF_PARAM_OUTPUT,
36*4882a593Smuzhiyun };
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun struct ltq_cfg_param {
39*4882a593Smuzhiyun 	const char *property;
40*4882a593Smuzhiyun 	enum ltq_pinconf_param param;
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun struct ltq_mfp_pin {
44*4882a593Smuzhiyun 	const char *name;
45*4882a593Smuzhiyun 	const unsigned int pin;
46*4882a593Smuzhiyun 	const unsigned short func[LTQ_MAX_MUX];
47*4882a593Smuzhiyun };
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun struct ltq_pin_group {
50*4882a593Smuzhiyun 	const char *name;
51*4882a593Smuzhiyun 	const unsigned mux;
52*4882a593Smuzhiyun 	const unsigned *pins;
53*4882a593Smuzhiyun 	const unsigned npins;
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun struct ltq_pmx_func {
57*4882a593Smuzhiyun 	const char *name;
58*4882a593Smuzhiyun 	const char * const *groups;
59*4882a593Smuzhiyun 	const unsigned num_groups;
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun struct ltq_pinmux_info {
63*4882a593Smuzhiyun 	struct device *dev;
64*4882a593Smuzhiyun 	struct pinctrl_dev *pctrl;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	/* we need to manage up to 5 pad controllers */
67*4882a593Smuzhiyun 	void __iomem *membase[5];
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	/* the descriptor for the subsystem */
70*4882a593Smuzhiyun 	struct pinctrl_desc *desc;
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	/* we expose our pads to the subsystem */
73*4882a593Smuzhiyun 	struct pinctrl_pin_desc *pads;
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun 	/* the number of pads. this varies between socs */
76*4882a593Smuzhiyun 	unsigned int num_pads;
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun 	/* these are our multifunction pins */
79*4882a593Smuzhiyun 	const struct ltq_mfp_pin *mfp;
80*4882a593Smuzhiyun 	unsigned int num_mfp;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun 	/* a number of multifunction pins can be grouped together */
83*4882a593Smuzhiyun 	const struct ltq_pin_group *grps;
84*4882a593Smuzhiyun 	unsigned int num_grps;
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun 	/* a mapping between function string and id */
87*4882a593Smuzhiyun 	const struct ltq_pmx_func *funcs;
88*4882a593Smuzhiyun 	unsigned int num_funcs;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun 	/* the pinconf options that we are able to read from the DT */
91*4882a593Smuzhiyun 	const struct ltq_cfg_param *params;
92*4882a593Smuzhiyun 	unsigned int num_params;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	/* the pad controller can have a irq mapping  */
95*4882a593Smuzhiyun 	const unsigned *exin;
96*4882a593Smuzhiyun 	unsigned int num_exin;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	/* we need 5 clocks max */
99*4882a593Smuzhiyun 	struct clk *clk[5];
100*4882a593Smuzhiyun 
101*4882a593Smuzhiyun 	/* soc specific callback used to apply muxing */
102*4882a593Smuzhiyun 	int (*apply_mux)(struct pinctrl_dev *pctrldev, int pin, int mux);
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun enum ltq_pin {
106*4882a593Smuzhiyun 	GPIO0 = 0,
107*4882a593Smuzhiyun 	GPIO1,
108*4882a593Smuzhiyun 	GPIO2,
109*4882a593Smuzhiyun 	GPIO3,
110*4882a593Smuzhiyun 	GPIO4,
111*4882a593Smuzhiyun 	GPIO5,
112*4882a593Smuzhiyun 	GPIO6,
113*4882a593Smuzhiyun 	GPIO7,
114*4882a593Smuzhiyun 	GPIO8,
115*4882a593Smuzhiyun 	GPIO9,
116*4882a593Smuzhiyun 	GPIO10, /* 10 */
117*4882a593Smuzhiyun 	GPIO11,
118*4882a593Smuzhiyun 	GPIO12,
119*4882a593Smuzhiyun 	GPIO13,
120*4882a593Smuzhiyun 	GPIO14,
121*4882a593Smuzhiyun 	GPIO15,
122*4882a593Smuzhiyun 	GPIO16,
123*4882a593Smuzhiyun 	GPIO17,
124*4882a593Smuzhiyun 	GPIO18,
125*4882a593Smuzhiyun 	GPIO19,
126*4882a593Smuzhiyun 	GPIO20, /* 20 */
127*4882a593Smuzhiyun 	GPIO21,
128*4882a593Smuzhiyun 	GPIO22,
129*4882a593Smuzhiyun 	GPIO23,
130*4882a593Smuzhiyun 	GPIO24,
131*4882a593Smuzhiyun 	GPIO25,
132*4882a593Smuzhiyun 	GPIO26,
133*4882a593Smuzhiyun 	GPIO27,
134*4882a593Smuzhiyun 	GPIO28,
135*4882a593Smuzhiyun 	GPIO29,
136*4882a593Smuzhiyun 	GPIO30, /* 30 */
137*4882a593Smuzhiyun 	GPIO31,
138*4882a593Smuzhiyun 	GPIO32,
139*4882a593Smuzhiyun 	GPIO33,
140*4882a593Smuzhiyun 	GPIO34,
141*4882a593Smuzhiyun 	GPIO35,
142*4882a593Smuzhiyun 	GPIO36,
143*4882a593Smuzhiyun 	GPIO37,
144*4882a593Smuzhiyun 	GPIO38,
145*4882a593Smuzhiyun 	GPIO39,
146*4882a593Smuzhiyun 	GPIO40, /* 40 */
147*4882a593Smuzhiyun 	GPIO41,
148*4882a593Smuzhiyun 	GPIO42,
149*4882a593Smuzhiyun 	GPIO43,
150*4882a593Smuzhiyun 	GPIO44,
151*4882a593Smuzhiyun 	GPIO45,
152*4882a593Smuzhiyun 	GPIO46,
153*4882a593Smuzhiyun 	GPIO47,
154*4882a593Smuzhiyun 	GPIO48,
155*4882a593Smuzhiyun 	GPIO49,
156*4882a593Smuzhiyun 	GPIO50, /* 50 */
157*4882a593Smuzhiyun 	GPIO51,
158*4882a593Smuzhiyun 	GPIO52,
159*4882a593Smuzhiyun 	GPIO53,
160*4882a593Smuzhiyun 	GPIO54,
161*4882a593Smuzhiyun 	GPIO55,
162*4882a593Smuzhiyun 	GPIO56,
163*4882a593Smuzhiyun 	GPIO57,
164*4882a593Smuzhiyun 	GPIO58,
165*4882a593Smuzhiyun 	GPIO59,
166*4882a593Smuzhiyun 	GPIO60, /* 60 */
167*4882a593Smuzhiyun 	GPIO61,
168*4882a593Smuzhiyun 	GPIO62,
169*4882a593Smuzhiyun 	GPIO63,
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 	GPIO64,
172*4882a593Smuzhiyun 	GPIO65,
173*4882a593Smuzhiyun 	GPIO66,
174*4882a593Smuzhiyun 	GPIO67,
175*4882a593Smuzhiyun 	GPIO68,
176*4882a593Smuzhiyun 	GPIO69,
177*4882a593Smuzhiyun 	GPIO70,
178*4882a593Smuzhiyun 	GPIO71,
179*4882a593Smuzhiyun 	GPIO72,
180*4882a593Smuzhiyun 	GPIO73,
181*4882a593Smuzhiyun 	GPIO74,
182*4882a593Smuzhiyun 	GPIO75,
183*4882a593Smuzhiyun 	GPIO76,
184*4882a593Smuzhiyun 	GPIO77,
185*4882a593Smuzhiyun 	GPIO78,
186*4882a593Smuzhiyun 	GPIO79,
187*4882a593Smuzhiyun 	GPIO80,
188*4882a593Smuzhiyun 	GPIO81,
189*4882a593Smuzhiyun 	GPIO82,
190*4882a593Smuzhiyun 	GPIO83,
191*4882a593Smuzhiyun 	GPIO84,
192*4882a593Smuzhiyun 	GPIO85,
193*4882a593Smuzhiyun 	GPIO86,
194*4882a593Smuzhiyun 	GPIO87,
195*4882a593Smuzhiyun 	GPIO88,
196*4882a593Smuzhiyun };
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun extern int ltq_pinctrl_register(struct platform_device *pdev,
199*4882a593Smuzhiyun 				   struct ltq_pinmux_info *info);
200*4882a593Smuzhiyun extern int ltq_pinctrl_unregister(struct platform_device *pdev);
201*4882a593Smuzhiyun #endif	/* __PINCTRL_LANTIQ_H */
202