summaryrefslogtreecommitdiffstats
path: root/patches/linux-3.12/0604-net-cpsw-Use-cpsw-ctrl-macid-driver.patch
diff options
context:
space:
mode:
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.patch79
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__ */