162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2016 Imagination Technologies 462306a36Sopenharmony_ci * Author: Paul Burton <paul.burton@mips.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/clk.h> 862306a36Sopenharmony_ci#include <linux/clk-provider.h> 962306a36Sopenharmony_ci#include <linux/clocksource.h> 1062306a36Sopenharmony_ci#include <linux/init.h> 1162306a36Sopenharmony_ci#include <linux/types.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <asm/irq.h> 1462306a36Sopenharmony_ci#include <asm/mips-cps.h> 1562306a36Sopenharmony_ci#include <asm/time.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciint get_c0_fdc_int(void) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci int mips_cpu_fdc_irq; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci if (mips_gic_present()) 2262306a36Sopenharmony_ci mips_cpu_fdc_irq = gic_get_c0_fdc_int(); 2362306a36Sopenharmony_ci else if (cpu_has_veic) 2462306a36Sopenharmony_ci panic("Unimplemented!"); 2562306a36Sopenharmony_ci else if (cp0_fdc_irq >= 0) 2662306a36Sopenharmony_ci mips_cpu_fdc_irq = MIPS_CPU_IRQ_BASE + cp0_fdc_irq; 2762306a36Sopenharmony_ci else 2862306a36Sopenharmony_ci mips_cpu_fdc_irq = -1; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci return mips_cpu_fdc_irq; 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciint get_c0_perfcount_int(void) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci int mips_cpu_perf_irq; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci if (mips_gic_present()) 3862306a36Sopenharmony_ci mips_cpu_perf_irq = gic_get_c0_perfcount_int(); 3962306a36Sopenharmony_ci else if (cpu_has_veic) 4062306a36Sopenharmony_ci panic("Unimplemented!"); 4162306a36Sopenharmony_ci else if (cp0_perfcount_irq >= 0) 4262306a36Sopenharmony_ci mips_cpu_perf_irq = MIPS_CPU_IRQ_BASE + cp0_perfcount_irq; 4362306a36Sopenharmony_ci else 4462306a36Sopenharmony_ci mips_cpu_perf_irq = -1; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci return mips_cpu_perf_irq; 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciunsigned int get_c0_compare_int(void) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci int mips_cpu_timer_irq; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci if (mips_gic_present()) 5462306a36Sopenharmony_ci mips_cpu_timer_irq = gic_get_c0_compare_int(); 5562306a36Sopenharmony_ci else if (cpu_has_veic) 5662306a36Sopenharmony_ci panic("Unimplemented!"); 5762306a36Sopenharmony_ci else 5862306a36Sopenharmony_ci mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci return mips_cpu_timer_irq; 6162306a36Sopenharmony_ci} 62