All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jagan Teki <jagan@amarulasolutions.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 12/13] net: sun8i_emac: Add EPHY CLK and RESET support
Date: Thu, 28 Feb 2019 00:27:00 +0530	[thread overview]
Message-ID: <20190227185701.15545-13-jagan@amarulasolutions.com> (raw)
In-Reply-To: <20190227185701.15545-1-jagan@amarulasolutions.com>

Add EPHY CLK and RESET support for sun8i_emac driver to
enable EPHY TX clock and EPHY reset pins via CLK and RESET
framework.

Cc: Joe Hershberger <joe.hershberger@ni.com>
Cc: Lothar Felten <lothar.felten@gmail.com>
Signed-off-by: Jagan Teki <jagan@amarulasolutions.com>
---
 drivers/net/sun8i_emac.c | 74 +++++++++++++++++++++++++++++++---------
 1 file changed, 57 insertions(+), 17 deletions(-)

diff --git a/drivers/net/sun8i_emac.c b/drivers/net/sun8i_emac.c
index 98bd7a5823..c0a440886e 100644
--- a/drivers/net/sun8i_emac.c
+++ b/drivers/net/sun8i_emac.c
@@ -138,7 +138,9 @@ struct emac_eth_dev {
 	struct phy_device *phydev;
 	struct mii_dev *bus;
 	struct clk tx_clk;
+	struct clk ephy_clk;
 	struct reset_ctl tx_rst;
+	struct reset_ctl ephy_rst;
 #ifdef CONFIG_DM_GPIO
 	struct gpio_desc reset_gpio;
 #endif
@@ -653,7 +655,6 @@ static int sun8i_eth_write_hwaddr(struct udevice *dev)
 
 static int sun8i_emac_board_setup(struct emac_eth_dev *priv)
 {
-	struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
 	int ret;
 
 	ret = clk_enable(&priv->tx_clk);
@@ -670,16 +671,20 @@ static int sun8i_emac_board_setup(struct emac_eth_dev *priv)
 		}
 	}
 
