aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephen Boyd <sboyd@kernel.org>2018-04-05 16:28:16 -0400
committerStephen Boyd <sboyd@kernel.org>2018-04-05 16:28:16 -0400
commitf6ae7c36e69f375220cb6e3de04df211258a2b7c (patch)
treefc8de3c6bdb7aedf406d734356be729f0161b4f5
parented0df3ce9e7591b91927879f5808d055d41dfcc8 (diff)
parent9dc486fdf6cc0d7f635954810ab119c5db2cbb60 (diff)
Merge tag 'v4.17-rockchip-clk-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip into clk-rockchip
Pull more Rockchip clk driver updates from Heiko Stuebner: Some more fixes for Rockchip clocks mainly resulting from the changes in phase-handling. Which revealed some parent issues on rk3228 and rk3328 as well as additional issue in how handle phase restoration. And to top it off two assignments of already existing clock ids for rk3399. * tag 'v4.17-rockchip-clk-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mmind/linux-rockchip: clk: rockchip: assign correct id for pclk_ddr and hclk_sd in rk3399 clk: rockchip: Fix error return in phase clock registration clk: rockchip: Correct the behaviour of restoring cached phase clk: rockchip: Fix wrong parents for MMC phase clock for rk3328 clk: rockchip: Fix wrong parent for SDMMC phase clock for rk3228
-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,