aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/plat-omap
diff options
context:
space:
mode:
authorPaul Walmsley <paul@pwsan.com>2010-02-23 00:09:12 -0500
committerPaul Walmsley <paul@pwsan.com>2010-02-24 14:15:03 -0500
commit93340a22943f3169de7d359ea14cd618114da6f6 (patch)
treee9736b9fb4e9f2fdd31491b2b7a5b3dfe60ed453 /arch/arm/plat-omap
parent7356f0b26b3176610b4de439e8c7bfe10c797347 (diff)
OMAP2/3/4 clock: fix DPLL multiplier value errors; also copyrights, includes, documentation
The maximum DPLL multiplier (M) values for OMAP2xxx and OMAP3xxx are one increment higher than they should be. See for example the OMAP242x TRM Rev X Section 5.10.6 "Clock Generator Registers" and the OMAP36xx TRM Rev C Table 3-202 "CM_CLKSEL1_PLL". Programming a 0 into the DPLL's M register bitfield is valid for OMAP2/3 and indicates that the DPLL should enter MN-bypass mode. Also, increase the minimum multiplier (M) value for the DPLL rate rounding code from 1 to 2, to ensure that it does not inadvertently put the DPLL into bypass. Note that the register documentation in the OMAP2xxx and OMAP3xxx TRMs does not make clear that the actual DPLL divider value (the "N") is the content of the appropriate register bitfield for the N value, _plus one_. (In other words, an N register bitfield of 0 indicates a DPLL divider value of 1.) This is only clearly documented in the OMAP4430 TRM, in, for example, OMAP4430 TRM Rev A Table 3-1167 "CM_CLKSEL_DPLL_USB". While here, update copyrights, add kerneldoc for struct dpll_data, drop the unused struct dpll_data.max_tolerance field, remove some unnecessary #includes in DPLL-related code, and replace the #include of <linux/module.h> with <linux/list.h>, which is what was really needed. The OMAP4 clock autogenerator script has been updated accordingly. Signed-off-by: Paul Walmsley <paul@pwsan.com> Cc: BenoƮt Cousson <b-cousson@ti.com> Cc: Rajendra Nayak <rnayak@ti.com>
Diffstat (limited to 'arch/arm/plat-omap')
-rw-r--r--arch/arm/plat-omap/include/plat/clock.h64
1 files changed, 52 insertions, 12 deletions
diff --git a/arch/arm/plat-omap/include/plat/clock.h b/arch/arm/plat-omap/include/plat/clock.h
index 63a233490d6d..52f097b1e4d6 100644
--- a/arch/arm/plat-omap/include/plat/clock.h
+++ b/arch/arm/plat-omap/include/plat/clock.h
@@ -1,9 +1,9 @@
1/* 1/*
2 * arch/arm/plat-omap/include/mach/clock.h 2 * OMAP clock: data structure definitions, function prototypes, shared macros
3 * 3 *
4 * Copyright (C) 2004 - 2005 Nokia corporation 4 * Copyright (C) 2004-2005, 2008-2010 Nokia Corporation
5 * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> 5 * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
6 * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc 6 * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as 9 * it under the terms of the GNU General Public License version 2 as
@@ -41,9 +41,49 @@ struct clksel {
41 const struct clksel_rate *rates; 41 const struct clksel_rate *rates;
42}; 42};
43 43
44/* 44/**
45 * A new flag called flag has been added which indicates what is the 45 * struct dpll_data - DPLL registers and integration data
46 * type of dpll (like j_type, no_dco_sel) 46 * @mult_div1_reg: register containing the DPLL M and N bitfields
47 * @mult_mask: mask of the DPLL M bitfield in @mult_div1_reg
48 * @div1_mask: mask of the DPLL N bitfield in @mult_div1_reg
49 * @clk_bypass: struct clk pointer to the clock's bypass clock input
50 * @clk_ref: struct clk pointer to the clock's reference clock input
51 * @control_reg: register containing the DPLL mode bitfield
52 * @enable_mask: mask of the DPLL mode bitfield in @control_reg
53 * @rate_tolerance: maximum variance allowed from target rate (in Hz)
54 * @last_rounded_rate: cache of the last rate result of omap2_dpll_round_rate()
55 * @last_rounded_m: cache of the last M result of omap2_dpll_round_rate()
56 * @max_multiplier: maximum valid non-bypass multiplier value (actual)
57 * @last_rounded_n: cache of the last N result of omap2_dpll_round_rate()
58 * @min_divider: minimum valid non-bypass divider value (actual)
59 * @max_divider: maximum valid non-bypass divider value (actual)
60 * @modes: possible values of @enable_mask
61 * @autoidle_reg: register containing the DPLL autoidle mode bitfield
62 * @idlest_reg: register containing the DPLL idle status bitfield
63 * @autoidle_mask: mask of the DPLL autoidle mode bitfield in @autoidle_reg
64 * @freqsel_mask: mask of the DPLL jitter correction bitfield in @control_reg
65 * @idlest_mask: mask of the DPLL idle status bitfield in @idlest_reg
66 * @auto_recal_bit: bitshift of the driftguard enable bit in @control_reg
67 * @recal_en_bit: bitshift of the PRM_IRQENABLE_* bit for recalibration IRQs
68 * @recal_st_bit: bitshift of the PRM_IRQSTATUS_* bit for recalibration IRQs
69 * @flags: DPLL type/features (see below)
70 *
71 * Possible values for @flags:
72 * DPLL_J_TYPE: "J-type DPLL" (only some 36xx, 4xxx DPLLs)
73 * NO_DCO_SEL: don't program DCO (only for some J-type DPLLs)
74
75 * @freqsel_mask is only used on the OMAP34xx family and AM35xx.
76 *
77 * XXX Some DPLLs have multiple bypass inputs, so it's not technically
78 * correct to only have one @clk_bypass pointer.
79 *
80 * XXX @rate_tolerance should probably be deprecated - currently there
81 * don't seem to be any usecases for DPLL rounding that is not exact.
82 *
83 * XXX The runtime-variable fields (@last_rounded_rate, @last_rounded_m,
84 * @last_rounded_n) should be separated from the runtime-fixed fields
85 * and placed into a differenct structure, so that the runtime-fixed data
86 * can be placed into read-only space.
47 */ 87 */
48struct dpll_data { 88struct dpll_data {
49 void __iomem *mult_div1_reg; 89 void __iomem *mult_div1_reg;
@@ -56,13 +96,12 @@ struct dpll_data {
56 unsigned int rate_tolerance; 96 unsigned int rate_tolerance;
57 unsigned long last_rounded_rate; 97 unsigned long last_rounded_rate;
58 u16 last_rounded_m; 98 u16 last_rounded_m;
99 u16 max_multiplier;
59 u8 last_rounded_n; 100 u8 last_rounded_n;
60 u8 min_divider; 101 u8 min_divider;
61 u8 max_divider; 102 u8 max_divider;
62 u32 max_tolerance;
63 u16 max_multiplier;
64#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
65 u8 modes; 103 u8 modes;
104#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
66 void __iomem *autoidle_reg; 105 void __iomem *autoidle_reg;
67 void __iomem *idlest_reg; 106 void __iomem *idlest_reg;
68 u32 autoidle_mask; 107 u32 autoidle_mask;
@@ -152,6 +191,7 @@ extern const struct clkops clkops_null;
152#define RATE_FIXED (1 << 1) /* Fixed clock rate */ 191#define RATE_FIXED (1 << 1) /* Fixed clock rate */
153/* bits 2-4 are free */ 192/* bits 2-4 are free */
154#define ENABLE_REG_32BIT (1 << 5) /* Use 32-bit access */ 193#define ENABLE_REG_32BIT (1 << 5) /* Use 32-bit access */
194/* bit 6 is free */
155#define CLOCK_IDLE_CONTROL (1 << 7) 195#define CLOCK_IDLE_CONTROL (1 << 7)
156#define CLOCK_NO_IDLE_PARENT (1 << 8) 196#define CLOCK_NO_IDLE_PARENT (1 << 8)
157#define DELAYED_APP (1 << 9) /* Delay application of clock */ 197#define DELAYED_APP (1 << 9) /* Delay application of clock */
@@ -160,14 +200,14 @@ extern const struct clkops clkops_null;
160#define INVERT_ENABLE (1 << 12) /* 0 enables, 1 disables */ 200#define INVERT_ENABLE (1 << 12) /* 0 enables, 1 disables */
161#define CLOCK_IN_OMAP4430 (1 << 13) 201#define CLOCK_IN_OMAP4430 (1 << 13)
162#define ALWAYS_ENABLED (1 << 14) 202#define ALWAYS_ENABLED (1 << 14)
163/* bits 13-31 are currently free */ 203/* bits 15-31 are currently free */
164 204
165/* Clksel_rate flags */ 205/* Clksel_rate flags */
166#define DEFAULT_RATE (1 << 0) 206#define DEFAULT_RATE (1 << 0)
167#define RATE_IN_242X (1 << 1) 207#define RATE_IN_242X (1 << 1)
168#define RATE_IN_243X (1 << 2) 208#define RATE_IN_243X (1 << 2)
169#define RATE_IN_343X (1 << 3) /* rates common to all 343X */ 209#define RATE_IN_343X (1 << 3) /* rates common to all 343X */
170#define RATE_IN_3430ES2 (1 << 4) /* 3430ES2 rates only */ 210#define RATE_IN_3430ES2 (1 << 4) /* 3430ES2 rates only */
171#define RATE_IN_36XX (1 << 5) 211#define RATE_IN_36XX (1 << 5)
172#define RATE_IN_4430 (1 << 6) 212#define RATE_IN_4430 (1 << 6)
173 213