[PATCH 06/17] mmc: renesas_sdhi: Introduce renesas_sdhi_hw_info to abstract clock mask
From: Biju
Date: Sat May 30 2026 - 12:11:54 EST
From: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
The RZ/G3L SoC has 11 divider bits and requires a different clock mask in
renesas_sdhi_set_clock().
Add a new renesas_sdhi_hw_info struct to hold hardware-specific
parameters, starting with clk_mask. This replaces the hardcoded constant
in renesas_sdhi_set_clock() with a value sourced from the per-device
hw_info, and widens the clk variable from u32 to u64 accordingly, as
clk_mask for RZ/G3L exceeds 32 bits.
Wire hw_info through renesas_sdhi_of_data_with_quirks (internalDMAC path)
and a new renesas_sdhi_of_data_with_info wrapper (sysDMAC path), and plumb
it into renesas_sdhi_probe() so it is stored in the per-instance
renesas_sdhi struct.
All existing users are assigned sdhi_hw_info_generic, preserving current
behaviour. No functional change.
Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
---
drivers/mmc/host/renesas_sdhi.h | 12 ++++
drivers/mmc/host/renesas_sdhi_core.c | 7 +-
drivers/mmc/host/renesas_sdhi_internal_dmac.c | 16 ++++-
drivers/mmc/host/renesas_sdhi_sys_dmac.c | 66 ++++++++++++++-----
4 files changed, 81 insertions(+), 20 deletions(-)
diff --git a/drivers/mmc/host/renesas_sdhi.h b/drivers/mmc/host/renesas_sdhi.h
index 09bf9b24a8c3..a7fc525b7218 100644
--- a/drivers/mmc/host/renesas_sdhi.h
+++ b/drivers/mmc/host/renesas_sdhi.h
@@ -41,6 +41,15 @@ struct renesas_sdhi_of_data {
#define SDHI_CALIB_TABLE_MAX 32
+struct renesas_sdhi_hw_info {
+ u64 clk_mask;
+};
+
+struct renesas_sdhi_of_data_with_info {
+ const struct renesas_sdhi_of_data *of_data;
+ const struct renesas_sdhi_hw_info *info;
+};
+
#define sdhi_has_quirk(p, q) ((p)->quirks && (p)->quirks->q)
struct renesas_sdhi_quirks {
@@ -57,6 +66,7 @@ struct renesas_sdhi_quirks {
struct renesas_sdhi_of_data_with_quirks {
const struct renesas_sdhi_of_data *of_data;
const struct renesas_sdhi_quirks *quirks;
+ const struct renesas_sdhi_hw_info *info;
};
/* We want both end_flags to be set before we mark DMA as finished */
@@ -79,6 +89,7 @@ struct renesas_sdhi {
struct tmio_mmc_data mmc_data;
struct renesas_sdhi_dma dma_priv;
const struct renesas_sdhi_quirks *quirks;
+ const struct renesas_sdhi_hw_info *info;
struct pinctrl *pinctrl;
struct pinctrl_state *pins_default, *pins_uhs;
void __iomem *scc_ctl;
@@ -106,6 +117,7 @@ struct renesas_sdhi {
int renesas_sdhi_probe(struct platform_device *pdev,
const struct tmio_mmc_dma_ops *dma_ops,
const struct renesas_sdhi_of_data *of_data,
+ const struct renesas_sdhi_hw_info *info,
const struct renesas_sdhi_quirks *quirks);
void renesas_sdhi_remove(struct platform_device *pdev);
int renesas_sdhi_suspend(struct device *dev);
diff --git a/drivers/mmc/host/renesas_sdhi_core.c b/drivers/mmc/host/renesas_sdhi_core.c
index f9ec78d699f4..2ff40950f209 100644
--- a/drivers/mmc/host/renesas_sdhi_core.c
+++ b/drivers/mmc/host/renesas_sdhi_core.c
@@ -193,8 +193,9 @@ static unsigned int renesas_sdhi_clk_update(struct tmio_mmc_host *host,
static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
unsigned int new_clock)
{
+ struct renesas_sdhi *priv = host_to_priv(host);
unsigned int clk_margin;
- u32 clk = 0, clock;
+ u64 clk = 0, clock;
sd_ctrl_write16(host, CTL_SD_CARD_CLK_CTL, ~CLK_CTL_SCLKEN &
sd_ctrl_read16(host, CTL_SD_CARD_CLK_CTL));
@@ -213,7 +214,7 @@ static void renesas_sdhi_set_clock(struct tmio_mmc_host *host,
* provided for actual_clock in renesas_sdhi_clk_update().
*/
clk_margin = new_clock >> 10;
- for (clk = 0x80000080; new_clock + clk_margin >= (clock << 1); clk >>= 1)
+ for (clk = priv->info->clk_mask; new_clock + clk_margin >= (clock << 1); clk >>= 1)
clock <<= 1;
/* 1/1 clock is option */
@@ -1055,6 +1056,7 @@ static const struct regulator_desc renesas_sdhi_vqmmc_regulator = {
int renesas_sdhi_probe(struct platform_device *pdev,
const struct tmio_mmc_dma_ops *dma_ops,
const struct renesas_sdhi_of_data *of_data,
+ const struct renesas_sdhi_hw_info *info,
const struct renesas_sdhi_quirks *quirks)
{
struct tmio_mmc_data *mmd = pdev->dev.platform_data;
@@ -1079,6 +1081,7 @@ int renesas_sdhi_probe(struct platform_device *pdev,
if (!priv)
return -ENOMEM;
+ priv->info = info;
priv->quirks = quirks;
mmc_data = &priv->mmc_data;
dma_priv = &priv->dma_priv;
diff --git a/drivers/mmc/host/renesas_sdhi_internal_dmac.c b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
index 08cf1604ef1d..512ed70b3779 100644
--- a/drivers/mmc/host/renesas_sdhi_internal_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_internal_dmac.c
@@ -232,48 +232,61 @@ static const struct soc_device_attribute sdhi_quirks_match[] = {
{ /* Sentinel. */ }
};
+static const struct renesas_sdhi_hw_info sdhi_hw_info_generic = {
+ .clk_mask = 0x80000080,
+};
+
static const struct renesas_sdhi_of_data_with_quirks of_r8a7795_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_bad_taps2367,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a77961_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_bad_taps1357,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a77965_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_r8a77965,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a77970_compatible = {
.of_data = &of_data_rcar_gen3_no_sdh_fallback,
.quirks = &sdhi_quirks_nohs400,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_r8a77990_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_r8a77990,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_rzg2l_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_rzg2l,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_rcar_gen3_compatible = {
.of_data = &of_data_rcar_gen3,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_rcar_gen3_nohs400_compatible = {
.of_data = &of_data_rcar_gen3,
.quirks = &sdhi_quirks_nohs400,
+ .info = &sdhi_hw_info_generic,
};
static const struct renesas_sdhi_of_data_with_quirks of_rza2_compatible = {
.of_data = &of_data_rza2,
.quirks = &sdhi_quirks_fixed_addr,
+ .info = &sdhi_hw_info_generic,
};
static const struct of_device_id renesas_sdhi_internal_dmac_of_match[] = {
@@ -599,7 +612,8 @@ static int renesas_sdhi_internal_dmac_probe(struct platform_device *pdev)
dma_set_max_seg_size(dev, 0xffffffff);
return renesas_sdhi_probe(pdev, &renesas_sdhi_internal_dmac_dma_ops,
- of_data_quirks->of_data, quirks);
+ of_data_quirks->of_data, of_data_quirks->info,
+ quirks);
}
static const struct dev_pm_ops renesas_sdhi_internal_dmac_dev_pm_ops = {
diff --git a/drivers/mmc/host/renesas_sdhi_sys_dmac.c b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
index 9215600f03a2..1291970c2810 100644
--- a/drivers/mmc/host/renesas_sdhi_sys_dmac.c
+++ b/drivers/mmc/host/renesas_sdhi_sys_dmac.c
@@ -73,23 +73,51 @@ static const struct renesas_sdhi_of_data of_rcar_gen2_compatible = {
.max_blk_count = UINT_MAX / TMIO_MAX_BLK_SIZE,
};
+static const struct renesas_sdhi_hw_info sdhi_hw_info_generic = {
+ .clk_mask = 0x80000080,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_default_cfg_info = {
+ .of_data = &of_default_cfg,
+ .info = &sdhi_hw_info_generic,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_rz_compatible_info = {
+ .of_data = &of_rz_compatible,
+ .info = &sdhi_hw_info_generic,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_rcar_gen1_compatible_info = {
+ .of_data = &of_rcar_gen1_compatible,
+ .info = &sdhi_hw_info_generic,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_rcar_gen2_compatible_info = {
+ .of_data = &of_rcar_gen2_compatible,
+ .info = &sdhi_hw_info_generic,
+};
+
+static const struct renesas_sdhi_of_data_with_info of_shmobile_info = {
+ .info = &sdhi_hw_info_generic,
+};
+
static const struct of_device_id renesas_sdhi_sys_dmac_of_match[] = {
- { .compatible = "renesas,sdhi-sh73a0", .data = &of_default_cfg, },
- { .compatible = "renesas,sdhi-r8a73a4", .data = &of_default_cfg, },
- { .compatible = "renesas,sdhi-r8a7740", .data = &of_default_cfg, },
- { .compatible = "renesas,sdhi-r7s72100", .data = &of_rz_compatible, },
- { .compatible = "renesas,sdhi-r8a7778", .data = &of_rcar_gen1_compatible, },
- { .compatible = "renesas,sdhi-r8a7779", .data = &of_rcar_gen1_compatible, },
- { .compatible = "renesas,sdhi-r8a7743", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7745", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7790", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7791", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7792", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7793", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-r8a7794", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,rcar-gen1-sdhi", .data = &of_rcar_gen1_compatible, },
- { .compatible = "renesas,rcar-gen2-sdhi", .data = &of_rcar_gen2_compatible, },
- { .compatible = "renesas,sdhi-shmobile" },
+ { .compatible = "renesas,sdhi-sh73a0", .data = &of_default_cfg_info, },
+ { .compatible = "renesas,sdhi-r8a73a4", .data = &of_default_cfg_info, },
+ { .compatible = "renesas,sdhi-r8a7740", .data = &of_default_cfg_info, },
+ { .compatible = "renesas,sdhi-r7s72100", .data = &of_rz_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7778", .data = &of_rcar_gen1_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7779", .data = &of_rcar_gen1_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7743", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7745", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7790", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7791", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7792", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7793", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-r8a7794", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,rcar-gen1-sdhi", .data = &of_rcar_gen1_compatible_info, },
+ { .compatible = "renesas,rcar-gen2-sdhi", .data = &of_rcar_gen2_compatible_info, },
+ { .compatible = "renesas,sdhi-shmobile", .data = &of_shmobile_info, },
{},
};
MODULE_DEVICE_TABLE(of, renesas_sdhi_sys_dmac_of_match);
@@ -452,8 +480,12 @@ static const struct tmio_mmc_dma_ops renesas_sdhi_sys_dmac_dma_ops = {
static int renesas_sdhi_sys_dmac_probe(struct platform_device *pdev)
{
+ const struct renesas_sdhi_of_data_with_info *of_data_info;
+
+ of_data_info = of_device_get_match_data(&pdev->dev);
+
return renesas_sdhi_probe(pdev, &renesas_sdhi_sys_dmac_dma_ops,
- of_device_get_match_data(&pdev->dev), NULL);
+ of_data_info->of_data, of_data_info->info, NULL);
}
static DEFINE_RUNTIME_DEV_PM_OPS(renesas_sdhi_sys_dmac_dev_pm_ops,
--
2.43.0