On Tue, Sep 22, 2009 at 18:35:12, Sergei Shtylyov wrote:
> Hello.
>
> Chaithrika U S wrote:
>
> > DA850/OMAP-L138 EVM has a RMII Ethernet PHY on the UI daughter card. The PHY
> > is enabled by proper programming of the IO Expander (TCA6416) ports. Also
> > for
> > RMII PHY to work, the MDIO clock of MII PHY has to be disabled since both
> > the
> > PHYs have the same address. This is done via the GPIO2[6] pin. This patch
> > adds
> > support for RMII PHY.
> >
> > This patch also adds a menuconfig option to select UI card and peripherals
> > present on it. Currently, the only sub-option in this menu is RMII.
> > This menuconfig option is similar to the one present for UI card on
> > DA830/OMAP-L137 EVM.
> >
> > Signed-off-by: Chaithrika U S <[email protected]>
>
> [...]
>
> > diff --git a/arch/arm/mach-davinci/Kconfig b/arch/arm/mach-davinci/Kconfig
> > index 7b6dddf..4ee61cc 100644
> > --- a/arch/arm/mach-davinci/Kconfig
> > +++ b/arch/arm/mach-davinci/Kconfig
> > @@ -129,6 +129,32 @@ config MACH_DAVINCI_DA850_EVM
> > help
> > Say Y here to select the TI DA850/OMAP-L138 Evaluation Module.
> >
> > +config DA850_UI
> > + bool "DA850/OMAP-L138 UI (User Interface) board support"
> > + depends on MACH_DAVINCI_DA850_EVM
> > + help
> > + Say Y here if you have the DA850/OMAP-L138 UI
> > + (User Interface) board installed and you want to
> > + enable the peripherals located on User Interface
> > + board.
> > +
> > +choice
> > + prompt "Select DA850/OMAP-L138 UI board peripheral"
> > + depends on DA850_UI
>
> Are the devices on the UI board really mutually exclusive?
>
Yes, the devices are mutually exclusive.
> > +
> > +config DA850_UI_RMII
> > + bool "RMII Ethernet PHY"
> > + help
> > + Say Y if you want to use the RMII PHY on the DA850/OMAP-L138 EVM.
> > + This PHY is found on the UI daughter card that is supplied with
> > + the EVM.
> > + NOTE: Please take care while choosing this option, MII PHY will
> > + not be functional if RMII mode is selected. This also affects
> > + the operation of video devices as they are pin multiplexed with
> > + RMII pins.
>
> Perhaps it's worth printing out a message about this when DA850_UI_RMII
> is enabled?
>
OK.
> > diff --git a/arch/arm/mach-davinci/board-da850-evm.c
> > b/arch/arm/mach-davinci/board-da850-evm.c
> > index 25ae007..43cc629 100644
> > --- a/arch/arm/mach-davinci/board-da850-evm.c
> > +++ b/arch/arm/mach-davinci/board-da850-evm.c
> [...]
> > @@ -43,6 +44,8 @@
> > #define DA850_MMCSD_CD_PIN GPIO_TO_PIN(4, 0)
> > #define DA850_MMCSD_WP_PIN GPIO_TO_PIN(4, 1)
> >
> > +#define DA850_MII_MDIO_CLKEN_PIN GPIO_TO_PIN(2, 6)
> > +
> > static struct mtd_partition da850_evm_norflash_partition[] = {
> > {
> > .name = "NOR filesystem",
> > @@ -270,11 +273,141 @@ static const short da850_evm_lcdc_pins[] = {
> > -1
> > };
> >
> > +#ifdef CONFIG_DA850_UI
> > +static int da850_evm_ui_expander_setup(struct i2c_client *client, unsigned
> > gpio,
> > + unsigned ngpio, void *c)
> > +{
> > + struct davinci_soc_info *soc_info = &davinci_soc_info;
> > + int sel_a, sel_b, sel_c, ret;
> > +
> > + sel_a = gpio + 7;
> > + sel_b = gpio + 6;
> > + sel_c = gpio + 5;
> > +
> > + ret = gpio_request(sel_a, "sel_a");
> > + if (ret) {
> > + pr_warning("Cannot open UI expander pin %d\n", sel_a);
> > + goto exp_setup_sela_fail;
> > + }
> > +
> > + ret = gpio_request(sel_b, "sel_b");
> > + if (ret) {
> > + pr_warning("Cannot open UI expander pin %d\n", sel_b);
> > + goto exp_setup_selb_fail;
> > + }
> > +
> > + ret = gpio_request(sel_c, "sel_c");
> > + if (ret) {
> > + pr_warning("Cannot open UI expander pin %d\n", sel_c);
> > + goto exp_setup_selc_fail;
> > + }
> > +
> > + /* deselect all fucntionalities */
> > + gpio_direction_output(sel_a, 1);
> > + gpio_direction_output(sel_b, 1);
> > + gpio_direction_output(sel_c, 1);
> > +
> > + if (soc_info->emac_pdata->rmii_en)
> > + /* enable RMII */
> > + gpio_direction_output(sel_a, 0);
>
> gpio_set_value() is enough.
>
> > +static int da850_evm_ui_expander_teardown(struct i2c_client *client,
> > + unsigned gpio, unsigned ngpio, void *c)
> > +{
> > + /* deselect all fucntionalities */
>
> Functionalities. :-)
>
> > +static int __init da850_evm_config_emac(u8 rmii_en)
> > +{
> > + void __iomem *cfg_chip3_base;
> > + int ret;
> > + u32 val;
> > +
> > + cfg_chip3_base = DA8XX_SYSCFG_VIRT(DA8XX_CFGCHIP3_REG);
> > +
> > + /* configure the CFGCHIP3 register for RMII or MII */
> > + val = __raw_readl(cfg_chip3_base);
> > + if (rmii_en)
> > + val |= BIT(8);
> > + else
> > + val &= ~BIT(8);
> > +
> > + __raw_writel(val, cfg_chip3_base);
> > +
> > + if (!rmii_en)
> > + ret = da8xx_pinmux_setup(da850_cpgmac_pins);
> > + else
> > + ret = da8xx_pinmux_setup(da850_rmii_pins);
> > + if (ret)
> > + pr_warning("da850_evm_init: cpgmac/rmii mux setup failed: %d\n",
> > + ret);
> > +
> > + if (rmii_en) {
> > + /* Disable MII MDIO clock */
> > + ret = davinci_cfg_reg(DA850_GPIO2_6);
> > + if (ret)
> > + pr_warning("da850_evm_init:GPIO(2,6) mux setup "
> > + "failed\n");
> > +
> > + ret = gpio_request(DA850_MII_MDIO_CLKEN_PIN, "mdio_clk_en");
> > + if (ret) {
> > + pr_warning("Cannot open GPIO %d\n",
> > + DA850_MII_MDIO_CLKEN_PIN);
> > + return ret;
> > + }
> > +
> > + gpio_direction_output(DA850_MII_MDIO_CLKEN_PIN, 1);
> > + }
>
> I guess you need to request GPIO2[6] anyway (and then set it to 0) also
> in case when rmii_en is 0...
>
> WBR, Sergei
>
Will post an updated patch soon.
Regards,
Chaithrika
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source