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