blob: f864fa47bb1b114e8440d0f569924041798f640b [file] [log] [blame]
From aca30aebcd4423fed73d3d94306562e3e4c3283e Mon Sep 17 00:00:00 2001
From: Dylan Hung <dylan_hung@aspeedtech.com>
Date: Wed, 7 Dec 2022 17:34:45 +0800
Subject: [PATCH 3/3] net: ftgmac100: Add scu reset toggling
Assert and deassert the reset line to ensure the hardware is in a right
state.
v2: toggle SCU reset also in ftgmac100_init_hw.
Patch Tracking Bug: b/262485041
Upstream info / review: n/a
Inappropriate [other]:
- The commit is created to debug BMC networking issue and we will push
Aspeed to upstream this.
Justification: Same as reasons above.
Signed-off-by: Dylan Hung <dylan_hung@aspeedtech.com>
Change-Id: If153780d98be9990d6bb56d54a60ff59e053a844
---
drivers/net/ethernet/faraday/ftgmac100.c | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
index ef8c186bb2ec..615649393cad 100644
--- a/drivers/net/ethernet/faraday/ftgmac100.c
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
@@ -9,6 +9,7 @@
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/clk.h>
+#include <linux/reset.h>
#include <linux/dma-mapping.h>
#include <linux/etherdevice.h>
#include <linux/ethtool.h>
@@ -89,6 +90,7 @@ struct ftgmac100 {
struct device_node *phy_dn;
struct mii_bus *mii_bus;
struct clk *clk;
+ struct reset_control *reset;
/* AST2500/AST2600 RMII ref clock gate */
struct clk *rclk;
@@ -249,6 +251,10 @@ static void ftgmac100_init_hw(struct ftgmac100 *priv)
{
u32 reg, rfifo_sz, tfifo_sz;
+ reset_control_assert(priv->reset);
+ mdelay(10);
+ reset_control_deassert(priv->reset);
+
/* Clear stale interrupts */
reg = ioread32(priv->base + FTGMAC100_OFFSET_ISR);
iowrite32(reg, priv->base + FTGMAC100_OFFSET_ISR);
@@ -1855,6 +1861,7 @@ static void ftgmac100_ncsi_handler(struct ncsi_dev *nd)
static int ftgmac100_setup_clk(struct ftgmac100 *priv)
{
struct clk *clk;
+ struct reset_control *reset;
int rc;
clk = devm_clk_get(priv->dev, NULL /* MACCLK */);
@@ -1880,8 +1887,19 @@ static int ftgmac100_setup_clk(struct ftgmac100 *priv)
*/
priv->rclk = devm_clk_get_optional(priv->dev, "RCLK");
rc = clk_prepare_enable(priv->rclk);
- if (!rc)
- return 0;
+ if (rc)
+ goto cleanup_clk;
+
+ reset = devm_reset_control_get_optional(priv->dev, NULL);
+ if (IS_ERR(reset))
+ return PTR_ERR(reset);
+ priv->reset = reset;
+
+ rc = reset_control_assert(priv->reset);
+ mdelay(10);
+ rc = reset_control_deassert(priv->reset);
+
+ return 0;
cleanup_clk:
clk_disable_unprepare(priv->clk);
--
2.39.0.rc1.256.g54fd8350bd-goog