cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

clock-sh7712.c (1476B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * arch/sh/kernel/cpu/sh3/clock-sh7712.c
      4 *
      5 * SH7712 support for the clock framework
      6 *
      7 *  Copyright (C) 2007  Andrew Murray <amurray@mpc-data.co.uk>
      8 *
      9 * Based on arch/sh/kernel/cpu/sh3/clock-sh3.c
     10 *  Copyright (C) 2005  Paul Mundt
     11 */
     12#include <linux/init.h>
     13#include <linux/kernel.h>
     14#include <asm/clock.h>
     15#include <asm/freq.h>
     16#include <asm/io.h>
     17
     18static int multipliers[] = { 1, 2, 3 };
     19static int divisors[]    = { 1, 2, 3, 4, 6 };
     20
     21static void master_clk_init(struct clk *clk)
     22{
     23	int frqcr = __raw_readw(FRQCR);
     24	int idx = (frqcr & 0x0300) >> 8;
     25
     26	clk->rate *= multipliers[idx];
     27}
     28
     29static struct sh_clk_ops sh7712_master_clk_ops = {
     30	.init		= master_clk_init,
     31};
     32
     33static unsigned long module_clk_recalc(struct clk *clk)
     34{
     35	int frqcr = __raw_readw(FRQCR);
     36	int idx = frqcr & 0x0007;
     37
     38	return clk->parent->rate / divisors[idx];
     39}
     40
     41static struct sh_clk_ops sh7712_module_clk_ops = {
     42	.recalc		= module_clk_recalc,
     43};
     44
     45static unsigned long cpu_clk_recalc(struct clk *clk)
     46{
     47	int frqcr = __raw_readw(FRQCR);
     48	int idx = (frqcr & 0x0030) >> 4;
     49
     50	return clk->parent->rate / divisors[idx];
     51}
     52
     53static struct sh_clk_ops sh7712_cpu_clk_ops = {
     54	.recalc		= cpu_clk_recalc,
     55};
     56
     57static struct sh_clk_ops *sh7712_clk_ops[] = {
     58	&sh7712_master_clk_ops,
     59	&sh7712_module_clk_ops,
     60	&sh7712_cpu_clk_ops,
     61};
     62
     63void __init arch_init_clk_ops(struct sh_clk_ops **ops, int idx)
     64{
     65	if (idx < ARRAY_SIZE(sh7712_clk_ops))
     66		*ops = sh7712_clk_ops[idx];
     67}
     68