[U-Boot] net: sun8i_emac: Test the correct phy
diff mbox series

Message ID 20190719202638.83837-1-manu@freebsd.org
State Accepted
Commit d53e52225527625c72c4dbff4fe8c0b68a553340
Delegated to: Joe Hershberger
Headers show
Series
  • [U-Boot] net: sun8i_emac: Test the correct phy
Related show

Commit Message

Emmanuel Vadot July 19, 2019, 8:26 p.m. UTC
H3/H5 can either use the internal phy or an external one.
Before getting clock and resets for the internal phy,
test that we are using it because otherwise it break emac
when using an external phy.

Tested-on: OrangePi PC2 (H5)
Fixes: 2348453c41 (net: sun8i_emac: Add EPHY CLK and RESET support)
Signed-off-by: Emmanuel Vadot <manu@freebsd.org>
---
 drivers/net/sun8i_emac.c | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

Comments

Joe Hershberger July 23, 2019, 12:02 a.m. UTC | #1
On Fri, Jul 19, 2019 at 3:27 PM Emmanuel Vadot <manu@freebsd.org> wrote:
>
> H3/H5 can either use the internal phy or an external one.
> Before getting clock and resets for the internal phy,
> test that we are using it because otherwise it break emac
> when using an external phy.
>
> Tested-on: OrangePi PC2 (H5)
> Fixes: 2348453c41 (net: sun8i_emac: Add EPHY CLK and RESET support)
> Signed-off-by: Emmanuel Vadot <manu@freebsd.org>

Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Joe Hershberger July 25, 2019, 6:43 p.m. UTC | #2
Hi Emmanuel,

https://patchwork.ozlabs.org/patch/1134275/ was applied to http://git.denx.de/?p=u-boot/u-boot-net.git

Thanks!
-Joe

Patch
diff mbox series

diff --git a/drivers/net/sun8i_emac.c b/drivers/net/sun8i_emac.c
index c0a440886e..0629b16e57 100644
--- a/drivers/net/sun8i_emac.c
+++ b/drivers/net/sun8i_emac.c
@@ -846,31 +846,44 @@  static const struct eth_ops sun8i_emac_eth_ops = {
 
 static int sun8i_get_ephy_nodes(struct emac_eth_dev *priv)
 {
-	int node, ret;
+	int emac_node, ephy_node, ret, ephy_handle;
+
+	emac_node = fdt_path_offset(gd->fdt_blob,
+				    "/soc/ethernet@1c30000");
+	if (emac_node < 0) {
+		debug("failed to get emac node\n");
+		return emac_node;
+	}
+	ephy_handle = fdtdec_lookup_phandle(gd->fdt_blob,
+					    emac_node, "phy-handle");
 
 	/* look for mdio-mux node for internal PHY node */
-	node = fdt_path_offset(gd->fdt_blob,
-			"/soc/ethernet@1c30000/mdio-mux/mdio@1/ethernet-phy@1");
-	if (node < 0) {
+	ephy_node = fdt_path_offset(gd->fdt_blob,
+				    "/soc/ethernet@1c30000/mdio-mux/mdio@1/ethernet-phy@1");
+	if (ephy_node < 0) {
 		debug("failed to get mdio-mux with internal PHY\n");
-		return node;
+		return ephy_node;
 	}
 
-	ret = fdt_node_check_compatible(gd->fdt_blob, node,
+	/* This is not the phy we are looking for */
+	if (ephy_node != ephy_handle)
+		return 0;
+
+	ret = fdt_node_check_compatible(gd->fdt_blob, ephy_node,
 					"allwinner,sun8i-h3-mdio-internal");
 	if (ret < 0) {
 		debug("failed to find mdio-internal node\n");
 		return ret;
 	}
 
-	ret = clk_get_by_index_nodev(offset_to_ofnode(node), 0,
+	ret = clk_get_by_index_nodev(offset_to_ofnode(ephy_node), 0,
 				     &priv->ephy_clk);
 	if (ret) {
 		dev_err(dev, "failed to get EPHY TX clock\n");
 		return ret;
 	}
 
-	ret = reset_get_by_index_nodev(offset_to_ofnode(node), 0,
+	ret = reset_get_by_index_nodev(offset_to_ofnode(ephy_node), 0,
 				       &priv->ephy_rst);
 	if (ret) {
 		dev_err(dev, "failed to get EPHY TX reset\n");