pxa2x0_apm.c revision 1.6 1 1.6 thorpej /* $NetBSD: pxa2x0_apm.c,v 1.6 2021/09/26 01:16:07 thorpej Exp $ */
2 1.1 ober /* $OpenBSD: pxa2x0_apm.c,v 1.28 2007/03/29 18:42:38 uwe Exp $ */
3 1.1 ober
4 1.1 ober /*-
5 1.1 ober * Copyright (c) 2001 Alexander Guy. All rights reserved.
6 1.1 ober * Copyright (c) 1998-2001 Michael Shalayeff. All rights reserved.
7 1.1 ober * Copyright (c) 1995 John T. Kohl. All rights reserved.
8 1.1 ober *
9 1.1 ober * Redistribution and use in source and binary forms, with or without
10 1.1 ober * modification, are permitted provided that the following conditions
11 1.1 ober * are met:
12 1.1 ober * 1. Redistributions of source code must retain the above copyright
13 1.1 ober * notice, this list of conditions and the following disclaimer.
14 1.1 ober * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 ober * notice, this list of conditions and the following disclaimer in the
16 1.1 ober * documentation and/or other materials provided with the distribution.
17 1.1 ober * 3. All advertising materials mentioning features or use of this software
18 1.1 ober * must display the following acknowledgement:
19 1.1 ober * This product includes software developed by the University of
20 1.1 ober * California, Berkeley and its contributors.
21 1.1 ober * 4. Neither the name of the University nor the names of its contributors
22 1.1 ober * may be used to endorse or promote products derived from this software
23 1.1 ober * without specific prior written permission.
24 1.1 ober *
25 1.1 ober * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
26 1.1 ober * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27 1.1 ober * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
28 1.1 ober * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 1.1 ober * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30 1.1 ober * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
31 1.1 ober * OR SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
32 1.1 ober * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
33 1.1 ober * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
34 1.1 ober * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35 1.1 ober * SUCH DAMAGE.
36 1.1 ober *
37 1.1 ober */
38 1.1 ober
39 1.1 ober #include <sys/param.h>
40 1.1 ober #include <sys/systm.h>
41 1.1 ober #include <sys/kernel.h>
42 1.1 ober #include <sys/kthread.h>
43 1.1 ober #include <sys/lock.h>
44 1.1 ober #include <sys/mount.h> /* for vfs_syncwait() */
45 1.1 ober #include <sys/proc.h>
46 1.1 ober #include <sys/device.h>
47 1.1 ober #include <sys/fcntl.h>
48 1.1 ober #include <sys/ioctl.h>
49 1.1 ober #include <sys/event.h>
50 1.1 ober
51 1.1 ober #include <machine/cpu.h>
52 1.1 ober #include <machine/apmvar.h>
53 1.1 ober
54 1.1 ober #include <arm/xscale/pxa2x0reg.h>
55 1.1 ober #include <arm/xscale/pxa2x0var.h>
56 1.1 ober #include <arm/xscale/pxa2x0_apm.h>
57 1.1 ober #include <arm/xscale/pxa2x0_gpio.h>
58 1.1 ober
59 1.1 ober #if defined(APMDEBUG)
60 1.1 ober #define DPRINTF(x) printf x
61 1.1 ober #else
62 1.1 ober #define DPRINTF(x) /**/
63 1.1 ober #endif
64 1.1 ober
65 1.1 ober #define APM_LOCK(sc) lockmgr(&(sc)->sc_lock, LK_EXCLUSIVE, NULL)
66 1.1 ober #define APM_UNLOCK(sc) lockmgr(&(sc)->sc_lock, LK_RELEASE, NULL)
67 1.1 ober
68 1.1 ober #define APMUNIT(dev) (minor(dev)&0xf0)
69 1.1 ober #define APMDEV(dev) (minor(dev)&0x0f)
70 1.1 ober #define APMDEV_NORMAL 0
71 1.1 ober #define APMDEV_CTL 8
72 1.1 ober
73 1.1 ober int apm_userstandbys;
74 1.1 ober int apm_suspends;
75 1.1 ober int apm_battlow;
76 1.1 ober
77 1.1 ober extern struct cfdriver zapm_cd;
78 1.1 ober
79 1.1 ober /* battery percentage at which we get verbose in our warnings. This
80 1.1 ober value can be changed using sysctl(8), value machdep.apmwarn.
81 1.1 ober Setting it to zero kills all warnings */
82 1.1 ober int cpu_apmwarn = 10;
83 1.1 ober
84 1.1 ober void apm_power_print(struct pxa2x0_apm_softc *, struct apm_power_info *);
85 1.1 ober void apm_power_info(struct pxa2x0_apm_softc *, struct apm_power_info *);
86 1.1 ober void apm_suspend(struct pxa2x0_apm_softc *);
87 1.1 ober void apm_resume(struct pxa2x0_apm_softc *);
88 1.1 ober int apm_get_event(struct pxa2x0_apm_softc *, u_int *);
89 1.1 ober int apm_handle_event(struct pxa2x0_apm_softc *, u_int);
90 1.1 ober void apm_thread_create(void *);
91 1.1 ober void apm_thread(void *);
92 1.1 ober
93 1.1 ober #if 0
94 1.1 ober extern int perflevel;
95 1.1 ober #endif
96 1.1 ober
97 1.1 ober int freq;
98 1.1 ober void pxa2x0_setperf(int speed);
99 1.1 ober int pxa2x0_cpuspeed(int *speed);
100 1.1 ober
101 1.1 ober int apm_record_event(struct pxa2x0_apm_softc *, u_int);
102 1.1 ober #if 0
103 1.1 ober void filt_apmrdetach(struct knote *kn);
104 1.1 ober int filt_apmread(struct knote *kn, long hint);
105 1.1 ober int apmkqfilter(dev_t dev, struct knote *kn);
106 1.1 ober
107 1.5 christos static const struct filterops apmread_filtops = {
108 1.6 thorpej .f_flags = FILTEROP_ISFD,
109 1.5 christos .f_attach = NULL,
110 1.5 christos .f_detach = filt_apmrdetach,
111 1.5 christos .f_event = filt_apmread,
112 1.5 christos };
113 1.1 ober #endif
114 1.1 ober
115 1.1 ober /*
116 1.1 ober * Flags to control kernel display
117 1.1 ober * SCFLAG_NOPRINT: do not output APM power messages due to
118 1.1 ober * a power change event.
119 1.1 ober *
120 1.1 ober * SCFLAG_PCTPRINT: do not output APM power messages due to
121 1.1 ober * to a power change event unless the battery
122 1.1 ober * percentage changes.
123 1.1 ober */
124 1.1 ober
125 1.1 ober #define SCFLAG_NOPRINT 0x0008000
126 1.1 ober #define SCFLAG_PCTPRINT 0x0004000
127 1.1 ober #define SCFLAG_PRINT (SCFLAG_NOPRINT|SCFLAG_PCTPRINT)
128 1.1 ober
129 1.1 ober #define SCFLAG_OREAD (1 << 0)
130 1.1 ober #define SCFLAG_OWRITE (1 << 1)
131 1.1 ober #define SCFLAG_OPEN (SCFLAG_OREAD|SCFLAG_OWRITE)
132 1.1 ober
133 1.1 ober /* This structure must be kept in sync with pxa2x0_apm_asm.S. */
134 1.1 ober struct pxa2x0_memcfg {
135 1.1 ober /* SDRAM refresh */
136 1.4 skrll uint32_t mdrefr_high; /* 0x00 */
137 1.4 skrll uint32_t mdrefr_low; /* 0x04 */
138 1.4 skrll uint32_t mdrefr_low2; /* 0x08 */
139 1.1 ober /* Synchronous, static, or VLIO interfaces */
140 1.4 skrll uint32_t msc_high[3]; /* 0x0c */
141 1.4 skrll uint32_t msc_low[3]; /* 0x18 */
142 1.1 ober /* XXX move up */
143 1.4 skrll uint32_t mdrefr_91; /* 0x24 */
144 1.1 ober };
145 1.1 ober
146 1.1 ober /* XXX */
147 1.1 ober #define MDREFR_C3000 (MDREFR_K0DB2 | MDREFR_E1PIN | MDREFR_K1RUN | \
148 1.1 ober MDREFR_K1DB2 | MDREFR_K2DB2 | MDREFR_APD)
149 1.1 ober #define MSC0_HIGH \
150 1.1 ober ( 7 << MSC_RRR_SHIFT << 16) | \
151 1.1 ober (15 << MSC_RDN_SHIFT << 16) | \
152 1.1 ober (15 << MSC_RDF_SHIFT << 16) | \
153 1.1 ober (MSC_RT_NONBURST << 16) | \
154 1.1 ober ( 2 << MSC_RRR_SHIFT) | \
155 1.1 ober (13 << MSC_RDN_SHIFT) | \
156 1.1 ober (13 << MSC_RDF_SHIFT) | \
157 1.1 ober MSC_RBW /* PXA271 */ | \
158 1.1 ober MSC_RT_NONBURST
159 1.1 ober #define MSC1_HIGH \
160 1.1 ober ( 7 << MSC_RRR_SHIFT << 16) | \
161 1.1 ober (15 << MSC_RDN_SHIFT << 16) | \
162 1.1 ober (15 << MSC_RDF_SHIFT << 16) | \
163 1.1 ober (MSC_RT_VLIO << 16) | \
164 1.1 ober ( 3 << MSC_RRR_SHIFT) | \
165 1.1 ober ( 4 << MSC_RDN_SHIFT) | \
166 1.1 ober (13 << MSC_RDF_SHIFT) | \
167 1.1 ober MSC_RT_VLIO
168 1.1 ober #define MSC2_HIGH \
169 1.1 ober ( 7 << MSC_RRR_SHIFT << 16) | \
170 1.1 ober (15 << MSC_RDN_SHIFT << 16) | \
171 1.1 ober (15 << MSC_RDF_SHIFT << 16) | \
172 1.1 ober (MSC_RT_NONBURST << 16) | \
173 1.1 ober ( 3 << MSC_RRR_SHIFT) | \
174 1.1 ober ( 4 << MSC_RDN_SHIFT) | \
175 1.1 ober (13 << MSC_RDF_SHIFT) | \
176 1.1 ober MSC_RT_VLIO
177 1.1 ober #define MSC0_LOW \
178 1.1 ober ( 7 << MSC_RRR_SHIFT << 16) | \
179 1.1 ober (15 << MSC_RDN_SHIFT << 16) | \
180 1.1 ober (15 << MSC_RDF_SHIFT << 16) | \
181 1.1 ober (MSC_RT_NONBURST << 16) | \
182 1.1 ober ( 1 << MSC_RRR_SHIFT) | \
183 1.1 ober ( 8 << MSC_RDN_SHIFT) | \
184 1.1 ober ( 8 << MSC_RDF_SHIFT) | \
185 1.1 ober MSC_RBW /* PXA271 */ | \
186 1.1 ober MSC_RT_NONBURST
187 1.1 ober #define MSC1_LOW \
188 1.1 ober ( 7 << MSC_RRR_SHIFT << 16) | \
189 1.1 ober (15 << MSC_RDN_SHIFT << 16) | \
190 1.1 ober (15 << MSC_RDF_SHIFT << 16) | \
191 1.1 ober (MSC_RT_VLIO << 16) | \
192 1.1 ober ( 1 << MSC_RRR_SHIFT) | \
193 1.1 ober ( 2 << MSC_RDN_SHIFT) | \
194 1.1 ober ( 6 << MSC_RDF_SHIFT) | \
195 1.1 ober MSC_RT_VLIO
196 1.1 ober #define MSC2_LOW \
197 1.1 ober ( 7 << MSC_RRR_SHIFT << 16) | \
198 1.1 ober (15 << MSC_RDN_SHIFT << 16) | \
199 1.1 ober (15 << MSC_RDF_SHIFT << 16) | \
200 1.1 ober (MSC_RT_NONBURST << 16) | \
201 1.1 ober ( 1 << MSC_RRR_SHIFT) | \
202 1.1 ober ( 2 << MSC_RDN_SHIFT) | \
203 1.1 ober ( 6 << MSC_RDF_SHIFT) | \
204 1.1 ober MSC_RT_VLIO
205 1.1 ober struct pxa2x0_memcfg pxa2x0_memcfg = {
206 1.1 ober (MDREFR_C3000 | 0x030),
207 1.1 ober (MDREFR_C3000 | 0x00b),
208 1.1 ober (MDREFR_C3000 | 0x017),
209 1.1 ober { MSC0_HIGH, MSC1_HIGH, MSC2_HIGH },
210 1.1 ober { MSC1_LOW, MSC1_LOW, MSC2_LOW },
211 1.1 ober (MDREFR_C3000 | 0x013)
212 1.1 ober };
213 1.1 ober
214 1.1 ober #define PI2C_RETRY_COUNT 10
215 1.1 ober /* XXX varies depending on voltage regulator IC. */
216 1.1 ober #define PI2C_VOLTAGE_LOW 0x13 /* 1.00V */
217 1.1 ober #define PI2C_VOLTAGE_HIGH 0x1a /* 1.35V */
218 1.1 ober
219 1.1 ober void pxa2x0_pi2c_open(bus_space_tag_t, bus_space_handle_t);
220 1.1 ober void pxa2x0_pi2c_close(bus_space_tag_t, bus_space_handle_t);
221 1.1 ober int pxa2x0_pi2c_read(bus_space_tag_t, bus_space_handle_t, u_char, u_char *);
222 1.1 ober int pxa2x0_pi2c_write(bus_space_tag_t, bus_space_handle_t, u_char, u_char);
223 1.1 ober int pxa2x0_pi2c_getvoltage(bus_space_tag_t, bus_space_handle_t, u_char *);
224 1.1 ober int pxa2x0_pi2c_setvoltage(bus_space_tag_t, bus_space_handle_t, u_char);
225 1.1 ober #if 0
226 1.1 ober void pxa2x0_pi2c_print(struct pxa2x0_apm_softc *);
227 1.1 ober #endif
228 1.1 ober
229 1.1 ober /* XXX used in pxa2x0_apm_asm.S */
230 1.1 ober bus_space_handle_t pxa2x0_gpio_ioh;
231 1.1 ober bus_space_handle_t pxa2x0_clkman_ioh;
232 1.1 ober bus_space_handle_t pxa2x0_memctl_ioh;
233 1.1 ober
234 1.1 ober /* pxa2x0_apm_asm.S */
235 1.1 ober void pxa27x_run_mode(void);
236 1.4 skrll void pxa27x_fastbus_run_mode(int, uint32_t);
237 1.1 ober void pxa27x_frequency_change(int, int, struct pxa2x0_memcfg *);
238 1.1 ober void pxa2x0_cpu_suspend(void);
239 1.1 ober void pxa2x0_cpu_resume(void);
240 1.1 ober void pxa27x_cpu_speed_high(void);
241 1.1 ober void pxa27x_cpu_speed_low(void);
242 1.1 ober void pxa27x_cpu_speed_91(void);
243 1.1 ober void pxa27x_cpu_speed_208(void);
244 1.1 ober
245 1.1 ober void
246 1.1 ober apm_power_print(struct pxa2x0_apm_softc *sc, struct apm_power_info *powerp)
247 1.1 ober {
248 1.1 ober
249 1.1 ober if (powerp->battery_life != APM_BATT_LIFE_UNKNOWN)
250 1.1 ober printf("%s: battery life expectancy %d%%\n",
251 1.3 chs device_xname(sc->sc_dev), powerp->battery_life);
252 1.1 ober
253 1.3 chs printf("%s: AC ", device_xname(sc->sc_dev));
254 1.1 ober switch (powerp->ac_state) {
255 1.1 ober case APM_AC_OFF:
256 1.1 ober printf("off,");
257 1.1 ober break;
258 1.1 ober case APM_AC_ON:
259 1.1 ober printf("on,");
260 1.1 ober break;
261 1.1 ober case APM_AC_BACKUP:
262 1.1 ober printf("backup power,");
263 1.1 ober break;
264 1.1 ober default:
265 1.1 ober case APM_AC_UNKNOWN:
266 1.1 ober printf("unknown,");
267 1.1 ober break;
268 1.1 ober }
269 1.1 ober
270 1.1 ober printf(" battery is ");
271 1.1 ober switch (powerp->battery_state) {
272 1.1 ober case APM_BATT_HIGH:
273 1.1 ober printf("high");
274 1.1 ober break;
275 1.1 ober case APM_BATT_LOW:
276 1.1 ober printf("low");
277 1.1 ober break;
278 1.1 ober case APM_BATT_CRITICAL:
279 1.1 ober printf("CRITICAL");
280 1.1 ober break;
281 1.1 ober case APM_BATT_CHARGING:
282 1.1 ober printf("charging");
283 1.1 ober break;
284 1.1 ober case APM_BATT_UNKNOWN:
285 1.1 ober printf("unknown");
286 1.1 ober break;
287 1.1 ober default:
288 1.1 ober printf("undecoded (%x)", powerp->battery_state);
289 1.1 ober break;
290 1.1 ober }
291 1.1 ober
292 1.1 ober printf("\n");
293 1.1 ober }
294 1.1 ober
295 1.1 ober void
296 1.1 ober apm_power_info(struct pxa2x0_apm_softc *sc,
297 1.1 ober struct apm_power_info *power)
298 1.1 ober {
299 1.1 ober
300 1.1 ober power->ac_state = APM_AC_UNKNOWN;
301 1.1 ober power->battery_state = APM_BATT_UNKNOWN;
302 1.1 ober power->battery_life = 0 /* APM_BATT_LIFE_UNKNOWN */;
303 1.1 ober power->minutes_left = 0;
304 1.1 ober
305 1.1 ober if (sc->sc_power_info != NULL)
306 1.1 ober sc->sc_power_info(sc, power);
307 1.1 ober }
308 1.1 ober
309 1.1 ober void
310 1.1 ober apm_suspend(struct pxa2x0_apm_softc *sc)
311 1.1 ober {
312 1.1 ober
313 1.1 ober resettodr();
314 1.1 ober
315 1.1 ober dopowerhooks(PWR_SUSPEND);
316 1.1 ober
317 1.1 ober #if 0
318 1.1 ober if (cold)
319 1.1 ober vfs_syncwait(0);
320 1.1 ober #endif
321 1.1 ober
322 1.1 ober if (sc->sc_suspend == NULL)
323 1.1 ober pxa2x0_wakeup_config(PXA2X0_WAKEUP_ALL, 1);
324 1.1 ober else
325 1.1 ober sc->sc_suspend(sc);
326 1.1 ober
327 1.1 ober pxa2x0_apm_sleep(sc);
328 1.1 ober }
329 1.1 ober
330 1.1 ober void
331 1.1 ober apm_resume(struct pxa2x0_apm_softc *sc)
332 1.1 ober {
333 1.1 ober
334 1.1 ober dopowerhooks(PWR_RESUME);
335 1.1 ober
336 1.1 ober inittodr(0);
337 1.1 ober
338 1.1 ober /*
339 1.1 ober * Clear the OTG Peripheral hold after running the pxaudc and pxaohci
340 1.1 ober * powerhooks to re-enable their operation. See 3.8.1.2
341 1.1 ober */
342 1.1 ober /* XXX ifdef NPXAUDC > 0 */
343 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PSSR, PSSR_OTGPH);
344 1.1 ober }
345 1.1 ober
346 1.1 ober #if 0
347 1.1 ober int
348 1.1 ober apm_get_event(struct pxa2x0_apm_softc *sc, u_int *typep)
349 1.1 ober {
350 1.1 ober
351 1.1 ober if (sc->sc_get_event != NULL)
352 1.1 ober return (sc->sc_get_event(sc, typep));
353 1.1 ober
354 1.1 ober *typep = APM_NOEVENT;
355 1.1 ober return (1);
356 1.1 ober }
357 1.1 ober
358 1.1 ober int
359 1.1 ober apm_handle_event(struct pxa2x0_apm_softc *sc, u_int type)
360 1.1 ober {
361 1.1 ober struct apm_power_info power;
362 1.1 ober int ret = 0;
363 1.1 ober
364 1.1 ober switch (type) {
365 1.1 ober case APM_NOEVENT:
366 1.1 ober ret = 1;
367 1.1 ober break;
368 1.1 ober case APM_CRIT_SUSPEND_REQ:
369 1.1 ober DPRINTF(("suspend required immediately\n"));
370 1.1 ober #if 0
371 1.1 ober /* XXX apmd would make us suspend again after resume. */
372 1.1 ober (void)apm_record_event(sc, type);
373 1.1 ober #endif
374 1.1 ober /*
375 1.1 ober * We ignore APM_CRIT_RESUME and just suspend here as usual
376 1.1 ober * to simplify the actual apm_get_event() implementation.
377 1.1 ober */
378 1.1 ober apm_suspends++;
379 1.1 ober ret = 1;
380 1.1 ober break;
381 1.1 ober case APM_USER_SUSPEND_REQ:
382 1.1 ober case APM_SUSPEND_REQ:
383 1.1 ober DPRINTF(("suspend requested\n"));
384 1.1 ober if (apm_record_event(sc, type)) {
385 1.1 ober DPRINTF(("suspend ourselves\n"));
386 1.1 ober apm_suspends++;
387 1.1 ober }
388 1.1 ober break;
389 1.1 ober case APM_POWER_CHANGE:
390 1.1 ober DPRINTF(("power status change\n"));
391 1.1 ober apm_power_info(sc, &power);
392 1.1 ober if (power.battery_life != APM_BATT_LIFE_UNKNOWN &&
393 1.1 ober power.battery_life < cpu_apmwarn &&
394 1.1 ober (sc->sc_flags & SCFLAG_PRINT) != SCFLAG_NOPRINT &&
395 1.1 ober ((sc->sc_flags & SCFLAG_PRINT) != SCFLAG_PCTPRINT ||
396 1.1 ober sc->sc_batt_life != power.battery_life)) {
397 1.1 ober sc->sc_batt_life = power.battery_life;
398 1.1 ober apm_power_print(sc, &power);
399 1.1 ober }
400 1.1 ober apm_record_event(sc, type);
401 1.1 ober break;
402 1.1 ober case APM_BATTERY_LOW:
403 1.1 ober DPRINTF(("Battery low!\n"));
404 1.1 ober apm_battlow++;
405 1.1 ober apm_record_event(sc, type);
406 1.1 ober break;
407 1.1 ober default:
408 1.1 ober DPRINTF(("apm_handle_event: unsupported event, code %d\n",
409 1.1 ober type));
410 1.1 ober }
411 1.1 ober
412 1.1 ober return (ret);
413 1.1 ober }
414 1.1 ober
415 1.1 ober void
416 1.1 ober apm_thread_create(void *v)
417 1.1 ober {
418 1.1 ober struct pxa2x0_apm_softc *sc = v;
419 1.1 ober
420 1.1 ober if (kthread_create(apm_thread, sc, &sc->sc_thread,
421 1.3 chs "%s", device_xname(sc->sc_dev))) {
422 1.1 ober /* apm_disconnect(sc); */
423 1.1 ober printf("%s: failed to create kernel thread, disabled",
424 1.3 chs device_xname(sc->sc_dev));
425 1.1 ober }
426 1.1 ober }
427 1.1 ober
428 1.1 ober void
429 1.1 ober apm_thread(void *v)
430 1.1 ober {
431 1.1 ober struct pxa2x0_apm_softc *sc = v;
432 1.1 ober u_int type;
433 1.1 ober
434 1.1 ober for (;;) {
435 1.1 ober APM_LOCK(sc);
436 1.1 ober
437 1.1 ober while (1) {
438 1.1 ober if (apm_get_event(sc, &type) != 0)
439 1.1 ober break;
440 1.1 ober if (apm_handle_event(sc, type) != 0)
441 1.1 ober break;
442 1.1 ober }
443 1.1 ober if (apm_suspends || apm_userstandbys /* || apm_battlow*/) {
444 1.1 ober apm_suspend(sc);
445 1.1 ober apm_resume(sc);
446 1.1 ober }
447 1.1 ober apm_battlow = apm_suspends = apm_userstandbys = 0;
448 1.1 ober
449 1.1 ober APM_UNLOCK(sc);
450 1.2 pooka kpause("apmev", false, hz, NULL);
451 1.1 ober }
452 1.1 ober }
453 1.1 ober
454 1.1 ober int
455 1.1 ober apmopen(dev_t dev, int flag, int mode, struct proc *p)
456 1.1 ober {
457 1.1 ober struct pxa2x0_apm_softc *sc;
458 1.1 ober int error = 0;
459 1.1 ober
460 1.1 ober /* apm0 only */
461 1.1 ober if (!zapm_cd.cd_ndevs || APMUNIT(dev) != 0 ||
462 1.1 ober !(sc = zapm_cd.cd_devs[APMUNIT(dev)]))
463 1.1 ober return (ENXIO);
464 1.1 ober
465 1.1 ober DPRINTF(("apmopen: dev %d pid %d flag %x mode %x\n",
466 1.1 ober APMDEV(dev), p->p_pid, flag, mode));
467 1.1 ober
468 1.1 ober switch (APMDEV(dev)) {
469 1.1 ober case APMDEV_CTL:
470 1.1 ober if (!(flag & FWRITE)) {
471 1.1 ober error = EINVAL;
472 1.1 ober break;
473 1.1 ober }
474 1.1 ober if (sc->sc_flags & SCFLAG_OWRITE) {
475 1.1 ober error = EBUSY;
476 1.1 ober break;
477 1.1 ober }
478 1.1 ober sc->sc_flags |= SCFLAG_OWRITE;
479 1.1 ober break;
480 1.1 ober case APMDEV_NORMAL:
481 1.1 ober if (!(flag & FREAD) || (flag & FWRITE)) {
482 1.1 ober error = EINVAL;
483 1.1 ober break;
484 1.1 ober }
485 1.1 ober sc->sc_flags |= SCFLAG_OREAD;
486 1.1 ober break;
487 1.1 ober default:
488 1.1 ober error = ENXIO;
489 1.1 ober break;
490 1.1 ober }
491 1.1 ober return (error);
492 1.1 ober }
493 1.1 ober
494 1.1 ober int
495 1.1 ober apmclose(dev_t dev, int flag, int mode, struct proc *p)
496 1.1 ober {
497 1.1 ober struct pxa2x0_apm_softc *sc;
498 1.1 ober
499 1.1 ober /* apm0 only */
500 1.1 ober if (!apm_cd.cd_ndevs || APMUNIT(dev) != 0 ||
501 1.1 ober !(sc = apm_cd.cd_devs[APMUNIT(dev)]))
502 1.1 ober return (ENXIO);
503 1.1 ober
504 1.1 ober DPRINTF(("apmclose: pid %d flag %x mode %x\n", p->p_pid, flag, mode));
505 1.1 ober
506 1.1 ober switch (APMDEV(dev)) {
507 1.1 ober case APMDEV_CTL:
508 1.1 ober sc->sc_flags &= ~SCFLAG_OWRITE;
509 1.1 ober break;
510 1.1 ober case APMDEV_NORMAL:
511 1.1 ober sc->sc_flags &= ~SCFLAG_OREAD;
512 1.1 ober break;
513 1.1 ober }
514 1.1 ober return (0);
515 1.1 ober }
516 1.1 ober
517 1.1 ober int
518 1.1 ober apmioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct proc *p)
519 1.1 ober {
520 1.1 ober struct pxa2x0_apm_softc *sc;
521 1.1 ober struct apm_power_info *power;
522 1.1 ober int error = 0;
523 1.1 ober
524 1.1 ober /* apm0 only */
525 1.1 ober if (!apm_cd.cd_ndevs || APMUNIT(dev) != 0 ||
526 1.1 ober !(sc = apm_cd.cd_devs[APMUNIT(dev)]))
527 1.1 ober return (ENXIO);
528 1.1 ober
529 1.1 ober switch (cmd) {
530 1.1 ober /* some ioctl names from linux */
531 1.1 ober case APM_IOC_STANDBY:
532 1.1 ober if ((flag & FWRITE) == 0)
533 1.1 ober error = EBADF;
534 1.1 ober else
535 1.1 ober apm_userstandbys++;
536 1.1 ober break;
537 1.1 ober case APM_IOC_SUSPEND:
538 1.1 ober if ((flag & FWRITE) == 0)
539 1.1 ober error = EBADF;
540 1.1 ober else
541 1.1 ober apm_suspends++; /* XXX */
542 1.1 ober break;
543 1.1 ober case APM_IOC_PRN_CTL:
544 1.1 ober if ((flag & FWRITE) == 0)
545 1.1 ober error = EBADF;
546 1.1 ober else {
547 1.1 ober int flag = *(int *)data;
548 1.1 ober DPRINTF(( "APM_IOC_PRN_CTL: %d\n", flag ));
549 1.1 ober switch (flag) {
550 1.1 ober case APM_PRINT_ON: /* enable printing */
551 1.1 ober sc->sc_flags &= ~SCFLAG_PRINT;
552 1.1 ober break;
553 1.1 ober case APM_PRINT_OFF: /* disable printing */
554 1.1 ober sc->sc_flags &= ~SCFLAG_PRINT;
555 1.1 ober sc->sc_flags |= SCFLAG_NOPRINT;
556 1.1 ober break;
557 1.1 ober case APM_PRINT_PCT: /* disable some printing */
558 1.1 ober sc->sc_flags &= ~SCFLAG_PRINT;
559 1.1 ober sc->sc_flags |= SCFLAG_PCTPRINT;
560 1.1 ober break;
561 1.1 ober default:
562 1.1 ober error = EINVAL;
563 1.1 ober break;
564 1.1 ober }
565 1.1 ober }
566 1.1 ober break;
567 1.1 ober case APM_IOC_DEV_CTL:
568 1.1 ober if ((flag & FWRITE) == 0)
569 1.1 ober error = EBADF;
570 1.1 ober break;
571 1.1 ober case APM_IOC_GETPOWER:
572 1.1 ober power = (struct apm_power_info *)data;
573 1.1 ober apm_power_info(sc, power);
574 1.1 ober break;
575 1.1 ober
576 1.1 ober default:
577 1.1 ober error = ENOTTY;
578 1.1 ober }
579 1.1 ober
580 1.1 ober return (error);
581 1.1 ober }
582 1.1 ober
583 1.1 ober int
584 1.1 ober apm_record_event(struct pxa2x0_apm_softc *sc, u_int type)
585 1.1 ober {
586 1.1 ober static int apm_evindex;
587 1.1 ober
588 1.1 ober /* skip if no user waiting */
589 1.1 ober if ((sc->sc_flags & SCFLAG_OPEN) == 0)
590 1.1 ober return (1);
591 1.1 ober
592 1.1 ober apm_evindex++;
593 1.1 ober KNOTE(&sc->sc_note, APM_EVENT_COMPOSE(type, apm_evindex));
594 1.1 ober
595 1.1 ober return (0);
596 1.1 ober }
597 1.1 ober
598 1.1 ober void
599 1.1 ober filt_apmrdetach(struct knote *kn)
600 1.1 ober {
601 1.1 ober struct pxa2x0_apm_softc *sc =
602 1.1 ober (struct pxa2x0_apm_softc *)kn->kn_hook;
603 1.1 ober
604 1.1 ober SLIST_REMOVE(&sc->sc_note, kn, knote, kn_selnext);
605 1.1 ober }
606 1.1 ober
607 1.1 ober int
608 1.1 ober filt_apmread(struct knote *kn, long hint)
609 1.1 ober {
610 1.1 ober /* XXX weird kqueue_scan() semantics */
611 1.1 ober if (hint && !kn->kn_data)
612 1.1 ober kn->kn_data = (int)hint;
613 1.1 ober
614 1.1 ober return (1);
615 1.1 ober }
616 1.1 ober
617 1.1 ober int
618 1.1 ober apmkqfilter(dev_t dev, struct knote *kn)
619 1.1 ober {
620 1.1 ober struct pxa2x0_apm_softc *sc;
621 1.1 ober
622 1.1 ober /* apm0 only */
623 1.1 ober if (!apm_cd.cd_ndevs || APMUNIT(dev) != 0 ||
624 1.1 ober !(sc = apm_cd.cd_devs[APMUNIT(dev)]))
625 1.1 ober return (ENXIO);
626 1.1 ober
627 1.1 ober switch (kn->kn_filter) {
628 1.1 ober case EVFILT_READ:
629 1.1 ober kn->kn_fop = &apmread_filtops;
630 1.1 ober break;
631 1.1 ober default:
632 1.1 ober return (1);
633 1.1 ober }
634 1.1 ober
635 1.1 ober kn->kn_hook = (caddr_t)sc;
636 1.1 ober SLIST_INSERT_HEAD(&sc->sc_note, kn, kn_selnext);
637 1.1 ober
638 1.1 ober return (0);
639 1.1 ober }
640 1.1 ober
641 1.1 ober void
642 1.1 ober pxa2x0_apm_attach_sub(struct pxa2x0_apm_softc *sc)
643 1.1 ober {
644 1.1 ober
645 1.1 ober sc->sc_iot = &pxa2x0_bs_tag;
646 1.1 ober
647 1.1 ober if (bus_space_map(sc->sc_iot, PXA2X0_POWMAN_BASE,
648 1.1 ober PXA2X0_POWMAN_SIZE, 0, &sc->sc_pm_ioh)) {
649 1.1 ober printf("pxa2x0_apm_attach_sub: failed to map POWMAN\n");
650 1.1 ober return;
651 1.1 ober }
652 1.1 ober
653 1.1 ober lockinit(&sc->sc_lock, PWAIT, "apmlk", 0, 0);
654 1.1 ober
655 1.1 ober kthread_create_deferred(apm_thread_create, sc);
656 1.1 ober
657 1.1 ober printf("\n");
658 1.1 ober
659 1.1 ober if (bus_space_map(sc->sc_iot, PXA2X0_CLKMAN_BASE, PXA2X0_CLKMAN_SIZE,
660 1.1 ober 0, &pxa2x0_clkman_ioh)) {
661 1.3 chs printf("%s: failed to map CLKMAN\n", device_xname(sc->sc_dev));
662 1.1 ober return;
663 1.1 ober }
664 1.1 ober
665 1.1 ober if (bus_space_map(sc->sc_iot, PXA2X0_MEMCTL_BASE, PXA2X0_MEMCTL_SIZE,
666 1.1 ober 0, &pxa2x0_memctl_ioh)) {
667 1.3 chs printf("%s: failed to map MEMCTL\n", device_xname(sc->sc_dev));
668 1.1 ober return;
669 1.1 ober }
670 1.1 ober sc->sc_memctl_ioh = pxa2x0_memctl_ioh;
671 1.1 ober
672 1.1 ober if (bus_space_map(sc->sc_iot, PXA2X0_GPIO_BASE, PXA2X0_GPIO_SIZE,
673 1.1 ober 0, &pxa2x0_gpio_ioh)) {
674 1.3 chs printf("%s: can't map GPIO\n", device_xname(sc->sc_dev));
675 1.1 ober return;
676 1.1 ober }
677 1.1 ober
678 1.1 ober /* Clear all reset status flags. */
679 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_RCSR,
680 1.1 ober RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR);
681 1.1 ober }
682 1.1 ober #endif /* 0 */
683 1.1 ober
684 1.1 ober void
685 1.1 ober pxa2x0_wakeup_config(u_int wsrc, int enable)
686 1.1 ober {
687 1.1 ober struct pxa2x0_apm_softc *sc;
688 1.4 skrll uint32_t prer;
689 1.4 skrll uint32_t pfer;
690 1.4 skrll uint32_t pkwr;
691 1.1 ober
692 1.1 ober if (zapm_cd.cd_ndevs < 1 || zapm_cd.cd_devs[0] == NULL)
693 1.1 ober return;
694 1.1 ober sc = device_private(zapm_cd.cd_devs[0]);
695 1.1 ober
696 1.1 ober prer = pfer = pkwr = 0;
697 1.1 ober
698 1.1 ober if ((wsrc & PXA2X0_WAKEUP_POWERON) != 0) {
699 1.1 ober prer |= (1<<0);
700 1.1 ober pfer |= (1<<0);
701 1.1 ober pkwr |= (1<<12); /* XXX */
702 1.1 ober }
703 1.1 ober
704 1.1 ober if ((wsrc & PXA2X0_WAKEUP_GPIORST) != 0)
705 1.1 ober pfer |= (1<<1);
706 1.1 ober if ((wsrc & PXA2X0_WAKEUP_SD) != 0)
707 1.1 ober prer |= (1<<9);
708 1.1 ober if ((wsrc & PXA2X0_WAKEUP_RC) != 0)
709 1.1 ober prer |= (1<<13);
710 1.1 ober if ((wsrc & PXA2X0_WAKEUP_SYNC) != 0)
711 1.1 ober pkwr |= (1<<1);
712 1.1 ober if ((wsrc & PXA2X0_WAKEUP_KEYNS0) != 0)
713 1.1 ober prer |= (1<<12);
714 1.1 ober if ((wsrc & PXA2X0_WAKEUP_KEYNS1) != 0)
715 1.1 ober pkwr |= (1<<2);
716 1.1 ober if ((wsrc & PXA2X0_WAKEUP_KEYNS2) != 0)
717 1.1 ober pkwr |= (1<<9);
718 1.1 ober if ((wsrc & PXA2X0_WAKEUP_KEYNS3) != 0)
719 1.1 ober pkwr |= (1<<3);
720 1.1 ober if ((wsrc & PXA2X0_WAKEUP_KEYNS4) != 0)
721 1.1 ober pkwr |= (1<<4);
722 1.1 ober if ((wsrc & PXA2X0_WAKEUP_KEYNS5) != 0)
723 1.1 ober pkwr |= (1<<6);
724 1.1 ober if ((wsrc & PXA2X0_WAKEUP_KEYNS6) != 0)
725 1.1 ober pkwr |= (1<<7);
726 1.1 ober if ((wsrc & PXA2X0_WAKEUP_CF0) != 0)
727 1.1 ober pkwr |= (1<<11);
728 1.1 ober if ((wsrc & PXA2X0_WAKEUP_CF1) != 0)
729 1.1 ober pkwr |= (1<<10);
730 1.1 ober if ((wsrc & PXA2X0_WAKEUP_USBD) != 0)
731 1.1 ober prer |= (1<<24);
732 1.1 ober
733 1.1 ober if ((wsrc & PXA2X0_WAKEUP_LOCKSW) != 0) {
734 1.1 ober prer |= (1<<15);
735 1.1 ober pfer |= (1<<15);
736 1.1 ober }
737 1.1 ober
738 1.1 ober if ((wsrc & PXA2X0_WAKEUP_JACKIN) != 0) {
739 1.1 ober prer |= (1<<23);
740 1.1 ober pfer |= (1<<23);
741 1.1 ober }
742 1.1 ober
743 1.1 ober if ((wsrc & PXA2X0_WAKEUP_CHRGFULL) != 0)
744 1.1 ober pkwr |= (1<<18);
745 1.1 ober if ((wsrc & PXA2X0_WAKEUP_RTC) != 0)
746 1.1 ober prer |= (1<<31);
747 1.1 ober
748 1.1 ober if (enable) {
749 1.1 ober sc->sc_wakeon |= wsrc;
750 1.1 ober prer |= bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh,
751 1.1 ober POWMAN_PRER);
752 1.1 ober pfer |= bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh,
753 1.1 ober POWMAN_PFER);
754 1.1 ober pkwr |= bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh,
755 1.1 ober POWMAN_PKWR);
756 1.1 ober } else {
757 1.1 ober sc->sc_wakeon &= ~wsrc;
758 1.1 ober prer = bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh,
759 1.1 ober POWMAN_PRER) & ~prer;
760 1.1 ober pfer = bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh,
761 1.1 ober POWMAN_PFER) & ~pfer;
762 1.1 ober pkwr = bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh,
763 1.1 ober POWMAN_PKWR) & ~pkwr;
764 1.1 ober }
765 1.1 ober
766 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PKWR, pkwr);
767 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PRER, prer);
768 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PFER, pfer);
769 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PWER,
770 1.1 ober prer | pfer);
771 1.1 ober }
772 1.1 ober
773 1.1 ober u_int
774 1.1 ober pxa2x0_wakeup_status(void)
775 1.1 ober {
776 1.1 ober struct pxa2x0_apm_softc *sc;
777 1.4 skrll uint32_t rv;
778 1.1 ober u_int wsrc;
779 1.1 ober
780 1.1 ober if (zapm_cd.cd_ndevs < 1 || zapm_cd.cd_devs[0] == NULL)
781 1.1 ober return (0);
782 1.1 ober
783 1.1 ober sc = device_private(zapm_cd.cd_devs[0]);
784 1.1 ober wsrc = 0;
785 1.1 ober
786 1.1 ober rv = bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PEDR);
787 1.1 ober if ((rv & (1<<0)) != 0)
788 1.1 ober wsrc |= PXA2X0_WAKEUP_POWERON;
789 1.1 ober if ((rv & (1<<1)) != 0)
790 1.1 ober wsrc |= PXA2X0_WAKEUP_GPIORST;
791 1.1 ober if ((rv & (1<<9)) != 0)
792 1.1 ober wsrc |= PXA2X0_WAKEUP_SD;
793 1.1 ober if ((rv & (1<<12)) != 0)
794 1.1 ober wsrc |= PXA2X0_WAKEUP_KEYNS0;
795 1.1 ober if ((rv & (1<<13)) != 0)
796 1.1 ober wsrc |= PXA2X0_WAKEUP_RC;
797 1.1 ober if ((rv & (1<<15)) != 0)
798 1.1 ober wsrc |= PXA2X0_WAKEUP_LOCKSW;
799 1.1 ober if ((rv & (1<<23)) != 0)
800 1.1 ober wsrc |= PXA2X0_WAKEUP_JACKIN;
801 1.1 ober if ((rv & (1<<24)) != 0)
802 1.1 ober wsrc |= PXA2X0_WAKEUP_USBD;
803 1.1 ober if ((rv & (1<<31)) != 0)
804 1.1 ober wsrc |= PXA2X0_WAKEUP_RTC;
805 1.1 ober
806 1.1 ober rv = bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PKSR);
807 1.1 ober if ((rv & (1<<1)) != 0)
808 1.1 ober wsrc |= PXA2X0_WAKEUP_SYNC;
809 1.1 ober if ((rv & (1<<2)) != 0)
810 1.1 ober wsrc |= PXA2X0_WAKEUP_KEYNS1;
811 1.1 ober if ((rv & (1<<9)) != 0)
812 1.1 ober wsrc |= PXA2X0_WAKEUP_KEYNS2;
813 1.1 ober if ((rv & (1<<3)) != 0)
814 1.1 ober wsrc |= PXA2X0_WAKEUP_KEYNS3;
815 1.1 ober if ((rv & (1<<4)) != 0)
816 1.1 ober wsrc |= PXA2X0_WAKEUP_KEYNS4;
817 1.1 ober if ((rv & (1<<6)) != 0)
818 1.1 ober wsrc |= PXA2X0_WAKEUP_KEYNS5;
819 1.1 ober if ((rv & (1<<7)) != 0)
820 1.1 ober wsrc |= PXA2X0_WAKEUP_KEYNS6;
821 1.1 ober if ((rv & (1<<10)) != 0)
822 1.1 ober wsrc |= PXA2X0_WAKEUP_CF1;
823 1.1 ober if ((rv & (1<<11)) != 0)
824 1.1 ober wsrc |= PXA2X0_WAKEUP_CF0;
825 1.1 ober if ((rv & (1<<12)) != 0)
826 1.1 ober wsrc |= PXA2X0_WAKEUP_POWERON;
827 1.1 ober if ((rv & (1<<18)) != 0)
828 1.1 ober wsrc |= PXA2X0_WAKEUP_CHRGFULL;
829 1.1 ober
830 1.1 ober return (wsrc);
831 1.1 ober }
832 1.1 ober
833 1.1 ober struct pxa2x0_sleep_data {
834 1.1 ober /* OS timer registers */
835 1.4 skrll uint32_t sd_osmr0, sd_osmr1, sd_osmr2, sd_osmr3;
836 1.4 skrll uint32_t sd_oscr0;
837 1.4 skrll uint32_t sd_osmr4, sd_osmr5;
838 1.4 skrll uint32_t sd_oscr4;
839 1.4 skrll uint32_t sd_omcr4, sd_omcr5;
840 1.4 skrll uint32_t sd_oier;
841 1.1 ober /* GPIO registers */
842 1.4 skrll uint32_t sd_gpdr0, sd_gpdr1, sd_gpdr2, sd_gpdr3;
843 1.4 skrll uint32_t sd_grer0, sd_grer1, sd_grer2, sd_grer3;
844 1.4 skrll uint32_t sd_gfer0, sd_gfer1, sd_gfer2, sd_gfer3;
845 1.4 skrll uint32_t sd_gafr0_l, sd_gafr1_l, sd_gafr2_l, sd_gafr3_l;
846 1.4 skrll uint32_t sd_gafr0_u, sd_gafr1_u, sd_gafr2_u, sd_gafr3_u;
847 1.4 skrll uint32_t sd_gplr0, sd_gplr1, sd_gplr2, sd_gplr3;
848 1.1 ober /* Interrupt controller registers */
849 1.4 skrll uint32_t sd_iclr;
850 1.4 skrll uint32_t sd_icmr;
851 1.4 skrll uint32_t sd_iccr;
852 1.1 ober /* Memory controller registers */
853 1.4 skrll uint32_t sd_mecr;
854 1.4 skrll uint32_t sd_mcmem0, sd_mcmem1;
855 1.4 skrll uint32_t sd_mcatt0, sd_mcatt1;
856 1.4 skrll uint32_t sd_mcio0, sd_mcio1;
857 1.1 ober /* Clocks manager registers */
858 1.4 skrll uint32_t sd_cken;
859 1.1 ober };
860 1.1 ober
861 1.1 ober void
862 1.1 ober pxa2x0_apm_sleep(struct pxa2x0_apm_softc *sc)
863 1.1 ober {
864 1.1 ober struct pxa2x0_sleep_data sd;
865 1.1 ober bus_space_handle_t ost_ioh;
866 1.1 ober int save;
867 1.4 skrll uint32_t rv;
868 1.1 ober
869 1.1 ober ost_ioh = (bus_space_handle_t)0;
870 1.1 ober if (bus_space_map(sc->sc_iot, PXA2X0_OST_BASE, PXA2X0_OST_SIZE, 0,
871 1.1 ober &ost_ioh)) {
872 1.1 ober printf("pxa2x0_apm_sleep: can't map OST\n");
873 1.1 ober goto out;
874 1.1 ober }
875 1.1 ober
876 1.1 ober save = disable_interrupts(I32_bit|F32_bit);
877 1.1 ober
878 1.1 ober sd.sd_oscr0 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OSCR0);
879 1.1 ober sd.sd_oscr4 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OSCR4);
880 1.1 ober sd.sd_omcr4 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OMCR4);
881 1.1 ober sd.sd_omcr5 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OMCR5);
882 1.1 ober sd.sd_osmr0 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OSMR0);
883 1.1 ober sd.sd_osmr1 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OSMR1);
884 1.1 ober sd.sd_osmr2 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OSMR2);
885 1.1 ober sd.sd_osmr3 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OSMR3);
886 1.1 ober sd.sd_osmr4 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OSMR4);
887 1.1 ober sd.sd_osmr5 = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OSMR5);
888 1.1 ober sd.sd_oier = bus_space_read_4(sc->sc_iot, ost_ioh, OST_OIER);
889 1.1 ober
890 1.1 ober /* Bring the PXA27x into 416MHz turbo mode. */
891 1.1 ober if ((cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA27X &&
892 1.1 ober bus_space_read_4(sc->sc_iot, pxa2x0_clkman_ioh, CLKMAN_CCCR) !=
893 1.1 ober (CCCR_A | CCCR_TURBO_X2 | CCCR_RUN_X16)) {
894 1.1 ober #if 0
895 1.1 ober pxa27x_cpu_speed_high();
896 1.1 ober #else
897 1.1 ober #define CLKCFG_T (1<<0) /* turbo */
898 1.1 ober #define CLKCFG_F (1<<1) /* frequency change */
899 1.1 ober #define CLKCFG_B (1<<3) /* fast-bus */
900 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X2 |
901 1.1 ober CCCR_RUN_X16, CLKCFG_B | CLKCFG_F | CLKCFG_T,
902 1.1 ober &pxa2x0_memcfg);
903 1.1 ober #endif
904 1.1 ober delay(500000); /* XXX */
905 1.1 ober }
906 1.1 ober
907 1.1 ober suspend_again:
908 1.1 ober /* Clear wake-up status. */
909 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PEDR,
910 1.1 ober 0xffffffff);
911 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PKSR,
912 1.1 ober 0xffffffff);
913 1.1 ober
914 1.1 ober /* XXX control battery charging in sleep mode. */
915 1.1 ober
916 1.1 ober /* XXX schedule RTC alarm to check the battery, or schedule
917 1.1 ober XXX wake-up shortly before an already programmed alarm? */
918 1.1 ober
919 1.1 ober pxa27x_run_mode();
920 1.1 ober #define MDREFR_LOW (MDREFR_C3000 | 0x00b)
921 1.1 ober pxa27x_fastbus_run_mode(0, MDREFR_LOW);
922 1.1 ober delay(1);
923 1.1 ober #if 1
924 1.1 ober pxa27x_cpu_speed_91();
925 1.1 ober #else
926 1.1 ober pxa27x_frequency_change(CCCR_TURBO_X1 | CCCR_RUN_X7, CLKCFG_F,
927 1.1 ober &pxa2x0_memcfg);
928 1.1 ober #endif
929 1.1 ober pxa2x0_pi2c_setvoltage(sc->sc_iot, sc->sc_pm_ioh, PI2C_VOLTAGE_LOW);
930 1.1 ober
931 1.1 ober sd.sd_gpdr0 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR0);
932 1.1 ober sd.sd_gpdr1 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR1);
933 1.1 ober sd.sd_gpdr2 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR2);
934 1.1 ober sd.sd_gpdr3 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR3);
935 1.1 ober
936 1.1 ober sd.sd_grer0 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GRER0);
937 1.1 ober sd.sd_grer1 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GRER1);
938 1.1 ober sd.sd_grer2 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GRER2);
939 1.1 ober sd.sd_grer3 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GRER3);
940 1.1 ober
941 1.1 ober sd.sd_gfer0 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GFER0);
942 1.1 ober sd.sd_gfer1 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GFER1);
943 1.1 ober sd.sd_gfer2 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GFER2);
944 1.1 ober sd.sd_gfer3 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GFER3);
945 1.1 ober
946 1.1 ober sd.sd_gafr0_l = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR0_L);
947 1.1 ober sd.sd_gafr1_l = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR1_L);
948 1.1 ober sd.sd_gafr2_l = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR2_L);
949 1.1 ober sd.sd_gafr3_l = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR3_L);
950 1.1 ober
951 1.1 ober sd.sd_gafr0_u = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR0_U);
952 1.1 ober sd.sd_gafr1_u = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR1_U);
953 1.1 ober sd.sd_gafr2_u = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR2_U);
954 1.1 ober sd.sd_gafr3_u = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR3_U);
955 1.1 ober
956 1.1 ober sd.sd_gplr0 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPLR0);
957 1.1 ober sd.sd_gplr1 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPLR1);
958 1.1 ober sd.sd_gplr2 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPLR2);
959 1.1 ober sd.sd_gplr3 = bus_space_read_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPLR3);
960 1.1 ober
961 1.1 ober sd.sd_iclr = read_icu(INTCTL_ICLR);
962 1.1 ober sd.sd_icmr = read_icu(INTCTL_ICMR);
963 1.1 ober sd.sd_iccr = read_icu(INTCTL_ICCR);
964 1.1 ober write_icu(INTCTL_ICMR, 0);
965 1.1 ober
966 1.1 ober sd.sd_mecr = bus_space_read_4(sc->sc_iot, pxa2x0_memctl_ioh,
967 1.1 ober MEMCTL_MECR);
968 1.1 ober sd.sd_mcmem0 = bus_space_read_4(sc->sc_iot, pxa2x0_memctl_ioh,
969 1.1 ober MEMCTL_MCMEM(0));
970 1.1 ober sd.sd_mcmem1 = bus_space_read_4(sc->sc_iot, pxa2x0_memctl_ioh,
971 1.1 ober MEMCTL_MCMEM(1));
972 1.1 ober sd.sd_mcatt0 = bus_space_read_4(sc->sc_iot, pxa2x0_memctl_ioh,
973 1.1 ober MEMCTL_MCATT(0));
974 1.1 ober sd.sd_mcatt1 = bus_space_read_4(sc->sc_iot, pxa2x0_memctl_ioh,
975 1.1 ober MEMCTL_MCATT(1));
976 1.1 ober sd.sd_mcio0 = bus_space_read_4(sc->sc_iot, pxa2x0_memctl_ioh,
977 1.1 ober MEMCTL_MCIO(0));
978 1.1 ober sd.sd_mcio1 = bus_space_read_4(sc->sc_iot, pxa2x0_memctl_ioh,
979 1.1 ober MEMCTL_MCIO(1));
980 1.1 ober
981 1.1 ober sd.sd_cken = bus_space_read_4(sc->sc_iot, pxa2x0_clkman_ioh,
982 1.1 ober CLKMAN_CKEN);
983 1.1 ober
984 1.1 ober /*
985 1.1 ober * Stop clocks to all units except to the memory controller, and
986 1.1 ober * to the keypad controller if it is enabled as a wake-up source.
987 1.1 ober */
988 1.1 ober rv = CKEN_MEM;
989 1.1 ober if ((sc->sc_wakeon & PXA2X0_WAKEUP_KEYNS_ALL) != 0)
990 1.1 ober rv |= CKEN_KEY;
991 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_clkman_ioh, CLKMAN_CKEN, rv);
992 1.1 ober
993 1.1 ober /* Disable nRESET_OUT. */
994 1.1 ober rv = bus_space_read_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PSLR);
995 1.1 ober #define PSLR_SL_ROD (1<<20)
996 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PSLR,
997 1.1 ober rv | PSLR_SL_ROD);
998 1.1 ober
999 1.1 ober /* Clear all reset status flags. */
1000 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_RCSR,
1001 1.1 ober RCSR_GPR | RCSR_SMR | RCSR_WDR | RCSR_HWR);
1002 1.1 ober
1003 1.1 ober /* Stop 3/13MHz oscillator; do not float PCMCIA and chip-selects. */
1004 1.1 ober rv = PCFR_OPDE;
1005 1.1 ober if ((cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA27X)
1006 1.1 ober /* Enable nRESET_GPIO as a GPIO reset input. */
1007 1.1 ober rv |= PCFR_GPR_EN;
1008 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PCFR, rv);
1009 1.1 ober
1010 1.1 ober /* XXX C3000 */
1011 1.1 ober #define GPIO_G0_STROBE_BIT 0x0f800000
1012 1.1 ober #define GPIO_G1_STROBE_BIT 0x00100000
1013 1.1 ober #define GPIO_G2_STROBE_BIT 0x01000000
1014 1.1 ober #define GPIO_G3_STROBE_BIT 0x00041880
1015 1.1 ober #define GPIO_KEY_STROBE0 88
1016 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR0,
1017 1.1 ober 0x00144018);
1018 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR1,
1019 1.1 ober 0x00ef0000);
1020 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR2,
1021 1.1 ober 0x0121c000);
1022 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR3,
1023 1.1 ober 0x00600000);
1024 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR0,
1025 1.1 ober 0x00144018 & ~GPIO_G0_STROBE_BIT);
1026 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR1,
1027 1.1 ober 0x00ef0000 & ~GPIO_G1_STROBE_BIT);
1028 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR2,
1029 1.1 ober 0x0121c000 & ~GPIO_G2_STROBE_BIT);
1030 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR3,
1031 1.1 ober 0x00600000 & ~GPIO_G3_STROBE_BIT);
1032 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PGSR2,
1033 1.1 ober (0x0121c000 & ~GPIO_G2_STROBE_BIT) |
1034 1.1 ober GPIO_BIT(GPIO_KEY_STROBE0));
1035 1.1 ober
1036 1.1 ober /* C3000 */
1037 1.1 ober #define GPIO_EXT_BUS_READY 18
1038 1.1 ober pxa2x0_gpio_set_function(GPIO_EXT_BUS_READY, GPIO_SET | GPIO_OUT);
1039 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR0, 0xd01c4418);
1040 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR1, 0xfcefbd21);
1041 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR2, 0x13a5ffff);
1042 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR3, 0x01e3e10c);
1043 1.1 ober
1044 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PSPR,
1045 1.4 skrll (uint32_t)&pxa2x0_cpu_resume - 0xc0200000 + 0xa0200000);
1046 1.1 ober
1047 1.1 ober pxa2x0_cpu_suspend();
1048 1.1 ober
1049 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PSPR, 0);
1050 1.1 ober
1051 1.1 ober pxa2x0_clkman_config(CKEN_SSP|CKEN_PWM0|CKEN_PWM1, 1);
1052 1.1 ober pxa2x0_clkman_config(CKEN_KEY, 0);
1053 1.1 ober
1054 1.1 ober #if 1
1055 1.1 ober /* Clear all GPIO interrupt sources. */
1056 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GEDR0, 0xffffffff);
1057 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GEDR1, 0xffffffff);
1058 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GEDR2, 0xffffffff);
1059 1.1 ober #endif
1060 1.1 ober
1061 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR0, sd.sd_gpdr0);
1062 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR1, sd.sd_gpdr1);
1063 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR2, sd.sd_gpdr2);
1064 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GRER0, sd.sd_grer0);
1065 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GRER1, sd.sd_grer1);
1066 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GRER2, sd.sd_grer2);
1067 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GFER0, sd.sd_gfer0);
1068 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GFER1, sd.sd_gfer1);
1069 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GFER2, sd.sd_gfer2);
1070 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR0_L, sd.sd_gafr0_l);
1071 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR1_L, sd.sd_gafr1_l);
1072 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR2_L, sd.sd_gafr2_l);
1073 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR0_U, sd.sd_gafr0_u);
1074 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR1_U, sd.sd_gafr1_u);
1075 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR2_U, sd.sd_gafr2_u);
1076 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPSR0, sd.sd_gplr0 &
1077 1.1 ober sd.sd_gpdr0);
1078 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPSR1, sd.sd_gplr1 &
1079 1.1 ober sd.sd_gpdr1);
1080 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPSR2, sd.sd_gplr2 &
1081 1.1 ober sd.sd_gpdr2);
1082 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPCR0, ~sd.sd_gplr0 &
1083 1.1 ober sd.sd_gpdr0);
1084 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPCR1, ~sd.sd_gplr1 &
1085 1.1 ober sd.sd_gpdr1);
1086 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPCR2, ~sd.sd_gplr2 &
1087 1.1 ober sd.sd_gpdr2);
1088 1.1 ober
1089 1.1 ober /* PXA27x */
1090 1.1 ober #if 0
1091 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GEDR3, 0xffffffff);
1092 1.1 ober #endif
1093 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPDR3, sd.sd_gpdr3);
1094 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GRER3, sd.sd_grer3);
1095 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GFER3, sd.sd_gfer3);
1096 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR3_L, sd.sd_gafr3_l);
1097 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GAFR3_U, sd.sd_gafr3_u);
1098 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPSR3, sd.sd_gplr3 &
1099 1.1 ober sd.sd_gpdr3);
1100 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_gpio_ioh, GPIO_GPCR3, ~sd.sd_gplr3 &
1101 1.1 ober sd.sd_gpdr3);
1102 1.1 ober
1103 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_memctl_ioh, MEMCTL_MECR,
1104 1.1 ober sd.sd_mecr);
1105 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_memctl_ioh, MEMCTL_MCMEM(0),
1106 1.1 ober sd.sd_mcmem0);
1107 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_memctl_ioh, MEMCTL_MCMEM(1),
1108 1.1 ober sd.sd_mcmem1);
1109 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_memctl_ioh, MEMCTL_MCATT(0),
1110 1.1 ober sd.sd_mcatt0);
1111 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_memctl_ioh, MEMCTL_MCATT(1),
1112 1.1 ober sd.sd_mcatt1);
1113 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_memctl_ioh, MEMCTL_MCIO(0),
1114 1.1 ober sd.sd_mcio0);
1115 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_memctl_ioh, MEMCTL_MCIO(1),
1116 1.1 ober sd.sd_mcio1);
1117 1.1 ober
1118 1.1 ober bus_space_write_4(sc->sc_iot, pxa2x0_clkman_ioh, CLKMAN_CKEN,
1119 1.1 ober sd.sd_cken);
1120 1.1 ober
1121 1.1 ober write_icu(INTCTL_ICLR, sd.sd_iclr);
1122 1.1 ober write_icu(INTCTL_ICCR, sd.sd_iccr);
1123 1.1 ober write_icu(INTCTL_ICMR, sd.sd_icmr);
1124 1.1 ober
1125 1.1 ober if ((read_icu(INTCTL_ICIP) & 0x1) != 0)
1126 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PEDR, 0x1);
1127 1.1 ober
1128 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OSMR0, sd.sd_osmr0);
1129 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OSMR1, sd.sd_osmr1);
1130 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OSMR2, sd.sd_osmr2);
1131 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OSMR3, sd.sd_osmr3);
1132 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OSMR4, sd.sd_osmr4);
1133 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OSMR5, sd.sd_osmr5);
1134 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OMCR4, sd.sd_omcr4);
1135 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OMCR5, sd.sd_omcr5);
1136 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OSCR0, sd.sd_oscr0);
1137 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OSCR4, sd.sd_oscr4);
1138 1.1 ober bus_space_write_4(sc->sc_iot, ost_ioh, OST_OIER, sd.sd_oier);
1139 1.1 ober
1140 1.1 ober pxa2x0_pi2c_setvoltage(sc->sc_iot, sc->sc_pm_ioh, PI2C_VOLTAGE_HIGH);
1141 1.1 ober
1142 1.1 ober /* Change to 208MHz run mode with fast-bus still disabled. */
1143 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X2 | CCCR_RUN_X16,
1144 1.1 ober CLKCFG_F, &pxa2x0_memcfg);
1145 1.1 ober delay(1); /* XXX is the delay long enough, and necessary at all? */
1146 1.1 ober pxa27x_fastbus_run_mode(1, pxa2x0_memcfg.mdrefr_high);
1147 1.1 ober
1148 1.1 ober /* Change to 416MHz turbo mode with fast-bus enabled. */
1149 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X2 | CCCR_RUN_X16,
1150 1.1 ober CLKCFG_B | CLKCFG_F | CLKCFG_T, &pxa2x0_memcfg);
1151 1.1 ober
1152 1.1 ober if (sc->sc_resume != NULL) {
1153 1.1 ober if (!sc->sc_resume(sc))
1154 1.1 ober goto suspend_again;
1155 1.1 ober }
1156 1.1 ober
1157 1.1 ober /*
1158 1.1 ober * Allow immediate entry into deep-sleep mode if power fails.
1159 1.1 ober * Resume from immediate deep-sleep is not implemented yet.
1160 1.1 ober */
1161 1.1 ober bus_space_write_4(sc->sc_iot, sc->sc_pm_ioh, POWMAN_PMCR, 0);
1162 1.1 ober
1163 1.1 ober
1164 1.1 ober restore_interrupts(save);
1165 1.1 ober
1166 1.1 ober #if 0
1167 1.1 ober pxa2x0_setperf(perflevel);
1168 1.1 ober #endif
1169 1.1 ober
1170 1.1 ober out:
1171 1.1 ober if (ost_ioh != (bus_space_handle_t)0)
1172 1.1 ober bus_space_unmap(sc->sc_iot, ost_ioh, PXA2X0_OST_SIZE);
1173 1.1 ober }
1174 1.1 ober
1175 1.1 ober void
1176 1.1 ober pxa2x0_pi2c_open(bus_space_tag_t iot, bus_space_handle_t ioh)
1177 1.1 ober {
1178 1.4 skrll uint32_t rv;
1179 1.1 ober
1180 1.1 ober /* Enable the I2C unit, and disable automatic voltage change. */
1181 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PCFR);
1182 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PCFR, rv | PCFR_PI2C_EN);
1183 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PCFR);
1184 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PCFR, rv & ~PCFR_FVC);
1185 1.1 ober delay(1);
1186 1.1 ober
1187 1.1 ober /* Enable the clock to the power manager I2C unit. */
1188 1.1 ober pxa2x0_clkman_config(CKEN_PI2C, 1);
1189 1.1 ober delay(1);
1190 1.1 ober }
1191 1.1 ober
1192 1.1 ober void
1193 1.1 ober pxa2x0_pi2c_close(bus_space_tag_t iot, bus_space_handle_t ioh)
1194 1.1 ober {
1195 1.4 skrll uint32_t rv;
1196 1.1 ober
1197 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_UR);
1198 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISAR, 0);
1199 1.1 ober delay(1);
1200 1.1 ober
1201 1.1 ober /* Disable the clock to the power manager I2C unit. */
1202 1.1 ober pxa2x0_clkman_config(CKEN_PI2C, 0);
1203 1.1 ober delay(1);
1204 1.1 ober
1205 1.1 ober /* Disable the I2C unit, and disable automatic voltage change. */
1206 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PCFR);
1207 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PCFR,
1208 1.1 ober rv & ~(PCFR_PI2C_EN | PCFR_FVC));
1209 1.1 ober delay(1);
1210 1.1 ober }
1211 1.1 ober
1212 1.1 ober int
1213 1.1 ober pxa2x0_pi2c_read(bus_space_tag_t iot, bus_space_handle_t ioh,
1214 1.1 ober u_char slave, u_char *valuep)
1215 1.1 ober {
1216 1.4 skrll uint32_t rv;
1217 1.1 ober int timeout;
1218 1.1 ober int tries = PI2C_RETRY_COUNT;
1219 1.1 ober
1220 1.1 ober retry:
1221 1.1 ober
1222 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_UR);
1223 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISAR, 0x00);
1224 1.1 ober delay(1);
1225 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_IUE | PICR_SCLE);
1226 1.1 ober
1227 1.1 ober /* Write slave device address. */
1228 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PIDBR, (slave<<1) | 0x1);
1229 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1230 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv | PICR_START);
1231 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1232 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv & ~PICR_STOP);
1233 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1234 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv | PICR_TB);
1235 1.1 ober
1236 1.1 ober timeout = 10000;
1237 1.1 ober while ((bus_space_read_4(iot, ioh, POWMAN_PISR) & PISR_ITE) == 0) {
1238 1.1 ober if (timeout-- == 0) {
1239 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_ITE);
1240 1.1 ober goto err;
1241 1.1 ober }
1242 1.1 ober delay(1);
1243 1.1 ober }
1244 1.1 ober
1245 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_ITE);
1246 1.1 ober
1247 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1248 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv & ~PICR_START);
1249 1.1 ober
1250 1.1 ober /* Read data value. */
1251 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1252 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv |
1253 1.1 ober (PICR_STOP | PICR_ACKNAK));
1254 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1255 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv | PICR_TB);
1256 1.1 ober
1257 1.1 ober timeout = 10000;
1258 1.1 ober while ((bus_space_read_4(iot, ioh, POWMAN_PISR) & PISR_IRF) == 0) {
1259 1.1 ober if (timeout-- == 0) {
1260 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_IRF);
1261 1.1 ober goto err;
1262 1.1 ober }
1263 1.1 ober delay(1);
1264 1.1 ober }
1265 1.1 ober
1266 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_IRF);
1267 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PIDBR);
1268 1.1 ober *valuep = (u_char)rv;
1269 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1270 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv &
1271 1.1 ober ~(PICR_STOP | PICR_ACKNAK));
1272 1.1 ober
1273 1.1 ober return (0);
1274 1.1 ober err:
1275 1.1 ober if (tries-- >= 0)
1276 1.1 ober goto retry;
1277 1.1 ober
1278 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_UR);
1279 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISAR, 0x00);
1280 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_IUE | PICR_SCLE);
1281 1.1 ober
1282 1.1 ober return (-EIO);
1283 1.1 ober }
1284 1.1 ober
1285 1.1 ober int
1286 1.1 ober pxa2x0_pi2c_write(bus_space_tag_t iot, bus_space_handle_t ioh,
1287 1.1 ober u_char slave, u_char value)
1288 1.1 ober {
1289 1.4 skrll uint32_t rv;
1290 1.1 ober int timeout;
1291 1.1 ober int tries = PI2C_RETRY_COUNT;
1292 1.1 ober
1293 1.1 ober retry:
1294 1.1 ober
1295 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_UR);
1296 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISAR, 0x00);
1297 1.1 ober delay(1);
1298 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_IUE | PICR_SCLE);
1299 1.1 ober
1300 1.1 ober /* Write slave device address. */
1301 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PIDBR, (slave<<1));
1302 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1303 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv | PICR_START);
1304 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1305 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv & ~PICR_STOP);
1306 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1307 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv | PICR_TB);
1308 1.1 ober
1309 1.1 ober timeout = 10000;
1310 1.1 ober while ((bus_space_read_4(iot, ioh, POWMAN_PISR) & PISR_ITE) == 0) {
1311 1.1 ober if (timeout-- == 0) {
1312 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_ITE);
1313 1.1 ober goto err;
1314 1.1 ober }
1315 1.1 ober delay(1);
1316 1.1 ober }
1317 1.1 ober if ((bus_space_read_4(iot, ioh, POWMAN_PISR) & PISR_ACKNAK) != 0)
1318 1.1 ober goto err;
1319 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_ITE);
1320 1.1 ober
1321 1.1 ober /* Write data. */
1322 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1323 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv & ~PICR_START);
1324 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1325 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv | PICR_STOP);
1326 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PIDBR, value);
1327 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1328 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv | PICR_TB);
1329 1.1 ober
1330 1.1 ober timeout = 10000;
1331 1.1 ober while ((bus_space_read_4(iot, ioh, POWMAN_PISR) & PISR_ITE) == 0) {
1332 1.1 ober if (timeout-- == 0) {
1333 1.1 ober #if 0
1334 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_ITE);
1335 1.1 ober #endif
1336 1.1 ober goto err;
1337 1.1 ober }
1338 1.1 ober delay(1);
1339 1.1 ober }
1340 1.1 ober if ((bus_space_read_4(iot, ioh, POWMAN_PISR) & PISR_ACKNAK) != 0)
1341 1.1 ober goto err;
1342 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_ITE);
1343 1.1 ober
1344 1.1 ober rv = bus_space_read_4(iot, ioh, POWMAN_PICR);
1345 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, rv & ~PICR_STOP);
1346 1.1 ober
1347 1.1 ober return (0);
1348 1.1 ober err:
1349 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISR, PISR_ITE);
1350 1.1 ober if (tries-- >= 0)
1351 1.1 ober goto retry;
1352 1.1 ober
1353 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_UR);
1354 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PISAR, 0x00);
1355 1.1 ober bus_space_write_4(iot, ioh, POWMAN_PICR, PICR_IUE | PICR_SCLE);
1356 1.1 ober
1357 1.1 ober return (-EIO);
1358 1.1 ober }
1359 1.1 ober
1360 1.1 ober int
1361 1.1 ober pxa2x0_pi2c_getvoltage(bus_space_tag_t iot, bus_space_handle_t ioh,
1362 1.1 ober u_char *valuep)
1363 1.1 ober {
1364 1.1 ober int res;
1365 1.1 ober
1366 1.1 ober pxa2x0_pi2c_open(iot, ioh);
1367 1.1 ober res = pxa2x0_pi2c_read(iot, ioh, 0x0c, valuep);
1368 1.1 ober pxa2x0_pi2c_close(iot, ioh);
1369 1.1 ober return (res);
1370 1.1 ober }
1371 1.1 ober
1372 1.1 ober int
1373 1.1 ober pxa2x0_pi2c_setvoltage(bus_space_tag_t iot, bus_space_handle_t ioh,
1374 1.1 ober u_char value)
1375 1.1 ober {
1376 1.1 ober int res;
1377 1.1 ober
1378 1.1 ober pxa2x0_pi2c_open(iot, ioh);
1379 1.1 ober res = pxa2x0_pi2c_write(iot, ioh, 0x0c, value);
1380 1.1 ober pxa2x0_pi2c_close(iot, ioh);
1381 1.1 ober return (res);
1382 1.1 ober }
1383 1.1 ober
1384 1.1 ober #if 0
1385 1.1 ober void
1386 1.1 ober pxa2x0_pi2c_print(struct pxa2x0_apm_softc *sc)
1387 1.1 ober {
1388 1.1 ober u_char value = 0;
1389 1.1 ober
1390 1.1 ober (void)pxa2x0_pi2c_getvoltage(sc->sc_iot, sc->sc_pm_ioh, &value);
1391 1.1 ober printf("xscale core voltage: %s\n", value == PI2C_VOLTAGE_HIGH ?
1392 1.1 ober "high" : (value == PI2C_VOLTAGE_LOW ? "low" : "unknown"));
1393 1.1 ober }
1394 1.1 ober #endif
1395 1.1 ober
1396 1.1 ober struct {
1397 1.1 ober int maxspeed;
1398 1.1 ober int numspeeds;
1399 1.1 ober int hz [6];
1400 1.1 ober int rate [6]; /* could this be simplfied by not having 100% in table? */
1401 1.1 ober }
1402 1.1 ober speedtables[] = {
1403 1.1 ober { 91, 1, { 91 }, { 100 }},
1404 1.1 ober { 208, 2, { 91, 208}, {50, 100}},
1405 1.1 ober { 416, 3, { 91, 208, 416}, {25, 50, 100}},
1406 1.1 ober { 520, 4, { 91, 208, 416, 520}, {18, 40 ,80, 100}},
1407 1.1 ober { 624, 5, { 91, 208, 416, 520, 624}, {15, 34, 67, 82, 100}},
1408 1.1 ober { 0 }
1409 1.1 ober };
1410 1.1 ober int xscale_maxspeed = 416; /* XXX */
1411 1.1 ober
1412 1.1 ober int speed_to_freq(int speed);
1413 1.1 ober
1414 1.1 ober int
1415 1.1 ober speed_to_freq(int speed)
1416 1.1 ober {
1417 1.1 ober int i, j;
1418 1.1 ober int newspeed = 0;
1419 1.1 ober int numspeeds;
1420 1.1 ober for (i = 0; speedtables[i].maxspeed != 0; i++) {
1421 1.1 ober if (speedtables[i].maxspeed != xscale_maxspeed)
1422 1.1 ober continue;
1423 1.1 ober
1424 1.1 ober if (speed <= speedtables[i].rate[0]) {
1425 1.1 ober return speedtables[i].hz[0];
1426 1.1 ober
1427 1.1 ober }
1428 1.1 ober numspeeds = speedtables[i].numspeeds;
1429 1.1 ober if (speed == speedtables[i].rate[numspeeds-1]) {
1430 1.1 ober return speedtables[i].hz[numspeeds-1];
1431 1.1 ober }
1432 1.1 ober for (j = 1; j < numspeeds; j++) {
1433 1.1 ober if (speed < speedtables[i].rate[j]) {
1434 1.1 ober return speedtables[i].hz[j-1];
1435 1.1 ober }
1436 1.1 ober }
1437 1.1 ober }
1438 1.1 ober return newspeed;
1439 1.1 ober }
1440 1.1 ober
1441 1.1 ober
1442 1.1 ober void
1443 1.1 ober pxa2x0_setperf(int speed)
1444 1.1 ober {
1445 1.1 ober struct pxa2x0_apm_softc *sc;
1446 1.1 ober int s;
1447 1.1 ober int newfreq;
1448 1.1 ober
1449 1.1 ober sc = device_private(zapm_cd.cd_devs[0]);
1450 1.1 ober
1451 1.1 ober newfreq = speed_to_freq(speed);
1452 1.1 ober
1453 1.1 ober if (newfreq == 0) {
1454 1.1 ober printf("bogus new frequency 0 for rate %d maxclock %d\n",
1455 1.1 ober speed, xscale_maxspeed);
1456 1.1 ober }
1457 1.1 ober
1458 1.1 ober DPRINTF(("setperf speed %d newfreq %d, maxfreq %d\n",
1459 1.1 ober speed, newfreq, xscale_maxspeed));
1460 1.1 ober
1461 1.1 ober s = disable_interrupts(I32_bit|F32_bit);
1462 1.1 ober
1463 1.1 ober if (newfreq == 91) {
1464 1.1 ober if (freq > 91) {
1465 1.1 ober pxa27x_run_mode();
1466 1.1 ober pxa27x_fastbus_run_mode(0, MDREFR_LOW);
1467 1.1 ober pxa27x_cpu_speed_91();
1468 1.1 ober pxa2x0_pi2c_setvoltage(sc->sc_iot, sc->sc_pm_ioh,
1469 1.1 ober PI2C_VOLTAGE_LOW);
1470 1.1 ober freq = 91;
1471 1.1 ober }
1472 1.1 ober } else if (newfreq == 208) {
1473 1.1 ober if (freq < 208)
1474 1.1 ober pxa2x0_pi2c_setvoltage(sc->sc_iot, sc->sc_pm_ioh,
1475 1.1 ober PI2C_VOLTAGE_HIGH);
1476 1.1 ober if (freq != 208) {
1477 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X2 |
1478 1.1 ober CCCR_RUN_X16, CLKCFG_F, &pxa2x0_memcfg);
1479 1.1 ober pxa27x_fastbus_run_mode(1, pxa2x0_memcfg.mdrefr_high);
1480 1.1 ober freq = 208;
1481 1.1 ober }
1482 1.1 ober } else if (newfreq == 416) {
1483 1.1 ober if (freq < 208) {
1484 1.1 ober pxa2x0_pi2c_setvoltage(sc->sc_iot, sc->sc_pm_ioh,
1485 1.1 ober PI2C_VOLTAGE_HIGH);
1486 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X2 |
1487 1.1 ober CCCR_RUN_X16, CLKCFG_F, &pxa2x0_memcfg);
1488 1.1 ober pxa27x_fastbus_run_mode(1, pxa2x0_memcfg.mdrefr_high);
1489 1.1 ober }
1490 1.1 ober if (freq != 416) {
1491 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X2 |
1492 1.1 ober CCCR_RUN_X16, CLKCFG_B | CLKCFG_F | CLKCFG_T,
1493 1.1 ober &pxa2x0_memcfg);
1494 1.1 ober freq = 416;
1495 1.1 ober }
1496 1.1 ober } else if (newfreq == 520) {
1497 1.1 ober if (freq < 208) {
1498 1.1 ober pxa2x0_pi2c_setvoltage(sc->sc_iot, sc->sc_pm_ioh,
1499 1.1 ober PI2C_VOLTAGE_HIGH);
1500 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X2 |
1501 1.1 ober CCCR_RUN_X16, CLKCFG_F, &pxa2x0_memcfg);
1502 1.1 ober pxa27x_fastbus_run_mode(1, pxa2x0_memcfg.mdrefr_high);
1503 1.1 ober }
1504 1.1 ober if (freq != 520) {
1505 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X25 |
1506 1.1 ober CCCR_RUN_X16, CLKCFG_B | CLKCFG_F | CLKCFG_T,
1507 1.1 ober &pxa2x0_memcfg);
1508 1.1 ober freq = 520;
1509 1.1 ober }
1510 1.1 ober } else if (newfreq == 624) {
1511 1.1 ober if (freq < 208) {
1512 1.1 ober pxa2x0_pi2c_setvoltage(sc->sc_iot, sc->sc_pm_ioh,
1513 1.1 ober PI2C_VOLTAGE_HIGH);
1514 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X2 |
1515 1.1 ober CCCR_RUN_X16, CLKCFG_F, &pxa2x0_memcfg);
1516 1.1 ober pxa27x_fastbus_run_mode(1, pxa2x0_memcfg.mdrefr_high);
1517 1.1 ober }
1518 1.1 ober if (freq != 624) {
1519 1.1 ober pxa27x_frequency_change(CCCR_A | CCCR_TURBO_X3 |
1520 1.1 ober CCCR_RUN_X16, CLKCFG_B | CLKCFG_F | CLKCFG_T,
1521 1.1 ober &pxa2x0_memcfg);
1522 1.1 ober freq = 624;
1523 1.1 ober }
1524 1.1 ober }
1525 1.1 ober
1526 1.1 ober restore_interrupts(s);
1527 1.1 ober }
1528 1.1 ober
1529 1.1 ober int
1530 1.1 ober pxa2x0_cpuspeed(int *freqp)
1531 1.1 ober {
1532 1.1 ober *freqp = freq;
1533 1.1 ober return 0;
1534 1.1 ober }
1535 1.1 ober
1536 1.1 ober void pxa2x0_maxspeed(int *speedp);
1537 1.1 ober
1538 1.1 ober void
1539 1.1 ober pxa2x0_maxspeed(int *speedp)
1540 1.1 ober {
1541 1.1 ober /* XXX assumes a pxa270 */
1542 1.1 ober
1543 1.1 ober if (*speedp < 207) {
1544 1.1 ober *speedp = 91;
1545 1.1 ober } else if (*speedp < 415) {
1546 1.1 ober *speedp = 208;
1547 1.1 ober } else if (*speedp < 519) {
1548 1.1 ober *speedp = 416;
1549 1.1 ober } else if (*speedp < 624) {
1550 1.1 ober *speedp = 520;
1551 1.1 ober #if 0
1552 1.1 ober } else if (*speedp < 651) {
1553 1.1 ober *speedp = 624;
1554 1.1 ober #endif
1555 1.1 ober } else {
1556 1.1 ober *speedp = 520; /* hope this is safe. */
1557 1.1 ober }
1558 1.1 ober xscale_maxspeed = *speedp;
1559 1.1 ober #if 0
1560 1.1 ober pxa2x0_setperf(perflevel);
1561 1.1 ober #endif
1562 1.1 ober }
1563