MX27ADS: Add framebuffer support
[linux-2.6] / arch / arm / mach-mx2 / mx27ads.c
1 /*
2  *  Copyright (C) 2000 Deep Blue Solutions Ltd
3  *  Copyright (C) 2002 Shane Nay (shane@minirl.com)
4  *  Copyright 2006-2007 Freescale Semiconductor, Inc. All Rights Reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include <linux/platform_device.h>
22 #include <linux/mtd/mtd.h>
23 #include <linux/mtd/map.h>
24 #include <linux/mtd/partitions.h>
25 #include <linux/mtd/physmap.h>
26 #include <linux/i2c.h>
27 #include <mach/common.h>
28 #include <mach/hardware.h>
29 #include <asm/mach-types.h>
30 #include <asm/mach/arch.h>
31 #include <asm/mach/time.h>
32 #include <asm/mach/map.h>
33 #include <mach/gpio.h>
34 #include <mach/imx-uart.h>
35 #include <mach/iomux.h>
36 #include <mach/board-mx27ads.h>
37 #include <mach/mxc_nand.h>
38 #include <mach/i2c.h>
39 #include <mach/imxfb.h>
40
41 #include "devices.h"
42
43 static unsigned int mx27ads_pins[] = {
44         /* UART0 */
45         PE12_PF_UART1_TXD,
46         PE13_PF_UART1_RXD,
47         PE14_PF_UART1_CTS,
48         PE15_PF_UART1_RTS,
49         /* UART1 */
50         PE3_PF_UART2_CTS,
51         PE4_PF_UART2_RTS,
52         PE6_PF_UART2_TXD,
53         PE7_PF_UART2_RXD,
54         /* UART2 */
55         PE8_PF_UART3_TXD,
56         PE9_PF_UART3_RXD,
57         PE10_PF_UART3_CTS,
58         PE11_PF_UART3_RTS,
59         /* UART3 */
60         PB26_AF_UART4_RTS,
61         PB28_AF_UART4_TXD,
62         PB29_AF_UART4_CTS,
63         PB31_AF_UART4_RXD,
64         /* UART4 */
65         PB18_AF_UART5_TXD,
66         PB19_AF_UART5_RXD,
67         PB20_AF_UART5_CTS,
68         PB21_AF_UART5_RTS,
69         /* UART5 */
70         PB10_AF_UART6_TXD,
71         PB12_AF_UART6_CTS,
72         PB11_AF_UART6_RXD,
73         PB13_AF_UART6_RTS,
74         /* FEC */
75         PD0_AIN_FEC_TXD0,
76         PD1_AIN_FEC_TXD1,
77         PD2_AIN_FEC_TXD2,
78         PD3_AIN_FEC_TXD3,
79         PD4_AOUT_FEC_RX_ER,
80         PD5_AOUT_FEC_RXD1,
81         PD6_AOUT_FEC_RXD2,
82         PD7_AOUT_FEC_RXD3,
83         PD8_AF_FEC_MDIO,
84         PD9_AIN_FEC_MDC,
85         PD10_AOUT_FEC_CRS,
86         PD11_AOUT_FEC_TX_CLK,
87         PD12_AOUT_FEC_RXD0,
88         PD13_AOUT_FEC_RX_DV,
89         PD14_AOUT_FEC_RX_CLK,
90         PD15_AOUT_FEC_COL,
91         PD16_AIN_FEC_TX_ER,
92         PF23_AIN_FEC_TX_EN,
93         /* I2C2 */
94         PC5_PF_I2C2_SDA,
95         PC6_PF_I2C2_SCL,
96         /* FB */
97         PA5_PF_LSCLK,
98         PA6_PF_LD0,
99         PA7_PF_LD1,
100         PA8_PF_LD2,
101         PA9_PF_LD3,
102         PA10_PF_LD4,
103         PA11_PF_LD5,
104         PA12_PF_LD6,
105         PA13_PF_LD7,
106         PA14_PF_LD8,
107         PA15_PF_LD9,
108         PA16_PF_LD10,
109         PA17_PF_LD11,
110         PA18_PF_LD12,
111         PA19_PF_LD13,
112         PA20_PF_LD14,
113         PA21_PF_LD15,
114         PA22_PF_LD16,
115         PA23_PF_LD17,
116         PA24_PF_REV,
117         PA25_PF_CLS,
118         PA26_PF_PS,
119         PA27_PF_SPL_SPR,
120         PA28_PF_HSYNC,
121         PA29_PF_VSYNC,
122         PA30_PF_CONTRAST,
123         PA31_PF_OE_ACD,
124 };
125
126 static struct mxc_nand_platform_data mx27ads_nand_board_info = {
127         .width = 1,
128         .hw_ecc = 1,
129 };
130
131 /* ADS's NOR flash */
132 static struct physmap_flash_data mx27ads_flash_data = {
133         .width = 2,
134 };
135
136 static struct resource mx27ads_flash_resource = {
137         .start = 0xc0000000,
138         .end = 0xc0000000 + 0x02000000 - 1,
139         .flags = IORESOURCE_MEM,
140
141 };
142
143 static struct platform_device mx27ads_nor_mtd_device = {
144         .name = "physmap-flash",
145         .id = 0,
146         .dev = {
147                 .platform_data = &mx27ads_flash_data,
148         },
149         .num_resources = 1,
150         .resource = &mx27ads_flash_resource,
151 };
152
153 static struct imxi2c_platform_data mx27ads_i2c_data = {
154         .bitrate = 100000,
155 };
156
157 static struct i2c_board_info mx27ads_i2c_devices[] = {
158 };
159
160 void lcd_power(int on)
161 {
162         if (on)
163                 __raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_SET_REG);
164         else
165                 __raw_writew(PBC_BCTRL1_LCDON, PBC_BCTRL1_CLEAR_REG);
166 }
167
168 static struct imx_fb_platform_data mx27ads_fb_data = {
169         .pixclock       = 188679,
170         .xres           = 240,
171         .yres           = 320,
172
173         .bpp            = 16,
174         .hsync_len      = 1,
175         .left_margin    = 9,
176         .right_margin   = 16,
177
178         .vsync_len      = 1,
179         .upper_margin   = 7,
180         .lower_margin   = 9,
181         .fixed_screen_cpu = 0,
182
183         /*
184          * - HSYNC active high
185          * - VSYNC active high
186          * - clk notenabled while idle
187          * - clock inverted
188          * - data not inverted
189          * - data enable low active
190          * - enable sharp mode
191          */
192         .pcr            = 0xFB008BC0,
193         .pwmr           = 0x00A903FF,
194         .lscr1          = 0x00120300,
195         .dmacr          = 0x00020010,
196
197         .lcd_power      = lcd_power,
198 };
199
200 static struct platform_device *platform_devices[] __initdata = {
201         &mx27ads_nor_mtd_device,
202         &mxc_fec_device,
203 };
204
205 static struct imxuart_platform_data uart_pdata[] = {
206         {
207                 .flags = IMXUART_HAVE_RTSCTS,
208         }, {
209                 .flags = IMXUART_HAVE_RTSCTS,
210         }, {
211                 .flags = IMXUART_HAVE_RTSCTS,
212         }, {
213                 .flags = IMXUART_HAVE_RTSCTS,
214         }, {
215                 .flags = IMXUART_HAVE_RTSCTS,
216         }, {
217                 .flags = IMXUART_HAVE_RTSCTS,
218         },
219 };
220
221 static void __init mx27ads_board_init(void)
222 {
223         mxc_gpio_setup_multiple_pins(mx27ads_pins, ARRAY_SIZE(mx27ads_pins),
224                         "mx27ads");
225
226         mxc_register_device(&mxc_uart_device0, &uart_pdata[0]);
227         mxc_register_device(&mxc_uart_device1, &uart_pdata[1]);
228         mxc_register_device(&mxc_uart_device2, &uart_pdata[2]);
229         mxc_register_device(&mxc_uart_device3, &uart_pdata[3]);
230         mxc_register_device(&mxc_uart_device4, &uart_pdata[4]);
231         mxc_register_device(&mxc_uart_device5, &uart_pdata[5]);
232         mxc_register_device(&mxc_nand_device, &mx27ads_nand_board_info);
233
234         /* only the i2c master 1 is used on this CPU card */
235         i2c_register_board_info(1, mx27ads_i2c_devices,
236                                 ARRAY_SIZE(mx27ads_i2c_devices));
237         mxc_register_device(&mxc_i2c_device1, &mx27ads_i2c_data);
238         mxc_register_device(&mxc_fb_device, &mx27ads_fb_data);
239
240         platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
241 }
242
243 static void __init mx27ads_timer_init(void)
244 {
245         unsigned long fref = 26000000;
246
247         if ((__raw_readw(PBC_VERSION_REG) & CKIH_27MHZ_BIT_SET) == 0)
248                 fref = 27000000;
249
250         mx27_clocks_init(fref);
251 }
252
253 static struct sys_timer mx27ads_timer = {
254         .init   = mx27ads_timer_init,
255 };
256
257 static struct map_desc mx27ads_io_desc[] __initdata = {
258         {
259                 .virtual = PBC_BASE_ADDRESS,
260                 .pfn = __phys_to_pfn(CS4_BASE_ADDR),
261                 .length = SZ_1M,
262                 .type = MT_DEVICE,
263         },
264 };
265
266 static void __init mx27ads_map_io(void)
267 {
268         mx27_map_io();
269         iotable_init(mx27ads_io_desc, ARRAY_SIZE(mx27ads_io_desc));
270 }
271
272 MACHINE_START(MX27ADS, "Freescale i.MX27ADS")
273         /* maintainer: Freescale Semiconductor, Inc. */
274         .phys_io        = AIPI_BASE_ADDR,
275         .io_pg_offst    = ((AIPI_BASE_ADDR_VIRT) >> 18) & 0xfffc,
276         .boot_params    = PHYS_OFFSET + 0x100,
277         .map_io         = mx27ads_map_io,
278         .init_irq       = mxc_init_irq,
279         .init_machine   = mx27ads_board_init,
280         .timer          = &mx27ads_timer,
281 MACHINE_END
282