Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

sh: sh7712 clock support

This patch provides specific clock support for the SH7712.

Signed-off-by: Andrew Murray <amurray@mpc-data.co.uk>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>

authored by

Andrew Murray and committed by
Paul Mundt
c3aa92af 7d740a06

+77
+1
arch/sh/kernel/cpu/sh3/Makefile
··· 22 22 clock-$(CONFIG_CPU_SUBTYPE_SH7709) := clock-sh7709.o 23 23 clock-$(CONFIG_CPU_SUBTYPE_SH7710) := clock-sh7710.o 24 24 clock-$(CONFIG_CPU_SUBTYPE_SH7720) := clock-sh7710.o 25 + clock-$(CONFIG_CPU_SUBTYPE_SH7712) := clock-sh7712.o 25 26 26 27 obj-y += $(clock-y)
+71
arch/sh/kernel/cpu/sh3/clock-sh7712.c
··· 1 + /* 2 + * arch/sh/kernel/cpu/sh3/clock-sh7712.c 3 + * 4 + * SH7712 support for the clock framework 5 + * 6 + * Copyright (C) 2007 Andrew Murray <amurray@mpc-data.co.uk> 7 + * 8 + * Based on arch/sh/kernel/cpu/sh3/clock-sh3.c 9 + * Copyright (C) 2005 Paul Mundt 10 + * 11 + * This file is subject to the terms and conditions of the GNU General Public 12 + * License. See the file "COPYING" in the main directory of this archive 13 + * for more details. 14 + */ 15 + #include <linux/init.h> 16 + #include <linux/kernel.h> 17 + #include <asm/clock.h> 18 + #include <asm/freq.h> 19 + #include <asm/io.h> 20 + 21 + static int multipliers[] = { 1, 2, 3 }; 22 + static int divisors[] = { 1, 2, 3, 4, 6 }; 23 + 24 + static void master_clk_init(struct clk *clk) 25 + { 26 + int frqcr = ctrl_inw(FRQCR); 27 + int idx = (frqcr & 0x0300) >> 8; 28 + 29 + clk->rate *= multipliers[idx]; 30 + } 31 + 32 + static struct clk_ops sh7712_master_clk_ops = { 33 + .init = master_clk_init, 34 + }; 35 + 36 + static void module_clk_recalc(struct clk *clk) 37 + { 38 + int frqcr = ctrl_inw(FRQCR); 39 + int idx = frqcr & 0x0007; 40 + 41 + clk->rate = clk->parent->rate / divisors[idx]; 42 + } 43 + 44 + static struct clk_ops sh7712_module_clk_ops = { 45 + .recalc = module_clk_recalc, 46 + }; 47 + 48 + static void cpu_clk_recalc(struct clk *clk) 49 + { 50 + int frqcr = ctrl_inw(FRQCR); 51 + int idx = (frqcr & 0x0030) >> 4; 52 + 53 + clk->rate = clk->parent->rate / divisors[idx]; 54 + } 55 + 56 + static struct clk_ops sh7712_cpu_clk_ops = { 57 + .recalc = cpu_clk_recalc, 58 + }; 59 + 60 + static struct clk_ops *sh7712_clk_ops[] = { 61 + &sh7712_master_clk_ops, 62 + &sh7712_module_clk_ops, 63 + &sh7712_cpu_clk_ops, 64 + }; 65 + 66 + void __init arch_init_clk_ops(struct clk_ops **ops, int idx) 67 + { 68 + if (idx < ARRAY_SIZE(sh7712_clk_ops)) 69 + *ops = sh7712_clk_ops[idx]; 70 + } 71 +
+5
include/asm-sh/cpu-sh3/freq.h
··· 10 10 #ifndef __ASM_CPU_SH3_FREQ_H 11 11 #define __ASM_CPU_SH3_FREQ_H 12 12 13 + #ifdef CONFIG_CPU_SUBTYPE_SH7712 14 + #define FRQCR 0xA415FF80 15 + #else 13 16 #define FRQCR 0xffffff80 17 + #endif 18 + 14 19 #define MIN_DIVISOR_NR 0 15 20 #define MAX_DIVISOR_NR 4 16 21