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