forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/clk/ingenic/jz4770-cgu.c
....@@ -7,10 +7,13 @@
77 #include <linux/bitops.h>
88 #include <linux/clk-provider.h>
99 #include <linux/delay.h>
10
+#include <linux/io.h>
1011 #include <linux/of.h>
11
-#include <linux/syscore_ops.h>
12
+
1213 #include <dt-bindings/clock/jz4770-cgu.h>
14
+
1315 #include "cgu.h"
16
+#include "pm.h"
1417
1518 /*
1619 * CPM registers offset address definition
....@@ -36,9 +39,6 @@
3639 #define CGU_REG_MSC1CDR 0xA4
3740 #define CGU_REG_MSC2CDR 0xA8
3841 #define CGU_REG_BCHCDR 0xAC
39
-
40
-/* bits within the LCR register */
41
-#define LCR_LPM BIT(0) /* Low Power Mode */
4242
4343 /* bits within the OPCR register */
4444 #define OPCR_SPENDH BIT(5) /* UHC PHY suspend */
....@@ -86,6 +86,10 @@
8686 0x0, 0x1, -1, 0x2, -1, -1, -1, 0x3,
8787 };
8888
89
+static const u8 jz4770_cgu_cpccr_div_table[] = {
90
+ 1, 2, 3, 4, 6, 8, 12,
91
+};
92
+
8993 static const struct ingenic_cgu_clk_info jz4770_cgu_clocks[] = {
9094
9195 /* External clocks */
....@@ -100,6 +104,7 @@
100104 .parents = { JZ4770_CLK_EXT },
101105 .pll = {
102106 .reg = CGU_REG_CPPCR0,
107
+ .rate_multiplier = 1,
103108 .m_shift = 24,
104109 .m_bits = 7,
105110 .m_offset = 1,
....@@ -110,6 +115,7 @@
110115 .od_bits = 2,
111116 .od_max = 8,
112117 .od_encoding = pll_od_encoding,
118
+ .bypass_reg = CGU_REG_CPPCR0,
113119 .bypass_bit = 9,
114120 .enable_bit = 8,
115121 .stable_bit = 10,
....@@ -122,6 +128,7 @@
122128 .parents = { JZ4770_CLK_EXT },
123129 .pll = {
124130 .reg = CGU_REG_CPPCR1,
131
+ .rate_multiplier = 1,
125132 .m_shift = 24,
126133 .m_bits = 7,
127134 .m_offset = 1,
....@@ -132,9 +139,10 @@
132139 .od_bits = 2,
133140 .od_max = 8,
134141 .od_encoding = pll_od_encoding,
142
+ .bypass_reg = CGU_REG_CPPCR1,
143
+ .no_bypass_bit = true,
135144 .enable_bit = 7,
136145 .stable_bit = 6,
137
- .no_bypass_bit = true,
138146 },
139147 },
140148
....@@ -143,34 +151,52 @@
143151 [JZ4770_CLK_CCLK] = {
144152 "cclk", CGU_CLK_DIV,
145153 .parents = { JZ4770_CLK_PLL0, },
146
- .div = { CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1 },
154
+ .div = {
155
+ CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1,
156
+ jz4770_cgu_cpccr_div_table,
157
+ },
147158 },
148159 [JZ4770_CLK_H0CLK] = {
149160 "h0clk", CGU_CLK_DIV,
150161 .parents = { JZ4770_CLK_PLL0, },
151
- .div = { CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1 },
162
+ .div = {
163
+ CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1,
164
+ jz4770_cgu_cpccr_div_table,
165
+ },
152166 },
153167 [JZ4770_CLK_H1CLK] = {
154168 "h1clk", CGU_CLK_DIV | CGU_CLK_GATE,
155169 .parents = { JZ4770_CLK_PLL0, },
156
- .div = { CGU_REG_CPCCR, 24, 1, 4, 22, -1, -1 },
170
+ .div = {
171
+ CGU_REG_CPCCR, 24, 1, 4, 22, -1, -1,
172
+ jz4770_cgu_cpccr_div_table,
173
+ },
157174 .gate = { CGU_REG_CLKGR1, 7 },
158175 },
159176 [JZ4770_CLK_H2CLK] = {
160177 "h2clk", CGU_CLK_DIV,
161178 .parents = { JZ4770_CLK_PLL0, },
162
- .div = { CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1 },
179
+ .div = {
180
+ CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1,
181
+ jz4770_cgu_cpccr_div_table,
182
+ },
163183 },
164184 [JZ4770_CLK_C1CLK] = {
165185 "c1clk", CGU_CLK_DIV | CGU_CLK_GATE,
166186 .parents = { JZ4770_CLK_PLL0, },
167
- .div = { CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1 },
187
+ .div = {
188
+ CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1,
189
+ jz4770_cgu_cpccr_div_table,
190
+ },
168191 .gate = { CGU_REG_OPCR, 31, true }, // disable CCLK stop on idle
169192 },
170193 [JZ4770_CLK_PCLK] = {
171194 "pclk", CGU_CLK_DIV,
172195 .parents = { JZ4770_CLK_PLL0, },
173
- .div = { CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1 },
196
+ .div = {
197
+ CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1,
198
+ jz4770_cgu_cpccr_div_table,
199
+ },
174200 },
175201
176202 /* Those divided clocks can connect to PLL0 or PLL1 */
....@@ -406,30 +432,6 @@
406432 },
407433 };
408434
409
-#if IS_ENABLED(CONFIG_PM_SLEEP)
410
-static int jz4770_cgu_pm_suspend(void)
411
-{
412
- u32 val;
413
-
414
- val = readl(cgu->base + CGU_REG_LCR);
415
- writel(val | LCR_LPM, cgu->base + CGU_REG_LCR);
416
- return 0;
417
-}
418
-
419
-static void jz4770_cgu_pm_resume(void)
420
-{
421
- u32 val;
422
-
423
- val = readl(cgu->base + CGU_REG_LCR);
424
- writel(val & ~LCR_LPM, cgu->base + CGU_REG_LCR);
425
-}
426
-
427
-static struct syscore_ops jz4770_cgu_pm_ops = {
428
- .suspend = jz4770_cgu_pm_suspend,
429
- .resume = jz4770_cgu_pm_resume,
430
-};
431
-#endif /* CONFIG_PM_SLEEP */
432
-
433435 static void __init jz4770_cgu_init(struct device_node *np)
434436 {
435437 int retval;
....@@ -445,10 +447,8 @@
445447 if (retval)
446448 pr_err("%s: failed to register CGU Clocks\n", __func__);
447449
448
-#if IS_ENABLED(CONFIG_PM_SLEEP)
449
- register_syscore_ops(&jz4770_cgu_pm_ops);
450
-#endif
450
+ ingenic_cgu_register_syscore_ops(cgu);
451451 }
452452
453453 /* We only probe via devicetree, no need for a platform driver */
454
-CLK_OF_DECLARE(jz4770_cgu, "ingenic,jz4770-cgu", jz4770_cgu_init);
454
+CLK_OF_DECLARE_DRIVER(jz4770_cgu, "ingenic,jz4770-cgu", jz4770_cgu_init);