* [PATCH] mmc: dw_mmc-rockchip: Add missing private data for very old controllers
@ 2026-05-22 18:43 Heiko Stuebner
2026-05-25 1:44 ` Shawn Lin
2026-05-29 14:45 ` Ulf Hansson
0 siblings, 2 replies; 3+ messages in thread
From: Heiko Stuebner @ 2026-05-22 18:43 UTC (permalink / raw)
To: ulfh, shawn.lin, jh80.chung
Cc: heiko, linux-mmc, linux-arm-kernel, linux-rockchip, linux-kernel,
stable
The really old controllers (rk2928, rk3066, rk3188) do not support UHS
speeds at all, and thus never handled phase data.
For that reason it never had a parse_dt callback and no driver private
data at all.
Commit ff6f0286c896 ("mmc: dw_mmc-rockchip: Add memory clock auto-gating
support") makes the private data sort of mandatory, because the init
function checks whether phases are configured internally or through the
clock controller.
This results in the old SoCs then experiencing NULL-pointer dereferences
when they try to access that private-data struct.
While we could have if (priv) conditionals in all places, it's way less
cluttery to just give the old types their private-data struct.
Fixes: ff6f0286c896 ("mmc: dw_mmc-rockchip: Add memory clock auto-gating support")
Cc: stable@vger•kernel.org
Signed-off-by: Heiko Stuebner <heiko@sntech•de>
---
drivers/mmc/host/dw_mmc-rockchip.c | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
index c6eece4ec3fd..75c82ff20f17 100644
--- a/drivers/mmc/host/dw_mmc-rockchip.c
+++ b/drivers/mmc/host/dw_mmc-rockchip.c
@@ -441,6 +441,22 @@ static int dw_mci_common_parse_dt(struct dw_mci *host)
return 0;
}
+static int dw_mci_rk2928_parse_dt(struct dw_mci *host)
+{
+ struct dw_mci_rockchip_priv_data *priv;
+ int err;
+
+ err = dw_mci_common_parse_dt(host);
+ if (err)
+ return err;
+
+ priv = host->priv;
+
+ priv->internal_phase = false;
+
+ return 0;
+}
+
static int dw_mci_rk3288_parse_dt(struct dw_mci *host)
{
struct dw_mci_rockchip_priv_data *priv;
@@ -514,6 +530,7 @@ static int dw_mci_rockchip_init(struct dw_mci *host)
static const struct dw_mci_drv_data rk2928_drv_data = {
.init = dw_mci_rockchip_init,
+ .parse_dt = dw_mci_rk2928_parse_dt,
};
static const struct dw_mci_drv_data rk3288_drv_data = {
--
2.47.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] mmc: dw_mmc-rockchip: Add missing private data for very old controllers
2026-05-22 18:43 [PATCH] mmc: dw_mmc-rockchip: Add missing private data for very old controllers Heiko Stuebner
@ 2026-05-25 1:44 ` Shawn Lin
2026-05-29 14:45 ` Ulf Hansson
1 sibling, 0 replies; 3+ messages in thread
From: Shawn Lin @ 2026-05-25 1:44 UTC (permalink / raw)
To: Heiko Stuebner, ulfh, jh80.chung
Cc: shawn.lin, linux-mmc, linux-arm-kernel, linux-rockchip,
linux-kernel, stable
在 2026/05/23 星期六 2:43, Heiko Stuebner 写道:
> The really old controllers (rk2928, rk3066, rk3188) do not support UHS
> speeds at all, and thus never handled phase data.
>
> For that reason it never had a parse_dt callback and no driver private
> data at all.
>
> Commit ff6f0286c896 ("mmc: dw_mmc-rockchip: Add memory clock auto-gating
> support") makes the private data sort of mandatory, because the init
> function checks whether phases are configured internally or through the
> clock controller.
>
> This results in the old SoCs then experiencing NULL-pointer dereferences
> when they try to access that private-data struct.
>
> While we could have if (priv) conditionals in all places, it's way less
> cluttery to just give the old types their private-data struct.
Thanks for fixing this.
Acked-by: Shawn Lin <shawn.lin@rock-chips•com>
>
> Fixes: ff6f0286c896 ("mmc: dw_mmc-rockchip: Add memory clock auto-gating support")
> Cc: stable@vger•kernel.org
> Signed-off-by: Heiko Stuebner <heiko@sntech•de>
> ---
> drivers/mmc/host/dw_mmc-rockchip.c | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
> index c6eece4ec3fd..75c82ff20f17 100644
> --- a/drivers/mmc/host/dw_mmc-rockchip.c
> +++ b/drivers/mmc/host/dw_mmc-rockchip.c
> @@ -441,6 +441,22 @@ static int dw_mci_common_parse_dt(struct dw_mci *host)
> return 0;
> }
>
> +static int dw_mci_rk2928_parse_dt(struct dw_mci *host)
> +{
> + struct dw_mci_rockchip_priv_data *priv;
> + int err;
> +
> + err = dw_mci_common_parse_dt(host);
> + if (err)
> + return err;
> +
> + priv = host->priv;
> +
> + priv->internal_phase = false;
> +
> + return 0;
> +}
> +
> static int dw_mci_rk3288_parse_dt(struct dw_mci *host)
> {
> struct dw_mci_rockchip_priv_data *priv;
> @@ -514,6 +530,7 @@ static int dw_mci_rockchip_init(struct dw_mci *host)
>
> static const struct dw_mci_drv_data rk2928_drv_data = {
> .init = dw_mci_rockchip_init,
> + .parse_dt = dw_mci_rk2928_parse_dt,
> };
>
> static const struct dw_mci_drv_data rk3288_drv_data = {
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] mmc: dw_mmc-rockchip: Add missing private data for very old controllers
2026-05-22 18:43 [PATCH] mmc: dw_mmc-rockchip: Add missing private data for very old controllers Heiko Stuebner
2026-05-25 1:44 ` Shawn Lin
@ 2026-05-29 14:45 ` Ulf Hansson
1 sibling, 0 replies; 3+ messages in thread
From: Ulf Hansson @ 2026-05-29 14:45 UTC (permalink / raw)
To: Heiko Stuebner
Cc: ulfh, shawn.lin, jh80.chung, linux-mmc, linux-arm-kernel,
linux-rockchip, linux-kernel, stable
On Fri, May 22, 2026 at 8:43 PM Heiko Stuebner <heiko@sntech•de> wrote:
>
> The really old controllers (rk2928, rk3066, rk3188) do not support UHS
> speeds at all, and thus never handled phase data.
>
> For that reason it never had a parse_dt callback and no driver private
> data at all.
>
> Commit ff6f0286c896 ("mmc: dw_mmc-rockchip: Add memory clock auto-gating
> support") makes the private data sort of mandatory, because the init
> function checks whether phases are configured internally or through the
> clock controller.
>
> This results in the old SoCs then experiencing NULL-pointer dereferences
> when they try to access that private-data struct.
>
> While we could have if (priv) conditionals in all places, it's way less
> cluttery to just give the old types their private-data struct.
>
> Fixes: ff6f0286c896 ("mmc: dw_mmc-rockchip: Add memory clock auto-gating support")
> Cc: stable@vger•kernel.org
> Signed-off-by: Heiko Stuebner <heiko@sntech•de>
Applied for fixes, thanks!
Kind regards
Uffe
> ---
> drivers/mmc/host/dw_mmc-rockchip.c | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
>
> diff --git a/drivers/mmc/host/dw_mmc-rockchip.c b/drivers/mmc/host/dw_mmc-rockchip.c
> index c6eece4ec3fd..75c82ff20f17 100644
> --- a/drivers/mmc/host/dw_mmc-rockchip.c
> +++ b/drivers/mmc/host/dw_mmc-rockchip.c
> @@ -441,6 +441,22 @@ static int dw_mci_common_parse_dt(struct dw_mci *host)
> return 0;
> }
>
> +static int dw_mci_rk2928_parse_dt(struct dw_mci *host)
> +{
> + struct dw_mci_rockchip_priv_data *priv;
> + int err;
> +
> + err = dw_mci_common_parse_dt(host);
> + if (err)
> + return err;
> +
> + priv = host->priv;
> +
> + priv->internal_phase = false;
> +
> + return 0;
> +}
> +
> static int dw_mci_rk3288_parse_dt(struct dw_mci *host)
> {
> struct dw_mci_rockchip_priv_data *priv;
> @@ -514,6 +530,7 @@ static int dw_mci_rockchip_init(struct dw_mci *host)
>
> static const struct dw_mci_drv_data rk2928_drv_data = {
> .init = dw_mci_rockchip_init,
> + .parse_dt = dw_mci_rk2928_parse_dt,
> };
>
> static const struct dw_mci_drv_data rk3288_drv_data = {
> --
> 2.47.3
>
>
> _______________________________________________
> Linux-rockchip mailing list
> Linux-rockchip@lists•infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-rockchip
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-05-29 14:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-22 18:43 [PATCH] mmc: dw_mmc-rockchip: Add missing private data for very old controllers Heiko Stuebner
2026-05-25 1:44 ` Shawn Lin
2026-05-29 14:45 ` Ulf Hansson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox