aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/clk/rockchip/clk-mmc-phase.c22
-rw-r--r--drivers/clk/rockchip/clk-rk3228.c2
-rw-r--r--drivers/clk/rockchip/clk-rk3328.c16
-rw-r--r--drivers/clk/rockchip/clk-rk3399.c4
4 files changed, 29 insertions, 15 deletions
diff --git a/drivers/clk/rockchip/clk-mmc-phase.c b/drivers/clk/rockchip/clk-mmc-phase.c
index dc4c227732bd..026a26bb702d 100644
--- a/drivers/clk/rockchip/clk-mmc-phase.c
+++ b/drivers/clk/rockchip/clk-mmc-phase.c
@@ -170,18 +170,30 @@ static int rockchip_mmc_clk_rate_notify(struct notifier_block *nb,
170 unsigned long event, void *data) 170 unsigned long event, void *data)
171{ 171{
172 struct rockchip_mmc_clock *mmc_clock = to_rockchip_mmc_clock(nb); 172 struct rockchip_mmc_clock *mmc_clock = to_rockchip_mmc_clock(nb);
173 struct clk_notifier_data *ndata = data;
173 174
174 /* 175 /*
175 * rockchip_mmc_clk is mostly used by mmc controllers to sample 176 * rockchip_mmc_clk is mostly used by mmc controllers to sample
176 * the intput data, which expects the fixed phase after the tuning 177 * the intput data, which expects the fixed phase after the tuning
177 * process. However if the clock rate is changed, the phase is stale 178 * process. However if the clock rate is changed, the phase is stale
178 * and may break the data sampling. So here we try to restore the phase 179 * and may break the data sampling. So here we try to restore the phase
179 * for that case. 180 * for that case, except that
181 * (1) cached_phase is invaild since we inevitably cached it when the
182 * clock provider be reparented from orphan to its real parent in the
183 * first place. Otherwise we may mess up the initialization of MMC cards
184 * since we only set the default sample phase and drive phase later on.
185 * (2) the new coming rate is higher than the older one since mmc driver
186 * set the max-frequency to match the boards' ability but we can't go
187 * over the heads of that, otherwise the tests smoke out the issue.
180 */ 188 */
189 if (ndata->old_rate <= ndata->new_rate)
190 return NOTIFY_DONE;
191
181 if (event == PRE_RATE_CHANGE) 192 if (event == PRE_RATE_CHANGE)
182 mmc_clock->cached_phase = 193 mmc_clock->cached_phase =
183 rockchip_mmc_get_phase(&mmc_clock->hw); 194 rockchip_mmc_get_phase(&mmc_clock->hw);
184 else if (event == POST_RATE_CHANGE) 195 else if (mmc_clock->cached_phase != -EINVAL &&
196 event == POST_RATE_CHANGE)
185 rockchip_mmc_set_phase(&mmc_clock->hw, mmc_clock->cached_phase); 197 rockchip_mmc_set_phase(&mmc_clock->hw, mmc_clock->cached_phase);
186 198
187 return NOTIFY_DONE; 199 return NOTIFY_DONE;
@@ -211,8 +223,10 @@ struct clk *rockchip_clk_register_mmc(const char *name,
211 mmc_clock->shift = shift; 223 mmc_clock->shift = shift;
212 224
213 clk = clk_register(NULL, &mmc_clock->hw); 225 clk = clk_register(NULL, &mmc_clock->hw);
214 if (IS_ERR(clk)) 226 if (IS_ERR(clk)) {
227 ret = PTR_ERR(clk);
215 goto err_register; 228 goto err_register;
229 }
216 230
217 mmc_clock->clk_rate_change_nb.notifier_call = 231 mmc_clock->clk_rate_change_nb.notifier_call =
218 &rockchip_mmc_clk_rate_notify; 232 &rockchip_mmc_clk_rate_notify;
@@ -225,5 +239,5 @@ err_notifier:
225 clk_unregister(clk); 239 clk_unregister(clk);
226err_register: 240err_register:
227 kfree(mmc_clock); 241 kfree(mmc_clock);
228 return clk; 242 return ERR_PTR(ret);
229} 243}
diff --git a/drivers/clk/rockchip/clk-rk3228.c b/drivers/clk/rockchip/clk-rk3228.c
index 11e7f2d1c054..7af48184b022 100644
--- a/drivers/clk/rockchip/clk-rk3228.c
+++ b/drivers/clk/rockchip/clk-rk3228.c
@@ -387,7 +387,7 @@ static struct rockchip_clk_branch rk3228_clk_branches[] __initdata = {
387 RK2928_CLKSEL_CON(23), 5, 2, MFLAGS, 0, 6, DFLAGS, 387 RK2928_CLKSEL_CON(23), 5, 2, MFLAGS, 0, 6, DFLAGS,
388 RK2928_CLKGATE_CON(2), 15, GFLAGS), 388 RK2928_CLKGATE_CON(2), 15, GFLAGS),
389 389
390 COMPOSITE(SCLK_SDMMC, "sclk_sdmmc0", mux_mmc_src_p, 0, 390 COMPOSITE(SCLK_SDMMC, "sclk_sdmmc", mux_mmc_src_p, 0,
391 RK2928_CLKSEL_CON(11), 8, 2, MFLAGS, 0, 8, DFLAGS, 391 RK2928_CLKSEL_CON(11), 8, 2, MFLAGS, 0, 8, DFLAGS,
392 RK2928_CLKGATE_CON(2), 11, GFLAGS), 392 RK2928_CLKGATE_CON(2), 11, GFLAGS),
393 393
diff --git a/drivers/clk/rockchip/clk-rk3328.c b/drivers/clk/rockchip/clk-rk3328.c
index f680b421b6d5..252366a5231f 100644
--- a/drivers/clk/rockchip/clk-rk3328.c
+++ b/drivers/clk/rockchip/clk-rk3328.c
@@ -810,24 +810,24 @@ static struct rockchip_clk_branch rk3328_clk_branches[] __initdata = {
810 GATE(0, "pclk_phy_niu", "pclk_phy_pre", 0, RK3328_CLKGATE_CON(15), 15, GFLAGS), 810 GATE(0, "pclk_phy_niu", "pclk_phy_pre", 0, RK3328_CLKGATE_CON(15), 15, GFLAGS),
811 811
812 /* PD_MMC */ 812 /* PD_MMC */
813 MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "sclk_sdmmc", 813 MMC(SCLK_SDMMC_DRV, "sdmmc_drv", "clk_sdmmc",
814 RK3328_SDMMC_CON0, 1), 814 RK3328_SDMMC_CON0, 1),
815 MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "sclk_sdmmc", 815 MMC(SCLK_SDMMC_SAMPLE, "sdmmc_sample", "clk_sdmmc",
816 RK3328_SDMMC_CON1, 1), 816 RK3328_SDMMC_CON1, 1),
817 817
818 MMC(SCLK_SDIO_DRV, "sdio_drv", "sclk_sdio", 818 MMC(SCLK_SDIO_DRV, "sdio_drv", "clk_sdio",
819 RK3328_SDIO_CON0, 1), 819 RK3328_SDIO_CON0, 1),
820 MMC(SCLK_SDIO_SAMPLE, "sdio_sample", "sclk_sdio", 820 MMC(SCLK_SDIO_SAMPLE, "sdio_sample", "clk_sdio",
821 RK3328_SDIO_CON1, 1), 821 RK3328_SDIO_CON1, 1),
822 822
823 MMC(SCLK_EMMC_DRV, "emmc_drv", "sclk_emmc", 823 MMC(SCLK_EMMC_DRV, "emmc_drv", "clk_emmc",
824 RK3328_EMMC_CON0, 1), 824 RK3328_EMMC_CON0, 1),
825 MMC(SCLK_EMMC_SAMPLE, "emmc_sample", "sclk_emmc", 825 MMC(SCLK_EMMC_SAMPLE, "emmc_sample", "clk_emmc",
826 RK3328_EMMC_CON1, 1), 826 RK3328_EMMC_CON1, 1),
827 827
828 MMC(SCLK_SDMMC_EXT_DRV, "sdmmc_ext_drv", "sclk_sdmmc_ext", 828 MMC(SCLK_SDMMC_EXT_DRV, "sdmmc_ext_drv", "clk_sdmmc_ext",
829 RK3328_SDMMC_EXT_CON0, 1), 829 RK3328_SDMMC_EXT_CON0, 1),
830 MMC(SCLK_SDMMC_EXT_SAMPLE, "sdmmc_ext_sample", "sclk_sdmmc_ext", 830 MMC(SCLK_SDMMC_EXT_SAMPLE, "sdmmc_ext_sample", "clk_sdmmc_ext",
831 RK3328_SDMMC_EXT_CON1, 1), 831 RK3328_SDMMC_EXT_CON1, 1),
832}; 832};
833 833
diff --git a/drivers/clk/rockchip/clk-rk3399.c b/drivers/clk/rockchip/clk-rk3399.c
index 3e57c6eef93d..bca10d618f0a 100644
--- a/drivers/clk/rockchip/clk-rk3399.c
+++ b/drivers/clk/rockchip/clk-rk3399.c
@@ -671,7 +671,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
671 RK3399_CLKGATE_CON(9), 7, GFLAGS, 671 RK3399_CLKGATE_CON(9), 7, GFLAGS,
672 &rk3399_uart3_fracmux), 672 &rk3399_uart3_fracmux),
673 673
674 COMPOSITE(0, "pclk_ddr", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED, 674 COMPOSITE(PCLK_DDR, "pclk_ddr", mux_pll_src_cpll_gpll_p, CLK_IGNORE_UNUSED,
675 RK3399_CLKSEL_CON(6), 15, 1, MFLAGS, 8, 5, DFLAGS, 675 RK3399_CLKSEL_CON(6), 15, 1, MFLAGS, 8, 5, DFLAGS,
676 RK3399_CLKGATE_CON(3), 4, GFLAGS), 676 RK3399_CLKGATE_CON(3), 4, GFLAGS),
677 677
@@ -887,7 +887,7 @@ static struct rockchip_clk_branch rk3399_clk_branches[] __initdata = {
887 RK3399_CLKGATE_CON(31), 8, GFLAGS), 887 RK3399_CLKGATE_CON(31), 8, GFLAGS),
888 888
889 /* sdio & sdmmc */ 889 /* sdio & sdmmc */
890 COMPOSITE(0, "hclk_sd", mux_pll_src_cpll_gpll_p, 0, 890 COMPOSITE(HCLK_SD, "hclk_sd", mux_pll_src_cpll_gpll_p, 0,
891 RK3399_CLKSEL_CON(13), 15, 1, MFLAGS, 8, 5, DFLAGS, 891 RK3399_CLKSEL_CON(13), 15, 1, MFLAGS, 8, 5, DFLAGS,
892 RK3399_CLKGATE_CON(12), 13, GFLAGS), 892 RK3399_CLKGATE_CON(12), 13, GFLAGS),
893 GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_sd", 0, 893 GATE(HCLK_SDMMC, "hclk_sdmmc", "hclk_sd", 0,