xref: /openbmc/u-boot/drivers/gpio/mxc_gpio.c (revision 522e035441ca04d99de2fc13b614ad896691e9c9)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2c4ea1424SStefano Babic /*
3c4ea1424SStefano Babic  * Copyright (C) 2009
4c4ea1424SStefano Babic  * Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de>
5c4ea1424SStefano Babic  *
6d8e0ca85SStefano Babic  * Copyright (C) 2011
7d8e0ca85SStefano Babic  * Stefano Babic, DENX Software Engineering, <sbabic@denx.de>
8c4ea1424SStefano Babic  */
9c4ea1424SStefano Babic #include <common.h>
10441d0cffSSimon Glass #include <errno.h>
11441d0cffSSimon Glass #include <dm.h>
12441d0cffSSimon Glass #include <malloc.h>
13c4ea1424SStefano Babic #include <asm/arch/imx-regs.h>
14d8e0ca85SStefano Babic #include <asm/gpio.h>
15c4ea1424SStefano Babic #include <asm/io.h>
16c4ea1424SStefano Babic 
17d8e0ca85SStefano Babic enum mxc_gpio_direction {
18d8e0ca85SStefano Babic 	MXC_GPIO_DIRECTION_IN,
19d8e0ca85SStefano Babic 	MXC_GPIO_DIRECTION_OUT,
20d8e0ca85SStefano Babic };
21d8e0ca85SStefano Babic 
22441d0cffSSimon Glass #define GPIO_PER_BANK			32
23441d0cffSSimon Glass 
24441d0cffSSimon Glass struct mxc_gpio_plat {
25637a7693SPeng Fan 	int bank_index;
26441d0cffSSimon Glass 	struct gpio_regs *regs;
27441d0cffSSimon Glass };
28441d0cffSSimon Glass 
29441d0cffSSimon Glass struct mxc_bank_info {
30441d0cffSSimon Glass 	struct gpio_regs *regs;
31441d0cffSSimon Glass };
32441d0cffSSimon Glass 
33441d0cffSSimon Glass #ifndef CONFIG_DM_GPIO
348d28c211SVikram Narayanan #define GPIO_TO_PORT(n)		(n / 32)
35d8e0ca85SStefano Babic 
36c4ea1424SStefano Babic /* GPIO port description */
37c4ea1424SStefano Babic static unsigned long gpio_ports[] = {
38c4ea1424SStefano Babic 	[0] = GPIO1_BASE_ADDR,
39c4ea1424SStefano Babic 	[1] = GPIO2_BASE_ADDR,
40c4ea1424SStefano Babic 	[2] = GPIO3_BASE_ADDR,
41e71c39deStrem #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
4226dd3464SAdrian Alonso 		defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
43*cd357ad1SPeng Fan 		defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || \
448b2a31f1SPeng Fan 		defined(CONFIG_ARCH_IMX8)
45c4ea1424SStefano Babic 	[3] = GPIO4_BASE_ADDR,
46c4ea1424SStefano Babic #endif
4726dd3464SAdrian Alonso #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
48*cd357ad1SPeng Fan 		defined(CONFIG_MX7) || defined(CONFIG_IMX8M) || \
498b2a31f1SPeng Fan 		defined(CONFIG_ARCH_IMX8)
5001643ec1SLiu Hui-R64343 	[4] = GPIO5_BASE_ADDR,
51*cd357ad1SPeng Fan #if !(defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL) || defined(CONFIG_IMX8M))
5201643ec1SLiu Hui-R64343 	[5] = GPIO6_BASE_ADDR,
53e71c39deStrem #endif
54f2753b06SPeng Fan #endif
558b2a31f1SPeng Fan #if defined(CONFIG_MX53) || defined(CONFIG_MX6) || defined(CONFIG_MX7) || \
568b2a31f1SPeng Fan 		defined(CONFIG_ARCH_IMX8)
57290e7cfdSFabio Estevam #if !(defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL))
5801643ec1SLiu Hui-R64343 	[6] = GPIO7_BASE_ADDR,
5901643ec1SLiu Hui-R64343 #endif
60f2753b06SPeng Fan #endif
618b2a31f1SPeng Fan #if defined(CONFIG_ARCH_IMX8)
628b2a31f1SPeng Fan 	[7] = GPIO8_BASE_ADDR,
638b2a31f1SPeng Fan #endif
64c4ea1424SStefano Babic };
65c4ea1424SStefano Babic 
mxc_gpio_direction(unsigned int gpio,enum mxc_gpio_direction direction)66d8e0ca85SStefano Babic static int mxc_gpio_direction(unsigned int gpio,
67d8e0ca85SStefano Babic 	enum mxc_gpio_direction direction)
68c4ea1424SStefano Babic {
69be282554SVikram Narayanan 	unsigned int port = GPIO_TO_PORT(gpio);
70c4ea1424SStefano Babic 	struct gpio_regs *regs;
71c4ea1424SStefano Babic 	u32 l;
72c4ea1424SStefano Babic 
73c4ea1424SStefano Babic 	if (port >= ARRAY_SIZE(gpio_ports))
74365d6070SJoe Hershberger 		return -1;
75c4ea1424SStefano Babic 
76c4ea1424SStefano Babic 	gpio &= 0x1f;
77c4ea1424SStefano Babic 
78c4ea1424SStefano Babic 	regs = (struct gpio_regs *)gpio_ports[port];
79c4ea1424SStefano Babic 
80c4ea1424SStefano Babic 	l = readl(&regs->gpio_dir);
81c4ea1424SStefano Babic 
82c4ea1424SStefano Babic 	switch (direction) {
83c4ea1424SStefano Babic 	case MXC_GPIO_DIRECTION_OUT:
84c4ea1424SStefano Babic 		l |= 1 << gpio;
85c4ea1424SStefano Babic 		break;
86c4ea1424SStefano Babic 	case MXC_GPIO_DIRECTION_IN:
87c4ea1424SStefano Babic 		l &= ~(1 << gpio);
88c4ea1424SStefano Babic 	}
89c4ea1424SStefano Babic 	writel(l, &regs->gpio_dir);
90c4ea1424SStefano Babic 
91c4ea1424SStefano Babic 	return 0;
92c4ea1424SStefano Babic }
93c4ea1424SStefano Babic 
gpio_set_value(unsigned gpio,int value)94365d6070SJoe Hershberger int gpio_set_value(unsigned gpio, int value)
95c4ea1424SStefano Babic {
96be282554SVikram Narayanan 	unsigned int port = GPIO_TO_PORT(gpio);
97c4ea1424SStefano Babic 	struct gpio_regs *regs;
98c4ea1424SStefano Babic 	u32 l;
99c4ea1424SStefano Babic 
100c4ea1424SStefano Babic 	if (port >= ARRAY_SIZE(gpio_ports))
101365d6070SJoe Hershberger 		return -1;
102c4ea1424SStefano Babic 
103c4ea1424SStefano Babic 	gpio &= 0x1f;
104c4ea1424SStefano Babic 
105c4ea1424SStefano Babic 	regs = (struct gpio_regs *)gpio_ports[port];
106c4ea1424SStefano Babic 
107c4ea1424SStefano Babic 	l = readl(&regs->gpio_dr);
108c4ea1424SStefano Babic 	if (value)
109c4ea1424SStefano Babic 		l |= 1 << gpio;
110c4ea1424SStefano Babic 	else
111c4ea1424SStefano Babic 		l &= ~(1 << gpio);
112c4ea1424SStefano Babic 	writel(l, &regs->gpio_dr);
113365d6070SJoe Hershberger 
114365d6070SJoe Hershberger 	return 0;
115c4ea1424SStefano Babic }
116c4ea1424SStefano Babic 
gpio_get_value(unsigned gpio)117365d6070SJoe Hershberger int gpio_get_value(unsigned gpio)
118c4ea1424SStefano Babic {
119be282554SVikram Narayanan 	unsigned int port = GPIO_TO_PORT(gpio);
120c4ea1424SStefano Babic 	struct gpio_regs *regs;
121365d6070SJoe Hershberger 	u32 val;
122c4ea1424SStefano Babic 
123c4ea1424SStefano Babic 	if (port >= ARRAY_SIZE(gpio_ports))
124365d6070SJoe Hershberger 		return -1;
125c4ea1424SStefano Babic 
126c4ea1424SStefano Babic 	gpio &= 0x1f;
127c4ea1424SStefano Babic 
128c4ea1424SStefano Babic 	regs = (struct gpio_regs *)gpio_ports[port];
129c4ea1424SStefano Babic 
1305dafa454SBenoît Thébaudeau 	val = (readl(&regs->gpio_psr) >> gpio) & 0x01;
131c4ea1424SStefano Babic 
132365d6070SJoe Hershberger 	return val;
133c4ea1424SStefano Babic }
134d8e0ca85SStefano Babic 
gpio_request(unsigned gpio,const char * label)135365d6070SJoe Hershberger int gpio_request(unsigned gpio, const char *label)
136d8e0ca85SStefano Babic {
137be282554SVikram Narayanan 	unsigned int port = GPIO_TO_PORT(gpio);
138d8e0ca85SStefano Babic 	if (port >= ARRAY_SIZE(gpio_ports))
139365d6070SJoe Hershberger 		return -1;
140d8e0ca85SStefano Babic 	return 0;
141d8e0ca85SStefano Babic }
142d8e0ca85SStefano Babic 
gpio_free(unsigned gpio)143365d6070SJoe Hershberger int gpio_free(unsigned gpio)
144d8e0ca85SStefano Babic {
145365d6070SJoe Hershberger 	return 0;
146d8e0ca85SStefano Babic }
147d8e0ca85SStefano Babic 
gpio_direction_input(unsigned gpio)148365d6070SJoe Hershberger int gpio_direction_input(unsigned gpio)
149d8e0ca85SStefano Babic {
150365d6070SJoe Hershberger 	return mxc_gpio_direction(gpio, MXC_GPIO_DIRECTION_IN);
151d8e0ca85SStefano Babic }
152d8e0ca85SStefano Babic 
gpio_direction_output(unsigned gpio,int value)153365d6070SJoe Hershberger int gpio_direction_output(unsigned gpio, int value)
154d8e0ca85SStefano Babic {
15504c79cbdSDirk Behme 	int ret = gpio_set_value(gpio, value);
156d8e0ca85SStefano Babic 
157d8e0ca85SStefano Babic 	if (ret < 0)
158d8e0ca85SStefano Babic 		return ret;
159d8e0ca85SStefano Babic 
16004c79cbdSDirk Behme 	return mxc_gpio_direction(gpio, MXC_GPIO_DIRECTION_OUT);
161d8e0ca85SStefano Babic }
162441d0cffSSimon Glass #endif
163441d0cffSSimon Glass 
164441d0cffSSimon Glass #ifdef CONFIG_DM_GPIO
16599c0ae16SPeng Fan #include <fdtdec.h>
mxc_gpio_is_output(struct gpio_regs * regs,int offset)166441d0cffSSimon Glass static int mxc_gpio_is_output(struct gpio_regs *regs, int offset)
167441d0cffSSimon Glass {
168441d0cffSSimon Glass 	u32 val;
169441d0cffSSimon Glass 
170441d0cffSSimon Glass 	val = readl(&regs->gpio_dir);
171441d0cffSSimon Glass 
172441d0cffSSimon Glass 	return val & (1 << offset) ? 1 : 0;
173441d0cffSSimon Glass }
174441d0cffSSimon Glass 
mxc_gpio_bank_direction(struct gpio_regs * regs,int offset,enum mxc_gpio_direction direction)175441d0cffSSimon Glass static void mxc_gpio_bank_direction(struct gpio_regs *regs, int offset,
176441d0cffSSimon Glass 				    enum mxc_gpio_direction direction)
177441d0cffSSimon Glass {
178441d0cffSSimon Glass 	u32 l;
179441d0cffSSimon Glass 
180441d0cffSSimon Glass 	l = readl(&regs->gpio_dir);
181441d0cffSSimon Glass 
182441d0cffSSimon Glass 	switch (direction) {
183441d0cffSSimon Glass 	case MXC_GPIO_DIRECTION_OUT:
184441d0cffSSimon Glass 		l |= 1 << offset;
185441d0cffSSimon Glass 		break;
186441d0cffSSimon Glass 	case MXC_GPIO_DIRECTION_IN:
187441d0cffSSimon Glass 		l &= ~(1 << offset);
188441d0cffSSimon Glass 	}
189441d0cffSSimon Glass 	writel(l, &regs->gpio_dir);
190441d0cffSSimon Glass }
191441d0cffSSimon Glass 
mxc_gpio_bank_set_value(struct gpio_regs * regs,int offset,int value)192441d0cffSSimon Glass static void mxc_gpio_bank_set_value(struct gpio_regs *regs, int offset,
193441d0cffSSimon Glass 				    int value)
194441d0cffSSimon Glass {
195441d0cffSSimon Glass 	u32 l;
196441d0cffSSimon Glass 
197441d0cffSSimon Glass 	l = readl(&regs->gpio_dr);
198441d0cffSSimon Glass 	if (value)
199441d0cffSSimon Glass 		l |= 1 << offset;
200441d0cffSSimon Glass 	else
201441d0cffSSimon Glass 		l &= ~(1 << offset);
202441d0cffSSimon Glass 	writel(l, &regs->gpio_dr);
203441d0cffSSimon Glass }
204441d0cffSSimon Glass 
mxc_gpio_bank_get_value(struct gpio_regs * regs,int offset)205441d0cffSSimon Glass static int mxc_gpio_bank_get_value(struct gpio_regs *regs, int offset)
206441d0cffSSimon Glass {
207441d0cffSSimon Glass 	return (readl(&regs->gpio_psr) >> offset) & 0x01;
208441d0cffSSimon Glass }
209441d0cffSSimon Glass 
210441d0cffSSimon Glass /* set GPIO pin 'gpio' as an input */
mxc_gpio_direction_input(struct udevice * dev,unsigned offset)211441d0cffSSimon Glass static int mxc_gpio_direction_input(struct udevice *dev, unsigned offset)
212441d0cffSSimon Glass {
213441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
214441d0cffSSimon Glass 
215441d0cffSSimon Glass 	/* Configure GPIO direction as input. */
216441d0cffSSimon Glass 	mxc_gpio_bank_direction(bank->regs, offset, MXC_GPIO_DIRECTION_IN);
217441d0cffSSimon Glass 
218441d0cffSSimon Glass 	return 0;
219441d0cffSSimon Glass }
220441d0cffSSimon Glass 
221441d0cffSSimon Glass /* set GPIO pin 'gpio' as an output, with polarity 'value' */
mxc_gpio_direction_output(struct udevice * dev,unsigned offset,int value)222441d0cffSSimon Glass static int mxc_gpio_direction_output(struct udevice *dev, unsigned offset,
223441d0cffSSimon Glass 				       int value)
224441d0cffSSimon Glass {
225441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
226441d0cffSSimon Glass 
227441d0cffSSimon Glass 	/* Configure GPIO output value. */
228441d0cffSSimon Glass 	mxc_gpio_bank_set_value(bank->regs, offset, value);
229441d0cffSSimon Glass 
230441d0cffSSimon Glass 	/* Configure GPIO direction as output. */
231441d0cffSSimon Glass 	mxc_gpio_bank_direction(bank->regs, offset, MXC_GPIO_DIRECTION_OUT);
232441d0cffSSimon Glass 
233441d0cffSSimon Glass 	return 0;
234441d0cffSSimon Glass }
235441d0cffSSimon Glass 
236441d0cffSSimon Glass /* read GPIO IN value of pin 'gpio' */
mxc_gpio_get_value(struct udevice * dev,unsigned offset)237441d0cffSSimon Glass static int mxc_gpio_get_value(struct udevice *dev, unsigned offset)
238441d0cffSSimon Glass {
239441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
240441d0cffSSimon Glass 
241441d0cffSSimon Glass 	return mxc_gpio_bank_get_value(bank->regs, offset);
242441d0cffSSimon Glass }
243441d0cffSSimon Glass 
244441d0cffSSimon Glass /* write GPIO OUT value to pin 'gpio' */
mxc_gpio_set_value(struct udevice * dev,unsigned offset,int value)245441d0cffSSimon Glass static int mxc_gpio_set_value(struct udevice *dev, unsigned offset,
246441d0cffSSimon Glass 				 int value)
247441d0cffSSimon Glass {
248441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
249441d0cffSSimon Glass 
250441d0cffSSimon Glass 	mxc_gpio_bank_set_value(bank->regs, offset, value);
251441d0cffSSimon Glass 
252441d0cffSSimon Glass 	return 0;
253441d0cffSSimon Glass }
254441d0cffSSimon Glass 
mxc_gpio_get_function(struct udevice * dev,unsigned offset)255441d0cffSSimon Glass static int mxc_gpio_get_function(struct udevice *dev, unsigned offset)
256441d0cffSSimon Glass {
257441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
258441d0cffSSimon Glass 
259441d0cffSSimon Glass 	/* GPIOF_FUNC is not implemented yet */
260441d0cffSSimon Glass 	if (mxc_gpio_is_output(bank->regs, offset))
261441d0cffSSimon Glass 		return GPIOF_OUTPUT;
262441d0cffSSimon Glass 	else
263441d0cffSSimon Glass 		return GPIOF_INPUT;
264441d0cffSSimon Glass }
265441d0cffSSimon Glass 
266441d0cffSSimon Glass static const struct dm_gpio_ops gpio_mxc_ops = {
267441d0cffSSimon Glass 	.direction_input	= mxc_gpio_direction_input,
268441d0cffSSimon Glass 	.direction_output	= mxc_gpio_direction_output,
269441d0cffSSimon Glass 	.get_value		= mxc_gpio_get_value,
270441d0cffSSimon Glass 	.set_value		= mxc_gpio_set_value,
271441d0cffSSimon Glass 	.get_function		= mxc_gpio_get_function,
272441d0cffSSimon Glass };
273441d0cffSSimon Glass 
mxc_gpio_probe(struct udevice * dev)274441d0cffSSimon Glass static int mxc_gpio_probe(struct udevice *dev)
275441d0cffSSimon Glass {
276441d0cffSSimon Glass 	struct mxc_bank_info *bank = dev_get_priv(dev);
277441d0cffSSimon Glass 	struct mxc_gpio_plat *plat = dev_get_platdata(dev);
278e564f054SSimon Glass 	struct gpio_dev_priv *uc_priv = dev_get_uclass_priv(dev);
279441d0cffSSimon Glass 	int banknum;
280441d0cffSSimon Glass 	char name[18], *str;
281441d0cffSSimon Glass 
282637a7693SPeng Fan 	banknum = plat->bank_index;
283441d0cffSSimon Glass 	sprintf(name, "GPIO%d_", banknum + 1);
284441d0cffSSimon Glass 	str = strdup(name);
285441d0cffSSimon Glass 	if (!str)
286441d0cffSSimon Glass 		return -ENOMEM;
287441d0cffSSimon Glass 	uc_priv->bank_name = str;
288441d0cffSSimon Glass 	uc_priv->gpio_count = GPIO_PER_BANK;
289441d0cffSSimon Glass 	bank->regs = plat->regs;
290441d0cffSSimon Glass 
291441d0cffSSimon Glass 	return 0;
292441d0cffSSimon Glass }
293441d0cffSSimon Glass 
mxc_gpio_bind(struct udevice * dev)29499c0ae16SPeng Fan static int mxc_gpio_bind(struct udevice *dev)
29599c0ae16SPeng Fan {
29699c0ae16SPeng Fan 	struct mxc_gpio_plat *plat = dev->platdata;
29799c0ae16SPeng Fan 	fdt_addr_t addr;
29899c0ae16SPeng Fan 
29999c0ae16SPeng Fan 	/*
30099c0ae16SPeng Fan 	 * If platdata already exsits, directly return.
30199c0ae16SPeng Fan 	 * Actually only when DT is not supported, platdata
30299c0ae16SPeng Fan 	 * is statically initialized in U_BOOT_DEVICES.Here
30399c0ae16SPeng Fan 	 * will return.
30499c0ae16SPeng Fan 	 */
30599c0ae16SPeng Fan 	if (plat)
30699c0ae16SPeng Fan 		return 0;
30799c0ae16SPeng Fan 
308a821c4afSSimon Glass 	addr = devfdt_get_addr(dev);
30999c0ae16SPeng Fan 	if (addr == FDT_ADDR_T_NONE)
3107c84319aSSimon Glass 		return -EINVAL;
31199c0ae16SPeng Fan 
31299c0ae16SPeng Fan 	/*
31399c0ae16SPeng Fan 	 * TODO:
31499c0ae16SPeng Fan 	 * When every board is converted to driver model and DT is supported,
31599c0ae16SPeng Fan 	 * this can be done by auto-alloc feature, but not using calloc
31699c0ae16SPeng Fan 	 * to alloc memory for platdata.
3174d686041SSimon Glass 	 *
3184d686041SSimon Glass 	 * For example mxc_plat below uses platform data rather than device
3194d686041SSimon Glass 	 * tree.
3204d686041SSimon Glass 	 *
3214d686041SSimon Glass 	 * NOTE: DO NOT COPY this code if you are using device tree.
32299c0ae16SPeng Fan 	 */
32399c0ae16SPeng Fan 	plat = calloc(1, sizeof(*plat));
32499c0ae16SPeng Fan 	if (!plat)
32599c0ae16SPeng Fan 		return -ENOMEM;
32699c0ae16SPeng Fan 
32799c0ae16SPeng Fan 	plat->regs = (struct gpio_regs *)addr;
32899c0ae16SPeng Fan 	plat->bank_index = dev->req_seq;
32999c0ae16SPeng Fan 	dev->platdata = plat;
33099c0ae16SPeng Fan 
33199c0ae16SPeng Fan 	return 0;
33299c0ae16SPeng Fan }
33399c0ae16SPeng Fan 
33499c0ae16SPeng Fan static const struct udevice_id mxc_gpio_ids[] = {
33599c0ae16SPeng Fan 	{ .compatible = "fsl,imx35-gpio" },
33699c0ae16SPeng Fan 	{ }
33799c0ae16SPeng Fan };
33899c0ae16SPeng Fan 
339441d0cffSSimon Glass U_BOOT_DRIVER(gpio_mxc) = {
340441d0cffSSimon Glass 	.name	= "gpio_mxc",
341441d0cffSSimon Glass 	.id	= UCLASS_GPIO,
342441d0cffSSimon Glass 	.ops	= &gpio_mxc_ops,
343441d0cffSSimon Glass 	.probe	= mxc_gpio_probe,
344441d0cffSSimon Glass 	.priv_auto_alloc_size = sizeof(struct mxc_bank_info),
34599c0ae16SPeng Fan 	.of_match = mxc_gpio_ids,
34699c0ae16SPeng Fan 	.bind	= mxc_gpio_bind,
34799c0ae16SPeng Fan };
34899c0ae16SPeng Fan 
3490f925822SMasahiro Yamada #if !CONFIG_IS_ENABLED(OF_CONTROL)
35099c0ae16SPeng Fan static const struct mxc_gpio_plat mxc_plat[] = {
35199c0ae16SPeng Fan 	{ 0, (struct gpio_regs *)GPIO1_BASE_ADDR },
35299c0ae16SPeng Fan 	{ 1, (struct gpio_regs *)GPIO2_BASE_ADDR },
35399c0ae16SPeng Fan 	{ 2, (struct gpio_regs *)GPIO3_BASE_ADDR },
35499c0ae16SPeng Fan #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
3558953d866SPeng Fan 		defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
356*cd357ad1SPeng Fan 		defined(CONFIG_IMX8M) || defined(CONFIG_ARCH_IMX8)
35799c0ae16SPeng Fan 	{ 3, (struct gpio_regs *)GPIO4_BASE_ADDR },
35899c0ae16SPeng Fan #endif
3598953d866SPeng Fan #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
360*cd357ad1SPeng Fan 		defined(CONFIG_IMX8M) || defined(CONFIG_ARCH_IMX8)
36199c0ae16SPeng Fan 	{ 4, (struct gpio_regs *)GPIO5_BASE_ADDR },
362*cd357ad1SPeng Fan #ifndef CONFIG_IMX8M
36399c0ae16SPeng Fan 	{ 5, (struct gpio_regs *)GPIO6_BASE_ADDR },
36499c0ae16SPeng Fan #endif
3658953d866SPeng Fan #endif
3668b2a31f1SPeng Fan #if defined(CONFIG_MX53) || defined(CONFIG_MX6) || defined(CONFIG_ARCH_IMX8)
36799c0ae16SPeng Fan 	{ 6, (struct gpio_regs *)GPIO7_BASE_ADDR },
36899c0ae16SPeng Fan #endif
3698b2a31f1SPeng Fan #if defined(CONFIG_ARCH_IMX8)
3708b2a31f1SPeng Fan 	{ 7, (struct gpio_regs *)GPIO8_BASE_ADDR },
3718b2a31f1SPeng Fan #endif
372441d0cffSSimon Glass };
373441d0cffSSimon Glass 
374441d0cffSSimon Glass U_BOOT_DEVICES(mxc_gpios) = {
375441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[0] },
376441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[1] },
377441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[2] },
378441d0cffSSimon Glass #if defined(CONFIG_MX25) || defined(CONFIG_MX27) || defined(CONFIG_MX51) || \
3798953d866SPeng Fan 		defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
380*cd357ad1SPeng Fan 		defined(CONFIG_IMX8M) || defined(CONFIG_ARCH_IMX8)
381441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[3] },
382441d0cffSSimon Glass #endif
3838953d866SPeng Fan #if defined(CONFIG_MX27) || defined(CONFIG_MX53) || defined(CONFIG_MX6) || \
384*cd357ad1SPeng Fan 		defined(CONFIG_IMX8M) || defined(CONFIG_ARCH_IMX8)
385441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[4] },
386*cd357ad1SPeng Fan #ifndef CONFIG_IMX8M
387441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[5] },
388441d0cffSSimon Glass #endif
3898953d866SPeng Fan #endif
3908b2a31f1SPeng Fan #if defined(CONFIG_MX53) || defined(CONFIG_MX6) || defined(CONFIG_ARCH_IMX8)
391441d0cffSSimon Glass 	{ "gpio_mxc", &mxc_plat[6] },
392441d0cffSSimon Glass #endif
3938b2a31f1SPeng Fan #if defined(CONFIG_ARCH_IMX8)
3948b2a31f1SPeng Fan 	{ "gpio_mxc", &mxc_plat[7] },
3958b2a31f1SPeng Fan #endif
396441d0cffSSimon Glass };
397441d0cffSSimon Glass #endif
39899c0ae16SPeng Fan #endif
399