|
@@ -0,0 +1,75 @@
|
|
|
+From e67f325e9cd67562b761e884680c0fec03a6f404 Mon Sep 17 00:00:00 2001
|
|
|
+From: Matthew Hagan <[email protected]>
|
|
|
+Date: Tue, 8 Jun 2021 19:59:06 +0100
|
|
|
+Subject: net: stmmac: explicitly deassert GMAC_AHB_RESET
|
|
|
+
|
|
|
+We are currently assuming that GMAC_AHB_RESET will already be deasserted
|
|
|
+by the bootloader. However if this has not been done, probing of the GMAC
|
|
|
+will fail. To remedy this we must ensure GMAC_AHB_RESET has been deasserted
|
|
|
+prior to probing.
|
|
|
+
|
|
|
+v2 changes:
|
|
|
+ - remove NULL condition check for stmmac_ahb_rst in stmmac_main.c
|
|
|
+ - unwrap dev_err() message in stmmac_main.c
|
|
|
+ - add PTR_ERR() around plat->stmmac_ahb_rst in stmmac_platform.c
|
|
|
+
|
|
|
+v3 changes:
|
|
|
+ - add error pointer to dev_err() output
|
|
|
+ - add reset_control_assert(stmmac_ahb_rst) in stmmac_dvr_remove
|
|
|
+ - revert PTR_ERR() around plat->stmmac_ahb_rst since this is performed
|
|
|
+ on the returned value of ret by the calling function
|
|
|
+
|
|
|
+Signed-off-by: Matthew Hagan <[email protected]>
|
|
|
+Signed-off-by: David S. Miller <[email protected]>
|
|
|
+---
|
|
|
+ drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 5 +++++
|
|
|
+ drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 6 ++++++
|
|
|
+ include/linux/stmmac.h | 1 +
|
|
|
+ 3 files changed, 12 insertions(+)
|
|
|
+
|
|
|
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
|
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
|
|
|
+@@ -4990,6 +4990,10 @@ int stmmac_dvr_probe(struct device *devi
|
|
|
+ reset_control_reset(priv->plat->stmmac_rst);
|
|
|
+ }
|
|
|
+
|
|
|
++ ret = reset_control_deassert(priv->plat->stmmac_ahb_rst);
|
|
|
++ if (ret == -ENOTSUPP)
|
|
|
++ dev_err(priv->device, "unable to bring out of ahb reset\n");
|
|
|
++
|
|
|
+ /* Init MAC and get the capabilities */
|
|
|
+ ret = stmmac_hw_init(priv);
|
|
|
+ if (ret)
|
|
|
+@@ -5214,6 +5218,7 @@ int stmmac_dvr_remove(struct device *dev
|
|
|
+ phylink_destroy(priv->phylink);
|
|
|
+ if (priv->plat->stmmac_rst)
|
|
|
+ reset_control_assert(priv->plat->stmmac_rst);
|
|
|
++ reset_control_assert(priv->plat->stmmac_ahb_rst);
|
|
|
+ pm_runtime_put(dev);
|
|
|
+ pm_runtime_disable(dev);
|
|
|
+ if (priv->hw->pcs != STMMAC_PCS_TBI &&
|
|
|
+--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
|
|
|
++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
|
|
|
+@@ -616,6 +616,12 @@ stmmac_probe_config_dt(struct platform_d
|
|
|
+ plat->stmmac_rst = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
++ plat->stmmac_ahb_rst = devm_reset_control_get_optional_shared(
|
|
|
++ &pdev->dev, "ahb");
|
|
|
++ if (IS_ERR(plat->stmmac_ahb_rst))
|
|
|
++ if (PTR_ERR(plat->stmmac_ahb_rst) == -EPROBE_DEFER)
|
|
|
++ goto error_hw_init;
|
|
|
++
|
|
|
+ return plat;
|
|
|
+
|
|
|
+ error_hw_init:
|
|
|
+--- a/include/linux/stmmac.h
|
|
|
++++ b/include/linux/stmmac.h
|
|
|
+@@ -192,6 +192,7 @@ struct plat_stmmacenet_data {
|
|
|
+ unsigned int clk_ref_rate;
|
|
|
+ s32 ptp_max_adj;
|
|
|
+ struct reset_control *stmmac_rst;
|
|
|
++ struct reset_control *stmmac_ahb_rst;
|
|
|
+ struct stmmac_axi *axi;
|
|
|
+ int has_gmac4;
|
|
|
+ bool has_sun8i;
|