Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
arm
mach-vexpress
hotplug.c
Go to the documentation of this file.
1
/*
2
* linux/arch/arm/mach-realview/hotplug.c
3
*
4
* Copyright (C) 2002 ARM Ltd.
5
* All Rights Reserved
6
*
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License version 2 as
9
* published by the Free Software Foundation.
10
*/
11
#include <linux/kernel.h>
12
#include <linux/errno.h>
13
#include <
linux/smp.h
>
14
15
#include <asm/cacheflush.h>
16
#include <
asm/smp_plat.h
>
17
#include <
asm/cp15.h
>
18
19
static
inline
void
cpu_enter_lowpower(
void
)
20
{
21
unsigned
int
v
;
22
23
flush_cache_all
();
24
asm
volatile
(
25
"mcr p15, 0, %1, c7, c5, 0\n"
26
" mcr p15, 0, %1, c7, c10, 4\n"
27
/*
28
* Turn off coherency
29
*/
30
" mrc p15, 0, %0, c1, c0, 1\n"
31
" bic %0, %0, %3\n"
32
" mcr p15, 0, %0, c1, c0, 1\n"
33
" mrc p15, 0, %0, c1, c0, 0\n"
34
" bic %0, %0, %2\n"
35
" mcr p15, 0, %0, c1, c0, 0\n"
36
:
"=&r"
(
v
)
37
:
"r"
(0),
"Ir"
(
CR_C
),
"Ir"
(0x40)
38
:
"cc"
);
39
}
40
41
static
inline
void
cpu_leave_lowpower(
void
)
42
{
43
unsigned
int
v
;
44
45
asm
volatile
(
46
"mrc p15, 0, %0, c1, c0, 0\n"
47
" orr %0, %0, %1\n"
48
" mcr p15, 0, %0, c1, c0, 0\n"
49
" mrc p15, 0, %0, c1, c0, 1\n"
50
" orr %0, %0, %2\n"
51
" mcr p15, 0, %0, c1, c0, 1\n"
52
:
"=&r"
(
v
)
53
:
"Ir"
(
CR_C
),
"Ir"
(0x40)
54
:
"cc"
);
55
}
56
57
static
inline
void
platform_do_lowpower(
unsigned
int
cpu
,
int
*spurious)
58
{
59
/*
60
* there is no power-control hardware on this platform, so all
61
* we can do is put the core into WFI; this is safe as the calling
62
* code will have already disabled interrupts
63
*/
64
for
(;;) {
65
wfi
();
66
67
if
(
pen_release
==
cpu_logical_map
(cpu)) {
68
/*
69
* OK, proper wakeup, we're done
70
*/
71
break
;
72
}
73
74
/*
75
* Getting here, means that we have come out of WFI without
76
* having been woken up - this shouldn't happen
77
*
78
* Just note it happening - when we're woken, we can report
79
* its occurrence.
80
*/
81
(*spurious)++;
82
}
83
}
84
85
/*
86
* platform-specific code to shutdown a CPU
87
*
88
* Called with IRQs disabled
89
*/
90
void
__ref
vexpress_cpu_die
(
unsigned
int
cpu)
91
{
92
int
spurious = 0;
93
94
/*
95
* we're ready for shutdown now, so do it
96
*/
97
cpu_enter_lowpower();
98
platform_do_lowpower(cpu, &spurious);
99
100
/*
101
* bring this CPU back into the world of cache
102
* coherency, and then restore interrupts
103
*/
104
cpu_leave_lowpower();
105
106
if
(spurious)
107
pr_warn
(
"CPU%u: %u spurious wakeup calls\n"
, cpu, spurious);
108
}
Generated on Thu Jan 10 2013 12:58:57 for Linux Kernel by
1.8.2