Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[linux-2.6] / arch / arm / mach-mx2 / serial.c
1 /*
2  * Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
3  * Copyright 2008 Juergen Beisert, 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, Boston,
17  * MA 02110-1301, USA.
18  */
19
20 #include <linux/module.h>
21 #include <linux/platform_device.h>
22 #include <linux/serial.h>
23 #include <mach/hardware.h>
24 #include <mach/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 static struct resource uart5[] = {
122         {
123                 .start = UART6_BASE_ADDR,
124                 .end = UART6_BASE_ADDR + 0x0B5,
125                 .flags = IORESOURCE_MEM,
126         }, {
127                 .start = MXC_INT_UART6,
128                 .end = MXC_INT_UART6,
129                 .flags = IORESOURCE_IRQ,
130         },
131 };
132
133 static struct platform_device mxc_uart_device5 = {
134         .name = "imx-uart",
135         .id = 5,
136         .resource = uart5,
137         .num_resources = ARRAY_SIZE(uart5),
138 };
139
140 /*
141  * Register only those UARTs that physically exists
142  */
143 int __init imx_init_uart(int uart_no, struct imxuart_platform_data *pdata)
144 {
145         switch (uart_no) {
146         case 0:
147                 mxc_uart_device0.dev.platform_data = pdata;
148                 platform_device_register(&mxc_uart_device0);
149                 break;
150         case 1:
151                 mxc_uart_device1.dev.platform_data = pdata;
152                 platform_device_register(&mxc_uart_device1);
153                 break;
154 #ifndef CONFIG_MXC_IRDA
155         case 2:
156                 mxc_uart_device2.dev.platform_data = pdata;
157                 platform_device_register(&mxc_uart_device2);
158                 break;
159 #endif
160         case 3:
161                 mxc_uart_device3.dev.platform_data = pdata;
162                 platform_device_register(&mxc_uart_device3);
163                 break;
164         case 4:
165                 mxc_uart_device4.dev.platform_data = pdata;
166                 platform_device_register(&mxc_uart_device4);
167                 break;
168         case 5:
169                 mxc_uart_device5.dev.platform_data = pdata;
170                 platform_device_register(&mxc_uart_device5);
171                 break;
172         default:
173                 return -ENODEV;
174         }
175
176         return 0;
177 }