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