162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Timer tick function for architectures that lack generic clockevents, 462306a36Sopenharmony_ci * consolidated here from m68k/ia64/parisc/arm. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/irq.h> 862306a36Sopenharmony_ci#include <linux/profile.h> 962306a36Sopenharmony_ci#include <linux/timekeeper_internal.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include "tick-internal.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/** 1462306a36Sopenharmony_ci * legacy_timer_tick() - advances the timekeeping infrastructure 1562306a36Sopenharmony_ci * @ticks: number of ticks, that have elapsed since the last call. 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * This is used by platforms that have not been converted to 1862306a36Sopenharmony_ci * generic clockevents. 1962306a36Sopenharmony_ci * 2062306a36Sopenharmony_ci * If 'ticks' is zero, the CPU is not handling timekeeping, so 2162306a36Sopenharmony_ci * only perform process accounting and profiling. 2262306a36Sopenharmony_ci * 2362306a36Sopenharmony_ci * Must be called with interrupts disabled. 2462306a36Sopenharmony_ci */ 2562306a36Sopenharmony_civoid legacy_timer_tick(unsigned long ticks) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci if (ticks) { 2862306a36Sopenharmony_ci raw_spin_lock(&jiffies_lock); 2962306a36Sopenharmony_ci write_seqcount_begin(&jiffies_seq); 3062306a36Sopenharmony_ci do_timer(ticks); 3162306a36Sopenharmony_ci write_seqcount_end(&jiffies_seq); 3262306a36Sopenharmony_ci raw_spin_unlock(&jiffies_lock); 3362306a36Sopenharmony_ci update_wall_time(); 3462306a36Sopenharmony_ci } 3562306a36Sopenharmony_ci update_process_times(user_mode(get_irq_regs())); 3662306a36Sopenharmony_ci profile_tick(CPU_PROFILING); 3762306a36Sopenharmony_ci} 38