[email protected] writes:

> 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.

> 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