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(®s->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, ®s->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(®s->gpio_dr);
108c4ea1424SStefano Babic if (value)
109c4ea1424SStefano Babic l |= 1 << gpio;
110c4ea1424SStefano Babic else
111c4ea1424SStefano Babic l &= ~(1 << gpio);
112c4ea1424SStefano Babic writel(l, ®s->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(®s->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(®s->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(®s->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, ®s->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(®s->gpio_dr);
198441d0cffSSimon Glass if (value)
199441d0cffSSimon Glass l |= 1 << offset;
200441d0cffSSimon Glass else
201441d0cffSSimon Glass l &= ~(1 << offset);
202441d0cffSSimon Glass writel(l, ®s->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(®s->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