162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Carsten Langgaard, carstenl@mips.com
462306a36Sopenharmony_ci * Copyright (C) 1999,2000 MIPS Technologies, Inc.  All rights reserved.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci *  Setting up the clock on the MIPS boards.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/init.h>
1062306a36Sopenharmony_ci#include <linux/kernel_stat.h>
1162306a36Sopenharmony_ci#include <linux/ptrace.h>
1262306a36Sopenharmony_ci#include <linux/sched.h>
1362306a36Sopenharmony_ci#include <linux/spinlock.h>
1462306a36Sopenharmony_ci#include <linux/mc146818rtc.h>
1562306a36Sopenharmony_ci#include <linux/irq.h>
1662306a36Sopenharmony_ci#include <linux/timex.h>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <asm/mipsregs.h>
1962306a36Sopenharmony_ci#include <asm/time.h>
2062306a36Sopenharmony_ci#include <asm/mach-rc32434/rc32434.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciextern unsigned int idt_cpu_freq;
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/*
2562306a36Sopenharmony_ci * Figure out the r4k offset, the amount to increment the compare
2662306a36Sopenharmony_ci * register for each time tick. There is no RTC available.
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci * The RC32434 counts at half the CPU *core* speed.
2962306a36Sopenharmony_ci */
3062306a36Sopenharmony_cistatic unsigned long __init cal_r4koff(void)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	mips_hpt_frequency = idt_cpu_freq * IDT_CLOCK_MULT / 2;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	return mips_hpt_frequency / HZ;
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_civoid __init plat_time_init(void)
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	unsigned int est_freq;
4062306a36Sopenharmony_ci	unsigned long flags, r4k_offset;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	local_irq_save(flags);
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	printk(KERN_INFO "calculating r4koff... ");
4562306a36Sopenharmony_ci	r4k_offset = cal_r4koff();
4662306a36Sopenharmony_ci	printk("%08lx(%d)\n", r4k_offset, (int) r4k_offset);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	est_freq = 2 * r4k_offset * HZ;
4962306a36Sopenharmony_ci	est_freq += 5000;	/* round */
5062306a36Sopenharmony_ci	est_freq -= est_freq % 10000;
5162306a36Sopenharmony_ci	printk(KERN_INFO "CPU frequency %d.%02d MHz\n", est_freq / 1000000,
5262306a36Sopenharmony_ci	       (est_freq % 1000000) * 100 / 1000000);
5362306a36Sopenharmony_ci	local_irq_restore(flags);
5462306a36Sopenharmony_ci}
55