RE: [PATCH v18 06/12] mmc: renesas_sdhi: Add TMIO_MMC_INTERNAL_DIVIDER flag

Biju Das <[email protected]> Tue, 7 Jul 2026 11:49:44 +0000
Newsgroups org.kernel.vger.linux-mmc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-renesas-soc
Message-ID <TY3PR01MB11346F5057FB697FA68024A8F86F02@TY3PR01MB11346.jpnprd01.prod.outlook.com>
Hi Wolfram,

> -----Original Message-----
> From: Biju <[email protected]>
> Sent: 22 June 2026 16:56
> Subject: [PATCH v18 06/12] mmc: renesas_sdhi: Add TMIO_MMC_INTERNAL_DIVIDER flag
> 
> From: Biju Das <[email protected]>
> 
> The RZ/G3L SoC has an internal clock divider active for all modes except HS400. To compensate, the rate
> requested from clk_set_rate() for clk relative to clkh must be doubled in those cases so that the SoC's
> internal /2 divider brings the actual card clock back to the intended rate.
> 
> Introduce a TMIO_MMC_INTERNAL_DIVIDER flag (bit 14) in tmio.h and a divider field in struct renesas_sdhi.
> During probe, when the flag is set and the device tree does not include the mmc-hs400-1_8v property,
> priv->divider is set to 2; otherwise it defaults to 1. The divider is
> applied in renesas_sdhi_clk_update() when computing the rate for
> priv->clk, replacing the previously implicit multiply-by-1.
> 
> No existing platform sets TMIO_MMC_INTERNAL_DIVIDER; this patch introduces the infrastructure only, with
> no functional change for current platforms.
> 
> Signed-off-by: Biju Das <[email protected]>
> ---
> v18:
>  * New patch using flag.
> ---
>  drivers/mmc/host/renesas_sdhi.h      | 2 ++
>  drivers/mmc/host/renesas_sdhi_core.c | 8 +++++++-
>  include/linux/platform_data/tmio.h   | 3 +++
>  3 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h index
> 438b2a7afe76..6f6b41fbe91e 100644
> --- a/drivers/mmc/host/renesas_sdhi.h
> +++ b/drivers/mmc/host/renesas_sdhi.h
> @@ -102,6 +102,8 @@ struct renesas_sdhi {
>  	struct reset_control *rstc;
>  	struct tmio_mmc_host *host;
>  	struct regulator_dev *rdev;
> +
> +	unsigned int divider;
>  };
> 
>  #define host_to_priv(host) \
> diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
> index e9767aa83b00..8890859d0777 100644
> --- a/drivers/mmc/host/renesas_sdhi_core.c
> +++ b/drivers/mmc/host/renesas_sdhi_core.c
> @@ -185,7 +185,7 @@ static unsigned int renesas_sdhi_clk_update(struct tmio_mmc_host *host,
>  	clk_set_rate(ref_clk, best_freq);
> 
>  	if (priv->clkh)
> -		clk_set_rate(priv->clk, best_freq >> clkh_shift);
> +		clk_set_rate(priv->clk, (best_freq >> clkh_shift) * priv->divider);

As sashiko pointer out [1]

priv->divider is not required, if we calculate clkh_shift for the HS400 case(internal 1/2 Divider) and
non-HS400 case

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

Cheers,
Biju

> 
>  	return clk_get_rate(priv->clk);
>  }
> @@ -1231,6 +1231,12 @@ int renesas_sdhi_probe(struct platform_device *pdev,
> 
>  	dev_pm_domain_start(&pdev->dev);
> 
> +	if ((host->pdata->flags & TMIO_MMC_INTERNAL_DIVIDER) &&
> +	    !device_property_read_bool(dev, "mmc-hs400-1_8v"))
> +		priv->divider = 2;
> +	else
> +		priv->divider = 1;
> +
>  	ret = renesas_sdhi_clk_enable(host);
>  	if (ret)
>  		return ret;
> diff --git a/include/linux/platform_data/tmio.h b/include/linux/platform_data/tmio.h
> index 868a21842fa5..6c512e96e192 100644
> --- a/include/linux/platform_data/tmio.h
> +++ b/include/linux/platform_data/tmio.h
> @@ -53,6 +53,9 @@
>  /* Some controllers have tuning delay */
>  #define TMIO_MMC_TUNING_DELAY		BIT(13)
> 
> +/* Some controllers have internal divider */
> +#define TMIO_MMC_INTERNAL_DIVIDER	BIT(14)
> +
>  struct tmio_mmc_data {
>  	void				*chan_priv_tx;
>  	void				*chan_priv_rx;
> --
> 2.43.0