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