Blame view

drivers/cpufreq/pxa2xx-cpufreq.c 13.4 KB
9e2697ff3   Russell King   [ARM] pxa: add cp...
1
  /*
9e2697ff3   Russell King   [ARM] pxa: add cp...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
   *  Copyright (C) 2002,2003 Intrinsyc Software
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   *
   * History:
   *   31-Jul-2002 : Initial version [FB]
   *   29-Jan-2003 : added PXA255 support [FB]
   *   20-Apr-2003 : ported to v2.5 (Dustin McIntire, Sensoria Corp.)
   *
   * Note:
   *   This driver may change the memory bus clock rate, but will not do any
   *   platform specific access timing changes... for example if you have flash
   *   memory connected to CS0, you will need to register a platform specific
   *   notifier which will adjust the memory access strobes to maintain a
   *   minimum strobe width.
   *
   */
1c5864e26   Joe Perches   cpufreq: Use cons...
31
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9e2697ff3   Russell King   [ARM] pxa: add cp...
32
33
34
35
36
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/sched.h>
  #include <linux/init.h>
  #include <linux/cpufreq.h>
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
37
38
  #include <linux/err.h>
  #include <linux/regulator/consumer.h>
ad68bb9f7   Marek Vasut   ARM: pxa: Access ...
39
  #include <linux/io.h>
9e2697ff3   Russell King   [ARM] pxa: add cp...
40

a09e64fbc   Russell King   [ARM] Move includ...
41
  #include <mach/pxa2xx-regs.h>
ad68bb9f7   Marek Vasut   ARM: pxa: Access ...
42
  #include <mach/smemc.h>
9e2697ff3   Russell King   [ARM] pxa: add cp...
43
44
45
  
  #ifdef DEBUG
  static unsigned int freq_debug;
c710e39cb   Randy Dunlap   [ARM] eliminate M...
46
  module_param(freq_debug, uint, 0);
9e2697ff3   Russell King   [ARM] pxa: add cp...
47
48
49
50
  MODULE_PARM_DESC(freq_debug, "Set the debug messages to on=1/off=0");
  #else
  #define freq_debug  0
  #endif
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
51
  static struct regulator *vcc_core;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
52
53
54
55
  static unsigned int pxa27x_maxfreq;
  module_param(pxa27x_maxfreq, uint, 0);
  MODULE_PARM_DESC(pxa27x_maxfreq, "Set the pxa27x maxfreq in MHz"
  		 "(typically 624=>pxa270, 416=>pxa271, 520=>pxa272)");
52352558d   Fabian Frederick   cpufreq: pxa: rep...
56
  struct pxa_freqs {
9e2697ff3   Russell King   [ARM] pxa: add cp...
57
58
59
60
  	unsigned int khz;
  	unsigned int membus;
  	unsigned int cccr;
  	unsigned int div2;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
61
  	unsigned int cclkcfg;
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
62
63
  	int vmin;
  	int vmax;
52352558d   Fabian Frederick   cpufreq: pxa: rep...
64
  };
9e2697ff3   Russell King   [ARM] pxa: add cp...
65
66
  
  /* Define the refresh period in mSec for the SDRAM and the number of rows */
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
67
  #define SDRAM_TREF	64	/* standard 64ms SDRAM */
a10c287d3   Philipp Zabel   [ARM] pxa: cpufre...
68
  static unsigned int sdram_rows;
9e2697ff3   Russell King   [ARM] pxa: add cp...
69

3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
70
71
  #define CCLKCFG_TURBO		0x1
  #define CCLKCFG_FCS		0x2
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
72
73
  #define CCLKCFG_HALFTURBO	0x4
  #define CCLKCFG_FASTBUS		0x8
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
74
75
  #define MDREFR_DB2_MASK		(MDREFR_K2DB2 | MDREFR_K1DB2)
  #define MDREFR_DRI_MASK		0xFFF
9e2697ff3   Russell King   [ARM] pxa: add cp...
76

a10c287d3   Philipp Zabel   [ARM] pxa: cpufre...
77
78
  #define MDCNFG_DRAC2(mdcnfg) (((mdcnfg) >> 21) & 0x3)
  #define MDCNFG_DRAC0(mdcnfg) (((mdcnfg) >> 5) & 0x3)
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
79
80
81
  /*
   * PXA255 definitions
   */
