RE: [PATCH v19 07/12] mmc: renesas_sdhi: Add optional axis/axim reset controls

Biju Das <[email protected]> Fri, 10 Jul 2026 08:50:01 +0000
Newsgroups org.kernel.vger.linux-mmc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-renesas-soc
Message-ID <TY3PR01MB11346721264D8D0454110707286FD2@TY3PR01MB11346.jpnprd01.prod.outlook.com>
Hi All,

> -----Original Message-----
> From: Biju <[email protected]>
> Sent: 09 July 2026 20:29
> Subject: [PATCH v19 07/12] mmc: renesas_sdhi: Add optional axis/axim reset controls
> 
> From: Biju Das <[email protected]>
> 
> The RZ/G3L SoC has axis/axim resets compared to other SoCs.
> 
> Add two optional reset controls, rstc_axis and rstc_axim, to the renesas_sdhi struct. Both are acquired
> at probe time using
> devm_reset_control_get_optional_exclusive_deasserted() with the "axis" and "axim" reset names
> respectively.
> 
> Include them alongside the existing rstc in bulk reset/assert/deassert
> operations: triggered together in renesas_sdhi_reset(), and managed via
> reset_control_bulk_assert/deassert() in the suspend and resume paths, replacing the previous single-
> control calls.
> 
> Being optional, these resets are a no-op on platforms that do not provide them, so existing behaviour is
> preserved.
> 
> Signed-off-by: Biju Das <[email protected]>
> ---
> V18->v19:
>  * No change.
> v17->v18:
>  * Fixed ordering of reset in renesas_sdhi_reset().
> v1->v17:
>  * No change.
> ---
>  drivers/mmc/host/renesas_sdhi.h      |  2 ++
>  drivers/mmc/host/renesas_sdhi_core.c | 26 +++++++++++++++++++++++---
>  2 files changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h index
> 438b2a7afe76..d46598190004 100644
> --- a/drivers/mmc/host/renesas_sdhi.h
> +++ b/drivers/mmc/host/renesas_sdhi.h
> @@ -100,6 +100,8 @@ struct renesas_sdhi {
>  	unsigned int tap_set;
> 
>  	struct reset_control *rstc;
> +	struct reset_control *rstc_axis;
> +	struct reset_control *rstc_axim;
>  	struct tmio_mmc_host *host;
>  	struct regulator_dev *rdev;
>  };
> diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
> index b6bba03316fe..6ec8dc96b581 100644
> --- a/drivers/mmc/host/renesas_sdhi_core.c
> +++ b/drivers/mmc/host/renesas_sdhi_core.c
> @@ -623,6 +623,8 @@ static void renesas_sdhi_reset(struct tmio_mmc_host *host, bool preserve)
>  				sd_status = sd_ctrl_read32(host, CTL_SD_STATUS);
> 
>  			reset_control_reset(priv->rstc);
> +			reset_control_reset(priv->rstc_axim);
> +			reset_control_reset(priv->rstc_axis);
>  			/* Unknown why but without polling reset status, it will hang */
>  			read_poll_timeout(reset_control_status, ret, ret == 0, 1, 100,
>  					  false, priv->rstc);
> @@ -1137,6 +1139,14 @@ int renesas_sdhi_probe(struct platform_device *pdev,
>  	if (IS_ERR(priv->rstc))
>  		return PTR_ERR(priv->rstc);
> 
> +	priv->rstc_axim = devm_reset_control_get_optional_exclusive_deasserted(&pdev->dev, "axim");
> +	if (IS_ERR(priv->rstc_axim))
> +		return PTR_ERR(priv->rstc_axim);
> +
> +	priv->rstc_axis = devm_reset_control_get_optional_exclusive_deasserted(&pdev->dev, "axis");
> +	if (IS_ERR(priv->rstc_axis))
> +		return PTR_ERR(priv->rstc_axis);
> +
>  	priv->pinctrl = devm_pinctrl_get(&pdev->dev);
>  	if (!IS_ERR(priv->pinctrl)) {
>  		priv->pins_default = pinctrl_lookup_state(priv->pinctrl,
> @@ -1363,13 +1373,18 @@ int renesas_sdhi_suspend(struct device *dev)  {
>  	struct tmio_mmc_host *host = dev_get_drvdata(dev);
>  	struct renesas_sdhi *priv = host_to_priv(host);
> +	struct reset_control_bulk_data resets[] = {
> +		{ .rstc = priv->rstc },
> +		{ .rstc = priv->rstc_axim },
> +		{ .rstc = priv->rstc_axis },
> +	};
>  	int ret;
> 
>  	ret = pm_runtime_force_suspend(dev);
>  	if (ret)
>  		return ret;
> 
> -	ret = reset_control_assert(priv->rstc);
> +	ret = reset_control_bulk_assert(ARRAY_SIZE(resets), resets);
>  	if (ret)
>  		pm_runtime_force_resume(dev);
> 
> @@ -1381,15 +1396,20 @@ int renesas_sdhi_resume(struct device *dev)  {
>  	struct tmio_mmc_host *host = dev_get_drvdata(dev);
>  	struct renesas_sdhi *priv = host_to_priv(host);
> +	struct reset_control_bulk_data resets[] = {
> +		{ .rstc = priv->rstc },
> +		{ .rstc = priv->rstc_axim },
> +		{ .rstc = priv->rstc_axis },
> +	};
>  	int ret;
> 
> -	ret = reset_control_deassert(priv->rstc);
> +	ret = reset_control_bulk_deassert(ARRAY_SIZE(resets), resets);

I will fix the reordering for resets as mentioned in [1]

[1] https://sashiko.dev/#/patchset/20260709192916.630794-1-biju.das.jz%40bp.renesas.com

Cheers,
Biju

>  	if (ret)
>  		return ret;
> 
>  	ret = pm_runtime_force_resume(dev);
>  	if (ret)
> -		reset_control_assert(priv->rstc);
> +		reset_control_bulk_assert(ARRAY_SIZE(resets), resets);
> 
>  	return ret;
>  }
> --
> 2.43.0