diff mbox series

[v2] net: stmmac: explicitly deassert GMAC_AHB_RESET

Message ID 20210606103019.2807397-1-mnhagan88@gmail.com
State New
Headers show
Series [v2] net: stmmac: explicitly deassert GMAC_AHB_RESET | expand

Commit Message

Matthew Hagan June 6, 2021, 10:30 a.m. UTC
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

Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>
---
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 4 ++++
 drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++
 include/linux/stmmac.h                                | 1 +
 3 files changed, 12 insertions(+)

Comments

Philipp Zabel June 7, 2021, 9:45 a.m. UTC | #1
On Sun, 2021-06-06 at 11:30 +0100, Matthew Hagan wrote:
> 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

> 

> Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>

> ---

>  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 4 ++++

>  drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++

>  include/linux/stmmac.h                                | 1 +

>  3 files changed, 12 insertions(+)

> 

> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

> index 6d41dd6f9f7a..0d4cb423cbbd 100644

> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

> @@ -6840,6 +6840,10 @@ int stmmac_dvr_probe(struct device *device,

>  			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");

> +


I would make this

	if (ret)
		dev_err(priv->device, "unable to bring out of ahb reset: %pe\n", ERR_PTR(ret));

Also consider asserting the reset again in the remove path. Or is there
a reason not to?

With that addressed,

Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>


regards
Philipp
Matthew Hagan June 8, 2021, 6:57 p.m. UTC | #2
On 07/06/2021 10:45, Philipp Zabel wrote:

> On Sun, 2021-06-06 at 11:30 +0100, Matthew Hagan wrote:

>> 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

>>

>> Signed-off-by: Matthew Hagan <mnhagan88@gmail.com>

>> ---

>>  drivers/net/ethernet/stmicro/stmmac/stmmac_main.c     | 4 ++++

>>  drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | 7 +++++++

>>  include/linux/stmmac.h                                | 1 +

>>  3 files changed, 12 insertions(+)

>>

>> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

>> index 6d41dd6f9f7a..0d4cb423cbbd 100644

>> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

>> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

>> @@ -6840,6 +6840,10 @@ int stmmac_dvr_probe(struct device *device,

>>  			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");

>> +

> I would make this

>

> 	if (ret)

> 		dev_err(priv->device, "unable to bring out of ahb reset: %pe\n", ERR_PTR(ret));


Done.

>

> Also consider asserting the reset again in the remove path. Or is there

> a reason not to?


Don't see any issue doing this. As this is a shared reset, the assert will only occur
when the final GMAC is removed, due to the tracking of deassert_count.

> With that addressed,

>

> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>

>

> regards

> Philipp


Thanks,

Matthew
diff mbox series

Patch

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 6d41dd6f9f7a..0d4cb423cbbd 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -6840,6 +6840,10 @@  int stmmac_dvr_probe(struct device *device,
 			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)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
index 97a1fedcc9ac..a178181f6a24 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
@@ -600,6 +600,13 @@  stmmac_probe_config_dt(struct platform_device *pdev, u8 *mac)
 		goto error_hw_init;
 	}
 
+	plat->stmmac_ahb_rst = devm_reset_control_get_optional_shared(
+							&pdev->dev, "ahb");
+	if (IS_ERR(plat->stmmac_ahb_rst)) {
+		ret = PTR_ERR(plat->stmmac_ahb_rst);
+		goto error_hw_init;
+	}
+
 	return plat;
 
 error_hw_init:
diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h
index e55a4807e3ea..9b6a64f3e3dc 100644
--- a/include/linux/stmmac.h
+++ b/include/linux/stmmac.h
@@ -239,6 +239,7 @@  struct plat_stmmacenet_data {
 	unsigned int mult_fact_100ns;
 	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;