18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Pistachio clocksource/timer setup
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2014 Google, Inc.
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/clk.h>
98c2ecf20Sopenharmony_ci#include <linux/clocksource.h>
108c2ecf20Sopenharmony_ci#include <linux/init.h>
118c2ecf20Sopenharmony_ci#include <linux/of.h>
128c2ecf20Sopenharmony_ci#include <linux/of_clk.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <asm/mips-cps.h>
158c2ecf20Sopenharmony_ci#include <asm/time.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ciunsigned int get_c0_compare_int(void)
188c2ecf20Sopenharmony_ci{
198c2ecf20Sopenharmony_ci	return gic_get_c0_compare_int();
208c2ecf20Sopenharmony_ci}
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ciint get_c0_perfcount_int(void)
238c2ecf20Sopenharmony_ci{
248c2ecf20Sopenharmony_ci	return gic_get_c0_perfcount_int();
258c2ecf20Sopenharmony_ci}
268c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(get_c0_perfcount_int);
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ciint get_c0_fdc_int(void)
298c2ecf20Sopenharmony_ci{
308c2ecf20Sopenharmony_ci	return gic_get_c0_fdc_int();
318c2ecf20Sopenharmony_ci}
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_civoid __init plat_time_init(void)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci	struct device_node *np;
368c2ecf20Sopenharmony_ci	struct clk *clk;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	of_clk_init(NULL);
398c2ecf20Sopenharmony_ci	timer_probe();
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	np = of_get_cpu_node(0, NULL);
428c2ecf20Sopenharmony_ci	if (!np) {
438c2ecf20Sopenharmony_ci		pr_err("Failed to get CPU node\n");
448c2ecf20Sopenharmony_ci		return;
458c2ecf20Sopenharmony_ci	}
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	clk = of_clk_get(np, 0);
488c2ecf20Sopenharmony_ci	if (IS_ERR(clk)) {
498c2ecf20Sopenharmony_ci		pr_err("Failed to get CPU clock: %ld\n", PTR_ERR(clk));
508c2ecf20Sopenharmony_ci		return;
518c2ecf20Sopenharmony_ci	}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	mips_hpt_frequency = clk_get_rate(clk) / 2;
548c2ecf20Sopenharmony_ci	clk_put(clk);
558c2ecf20Sopenharmony_ci}
56