@@ -262,14 +262,29 @@ static void meson_mmc_post_req(struct mmc_host *mmc, struct mmc_request *mrq,
262262 mmc_get_dma_dir (data ));
263263}
264264
265- static int meson_mmc_clk_set (struct meson_host * host , unsigned long clk_rate )
265+ static bool meson_mmc_timing_is_ddr (struct mmc_ios * ios )
266+ {
267+ if (ios -> timing == MMC_TIMING_MMC_DDR52 ||
268+ ios -> timing == MMC_TIMING_UHS_DDR50 ||
269+ ios -> timing == MMC_TIMING_MMC_HS400 )
270+ return true;
271+
272+ return false;
273+ }
274+
275+ static int meson_mmc_clk_set (struct meson_host * host , struct mmc_ios * ios )
266276{
267277 struct mmc_host * mmc = host -> mmc ;
278+ unsigned long rate = ios -> clock ;
268279 int ret ;
269280 u32 cfg ;
270281
282+ /* DDR modes require higher module clock */
283+ if (meson_mmc_timing_is_ddr (ios ))
284+ rate <<= 1 ;
285+
271286 /* Same request - bail-out */
272- if (host -> req_rate == clk_rate )
287+ if (host -> req_rate == rate )
273288 return 0 ;
274289
275290 /* stop clock */
@@ -278,25 +293,29 @@ static int meson_mmc_clk_set(struct meson_host *host, unsigned long clk_rate)
278293 writel (cfg , host -> regs + SD_EMMC_CFG );
279294 host -> req_rate = 0 ;
280295
281- if (!clk_rate ) {
296+ if (!rate ) {
282297 mmc -> actual_clock = 0 ;
283298 /* return with clock being stopped */
284299 return 0 ;
285300 }
286301
287- ret = clk_set_rate (host -> mmc_clk , clk_rate );
302+ ret = clk_set_rate (host -> mmc_clk , rate );
288303 if (ret ) {
289304 dev_err (host -> dev , "Unable to set cfg_div_clk to %lu. ret=%d\n" ,
290- clk_rate , ret );
305+ rate , ret );
291306 return ret ;
292307 }
293308
294- host -> req_rate = clk_rate ;
309+ host -> req_rate = rate ;
295310 mmc -> actual_clock = clk_get_rate (host -> mmc_clk );
296311
312+ /* We should report the real output frequency of the controller */
313+ if (meson_mmc_timing_is_ddr (ios ))
314+ mmc -> actual_clock >>= 1 ;
315+
297316 dev_dbg (host -> dev , "clk rate: %u Hz\n" , mmc -> actual_clock );
298- if (clk_rate != mmc -> actual_clock )
299- dev_dbg (host -> dev , "requested rate was %lu \n" , clk_rate );
317+ if (ios -> clock != mmc -> actual_clock )
318+ dev_dbg (host -> dev , "requested rate was %u \n" , ios -> clock );
300319
301320 /* (re)start clock */
302321 cfg = readl (host -> regs + SD_EMMC_CFG );
@@ -490,16 +509,14 @@ static void meson_mmc_set_ios(struct mmc_host *mmc, struct mmc_ios *ios)
490509 val |= FIELD_PREP (CFG_BUS_WIDTH_MASK , bus_width );
491510
492511 val &= ~CFG_DDR ;
493- if (ios -> timing == MMC_TIMING_UHS_DDR50 ||
494- ios -> timing == MMC_TIMING_MMC_DDR52 ||
495- ios -> timing == MMC_TIMING_MMC_HS400 )
512+ if (meson_mmc_timing_is_ddr (ios ))
496513 val |= CFG_DDR ;
497514
498515 val &= ~CFG_CHK_DS ;
499516 if (ios -> timing == MMC_TIMING_MMC_HS400 )
500517 val |= CFG_CHK_DS ;
501518
502- err = meson_mmc_clk_set (host , ios -> clock );
519+ err = meson_mmc_clk_set (host , ios );
503520 if (err )
504521 dev_err (host -> dev , "Failed to set clock: %d\n," , err );
505522
0 commit comments