Skip to content

Commit

Permalink
Merge branch 'am335x'
Browse files Browse the repository at this point in the history
Markus Pargmann says:

====================
net: cpsw: Support for am335x chip MACIDs

This series adds support to the cpsw driver to read the MACIDs of the am335x
chip and use them as fallback. These addresses are only used if there are no
mac addresses in the devicetree, for example set by a bootloader.
====================

Acked-by: Mugunthan V N <mugunthanvnm@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Sep 30, 2014
2 parents 5f0c5f7 + fa5f4ad commit 213d613
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 3 deletions.
6 changes: 5 additions & 1 deletion Documentation/devicetree/bindings/net/cpsw.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,17 @@ Optional properties:
- ti,hwmods : Must be "cpgmac0"
- no_bd_ram : Must be 0 or 1
- dual_emac : Specifies Switch to act as Dual EMAC
- syscon : Phandle to the system control device node, which is
the control module device of the am33x

Slave Properties:
Required properties:
- phy_id : Specifies slave phy id
- phy-mode : See ethernet.txt file in the same directory
- mac-address : See ethernet.txt file in the same directory

Optional properties:
- dual_emac_res_vlan : Specifies VID to be used to segregate the ports
- mac-address : See ethernet.txt file in the same directory

Note: "ti,hwmods" field is used to fetch the base address and irq
resources from TI, omap hwmod data base during device registration.
Expand All @@ -57,6 +59,7 @@ Examples:
active_slave = <0>;
cpts_clock_mult = <0x80000000>;
cpts_clock_shift = <29>;
syscon = <&cm>;
cpsw_emac0: slave@0 {
phy_id = <&davinci_mdio>, <0>;
phy-mode = "rgmii-txid";
Expand Down Expand Up @@ -85,6 +88,7 @@ Examples:
active_slave = <0>;
cpts_clock_mult = <0x80000000>;
cpts_clock_shift = <29>;
syscon = <&cm>;
cpsw_emac0: slave@0 {
phy_id = <&davinci_mdio>, <0>;
phy-mode = "rgmii-txid";
Expand Down
6 changes: 6 additions & 0 deletions arch/arm/boot/dts/am33xx.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,11 @@
};
};

cm: syscon@44e10000 {
compatible = "ti,am33xx-controlmodule", "syscon";
reg = <0x44e10000 0x800>;
};

intc: interrupt-controller@48200000 {
compatible = "ti,omap2-intc";
interrupt-controller;
Expand Down Expand Up @@ -696,6 +701,7 @@
*/
interrupts = <40 41 42 43>;
ranges;
syscon = <&cm>;
status = "disabled";

davinci_mdio: mdio@4a101000 {
Expand Down
2 changes: 2 additions & 0 deletions drivers/net/ethernet/ti/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ config TI_CPSW
select TI_DAVINCI_CPDMA
select TI_DAVINCI_MDIO
select TI_CPSW_PHY_SEL
select MFD_SYSCON
select REGMAP
---help---
This driver supports TI's CPSW Ethernet Switch.

Expand Down
45 changes: 43 additions & 2 deletions drivers/net/ethernet/ti/cpsw.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
#include <linux/of_net.h>
#include <linux/of_device.h>
#include <linux/if_vlan.h>
#include <linux/mfd/syscon.h>
#include <linux/regmap.h>

#include <linux/pinctrl/consumer.h>

Expand Down Expand Up @@ -1876,6 +1878,36 @@ static void cpsw_slave_init(struct cpsw_slave *slave, struct cpsw_priv *priv,
slave->port_vlan = data->dual_emac_res_vlan;
}

#define AM33XX_CTRL_MAC_LO_REG(id) (0x630 + 0x8 * id)
#define AM33XX_CTRL_MAC_HI_REG(id) (0x630 + 0x8 * id + 0x4)

static int cpsw_am33xx_cm_get_macid(struct device *dev, int slave,
u8 *mac_addr)
{
u32 macid_lo;
u32 macid_hi;
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, AM33XX_CTRL_MAC_LO_REG(slave), &macid_lo);
regmap_read(syscon, AM33XX_CTRL_MAC_HI_REG(slave), &macid_hi);

mac_addr[5] = (macid_lo >> 8) & 0xff;
mac_addr[4] = macid_lo & 0xff;
mac_addr[3] = (macid_hi >> 24) & 0xff;
mac_addr[2] = (macid_hi >> 16) & 0xff;
mac_addr[1] = (macid_hi >> 8) & 0xff;
mac_addr[0] = macid_hi & 0xff;

return 0;
}

static int cpsw_probe_dt(struct cpsw_platform_data *data,
struct platform_device *pdev)
{
Expand Down Expand Up @@ -1981,15 +2013,23 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
mdio = of_find_device_by_node(mdio_node);
of_node_put(mdio_node);
if (!mdio) {
pr_err("Missing mdio platform device\n");
dev_err(&pdev->dev, "Missing mdio platform device\n");
return -EINVAL;
}
snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
PHY_ID_FMT, mdio->name, phyid);

mac_addr = of_get_mac_address(slave_node);
if (mac_addr)
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, i,
slave_data->mac_addr);
if (ret)
return ret;
}
}

slave_data->phy_if = of_get_phy_mode(slave_node);
if (slave_data->phy_if < 0) {
Expand Down Expand Up @@ -2123,6 +2163,7 @@ static int cpsw_probe(struct platform_device *pdev)
priv->irq_enabled = true;
if (!priv->cpts) {
dev_err(&pdev->dev, "error allocating cpts\n");
ret = -ENOMEM;
goto clean_ndev_ret;
}

Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/ti/cpsw.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#define __CPSW_H__

#include <linux/if_ether.h>
#include <linux/phy.h>

struct cpsw_slave_data {
char phy_id[MII_BUS_ID_SIZE];
Expand Down

0 comments on commit 213d613

Please sign in to comment.