xref: /openbmc/linux/arch/m68k/coldfire/device.c (revision 3a83e4e6)
1 /*
2  * device.c  -- common ColdFire SoC device support
3  *
4  * (C) Copyright 2011, Greg Ungerer <gerg@uclinux.org>
5  *
6  * This file is subject to the terms and conditions of the GNU General Public
7  * License.  See the file COPYING in the main directory of this archive
8  * for more details.
9  */
10 
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/io.h>
14 #include <linux/spi/spi.h>
15 #include <linux/gpio.h>
16 #include <linux/fec.h>
17 #include <linux/dmaengine.h>
18 #include <asm/traps.h>
19 #include <asm/coldfire.h>
20 #include <asm/mcfsim.h>
21 #include <asm/mcfuart.h>
22 #include <asm/mcfqspi.h>
23 #include <linux/platform_data/edma.h>
24 #include <linux/platform_data/dma-mcf-edma.h>
25 #include <linux/platform_data/mmc-esdhc-mcf.h>
26 
27 /*
28  *	All current ColdFire parts contain from 2, 3, 4 or 10 UARTS.
29  */
30 static struct mcf_platform_uart mcf_uart_platform_data[] = {
31 	{
32 		.mapbase	= MCFUART_BASE0,
33 		.irq		= MCF_IRQ_UART0,
34 	},
35 	{
36 		.mapbase	= MCFUART_BASE1,
37 		.irq		= MCF_IRQ_UART1,
38 	},
39 #ifdef MCFUART_BASE2
40 	{
41 		.mapbase	= MCFUART_BASE2,
42 		.irq		= MCF_IRQ_UART2,
43 	},
44 #endif
45 #ifdef MCFUART_BASE3
46 	{
47 		.mapbase	= MCFUART_BASE3,
48 		.irq		= MCF_IRQ_UART3,
49 	},
50 #endif
51 #ifdef MCFUART_BASE4
52 	{
53 		.mapbase	= MCFUART_BASE4,
54 		.irq		= MCF_IRQ_UART4,
55 	},
56 #endif
57 #ifdef MCFUART_BASE5
58 	{
59 		.mapbase	= MCFUART_BASE5,
60 		.irq		= MCF_IRQ_UART5,
61 	},
62 #endif
63 #ifdef MCFUART_BASE6
64 	{
65 		.mapbase	= MCFUART_BASE6,
66 		.irq		= MCF_IRQ_UART6,
67 	},
68 #endif
69 #ifdef MCFUART_BASE7
70 	{
71 		.mapbase	= MCFUART_BASE7,
72 		.irq		= MCF_IRQ_UART7,
73 	},
74 #endif
75 #ifdef MCFUART_BASE8
76 	{
77 		.mapbase	= MCFUART_BASE8,
78 		.irq		= MCF_IRQ_UART8,
79 	},
80 #endif
81 #ifdef MCFUART_BASE9
82 	{
83 		.mapbase	= MCFUART_BASE9,
84 		.irq		= MCF_IRQ_UART9,
85 	},
86 #endif
87 	{ },
88 };
89 
90 static struct platform_device mcf_uart = {
91 	.name			= "mcfuart",
92 	.id			= 0,
93 	.dev.platform_data	= mcf_uart_platform_data,
94 };
95 
96 #if IS_ENABLED(CONFIG_FEC)
97 
98 #ifdef CONFIG_M5441x
99 #define FEC_NAME	"enet-fec"
100 static struct fec_platform_data fec_pdata = {
101 	.phy		= PHY_INTERFACE_MODE_RMII,
102 };
103 #define FEC_PDATA	(&fec_pdata)
104 #else
105 #define FEC_NAME	"fec"
106 #define FEC_PDATA	NULL
107 #endif
108 
109 /*
110  *	Some ColdFire cores contain the Fast Ethernet Controller (FEC)
111  *	block. It is Freescale's own hardware block. Some ColdFires
112  *	have 2 of these.
113  */
114 static struct resource mcf_fec0_resources[] = {
115 	{
116 		.start		= MCFFEC_BASE0,
117 		.end		= MCFFEC_BASE0 + MCFFEC_SIZE0 - 1,
118 		.flags		= IORESOURCE_MEM,
119 	},
120 	{
121 		.start		= MCF_IRQ_FECRX0,
122 		.end		= MCF_IRQ_FECRX0,
123 		.flags		= IORESOURCE_IRQ,
124 	},
125 	{
126 		.start		= MCF_IRQ_FECTX0,
127 		.end		= MCF_IRQ_FECTX0,
128 		.flags		= IORESOURCE_IRQ,
129 	},
130 	{
131 		.start		= MCF_IRQ_FECENTC0,
132 		.end		= MCF_IRQ_FECENTC0,
133 		.flags		= IORESOURCE_IRQ,
134 	},
135 };
136 
137 static struct platform_device mcf_fec0 = {
138 	.name			= FEC_NAME,
139 	.id			= 0,
140 	.num_resources		= ARRAY_SIZE(mcf_fec0_resources),
141 	.resource		= mcf_fec0_resources,
142 	.dev = {
143 		.dma_mask		= &mcf_fec0.dev.coherent_dma_mask,
144 		.coherent_dma_mask	= DMA_BIT_MASK(32),
145 		.platform_data		= FEC_PDATA,
146 	}
147 };
148 
149 #ifdef MCFFEC_BASE1
150 static struct resource mcf_fec1_resources[] = {
151 	{
152 		.start		= MCFFEC_BASE1,
153 		.end		= MCFFEC_BASE1 + MCFFEC_SIZE1 - 1,
154 		.flags		= IORESOURCE_MEM,
155 	},
156 	{
157 		.start		= MCF_IRQ_FECRX1,
158 		.end		= MCF_IRQ_FECRX1,
159 		.flags		= IORESOURCE_IRQ,
160 	},
161 	{
162 		.start		= MCF_IRQ_FECTX1,
163 		.end		= MCF_IRQ_FECTX1,
164 		.flags		= IORESOURCE_IRQ,
165 	},
166 	{
167 		.start		= MCF_IRQ_FECENTC1,
168 		.end		= MCF_IRQ_FECENTC1,
169 		.flags		= IORESOURCE_IRQ,
170 	},
171 };
172 
173 static struct platform_device mcf_fec1 = {
174 	.name			= FEC_NAME,
175 	.id			= 1,
176 	.num_resources		= ARRAY_SIZE(mcf_fec1_resources),
177 	.resource		= mcf_fec1_resources,
178 	.dev = {
179 		.dma_mask		= &mcf_fec1.dev.coherent_dma_mask,
180 		.coherent_dma_mask	= DMA_BIT_MASK(32),
181 		.platform_data		= FEC_PDATA,
182 	}
183 };
184 #endif /* MCFFEC_BASE1 */
185 #endif /* CONFIG_FEC */
186 
187 #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
188 /*
189  *	The ColdFire QSPI module is an SPI protocol hardware block used
190  *	on a number of different ColdFire CPUs.
191  */
192 static struct resource mcf_qspi_resources[] = {
193 	{
194 		.start		= MCFQSPI_BASE,
195 		.end		= MCFQSPI_BASE + MCFQSPI_SIZE - 1,
196 		.flags		= IORESOURCE_MEM,
197 	},
198 	{
199 		.start		= MCF_IRQ_QSPI,
200 		.end		= MCF_IRQ_QSPI,
201 		.flags		= IORESOURCE_IRQ,
202 	},
203 };
204 
205 static int mcf_cs_setup(struct mcfqspi_cs_control *cs_control)
206 {
207 	int status;
208 
209 	status = gpio_request(MCFQSPI_CS0, "MCFQSPI_CS0");
210 	if (status) {
211 		pr_debug("gpio_request for MCFQSPI_CS0 failed\n");
212 		goto fail0;
213 	}
214 	status = gpio_direction_output(MCFQSPI_CS0, 1);
215 	if (status) {
216 		pr_debug("gpio_direction_output for MCFQSPI_CS0 failed\n");
217 		goto fail1;
218 	}
219 
220 	status = gpio_request(MCFQSPI_CS1, "MCFQSPI_CS1");
221 	if (status) {
222 		pr_debug("gpio_request for MCFQSPI_CS1 failed\n");
223 		goto fail1;
224 	}
225 	status = gpio_direction_output(MCFQSPI_CS1, 1);
226 	if (status) {
227 		pr_debug("gpio_direction_output for MCFQSPI_CS1 failed\n");
228 		goto fail2;
229 	}
230 
231 	status = gpio_request(MCFQSPI_CS2, "MCFQSPI_CS2");
232 	if (status) {
233 		pr_debug("gpio_request for MCFQSPI_CS2 failed\n");
234 		goto fail2;
235 	}
236 	status = gpio_direction_output(MCFQSPI_CS2, 1);
237 	if (status) {
238 		pr_debug("gpio_direction_output for MCFQSPI_CS2 failed\n");
239 		goto fail3;
240 	}
241 
242 #ifdef MCFQSPI_CS3
243 	status = gpio_request(MCFQSPI_CS3, "MCFQSPI_CS3");
244 	if (status) {
245 		pr_debug("gpio_request for MCFQSPI_CS3 failed\n");
246 		goto fail3;
247 	}
248 	status = gpio_direction_output(MCFQSPI_CS3, 1);
249 	if (status) {
250 		pr_debug("gpio_direction_output for MCFQSPI_CS3 failed\n");
251 		gpio_free(MCFQSPI_CS3);
252 		goto fail3;
253 	}
254 #endif
255 
256 	return 0;
257 
258 fail3:
259 	gpio_free(MCFQSPI_CS2);
260 fail2:
261 	gpio_free(MCFQSPI_CS1);
262 fail1:
263 	gpio_free(MCFQSPI_CS0);
264 fail0:
265 	return status;
266 }
267 
268 static void mcf_cs_teardown(struct mcfqspi_cs_control *cs_control)
269 {
270 #ifdef MCFQSPI_CS3
271 	gpio_free(MCFQSPI_CS3);
272 #endif
273 	gpio_free(MCFQSPI_CS2);
274 	gpio_free(MCFQSPI_CS1);
275 	gpio_free(MCFQSPI_CS0);
276 }
277 
278 static void mcf_cs_select(struct mcfqspi_cs_control *cs_control,
279 			  u8 chip_select, bool cs_high)
280 {
281 	switch (chip_select) {
282 	case 0:
283 		gpio_set_value(MCFQSPI_CS0, cs_high);
284 		break;
285 	case 1:
286 		gpio_set_value(MCFQSPI_CS1, cs_high);
287 		break;
288 	case 2:
289 		gpio_set_value(MCFQSPI_CS2, cs_high);
290 		break;
291 #ifdef MCFQSPI_CS3
292 	case 3:
293 		gpio_set_value(MCFQSPI_CS3, cs_high);
294 		break;
295 #endif
296 	}
297 }
298 
299 static void mcf_cs_deselect(struct mcfqspi_cs_control *cs_control,
300 			    u8 chip_select, bool cs_high)
301 {
302 	switch (chip_select) {
303 	case 0:
304 		gpio_set_value(MCFQSPI_CS0, !cs_high);
305 		break;
306 	case 1:
307 		gpio_set_value(MCFQSPI_CS1, !cs_high);
308 		break;
309 	case 2:
310 		gpio_set_value(MCFQSPI_CS2, !cs_high);
311 		break;
312 #ifdef MCFQSPI_CS3
313 	case 3:
314 		gpio_set_value(MCFQSPI_CS3, !cs_high);
315 		break;
316 #endif
317 	}
318 }
319 
320 static struct mcfqspi_cs_control mcf_cs_control = {
321 	.setup			= mcf_cs_setup,
322 	.teardown		= mcf_cs_teardown,
323 	.select			= mcf_cs_select,
324 	.deselect		= mcf_cs_deselect,
325 };
326 
327 static struct mcfqspi_platform_data mcf_qspi_data = {
328 	.bus_num		= 0,
329 	.num_chipselect		= 4,
330 	.cs_control		= &mcf_cs_control,
331 };
332 
333 static struct platform_device mcf_qspi = {
334 	.name			= "mcfqspi",
335 	.id			= 0,
336 	.num_resources		= ARRAY_SIZE(mcf_qspi_resources),
337 	.resource		= mcf_qspi_resources,
338 	.dev.platform_data	= &mcf_qspi_data,
339 };
340 #endif /* IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI) */
341 
342 #if IS_ENABLED(CONFIG_I2C_IMX)
343 static struct resource mcf_i2c0_resources[] = {
344 	{
345 		.start          = MCFI2C_BASE0,
346 		.end            = MCFI2C_BASE0 + MCFI2C_SIZE0 - 1,
347 		.flags          = IORESOURCE_MEM,
348 	},
349 	{
350 		.start          = MCF_IRQ_I2C0,
351 		.end            = MCF_IRQ_I2C0,
352 		.flags          = IORESOURCE_IRQ,
353 	},
354 };
355 
356 static struct platform_device mcf_i2c0 = {
357 	.name                   = "imx1-i2c",
358 	.id                     = 0,
359 	.num_resources          = ARRAY_SIZE(mcf_i2c0_resources),
360 	.resource               = mcf_i2c0_resources,
361 };
362 #ifdef MCFI2C_BASE1
363 
364 static struct resource mcf_i2c1_resources[] = {
365 	{
366 		.start          = MCFI2C_BASE1,
367 		.end            = MCFI2C_BASE1 + MCFI2C_SIZE1 - 1,
368 		.flags          = IORESOURCE_MEM,
369 	},
370 	{
371 		.start          = MCF_IRQ_I2C1,
372 		.end            = MCF_IRQ_I2C1,
373 		.flags          = IORESOURCE_IRQ,
374 	},
375 };
376 
377 static struct platform_device mcf_i2c1 = {
378 	.name                   = "imx1-i2c",
379 	.id                     = 1,
380 	.num_resources          = ARRAY_SIZE(mcf_i2c1_resources),
381 	.resource               = mcf_i2c1_resources,
382 };
383 
384 #endif /* MCFI2C_BASE1 */
385 
386 #ifdef MCFI2C_BASE2
387 
388 static struct resource mcf_i2c2_resources[] = {
389 	{
390 		.start          = MCFI2C_BASE2,
391 		.end            = MCFI2C_BASE2 + MCFI2C_SIZE2 - 1,
392 		.flags          = IORESOURCE_MEM,
393 	},
394 	{
395 		.start          = MCF_IRQ_I2C2,
396 		.end            = MCF_IRQ_I2C2,
397 		.flags          = IORESOURCE_IRQ,
398 	},
399 };
400 
401 static struct platform_device mcf_i2c2 = {
402 	.name                   = "imx1-i2c",
403 	.id                     = 2,
404 	.num_resources          = ARRAY_SIZE(mcf_i2c2_resources),
405 	.resource               = mcf_i2c2_resources,
406 };
407 
408 #endif /* MCFI2C_BASE2 */
409 
410 #ifdef MCFI2C_BASE3
411 
412 static struct resource mcf_i2c3_resources[] = {
413 	{
414 		.start          = MCFI2C_BASE3,
415 		.end            = MCFI2C_BASE3 + MCFI2C_SIZE3 - 1,
416 		.flags          = IORESOURCE_MEM,
417 	},
418 	{
419 		.start          = MCF_IRQ_I2C3,
420 		.end            = MCF_IRQ_I2C3,
421 		.flags          = IORESOURCE_IRQ,
422 	},
423 };
424 
425 static struct platform_device mcf_i2c3 = {
426 	.name                   = "imx1-i2c",
427 	.id                     = 3,
428 	.num_resources          = ARRAY_SIZE(mcf_i2c3_resources),
429 	.resource               = mcf_i2c3_resources,
430 };
431 
432 #endif /* MCFI2C_BASE3 */
433 
434 #ifdef MCFI2C_BASE4
435 
436 static struct resource mcf_i2c4_resources[] = {
437 	{
438 		.start          = MCFI2C_BASE4,
439 		.end            = MCFI2C_BASE4 + MCFI2C_SIZE4 - 1,
440 		.flags          = IORESOURCE_MEM,
441 	},
442 	{
443 		.start          = MCF_IRQ_I2C4,
444 		.end            = MCF_IRQ_I2C4,
445 		.flags          = IORESOURCE_IRQ,
446 	},
447 };
448 
449 static struct platform_device mcf_i2c4 = {
450 	.name                   = "imx1-i2c",
451 	.id                     = 4,
452 	.num_resources          = ARRAY_SIZE(mcf_i2c4_resources),
453 	.resource               = mcf_i2c4_resources,
454 };
455 
456 #endif /* MCFI2C_BASE4 */
457 
458 #ifdef MCFI2C_BASE5
459 
460 static struct resource mcf_i2c5_resources[] = {
461 	{
462 		.start          = MCFI2C_BASE5,
463 		.end            = MCFI2C_BASE5 + MCFI2C_SIZE5 - 1,
464 		.flags          = IORESOURCE_MEM,
465 	},
466 	{
467 		.start          = MCF_IRQ_I2C5,
468 		.end            = MCF_IRQ_I2C5,
469 		.flags          = IORESOURCE_IRQ,
470 	},
471 };
472 
473 static struct platform_device mcf_i2c5 = {
474 	.name                   = "imx1-i2c",
475 	.id                     = 5,
476 	.num_resources          = ARRAY_SIZE(mcf_i2c5_resources),
477 	.resource               = mcf_i2c5_resources,
478 };
479 
480 #endif /* MCFI2C_BASE5 */
481 #endif /* IS_ENABLED(CONFIG_I2C_IMX) */
482 
483 #if IS_ENABLED(CONFIG_MCF_EDMA)
484 
485 static const struct dma_slave_map mcf_edma_map[] = {
486 	{ "dreq0", "rx-tx", MCF_EDMA_FILTER_PARAM(0) },
487 	{ "dreq1", "rx-tx", MCF_EDMA_FILTER_PARAM(1) },
488 	{ "uart.0", "rx", MCF_EDMA_FILTER_PARAM(2) },
489 	{ "uart.0", "tx", MCF_EDMA_FILTER_PARAM(3) },
490 	{ "uart.1", "rx", MCF_EDMA_FILTER_PARAM(4) },
491 	{ "uart.1", "tx", MCF_EDMA_FILTER_PARAM(5) },
492 	{ "uart.2", "rx", MCF_EDMA_FILTER_PARAM(6) },
493 	{ "uart.2", "tx", MCF_EDMA_FILTER_PARAM(7) },
494 	{ "timer0", "rx-tx", MCF_EDMA_FILTER_PARAM(8) },
495 	{ "timer1", "rx-tx", MCF_EDMA_FILTER_PARAM(9) },
496 	{ "timer2", "rx-tx", MCF_EDMA_FILTER_PARAM(10) },
497 	{ "timer3", "rx-tx", MCF_EDMA_FILTER_PARAM(11) },
498 	{ "fsl-dspi.0", "rx", MCF_EDMA_FILTER_PARAM(12) },
499 	{ "fsl-dspi.0", "tx", MCF_EDMA_FILTER_PARAM(13) },
500 	{ "fsl-dspi.1", "rx", MCF_EDMA_FILTER_PARAM(14) },
501 	{ "fsl-dspi.1", "tx", MCF_EDMA_FILTER_PARAM(15) },
502 };
503 
504 static struct mcf_edma_platform_data mcf_edma_data = {
505 	.dma_channels		= 64,
506 	.slave_map		= mcf_edma_map,
507 	.slavecnt		= ARRAY_SIZE(mcf_edma_map),
508 };
509 
510 static struct resource mcf_edma_resources[] = {
511 	{
512 		.start		= MCFEDMA_BASE,
513 		.end		= MCFEDMA_BASE + MCFEDMA_SIZE - 1,
514 		.flags		= IORESOURCE_MEM,
515 	},
516 	{
517 		.start		= MCFEDMA_IRQ_INTR0,
518 		.end		= MCFEDMA_IRQ_INTR0 + 15,
519 		.flags		= IORESOURCE_IRQ,
520 		.name		= "edma-tx-00-15",
521 	},
522 	{
523 		.start		= MCFEDMA_IRQ_INTR16,
524 		.end		= MCFEDMA_IRQ_INTR16 + 39,
525 		.flags		= IORESOURCE_IRQ,
526 		.name		= "edma-tx-16-55",
527 	},
528 	{
529 		.start		= MCFEDMA_IRQ_INTR56,
530 		.end		= MCFEDMA_IRQ_INTR56,
531 		.flags		= IORESOURCE_IRQ,
532 		.name		= "edma-tx-56-63",
533 	},
534 	{
535 		.start		= MCFEDMA_IRQ_ERR,
536 		.end		= MCFEDMA_IRQ_ERR,
537 		.flags		= IORESOURCE_IRQ,
538 		.name		= "edma-err",
539 	},
540 };
541 
542 static u64 mcf_edma_dmamask = DMA_BIT_MASK(32);
543 
544 static struct platform_device mcf_edma = {
545 	.name			= "mcf-edma",
546 	.id			= 0,
547 	.num_resources		= ARRAY_SIZE(mcf_edma_resources),
548 	.resource		= mcf_edma_resources,
549 	.dev = {
550 		.dma_mask = &mcf_edma_dmamask,
551 		.coherent_dma_mask = DMA_BIT_MASK(32),
552 		.platform_data = &mcf_edma_data,
553 	}
554 };
555 #endif /* IS_ENABLED(CONFIG_MCF_EDMA) */
556 
557 #if IS_ENABLED(CONFIG_MMC)
558 static struct mcf_esdhc_platform_data mcf_esdhc_data = {
559 	.max_bus_width = 4,
560 	.cd_type = ESDHC_CD_NONE,
561 };
562 
563 static struct resource mcf_esdhc_resources[] = {
564 	{
565 		.start = MCFSDHC_BASE,
566 		.end = MCFSDHC_BASE + MCFSDHC_SIZE - 1,
567 		.flags = IORESOURCE_MEM,
568 	}, {
569 		.start = MCF_IRQ_SDHC,
570 		.end = MCF_IRQ_SDHC,
571 		.flags = IORESOURCE_IRQ,
572 	},
573 };
574 
575 static struct platform_device mcf_esdhc = {
576 	.name			= "sdhci-esdhc-mcf",
577 	.id			= 0,
578 	.num_resources		= ARRAY_SIZE(mcf_esdhc_resources),
579 	.resource		= mcf_esdhc_resources,
580 	.dev.platform_data	= &mcf_esdhc_data,
581 };
582 #endif /* IS_ENABLED(CONFIG_MMC) */
583 
584 static struct platform_device *mcf_devices[] __initdata = {
585 	&mcf_uart,
586 #if IS_ENABLED(CONFIG_FEC)
587 	&mcf_fec0,
588 #ifdef MCFFEC_BASE1
589 	&mcf_fec1,
590 #endif
591 #endif
592 #if IS_ENABLED(CONFIG_SPI_COLDFIRE_QSPI)
593 	&mcf_qspi,
594 #endif
595 #if IS_ENABLED(CONFIG_I2C_IMX)
596 	&mcf_i2c0,
597 #ifdef MCFI2C_BASE1
598 	&mcf_i2c1,
599 #endif
600 #ifdef MCFI2C_BASE2
601 	&mcf_i2c2,
602 #endif
603 #ifdef MCFI2C_BASE3
604 	&mcf_i2c3,
605 #endif
606 #ifdef MCFI2C_BASE4
607 	&mcf_i2c4,
608 #endif
609 #ifdef MCFI2C_BASE5
610 	&mcf_i2c5,
611 #endif
612 #endif
613 #if IS_ENABLED(CONFIG_MCF_EDMA)
614 	&mcf_edma,
615 #endif
616 #if IS_ENABLED(CONFIG_MMC)
617 	&mcf_esdhc,
618 #endif
619 };
620 
621 /*
622  *	Some ColdFire UARTs let you set the IRQ line to use.
623  */
624 static void __init mcf_uart_set_irq(void)
625 {
626 #ifdef MCFUART_UIVR
627 	/* UART0 interrupt setup */
628 	writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCFSIM_UART1ICR);
629 	writeb(MCF_IRQ_UART0, MCFUART_BASE0 + MCFUART_UIVR);
630 	mcf_mapirq2imr(MCF_IRQ_UART0, MCFINTC_UART0);
631 
632 	/* UART1 interrupt setup */
633 	writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCFSIM_UART2ICR);
634 	writeb(MCF_IRQ_UART1, MCFUART_BASE1 + MCFUART_UIVR);
635 	mcf_mapirq2imr(MCF_IRQ_UART1, MCFINTC_UART1);
636 #endif
637 }
638 
639 static int __init mcf_init_devices(void)
640 {
641 	mcf_uart_set_irq();
642 	platform_add_devices(mcf_devices, ARRAY_SIZE(mcf_devices));
643 	return 0;
644 }
645 
646 arch_initcall(mcf_init_devices);
647