]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mmc: dw_mmc-rockchip: Fix wrong internal phase calculate
authorShawn Lin <shawn.lin@rock-chips.com>
Tue, 4 Nov 2025 03:51:23 +0000 (11:51 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 24 Nov 2025 09:36:01 +0000 (10:36 +0100)
commit 739f04f4a46237536aff07ff223c231da53ed8ce upstream.

ciu clock is 2 times of io clock, but the sample clk used is
derived from io clock provided to the card. So we should use
io clock to calculate the phase.

Fixes: 59903441f5e4 ("mmc: dw_mmc-rockchip: Add internal phase support")
Signed-off-by: Shawn Lin <shawn.lin@rock-chips.com>
Acked-by: Heiko Stuebner <heiko@sntech.de>
Cc: stable@vger.kernel.org
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/mmc/host/dw_mmc-rockchip.c

index f96260fd143b4c80102b0096f1d5760c322aff66..26d86d56424908d32e3d016afb29f1fdc350ab69 100644 (file)
@@ -43,7 +43,7 @@ struct dw_mci_rockchip_priv_data {
  */
 static int rockchip_mmc_get_internal_phase(struct dw_mci *host, bool sample)
 {
-       unsigned long rate = clk_get_rate(host->ciu_clk);
+       unsigned long rate = clk_get_rate(host->ciu_clk) / RK3288_CLKGEN_DIV;
        u32 raw_value;
        u16 degrees;
        u32 delay_num = 0;
@@ -86,7 +86,7 @@ static int rockchip_mmc_get_phase(struct dw_mci *host, bool sample)
 
 static int rockchip_mmc_set_internal_phase(struct dw_mci *host, bool sample, int degrees)
 {
-       unsigned long rate = clk_get_rate(host->ciu_clk);
+       unsigned long rate = clk_get_rate(host->ciu_clk) / RK3288_CLKGEN_DIV;
        u8 nineties, remainder;
        u8 delay_num;
        u32 raw_value;