hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/clk/clk-hsdk-pll.c
....@@ -12,6 +12,7 @@
1212 #include <linux/delay.h>
1313 #include <linux/device.h>
1414 #include <linux/err.h>
15
+#include <linux/io.h>
1516 #include <linux/of.h>
1617 #include <linux/of_address.h>
1718 #include <linux/of_device.h>
....@@ -52,35 +53,38 @@
5253 u32 fbdiv;
5354 u32 odiv;
5455 u32 band;
56
+ u32 bypass;
5557 };
5658
5759 static const struct hsdk_pll_cfg asdt_pll_cfg[] = {
58
- { 100000000, 0, 11, 3, 0 },
59
- { 133000000, 0, 15, 3, 0 },
60
- { 200000000, 1, 47, 3, 0 },
61
- { 233000000, 1, 27, 2, 0 },
62
- { 300000000, 1, 35, 2, 0 },
63
- { 333000000, 1, 39, 2, 0 },
64
- { 400000000, 1, 47, 2, 0 },
65
- { 500000000, 0, 14, 1, 0 },
66
- { 600000000, 0, 17, 1, 0 },
67
- { 700000000, 0, 20, 1, 0 },
68
- { 800000000, 0, 23, 1, 0 },
69
- { 900000000, 1, 26, 0, 0 },
70
- { 1000000000, 1, 29, 0, 0 },
71
- { 1100000000, 1, 32, 0, 0 },
72
- { 1200000000, 1, 35, 0, 0 },
73
- { 1300000000, 1, 38, 0, 0 },
74
- { 1400000000, 1, 41, 0, 0 },
75
- { 1500000000, 1, 44, 0, 0 },
76
- { 1600000000, 1, 47, 0, 0 },
60
+ { 100000000, 0, 11, 3, 0, 0 },
61
+ { 133000000, 0, 15, 3, 0, 0 },
62
+ { 200000000, 1, 47, 3, 0, 0 },
63
+ { 233000000, 1, 27, 2, 0, 0 },
64
+ { 300000000, 1, 35, 2, 0, 0 },
65
+ { 333000000, 1, 39, 2, 0, 0 },
66
+ { 400000000, 1, 47, 2, 0, 0 },
67
+ { 500000000, 0, 14, 1, 0, 0 },
68
+ { 600000000, 0, 17, 1, 0, 0 },
69
+ { 700000000, 0, 20, 1, 0, 0 },
70
+ { 800000000, 0, 23, 1, 0, 0 },
71
+ { 900000000, 1, 26, 0, 0, 0 },
72
+ { 1000000000, 1, 29, 0, 0, 0 },
73
+ { 1100000000, 1, 32, 0, 0, 0 },
74
+ { 1200000000, 1, 35, 0, 0, 0 },
75
+ { 1300000000, 1, 38, 0, 0, 0 },
76
+ { 1400000000, 1, 41, 0, 0, 0 },
77
+ { 1500000000, 1, 44, 0, 0, 0 },
78
+ { 1600000000, 1, 47, 0, 0, 0 },
7779 {}
7880 };
7981
8082 static const struct hsdk_pll_cfg hdmi_pll_cfg[] = {
81
- { 297000000, 0, 21, 2, 0 },
82
- { 540000000, 0, 19, 1, 0 },
83
- { 594000000, 0, 21, 1, 0 },
83
+ { 27000000, 0, 0, 0, 0, 1 },
84
+ { 148500000, 0, 21, 3, 0, 0 },
85
+ { 297000000, 0, 21, 2, 0, 0 },
86
+ { 540000000, 0, 19, 1, 0, 0 },
87
+ { 594000000, 0, 21, 1, 0, 0 },
8488 {}
8589 };
8690
....@@ -133,11 +137,16 @@
133137 {
134138 u32 val = 0;
135139
136
- /* Powerdown and Bypass bits should be cleared */
137
- val |= cfg->idiv << CGU_PLL_CTRL_IDIV_SHIFT;
138
- val |= cfg->fbdiv << CGU_PLL_CTRL_FBDIV_SHIFT;
139
- val |= cfg->odiv << CGU_PLL_CTRL_ODIV_SHIFT;
140
- val |= cfg->band << CGU_PLL_CTRL_BAND_SHIFT;
140
+ if (cfg->bypass) {
141
+ val = hsdk_pll_read(clk, CGU_PLL_CTRL);
142
+ val |= CGU_PLL_CTRL_BYPASS;
143
+ } else {
144
+ /* Powerdown and Bypass bits should be cleared */
145
+ val |= cfg->idiv << CGU_PLL_CTRL_IDIV_SHIFT;
146
+ val |= cfg->fbdiv << CGU_PLL_CTRL_FBDIV_SHIFT;
147
+ val |= cfg->odiv << CGU_PLL_CTRL_ODIV_SHIFT;
148
+ val |= cfg->band << CGU_PLL_CTRL_BAND_SHIFT;
149
+ }
141150
142151 dev_dbg(clk->dev, "write configuration: %#x\n", val);
143152
....@@ -171,13 +180,13 @@
171180
172181 dev_dbg(clk->dev, "current configuration: %#x\n", val);
173182
174
- /* Check if PLL is disabled */
175
- if (val & CGU_PLL_CTRL_PD)
176
- return 0;
177
-
178183 /* Check if PLL is bypassed */
179184 if (val & CGU_PLL_CTRL_BYPASS)
180185 return parent_rate;
186
+
187
+ /* Check if PLL is disabled */
188
+ if (val & CGU_PLL_CTRL_PD)
189
+ return 0;
181190
182191 /* input divider = reg.idiv + 1 */
183192 idiv = 1 + ((val & CGU_PLL_CTRL_IDIV_MASK) >> CGU_PLL_CTRL_IDIV_SHIFT);
....@@ -390,13 +399,13 @@
390399
391400 ret = clk_hw_register(NULL, &pll_clk->hw);
392401 if (ret) {
393
- pr_err("failed to register %s clock\n", node->name);
402
+ pr_err("failed to register %pOFn clock\n", node);
394403 goto err_unmap_spec_regs;
395404 }
396405
397406 ret = of_clk_add_hw_provider(node, of_clk_hw_simple_get, &pll_clk->hw);
398407 if (ret) {
399
- pr_err("failed to add hw provider for %s clock\n", node->name);
408
+ pr_err("failed to add hw provider for %pOFn clock\n", node);
400409 goto err_unmap_spec_regs;
401410 }
402411