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