diff options
Diffstat (limited to 'drivers/clk/samsung/clk-exynos5420.c')
-rw-r--r-- | drivers/clk/samsung/clk-exynos5420.c | 123 |
1 files changed, 80 insertions, 43 deletions
diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c index 68a96cbd4936..48c4a9350b91 100644 --- a/drivers/clk/samsung/clk-exynos5420.c +++ b/drivers/clk/samsung/clk-exynos5420.c | |||
@@ -17,13 +17,30 @@ | |||
17 | #include <linux/of_address.h> | 17 | #include <linux/of_address.h> |
18 | 18 | ||
19 | #include "clk.h" | 19 | #include "clk.h" |
20 | #include "clk-pll.h" | ||
21 | 20 | ||
21 | #define APLL_LOCK 0x0 | ||
22 | #define APLL_CON0 0x100 | ||
22 | #define SRC_CPU 0x200 | 23 | #define SRC_CPU 0x200 |
23 | #define DIV_CPU0 0x500 | 24 | #define DIV_CPU0 0x500 |
24 | #define DIV_CPU1 0x504 | 25 | #define DIV_CPU1 0x504 |
25 | #define GATE_BUS_CPU 0x700 | 26 | #define GATE_BUS_CPU 0x700 |
26 | #define GATE_SCLK_CPU 0x800 | 27 | #define GATE_SCLK_CPU 0x800 |
28 | #define CPLL_LOCK 0x10020 | ||
29 | #define DPLL_LOCK 0x10030 | ||
30 | #define EPLL_LOCK 0x10040 | ||
31 | #define RPLL_LOCK 0x10050 | ||
32 | #define IPLL_LOCK 0x10060 | ||
33 | #define SPLL_LOCK 0x10070 | ||
34 | #define VPLL_LOCK 0x10070 | ||
35 | #define MPLL_LOCK 0x10090 | ||
36 | #define CPLL_CON0 0x10120 | ||
37 | #define DPLL_CON0 0x10128 | ||
38 | #define EPLL_CON0 0x10130 | ||
39 | #define RPLL_CON0 0x10140 | ||
40 | #define IPLL_CON0 0x10150 | ||
41 | #define SPLL_CON0 0x10160 | ||
42 | #define VPLL_CON0 0x10170 | ||
43 | #define MPLL_CON0 0x10180 | ||
27 | #define SRC_TOP0 0x10200 | 44 | #define SRC_TOP0 0x10200 |
28 | #define SRC_TOP1 0x10204 | 45 | #define SRC_TOP1 0x10204 |
29 | #define SRC_TOP2 0x10208 | 46 | #define SRC_TOP2 0x10208 |
@@ -75,15 +92,27 @@ | |||
75 | #define GATE_TOP_SCLK_MAU 0x1083c | 92 | #define GATE_TOP_SCLK_MAU 0x1083c |
76 | #define GATE_TOP_SCLK_FSYS 0x10840 | 93 | #define GATE_TOP_SCLK_FSYS 0x10840 |
77 | #define GATE_TOP_SCLK_PERIC 0x10850 | 94 | #define GATE_TOP_SCLK_PERIC 0x10850 |
95 | #define BPLL_LOCK 0x20010 | ||
96 | #define BPLL_CON0 0x20110 | ||
78 | #define SRC_CDREX 0x20200 | 97 | #define SRC_CDREX 0x20200 |
98 | #define KPLL_LOCK 0x28000 | ||
99 | #define KPLL_CON0 0x28100 | ||
79 | #define SRC_KFC 0x28200 | 100 | #define SRC_KFC 0x28200 |
80 | #define DIV_KFC0 0x28500 | 101 | #define DIV_KFC0 0x28500 |
81 | 102 | ||
103 | /* list of PLLs */ | ||
104 | enum exynos5420_plls { | ||
105 | apll, cpll, dpll, epll, rpll, ipll, spll, vpll, mpll, | ||
106 | bpll, kpll, | ||
107 | nr_plls /* number of PLLs */ | ||
108 | }; | ||
109 | |||
82 | enum exynos5420_clks { | 110 | enum exynos5420_clks { |
83 | none, | 111 | none, |
84 | 112 | ||
85 | /* core clocks */ | 113 | /* core clocks */ |
86 | fin_pll, | 114 | fin_pll, fout_apll, fout_cpll, fout_dpll, fout_epll, fout_rpll, |
115 | fout_ipll, fout_spll, fout_vpll, fout_mpll, fout_bpll, fout_kpll, | ||
87 | 116 | ||
88 | /* gate for special clocks (sclk) */ | 117 | /* gate for special clocks (sclk) */ |
89 | sclk_uart0 = 128, sclk_uart1, sclk_uart2, sclk_uart3, sclk_mmc0, | 118 | sclk_uart0 = 128, sclk_uart1, sclk_uart2, sclk_uart3, sclk_mmc0, |
@@ -91,7 +120,7 @@ enum exynos5420_clks { | |||
91 | sclk_i2s2, sclk_pcm1, sclk_pcm2, sclk_spdif, sclk_hdmi, sclk_pixel, | 120 | sclk_i2s2, sclk_pcm1, sclk_pcm2, sclk_spdif, sclk_hdmi, sclk_pixel, |
92 | sclk_dp1, sclk_mipi1, sclk_fimd1, sclk_maudio0, sclk_maupcm0, | 121 | sclk_dp1, sclk_mipi1, sclk_fimd1, sclk_maudio0, sclk_maupcm0, |
93 | sclk_usbd300, sclk_usbd301, sclk_usbphy300, sclk_usbphy301, sclk_unipro, | 122 | sclk_usbd300, sclk_usbd301, sclk_usbphy300, sclk_usbphy301, sclk_unipro, |
94 | sclk_pwm, sclk_gscl_wa, sclk_gscl_wb, | 123 | sclk_pwm, sclk_gscl_wa, sclk_gscl_wb, sclk_hdmiphy, |
95 | 124 | ||
96 | /* gate clocks */ | 125 | /* gate clocks */ |
97 | aclk66_peric = 256, uart0, uart1, uart2, uart3, i2c0, i2c1, i2c2, i2c3, | 126 | aclk66_peric = 256, uart0, uart1, uart2, uart3, i2c0, i2c1, i2c2, i2c3, |
@@ -109,7 +138,13 @@ enum exynos5420_clks { | |||
109 | aclk300_gscl = 460, smmu_gscl0, smmu_gscl1, gscl_wa, gscl_wb, gscl0, | 138 | aclk300_gscl = 460, smmu_gscl0, smmu_gscl1, gscl_wa, gscl_wb, gscl0, |
110 | gscl1, clk_3aa, aclk266_g2d = 470, sss, slim_sss, mdma0, | 139 | gscl1, clk_3aa, aclk266_g2d = 470, sss, slim_sss, mdma0, |
111 | aclk333_g2d = 480, g2d, aclk333_432_gscl = 490, smmu_3aa, smmu_fimcl0, | 140 | aclk333_g2d = 480, g2d, aclk333_432_gscl = 490, smmu_3aa, smmu_fimcl0, |
112 | smmu_fimcl1, smmu_fimcl3, fimc_lite3, aclk_g3d = 500, g3d, | 141 | smmu_fimcl1, smmu_fimcl3, fimc_lite3, aclk_g3d = 500, g3d, smmu_mixer, |
142 | |||
143 | /* mux clocks */ | ||
144 | mout_hdmi = 640, | ||
145 | |||
146 | /* divider clocks */ | ||
147 | dout_pixel = 768, | ||
113 | 148 | ||
114 | nr_clks, | 149 | nr_clks, |
115 | }; | 150 | }; |
@@ -118,7 +153,7 @@ enum exynos5420_clks { | |||
118 | * list of controller registers to be saved and restored during a | 153 | * list of controller registers to be saved and restored during a |
119 | * suspend/resume cycle. | 154 | * suspend/resume cycle. |
120 | */ | 155 | */ |
121 | static __initdata unsigned long exynos5420_clk_regs[] = { | 156 | static unsigned long exynos5420_clk_regs[] __initdata = { |
122 | SRC_CPU, | 157 | SRC_CPU, |
123 | DIV_CPU0, | 158 | DIV_CPU0, |
124 | DIV_CPU1, | 159 | DIV_CPU1, |
@@ -257,29 +292,29 @@ PNAME(audio2_p) = { "fin_pll", "cdclk2", "sclk_dpll", "sclk_mpll", | |||
257 | "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; | 292 | "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; |
258 | PNAME(spdif_p) = { "fin_pll", "dout_audio0", "dout_audio1", "dout_audio2", | 293 | PNAME(spdif_p) = { "fin_pll", "dout_audio0", "dout_audio1", "dout_audio2", |
259 | "spdif_extclk", "sclk_ipll", "sclk_epll", "sclk_rpll" }; | 294 | "spdif_extclk", "sclk_ipll", "sclk_epll", "sclk_rpll" }; |
260 | PNAME(hdmi_p) = { "sclk_hdmiphy", "dout_hdmi_pixel" }; | 295 | PNAME(hdmi_p) = { "dout_hdmi_pixel", "sclk_hdmiphy" }; |
261 | PNAME(maudio0_p) = { "fin_pll", "maudio_clk", "sclk_dpll", "sclk_mpll", | 296 | PNAME(maudio0_p) = { "fin_pll", "maudio_clk", "sclk_dpll", "sclk_mpll", |
262 | "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; | 297 | "sclk_spll", "sclk_ipll", "sclk_epll", "sclk_rpll" }; |
263 | 298 | ||
264 | /* fixed rate clocks generated outside the soc */ | 299 | /* fixed rate clocks generated outside the soc */ |
265 | struct samsung_fixed_rate_clock exynos5420_fixed_rate_ext_clks[] __initdata = { | 300 | static struct samsung_fixed_rate_clock exynos5420_fixed_rate_ext_clks[] __initdata = { |
266 | FRATE(fin_pll, "fin_pll", NULL, CLK_IS_ROOT, 0), | 301 | FRATE(fin_pll, "fin_pll", NULL, CLK_IS_ROOT, 0), |
267 | }; | 302 | }; |
268 | 303 | ||
269 | /* fixed rate clocks generated inside the soc */ | 304 | /* fixed rate clocks generated inside the soc */ |
270 | struct samsung_fixed_rate_clock exynos5420_fixed_rate_clks[] __initdata = { | 305 | static struct samsung_fixed_rate_clock exynos5420_fixed_rate_clks[] __initdata = { |
271 | FRATE(none, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), | 306 | FRATE(sclk_hdmiphy, "sclk_hdmiphy", NULL, CLK_IS_ROOT, 24000000), |
272 | FRATE(none, "sclk_pwi", NULL, CLK_IS_ROOT, 24000000), | 307 | FRATE(none, "sclk_pwi", NULL, CLK_IS_ROOT, 24000000), |
273 | FRATE(none, "sclk_usbh20", NULL, CLK_IS_ROOT, 48000000), | 308 | FRATE(none, "sclk_usbh20", NULL, CLK_IS_ROOT, 48000000), |
274 | FRATE(none, "mphy_refclk_ixtal24", NULL, CLK_IS_ROOT, 48000000), | 309 | FRATE(none, "mphy_refclk_ixtal24", NULL, CLK_IS_ROOT, 48000000), |
275 | FRATE(none, "sclk_usbh20_scan_clk", NULL, CLK_IS_ROOT, 480000000), | 310 | FRATE(none, "sclk_usbh20_scan_clk", NULL, CLK_IS_ROOT, 480000000), |
276 | }; | 311 | }; |
277 | 312 | ||
278 | struct samsung_fixed_factor_clock exynos5420_fixed_factor_clks[] __initdata = { | 313 | static struct samsung_fixed_factor_clock exynos5420_fixed_factor_clks[] __initdata = { |
279 | FFACTOR(none, "sclk_hsic_12m", "fin_pll", 1, 2, 0), | 314 | FFACTOR(none, "sclk_hsic_12m", "fin_pll", 1, 2, 0), |
280 | }; | 315 | }; |
281 | 316 | ||
282 | struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { | 317 | static struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { |
283 | MUX(none, "mout_mspll_kfc", mspll_cpu_p, SRC_TOP7, 8, 2), | 318 | MUX(none, "mout_mspll_kfc", mspll_cpu_p, SRC_TOP7, 8, 2), |
284 | MUX(none, "mout_mspll_cpu", mspll_cpu_p, SRC_TOP7, 12, 2), | 319 | MUX(none, "mout_mspll_cpu", mspll_cpu_p, SRC_TOP7, 12, 2), |
285 | MUX(none, "mout_apll", apll_p, SRC_CPU, 0, 1), | 320 | MUX(none, "mout_apll", apll_p, SRC_CPU, 0, 1), |
@@ -371,7 +406,7 @@ struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { | |||
371 | MUX(none, "mout_mipi1", group2_p, SRC_DISP10, 16, 3), | 406 | MUX(none, "mout_mipi1", group2_p, SRC_DISP10, 16, 3), |
372 | MUX(none, "mout_dp1", group2_p, SRC_DISP10, 20, 3), | 407 | MUX(none, "mout_dp1", group2_p, SRC_DISP10, 20, 3), |
373 | MUX(none, "mout_pixel", group2_p, SRC_DISP10, 24, 3), | 408 | MUX(none, "mout_pixel", group2_p, SRC_DISP10, 24, 3), |
374 | MUX(none, "mout_hdmi", hdmi_p, SRC_DISP10, 28, 1), | 409 | MUX(mout_hdmi, "mout_hdmi", hdmi_p, SRC_DISP10, 28, 1), |
375 | 410 | ||
376 | /* MAU Block */ | 411 | /* MAU Block */ |
377 | MUX(none, "mout_maudio0", maudio0_p, SRC_MAU, 28, 3), | 412 | MUX(none, "mout_maudio0", maudio0_p, SRC_MAU, 28, 3), |
@@ -399,7 +434,7 @@ struct samsung_mux_clock exynos5420_mux_clks[] __initdata = { | |||
399 | MUX(none, "mout_spi2", group2_p, SRC_PERIC1, 28, 3), | 434 | MUX(none, "mout_spi2", group2_p, SRC_PERIC1, 28, 3), |
400 | }; | 435 | }; |
401 | 436 | ||
402 | struct samsung_div_clock exynos5420_div_clks[] __initdata = { | 437 | static struct samsung_div_clock exynos5420_div_clks[] __initdata = { |
403 | DIV(none, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), | 438 | DIV(none, "div_arm", "mout_cpu", DIV_CPU0, 0, 3), |
404 | DIV(none, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), | 439 | DIV(none, "sclk_apll", "mout_apll", DIV_CPU0, 24, 3), |
405 | DIV(none, "armclk2", "div_arm", DIV_CPU0, 28, 3), | 440 | DIV(none, "armclk2", "div_arm", DIV_CPU0, 28, 3), |
@@ -431,7 +466,7 @@ struct samsung_div_clock exynos5420_div_clks[] __initdata = { | |||
431 | DIV(none, "dout_fimd1", "mout_fimd1", DIV_DISP10, 0, 4), | 466 | DIV(none, "dout_fimd1", "mout_fimd1", DIV_DISP10, 0, 4), |
432 | DIV(none, "dout_mipi1", "mout_mipi1", DIV_DISP10, 16, 8), | 467 | DIV(none, "dout_mipi1", "mout_mipi1", DIV_DISP10, 16, 8), |
433 | DIV(none, "dout_dp1", "mout_dp1", DIV_DISP10, 24, 4), | 468 | DIV(none, "dout_dp1", "mout_dp1", DIV_DISP10, 24, 4), |
434 | DIV(none, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10, 28, 4), | 469 | DIV(dout_pixel, "dout_hdmi_pixel", "mout_pixel", DIV_DISP10, 28, 4), |
435 | 470 | ||
436 | /* Audio Block */ | 471 | /* Audio Block */ |
437 | DIV(none, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4), | 472 | DIV(none, "dout_maudio0", "mout_maudio0", DIV_MAU, 20, 4), |
@@ -479,7 +514,7 @@ struct samsung_div_clock exynos5420_div_clks[] __initdata = { | |||
479 | DIV(none, "dout_pre_spi2", "dout_spi2", DIV_PERIC4, 24, 8), | 514 | DIV(none, "dout_pre_spi2", "dout_spi2", DIV_PERIC4, 24, 8), |
480 | }; | 515 | }; |
481 | 516 | ||
482 | struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { | 517 | static struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { |
483 | /* TODO: Re-verify the CG bits for all the gate clocks */ | 518 | /* TODO: Re-verify the CG bits for all the gate clocks */ |
484 | GATE_A(mct, "pclk_st", "aclk66_psgen", GATE_BUS_PERIS1, 2, 0, 0, "mct"), | 519 | GATE_A(mct, "pclk_st", "aclk66_psgen", GATE_BUS_PERIS1, 2, 0, 0, "mct"), |
485 | 520 | ||
@@ -696,19 +731,43 @@ struct samsung_gate_clock exynos5420_gate_clks[] __initdata = { | |||
696 | GATE(smmu_mscl0, "smmu_mscl0", "aclk400_mscl", GATE_IP_MSCL, 8, 0, 0), | 731 | GATE(smmu_mscl0, "smmu_mscl0", "aclk400_mscl", GATE_IP_MSCL, 8, 0, 0), |
697 | GATE(smmu_mscl1, "smmu_mscl1", "aclk400_mscl", GATE_IP_MSCL, 9, 0, 0), | 732 | GATE(smmu_mscl1, "smmu_mscl1", "aclk400_mscl", GATE_IP_MSCL, 9, 0, 0), |
698 | GATE(smmu_mscl2, "smmu_mscl2", "aclk400_mscl", GATE_IP_MSCL, 10, 0, 0), | 733 | GATE(smmu_mscl2, "smmu_mscl2", "aclk400_mscl", GATE_IP_MSCL, 10, 0, 0), |
734 | GATE(smmu_mixer, "smmu_mixer", "aclk200_disp1", GATE_IP_DISP1, 9, 0, 0), | ||
699 | }; | 735 | }; |
700 | 736 | ||
701 | static __initdata struct of_device_id ext_clk_match[] = { | 737 | static struct samsung_pll_clock exynos5420_plls[nr_plls] __initdata = { |
738 | [apll] = PLL(pll_2550, fout_apll, "fout_apll", "fin_pll", APLL_LOCK, | ||
739 | APLL_CON0, NULL), | ||
740 | [cpll] = PLL(pll_2550, fout_mpll, "fout_mpll", "fin_pll", MPLL_LOCK, | ||
741 | MPLL_CON0, NULL), | ||
742 | [dpll] = PLL(pll_2550, fout_dpll, "fout_dpll", "fin_pll", DPLL_LOCK, | ||
743 | DPLL_CON0, NULL), | ||
744 | [epll] = PLL(pll_2650, fout_epll, "fout_epll", "fin_pll", EPLL_LOCK, | ||
745 | EPLL_CON0, NULL), | ||
746 | [rpll] = PLL(pll_2650, fout_rpll, "fout_rpll", "fin_pll", RPLL_LOCK, | ||
747 | RPLL_CON0, NULL), | ||
748 | [ipll] = PLL(pll_2550, fout_ipll, "fout_ipll", "fin_pll", IPLL_LOCK, | ||
749 | IPLL_CON0, NULL), | ||
750 | [spll] = PLL(pll_2550, fout_spll, "fout_spll", "fin_pll", SPLL_LOCK, | ||
751 | SPLL_CON0, NULL), | ||
752 | [vpll] = PLL(pll_2550, fout_vpll, "fout_vpll", "fin_pll", VPLL_LOCK, | ||
753 | VPLL_CON0, NULL), | ||
754 | [mpll] = PLL(pll_2550, fout_mpll, "fout_mpll", "fin_pll", MPLL_LOCK, | ||
755 | MPLL_CON0, NULL), | ||
756 | [bpll] = PLL(pll_2550, fout_bpll, "fout_bpll", "fin_pll", BPLL_LOCK, | ||
757 | BPLL_CON0, NULL), | ||
758 | [kpll] = PLL(pll_2550, fout_kpll, "fout_kpll", "fin_pll", KPLL_LOCK, | ||
759 | KPLL_CON0, NULL), | ||
760 | }; | ||
761 | |||
762 | static struct of_device_id ext_clk_match[] __initdata = { | ||
702 | { .compatible = "samsung,exynos5420-oscclk", .data = (void *)0, }, | 763 | { .compatible = "samsung,exynos5420-oscclk", .data = (void *)0, }, |
703 | { }, | 764 | { }, |
704 | }; | 765 | }; |
705 | 766 | ||
706 | /* register exynos5420 clocks */ | 767 | /* register exynos5420 clocks */ |
707 | void __init exynos5420_clk_init(struct device_node *np) | 768 | static void __init exynos5420_clk_init(struct device_node *np) |
708 | { | 769 | { |
709 | void __iomem *reg_base; | 770 | void __iomem *reg_base; |
710 | struct clk *apll, *bpll, *cpll, *dpll, *epll, *ipll, *kpll, *mpll; | ||
711 | struct clk *rpll, *spll, *vpll; | ||
712 | 771 | ||
713 | if (np) { | 772 | if (np) { |
714 | reg_base = of_iomap(np, 0); | 773 | reg_base = of_iomap(np, 0); |
@@ -724,30 +783,8 @@ void __init exynos5420_clk_init(struct device_node *np) | |||
724 | samsung_clk_of_register_fixed_ext(exynos5420_fixed_rate_ext_clks, | 783 | samsung_clk_of_register_fixed_ext(exynos5420_fixed_rate_ext_clks, |
725 | ARRAY_SIZE(exynos5420_fixed_rate_ext_clks), | 784 | ARRAY_SIZE(exynos5420_fixed_rate_ext_clks), |
726 | ext_clk_match); | 785 | ext_clk_match); |
727 | 786 | samsung_clk_register_pll(exynos5420_plls, ARRAY_SIZE(exynos5420_plls), | |
728 | apll = samsung_clk_register_pll35xx("fout_apll", "fin_pll", | 787 | reg_base); |
729 | reg_base + 0x100); | ||
730 | bpll = samsung_clk_register_pll35xx("fout_bpll", "fin_pll", | ||
731 | reg_base + 0x20110); | ||
732 | cpll = samsung_clk_register_pll35xx("fout_cpll", "fin_pll", | ||
733 | reg_base + 0x10120); | ||
734 | dpll = samsung_clk_register_pll35xx("fout_dpll", "fin_pll", | ||
735 | reg_base + 0x10128); | ||
736 | epll = samsung_clk_register_pll36xx("fout_epll", "fin_pll", | ||
737 | reg_base + 0x10130); | ||
738 | ipll = samsung_clk_register_pll35xx("fout_ipll", "fin_pll", | ||
739 | reg_base + 0x10150); | ||
740 | kpll = samsung_clk_register_pll35xx("fout_kpll", "fin_pll", | ||
741 | reg_base + 0x28100); | ||
742 | mpll = samsung_clk_register_pll35xx("fout_mpll", "fin_pll", | ||
743 | reg_base + 0x10180); | ||
744 | rpll = samsung_clk_register_pll36xx("fout_rpll", "fin_pll", | ||
745 | reg_base + 0x10140); | ||
746 | spll = samsung_clk_register_pll35xx("fout_spll", "fin_pll", | ||
747 | reg_base + 0x10160); | ||
748 | vpll = samsung_clk_register_pll35xx("fout_vpll", "fin_pll", | ||
749 | reg_base + 0x10170); | ||
750 | |||
751 | samsung_clk_register_fixed_rate(exynos5420_fixed_rate_clks, | 788 | samsung_clk_register_fixed_rate(exynos5420_fixed_rate_clks, |
752 | ARRAY_SIZE(exynos5420_fixed_rate_clks)); | 789 | ARRAY_SIZE(exynos5420_fixed_rate_clks)); |
753 | samsung_clk_register_fixed_factor(exynos5420_fixed_factor_clks, | 790 | samsung_clk_register_fixed_factor(exynos5420_fixed_factor_clks, |