9e2697ff3   Russell King   [ARM] pxa: add cp...
82
  /* Use the run mode frequencies for the CPUFREQ_POLICY_PERFORMANCE policy */
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
83
  #define CCLKCFG			CCLKCFG_TURBO | CCLKCFG_FCS
03c229906   Fabian Frederick   cpufreq: pxa: mak...
84
  static const struct pxa_freqs pxa255_run_freqs[] =
9e2697ff3   Russell King   [ARM] pxa: add cp...
85
  {
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
86
87
88
89
90
91
92
  	/* CPU   MEMBUS  CCCR  DIV2 CCLKCFG	           run  turbo PXbus SDRAM */
  	{ 99500,  99500, 0x121, 1,  CCLKCFG, -1, -1},	/*  99,   99,   50,   50  */
  	{132700, 132700, 0x123, 1,  CCLKCFG, -1, -1},	/* 133,  133,   66,   66  */
  	{199100,  99500, 0x141, 0,  CCLKCFG, -1, -1},	/* 199,  199,   99,   99  */
  	{265400, 132700, 0x143, 1,  CCLKCFG, -1, -1},	/* 265,  265,  133,   66  */
  	{331800, 165900, 0x145, 1,  CCLKCFG, -1, -1},	/* 331,  331,  166,   83  */
  	{398100,  99500, 0x161, 0,  CCLKCFG, -1, -1},	/* 398,  398,  196,   99  */
9e2697ff3   Russell King   [ARM] pxa: add cp...
93
  };
9e2697ff3   Russell King   [ARM] pxa: add cp...
94
95
  
  /* Use the turbo mode frequencies for the CPUFREQ_POLICY_POWERSAVE policy */
03c229906   Fabian Frederick   cpufreq: pxa: mak...
96
  static const struct pxa_freqs pxa255_turbo_freqs[] =
9e2697ff3   Russell King   [ARM] pxa: add cp...
97
  {
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
98
  	/* CPU   MEMBUS  CCCR  DIV2 CCLKCFG	   run  turbo PXbus SDRAM */
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
99
100
101
102
103
  	{ 99500, 99500,  0x121, 1,  CCLKCFG, -1, -1},	/*  99,   99,   50,   50  */
  	{199100, 99500,  0x221, 0,  CCLKCFG, -1, -1},	/*  99,  199,   50,   99  */
  	{298500, 99500,  0x321, 0,  CCLKCFG, -1, -1},	/*  99,  287,   50,   99  */
  	{298600, 99500,  0x1c1, 0,  CCLKCFG, -1, -1},	/* 199,  287,   99,   99  */
  	{398100, 99500,  0x241, 0,  CCLKCFG, -1, -1},	/* 199,  398,   99,   99  */
9e2697ff3   Russell King   [ARM] pxa: add cp...
104
  };
9e2697ff3   Russell King   [ARM] pxa: add cp...
105

592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
106
107
108
109
110
  #define NUM_PXA25x_RUN_FREQS ARRAY_SIZE(pxa255_run_freqs)
  #define NUM_PXA25x_TURBO_FREQS ARRAY_SIZE(pxa255_turbo_freqs)
  
  static struct cpufreq_frequency_table
  	pxa255_run_freq_table[NUM_PXA25x_RUN_FREQS+1];
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
111
  static struct cpufreq_frequency_table
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
112
  	pxa255_turbo_freq_table[NUM_PXA25x_TURBO_FREQS+1];
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
113
114
115
  static unsigned int pxa255_turbo_table;
  module_param(pxa255_turbo_table, uint, 0);
  MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table, !0 = turbo table)");
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
  /*
   * PXA270 definitions
   *
   * For the PXA27x:
   * Control variables are A, L, 2N for CCCR; B, HT, T for CLKCFG.
   *
   * A = 0 => memory controller clock from table 3-7,
   * A = 1 => memory controller clock = system bus clock
   * Run mode frequency	= 13 MHz * L
   * Turbo mode frequency = 13 MHz * L * N
   * System bus frequency = 13 MHz * L / (B + 1)
   *
   * In CCCR:
   * A = 1
   * L = 16	  oscillator to run mode ratio
   * 2N = 6	  2 * (turbo mode to run mode ratio)
   *
   * In CCLKCFG:
   * B = 1	  Fast bus mode
   * HT = 0	  Half-Turbo mode
   * T = 1	  Turbo mode
   *
   * For now, just support some of the combinations in table 3-7 of
   * PXA27x Processor Family Developer's Manual to simplify frequency
   * change sequences.
   */
  #define PXA27x_CCCR(A, L, N2) (A << 25 | N2 << 7 | L)
  #define CCLKCFG2(B, HT, T) \
    (CCLKCFG_FCS | \
     ((B)  ? CCLKCFG_FASTBUS : 0) | \
     ((HT) ? CCLKCFG_HALFTURBO : 0) | \
     ((T)  ? CCLKCFG_TURBO : 0))
