diff options
author | Andrew Bresticker <abrestic@chromium.org> | 2014-05-14 20:32:59 -0400 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2014-05-23 01:14:52 -0400 |
commit | 5c992afcf8e4f91fac05d39b86c7f7922a50145c (patch) | |
tree | 349870dc6143624ca62f5cfa2aa9de3460095d20 | |
parent | 9d61707b1f83324fc30918787cb6ef101997ecbd (diff) |
clk: tegra: Fix xusb_hs_src clock hierarchy
Currently the Tegra1x4 clock init code hard-codes the mux setting
for xusb_hs_src and treats it as a fixed-factor clock. It is,
however, a mux which can be parented by either xusb_ss_src/2 or
pll_u_60M. Add the fixed-factor clock xusb_ss_div2 and put an
entry in periph_clks[] for the xusb_hs_src mux.
Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
Signed-off-by: Mike Turquette <mturquette@linaro.org>
-rw-r--r-- | drivers/clk/tegra/clk-id.h | 1 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra-periph.c | 6 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra114.c | 15 | ||||
-rw-r--r-- | drivers/clk/tegra/clk-tegra124.c | 15 | ||||
-rw-r--r-- | include/dt-bindings/clock/tegra114-car.h | 3 | ||||
-rw-r--r-- | include/dt-bindings/clock/tegra124-car.h | 3 |
6 files changed, 21 insertions, 22 deletions
diff --git a/drivers/clk/tegra/clk-id.h b/drivers/clk/tegra/clk-id.h index c39613c519af..0011d547a9f7 100644 --- a/drivers/clk/tegra/clk-id.h +++ b/drivers/clk/tegra/clk-id.h | |||
@@ -233,6 +233,7 @@ enum clk_id { | |||
233 | tegra_clk_xusb_hs_src, | 233 | tegra_clk_xusb_hs_src, |
234 | tegra_clk_xusb_ss, | 234 | tegra_clk_xusb_ss, |
235 | tegra_clk_xusb_ss_src, | 235 | tegra_clk_xusb_ss_src, |
236 | tegra_clk_xusb_ss_div2, | ||
236 | tegra_clk_max, | 237 | tegra_clk_max, |
237 | }; | 238 | }; |
238 | 239 | ||
diff --git a/drivers/clk/tegra/clk-tegra-periph.c b/drivers/clk/tegra/clk-tegra-periph.c index a4063bc25208..adf6b814b5bc 100644 --- a/drivers/clk/tegra/clk-tegra-periph.c +++ b/drivers/clk/tegra/clk-tegra-periph.c | |||
@@ -340,6 +340,11 @@ static u32 mux_clkm_pllre_clk32_480M_pllc_ref_idx[] = { | |||
340 | [0] = 0, [1] = 1, [2] = 3, [3] = 3, [4] = 4, [5] = 7, | 340 | [0] = 0, [1] = 1, [2] = 3, [3] = 3, [4] = 4, [5] = 7, |
341 | }; | 341 | }; |
342 | 342 | ||
343 | static const char *mux_ss_60M[] = { | ||
344 | "xusb_ss_div2", "pll_u_60M" | ||
345 | }; | ||
346 | #define mux_ss_60M_idx NULL | ||
347 | |||
343 | static const char *mux_d_audio_clk[] = { | 348 | static const char *mux_d_audio_clk[] = { |
344 | "pll_a_out0", "pll_p", "clk_m", "spdif_in_sync", "i2s0_sync", | 349 | "pll_a_out0", "pll_p", "clk_m", "spdif_in_sync", "i2s0_sync", |
345 | "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync", | 350 | "i2s1_sync", "i2s2_sync", "i2s3_sync", "i2s4_sync", "vimclk_sync", |
@@ -501,6 +506,7 @@ static struct tegra_periph_init_data periph_clks[] = { | |||
501 | XUSB("xusb_falcon_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_falcon_src), | 506 | XUSB("xusb_falcon_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_FALCON_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_falcon_src), |
502 | XUSB("xusb_fs_src", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_fs_src), | 507 | XUSB("xusb_fs_src", mux_clkm_48M_pllp_480M, CLK_SOURCE_XUSB_FS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_fs_src), |
503 | XUSB("xusb_ss_src", mux_clkm_pllre_clk32_480M_pllc_ref, CLK_SOURCE_XUSB_SS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_ss_src), | 508 | XUSB("xusb_ss_src", mux_clkm_pllre_clk32_480M_pllc_ref, CLK_SOURCE_XUSB_SS_SRC, 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_ss_src), |
509 | NODIV("xusb_hs_src", mux_ss_60M, CLK_SOURCE_XUSB_SS_SRC, 25, MASK(1), 143, TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_hs_src, NULL), | ||
504 | XUSB("xusb_dev_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_DEV_SRC, 95, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_dev_src), | 510 | XUSB("xusb_dev_src", mux_clkm_pllp_pllc_pllre, CLK_SOURCE_XUSB_DEV_SRC, 95, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_xusb_dev_src), |
505 | }; | 511 | }; |
506 | 512 | ||
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c index 80431f0fb268..841f54fb8c8b 100644 --- a/drivers/clk/tegra/clk-tegra114.c +++ b/drivers/clk/tegra/clk-tegra114.c | |||
@@ -142,7 +142,6 @@ | |||
142 | #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0) | 142 | #define UTMIPLL_HW_PWRDN_CFG0_IDDQ_SWCTL BIT(0) |
143 | 143 | ||
144 | #define CLK_SOURCE_CSITE 0x1d4 | 144 | #define CLK_SOURCE_CSITE 0x1d4 |
145 | #define CLK_SOURCE_XUSB_SS_SRC 0x610 | ||
146 | #define CLK_SOURCE_EMC 0x19c | 145 | #define CLK_SOURCE_EMC 0x19c |
147 | 146 | ||
148 | /* PLLM override registers */ | 147 | /* PLLM override registers */ |
@@ -834,6 +833,7 @@ static struct tegra_clk tegra114_clks[tegra_clk_max] __initdata = { | |||
834 | [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA114_CLK_XUSB_FALCON_SRC, .present = true }, | 833 | [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA114_CLK_XUSB_FALCON_SRC, .present = true }, |
835 | [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA114_CLK_XUSB_FS_SRC, .present = true }, | 834 | [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA114_CLK_XUSB_FS_SRC, .present = true }, |
836 | [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA114_CLK_XUSB_SS_SRC, .present = true }, | 835 | [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA114_CLK_XUSB_SS_SRC, .present = true }, |
836 | [tegra_clk_xusb_ss_div2] = { .dt_id = TEGRA114_CLK_XUSB_SS_DIV2, .present = true}, | ||
837 | [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA114_CLK_XUSB_DEV_SRC, .present = true }, | 837 | [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA114_CLK_XUSB_DEV_SRC, .present = true }, |
838 | [tegra_clk_xusb_dev] = { .dt_id = TEGRA114_CLK_XUSB_DEV, .present = true }, | 838 | [tegra_clk_xusb_dev] = { .dt_id = TEGRA114_CLK_XUSB_DEV, .present = true }, |
839 | [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA114_CLK_XUSB_HS_SRC, .present = true }, | 839 | [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA114_CLK_XUSB_HS_SRC, .present = true }, |
@@ -1182,16 +1182,11 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base, | |||
1182 | void __iomem *pmc_base) | 1182 | void __iomem *pmc_base) |
1183 | { | 1183 | { |
1184 | struct clk *clk; | 1184 | struct clk *clk; |
1185 | u32 val; | ||
1186 | |||
1187 | /* xusb_hs_src */ | ||
1188 | val = readl(clk_base + CLK_SOURCE_XUSB_SS_SRC); | ||
1189 | val |= BIT(25); /* always select PLLU_60M */ | ||
1190 | writel(val, clk_base + CLK_SOURCE_XUSB_SS_SRC); | ||
1191 | 1185 | ||
1192 | clk = clk_register_fixed_factor(NULL, "xusb_hs_src", "pll_u_60M", 0, | 1186 | /* xusb_ss_div2 */ |
1193 | 1, 1); | 1187 | clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0, |
1194 | clks[TEGRA114_CLK_XUSB_HS_SRC] = clk; | 1188 | 1, 2); |
1189 | clks[TEGRA114_CLK_XUSB_SS_DIV2] = clk; | ||
1195 | 1190 | ||
1196 | /* dsia mux */ | 1191 | /* dsia mux */ |
1197 | clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, | 1192 | clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, |
diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c index cc37c342c4cb..0dce8c08eb91 100644 --- a/drivers/clk/tegra/clk-tegra124.c +++ b/drivers/clk/tegra/clk-tegra124.c | |||
@@ -30,7 +30,6 @@ | |||
30 | 30 | ||
31 | #define CLK_SOURCE_CSITE 0x1d4 | 31 | #define CLK_SOURCE_CSITE 0x1d4 |
32 | #define CLK_SOURCE_EMC 0x19c | 32 | #define CLK_SOURCE_EMC 0x19c |
33 | #define CLK_SOURCE_XUSB_SS_SRC 0x610 | ||
34 | 33 | ||
35 | #define PLLC_BASE 0x80 | 34 | #define PLLC_BASE 0x80 |
36 | #define PLLC_OUT 0x84 | 35 | #define PLLC_OUT 0x84 |
@@ -925,6 +924,7 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { | |||
925 | [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA124_CLK_XUSB_FALCON_SRC, .present = true }, | 924 | [tegra_clk_xusb_falcon_src] = { .dt_id = TEGRA124_CLK_XUSB_FALCON_SRC, .present = true }, |
926 | [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA124_CLK_XUSB_FS_SRC, .present = true }, | 925 | [tegra_clk_xusb_fs_src] = { .dt_id = TEGRA124_CLK_XUSB_FS_SRC, .present = true }, |
927 | [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA124_CLK_XUSB_SS_SRC, .present = true }, | 926 | [tegra_clk_xusb_ss_src] = { .dt_id = TEGRA124_CLK_XUSB_SS_SRC, .present = true }, |
927 | [tegra_clk_xusb_ss_div2] = { .dt_id = TEGRA124_CLK_XUSB_SS_DIV2, .present = true }, | ||
928 | [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA124_CLK_XUSB_DEV_SRC, .present = true }, | 928 | [tegra_clk_xusb_dev_src] = { .dt_id = TEGRA124_CLK_XUSB_DEV_SRC, .present = true }, |
929 | [tegra_clk_xusb_dev] = { .dt_id = TEGRA124_CLK_XUSB_DEV, .present = true }, | 929 | [tegra_clk_xusb_dev] = { .dt_id = TEGRA124_CLK_XUSB_DEV, .present = true }, |
930 | [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA124_CLK_XUSB_HS_SRC, .present = true }, | 930 | [tegra_clk_xusb_hs_src] = { .dt_id = TEGRA124_CLK_XUSB_HS_SRC, .present = true }, |
@@ -1105,16 +1105,11 @@ static __init void tegra124_periph_clk_init(void __iomem *clk_base, | |||
1105 | void __iomem *pmc_base) | 1105 | void __iomem *pmc_base) |
1106 | { | 1106 | { |
1107 | struct clk *clk; | 1107 | struct clk *clk; |
1108 | u32 val; | ||
1109 | |||
1110 | /* xusb_hs_src */ | ||
1111 | val = readl(clk_base + CLK_SOURCE_XUSB_SS_SRC); | ||
1112 | val |= BIT(25); /* always select PLLU_60M */ | ||
1113 | writel(val, clk_base + CLK_SOURCE_XUSB_SS_SRC); | ||
1114 | 1108 | ||
1115 | clk = clk_register_fixed_factor(NULL, "xusb_hs_src", "pll_u_60M", 0, | 1109 | /* xusb_ss_div2 */ |
1116 | 1, 1); | 1110 | clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0, |
1117 | clks[TEGRA124_CLK_XUSB_HS_SRC] = clk; | 1111 | 1, 2); |
1112 | clks[TEGRA124_CLK_XUSB_SS_DIV2] = clk; | ||
1118 | 1113 | ||
1119 | /* dsia mux */ | 1114 | /* dsia mux */ |
1120 | clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, | 1115 | clk = clk_register_mux(NULL, "dsia_mux", mux_plld_out0_plld2_out0, |
diff --git a/include/dt-bindings/clock/tegra114-car.h b/include/dt-bindings/clock/tegra114-car.h index 6d0d8d8ef31e..fc12621fb432 100644 --- a/include/dt-bindings/clock/tegra114-car.h +++ b/include/dt-bindings/clock/tegra114-car.h | |||
@@ -337,6 +337,7 @@ | |||
337 | #define TEGRA114_CLK_CLK_OUT_3_MUX 308 | 337 | #define TEGRA114_CLK_CLK_OUT_3_MUX 308 |
338 | #define TEGRA114_CLK_DSIA_MUX 309 | 338 | #define TEGRA114_CLK_DSIA_MUX 309 |
339 | #define TEGRA114_CLK_DSIB_MUX 310 | 339 | #define TEGRA114_CLK_DSIB_MUX 310 |
340 | #define TEGRA114_CLK_CLK_MAX 311 | 340 | #define TEGRA114_CLK_XUSB_SS_DIV2 311 |
341 | #define TEGRA114_CLK_CLK_MAX 312 | ||
341 | 342 | ||
342 | #endif /* _DT_BINDINGS_CLOCK_TEGRA114_CAR_H */ | 343 | #endif /* _DT_BINDINGS_CLOCK_TEGRA114_CAR_H */ |
diff --git a/include/dt-bindings/clock/tegra124-car.h b/include/dt-bindings/clock/tegra124-car.h index 433528ab5161..8a4c5892890f 100644 --- a/include/dt-bindings/clock/tegra124-car.h +++ b/include/dt-bindings/clock/tegra124-car.h | |||
@@ -336,6 +336,7 @@ | |||
336 | #define TEGRA124_CLK_DSIA_MUX 309 | 336 | #define TEGRA124_CLK_DSIA_MUX 309 |
337 | #define TEGRA124_CLK_DSIB_MUX 310 | 337 | #define TEGRA124_CLK_DSIB_MUX 310 |
338 | #define TEGRA124_CLK_SOR0_LVDS 311 | 338 | #define TEGRA124_CLK_SOR0_LVDS 311 |
339 | #define TEGRA124_CLK_CLK_MAX 312 | 339 | #define TEGRA124_CLK_XUSB_SS_DIV2 312 |
340 | #define TEGRA124_CLK_CLK_MAX 313 | ||
340 | 341 | ||
341 | #endif /* _DT_BINDINGS_CLOCK_TEGRA124_CAR_H */ | 342 | #endif /* _DT_BINDINGS_CLOCK_TEGRA124_CAR_H */ |