diff options
Diffstat (limited to 'arch/arm/mach-ux500/cpuidle.c')
| -rw-r--r-- | arch/arm/mach-ux500/cpuidle.c | 58 | 
1 files changed, 3 insertions, 55 deletions
diff --git a/arch/arm/mach-ux500/cpuidle.c b/arch/arm/mach-ux500/cpuidle.c index ce9149302cc..488e07472d9 100644 --- a/arch/arm/mach-ux500/cpuidle.c +++ b/arch/arm/mach-ux500/cpuidle.c @@ -11,7 +11,6 @@  #include <linux/module.h>  #include <linux/cpuidle.h> -#include <linux/clockchips.h>  #include <linux/spinlock.h>  #include <linux/atomic.h>  #include <linux/smp.h> @@ -22,7 +21,6 @@  static atomic_t master = ATOMIC_INIT(0);  static DEFINE_SPINLOCK(master_lock); -static DEFINE_PER_CPU(struct cpuidle_device, ux500_cpuidle_device);  static inline int ux500_enter_idle(struct cpuidle_device *dev,  				   struct cpuidle_driver *drv, int index) @@ -30,8 +28,6 @@ static inline int ux500_enter_idle(struct cpuidle_device *dev,  	int this_cpu = smp_processor_id();  	bool recouple = false; -	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ENTER, &this_cpu); -  	if (atomic_inc_return(&master) == num_online_cpus()) {  		/* With this lock, we prevent the other cpu to exit and enter @@ -91,22 +87,20 @@ out:  		spin_unlock(&master_lock);  	} -	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_EXIT, &this_cpu); -  	return index;  }  static struct cpuidle_driver ux500_idle_driver = {  	.name = "ux500_idle",  	.owner = THIS_MODULE, -	.en_core_tk_irqen = 1,  	.states = {  		ARM_CPUIDLE_WFI_STATE,  		{  			.enter		  = ux500_enter_idle,  			.exit_latency	  = 70,  			.target_residency = 260, -			.flags		  = CPUIDLE_FLAG_TIME_VALID, +			.flags		  = CPUIDLE_FLAG_TIME_VALID | +			                    CPUIDLE_FLAG_TIMER_STOP,  			.name		  = "ApIdle",  			.desc		  = "ARM Retention",  		}, @@ -115,59 +109,13 @@ static struct cpuidle_driver ux500_idle_driver = {  	.state_count = 2,  }; -/* - * For each cpu, setup the broadcast timer because we will - * need to migrate the timers for the states >= ApIdle. - */ -static void ux500_setup_broadcast_timer(void *arg) -{ -	int cpu = smp_processor_id(); -	clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu); -} -  int __init ux500_idle_init(void)  { -	int ret, cpu; -	struct cpuidle_device *device; -          /* Configure wake up reasons */  	prcmu_enable_wakeups(PRCMU_WAKEUP(ARM) | PRCMU_WAKEUP(RTC) |  			     PRCMU_WAKEUP(ABB)); -	/* -	 * Configure the timer broadcast for each cpu, that must -	 * be done from the cpu context, so we use a smp cross -	 * call with 'on_each_cpu'. -	 */ -	on_each_cpu(ux500_setup_broadcast_timer, NULL, 1); - -	ret = cpuidle_register_driver(&ux500_idle_driver); -	if (ret) { -		printk(KERN_ERR "failed to register ux500 idle driver\n"); -		return ret; -	} - -	for_each_online_cpu(cpu) { -		device = &per_cpu(ux500_cpuidle_device, cpu); -		device->cpu = cpu; -		ret = cpuidle_register_device(device); -		if (ret) { -			printk(KERN_ERR "Failed to register cpuidle " -			       "device for cpu%d\n", cpu); -			goto out_unregister; -		} -	} -out: -	return ret; - -out_unregister: -	for_each_online_cpu(cpu) { -		device = &per_cpu(ux500_cpuidle_device, cpu); -		cpuidle_unregister_device(device); -	} - -	cpuidle_unregister_driver(&ux500_idle_driver); -	goto out; +	return cpuidle_register(&ux500_idle_driver, NULL);  }  device_initcall(ux500_idle_init);  |