~ubuntu-branches/ubuntu/utopic/linux-ti-omap/utopic

« back to all changes in this revision

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

  • Committer: Bazaar Package Importer
  • Author(s): Amit Kucheria, Amit Kucheria
  • Date: 2010-03-10 02:28:15 UTC
  • Revision ID: james.westby@ubuntu.com-20100310022815-7sd3gwvn5kenaq33
Tags: 2.6.33-500.1
[ Amit Kucheria ]

* Initial release of a 2.6.33-based OMAP kernel
* UBUNTU: [Upstream] Fix omap 1-wire driver compilation
* UBUNTU: ubuntu: AppArmor -- update to mainline 2010-03-04

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * arch/sh/kernel/cpu/sh3/clock-sh7705.c
 
3
 *
 
4
 * SH7705 support for the clock framework
 
5
 *
 
6
 *  Copyright (C) 2005  Paul Mundt
 
7
 *
 
8
 * FRQCR parsing hacked out of arch/sh/kernel/time.c
 
9
 *
 
10
 *  Copyright (C) 1999  Tetsuya Okada & Niibe Yutaka
 
11
 *  Copyright (C) 2000  Philipp Rumpf <prumpf@tux.org>
 
12
 *  Copyright (C) 2002, 2003, 2004  Paul Mundt
 
13
 *  Copyright (C) 2002  M. R. Brown  <mrbrown@linux-sh.org>
 
14
 *
 
15
 * This file is subject to the terms and conditions of the GNU General Public
 
16
 * License.  See the file "COPYING" in the main directory of this archive
 
17
 * for more details.
 
18
 */
 
19
#include <linux/init.h>
 
20
#include <linux/kernel.h>
 
21
#include <asm/clock.h>
 
22
#include <asm/freq.h>
 
23
#include <asm/io.h>
 
24
 
 
25
/*
 
26
 * SH7705 uses the same divisors as the generic SH-3 case, it's just the
 
27
 * FRQCR layout that is a bit different..
 
28
 */
 
29
static int stc_multipliers[] = { 1, 2, 3, 4, 6, 1, 1, 1 };
 
30
static int ifc_divisors[]    = { 1, 2, 3, 4, 1, 1, 1, 1 };
 
31
static int pfc_divisors[]    = { 1, 2, 3, 4, 6, 1, 1, 1 };
 
32
 
 
33
static void master_clk_init(struct clk *clk)
 
34
{
 
35
        clk->rate *= pfc_divisors[ctrl_inw(FRQCR) & 0x0003];
 
36
}
 
37
 
 
38
static struct clk_ops sh7705_master_clk_ops = {
 
39
        .init           = master_clk_init,
 
40
};
 
41
 
 
42
static unsigned long module_clk_recalc(struct clk *clk)
 
43
{
 
44
        int idx = ctrl_inw(FRQCR) & 0x0003;
 
45
        return clk->parent->rate / pfc_divisors[idx];
 
46
}
 
47
 
 
48
static struct clk_ops sh7705_module_clk_ops = {
 
49
        .recalc         = module_clk_recalc,
 
50
};
 
51
 
 
52
static unsigned long bus_clk_recalc(struct clk *clk)
 
53
{
 
54
        int idx = (ctrl_inw(FRQCR) & 0x0300) >> 8;
 
55
        return clk->parent->rate / stc_multipliers[idx];
 
56
}
 
57
 
 
58
static struct clk_ops sh7705_bus_clk_ops = {
 
59
        .recalc         = bus_clk_recalc,
 
60
};
 
61
 
 
62
static unsigned long cpu_clk_recalc(struct clk *clk)
 
63
{
 
64
        int idx = (ctrl_inw(FRQCR) & 0x0030) >> 4;
 
65
        return clk->parent->rate / ifc_divisors[idx];
 
66
}
 
67
 
 
68
static struct clk_ops sh7705_cpu_clk_ops = {
 
69
        .recalc         = cpu_clk_recalc,
 
70
};
 
71
 
 
72
static struct clk_ops *sh7705_clk_ops[] = {
 
73
        &sh7705_master_clk_ops,
 
74
        &sh7705_module_clk_ops,
 
75
        &sh7705_bus_clk_ops,
 
76
        &sh7705_cpu_clk_ops,
 
77
};
 
78
 
 
79
void __init arch_init_clk_ops(struct clk_ops **ops, int idx)
 
80
{
 
81
        if (idx < ARRAY_SIZE(sh7705_clk_ops))
 
82
                *ops = sh7705_clk_ops[idx];
 
83
}
 
84