18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/drivers/clocksource/dummy_timer.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2013 ARM Ltd. 68c2ecf20Sopenharmony_ci * All Rights Reserved 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#include <linux/clockchips.h> 98c2ecf20Sopenharmony_ci#include <linux/cpu.h> 108c2ecf20Sopenharmony_ci#include <linux/init.h> 118c2ecf20Sopenharmony_ci#include <linux/percpu.h> 128c2ecf20Sopenharmony_ci#include <linux/cpumask.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistatic DEFINE_PER_CPU(struct clock_event_device, dummy_timer_evt); 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_cistatic int dummy_timer_starting_cpu(unsigned int cpu) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci struct clock_event_device *evt = per_cpu_ptr(&dummy_timer_evt, cpu); 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci evt->name = "dummy_timer"; 218c2ecf20Sopenharmony_ci evt->features = CLOCK_EVT_FEAT_PERIODIC | 228c2ecf20Sopenharmony_ci CLOCK_EVT_FEAT_ONESHOT | 238c2ecf20Sopenharmony_ci CLOCK_EVT_FEAT_DUMMY; 248c2ecf20Sopenharmony_ci evt->rating = 100; 258c2ecf20Sopenharmony_ci evt->cpumask = cpumask_of(cpu); 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci clockevents_register_device(evt); 288c2ecf20Sopenharmony_ci return 0; 298c2ecf20Sopenharmony_ci} 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_cistatic int __init dummy_timer_register(void) 328c2ecf20Sopenharmony_ci{ 338c2ecf20Sopenharmony_ci return cpuhp_setup_state(CPUHP_AP_DUMMY_TIMER_STARTING, 348c2ecf20Sopenharmony_ci "clockevents/dummy_timer:starting", 358c2ecf20Sopenharmony_ci dummy_timer_starting_cpu, NULL); 368c2ecf20Sopenharmony_ci} 378c2ecf20Sopenharmony_ciearly_initcall(dummy_timer_register); 38