52352558d   Fabian Frederick   cpufreq: pxa: rep...
148
  static struct pxa_freqs pxa27x_freqs[] = {
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
149
  	{104000, 104000, PXA27x_CCCR(1,	 8, 2), 0, CCLKCFG2(1, 0, 1),  900000, 1705000 },
4367216a0   Dennis O'Brien   [ARM] pxa: workar...
150
  	{156000, 104000, PXA27x_CCCR(1,	 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 },
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
151
152
153
154
155
  	{208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 },
  	{312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 },
  	{416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 },
  	{520000, 208000, PXA27x_CCCR(1, 16, 5), 1, CCLKCFG2(1, 0, 1), 1450000, 1705000 },
  	{624000, 208000, PXA27x_CCCR(1, 16, 6), 1, CCLKCFG2(1, 0, 1), 1550000, 1705000 }
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
156
157
158
159
160
  };
  
  #define NUM_PXA27x_FREQS ARRAY_SIZE(pxa27x_freqs)
  static struct cpufreq_frequency_table
  	pxa27x_freq_table[NUM_PXA27x_FREQS+1];
9e2697ff3   Russell King   [ARM] pxa: add cp...
161
162
  
  extern unsigned get_clk_frequency_khz(int info);
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
163
  #ifdef CONFIG_REGULATOR
03c229906   Fabian Frederick   cpufreq: pxa: mak...
164
  static int pxa_cpufreq_change_voltage(const struct pxa_freqs *pxa_freq)
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  {
  	int ret = 0;
  	int vmin, vmax;
  
  	if (!cpu_is_pxa27x())
  		return 0;
  
  	vmin = pxa_freq->vmin;
  	vmax = pxa_freq->vmax;
  	if ((vmin == -1) || (vmax == -1))
  		return 0;
  
  	ret = regulator_set_voltage(vcc_core, vmin, vmax);
  	if (ret)
1c5864e26   Joe Perches   cpufreq: Use cons...
179
180
  		pr_err("Failed to set vcc_core in [%dmV..%dmV]
  ", vmin, vmax);
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
181
182
  	return ret;
  }
295dbde1c   Hanjun Guo   cpufreq / pxa2xx:...
183
  static void __init pxa_cpufreq_init_voltages(void)
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
184
185
186
  {
  	vcc_core = regulator_get(NULL, "vcc_core");
  	if (IS_ERR(vcc_core)) {
1c5864e26   Joe Perches   cpufreq: Use cons...
187
188
  		pr_info("Didn't find vcc_core regulator
  ");
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
189
190
  		vcc_core = NULL;
  	} else {
1c5864e26   Joe Perches   cpufreq: Use cons...
191
192
  		pr_info("Found vcc_core regulator
  ");
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
193
194
195
  	}
  }
  #else
fb2a24a1c   Arnd Bergmann   cpufreq: pxa2xx: ...
196
  static int pxa_cpufreq_change_voltage(const struct pxa_freqs *pxa_freq)
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
197
198
199
  {
  	return 0;
  }
295dbde1c   Hanjun Guo   cpufreq / pxa2xx:...
200
  static void __init pxa_cpufreq_init_voltages(void) { }
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
201
  #endif
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
202
  static void find_freq_tables(struct cpufreq_frequency_table **freq_table,
03c229906   Fabian Frederick   cpufreq: pxa: mak...
203
  			     const struct pxa_freqs **pxa_freqs)
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
204
205
  {
  	if (cpu_is_pxa25x()) {
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
206
  		if (!pxa255_turbo_table) {
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
207
208
  			*pxa_freqs = pxa255_run_freqs;
  			*freq_table = pxa255_run_freq_table;
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
209
  		} else {
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
210
211
  			*pxa_freqs = pxa255_turbo_freqs;
  			*freq_table = pxa255_turbo_freq_table;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
212
  		}
7264a2bbb   Arnd Bergmann   cpufreq: pxa2xx: ...
213
  	} else if (cpu_is_pxa27x()) {
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
214
215
  		*pxa_freqs = pxa27x_freqs;
  		*freq_table = pxa27x_freq_table;
7264a2bbb   Arnd Bergmann   cpufreq: pxa2xx: ...
216
217
  	} else {
  		BUG();
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
218
219
220
221
222
223
224
  	}
  }
  
  static void pxa27x_guess_max_freq(void)
  {
  	if (!pxa27x_maxfreq) {
  		pxa27x_maxfreq = 416000;
b49c22a6c   Joe Perches   cpufreq: Convert ...
225
226
227
  		pr_info("PXA CPU 27x max frequency not defined (pxa27x_maxfreq), assuming pxa271 with %dkHz maxfreq
  ",
  			pxa27x_maxfreq);
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
228
229
230
231
  	} else {
  		pxa27x_maxfreq *= 1000;
  	}
  }
a10c287d3   Philipp Zabel   [ARM] pxa: cpufre...
232
233
  static void init_sdram_rows(void)
  {
ad68bb9f7   Marek Vasut   ARM: pxa: Access ...
234
  	uint32_t mdcnfg = __raw_readl(MDCNFG);
a10c287d3   Philipp Zabel   [ARM] pxa: cpufre...
235
236
237
238
239
240
241
242
243
244
  	unsigned int drac2 = 0, drac0 = 0;
  
  	if (mdcnfg & (MDCNFG_DE2 | MDCNFG_DE3))
  		drac2 = MDCNFG_DRAC2(mdcnfg);
  
  	if (mdcnfg & (MDCNFG_DE0 | MDCNFG_DE1))
  		drac0 = MDCNFG_DRAC0(mdcnfg);
  
  	sdram_rows = 1 << (11 + max(drac0, drac2));
  }
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
245
246
  static u32 mdrefr_dri(unsigned int freq)
  {
3d3d0fbf4   Marek Vasut   [ARM] pxa: cpufre...
247
  	u32 interval = freq * SDRAM_TREF / sdram_rows;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
248

3d3d0fbf4   Marek Vasut   [ARM] pxa: cpufre...
249
  	return (interval - (cpu_is_pxa27x() ? 31 : 0)) / 32;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
250
  }
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
251
252
253
254
  static unsigned int pxa_cpufreq_get(unsigned int cpu)
  {
  	return get_clk_frequency_khz(0);
  }
9c0ebcf78   Viresh Kumar   cpufreq: Implemen...
255
  static int pxa_set_target(struct cpufreq_policy *policy, unsigned int idx)
9e2697ff3   Russell King   [ARM] pxa: add cp...
256
257
  {
  	struct cpufreq_frequency_table *pxa_freqs_table;
03c229906   Fabian Frederick   cpufreq: pxa: mak...
258
  	const struct pxa_freqs *pxa_freq_settings;
9e2697ff3   Russell King   [ARM] pxa: add cp...
259
  	unsigned long flags;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
260
261
  	unsigned int new_freq_cpu, new_freq_mem;
  	unsigned int unused, preset_mdrefr, postset_mdrefr, cclkcfg;
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
262
  	int ret = 0;
9e2697ff3   Russell King   [ARM] pxa: add cp...
263
264
  
  	/* Get the current policy */
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
265
  	find_freq_tables(&pxa_freqs_table, &pxa_freq_settings);
9e2697ff3   Russell King   [ARM] pxa: add cp...
266

592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
267
268
  	new_freq_cpu = pxa_freq_settings[idx].khz;
  	new_freq_mem = pxa_freq_settings[idx].membus;
9e2697ff3   Russell King   [ARM] pxa: add cp...
269
270
  
  	if (freq_debug)
d42028060   Joe Perches   ARM: pxa: remove ...
271
272
  		pr_debug("Changing CPU frequency to %d Mhz, (SDRAM %d Mhz)
  ",
d4019f0a9   Viresh Kumar   cpufreq: move fre...
273
  			 new_freq_cpu / 1000, (pxa_freq_settings[idx].div2) ?
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
274
  			 (new_freq_mem / 2000) : (new_freq_mem / 1000));
9e2697ff3   Russell King   [ARM] pxa: add cp...
275

d4019f0a9   Viresh Kumar   cpufreq: move fre...
276
  	if (vcc_core && new_freq_cpu > policy->cur) {
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
277
  		ret = pxa_cpufreq_change_voltage(&pxa_freq_settings[idx]);
d4019f0a9   Viresh Kumar   cpufreq: move fre...
278
279
280
  		if (ret)
  			return ret;
  	}
9e2697ff3   Russell King   [ARM] pxa: add cp...
281
282
  
  	/* Calculate the next MDREFR.  If we're slowing down the SDRAM clock
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
283
284
  	 * we need to preset the smaller DRI before the change.	 If we're
  	 * speeding up we need to set the larger DRI value after the change.
9e2697ff3   Russell King   [ARM] pxa: add cp...
285
  	 */
ad68bb9f7   Marek Vasut   ARM: pxa: Access ...
286
287
  	preset_mdrefr = postset_mdrefr = __raw_readl(MDREFR);
  	if ((preset_mdrefr & MDREFR_DRI_MASK) > mdrefr_dri(new_freq_mem)) {
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
288
289
  		preset_mdrefr = (preset_mdrefr & ~MDREFR_DRI_MASK);
  		preset_mdrefr |= mdrefr_dri(new_freq_mem);
9e2697ff3   Russell King   [ARM] pxa: add cp...
290
  	}
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
291
292
  	postset_mdrefr =
  		(postset_mdrefr & ~MDREFR_DRI_MASK) | mdrefr_dri(new_freq_mem);
9e2697ff3   Russell King   [ARM] pxa: add cp...
293
294
295
296
297
298
299
300
301
302
303
304
305
  
  	/* If we're dividing the memory clock by two for the SDRAM clock, this
  	 * must be set prior to the change.  Clearing the divide must be done
  	 * after the change.
  	 */
  	if (pxa_freq_settings[idx].div2) {
  		preset_mdrefr  |= MDREFR_DB2_MASK;
  		postset_mdrefr |= MDREFR_DB2_MASK;
  	} else {
  		postset_mdrefr &= ~MDREFR_DB2_MASK;
  	}
  
  	local_irq_save(flags);
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
306
  	/* Set new the CCCR and prepare CCLKCFG */
ea7743e27   Arnd Bergmann   ARM: pxa: define ...
307
  	writel(pxa_freq_settings[idx].cccr, CCCR);
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
308
  	cclkcfg = pxa_freq_settings[idx].cclkcfg;
9e2697ff3   Russell King   [ARM] pxa: add cp...
309
310
311
312
313
314
315
  
  	asm volatile("							
  \
  		ldr	r4, [%1]		/* load MDREFR */	
  \
  		b	2f						
  \
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
316
317
  		.align	5						
  \
9e2697ff3   Russell King   [ARM] pxa: add cp...
318
319
  1:									
  \
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
320
321
  		str	%3, [%1]		/* preset the MDREFR */	
  \
9e2697ff3   Russell King   [ARM] pxa: add cp...
322
323
  		mcr	p14, 0, %2, c6, c0, 0	/* set CCLKCFG[FCS] */	
  \
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
324
325
  		str	%4, [%1]		/* postset the MDREFR */ 
  \
9e2697ff3   Russell King   [ARM] pxa: add cp...
326
327
328
329
330
331
332
333
334
  									
  \
  		b	3f						
  \
  2:		b	1b						
  \
  3:		nop							
  \
  	  "
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
335
  		     : "=&r" (unused)
ad68bb9f7   Marek Vasut   ARM: pxa: Access ...
336
  		     : "r" (MDREFR), "r" (cclkcfg),
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
337
  		       "r" (preset_mdrefr), "r" (postset_mdrefr)
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
338
  		     : "r4", "r5");
9e2697ff3   Russell King   [ARM] pxa: add cp...
339
340
341
  	local_irq_restore(flags);
  
  	/*
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
342
343
344
345
346
347
348
349
  	 * Even if voltage setting fails, we don't report it, as the frequency
  	 * change succeeded. The voltage reduction is not a critical failure,
  	 * only power savings will suffer from this.
  	 *
  	 * Note: if the voltage change fails, and a return value is returned, a
  	 * bug is triggered (seems a deadlock). Should anybody find out where,
  	 * the "return 0" should become a "return ret".
  	 */
d4019f0a9   Viresh Kumar   cpufreq: move fre...
350
  	if (vcc_core && new_freq_cpu < policy->cur)
3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
351
  		ret = pxa_cpufreq_change_voltage(&pxa_freq_settings[idx]);
9e2697ff3   Russell King   [ARM] pxa: add cp...
352
353
  	return 0;
  }
50e77fcd7   Eric Miao   ARM: pxa: remove ...
354
  static int pxa_cpufreq_init(struct cpufreq_policy *policy)
9e2697ff3   Russell King   [ARM] pxa: add cp...
355
356
  {
  	int i;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
357
  	unsigned int freq;
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
358
  	struct cpufreq_frequency_table *pxa255_freq_table;
03c229906   Fabian Frederick   cpufreq: pxa: mak...
359
  	const struct pxa_freqs *pxa255_freqs;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
360
361
362
363
  
  	/* try to guess pxa27x cpu */
  	if (cpu_is_pxa27x())
  		pxa27x_guess_max_freq();
9e2697ff3   Russell King   [ARM] pxa: add cp...
364

3dbeef231   Robert Jarzmik   [ARM] pxa: add vc...
365
  	pxa_cpufreq_init_voltages();
a10c287d3   Philipp Zabel   [ARM] pxa: cpufre...
366
  	init_sdram_rows();
9e2697ff3   Russell King   [ARM] pxa: add cp...
367
  	/* set default policy and cpuinfo */
9e2697ff3   Russell King   [ARM] pxa: add cp...
368
  	policy->cpuinfo.transition_latency = 1000; /* FIXME: 1 ms, assumed */
9e2697ff3   Russell King   [ARM] pxa: add cp...
369

592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
370
371
  	/* Generate pxa25x the run cpufreq_frequency_table struct */
  	for (i = 0; i < NUM_PXA25x_RUN_FREQS; i++) {
9e2697ff3   Russell King   [ARM] pxa: add cp...
372
  		pxa255_run_freq_table[i].frequency = pxa255_run_freqs[i].khz;
507015880   Viresh Kumar   cpufreq: rename i...
373
  		pxa255_run_freq_table[i].driver_data = i;
9e2697ff3   Russell King   [ARM] pxa: add cp...
374
  	}
9e2697ff3   Russell King   [ARM] pxa: add cp...
375
  	pxa255_run_freq_table[i].frequency = CPUFREQ_TABLE_END;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
376
377
378
  
  	/* Generate pxa25x the turbo cpufreq_frequency_table struct */
  	for (i = 0; i < NUM_PXA25x_TURBO_FREQS; i++) {
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
379
380
  		pxa255_turbo_freq_table[i].frequency =
  			pxa255_turbo_freqs[i].khz;
507015880   Viresh Kumar   cpufreq: rename i...
381
  		pxa255_turbo_freq_table[i].driver_data = i;
9e2697ff3   Russell King   [ARM] pxa: add cp...
382
383
  	}
  	pxa255_turbo_freq_table[i].frequency = CPUFREQ_TABLE_END;
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
384
  	pxa255_turbo_table = !!pxa255_turbo_table;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
385
386
387
388
389
390
  	/* Generate the pxa27x cpufreq_frequency_table struct */
  	for (i = 0; i < NUM_PXA27x_FREQS; i++) {
  		freq = pxa27x_freqs[i].khz;
  		if (freq > pxa27x_maxfreq)
  			break;
  		pxa27x_freq_table[i].frequency = freq;
507015880   Viresh Kumar   cpufreq: rename i...
391
  		pxa27x_freq_table[i].driver_data = i;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
392
  	}
507015880   Viresh Kumar   cpufreq: rename i...
393
  	pxa27x_freq_table[i].driver_data = i;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
394
395
396
397
398
399
  	pxa27x_freq_table[i].frequency = CPUFREQ_TABLE_END;
  
  	/*
  	 * Set the policy's minimum and maximum frequencies from the tables
  	 * just constructed.  This sets cpuinfo.mxx_freq, min and max.
  	 */
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
400
401
  	if (cpu_is_pxa25x()) {
  		find_freq_tables(&pxa255_freq_table, &pxa255_freqs);
1c5864e26   Joe Perches   cpufreq: Use cons...
402
403
  		pr_info("using %s frequency table
  ",
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
404
  			pxa255_turbo_table ? "turbo" : "run");
6a77a1e64   Viresh Kumar   cpufreq: pxa: cal...
405

15cc921b9   Viresh Kumar   cpufreq: pxa: use...
406
  		cpufreq_table_validate_and_show(policy, pxa255_freq_table);
65587f7d1   Marc Zyngier   [ARM] pxa: cpufre...
407
  	}
6a77a1e64   Viresh Kumar   cpufreq: pxa: cal...
408
  	else if (cpu_is_pxa27x()) {
15cc921b9   Viresh Kumar   cpufreq: pxa: use...
409
  		cpufreq_table_validate_and_show(policy, pxa27x_freq_table);
6a77a1e64   Viresh Kumar   cpufreq: pxa: cal...
410
  	}
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
411

1c5864e26   Joe Perches   cpufreq: Use cons...
412
413
  	pr_info("frequency change support initialized
  ");
9e2697ff3   Russell King   [ARM] pxa: add cp...
414
415
416
417
418
  
  	return 0;
  }
  
  static struct cpufreq_driver pxa_cpufreq_driver = {
ae6b42713   Viresh Kumar   cpufreq: Mark ARM...
419
  	.flags	= CPUFREQ_NEED_INITIAL_FREQ_CHECK,
bf36e48d7   Viresh Kumar   cpufreq: pxa: Use...
420
  	.verify	= cpufreq_generic_frequency_table_verify,
9c0ebcf78   Viresh Kumar   cpufreq: Implemen...
421
  	.target_index = pxa_set_target,
9e2697ff3   Russell King   [ARM] pxa: add cp...
422
  	.init	= pxa_cpufreq_init,
ea833f0b5   Holger Schurig   [ARM] 4829/1: add...
423
  	.get	= pxa_cpufreq_get,
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
424
  	.name	= "PXA2xx",
9e2697ff3   Russell King   [ARM] pxa: add cp...
425
426
427
428
429
  };
  
  static int __init pxa_cpu_init(void)
  {
  	int ret = -ENODEV;
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
430
  	if (cpu_is_pxa25x() || cpu_is_pxa27x())
9e2697ff3   Russell King   [ARM] pxa: add cp...
431
432
433
434
435
436
  		ret = cpufreq_register_driver(&pxa_cpufreq_driver);
  	return ret;
  }
  
  static void __exit pxa_cpu_exit(void)
  {
592eb9997   Robert Jarzmik   [ARM] 5032/1: Add...
437
  	cpufreq_unregister_driver(&pxa_cpufreq_driver);
9e2697ff3   Russell King   [ARM] pxa: add cp...
438
  }
3679389b8   Robert Jarzmik   [ARM] 5031/1: Ind...
439
440
  MODULE_AUTHOR("Intrinsyc Software Inc.");
  MODULE_DESCRIPTION("CPU frequency changing driver for the PXA architecture");
9e2697ff3   Russell King   [ARM] pxa: add cp...
441
442
443
  MODULE_LICENSE("GPL");
  module_init(pxa_cpu_init);
  module_exit(pxa_cpu_exit);