diff options
Diffstat (limited to 'arch/arm/mach-davinci/board-da850-evm.c')
-rw-r--r-- | arch/arm/mach-davinci/board-da850-evm.c | 68 |
1 files changed, 65 insertions, 3 deletions
diff --git a/arch/arm/mach-davinci/board-da850-evm.c b/arch/arm/mach-davinci/board-da850-evm.c index 05b2d87d96bd..53e434ba626d 100644 --- a/arch/arm/mach-davinci/board-da850-evm.c +++ b/arch/arm/mach-davinci/board-da850-evm.c | |||
@@ -45,6 +45,8 @@ | |||
45 | #define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0) | 45 | #define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0) |
46 | #define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1) | 46 | #define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1) |
47 | 47 | ||
48 | #define DA850_MII_MDIO_CLKEN_PIN GPIO_TO_PIN(2, 6) | ||
49 | |||
48 | static struct mtd_partition da850_evm_norflash_partition[] = { | 50 | static struct mtd_partition da850_evm_norflash_partition[] = { |
49 | { | 51 | { |
50 | .name = "NOR filesystem", | 52 | .name = "NOR filesystem", |
@@ -152,6 +154,7 @@ static void da850_evm_setup_nor_nand(void); | |||
152 | static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio, | 154 | static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio, |
153 | unsigned ngpio, void *c) | 155 | unsigned ngpio, void *c) |
154 | { | 156 | { |
157 | struct davinci_soc_info *soc_info = &davinci_soc_info; | ||
155 | int sel_a, sel_b, sel_c, ret; | 158 | int sel_a, sel_b, sel_c, ret; |
156 | 159 | ||
157 | sel_a = gpio + 7; | 160 | sel_a = gpio + 7; |
@@ -186,6 +189,10 @@ static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned gpio, | |||
186 | 189 | ||
187 | da850_evm_setup_nor_nand(); | 190 | da850_evm_setup_nor_nand(); |
188 | 191 | ||
192 | if (soc_info->emac_pdata->rmii_en) | ||
193 | /* enable RMII */ | ||
194 | gpio_set_value(sel_a, 0); | ||
195 | |||
189 | return 0; | 196 | return 0; |
190 | 197 | ||
191 | exp_setup_selc_fail: | 198 | exp_setup_selc_fail: |
@@ -509,6 +516,58 @@ static const short da850_evm_lcdc_pins[] = { | |||
509 | -1 | 516 | -1 |
510 | }; | 517 | }; |
511 | 518 | ||
519 | static int __init da850_evm_config_emac(u8 rmii_en) | ||
520 | { | ||
521 | void __iomem *cfg_chip3_base; | ||
522 | int ret; | ||
523 | u32 val; | ||
524 | |||
525 | cfg_chip3_base = DA8XX_SYSCFG_VIRT(DA8XX_CFGCHIP3_REG); | ||
526 | |||
527 | /* configure the CFGCHIP3 register for RMII or MII */ | ||
528 | val = __raw_readl(cfg_chip3_base); | ||
529 | if (rmii_en) | ||
530 | val |= BIT(8); | ||
531 | else | ||
532 | val &= ~BIT(8); | ||
533 | |||
534 | __raw_writel(val, cfg_chip3_base); | ||
535 | |||
536 | if (!rmii_en) | ||
537 | ret = da8xx_pinmux_setup(da850_cpgmac_pins); | ||
538 | else | ||
539 | ret = da8xx_pinmux_setup(da850_rmii_pins); | ||
540 | if (ret) | ||
541 | pr_warning("da850_evm_init: cpgmac/rmii mux setup failed: %d\n", | ||
542 | ret); | ||
543 | |||
544 | ret = davinci_cfg_reg(DA850_GPIO2_6); | ||
545 | if (ret) | ||
546 | pr_warning("da850_evm_init:GPIO(2,6) mux setup " | ||
547 | "failed\n"); | ||
548 | |||
549 | ret = gpio_request(DA850_MII_MDIO_CLKEN_PIN, "mdio_clk_en"); | ||
550 | if (ret) { | ||
551 | pr_warning("Cannot open GPIO %d\n", | ||
552 | DA850_MII_MDIO_CLKEN_PIN); | ||
553 | return ret; | ||
554 | } | ||
555 | |||
556 | if (rmii_en) { | ||
557 | /* Disable MII MDIO clock */ | ||
558 | gpio_direction_output(DA850_MII_MDIO_CLKEN_PIN, 1); | ||
559 | pr_info("EMAC: RMII PHY configured, MII PHY will not be" | ||
560 | " functional\n"); | ||
561 | } else { | ||
562 | /* Enable MII MDIO clock */ | ||
563 | gpio_direction_output(DA850_MII_MDIO_CLKEN_PIN, 0); | ||
564 | pr_info("EMAC: MII PHY configured, RMII PHY will not be" | ||
565 | " functional\n"); | ||
566 | } | ||
567 | |||
568 | return 0; | ||
569 | } | ||
570 | |||
512 | static __init void da850_evm_init(void) | 571 | static __init void da850_evm_init(void) |
513 | { | 572 | { |
514 | struct davinci_soc_info *soc_info = &davinci_soc_info; | 573 | struct davinci_soc_info *soc_info = &davinci_soc_info; |
@@ -536,12 +595,15 @@ static __init void da850_evm_init(void) | |||
536 | 595 | ||
537 | soc_info->emac_pdata->phy_mask = DA850_EVM_PHY_MASK; | 596 | soc_info->emac_pdata->phy_mask = DA850_EVM_PHY_MASK; |
538 | soc_info->emac_pdata->mdio_max_freq = DA850_EVM_MDIO_FREQUENCY; | 597 | soc_info->emac_pdata->mdio_max_freq = DA850_EVM_MDIO_FREQUENCY; |
598 | #ifdef CONFIG_DA850_UI_RMII | ||
599 | soc_info->emac_pdata->rmii_en = 1; | ||
600 | #else | ||
539 | soc_info->emac_pdata->rmii_en = 0; | 601 | soc_info->emac_pdata->rmii_en = 0; |
602 | #endif | ||
540 | 603 | ||
541 | ret = da8xx_pinmux_setup(da850_cpgmac_pins); | 604 | ret = da850_evm_config_emac(soc_info->emac_pdata->rmii_en); |
542 | if (ret) | 605 | if (ret) |
543 | pr_warning("da850_evm_init: cpgmac mux setup failed: %d\n", | 606 | pr_warning("da850_evm_init: emac setup failed: %d\n", ret); |
544 | ret); | ||
545 | 607 | ||
546 | ret = da8xx_register_emac(); | 608 | ret = da8xx_register_emac(); |
547 | if (ret) | 609 | if (ret) |