xref: /rk3399_rockchip-uboot/drivers/gpio/mxc_gpio.c (revision 90d0ce442b2814a193ffd3009d11f4f5aca4d325)
1c4ea1424SStefano Babic /*
2c4ea1424SStefano Babic  * Copyright (C) 2009
3c4ea1424SStefano Babic  * Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de>
4c4ea1424SStefano Babic  *
5d8e0ca85SStefano Babic  * Copyright (C) 2011
6d8e0ca85SStefano Babic  * Stefano Babic, DENX Software Engineering, <sbabic@denx.de>
7d8e0ca85SStefano Babic  *
81a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
9c4ea1424SStefano Babic  */
10c4ea1424SStefano Babic #include <common.h>
11441d0cffSSimon Glass #include <errno.h>
12441d0cffSSimon Glass #include <dm.h>
13441d0cffSSimon Glass #include <malloc.h>
14c4ea1424SStefano Babic #include <asm/arch/imx-regs.h>
15d8e0ca85SStefano Babic #include <asm/gpio.h>
16c4ea1424SStefano Babic #include <asm/io.h>
17c4ea1424SStefano Babic 
18d8e0ca85SStefano Babic enum mxc_gpio_direction {
19d8e0ca85SStefano Babic 	MXC_GPIO_DIRECTION_IN,
20d8e0ca85SStefano Babic 	MXC_GPIO_DIRECTION_OUT,
21d8e0ca85SStefano Babic };
22d8e0ca85SStefano Babic 
23441d0cffSSimon Glass #define GPIO_PER_BANK			32
24441d0cffSSimon Glass 
25441d0cffSSimon Glass struct mxc_gpio_plat {
26637a7693SPeng Fan 	int bank_index;
27441d0cffSSimon Glass 	struct gpio_regs *regs;
28441d0cffSSimon Glass };
29441d0cffSSimon Glass 
30441d0cffSSimon Glass struct mxc_bank_info {
31441d0cffSSimon Glass 	struct gpio_regs *regs;
32441d0cffSSimon Glass };
33441d0cffSSimon Glass 
34441d0cffSSimon Glass #ifndef CONFIG_DM_GPIO
358d28c211SVikram Narayanan #define GPIO_TO_PORT(n)		(n / 32)
36d8e0ca85SStefano Babic 
37c4ea1424SStefano Babic /* GPIO port description */
38c4ea1424SStefano Babic static unsigned long gpio_ports[] = {
39c4ea1424SStefano Babic 	[0] = GPIO1_BASE_ADDR,
40c4ea1424SStefano Babic 	[1] = GPIO2_BASE_ADDR,
41c4ea1424SStefano Babic 	[2] = GPIO3_BASE_ADDR,
42e71c39deStrem #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
4326dd3464SAdrian Alonso 		defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
4426dd3464SAdrian Alonso 		defined(CONFIG_MX7)
45c4ea1424SStefano Babic 	[3] = GPIO4_BASE_ADDR,
46c4ea1424SStefano Babic #endif
4726dd3464SAdrian Alonso #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
4826dd3464SAdrian Alonso 		defined(CONFIG_MX7)
4901643ec1SLiu Hui-R64343 	[4] = GPIO5_BASE_ADDR,
50f2753b06SPeng Fan #ifndef CONFIG_MX6UL
5101643ec1SLiu Hui-R64343 	[5] = GPIO6_BASE_ADDR,
52e71c39deStrem #endif
53f2753b06SPeng Fan #endif
5426dd3464SAdrian Alonso #if defined(CONFIG_MX53) || defined(CONFIG_MX6) || defined(CONFIG_MX7)
55f2753b06SPeng Fan #ifndef CONFIG_MX6UL
5601643ec1SLiu Hui-R64343 	[6] = GPIO7_BASE_ADDR,
5701643ec1SLiu Hui-R64343 #endif
58f2753b06SPeng Fan #endif
59c4ea1424SStefano Babic };
60c4ea1424SStefano Babic 
mxc_gpio_direction(unsigned int gpio,enum mxc_gpio_direction direction)61d8e0ca85SStefano Babic static int mxc_gpio_direction(unsigned int gpio,
62d8e0ca85SStefano Babic 	enum mxc_gpio_direction direction)
63c4ea1424SStefano Babic {
64be282554SVikram Narayanan 	unsigned int port = GPIO_TO_PORT(gpio);
65c4ea1424SStefano Babic 	struct gpio_regs *regs;
66c4ea1424SStefano Babic 	u32 l;
67c4ea1424SStefano Babic 
68c4ea1424SStefano Babic 	if (port >= ARRAY_SIZE(gpio_ports))
69365d6070SJoe Hershberger 		return -1;
70c4ea1424SStefano Babic 
71c4ea1424SStefano Babic 	gpio &= 0x1f;
72c4ea1424SStefano Babic 
73c4ea1424SStefano Babic 	regs = (struct gpio_regs *)gpio_ports[port];
74c4ea1424SStefano Babic 
75c4ea1424SStefano Babic 	l = readl(&regs->gpio_dir);
76c4ea1424SStefano Babic 
77c4ea1424SStefano Babic 	switch (direction) {
78c4ea1424SStefano Babic 	case MXC_GPIO_DIRECTION_OUT:
79c4ea1424SStefano Babic 		l |= 1 << gpio;
80c4ea1424SStefano Babic 		break;
81c4ea1424SStefano Babic 	case MXC_GPIO_DIRECTION_IN:
82c4ea1424SStefano Babic 		l &= ~(1 << gpio);
83c4ea1424SStefano Babic 	}
84c4ea1424SStefano Babic 	writel(l, &regs->gpio_dir);
85c4ea1424SStefano Babic 
86c4ea1424SStefano Babic 	return 0;
87c4ea1424SStefano Babic }
88c4ea1424SStefano Babic 
gpio_set_value(unsigned gpio,int value)89365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value)
90c4ea1424SStefano Babic {
91be282554SVikram Narayanan 	unsigned int port = GPIO_TO_PORT(gpio);
92c4ea1424SStefano Babic 	struct gpio_regs *regs;
93c4ea1424SStefano Babic 	u32 l;
94c4ea1424SStefano Babic 
95c4ea1424SStefano Babic 	if (port >= ARRAY_SIZE(gpio_ports))
96365d6070SJoe Hershberger 		return -1;
97c4ea1424SStefano Babic 
98c4ea1424SStefano Babic 	gpio &= 0x1f;
99c4ea1424SStefano Babic 
100c4ea1424SStefano Babic 	regs = (struct gpio_regs *)gpio_ports[port];
101c4ea1424SStefano Babic 
102c4ea1424SStefano Babic 	l = readl(&regs->gpio_dr);
103c4ea1424SStefano Babic 	if (value)
104c4ea1424SStefano Babic 		l |= 1 << gpio;
105c4ea1424SStefano Babic 	else
106c4ea1424SStefano Babic 		l &= ~(1 << gpio);
107c4ea1424SStefano Babic 	writel(l, &regs->gpio_dr);
108365d6070SJoe Hershberger 
109365d6070SJoe Hershberger 	return 0;
110c4ea1424SStefano Babic }
111c4ea1424SStefano Babic 
gpio_get_value(unsigned gpio)112365d6070SJoe Hershberger int gpio_get_value(unsigned gpio)
113c4ea1424SStefano Babic {
114be282554SVikram Narayanan 	unsigned int port = GPIO_TO_PORT(gpio);
115c4ea1424SStefano Babic 	struct gpio_regs *regs;
116365d6070SJoe Hershberger 	u32 val;
117c4ea1424SStefano Babic 
118c4ea1424SStefano Babic 	if (port >= ARRAY_SIZE(gpio_ports))
119365d6070SJoe Hershberger 		return -1;
120c4ea1424SStefano Babic 
121c4ea1424SStefano Babic 	gpio &= 0x1f;
122c4ea1424SStefano Babic 
123c4ea1424SStefano Babic 	regs = (struct gpio_regs *)gpio_ports[port];
124c4ea1424SStefano Babic 
1255dafa454SBenoît Thébaudeau 	val = (readl(&regs->gpio_psr) >> gpio) & 0x01;
126c4ea1424SStefano Babic 
127365d6070SJoe Hershberger 	return val;
128c4ea1424SStefano Babic }
129d8e0ca85SStefano Babic 
gpio_request(unsigned gpio,const char * label)130365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label)
131d8e0ca85SStefano Babic {
132be282554SVikram Narayanan 	unsigned int port = GPIO_TO_PORT(gpio);
133d8e0ca85SStefano Babic 	if (port >= ARRAY_SIZE(gpio_ports))
134365d6070SJoe Hershberger 		return -1;
135d8e0ca85SStefano Babic 	return 0;
136d8e0ca85SStefano Babic }
137d8e0ca85SStefano Babic 
gpio_free(unsigned gpio)138365d6070SJoe Hershberger int gpio_free(unsigned gpio)
139d8e0ca85SStefano Babic {
140365d6070SJoe Hershberger 	return 0;
141d8e0ca85SStefano Babic }
142d8e0ca85SStefano Babic 
gpio_direction_input(unsigned gpio)143365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio)
144d8e0ca85SStefano Babic {
145365d6070SJoe Hershberger 	return mxc_gpio_direction(gpio, MXC_GPIO_DIRECTION_IN);
146d8e0ca85SStefano Babic }
147d8e0ca85SStefano Babic 
gpio_direction_output(unsigned gpio,int value)148365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value)
149d8e0ca85SStefano Babic {
15004c79cbdSDirk Behme 	int ret = gpio_set_value(gpio, value);
151d8e0ca85SStefano Babic 
152d8e0ca85SStefano Babic 	if (ret < 0)
153d8e0ca85SStefano Babic 		return ret;
154d8e0ca85SStefano Babic 
15504c79cbdSDirk Behme 	return mxc_gpio_direction(gpio, MXC_GPIO_DIRECTION_OUT);
156d8e0ca85SStefano Babic }
157441d0cffSSimon Glass #endif
158441d0cffSSimon Glass 
159441d0cffSSimon Glass #ifdef CONFIG_DM_GPIO
16099c0ae16SPeng Fan #include <fdtdec.h>
16199c0ae16SPeng Fan DECLARE_GLOBAL_DATA_PTR;
16299c0ae16SPeng Fan 
mxc_gpio_is_output(struct gpio_regs * regs,int offset)163441d0cffSSimon Glass static int mxc_gpio_is_output(struct gpio_regs *regs, int offset)
164441d0cffSSimon Glass {
165441d0cffSSimon Glass 	u32 val;
166441d0cffSSimon Glass 
167441d0cffSSimon Glass 	val = readl(&regs->gpio_dir);
168441d0cffSSimon Glass 
169441d0cffSSimon Glass 	return val & (1 << offset) ? 1 : 0;
170441d0cffSSimon Glass }
171441d0cffSSimon Glass 
mxc_gpio_bank_direction(struct gpio_regs * regs,int offset,enum mxc_gpio_direction direction)172441d0cffSSimon Glass static void mxc_gpio_bank_direction(struct gpio_regs *regs, int offset,
173441d0cffSSimon Glass 				    enum mxc_gpio_direction direction)
174441d0cffSSimon Glass {
175441d0cffSSimon Glass 	u32 l;
176441d0cffSSimon Glass 
177441d0cffSSimon Glass 	l = readl(&regs->gpio_dir);
178441d0cffSSimon Glass 
179441d0cffSSimon Glass 	switch (direction) {
180441d0cffSSimon Glass 	case MXC_GPIO_DIRECTION_OUT:
181441d0cffSSimon Glass 		l |= 1 << offset;
182441d0cffSSimon Glass 		break;
183441d0cffSSimon Glass 	case MXC_GPIO_DIRECTION_IN:
184441d0cffSSimon Glass 		l &= ~(1 << offset);
185441d0cffSSimon Glass 	}
186441d0cffSSimon Glass 	writel(l, &regs->gpio_dir);
187441d0cffSSimon Glass }
188441d0cffSSimon Glass 
mxc_gpio_bank_set_value(struct gpio_regs * regs,int offset,int value)189441d0cffSSimon Glass static void mxc_gpio_bank_set_value(struct gpio_regs *regs, int offset,
190441d0cffSSimon Glass 				    int value)
191441d0cffSSimon Glass {
192441d0cffSSimon Glass 	u32 l;
193441d0cffSSimon Glass 
194441d0cffSSimon Glass 	l = readl(&regs->gpio_dr);
195441d0cffSSimon Glass 	if (value)
196441d0cffSSimon Glass 		l |= 1 << offset;
197441d0cffSSimon Glass 	else
198441d0cffSSimon Glass 		l &= ~(1 << offset);
199441d0cffSSimon Glass 	writel(l, &regs->gpio_dr);
200441d0cffSSimon Glass }
201441d0cffSSimon Glass 
mxc_gpio_bank_get_value(struct gpio_regs * regs,int offset)202441d0cffSSimon Glass static int mxc_gpio_bank_get_value(struct gpio_regs *regs, int offset)
203441d0cffSSimon Glass {
204441d0cffSSimon Glass 	return (readl(&regs->gpio_psr) >> offset) & 0x01;
205441d0cffSSimon Glass }
206441d0cffSSimon Glass 
207441d0cffSSimon Glass /* set GPIO pin 'gpio' as an input */
mxc_gpio_direction_input(struct udevice * dev,unsigned offset)208441d0cffSSimon Glass static int mxc_gpio_direction_input(struct udevice *dev, unsigned offset)
209441d0cffSSimon Glass {
210441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
211441d0cffSSimon Glass 
212441d0cffSSimon Glass 	/* Configure GPIO direction as input. */
213441d0cffSSimon Glass 	mxc_gpio_bank_direction(bank->regs, offset, MXC_GPIO_DIRECTION_IN);
214441d0cffSSimon Glass 
215441d0cffSSimon Glass 	return 0;
216441d0cffSSimon Glass }
217441d0cffSSimon Glass 
218441d0cffSSimon Glass /* set GPIO pin 'gpio' as an output, with polarity 'value' */
mxc_gpio_direction_output(struct udevice * dev,unsigned offset,int value)219441d0cffSSimon Glass static int mxc_gpio_direction_output(struct udevice *dev, unsigned offset,
220441d0cffSSimon Glass 				       int value)
221441d0cffSSimon Glass {
222441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
223441d0cffSSimon Glass 
224441d0cffSSimon Glass 	/* Configure GPIO output value. */
225441d0cffSSimon Glass 	mxc_gpio_bank_set_value(bank->regs, offset, value);
226441d0cffSSimon Glass 
227441d0cffSSimon Glass 	/* Configure GPIO direction as output. */
228441d0cffSSimon Glass 	mxc_gpio_bank_direction(bank->regs, offset, MXC_GPIO_DIRECTION_OUT);
229441d0cffSSimon Glass 
230441d0cffSSimon Glass 	return 0;
231441d0cffSSimon Glass }
232441d0cffSSimon Glass 
233441d0cffSSimon Glass /* read GPIO IN value of pin 'gpio' */
mxc_gpio_get_value(struct udevice * dev,unsigned offset)234441d0cffSSimon Glass static int mxc_gpio_get_value(struct udevice *dev, unsigned offset)
235441d0cffSSimon Glass {
236441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
237441d0cffSSimon Glass 
238441d0cffSSimon Glass 	return mxc_gpio_bank_get_value(bank->regs, offset);
239441d0cffSSimon Glass }
240441d0cffSSimon Glass 
241441d0cffSSimon Glass /* write GPIO OUT value to pin 'gpio' */
mxc_gpio_set_value(struct udevice * dev,unsigned offset,int value)242441d0cffSSimon Glass static int mxc_gpio_set_value(struct udevice *dev, unsigned offset,
243441d0cffSSimon Glass 				 int value)
244441d0cffSSimon Glass {
245441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
246441d0cffSSimon Glass 
247441d0cffSSimon Glass 	mxc_gpio_bank_set_value(bank->regs, offset, value);
248441d0cffSSimon Glass 
249441d0cffSSimon Glass 	return 0;
250441d0cffSSimon Glass }
251441d0cffSSimon Glass 
mxc_gpio_get_function(struct udevice * dev,unsigned offset)252441d0cffSSimon Glass static int mxc_gpio_get_function(struct udevice *dev, unsigned offset)
253441d0cffSSimon Glass {
254441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
255441d0cffSSimon Glass 
256441d0cffSSimon Glass 	/* GPIOF_FUNC is not implemented yet */
257441d0cffSSimon Glass 	if (mxc_gpio_is_output(bank->regs, offset))
258441d0cffSSimon Glass 		return GPIOF_OUTPUT;
259441d0cffSSimon Glass 	else
260441d0cffSSimon Glass 		return GPIOF_INPUT;
261441d0cffSSimon Glass }
262441d0cffSSimon Glass 
263441d0cffSSimon Glass static const struct dm_gpio_ops gpio_mxc_ops = {
264441d0cffSSimon Glass 	.direction_input	= mxc_gpio_direction_input,
265441d0cffSSimon Glass 	.direction_output	= mxc_gpio_direction_output,
266441d0cffSSimon Glass 	.get_value		= mxc_gpio_get_value,
267441d0cffSSimon Glass 	.set_value		= mxc_gpio_set_value,
268441d0cffSSimon Glass 	.get_function		= mxc_gpio_get_function,
269441d0cffSSimon Glass };
270441d0cffSSimon Glass 
mxc_gpio_probe(struct udevice * dev)271441d0cffSSimon Glass static int mxc_gpio_probe(struct udevice *dev)
272441d0cffSSimon Glass {
273441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
274441d0cffSSimon Glass 	struct mxc_gpio_plat *plat = dev_get_platdata(dev);
275e564f054SSimon Glass 	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
276441d0cffSSimon Glass 	int banknum;
277441d0cffSSimon Glass 	char name[18], *str;
278441d0cffSSimon Glass 
279637a7693SPeng Fan 	banknum = plat->bank_index;
280441d0cffSSimon Glass 	sprintf(name, "GPIO%d_", banknum + 1);
281441d0cffSSimon Glass 	str = strdup(name);
282441d0cffSSimon Glass 	if (!str)
283441d0cffSSimon Glass 		return -ENOMEM;
284441d0cffSSimon Glass 	uc_priv->bank_name = str;
285441d0cffSSimon Glass 	uc_priv->gpio_count = GPIO_PER_BANK;
286441d0cffSSimon Glass 	bank->regs = plat->regs;
287441d0cffSSimon Glass 
288441d0cffSSimon Glass 	return 0;
289441d0cffSSimon Glass }
290441d0cffSSimon Glass 
mxc_gpio_bind(struct udevice * dev)29199c0ae16SPeng Fan static int mxc_gpio_bind(struct udevice *dev)
29299c0ae16SPeng Fan {
29399c0ae16SPeng Fan 	struct mxc_gpio_plat *plat = dev->platdata;
29499c0ae16SPeng Fan 	fdt_addr_t addr;
29599c0ae16SPeng Fan 
29699c0ae16SPeng Fan 	/*
29799c0ae16SPeng Fan 	 * If platdata already exsits, directly return.
29899c0ae16SPeng Fan 	 * Actually only when DT is not supported, platdata
29999c0ae16SPeng Fan 	 * is statically initialized in U_BOOT_DEVICES.Here
30099c0ae16SPeng Fan 	 * will return.
30199c0ae16SPeng Fan 	 */
30299c0ae16SPeng Fan 	if (plat)
30399c0ae16SPeng Fan 		return 0;
30499c0ae16SPeng Fan 
305a821c4afSSimon Glass 	addr = devfdt_get_addr(dev);
30699c0ae16SPeng Fan 	if (addr == FDT_ADDR_T_NONE)
307*90d0ce44SSimon Glass 		return -EINVAL;
30899c0ae16SPeng Fan 
30999c0ae16SPeng Fan 	/*
31099c0ae16SPeng Fan 	 * TODO:
31199c0ae16SPeng Fan 	 * When every board is converted to driver model and DT is supported,
31299c0ae16SPeng Fan 	 * this can be done by auto-alloc feature, but not using calloc
31399c0ae16SPeng Fan 	 * to alloc memory for platdata.
31499c0ae16SPeng Fan 	 */
31599c0ae16SPeng Fan 	plat = calloc(1, sizeof(*plat));
31699c0ae16SPeng Fan 	if (!plat)
31799c0ae16SPeng Fan 		return -ENOMEM;
31899c0ae16SPeng Fan 
31999c0ae16SPeng Fan 	plat->regs = (struct gpio_regs *)addr;
32099c0ae16SPeng Fan 	plat->bank_index = dev->req_seq;
32199c0ae16SPeng Fan 	dev->platdata = plat;
32299c0ae16SPeng Fan 
32399c0ae16SPeng Fan 	return 0;
32499c0ae16SPeng Fan }
32599c0ae16SPeng Fan 
32699c0ae16SPeng Fan static const struct udevice_id mxc_gpio_ids[] = {
32799c0ae16SPeng Fan 	{ .compatible = "fsl,imx35-gpio" },
32899c0ae16SPeng Fan 	{ }
32999c0ae16SPeng Fan };
33099c0ae16SPeng Fan 
331441d0cffSSimon Glass U_BOOT_DRIVER(gpio_mxc) = {
332441d0cffSSimon Glass 	.name	= "gpio_mxc",
333441d0cffSSimon Glass 	.id	= UCLASS_GPIO,
334441d0cffSSimon Glass 	.ops	= &gpio_mxc_ops,
335441d0cffSSimon Glass 	.probe	= mxc_gpio_probe,
336441d0cffSSimon Glass 	.priv_auto_alloc_size = sizeof(struct mxc_bank_info),
33799c0ae16SPeng Fan 	.of_match = mxc_gpio_ids,
33899c0ae16SPeng Fan 	.bind	= mxc_gpio_bind,
33999c0ae16SPeng Fan };
34099c0ae16SPeng Fan 
3410f925822SMasahiro Yamada #if !CONFIG_IS_ENABLED(OF_CONTROL)
34299c0ae16SPeng Fan static const struct mxc_gpio_plat mxc_plat[] = {
34399c0ae16SPeng Fan 	{ 0, (struct gpio_regs *)GPIO1_BASE_ADDR },
34499c0ae16SPeng Fan 	{ 1, (struct gpio_regs *)GPIO2_BASE_ADDR },
34599c0ae16SPeng Fan 	{ 2, (struct gpio_regs *)GPIO3_BASE_ADDR },
34699c0ae16SPeng Fan #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
34799c0ae16SPeng Fan 		defined(CONFIG_MX53) || defined(CONFIG_MX6)
34899c0ae16SPeng Fan 	{ 3, (struct gpio_regs *)GPIO4_BASE_ADDR },
34999c0ae16SPeng Fan #endif
35099c0ae16SPeng Fan #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6)
35199c0ae16SPeng Fan 	{ 4, (struct gpio_regs *)GPIO5_BASE_ADDR },
35299c0ae16SPeng Fan 	{ 5, (struct gpio_regs *)GPIO6_BASE_ADDR },
35399c0ae16SPeng Fan #endif
35499c0ae16SPeng Fan #if defined(CONFIG_MX53) || defined(CONFIG_MX6)
35599c0ae16SPeng Fan 	{ 6, (struct gpio_regs *)GPIO7_BASE_ADDR },
35699c0ae16SPeng Fan #endif
357441d0cffSSimon Glass };
358441d0cffSSimon Glass 
359441d0cffSSimon Glass U_BOOT_DEVICES(mxc_gpios) = {
360441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[0] },
361441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[1] },
362441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[2] },
363441d0cffSSimon Glass #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
364441d0cffSSimon Glass 		defined(CONFIG_MX53) || defined(CONFIG_MX6)
365441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[3] },
366441d0cffSSimon Glass #endif
367441d0cffSSimon Glass #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6)
368441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[4] },
369441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[5] },
370441d0cffSSimon Glass #endif
371441d0cffSSimon Glass #if defined(CONFIG_MX53) || defined(CONFIG_MX6)
372441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[6] },
373441d0cffSSimon Glass #endif
374441d0cffSSimon Glass };
375441d0cffSSimon Glass #endif
37699c0ae16SPeng Fan #endif
377