2013-06-04 00:33:53 +04:00
/*
* linux / drivers / clocksource / dummy_timer . c
*
* Copyright ( C ) 2013 ARM Ltd .
* All Rights Reserved
*
* 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/cpu.h>
# include <linux/init.h>
# include <linux/percpu.h>
# include <linux/cpumask.h>
static DEFINE_PER_CPU ( struct clock_event_device , dummy_timer_evt ) ;
static void dummy_timer_set_mode ( enum clock_event_mode mode ,
struct clock_event_device * evt )
{
/*
* Core clockevents code will call this when exchanging timer devices .
* We don ' t need to do anything here .
*/
}
2013-06-19 19:32:08 +04:00
static void dummy_timer_setup ( void )
2013-06-04 00:33:53 +04:00
{
int cpu = smp_processor_id ( ) ;
2014-08-17 21:30:25 +04:00
struct clock_event_device * evt = raw_cpu_ptr ( & dummy_timer_evt ) ;
2013-06-04 00:33:53 +04:00
evt - > name = " dummy_timer " ;
evt - > features = CLOCK_EVT_FEAT_PERIODIC |
CLOCK_EVT_FEAT_ONESHOT |
CLOCK_EVT_FEAT_DUMMY ;
evt - > rating = 100 ;
evt - > set_mode = dummy_timer_set_mode ;
evt - > cpumask = cpumask_of ( cpu ) ;
clockevents_register_device ( evt ) ;
}
2013-06-19 19:32:08 +04:00
static int dummy_timer_cpu_notify ( struct notifier_block * self ,
2013-06-04 00:33:53 +04:00
unsigned long action , void * hcpu )
{
if ( ( action & ~ CPU_TASKS_FROZEN ) = = CPU_STARTING )
dummy_timer_setup ( ) ;
return NOTIFY_OK ;
}
2013-06-19 19:32:08 +04:00
static struct notifier_block dummy_timer_cpu_nb = {
2013-06-04 00:33:53 +04:00
. notifier_call = dummy_timer_cpu_notify ,
} ;
static int __init dummy_timer_register ( void )
{
2014-03-11 00:40:23 +04:00
int err = 0 ;
cpu_notifier_register_begin ( ) ;
err = __register_cpu_notifier ( & dummy_timer_cpu_nb ) ;
2013-06-04 00:33:53 +04:00
if ( err )
2014-03-11 00:40:23 +04:00
goto out ;
2013-06-04 00:33:53 +04:00
/* We won't get a call on the boot CPU, so register immediately */
if ( num_possible_cpus ( ) > 1 )
dummy_timer_setup ( ) ;
2014-03-11 00:40:23 +04:00
out :
cpu_notifier_register_done ( ) ;
return err ;
2013-06-04 00:33:53 +04:00
}
early_initcall ( dummy_timer_register ) ;