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