aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Jarzmik <robert.jarzmik@free.fr>2017-10-14 17:51:02 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-10-21 07:20:49 -0400
commitd9278077385fd9207c00104fe6797283a099b061 (patch)
tree6ec7720934faf83d216b6e4c98dd528e244c187c
parent9bc70e6919f8cab80d5b240493007e4cce85559c (diff)
cpufreq: pxa: convert to clock API
As the clock settings have been introduced into the clock pxa drivers, which are now available to change the CPU clock by themselves, remove the clock handling from this driver, and rely on pxa clock drivers. Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
-rw-r--r--drivers/cpufreq/pxa2xx-cpufreq.c191
1 files changed, 39 insertions, 152 deletions
diff --git a/drivers/cpufreq/pxa2xx-cpufreq.c b/drivers/cpufreq/pxa2xx-cpufreq.c
index ce345bf34d5d..06b024a3e474 100644
--- a/drivers/cpufreq/pxa2xx-cpufreq.c
+++ b/drivers/cpufreq/pxa2xx-cpufreq.c
@@ -58,56 +58,40 @@ module_param(pxa27x_maxfreq, uint, 0);
58MODULE_PARM_DESC(pxa27x_maxfreq, "Set the pxa27x maxfreq in MHz" 58MODULE_PARM_DESC(pxa27x_maxfreq, "Set the pxa27x maxfreq in MHz"
59 "(typically 624=>pxa270, 416=>pxa271, 520=>pxa272)"); 59 "(typically 624=>pxa270, 416=>pxa271, 520=>pxa272)");
60 60
61struct pxa_cpufreq_data {
62 struct clk *clk_core;
63};
64static struct pxa_cpufreq_data pxa_cpufreq_data;
65
61struct pxa_freqs { 66struct pxa_freqs {
62 unsigned int khz; 67 unsigned int khz;
63 unsigned int membus;
64 unsigned int cccr;
65 unsigned int div2;
66 unsigned int cclkcfg;
67 int vmin; 68 int vmin;
68 int vmax; 69 int vmax;
69}; 70};
70 71
71/* Define the refresh period in mSec for the SDRAM and the number of rows */
72#define SDRAM_TREF 64 /* standard 64ms SDRAM */
73static unsigned int sdram_rows;
74
75#define CCLKCFG_TURBO 0x1
76#define CCLKCFG_FCS 0x2
77#define CCLKCFG_HALFTURBO 0x4
78#define CCLKCFG_FASTBUS 0x8
79#define MDREFR_DB2_MASK (MDREFR_K2DB2 | MDREFR_K1DB2)
80#define MDREFR_DRI_MASK 0xFFF
81
82#define MDCNFG_DRAC2(mdcnfg) (((mdcnfg) >> 21) & 0x3)
83#define MDCNFG_DRAC0(mdcnfg) (((mdcnfg) >> 5) & 0x3)
84
85/* 72/*
86 * PXA255 definitions 73 * PXA255 definitions
87 */ 74 */
88/* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */
89#define CCLKCFG CCLKCFG_TURBO | CCLKCFG_FCS
90
91static const struct pxa_freqs pxa255_run_freqs[] = 75static const struct pxa_freqs pxa255_run_freqs[] =
92{ 76{
93 /* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */ 77 /* CPU MEMBUS run turbo PXbus SDRAM */
94 { 99500, 99500, 0x121, 1, CCLKCFG, -1, -1}, /* 99, 99, 50, 50 */ 78 { 99500, -1, -1}, /* 99, 99, 50, 50 */
95 {132700, 132700, 0x123, 1, CCLKCFG, -1, -1}, /* 133, 133, 66, 66 */ 79 {132700, -1, -1}, /* 133, 133, 66, 66 */
96 {199100, 99500, 0x141, 0, CCLKCFG, -1, -1}, /* 199, 199, 99, 99 */ 80 {199100, -1, -1}, /* 199, 199, 99, 99 */
97 {265400, 132700, 0x143, 1, CCLKCFG, -1, -1}, /* 265, 265, 133, 66 */ 81 {265400, -1, -1}, /* 265, 265, 133, 66 */
98 {331800, 165900, 0x145, 1, CCLKCFG, -1, -1}, /* 331, 331, 166, 83 */ 82 {331800, -1, -1}, /* 331, 331, 166, 83 */
99 {398100, 99500, 0x161, 0, CCLKCFG, -1, -1}, /* 398, 398, 196, 99 */ 83 {398100, -1, -1}, /* 398, 398, 196, 99 */
100}; 84};
101 85
102/* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */ 86/* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */
103static const struct pxa_freqs pxa255_turbo_freqs[] = 87static const struct pxa_freqs pxa255_turbo_freqs[] =
104{ 88{
105 /* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */ 89 /* CPU run turbo PXbus SDRAM */
106 { 99500, 99500, 0x121, 1, CCLKCFG, -1, -1}, /* 99, 99, 50, 50 */ 90 { 99500, -1, -1}, /* 99, 99, 50, 50 */
107 {199100, 99500, 0x221, 0, CCLKCFG, -1, -1}, /* 99, 199, 50, 99 */ 91 {199100, -1, -1}, /* 99, 199, 50, 99 */
108 {298500, 99500, 0x321, 0, CCLKCFG, -1, -1}, /* 99, 287, 50, 99 */ 92 {298500, -1, -1}, /* 99, 287, 50, 99 */
109 {298600, 99500, 0x1c1, 0, CCLKCFG, -1, -1}, /* 199, 287, 99, 99 */ 93 {298600, -1, -1}, /* 199, 287, 99, 99 */
110 {398100, 99500, 0x241, 0, CCLKCFG, -1, -1}, /* 199, 398, 99, 99 */ 94 {398100, -1, -1}, /* 199, 398, 99, 99 */
111}; 95};
112 96
113#define NUM_PXA25x_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs) 97#define NUM_PXA25x_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs)
@@ -122,47 +106,14 @@ static unsigned int pxa255_turbo_table;
122module_param(pxa255_turbo_table, uint, 0); 106module_param(pxa255_turbo_table, uint, 0);
123MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table, !0 = turbo table)"); 107MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table, !0 = turbo table)");
124 108
125/*
126 * PXA270 definitions
127 *
128 * For the PXA27x:
129 * Control variables are A, L, 2N for CCCR; B, HT, T for CLKCFG.
130 *
131 * A = 0 => memory controller clock from table 3-7,
132 * A = 1 => memory controller clock = system bus clock
133 * Run mode frequency = 13 MHz * L
134 * Turbo mode frequency = 13 MHz * L * N
135 * System bus frequency = 13 MHz * L / (B + 1)
136 *
137 * In CCCR:
138 * A = 1
139 * L = 16 oscillator to run mode ratio
140 * 2N = 6 2 * (turbo mode to run mode ratio)
141 *
142 * In CCLKCFG:
143 * B = 1 Fast bus mode
144 * HT = 0 Half-Turbo mode
145 * T = 1 Turbo mode
146 *
147 * For now, just support some of the combinations in table 3-7 of
148 * PXA27x Processor Family Developer's Manual to simplify frequency
149 * change sequences.
150 */
151#define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L)
152#define CCLKCFG2(B, HT, T) \
153 (CCLKCFG_FCS | \
154 ((B) ? CCLKCFG_FASTBUS : 0) | \
155 ((HT) ? CCLKCFG_HALFTURBO : 0) | \
156 ((T) ? CCLKCFG_TURBO : 0))
157
158static struct pxa_freqs pxa27x_freqs[] = { 109static struct pxa_freqs pxa27x_freqs[] = {
159 {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 }, 110 {104000, 900000, 1705000 },
160 {156000, 104000, PXA27x_CCCR(1, 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 }, 111 {156000, 1000000, 1705000 },
161 {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 }, 112 {208000, 1180000, 1705000 },
162 {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 }, 113 {312000, 1250000, 1705000 },
163 {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 }, 114 {416000, 1350000, 1705000 },
164 {520000, 208000, PXA27x_CCCR(1, 16, 5), 1, CCLKCFG2(1, 0, 1), 1450000, 1705000 }, 115 {520000, 1450000, 1705000 },
165 {624000, 208000, PXA27x_CCCR(1, 16, 6), 1, CCLKCFG2(1, 0, 1), 1550000, 1705000 } 116 {624000, 1550000, 1705000 }
166}; 117};
167 118
168#define NUM_PXA27x_FREQS ARRAY_SIZE(pxa27x_freqs) 119#define NUM_PXA27x_FREQS ARRAY_SIZE(pxa27x_freqs)
@@ -241,51 +192,29 @@ static void pxa27x_guess_max_freq(void)
241 } 192 }
242} 193}
243 194
244static void init_sdram_rows(void)
245{
246 uint32_t mdcnfg = __raw_readl(MDCNFG);
247 unsigned int drac2 = 0, drac0 = 0;
248
249 if (mdcnfg & (MDCNFG_DE2 | MDCNFG_DE3))
250 drac2 = MDCNFG_DRAC2(mdcnfg);
251
252 if (mdcnfg & (MDCNFG_DE0 | MDCNFG_DE1))
253 drac0 = MDCNFG_DRAC0(mdcnfg);
254
255 sdram_rows = 1 << (11 + max(drac0, drac2));
256}
257
258static u32 mdrefr_dri(unsigned int freq)
259{
260 u32 interval = freq * SDRAM_TREF / sdram_rows;
261
262 return (interval - (cpu_is_pxa27x() ? 31 : 0)) / 32;
263}
264
265static unsigned int pxa_cpufreq_get(unsigned int cpu) 195static unsigned int pxa_cpufreq_get(unsigned int cpu)
266{ 196{
267 return get_clk_frequency_khz(0); 197 struct pxa_cpufreq_data *data = cpufreq_get_driver_data();
198
199 return (unsigned int) clk_get_rate(data->clk_core) / 1000;
268} 200}
269 201
270static int pxa_set_target(struct cpufreq_policy *policy, unsigned int idx) 202static int pxa_set_target(struct cpufreq_policy *policy, unsigned int idx)
271{ 203{
272 struct cpufreq_frequency_table *pxa_freqs_table; 204 struct cpufreq_frequency_table *pxa_freqs_table;
273 const struct pxa_freqs *pxa_freq_settings; 205 const struct pxa_freqs *pxa_freq_settings;
274 unsigned long flags; 206 struct pxa_cpufreq_data *data = cpufreq_get_driver_data();
275 unsigned int new_freq_cpu, new_freq_mem; 207 unsigned int new_freq_cpu;
276 unsigned int unused, preset_mdrefr, postset_mdrefr, cclkcfg;
277 int ret = 0; 208 int ret = 0;
278 209
279 /* Get the current policy */ 210 /* Get the current policy */
280 find_freq_tables(&pxa_freqs_table, &pxa_freq_settings); 211 find_freq_tables(&pxa_freqs_table, &pxa_freq_settings);
281 212
282 new_freq_cpu = pxa_freq_settings[idx].khz; 213 new_freq_cpu = pxa_freq_settings[idx].khz;
283 new_freq_mem = pxa_freq_settings[idx].membus;
284 214
285 if (freq_debug) 215 if (freq_debug)
286 pr_debug("Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", 216 pr_debug("Changing CPU frequency from %d Mhz to %d Mhz\n",
287 new_freq_cpu / 1000, (pxa_freq_settings[idx].div2) ? 217 policy->cur / 1000, new_freq_cpu / 1000);
288 (new_freq_mem / 2000) : (new_freq_mem / 1000));
289 218
290 if (vcc_core && new_freq_cpu > policy->cur) { 219 if (vcc_core && new_freq_cpu > policy->cur) {
291 ret = pxa_cpufreq_change_voltage(&pxa_freq_settings[idx]); 220 ret = pxa_cpufreq_change_voltage(&pxa_freq_settings[idx]);
@@ -293,53 +222,7 @@ static int pxa_set_target(struct cpufreq_policy *policy, unsigned int idx)
293 return ret; 222 return ret;
294 } 223 }
295 224
296 /* Calculate the next MDREFR. If we're slowing down the SDRAM clock 225 clk_set_rate(data->clk_core, new_freq_cpu * 1000);
297 * we need to preset the smaller DRI before the change. If we're
298 * speeding up we need to set the larger DRI value after the change.
299 */
300 preset_mdrefr = postset_mdrefr = __raw_readl(MDREFR);
301 if ((preset_mdrefr & MDREFR_DRI_MASK) > mdrefr_dri(new_freq_mem)) {
302 preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK);
303 preset_mdrefr |= mdrefr_dri(new_freq_mem);
304 }
305 postset_mdrefr =
306 (postset_mdrefr & ~MDREFR_DRI_MASK) | mdrefr_dri(new_freq_mem);
307
308 /* If we're dividing the memory clock by two for the SDRAM clock, this
309 * must be set prior to the change. Clearing the divide must be done
310 * after the change.
311 */
312 if (pxa_freq_settings[idx].div2) {
313 preset_mdrefr |= MDREFR_DB2_MASK;
314 postset_mdrefr |= MDREFR_DB2_MASK;
315 } else {
316 postset_mdrefr &= ~MDREFR_DB2_MASK;
317 }
318
319 local_irq_save(flags);
320
321 /* Set new the CCCR and prepare CCLKCFG */
322 writel(pxa_freq_settings[idx].cccr, CCCR);
323 cclkcfg = pxa_freq_settings[idx].cclkcfg;
324
325 asm volatile(" \n\
326 ldr r4, [%1] /* load MDREFR */ \n\
327 b 2f \n\
328 .align 5 \n\
3291: \n\
330 str %3, [%1] /* preset the MDREFR */ \n\
331 mcr p14, 0, %2, c6, c0, 0 /* set CCLKCFG[FCS] */ \n\
332 str %4, [%1] /* postset the MDREFR */ \n\
333 \n\
334 b 3f \n\
3352: b 1b \n\
3363: nop \n\
337 "
338 : "=&r" (unused)
339 : "r" (MDREFR), "r" (cclkcfg),
340 "r" (preset_mdrefr), "r" (postset_mdrefr)
341 : "r4", "r5");
342 local_irq_restore(flags);
343 226
344 /* 227 /*
345 * Even if voltage setting fails, we don't report it, as the frequency 228 * Even if voltage setting fails, we don't report it, as the frequency
@@ -369,8 +252,6 @@ static int pxa_cpufreq_init(struct cpufreq_policy *policy)
369 252
370 pxa_cpufreq_init_voltages(); 253 pxa_cpufreq_init_voltages();
371 254
372 init_sdram_rows();
373
374 /* set default policy and cpuinfo */ 255 /* set default policy and cpuinfo */
375 policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ 256 policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */
376 257
@@ -429,11 +310,17 @@ static struct cpufreq_driver pxa_cpufreq_driver = {
429 .init = pxa_cpufreq_init, 310 .init = pxa_cpufreq_init,
430 .get = pxa_cpufreq_get, 311 .get = pxa_cpufreq_get,
431 .name = "PXA2xx", 312 .name = "PXA2xx",
313 .driver_data = &pxa_cpufreq_data,
432}; 314};
433 315
434static int __init pxa_cpu_init(void) 316static int __init pxa_cpu_init(void)
435{ 317{
436 int ret = -ENODEV; 318 int ret = -ENODEV;
319
320 pxa_cpufreq_data.clk_core = clk_get_sys(NULL, "core");
321 if (IS_ERR(pxa_cpufreq_data.clk_core))
322 return PTR_ERR(pxa_cpufreq_data.clk_core);
323
437 if (cpu_is_pxa25x() || cpu_is_pxa27x()) 324 if (cpu_is_pxa25x() || cpu_is_pxa27x())
438 ret = cpufreq_register_driver(&pxa_cpufreq_driver); 325 ret = cpufreq_register_driver(&pxa_cpufreq_driver);
439 return ret; 326 return ret;