18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Carsten Langgaard, carstenl@mips.com 48c2ecf20Sopenharmony_ci * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Setting up the clock on the MIPS boards. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/init.h> 108c2ecf20Sopenharmony_ci#include <linux/kernel_stat.h> 118c2ecf20Sopenharmony_ci#include <linux/ptrace.h> 128c2ecf20Sopenharmony_ci#include <linux/sched.h> 138c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 148c2ecf20Sopenharmony_ci#include <linux/mc146818rtc.h> 158c2ecf20Sopenharmony_ci#include <linux/irq.h> 168c2ecf20Sopenharmony_ci#include <linux/timex.h> 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#include <asm/mipsregs.h> 198c2ecf20Sopenharmony_ci#include <asm/time.h> 208c2ecf20Sopenharmony_ci#include <asm/mach-rc32434/rc32434.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ciextern unsigned int idt_cpu_freq; 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci/* 258c2ecf20Sopenharmony_ci * Figure out the r4k offset, the amount to increment the compare 268c2ecf20Sopenharmony_ci * register for each time tick. There is no RTC available. 278c2ecf20Sopenharmony_ci * 288c2ecf20Sopenharmony_ci * The RC32434 counts at half the CPU *core* speed. 298c2ecf20Sopenharmony_ci */ 308c2ecf20Sopenharmony_cistatic unsigned long __init cal_r4koff(void) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci mips_hpt_frequency = idt_cpu_freq * IDT_CLOCK_MULT / 2; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci return mips_hpt_frequency / HZ; 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_civoid __init plat_time_init(void) 388c2ecf20Sopenharmony_ci{ 398c2ecf20Sopenharmony_ci unsigned int est_freq; 408c2ecf20Sopenharmony_ci unsigned long flags, r4k_offset; 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci local_irq_save(flags); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci printk(KERN_INFO "calculating r4koff... "); 458c2ecf20Sopenharmony_ci r4k_offset = cal_r4koff(); 468c2ecf20Sopenharmony_ci printk("%08lx(%d)\n", r4k_offset, (int) r4k_offset); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci est_freq = 2 * r4k_offset * HZ; 498c2ecf20Sopenharmony_ci est_freq += 5000; /* round */ 508c2ecf20Sopenharmony_ci est_freq -= est_freq % 10000; 518c2ecf20Sopenharmony_ci printk(KERN_INFO "CPU frequency %d.%02d MHz\n", est_freq / 1000000, 528c2ecf20Sopenharmony_ci (est_freq % 1000000) * 100 / 1000000); 538c2ecf20Sopenharmony_ci local_irq_restore(flags); 548c2ecf20Sopenharmony_ci} 55