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