Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
00da5f26
Commit
00da5f26
authored
Jul 30, 2002
by
Nicolas Pitre
Committed by
Deepak Saxena
Jul 30, 2002
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ARM PATCH] 1211/1: PXA sleep mode support
parent
39ddb839
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
427 additions
and
0 deletions
+427
-0
arch/arm/mach-pxa/Makefile
arch/arm/mach-pxa/Makefile
+3
-0
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/lubbock.c
+9
-0
arch/arm/mach-pxa/pm.c
arch/arm/mach-pxa/pm.c
+265
-0
arch/arm/mach-pxa/sleep.S
arch/arm/mach-pxa/sleep.S
+150
-0
No files found.
arch/arm/mach-pxa/Makefile
View file @
00da5f26
...
...
@@ -29,4 +29,7 @@ leds-$(CONFIG_ARCH_PXA_IDP) += leds-idp.o
obj-$(CONFIG_LEDS)
+=
$
(
leds-y
)
# Misc features
obj-$(CONFIG_PM)
+=
pm.o sleep.o
include
$(TOPDIR)/Rules.make
arch/arm/mach-pxa/lubbock.c
View file @
00da5f26
...
...
@@ -142,6 +142,15 @@ static void __init lubbock_map_io(void)
/* This is for the SMC chip select */
pxa_gpio_mode
(
GPIO79_nCS_3_MD
);
/* setup sleep mode values */
PWER
=
0x00000002
;
PFER
=
0x00000000
;
PRER
=
0x00000002
;
PGSR0
=
0x00008000
;
PGSR1
=
0x003F0202
;
PGSR2
=
0x0001C000
;
PCFR
|=
PCFR_OPDE
;
}
MACHINE_START
(
LUBBOCK
,
"Intel DBPXA250 Development Platform"
)
...
...
arch/arm/mach-pxa/pm.c
0 → 100644
View file @
00da5f26
/*
* PXA250/210 Power Management Routines
*
* Original code for the SA11x0:
* Copyright (c) 2001 Cliff Brake <cbrake@accelent.com>
*
* Modified for the PXA250 by Nicolas Pitre:
* Copyright (c) 2002 Monta Vista Software, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License.
*/
#include <linux/config.h>
#include <linux/init.h>
#include <linux/pm.h>
#include <linux/slab.h>
#include <linux/sched.h>
#include <linux/interrupt.h>
#include <linux/sysctl.h>
#include <linux/errno.h>
#include <asm/hardware.h>
#include <asm/memory.h>
#include <asm/system.h>
#include <asm/leds.h>
/*
* Debug macros
*/
#undef DEBUG
extern
void
pxa_cpu_suspend
(
void
);
extern
void
pxa_cpu_resume
(
void
);
#define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x
#define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x]
/*
* List of global PXA peripheral registers to preserve.
* More ones like CP and general purpose register values are preserved
* with the stack pointer in sleep.S.
*/
enum
{
SLEEP_SAVE_START
=
0
,
SLEEP_SAVE_OSCR
,
SLEEP_SAVE_OIER
,
SLEEP_SAVE_OSMR0
,
SLEEP_SAVE_OSMR1
,
SLEEP_SAVE_OSMR2
,
SLEEP_SAVE_OSMR3
,
SLEEP_SAVE_GPDR0
,
SLEEP_SAVE_GPDR1
,
SLEEP_SAVE_GPDR2
,
SLEEP_SAVE_GRER0
,
SLEEP_SAVE_GRER1
,
SLEEP_SAVE_GRER2
,
SLEEP_SAVE_GFER0
,
SLEEP_SAVE_GFER1
,
SLEEP_SAVE_GFER2
,
SLEEP_SAVE_GAFR0_L
,
SLEEP_SAVE_GAFR1_L
,
SLEEP_SAVE_GAFR2_L
,
SLEEP_SAVE_GAFR0_U
,
SLEEP_SAVE_GAFR1_U
,
SLEEP_SAVE_GAFR2_U
,
SLEEP_SAVE_FFIER
,
SLEEP_SAVE_FFLCR
,
SLEEP_SAVE_FFMCR
,
SLEEP_SAVE_FFSPR
,
SLEEP_SAVE_FFISR
,
SLEEP_SAVE_FFDLL
,
SLEEP_SAVE_FFDLH
,
SLEEP_SAVE_ICMR
,
SLEEP_SAVE_CKEN
,
SLEEP_SAVE_CKSUM
,
SLEEP_SAVE_SIZE
};
int
pm_do_suspend
(
void
)
{
unsigned
long
sleep_save
[
SLEEP_SAVE_SIZE
];
unsigned
long
checksum
=
0
;
int
i
;
cli
();
clf
();
leds_event
(
led_stop
);
/* preserve current time */
RCNR
=
xtime
.
tv_sec
;
/*
* Temporary solution. This won't be necessary once
* we move pxa support into the serial/* driver
* Save the FF UART
*/
SAVE
(
FFIER
);
SAVE
(
FFLCR
);
SAVE
(
FFMCR
);
SAVE
(
FFSPR
);
SAVE
(
FFISR
);
FFLCR
|=
0x80
;
SAVE
(
FFDLL
);
SAVE
(
FFDLH
);
FFLCR
&=
0xef
;
/* save vital registers */
SAVE
(
OSCR
);
SAVE
(
OSMR0
);
SAVE
(
OSMR1
);
SAVE
(
OSMR2
);
SAVE
(
OSMR3
);
SAVE
(
OIER
);
SAVE
(
GPDR0
);
SAVE
(
GPDR1
);
SAVE
(
GPDR2
);
SAVE
(
GRER0
);
SAVE
(
GRER1
);
SAVE
(
GRER2
);
SAVE
(
GFER0
);
SAVE
(
GFER1
);
SAVE
(
GFER2
);
SAVE
(
GAFR0_L
);
SAVE
(
GAFR0_U
);
SAVE
(
GAFR1_L
);
SAVE
(
GAFR1_U
);
SAVE
(
GAFR2_L
);
SAVE
(
GAFR2_U
);
SAVE
(
ICMR
);
ICMR
=
0
;
SAVE
(
CKEN
);
CKEN
=
0
;
/* Note: wake up source are set up in each machine specific files */
/* clear GPIO transition detect bits */
GEDR0
=
GEDR0
;
GEDR1
=
GEDR1
;
GEDR2
=
GEDR2
;
/* Clear sleep reset status */
RCSR
=
RCSR_SMR
;
/* set resume return address */
PSPR
=
virt_to_phys
(
pxa_cpu_resume
);
/* before sleeping, calculate and save a checksum */
for
(
i
=
0
;
i
<
SLEEP_SAVE_SIZE
-
1
;
i
++
)
checksum
+=
sleep_save
[
i
];
sleep_save
[
SLEEP_SAVE_CKSUM
]
=
checksum
;
/* *** go zzz *** */
pxa_cpu_suspend
();
/* after sleeping, validate the checksum */
checksum
=
0
;
for
(
i
=
0
;
i
<
SLEEP_SAVE_SIZE
-
1
;
i
++
)
checksum
+=
sleep_save
[
i
];
/* if invalid, display message and wait for a hardware reset */
if
(
checksum
!=
sleep_save
[
SLEEP_SAVE_CKSUM
])
{
#ifdef CONFIG_ARCH_LUBBOCK
LUB_HEXLED
=
0xbadbadc5
;
#endif
while
(
1
);
}
/* ensure not to come back here if it wasn't intended */
PSPR
=
0
;
/* restore registers */
RESTORE
(
GPDR0
);
RESTORE
(
GPDR1
);
RESTORE
(
GPDR2
);
RESTORE
(
GRER0
);
RESTORE
(
GRER1
);
RESTORE
(
GRER2
);
RESTORE
(
GFER0
);
RESTORE
(
GFER1
);
RESTORE
(
GFER2
);
RESTORE
(
GAFR0_L
);
RESTORE
(
GAFR0_U
);
RESTORE
(
GAFR1_L
);
RESTORE
(
GAFR1_U
);
RESTORE
(
GAFR2_L
);
RESTORE
(
GAFR2_U
);
PSSR
=
PSSR_PH
;
RESTORE
(
OSMR0
);
RESTORE
(
OSMR1
);
RESTORE
(
OSMR2
);
RESTORE
(
OSMR3
);
RESTORE
(
OSCR
);
RESTORE
(
OIER
);
RESTORE
(
CKEN
);
ICLR
=
0
;
ICCR
=
1
;
RESTORE
(
ICMR
);
/*
* Temporary solution. This won't be necessary once
* we move pxa support into the serial/* driver.
* Restore the FF UART.
*/
RESTORE
(
FFMCR
);
RESTORE
(
FFSPR
);
RESTORE
(
FFLCR
);
FFLCR
|=
0x80
;
RESTORE
(
FFDLH
);
RESTORE
(
FFDLL
);
RESTORE
(
FFLCR
);
RESTORE
(
FFISR
);
FFFCR
=
0x07
;
RESTORE
(
FFIER
);
/* restore current time */
xtime
.
tv_sec
=
RCNR
;
#ifdef DEBUG
printk
(
KERN_DEBUG
"*** made it back from resume
\n
"
);
#endif
leds_event
(
led_start
);
sti
();
return
0
;
}
unsigned
long
sleep_phys_sp
(
void
*
sp
)
{
return
virt_to_phys
(
sp
);
}
#ifdef CONFIG_SYSCTL
/*
* ARGH! ACPI people defined CTL_ACPI in linux/acpi.h rather than
* linux/sysctl.h.
*
* This means our interface here won't survive long - it needs a new
* interface. Quick hack to get this working - use sysctl id 9999.
*/
#warning ACPI broke the kernel, this interface needs to be fixed up.
#define CTL_ACPI 9999
#define ACPI_S1_SLP_TYP 19
/*
* Send us to sleep.
*/
static
int
sysctl_pm_do_suspend
(
void
)
{
int
retval
;
retval
=
pm_send_all
(
PM_SUSPEND
,
(
void
*
)
3
);
if
(
retval
==
0
)
{
retval
=
pm_do_suspend
();
pm_send_all
(
PM_RESUME
,
(
void
*
)
0
);
}
return
retval
;
}
static
struct
ctl_table
pm_table
[]
=
{
{
ACPI_S1_SLP_TYP
,
"suspend"
,
NULL
,
0
,
0600
,
NULL
,
(
proc_handler
*
)
&
sysctl_pm_do_suspend
},
{
0
}
};
static
struct
ctl_table
pm_dir_table
[]
=
{
{
CTL_ACPI
,
"pm"
,
NULL
,
0
,
0555
,
pm_table
},
{
0
}
};
/*
* Initialize power interface
*/
static
int
__init
pm_init
(
void
)
{
register_sysctl_table
(
pm_dir_table
,
1
);
return
0
;
}
__initcall
(
pm_init
);
#endif
arch/arm/mach-pxa/sleep.S
0 → 100644
View file @
00da5f26
/*
*
Low
-
level
PXA250
/
210
sleep
/
wakeUp
support
*
*
Initial
SA1110
code
:
*
Copyright
(
c
)
2001
Cliff
Brake
<
cbrake
@
accelent
.
com
>
*
*
Adapted
for
PXA
by
Nicolas
Pitre
:
*
Copyright
(
c
)
2002
Monta
Vista
Software
,
Inc
.
*
*
This
program
is
free
software
; you can redistribute it and/or
*
modify
it
under
the
terms
of
the
GNU
General
Public
License
.
*/
#include <linux/config.h>
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/hardware.h>
.
text
/*
*
pxa_cpu_suspend
()
*
*
Forces
CPU
into
sleep
state
*/
ENTRY
(
pxa_cpu_suspend
)
mra
r2
,
r3
,
acc0
stmfd
sp
!,
{
r2
-
r12
,
lr
}
@
save
registers
on
stack
@
get
coprocessor
registers
mrc
p15
,
0
,
r4
,
c15
,
c1
,
0
@
CP
access
reg
mrc
p15
,
0
,
r5
,
c13
,
c0
,
0
@
PID
mrc
p15
,
0
,
r6
,
c3
,
c0
,
0
@
domain
ID
mrc
p15
,
0
,
r7
,
c2
,
c0
,
0
@
translation
table
base
addr
mrc
p15
,
0
,
r8
,
c1
,
c1
,
0
@
auxiliary
control
reg
mrc
p15
,
0
,
r9
,
c1
,
c0
,
0
@
control
reg
@
store
them
plus
current
virtual
stack
ptr
on
stack
mov
r10
,
sp
stmfd
sp
!,
{
r4
-
r10
}
@
preserve
phys
address
of
stack
mov
r0
,
sp
bl
sleep_phys_sp
ldr
r1
,
=
sleep_save_sp
str
r0
,
[
r1
]
@
clean
data
cache
bl
cpu_xscale_cache_clean_invalidate_all
@
Put
the
processor
to
sleep
@
(
also
workaround
for
sighting
28071
)
@
prepare
value
for
sleep
mode
mov
r1
,
#
3
@
sleep
mode
@
prepare
to
put
SDRAM
into
self
-
refresh
manually
ldr
r4
,
=
MDREFR
ldr
r5
,
[
r4
]
orr
r5
,
r5
,
#
MDREFR_SLFRSH
@
prepare
pointer
to
physical
address
0
(
virtual
mapping
in
generic
.
c
)
mov
r2
,
#
UNCACHED_PHYS_0
@
align
execution
to
a
cache
line
b
1
f
.
ltorg
.
align
5
1
:
@
All
needed
values
are
now
in
registers
.
@
These
last
instructions
should
be
in
cache
@
put
SDRAM
into
self
-
refresh
str
r5
,
[
r4
]
@
force
address
lines
low
by
reading
at
physical
address
0
ldr
r3
,
[
r2
]
@
enter
sleep
mode
mcr
p14
,
0
,
r1
,
c7
,
c0
,
0
20
:
nop
b
20
b
@
loop
waiting
for
sleep
/*
*
cpu_pxa_resume
()
*
*
entry
point
from
bootloader
into
kernel
during
resume
*
*
Note
:
Yes
,
part
of
the
following
code
is
located
into
the
.
data
section
.
*
This
is
to
allow
sleep_save_sp
to
be
accessed
with
a
relative
load
*
while
we
can
't rely on any MMU translation. We could have put
*
sleep_save_sp
in
the
.
text
section
as
well
,
but
some
setups
might
*
insist
on
it
to
be
truely
read
-
only
.
*/
.
data
.
align
5
ENTRY
(
pxa_cpu_resume
)
mov
r0
,
#
I_BIT
| F_BIT |
MODE_SVC
@
set
SVC
,
irqs
off
msr
cpsr_c
,
r0
ldr
r0
,
sleep_save_sp
@
stack
phys
addr
ldr
r2
,
=
resume_after_mmu
@
its
absolute
virtual
address
ldmfd
r0
,
{
r4
-
r9
,
sp
}
@
CP
regs
+
virt
stack
ptr
mov
r1
,
#
0
mcr
p15
,
0
,
r1
,
c8
,
c7
,
0
@
invalidate
I
&
D
TLBs
mcr
p15
,
0
,
r1
,
c7
,
c7
,
0
@
invalidate
I
&
D
caches
,
BTB
#ifdef CONFIG_XSCALE_CACHE_ERRATA
bic
r9
,
r9
,
#
0x0004
@
see
cpu_xscale_proc_init
#endif
mcr
p15
,
0
,
r4
,
c15
,
c1
,
0
@
CP
access
reg
mcr
p15
,
0
,
r5
,
c13
,
c0
,
0
@
PID
mcr
p15
,
0
,
r6
,
c3
,
c0
,
0
@
domain
ID
mcr
p15
,
0
,
r7
,
c2
,
c0
,
0
@
translation
table
base
addr
mcr
p15
,
0
,
r8
,
c1
,
c1
,
0
@
auxiliary
control
reg
b
resume_turn_on_mmu
@
cache
align
execution
.
align
5
resume_turn_on_mmu
:
mcr
p15
,
0
,
r9
,
c1
,
c0
,
0
@
turn
on
MMU
,
caches
,
etc
.
@
Let
us
ensure
we
jump
to
resume_after_mmu
only
when
the
mcr
above
@
actually
took
effect
.
They
call
it
the
"cpwait"
operation
.
mrc
p15
,
0
,
r1
,
c2
,
c0
,
0
@
queue
a
dependency
on
CP15
sub
pc
,
r2
,
r1
,
lsr
#
32
@
jump
to
virtual
addr
nop
nop
nop
sleep_save_sp
:
.
word
0
@
preserve
stack
phys
ptr
here
.
text
resume_after_mmu
:
#ifdef CONFIG_XSCALE_CACHE_ERRATA
bl
cpu_xscale_proc_init
#endif
ldmfd
sp
!,
{
r2
,
r3
}
mar
acc0
,
r2
,
r3
ldmfd
sp
!,
{
r4
-
r12
,
pc
}
@
return
to
caller
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment