[PATCH] mmc: sunxi: Fix clock rate passed to sunxi_mmc_clk_set_phase
Ulf Hansson
ulf.hansson at linaro.org
Mon Aug 21 05:33:42 PDT 2017
On 10 August 2017 at 05:29, Chen-Yu Tsai <wens at csie.org> wrote:
> sunxi_mmc_clk_set_phase expects the actual card clock rate to be passed
> to it. When the internal divider code was reworked in commit 9a639c6073d3
> ("mmc: sunxi: Support MMC DDR52 transfer mode with new timing mode"),
> this requirement was missed, and the module clock rate was passed in
> instead. This broke 8 bit DDR MMC on old controllers, as the module
> clock rate is double the card clock rate, for which we have no valid
> delay settings.
>
> Fix this by applying the internal divider to the clock rate right after
> we configure it in hardware.
>
> Fixes: 9a639c6073d3 ("mmc: sunxi: Support MMC DDR52 transfer mode with
> new timing mode")
> Signed-off-by: Chen-Yu Tsai <wens at csie.org>
Thanks, applied for next!
Kind regards
Uffe
> ---
>
> Sorry for all the regressions the A83T MMC series has caused.
> I only caught this while testing some other patches on the H3.
> I really hope this is the last one.
>
> ---
> drivers/mmc/host/sunxi-mmc.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mmc/host/sunxi-mmc.c b/drivers/mmc/host/sunxi-mmc.c
> index 6c7eb859ace1..da5f46a14497 100644
> --- a/drivers/mmc/host/sunxi-mmc.c
> +++ b/drivers/mmc/host/sunxi-mmc.c
> @@ -821,6 +821,9 @@ static int sunxi_mmc_clk_set_rate(struct sunxi_mmc_host *host,
> rval |= div - 1;
> mmc_writel(host, REG_CLKCR, rval);
>
> + /* update card clock rate to account for internal divider */
> + rate /= div;
> +
> if (host->use_new_timings) {
> /* Don't touch the delay bits */
> rval = mmc_readl(host, REG_SD_NTSR);
> @@ -828,6 +831,7 @@ static int sunxi_mmc_clk_set_rate(struct sunxi_mmc_host *host,
> mmc_writel(host, REG_SD_NTSR, rval);
> }
>
> + /* sunxi_mmc_clk_set_phase expects the actual card clock rate */
> ret = sunxi_mmc_clk_set_phase(host, ios, rate);
> if (ret)
> return ret;
> @@ -849,7 +853,7 @@ static int sunxi_mmc_clk_set_rate(struct sunxi_mmc_host *host,
> return ret;
>
> /* And we just enabled our clock back */
> - mmc->actual_clock = rate / div;
> + mmc->actual_clock = rate;
>
> return 0;
> }
> --
> 2.13.3
>
More information about the linux-arm-kernel
mailing list