Merge master.kernel.org:/home/rmk/linux-2.6-arm
[linux-3.10.git] / 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 <linux/gpio.h>
24 #include <mach/hardware.h>
25 #include <mach/imx-uart.h>
26
27 static struct resource uart0[] = {
28         {
29                 .start = UART1_BASE_ADDR,
30                 .end = UART1_BASE_ADDR + 0x0B5,
31                 .flags = IORESOURCE_MEM,
32         }, {
33                 .start = MXC_INT_UART1,
34                 .end = MXC_INT_UART1,
35                 .flags = IORESOURCE_IRQ,
36         },
37 };
38
39 static struct platform_device mxc_uart_device0 = {
40         .name = "imx-uart",
41         .id = 0,
42         .resource = uart0,
43         .num_resources = ARRAY_SIZE(uart0),
44 };
45
46 static struct resource uart1[] = {
47         {
48                 .start = UART2_BASE_ADDR,
49                 .end = UART2_BASE_ADDR + 0x0B5,
50                 .flags = IORESOURCE_MEM,
51         }, {
52                 .start = MXC_INT_UART2,
53                 .end = MXC_INT_UART2,
54                 .flags = IORESOURCE_IRQ,
55         },
56 };
57
58 static struct platform_device mxc_uart_device1 = {
59         .name = "imx-uart",
60         .id = 1,
61         .resource = uart1,
62         .num_resources = ARRAY_SIZE(uart1),
63 };
64
65 static struct resource uart2[] = {
66         {
67                 .start = UART3_BASE_ADDR,
68                 .end = UART3_BASE_ADDR + 0x0B5,
69                 .flags = IORESOURCE_MEM,
70         }, {
71                 .start = MXC_INT_UART3,
72                 .end = MXC_INT_UART3,
73                 .flags = IORESOURCE_IRQ,
74         },
75 };
76
77 static struct platform_device mxc_uart_device2 = {
78         .name = "imx-uart",
79         .id = 2,
80         .resource = uart2,
81         .num_resources = ARRAY_SIZE(uart2),
82 };
83
84 static struct resource uart3[] = {
85         {
86                 .start = UART4_BASE_ADDR,
87                 .end = UART4_BASE_ADDR + 0x0B5,
88                 .flags = IORESOURCE_MEM,
89         }, {
90                 .start = MXC_INT_UART4,
91                 .end = MXC_INT_UART4,
92                 .flags = IORESOURCE_IRQ,
93         },
94 };
95
96 static struct platform_device mxc_uart_device3 = {
97         .name = "imx-uart",
98         .id = 3,
99         .resource = uart3,
100         .num_resources = ARRAY_SIZE(uart3),
101 };
102
103 static struct resource uart4[] = {
104         {
105                 .start = UART5_BASE_ADDR,
106                 .end = UART5_BASE_ADDR + 0x0B5,
107                 .flags = IORESOURCE_MEM,
108         }, {
109                 .start = MXC_INT_UART5,
110                 .end = MXC_INT_UART5,
111                 .flags = IORESOURCE_IRQ,
112         },
113 };
114
115 static struct platform_device mxc_uart_device4 = {
116         .name = "imx-uart",
117         .id = 4,
118         .resource = uart4,
119         .num_resources = ARRAY_SIZE(uart4),
120 };
121
122 /*
123  * Register only those UARTs that physically exist
124  */
125 int __init imx_init_uart(int uart_no, struct imxuart_platform_data *pdata)
126 {
127         switch (uart_no) {
128         case 0:
129                 mxc_uart_device0.dev.platform_data = pdata;
130                 platform_device_register(&mxc_uart_device0);
131                 break;
132         case 1:
133                 mxc_uart_device1.dev.platform_data = pdata;
134                 platform_device_register(&mxc_uart_device1);
135                 break;
136         case 2:
137                 mxc_uart_device2.dev.platform_data = pdata;
138                 platform_device_register(&mxc_uart_device2);
139                 break;
140         case 3:
141                 mxc_uart_device3.dev.platform_data = pdata;
142                 platform_device_register(&mxc_uart_device3);
143                 break;
144         case 4:
145                 mxc_uart_device4.dev.platform_data = pdata;
146                 platform_device_register(&mxc_uart_device4);
147                 break;
148         default:
149                 return -ENODEV;
150         }
151
152         return 0;
153 }
154
155 /* GPIO port description */
156 static struct mxc_gpio_port imx_gpio_ports[] = {
157         [0] = {
158                 .chip.label = "gpio-0",
159                 .base = IO_ADDRESS(GPIO1_BASE_ADDR),
160                 .irq = MXC_INT_GPIO1,
161                 .virtual_irq_start = MXC_GPIO_INT_BASE
162         },
163         [1] = {
164                 .chip.label = "gpio-1",
165                 .base = IO_ADDRESS(GPIO2_BASE_ADDR),
166                 .irq = MXC_INT_GPIO2,
167                 .virtual_irq_start = MXC_GPIO_INT_BASE + GPIO_NUM_PIN
168         },
169         [2] = {
170                 .chip.label = "gpio-2",
171                 .base = IO_ADDRESS(GPIO3_BASE_ADDR),
172                 .irq = MXC_INT_GPIO3,
173                 .virtual_irq_start = MXC_GPIO_INT_BASE + GPIO_NUM_PIN * 2
174         }
175 };
176
177 int __init mxc_register_gpios(void)
178 {
179         return mxc_gpio_init(imx_gpio_ports, ARRAY_SIZE(imx_gpio_ports));
180 }