diff options
Diffstat (limited to 'drivers/mmc/host/mtk-sd.c')
| -rw-r--r-- | drivers/mmc/host/mtk-sd.c | 20 |
1 files changed, 8 insertions, 12 deletions
diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index 8b3e15d0f1f0..c877dedf23d2 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c | |||
| @@ -297,7 +297,7 @@ struct msdc_host { | |||
| 297 | u32 mclk; /* mmc subsystem clock frequency */ | 297 | u32 mclk; /* mmc subsystem clock frequency */ |
| 298 | u32 src_clk_freq; /* source clock frequency */ | 298 | u32 src_clk_freq; /* source clock frequency */ |
| 299 | u32 sclk; /* SD/MS bus clock frequency */ | 299 | u32 sclk; /* SD/MS bus clock frequency */ |
| 300 | bool ddr; | 300 | unsigned char timing; |
| 301 | bool vqmmc_enabled; | 301 | bool vqmmc_enabled; |
| 302 | struct msdc_save_para save_para; /* used when gate HCLK */ | 302 | struct msdc_save_para save_para; /* used when gate HCLK */ |
| 303 | }; | 303 | }; |
| @@ -488,7 +488,7 @@ static void msdc_ungate_clock(struct msdc_host *host) | |||
| 488 | cpu_relax(); | 488 | cpu_relax(); |
| 489 | } | 489 | } |
| 490 | 490 | ||
| 491 | static void msdc_set_mclk(struct msdc_host *host, int ddr, u32 hz) | 491 | static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz) |
| 492 | { | 492 | { |
| 493 | u32 mode; | 493 | u32 mode; |
| 494 | u32 flags; | 494 | u32 flags; |
| @@ -504,7 +504,8 @@ static void msdc_set_mclk(struct msdc_host *host, int ddr, u32 hz) | |||
| 504 | 504 | ||
| 505 | flags = readl(host->base + MSDC_INTEN); | 505 | flags = readl(host->base + MSDC_INTEN); |
| 506 | sdr_clr_bits(host->base + MSDC_INTEN, flags); | 506 | sdr_clr_bits(host->base + MSDC_INTEN, flags); |
| 507 | if (ddr) { /* may need to modify later */ | 507 | if (timing == MMC_TIMING_UHS_DDR50 || |
| 508 | timing == MMC_TIMING_MMC_DDR52) { | ||
| 508 | mode = 0x2; /* ddr mode and use divisor */ | 509 | mode = 0x2; /* ddr mode and use divisor */ |
| 509 | if (hz >= (host->src_clk_freq >> 2)) { | 510 | if (hz >= (host->src_clk_freq >> 2)) { |
| 510 | div = 0; /* mean div = 1/4 */ | 511 | div = 0; /* mean div = 1/4 */ |
| @@ -535,12 +536,12 @@ static void msdc_set_mclk(struct msdc_host *host, int ddr, u32 hz) | |||
| 535 | cpu_relax(); | 536 | cpu_relax(); |
| 536 | host->sclk = sclk; | 537 | host->sclk = sclk; |
| 537 | host->mclk = hz; | 538 | host->mclk = hz; |
| 538 | host->ddr = ddr; | 539 | host->timing = timing; |
| 539 | /* need because clk changed. */ | 540 | /* need because clk changed. */ |
| 540 | msdc_set_timeout(host, host->timeout_ns, host->timeout_clks); | 541 | msdc_set_timeout(host, host->timeout_ns, host->timeout_clks); |
| 541 | sdr_set_bits(host->base + MSDC_INTEN, flags); | 542 | sdr_set_bits(host->base + MSDC_INTEN, flags); |
| 542 | 543 | ||
| 543 | dev_dbg(host->dev, "sclk: %d, ddr: %d\n", host->sclk, ddr); | 544 | dev_dbg(host->dev, "sclk: %d, timing: %d\n", host->sclk, timing); |
| 544 | } | 545 | } |
| 545 | 546 | ||
| 546 | static inline u32 msdc_cmd_find_resp(struct msdc_host *host, | 547 | static inline u32 msdc_cmd_find_resp(struct msdc_host *host, |
| @@ -1158,14 +1159,9 @@ static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 1158 | { | 1159 | { |
| 1159 | struct msdc_host *host = mmc_priv(mmc); | 1160 | struct msdc_host *host = mmc_priv(mmc); |
| 1160 | int ret; | 1161 | int ret; |
| 1161 | u32 ddr = 0; | ||
| 1162 | 1162 | ||
| 1163 | pm_runtime_get_sync(host->dev); | 1163 | pm_runtime_get_sync(host->dev); |
| 1164 | 1164 | ||
| 1165 | if (ios->timing == MMC_TIMING_UHS_DDR50 || | ||
| 1166 | ios->timing == MMC_TIMING_MMC_DDR52) | ||
| 1167 | ddr = 1; | ||
| 1168 | |||
| 1169 | msdc_set_buswidth(host, ios->bus_width); | 1165 | msdc_set_buswidth(host, ios->bus_width); |
| 1170 | 1166 | ||
| 1171 | /* Suspend/Resume will do power off/on */ | 1167 | /* Suspend/Resume will do power off/on */ |
| @@ -1202,8 +1198,8 @@ static void msdc_ops_set_ios(struct mmc_host *mmc, struct mmc_ios *ios) | |||
| 1202 | break; | 1198 | break; |
| 1203 | } | 1199 | } |
| 1204 | 1200 | ||
| 1205 | if (host->mclk != ios->clock || host->ddr != ddr) | 1201 | if (host->mclk != ios->clock || host->timing != ios->timing) |
| 1206 | msdc_set_mclk(host, ddr, ios->clock); | 1202 | msdc_set_mclk(host, ios->timing, ios->clock); |
| 1207 | 1203 | ||
| 1208 | end: | 1204 | end: |
| 1209 | pm_runtime_mark_last_busy(host->dev); | 1205 | pm_runtime_mark_last_busy(host->dev); |
