xref: /OK3568_Linux_fs/kernel/drivers/pinctrl/samsung/pinctrl-exynos-arm.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun //
3*4882a593Smuzhiyun // Exynos specific support for Samsung pinctrl/gpiolib driver with eint support.
4*4882a593Smuzhiyun //
5*4882a593Smuzhiyun // Copyright (c) 2012 Samsung Electronics Co., Ltd.
6*4882a593Smuzhiyun //		http://www.samsung.com
7*4882a593Smuzhiyun // Copyright (c) 2012 Linaro Ltd
8*4882a593Smuzhiyun //		http://www.linaro.org
9*4882a593Smuzhiyun //
10*4882a593Smuzhiyun // Author: Thomas Abraham <thomas.ab@samsung.com>
11*4882a593Smuzhiyun //
12*4882a593Smuzhiyun // This file contains the Samsung Exynos specific information required by the
13*4882a593Smuzhiyun // the Samsung pinctrl/gpiolib driver. It also includes the implementation of
14*4882a593Smuzhiyun // external gpio and wakeup interrupt support.
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun #include <linux/device.h>
17*4882a593Smuzhiyun #include <linux/of_address.h>
18*4882a593Smuzhiyun #include <linux/slab.h>
19*4882a593Smuzhiyun #include <linux/err.h>
20*4882a593Smuzhiyun #include <linux/soc/samsung/exynos-regs-pmu.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun #include "pinctrl-samsung.h"
23*4882a593Smuzhiyun #include "pinctrl-exynos.h"
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun static const struct samsung_pin_bank_type bank_type_off = {
26*4882a593Smuzhiyun 	.fld_width = { 4, 1, 2, 2, 2, 2, },
27*4882a593Smuzhiyun 	.reg_offset = { 0x00, 0x04, 0x08, 0x0c, 0x10, 0x14, },
28*4882a593Smuzhiyun };
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun static const struct samsung_pin_bank_type bank_type_alive = {
31*4882a593Smuzhiyun 	.fld_width = { 4, 1, 2, 2, },
32*4882a593Smuzhiyun 	.reg_offset = { 0x00, 0x04, 0x08, 0x0c, },
33*4882a593Smuzhiyun };
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun /* Retention control for S5PV210 are located at the end of clock controller */
36*4882a593Smuzhiyun #define S5P_OTHERS 0xE000
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define S5P_OTHERS_RET_IO		(1 << 31)
39*4882a593Smuzhiyun #define S5P_OTHERS_RET_CF		(1 << 30)
40*4882a593Smuzhiyun #define S5P_OTHERS_RET_MMC		(1 << 29)
41*4882a593Smuzhiyun #define S5P_OTHERS_RET_UART		(1 << 28)
42*4882a593Smuzhiyun 
s5pv210_retention_disable(struct samsung_pinctrl_drv_data * drvdata)43*4882a593Smuzhiyun static void s5pv210_retention_disable(struct samsung_pinctrl_drv_data *drvdata)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	void __iomem *clk_base = (void __iomem *)drvdata->retention_ctrl->priv;
46*4882a593Smuzhiyun 	u32 tmp;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	tmp = __raw_readl(clk_base + S5P_OTHERS);
49*4882a593Smuzhiyun 	tmp |= (S5P_OTHERS_RET_IO | S5P_OTHERS_RET_CF | S5P_OTHERS_RET_MMC |
50*4882a593Smuzhiyun 		S5P_OTHERS_RET_UART);
51*4882a593Smuzhiyun 	__raw_writel(tmp, clk_base + S5P_OTHERS);
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun static struct samsung_retention_ctrl *
s5pv210_retention_init(struct samsung_pinctrl_drv_data * drvdata,const struct samsung_retention_data * data)55*4882a593Smuzhiyun s5pv210_retention_init(struct samsung_pinctrl_drv_data *drvdata,
56*4882a593Smuzhiyun 		       const struct samsung_retention_data *data)
57*4882a593Smuzhiyun {
58*4882a593Smuzhiyun 	struct samsung_retention_ctrl *ctrl;
59*4882a593Smuzhiyun 	struct device_node *np;
60*4882a593Smuzhiyun 	void __iomem *clk_base;
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun 	ctrl = devm_kzalloc(drvdata->dev, sizeof(*ctrl), GFP_KERNEL);
63*4882a593Smuzhiyun 	if (!ctrl)
64*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	np = of_find_compatible_node(NULL, NULL, "samsung,s5pv210-clock");
67*4882a593Smuzhiyun 	if (!np) {
68*4882a593Smuzhiyun 		pr_err("%s: failed to find clock controller DT node\n",
69*4882a593Smuzhiyun 			__func__);
70*4882a593Smuzhiyun 		return ERR_PTR(-ENODEV);
71*4882a593Smuzhiyun 	}
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	clk_base = of_iomap(np, 0);
74*4882a593Smuzhiyun 	of_node_put(np);
75*4882a593Smuzhiyun 	if (!clk_base) {
76*4882a593Smuzhiyun 		pr_err("%s: failed to map clock registers\n", __func__);
77*4882a593Smuzhiyun 		return ERR_PTR(-EINVAL);
78*4882a593Smuzhiyun 	}
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	ctrl->priv = (void __force *)clk_base;
81*4882a593Smuzhiyun 	ctrl->disable = s5pv210_retention_disable;
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun 	return ctrl;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun static const struct samsung_retention_data s5pv210_retention_data __initconst = {
87*4882a593Smuzhiyun 	.init	 = s5pv210_retention_init,
88*4882a593Smuzhiyun };
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /* pin banks of s5pv210 pin-controller */
91*4882a593Smuzhiyun static const struct samsung_pin_bank_data s5pv210_pin_bank[] __initconst = {
92*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
93*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
94*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpa1", 0x04),
95*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
96*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
97*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
98*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
99*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x0c0, "gpd1", 0x18),
100*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpe0", 0x1c),
101*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x100, "gpe1", 0x20),
102*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpf0", 0x24),
103*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpf1", 0x28),
104*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpf2", 0x2c),
105*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x180, "gpf3", 0x30),
106*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x1a0, "gpg0", 0x34),
107*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x1c0, "gpg1", 0x38),
108*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x1e0, "gpg2", 0x3c),
109*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x200, "gpg3", 0x40),
110*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x44),
111*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x260, "gpj1", 0x48),
112*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x280, "gpj2", 0x4c),
113*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x2a0, "gpj3", 0x50),
114*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x2c0, "gpj4", 0x54),
115*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(7, 0x220, "gpi"),
116*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x2e0, "mp01"),
117*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(4, 0x300, "mp02"),
118*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x320, "mp03"),
119*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x340, "mp04"),
120*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x360, "mp05"),
121*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x380, "mp06"),
122*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x3a0, "mp07"),
123*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gph0", 0x00),
124*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gph1", 0x04),
125*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gph2", 0x08),
126*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gph3", 0x0c),
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun static const struct samsung_pin_ctrl s5pv210_pin_ctrl[] __initconst = {
130*4882a593Smuzhiyun 	{
131*4882a593Smuzhiyun 		/* pin-controller instance 0 data */
132*4882a593Smuzhiyun 		.pin_banks	= s5pv210_pin_bank,
133*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(s5pv210_pin_bank),
134*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
135*4882a593Smuzhiyun 		.eint_wkup_init = exynos_eint_wkup_init,
136*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
137*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
138*4882a593Smuzhiyun 		.retention_data	= &s5pv210_retention_data,
139*4882a593Smuzhiyun 	},
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun const struct samsung_pinctrl_of_match_data s5pv210_of_data __initconst = {
143*4882a593Smuzhiyun 	.ctrl		= s5pv210_pin_ctrl,
144*4882a593Smuzhiyun 	.num_ctrl	= ARRAY_SIZE(s5pv210_pin_ctrl),
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun /* Pad retention control code for accessing PMU regmap */
148*4882a593Smuzhiyun static atomic_t exynos_shared_retention_refcnt;
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /* pin banks of exynos3250 pin-controller 0 */
151*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos3250_pin_banks0[] __initconst = {
152*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
153*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
154*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
155*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb",  0x08),
156*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
157*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
158*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0a0, "gpd0", 0x14),
159*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpd1", 0x18),
160*4882a593Smuzhiyun };
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun /* pin banks of exynos3250 pin-controller 1 */
163*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos3250_pin_banks1[] __initconst = {
164*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
165*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpe0"),
166*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpe1"),
167*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(3, 0x180, "gpe2"),
168*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpk0", 0x08),
169*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
170*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
171*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0c0, "gpl0", 0x18),
172*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
173*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
174*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x2a0, "gpm2", 0x2c),
175*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x2c0, "gpm3", 0x30),
176*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x2e0, "gpm4", 0x34),
177*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
178*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
179*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
180*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun /*
184*4882a593Smuzhiyun  * PMU pad retention groups for Exynos3250 doesn't match pin banks, so handle
185*4882a593Smuzhiyun  * them all together
186*4882a593Smuzhiyun  */
187*4882a593Smuzhiyun static const u32 exynos3250_retention_regs[] = {
188*4882a593Smuzhiyun 	S5P_PAD_RET_MAUDIO_OPTION,
189*4882a593Smuzhiyun 	S5P_PAD_RET_GPIO_OPTION,
190*4882a593Smuzhiyun 	S5P_PAD_RET_UART_OPTION,
191*4882a593Smuzhiyun 	S5P_PAD_RET_MMCA_OPTION,
192*4882a593Smuzhiyun 	S5P_PAD_RET_MMCB_OPTION,
193*4882a593Smuzhiyun 	S5P_PAD_RET_EBIA_OPTION,
194*4882a593Smuzhiyun 	S5P_PAD_RET_EBIB_OPTION,
195*4882a593Smuzhiyun 	S5P_PAD_RET_MMC2_OPTION,
196*4882a593Smuzhiyun 	S5P_PAD_RET_SPI_OPTION,
197*4882a593Smuzhiyun };
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun static const struct samsung_retention_data exynos3250_retention_data __initconst = {
200*4882a593Smuzhiyun 	.regs	 = exynos3250_retention_regs,
201*4882a593Smuzhiyun 	.nr_regs = ARRAY_SIZE(exynos3250_retention_regs),
202*4882a593Smuzhiyun 	.value	 = EXYNOS_WAKEUP_FROM_LOWPWR,
203*4882a593Smuzhiyun 	.refcnt	 = &exynos_shared_retention_refcnt,
204*4882a593Smuzhiyun 	.init	 = exynos_retention_init,
205*4882a593Smuzhiyun };
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun /*
208*4882a593Smuzhiyun  * Samsung pinctrl driver data for Exynos3250 SoC. Exynos3250 SoC includes
209*4882a593Smuzhiyun  * two gpio/pin-mux/pinconfig controllers.
210*4882a593Smuzhiyun  */
211*4882a593Smuzhiyun static const struct samsung_pin_ctrl exynos3250_pin_ctrl[] __initconst = {
212*4882a593Smuzhiyun 	{
213*4882a593Smuzhiyun 		/* pin-controller instance 0 data */
214*4882a593Smuzhiyun 		.pin_banks	= exynos3250_pin_banks0,
215*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos3250_pin_banks0),
216*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
217*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
218*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
219*4882a593Smuzhiyun 		.retention_data	= &exynos3250_retention_data,
220*4882a593Smuzhiyun 	}, {
221*4882a593Smuzhiyun 		/* pin-controller instance 1 data */
222*4882a593Smuzhiyun 		.pin_banks	= exynos3250_pin_banks1,
223*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos3250_pin_banks1),
224*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
225*4882a593Smuzhiyun 		.eint_wkup_init = exynos_eint_wkup_init,
226*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
227*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
228*4882a593Smuzhiyun 		.retention_data	= &exynos3250_retention_data,
229*4882a593Smuzhiyun 	},
230*4882a593Smuzhiyun };
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun const struct samsung_pinctrl_of_match_data exynos3250_of_data __initconst = {
233*4882a593Smuzhiyun 	.ctrl		= exynos3250_pin_ctrl,
234*4882a593Smuzhiyun 	.num_ctrl	= ARRAY_SIZE(exynos3250_pin_ctrl),
235*4882a593Smuzhiyun };
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun /* pin banks of exynos4210 pin-controller 0 */
238*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos4210_pin_banks0[] __initconst = {
239*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
240*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
241*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
242*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
243*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
244*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
245*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
246*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
247*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x0E0, "gpe0", 0x1c),
248*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpe1", 0x20),
249*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x120, "gpe2", 0x24),
250*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x140, "gpe3", 0x28),
251*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x160, "gpe4", 0x2c),
252*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
253*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
254*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
255*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
256*4882a593Smuzhiyun };
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun /* pin banks of exynos4210 pin-controller 1 */
259*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos4210_pin_banks1[] __initconst = {
260*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
261*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpj0", 0x00),
262*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x020, "gpj1", 0x04),
263*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
264*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
265*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
266*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
267*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpl0", 0x18),
268*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(3, 0x0E0, "gpl1", 0x1c),
269*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
270*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
271*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
272*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
273*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
274*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
275*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
276*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
277*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
278*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
279*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
280*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
281*4882a593Smuzhiyun };
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun /* pin banks of exynos4210 pin-controller 2 */
284*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos4210_pin_banks2[] __initconst = {
285*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
286*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(7, 0x000, "gpz"),
287*4882a593Smuzhiyun };
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun /* PMU pad retention groups registers for Exynos4 (without audio) */
290*4882a593Smuzhiyun static const u32 exynos4_retention_regs[] = {
291*4882a593Smuzhiyun 	S5P_PAD_RET_GPIO_OPTION,
292*4882a593Smuzhiyun 	S5P_PAD_RET_UART_OPTION,
293*4882a593Smuzhiyun 	S5P_PAD_RET_MMCA_OPTION,
294*4882a593Smuzhiyun 	S5P_PAD_RET_MMCB_OPTION,
295*4882a593Smuzhiyun 	S5P_PAD_RET_EBIA_OPTION,
296*4882a593Smuzhiyun 	S5P_PAD_RET_EBIB_OPTION,
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun static const struct samsung_retention_data exynos4_retention_data __initconst = {
300*4882a593Smuzhiyun 	.regs	 = exynos4_retention_regs,
301*4882a593Smuzhiyun 	.nr_regs = ARRAY_SIZE(exynos4_retention_regs),
302*4882a593Smuzhiyun 	.value	 = EXYNOS_WAKEUP_FROM_LOWPWR,
303*4882a593Smuzhiyun 	.refcnt	 = &exynos_shared_retention_refcnt,
304*4882a593Smuzhiyun 	.init	 = exynos_retention_init,
305*4882a593Smuzhiyun };
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun /* PMU retention control for audio pins can be tied to audio pin bank */
308*4882a593Smuzhiyun static const u32 exynos4_audio_retention_regs[] = {
309*4882a593Smuzhiyun 	S5P_PAD_RET_MAUDIO_OPTION,
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun static const struct samsung_retention_data exynos4_audio_retention_data __initconst = {
313*4882a593Smuzhiyun 	.regs	 = exynos4_audio_retention_regs,
314*4882a593Smuzhiyun 	.nr_regs = ARRAY_SIZE(exynos4_audio_retention_regs),
315*4882a593Smuzhiyun 	.value	 = EXYNOS_WAKEUP_FROM_LOWPWR,
316*4882a593Smuzhiyun 	.init	 = exynos_retention_init,
317*4882a593Smuzhiyun };
318*4882a593Smuzhiyun 
319*4882a593Smuzhiyun /*
320*4882a593Smuzhiyun  * Samsung pinctrl driver data for Exynos4210 SoC. Exynos4210 SoC includes
321*4882a593Smuzhiyun  * three gpio/pin-mux/pinconfig controllers.
322*4882a593Smuzhiyun  */
323*4882a593Smuzhiyun static const struct samsung_pin_ctrl exynos4210_pin_ctrl[] __initconst = {
324*4882a593Smuzhiyun 	{
325*4882a593Smuzhiyun 		/* pin-controller instance 0 data */
326*4882a593Smuzhiyun 		.pin_banks	= exynos4210_pin_banks0,
327*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos4210_pin_banks0),
328*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
329*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
330*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
331*4882a593Smuzhiyun 		.retention_data	= &exynos4_retention_data,
332*4882a593Smuzhiyun 	}, {
333*4882a593Smuzhiyun 		/* pin-controller instance 1 data */
334*4882a593Smuzhiyun 		.pin_banks	= exynos4210_pin_banks1,
335*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos4210_pin_banks1),
336*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
337*4882a593Smuzhiyun 		.eint_wkup_init = exynos_eint_wkup_init,
338*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
339*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
340*4882a593Smuzhiyun 		.retention_data	= &exynos4_retention_data,
341*4882a593Smuzhiyun 	}, {
342*4882a593Smuzhiyun 		/* pin-controller instance 2 data */
343*4882a593Smuzhiyun 		.pin_banks	= exynos4210_pin_banks2,
344*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos4210_pin_banks2),
345*4882a593Smuzhiyun 		.retention_data	= &exynos4_audio_retention_data,
346*4882a593Smuzhiyun 	},
347*4882a593Smuzhiyun };
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun const struct samsung_pinctrl_of_match_data exynos4210_of_data __initconst = {
350*4882a593Smuzhiyun 	.ctrl		= exynos4210_pin_ctrl,
351*4882a593Smuzhiyun 	.num_ctrl	= ARRAY_SIZE(exynos4210_pin_ctrl),
352*4882a593Smuzhiyun };
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun /* pin banks of exynos4x12 pin-controller 0 */
355*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos4x12_pin_banks0[] __initconst = {
356*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
357*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
358*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
359*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpb", 0x08),
360*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpc0", 0x0c),
361*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpc1", 0x10),
362*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpd0", 0x14),
363*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpd1", 0x18),
364*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpf0", 0x30),
365*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpf1", 0x34),
366*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x1C0, "gpf2", 0x38),
367*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf3", 0x3c),
368*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpj0", 0x40),
369*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x260, "gpj1", 0x44),
370*4882a593Smuzhiyun };
371*4882a593Smuzhiyun 
372*4882a593Smuzhiyun /* pin banks of exynos4x12 pin-controller 1 */
373*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos4x12_pin_banks1[] __initconst = {
374*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
375*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpk0", 0x08),
376*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x060, "gpk1", 0x0c),
377*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x080, "gpk2", 0x10),
378*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x0A0, "gpk3", 0x14),
379*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x0C0, "gpl0", 0x18),
380*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpl1", 0x1c),
381*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpl2", 0x20),
382*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x260, "gpm0", 0x24),
383*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x280, "gpm1", 0x28),
384*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x2A0, "gpm2", 0x2c),
385*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x2C0, "gpm3", 0x30),
386*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x2E0, "gpm4", 0x34),
387*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x120, "gpy0"),
388*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(4, 0x140, "gpy1"),
389*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x160, "gpy2"),
390*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy3"),
391*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x1A0, "gpy4"),
392*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x1C0, "gpy5"),
393*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x1E0, "gpy6"),
394*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
395*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
396*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
397*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
398*4882a593Smuzhiyun };
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun /* pin banks of exynos4x12 pin-controller 2 */
401*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos4x12_pin_banks2[] __initconst = {
402*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
403*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
404*4882a593Smuzhiyun };
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun /* pin banks of exynos4x12 pin-controller 3 */
407*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos4x12_pin_banks3[] __initconst = {
408*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
409*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
410*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
411*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpv2", 0x08),
412*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv3", 0x0c),
413*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpv4", 0x10),
414*4882a593Smuzhiyun };
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun /*
417*4882a593Smuzhiyun  * Samsung pinctrl driver data for Exynos4x12 SoC. Exynos4x12 SoC includes
418*4882a593Smuzhiyun  * four gpio/pin-mux/pinconfig controllers.
419*4882a593Smuzhiyun  */
420*4882a593Smuzhiyun static const struct samsung_pin_ctrl exynos4x12_pin_ctrl[] __initconst = {
421*4882a593Smuzhiyun 	{
422*4882a593Smuzhiyun 		/* pin-controller instance 0 data */
423*4882a593Smuzhiyun 		.pin_banks	= exynos4x12_pin_banks0,
424*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos4x12_pin_banks0),
425*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
426*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
427*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
428*4882a593Smuzhiyun 		.retention_data	= &exynos4_retention_data,
429*4882a593Smuzhiyun 	}, {
430*4882a593Smuzhiyun 		/* pin-controller instance 1 data */
431*4882a593Smuzhiyun 		.pin_banks	= exynos4x12_pin_banks1,
432*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos4x12_pin_banks1),
433*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
434*4882a593Smuzhiyun 		.eint_wkup_init = exynos_eint_wkup_init,
435*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
436*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
437*4882a593Smuzhiyun 		.retention_data	= &exynos4_retention_data,
438*4882a593Smuzhiyun 	}, {
439*4882a593Smuzhiyun 		/* pin-controller instance 2 data */
440*4882a593Smuzhiyun 		.pin_banks	= exynos4x12_pin_banks2,
441*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos4x12_pin_banks2),
442*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
443*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
444*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
445*4882a593Smuzhiyun 		.retention_data	= &exynos4_audio_retention_data,
446*4882a593Smuzhiyun 	}, {
447*4882a593Smuzhiyun 		/* pin-controller instance 3 data */
448*4882a593Smuzhiyun 		.pin_banks	= exynos4x12_pin_banks3,
449*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos4x12_pin_banks3),
450*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
451*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
452*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
453*4882a593Smuzhiyun 	},
454*4882a593Smuzhiyun };
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun const struct samsung_pinctrl_of_match_data exynos4x12_of_data __initconst = {
457*4882a593Smuzhiyun 	.ctrl		= exynos4x12_pin_ctrl,
458*4882a593Smuzhiyun 	.num_ctrl	= ARRAY_SIZE(exynos4x12_pin_ctrl),
459*4882a593Smuzhiyun };
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun /* pin banks of exynos5250 pin-controller 0 */
462*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5250_pin_banks0[] __initconst = {
463*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
464*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
465*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
466*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
467*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
468*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
469*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
470*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
471*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
472*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc1", 0x20),
473*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc2", 0x24),
474*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc3", 0x28),
475*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x160, "gpd0", 0x2c),
476*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x30),
477*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x2E0, "gpc4", 0x34),
478*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x1A0, "gpy0"),
479*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(4, 0x1C0, "gpy1"),
480*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x1E0, "gpy2"),
481*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x200, "gpy3"),
482*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x220, "gpy4"),
483*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x240, "gpy5"),
484*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x260, "gpy6"),
485*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
486*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
487*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
488*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
489*4882a593Smuzhiyun };
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun /* pin banks of exynos5250 pin-controller 1 */
492*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5250_pin_banks1[] __initconst = {
493*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
494*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
495*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
496*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x040, "gpf0", 0x08),
497*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpf1", 0x0c),
498*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
499*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
500*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
501*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gph0", 0x1c),
502*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph1", 0x20),
503*4882a593Smuzhiyun };
504*4882a593Smuzhiyun 
505*4882a593Smuzhiyun /* pin banks of exynos5250 pin-controller 2 */
506*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5250_pin_banks2[] __initconst = {
507*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
508*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
509*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
510*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
511*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
512*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
513*4882a593Smuzhiyun };
514*4882a593Smuzhiyun 
515*4882a593Smuzhiyun /* pin banks of exynos5250 pin-controller 3 */
516*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5250_pin_banks3[] __initconst = {
517*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
518*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
519*4882a593Smuzhiyun };
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun /*
522*4882a593Smuzhiyun  * Samsung pinctrl driver data for Exynos5250 SoC. Exynos5250 SoC includes
523*4882a593Smuzhiyun  * four gpio/pin-mux/pinconfig controllers.
524*4882a593Smuzhiyun  */
525*4882a593Smuzhiyun static const struct samsung_pin_ctrl exynos5250_pin_ctrl[] __initconst = {
526*4882a593Smuzhiyun 	{
527*4882a593Smuzhiyun 		/* pin-controller instance 0 data */
528*4882a593Smuzhiyun 		.pin_banks	= exynos5250_pin_banks0,
529*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5250_pin_banks0),
530*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
531*4882a593Smuzhiyun 		.eint_wkup_init = exynos_eint_wkup_init,
532*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
533*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
534*4882a593Smuzhiyun 		.retention_data	= &exynos4_retention_data,
535*4882a593Smuzhiyun 	}, {
536*4882a593Smuzhiyun 		/* pin-controller instance 1 data */
537*4882a593Smuzhiyun 		.pin_banks	= exynos5250_pin_banks1,
538*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5250_pin_banks1),
539*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
540*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
541*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
542*4882a593Smuzhiyun 		.retention_data	= &exynos4_retention_data,
543*4882a593Smuzhiyun 	}, {
544*4882a593Smuzhiyun 		/* pin-controller instance 2 data */
545*4882a593Smuzhiyun 		.pin_banks	= exynos5250_pin_banks2,
546*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5250_pin_banks2),
547*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
548*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
549*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
550*4882a593Smuzhiyun 	}, {
551*4882a593Smuzhiyun 		/* pin-controller instance 3 data */
552*4882a593Smuzhiyun 		.pin_banks	= exynos5250_pin_banks3,
553*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5250_pin_banks3),
554*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
555*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
556*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
557*4882a593Smuzhiyun 		.retention_data	= &exynos4_audio_retention_data,
558*4882a593Smuzhiyun 	},
559*4882a593Smuzhiyun };
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun const struct samsung_pinctrl_of_match_data exynos5250_of_data __initconst = {
562*4882a593Smuzhiyun 	.ctrl		= exynos5250_pin_ctrl,
563*4882a593Smuzhiyun 	.num_ctrl	= ARRAY_SIZE(exynos5250_pin_ctrl),
564*4882a593Smuzhiyun };
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun /* pin banks of exynos5260 pin-controller 0 */
567*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5260_pin_banks0[] __initconst = {
568*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
569*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x000, "gpa0", 0x00),
570*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x020, "gpa1", 0x04),
571*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
572*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
573*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpb1", 0x10),
574*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x0a0, "gpb2", 0x14),
575*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0c0, "gpb3", 0x18),
576*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0e0, "gpb4", 0x1c),
577*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x100, "gpb5", 0x20),
578*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x120, "gpd0", 0x24),
579*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpd1", 0x28),
580*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x160, "gpd2", 0x2c),
581*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpe0", 0x30),
582*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x1a0, "gpe1", 0x34),
583*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x1c0, "gpf0", 0x38),
584*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x1e0, "gpf1", 0x3c),
585*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x200, "gpk0", 0x40),
586*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc00, "gpx0", 0x00),
587*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc20, "gpx1", 0x04),
588*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc40, "gpx2", 0x08),
589*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xc60, "gpx3", 0x0c),
590*4882a593Smuzhiyun };
591*4882a593Smuzhiyun 
592*4882a593Smuzhiyun /* pin banks of exynos5260 pin-controller 1 */
593*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5260_pin_banks1[] __initconst = {
594*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
595*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpc0", 0x00),
596*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpc1", 0x04),
597*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
598*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
599*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x080, "gpc4", 0x10),
600*4882a593Smuzhiyun };
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun /* pin banks of exynos5260 pin-controller 2 */
603*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5260_pin_banks2[] __initconst = {
604*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
605*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz0", 0x00),
606*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x020, "gpz1", 0x04),
607*4882a593Smuzhiyun };
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun /*
610*4882a593Smuzhiyun  * Samsung pinctrl driver data for Exynos5260 SoC. Exynos5260 SoC includes
611*4882a593Smuzhiyun  * three gpio/pin-mux/pinconfig controllers.
612*4882a593Smuzhiyun  */
613*4882a593Smuzhiyun static const struct samsung_pin_ctrl exynos5260_pin_ctrl[] __initconst = {
614*4882a593Smuzhiyun 	{
615*4882a593Smuzhiyun 		/* pin-controller instance 0 data */
616*4882a593Smuzhiyun 		.pin_banks	= exynos5260_pin_banks0,
617*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5260_pin_banks0),
618*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
619*4882a593Smuzhiyun 		.eint_wkup_init = exynos_eint_wkup_init,
620*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
621*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
622*4882a593Smuzhiyun 	}, {
623*4882a593Smuzhiyun 		/* pin-controller instance 1 data */
624*4882a593Smuzhiyun 		.pin_banks	= exynos5260_pin_banks1,
625*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5260_pin_banks1),
626*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
627*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
628*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
629*4882a593Smuzhiyun 	}, {
630*4882a593Smuzhiyun 		/* pin-controller instance 2 data */
631*4882a593Smuzhiyun 		.pin_banks	= exynos5260_pin_banks2,
632*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5260_pin_banks2),
633*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
634*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
635*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
636*4882a593Smuzhiyun 	},
637*4882a593Smuzhiyun };
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun const struct samsung_pinctrl_of_match_data exynos5260_of_data __initconst = {
640*4882a593Smuzhiyun 	.ctrl		= exynos5260_pin_ctrl,
641*4882a593Smuzhiyun 	.num_ctrl	= ARRAY_SIZE(exynos5260_pin_ctrl),
642*4882a593Smuzhiyun };
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun /* pin banks of exynos5410 pin-controller 0 */
645*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5410_pin_banks0[] __initconst = {
646*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
647*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
648*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
649*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
650*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
651*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
652*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
653*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0C0, "gpb3", 0x18),
654*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x0E0, "gpc0", 0x1c),
655*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x100, "gpc3", 0x20),
656*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x120, "gpc1", 0x24),
657*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x140, "gpc2", 0x28),
658*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x180, "gpd1", 0x2c),
659*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x1A0, "gpe0", 0x30),
660*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x1C0, "gpe1", 0x34),
661*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x1E0, "gpf0", 0x38),
662*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x200, "gpf1", 0x3c),
663*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x220, "gpg0", 0x40),
664*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x240, "gpg1", 0x44),
665*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x260, "gpg2", 0x48),
666*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x280, "gph0", 0x4c),
667*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x2A0, "gph1", 0x50),
668*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(2, 0x160, "gpm5"),
669*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x2C0, "gpm7"),
670*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x2E0, "gpy0"),
671*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(4, 0x300, "gpy1"),
672*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x320, "gpy2"),
673*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x340, "gpy3"),
674*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x360, "gpy4"),
675*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x380, "gpy5"),
676*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x3A0, "gpy6"),
677*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x3C0, "gpy7"),
678*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
679*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
680*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
681*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
682*4882a593Smuzhiyun };
683*4882a593Smuzhiyun 
684*4882a593Smuzhiyun /* pin banks of exynos5410 pin-controller 1 */
685*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5410_pin_banks1[] __initconst = {
686*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
687*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x000, "gpj0", 0x00),
688*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpj1", 0x04),
689*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpj2", 0x08),
690*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpj3", 0x0c),
691*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpj4", 0x10),
692*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpk0", 0x14),
693*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpk1", 0x18),
694*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0E0, "gpk2", 0x1c),
695*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x100, "gpk3", 0x20),
696*4882a593Smuzhiyun };
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun /* pin banks of exynos5410 pin-controller 2 */
699*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5410_pin_banks2[] __initconst = {
700*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
701*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpv0", 0x00),
702*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpv1", 0x04),
703*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpv2", 0x08),
704*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpv3", 0x0c),
705*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpv4", 0x10),
706*4882a593Smuzhiyun };
707*4882a593Smuzhiyun 
708*4882a593Smuzhiyun /* pin banks of exynos5410 pin-controller 3 */
709*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5410_pin_banks3[] __initconst = {
710*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
711*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
712*4882a593Smuzhiyun };
713*4882a593Smuzhiyun 
714*4882a593Smuzhiyun /*
715*4882a593Smuzhiyun  * Samsung pinctrl driver data for Exynos5410 SoC. Exynos5410 SoC includes
716*4882a593Smuzhiyun  * four gpio/pin-mux/pinconfig controllers.
717*4882a593Smuzhiyun  */
718*4882a593Smuzhiyun static const struct samsung_pin_ctrl exynos5410_pin_ctrl[] __initconst = {
719*4882a593Smuzhiyun 	{
720*4882a593Smuzhiyun 		/* pin-controller instance 0 data */
721*4882a593Smuzhiyun 		.pin_banks	= exynos5410_pin_banks0,
722*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5410_pin_banks0),
723*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
724*4882a593Smuzhiyun 		.eint_wkup_init = exynos_eint_wkup_init,
725*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
726*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
727*4882a593Smuzhiyun 	}, {
728*4882a593Smuzhiyun 		/* pin-controller instance 1 data */
729*4882a593Smuzhiyun 		.pin_banks	= exynos5410_pin_banks1,
730*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5410_pin_banks1),
731*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
732*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
733*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
734*4882a593Smuzhiyun 	}, {
735*4882a593Smuzhiyun 		/* pin-controller instance 2 data */
736*4882a593Smuzhiyun 		.pin_banks	= exynos5410_pin_banks2,
737*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5410_pin_banks2),
738*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
739*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
740*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
741*4882a593Smuzhiyun 	}, {
742*4882a593Smuzhiyun 		/* pin-controller instance 3 data */
743*4882a593Smuzhiyun 		.pin_banks	= exynos5410_pin_banks3,
744*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5410_pin_banks3),
745*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
746*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
747*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
748*4882a593Smuzhiyun 	},
749*4882a593Smuzhiyun };
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun const struct samsung_pinctrl_of_match_data exynos5410_of_data __initconst = {
752*4882a593Smuzhiyun 	.ctrl		= exynos5410_pin_ctrl,
753*4882a593Smuzhiyun 	.num_ctrl	= ARRAY_SIZE(exynos5410_pin_ctrl),
754*4882a593Smuzhiyun };
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun /* pin banks of exynos5420 pin-controller 0 */
757*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5420_pin_banks0[] __initconst = {
758*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
759*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpy7", 0x00),
760*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC00, "gpx0", 0x00),
761*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC20, "gpx1", 0x04),
762*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC40, "gpx2", 0x08),
763*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTW(8, 0xC60, "gpx3", 0x0c),
764*4882a593Smuzhiyun };
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun /* pin banks of exynos5420 pin-controller 1 */
767*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5420_pin_banks1[] __initconst = {
768*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
769*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpc0", 0x00),
770*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x020, "gpc1", 0x04),
771*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x040, "gpc2", 0x08),
772*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x060, "gpc3", 0x0c),
773*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x080, "gpc4", 0x10),
774*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpd1", 0x14),
775*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x0C0, "gpy0"),
776*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(4, 0x0E0, "gpy1"),
777*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(6, 0x100, "gpy2"),
778*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x120, "gpy3"),
779*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x140, "gpy4"),
780*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x160, "gpy5"),
781*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTN(8, 0x180, "gpy6"),
782*4882a593Smuzhiyun };
783*4882a593Smuzhiyun 
784*4882a593Smuzhiyun /* pin banks of exynos5420 pin-controller 2 */
785*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5420_pin_banks2[] __initconst = {
786*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
787*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpe0", 0x00),
788*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x020, "gpe1", 0x04),
789*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x040, "gpf0", 0x08),
790*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x060, "gpf1", 0x0c),
791*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x080, "gpg0", 0x10),
792*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0A0, "gpg1", 0x14),
793*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x0C0, "gpg2", 0x18),
794*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0E0, "gpj4", 0x1c),
795*4882a593Smuzhiyun };
796*4882a593Smuzhiyun 
797*4882a593Smuzhiyun /* pin banks of exynos5420 pin-controller 3 */
798*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5420_pin_banks3[] __initconst = {
799*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
800*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x000, "gpa0", 0x00),
801*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(6, 0x020, "gpa1", 0x04),
802*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x040, "gpa2", 0x08),
803*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x060, "gpb0", 0x0c),
804*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(5, 0x080, "gpb1", 0x10),
805*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(4, 0x0A0, "gpb2", 0x14),
806*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x0C0, "gpb3", 0x18),
807*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(2, 0x0E0, "gpb4", 0x1c),
808*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(8, 0x100, "gph0", 0x20),
809*4882a593Smuzhiyun };
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun /* pin banks of exynos5420 pin-controller 4 */
812*4882a593Smuzhiyun static const struct samsung_pin_bank_data exynos5420_pin_banks4[] __initconst = {
813*4882a593Smuzhiyun 	/* Must start with EINTG banks, ordered by EINT group number. */
814*4882a593Smuzhiyun 	EXYNOS_PIN_BANK_EINTG(7, 0x000, "gpz", 0x00),
815*4882a593Smuzhiyun };
816*4882a593Smuzhiyun 
817*4882a593Smuzhiyun /* PMU pad retention groups registers for Exynos5420 (without audio) */
818*4882a593Smuzhiyun static const u32 exynos5420_retention_regs[] = {
819*4882a593Smuzhiyun 	EXYNOS_PAD_RET_DRAM_OPTION,
820*4882a593Smuzhiyun 	EXYNOS_PAD_RET_JTAG_OPTION,
821*4882a593Smuzhiyun 	EXYNOS5420_PAD_RET_GPIO_OPTION,
822*4882a593Smuzhiyun 	EXYNOS5420_PAD_RET_UART_OPTION,
823*4882a593Smuzhiyun 	EXYNOS5420_PAD_RET_MMCA_OPTION,
824*4882a593Smuzhiyun 	EXYNOS5420_PAD_RET_MMCB_OPTION,
825*4882a593Smuzhiyun 	EXYNOS5420_PAD_RET_MMCC_OPTION,
826*4882a593Smuzhiyun 	EXYNOS5420_PAD_RET_HSI_OPTION,
827*4882a593Smuzhiyun 	EXYNOS_PAD_RET_EBIA_OPTION,
828*4882a593Smuzhiyun 	EXYNOS_PAD_RET_EBIB_OPTION,
829*4882a593Smuzhiyun 	EXYNOS5420_PAD_RET_SPI_OPTION,
830*4882a593Smuzhiyun 	EXYNOS5420_PAD_RET_DRAM_COREBLK_OPTION,
831*4882a593Smuzhiyun };
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun static const struct samsung_retention_data exynos5420_retention_data __initconst = {
834*4882a593Smuzhiyun 	.regs	 = exynos5420_retention_regs,
835*4882a593Smuzhiyun 	.nr_regs = ARRAY_SIZE(exynos5420_retention_regs),
836*4882a593Smuzhiyun 	.value	 = EXYNOS_WAKEUP_FROM_LOWPWR,
837*4882a593Smuzhiyun 	.refcnt	 = &exynos_shared_retention_refcnt,
838*4882a593Smuzhiyun 	.init	 = exynos_retention_init,
839*4882a593Smuzhiyun };
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun /*
842*4882a593Smuzhiyun  * Samsung pinctrl driver data for Exynos5420 SoC. Exynos5420 SoC includes
843*4882a593Smuzhiyun  * four gpio/pin-mux/pinconfig controllers.
844*4882a593Smuzhiyun  */
845*4882a593Smuzhiyun static const struct samsung_pin_ctrl exynos5420_pin_ctrl[] __initconst = {
846*4882a593Smuzhiyun 	{
847*4882a593Smuzhiyun 		/* pin-controller instance 0 data */
848*4882a593Smuzhiyun 		.pin_banks	= exynos5420_pin_banks0,
849*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5420_pin_banks0),
850*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
851*4882a593Smuzhiyun 		.eint_wkup_init = exynos_eint_wkup_init,
852*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
853*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
854*4882a593Smuzhiyun 		.retention_data	= &exynos5420_retention_data,
855*4882a593Smuzhiyun 	}, {
856*4882a593Smuzhiyun 		/* pin-controller instance 1 data */
857*4882a593Smuzhiyun 		.pin_banks	= exynos5420_pin_banks1,
858*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5420_pin_banks1),
859*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
860*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
861*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
862*4882a593Smuzhiyun 		.retention_data	= &exynos5420_retention_data,
863*4882a593Smuzhiyun 	}, {
864*4882a593Smuzhiyun 		/* pin-controller instance 2 data */
865*4882a593Smuzhiyun 		.pin_banks	= exynos5420_pin_banks2,
866*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5420_pin_banks2),
867*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
868*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
869*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
870*4882a593Smuzhiyun 		.retention_data	= &exynos5420_retention_data,
871*4882a593Smuzhiyun 	}, {
872*4882a593Smuzhiyun 		/* pin-controller instance 3 data */
873*4882a593Smuzhiyun 		.pin_banks	= exynos5420_pin_banks3,
874*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5420_pin_banks3),
875*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
876*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
877*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
878*4882a593Smuzhiyun 		.retention_data	= &exynos5420_retention_data,
879*4882a593Smuzhiyun 	}, {
880*4882a593Smuzhiyun 		/* pin-controller instance 4 data */
881*4882a593Smuzhiyun 		.pin_banks	= exynos5420_pin_banks4,
882*4882a593Smuzhiyun 		.nr_banks	= ARRAY_SIZE(exynos5420_pin_banks4),
883*4882a593Smuzhiyun 		.eint_gpio_init = exynos_eint_gpio_init,
884*4882a593Smuzhiyun 		.suspend	= exynos_pinctrl_suspend,
885*4882a593Smuzhiyun 		.resume		= exynos_pinctrl_resume,
886*4882a593Smuzhiyun 		.retention_data	= &exynos4_audio_retention_data,
887*4882a593Smuzhiyun 	},
888*4882a593Smuzhiyun };
889*4882a593Smuzhiyun 
890*4882a593Smuzhiyun const struct samsung_pinctrl_of_match_data exynos5420_of_data __initconst = {
891*4882a593Smuzhiyun 	.ctrl		= exynos5420_pin_ctrl,
892*4882a593Smuzhiyun 	.num_ctrl	= ARRAY_SIZE(exynos5420_pin_ctrl),
893*4882a593Smuzhiyun };
894