xref: /linux/drivers/pinctrl/spear/pinctrl-spear320.c (revision d2c9a99135da931377240942d44f3dea104cedb8)
1 /*
2  * Driver for the ST Microelectronics SPEAr320 pinmux
3  *
4  * Copyright (C) 2012 ST Microelectronics
5  * Viresh Kumar <vireshk@kernel.org>
6  *
7  * This file is licensed under the terms of the GNU General Public
8  * License version 2. This program is licensed "as is" without any
9  * warranty of any kind, whether express or implied.
10  */
11 
12 #include <linux/err.h>
13 #include <linux/init.h>
14 #include <linux/platform_device.h>
15 #include "pinctrl-spear3xx.h"
16 
17 #define DRIVER_NAME "spear320-pinmux"
18 
19 /* addresses */
20 #define PMX_CONFIG_REG			0x0C
21 #define MODE_CONFIG_REG			0x10
22 #define MODE_EXT_CONFIG_REG		0x18
23 
24 /* modes */
25 #define AUTO_NET_SMII_MODE	(1 << 0)
26 #define AUTO_NET_MII_MODE	(1 << 1)
27 #define AUTO_EXP_MODE		(1 << 2)
28 #define SMALL_PRINTERS_MODE	(1 << 3)
29 #define EXTENDED_MODE		(1 << 4)
30 
31 static struct spear_pmx_mode pmx_mode_auto_net_smii = {
32 	.name = "Automation Networking SMII mode",
33 	.mode = AUTO_NET_SMII_MODE,
34 	.reg = MODE_CONFIG_REG,
35 	.mask = 0x00000007,
36 	.val = 0x0,
37 };
38 
39 static struct spear_pmx_mode pmx_mode_auto_net_mii = {
40 	.name = "Automation Networking MII mode",
41 	.mode = AUTO_NET_MII_MODE,
42 	.reg = MODE_CONFIG_REG,
43 	.mask = 0x00000007,
44 	.val = 0x1,
45 };
46 
47 static struct spear_pmx_mode pmx_mode_auto_exp = {
48 	.name = "Automation Expanded mode",
49 	.mode = AUTO_EXP_MODE,
50 	.reg = MODE_CONFIG_REG,
51 	.mask = 0x00000007,
52 	.val = 0x2,
53 };
54 
55 static struct spear_pmx_mode pmx_mode_small_printers = {
56 	.name = "Small Printers mode",
57 	.mode = SMALL_PRINTERS_MODE,
58 	.reg = MODE_CONFIG_REG,
59 	.mask = 0x00000007,
60 	.val = 0x3,
61 };
62 
63 static struct spear_pmx_mode pmx_mode_extended = {
64 	.name = "extended mode",
65 	.mode = EXTENDED_MODE,
66 	.reg = MODE_EXT_CONFIG_REG,
67 	.mask = 0x00000001,
68 	.val = 0x1,
69 };
70 
71 static struct spear_pmx_mode *spear320_pmx_modes[] = {
72 	&pmx_mode_auto_net_smii,
73 	&pmx_mode_auto_net_mii,
74 	&pmx_mode_auto_exp,
75 	&pmx_mode_small_printers,
76 	&pmx_mode_extended,
77 };
78 
79 /* Extended mode registers and their offsets */
80 #define EXT_CTRL_REG				0x0018
81 	#define MII_MDIO_MASK			(1 << 4)
82 	#define MII_MDIO_10_11_VAL		0
83 	#define MII_MDIO_81_VAL			(1 << 4)
84 	#define EMI_FSMC_DYNAMIC_MUX_MASK	(1 << 5)
85 	#define MAC_MODE_MII			0
86 	#define MAC_MODE_RMII			1
87 	#define MAC_MODE_SMII			2
88 	#define MAC_MODE_SS_SMII		3
89 	#define MAC_MODE_MASK			0x3
90 	#define MAC1_MODE_SHIFT			16
91 	#define MAC2_MODE_SHIFT			18
92 
93 #define IP_SEL_PAD_0_9_REG			0x00A4
94 	#define PMX_PL_0_1_MASK			(0x3F << 0)
95 	#define PMX_UART2_PL_0_1_VAL		0x0
96 	#define PMX_I2C2_PL_0_1_VAL		(0x4 | (0x4 << 3))
97 
98 	#define PMX_PL_2_3_MASK			(0x3F << 6)
99 	#define PMX_I2C2_PL_2_3_VAL		0x0
100 	#define PMX_UART6_PL_2_3_VAL		((0x1 << 6) | (0x1 << 9))
101 	#define PMX_UART1_ENH_PL_2_3_VAL	((0x4 << 6) | (0x4 << 9))
102 
103 	#define PMX_PL_4_5_MASK			(0x3F << 12)
104 	#define PMX_UART5_PL_4_5_VAL		((0x1 << 12) | (0x1 << 15))
105 	#define PMX_UART1_ENH_PL_4_5_VAL	((0x4 << 12) | (0x4 << 15))
106 	#define PMX_PL_5_MASK			(0x7 << 15)
107 	#define PMX_TOUCH_Y_PL_5_VAL		0x0
108 
109 	#define PMX_PL_6_7_MASK			(0x3F << 18)
110 	#define PMX_PL_6_MASK			(0x7 << 18)
111 	#define PMX_PL_7_MASK			(0x7 << 21)
112 	#define PMX_UART4_PL_6_7_VAL		((0x1 << 18) | (0x1 << 21))
113 	#define PMX_PWM_3_PL_6_VAL		(0x2 << 18)
114 	#define PMX_PWM_2_PL_7_VAL		(0x2 << 21)
115 	#define PMX_UART1_ENH_PL_6_7_VAL	((0x4 << 18) | (0x4 << 21))
116 
117 	#define PMX_PL_8_9_MASK			(0x3F << 24)
118 	#define PMX_UART3_PL_8_9_VAL		((0x1 << 24) | (0x1 << 27))
119 	#define PMX_PWM_0_1_PL_8_9_VAL		((0x2 << 24) | (0x2 << 27))
120 	#define PMX_I2C1_PL_8_9_VAL		((0x4 << 24) | (0x4 << 27))
121 
122 #define IP_SEL_PAD_10_19_REG			0x00A8
123 	#define PMX_PL_10_11_MASK		(0x3F << 0)
124 	#define PMX_SMII_PL_10_11_VAL		0
125 	#define PMX_RMII_PL_10_11_VAL		((0x4 << 0) | (0x4 << 3))
126 
127 	#define PMX_PL_12_MASK			(0x7 << 6)
128 	#define PMX_PWM3_PL_12_VAL		0
129 	#define PMX_SDHCI_CD_PL_12_VAL		(0x4 << 6)
130 
131 	#define PMX_PL_13_14_MASK		(0x3F << 9)
132 	#define PMX_PL_13_MASK			(0x7 << 9)
133 	#define PMX_PL_14_MASK			(0x7 << 12)
134 	#define PMX_SSP2_PL_13_14_15_16_VAL	0
135 	#define PMX_UART4_PL_13_14_VAL		((0x1 << 9) | (0x1 << 12))
136 	#define PMX_RMII_PL_13_14_VAL		((0x4 << 9) | (0x4 << 12))
137 	#define PMX_PWM2_PL_13_VAL		(0x2 << 9)
138 	#define PMX_PWM1_PL_14_VAL		(0x2 << 12)
139 
140 	#define PMX_PL_15_MASK			(0x7 << 15)
141 	#define PMX_PWM0_PL_15_VAL		(0x2 << 15)
142 	#define PMX_PL_15_16_MASK		(0x3F << 15)
143 	#define PMX_UART3_PL_15_16_VAL		((0x1 << 15) | (0x1 << 18))
144 	#define PMX_RMII_PL_15_16_VAL		((0x4 << 15) | (0x4 << 18))
145 
146 	#define PMX_PL_17_18_MASK		(0x3F << 21)
147 	#define PMX_SSP1_PL_17_18_19_20_VAL	0
148 	#define PMX_RMII_PL_17_18_VAL		((0x4 << 21) | (0x4 << 24))
149 
150 	#define PMX_PL_19_MASK			(0x7 << 27)
151 	#define PMX_I2C2_PL_19_VAL		(0x1 << 27)
152 	#define PMX_RMII_PL_19_VAL		(0x4 << 27)
153 
154 #define IP_SEL_PAD_20_29_REG			0x00AC
155 	#define PMX_PL_20_MASK			(0x7 << 0)
156 	#define PMX_I2C2_PL_20_VAL		(0x1 << 0)
157 	#define PMX_RMII_PL_20_VAL		(0x4 << 0)
158 
159 	#define PMX_PL_21_TO_27_MASK		(0x1FFFFF << 3)
160 	#define PMX_SMII_PL_21_TO_27_VAL	0
161 	#define PMX_RMII_PL_21_TO_27_VAL	((0x4 << 3) | (0x4 << 6) | (0x4 << 9) | (0x4 << 12) | (0x4 << 15) | (0x4 << 18) | (0x4 << 21))
162 
163 	#define PMX_PL_28_29_MASK		(0x3F << 24)
164 	#define PMX_PL_28_MASK			(0x7 << 24)
165 	#define PMX_PL_29_MASK			(0x7 << 27)
166 	#define PMX_UART1_PL_28_29_VAL		0
167 	#define PMX_PWM_3_PL_28_VAL		(0x4 << 24)
168 	#define PMX_PWM_2_PL_29_VAL		(0x4 << 27)
169 
170 #define IP_SEL_PAD_30_39_REG			0x00B0
171 	#define PMX_PL_30_31_MASK		(0x3F << 0)
172 	#define PMX_CAN1_PL_30_31_VAL		(0)
173 	#define PMX_PL_30_MASK			(0x7 << 0)
174 	#define PMX_PL_31_MASK			(0x7 << 3)
175 	#define PMX_PWM1_EXT_PL_30_VAL		(0x4 << 0)
176 	#define PMX_PWM0_EXT_PL_31_VAL		(0x4 << 3)
177 	#define PMX_UART1_ENH_PL_31_VAL		(0x3 << 3)
178 
179 	#define PMX_PL_32_33_MASK		(0x3F << 6)
180 	#define PMX_CAN0_PL_32_33_VAL		0
181 	#define PMX_UART1_ENH_PL_32_33_VAL	((0x3 << 6) | (0x3 << 9))
182 	#define PMX_SSP2_PL_32_33_VAL		((0x4 << 6) | (0x4 << 9))
183 
184 	#define PMX_PL_34_MASK			(0x7 << 12)
185 	#define PMX_PWM2_PL_34_VAL		0
186 	#define PMX_UART1_ENH_PL_34_VAL		(0x2 << 12)
187 	#define PMX_SSP2_PL_34_VAL		(0x4 << 12)
188 
189 	#define PMX_PL_35_MASK			(0x7 << 15)
190 	#define PMX_I2S_REF_CLK_PL_35_VAL	0
191 	#define PMX_UART1_ENH_PL_35_VAL		(0x2 << 15)
192 	#define PMX_SSP2_PL_35_VAL		(0x4 << 15)
193 
194 	#define PMX_PL_36_MASK			(0x7 << 18)
195 	#define PMX_TOUCH_X_PL_36_VAL		0
196 	#define PMX_UART1_ENH_PL_36_VAL		(0x2 << 18)
197 	#define PMX_SSP1_PL_36_VAL		(0x4 << 18)
198 
199 	#define PMX_PL_37_38_MASK		(0x3F << 21)
200 	#define PMX_PWM0_1_PL_37_38_VAL		0
201 	#define PMX_UART5_PL_37_38_VAL		((0x2 << 21) | (0x2 << 24))
202 	#define PMX_SSP1_PL_37_38_VAL		((0x4 << 21) | (0x4 << 24))
203 
204 	#define PMX_PL_39_MASK			(0x7 << 27)
205 	#define PMX_I2S_PL_39_VAL		0
206 	#define PMX_UART4_PL_39_VAL		(0x2 << 27)
207 	#define PMX_SSP1_PL_39_VAL		(0x4 << 27)
208 
209 #define IP_SEL_PAD_40_49_REG			0x00B4
210 	#define PMX_PL_40_MASK			(0x7 << 0)
211 	#define PMX_I2S_PL_40_VAL		0
212 	#define PMX_UART4_PL_40_VAL		(0x2 << 0)
213 	#define PMX_PWM3_PL_40_VAL		(0x4 << 0)
214 
215 	#define PMX_PL_41_42_MASK		(0x3F << 3)
216 	#define PMX_PL_41_MASK			(0x7 << 3)
217 	#define PMX_PL_42_MASK			(0x7 << 6)
218 	#define PMX_I2S_PL_41_42_VAL		0
219 	#define PMX_UART3_PL_41_42_VAL		((0x2 << 3) | (0x2 << 6))
220 	#define PMX_PWM2_PL_41_VAL		(0x4 << 3)
221 	#define PMX_PWM1_PL_42_VAL		(0x4 << 6)
222 
223 	#define PMX_PL_43_MASK			(0x7 << 9)
224 	#define PMX_SDHCI_PL_43_VAL		0
225 	#define PMX_UART1_ENH_PL_43_VAL		(0x2 << 9)
226 	#define PMX_PWM0_PL_43_VAL		(0x4 << 9)
227 
228 	#define PMX_PL_44_45_MASK		(0x3F << 12)
229 	#define PMX_SDHCI_PL_44_45_VAL	0
230 	#define PMX_UART1_ENH_PL_44_45_VAL	((0x2 << 12) | (0x2 << 15))
231 	#define PMX_SSP2_PL_44_45_VAL		((0x4 << 12) | (0x4 << 15))
232 
233 	#define PMX_PL_46_47_MASK		(0x3F << 18)
234 	#define PMX_SDHCI_PL_46_47_VAL	0
235 	#define PMX_FSMC_EMI_PL_46_47_VAL	((0x2 << 18) | (0x2 << 21))
236 	#define PMX_SSP2_PL_46_47_VAL		((0x4 << 18) | (0x4 << 21))
237 
238 	#define PMX_PL_48_49_MASK		(0x3F << 24)
239 	#define PMX_SDHCI_PL_48_49_VAL	0
240 	#define PMX_FSMC_EMI_PL_48_49_VAL	((0x2 << 24) | (0x2 << 27))
241 	#define PMX_SSP1_PL_48_49_VAL		((0x4 << 24) | (0x4 << 27))
242 
243 #define IP_SEL_PAD_50_59_REG			0x00B8
244 	#define PMX_PL_50_51_MASK		(0x3F << 0)
245 	#define PMX_EMI_PL_50_51_VAL		((0x2 << 0) | (0x2 << 3))
246 	#define PMX_SSP1_PL_50_51_VAL		((0x4 << 0) | (0x4 << 3))
247 	#define PMX_PL_50_MASK			(0x7 << 0)
248 	#define PMX_PL_51_MASK			(0x7 << 3)
249 	#define PMX_SDHCI_PL_50_VAL		0
250 	#define PMX_SDHCI_CD_PL_51_VAL		0
251 
252 	#define PMX_PL_52_53_MASK		(0x3F << 6)
253 	#define PMX_FSMC_PL_52_53_VAL		0
254 	#define PMX_EMI_PL_52_53_VAL		((0x2 << 6) | (0x2 << 9))
255 	#define PMX_UART3_PL_52_53_VAL		((0x4 << 6) | (0x4 << 9))
256 
257 	#define PMX_PL_54_55_56_MASK		(0x1FF << 12)
258 	#define PMX_FSMC_EMI_PL_54_55_56_VAL	((0x2 << 12) | (0x2 << 15) | (0x2 << 18))
259 
260 	#define PMX_PL_57_MASK			(0x7 << 21)
261 	#define PMX_FSMC_PL_57_VAL		0
262 	#define PMX_PWM3_PL_57_VAL		(0x4 << 21)
263 
264 	#define PMX_PL_58_59_MASK		(0x3F << 24)
265 	#define PMX_PL_58_MASK			(0x7 << 24)
266 	#define PMX_PL_59_MASK			(0x7 << 27)
267 	#define PMX_FSMC_EMI_PL_58_59_VAL	((0x2 << 24) | (0x2 << 27))
268 	#define PMX_PWM2_PL_58_VAL		(0x4 << 24)
269 	#define PMX_PWM1_PL_59_VAL		(0x4 << 27)
270 
271 #define IP_SEL_PAD_60_69_REG			0x00BC
272 	#define PMX_PL_60_MASK			(0x7 << 0)
273 	#define PMX_FSMC_PL_60_VAL		0
274 	#define PMX_PWM0_PL_60_VAL		(0x4 << 0)
275 
276 	#define PMX_PL_61_TO_64_MASK		(0xFFF << 3)
277 	#define PMX_FSMC_PL_61_TO_64_VAL	((0x2 << 3) | (0x2 << 6) | (0x2 << 9) | (0x2 << 12))
278 	#define PMX_SSP2_PL_61_TO_64_VAL	((0x4 << 3) | (0x4 << 6) | (0x4 << 9) | (0x4 << 12))
279 
280 	#define PMX_PL_65_TO_68_MASK		(0xFFF << 15)
281 	#define PMX_FSMC_PL_65_TO_68_VAL	((0x2 << 15) | (0x2 << 18) | (0x2 << 21) | (0x2 << 24))
282 	#define PMX_SSP1_PL_65_TO_68_VAL	((0x4 << 15) | (0x4 << 18) | (0x4 << 21) | (0x4 << 24))
283 
284 	#define PMX_PL_69_MASK			(0x7 << 27)
285 	#define PMX_CLCD_PL_69_VAL		(0)
286 	#define PMX_EMI_PL_69_VAL		(0x2 << 27)
287 	#define PMX_SPP_PL_69_VAL		(0x3 << 27)
288 	#define PMX_UART5_PL_69_VAL		(0x4 << 27)
289 
290 #define IP_SEL_PAD_70_79_REG			0x00C0
291 	#define PMX_PL_70_MASK			(0x7 << 0)
292 	#define PMX_CLCD_PL_70_VAL		(0)
293 	#define PMX_FSMC_EMI_PL_70_VAL		(0x2 << 0)
294 	#define PMX_SPP_PL_70_VAL		(0x3 << 0)
295 	#define PMX_UART5_PL_70_VAL		(0x4 << 0)
296 
297 	#define PMX_PL_71_72_MASK		(0x3F << 3)
298 	#define PMX_CLCD_PL_71_72_VAL		(0)
299 	#define PMX_FSMC_EMI_PL_71_72_VAL	((0x2 << 3) | (0x2 << 6))
300 	#define PMX_SPP_PL_71_72_VAL		((0x3 << 3) | (0x3 << 6))
301 	#define PMX_UART4_PL_71_72_VAL		((0x4 << 3) | (0x4 << 6))
302 
303 	#define PMX_PL_73_MASK			(0x7 << 9)
304 	#define PMX_CLCD_PL_73_VAL		(0)
305 	#define PMX_FSMC_EMI_PL_73_VAL		(0x2 << 9)
306 	#define PMX_SPP_PL_73_VAL		(0x3 << 9)
307 	#define PMX_UART3_PL_73_VAL		(0x4 << 9)
308 
309 	#define PMX_PL_74_MASK			(0x7 << 12)
310 	#define PMX_CLCD_PL_74_VAL		(0)
311 	#define PMX_EMI_PL_74_VAL		(0x2 << 12)
312 	#define PMX_SPP_PL_74_VAL		(0x3 << 12)
313 	#define PMX_UART3_PL_74_VAL		(0x4 << 12)
314 
315 	#define PMX_PL_75_76_MASK		(0x3F << 15)
316 	#define PMX_CLCD_PL_75_76_VAL		(0)
317 	#define PMX_EMI_PL_75_76_VAL		((0x2 << 15) | (0x2 << 18))
318 	#define PMX_SPP_PL_75_76_VAL		((0x3 << 15) | (0x3 << 18))
319 	#define PMX_I2C2_PL_75_76_VAL		((0x4 << 15) | (0x4 << 18))
320 
321 	#define PMX_PL_77_78_79_MASK		(0x1FF << 21)
322 	#define PMX_CLCD_PL_77_78_79_VAL	(0)
323 	#define PMX_EMI_PL_77_78_79_VAL		((0x2 << 21) | (0x2 << 24) | (0x2 << 27))
324 	#define PMX_SPP_PL_77_78_79_VAL		((0x3 << 21) | (0x3 << 24) | (0x3 << 27))
325 	#define PMX_RS485_PL_77_78_79_VAL	((0x4 << 21) | (0x4 << 24) | (0x4 << 27))
326 
327 #define IP_SEL_PAD_80_89_REG			0x00C4
328 	#define PMX_PL_80_TO_85_MASK		(0x3FFFF << 0)
329 	#define PMX_CLCD_PL_80_TO_85_VAL	0
330 	#define PMX_MII2_PL_80_TO_85_VAL	((0x1 << 0) | (0x1 << 3) | (0x1 << 6) | (0x1 << 9) | (0x1 << 12) | (0x1 << 15))
331 	#define PMX_EMI_PL_80_TO_85_VAL		((0x2 << 0) | (0x2 << 3) | (0x2 << 6) | (0x2 << 9) | (0x2 << 12) | (0x2 << 15))
332 	#define PMX_SPP_PL_80_TO_85_VAL		((0x3 << 0) | (0x3 << 3) | (0x3 << 6) | (0x3 << 9) | (0x3 << 12) | (0x3 << 15))
333 	#define PMX_UART1_ENH_PL_80_TO_85_VAL	((0x4 << 0) | (0x4 << 3) | (0x4 << 6) | (0x4 << 9) | (0x4 << 12) | (0x4 << 15))
334 
335 	#define PMX_PL_86_87_MASK		(0x3F << 18)
336 	#define PMX_PL_86_MASK			(0x7 << 18)
337 	#define PMX_PL_87_MASK			(0x7 << 21)
338 	#define PMX_CLCD_PL_86_87_VAL		0
339 	#define PMX_MII2_PL_86_87_VAL		((0x1 << 18) | (0x1 << 21))
340 	#define PMX_EMI_PL_86_87_VAL		((0x2 << 18) | (0x2 << 21))
341 	#define PMX_PWM3_PL_86_VAL		(0x4 << 18)
342 	#define PMX_PWM2_PL_87_VAL		(0x4 << 21)
343 
344 	#define PMX_PL_88_89_MASK		(0x3F << 24)
345 	#define PMX_CLCD_PL_88_89_VAL		0
346 	#define PMX_MII2_PL_88_89_VAL		((0x1 << 24) | (0x1 << 27))
347 	#define PMX_EMI_PL_88_89_VAL		((0x2 << 24) | (0x2 << 27))
348 	#define PMX_UART6_PL_88_89_VAL		((0x3 << 24) | (0x3 << 27))
349 	#define PMX_PWM0_1_PL_88_89_VAL		((0x4 << 24) | (0x4 << 27))
350 
351 #define IP_SEL_PAD_90_99_REG			0x00C8
352 	#define PMX_PL_90_91_MASK		(0x3F << 0)
353 	#define PMX_CLCD_PL_90_91_VAL		0
354 	#define PMX_MII2_PL_90_91_VAL		((0x1 << 0) | (0x1 << 3))
355 	#define PMX_EMI1_PL_90_91_VAL		((0x2 << 0) | (0x2 << 3))
356 	#define PMX_UART5_PL_90_91_VAL		((0x3 << 0) | (0x3 << 3))
357 	#define PMX_SSP2_PL_90_91_VAL		((0x4 << 0) | (0x4 << 3))
358 
359 	#define PMX_PL_92_93_MASK		(0x3F << 6)
360 	#define PMX_CLCD_PL_92_93_VAL		0
361 	#define PMX_MII2_PL_92_93_VAL		((0x1 << 6) | (0x1 << 9))
362 	#define PMX_EMI1_PL_92_93_VAL		((0x2 << 6) | (0x2 << 9))
363 	#define PMX_UART4_PL_92_93_VAL		((0x3 << 6) | (0x3 << 9))
364 	#define PMX_SSP2_PL_92_93_VAL		((0x4 << 6) | (0x4 << 9))
365 
366 	#define PMX_PL_94_95_MASK		(0x3F << 12)
367 	#define PMX_CLCD_PL_94_95_VAL		0
368 	#define PMX_MII2_PL_94_95_VAL		((0x1 << 12) | (0x1 << 15))
369 	#define PMX_EMI1_PL_94_95_VAL		((0x2 << 12) | (0x2 << 15))
370 	#define PMX_UART3_PL_94_95_VAL		((0x3 << 12) | (0x3 << 15))
371 	#define PMX_SSP1_PL_94_95_VAL		((0x4 << 12) | (0x4 << 15))
372 
373 	#define PMX_PL_96_97_MASK		(0x3F << 18)
374 	#define PMX_CLCD_PL_96_97_VAL		0
375 	#define PMX_MII2_PL_96_97_VAL		((0x1 << 18) | (0x1 << 21))
376 	#define PMX_EMI1_PL_96_97_VAL		((0x2 << 18) | (0x2 << 21))
377 	#define PMX_I2C2_PL_96_97_VAL		((0x3 << 18) | (0x3 << 21))
378 	#define PMX_SSP1_PL_96_97_VAL		((0x4 << 18) | (0x4 << 21))
379 
380 	#define PMX_PL_98_MASK			(0x7 << 24)
381 	#define PMX_CLCD_PL_98_VAL		0
382 	#define PMX_I2C1_PL_98_VAL		(0x2 << 24)
383 	#define PMX_UART3_PL_98_VAL		(0x4 << 24)
384 
385 	#define PMX_PL_99_MASK			(0x7 << 27)
386 	#define PMX_SDHCI_PL_99_VAL		0
387 	#define PMX_I2C1_PL_99_VAL		(0x2 << 27)
388 	#define PMX_UART3_PL_99_VAL		(0x4 << 27)
389 
390 #define IP_SEL_MIX_PAD_REG			0x00CC
391 	#define PMX_PL_100_101_MASK		(0x3F << 0)
392 	#define PMX_SDHCI_PL_100_101_VAL	0
393 	#define PMX_UART4_PL_100_101_VAL	((0x4 << 0) | (0x4 << 3))
394 
395 	#define PMX_SSP1_PORT_SEL_MASK		(0x7 << 8)
396 	#define PMX_SSP1_PORT_94_TO_97_VAL	0
397 	#define PMX_SSP1_PORT_65_TO_68_VAL	(0x1 << 8)
398 	#define PMX_SSP1_PORT_48_TO_51_VAL	(0x2 << 8)
399 	#define PMX_SSP1_PORT_36_TO_39_VAL	(0x3 << 8)
400 	#define PMX_SSP1_PORT_17_TO_20_VAL	(0x4 << 8)
401 
402 	#define PMX_SSP2_PORT_SEL_MASK		(0x7 << 11)
403 	#define PMX_SSP2_PORT_90_TO_93_VAL	0
404 	#define PMX_SSP2_PORT_61_TO_64_VAL	(0x1 << 11)
405 	#define PMX_SSP2_PORT_44_TO_47_VAL	(0x2 << 11)
406 	#define PMX_SSP2_PORT_32_TO_35_VAL	(0x3 << 11)
407 	#define PMX_SSP2_PORT_13_TO_16_VAL	(0x4 << 11)
408 
409 	#define PMX_UART1_ENH_PORT_SEL_MASK		(0x3 << 14)
410 	#define PMX_UART1_ENH_PORT_81_TO_85_VAL		0
411 	#define PMX_UART1_ENH_PORT_44_45_34_36_VAL	(0x1 << 14)
412 	#define PMX_UART1_ENH_PORT_32_TO_34_36_VAL	(0x2 << 14)
413 	#define PMX_UART1_ENH_PORT_3_TO_5_7_VAL		(0x3 << 14)
414 
415 	#define PMX_UART3_PORT_SEL_MASK		(0x7 << 16)
416 	#define PMX_UART3_PORT_94_VAL		0
417 	#define PMX_UART3_PORT_73_VAL		(0x1 << 16)
418 	#define PMX_UART3_PORT_52_VAL		(0x2 << 16)
419 	#define PMX_UART3_PORT_41_VAL		(0x3 << 16)
420 	#define PMX_UART3_PORT_15_VAL		(0x4 << 16)
421 	#define PMX_UART3_PORT_8_VAL		(0x5 << 16)
422 	#define PMX_UART3_PORT_99_VAL		(0x6 << 16)
423 
424 	#define PMX_UART4_PORT_SEL_MASK		(0x7 << 19)
425 	#define PMX_UART4_PORT_92_VAL		0
426 	#define PMX_UART4_PORT_71_VAL		(0x1 << 19)
427 	#define PMX_UART4_PORT_39_VAL		(0x2 << 19)
428 	#define PMX_UART4_PORT_13_VAL		(0x3 << 19)
429 	#define PMX_UART4_PORT_6_VAL		(0x4 << 19)
430 	#define PMX_UART4_PORT_101_VAL		(0x5 << 19)
431 
432 	#define PMX_UART5_PORT_SEL_MASK		(0x3 << 22)
433 	#define PMX_UART5_PORT_90_VAL		0
434 	#define PMX_UART5_PORT_69_VAL		(0x1 << 22)
435 	#define PMX_UART5_PORT_37_VAL		(0x2 << 22)
436 	#define PMX_UART5_PORT_4_VAL		(0x3 << 22)
437 
438 	#define PMX_UART6_PORT_SEL_MASK		(0x1 << 24)
439 	#define PMX_UART6_PORT_88_VAL		0
440 	#define PMX_UART6_PORT_2_VAL		(0x1 << 24)
441 
442 	#define PMX_I2C1_PORT_SEL_MASK		(0x1 << 25)
443 	#define PMX_I2C1_PORT_8_9_VAL		0
444 	#define PMX_I2C1_PORT_98_99_VAL		(0x1 << 25)
445 
446 	#define PMX_I2C2_PORT_SEL_MASK		(0x3 << 26)
447 	#define PMX_I2C2_PORT_96_97_VAL		0
448 	#define PMX_I2C2_PORT_75_76_VAL		(0x1 << 26)
449 	#define PMX_I2C2_PORT_19_20_VAL		(0x2 << 26)
450 	#define PMX_I2C2_PORT_2_3_VAL		(0x3 << 26)
451 	#define PMX_I2C2_PORT_0_1_VAL		(0x4 << 26)
452 
453 	#define PMX_SDHCI_CD_PORT_SEL_MASK	(0x1 << 29)
454 	#define PMX_SDHCI_CD_PORT_12_VAL	0
455 	#define PMX_SDHCI_CD_PORT_51_VAL	(0x1 << 29)
456 
457 /* Pad multiplexing for CLCD device */
458 static const unsigned clcd_pins[] = { 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
459 	79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
460 	97 };
461 static struct spear_muxreg clcd_muxreg[] = {
462 	{
463 		.reg = IP_SEL_PAD_60_69_REG,
464 		.mask = PMX_PL_69_MASK,
465 		.val = PMX_CLCD_PL_69_VAL,
466 	}, {
467 		.reg = IP_SEL_PAD_70_79_REG,
468 		.mask = PMX_PL_70_MASK | PMX_PL_71_72_MASK | PMX_PL_73_MASK |
469 			PMX_PL_74_MASK | PMX_PL_75_76_MASK |
470 			PMX_PL_77_78_79_MASK,
471 		.val = PMX_CLCD_PL_70_VAL | PMX_CLCD_PL_71_72_VAL |
472 			PMX_CLCD_PL_73_VAL | PMX_CLCD_PL_74_VAL |
473 			PMX_CLCD_PL_75_76_VAL | PMX_CLCD_PL_77_78_79_VAL,
474 	}, {
475 		.reg = IP_SEL_PAD_80_89_REG,
476 		.mask = PMX_PL_80_TO_85_MASK | PMX_PL_86_87_MASK |
477 			PMX_PL_88_89_MASK,
478 		.val = PMX_CLCD_PL_80_TO_85_VAL | PMX_CLCD_PL_86_87_VAL |
479 			PMX_CLCD_PL_88_89_VAL,
480 	}, {
481 		.reg = IP_SEL_PAD_90_99_REG,
482 		.mask = PMX_PL_90_91_MASK | PMX_PL_92_93_MASK |
483 			PMX_PL_94_95_MASK | PMX_PL_96_97_MASK | PMX_PL_98_MASK,
484 		.val = PMX_CLCD_PL_90_91_VAL | PMX_CLCD_PL_92_93_VAL |
485 			PMX_CLCD_PL_94_95_VAL | PMX_CLCD_PL_96_97_VAL |
486 			PMX_CLCD_PL_98_VAL,
487 	},
488 };
489 
490 static struct spear_modemux clcd_modemux[] = {
491 	{
492 		.modes = EXTENDED_MODE,
493 		.muxregs = clcd_muxreg,
494 		.nmuxregs = ARRAY_SIZE(clcd_muxreg),
495 	},
496 };
497 
498 static struct spear_pingroup clcd_pingroup = {
499 	.name = "clcd_grp",
500 	.pins = clcd_pins,
501 	.npins = ARRAY_SIZE(clcd_pins),
502 	.modemuxs = clcd_modemux,
503 	.nmodemuxs = ARRAY_SIZE(clcd_modemux),
504 };
505 
506 static const char *const clcd_grps[] = { "clcd_grp" };
507 static struct spear_function clcd_function = {
508 	.name = "clcd",
509 	.groups = clcd_grps,
510 	.ngroups = ARRAY_SIZE(clcd_grps),
511 };
512 
513 /* Pad multiplexing for EMI (Parallel NOR flash) device */
514 static const unsigned emi_pins[] = { 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
515 	57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
516 	75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92,
517 	93, 94, 95, 96, 97 };
518 static struct spear_muxreg emi_muxreg[] = {
519 	{
520 		.reg = PMX_CONFIG_REG,
521 		.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
522 		.val = 0,
523 	},
524 };
525 
526 static struct spear_muxreg emi_ext_muxreg[] = {
527 	{
528 		.reg = IP_SEL_PAD_40_49_REG,
529 		.mask = PMX_PL_46_47_MASK | PMX_PL_48_49_MASK,
530 		.val = PMX_FSMC_EMI_PL_46_47_VAL | PMX_FSMC_EMI_PL_48_49_VAL,
531 	}, {
532 		.reg = IP_SEL_PAD_50_59_REG,
533 		.mask = PMX_PL_50_51_MASK | PMX_PL_52_53_MASK |
534 			PMX_PL_54_55_56_MASK | PMX_PL_58_59_MASK,
535 		.val = PMX_EMI_PL_50_51_VAL | PMX_EMI_PL_52_53_VAL |
536 			PMX_FSMC_EMI_PL_54_55_56_VAL |
537 			PMX_FSMC_EMI_PL_58_59_VAL,
538 	}, {
539 		.reg = IP_SEL_PAD_60_69_REG,
540 		.mask = PMX_PL_69_MASK,
541 		.val = PMX_EMI_PL_69_VAL,
542 	}, {
543 		.reg = IP_SEL_PAD_70_79_REG,
544 		.mask = PMX_PL_70_MASK | PMX_PL_71_72_MASK | PMX_PL_73_MASK |
545 			PMX_PL_74_MASK | PMX_PL_75_76_MASK |
546 			PMX_PL_77_78_79_MASK,
547 		.val = PMX_FSMC_EMI_PL_70_VAL | PMX_FSMC_EMI_PL_71_72_VAL |
548 			PMX_FSMC_EMI_PL_73_VAL | PMX_EMI_PL_74_VAL |
549 			PMX_EMI_PL_75_76_VAL | PMX_EMI_PL_77_78_79_VAL,
550 	}, {
551 		.reg = IP_SEL_PAD_80_89_REG,
552 		.mask = PMX_PL_80_TO_85_MASK | PMX_PL_86_87_MASK |
553 			PMX_PL_88_89_MASK,
554 		.val = PMX_EMI_PL_80_TO_85_VAL | PMX_EMI_PL_86_87_VAL |
555 			PMX_EMI_PL_88_89_VAL,
556 	}, {
557 		.reg = IP_SEL_PAD_90_99_REG,
558 		.mask = PMX_PL_90_91_MASK | PMX_PL_92_93_MASK |
559 			PMX_PL_94_95_MASK | PMX_PL_96_97_MASK,
560 		.val = PMX_EMI1_PL_90_91_VAL | PMX_EMI1_PL_92_93_VAL |
561 			PMX_EMI1_PL_94_95_VAL | PMX_EMI1_PL_96_97_VAL,
562 	}, {
563 		.reg = EXT_CTRL_REG,
564 		.mask = EMI_FSMC_DYNAMIC_MUX_MASK,
565 		.val = EMI_FSMC_DYNAMIC_MUX_MASK,
566 	},
567 };
568 
569 static struct spear_modemux emi_modemux[] = {
570 	{
571 		.modes = AUTO_EXP_MODE | EXTENDED_MODE,
572 		.muxregs = emi_muxreg,
573 		.nmuxregs = ARRAY_SIZE(emi_muxreg),
574 	}, {
575 		.modes = EXTENDED_MODE,
576 		.muxregs = emi_ext_muxreg,
577 		.nmuxregs = ARRAY_SIZE(emi_ext_muxreg),
578 	},
579 };
580 
581 static struct spear_pingroup emi_pingroup = {
582 	.name = "emi_grp",
583 	.pins = emi_pins,
584 	.npins = ARRAY_SIZE(emi_pins),
585 	.modemuxs = emi_modemux,
586 	.nmodemuxs = ARRAY_SIZE(emi_modemux),
587 };
588 
589 static const char *const emi_grps[] = { "emi_grp" };
590 static struct spear_function emi_function = {
591 	.name = "emi",
592 	.groups = emi_grps,
593 	.ngroups = ARRAY_SIZE(emi_grps),
594 };
595 
596 /* Pad multiplexing for FSMC (NAND flash) device */
597 static const unsigned fsmc_8bit_pins[] = { 52, 53, 54, 55, 56, 57, 58, 59, 60,
598 	61, 62, 63, 64, 65, 66, 67, 68 };
599 static struct spear_muxreg fsmc_8bit_muxreg[] = {
600 	{
601 		.reg = IP_SEL_PAD_50_59_REG,
602 		.mask = PMX_PL_52_53_MASK | PMX_PL_54_55_56_MASK |
603 			PMX_PL_57_MASK | PMX_PL_58_59_MASK,
604 		.val = PMX_FSMC_PL_52_53_VAL | PMX_FSMC_EMI_PL_54_55_56_VAL |
605 			PMX_FSMC_PL_57_VAL | PMX_FSMC_EMI_PL_58_59_VAL,
606 	}, {
607 		.reg = IP_SEL_PAD_60_69_REG,
608 		.mask = PMX_PL_60_MASK | PMX_PL_61_TO_64_MASK |
609 			PMX_PL_65_TO_68_MASK,
610 		.val = PMX_FSMC_PL_60_VAL | PMX_FSMC_PL_61_TO_64_VAL |
611 			PMX_FSMC_PL_65_TO_68_VAL,
612 	}, {
613 		.reg = EXT_CTRL_REG,
614 		.mask = EMI_FSMC_DYNAMIC_MUX_MASK,
615 		.val = EMI_FSMC_DYNAMIC_MUX_MASK,
616 	},
617 };
618 
619 static struct spear_modemux fsmc_8bit_modemux[] = {
620 	{
621 		.modes = EXTENDED_MODE,
622 		.muxregs = fsmc_8bit_muxreg,
623 		.nmuxregs = ARRAY_SIZE(fsmc_8bit_muxreg),
624 	},
625 };
626 
627 static struct spear_pingroup fsmc_8bit_pingroup = {
628 	.name = "fsmc_8bit_grp",
629 	.pins = fsmc_8bit_pins,
630 	.npins = ARRAY_SIZE(fsmc_8bit_pins),
631 	.modemuxs = fsmc_8bit_modemux,
632 	.nmodemuxs = ARRAY_SIZE(fsmc_8bit_modemux),
633 };
634 
635 static const unsigned fsmc_16bit_pins[] = { 46, 47, 48, 49, 52, 53, 54, 55, 56,
636 	57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 70, 71, 72, 73 };
637 static struct spear_muxreg fsmc_16bit_autoexp_muxreg[] = {
638 	{
639 		.reg = PMX_CONFIG_REG,
640 		.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
641 		.val = 0,
642 	},
643 };
644 
645 static struct spear_muxreg fsmc_16bit_muxreg[] = {
646 	{
647 		.reg = IP_SEL_PAD_40_49_REG,
648 		.mask = PMX_PL_46_47_MASK | PMX_PL_48_49_MASK,
649 		.val = PMX_FSMC_EMI_PL_46_47_VAL | PMX_FSMC_EMI_PL_48_49_VAL,
650 	}, {
651 		.reg = IP_SEL_PAD_70_79_REG,
652 		.mask = PMX_PL_70_MASK | PMX_PL_71_72_MASK | PMX_PL_73_MASK,
653 		.val = PMX_FSMC_EMI_PL_70_VAL | PMX_FSMC_EMI_PL_71_72_VAL |
654 			PMX_FSMC_EMI_PL_73_VAL,
655 	}
656 };
657 
658 static struct spear_modemux fsmc_16bit_modemux[] = {
659 	{
660 		.modes = EXTENDED_MODE,
661 		.muxregs = fsmc_8bit_muxreg,
662 		.nmuxregs = ARRAY_SIZE(fsmc_8bit_muxreg),
663 	}, {
664 		.modes = AUTO_EXP_MODE | EXTENDED_MODE,
665 		.muxregs = fsmc_16bit_autoexp_muxreg,
666 		.nmuxregs = ARRAY_SIZE(fsmc_16bit_autoexp_muxreg),
667 	}, {
668 		.modes = EXTENDED_MODE,
669 		.muxregs = fsmc_16bit_muxreg,
670 		.nmuxregs = ARRAY_SIZE(fsmc_16bit_muxreg),
671 	},
672 };
673 
674 static struct spear_pingroup fsmc_16bit_pingroup = {
675 	.name = "fsmc_16bit_grp",
676 	.pins = fsmc_16bit_pins,
677 	.npins = ARRAY_SIZE(fsmc_16bit_pins),
678 	.modemuxs = fsmc_16bit_modemux,
679 	.nmodemuxs = ARRAY_SIZE(fsmc_16bit_modemux),
680 };
681 
682 static const char *const fsmc_grps[] = { "fsmc_8bit_grp", "fsmc_16bit_grp" };
683 static struct spear_function fsmc_function = {
684 	.name = "fsmc",
685 	.groups = fsmc_grps,
686 	.ngroups = ARRAY_SIZE(fsmc_grps),
687 };
688 
689 /* Pad multiplexing for SPP device */
690 static const unsigned spp_pins[] = { 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
691 	80, 81, 82, 83, 84, 85 };
692 static struct spear_muxreg spp_muxreg[] = {
693 	{
694 		.reg = IP_SEL_PAD_60_69_REG,
695 		.mask = PMX_PL_69_MASK,
696 		.val = PMX_SPP_PL_69_VAL,
697 	}, {
698 		.reg = IP_SEL_PAD_70_79_REG,
699 		.mask = PMX_PL_70_MASK | PMX_PL_71_72_MASK | PMX_PL_73_MASK |
700 			PMX_PL_74_MASK | PMX_PL_75_76_MASK |
701 			PMX_PL_77_78_79_MASK,
702 		.val = PMX_SPP_PL_70_VAL | PMX_SPP_PL_71_72_VAL |
703 			PMX_SPP_PL_73_VAL | PMX_SPP_PL_74_VAL |
704 			PMX_SPP_PL_75_76_VAL | PMX_SPP_PL_77_78_79_VAL,
705 	}, {
706 		.reg = IP_SEL_PAD_80_89_REG,
707 		.mask = PMX_PL_80_TO_85_MASK,
708 		.val = PMX_SPP_PL_80_TO_85_VAL,
709 	},
710 };
711 
712 static struct spear_modemux spp_modemux[] = {
713 	{
714 		.modes = EXTENDED_MODE,
715 		.muxregs = spp_muxreg,
716 		.nmuxregs = ARRAY_SIZE(spp_muxreg),
717 	},
718 };
719 
720 static struct spear_pingroup spp_pingroup = {
721 	.name = "spp_grp",
722 	.pins = spp_pins,
723 	.npins = ARRAY_SIZE(spp_pins),
724 	.modemuxs = spp_modemux,
725 	.nmodemuxs = ARRAY_SIZE(spp_modemux),
726 };
727 
728 static const char *const spp_grps[] = { "spp_grp" };
729 static struct spear_function spp_function = {
730 	.name = "spp",
731 	.groups = spp_grps,
732 	.ngroups = ARRAY_SIZE(spp_grps),
733 };
734 
735 /* Pad multiplexing for SDHCI device */
736 static const unsigned sdhci_led_pins[] = { 34 };
737 static struct spear_muxreg sdhci_led_muxreg[] = {
738 	{
739 		.reg = PMX_CONFIG_REG,
740 		.mask = PMX_SSP_CS_MASK,
741 		.val = 0,
742 	},
743 };
744 
745 static struct spear_muxreg sdhci_led_ext_muxreg[] = {
746 	{
747 		.reg = IP_SEL_PAD_30_39_REG,
748 		.mask = PMX_PL_34_MASK,
749 		.val = PMX_PWM2_PL_34_VAL,
750 	},
751 };
752 
753 static struct spear_modemux sdhci_led_modemux[] = {
754 	{
755 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | EXTENDED_MODE,
756 		.muxregs = sdhci_led_muxreg,
757 		.nmuxregs = ARRAY_SIZE(sdhci_led_muxreg),
758 	}, {
759 		.modes = EXTENDED_MODE,
760 		.muxregs = sdhci_led_ext_muxreg,
761 		.nmuxregs = ARRAY_SIZE(sdhci_led_ext_muxreg),
762 	},
763 };
764 
765 static struct spear_pingroup sdhci_led_pingroup = {
766 	.name = "sdhci_led_grp",
767 	.pins = sdhci_led_pins,
768 	.npins = ARRAY_SIZE(sdhci_led_pins),
769 	.modemuxs = sdhci_led_modemux,
770 	.nmodemuxs = ARRAY_SIZE(sdhci_led_modemux),
771 };
772 
773 static const unsigned sdhci_cd_12_pins[] = { 12, 43, 44, 45, 46, 47, 48, 49,
774 	50};
775 static const unsigned sdhci_cd_51_pins[] = { 43, 44, 45, 46, 47, 48, 49, 50, 51
776 };
777 static struct spear_muxreg sdhci_muxreg[] = {
778 	{
779 		.reg = PMX_CONFIG_REG,
780 		.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
781 		.val = 0,
782 	},
783 };
784 
785 static struct spear_muxreg sdhci_ext_muxreg[] = {
786 	{
787 		.reg = IP_SEL_PAD_40_49_REG,
788 		.mask = PMX_PL_43_MASK | PMX_PL_44_45_MASK | PMX_PL_46_47_MASK |
789 			PMX_PL_48_49_MASK,
790 		.val = PMX_SDHCI_PL_43_VAL | PMX_SDHCI_PL_44_45_VAL |
791 			PMX_SDHCI_PL_46_47_VAL | PMX_SDHCI_PL_48_49_VAL,
792 	}, {
793 		.reg = IP_SEL_PAD_50_59_REG,
794 		.mask = PMX_PL_50_MASK,
795 		.val = PMX_SDHCI_PL_50_VAL,
796 	}, {
797 		.reg = IP_SEL_PAD_90_99_REG,
798 		.mask = PMX_PL_99_MASK,
799 		.val = PMX_SDHCI_PL_99_VAL,
800 	}, {
801 		.reg = IP_SEL_MIX_PAD_REG,
802 		.mask = PMX_PL_100_101_MASK,
803 		.val = PMX_SDHCI_PL_100_101_VAL,
804 	},
805 };
806 
807 static struct spear_muxreg sdhci_cd_12_muxreg[] = {
808 	{
809 		.reg = PMX_CONFIG_REG,
810 		.mask = PMX_MII_MASK,
811 		.val = 0,
812 	}, {
813 		.reg = IP_SEL_PAD_10_19_REG,
814 		.mask = PMX_PL_12_MASK,
815 		.val = PMX_SDHCI_CD_PL_12_VAL,
816 	}, {
817 		.reg = IP_SEL_MIX_PAD_REG,
818 		.mask = PMX_SDHCI_CD_PORT_SEL_MASK,
819 		.val = PMX_SDHCI_CD_PORT_12_VAL,
820 	},
821 };
822 
823 static struct spear_muxreg sdhci_cd_51_muxreg[] = {
824 	{
825 		.reg = IP_SEL_PAD_50_59_REG,
826 		.mask = PMX_PL_51_MASK,
827 		.val = PMX_SDHCI_CD_PL_51_VAL,
828 	}, {
829 		.reg = IP_SEL_MIX_PAD_REG,
830 		.mask = PMX_SDHCI_CD_PORT_SEL_MASK,
831 		.val = PMX_SDHCI_CD_PORT_51_VAL,
832 	},
833 };
834 
835 #define pmx_sdhci_common_modemux					\
836 	{								\
837 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE |	\
838 			SMALL_PRINTERS_MODE | EXTENDED_MODE,		\
839 		.muxregs = sdhci_muxreg,				\
840 		.nmuxregs = ARRAY_SIZE(sdhci_muxreg),			\
841 	}, {								\
842 		.modes = EXTENDED_MODE,					\
843 		.muxregs = sdhci_ext_muxreg,				\
844 		.nmuxregs = ARRAY_SIZE(sdhci_ext_muxreg),		\
845 	}
846 
847 static struct spear_modemux sdhci_modemux[][3] = {
848 	{
849 		/* select pin 12 for cd */
850 		pmx_sdhci_common_modemux,
851 		{
852 			.modes = EXTENDED_MODE,
853 			.muxregs = sdhci_cd_12_muxreg,
854 			.nmuxregs = ARRAY_SIZE(sdhci_cd_12_muxreg),
855 		},
856 	}, {
857 		/* select pin 51 for cd */
858 		pmx_sdhci_common_modemux,
859 		{
860 			.modes = EXTENDED_MODE,
861 			.muxregs = sdhci_cd_51_muxreg,
862 			.nmuxregs = ARRAY_SIZE(sdhci_cd_51_muxreg),
863 		},
864 	}
865 };
866 
867 static struct spear_pingroup sdhci_pingroup[] = {
868 	{
869 		.name = "sdhci_cd_12_grp",
870 		.pins = sdhci_cd_12_pins,
871 		.npins = ARRAY_SIZE(sdhci_cd_12_pins),
872 		.modemuxs = sdhci_modemux[0],
873 		.nmodemuxs = ARRAY_SIZE(sdhci_modemux[0]),
874 	}, {
875 		.name = "sdhci_cd_51_grp",
876 		.pins = sdhci_cd_51_pins,
877 		.npins = ARRAY_SIZE(sdhci_cd_51_pins),
878 		.modemuxs = sdhci_modemux[1],
879 		.nmodemuxs = ARRAY_SIZE(sdhci_modemux[1]),
880 	},
881 };
882 
883 static const char *const sdhci_grps[] = { "sdhci_cd_12_grp", "sdhci_cd_51_grp",
884 	"sdhci_led_grp" };
885 
886 static struct spear_function sdhci_function = {
887 	.name = "sdhci",
888 	.groups = sdhci_grps,
889 	.ngroups = ARRAY_SIZE(sdhci_grps),
890 };
891 
892 /* Pad multiplexing for I2S device */
893 static const unsigned i2s_pins[] = { 35, 39, 40, 41, 42 };
894 static struct spear_muxreg i2s_muxreg[] = {
895 	{
896 		.reg = PMX_CONFIG_REG,
897 		.mask = PMX_SSP_CS_MASK,
898 		.val = 0,
899 	}, {
900 		.reg = PMX_CONFIG_REG,
901 		.mask = PMX_UART0_MODEM_MASK,
902 		.val = 0,
903 	},
904 };
905 
906 static struct spear_muxreg i2s_ext_muxreg[] = {
907 	{
908 		.reg = IP_SEL_PAD_30_39_REG,
909 		.mask = PMX_PL_35_MASK | PMX_PL_39_MASK,
910 		.val = PMX_I2S_REF_CLK_PL_35_VAL | PMX_I2S_PL_39_VAL,
911 	}, {
912 		.reg = IP_SEL_PAD_40_49_REG,
913 		.mask = PMX_PL_40_MASK | PMX_PL_41_42_MASK,
914 		.val = PMX_I2S_PL_40_VAL | PMX_I2S_PL_41_42_VAL,
915 	},
916 };
917 
918 static struct spear_modemux i2s_modemux[] = {
919 	{
920 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | EXTENDED_MODE,
921 		.muxregs = i2s_muxreg,
922 		.nmuxregs = ARRAY_SIZE(i2s_muxreg),
923 	}, {
924 		.modes = EXTENDED_MODE,
925 		.muxregs = i2s_ext_muxreg,
926 		.nmuxregs = ARRAY_SIZE(i2s_ext_muxreg),
927 	},
928 };
929 
930 static struct spear_pingroup i2s_pingroup = {
931 	.name = "i2s_grp",
932 	.pins = i2s_pins,
933 	.npins = ARRAY_SIZE(i2s_pins),
934 	.modemuxs = i2s_modemux,
935 	.nmodemuxs = ARRAY_SIZE(i2s_modemux),
936 };
937 
938 static const char *const i2s_grps[] = { "i2s_grp" };
939 static struct spear_function i2s_function = {
940 	.name = "i2s",
941 	.groups = i2s_grps,
942 	.ngroups = ARRAY_SIZE(i2s_grps),
943 };
944 
945 /* Pad multiplexing for UART1 device */
946 static const unsigned uart1_pins[] = { 28, 29 };
947 static struct spear_muxreg uart1_muxreg[] = {
948 	{
949 		.reg = PMX_CONFIG_REG,
950 		.mask = PMX_GPIO_PIN0_MASK | PMX_GPIO_PIN1_MASK,
951 		.val = 0,
952 	},
953 };
954 
955 static struct spear_muxreg uart1_ext_muxreg[] = {
956 	{
957 		.reg = IP_SEL_PAD_20_29_REG,
958 		.mask = PMX_PL_28_29_MASK,
959 		.val = PMX_UART1_PL_28_29_VAL,
960 	},
961 };
962 
963 static struct spear_modemux uart1_modemux[] = {
964 	{
965 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE
966 			| SMALL_PRINTERS_MODE | EXTENDED_MODE,
967 		.muxregs = uart1_muxreg,
968 		.nmuxregs = ARRAY_SIZE(uart1_muxreg),
969 	}, {
970 		.modes = EXTENDED_MODE,
971 		.muxregs = uart1_ext_muxreg,
972 		.nmuxregs = ARRAY_SIZE(uart1_ext_muxreg),
973 	},
974 };
975 
976 static struct spear_pingroup uart1_pingroup = {
977 	.name = "uart1_grp",
978 	.pins = uart1_pins,
979 	.npins = ARRAY_SIZE(uart1_pins),
980 	.modemuxs = uart1_modemux,
981 	.nmodemuxs = ARRAY_SIZE(uart1_modemux),
982 };
983 
984 static const char *const uart1_grps[] = { "uart1_grp" };
985 static struct spear_function uart1_function = {
986 	.name = "uart1",
987 	.groups = uart1_grps,
988 	.ngroups = ARRAY_SIZE(uart1_grps),
989 };
990 
991 /* Pad multiplexing for UART1 Modem device */
992 static const unsigned uart1_modem_2_to_7_pins[] = { 2, 3, 4, 5, 6, 7 };
993 static const unsigned uart1_modem_31_to_36_pins[] = { 31, 32, 33, 34, 35, 36 };
994 static const unsigned uart1_modem_34_to_45_pins[] = { 34, 35, 36, 43, 44, 45 };
995 static const unsigned uart1_modem_80_to_85_pins[] = { 80, 81, 82, 83, 84, 85 };
996 
997 static struct spear_muxreg uart1_modem_ext_2_to_7_muxreg[] = {
998 	{
999 		.reg = PMX_CONFIG_REG,
1000 		.mask = PMX_UART0_MASK | PMX_I2C_MASK | PMX_SSP_MASK,
1001 		.val = 0,
1002 	}, {
1003 		.reg = IP_SEL_PAD_0_9_REG,
1004 		.mask = PMX_PL_2_3_MASK | PMX_PL_6_7_MASK,
1005 		.val = PMX_UART1_ENH_PL_2_3_VAL | PMX_UART1_ENH_PL_4_5_VAL |
1006 			PMX_UART1_ENH_PL_6_7_VAL,
1007 	}, {
1008 		.reg = IP_SEL_MIX_PAD_REG,
1009 		.mask = PMX_UART1_ENH_PORT_SEL_MASK,
1010 		.val = PMX_UART1_ENH_PORT_3_TO_5_7_VAL,
1011 	},
1012 };
1013 
1014 static struct spear_muxreg uart1_modem_31_to_36_muxreg[] = {
1015 	{
1016 		.reg = PMX_CONFIG_REG,
1017 		.mask = PMX_GPIO_PIN3_MASK | PMX_GPIO_PIN4_MASK |
1018 			PMX_GPIO_PIN5_MASK | PMX_SSP_CS_MASK,
1019 		.val = 0,
1020 	},
1021 };
1022 
1023 static struct spear_muxreg uart1_modem_ext_31_to_36_muxreg[] = {
1024 	{
1025 		.reg = IP_SEL_PAD_30_39_REG,
1026 		.mask = PMX_PL_31_MASK | PMX_PL_32_33_MASK | PMX_PL_34_MASK |
1027 			PMX_PL_35_MASK | PMX_PL_36_MASK,
1028 		.val = PMX_UART1_ENH_PL_31_VAL | PMX_UART1_ENH_PL_32_33_VAL |
1029 			PMX_UART1_ENH_PL_34_VAL | PMX_UART1_ENH_PL_35_VAL |
1030 			PMX_UART1_ENH_PL_36_VAL,
1031 	}, {
1032 		.reg = IP_SEL_MIX_PAD_REG,
1033 		.mask = PMX_UART1_ENH_PORT_SEL_MASK,
1034 		.val = PMX_UART1_ENH_PORT_32_TO_34_36_VAL,
1035 	},
1036 };
1037 
1038 static struct spear_muxreg uart1_modem_34_to_45_muxreg[] = {
1039 	{
1040 		.reg = PMX_CONFIG_REG,
1041 		.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK |
1042 			PMX_SSP_CS_MASK,
1043 		.val = 0,
1044 	},
1045 };
1046 
1047 static struct spear_muxreg uart1_modem_ext_34_to_45_muxreg[] = {
1048 	{
1049 		.reg = IP_SEL_PAD_30_39_REG,
1050 		.mask = PMX_PL_34_MASK | PMX_PL_35_MASK | PMX_PL_36_MASK,
1051 		.val = PMX_UART1_ENH_PL_34_VAL | PMX_UART1_ENH_PL_35_VAL |
1052 			PMX_UART1_ENH_PL_36_VAL,
1053 	}, {
1054 		.reg = IP_SEL_PAD_40_49_REG,
1055 		.mask = PMX_PL_43_MASK | PMX_PL_44_45_MASK,
1056 		.val = PMX_UART1_ENH_PL_43_VAL | PMX_UART1_ENH_PL_44_45_VAL,
1057 	}, {
1058 		.reg = IP_SEL_MIX_PAD_REG,
1059 		.mask = PMX_UART1_ENH_PORT_SEL_MASK,
1060 		.val = PMX_UART1_ENH_PORT_44_45_34_36_VAL,
1061 	},
1062 };
1063 
1064 static struct spear_muxreg uart1_modem_ext_80_to_85_muxreg[] = {
1065 	{
1066 		.reg = IP_SEL_PAD_80_89_REG,
1067 		.mask = PMX_PL_80_TO_85_MASK,
1068 		.val = PMX_UART1_ENH_PL_80_TO_85_VAL,
1069 	}, {
1070 		.reg = IP_SEL_PAD_40_49_REG,
1071 		.mask = PMX_PL_43_MASK | PMX_PL_44_45_MASK,
1072 		.val = PMX_UART1_ENH_PL_43_VAL | PMX_UART1_ENH_PL_44_45_VAL,
1073 	}, {
1074 		.reg = IP_SEL_MIX_PAD_REG,
1075 		.mask = PMX_UART1_ENH_PORT_SEL_MASK,
1076 		.val = PMX_UART1_ENH_PORT_81_TO_85_VAL,
1077 	},
1078 };
1079 
1080 static struct spear_modemux uart1_modem_2_to_7_modemux[] = {
1081 	{
1082 		.modes = EXTENDED_MODE,
1083 		.muxregs = uart1_modem_ext_2_to_7_muxreg,
1084 		.nmuxregs = ARRAY_SIZE(uart1_modem_ext_2_to_7_muxreg),
1085 	},
1086 };
1087 
1088 static struct spear_modemux uart1_modem_31_to_36_modemux[] = {
1089 	{
1090 		.modes = SMALL_PRINTERS_MODE | EXTENDED_MODE,
1091 		.muxregs = uart1_modem_31_to_36_muxreg,
1092 		.nmuxregs = ARRAY_SIZE(uart1_modem_31_to_36_muxreg),
1093 	}, {
1094 		.modes = EXTENDED_MODE,
1095 		.muxregs = uart1_modem_ext_31_to_36_muxreg,
1096 		.nmuxregs = ARRAY_SIZE(uart1_modem_ext_31_to_36_muxreg),
1097 	},
1098 };
1099 
1100 static struct spear_modemux uart1_modem_34_to_45_modemux[] = {
1101 	{
1102 		.modes = AUTO_EXP_MODE | EXTENDED_MODE,
1103 		.muxregs = uart1_modem_34_to_45_muxreg,
1104 		.nmuxregs = ARRAY_SIZE(uart1_modem_34_to_45_muxreg),
1105 	}, {
1106 		.modes = EXTENDED_MODE,
1107 		.muxregs = uart1_modem_ext_34_to_45_muxreg,
1108 		.nmuxregs = ARRAY_SIZE(uart1_modem_ext_34_to_45_muxreg),
1109 	},
1110 };
1111 
1112 static struct spear_modemux uart1_modem_80_to_85_modemux[] = {
1113 	{
1114 		.modes = EXTENDED_MODE,
1115 		.muxregs = uart1_modem_ext_80_to_85_muxreg,
1116 		.nmuxregs = ARRAY_SIZE(uart1_modem_ext_80_to_85_muxreg),
1117 	},
1118 };
1119 
1120 static struct spear_pingroup uart1_modem_pingroup[] = {
1121 	{
1122 		.name = "uart1_modem_2_to_7_grp",
1123 		.pins = uart1_modem_2_to_7_pins,
1124 		.npins = ARRAY_SIZE(uart1_modem_2_to_7_pins),
1125 		.modemuxs = uart1_modem_2_to_7_modemux,
1126 		.nmodemuxs = ARRAY_SIZE(uart1_modem_2_to_7_modemux),
1127 	}, {
1128 		.name = "uart1_modem_31_to_36_grp",
1129 		.pins = uart1_modem_31_to_36_pins,
1130 		.npins = ARRAY_SIZE(uart1_modem_31_to_36_pins),
1131 		.modemuxs = uart1_modem_31_to_36_modemux,
1132 		.nmodemuxs = ARRAY_SIZE(uart1_modem_31_to_36_modemux),
1133 	}, {
1134 		.name = "uart1_modem_34_to_45_grp",
1135 		.pins = uart1_modem_34_to_45_pins,
1136 		.npins = ARRAY_SIZE(uart1_modem_34_to_45_pins),
1137 		.modemuxs = uart1_modem_34_to_45_modemux,
1138 		.nmodemuxs = ARRAY_SIZE(uart1_modem_34_to_45_modemux),
1139 	}, {
1140 		.name = "uart1_modem_80_to_85_grp",
1141 		.pins = uart1_modem_80_to_85_pins,
1142 		.npins = ARRAY_SIZE(uart1_modem_80_to_85_pins),
1143 		.modemuxs = uart1_modem_80_to_85_modemux,
1144 		.nmodemuxs = ARRAY_SIZE(uart1_modem_80_to_85_modemux),
1145 	},
1146 };
1147 
1148 static const char *const uart1_modem_grps[] = { "uart1_modem_2_to_7_grp",
1149 	"uart1_modem_31_to_36_grp", "uart1_modem_34_to_45_grp",
1150 	"uart1_modem_80_to_85_grp" };
1151 static struct spear_function uart1_modem_function = {
1152 	.name = "uart1_modem",
1153 	.groups = uart1_modem_grps,
1154 	.ngroups = ARRAY_SIZE(uart1_modem_grps),
1155 };
1156 
1157 /* Pad multiplexing for UART2 device */
1158 static const unsigned uart2_pins[] = { 0, 1 };
1159 static struct spear_muxreg uart2_muxreg[] = {
1160 	{
1161 		.reg = PMX_CONFIG_REG,
1162 		.mask = PMX_FIRDA_MASK,
1163 		.val = 0,
1164 	},
1165 };
1166 
1167 static struct spear_muxreg uart2_ext_muxreg[] = {
1168 	{
1169 		.reg = IP_SEL_PAD_0_9_REG,
1170 		.mask = PMX_PL_0_1_MASK,
1171 		.val = PMX_UART2_PL_0_1_VAL,
1172 	},
1173 };
1174 
1175 static struct spear_modemux uart2_modemux[] = {
1176 	{
1177 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE
1178 			| SMALL_PRINTERS_MODE | EXTENDED_MODE,
1179 		.muxregs = uart2_muxreg,
1180 		.nmuxregs = ARRAY_SIZE(uart2_muxreg),
1181 	}, {
1182 		.modes = EXTENDED_MODE,
1183 		.muxregs = uart2_ext_muxreg,
1184 		.nmuxregs = ARRAY_SIZE(uart2_ext_muxreg),
1185 	},
1186 };
1187 
1188 static struct spear_pingroup uart2_pingroup = {
1189 	.name = "uart2_grp",
1190 	.pins = uart2_pins,
1191 	.npins = ARRAY_SIZE(uart2_pins),
1192 	.modemuxs = uart2_modemux,
1193 	.nmodemuxs = ARRAY_SIZE(uart2_modemux),
1194 };
1195 
1196 static const char *const uart2_grps[] = { "uart2_grp" };
1197 static struct spear_function uart2_function = {
1198 	.name = "uart2",
1199 	.groups = uart2_grps,
1200 	.ngroups = ARRAY_SIZE(uart2_grps),
1201 };
1202 
1203 /* Pad multiplexing for uart3 device */
1204 static const unsigned uart3_pins[][2] = { { 8, 9 }, { 15, 16 }, { 41, 42 },
1205 	{ 52, 53 }, { 73, 74 }, { 94, 95 }, { 98, 99 } };
1206 
1207 static struct spear_muxreg uart3_ext_8_9_muxreg[] = {
1208 	{
1209 		.reg = PMX_CONFIG_REG,
1210 		.mask = PMX_SSP_MASK,
1211 		.val = 0,
1212 	}, {
1213 		.reg = IP_SEL_PAD_0_9_REG,
1214 		.mask = PMX_PL_8_9_MASK,
1215 		.val = PMX_UART3_PL_8_9_VAL,
1216 	}, {
1217 		.reg = IP_SEL_MIX_PAD_REG,
1218 		.mask = PMX_UART3_PORT_SEL_MASK,
1219 		.val = PMX_UART3_PORT_8_VAL,
1220 	},
1221 };
1222 
1223 static struct spear_muxreg uart3_ext_15_16_muxreg[] = {
1224 	{
1225 		.reg = PMX_CONFIG_REG,
1226 		.mask = PMX_MII_MASK,
1227 		.val = 0,
1228 	}, {
1229 		.reg = IP_SEL_PAD_10_19_REG,
1230 		.mask = PMX_PL_15_16_MASK,
1231 		.val = PMX_UART3_PL_15_16_VAL,
1232 	}, {
1233 		.reg = IP_SEL_MIX_PAD_REG,
1234 		.mask = PMX_UART3_PORT_SEL_MASK,
1235 		.val = PMX_UART3_PORT_15_VAL,
1236 	},
1237 };
1238 
1239 static struct spear_muxreg uart3_ext_41_42_muxreg[] = {
1240 	{
1241 		.reg = PMX_CONFIG_REG,
1242 		.mask = PMX_UART0_MODEM_MASK,
1243 		.val = 0,
1244 	}, {
1245 		.reg = IP_SEL_PAD_40_49_REG,
1246 		.mask = PMX_PL_41_42_MASK,
1247 		.val = PMX_UART3_PL_41_42_VAL,
1248 	}, {
1249 		.reg = IP_SEL_MIX_PAD_REG,
1250 		.mask = PMX_UART3_PORT_SEL_MASK,
1251 		.val = PMX_UART3_PORT_41_VAL,
1252 	},
1253 };
1254 
1255 static struct spear_muxreg uart3_ext_52_53_muxreg[] = {
1256 	{
1257 		.reg = IP_SEL_PAD_50_59_REG,
1258 		.mask = PMX_PL_52_53_MASK,
1259 		.val = PMX_UART3_PL_52_53_VAL,
1260 	}, {
1261 		.reg = IP_SEL_MIX_PAD_REG,
1262 		.mask = PMX_UART3_PORT_SEL_MASK,
1263 		.val = PMX_UART3_PORT_52_VAL,
1264 	},
1265 };
1266 
1267 static struct spear_muxreg uart3_ext_73_74_muxreg[] = {
1268 	{
1269 		.reg = IP_SEL_PAD_70_79_REG,
1270 		.mask = PMX_PL_73_MASK | PMX_PL_74_MASK,
1271 		.val = PMX_UART3_PL_73_VAL | PMX_UART3_PL_74_VAL,
1272 	}, {
1273 		.reg = IP_SEL_MIX_PAD_REG,
1274 		.mask = PMX_UART3_PORT_SEL_MASK,
1275 		.val = PMX_UART3_PORT_73_VAL,
1276 	},
1277 };
1278 
1279 static struct spear_muxreg uart3_ext_94_95_muxreg[] = {
1280 	{
1281 		.reg = IP_SEL_PAD_90_99_REG,
1282 		.mask = PMX_PL_94_95_MASK,
1283 		.val = PMX_UART3_PL_94_95_VAL,
1284 	}, {
1285 		.reg = IP_SEL_MIX_PAD_REG,
1286 		.mask = PMX_UART3_PORT_SEL_MASK,
1287 		.val = PMX_UART3_PORT_94_VAL,
1288 	},
1289 };
1290 
1291 static struct spear_muxreg uart3_ext_98_99_muxreg[] = {
1292 	{
1293 		.reg = IP_SEL_PAD_90_99_REG,
1294 		.mask = PMX_PL_98_MASK | PMX_PL_99_MASK,
1295 		.val = PMX_UART3_PL_98_VAL | PMX_UART3_PL_99_VAL,
1296 	}, {
1297 		.reg = IP_SEL_MIX_PAD_REG,
1298 		.mask = PMX_UART3_PORT_SEL_MASK,
1299 		.val = PMX_UART3_PORT_99_VAL,
1300 	},
1301 };
1302 
1303 static struct spear_modemux uart3_modemux[][1] = {
1304 	{
1305 		/* Select signals on pins 8_9 */
1306 		{
1307 			.modes = EXTENDED_MODE,
1308 			.muxregs = uart3_ext_8_9_muxreg,
1309 			.nmuxregs = ARRAY_SIZE(uart3_ext_8_9_muxreg),
1310 		},
1311 	}, {
1312 		/* Select signals on pins 15_16 */
1313 		{
1314 			.modes = EXTENDED_MODE,
1315 			.muxregs = uart3_ext_15_16_muxreg,
1316 			.nmuxregs = ARRAY_SIZE(uart3_ext_15_16_muxreg),
1317 		},
1318 	}, {
1319 		/* Select signals on pins 41_42 */
1320 		{
1321 			.modes = EXTENDED_MODE,
1322 			.muxregs = uart3_ext_41_42_muxreg,
1323 			.nmuxregs = ARRAY_SIZE(uart3_ext_41_42_muxreg),
1324 		},
1325 	}, {
1326 		/* Select signals on pins 52_53 */
1327 		{
1328 			.modes = EXTENDED_MODE,
1329 			.muxregs = uart3_ext_52_53_muxreg,
1330 			.nmuxregs = ARRAY_SIZE(uart3_ext_52_53_muxreg),
1331 		},
1332 	}, {
1333 		/* Select signals on pins 73_74 */
1334 		{
1335 			.modes = EXTENDED_MODE,
1336 			.muxregs = uart3_ext_73_74_muxreg,
1337 			.nmuxregs = ARRAY_SIZE(uart3_ext_73_74_muxreg),
1338 		},
1339 	}, {
1340 		/* Select signals on pins 94_95 */
1341 		{
1342 			.modes = EXTENDED_MODE,
1343 			.muxregs = uart3_ext_94_95_muxreg,
1344 			.nmuxregs = ARRAY_SIZE(uart3_ext_94_95_muxreg),
1345 		},
1346 	}, {
1347 		/* Select signals on pins 98_99 */
1348 		{
1349 			.modes = EXTENDED_MODE,
1350 			.muxregs = uart3_ext_98_99_muxreg,
1351 			.nmuxregs = ARRAY_SIZE(uart3_ext_98_99_muxreg),
1352 		},
1353 	},
1354 };
1355 
1356 static struct spear_pingroup uart3_pingroup[] = {
1357 	{
1358 		.name = "uart3_8_9_grp",
1359 		.pins = uart3_pins[0],
1360 		.npins = ARRAY_SIZE(uart3_pins[0]),
1361 		.modemuxs = uart3_modemux[0],
1362 		.nmodemuxs = ARRAY_SIZE(uart3_modemux[0]),
1363 	}, {
1364 		.name = "uart3_15_16_grp",
1365 		.pins = uart3_pins[1],
1366 		.npins = ARRAY_SIZE(uart3_pins[1]),
1367 		.modemuxs = uart3_modemux[1],
1368 		.nmodemuxs = ARRAY_SIZE(uart3_modemux[1]),
1369 	}, {
1370 		.name = "uart3_41_42_grp",
1371 		.pins = uart3_pins[2],
1372 		.npins = ARRAY_SIZE(uart3_pins[2]),
1373 		.modemuxs = uart3_modemux[2],
1374 		.nmodemuxs = ARRAY_SIZE(uart3_modemux[2]),
1375 	}, {
1376 		.name = "uart3_52_53_grp",
1377 		.pins = uart3_pins[3],
1378 		.npins = ARRAY_SIZE(uart3_pins[3]),
1379 		.modemuxs = uart3_modemux[3],
1380 		.nmodemuxs = ARRAY_SIZE(uart3_modemux[3]),
1381 	}, {
1382 		.name = "uart3_73_74_grp",
1383 		.pins = uart3_pins[4],
1384 		.npins = ARRAY_SIZE(uart3_pins[4]),
1385 		.modemuxs = uart3_modemux[4],
1386 		.nmodemuxs = ARRAY_SIZE(uart3_modemux[4]),
1387 	}, {
1388 		.name = "uart3_94_95_grp",
1389 		.pins = uart3_pins[5],
1390 		.npins = ARRAY_SIZE(uart3_pins[5]),
1391 		.modemuxs = uart3_modemux[5],
1392 		.nmodemuxs = ARRAY_SIZE(uart3_modemux[5]),
1393 	}, {
1394 		.name = "uart3_98_99_grp",
1395 		.pins = uart3_pins[6],
1396 		.npins = ARRAY_SIZE(uart3_pins[6]),
1397 		.modemuxs = uart3_modemux[6],
1398 		.nmodemuxs = ARRAY_SIZE(uart3_modemux[6]),
1399 	},
1400 };
1401 
1402 static const char *const uart3_grps[] = { "uart3_8_9_grp", "uart3_15_16_grp",
1403 	"uart3_41_42_grp", "uart3_52_53_grp", "uart3_73_74_grp",
1404 	"uart3_94_95_grp", "uart3_98_99_grp" };
1405 
1406 static struct spear_function uart3_function = {
1407 	.name = "uart3",
1408 	.groups = uart3_grps,
1409 	.ngroups = ARRAY_SIZE(uart3_grps),
1410 };
1411 
1412 /* Pad multiplexing for uart4 device */
1413 static const unsigned uart4_pins[][2] = { { 6, 7 }, { 13, 14 }, { 39, 40 },
1414 	{ 71, 72 }, { 92, 93 }, { 100, 101 } };
1415 
1416 static struct spear_muxreg uart4_ext_6_7_muxreg[] = {
1417 	{
1418 		.reg = PMX_CONFIG_REG,
1419 		.mask = PMX_SSP_MASK,
1420 		.val = 0,
1421 	}, {
1422 		.reg = IP_SEL_PAD_0_9_REG,
1423 		.mask = PMX_PL_6_7_MASK,
1424 		.val = PMX_UART4_PL_6_7_VAL,
1425 	}, {
1426 		.reg = IP_SEL_MIX_PAD_REG,
1427 		.mask = PMX_UART4_PORT_SEL_MASK,
1428 		.val = PMX_UART4_PORT_6_VAL,
1429 	},
1430 };
1431 
1432 static struct spear_muxreg uart4_ext_13_14_muxreg[] = {
1433 	{
1434 		.reg = PMX_CONFIG_REG,
1435 		.mask = PMX_MII_MASK,
1436 		.val = 0,
1437 	}, {
1438 		.reg = IP_SEL_PAD_10_19_REG,
1439 		.mask = PMX_PL_13_14_MASK,
1440 		.val = PMX_UART4_PL_13_14_VAL,
1441 	}, {
1442 		.reg = IP_SEL_MIX_PAD_REG,
1443 		.mask = PMX_UART4_PORT_SEL_MASK,
1444 		.val = PMX_UART4_PORT_13_VAL,
1445 	},
1446 };
1447 
1448 static struct spear_muxreg uart4_ext_39_40_muxreg[] = {
1449 	{
1450 		.reg = PMX_CONFIG_REG,
1451 		.mask = PMX_UART0_MODEM_MASK,
1452 		.val = 0,
1453 	}, {
1454 		.reg = IP_SEL_PAD_30_39_REG,
1455 		.mask = PMX_PL_39_MASK,
1456 		.val = PMX_UART4_PL_39_VAL,
1457 	}, {
1458 		.reg = IP_SEL_PAD_40_49_REG,
1459 		.mask = PMX_PL_40_MASK,
1460 		.val = PMX_UART4_PL_40_VAL,
1461 	}, {
1462 		.reg = IP_SEL_MIX_PAD_REG,
1463 		.mask = PMX_UART4_PORT_SEL_MASK,
1464 		.val = PMX_UART4_PORT_39_VAL,
1465 	},
1466 };
1467 
1468 static struct spear_muxreg uart4_ext_71_72_muxreg[] = {
1469 	{
1470 		.reg = IP_SEL_PAD_70_79_REG,
1471 		.mask = PMX_PL_71_72_MASK,
1472 		.val = PMX_UART4_PL_71_72_VAL,
1473 	}, {
1474 		.reg = IP_SEL_MIX_PAD_REG,
1475 		.mask = PMX_UART4_PORT_SEL_MASK,
1476 		.val = PMX_UART4_PORT_71_VAL,
1477 	},
1478 };
1479 
1480 static struct spear_muxreg uart4_ext_92_93_muxreg[] = {
1481 	{
1482 		.reg = IP_SEL_PAD_90_99_REG,
1483 		.mask = PMX_PL_92_93_MASK,
1484 		.val = PMX_UART4_PL_92_93_VAL,
1485 	}, {
1486 		.reg = IP_SEL_MIX_PAD_REG,
1487 		.mask = PMX_UART4_PORT_SEL_MASK,
1488 		.val = PMX_UART4_PORT_92_VAL,
1489 	},
1490 };
1491 
1492 static struct spear_muxreg uart4_ext_100_101_muxreg[] = {
1493 	{
1494 		.reg = IP_SEL_MIX_PAD_REG,
1495 		.mask = PMX_PL_100_101_MASK |
1496 			PMX_UART4_PORT_SEL_MASK,
1497 		.val = PMX_UART4_PL_100_101_VAL |
1498 			PMX_UART4_PORT_101_VAL,
1499 	},
1500 };
1501 
1502 static struct spear_modemux uart4_modemux[][1] = {
1503 	{
1504 		/* Select signals on pins 6_7 */
1505 		{
1506 			.modes = EXTENDED_MODE,
1507 			.muxregs = uart4_ext_6_7_muxreg,
1508 			.nmuxregs = ARRAY_SIZE(uart4_ext_6_7_muxreg),
1509 		},
1510 	}, {
1511 		/* Select signals on pins 13_14 */
1512 		{
1513 			.modes = EXTENDED_MODE,
1514 			.muxregs = uart4_ext_13_14_muxreg,
1515 			.nmuxregs = ARRAY_SIZE(uart4_ext_13_14_muxreg),
1516 		},
1517 	}, {
1518 		/* Select signals on pins 39_40 */
1519 		{
1520 			.modes = EXTENDED_MODE,
1521 			.muxregs = uart4_ext_39_40_muxreg,
1522 			.nmuxregs = ARRAY_SIZE(uart4_ext_39_40_muxreg),
1523 		},
1524 	}, {
1525 		/* Select signals on pins 71_72 */
1526 		{
1527 			.modes = EXTENDED_MODE,
1528 			.muxregs = uart4_ext_71_72_muxreg,
1529 			.nmuxregs = ARRAY_SIZE(uart4_ext_71_72_muxreg),
1530 		},
1531 	}, {
1532 		/* Select signals on pins 92_93 */
1533 		{
1534 			.modes = EXTENDED_MODE,
1535 			.muxregs = uart4_ext_92_93_muxreg,
1536 			.nmuxregs = ARRAY_SIZE(uart4_ext_92_93_muxreg),
1537 		},
1538 	}, {
1539 		/* Select signals on pins 100_101_ */
1540 		{
1541 			.modes = EXTENDED_MODE,
1542 			.muxregs = uart4_ext_100_101_muxreg,
1543 			.nmuxregs = ARRAY_SIZE(uart4_ext_100_101_muxreg),
1544 		},
1545 	},
1546 };
1547 
1548 static struct spear_pingroup uart4_pingroup[] = {
1549 	{
1550 		.name = "uart4_6_7_grp",
1551 		.pins = uart4_pins[0],
1552 		.npins = ARRAY_SIZE(uart4_pins[0]),
1553 		.modemuxs = uart4_modemux[0],
1554 		.nmodemuxs = ARRAY_SIZE(uart4_modemux[0]),
1555 	}, {
1556 		.name = "uart4_13_14_grp",
1557 		.pins = uart4_pins[1],
1558 		.npins = ARRAY_SIZE(uart4_pins[1]),
1559 		.modemuxs = uart4_modemux[1],
1560 		.nmodemuxs = ARRAY_SIZE(uart4_modemux[1]),
1561 	}, {
1562 		.name = "uart4_39_40_grp",
1563 		.pins = uart4_pins[2],
1564 		.npins = ARRAY_SIZE(uart4_pins[2]),
1565 		.modemuxs = uart4_modemux[2],
1566 		.nmodemuxs = ARRAY_SIZE(uart4_modemux[2]),
1567 	}, {
1568 		.name = "uart4_71_72_grp",
1569 		.pins = uart4_pins[3],
1570 		.npins = ARRAY_SIZE(uart4_pins[3]),
1571 		.modemuxs = uart4_modemux[3],
1572 		.nmodemuxs = ARRAY_SIZE(uart4_modemux[3]),
1573 	}, {
1574 		.name = "uart4_92_93_grp",
1575 		.pins = uart4_pins[4],
1576 		.npins = ARRAY_SIZE(uart4_pins[4]),
1577 		.modemuxs = uart4_modemux[4],
1578 		.nmodemuxs = ARRAY_SIZE(uart4_modemux[4]),
1579 	}, {
1580 		.name = "uart4_100_101_grp",
1581 		.pins = uart4_pins[5],
1582 		.npins = ARRAY_SIZE(uart4_pins[5]),
1583 		.modemuxs = uart4_modemux[5],
1584 		.nmodemuxs = ARRAY_SIZE(uart4_modemux[5]),
1585 	},
1586 };
1587 
1588 static const char *const uart4_grps[] = { "uart4_6_7_grp", "uart4_13_14_grp",
1589 	"uart4_39_40_grp", "uart4_71_72_grp", "uart4_92_93_grp",
1590 	"uart4_100_101_grp" };
1591 
1592 static struct spear_function uart4_function = {
1593 	.name = "uart4",
1594 	.groups = uart4_grps,
1595 	.ngroups = ARRAY_SIZE(uart4_grps),
1596 };
1597 
1598 /* Pad multiplexing for uart5 device */
1599 static const unsigned uart5_pins[][2] = { { 4, 5 }, { 37, 38 }, { 69, 70 },
1600 	{ 90, 91 } };
1601 
1602 static struct spear_muxreg uart5_ext_4_5_muxreg[] = {
1603 	{
1604 		.reg = PMX_CONFIG_REG,
1605 		.mask = PMX_I2C_MASK,
1606 		.val = 0,
1607 	}, {
1608 		.reg = IP_SEL_PAD_0_9_REG,
1609 		.mask = PMX_PL_4_5_MASK,
1610 		.val = PMX_UART5_PL_4_5_VAL,
1611 	}, {
1612 		.reg = IP_SEL_MIX_PAD_REG,
1613 		.mask = PMX_UART5_PORT_SEL_MASK,
1614 		.val = PMX_UART5_PORT_4_VAL,
1615 	},
1616 };
1617 
1618 static struct spear_muxreg uart5_ext_37_38_muxreg[] = {
1619 	{
1620 		.reg = PMX_CONFIG_REG,
1621 		.mask = PMX_UART0_MODEM_MASK,
1622 		.val = 0,
1623 	}, {
1624 		.reg = IP_SEL_PAD_30_39_REG,
1625 		.mask = PMX_PL_37_38_MASK,
1626 		.val = PMX_UART5_PL_37_38_VAL,
1627 	}, {
1628 		.reg = IP_SEL_MIX_PAD_REG,
1629 		.mask = PMX_UART5_PORT_SEL_MASK,
1630 		.val = PMX_UART5_PORT_37_VAL,
1631 	},
1632 };
1633 
1634 static struct spear_muxreg uart5_ext_69_70_muxreg[] = {
1635 	{
1636 		.reg = IP_SEL_PAD_60_69_REG,
1637 		.mask = PMX_PL_69_MASK,
1638 		.val = PMX_UART5_PL_69_VAL,
1639 	}, {
1640 		.reg = IP_SEL_PAD_70_79_REG,
1641 		.mask = PMX_PL_70_MASK,
1642 		.val = PMX_UART5_PL_70_VAL,
1643 	}, {
1644 		.reg = IP_SEL_MIX_PAD_REG,
1645 		.mask = PMX_UART5_PORT_SEL_MASK,
1646 		.val = PMX_UART5_PORT_69_VAL,
1647 	},
1648 };
1649 
1650 static struct spear_muxreg uart5_ext_90_91_muxreg[] = {
1651 	{
1652 		.reg = IP_SEL_PAD_90_99_REG,
1653 		.mask = PMX_PL_90_91_MASK,
1654 		.val = PMX_UART5_PL_90_91_VAL,
1655 	}, {
1656 		.reg = IP_SEL_MIX_PAD_REG,
1657 		.mask = PMX_UART5_PORT_SEL_MASK,
1658 		.val = PMX_UART5_PORT_90_VAL,
1659 	},
1660 };
1661 
1662 static struct spear_modemux uart5_modemux[][1] = {
1663 	{
1664 		/* Select signals on pins 4_5 */
1665 		{
1666 			.modes = EXTENDED_MODE,
1667 			.muxregs = uart5_ext_4_5_muxreg,
1668 			.nmuxregs = ARRAY_SIZE(uart5_ext_4_5_muxreg),
1669 		},
1670 	}, {
1671 		/* Select signals on pins 37_38 */
1672 		{
1673 			.modes = EXTENDED_MODE,
1674 			.muxregs = uart5_ext_37_38_muxreg,
1675 			.nmuxregs = ARRAY_SIZE(uart5_ext_37_38_muxreg),
1676 		},
1677 	}, {
1678 		/* Select signals on pins 69_70 */
1679 		{
1680 			.modes = EXTENDED_MODE,
1681 			.muxregs = uart5_ext_69_70_muxreg,
1682 			.nmuxregs = ARRAY_SIZE(uart5_ext_69_70_muxreg),
1683 		},
1684 	}, {
1685 		/* Select signals on pins 90_91 */
1686 		{
1687 			.modes = EXTENDED_MODE,
1688 			.muxregs = uart5_ext_90_91_muxreg,
1689 			.nmuxregs = ARRAY_SIZE(uart5_ext_90_91_muxreg),
1690 		},
1691 	},
1692 };
1693 
1694 static struct spear_pingroup uart5_pingroup[] = {
1695 	{
1696 		.name = "uart5_4_5_grp",
1697 		.pins = uart5_pins[0],
1698 		.npins = ARRAY_SIZE(uart5_pins[0]),
1699 		.modemuxs = uart5_modemux[0],
1700 		.nmodemuxs = ARRAY_SIZE(uart5_modemux[0]),
1701 	}, {
1702 		.name = "uart5_37_38_grp",
1703 		.pins = uart5_pins[1],
1704 		.npins = ARRAY_SIZE(uart5_pins[1]),
1705 		.modemuxs = uart5_modemux[1],
1706 		.nmodemuxs = ARRAY_SIZE(uart5_modemux[1]),
1707 	}, {
1708 		.name = "uart5_69_70_grp",
1709 		.pins = uart5_pins[2],
1710 		.npins = ARRAY_SIZE(uart5_pins[2]),
1711 		.modemuxs = uart5_modemux[2],
1712 		.nmodemuxs = ARRAY_SIZE(uart5_modemux[2]),
1713 	}, {
1714 		.name = "uart5_90_91_grp",
1715 		.pins = uart5_pins[3],
1716 		.npins = ARRAY_SIZE(uart5_pins[3]),
1717 		.modemuxs = uart5_modemux[3],
1718 		.nmodemuxs = ARRAY_SIZE(uart5_modemux[3]),
1719 	},
1720 };
1721 
1722 static const char *const uart5_grps[] = { "uart5_4_5_grp", "uart5_37_38_grp",
1723 	"uart5_69_70_grp", "uart5_90_91_grp" };
1724 static struct spear_function uart5_function = {
1725 	.name = "uart5",
1726 	.groups = uart5_grps,
1727 	.ngroups = ARRAY_SIZE(uart5_grps),
1728 };
1729 
1730 /* Pad multiplexing for uart6 device */
1731 static const unsigned uart6_pins[][2] = { { 2, 3 }, { 88, 89 } };
1732 static struct spear_muxreg uart6_ext_2_3_muxreg[] = {
1733 	{
1734 		.reg = PMX_CONFIG_REG,
1735 		.mask = PMX_UART0_MASK,
1736 		.val = 0,
1737 	}, {
1738 		.reg = IP_SEL_PAD_0_9_REG,
1739 		.mask = PMX_PL_2_3_MASK,
1740 		.val = PMX_UART6_PL_2_3_VAL,
1741 	}, {
1742 		.reg = IP_SEL_MIX_PAD_REG,
1743 		.mask = PMX_UART6_PORT_SEL_MASK,
1744 		.val = PMX_UART6_PORT_2_VAL,
1745 	},
1746 };
1747 
1748 static struct spear_muxreg uart6_ext_88_89_muxreg[] = {
1749 	{
1750 		.reg = IP_SEL_PAD_80_89_REG,
1751 		.mask = PMX_PL_88_89_MASK,
1752 		.val = PMX_UART6_PL_88_89_VAL,
1753 	}, {
1754 		.reg = IP_SEL_MIX_PAD_REG,
1755 		.mask = PMX_UART6_PORT_SEL_MASK,
1756 		.val = PMX_UART6_PORT_88_VAL,
1757 	},
1758 };
1759 
1760 static struct spear_modemux uart6_modemux[][1] = {
1761 	{
1762 		/* Select signals on pins 2_3 */
1763 		{
1764 			.modes = EXTENDED_MODE,
1765 			.muxregs = uart6_ext_2_3_muxreg,
1766 			.nmuxregs = ARRAY_SIZE(uart6_ext_2_3_muxreg),
1767 		},
1768 	}, {
1769 		/* Select signals on pins 88_89 */
1770 		{
1771 			.modes = EXTENDED_MODE,
1772 			.muxregs = uart6_ext_88_89_muxreg,
1773 			.nmuxregs = ARRAY_SIZE(uart6_ext_88_89_muxreg),
1774 		},
1775 	},
1776 };
1777 
1778 static struct spear_pingroup uart6_pingroup[] = {
1779 	{
1780 		.name = "uart6_2_3_grp",
1781 		.pins = uart6_pins[0],
1782 		.npins = ARRAY_SIZE(uart6_pins[0]),
1783 		.modemuxs = uart6_modemux[0],
1784 		.nmodemuxs = ARRAY_SIZE(uart6_modemux[0]),
1785 	}, {
1786 		.name = "uart6_88_89_grp",
1787 		.pins = uart6_pins[1],
1788 		.npins = ARRAY_SIZE(uart6_pins[1]),
1789 		.modemuxs = uart6_modemux[1],
1790 		.nmodemuxs = ARRAY_SIZE(uart6_modemux[1]),
1791 	},
1792 };
1793 
1794 static const char *const uart6_grps[] = { "uart6_2_3_grp", "uart6_88_89_grp" };
1795 static struct spear_function uart6_function = {
1796 	.name = "uart6",
1797 	.groups = uart6_grps,
1798 	.ngroups = ARRAY_SIZE(uart6_grps),
1799 };
1800 
1801 /* UART - RS485 pmx */
1802 static const unsigned rs485_pins[] = { 77, 78, 79 };
1803 static struct spear_muxreg rs485_muxreg[] = {
1804 	{
1805 		.reg = IP_SEL_PAD_70_79_REG,
1806 		.mask = PMX_PL_77_78_79_MASK,
1807 		.val = PMX_RS485_PL_77_78_79_VAL,
1808 	},
1809 };
1810 
1811 static struct spear_modemux rs485_modemux[] = {
1812 	{
1813 		.modes = EXTENDED_MODE,
1814 		.muxregs = rs485_muxreg,
1815 		.nmuxregs = ARRAY_SIZE(rs485_muxreg),
1816 	},
1817 };
1818 
1819 static struct spear_pingroup rs485_pingroup = {
1820 	.name = "rs485_grp",
1821 	.pins = rs485_pins,
1822 	.npins = ARRAY_SIZE(rs485_pins),
1823 	.modemuxs = rs485_modemux,
1824 	.nmodemuxs = ARRAY_SIZE(rs485_modemux),
1825 };
1826 
1827 static const char *const rs485_grps[] = { "rs485_grp" };
1828 static struct spear_function rs485_function = {
1829 	.name = "rs485",
1830 	.groups = rs485_grps,
1831 	.ngroups = ARRAY_SIZE(rs485_grps),
1832 };
1833 
1834 /* Pad multiplexing for Touchscreen device */
1835 static const unsigned touchscreen_pins[] = { 5, 36 };
1836 static struct spear_muxreg touchscreen_muxreg[] = {
1837 	{
1838 		.reg = PMX_CONFIG_REG,
1839 		.mask = PMX_I2C_MASK | PMX_SSP_CS_MASK,
1840 		.val = 0,
1841 	},
1842 };
1843 
1844 static struct spear_muxreg touchscreen_ext_muxreg[] = {
1845 	{
1846 		.reg = IP_SEL_PAD_0_9_REG,
1847 		.mask = PMX_PL_5_MASK,
1848 		.val = PMX_TOUCH_Y_PL_5_VAL,
1849 	}, {
1850 		.reg = IP_SEL_PAD_30_39_REG,
1851 		.mask = PMX_PL_36_MASK,
1852 		.val = PMX_TOUCH_X_PL_36_VAL,
1853 	},
1854 };
1855 
1856 static struct spear_modemux touchscreen_modemux[] = {
1857 	{
1858 		.modes = AUTO_NET_SMII_MODE | EXTENDED_MODE,
1859 		.muxregs = touchscreen_muxreg,
1860 		.nmuxregs = ARRAY_SIZE(touchscreen_muxreg),
1861 	}, {
1862 		.modes = EXTENDED_MODE,
1863 		.muxregs = touchscreen_ext_muxreg,
1864 		.nmuxregs = ARRAY_SIZE(touchscreen_ext_muxreg),
1865 	},
1866 };
1867 
1868 static struct spear_pingroup touchscreen_pingroup = {
1869 	.name = "touchscreen_grp",
1870 	.pins = touchscreen_pins,
1871 	.npins = ARRAY_SIZE(touchscreen_pins),
1872 	.modemuxs = touchscreen_modemux,
1873 	.nmodemuxs = ARRAY_SIZE(touchscreen_modemux),
1874 };
1875 
1876 static const char *const touchscreen_grps[] = { "touchscreen_grp" };
1877 static struct spear_function touchscreen_function = {
1878 	.name = "touchscreen",
1879 	.groups = touchscreen_grps,
1880 	.ngroups = ARRAY_SIZE(touchscreen_grps),
1881 };
1882 
1883 /* Pad multiplexing for CAN device */
1884 static const unsigned can0_pins[] = { 32, 33 };
1885 static struct spear_muxreg can0_muxreg[] = {
1886 	{
1887 		.reg = PMX_CONFIG_REG,
1888 		.mask = PMX_GPIO_PIN4_MASK | PMX_GPIO_PIN5_MASK,
1889 		.val = 0,
1890 	},
1891 };
1892 
1893 static struct spear_muxreg can0_ext_muxreg[] = {
1894 	{
1895 		.reg = IP_SEL_PAD_30_39_REG,
1896 		.mask = PMX_PL_32_33_MASK,
1897 		.val = PMX_CAN0_PL_32_33_VAL,
1898 	},
1899 };
1900 
1901 static struct spear_modemux can0_modemux[] = {
1902 	{
1903 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE
1904 			| EXTENDED_MODE,
1905 		.muxregs = can0_muxreg,
1906 		.nmuxregs = ARRAY_SIZE(can0_muxreg),
1907 	}, {
1908 		.modes = EXTENDED_MODE,
1909 		.muxregs = can0_ext_muxreg,
1910 		.nmuxregs = ARRAY_SIZE(can0_ext_muxreg),
1911 	},
1912 };
1913 
1914 static struct spear_pingroup can0_pingroup = {
1915 	.name = "can0_grp",
1916 	.pins = can0_pins,
1917 	.npins = ARRAY_SIZE(can0_pins),
1918 	.modemuxs = can0_modemux,
1919 	.nmodemuxs = ARRAY_SIZE(can0_modemux),
1920 };
1921 
1922 static const char *const can0_grps[] = { "can0_grp" };
1923 static struct spear_function can0_function = {
1924 	.name = "can0",
1925 	.groups = can0_grps,
1926 	.ngroups = ARRAY_SIZE(can0_grps),
1927 };
1928 
1929 static const unsigned can1_pins[] = { 30, 31 };
1930 static struct spear_muxreg can1_muxreg[] = {
1931 	{
1932 		.reg = PMX_CONFIG_REG,
1933 		.mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK,
1934 		.val = 0,
1935 	},
1936 };
1937 
1938 static struct spear_muxreg can1_ext_muxreg[] = {
1939 	{
1940 		.reg = IP_SEL_PAD_30_39_REG,
1941 		.mask = PMX_PL_30_31_MASK,
1942 		.val = PMX_CAN1_PL_30_31_VAL,
1943 	},
1944 };
1945 
1946 static struct spear_modemux can1_modemux[] = {
1947 	{
1948 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | AUTO_EXP_MODE
1949 			| EXTENDED_MODE,
1950 		.muxregs = can1_muxreg,
1951 		.nmuxregs = ARRAY_SIZE(can1_muxreg),
1952 	}, {
1953 		.modes = EXTENDED_MODE,
1954 		.muxregs = can1_ext_muxreg,
1955 		.nmuxregs = ARRAY_SIZE(can1_ext_muxreg),
1956 	},
1957 };
1958 
1959 static struct spear_pingroup can1_pingroup = {
1960 	.name = "can1_grp",
1961 	.pins = can1_pins,
1962 	.npins = ARRAY_SIZE(can1_pins),
1963 	.modemuxs = can1_modemux,
1964 	.nmodemuxs = ARRAY_SIZE(can1_modemux),
1965 };
1966 
1967 static const char *const can1_grps[] = { "can1_grp" };
1968 static struct spear_function can1_function = {
1969 	.name = "can1",
1970 	.groups = can1_grps,
1971 	.ngroups = ARRAY_SIZE(can1_grps),
1972 };
1973 
1974 /* Pad multiplexing for PWM0_1 device */
1975 static const unsigned pwm0_1_pins[][2] = { { 37, 38 }, { 14, 15 }, { 8, 9 },
1976 	{ 30, 31 }, { 42, 43 }, { 59, 60 }, { 88, 89 } };
1977 
1978 static struct spear_muxreg pwm0_1_pin_8_9_muxreg[] = {
1979 	{
1980 		.reg = PMX_CONFIG_REG,
1981 		.mask = PMX_SSP_MASK,
1982 		.val = 0,
1983 	}, {
1984 		.reg = IP_SEL_PAD_0_9_REG,
1985 		.mask = PMX_PL_8_9_MASK,
1986 		.val = PMX_PWM_0_1_PL_8_9_VAL,
1987 	},
1988 };
1989 
1990 static struct spear_muxreg pwm0_1_autoexpsmallpri_muxreg[] = {
1991 	{
1992 		.reg = PMX_CONFIG_REG,
1993 		.mask = PMX_MII_MASK,
1994 		.val = 0,
1995 	},
1996 };
1997 
1998 static struct spear_muxreg pwm0_1_pin_14_15_muxreg[] = {
1999 	{
2000 		.reg = IP_SEL_PAD_10_19_REG,
2001 		.mask = PMX_PL_14_MASK | PMX_PL_15_MASK,
2002 		.val = PMX_PWM1_PL_14_VAL | PMX_PWM0_PL_15_VAL,
2003 	},
2004 };
2005 
2006 static struct spear_muxreg pwm0_1_pin_30_31_muxreg[] = {
2007 	{
2008 		.reg = PMX_CONFIG_REG,
2009 		.mask = PMX_GPIO_PIN2_MASK | PMX_GPIO_PIN3_MASK,
2010 		.val = 0,
2011 	}, {
2012 		.reg = IP_SEL_PAD_30_39_REG,
2013 		.mask = PMX_PL_30_MASK | PMX_PL_31_MASK,
2014 		.val = PMX_PWM1_EXT_PL_30_VAL | PMX_PWM0_EXT_PL_31_VAL,
2015 	},
2016 };
2017 
2018 static struct spear_muxreg pwm0_1_net_muxreg[] = {
2019 	{
2020 		.reg = PMX_CONFIG_REG,
2021 		.mask = PMX_UART0_MODEM_MASK,
2022 		.val = 0,
2023 	},
2024 };
2025 
2026 static struct spear_muxreg pwm0_1_pin_37_38_muxreg[] = {
2027 	{
2028 		.reg = IP_SEL_PAD_30_39_REG,
2029 		.mask = PMX_PL_37_38_MASK,
2030 		.val = PMX_PWM0_1_PL_37_38_VAL,
2031 	},
2032 };
2033 
2034 static struct spear_muxreg pwm0_1_pin_42_43_muxreg[] = {
2035 	{
2036 		.reg = PMX_CONFIG_REG,
2037 		.mask = PMX_UART0_MODEM_MASK | PMX_TIMER_0_1_MASK ,
2038 		.val = 0,
2039 	}, {
2040 		.reg = IP_SEL_PAD_40_49_REG,
2041 		.mask = PMX_PL_42_MASK | PMX_PL_43_MASK,
2042 		.val = PMX_PWM1_PL_42_VAL |
2043 			PMX_PWM0_PL_43_VAL,
2044 	},
2045 };
2046 
2047 static struct spear_muxreg pwm0_1_pin_59_60_muxreg[] = {
2048 	{
2049 		.reg = IP_SEL_PAD_50_59_REG,
2050 		.mask = PMX_PL_59_MASK,
2051 		.val = PMX_PWM1_PL_59_VAL,
2052 	}, {
2053 		.reg = IP_SEL_PAD_60_69_REG,
2054 		.mask = PMX_PL_60_MASK,
2055 		.val = PMX_PWM0_PL_60_VAL,
2056 	},
2057 };
2058 
2059 static struct spear_muxreg pwm0_1_pin_88_89_muxreg[] = {
2060 	{
2061 		.reg = IP_SEL_PAD_80_89_REG,
2062 		.mask = PMX_PL_88_89_MASK,
2063 		.val = PMX_PWM0_1_PL_88_89_VAL,
2064 	},
2065 };
2066 
2067 static struct spear_modemux pwm0_1_pin_8_9_modemux[] = {
2068 	{
2069 		.modes = EXTENDED_MODE,
2070 		.muxregs = pwm0_1_pin_8_9_muxreg,
2071 		.nmuxregs = ARRAY_SIZE(pwm0_1_pin_8_9_muxreg),
2072 	},
2073 };
2074 
2075 static struct spear_modemux pwm0_1_pin_14_15_modemux[] = {
2076 	{
2077 		.modes = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | EXTENDED_MODE,
2078 		.muxregs = pwm0_1_autoexpsmallpri_muxreg,
2079 		.nmuxregs = ARRAY_SIZE(pwm0_1_autoexpsmallpri_muxreg),
2080 	}, {
2081 		.modes = EXTENDED_MODE,
2082 		.muxregs = pwm0_1_pin_14_15_muxreg,
2083 		.nmuxregs = ARRAY_SIZE(pwm0_1_pin_14_15_muxreg),
2084 	},
2085 };
2086 
2087 static struct spear_modemux pwm0_1_pin_30_31_modemux[] = {
2088 	{
2089 		.modes = EXTENDED_MODE,
2090 		.muxregs = pwm0_1_pin_30_31_muxreg,
2091 		.nmuxregs = ARRAY_SIZE(pwm0_1_pin_30_31_muxreg),
2092 	},
2093 };
2094 
2095 static struct spear_modemux pwm0_1_pin_37_38_modemux[] = {
2096 	{
2097 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | EXTENDED_MODE,
2098 		.muxregs = pwm0_1_net_muxreg,
2099 		.nmuxregs = ARRAY_SIZE(pwm0_1_net_muxreg),
2100 	}, {
2101 		.modes = EXTENDED_MODE,
2102 		.muxregs = pwm0_1_pin_37_38_muxreg,
2103 		.nmuxregs = ARRAY_SIZE(pwm0_1_pin_37_38_muxreg),
2104 	},
2105 };
2106 
2107 static struct spear_modemux pwm0_1_pin_42_43_modemux[] = {
2108 	{
2109 		.modes = EXTENDED_MODE,
2110 		.muxregs = pwm0_1_pin_42_43_muxreg,
2111 		.nmuxregs = ARRAY_SIZE(pwm0_1_pin_42_43_muxreg),
2112 	},
2113 };
2114 
2115 static struct spear_modemux pwm0_1_pin_59_60_modemux[] = {
2116 	{
2117 		.modes = EXTENDED_MODE,
2118 		.muxregs = pwm0_1_pin_59_60_muxreg,
2119 		.nmuxregs = ARRAY_SIZE(pwm0_1_pin_59_60_muxreg),
2120 	},
2121 };
2122 
2123 static struct spear_modemux pwm0_1_pin_88_89_modemux[] = {
2124 	{
2125 		.modes = EXTENDED_MODE,
2126 		.muxregs = pwm0_1_pin_88_89_muxreg,
2127 		.nmuxregs = ARRAY_SIZE(pwm0_1_pin_88_89_muxreg),
2128 	},
2129 };
2130 
2131 static struct spear_pingroup pwm0_1_pingroup[] = {
2132 	{
2133 		.name = "pwm0_1_pin_8_9_grp",
2134 		.pins = pwm0_1_pins[0],
2135 		.npins = ARRAY_SIZE(pwm0_1_pins[0]),
2136 		.modemuxs = pwm0_1_pin_8_9_modemux,
2137 		.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_8_9_modemux),
2138 	}, {
2139 		.name = "pwm0_1_pin_14_15_grp",
2140 		.pins = pwm0_1_pins[1],
2141 		.npins = ARRAY_SIZE(pwm0_1_pins[1]),
2142 		.modemuxs = pwm0_1_pin_14_15_modemux,
2143 		.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_14_15_modemux),
2144 	}, {
2145 		.name = "pwm0_1_pin_30_31_grp",
2146 		.pins = pwm0_1_pins[2],
2147 		.npins = ARRAY_SIZE(pwm0_1_pins[2]),
2148 		.modemuxs = pwm0_1_pin_30_31_modemux,
2149 		.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_30_31_modemux),
2150 	}, {
2151 		.name = "pwm0_1_pin_37_38_grp",
2152 		.pins = pwm0_1_pins[3],
2153 		.npins = ARRAY_SIZE(pwm0_1_pins[3]),
2154 		.modemuxs = pwm0_1_pin_37_38_modemux,
2155 		.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_37_38_modemux),
2156 	}, {
2157 		.name = "pwm0_1_pin_42_43_grp",
2158 		.pins = pwm0_1_pins[4],
2159 		.npins = ARRAY_SIZE(pwm0_1_pins[4]),
2160 		.modemuxs = pwm0_1_pin_42_43_modemux,
2161 		.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_42_43_modemux),
2162 	}, {
2163 		.name = "pwm0_1_pin_59_60_grp",
2164 		.pins = pwm0_1_pins[5],
2165 		.npins = ARRAY_SIZE(pwm0_1_pins[5]),
2166 		.modemuxs = pwm0_1_pin_59_60_modemux,
2167 		.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_59_60_modemux),
2168 	}, {
2169 		.name = "pwm0_1_pin_88_89_grp",
2170 		.pins = pwm0_1_pins[6],
2171 		.npins = ARRAY_SIZE(pwm0_1_pins[6]),
2172 		.modemuxs = pwm0_1_pin_88_89_modemux,
2173 		.nmodemuxs = ARRAY_SIZE(pwm0_1_pin_88_89_modemux),
2174 	},
2175 };
2176 
2177 static const char *const pwm0_1_grps[] = { "pwm0_1_pin_8_9_grp",
2178 	"pwm0_1_pin_14_15_grp", "pwm0_1_pin_30_31_grp", "pwm0_1_pin_37_38_grp",
2179 	"pwm0_1_pin_42_43_grp", "pwm0_1_pin_59_60_grp", "pwm0_1_pin_88_89_grp"
2180 };
2181 
2182 static struct spear_function pwm0_1_function = {
2183 	.name = "pwm0_1",
2184 	.groups = pwm0_1_grps,
2185 	.ngroups = ARRAY_SIZE(pwm0_1_grps),
2186 };
2187 
2188 /* Pad multiplexing for PWM2 device */
2189 static const unsigned pwm2_pins[][1] = { { 7 }, { 13 }, { 29 }, { 34 }, { 41 },
2190 	{ 58 }, { 87 } };
2191 static struct spear_muxreg pwm2_net_muxreg[] = {
2192 	{
2193 		.reg = PMX_CONFIG_REG,
2194 		.mask = PMX_SSP_CS_MASK,
2195 		.val = 0,
2196 	},
2197 };
2198 
2199 static struct spear_muxreg pwm2_pin_7_muxreg[] = {
2200 	{
2201 		.reg = IP_SEL_PAD_0_9_REG,
2202 		.mask = PMX_PL_7_MASK,
2203 		.val = PMX_PWM_2_PL_7_VAL,
2204 	},
2205 };
2206 
2207 static struct spear_muxreg pwm2_autoexpsmallpri_muxreg[] = {
2208 	{
2209 		.reg = PMX_CONFIG_REG,
2210 		.mask = PMX_MII_MASK,
2211 		.val = 0,
2212 	},
2213 };
2214 
2215 static struct spear_muxreg pwm2_pin_13_muxreg[] = {
2216 	{
2217 		.reg = IP_SEL_PAD_10_19_REG,
2218 		.mask = PMX_PL_13_MASK,
2219 		.val = PMX_PWM2_PL_13_VAL,
2220 	},
2221 };
2222 
2223 static struct spear_muxreg pwm2_pin_29_muxreg[] = {
2224 	{
2225 		.reg = PMX_CONFIG_REG,
2226 		.mask = PMX_GPIO_PIN1_MASK,
2227 		.val = 0,
2228 	}, {
2229 		.reg = IP_SEL_PAD_20_29_REG,
2230 		.mask = PMX_PL_29_MASK,
2231 		.val = PMX_PWM_2_PL_29_VAL,
2232 	},
2233 };
2234 
2235 static struct spear_muxreg pwm2_pin_34_muxreg[] = {
2236 	{
2237 		.reg = PMX_CONFIG_REG,
2238 		.mask = PMX_SSP_CS_MASK,
2239 		.val = 0,
2240 	}, {
2241 		.reg = MODE_CONFIG_REG,
2242 		.mask = PMX_PWM_MASK,
2243 		.val = PMX_PWM_MASK,
2244 	}, {
2245 		.reg = IP_SEL_PAD_30_39_REG,
2246 		.mask = PMX_PL_34_MASK,
2247 		.val = PMX_PWM2_PL_34_VAL,
2248 	},
2249 };
2250 
2251 static struct spear_muxreg pwm2_pin_41_muxreg[] = {
2252 	{
2253 		.reg = PMX_CONFIG_REG,
2254 		.mask = PMX_UART0_MODEM_MASK,
2255 		.val = 0,
2256 	}, {
2257 		.reg = IP_SEL_PAD_40_49_REG,
2258 		.mask = PMX_PL_41_MASK,
2259 		.val = PMX_PWM2_PL_41_VAL,
2260 	},
2261 };
2262 
2263 static struct spear_muxreg pwm2_pin_58_muxreg[] = {
2264 	{
2265 		.reg = IP_SEL_PAD_50_59_REG,
2266 		.mask = PMX_PL_58_MASK,
2267 		.val = PMX_PWM2_PL_58_VAL,
2268 	},
2269 };
2270 
2271 static struct spear_muxreg pwm2_pin_87_muxreg[] = {
2272 	{
2273 		.reg = IP_SEL_PAD_80_89_REG,
2274 		.mask = PMX_PL_87_MASK,
2275 		.val = PMX_PWM2_PL_87_VAL,
2276 	},
2277 };
2278 
2279 static struct spear_modemux pwm2_pin_7_modemux[] = {
2280 	{
2281 		.modes = AUTO_NET_SMII_MODE | AUTO_NET_MII_MODE | EXTENDED_MODE,
2282 		.muxregs = pwm2_net_muxreg,
2283 		.nmuxregs = ARRAY_SIZE(pwm2_net_muxreg),
2284 	}, {
2285 		.modes = EXTENDED_MODE,
2286 		.muxregs = pwm2_pin_7_muxreg,
2287 		.nmuxregs = ARRAY_SIZE(pwm2_pin_7_muxreg),
2288 	},
2289 };
2290 static struct spear_modemux pwm2_pin_13_modemux[] = {
2291 	{
2292 		.modes = AUTO_EXP_MODE | SMALL_PRINTERS_MODE | EXTENDED_MODE,
2293 		.muxregs = pwm2_autoexpsmallpri_muxreg,
2294 		.nmuxregs = ARRAY_SIZE(pwm2_autoexpsmallpri_muxreg),
2295 	}, {
2296 		.modes = EXTENDED_MODE,
2297 		.muxregs = pwm2_pin_13_muxreg,
2298 		.nmuxregs = ARRAY_SIZE(pwm2_pin_13_muxreg),
2299 	},
2300 };
2301 static struct spear_modemux pwm2_pin_29_modemux[] = {
2302 	{
2303 		.modes = EXTENDED_MODE,
2304 		.muxregs = pwm2_pin_29_muxreg,
2305 		.nmuxregs = ARRAY_SIZE(pwm2_pin_29_muxreg),
2306 	},
2307 };
2308 static struct spear_modemux pwm2_pin_34_modemux[] = {
2309 	{
2310 		.modes = EXTENDED_MODE,
2311 		.muxregs = pwm2_pin_34_muxreg,
2312 		.nmuxregs = ARRAY_SIZE(pwm2_pin_34_muxreg),
2313 	},
2314 };
2315 
2316 static struct spear_modemux pwm2_pin_41_modemux[] = {
2317 	{
2318 		.modes = EXTENDED_MODE,
2319 		.muxregs = pwm2_pin_41_muxreg,
2320 		.nmuxregs = ARRAY_SIZE(pwm2_pin_41_muxreg),
2321 	},
2322 };
2323 
2324 static struct spear_modemux pwm2_pin_58_modemux[] = {
2325 	{
2326 		.modes = EXTENDED_MODE,
2327 		.muxregs = pwm2_pin_58_muxreg,
2328 		.nmuxregs = ARRAY_SIZE(pwm2_pin_58_muxreg),
2329 	},
2330 };
2331 
2332 static struct spear_modemux pwm2_pin_87_modemux[] = {
2333 	{
2334 		.modes = EXTENDED_MODE,
2335 		.muxregs = pwm2_pin_87_muxreg,
2336 		.nmuxregs = ARRAY_SIZE(pwm2_pin_87_muxreg),
2337 	},
2338 };
2339 
2340 static struct spear_pingroup pwm2_pingroup[] = {
2341 	{
2342 		.name = "pwm2_pin_7_grp",
2343 		.pins = pwm2_pins[0],
2344 		.npins = ARRAY_SIZE(pwm2_pins[0]),
2345 		.modemuxs = pwm2_pin_7_modemux,
2346 		.nmodemuxs = ARRAY_SIZE(pwm2_pin_7_modemux),
2347 	}, {
2348 		.name = "pwm2_pin_13_grp",
2349 		.pins = pwm2_pins[1],
2350 		.npins = ARRAY_SIZE(pwm2_pins[1]),
2351 		.modemuxs = pwm2_pin_13_modemux,
2352 		.nmodemuxs = ARRAY_SIZE(pwm2_pin_13_modemux),
2353 	}, {
2354 		.name = "pwm2_pin_29_grp",
2355 		.pins = pwm2_pins[2],
2356 		.npins = ARRAY_SIZE(pwm2_pins[2]),
2357 		.modemuxs = pwm2_pin_29_modemux,
2358 		.nmodemuxs = ARRAY_SIZE(pwm2_pin_29_modemux),
2359 	}, {
2360 		.name = "pwm2_pin_34_grp",
2361 		.pins = pwm2_pins[3],
2362 		.npins = ARRAY_SIZE(pwm2_pins[3]),
2363 		.modemuxs = pwm2_pin_34_modemux,
2364 		.nmodemuxs = ARRAY_SIZE(pwm2_pin_34_modemux),
2365 	}, {
2366 		.name = "pwm2_pin_41_grp",
2367 		.pins = pwm2_pins[4],
2368 		.npins = ARRAY_SIZE(pwm2_pins[4]),
2369 		.modemuxs = pwm2_pin_41_modemux,
2370 		.nmodemuxs = ARRAY_SIZE(pwm2_pin_41_modemux),
2371 	}, {
2372 		.name = "pwm2_pin_58_grp",
2373 		.pins = pwm2_pins[5],
2374 		.npins = ARRAY_SIZE(pwm2_pins[5]),
2375 		.modemuxs = pwm2_pin_58_modemux,
2376 		.nmodemuxs = ARRAY_SIZE(pwm2_pin_58_modemux),
2377 	}, {
2378 		.name = "pwm2_pin_87_grp",
2379 		.pins = pwm2_pins[6],
2380 		.npins = ARRAY_SIZE(pwm2_pins[6]),
2381 		.modemuxs = pwm2_pin_87_modemux,
2382 		.nmodemuxs = ARRAY_SIZE(pwm2_pin_87_modemux),
2383 	},
2384 };
2385 
2386 static const char *const pwm2_grps[] = { "pwm2_pin_7_grp", "pwm2_pin_13_grp",
2387 	"pwm2_pin_29_grp", "pwm2_pin_34_grp", "pwm2_pin_41_grp",
2388 	"pwm2_pin_58_grp", "pwm2_pin_87_grp" };
2389 static struct spear_function pwm2_function = {
2390 	.name = "pwm2",
2391 	.groups = pwm2_grps,
2392 	.ngroups = ARRAY_SIZE(pwm2_grps),
2393 };
2394 
2395 /* Pad multiplexing for PWM3 device */
2396 static const unsigned pwm3_pins[][1] = { { 6 }, { 12 }, { 28 }, { 40 }, { 57 },
2397 	{ 86 } };
2398 static struct spear_muxreg pwm3_pin_6_muxreg[] = {
2399 	{
2400 		.reg = PMX_CONFIG_REG,
2401 		.mask = PMX_SSP_MASK,
2402 		.val = 0,
2403 	}, {
2404 		.reg = IP_SEL_PAD_0_9_REG,
2405 		.mask = PMX_PL_6_MASK,
2406 		.val = PMX_PWM_3_PL_6_VAL,
2407 	},
2408 };
2409 
2410 static struct spear_muxreg pwm3_muxreg[] = {
2411 	{
2412 		.reg = PMX_CONFIG_REG,
2413 		.mask = PMX_MII_MASK,
2414 		.val = 0,
2415 	},
2416 };
2417 
2418 static struct spear_muxreg pwm3_pin_12_muxreg[] = {
2419 	{
2420 		.reg = IP_SEL_PAD_10_19_REG,
2421 		.mask = PMX_PL_12_MASK,
2422 		.val = PMX_PWM3_PL_12_VAL,
2423 	},
2424 };
2425 
2426 static struct spear_muxreg pwm3_pin_28_muxreg[] = {
2427 	{
2428 		.reg = PMX_CONFIG_REG,
2429 		.mask = PMX_GPIO_PIN0_MASK,
2430 		.val = 0,
2431 	}, {
2432 		.reg = IP_SEL_PAD_20_29_REG,
2433 		.mask = PMX_PL_28_MASK,
2434 		.val = PMX_PWM_3_PL_28_VAL,
2435 	},
2436 };
2437 
2438 static struct spear_muxreg pwm3_pin_40_muxreg[] = {
2439 	{
2440 		.reg = PMX_CONFIG_REG,
2441 		.mask = PMX_UART0_MODEM_MASK,
2442 		.val = 0,
2443 	}, {
2444 		.reg = IP_SEL_PAD_40_49_REG,
2445 		.mask = PMX_PL_40_MASK,
2446 		.val = PMX_PWM3_PL_40_VAL,
2447 	},
2448 };
2449 
2450 static struct spear_muxreg pwm3_pin_57_muxreg[] = {
2451 	{
2452 		.reg = IP_SEL_PAD_50_59_REG,
2453 		.mask = PMX_PL_57_MASK,
2454 		.val = PMX_PWM3_PL_57_VAL,
2455 	},
2456 };
2457 
2458 static struct spear_muxreg pwm3_pin_86_muxreg[] = {
2459 	{
2460 		.reg = IP_SEL_PAD_80_89_REG,
2461 		.mask = PMX_PL_86_MASK,
2462 		.val = PMX_PWM3_PL_86_VAL,
2463 	},
2464 };
2465 
2466 static struct spear_modemux pwm3_pin_6_modemux[] = {
2467 	{
2468 		.modes = EXTENDED_MODE,
2469 		.muxregs = pwm3_pin_6_muxreg,
2470 		.nmuxregs = ARRAY_SIZE(pwm3_pin_6_muxreg),
2471 	},
2472 };
2473 
2474 static struct spear_modemux pwm3_pin_12_modemux[] = {
2475 	{
2476 		.modes = AUTO_EXP_MODE | SMALL_PRINTERS_MODE |
2477 			AUTO_NET_SMII_MODE | EXTENDED_MODE,
2478 		.muxregs = pwm3_muxreg,
2479 		.nmuxregs = ARRAY_SIZE(pwm3_muxreg),
2480 	}, {
2481 		.modes = EXTENDED_MODE,
2482 		.muxregs = pwm3_pin_12_muxreg,
2483 		.nmuxregs = ARRAY_SIZE(pwm3_pin_12_muxreg),
2484 	},
2485 };
2486 
2487 static struct spear_modemux pwm3_pin_28_modemux[] = {
2488 	{
2489 		.modes = EXTENDED_MODE,
2490 		.muxregs = pwm3_pin_28_muxreg,
2491 		.nmuxregs = ARRAY_SIZE(pwm3_pin_28_muxreg),
2492 	},
2493 };
2494 
2495 static struct spear_modemux pwm3_pin_40_modemux[] = {
2496 	{
2497 		.modes = EXTENDED_MODE,
2498 		.muxregs = pwm3_pin_40_muxreg,
2499 		.nmuxregs = ARRAY_SIZE(pwm3_pin_40_muxreg),
2500 	},
2501 };
2502 
2503 static struct spear_modemux pwm3_pin_57_modemux[] = {
2504 	{
2505 		.modes = EXTENDED_MODE,
2506 		.muxregs = pwm3_pin_57_muxreg,
2507 		.nmuxregs = ARRAY_SIZE(pwm3_pin_57_muxreg),
2508 	},
2509 };
2510 
2511 static struct spear_modemux pwm3_pin_86_modemux[] = {
2512 	{
2513 		.modes = EXTENDED_MODE,
2514 		.muxregs = pwm3_pin_86_muxreg,
2515 		.nmuxregs = ARRAY_SIZE(pwm3_pin_86_muxreg),
2516 	},
2517 };
2518 
2519 static struct spear_pingroup pwm3_pingroup[] = {
2520 	{
2521 		.name = "pwm3_pin_6_grp",
2522 		.pins = pwm3_pins[0],
2523 		.npins = ARRAY_SIZE(pwm3_pins[0]),
2524 		.modemuxs = pwm3_pin_6_modemux,
2525 		.nmodemuxs = ARRAY_SIZE(pwm3_pin_6_modemux),
2526 	}, {
2527 		.name = "pwm3_pin_12_grp",
2528 		.pins = pwm3_pins[1],
2529 		.npins = ARRAY_SIZE(pwm3_pins[1]),
2530 		.modemuxs = pwm3_pin_12_modemux,
2531 		.nmodemuxs = ARRAY_SIZE(pwm3_pin_12_modemux),
2532 	}, {
2533 		.name = "pwm3_pin_28_grp",
2534 		.pins = pwm3_pins[2],
2535 		.npins = ARRAY_SIZE(pwm3_pins[2]),
2536 		.modemuxs = pwm3_pin_28_modemux,
2537 		.nmodemuxs = ARRAY_SIZE(pwm3_pin_28_modemux),
2538 	}, {
2539 		.name = "pwm3_pin_40_grp",
2540 		.pins = pwm3_pins[3],
2541 		.npins = ARRAY_SIZE(pwm3_pins[3]),
2542 		.modemuxs = pwm3_pin_40_modemux,
2543 		.nmodemuxs = ARRAY_SIZE(pwm3_pin_40_modemux),
2544 	}, {
2545 		.name = "pwm3_pin_57_grp",
2546 		.pins = pwm3_pins[4],
2547 		.npins = ARRAY_SIZE(pwm3_pins[4]),
2548 		.modemuxs = pwm3_pin_57_modemux,
2549 		.nmodemuxs = ARRAY_SIZE(pwm3_pin_57_modemux),
2550 	}, {
2551 		.name = "pwm3_pin_86_grp",
2552 		.pins = pwm3_pins[5],
2553 		.npins = ARRAY_SIZE(pwm3_pins[5]),
2554 		.modemuxs = pwm3_pin_86_modemux,
2555 		.nmodemuxs = ARRAY_SIZE(pwm3_pin_86_modemux),
2556 	},
2557 };
2558 
2559 static const char *const pwm3_grps[] = { "pwm3_pin_6_grp", "pwm3_pin_12_grp",
2560 	"pwm3_pin_28_grp", "pwm3_pin_40_grp", "pwm3_pin_57_grp",
2561 	"pwm3_pin_86_grp" };
2562 static struct spear_function pwm3_function = {
2563 	.name = "pwm3",
2564 	.groups = pwm3_grps,
2565 	.ngroups = ARRAY_SIZE(pwm3_grps),
2566 };
2567 
2568 /* Pad multiplexing for SSP1 device */
2569 static const unsigned ssp1_pins[][2] = { { 17, 20 }, { 36, 39 }, { 48, 51 },
2570 	{ 65, 68 }, { 94, 97 } };
2571 static struct spear_muxreg ssp1_muxreg[] = {
2572 	{
2573 		.reg = PMX_CONFIG_REG,
2574 		.mask = PMX_MII_MASK,
2575 		.val = 0,
2576 	},
2577 };
2578 
2579 static struct spear_muxreg ssp1_ext_17_20_muxreg[] = {
2580 	{
2581 		.reg = IP_SEL_PAD_10_19_REG,
2582 		.mask = PMX_PL_17_18_MASK | PMX_PL_19_MASK,
2583 		.val = PMX_SSP1_PL_17_18_19_20_VAL,
2584 	}, {
2585 		.reg = IP_SEL_PAD_20_29_REG,
2586 		.mask = PMX_PL_20_MASK,
2587 		.val = PMX_SSP1_PL_17_18_19_20_VAL,
2588 	}, {
2589 		.reg = IP_SEL_MIX_PAD_REG,
2590 		.mask = PMX_SSP1_PORT_SEL_MASK,
2591 		.val = PMX_SSP1_PORT_17_TO_20_VAL,
2592 	},
2593 };
2594 
2595 static struct spear_muxreg ssp1_ext_36_39_muxreg[] = {
2596 	{
2597 		.reg = PMX_CONFIG_REG,
2598 		.mask = PMX_UART0_MODEM_MASK | PMX_SSP_CS_MASK,
2599 		.val = 0,
2600 	}, {
2601 		.reg = IP_SEL_PAD_30_39_REG,
2602 		.mask = PMX_PL_36_MASK | PMX_PL_37_38_MASK | PMX_PL_39_MASK,
2603 		.val = PMX_SSP1_PL_36_VAL | PMX_SSP1_PL_37_38_VAL |
2604 			PMX_SSP1_PL_39_VAL,
2605 	}, {
2606 		.reg = IP_SEL_MIX_PAD_REG,
2607 		.mask = PMX_SSP1_PORT_SEL_MASK,
2608 		.val = PMX_SSP1_PORT_36_TO_39_VAL,
2609 	},
2610 };
2611 
2612 static struct spear_muxreg ssp1_ext_48_51_muxreg[] = {
2613 	{
2614 		.reg = PMX_CONFIG_REG,
2615 		.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
2616 		.val = 0,
2617 	}, {
2618 		.reg = IP_SEL_PAD_40_49_REG,
2619 		.mask = PMX_PL_48_49_MASK,
2620 		.val = PMX_SSP1_PL_48_49_VAL,
2621 	}, {
2622 		.reg = IP_SEL_PAD_50_59_REG,
2623 		.mask = PMX_PL_50_51_MASK,
2624 		.val = PMX_SSP1_PL_50_51_VAL,
2625 	}, {
2626 		.reg = IP_SEL_MIX_PAD_REG,
2627 		.mask = PMX_SSP1_PORT_SEL_MASK,
2628 		.val = PMX_SSP1_PORT_48_TO_51_VAL,
2629 	},
2630 };
2631 
2632 static struct spear_muxreg ssp1_ext_65_68_muxreg[] = {
2633 	{
2634 		.reg = IP_SEL_PAD_60_69_REG,
2635 		.mask = PMX_PL_65_TO_68_MASK,
2636 		.val = PMX_SSP1_PL_65_TO_68_VAL,
2637 	}, {
2638 		.reg = IP_SEL_MIX_PAD_REG,
2639 		.mask = PMX_SSP1_PORT_SEL_MASK,
2640 		.val = PMX_SSP1_PORT_65_TO_68_VAL,
2641 	},
2642 };
2643 
2644 static struct spear_muxreg ssp1_ext_94_97_muxreg[] = {
2645 	{
2646 		.reg = IP_SEL_PAD_90_99_REG,
2647 		.mask = PMX_PL_94_95_MASK | PMX_PL_96_97_MASK,
2648 		.val = PMX_SSP1_PL_94_95_VAL | PMX_SSP1_PL_96_97_VAL,
2649 	}, {
2650 		.reg = IP_SEL_MIX_PAD_REG,
2651 		.mask = PMX_SSP1_PORT_SEL_MASK,
2652 		.val = PMX_SSP1_PORT_94_TO_97_VAL,
2653 	},
2654 };
2655 
2656 static struct spear_modemux ssp1_17_20_modemux[] = {
2657 	{
2658 		.modes = SMALL_PRINTERS_MODE | AUTO_NET_SMII_MODE |
2659 			EXTENDED_MODE,
2660 		.muxregs = ssp1_muxreg,
2661 		.nmuxregs = ARRAY_SIZE(ssp1_muxreg),
2662 	}, {
2663 		.modes = EXTENDED_MODE,
2664 		.muxregs = ssp1_ext_17_20_muxreg,
2665 		.nmuxregs = ARRAY_SIZE(ssp1_ext_17_20_muxreg),
2666 	},
2667 };
2668 
2669 static struct spear_modemux ssp1_36_39_modemux[] = {
2670 	{
2671 		.modes = EXTENDED_MODE,
2672 		.muxregs = ssp1_ext_36_39_muxreg,
2673 		.nmuxregs = ARRAY_SIZE(ssp1_ext_36_39_muxreg),
2674 	},
2675 };
2676 
2677 static struct spear_modemux ssp1_48_51_modemux[] = {
2678 	{
2679 		.modes = EXTENDED_MODE,
2680 		.muxregs = ssp1_ext_48_51_muxreg,
2681 		.nmuxregs = ARRAY_SIZE(ssp1_ext_48_51_muxreg),
2682 	},
2683 };
2684 static struct spear_modemux ssp1_65_68_modemux[] = {
2685 	{
2686 		.modes = EXTENDED_MODE,
2687 		.muxregs = ssp1_ext_65_68_muxreg,
2688 		.nmuxregs = ARRAY_SIZE(ssp1_ext_65_68_muxreg),
2689 	},
2690 };
2691 
2692 static struct spear_modemux ssp1_94_97_modemux[] = {
2693 	{
2694 		.modes = EXTENDED_MODE,
2695 		.muxregs = ssp1_ext_94_97_muxreg,
2696 		.nmuxregs = ARRAY_SIZE(ssp1_ext_94_97_muxreg),
2697 	},
2698 };
2699 
2700 static struct spear_pingroup ssp1_pingroup[] = {
2701 	{
2702 		.name = "ssp1_17_20_grp",
2703 		.pins = ssp1_pins[0],
2704 		.npins = ARRAY_SIZE(ssp1_pins[0]),
2705 		.modemuxs = ssp1_17_20_modemux,
2706 		.nmodemuxs = ARRAY_SIZE(ssp1_17_20_modemux),
2707 	}, {
2708 		.name = "ssp1_36_39_grp",
2709 		.pins = ssp1_pins[1],
2710 		.npins = ARRAY_SIZE(ssp1_pins[1]),
2711 		.modemuxs = ssp1_36_39_modemux,
2712 		.nmodemuxs = ARRAY_SIZE(ssp1_36_39_modemux),
2713 	}, {
2714 		.name = "ssp1_48_51_grp",
2715 		.pins = ssp1_pins[2],
2716 		.npins = ARRAY_SIZE(ssp1_pins[2]),
2717 		.modemuxs = ssp1_48_51_modemux,
2718 		.nmodemuxs = ARRAY_SIZE(ssp1_48_51_modemux),
2719 	}, {
2720 		.name = "ssp1_65_68_grp",
2721 		.pins = ssp1_pins[3],
2722 		.npins = ARRAY_SIZE(ssp1_pins[3]),
2723 		.modemuxs = ssp1_65_68_modemux,
2724 		.nmodemuxs = ARRAY_SIZE(ssp1_65_68_modemux),
2725 	}, {
2726 		.name = "ssp1_94_97_grp",
2727 		.pins = ssp1_pins[4],
2728 		.npins = ARRAY_SIZE(ssp1_pins[4]),
2729 		.modemuxs = ssp1_94_97_modemux,
2730 		.nmodemuxs = ARRAY_SIZE(ssp1_94_97_modemux),
2731 	},
2732 };
2733 
2734 static const char *const ssp1_grps[] = { "ssp1_17_20_grp", "ssp1_36_39_grp",
2735 	"ssp1_48_51_grp", "ssp1_65_68_grp", "ssp1_94_97_grp"
2736 };
2737 static struct spear_function ssp1_function = {
2738 	.name = "ssp1",
2739 	.groups = ssp1_grps,
2740 	.ngroups = ARRAY_SIZE(ssp1_grps),
2741 };
2742 
2743 /* Pad multiplexing for SSP2 device */
2744 static const unsigned ssp2_pins[][2] = { { 13, 16 }, { 32, 35 }, { 44, 47 },
2745 	{ 61, 64 }, { 90, 93 } };
2746 static struct spear_muxreg ssp2_muxreg[] = {
2747 	{
2748 		.reg = PMX_CONFIG_REG,
2749 		.mask = PMX_MII_MASK,
2750 		.val = 0,
2751 	},
2752 };
2753 
2754 static struct spear_muxreg ssp2_ext_13_16_muxreg[] = {
2755 	{
2756 		.reg = IP_SEL_PAD_10_19_REG,
2757 		.mask = PMX_PL_13_14_MASK | PMX_PL_15_16_MASK,
2758 		.val = PMX_SSP2_PL_13_14_15_16_VAL,
2759 	}, {
2760 		.reg = IP_SEL_MIX_PAD_REG,
2761 		.mask = PMX_SSP2_PORT_SEL_MASK,
2762 		.val = PMX_SSP2_PORT_13_TO_16_VAL,
2763 	},
2764 };
2765 
2766 static struct spear_muxreg ssp2_ext_32_35_muxreg[] = {
2767 	{
2768 		.reg = PMX_CONFIG_REG,
2769 		.mask = PMX_SSP_CS_MASK | PMX_GPIO_PIN4_MASK |
2770 			PMX_GPIO_PIN5_MASK,
2771 		.val = 0,
2772 	}, {
2773 		.reg = IP_SEL_PAD_30_39_REG,
2774 		.mask = PMX_PL_32_33_MASK | PMX_PL_34_MASK | PMX_PL_35_MASK,
2775 		.val = PMX_SSP2_PL_32_33_VAL | PMX_SSP2_PL_34_VAL |
2776 			PMX_SSP2_PL_35_VAL,
2777 	}, {
2778 		.reg = IP_SEL_MIX_PAD_REG,
2779 		.mask = PMX_SSP2_PORT_SEL_MASK,
2780 		.val = PMX_SSP2_PORT_32_TO_35_VAL,
2781 	},
2782 };
2783 
2784 static struct spear_muxreg ssp2_ext_44_47_muxreg[] = {
2785 	{
2786 		.reg = PMX_CONFIG_REG,
2787 		.mask = PMX_TIMER_0_1_MASK | PMX_TIMER_2_3_MASK,
2788 		.val = 0,
2789 	}, {
2790 		.reg = IP_SEL_PAD_40_49_REG,
2791 		.mask = PMX_PL_44_45_MASK | PMX_PL_46_47_MASK,
2792 		.val = PMX_SSP2_PL_44_45_VAL | PMX_SSP2_PL_46_47_VAL,
2793 	}, {
2794 		.reg = IP_SEL_MIX_PAD_REG,
2795 		.mask = PMX_SSP2_PORT_SEL_MASK,
2796 		.val = PMX_SSP2_PORT_44_TO_47_VAL,
2797 	},
2798 };
2799 
2800 static struct spear_muxreg ssp2_ext_61_64_muxreg[] = {
2801 	{
2802 		.reg = IP_SEL_PAD_60_69_REG,
2803 		.mask = PMX_PL_61_TO_64_MASK,
2804 		.val = PMX_SSP2_PL_61_TO_64_VAL,
2805 	}, {
2806 		.reg = IP_SEL_MIX_PAD_REG,
2807 		.mask = PMX_SSP2_PORT_SEL_MASK,
2808 		.val = PMX_SSP2_PORT_61_TO_64_VAL,
2809 	},
2810 };
2811 
2812 static struct spear_muxreg ssp2_ext_90_93_muxreg[] = {
2813 	{
2814 		.reg = IP_SEL_PAD_90_99_REG,
2815 		.mask = PMX_PL_90_91_MASK | PMX_PL_92_93_MASK,
2816 		.val = PMX_SSP2_PL_90_91_VAL | PMX_SSP2_PL_92_93_VAL,
2817 	}, {
2818 		.reg = IP_SEL_MIX_PAD_REG,
2819 		.mask = PMX_SSP2_PORT_SEL_MASK,
2820 		.val = PMX_SSP2_PORT_90_TO_93_VAL,
2821 	},
2822 };
2823 
2824 static struct spear_modemux ssp2_13_16_modemux[] = {
2825 	{
2826 		.modes = AUTO_NET_SMII_MODE | EXTENDED_MODE,
2827 		.muxregs = ssp2_muxreg,
2828 		.nmuxregs = ARRAY_SIZE(ssp2_muxreg),
2829 	}, {
2830 		.modes = EXTENDED_MODE,
2831 		.muxregs = ssp2_ext_13_16_muxreg,
2832 		.nmuxregs = ARRAY_SIZE(ssp2_ext_13_16_muxreg),
2833 	},
2834 };
2835 
2836 static struct spear_modemux ssp2_32_35_modemux[] = {
2837 	{
2838 		.modes = EXTENDED_MODE,
2839 		.muxregs = ssp2_ext_32_35_muxreg,
2840 		.nmuxregs = ARRAY_SIZE(ssp2_ext_32_35_muxreg),
2841 	},
2842 };
2843 
2844 static struct spear_modemux ssp2_44_47_modemux[] = {
2845 	{
2846 		.modes = EXTENDED_MODE,
2847 		.muxregs = ssp2_ext_44_47_muxreg,
2848 		.nmuxregs = ARRAY_SIZE(ssp2_ext_44_47_muxreg),
2849 	},
2850 };
2851 
2852 static struct spear_modemux ssp2_61_64_modemux[] = {
2853 	{
2854 		.modes = EXTENDED_MODE,
2855 		.muxregs = ssp2_ext_61_64_muxreg,
2856 		.nmuxregs = ARRAY_SIZE(ssp2_ext_61_64_muxreg),
2857 	},
2858 };
2859 
2860 static struct spear_modemux ssp2_90_93_modemux[] = {
2861 	{
2862 		.modes = EXTENDED_MODE,
2863 		.muxregs = ssp2_ext_90_93_muxreg,
2864 		.nmuxregs = ARRAY_SIZE(ssp2_ext_90_93_muxreg),
2865 	},
2866 };
2867 
2868 static struct spear_pingroup ssp2_pingroup[] = {
2869 	{
2870 		.name = "ssp2_13_16_grp",
2871 		.pins = ssp2_pins[0],
2872 		.npins = ARRAY_SIZE(ssp2_pins[0]),
2873 		.modemuxs = ssp2_13_16_modemux,
2874 		.nmodemuxs = ARRAY_SIZE(ssp2_13_16_modemux),
2875 	}, {
2876 		.name = "ssp2_32_35_grp",
2877 		.pins = ssp2_pins[1],
2878 		.npins = ARRAY_SIZE(ssp2_pins[1]),
2879 		.modemuxs = ssp2_32_35_modemux,
2880 		.nmodemuxs = ARRAY_SIZE(ssp2_32_35_modemux),
2881 	}, {
2882 		.name = "ssp2_44_47_grp",
2883 		.pins = ssp2_pins[2],
2884 		.npins = ARRAY_SIZE(ssp2_pins[2]),
2885 		.modemuxs = ssp2_44_47_modemux,
2886 		.nmodemuxs = ARRAY_SIZE(ssp2_44_47_modemux),
2887 	}, {
2888 		.name = "ssp2_61_64_grp",
2889 		.pins = ssp2_pins[3],
2890 		.npins = ARRAY_SIZE(ssp2_pins[3]),
2891 		.modemuxs = ssp2_61_64_modemux,
2892 		.nmodemuxs = ARRAY_SIZE(ssp2_61_64_modemux),
2893 	}, {
2894 		.name = "ssp2_90_93_grp",
2895 		.pins = ssp2_pins[4],
2896 		.npins = ARRAY_SIZE(ssp2_pins[4]),
2897 		.modemuxs = ssp2_90_93_modemux,
2898 		.nmodemuxs = ARRAY_SIZE(ssp2_90_93_modemux),
2899 	},
2900 };
2901 
2902 static const char *const ssp2_grps[] = { "ssp2_13_16_grp", "ssp2_32_35_grp",
2903 	"ssp2_44_47_grp", "ssp2_61_64_grp", "ssp2_90_93_grp" };
2904 static struct spear_function ssp2_function = {
2905 	.name = "ssp2",
2906 	.groups = ssp2_grps,
2907 	.ngroups = ARRAY_SIZE(ssp2_grps),
2908 };
2909 
2910 /* Pad multiplexing for cadence mii2 as mii device */
2911 static const unsigned mii2_pins[] = { 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
2912 	90, 91, 92, 93, 94, 95, 96, 97 };
2913 static struct spear_muxreg mii2_muxreg[] = {
2914 	{
2915 		.reg = IP_SEL_PAD_80_89_REG,
2916 		.mask = PMX_PL_80_TO_85_MASK | PMX_PL_86_87_MASK |
2917 			PMX_PL_88_89_MASK,
2918 		.val = PMX_MII2_PL_80_TO_85_VAL | PMX_MII2_PL_86_87_VAL |
2919 			PMX_MII2_PL_88_89_VAL,
2920 	}, {
2921 		.reg = IP_SEL_PAD_90_99_REG,
2922 		.mask = PMX_PL_90_91_MASK | PMX_PL_92_93_MASK |
2923 			PMX_PL_94_95_MASK | PMX_PL_96_97_MASK,
2924 		.val = PMX_MII2_PL_90_91_VAL | PMX_MII2_PL_92_93_VAL |
2925 			PMX_MII2_PL_94_95_VAL | PMX_MII2_PL_96_97_VAL,
2926 	}, {
2927 		.reg = EXT_CTRL_REG,
2928 		.mask = (MAC_MODE_MASK << MAC2_MODE_SHIFT) |
2929 			(MAC_MODE_MASK << MAC1_MODE_SHIFT) |
2930 			MII_MDIO_MASK,
2931 		.val = (MAC_MODE_MII << MAC2_MODE_SHIFT) |
2932 			(MAC_MODE_MII << MAC1_MODE_SHIFT) |
2933 			MII_MDIO_81_VAL,
2934 	},
2935 };
2936 
2937 static struct spear_modemux mii2_modemux[] = {
2938 	{
2939 		.modes = EXTENDED_MODE,
2940 		.muxregs = mii2_muxreg,
2941 		.nmuxregs = ARRAY_SIZE(mii2_muxreg),
2942 	},
2943 };
2944 
2945 static struct spear_pingroup mii2_pingroup = {
2946 	.name = "mii2_grp",
2947 	.pins = mii2_pins,
2948 	.npins = ARRAY_SIZE(mii2_pins),
2949 	.modemuxs = mii2_modemux,
2950 	.nmodemuxs = ARRAY_SIZE(mii2_modemux),
2951 };
2952 
2953 static const char *const mii2_grps[] = { "mii2_grp" };
2954 static struct spear_function mii2_function = {
2955 	.name = "mii2",
2956 	.groups = mii2_grps,
2957 	.ngroups = ARRAY_SIZE(mii2_grps),
2958 };
2959 
2960 /* Pad multiplexing for cadence mii 1_2 as smii or rmii device */
2961 static const unsigned rmii0_1_pins[] = { 10, 11, 13, 14, 15, 16, 17, 18, 19, 20,
2962 	21, 22, 23, 24, 25, 26, 27 };
2963 static const unsigned smii0_1_pins[] = { 10, 11, 21, 22, 23, 24, 25, 26, 27 };
2964 static struct spear_muxreg mii0_1_muxreg[] = {
2965 	{
2966 		.reg = PMX_CONFIG_REG,
2967 		.mask = PMX_MII_MASK,
2968 		.val = 0,
2969 	},
2970 };
2971 
2972 static struct spear_muxreg smii0_1_ext_muxreg[] = {
2973 	{
2974 		.reg = IP_SEL_PAD_10_19_REG,
2975 		.mask = PMX_PL_10_11_MASK,
2976 		.val = PMX_SMII_PL_10_11_VAL,
2977 	}, {
2978 		.reg = IP_SEL_PAD_20_29_REG,
2979 		.mask = PMX_PL_21_TO_27_MASK,
2980 		.val = PMX_SMII_PL_21_TO_27_VAL,
2981 	}, {
2982 		.reg = EXT_CTRL_REG,
2983 		.mask = (MAC_MODE_MASK << MAC2_MODE_SHIFT) |
2984 			(MAC_MODE_MASK << MAC1_MODE_SHIFT) |
2985 			MII_MDIO_MASK,
2986 		.val = (MAC_MODE_SMII << MAC2_MODE_SHIFT)
2987 			| (MAC_MODE_SMII << MAC1_MODE_SHIFT)
2988 			| MII_MDIO_10_11_VAL,
2989 	},
2990 };
2991 
2992 static struct spear_muxreg rmii0_1_ext_muxreg[] = {
2993 	{
2994 		.reg = IP_SEL_PAD_10_19_REG,
2995 		.mask = PMX_PL_10_11_MASK | PMX_PL_13_14_MASK |
2996 			PMX_PL_15_16_MASK | PMX_PL_17_18_MASK | PMX_PL_19_MASK,
2997 		.val = PMX_RMII_PL_10_11_VAL | PMX_RMII_PL_13_14_VAL |
2998 			PMX_RMII_PL_15_16_VAL | PMX_RMII_PL_17_18_VAL |
2999 			PMX_RMII_PL_19_VAL,
3000 	}, {
3001 		.reg = IP_SEL_PAD_20_29_REG,
3002 		.mask = PMX_PL_20_MASK | PMX_PL_21_TO_27_MASK,
3003 		.val = PMX_RMII_PL_20_VAL | PMX_RMII_PL_21_TO_27_VAL,
3004 	}, {
3005 		.reg = EXT_CTRL_REG,
3006 		.mask = (MAC_MODE_MASK << MAC2_MODE_SHIFT) |
3007 			(MAC_MODE_MASK << MAC1_MODE_SHIFT) |
3008 			MII_MDIO_MASK,
3009 		.val = (MAC_MODE_RMII << MAC2_MODE_SHIFT)
3010 			| (MAC_MODE_RMII << MAC1_MODE_SHIFT)
3011 			| MII_MDIO_10_11_VAL,
3012 	},
3013 };
3014 
3015 static struct spear_modemux mii0_1_modemux[][2] = {
3016 	{
3017 		/* configure as smii */
3018 		{
3019 			.modes = AUTO_NET_SMII_MODE | AUTO_EXP_MODE |
3020 				SMALL_PRINTERS_MODE | EXTENDED_MODE,
3021 			.muxregs = mii0_1_muxreg,
3022 			.nmuxregs = ARRAY_SIZE(mii0_1_muxreg),
3023 		}, {
3024 			.modes = EXTENDED_MODE,
3025 			.muxregs = smii0_1_ext_muxreg,
3026 			.nmuxregs = ARRAY_SIZE(smii0_1_ext_muxreg),
3027 		},
3028 	}, {
3029 		/* configure as rmii */
3030 		{
3031 			.modes = AUTO_NET_SMII_MODE | AUTO_EXP_MODE |
3032 				SMALL_PRINTERS_MODE | EXTENDED_MODE,
3033 			.muxregs = mii0_1_muxreg,
3034 			.nmuxregs = ARRAY_SIZE(mii0_1_muxreg),
3035 		}, {
3036 			.modes = EXTENDED_MODE,
3037 			.muxregs = rmii0_1_ext_muxreg,
3038 			.nmuxregs = ARRAY_SIZE(rmii0_1_ext_muxreg),
3039 		},
3040 	},
3041 };
3042 
3043 static struct spear_pingroup mii0_1_pingroup[] = {
3044 	{
3045 		.name = "smii0_1_grp",
3046 		.pins = smii0_1_pins,
3047 		.npins = ARRAY_SIZE(smii0_1_pins),
3048 		.modemuxs = mii0_1_modemux[0],
3049 		.nmodemuxs = ARRAY_SIZE(mii0_1_modemux[0]),
3050 	}, {
3051 		.name = "rmii0_1_grp",
3052 		.pins = rmii0_1_pins,
3053 		.npins = ARRAY_SIZE(rmii0_1_pins),
3054 		.modemuxs = mii0_1_modemux[1],
3055 		.nmodemuxs = ARRAY_SIZE(mii0_1_modemux[1]),
3056 	},
3057 };
3058 
3059 static const char *const mii0_1_grps[] = { "smii0_1_grp", "rmii0_1_grp" };
3060 static struct spear_function mii0_1_function = {
3061 	.name = "mii0_1",
3062 	.groups = mii0_1_grps,
3063 	.ngroups = ARRAY_SIZE(mii0_1_grps),
3064 };
3065 
3066 /* Pad multiplexing for i2c1 device */
3067 static const unsigned i2c1_pins[][2] = { { 8, 9 }, { 98, 99 } };
3068 static struct spear_muxreg i2c1_ext_8_9_muxreg[] = {
3069 	{
3070 		.reg = PMX_CONFIG_REG,
3071 		.mask = PMX_SSP_CS_MASK,
3072 		.val = 0,
3073 	}, {
3074 		.reg = IP_SEL_PAD_0_9_REG,
3075 		.mask = PMX_PL_8_9_MASK,
3076 		.val = PMX_I2C1_PL_8_9_VAL,
3077 	}, {
3078 		.reg = IP_SEL_MIX_PAD_REG,
3079 		.mask = PMX_I2C1_PORT_SEL_MASK,
3080 		.val = PMX_I2C1_PORT_8_9_VAL,
3081 	},
3082 };
3083 
3084 static struct spear_muxreg i2c1_ext_98_99_muxreg[] = {
3085 	{
3086 		.reg = IP_SEL_PAD_90_99_REG,
3087 		.mask = PMX_PL_98_MASK | PMX_PL_99_MASK,
3088 		.val = PMX_I2C1_PL_98_VAL | PMX_I2C1_PL_99_VAL,
3089 	}, {
3090 		.reg = IP_SEL_MIX_PAD_REG,
3091 		.mask = PMX_I2C1_PORT_SEL_MASK,
3092 		.val = PMX_I2C1_PORT_98_99_VAL,
3093 	},
3094 };
3095 
3096 static struct spear_modemux i2c1_modemux[][1] = {
3097 	{
3098 		/* Select signals on pins 8-9 */
3099 		{
3100 			.modes = EXTENDED_MODE,
3101 			.muxregs = i2c1_ext_8_9_muxreg,
3102 			.nmuxregs = ARRAY_SIZE(i2c1_ext_8_9_muxreg),
3103 		},
3104 	}, {
3105 		/* Select signals on pins 98-99 */
3106 		{
3107 			.modes = EXTENDED_MODE,
3108 			.muxregs = i2c1_ext_98_99_muxreg,
3109 			.nmuxregs = ARRAY_SIZE(i2c1_ext_98_99_muxreg),
3110 		},
3111 	},
3112 };
3113 
3114 static struct spear_pingroup i2c1_pingroup[] = {
3115 	{
3116 		.name = "i2c1_8_9_grp",
3117 		.pins = i2c1_pins[0],
3118 		.npins = ARRAY_SIZE(i2c1_pins[0]),
3119 		.modemuxs = i2c1_modemux[0],
3120 		.nmodemuxs = ARRAY_SIZE(i2c1_modemux[0]),
3121 	}, {
3122 		.name = "i2c1_98_99_grp",
3123 		.pins = i2c1_pins[1],
3124 		.npins = ARRAY_SIZE(i2c1_pins[1]),
3125 		.modemuxs = i2c1_modemux[1],
3126 		.nmodemuxs = ARRAY_SIZE(i2c1_modemux[1]),
3127 	},
3128 };
3129 
3130 static const char *const i2c1_grps[] = { "i2c1_8_9_grp", "i2c1_98_99_grp" };
3131 static struct spear_function i2c1_function = {
3132 	.name = "i2c1",
3133 	.groups = i2c1_grps,
3134 	.ngroups = ARRAY_SIZE(i2c1_grps),
3135 };
3136 
3137 /* Pad multiplexing for i2c2 device */
3138 static const unsigned i2c2_pins[][2] = { { 0, 1 }, { 2, 3 }, { 19, 20 },
3139 	{ 75, 76 }, { 96, 97 } };
3140 static struct spear_muxreg i2c2_ext_0_1_muxreg[] = {
3141 	{
3142 		.reg = PMX_CONFIG_REG,
3143 		.mask = PMX_FIRDA_MASK,
3144 		.val = 0,
3145 	}, {
3146 		.reg = IP_SEL_PAD_0_9_REG,
3147 		.mask = PMX_PL_0_1_MASK,
3148 		.val = PMX_I2C2_PL_0_1_VAL,
3149 	}, {
3150 		.reg = IP_SEL_MIX_PAD_REG,
3151 		.mask = PMX_I2C2_PORT_SEL_MASK,
3152 		.val = PMX_I2C2_PORT_0_1_VAL,
3153 	},
3154 };
3155 
3156 static struct spear_muxreg i2c2_ext_2_3_muxreg[] = {
3157 	{
3158 		.reg = PMX_CONFIG_REG,
3159 		.mask = PMX_UART0_MASK,
3160 		.val = 0,
3161 	}, {
3162 		.reg = IP_SEL_PAD_0_9_REG,
3163 		.mask = PMX_PL_2_3_MASK,
3164 		.val = PMX_I2C2_PL_2_3_VAL,
3165 	}, {
3166 		.reg = IP_SEL_MIX_PAD_REG,
3167 		.mask = PMX_I2C2_PORT_SEL_MASK,
3168 		.val = PMX_I2C2_PORT_2_3_VAL,
3169 	},
3170 };
3171 
3172 static struct spear_muxreg i2c2_ext_19_20_muxreg[] = {
3173 	{
3174 		.reg = PMX_CONFIG_REG,
3175 		.mask = PMX_MII_MASK,
3176 		.val = 0,
3177 	}, {
3178 		.reg = IP_SEL_PAD_10_19_REG,
3179 		.mask = PMX_PL_19_MASK,
3180 		.val = PMX_I2C2_PL_19_VAL,
3181 	}, {
3182 		.reg = IP_SEL_PAD_20_29_REG,
3183 		.mask = PMX_PL_20_MASK,
3184 		.val = PMX_I2C2_PL_20_VAL,
3185 	}, {
3186 		.reg = IP_SEL_MIX_PAD_REG,
3187 		.mask = PMX_I2C2_PORT_SEL_MASK,
3188 		.val = PMX_I2C2_PORT_19_20_VAL,
3189 	},
3190 };
3191 
3192 static struct spear_muxreg i2c2_ext_75_76_muxreg[] = {
3193 	{
3194 		.reg = IP_SEL_PAD_70_79_REG,
3195 		.mask = PMX_PL_75_76_MASK,
3196 		.val = PMX_I2C2_PL_75_76_VAL,
3197 	}, {
3198 		.reg = IP_SEL_MIX_PAD_REG,
3199 		.mask = PMX_I2C2_PORT_SEL_MASK,
3200 		.val = PMX_I2C2_PORT_75_76_VAL,
3201 	},
3202 };
3203 
3204 static struct spear_muxreg i2c2_ext_96_97_muxreg[] = {
3205 	{
3206 		.reg = IP_SEL_PAD_90_99_REG,
3207 		.mask = PMX_PL_96_97_MASK,
3208 		.val = PMX_I2C2_PL_96_97_VAL,
3209 	}, {
3210 		.reg = IP_SEL_MIX_PAD_REG,
3211 		.mask = PMX_I2C2_PORT_SEL_MASK,
3212 		.val = PMX_I2C2_PORT_96_97_VAL,
3213 	},
3214 };
3215 
3216 static struct spear_modemux i2c2_modemux[][1] = {
3217 	{
3218 		/* Select signals on pins 0_1 */
3219 		{
3220 			.modes = EXTENDED_MODE,
3221 			.muxregs = i2c2_ext_0_1_muxreg,
3222 			.nmuxregs = ARRAY_SIZE(i2c2_ext_0_1_muxreg),
3223 		},
3224 	}, {
3225 		/* Select signals on pins 2_3 */
3226 		{
3227 			.modes = EXTENDED_MODE,
3228 			.muxregs = i2c2_ext_2_3_muxreg,
3229 			.nmuxregs = ARRAY_SIZE(i2c2_ext_2_3_muxreg),
3230 		},
3231 	}, {
3232 		/* Select signals on pins 19_20 */
3233 		{
3234 			.modes = EXTENDED_MODE,
3235 			.muxregs = i2c2_ext_19_20_muxreg,
3236 			.nmuxregs = ARRAY_SIZE(i2c2_ext_19_20_muxreg),
3237 		},
3238 	}, {
3239 		/* Select signals on pins 75_76 */
3240 		{
3241 			.modes = EXTENDED_MODE,
3242 			.muxregs = i2c2_ext_75_76_muxreg,
3243 			.nmuxregs = ARRAY_SIZE(i2c2_ext_75_76_muxreg),
3244 		},
3245 	}, {
3246 		/* Select signals on pins 96_97 */
3247 		{
3248 			.modes = EXTENDED_MODE,
3249 			.muxregs = i2c2_ext_96_97_muxreg,
3250 			.nmuxregs = ARRAY_SIZE(i2c2_ext_96_97_muxreg),
3251 		},
3252 	},
3253 };
3254 
3255 static struct spear_pingroup i2c2_pingroup[] = {
3256 	{
3257 		.name = "i2c2_0_1_grp",
3258 		.pins = i2c2_pins[0],
3259 		.npins = ARRAY_SIZE(i2c2_pins[0]),
3260 		.modemuxs = i2c2_modemux[0],
3261 		.nmodemuxs = ARRAY_SIZE(i2c2_modemux[0]),
3262 	}, {
3263 		.name = "i2c2_2_3_grp",
3264 		.pins = i2c2_pins[1],
3265 		.npins = ARRAY_SIZE(i2c2_pins[1]),
3266 		.modemuxs = i2c2_modemux[1],
3267 		.nmodemuxs = ARRAY_SIZE(i2c2_modemux[1]),
3268 	}, {
3269 		.name = "i2c2_19_20_grp",
3270 		.pins = i2c2_pins[2],
3271 		.npins = ARRAY_SIZE(i2c2_pins[2]),
3272 		.modemuxs = i2c2_modemux[2],
3273 		.nmodemuxs = ARRAY_SIZE(i2c2_modemux[2]),
3274 	}, {
3275 		.name = "i2c2_75_76_grp",
3276 		.pins = i2c2_pins[3],
3277 		.npins = ARRAY_SIZE(i2c2_pins[3]),
3278 		.modemuxs = i2c2_modemux[3],
3279 		.nmodemuxs = ARRAY_SIZE(i2c2_modemux[3]),
3280 	}, {
3281 		.name = "i2c2_96_97_grp",
3282 		.pins = i2c2_pins[4],
3283 		.npins = ARRAY_SIZE(i2c2_pins[4]),
3284 		.modemuxs = i2c2_modemux[4],
3285 		.nmodemuxs = ARRAY_SIZE(i2c2_modemux[4]),
3286 	},
3287 };
3288 
3289 static const char *const i2c2_grps[] = { "i2c2_0_1_grp", "i2c2_2_3_grp",
3290 	"i2c2_19_20_grp", "i2c2_75_76_grp", "i2c2_96_97_grp" };
3291 static struct spear_function i2c2_function = {
3292 	.name = "i2c2",
3293 	.groups = i2c2_grps,
3294 	.ngroups = ARRAY_SIZE(i2c2_grps),
3295 };
3296 
3297 /* pingroups */
3298 static struct spear_pingroup *spear320_pingroups[] = {
3299 	SPEAR3XX_COMMON_PINGROUPS,
3300 	&clcd_pingroup,
3301 	&emi_pingroup,
3302 	&fsmc_8bit_pingroup,
3303 	&fsmc_16bit_pingroup,
3304 	&spp_pingroup,
3305 	&sdhci_led_pingroup,
3306 	&sdhci_pingroup[0],
3307 	&sdhci_pingroup[1],
3308 	&i2s_pingroup,
3309 	&uart1_pingroup,
3310 	&uart1_modem_pingroup[0],
3311 	&uart1_modem_pingroup[1],
3312 	&uart1_modem_pingroup[2],
3313 	&uart1_modem_pingroup[3],
3314 	&uart2_pingroup,
3315 	&uart3_pingroup[0],
3316 	&uart3_pingroup[1],
3317 	&uart3_pingroup[2],
3318 	&uart3_pingroup[3],
3319 	&uart3_pingroup[4],
3320 	&uart3_pingroup[5],
3321 	&uart3_pingroup[6],
3322 	&uart4_pingroup[0],
3323 	&uart4_pingroup[1],
3324 	&uart4_pingroup[2],
3325 	&uart4_pingroup[3],
3326 	&uart4_pingroup[4],
3327 	&uart4_pingroup[5],
3328 	&uart5_pingroup[0],
3329 	&uart5_pingroup[1],
3330 	&uart5_pingroup[2],
3331 	&uart5_pingroup[3],
3332 	&uart6_pingroup[0],
3333 	&uart6_pingroup[1],
3334 	&rs485_pingroup,
3335 	&touchscreen_pingroup,
3336 	&can0_pingroup,
3337 	&can1_pingroup,
3338 	&pwm0_1_pingroup[0],
3339 	&pwm0_1_pingroup[1],
3340 	&pwm0_1_pingroup[2],
3341 	&pwm0_1_pingroup[3],
3342 	&pwm0_1_pingroup[4],
3343 	&pwm0_1_pingroup[5],
3344 	&pwm0_1_pingroup[6],
3345 	&pwm2_pingroup[0],
3346 	&pwm2_pingroup[1],
3347 	&pwm2_pingroup[2],
3348 	&pwm2_pingroup[3],
3349 	&pwm2_pingroup[4],
3350 	&pwm2_pingroup[5],
3351 	&pwm2_pingroup[6],
3352 	&pwm3_pingroup[0],
3353 	&pwm3_pingroup[1],
3354 	&pwm3_pingroup[2],
3355 	&pwm3_pingroup[3],
3356 	&pwm3_pingroup[4],
3357 	&pwm3_pingroup[5],
3358 	&ssp1_pingroup[0],
3359 	&ssp1_pingroup[1],
3360 	&ssp1_pingroup[2],
3361 	&ssp1_pingroup[3],
3362 	&ssp1_pingroup[4],
3363 	&ssp2_pingroup[0],
3364 	&ssp2_pingroup[1],
3365 	&ssp2_pingroup[2],
3366 	&ssp2_pingroup[3],
3367 	&ssp2_pingroup[4],
3368 	&mii2_pingroup,
3369 	&mii0_1_pingroup[0],
3370 	&mii0_1_pingroup[1],
3371 	&i2c1_pingroup[0],
3372 	&i2c1_pingroup[1],
3373 	&i2c2_pingroup[0],
3374 	&i2c2_pingroup[1],
3375 	&i2c2_pingroup[2],
3376 	&i2c2_pingroup[3],
3377 	&i2c2_pingroup[4],
3378 };
3379 
3380 /* functions */
3381 static struct spear_function *spear320_functions[] = {
3382 	SPEAR3XX_COMMON_FUNCTIONS,
3383 	&clcd_function,
3384 	&emi_function,
3385 	&fsmc_function,
3386 	&spp_function,
3387 	&sdhci_function,
3388 	&i2s_function,
3389 	&uart1_function,
3390 	&uart1_modem_function,
3391 	&uart2_function,
3392 	&uart3_function,
3393 	&uart4_function,
3394 	&uart5_function,
3395 	&uart6_function,
3396 	&rs485_function,
3397 	&touchscreen_function,
3398 	&can0_function,
3399 	&can1_function,
3400 	&pwm0_1_function,
3401 	&pwm2_function,
3402 	&pwm3_function,
3403 	&ssp1_function,
3404 	&ssp2_function,
3405 	&mii2_function,
3406 	&mii0_1_function,
3407 	&i2c1_function,
3408 	&i2c2_function,
3409 };
3410 
3411 static const struct of_device_id spear320_pinctrl_of_match[] = {
3412 	{
3413 		.compatible = "st,spear320-pinmux",
3414 	},
3415 	{},
3416 };
3417 
spear320_pinctrl_probe(struct platform_device * pdev)3418 static int spear320_pinctrl_probe(struct platform_device *pdev)
3419 {
3420 	spear3xx_machdata.groups = spear320_pingroups;
3421 	spear3xx_machdata.ngroups = ARRAY_SIZE(spear320_pingroups);
3422 	spear3xx_machdata.functions = spear320_functions;
3423 	spear3xx_machdata.nfunctions = ARRAY_SIZE(spear320_functions);
3424 
3425 	spear3xx_machdata.modes_supported = true;
3426 	spear3xx_machdata.pmx_modes = spear320_pmx_modes;
3427 	spear3xx_machdata.npmx_modes = ARRAY_SIZE(spear320_pmx_modes);
3428 
3429 	pmx_init_addr(&spear3xx_machdata, PMX_CONFIG_REG);
3430 	pmx_init_gpio_pingroup_addr(spear3xx_machdata.gpio_pingroups,
3431 			spear3xx_machdata.ngpio_pingroups, PMX_CONFIG_REG);
3432 
3433 	return spear_pinctrl_probe(pdev, &spear3xx_machdata);
3434 }
3435 
3436 static struct platform_driver spear320_pinctrl_driver = {
3437 	.driver = {
3438 		.name = DRIVER_NAME,
3439 		.of_match_table = spear320_pinctrl_of_match,
3440 	},
3441 	.probe = spear320_pinctrl_probe,
3442 };
3443 
spear320_pinctrl_init(void)3444 static int __init spear320_pinctrl_init(void)
3445 {
3446 	return platform_driver_register(&spear320_pinctrl_driver);
3447 }
3448 arch_initcall(spear320_pinctrl_init);
3449