diff options
Diffstat (limited to 'patches/linux-3.12/0604-net-cpsw-Use-cpsw-ctrl-macid-driver.patch')
-rw-r--r-- | patches/linux-3.12/0604-net-cpsw-Use-cpsw-ctrl-macid-driver.patch | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/patches/linux-3.12/0604-net-cpsw-Use-cpsw-ctrl-macid-driver.patch b/patches/linux-3.12/0604-net-cpsw-Use-cpsw-ctrl-macid-driver.patch new file mode 100644 index 0000000..c9fc544 --- /dev/null +++ b/patches/linux-3.12/0604-net-cpsw-Use-cpsw-ctrl-macid-driver.patch @@ -0,0 +1,79 @@ +From: Markus Pargmann <mpa@pengutronix.de> +Date: Mon, 16 Dec 2013 16:27:20 +0100 +Subject: [PATCH] net: cpsw: Use cpsw-ctrl-macid driver + +Use ctrl-macid driver to obtain the macids stored in the processor. This +is only done when defined in DT. + +Signed-off-by: Markus Pargmann <mpa@pengutronix.de> +--- + Documentation/devicetree/bindings/net/cpsw.txt | 5 +++++ + drivers/net/ethernet/ti/cpsw.c | 17 +++++++++++++---- + drivers/net/ethernet/ti/cpsw.h | 2 ++ + 3 files changed, 20 insertions(+), 4 deletions(-) + +diff --git a/Documentation/devicetree/bindings/net/cpsw.txt b/Documentation/devicetree/bindings/net/cpsw.txt +index c39f077..b95c38b 100644 +--- a/Documentation/devicetree/bindings/net/cpsw.txt ++++ b/Documentation/devicetree/bindings/net/cpsw.txt +@@ -34,6 +34,11 @@ Required properties: + Optional properties: + - dual_emac_res_vlan : Specifies VID to be used to segregate the ports + - mac-address : Specifies slave MAC address ++- ti,mac-address-ctrl : When cpsw-ctrl-macid support is compiledin, this can ++ be set to a phandle with one argument, see ++ cpsw-ctrl-macid.txt. If this method fails, cpsw falls ++ back to mac-address or random mac-address. ++ + + Note: "ti,hwmods" field is used to fetch the base address and irq + resources from TI, omap hwmod data base during device registration. +diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c +index 9cfa586..4ad9eb5 100644 +--- a/drivers/net/ethernet/ti/cpsw.c ++++ b/drivers/net/ethernet/ti/cpsw.c +@@ -1794,9 +1794,15 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data, + 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) +- memcpy(slave_data->mac_addr, mac_addr, ETH_ALEN); ++ ret = cpsw_ctrl_macid_read(slave_node, slave_data->mac_addr); ++ if (ret) { ++ if (ret == -EPROBE_DEFER) ++ return ret; ++ ++ mac_addr = of_get_mac_address(slave_node); ++ if (mac_addr) ++ memcpy(slave_data->mac_addr, mac_addr, ETH_ALEN); ++ } + + slave_data->phy_if = of_get_phy_mode(slave_node); + +@@ -1934,10 +1940,13 @@ static int cpsw_probe(struct platform_device *pdev) + /* Select default pin state */ + pinctrl_pm_select_default_state(&pdev->dev); + +- if (cpsw_probe_dt(&priv->data, pdev)) { ++ ret = cpsw_probe_dt(&priv->data, pdev); ++ if (ret == -EINVAL) { + pr_err("cpsw: platform data missing\n"); + ret = -ENODEV; + goto clean_runtime_disable_ret; ++ } else if (ret) { ++ goto clean_runtime_disable_ret; + } + data = &priv->data; + +diff --git a/drivers/net/ethernet/ti/cpsw.h b/drivers/net/ethernet/ti/cpsw.h +index 1b71067..222eebe 100644 +--- a/drivers/net/ethernet/ti/cpsw.h ++++ b/drivers/net/ethernet/ti/cpsw.h +@@ -42,4 +42,6 @@ struct cpsw_platform_data { + + void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave); + ++int cpsw_ctrl_macid_read(struct device_node *np, u8 *mac_addr); ++ + #endif /* __CPSW_H__ */ |