From: Chaithrika U S <[email protected]>

Remove the harcoded PHY mask value, instead obtain PHY address from
platform data

Signed-off-by: Chaithrika U S <[email protected]>
---
 arch/arm/mach-davinci/devices.c           |    2 +
 arch/arm/mach-davinci/include/mach/emac.h |    1 +
 drivers/net/davinci_emac.c                |   78 ++++++++++++++++++----------
 3 files changed, 53 insertions(+), 28 deletions(-)

diff --git a/arch/arm/mach-davinci/devices.c b/arch/arm/mach-davinci/devices.c
index 29863d0..380337a 100644
--- a/arch/arm/mach-davinci/devices.c
+++ b/arch/arm/mach-davinci/devices.c
@@ -34,6 +34,7 @@
 
 
 #define DAVINCI_I2C_BASE            0x01C21000
+#define DAVINCI_EVM_PHY_MASK           0x2
 #define DAVINCI_EMAC_BASE              0x01C80000
 #define DAVINCI_EMAC_CNTRL_OFFSET      0x0000
 #define DAVINCI_EMAC_CNTRL_MOD_OFFSET  0x1000
@@ -270,6 +271,7 @@ static struct emac_platform_data emac_pdata = {
        .ctrl_ram_offset        = DAVINCI_EMAC_CNTRL_RAM_OFFSET,
        .mdio_reg_offset        = DAVINCI_EMAC_MDIO_OFFSET,
        .ctrl_ram_size          = DAVINCI_EMAC_CNTRL_RAM_SIZE,
+       .phy_mask               = DAVINCI_EVM_PHY_MASK,
 };
 
 static struct platform_device davinci_emac_device = {
diff --git a/arch/arm/mach-davinci/include/mach/emac.h 
b/arch/arm/mach-davinci/include/mach/emac.h
index 7b8c52e..2ceb671 100644
--- a/arch/arm/mach-davinci/include/mach/emac.h
+++ b/arch/arm/mach-davinci/include/mach/emac.h
@@ -18,6 +18,7 @@ struct emac_platform_data {
        u32 ctrl_ram_offset;
        u32 mdio_reg_offset;
        u32 ctrl_ram_size;
+       u32 phy_mask;
 };
 
 void davinci_init_emac(char *mac_addr);
diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
index 88263f3..9189a2b 100644
--- a/drivers/net/davinci_emac.c
+++ b/drivers/net/davinci_emac.c
@@ -149,7 +149,6 @@ static const char emac_version_string[] = "TI DaVinci EMAC 
Linux v6.0";
 #define EMAC_MIN_FREQUENCY_FOR_1000MBPS (125000000)
 
 /* TODO: This should come from platform data */
-#define EMAC_EVM_PHY_MASK              (0x2)
 #define EMAC_EVM_MLINK_MASK            (0)
 #define EMAC_EVM_BUS_FREQUENCY         (76500000) /* PLL/6 i.e 76.5 MHz */
 #define EMAC_EVM_MDIO_FREQUENCY                (2200000) /* PHY bus frequency 
*/
@@ -505,6 +504,7 @@ struct emac_priv {
        struct timer_list periodic_timer;
        u32 periodic_ticks;
        u32 timer_active;
+       u32 phy_mask;
        /* mii_bus,phy members */
        struct mii_bus *mii_bus;
        struct phy_device *phydev;
@@ -699,7 +699,11 @@ static int emac_get_settings(struct net_device *ndev,
                             struct ethtool_cmd *ecmd)
 {
        struct emac_priv *priv = netdev_priv(ndev);
-       return phy_ethtool_gset(priv->phydev, ecmd);
+       if (priv->phy_mask)
+               return phy_ethtool_gset(priv->phydev, ecmd);
+       else
+               return -EOPNOTSUPP;
+
 }
 
 /**
@@ -713,7 +717,11 @@ static int emac_get_settings(struct net_device *ndev,
 static int emac_set_settings(struct net_device *ndev, struct ethtool_cmd *ecmd)
 {
        struct emac_priv *priv = netdev_priv(ndev);
-       return phy_ethtool_sset(priv->phydev, ecmd);
+       if (priv->phy_mask)
+               return phy_ethtool_sset(priv->phydev, ecmd);
+       else
+               return -EOPNOTSUPP;
+
 }
 
 
@@ -746,7 +754,10 @@ static void emac_update_phystatus(struct emac_priv *priv)
 
        mac_control = emac_read(EMAC_MACCONTROL);
 
-       new_duplex = priv->phydev->duplex;
+       if (priv->phy_mask)
+               new_duplex = priv->phydev->duplex;
+       else
+               new_duplex = DUPLEX_FULL;
 
        /* We get called only if link has changed (speed/duplex/status) */
        if ((priv->link) && (new_duplex != priv->duplex)) {
@@ -2443,34 +2454,43 @@ static int emac_dev_open(struct net_device *ndev)
 
        /* find the first phy */
        priv->phydev = NULL;
-       for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
-               if (priv->mii_bus->phy_map[phy_addr]) {
-                       priv->phydev = priv->mii_bus->phy_map[phy_addr];
-                       break;
+       if (priv->phy_mask) {
+               for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) {
+                       if (priv->mii_bus->phy_map[phy_addr]) {
+                               priv->phydev = priv->mii_bus->phy_map[phy_addr];
+                               break;
+                       }
                }
-       }
 
-       if (!priv->phydev) {
-               printk(KERN_ERR "%s: no PHY found\n", ndev->name);
-               return -1;
-       }
+               if (!priv->phydev) {
+                       printk(KERN_ERR "%s: no PHY found\n", ndev->name);
+                       return -1;
+               }
 
-       priv->phydev = phy_connect(ndev, priv->phydev->dev.bus_id,
+               priv->phydev = phy_connect(ndev, priv->phydev->dev.bus_id,
                                &emac_adjust_link, 0, PHY_INTERFACE_MODE_MII);
 
-       if (IS_ERR(priv->phydev)) {
-               printk(KERN_ERR "%s: Could not attach to PHY\n", ndev->name);
-               return PTR_ERR(priv->phydev);
-       }
+               if (IS_ERR(priv->phydev)) {
+                       printk(KERN_ERR "%s: Could not attach to PHY\n",
+                                                               ndev->name);
+                       return PTR_ERR(priv->phydev);
+               }
 
-       priv->link = 0;
-       priv->speed = 0;
-       priv->duplex = -1;
+               priv->link = 0;
+               priv->speed = 0;
+               priv->duplex = -1;
 
-       printk(KERN_INFO "%s: attached PHY driver [%s] "
-               "(mii_bus:phy_addr=%s, id=%x)\n", ndev->name,
-               priv->phydev->drv->name, priv->phydev->dev.bus_id,
-               priv->phydev->phy_id);
+               printk(KERN_INFO "%s: attached PHY driver [%s] "
+                       "(mii_bus:phy_addr=%s, id=%x)\n", ndev->name,
+                       priv->phydev->drv->name, priv->phydev->dev.bus_id,
+                       priv->phydev->phy_id);
+       } else{
+               /* No PHY , fix the link, speed and duplex settings */
+               priv->link = 1;
+               priv->speed = SPEED_100;
+               priv->duplex = DUPLEX_FULL;
+               emac_update_phystatus(priv);
+       }
 
        if (!netif_running(ndev)) /* debug only - to avoid compiler warning */
                emac_dump_regs(priv);
@@ -2478,7 +2498,8 @@ static int emac_dev_open(struct net_device *ndev)
        if (netif_msg_drv(priv))
                dev_notice(EMAC_DEV, "DaVinci EMAC: Opened %s\n", ndev->name);
 
-       phy_start(priv->phydev);
+       if (priv->phy_mask)
+               phy_start(priv->phydev);
 
        return 0;
 
@@ -2637,8 +2658,9 @@ static int __devinit davinci_emac_probe(struct 
platform_device *pdev)
                return -ENODEV;
        }
 
-       /* MAC addr: from platform_data */
+       /* MAC addr and PHY mask from platform_data */
        memcpy(priv->mac_addr, pdata->mac_addr, 6);
+       priv->phy_mask = pdata->phy_mask;
 
        /* Get EMAC platform data */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -2720,7 +2742,7 @@ static int __devinit davinci_emac_probe(struct 
platform_device *pdev)
        emac_mii->write = emac_mii_write,
        emac_mii->reset = emac_mii_reset,
        emac_mii->irq   = mii_irqs,
-       emac_mii->phy_mask = ~(EMAC_EVM_PHY_MASK);
+       emac_mii->phy_mask = ~(priv->phy_mask);
        emac_mii->parent = &pdev->dev;
        emac_mii->priv = priv->remap_addr + pdata->mdio_reg_offset;
        snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%x", priv->pdev->id);
-- 
1.5.4.1

_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to