blob: 05b2d87d96bd49a14baff7a9b208b50198781abb [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>
Chaithrika U S75e2ea62009-09-30 17:00:28 -040020#include <linux/i2c/pca953x.h>
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040021#include <linux/gpio.h>
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -040022#include <linux/platform_device.h>
23#include <linux/mtd/mtd.h>
24#include <linux/mtd/nand.h>
25#include <linux/mtd/partitions.h>
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -040026#include <linux/mtd/physmap.h>
Sekhar Noria9eb1f62009-09-22 21:14:04 +053027#include <linux/regulator/machine.h>
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -040028
29#include <asm/mach-types.h>
30#include <asm/mach/arch.h>
31
32#include <mach/common.h>
33#include <mach/irqs.h>
34#include <mach/cp_intc.h>
35#include <mach/da8xx.h>
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -040036#include <mach/nand.h>
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -040037#include <mach/mux.h>
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -040038
Sudhakar Rajashekhara5a4b1312009-07-17 04:47:10 -040039#define DA850_EVM_PHY_MASK 0x1
40#define DA850_EVM_MDIO_FREQUENCY 2200000 /* PHY bus frequency */
41
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -040042#define DA850_LCD_PWR_PIN GPIO_TO_PIN(2, 8)
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040043#define DA850_LCD_BL_PIN GPIO_TO_PIN(2, 15)
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -040044
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -040045#define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0)
46#define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1)
47
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -040048static struct mtd_partition da850_evm_norflash_partition[] = {
49 {
50 .name = "NOR filesystem",
51 .offset = 0,
52 .size = MTDPART_SIZ_FULL,
53 .mask_flags = 0,
54 },
55};
56
57static struct physmap_flash_data da850_evm_norflash_data = {
58 .width = 2,
59 .parts = da850_evm_norflash_partition,
60 .nr_parts = ARRAY_SIZE(da850_evm_norflash_partition),
61};
62
63static struct resource da850_evm_norflash_resource[] = {
64 {
65 .start = DA8XX_AEMIF_CS2_BASE,
66 .end = DA8XX_AEMIF_CS2_BASE + SZ_32M - 1,
67 .flags = IORESOURCE_MEM,
68 },
69};
70
71static struct platform_device da850_evm_norflash_device = {
72 .name = "physmap-flash",
73 .id = 0,
74 .dev = {
75 .platform_data = &da850_evm_norflash_data,
76 },
77 .num_resources = 1,
78 .resource = da850_evm_norflash_resource,
79};
80
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -040081/* DA850/OMAP-L138 EVM includes a 512 MByte large-page NAND flash
82 * (128K blocks). It may be used instead of the (default) SPI flash
83 * to boot, using TI's tools to install the secondary boot loader
84 * (UBL) and U-Boot.
85 */
86struct mtd_partition da850_evm_nandflash_partition[] = {
87 {
88 .name = "u-boot env",
89 .offset = 0,
90 .size = SZ_128K,
91 .mask_flags = MTD_WRITEABLE,
92 },
93 {
94 .name = "UBL",
95 .offset = MTDPART_OFS_APPEND,
96 .size = SZ_128K,
97 .mask_flags = MTD_WRITEABLE,
98 },
99 {
100 .name = "u-boot",
101 .offset = MTDPART_OFS_APPEND,
102 .size = 4 * SZ_128K,
103 .mask_flags = MTD_WRITEABLE,
104 },
105 {
106 .name = "kernel",
107 .offset = 0x200000,
108 .size = SZ_2M,
109 .mask_flags = 0,
110 },
111 {
112 .name = "filesystem",
113 .offset = MTDPART_OFS_APPEND,
114 .size = MTDPART_SIZ_FULL,
115 .mask_flags = 0,
116 },
117};
118
119static struct davinci_nand_pdata da850_evm_nandflash_data = {
120 .parts = da850_evm_nandflash_partition,
121 .nr_parts = ARRAY_SIZE(da850_evm_nandflash_partition),
122 .ecc_mode = NAND_ECC_HW,
123 .options = NAND_USE_FLASH_BBT,
124};
125
126static struct resource da850_evm_nandflash_resource[] = {
127 {
128 .start = DA8XX_AEMIF_CS3_BASE,
129 .end = DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
130 .flags = IORESOURCE_MEM,
131 },
132 {
133 .start = DA8XX_AEMIF_CTL_BASE,
134 .end = DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
135 .flags = IORESOURCE_MEM,
136 },
137};
138
139static struct platform_device da850_evm_nandflash_device = {
140 .name = "davinci_nand",
141 .id = 1,
142 .dev = {
143 .platform_data = &da850_evm_nandflash_data,
144 },
145 .num_resources = ARRAY_SIZE(da850_evm_nandflash_resource),
146 .resource = da850_evm_nandflash_resource,
147};
148
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400149static u32 ui_card_detected;
150static void da850_evm_setup_nor_nand(void);
151
152static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio,
153 unsigned ngpio, void *c)
154{
155 int sel_a, sel_b, sel_c, ret;
156
157 sel_a = gpio + 7;
158 sel_b = gpio + 6;
159 sel_c = gpio + 5;
160
161 ret = gpio_request(sel_a, "sel_a");
162 if (ret) {
163 pr_warning("Cannot open UI expander pin %d\n", sel_a);
164 goto exp_setup_sela_fail;
165 }
166
167 ret = gpio_request(sel_b, "sel_b");
168 if (ret) {
169 pr_warning("Cannot open UI expander pin %d\n", sel_b);
170 goto exp_setup_selb_fail;
171 }
172
173 ret = gpio_request(sel_c, "sel_c");
174 if (ret) {
175 pr_warning("Cannot open UI expander pin %d\n", sel_c);
176 goto exp_setup_selc_fail;
177 }
178
179 /* deselect all functionalities */
180 gpio_direction_output(sel_a, 1);
181 gpio_direction_output(sel_b, 1);
182 gpio_direction_output(sel_c, 1);
183
184 ui_card_detected = 1;
185 pr_info("DA850/OMAP-L138 EVM UI card detected\n");
186
187 da850_evm_setup_nor_nand();
188
189 return 0;
190
191exp_setup_selc_fail:
192 gpio_free(sel_b);
193exp_setup_selb_fail:
194 gpio_free(sel_a);
195exp_setup_sela_fail:
196 return ret;
197}
198
199static int da850_evm_ui_expander_teardown(struct i2c_client *client,
200 unsigned gpio, unsigned ngpio, void *c)
201{
202 /* deselect all functionalities */
203 gpio_set_value(gpio + 5, 1);
204 gpio_set_value(gpio + 6, 1);
205 gpio_set_value(gpio + 7, 1);
206
207 gpio_free(gpio + 5);
208 gpio_free(gpio + 6);
209 gpio_free(gpio + 7);
210
211 return 0;
212}
213
214static struct pca953x_platform_data da850_evm_ui_expander_info = {
215 .gpio_base = DAVINCI_N_GPIO,
216 .setup = da850_evm_ui_expander_setup,
217 .teardown = da850_evm_ui_expander_teardown,
218};
219
Chaithrika U S1a7ff8f2009-08-25 15:20:05 +0300220static struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
221 {
222 I2C_BOARD_INFO("tlv320aic3x", 0x18),
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400223 },
224 {
225 I2C_BOARD_INFO("tca6416", 0x20),
226 .platform_data = &da850_evm_ui_expander_info,
227 },
Chaithrika U S1a7ff8f2009-08-25 15:20:05 +0300228};
229
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400230static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {
231 .bus_freq = 100, /* kHz */
232 .bus_delay = 0, /* usec */
233};
234
235static struct davinci_uart_config da850_evm_uart_config __initdata = {
236 .enabled_uarts = 0x7,
237};
238
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400239static struct platform_device *da850_evm_devices[] __initdata = {
240 &da850_evm_nandflash_device,
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -0400241 &da850_evm_norflash_device,
Sudhakar Rajashekhara38beb922009-08-13 16:21:11 -0400242};
243
Chaithrika U S491214e2009-08-11 17:03:25 -0400244/* davinci da850 evm audio machine driver */
245static u8 da850_iis_serializer_direction[] = {
246 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
247 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
248 INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, TX_MODE,
249 RX_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE,
250};
251
252static struct snd_platform_data da850_evm_snd_data = {
253 .tx_dma_offset = 0x2000,
254 .rx_dma_offset = 0x2000,
255 .op_mode = DAVINCI_MCASP_IIS_MODE,
256 .num_serializer = ARRAY_SIZE(da850_iis_serializer_direction),
257 .tdm_slots = 2,
258 .serial_dir = da850_iis_serializer_direction,
259 .eventq_no = EVENTQ_1,
260 .version = MCASP_VERSION_2,
261 .txnumevt = 1,
262 .rxnumevt = 1,
263};
264
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400265static int da850_evm_mmc_get_ro(int index)
266{
267 return gpio_get_value(DA850_MMCSD_WP_PIN);
268}
269
270static int da850_evm_mmc_get_cd(int index)
271{
272 return !gpio_get_value(DA850_MMCSD_CD_PIN);
273}
274
275static struct davinci_mmc_config da850_mmc_config = {
276 .get_ro = da850_evm_mmc_get_ro,
277 .get_cd = da850_evm_mmc_get_cd,
278 .wires = 4,
279 .version = MMC_CTLR_VERSION_2,
280};
281
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400282static int da850_lcd_hw_init(void)
283{
284 int status;
285
286 status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
287 if (status < 0)
288 return status;
289
290 status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
291 if (status < 0) {
292 gpio_free(DA850_LCD_BL_PIN);
293 return status;
294 }
295
296 gpio_direction_output(DA850_LCD_BL_PIN, 0);
297 gpio_direction_output(DA850_LCD_PWR_PIN, 0);
298
299 /* disable lcd backlight */
300 gpio_set_value(DA850_LCD_BL_PIN, 0);
301
302 /* disable lcd power */
303 gpio_set_value(DA850_LCD_PWR_PIN, 0);
304
305 /* enable lcd power */
306 gpio_set_value(DA850_LCD_PWR_PIN, 1);
307
308 /* enable lcd backlight */
309 gpio_set_value(DA850_LCD_BL_PIN, 1);
310
311 return 0;
312}
Chaithrika U S491214e2009-08-11 17:03:25 -0400313
Sudhakar Rajashekhara7c5ec602009-08-13 17:36:25 -0400314#define DA8XX_AEMIF_CE2CFG_OFFSET 0x10
315#define DA8XX_AEMIF_ASIZE_16BIT 0x1
316
317static void __init da850_evm_init_nor(void)
318{
319 void __iomem *aemif_addr;
320
321 aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K);
322
323 /* Configure data bus width of CS2 to 16 bit */
324 writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) |
325 DA8XX_AEMIF_ASIZE_16BIT,
326 aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET);
327
328 iounmap(aemif_addr);
329}
330
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530331/* TPS65070 voltage regulator support */
332
333/* 3.3V */
334struct regulator_consumer_supply tps65070_dcdc1_consumers[] = {
335 {
336 .supply = "usb0_vdda33",
337 },
338 {
339 .supply = "usb1_vdda33",
340 },
341};
342
343/* 3.3V or 1.8V */
344struct regulator_consumer_supply tps65070_dcdc2_consumers[] = {
345 {
346 .supply = "dvdd3318_a",
347 },
348 {
349 .supply = "dvdd3318_b",
350 },
351 {
352 .supply = "dvdd3318_c",
353 },
354};
355
356/* 1.2V */
357struct regulator_consumer_supply tps65070_dcdc3_consumers[] = {
358 {
359 .supply = "cvdd",
360 },
361};
362
363/* 1.8V LDO */
364struct regulator_consumer_supply tps65070_ldo1_consumers[] = {
365 {
366 .supply = "sata_vddr",
367 },
368 {
369 .supply = "usb0_vdda18",
370 },
371 {
372 .supply = "usb1_vdda18",
373 },
374 {
375 .supply = "ddr_dvdd18",
376 },
377};
378
379/* 1.2V LDO */
380struct regulator_consumer_supply tps65070_ldo2_consumers[] = {
381 {
382 .supply = "sata_vdd",
383 },
384 {
385 .supply = "pll0_vdda",
386 },
387 {
388 .supply = "pll1_vdda",
389 },
390 {
391 .supply = "usbs_cvdd",
392 },
393 {
394 .supply = "vddarnwa1",
395 },
396};
397
398struct regulator_init_data tps65070_regulator_data[] = {
399 /* dcdc1 */
400 {
401 .constraints = {
402 .min_uV = 3150000,
403 .max_uV = 3450000,
404 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
405 REGULATOR_CHANGE_STATUS),
406 .boot_on = 1,
407 },
408 .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc1_consumers),
409 .consumer_supplies = tps65070_dcdc1_consumers,
410 },
411
412 /* dcdc2 */
413 {
414 .constraints = {
415 .min_uV = 1710000,
416 .max_uV = 3450000,
417 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
418 REGULATOR_CHANGE_STATUS),
419 .boot_on = 1,
420 },
421 .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc2_consumers),
422 .consumer_supplies = tps65070_dcdc2_consumers,
423 },
424
425 /* dcdc3 */
426 {
427 .constraints = {
428 .min_uV = 950000,
429 .max_uV = 1320000,
430 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
431 REGULATOR_CHANGE_STATUS),
432 .boot_on = 1,
433 },
434 .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc3_consumers),
435 .consumer_supplies = tps65070_dcdc3_consumers,
436 },
437
438 /* ldo1 */
439 {
440 .constraints = {
441 .min_uV = 1710000,
442 .max_uV = 1890000,
443 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
444 REGULATOR_CHANGE_STATUS),
445 .boot_on = 1,
446 },
447 .num_consumer_supplies = ARRAY_SIZE(tps65070_ldo1_consumers),
448 .consumer_supplies = tps65070_ldo1_consumers,
449 },
450
451 /* ldo2 */
452 {
453 .constraints = {
454 .min_uV = 1140000,
455 .max_uV = 1320000,
456 .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
457 REGULATOR_CHANGE_STATUS),
458 .boot_on = 1,
459 },
460 .num_consumer_supplies = ARRAY_SIZE(tps65070_ldo2_consumers),
461 .consumer_supplies = tps65070_ldo2_consumers,
462 },
463};
464
465static struct i2c_board_info __initdata da850evm_tps65070_info[] = {
466 {
467 I2C_BOARD_INFO("tps6507x", 0x48),
468 .platform_data = &tps65070_regulator_data[0],
469 },
470};
471
472static int __init pmic_tps65070_init(void)
473{
474 return i2c_register_board_info(1, da850evm_tps65070_info,
475 ARRAY_SIZE(da850evm_tps65070_info));
476}
477
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400478#if defined(CONFIG_MMC_DAVINCI) || \
479 defined(CONFIG_MMC_DAVINCI_MODULE)
480#define HAS_MMC 1
481#else
482#define HAS_MMC 0
483#endif
484
Chaithrika U S75e2ea62009-09-30 17:00:28 -0400485static void da850_evm_setup_nor_nand(void)
486{
487 int ret = 0;
488
489 if (ui_card_detected & !HAS_MMC) {
490 ret = da8xx_pinmux_setup(da850_nand_pins);
491 if (ret)
492 pr_warning("da850_evm_init: nand mux setup failed: "
493 "%d\n", ret);
494
495 ret = da8xx_pinmux_setup(da850_nor_pins);
496 if (ret)
497 pr_warning("da850_evm_init: nor mux setup failed: %d\n",
498 ret);
499
500 da850_evm_init_nor();
501
502 platform_add_devices(da850_evm_devices,
503 ARRAY_SIZE(da850_evm_devices));
504 }
505}
506
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -0400507static const short da850_evm_lcdc_pins[] = {
508 DA850_GPIO2_8, DA850_GPIO2_15,
509 -1
510};
511
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400512static __init void da850_evm_init(void)
513{
Sudhakar Rajashekhara5a4b1312009-07-17 04:47:10 -0400514 struct davinci_soc_info *soc_info = &davinci_soc_info;
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400515 int ret;
516
Sekhar Noria9eb1f62009-09-22 21:14:04 +0530517 ret = pmic_tps65070_init();
518 if (ret)
519 pr_warning("da850_evm_init: TPS65070 PMIC init failed: %d\n",
520 ret);
521
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400522 ret = da8xx_register_edma();
523 if (ret)
524 pr_warning("da850_evm_init: edma registration failed: %d\n",
525 ret);
526
527 ret = da8xx_pinmux_setup(da850_i2c0_pins);
528 if (ret)
529 pr_warning("da850_evm_init: i2c0 mux setup failed: %d\n",
530 ret);
531
532 ret = da8xx_register_i2c(0, &da850_evm_i2c_0_pdata);
533 if (ret)
534 pr_warning("da850_evm_init: i2c0 registration failed: %d\n",
535 ret);
536
Sudhakar Rajashekhara5a4b1312009-07-17 04:47:10 -0400537 soc_info->emac_pdata->phy_mask = DA850_EVM_PHY_MASK;
538 soc_info->emac_pdata->mdio_max_freq = DA850_EVM_MDIO_FREQUENCY;
539 soc_info->emac_pdata->rmii_en = 0;
540
541 ret = da8xx_pinmux_setup(da850_cpgmac_pins);
542 if (ret)
543 pr_warning("da850_evm_init: cpgmac mux setup failed: %d\n",
544 ret);
545
546 ret = da8xx_register_emac();
547 if (ret)
548 pr_warning("da850_evm_init: emac registration failed: %d\n",
549 ret);
550
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400551 ret = da8xx_register_watchdog();
552 if (ret)
553 pr_warning("da830_evm_init: watchdog registration failed: %d\n",
554 ret);
555
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400556 if (HAS_MMC) {
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400557 ret = da8xx_pinmux_setup(da850_mmcsd0_pins);
558 if (ret)
559 pr_warning("da850_evm_init: mmcsd0 mux setup failed:"
560 " %d\n", ret);
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400561
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400562 ret = gpio_request(DA850_MMCSD_CD_PIN, "MMC CD\n");
563 if (ret)
564 pr_warning("da850_evm_init: can not open GPIO %d\n",
565 DA850_MMCSD_CD_PIN);
566 gpio_direction_input(DA850_MMCSD_CD_PIN);
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400567
Sudhakar Rajashekhara820c4fe2009-08-13 18:16:28 -0400568 ret = gpio_request(DA850_MMCSD_WP_PIN, "MMC WP\n");
569 if (ret)
570 pr_warning("da850_evm_init: can not open GPIO %d\n",
571 DA850_MMCSD_WP_PIN);
572 gpio_direction_input(DA850_MMCSD_WP_PIN);
573
574 ret = da8xx_register_mmcsd0(&da850_mmc_config);
575 if (ret)
576 pr_warning("da850_evm_init: mmcsd0 registration failed:"
577 " %d\n", ret);
578 }
Sudhakar Rajashekhara700691f2009-08-13 15:16:23 -0400579
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400580 davinci_serial_init(&da850_evm_uart_config);
581
Chaithrika U S1a7ff8f2009-08-25 15:20:05 +0300582 i2c_register_board_info(1, da850_evm_i2c_devices,
583 ARRAY_SIZE(da850_evm_i2c_devices));
584
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400585 /*
586 * shut down uart 0 and 1; they are not used on the board and
587 * accessing them causes endless "too much work in irq53" messages
588 * with arago fs
589 */
590 __raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
591 __raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
Chaithrika U S491214e2009-08-11 17:03:25 -0400592
593 ret = da8xx_pinmux_setup(da850_mcasp_pins);
594 if (ret)
595 pr_warning("da850_evm_init: mcasp mux setup failed: %d\n",
596 ret);
597
Mark A. Greerb8864aa2009-08-28 15:05:02 -0700598 da8xx_register_mcasp(0, &da850_evm_snd_data);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400599
600 ret = da8xx_pinmux_setup(da850_lcdcntl_pins);
601 if (ret)
602 pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n",
603 ret);
604
Sudhakar Rajashekhara7761ef62009-09-15 17:46:14 -0400605 /* Handle board specific muxing for LCD here */
606 ret = da8xx_pinmux_setup(da850_evm_lcdc_pins);
607 if (ret)
608 pr_warning("da850_evm_init: evm specific lcd mux setup "
609 "failed: %d\n", ret);
610
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400611 ret = da850_lcd_hw_init();
612 if (ret)
613 pr_warning("da850_evm_init: lcd initialization failed: %d\n",
614 ret);
615
Mark A. Greerb9e63422009-09-15 18:14:19 -0700616 ret = da8xx_register_lcdc(&sharp_lk043t1dg01_pdata);
Sudhakar Rajashekhara5cbdf272009-08-13 14:33:14 -0400617 if (ret)
618 pr_warning("da850_evm_init: lcdc registration failed: %d\n",
619 ret);
Mark A. Greerc51df702009-09-15 18:15:54 -0700620
621 ret = da8xx_register_rtc();
622 if (ret)
623 pr_warning("da850_evm_init: rtc setup failed: %d\n", ret);
Sekhar Nori09dc2d42009-09-22 21:14:03 +0530624
625 ret = da850_register_cpufreq();
626 if (ret)
627 pr_warning("da850_evm_init: cpufreq registration failed: %d\n",
628 ret);
Sudhakar Rajashekhara0fbc5592009-07-16 06:42:18 -0400629}
630
631#ifdef CONFIG_SERIAL_8250_CONSOLE
632static int __init da850_evm_console_init(void)
633{
634 return add_preferred_console("ttyS", 2, "115200");
635}
636console_initcall(da850_evm_console_init);
637#endif
638
639static __init void da850_evm_irq_init(void)
640{
641 struct davinci_soc_info *soc_info = &davinci_soc_info;
642
643 cp_intc_init((void __iomem *)DA8XX_CP_INTC_VIRT, DA850_N_CP_INTC_IRQ,
644 soc_info->intc_irq_prios);
645}
646
647static void __init da850_evm_map_io(void)
648{
649 da850_init();
650}
651
652MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138 EVM")
653 .phys_io = IO_PHYS,
654 .io_pg_offst = (__IO_ADDRESS(IO_PHYS) >> 18) & 0xfffc,
655 .boot_params = (DA8XX_DDR_BASE + 0x100),
656 .map_io = da850_evm_map_io,
657 .init_irq = da850_evm_irq_init,
658 .timer = &davinci_timer,
659 .init_machine = da850_evm_init,
660MACHINE_END