-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'imx6q-cpudile-3.9' of git://git.linaro.org/people/shawnguo…
…/linux-2.6 into next/soc From Shawn Guo: imx6q cpuidle support for 3.9 - It's based on imx-cleanup-3.9 to avoid conflicts. * tag 'imx6q-cpudile-3.9' of git://git.linaro.org/people/shawnguo/linux-2.6: ARM: imx6q: support WAIT mode using cpuidle ARM: imx: move imx6q_cpuidle_driver into a separate file ARM: imx: mask gpc interrupts initially ARM: imx: return zero in case next event gets a large increment ARM: imx: Remove mx508 support ARM: imx: Remove mach-mx51_3ds board ARM: imx: use debug_ll_io_init() for imx6q ARM: imx: remove unused imx6q_clock_map_io() ARM: mach-imx: Kconfig: Do not select Babbage for MACH_IMX51_DT Signed-off-by: Olof Johansson <olof@lixom.net> Still, two delete/change conflicts caused by imx/cleanup: arch/arm/mach-imx/mach-mx50_rdp.c arch/arm/mach-imx/mach-mx51_3ds.c
- Loading branch information
Showing
29 changed files
with
153 additions
and
1,959 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/* | ||
* Copyright (C) 2012 Freescale Semiconductor, Inc. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/clockchips.h> | ||
#include <linux/cpuidle.h> | ||
#include <linux/module.h> | ||
#include <asm/cpuidle.h> | ||
#include <asm/proc-fns.h> | ||
|
||
#include "common.h" | ||
#include "cpuidle.h" | ||
|
||
static atomic_t master = ATOMIC_INIT(0); | ||
static DEFINE_SPINLOCK(master_lock); | ||
|
||
static int imx6q_enter_wait(struct cpuidle_device *dev, | ||
struct cpuidle_driver *drv, int index) | ||
{ | ||
int cpu = dev->cpu; | ||
|
||
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &cpu); | ||
|
||
if (atomic_inc_return(&master) == num_online_cpus()) { | ||
/* | ||
* With this lock, we prevent other cpu to exit and enter | ||
* this function again and become the master. | ||
*/ | ||
if (!spin_trylock(&master_lock)) | ||
goto idle; | ||
imx6q_set_lpm(WAIT_UNCLOCKED); | ||
cpu_do_idle(); | ||
imx6q_set_lpm(WAIT_CLOCKED); | ||
spin_unlock(&master_lock); | ||
goto done; | ||
} | ||
|
||
idle: | ||
cpu_do_idle(); | ||
done: | ||
atomic_dec(&master); | ||
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &cpu); | ||
|
||
return index; | ||
} | ||
|
||
/* | ||
* For each cpu, setup the broadcast timer because local timer | ||
* stops for the states other than WFI. | ||
*/ | ||
static void imx6q_setup_broadcast_timer(void *arg) | ||
{ | ||
int cpu = smp_processor_id(); | ||
|
||
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu); | ||
} | ||
|
||
static struct cpuidle_driver imx6q_cpuidle_driver = { | ||
.name = "imx6q_cpuidle", | ||
.owner = THIS_MODULE, | ||
.en_core_tk_irqen = 1, | ||
.states = { | ||
/* WFI */ | ||
ARM_CPUIDLE_WFI_STATE, | ||
/* WAIT */ | ||
{ | ||
.exit_latency = 50, | ||
.target_residency = 75, | ||
.flags = CPUIDLE_FLAG_TIME_VALID, | ||
.enter = imx6q_enter_wait, | ||
.name = "WAIT", | ||
.desc = "Clock off", | ||
}, | ||
}, | ||
.state_count = 2, | ||
.safe_state_index = 0, | ||
}; | ||
|
||
int __init imx6q_cpuidle_init(void) | ||
{ | ||
/* Need to enable SCU standby for entering WAIT modes */ | ||
imx_scu_standby_enable(); | ||
|
||
/* Set chicken bit to get a reliable WAIT mode support */ | ||
imx6q_set_chicken_bit(); | ||
|
||
/* Configure the broadcast timer on each cpu */ | ||
on_each_cpu(imx6q_setup_broadcast_timer, NULL, 1); | ||
|
||
return imx_cpuidle_init(&imx6q_cpuidle_driver); | ||
} |
Oops, something went wrong.