Merge branch 'sh/dwarf-unwinder'
[pandora-kernel.git] / arch / arm / mach-davinci / board-da850-evm.c
1 /*
2  * TI DA850/OMAP-L138 EVM board
3  *
4  * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com/
5  *
6  * Derived from: arch/arm/mach-davinci/board-da830-evm.c
7  * Original Copyrights follow:
8  *
9  * 2007, 2009 (c) MontaVista Software, Inc. This file is licensed under
10  * the terms of the GNU General Public License version 2. This program
11  * is licensed "as is" without any warranty of any kind, whether express
12  * or implied.
13  */
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <linux/console.h>
18 #include <linux/i2c.h>
19 #include <linux/i2c/at24.h>
20 #include <linux/gpio.h>
21 #include <linux/platform_device.h>
22 #include <linux/mtd/mtd.h>
23 #include <linux/mtd/nand.h>
24 #include <linux/mtd/partitions.h>
25 #include <linux/mtd/physmap.h>
26
27 #include <asm/mach-types.h>
28 #include <asm/mach/arch.h>
29
30 #include <mach/common.h>
31 #include <mach/irqs.h>
32 #include <mach/cp_intc.h>
33 #include <mach/da8xx.h>
34 #include <mach/nand.h>
35
36 #define DA850_EVM_PHY_MASK              0x1
37 #define DA850_EVM_MDIO_FREQUENCY        2200000 /* PHY bus frequency */
38
39 #define DA850_LCD_BL_PIN                GPIO_TO_PIN(2, 15)
40 #define DA850_LCD_PWR_PIN               GPIO_TO_PIN(8, 10)
41
42 #define DA850_MMCSD_CD_PIN              GPIO_TO_PIN(4, 0)
43 #define DA850_MMCSD_WP_PIN              GPIO_TO_PIN(4, 1)
44
45 static struct mtd_partition da850_evm_norflash_partition[] = {
46         {
47                 .name           = "NOR filesystem",
48                 .offset         = 0,
49                 .size           = MTDPART_SIZ_FULL,
50                 .mask_flags     = 0,
51         },
52 };
53
54 static struct physmap_flash_data da850_evm_norflash_data = {
55         .width          = 2,
56         .parts          = da850_evm_norflash_partition,
57         .nr_parts       = ARRAY_SIZE(da850_evm_norflash_partition),
58 };
59
60 static struct resource da850_evm_norflash_resource[] = {
61         {
62                 .start  = DA8XX_AEMIF_CS2_BASE,
63                 .end    = DA8XX_AEMIF_CS2_BASE + SZ_32M - 1,
64                 .flags  = IORESOURCE_MEM,
65         },
66 };
67
68 static struct platform_device da850_evm_norflash_device = {
69         .name           = "physmap-flash",
70         .id             = 0,
71         .dev            = {
72                 .platform_data  = &da850_evm_norflash_data,
73         },
74         .num_resources  = 1,
75         .resource       = da850_evm_norflash_resource,
76 };
77
78 /* DA850/OMAP-L138 EVM includes a 512 MByte large-page NAND flash
79  * (128K blocks). It may be used instead of the (default) SPI flash
80  * to boot, using TI's tools to install the secondary boot loader
81  * (UBL) and U-Boot.
82  */
83 struct mtd_partition da850_evm_nandflash_partition[] = {
84         {
85                 .name           = "u-boot env",
86                 .offset         = 0,
87                 .size           = SZ_128K,
88                 .mask_flags     = MTD_WRITEABLE,
89          },
90         {
91                 .name           = "UBL",
92                 .offset         = MTDPART_OFS_APPEND,
93                 .size           = SZ_128K,
94                 .mask_flags     = MTD_WRITEABLE,
95         },
96         {
97                 .name           = "u-boot",
98                 .offset         = MTDPART_OFS_APPEND,
99                 .size           = 4 * SZ_128K,
100                 .mask_flags     = MTD_WRITEABLE,
101         },
102         {
103                 .name           = "kernel",
104                 .offset         = 0x200000,
105                 .size           = SZ_2M,
106                 .mask_flags     = 0,
107         },
108         {
109                 .name           = "filesystem",
110                 .offset         = MTDPART_OFS_APPEND,
111                 .size           = MTDPART_SIZ_FULL,
112                 .mask_flags     = 0,
113         },
114 };
115
116 static struct davinci_nand_pdata da850_evm_nandflash_data = {
117         .parts          = da850_evm_nandflash_partition,
118         .nr_parts       = ARRAY_SIZE(da850_evm_nandflash_partition),
119         .ecc_mode       = NAND_ECC_HW,
120         .options        = NAND_USE_FLASH_BBT,
121 };
122
123 static struct resource da850_evm_nandflash_resource[] = {
124         {
125                 .start  = DA8XX_AEMIF_CS3_BASE,
126                 .end    = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
127                 .flags  = IORESOURCE_MEM,
128         },
129         {
130                 .start  = DA8XX_AEMIF_CTL_BASE,
131                 .end    = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
132                 .flags  = IORESOURCE_MEM,
133         },
134 };
135
136 static struct platform_device da850_evm_nandflash_device = {
137         .name           = "davinci_nand",
138         .id             = 1,
139         .dev            = {
140                 .platform_data  = &da850_evm_nandflash_data,
141         },
142         .num_resources  = ARRAY_SIZE(da850_evm_nandflash_resource),
143         .resource       = da850_evm_nandflash_resource,
144 };
145
146 static struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
147         {
148                 I2C_BOARD_INFO("tlv320aic3x", 0x18),
149         }
150 };
151
152 static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
153         .bus_freq       = 100,  /* kHz */
154         .bus_delay      = 0,    /* usec */
155 };
156
157 static struct davinci_uart_config da850_evm_uart_config __initdata = {
158         .enabled_uarts = 0x7,
159 };
160
161 static struct platform_device *da850_evm_devices[] __initdata = {
162         &da850_evm_nandflash_device,
163         &da850_evm_norflash_device,
164 };
165
166 /* davinci da850 evm audio machine driver */
167 static u8 da850_iis_serializer_direction[] = {
168         INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
169         INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
170         INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,  TX_MODE,
171         RX_MODE,        INACTIVE_MODE,  INACTIVE_MODE,  INACTIVE_MODE,
172 };
173
174 static struct snd_platform_data da850_evm_snd_data = {
175         .tx_dma_offset  = 0x2000,
176         .rx_dma_offset  = 0x2000,
177         .op_mode        = DAVINCI_MCASP_IIS_MODE,
178         .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
179         .tdm_slots      = 2,
180         .serial_dir     = da850_iis_serializer_direction,
181         .eventq_no      = EVENTQ_1,
182         .version        = MCASP_VERSION_2,
183         .txnumevt       = 1,
184         .rxnumevt       = 1,
185 };
186
187 static int da850_evm_mmc_get_ro(int index)
188 {
189         return gpio_get_value(DA850_MMCSD_WP_PIN);
190 }
191
192 static int da850_evm_mmc_get_cd(int index)
193 {
194         return !gpio_get_value(DA850_MMCSD_CD_PIN);
195 }
196
197 static struct davinci_mmc_config da850_mmc_config = {
198         .get_ro         = da850_evm_mmc_get_ro,
199         .get_cd         = da850_evm_mmc_get_cd,
200         .wires          = 4,
201         .version        = MMC_CTLR_VERSION_2,
202 };
203
204 static int da850_lcd_hw_init(void)
205 {
206         int status;
207
208         status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
209         if (status < 0)
210                 return status;
211
212         status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
213         if (status < 0) {
214                 gpio_free(DA850_LCD_BL_PIN);
215                 return status;
216         }
217
218         gpio_direction_output(DA850_LCD_BL_PIN, 0);
219         gpio_direction_output(DA850_LCD_PWR_PIN, 0);
220
221         /* disable lcd backlight */
222         gpio_set_value(DA850_LCD_BL_PIN, 0);
223
224         /* disable lcd power */
225         gpio_set_value(DA850_LCD_PWR_PIN, 0);
226
227         /* enable lcd power */
228         gpio_set_value(DA850_LCD_PWR_PIN, 1);
229
230         /* enable lcd backlight */
231         gpio_set_value(DA850_LCD_BL_PIN, 1);
232
233         return 0;
234 }
235
236 #define DA8XX_AEMIF_CE2CFG_OFFSET       0x10
237 #define DA8XX_AEMIF_ASIZE_16BIT         0x1
238
239 static void __init da850_evm_init_nor(void)
240 {
241         void __iomem *aemif_addr;
242
243         aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K);
244
245         /* Configure data bus width of CS2 to 16 bit */
246         writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) |
247                 DA8XX_AEMIF_ASIZE_16BIT,
248                 aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET);
249
250         iounmap(aemif_addr);
251 }
252
253 #if defined(CONFIG_MTD_PHYSMAP) || \
254     defined(CONFIG_MTD_PHYSMAP_MODULE)
255 #define HAS_NOR 1
256 #else
257 #define HAS_NOR 0
258 #endif
259
260 #if defined(CONFIG_MMC_DAVINCI) || \
261     defined(CONFIG_MMC_DAVINCI_MODULE)
262 #define HAS_MMC 1
263 #else
264 #define HAS_MMC 0
265 #endif
266
267 static __init void da850_evm_init(void)
268 {
269         struct davinci_soc_info *soc_info = &davinci_soc_info;
270         int ret;
271
272         ret = da8xx_pinmux_setup(da850_nand_pins);
273         if (ret)
274                 pr_warning("da850_evm_init: nand mux setup failed: %d\n",
275                                 ret);
276
277         ret = da8xx_pinmux_setup(da850_nor_pins);
278         if (ret)
279                 pr_warning("da850_evm_init: nor mux setup failed: %d\n",
280                                 ret);
281
282         da850_evm_init_nor();
283
284         platform_add_devices(da850_evm_devices,
285                                 ARRAY_SIZE(da850_evm_devices));
286
287         ret = da8xx_register_edma();
288         if (ret)
289                 pr_warning("da850_evm_init: edma registration failed: %d\n",
290                                 ret);
291
292         ret = da8xx_pinmux_setup(da850_i2c0_pins);
293         if (ret)
294                 pr_warning("da850_evm_init: i2c0 mux setup failed: %d\n",
295                                 ret);
296
297         ret = da8xx_register_i2c(0, &da850_evm_i2c_0_pdata);
298         if (ret)
299                 pr_warning("da850_evm_init: i2c0 registration failed: %d\n",
300                                 ret);
301
302         soc_info->emac_pdata->phy_mask = DA850_EVM_PHY_MASK;
303         soc_info->emac_pdata->mdio_max_freq = DA850_EVM_MDIO_FREQUENCY;
304         soc_info->emac_pdata->rmii_en = 0;
305
306         ret = da8xx_pinmux_setup(da850_cpgmac_pins);
307         if (ret)
308                 pr_warning("da850_evm_init: cpgmac mux setup failed: %d\n",
309                                 ret);
310
311         ret = da8xx_register_emac();
312         if (ret)
313                 pr_warning("da850_evm_init: emac registration failed: %d\n",
314                                 ret);
315
316         ret = da8xx_register_watchdog();
317         if (ret)
318                 pr_warning("da830_evm_init: watchdog registration failed: %d\n",
319                                 ret);
320
321         if (HAS_MMC) {
322                 if (HAS_NOR)
323                         pr_warning("WARNING: both NOR Flash and MMC/SD are "
324                                 "enabled, but they share AEMIF pins.\n"
325                                 "\tDisable one of them.\n");
326
327                 ret = da8xx_pinmux_setup(da850_mmcsd0_pins);
328                 if (ret)
329                         pr_warning("da850_evm_init: mmcsd0 mux setup failed:"
330                                         " %d\n", ret);
331
332                 ret = gpio_request(DA850_MMCSD_CD_PIN, "MMC CD\n");
333                 if (ret)
334                         pr_warning("da850_evm_init: can not open GPIO %d\n",
335                                         DA850_MMCSD_CD_PIN);
336                 gpio_direction_input(DA850_MMCSD_CD_PIN);
337
338                 ret = gpio_request(DA850_MMCSD_WP_PIN, "MMC WP\n");
339                 if (ret)
340                         pr_warning("da850_evm_init: can not open GPIO %d\n",
341                                         DA850_MMCSD_WP_PIN);
342                 gpio_direction_input(DA850_MMCSD_WP_PIN);
343
344                 ret = da8xx_register_mmcsd0(&da850_mmc_config);
345                 if (ret)
346                         pr_warning("da850_evm_init: mmcsd0 registration failed:"
347                                         " %d\n", ret);
348         }
349
350         davinci_serial_init(&da850_evm_uart_config);
351
352         i2c_register_board_info(1, da850_evm_i2c_devices,
353                         ARRAY_SIZE(da850_evm_i2c_devices));
354
355         /*
356          * shut down uart 0 and 1; they are not used on the board and
357          * accessing them causes endless "too much work in irq53" messages
358          * with arago fs
359          */
360         __raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
361         __raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
362
363         ret = da8xx_pinmux_setup(da850_mcasp_pins);
364         if (ret)
365                 pr_warning("da850_evm_init: mcasp mux setup failed: %d\n",
366                                 ret);
367
368         da8xx_init_mcasp(0, &da850_evm_snd_data);
369
370         ret = da8xx_pinmux_setup(da850_lcdcntl_pins);
371         if (ret)
372                 pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n",
373                                 ret);
374
375         ret = da850_lcd_hw_init();
376         if (ret)
377                 pr_warning("da850_evm_init: lcd initialization failed: %d\n",
378                                 ret);
379
380         ret = da8xx_register_lcdc();
381         if (ret)
382                 pr_warning("da850_evm_init: lcdc registration failed: %d\n",
383                                 ret);
384 }
385
386 #ifdef CONFIG_SERIAL_8250_CONSOLE
387 static int __init da850_evm_console_init(void)
388 {
389         return add_preferred_console("ttyS", 2, "115200");
390 }
391 console_initcall(da850_evm_console_init);
392 #endif
393
394 static __init void da850_evm_irq_init(void)
395 {
396         struct davinci_soc_info *soc_info = &davinci_soc_info;
397
398         cp_intc_init((void __iomem *)DA8XX_CP_INTC_VIRT, DA850_N_CP_INTC_IRQ,
399                         soc_info->intc_irq_prios);
400 }
401
402 static void __init da850_evm_map_io(void)
403 {
404         da850_init();
405 }
406
407 MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138 EVM")
408         .phys_io        = IO_PHYS,
409         .io_pg_offst    = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
410         .boot_params    = (DA8XX_DDR_BASE + 0x100),
411         .map_io         = da850_evm_map_io,
412         .init_irq       = da850_evm_irq_init,
413         .timer          = &davinci_timer,
414         .init_machine   = da850_evm_init,
415 MACHINE_END