Skip to content

Commit

Permalink
drivers: net: cpsw: davinci_emac: move reading mac id to common file
Browse files Browse the repository at this point in the history
Moving mac address reading from ethernet driver to common
file for better maintenance and for code reusable.

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Mugunthan V N authored and David S. Miller committed Sep 22, 2015
1 parent 607cba1 commit b6745f6
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 59 deletions.
58 changes: 49 additions & 9 deletions drivers/net/ethernet/ti/cpsw-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,38 @@

#include "cpsw.h"

#define AM33XX_CTRL_MAC_LO_REG(offset, id) ((offset) + 0x8 * (id))
#define AM33XX_CTRL_MAC_HI_REG(offset, id) ((offset) + 0x8 * (id) + 0x4)
#define CTRL_MAC_LO_REG(offset, id) ((offset) + 0x8 * (id))
#define CTRL_MAC_HI_REG(offset, id) ((offset) + 0x8 * (id) + 0x4)

int cpsw_am33xx_cm_get_macid(struct device *dev, u16 offset, int slave,
u8 *mac_addr)
static int davinci_emac_3517_get_macid(struct device *dev, u16 offset,
int slave, u8 *mac_addr)
{
u32 macid_lsb;
u32 macid_msb;
struct regmap *syscon;

syscon = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon");
if (IS_ERR(syscon)) {
if (PTR_ERR(syscon) == -ENODEV)
return 0;
return PTR_ERR(syscon);
}

regmap_read(syscon, CTRL_MAC_LO_REG(offset, slave), &macid_lsb);
regmap_read(syscon, CTRL_MAC_HI_REG(offset, slave), &macid_msb);

mac_addr[0] = (macid_msb >> 16) & 0xff;
mac_addr[1] = (macid_msb >> 8) & 0xff;
mac_addr[2] = macid_msb & 0xff;
mac_addr[3] = (macid_lsb >> 16) & 0xff;
mac_addr[4] = (macid_lsb >> 8) & 0xff;
mac_addr[5] = macid_lsb & 0xff;

return 0;
}

static int cpsw_am33xx_cm_get_macid(struct device *dev, u16 offset, int slave,
u8 *mac_addr)
{
u32 macid_lo;
u32 macid_hi;
Expand All @@ -36,10 +63,8 @@ int cpsw_am33xx_cm_get_macid(struct device *dev, u16 offset, int slave,
return PTR_ERR(syscon);
}

regmap_read(syscon, AM33XX_CTRL_MAC_LO_REG(offset, slave),
&macid_lo);
regmap_read(syscon, AM33XX_CTRL_MAC_HI_REG(offset, slave),
&macid_hi);
regmap_read(syscon, CTRL_MAC_LO_REG(offset, slave), &macid_lo);
regmap_read(syscon, CTRL_MAC_HI_REG(offset, slave), &macid_hi);

mac_addr[5] = (macid_lo >> 8) & 0xff;
mac_addr[4] = macid_lo & 0xff;
Expand All @@ -50,6 +75,21 @@ int cpsw_am33xx_cm_get_macid(struct device *dev, u16 offset, int slave,

return 0;
}
EXPORT_SYMBOL_GPL(cpsw_am33xx_cm_get_macid);

int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr)
{
if (of_machine_is_compatible("ti,am33xx"))
return cpsw_am33xx_cm_get_macid(dev, 0x630, slave, mac_addr);

if (of_device_is_compatible(dev->of_node, "ti,am3517-emac"))
return davinci_emac_3517_get_macid(dev, 0x110, slave, mac_addr);

if (of_device_is_compatible(dev->of_node, "ti,dm816-emac"))
return cpsw_am33xx_cm_get_macid(dev, 0x30, slave, mac_addr);

dev_err(dev, "incompatible machine/device type for reading mac address\n");
return -ENOENT;
}
EXPORT_SYMBOL_GPL(ti_cm_get_macid);

MODULE_LICENSE("GPL");
11 changes: 4 additions & 7 deletions drivers/net/ethernet/ti/cpsw.c
Original file line number Diff line number Diff line change
Expand Up @@ -2058,13 +2058,10 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
if (mac_addr) {
memcpy(slave_data->mac_addr, mac_addr, ETH_ALEN);
} else {
if (of_machine_is_compatible("ti,am33xx")) {
ret = cpsw_am33xx_cm_get_macid(&pdev->dev,
0x630, i,
slave_data->mac_addr);
if (ret)
return ret;
}
ret = ti_cm_get_macid(&pdev->dev, i,
slave_data->mac_addr);
if (ret)
return ret;
}
if (data->dual_emac) {
if (of_property_read_u32(slave_node, "dual_emac_res_vlan",
Expand Down
3 changes: 1 addition & 2 deletions drivers/net/ethernet/ti/cpsw.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ struct cpsw_platform_data {
};

void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave);
int cpsw_am33xx_cm_get_macid(struct device *dev, u16 offset, int slave,
u8 *mac_addr);
int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr);

#endif /* __CPSW_H__ */
44 changes: 3 additions & 41 deletions drivers/net/ethernet/ti/davinci_emac.c
Original file line number Diff line number Diff line change
Expand Up @@ -1882,51 +1882,13 @@ davinci_emac_of_get_pdata(struct platform_device *pdev, struct emac_priv *priv)
return pdata;
}

static int davinci_emac_3517_get_macid(struct device *dev, u16 offset,
int slave, u8 *mac_addr)
{
u32 macid_lsb;
u32 macid_msb;
struct regmap *syscon;

syscon = syscon_regmap_lookup_by_phandle(dev->of_node, "syscon");
if (IS_ERR(syscon)) {
if (PTR_ERR(syscon) == -ENODEV)
return 0;
return PTR_ERR(syscon);
}

regmap_read(syscon, offset, &macid_lsb);
regmap_read(syscon, offset + 4, &macid_msb);

mac_addr[0] = (macid_msb >> 16) & 0xff;
mac_addr[1] = (macid_msb >> 8) & 0xff;
mac_addr[2] = macid_msb & 0xff;
mac_addr[3] = (macid_lsb >> 16) & 0xff;
mac_addr[4] = (macid_lsb >> 8) & 0xff;
mac_addr[5] = macid_lsb & 0xff;

return 0;
}

static int davinci_emac_try_get_mac(struct platform_device *pdev,
int instance, u8 *mac_addr)
{
int error = -EINVAL;

if (!pdev->dev.of_node)
return error;

if (of_device_is_compatible(pdev->dev.of_node, "ti,am3517-emac"))
error = davinci_emac_3517_get_macid(&pdev->dev, 0x110,
0, mac_addr);
else if (of_device_is_compatible(pdev->dev.of_node,
"ti,dm816-emac"))
error = cpsw_am33xx_cm_get_macid(&pdev->dev, 0x30,
instance,
mac_addr);

return error;
return -EINVAL;

return ti_cm_get_macid(&pdev->dev, instance, mac_addr);
}

/**
Expand Down

0 comments on commit b6745f6

Please sign in to comment.