Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Robert Jarzmik and committed by
Rafael J. Wysocki
d9278077 9bc70e69

+39 -152
+39 -152
drivers/cpufreq/pxa2xx-cpufreq.c
··· 58 58 MODULE_PARM_DESC(pxa27x_maxfreq, "Set the pxa27x maxfreq in MHz" 59 59 "(typically 624=>pxa270, 416=>pxa271, 520=>pxa272)"); 60 60 61 + struct pxa_cpufreq_data { 62 + struct clk *clk_core; 63 + }; 64 + static struct pxa_cpufreq_data pxa_cpufreq_data; 65 + 61 66 struct pxa_freqs { 62 67 unsigned int khz; 63 - unsigned int membus; 64 - unsigned int cccr; 65 - unsigned int div2; 66 - unsigned int cclkcfg; 67 68 int vmin; 68 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 */ 73 - static 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 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 - 91 75 static const struct pxa_freqs pxa255_run_freqs[] = 92 76 { 93 - /* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */ 94 - { 99500, 99500, 0x121, 1, CCLKCFG, -1, -1}, /* 99, 99, 50, 50 */ 95 - {132700, 132700, 0x123, 1, CCLKCFG, -1, -1}, /* 133, 133, 66, 66 */ 96 - {199100, 99500, 0x141, 0, CCLKCFG, -1, -1}, /* 199, 199, 99, 99 */ 97 - {265400, 132700, 0x143, 1, CCLKCFG, -1, -1}, /* 265, 265, 133, 66 */ 98 - {331800, 165900, 0x145, 1, CCLKCFG, -1, -1}, /* 331, 331, 166, 83 */ 99 - {398100, 99500, 0x161, 0, CCLKCFG, -1, -1}, /* 398, 398, 196, 99 */ 77 + /* CPU MEMBUS run turbo PXbus SDRAM */ 78 + { 99500, -1, -1}, /* 99, 99, 50, 50 */ 79 + {132700, -1, -1}, /* 133, 133, 66, 66 */ 80 + {199100, -1, -1}, /* 199, 199, 99, 99 */ 81 + {265400, -1, -1}, /* 265, 265, 133, 66 */ 82 + {331800, -1, -1}, /* 331, 331, 166, 83 */ 83 + {398100, -1, -1}, /* 398, 398, 196, 99 */ 100 84 }; 101 85 102 86 /* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */ 103 87 static const struct pxa_freqs pxa255_turbo_freqs[] = 104 88 { 105 - /* CPU MEMBUS CCCR DIV2 CCLKCFG run turbo PXbus SDRAM */ 106 - { 99500, 99500, 0x121, 1, CCLKCFG, -1, -1}, /* 99, 99, 50, 50 */ 107 - {199100, 99500, 0x221, 0, CCLKCFG, -1, -1}, /* 99, 199, 50, 99 */ 108 - {298500, 99500, 0x321, 0, CCLKCFG, -1, -1}, /* 99, 287, 50, 99 */ 109 - {298600, 99500, 0x1c1, 0, CCLKCFG, -1, -1}, /* 199, 287, 99, 99 */ 110 - {398100, 99500, 0x241, 0, CCLKCFG, -1, -1}, /* 199, 398, 99, 99 */ 89 + /* CPU run turbo PXbus SDRAM */ 90 + { 99500, -1, -1}, /* 99, 99, 50, 50 */ 91 + {199100, -1, -1}, /* 99, 199, 50, 99 */ 92 + {298500, -1, -1}, /* 99, 287, 50, 99 */ 93 + {298600, -1, -1}, /* 199, 287, 99, 99 */ 94 + {398100, -1, -1}, /* 199, 398, 99, 99 */ 111 95 }; 112 96 113 97 #define NUM_PXA25x_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs) ··· 106 122 module_param(pxa255_turbo_table, uint, 0); 107 123 MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table, !0 = turbo table)"); 108 124 109 - /* 110 - * PXA270 definitions 111 - * 112 - * For the PXA27x: 113 - * Control variables are A, L, 2N for CCCR; B, HT, T for CLKCFG. 114 - * 115 - * A = 0 => memory controller clock from table 3-7, 116 - * A = 1 => memory controller clock = system bus clock 117 - * Run mode frequency = 13 MHz * L 118 - * Turbo mode frequency = 13 MHz * L * N 119 - * System bus frequency = 13 MHz * L / (B + 1) 120 - * 121 - * In CCCR: 122 - * A = 1 123 - * L = 16 oscillator to run mode ratio 124 - * 2N = 6 2 * (turbo mode to run mode ratio) 125 - * 126 - * In CCLKCFG: 127 - * B = 1 Fast bus mode 128 - * HT = 0 Half-Turbo mode 129 - * T = 1 Turbo mode 130 - * 131 - * For now, just support some of the combinations in table 3-7 of 132 - * PXA27x Processor Family Developer's Manual to simplify frequency 133 - * change sequences. 134 - */ 135 - #define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L) 136 - #define CCLKCFG2(B, HT, T) \ 137 - (CCLKCFG_FCS | \ 138 - ((B) ? CCLKCFG_FASTBUS : 0) | \ 139 - ((HT) ? CCLKCFG_HALFTURBO : 0) | \ 140 - ((T) ? CCLKCFG_TURBO : 0)) 141 - 142 125 static struct pxa_freqs pxa27x_freqs[] = { 143 - {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 }, 144 - {156000, 104000, PXA27x_CCCR(1, 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 }, 145 - {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 }, 146 - {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 }, 147 - {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 }, 148 - {520000, 208000, PXA27x_CCCR(1, 16, 5), 1, CCLKCFG2(1, 0, 1), 1450000, 1705000 }, 149 - {624000, 208000, PXA27x_CCCR(1, 16, 6), 1, CCLKCFG2(1, 0, 1), 1550000, 1705000 } 126 + {104000, 900000, 1705000 }, 127 + {156000, 1000000, 1705000 }, 128 + {208000, 1180000, 1705000 }, 129 + {312000, 1250000, 1705000 }, 130 + {416000, 1350000, 1705000 }, 131 + {520000, 1450000, 1705000 }, 132 + {624000, 1550000, 1705000 } 150 133 }; 151 134 152 135 #define NUM_PXA27x_FREQS ARRAY_SIZE(pxa27x_freqs) ··· 192 241 } 193 242 } 194 243 195 - static void init_sdram_rows(void) 196 - { 197 - uint32_t mdcnfg = __raw_readl(MDCNFG); 198 - unsigned int drac2 = 0, drac0 = 0; 199 - 200 - if (mdcnfg & (MDCNFG_DE2 | MDCNFG_DE3)) 201 - drac2 = MDCNFG_DRAC2(mdcnfg); 202 - 203 - if (mdcnfg & (MDCNFG_DE0 | MDCNFG_DE1)) 204 - drac0 = MDCNFG_DRAC0(mdcnfg); 205 - 206 - sdram_rows = 1 << (11 + max(drac0, drac2)); 207 - } 208 - 209 - static u32 mdrefr_dri(unsigned int freq) 210 - { 211 - u32 interval = freq * SDRAM_TREF / sdram_rows; 212 - 213 - return (interval - (cpu_is_pxa27x() ? 31 : 0)) / 32; 214 - } 215 - 216 244 static unsigned int pxa_cpufreq_get(unsigned int cpu) 217 245 { 218 - return get_clk_frequency_khz(0); 246 + struct pxa_cpufreq_data *data = cpufreq_get_driver_data(); 247 + 248 + return (unsigned int) clk_get_rate(data->clk_core) / 1000; 219 249 } 220 250 221 251 static int pxa_set_target(struct cpufreq_policy *policy, unsigned int idx) 222 252 { 223 253 struct cpufreq_frequency_table *pxa_freqs_table; 224 254 const struct pxa_freqs *pxa_freq_settings; 225 - unsigned long flags; 226 - unsigned int new_freq_cpu, new_freq_mem; 227 - unsigned int unused, preset_mdrefr, postset_mdrefr, cclkcfg; 255 + struct pxa_cpufreq_data *data = cpufreq_get_driver_data(); 256 + unsigned int new_freq_cpu; 228 257 int ret = 0; 229 258 230 259 /* Get the current policy */ 231 260 find_freq_tables(&pxa_freqs_table, &pxa_freq_settings); 232 261 233 262 new_freq_cpu = pxa_freq_settings[idx].khz; 234 - new_freq_mem = pxa_freq_settings[idx].membus; 235 263 236 264 if (freq_debug) 237 - pr_debug("Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)\n", 238 - new_freq_cpu / 1000, (pxa_freq_settings[idx].div2) ? 239 - (new_freq_mem / 2000) : (new_freq_mem / 1000)); 265 + pr_debug("Changing CPU frequency from %d Mhz to %d Mhz\n", 266 + policy->cur / 1000, new_freq_cpu / 1000); 240 267 241 268 if (vcc_core && new_freq_cpu > policy->cur) { 242 269 ret = pxa_cpufreq_change_voltage(&pxa_freq_settings[idx]); ··· 222 293 return ret; 223 294 } 224 295 225 - /* Calculate the next MDREFR. If we're slowing down the SDRAM clock 226 - * we need to preset the smaller DRI before the change. If we're 227 - * speeding up we need to set the larger DRI value after the change. 228 - */ 229 - preset_mdrefr = postset_mdrefr = __raw_readl(MDREFR); 230 - if ((preset_mdrefr & MDREFR_DRI_MASK) > mdrefr_dri(new_freq_mem)) { 231 - preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK); 232 - preset_mdrefr |= mdrefr_dri(new_freq_mem); 233 - } 234 - postset_mdrefr = 235 - (postset_mdrefr & ~MDREFR_DRI_MASK) | mdrefr_dri(new_freq_mem); 236 - 237 - /* If we're dividing the memory clock by two for the SDRAM clock, this 238 - * must be set prior to the change. Clearing the divide must be done 239 - * after the change. 240 - */ 241 - if (pxa_freq_settings[idx].div2) { 242 - preset_mdrefr |= MDREFR_DB2_MASK; 243 - postset_mdrefr |= MDREFR_DB2_MASK; 244 - } else { 245 - postset_mdrefr &= ~MDREFR_DB2_MASK; 246 - } 247 - 248 - local_irq_save(flags); 249 - 250 - /* Set new the CCCR and prepare CCLKCFG */ 251 - writel(pxa_freq_settings[idx].cccr, CCCR); 252 - cclkcfg = pxa_freq_settings[idx].cclkcfg; 253 - 254 - asm volatile(" \n\ 255 - ldr r4, [%1] /* load MDREFR */ \n\ 256 - b 2f \n\ 257 - .align 5 \n\ 258 - 1: \n\ 259 - str %3, [%1] /* preset the MDREFR */ \n\ 260 - mcr p14, 0, %2, c6, c0, 0 /* set CCLKCFG[FCS] */ \n\ 261 - str %4, [%1] /* postset the MDREFR */ \n\ 262 - \n\ 263 - b 3f \n\ 264 - 2: b 1b \n\ 265 - 3: nop \n\ 266 - " 267 - : "=&r" (unused) 268 - : "r" (MDREFR), "r" (cclkcfg), 269 - "r" (preset_mdrefr), "r" (postset_mdrefr) 270 - : "r4", "r5"); 271 - local_irq_restore(flags); 296 + clk_set_rate(data->clk_core, new_freq_cpu * 1000); 272 297 273 298 /* 274 299 * Even if voltage setting fails, we don't report it, as the frequency ··· 251 368 pxa27x_guess_max_freq(); 252 369 253 370 pxa_cpufreq_init_voltages(); 254 - 255 - init_sdram_rows(); 256 371 257 372 /* set default policy and cpuinfo */ 258 373 policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */ ··· 310 429 .init = pxa_cpufreq_init, 311 430 .get = pxa_cpufreq_get, 312 431 .name = "PXA2xx", 432 + .driver_data = &pxa_cpufreq_data, 313 433 }; 314 434 315 435 static int __init pxa_cpu_init(void) 316 436 { 317 437 int ret = -ENODEV; 438 + 439 + pxa_cpufreq_data.clk_core = clk_get_sys(NULL, "core"); 440 + if (IS_ERR(pxa_cpufreq_data.clk_core)) 441 + return PTR_ERR(pxa_cpufreq_data.clk_core); 442 + 318 443 if (cpu_is_pxa25x() || cpu_is_pxa27x()) 319 444 ret = cpufreq_register_driver(&pxa_cpufreq_driver); 320 445 return ret;