> > From: Chaithrika U S <[email protected]>
> >
> > ioremap call has been added to map the EMAC memory region.
> > This removes IO_ADDRESS, davinci_writel, davinci_readl usage in the
> driver.
>
> I think you need to update this description since the removal of these
> features was done in an earlier patch.  Rather, the comment should
> reflect that the mapping is now a single mapping using offsets instead
> of multiple mappings, and the simplification of the rror handling.
>

OK, will update this.

Thanks,
Chaithrika
> > Also, the PHY mask information from the platform is utilised instead
> of the
> > hardcoded values in the driver. Similaryly the max MDIO clock value
> is
> > from platform data.
> >
> > Signed-off-by: Chaithrika U S <[email protected]>
>
> Otherwise, it looks ok.
>
> Kevin
>
> > ---
> >  drivers/net/davinci_emac.c |  224 ++++++++++++++++------------------
> ---------
> >  1 files changed, 83 insertions(+), 141 deletions(-)
> >
> > diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
> > index 4f25fb6..a658c15 100644
> > --- a/drivers/net/davinci_emac.c
> > +++ b/drivers/net/davinci_emac.c
> > @@ -148,12 +148,6 @@ static const char emac_version_string[] = "TI
> DaVinci EMAC Linux v6.0";
> >  #define EMAC_MIN_FREQUENCY_FOR_100MBPS       (55000000)
> >  #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 */
> > -
> >  /* EMAC register related defines */
> >  #define EMAC_ALL_MULTI_REG_VALUE     (0xFFFFFFFF)
> >  #define EMAC_NUM_MULTICAST_BITS              (64)
> > @@ -483,9 +477,9 @@ struct emac_priv {
> >        char mac_addr[6];
> >        spinlock_t tx_lock;
> >        spinlock_t rx_lock;
> > +     void __iomem *remap_addr;
> >        u32 emac_base_phys;
> >        void __iomem *emac_base;
> > -     u32 emac_ctrl_phys;
> >        void __iomem *ctrl_base;
> >        void __iomem *emac_ctrl_ram;
> >        u32 ctrl_ram_size;
> > @@ -505,6 +499,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;
> > @@ -514,6 +509,7 @@ struct emac_priv {
> >  /* clock frequency for EMAC */
> >  static struct clk *emac_clk;
> >  static unsigned long emac_bus_frequency;
> > +static unsigned long mdio_max_freq;
> >
> >  /* EMAC internal utility function */
> >  static inline u32 emac_virt_to_phys(void __iomem *addr)
> > @@ -699,7 +695,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 +713,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 +750,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)) {
> > @@ -2288,10 +2295,9 @@ static int emac_mii_reset(struct mii_bus *bus)
> >  {
> >        unsigned int clk_div;
> >        int mdio_bus_freq = emac_bus_frequency;
> > -     int mdio_clock_freq = EMAC_EVM_MDIO_FREQUENCY;
> >
> > -     if (mdio_clock_freq & mdio_bus_freq)
> > -             clk_div = ((mdio_bus_freq / mdio_clock_freq) - 1);
> > +     if (mdio_max_freq & mdio_bus_freq)
> > +             clk_div = ((mdio_bus_freq / mdio_max_freq) - 1);
> >        else
> >                clk_div = 0xFF;
> >
> > @@ -2443,34 +2449,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 +2493,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;
> >
> > @@ -2603,6 +2619,7 @@ static int __devinit davinci_emac_probe(struct
> platform_device *pdev)
> >        struct net_device *ndev;
> >        struct emac_priv *priv;
> >        unsigned long size;
> > +     struct emac_platform_data *pdata;
> >
> >        /* obtain emac clock from kernel */
> >        emac_clk = clk_get(&pdev->dev, "emac");
> > @@ -2630,79 +2647,46 @@ static int __devinit
> davinci_emac_probe(struct platform_device *pdev)
> >        spin_lock_init(&priv->rx_lock);
> >        spin_lock_init(&priv->lock);
> >
> > -     /* MAC addr: from platform_data */
> > -     if (pdev->dev.platform_data) {
> > -             struct emac_platform_data *pdata = pdev-
> >dev.platform_data;
> > -
> > -             memcpy(priv->mac_addr, pdata->mac_addr, 6);
> > +     pdata = pdev->dev.platform_data;
> > +     if (!pdata) {
> > +             printk(KERN_ERR "DaVinci EMAC: No platfrom data\n");
> > +             return -ENODEV;
> >        }
> >
> > +     /* 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_byname(pdev, IORESOURCE_MEM,
> "ctrl_regs");
> > +     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> >        if (!res) {
> > -             dev_err(EMAC_DEV, "DaVinci EMAC: Error getting ctrl
> res\n");
> > +             dev_err(EMAC_DEV, "DaVinci EMAC: Error getting res\n");
> >                rc = -ENOENT;
> >                goto probe_quit;
> >        }
> > -     priv->emac_base_phys = res->start;
> > +
> > +     priv->emac_base_phys = res->start + pdata->ctrl_reg_offset;
> >        size = res->end - res->start + 1;
> > -     if (!request_mem_region(priv->emac_base_phys, size, ndev-
> >name)) {
> > +     if (!request_mem_region(res->start, size, ndev->name)) {
> >                dev_err(EMAC_DEV, "DaVinci EMAC: failed
> request_mem_region() \
> > -                                      for ctrl regs\n");
> > +                                      for regs\n");
> >                rc = -ENXIO;
> >                goto probe_quit;
> >        }
> > -     priv->emac_base = ioremap(res->start, size);
> > -     if (!priv->emac_base) {
> > +
> > +     priv->remap_addr = ioremap(res->start, size);
> > +     if (!priv->remap_addr) {
> >                dev_err(EMAC_DEV, "Unable to map IO\n");
> >                rc = -ENOMEM;
> > -             release_mem_region(priv->emac_base_phys, size);
> > +             release_mem_region(res->start, size);
> >                goto probe_quit;
> >        }
> > -     ndev->base_addr = (unsigned long)priv->emac_base;
> > +     priv->emac_base = priv->remap_addr + pdata->ctrl_reg_offset;
> > +     ndev->base_addr = (unsigned long)priv->remap_addr;
> >
> > -     res = platform_get_resource_byname(pdev,
> > -                                     IORESOURCE_MEM,
> "ctrl_module_regs");
> > -     if (!res) {
> > -             dev_err(EMAC_DEV, "DaVinci EMAC: Error getting ctrl
> module \
> > -                                     res\n");
> > -             rc = -ENOENT;
> > -             goto no_ctrl_mod_res;
> > -     }
> > -     priv->emac_ctrl_phys = res->start;
> > -     size = res->end - res->start + 1;
> > -     priv->ctrl_base = ioremap(res->start, size);
> > -     if (!priv->ctrl_base) {
> > -             dev_err(EMAC_DEV, "Unable to map ctrl regs\n");
> > -             rc = -ENOMEM;
> > -             goto no_ctrl_mod_res;
> > -     }
> > -     if (!request_mem_region(priv->emac_ctrl_phys, size, ndev-
> >name)) {
> > -             dev_err(EMAC_DEV, "DaVinci EMAC: failed
> request_mem_region() \
> > -                                     for ctrl module regs\n");
> > -             rc = -ENXIO;
> > -             goto no_ctrl_mod_res;
> > -     }
> > -
> > -     res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> "ctrl_ram");
> > -     if (!res) {
> > -             dev_err(EMAC_DEV, "DaVinci EMAC: Error getting ctrl ram
> res\n");
> > -             rc = -ENOENT;
> > -             goto no_ctrl_ram_res;
> > -     }
> > -     priv->ctrl_ram_size = res->end - res->start + 1;
> > -     priv->emac_ctrl_ram = ioremap(res->start, priv->ctrl_ram_size);
> > -     if (!priv->emac_ctrl_ram) {
> > -             dev_err(EMAC_DEV, "Unable to map ctrl RAM\n");
> > -             rc = -ENOMEM;
> > -             goto no_ctrl_ram_res;
> > -     }
> > -     if (!request_mem_region(res->start, priv->ctrl_ram_size, ndev-
> >name)) {
> > -             dev_err(EMAC_DEV, "DaVinci EMAC: failed
> request_mem_region() \
> > -                                     for ctrl ram regs\n");
> > -             rc = -ENXIO;
> > -             goto no_ctrl_ram_res;
> > -     }
> > +     priv->ctrl_base = priv->remap_addr + pdata-
> >ctrl_mod_reg_offset;
> > +     priv->ctrl_ram_size = pdata->ctrl_ram_size;
> > +     priv->emac_ctrl_ram = priv->remap_addr + pdata-
> >ctrl_ram_offset;
> >
> >        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
> >        if (!res) {
> > @@ -2753,33 +2737,11 @@ 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;
> > -
> > -     /* Base address initialisation for MDIO */
> > -     res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> "mdio_regs");
> > -     if (!res) {
> > -             dev_err(EMAC_DEV, "DaVinci EMAC: Error getting mdio
> res\n");
> > -             rc = -ENOENT;
> > -             goto no_mdio_res;
> > -     }
> > -
> > -     emac_mii->priv = (void *)(res->start);
> > -     size = res->end - res->start + 1;
> > -     emac_mii->priv = ioremap(res->start, size);
> > -     if (!emac_mii->priv) {
> > -             dev_err(EMAC_DEV, "Unable to map MDIO regs\n");
> > -             rc = -ENOMEM;
> > -             goto no_mdio_res;
> > -     }
> > -     if (!request_mem_region(res->start, size, ndev->name)) {
> > -             dev_err(EMAC_DEV, "DaVinci EMAC: failed
> request_mem_region() \
> > -                                     for mdio regs\n");
> > -             rc = -ENXIO;
> > -             goto no_mdio_res;
> > -     }
> > -
> > +     emac_mii->priv = priv->remap_addr + pdata->mdio_reg_offset;
> >        snprintf(priv->mii_bus->id, MII_BUS_ID_SIZE, "%x", priv->pdev-
> >id);
> > +     mdio_max_freq = pdata->mdio_max_freq;
> >        emac_mii->reset(emac_mii);
> >
> >        /* Register the MII bus */
> > @@ -2795,28 +2757,14 @@ static int __devinit
> davinci_emac_probe(struct platform_device *pdev)
> >        return 0;
> >
> >  mdiobus_quit:
> > -     release_mem_region(res->start, res->end - res->start + 1);
> > -
> > -no_mdio_res:
> >        mdiobus_free(emac_mii);
> >
> >  netdev_reg_err:
> >  mdio_alloc_err:
> >  no_irq_res:
> > -     res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> "ctrl_ram");
> > -     release_mem_region(res->start, res->end - res->start + 1);
> > -     iounmap(priv->emac_ctrl_ram);
> > -
> > -no_ctrl_ram_res:
> > -     res = platform_get_resource_byname(pdev,
> > -                                     IORESOURCE_MEM,
> "ctrl_module_regs");
> > -     release_mem_region(res->start, res->end - res->start + 1);
> > -     iounmap(priv->ctrl_base);
> > -
> > -no_ctrl_mod_res:
> > -     res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
> "ctrl_regs");
> > +     res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> >        release_mem_region(res->start, res->end - res->start + 1);
> > -     iounmap(priv->emac_base);
> > +     iounmap(priv->remap_addr);
> >
> >  probe_quit:
> >        clk_put(emac_clk);
> > @@ -2834,7 +2782,6 @@ probe_quit:
> >  static int __devexit davinci_emac_remove(struct platform_device
> *pdev)
> >  {
> >        struct resource *res;
> > -     int i = 0;
> >        struct net_device *ndev = platform_get_drvdata(pdev);
> >        struct emac_priv *priv = netdev_priv(ndev);
> >
> > @@ -2846,17 +2793,12 @@ static int __devexit
> davinci_emac_remove(struct platform_device *pdev)
> >        mdiobus_unregister(priv->mii_bus);
> >        mdiobus_free(priv->mii_bus);
> >
> > -     while ((res = platform_get_resource(priv->pdev, IORESOURCE_MEM,
> i))) {
> > -             release_mem_region(res->start, res->end - res->start +
> 1);
> > -             i++;
> > -     }
> > +     release_mem_region(res->start, res->end - res->start + 1);
> >
> >        unregister_netdev(ndev);
> >        free_netdev(ndev);
> > -     iounmap(priv->emac_base);
> > -     iounmap(priv->ctrl_base);
> > -     iounmap(priv->emac_ctrl_ram);
> > -     iounmap(emac_mii->priv);
> > +     iounmap(priv->remap_addr);
> > +
> >        clk_disable(emac_clk);
> >        clk_put(emac_clk);
> >
> > --
> > 1.5.6
> >
> > _______________________________________________
> > Davinci-linux-open-source mailing list
> > [email protected]
> > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-
> source
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source

Reply via email to