diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-09 22:02:46 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-09 22:02:46 -0500 |
commit | aed886ce777590eac87f7ce2897d9f8357754331 (patch) | |
tree | 9a86f2c0a68f8aa43192e51a3155286a5a95e0c8 /arch/arm/mach-davinci/board-da850-evm.c | |
parent | 67dd2f5a669f48e48ea1013fb80522adca8287f4 (diff) | |
parent | c16fe26701013b9f55aa554fc0a13a7320b164ee (diff) |
Merge branch 'davinci-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci
* 'davinci-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci: (69 commits)
davinci: Initial support for Neuros OSD2 platform.
davinci: remove unused variable in arch/arm/mach-davinci/board-sffsdr.c
davinci: fix section mismatch warning in arch/arm/mach-davinci/board-dm646x-evm.c
DaVinci: DM365: Enable DaVinci RTC support for DM365 EVM
DA8xx/OMAP-L1xx: Add high speed SD/MMC capabilities
davinci: DA8XX/OMAP-L1XX: enable cpuidle and regulator in defconfig
davinci: DA850/OMAP-L138: avoid using separate initcall for initializing regulator
davinci: DA850/OMAP-L138 EVM: register for cpuidle support
davinci: DA8XX/OMAP-L1XX: add support for cpuidle driver register
davinci: add CPU idle driver
davinci: DA8XX/OMAP-L1XX: fix compiler warning
davinci: DA850/OMAP-L138: eliminate static function declaration
davinci: DA850/OMAP-L138 EVM: simplify configuration of emac in MII/RMII mode
davinci: DA850/OMAP-L138 EVM: get rid of DA850_UI_EXP config option
davinci: DA850/OMAP-L138 EVM: implement autodetect of RMII PHY
davinci: DA830/OMAP-L137 EVM: do not configure NAND on UI card when MMC/SD is selected
davinci: DA830/OMAP-L137 EVM: use runtime detection for UI card
davinci: DA830/OMAP-L137 EVM: remove ifdefs inside da830_evm_init()
davinci: DA830/OMAP-L137 EVM: fix warning with default config
davinci: Add NAND support for DA830/OMAP-L137 EVM platform
...
Diffstat (limited to 'arch/arm/mach-davinci/board-da850-evm.c')
-rw-r--r-- | arch/arm/mach-davinci/board-da850-evm.c | 437 |
1 files changed, 374 insertions, 63 deletions
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index c759d72494e..62b98bffc15 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c | |||
@@ -12,36 +12,38 @@ | |||
12 | * or implied. | 12 | * or implied. |
13 | */ | 13 | */ |
14 | #include <linux/kernel.h> | 14 | #include <linux/kernel.h> |
15 | #include <linux/module.h> | ||
16 | #include <linux/init.h> | 15 | #include <linux/init.h> |
17 | #include <linux/console.h> | 16 | #include <linux/console.h> |
18 | #include <linux/i2c.h> | 17 | #include <linux/i2c.h> |
19 | #include <linux/i2c/at24.h> | 18 | #include <linux/i2c/at24.h> |
19 | #include <linux/i2c/pca953x.h> | ||
20 | #include <linux/gpio.h> | 20 | #include <linux/gpio.h> |
21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
22 | #include <linux/mtd/mtd.h> | 22 | #include <linux/mtd/mtd.h> |
23 | #include <linux/mtd/nand.h> | 23 | #include <linux/mtd/nand.h> |
24 | #include <linux/mtd/partitions.h> | 24 | #include <linux/mtd/partitions.h> |
25 | #include <linux/mtd/physmap.h> | 25 | #include <linux/mtd/physmap.h> |
26 | #include <linux/regulator/machine.h> | ||
26 | 27 | ||
27 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
28 | #include <asm/mach/arch.h> | 29 | #include <asm/mach/arch.h> |
29 | 30 | ||
30 | #include <mach/common.h> | ||
31 | #include <mach/irqs.h> | ||
32 | #include <mach/cp_intc.h> | 31 | #include <mach/cp_intc.h> |
33 | #include <mach/da8xx.h> | 32 | #include <mach/da8xx.h> |
34 | #include <mach/nand.h> | 33 | #include <mach/nand.h> |
34 | #include <mach/mux.h> | ||
35 | 35 | ||
36 | #define DA850_EVM_PHY_MASK 0x1 | 36 | #define DA850_EVM_PHY_MASK 0x1 |
37 | #define DA850_EVM_MDIO_FREQUENCY 2200000 /* PHY bus frequency */ | 37 | #define DA850_EVM_MDIO_FREQUENCY 2200000 /* PHY bus frequency */ |
38 | 38 | ||
39 | #define DA850_LCD_PWR_PIN GPIO_TO_PIN(2, 8) | ||
39 | #define DA850_LCD_BL_PIN GPIO_TO_PIN(2, 15) | 40 | #define DA850_LCD_BL_PIN GPIO_TO_PIN(2, 15) |
40 | #define DA850_LCD_PWR_PIN GPIO_TO_PIN(8, 10) | ||
41 | 41 | ||
42 | #define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0) | 42 | #define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0) |
43 | #define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1) | 43 | #define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1) |
44 | 44 | ||
45 | #define DA850_MII_MDIO_CLKEN_PIN GPIO_TO_PIN(2, 6) | ||
46 | |||
45 | static struct mtd_partition da850_evm_norflash_partition[] = { | 47 | static struct mtd_partition da850_evm_norflash_partition[] = { |
46 | { | 48 | { |
47 | .name = "NOR filesystem", | 49 | .name = "NOR filesystem", |
@@ -143,10 +145,149 @@ static struct platform_device da850_evm_nandflash_device = { | |||
143 | .resource = da850_evm_nandflash_resource, | 145 | .resource = da850_evm_nandflash_resource, |
144 | }; | 146 | }; |
145 | 147 | ||
148 | static struct platform_device *da850_evm_devices[] __initdata = { | ||
149 | &da850_evm_nandflash_device, | ||
150 | &da850_evm_norflash_device, | ||
151 | }; | ||
152 | |||
153 | #define DA8XX_AEMIF_CE2CFG_OFFSET 0x10 | ||
154 | #define DA8XX_AEMIF_ASIZE_16BIT 0x1 | ||
155 | |||
156 | static void __init da850_evm_init_nor(void) | ||
157 | { | ||
158 | void __iomem *aemif_addr; | ||
159 | |||
160 | aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K); | ||
161 | |||
162 | /* Configure data bus width of CS2 to 16 bit */ | ||
163 | writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) | | ||
164 | DA8XX_AEMIF_ASIZE_16BIT, | ||
165 | aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET); | ||
166 | |||
167 | iounmap(aemif_addr); | ||
168 | } | ||
169 | |||
170 | static u32 ui_card_detected; | ||
171 | |||
172 | #if defined(CONFIG_MMC_DAVINCI) || \ | ||
173 | defined(CONFIG_MMC_DAVINCI_MODULE) | ||
174 | #define HAS_MMC 1 | ||
175 | #else | ||
176 | #define HAS_MMC 0 | ||
177 | #endif | ||
178 | |||
179 | static __init void da850_evm_setup_nor_nand(void) | ||
180 | { | ||
181 | int ret = 0; | ||
182 | |||
183 | if (ui_card_detected & !HAS_MMC) { | ||
184 | ret = da8xx_pinmux_setup(da850_nand_pins); | ||
185 | if (ret) | ||
186 | pr_warning("da850_evm_init: nand mux setup failed: " | ||
187 | "%d\n", ret); | ||
188 | |||
189 | ret = da8xx_pinmux_setup(da850_nor_pins); | ||
190 | if (ret) | ||
191 | pr_warning("da850_evm_init: nor mux setup failed: %d\n", | ||
192 | ret); | ||
193 | |||
194 | da850_evm_init_nor(); | ||
195 | |||
196 | platform_add_devices(da850_evm_devices, | ||
197 | ARRAY_SIZE(da850_evm_devices)); | ||
198 | } | ||
199 | } | ||
200 | |||
201 | #ifdef CONFIG_DA850_UI_RMII | ||
202 | static inline void da850_evm_setup_emac_rmii(int rmii_sel) | ||
203 | { | ||
204 | struct davinci_soc_info *soc_info = &davinci_soc_info; | ||
205 | |||
206 | soc_info->emac_pdata->rmii_en = 1; | ||
207 | gpio_set_value(rmii_sel, 0); | ||
208 | } | ||
209 | #else | ||
210 | static inline void da850_evm_setup_emac_rmii(int rmii_sel) { } | ||
211 | #endif | ||
212 | |||
213 | static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio, | ||
214 | unsigned ngpio, void *c) | ||
215 | { | ||
216 | int sel_a, sel_b, sel_c, ret; | ||
217 | |||
218 | sel_a = gpio + 7; | ||
219 | sel_b = gpio + 6; | ||
220 | sel_c = gpio + 5; | ||
221 | |||
222 | ret = gpio_request(sel_a, "sel_a"); | ||
223 | if (ret) { | ||
224 | pr_warning("Cannot open UI expander pin %d\n", sel_a); | ||
225 | goto exp_setup_sela_fail; | ||
226 | } | ||
227 | |||
228 | ret = gpio_request(sel_b, "sel_b"); | ||
229 | if (ret) { | ||
230 | pr_warning("Cannot open UI expander pin %d\n", sel_b); | ||
231 | goto exp_setup_selb_fail; | ||
232 | } | ||
233 | |||
234 | ret = gpio_request(sel_c, "sel_c"); | ||
235 | if (ret) { | ||
236 | pr_warning("Cannot open UI expander pin %d\n", sel_c); | ||
237 | goto exp_setup_selc_fail; | ||
238 | } | ||
239 | |||
240 | /* deselect all functionalities */ | ||
241 | gpio_direction_output(sel_a, 1); | ||
242 | gpio_direction_output(sel_b, 1); | ||
243 | gpio_direction_output(sel_c, 1); | ||
244 | |||
245 | ui_card_detected = 1; | ||
246 | pr_info("DA850/OMAP-L138 EVM UI card detected\n"); | ||
247 | |||
248 | da850_evm_setup_nor_nand(); | ||
249 | |||
250 | da850_evm_setup_emac_rmii(sel_a); | ||
251 | |||
252 | return 0; | ||
253 | |||
254 | exp_setup_selc_fail: | ||
255 | gpio_free(sel_b); | ||
256 | exp_setup_selb_fail: | ||
257 | gpio_free(sel_a); | ||
258 | exp_setup_sela_fail: | ||
259 | return ret; | ||
260 | } | ||
261 | |||
262 | static int da850_evm_ui_expander_teardown(struct i2c_client *client, | ||
263 | unsigned gpio, unsigned ngpio, void *c) | ||
264 | { | ||
265 | /* deselect all functionalities */ | ||
266 | gpio_set_value(gpio + 5, 1); | ||
267 | gpio_set_value(gpio + 6, 1); | ||
268 | gpio_set_value(gpio + 7, 1); | ||
269 | |||
270 | gpio_free(gpio + 5); | ||
271 | gpio_free(gpio + 6); | ||
272 | gpio_free(gpio + 7); | ||
273 | |||
274 | return 0; | ||
275 | } | ||
276 | |||
277 | static struct pca953x_platform_data da850_evm_ui_expander_info = { | ||
278 | .gpio_base = DAVINCI_N_GPIO, | ||
279 | .setup = da850_evm_ui_expander_setup, | ||
280 | .teardown = da850_evm_ui_expander_teardown, | ||
281 | }; | ||
282 | |||
146 | static struct i2c_board_info __initdata da850_evm_i2c_devices[] = { | 283 | static struct i2c_board_info __initdata da850_evm_i2c_devices[] = { |
147 | { | 284 | { |
148 | I2C_BOARD_INFO("tlv320aic3x", 0x18), | 285 | I2C_BOARD_INFO("tlv320aic3x", 0x18), |
149 | } | 286 | }, |
287 | { | ||
288 | I2C_BOARD_INFO("tca6416", 0x20), | ||
289 | .platform_data = &da850_evm_ui_expander_info, | ||
290 | }, | ||
150 | }; | 291 | }; |
151 | 292 | ||
152 | static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = { | 293 | static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = { |
@@ -158,11 +299,6 @@ static struct davinci_uart_config da850_evm_uart_config __initdata = { | |||
158 | .enabled_uarts = 0x7, | 299 | .enabled_uarts = 0x7, |
159 | }; | 300 | }; |
160 | 301 | ||
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 */ | 302 | /* davinci da850 evm audio machine driver */ |
167 | static u8 da850_iis_serializer_direction[] = { | 303 | static u8 da850_iis_serializer_direction[] = { |
168 | INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, | 304 | INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, INACTIVE_MODE, |
@@ -198,6 +334,8 @@ static struct davinci_mmc_config da850_mmc_config = { | |||
198 | .get_ro = da850_evm_mmc_get_ro, | 334 | .get_ro = da850_evm_mmc_get_ro, |
199 | .get_cd = da850_evm_mmc_get_cd, | 335 | .get_cd = da850_evm_mmc_get_cd, |
200 | .wires = 4, | 336 | .wires = 4, |
337 | .max_freq = 50000000, | ||
338 | .caps = MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED, | ||
201 | .version = MMC_CTLR_VERSION_2, | 339 | .version = MMC_CTLR_VERSION_2, |
202 | }; | 340 | }; |
203 | 341 | ||
@@ -233,56 +371,227 @@ static int da850_lcd_hw_init(void) | |||
233 | return 0; | 371 | return 0; |
234 | } | 372 | } |
235 | 373 | ||
236 | #define DA8XX_AEMIF_CE2CFG_OFFSET 0x10 | 374 | /* TPS65070 voltage regulator support */ |
237 | #define DA8XX_AEMIF_ASIZE_16BIT 0x1 | ||
238 | 375 | ||
239 | static void __init da850_evm_init_nor(void) | 376 | /* 3.3V */ |
240 | { | 377 | struct regulator_consumer_supply tps65070_dcdc1_consumers[] = { |
241 | void __iomem *aemif_addr; | 378 | { |
379 | .supply = "usb0_vdda33", | ||
380 | }, | ||
381 | { | ||
382 | .supply = "usb1_vdda33", | ||
383 | }, | ||
384 | }; | ||
242 | 385 | ||
243 | aemif_addr = ioremap(DA8XX_AEMIF_CTL_BASE, SZ_32K); | 386 | /* 3.3V or 1.8V */ |
387 | struct regulator_consumer_supply tps65070_dcdc2_consumers[] = { | ||
388 | { | ||
389 | .supply = "dvdd3318_a", | ||
390 | }, | ||
391 | { | ||
392 | .supply = "dvdd3318_b", | ||
393 | }, | ||
394 | { | ||
395 | .supply = "dvdd3318_c", | ||
396 | }, | ||
397 | }; | ||
244 | 398 | ||
245 | /* Configure data bus width of CS2 to 16 bit */ | 399 | /* 1.2V */ |
246 | writel(readl(aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET) | | 400 | struct regulator_consumer_supply tps65070_dcdc3_consumers[] = { |
247 | DA8XX_AEMIF_ASIZE_16BIT, | 401 | { |
248 | aemif_addr + DA8XX_AEMIF_CE2CFG_OFFSET); | 402 | .supply = "cvdd", |
403 | }, | ||
404 | }; | ||
249 | 405 | ||
250 | iounmap(aemif_addr); | 406 | /* 1.8V LDO */ |
251 | } | 407 | struct regulator_consumer_supply tps65070_ldo1_consumers[] = { |
408 | { | ||
409 | .supply = "sata_vddr", | ||
410 | }, | ||
411 | { | ||
412 | .supply = "usb0_vdda18", | ||
413 | }, | ||
414 | { | ||
415 | .supply = "usb1_vdda18", | ||
416 | }, | ||
417 | { | ||
418 | .supply = "ddr_dvdd18", | ||
419 | }, | ||
420 | }; | ||
252 | 421 | ||
253 | #if defined(CONFIG_MTD_PHYSMAP) || \ | 422 | /* 1.2V LDO */ |
254 | defined(CONFIG_MTD_PHYSMAP_MODULE) | 423 | struct regulator_consumer_supply tps65070_ldo2_consumers[] = { |
255 | #define HAS_NOR 1 | 424 | { |
256 | #else | 425 | .supply = "sata_vdd", |
257 | #define HAS_NOR 0 | 426 | }, |
258 | #endif | 427 | { |
428 | .supply = "pll0_vdda", | ||
429 | }, | ||
430 | { | ||
431 | .supply = "pll1_vdda", | ||
432 | }, | ||
433 | { | ||
434 | .supply = "usbs_cvdd", | ||
435 | }, | ||
436 | { | ||
437 | .supply = "vddarnwa1", | ||
438 | }, | ||
439 | }; | ||
259 | 440 | ||
260 | #if defined(CONFIG_MMC_DAVINCI) || \ | 441 | struct regulator_init_data tps65070_regulator_data[] = { |
261 | defined(CONFIG_MMC_DAVINCI_MODULE) | 442 | /* dcdc1 */ |
262 | #define HAS_MMC 1 | 443 | { |
263 | #else | 444 | .constraints = { |
264 | #define HAS_MMC 0 | 445 | .min_uV = 3150000, |
265 | #endif | 446 | .max_uV = 3450000, |
447 | .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE | | ||
448 | REGULATOR_CHANGE_STATUS), | ||
449 | .boot_on = 1, | ||
450 | }, | ||
451 | .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc1_consumers), | ||
452 | .consumer_supplies = tps65070_dcdc1_consumers, | ||
453 | }, | ||
266 | 454 | ||
267 | static __init void da850_evm_init(void) | 455 | /* dcdc2 */ |
456 | { | ||
457 | .constraints = { | ||
458 | .min_uV = 1710000, | ||
459 | .max_uV = 3450000, | ||
460 | .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE | | ||
461 | REGULATOR_CHANGE_STATUS), | ||
462 | .boot_on = 1, | ||
463 | }, | ||
464 | .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc2_consumers), | ||
465 | .consumer_supplies = tps65070_dcdc2_consumers, | ||
466 | }, | ||
467 | |||
468 | /* dcdc3 */ | ||
469 | { | ||
470 | .constraints = { | ||
471 | .min_uV = 950000, | ||
472 | .max_uV = 1320000, | ||
473 | .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE | | ||
474 | REGULATOR_CHANGE_STATUS), | ||
475 | .boot_on = 1, | ||
476 | }, | ||
477 | .num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc3_consumers), | ||
478 | .consumer_supplies = tps65070_dcdc3_consumers, | ||
479 | }, | ||
480 | |||
481 | /* ldo1 */ | ||
482 | { | ||
483 | .constraints = { | ||
484 | .min_uV = 1710000, | ||
485 | .max_uV = 1890000, | ||
486 | .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE | | ||
487 | REGULATOR_CHANGE_STATUS), | ||
488 | .boot_on = 1, | ||
489 | }, | ||
490 | .num_consumer_supplies = ARRAY_SIZE(tps65070_ldo1_consumers), | ||
491 | .consumer_supplies = tps65070_ldo1_consumers, | ||
492 | }, | ||
493 | |||
494 | /* ldo2 */ | ||
495 | { | ||
496 | .constraints = { | ||
497 | .min_uV = 1140000, | ||
498 | .max_uV = 1320000, | ||
499 | .valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE | | ||
500 | REGULATOR_CHANGE_STATUS), | ||
501 | .boot_on = 1, | ||
502 | }, | ||
503 | .num_consumer_supplies = ARRAY_SIZE(tps65070_ldo2_consumers), | ||
504 | .consumer_supplies = tps65070_ldo2_consumers, | ||
505 | }, | ||
506 | }; | ||
507 | |||
508 | static struct i2c_board_info __initdata da850evm_tps65070_info[] = { | ||
509 | { | ||
510 | I2C_BOARD_INFO("tps6507x", 0x48), | ||
511 | .platform_data = &tps65070_regulator_data[0], | ||
512 | }, | ||
513 | }; | ||
514 | |||
515 | static int __init pmic_tps65070_init(void) | ||
268 | { | 516 | { |
269 | struct davinci_soc_info *soc_info = &davinci_soc_info; | 517 | return i2c_register_board_info(1, da850evm_tps65070_info, |
518 | ARRAY_SIZE(da850evm_tps65070_info)); | ||
519 | } | ||
520 | |||
521 | static const short da850_evm_lcdc_pins[] = { | ||
522 | DA850_GPIO2_8, DA850_GPIO2_15, | ||
523 | -1 | ||
524 | }; | ||
525 | |||
526 | static int __init da850_evm_config_emac(void) | ||
527 | { | ||
528 | void __iomem *cfg_chip3_base; | ||
270 | int ret; | 529 | int ret; |
530 | u32 val; | ||
531 | struct davinci_soc_info *soc_info = &davinci_soc_info; | ||
532 | u8 rmii_en = soc_info->emac_pdata->rmii_en; | ||
533 | |||
534 | if (!machine_is_davinci_da850_evm()) | ||
535 | return 0; | ||
536 | |||
537 | cfg_chip3_base = DA8XX_SYSCFG_VIRT(DA8XX_CFGCHIP3_REG); | ||
538 | |||
539 | val = __raw_readl(cfg_chip3_base); | ||
540 | |||
541 | if (rmii_en) { | ||
542 | val |= BIT(8); | ||
543 | ret = da8xx_pinmux_setup(da850_rmii_pins); | ||
544 | pr_info("EMAC: RMII PHY configured, MII PHY will not be" | ||
545 | " functional\n"); | ||
546 | } else { | ||
547 | val &= ~BIT(8); | ||
548 | ret = da8xx_pinmux_setup(da850_cpgmac_pins); | ||
549 | pr_info("EMAC: MII PHY configured, RMII PHY will not be" | ||
550 | " functional\n"); | ||
551 | } | ||
271 | 552 | ||
272 | ret = da8xx_pinmux_setup(da850_nand_pins); | ||
273 | if (ret) | 553 | if (ret) |
274 | pr_warning("da850_evm_init: nand mux setup failed: %d\n", | 554 | pr_warning("da850_evm_init: cpgmac/rmii mux setup failed: %d\n", |
275 | ret); | 555 | ret); |
276 | 556 | ||
277 | ret = da8xx_pinmux_setup(da850_nor_pins); | 557 | /* configure the CFGCHIP3 register for RMII or MII */ |
558 | __raw_writel(val, cfg_chip3_base); | ||
559 | |||
560 | ret = davinci_cfg_reg(DA850_GPIO2_6); | ||
278 | if (ret) | 561 | if (ret) |
279 | pr_warning("da850_evm_init: nor mux setup failed: %d\n", | 562 | pr_warning("da850_evm_init:GPIO(2,6) mux setup " |
563 | "failed\n"); | ||
564 | |||
565 | ret = gpio_request(DA850_MII_MDIO_CLKEN_PIN, "mdio_clk_en"); | ||
566 | if (ret) { | ||
567 | pr_warning("Cannot open GPIO %d\n", | ||
568 | DA850_MII_MDIO_CLKEN_PIN); | ||
569 | return ret; | ||
570 | } | ||
571 | |||
572 | /* Enable/Disable MII MDIO clock */ | ||
573 | gpio_direction_output(DA850_MII_MDIO_CLKEN_PIN, rmii_en); | ||
574 | |||
575 | soc_info->emac_pdata->phy_mask = DA850_EVM_PHY_MASK; | ||
576 | soc_info->emac_pdata->mdio_max_freq = DA850_EVM_MDIO_FREQUENCY; | ||
577 | |||
578 | ret = da8xx_register_emac(); | ||
579 | if (ret) | ||
580 | pr_warning("da850_evm_init: emac registration failed: %d\n", | ||
280 | ret); | 581 | ret); |
281 | 582 | ||
282 | da850_evm_init_nor(); | 583 | return 0; |
584 | } | ||
585 | device_initcall(da850_evm_config_emac); | ||
586 | |||
587 | static __init void da850_evm_init(void) | ||
588 | { | ||
589 | int ret; | ||
283 | 590 | ||
284 | platform_add_devices(da850_evm_devices, | 591 | ret = pmic_tps65070_init(); |
285 | ARRAY_SIZE(da850_evm_devices)); | 592 | if (ret) |
593 | pr_warning("da850_evm_init: TPS65070 PMIC init failed: %d\n", | ||
594 | ret); | ||
286 | 595 | ||
287 | ret = da8xx_register_edma(); | 596 | ret = da8xx_register_edma(); |
288 | if (ret) | 597 | if (ret) |
@@ -299,19 +608,6 @@ static __init void da850_evm_init(void) | |||
299 | pr_warning("da850_evm_init: i2c0 registration failed: %d\n", | 608 | pr_warning("da850_evm_init: i2c0 registration failed: %d\n", |
300 | ret); | 609 | ret); |
301 | 610 | ||
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 | 611 | ||
316 | ret = da8xx_register_watchdog(); | 612 | ret = da8xx_register_watchdog(); |
317 | if (ret) | 613 | if (ret) |
@@ -319,11 +615,6 @@ static __init void da850_evm_init(void) | |||
319 | ret); | 615 | ret); |
320 | 616 | ||
321 | if (HAS_MMC) { | 617 | 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); | 618 | ret = da8xx_pinmux_setup(da850_mmcsd0_pins); |
328 | if (ret) | 619 | if (ret) |
329 | pr_warning("da850_evm_init: mmcsd0 mux setup failed:" | 620 | pr_warning("da850_evm_init: mmcsd0 mux setup failed:" |
@@ -365,22 +656,42 @@ static __init void da850_evm_init(void) | |||
365 | pr_warning("da850_evm_init: mcasp mux setup failed: %d\n", | 656 | pr_warning("da850_evm_init: mcasp mux setup failed: %d\n", |
366 | ret); | 657 | ret); |
367 | 658 | ||
368 | da8xx_init_mcasp(0, &da850_evm_snd_data); | 659 | da8xx_register_mcasp(0, &da850_evm_snd_data); |
369 | 660 | ||
370 | ret = da8xx_pinmux_setup(da850_lcdcntl_pins); | 661 | ret = da8xx_pinmux_setup(da850_lcdcntl_pins); |
371 | if (ret) | 662 | if (ret) |
372 | pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n", | 663 | pr_warning("da850_evm_init: lcdcntl mux setup failed: %d\n", |
373 | ret); | 664 | ret); |
374 | 665 | ||
666 | /* Handle board specific muxing for LCD here */ | ||
667 | ret = da8xx_pinmux_setup(da850_evm_lcdc_pins); | ||
668 | if (ret) | ||
669 | pr_warning("da850_evm_init: evm specific lcd mux setup " | ||
670 | "failed: %d\n", ret); | ||
671 | |||
375 | ret = da850_lcd_hw_init(); | 672 | ret = da850_lcd_hw_init(); |
376 | if (ret) | 673 | if (ret) |
377 | pr_warning("da850_evm_init: lcd initialization failed: %d\n", | 674 | pr_warning("da850_evm_init: lcd initialization failed: %d\n", |
378 | ret); | 675 | ret); |
379 | 676 | ||
380 | ret = da8xx_register_lcdc(); | 677 | ret = da8xx_register_lcdc(&sharp_lk043t1dg01_pdata); |
381 | if (ret) | 678 | if (ret) |
382 | pr_warning("da850_evm_init: lcdc registration failed: %d\n", | 679 | pr_warning("da850_evm_init: lcdc registration failed: %d\n", |
383 | ret); | 680 | ret); |
681 | |||
682 | ret = da8xx_register_rtc(); | ||
683 | if (ret) | ||
684 | pr_warning("da850_evm_init: rtc setup failed: %d\n", ret); | ||
685 | |||
686 | ret = da850_register_cpufreq(); | ||
687 | if (ret) | ||
688 | pr_warning("da850_evm_init: cpufreq registration failed: %d\n", | ||
689 | ret); | ||
690 | |||
691 | ret = da8xx_register_cpuidle(); | ||
692 | if (ret) | ||
693 | pr_warning("da850_evm_init: cpuidle registration failed: %d\n", | ||
694 | ret); | ||
384 | } | 695 | } |
385 | 696 | ||
386 | #ifdef CONFIG_SERIAL_8250_CONSOLE | 697 | #ifdef CONFIG_SERIAL_8250_CONSOLE |