mirror of
https://github.com/FEX-Emu/linux.git
synced 2025-01-06 01:09:08 +00:00
ARM: OMAP4: CPUidle: Open broadcast clock-event device.
OMAP4 idle driver uses CLOCK_EVT_NOTIFY_BROADCAST_[ENTER/EXIT]
for broadcast clock events. But _ENTER/_EXIT doesn't really open
broadcast clock events and to explicitly setup the broadcast device,
CLOCK_EVT_NOTIFY_BROADCAST_ON should be used.
Add the missing CLOCK_EVT_NOTIFY_BROADCAST_ON clockevent notifications.
This will setup the broadcast timer in either periodic/oneshot modes
correctly. Recent clockevent infrastructure change 77b0d60
{leave the
broadcast device in shutdown mode when not needed} exposed this bug
leading to boot hangs in oneshot mode. Prior to this, periodic broadcast
mode was also broken. This change fixes both the periodic/oneshot broadcast
modes.
Discussion thread :
https://lkml.org/lkml/2012/4/9/13
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
This commit is contained in:
parent
5b4d5bcc68
commit
b93d70aeb8
@ -202,6 +202,16 @@ struct cpuidle_driver omap4_idle_driver = {
|
|||||||
.safe_state_index = 0,
|
.safe_state_index = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For each cpu, setup the broadcast timer because local timers
|
||||||
|
* stops for the states above C1.
|
||||||
|
*/
|
||||||
|
static void omap_setup_broadcast_timer(void *arg)
|
||||||
|
{
|
||||||
|
int cpu = smp_processor_id();
|
||||||
|
clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* omap4_idle_init - Init routine for OMAP4 idle
|
* omap4_idle_init - Init routine for OMAP4 idle
|
||||||
*
|
*
|
||||||
@ -224,6 +234,9 @@ int __init omap4_idle_init(void)
|
|||||||
if (!cpu_clkdm[0] || !cpu_clkdm[1])
|
if (!cpu_clkdm[0] || !cpu_clkdm[1])
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* Configure the broadcast timer on each cpu */
|
||||||
|
on_each_cpu(omap_setup_broadcast_timer, NULL, 1);
|
||||||
|
|
||||||
for_each_cpu(cpu_id, cpu_online_mask) {
|
for_each_cpu(cpu_id, cpu_online_mask) {
|
||||||
dev = &per_cpu(omap4_idle_dev, cpu_id);
|
dev = &per_cpu(omap4_idle_dev, cpu_id);
|
||||||
dev->cpu = cpu_id;
|
dev->cpu = cpu_id;
|
||||||
|
Loading…
Reference in New Issue
Block a user