~ubuntu-branches/ubuntu/precise/linux-lts-saucy/precise-proposed

« back to all changes in this revision

Viewing changes to arch/sh/kernel/cpu/sh3/clock-sh7712.c

  • Committer: Package Import Robot
  • Author(s): Tim Gardner
  • Date: 2013-10-09 13:31:18 UTC
  • Revision ID: package-import@ubuntu.com-20131009133118-l5q5o2hmtz96hefq
Tags: upstream-3.11.0
ImportĀ upstreamĀ versionĀ 3.11.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 = __raw_readw(FRQCR);
 
27
        int idx = (frqcr & 0x0300) >> 8;
 
28
 
 
29
        clk->rate *= multipliers[idx];
 
30
}
 
31
 
 
32
static struct sh_clk_ops sh7712_master_clk_ops = {
 
33
        .init           = master_clk_init,
 
34
};
 
35
 
 
36
static unsigned long module_clk_recalc(struct clk *clk)
 
37
{
 
38
        int frqcr = __raw_readw(FRQCR);
 
39
        int idx = frqcr & 0x0007;
 
40
 
 
41
        return clk->parent->rate / divisors[idx];
 
42
}
 
43
 
 
44
static struct sh_clk_ops sh7712_module_clk_ops = {
 
45
        .recalc         = module_clk_recalc,
 
46
};
 
47
 
 
48
static unsigned long cpu_clk_recalc(struct clk *clk)
 
49
{
 
50
        int frqcr = __raw_readw(FRQCR);
 
51
        int idx = (frqcr & 0x0030) >> 4;
 
52
 
 
53
        return clk->parent->rate / divisors[idx];
 
54
}
 
55
 
 
56
static struct sh_clk_ops sh7712_cpu_clk_ops = {
 
57
        .recalc         = cpu_clk_recalc,
 
58
};
 
59
 
 
60
static struct sh_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 sh_clk_ops **ops, int idx)
 
67
{
 
68
        if (idx < ARRAY_SIZE(sh7712_clk_ops))
 
69
                *ops = sh7712_clk_ops[idx];
 
70
}
 
71