Merge branch 'fix-dss-mux' into fixes
[cascardo/linux.git] / arch / arm / mach-msm / idle.c
1 /* arch/arm/mach-msm/idle.c
2  *
3  * Idle processing for MSM7K - work around bugs with SWFI.
4  *
5  * Copyright (c) 2007 QUALCOMM Incorporated.
6  * Copyright (C) 2007 Google, Inc.
7  *
8  * This software is licensed under the terms of the GNU General Public
9  * License version 2, as published by the Free Software Foundation, and
10  * may be copied, distributed, and modified under those terms.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  */
18
19 #include <linux/init.h>
20 #include <asm/system.h>
21
22 static void msm_idle(void)
23 {
24 #ifdef CONFIG_MSM7X00A_IDLE
25         asm volatile (
26
27         "mrc     p15, 0, r1, c1, c0, 0    /* read current CR    */ \n\t"
28         "bic     r0, r1, #(1 << 2)        /* clear dcache bit   */ \n\t"
29         "bic     r0, r0, #(1 << 12)       /* clear icache bit   */ \n\t"
30         "mcr     p15, 0, r0, c1, c0, 0    /* disable d/i cache  */ \n\t"
31
32         "mov     r0, #0                   /* prepare wfi value  */ \n\t"
33         "mcr     p15, 0, r0, c7, c10, 0   /* flush the cache    */ \n\t"
34         "mcr     p15, 0, r0, c7, c10, 4   /* memory barrier     */ \n\t"
35         "mcr     p15, 0, r0, c7, c0, 4    /* wait for interrupt */ \n\t"
36
37         "mcr     p15, 0, r1, c1, c0, 0    /* restore d/i cache  */ \n\t"
38
39         : : : "r0","r1" );
40 #endif
41 }
42
43 static int __init msm_idle_init(void)
44 {
45         arm_pm_idle = msm_idle;
46         return 0;
47 }
48
49 arch_initcall(msm_idle_init);