blob: 25ae0079980db91f9b2fea1391bec0044caadf76 [file] [log] [blame]
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -04001/*
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>
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040020#include <linux/gpio.h>
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -040021#include <linux/platform_device.h>
22#include <linux/mtd/mtd.h>
23#include <linux/mtd/nand.h>
24#include <linux/mtd/partitions.h>
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -040025#include <linux/mtd/physmap.h>
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -040026
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>
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -040034#include <mach/nand.h>
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -040035#include <mach/mux.h>
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -040036
Sudhakar Rajashekhara5a4b1312009-07-17 04:47:10 -040037#define DA850_EVM_PHY_MASK 0x1
38#define DA850_EVM_MDIO_FREQUENCY 2200000 /* PHY bus frequency */
39
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -040040#define DA850_LCD_PWR_PIN GPIO_TO_PIN(2, 8)
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040041#define DA850_LCD_BL_PIN GPIO_TO_PIN(2, 15)
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040042
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -040043#define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0)
44#define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1)
45
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -040046static struct mtd_partition da850_evm_norflash_partition[] = {
47 {
48 .name = "NOR filesystem",
49 .offset = 0,
50 .size = MTDPART_SIZ_FULL,
51 .mask_flags = 0,
52 },
53};
54
55static struct physmap_flash_data da850_evm_norflash_data = {
56 .width = 2,
57 .parts = da850_evm_norflash_partition,
58 .nr_parts = ARRAY_SIZE(da850_evm_norflash_partition),
59};
60
61static struct resource da850_evm_norflash_resource[] = {
62 {
63 .start = DA8XX_AEMIF_CS2_BASE,
64 .end = DA8XX_AEMIF_CS2_BASE + SZ_32M - 1,
65 .flags = IORESOURCE_MEM,
66 },
67};
68
69static struct platform_device da850_evm_norflash_device = {
70 .name = "physmap-flash",
71 .id = 0,
72 .dev = {
73 .platform_data = &da850_evm_norflash_data,
74 },
75 .num_resources = 1,
76 .resource = da850_evm_norflash_resource,
77};
78
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -040079/* DA850/OMAP-L138 EVM includes a 512 MByte large-page NAND flash
80 * (128K blocks). It may be used instead of the (default) SPI flash
81 * to boot, using TI's tools to install the secondary boot loader
82 * (UBL) and U-Boot.
83 */
84struct mtd_partition da850_evm_nandflash_partition[] = {
85 {
86 .name = "u-boot env",
87 .offset = 0,
88 .size = SZ_128K,
89 .mask_flags = MTD_WRITEABLE,
90 },
91 {
92 .name = "UBL",
93 .offset = MTDPART_OFS_APPEND,
94 .size = SZ_128K,
95 .mask_flags = MTD_WRITEABLE,
96 },
97 {
98 .name = "u-boot",
99 .offset = MTDPART_OFS_APPEND,
100 .size = 4 * SZ_128K,
101 .mask_flags = MTD_WRITEABLE,
102 },
103 {
104 .name = "kernel",
105 .offset = 0x200000,
106 .size = SZ_2M,
107 .mask_flags = 0,
108 },
109 {
110 .name = "filesystem",
111 .offset = MTDPART_OFS_APPEND,
112 .size = MTDPART_SIZ_FULL,
113 .mask_flags = 0,
114 },
115};
116
117static struct davinci_nand_pdata da850_evm_nandflash_data = {
118 .parts = da850_evm_nandflash_partition,
119 .nr_parts = ARRAY_SIZE(da850_evm_nandflash_partition),
120 .ecc_mode = NAND_ECC_HW,
121 .options = NAND_USE_FLASH_BBT,
122};
123
124static struct resource da850_evm_nandflash_resource[] = {
125 {
126 .start = DA8XX_AEMIF_CS3_BASE,
127 .end = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
128 .flags = IORESOURCE_MEM,
129 },
130 {
131 .start = DA8XX_AEMIF_CTL_BASE,
132 .end = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
133 .flags = IORESOURCE_MEM,
134 },
135};
136
137static struct platform_device da850_evm_nandflash_device = {
138 .name = "davinci_nand",
139 .id = 1,
140 .dev = {
141 .platform_data = &da850_evm_nandflash_data,
142 },
143 .num_resources = ARRAY_SIZE(da850_evm_nandflash_resource),
144 .resource = da850_evm_nandflash_resource,
145};
146
Chaithrika U S1a7ff8f2009-08-25 15:20:05 +0300147static struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
148 {
149 I2C_BOARD_INFO("tlv320aic3x", 0x18),
150 }
151};
152
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400153static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
154 .bus_freq = 100, /* kHz */
155 .bus_delay = 0, /* usec */
156};
157
158static struct davinci_uart_config da850_evm_uart_config __initdata = {
159 .enabled_uarts = 0x7,
160};
161
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400162static struct platform_device *da850_evm_devices[] __initdata = {
163 &da850_evm_nandflash_device,
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -0400164 &da850_evm_norflash_device,
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400165};
166
Chaithrika U S491214e2009-08-11 17:03:25 -0400167/* davinci da850 evm audio machine driver */
168static u8 da850_iis_serializer_direction[] = {
169 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
170 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
171 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, TX_MODE,
172 RX_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
173};
174
175static struct snd_platform_data da850_evm_snd_data = {
176 .tx_dma_offset = 0x2000,
177 .rx_dma_offset = 0x2000,
178 .op_mode = DAVINCI_MCASP_IIS_MODE,
179 .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
180 .tdm_slots = 2,
181 .serial_dir = da850_iis_serializer_direction,
182 .eventq_no = EVENTQ_1,
183 .version = MCASP_VERSION_2,
184 .txnumevt = 1,
185 .rxnumevt = 1,
186};
187
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400188static int da850_evm_mmc_get_ro(int index)
189{
190 return gpio_get_value(DA850_MMCSD_WP_PIN);
191}
192
193static int da850_evm_mmc_get_cd(int index)
194{
195 return !gpio_get_value(DA850_MMCSD_CD_PIN);
196}
197
198static struct davinci_mmc_config da850_mmc_config = {
199 .get_ro = da850_evm_mmc_get_ro,
200 .get_cd = da850_evm_mmc_get_cd,
201 .wires = 4,
202 .version = MMC_CTLR_VERSION_2,
203};
204
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400205static int da850_lcd_hw_init(void)
206{
207 int status;
208
209 status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
210 if (status < 0)
211 return status;
212
213 status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
214 if (status < 0) {
215 gpio_free(DA850_LCD_BL_PIN);
216 return status;
217 }
218
219 gpio_direction_output(DA850_LCD_BL_PIN, 0);
220 gpio_direction_output(DA850_LCD_PWR_PIN, 0);
221
222 /* disable lcd backlight */
223 gpio_set_value(DA850_LCD_BL_PIN, 0);
224
225 /* disable lcd power */
226 gpio_set_value(DA850_LCD_PWR_PIN, 0);
227
228 /* enable lcd power */
229 gpio_set_value(DA850_LCD_PWR_PIN, 1);
230
231 /* enable lcd backlight */
232 gpio_set_value(DA850_LCD_BL_PIN, 1);
233
234 return 0;
235}
Chaithrika U S491214e2009-08-11 17:03:25 -0400236
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -0400237#define DA8XX_AEMIF_CE2CFG_OFFSET 0x10
238#define DA8XX_AEMIF_ASIZE_16BIT 0x1
239
240static void __init da850_evm_init_nor(void)
241{
242 void __iomem *aemif_addr;
243
244 aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K);
245
246 /* Configure data bus width of CS2 to 16 bit */
247 writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) |
248 DA8XX_AEMIF_ASIZE_16BIT,
249 aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET);
250
251 iounmap(aemif_addr);
252}
253
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400254#if defined(CONFIG_MTD_PHYSMAP) || \
255 defined(CONFIG_MTD_PHYSMAP_MODULE)
256#define HAS_NOR 1
257#else
258#define HAS_NOR 0
259#endif
260
261#if defined(CONFIG_MMC_DAVINCI) || \
262 defined(CONFIG_MMC_DAVINCI_MODULE)
263#define HAS_MMC 1
264#else
265#define HAS_MMC 0
266#endif
267
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -0400268static const short da850_evm_lcdc_pins[] = {
269 DA850_GPIO2_8, DA850_GPIO2_15,
270 -1
271};
272
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400273static __init void da850_evm_init(void)
274{
Sudhakar Rajashekhara5a4b1312009-07-17 04:47:10 -0400275 struct davinci_soc_info *soc_info = &davinci_soc_info;
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400276 int ret;
277
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400278 ret = da8xx_pinmux_setup(da850_nand_pins);
279 if (ret)
280 pr_warning("da850_evm_init: nand mux setup failed: %d\n",
281 ret);
282
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -0400283 ret = da8xx_pinmux_setup(da850_nor_pins);
284 if (ret)
285 pr_warning("da850_evm_init: nor mux setup failed: %d\n",
286 ret);
287
288 da850_evm_init_nor();
289
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400290 platform_add_devices(da850_evm_devices,
291 ARRAY_SIZE(da850_evm_devices));
292
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400293 ret = da8xx_register_edma();
294 if (ret)
295 pr_warning("da850_evm_init: edma registration failed: %d\n",
296 ret);
297
298 ret = da8xx_pinmux_setup(da850_i2c0_pins);
299 if (ret)
300 pr_warning("da850_evm_init: i2c0 mux setup failed: %d\n",
301 ret);
302
303 ret = da8xx_register_i2c(0, &da850_evm_i2c_0_pdata);
304 if (ret)
305 pr_warning("da850_evm_init: i2c0 registration failed: %d\n",
306 ret);
307
Sudhakar Rajashekhara5a4b1312009-07-17 04:47:10 -0400308 soc_info->emac_pdata->phy_mask = DA850_EVM_PHY_MASK;
309 soc_info->emac_pdata->mdio_max_freq = DA850_EVM_MDIO_FREQUENCY;
310 soc_info->emac_pdata->rmii_en = 0;
311
312 ret = da8xx_pinmux_setup(da850_cpgmac_pins);
313 if (ret)
314 pr_warning("da850_evm_init: cpgmac mux setup failed: %d\n",
315 ret);
316
317 ret = da8xx_register_emac();
318 if (ret)
319 pr_warning("da850_evm_init: emac registration failed: %d\n",
320 ret);
321
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400322 ret = da8xx_register_watchdog();
323 if (ret)
324 pr_warning("da830_evm_init: watchdog registration failed: %d\n",
325 ret);
326
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400327 if (HAS_MMC) {
328 if (HAS_NOR)
329 pr_warning("WARNING: both NOR Flash and MMC/SD are "
330 "enabled, but they share AEMIF pins.\n"
331 "\tDisable one of them.\n");
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400332
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400333 ret = da8xx_pinmux_setup(da850_mmcsd0_pins);
334 if (ret)
335 pr_warning("da850_evm_init: mmcsd0 mux setup failed:"
336 " %d\n", ret);
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400337
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400338 ret = gpio_request(DA850_MMCSD_CD_PIN, "MMC CD\n");
339 if (ret)
340 pr_warning("da850_evm_init: can not open GPIO %d\n",
341 DA850_MMCSD_CD_PIN);
342 gpio_direction_input(DA850_MMCSD_CD_PIN);
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400343
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400344 ret = gpio_request(DA850_MMCSD_WP_PIN, "MMC WP\n");
345 if (ret)
346 pr_warning("da850_evm_init: can not open GPIO %d\n",
347 DA850_MMCSD_WP_PIN);
348 gpio_direction_input(DA850_MMCSD_WP_PIN);
349
350 ret = da8xx_register_mmcsd0(&da850_mmc_config);
351 if (ret)
352 pr_warning("da850_evm_init: mmcsd0 registration failed:"
353 " %d\n", ret);
354 }
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400355
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400356 davinci_serial_init(&da850_evm_uart_config);
357
Chaithrika U S1a7ff8f2009-08-25 15:20:05 +0300358 i2c_register_board_info(1, da850_evm_i2c_devices,
359 ARRAY_SIZE(da850_evm_i2c_devices));
360
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400361 /*
362 * shut down uart 0 and 1; they are not used on the board and
363 * accessing them causes endless "too much work in irq53" messages
364 * with arago fs
365 */
366 __raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
367 __raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
Chaithrika U S491214e2009-08-11 17:03:25 -0400368
369 ret = da8xx_pinmux_setup(da850_mcasp_pins);
370 if (ret)
371 pr_warning("da850_evm_init: mcasp mux setup failed: %d\n",
372 ret);
373
Mark A. Greerb8864aa2009-08-28 15:05:02 -0700374 da8xx_register_mcasp(0, &da850_evm_snd_data);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400375
376 ret = da8xx_pinmux_setup(da850_lcdcntl_pins);
377 if (ret)
378 pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n",
379 ret);
380
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -0400381 /* Handle board specific muxing for LCD here */
382 ret = da8xx_pinmux_setup(da850_evm_lcdc_pins);
383 if (ret)
384 pr_warning("da850_evm_init: evm specific lcd mux setup "
385 "failed: %d\n", ret);
386
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400387 ret = da850_lcd_hw_init();
388 if (ret)
389 pr_warning("da850_evm_init: lcd initialization failed: %d\n",
390 ret);
391
Mark A. Greerb9e63422009-09-15 18:14:19 -0700392 ret = da8xx_register_lcdc(&sharp_lk043t1dg01_pdata);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400393 if (ret)
394 pr_warning("da850_evm_init: lcdc registration failed: %d\n",
395 ret);
Mark A. Greerc51df702009-09-15 18:15:54 -0700396
397 ret = da8xx_register_rtc();
398 if (ret)
399 pr_warning("da850_evm_init: rtc setup failed: %d\n", ret);
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400400}
401
402#ifdef CONFIG_SERIAL_8250_CONSOLE
403static int __init da850_evm_console_init(void)
404{
405 return add_preferred_console("ttyS", 2, "115200");
406}
407console_initcall(da850_evm_console_init);
408#endif
409
410static __init void da850_evm_irq_init(void)
411{
412 struct davinci_soc_info *soc_info = &davinci_soc_info;
413
414 cp_intc_init((void __iomem *)DA8XX_CP_INTC_VIRT, DA850_N_CP_INTC_IRQ,
415 soc_info->intc_irq_prios);
416}
417
418static void __init da850_evm_map_io(void)
419{
420 da850_init();
421}
422
423MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138 EVM")
424 .phys_io = IO_PHYS,
425 .io_pg_offst = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
426 .boot_params = (DA8XX_DDR_BASE + 0x100),
427 .map_io = da850_evm_map_io,
428 .init_irq = da850_evm_irq_init,
429 .timer = &davinci_timer,
430 .init_machine = da850_evm_init,
431MACHINE_END