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