]> err.no Git - linux-2.6/blob - arch/arm/mach-mx3/devices.c
mxc: add MX3 support for i.MX internal UART driver
[linux-2.6] / arch / arm / mach-mx3 / devices.c
1 /*
2  * Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
3  * Copyright 2008 Sascha Hauer, kernel@pengutronix.de
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA  02110-1301, USA.
18  */
19
20 #include <linux/module.h>
21 #include <linux/platform_device.h>
22 #include <linux/serial.h>
23 #include <asm/hardware.h>
24 #include <asm/arch/imx-uart.h>
25
26 static struct resource uart0[] = {
27         {
28                 .start = UART1_BASE_ADDR,
29                 .end = UART1_BASE_ADDR + 0x0B5,
30                 .flags = IORESOURCE_MEM,
31         }, {
32                 .start = MXC_INT_UART1,
33                 .end = MXC_INT_UART1,
34                 .flags = IORESOURCE_IRQ,
35         },
36 };
37
38 static struct platform_device mxc_uart_device0 = {
39         .name = "imx-uart",
40         .id = 0,
41         .resource = uart0,
42         .num_resources = ARRAY_SIZE(uart0),
43 };
44
45 static struct resource uart1[] = {
46         {
47                 .start = UART2_BASE_ADDR,
48                 .end = UART2_BASE_ADDR + 0x0B5,
49                 .flags = IORESOURCE_MEM,
50         }, {
51                 .start = MXC_INT_UART2,
52                 .end = MXC_INT_UART2,
53                 .flags = IORESOURCE_IRQ,
54         },
55 };
56
57 static struct platform_device mxc_uart_device1 = {
58         .name = "imx-uart",
59         .id = 1,
60         .resource = uart1,
61         .num_resources = ARRAY_SIZE(uart1),
62 };
63
64 static struct resource uart2[] = {
65         {
66                 .start = UART3_BASE_ADDR,
67                 .end = UART3_BASE_ADDR + 0x0B5,
68                 .flags = IORESOURCE_MEM,
69         }, {
70                 .start = MXC_INT_UART3,
71                 .end = MXC_INT_UART3,
72                 .flags = IORESOURCE_IRQ,
73         },
74 };
75
76 static struct platform_device mxc_uart_device2 = {
77         .name = "imx-uart",
78         .id = 2,
79         .resource = uart2,
80         .num_resources = ARRAY_SIZE(uart2),
81 };
82
83 static struct resource uart3[] = {
84         {
85                 .start = UART4_BASE_ADDR,
86                 .end = UART4_BASE_ADDR + 0x0B5,
87                 .flags = IORESOURCE_MEM,
88         }, {
89                 .start = MXC_INT_UART4,
90                 .end = MXC_INT_UART4,
91                 .flags = IORESOURCE_IRQ,
92         },
93 };
94
95 static struct platform_device mxc_uart_device3 = {
96         .name = "imx-uart",
97         .id = 3,
98         .resource = uart3,
99         .num_resources = ARRAY_SIZE(uart3),
100 };
101
102 static struct resource uart4[] = {
103         {
104                 .start = UART5_BASE_ADDR,
105                 .end = UART5_BASE_ADDR + 0x0B5,
106                 .flags = IORESOURCE_MEM,
107         }, {
108                 .start = MXC_INT_UART5,
109                 .end = MXC_INT_UART5,
110                 .flags = IORESOURCE_IRQ,
111         },
112 };
113
114 static struct platform_device mxc_uart_device4 = {
115         .name = "imx-uart",
116         .id = 4,
117         .resource = uart4,
118         .num_resources = ARRAY_SIZE(uart4),
119 };
120
121 /*
122  * Register only those UARTs that physically exist
123  */
124 int __init imx_init_uart(int uart_no, struct imxuart_platform_data *pdata)
125 {
126         switch (uart_no) {
127         case 0:
128                 mxc_uart_device0.dev.platform_data = pdata;
129                 platform_device_register(&mxc_uart_device0);
130                 break;
131         case 1:
132                 mxc_uart_device1.dev.platform_data = pdata;
133                 platform_device_register(&mxc_uart_device1);
134                 break;
135         case 2:
136                 mxc_uart_device2.dev.platform_data = pdata;
137                 platform_device_register(&mxc_uart_device2);
138                 break;
139         case 3:
140                 mxc_uart_device3.dev.platform_data = pdata;
141                 platform_device_register(&mxc_uart_device3);
142                 break;
143         case 4:
144                 mxc_uart_device4.dev.platform_data = pdata;
145                 platform_device_register(&mxc_uart_device4);
146                 break;
147         default:
148                 return -ENODEV;
149         }
150
151         return 0;
152 }
153