-	if (priv->variant == H3_EMAC) {
-		/* Only H3/H5 have clock controls for internal EPHY */
-		if (priv->use_internal_phy) {
-			/* Set clock gating for ephy */
-			setbits_le32(&ccm->bus_gate4,
-				     BIT(AHB_GATE_OFFSET_EPHY));
-
-			/* Deassert EPHY */
-			setbits_le32(&ccm->ahb_reset2_cfg,
-				     BIT(AHB_RESET_OFFSET_EPHY));
+	/* Only H3/H5 have clock controls for internal EPHY */
+	if (clk_valid(&priv->ephy_clk)) {
+		ret = clk_enable(&priv->ephy_clk);
+		if (ret) {
+			dev_err(dev, "failed to enable EPHY TX clock\n");
+			return ret;
+		}
+	}
+
+	if (reset_valid(&priv->ephy_rst)) {
+		ret = reset_deassert(&priv->ephy_rst);
+		if (ret) {
+			dev_err(dev, "failed to deassert EPHY TX clock\n");
+			return ret;
 		}
 	}
 
@@ -839,6 +844,44 @@ static const struct eth_ops sun8i_emac_eth_ops = {
 	.stop                   = sun8i_emac_eth_stop,
 };
 
+static int sun8i_get_ephy_nodes(struct emac_eth_dev *priv)
+{
+	int node, ret;
+
+	/* look for mdio-mux node for internal PHY node */
+	node = fdt_path_offset(gd->fdt_blob,
+			"/soc/ethernet at 1c30000/mdio-mux/mdio at 1/ethernet-phy at 1");
+	if (node < 0) {
+		debug("failed to get mdio-mux with internal PHY\n");
+		return node;
+	}
+
+	ret = fdt_node_check_compatible(gd->fdt_blob, 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,
+				     &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,
+				       &priv->ephy_rst);
+	if (ret) {
+		dev_err(dev, "failed to get EPHY TX reset\n");
+		return ret;
+	}
+
+	priv->use_internal_phy = true;
+
+	return 0;
+}
+
 static int sun8i_emac_eth_ofdata_to_platdata(struct udevice *dev)
 {
 	struct sun8i_eth_pdata *sun8i_pdata = dev_get_platdata(dev);
@@ -920,12 +963,9 @@ static int sun8i_emac_eth_ofdata_to_platdata(struct udevice *dev)
 	}
 
 	if (priv->variant == H3_EMAC) {
-		int parent = fdt_parent_offset(gd->fdt_blob, offset);
-
-		if (parent >= 0 &&
-		    !fdt_node_check_compatible(gd->fdt_blob, parent,
-				"allwinner,sun8i-h3-mdio-internal"))
-			priv->use_internal_phy = true;
+		ret = sun8i_get_ephy_nodes(priv);
+		if (ret)
+			return ret;
 	}
 
 	priv->interface = pdata->phy_interface;
-- 
2.18.0.321.gffc6fa0e3

  parent reply	other threads:[~2019-02-27 18:57 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-27 18:56 [U-Boot] [PATCH v3 00/13] net: Add Allwinner EMAC CLK, RESET support Jagan Teki
2019-02-27 18:56 ` [U-Boot] [PATCH v3 01/13] clk: sunxi: Implement A10 EMAC clocks Jagan Teki
2019-02-27 18:56 ` [U-Boot] [PATCH v3 02/13] net: sunxi_emac: Add CLK support Jagan Teki
2019-03-01 18:59   ` Joe Hershberger
2019-02-27 18:56 ` [U-Boot] [PATCH v3 03/13] net: sun8i_emac: Retrieve GMAC clock via 'syscon' phandle Jagan Teki
2019-03-01 18:59   ` Joe Hershberger
2019-03-05 16:16     ` Jagan Teki
2019-03-05 17:25       ` Joe Hershberger
2019-03-07 16:22         ` Jagan Teki
2019-03-07 17:49           ` Joe Hershberger
2019-02-27 18:56 ` [U-Boot] [PATCH v3 04/13] clk: Get the CLK by index without device Jagan Teki
2019-02-27 18:56 ` [U-Boot] [PATCH v3 05/13] clk: Use clk_get_by_index_tail() Jagan Teki
2019-03-10 21:51   ` Simon Glass
2019-02-27 18:56 ` [U-Boot] [PATCH v3 06/13] test/dm: clk: Add clk_get_by_index[_nodev] test Jagan Teki
2019-02-27 18:56 ` [U-Boot] [PATCH v3 07/13] reset: Get the RESET by index without device Jagan Teki
2019-02-27 18:56 ` [U-Boot] [PATCH v3 08/13] test/dm: reset: Add reset_get_by_index[_nodev] test Jagan Teki
2019-02-27 18:56 ` [U-Boot] [PATCH v3 09/13] clk: sunxi: Implement EMAC, GMAC clocks, resets Jagan Teki
2019-03-01 19:00   ` Joe Hershberger
2019-02-27 18:56 ` [U-Boot] [PATCH v3 10/13] net: sun8i_emac: Add CLK and RESET support Jagan Teki
2019-03-01 21:17   ` Joe Hershberger
2019-02-27 18:56 ` [U-Boot] [PATCH v3 11/13] clk: sunxi: h3: Implement EPHY CLK and RESET Jagan Teki
2019-03-01 21:12   ` Joe Hershberger
2019-02-27 18:57 ` Jagan Teki [this message]
2019-03-01 21:29   ` [U-Boot] [PATCH v3 12/13] net: sun8i_emac: Add EPHY CLK and RESET support Joe Hershberger
2019-02-27 18:57 ` [U-Boot] [PATCH v3 13/13] board: sunxi: gmac: Remove Ethernet clock and reset Jagan Teki

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190227185701.15545-13-jagan@amarulasolutions.com \
    --to=jagan@amarulasolutions.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.