18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci *  Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org>
58c2ecf20Sopenharmony_ci *  Copyright (C) 2013 John Crispin <john@phrozen.org>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/kernel.h>
98c2ecf20Sopenharmony_ci#include <linux/init.h>
108c2ecf20Sopenharmony_ci#include <linux/export.h>
118c2ecf20Sopenharmony_ci#include <linux/clkdev.h>
128c2ecf20Sopenharmony_ci#include <linux/clk.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <asm/time.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include "common.h"
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistruct clk {
198c2ecf20Sopenharmony_ci	struct clk_lookup cl;
208c2ecf20Sopenharmony_ci	unsigned long rate;
218c2ecf20Sopenharmony_ci};
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_civoid ralink_clk_add(const char *dev, unsigned long rate)
248c2ecf20Sopenharmony_ci{
258c2ecf20Sopenharmony_ci	struct clk *clk = kzalloc(sizeof(struct clk), GFP_KERNEL);
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	if (!clk)
288c2ecf20Sopenharmony_ci		panic("failed to add clock");
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci	clk->cl.dev_id = dev;
318c2ecf20Sopenharmony_ci	clk->cl.clk = clk;
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci	clk->rate = rate;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	clkdev_add(&clk->cl);
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci/*
398c2ecf20Sopenharmony_ci * Linux clock API
408c2ecf20Sopenharmony_ci */
418c2ecf20Sopenharmony_ciint clk_enable(struct clk *clk)
428c2ecf20Sopenharmony_ci{
438c2ecf20Sopenharmony_ci	return 0;
448c2ecf20Sopenharmony_ci}
458c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_enable);
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_civoid clk_disable(struct clk *clk)
488c2ecf20Sopenharmony_ci{
498c2ecf20Sopenharmony_ci}
508c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_disable);
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ciunsigned long clk_get_rate(struct clk *clk)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	if (!clk)
558c2ecf20Sopenharmony_ci		return 0;
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	return clk->rate;
588c2ecf20Sopenharmony_ci}
598c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_get_rate);
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ciint clk_set_rate(struct clk *clk, unsigned long rate)
628c2ecf20Sopenharmony_ci{
638c2ecf20Sopenharmony_ci	return -1;
648c2ecf20Sopenharmony_ci}
658c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_set_rate);
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cilong clk_round_rate(struct clk *clk, unsigned long rate)
688c2ecf20Sopenharmony_ci{
698c2ecf20Sopenharmony_ci	return -1;
708c2ecf20Sopenharmony_ci}
718c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(clk_round_rate);
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_civoid __init plat_time_init(void)
748c2ecf20Sopenharmony_ci{
758c2ecf20Sopenharmony_ci	struct clk *clk;
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	ralink_of_remap();
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	ralink_clk_init();
808c2ecf20Sopenharmony_ci	clk = clk_get_sys("cpu", NULL);
818c2ecf20Sopenharmony_ci	if (IS_ERR(clk))
828c2ecf20Sopenharmony_ci		panic("unable to get CPU clock, err=%ld", PTR_ERR(clk));
838c2ecf20Sopenharmony_ci	pr_info("CPU Clock: %ldMHz\n", clk_get_rate(clk) / 1000000);
848c2ecf20Sopenharmony_ci	mips_hpt_frequency = clk_get_rate(clk) / 2;
858c2ecf20Sopenharmony_ci	clk_put(clk);
868c2ecf20Sopenharmony_ci	timer_probe();
878c2ecf20Sopenharmony_ci}
88