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-spear13xx
hotplug.c
Go to the documentation of this file.
1
/*
2
* linux/arch/arm/mach-spear13xx/hotplug.c
3
*
4
* Copyright (C) 2012 ST Microelectronics Ltd.
5
* Deepak Sikri <
[email protected]
>
6
*
7
* based upon linux/arch/arm/mach-realview/hotplug.c
8
*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License version 2 as
11
* published by the Free Software Foundation.
12
*/
13
#include <linux/kernel.h>
14
#include <linux/errno.h>
15
#include <
linux/smp.h
>
16
#include <asm/cacheflush.h>
17
#include <
asm/cp15.h
>
18
#include <
asm/smp_plat.h
>
19
20
static
inline
void
cpu_enter_lowpower(
void
)
21
{
22
unsigned
int
v
;
23
24
flush_cache_all
();
25
asm
volatile
(
26
" mcr p15, 0, %1, c7, c5, 0\n"
27
" dsb\n"
28
/*
29
* Turn off coherency
30
*/
31
" mrc p15, 0, %0, c1, c0, 1\n"
32
" bic %0, %0, #0x20\n"
33
" mcr p15, 0, %0, c1, c0, 1\n"
34
" mrc p15, 0, %0, c1, c0, 0\n"
35
" bic %0, %0, %2\n"
36
" mcr p15, 0, %0, c1, c0, 0\n"
37
:
"=&r"
(
v
)
38
:
"r"
(0),
"Ir"
(
CR_C
)
39
:
"cc"
,
"memory"
);
40
}
41
42
static
inline
void
cpu_leave_lowpower(
void
)
43
{
44
unsigned
int
v
;
45
46
asm
volatile
(
"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, #0x20\n"
51
" mcr p15, 0, %0, c1, c0, 1\n"
52
:
"=&r"
(
v
)
53
:
"Ir"
(
CR_C
)
54
:
"cc"
);
55
}
56
57
static
inline
void
spear13xx_do_lowpower(
unsigned
int
cpu
,
int
*spurious)
58
{
59
for
(;;) {
60
wfi
();
61
62
if
(
pen_release
== cpu) {
63
/*
64
* OK, proper wakeup, we're done
65
*/
66
break
;
67
}
68
69
/*
70
* Getting here, means that we have come out of WFI without
71
* having been woken up - this shouldn't happen
72
*
73
* Just note it happening - when we're woken, we can report
74
* its occurrence.
75
*/
76
(*spurious)++;
77
}
78
}
79
80
/*
81
* platform-specific code to shutdown a CPU
82
*
83
* Called with IRQs disabled
84
*/
85
void
__ref
spear13xx_cpu_die
(
unsigned
int
cpu)
86
{
87
int
spurious = 0;
88
89
/*
90
* we're ready for shutdown now, so do it
91
*/
92
cpu_enter_lowpower();
93
spear13xx_do_lowpower(cpu, &spurious);
94
95
/*
96
* bring this CPU back into the world of cache
97
* coherency, and then restore interrupts
98
*/
99
cpu_leave_lowpower();
100
101
if
(spurious)
102
pr_warn
(
"CPU%u: %u spurious wakeup calls\n"
, cpu, spurious);
103
}
Generated on Thu Jan 10 2013 12:58:56 for Linux Kernel by
1.8.2