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-exynos
hotplug.c
Go to the documentation of this file.
1
/* linux arch/arm/mach-exynos4/hotplug.c
2
*
3
* Cloned from linux/arch/arm/mach-realview/hotplug.c
4
*
5
* Copyright (C) 2002 ARM Ltd.
6
* All Rights Reserved
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License version 2 as
10
* published by the Free Software Foundation.
11
*/
12
13
#include <linux/kernel.h>
14
#include <linux/errno.h>
15
#include <
linux/smp.h
>
16
#include <
linux/io.h
>
17
18
#include <asm/cacheflush.h>
19
#include <
asm/cp15.h
>
20
#include <
asm/smp_plat.h
>
21
22
#include <
mach/regs-pmu.h
>
23
24
#include "
common.h
"
25
26
static
inline
void
cpu_enter_lowpower(
void
)
27
{
28
unsigned
int
v
;
29
30
flush_cache_all
();
31
asm
volatile
(
32
" mcr p15, 0, %1, c7, c5, 0\n"
33
" mcr p15, 0, %1, c7, c10, 4\n"
34
/*
35
* Turn off coherency
36
*/
37
" mrc p15, 0, %0, c1, c0, 1\n"
38
" bic %0, %0, %3\n"
39
" mcr p15, 0, %0, c1, c0, 1\n"
40
" mrc p15, 0, %0, c1, c0, 0\n"
41
" bic %0, %0, %2\n"
42
" mcr p15, 0, %0, c1, c0, 0\n"
43
:
"=&r"
(
v
)
44
:
"r"
(0),
"Ir"
(
CR_C
),
"Ir"
(0x40)
45
:
"cc"
);
46
}
47
48
static
inline
void
cpu_leave_lowpower(
void
)
49
{
50
unsigned
int
v
;
51
52
asm
volatile
(
53
"mrc p15, 0, %0, c1, c0, 0\n"
54
" orr %0, %0, %1\n"
55
" mcr p15, 0, %0, c1, c0, 0\n"
56
" mrc p15, 0, %0, c1, c0, 1\n"
57
" orr %0, %0, %2\n"
58
" mcr p15, 0, %0, c1, c0, 1\n"
59
:
"=&r"
(
v
)
60
:
"Ir"
(
CR_C
),
"Ir"
(0x40)
61
:
"cc"
);
62
}
63
64
static
inline
void
platform_do_lowpower(
unsigned
int
cpu
,
int
*spurious)
65
{
66
for
(;;) {
67
68
/* make cpu1 to be turned off at next WFI command */
69
if
(cpu == 1)
70
__raw_writel
(0,
S5P_ARM_CORE1_CONFIGURATION
);
71
72
/*
73
* here's the WFI
74
*/
75
asm
(
".word 0xe320f003\n"
76
:
77
:
78
:
"memory"
,
"cc"
);
79
80
if
(
pen_release
==
cpu_logical_map
(cpu)) {
81
/*
82
* OK, proper wakeup, we're done
83
*/
84
break
;
85
}
86
87
/*
88
* Getting here, means that we have come out of WFI without
89
* having been woken up - this shouldn't happen
90
*
91
* Just note it happening - when we're woken, we can report
92
* its occurrence.
93
*/
94
(*spurious)++;
95
}
96
}
97
98
/*
99
* platform-specific code to shutdown a CPU
100
*
101
* Called with IRQs disabled
102
*/
103
void
__ref
exynos_cpu_die
(
unsigned
int
cpu)
104
{
105
int
spurious = 0;
106
107
/*
108
* we're ready for shutdown now, so do it
109
*/
110
cpu_enter_lowpower();
111
platform_do_lowpower(cpu, &spurious);
112
113
/*
114
* bring this CPU back into the world of cache
115
* coherency, and then restore interrupts
116
*/
117
cpu_leave_lowpower();
118
119
if
(spurious)
120
pr_warn
(
"CPU%u: %u spurious wakeup calls\n"
, cpu, spurious);
121
}
Generated on Thu Jan 10 2013 12:58:56 for Linux Kernel by
1.8.2