OMAP3 clock patches: first set (take two)
Subsystems (7)
Paul Walmsley
maintainercover OMAP3 clock patches: first set (take two)
Hello,
this is take two of the initial OMAP3430 clock tree patches, with several bug fixes. UART clock enable warnings are now fixed, and some clocks that didn't recalculate rates correctly are now fixed. A few more details are in the per-patch notes.
Boot tested on N800 and 3430SDP. Diffstat and size have been updated at the end of the message. Testing welcome, as always.
- Paul
-----------------------------------------------------------------------
These patches implement the OMAP3430 clock tree, along with the basic clock code necessary to support it. The clock definitions were drawn from 3430 ES1 and ES2 TRMs, and the patches try to adhere to the TRM as closely as is practicable.
The clock tree is mostly 3430ES1-based. A few 3430ES2 features are implemented, such as 16.8MHz SYS_CLK and PWRDN bits. Some ES2 clocks are yet to be defined, and will be added in subsequent patches. Also not included in this patch set are DPLL control patches, L3 divider code, and OPP code; these will be sent as separate patch sets.
Most of the new code is in patch 4. Patches 1 & 2 are cleanup/bugfix patches; patch 3 adds support for PWRDN bit usage in the clock framework; patches 5-7 fix the GPMC, dmtimer, and GPIO drivers for boot.
The code has been boot-tested on 3430SDP using a 3430ES1 chip.
Thanks to Tony Lindgren and Richard Woodruff for their assistance in providing support and information. These patches also include some silicon errata drawn from the TI CDP kernel clock code, written by Karthik Dasu.
Review and comments are appreciated,
- Paul
arch/arm/mach-omap2/clock.c | 66 arch/arm/mach-omap2/cm.h | 2 include/asm-arm/arch-omap/clock.h | 12 linux-omap/arch/arm/mach-omap2/Makefile | 1 linux-omap/arch/arm/mach-omap2/clock.c | 36 linux-omap/arch/arm/mach-omap2/clock.h | 22 linux-omap/arch/arm/mach-omap2/clock24xx.c | 7 linux-omap/arch/arm/mach-omap2/clock24xx.h | 75 linux-omap/arch/arm/mach-omap2/clock34xx.c | 222 ++ linux-omap/arch/arm/mach-omap2/clock34xx.h | 2214 ++++++++++++++++++++++ linux-omap/arch/arm/mach-omap2/cm.h | 2 linux-omap/arch/arm/mach-omap2/cm_regbits_34xx.h | 138 + linux-omap/arch/arm/mach-omap2/gpmc.c | 6 linux-omap/arch/arm/mach-omap2/prcm_common.h | 41 linux-omap/arch/arm/mach-omap2/prm.h | 2 linux-omap/arch/arm/mach-omap2/prm_regbits_34xx.h | 9 linux-omap/arch/arm/plat-omap/dmtimer.c | 5 linux-omap/arch/arm/plat-omap/gpio.c | 40 linux-omap/include/asm-arm/arch-omap/clock.h | 2 linux-omap/include/asm-arm/arch-omap/gpio.h | 2 linux-omap/include/asm-arm/arch-omap/omap34xx.h | 9 21 files changed, 2801 insertions(+), 112 deletions(-)
size:
text data bss dec hex filename
2763816 115776 96224 2975816 2d6848 vmlinux.orig 2768744 130432 96256 2995432 2db4e8 vmlinux
Paul Walmsley
maintainerPATCH 1/7 omap2 arch: fix CONTROL_DEVCONF addresses for OMAP3430
OMAP3430 has two CONTROL_DEVCONF addresses, CONTROL_DEVCONF0 and CONTROL_DEVCONF1; define them both. Also, the existing address for CONTROL_DEVCONF0 was incorrect; fix it.
--- include/asm-arm/arch-omap/omap34xx.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
include/asm-arm/arch-omap/omap34xx.h +8 -1
@@ -55,6 +55,12 @@#if defined(CONFIG_ARCH_OMAP3430 ) +/* +* REVISIT: OMAP3430 has two CONTROL_DEVCONF registers, CONTROL_DEVCONF0 +* and CONTROL_DEVCONF1. We should probably split those defines, along +* with any other System Control Module registers and read/write fns, +* out to a separate scm.h file, and do this for 24xx also. +*/ #define OMAP2_32KSYNCT_BASE OMAP3430_32KSYNCT_BASE#define OMAP2_CM_BASE OMAP3430_CM_BASE#define OMAP2_PRM_BASE OMAP3430_PRM_BASE
@@ -63,7 +69,8 @@#define OMAP2_L4_BASE L4_34XX_BASE#define OMAP2_VA_IC_BASE IO_ADDRESS(OMAP34XX_IC_BASE)#define OMAP2_CTRL_BASE OMAP3430_CTRL_BASE -#define OMAP34XX_CONTROL_DEVCONF (L4_34XX_BASE + 0x274) +#define OMAP34XX_CONTROL_DEVCONF0 (L4_34XX_BASE + 0x2274) +#define OMAP34XX_CONTROL_DEVCONF1 (L4_34XX_BASE + 0x22D8)#endif
Paul Walmsley
maintainerPATCH 2/7 omap2 clock: split out OMAP2/3 common defines, clksel rates
In reply to Paul WalmsleyThis patch is a collection of minor clock code changes in preparation for the OMAP3 clock merge. Specifically:
* Since general-purpose timer and GFX module L3 clksel rates are common to OMAP2/3, hoist those into asm/arch/clock.h.
* Since the CM_FCLKEN define is common to OMAP2/3, remove the OMAP24XX_ prefix.
* Designate the clock transaction code in clock.c as being OMAP2-specific.
* Fix a potential null pointer dereference that could occur when debugging is enabled in omap2_init_clksel_parent(). Clocks with no initially-defined parent (as is possible for clksel clocks) will trigger an oops due to a buggy conditional.
* Clean up omap2_wait_clock_ready().
* Remove unused struct dpll_params auto_idle* fields.
--- arch/arm/mach-omap2/clock.c | 36 ++++++++++-------- arch/arm/mach-omap2/clock.h | 22 +++++++++++ arch/arm/mach-omap2/clock24xx.c | 7 ++- arch/arm/mach-omap2/clock24xx.h | 75 +++++++++++++------------------------- arch/arm/mach-omap2/cm.h | 2 - include/asm-arm/arch-omap/clock.h | 2 - 6 files changed, 74 insertions(+), 70 deletions(-)
arch/arm/mach-omap2/clock.h +22 -0
@@ -21,6 +21,8 @@#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK_H#define __ARCH_ARM_MACH_OMAP2_CLOCK_H +#include <asm/arch/clock.h> +int omap2_clk_enable (struct clk *clk);void omap2_clk_disable (struct clk *clk);long omap2_clk_round_rate (struct clk *clk,unsigned long rate);
@@ -49,4 +51,24 @@extern u8 cpu_mask; +/* clksel_rate data common to 24xx/343x */ +static const struct clksel_rate gpt_32k_rates[] = { + { .div =1 , .val =0 , .flags =RATE_IN_24XX |RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate gpt_sys_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_24XX |RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate gfx_l3_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_24XX |RATE_IN_343X }, + { .div =2 , .val =2 , .flags =RATE_IN_24XX |RATE_IN_343X |DEFAULT_RATE }, + { .div =3 , .val =3 , .flags =RATE_IN_243X |RATE_IN_343X }, + { .div =4 , .val =4 , .flags =RATE_IN_243X |RATE_IN_343X }, + { .div =0 } +}; + +#endif
arch/arm/mach-omap2/cm.h +1 -1
@@ -54,6 +54,7 @@/* Common between 24xx and 34xx */ #define CM_FCLKEN1 0x0000 +#define CM_FCLKEN CM_FCLKEN1#define CM_CLKEN CM_FCLKEN1#define CM_ICLKEN1 0x0010#define CM_ICLKEN CM_ICLKEN1
@@ -72,7 +73,6 @@/* Architecture-specific registers */ -#define OMAP24XX_CM_FCLKEN CM_FCLKEN1#define OMAP24XX_CM_FCLKEN2 0x0004#define OMAP24XX_CM_ICLKEN4 0x001c#define OMAP24XX_CM_AUTOIDLE3 0x0038
include/asm-arm/arch-omap/clock.h +0 -2
@@ -33,8 +33,6 @@void __iomem *mult_div1_reg;u32 mult_mask; u32 div1_mask; -u32 auto_idle_mask; - u8 auto_idle_val; };#endif
arch/arm/mach-omap2/clock24xx.h +26 -49
235 lines not on this page · raw message
arch/arm/mach-omap2/clock.c +21 -15
@@ -19,6 +19,8 @@* it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#undef DEBUG +#include <linux/module.h> #include <linux/kernel.h> #include <linux/device.h>
@@ -31,6 +33,7 @@#include <asm/arch/clock.h> #include <asm/arch/sram.h> +#include <asm/arch/cpu.h> #include <asm/div64.h> #include "memory.h"
@@ -41,9 +44,7 @@#include "cm.h" #include "cm_regbits_24xx.h" -#undef DEBUG - -#define MAX_PLL_LOCK_WAIT 100000 +#define MAX_CLOCK_ENABLE_WAIT 100000u8 cpu_mask;
@@ -84,7 +85,7 @@pr_debug ("clock: inited %s parent " "to %s (was %s)\n" , clk->name, clks->parent->name, - ((clk->parent->name) ? + ((clk->parent) ? clk->parent->name :"NULL" )); clk->parent = clks->parent; };
@@ -138,10 +139,14 @@propagate_rate (clk); } -/* -* omap2_wait_clock_ready - wait for PLL to lock +/** +* omap2_wait_clock_ready - wait for clock to enable +* @reg: physical address of clock IDLEST register +* @cval: value to test against to determine if the clock is active +* @name: name of the clock (for printk) * -* Returns 1 if the PLL locked, 0 if it failed to lock. +* Returns 1 if the clock enabled in time, or 0 if it failed to enable +* in roughly MAX_CLOCK_ENABLE_WAIT microseconds. */ int omap2_wait_clock_ready (void __iomem *reg,u32 cval,const char *name) {
@@ -151,17 +156,17 @@while (!(cm_read_reg (reg) & cval)) { ++i;udelay (1 ); -if (i ==MAX_PLL_LOCK_WAIT ) { -printk (KERN_ERR "Clock %s didn't lock in %d tries\n" , - name,MAX_PLL_LOCK_WAIT ); +if (i ==MAX_CLOCK_ENABLE_WAIT ) { +printk (KERN_ERR "Clock %s didn't enable in %d tries\n" , + name,MAX_CLOCK_ENABLE_WAIT );break ; } } -if (i) +if (i <MAX_CLOCK_ENABLE_WAIT )pr_debug ("Clock %s stable after %d loops\n" , name, i); -return (i <MAX_PLL_LOCK_WAIT ) ?1 :0 ; +return (i <MAX_CLOCK_ENABLE_WAIT ) ?1 :0 ; };
@@ -180,8 +185,9 @@else return ; +/* REVISIT: What are the appropriate exclusions for 34XX? */ /* No check for DSS or cam clocks */ -if (((u32 )reg &0x0f ) ==0 ) {/* CM_{F,I}CLKEN1 */ +if (cpu_is_omap24xx () && ((u32 )reg &0x0f ) ==0 ) {/* CM_{F,I}CLKEN1 */ if (clk->enable_bit ==OMAP24XX_EN_DSS2_SHIFT || clk->enable_bit ==OMAP24XX_EN_DSS1_SHIFT || clk->enable_bit ==OMAP24XX_EN_CAM_SHIFT )
@@ -574,7 +580,7 @@ clk->rate = clk->parent->rate / new_div; -if (clk->flags &DELAYED_APP ) { +if (clk->flags &DELAYED_APP &&cpu_is_omap24xx ()) {prm_write_reg (OMAP24XX_VALID_CONFIG ,OMAP24XX_PRCM_CLKCFG_CTRL );wmb (); }
@@ -670,7 +676,7 @@__raw_writel (reg_val, src_addr);wmb (); -if (clk->flags &DELAYED_APP ) { +if (clk->flags &DELAYED_APP &&cpu_is_omap24xx ()) {prm_write_reg (OMAP24XX_VALID_CONFIG ,OMAP24XX_PRCM_CLKCFG_CTRL );wmb ();
arch/arm/mach-omap2/clock24xx.c +4 -3
@@ -15,6 +15,8 @@* it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ +#undef DEBUG +#include <linux/module.h> #include <linux/kernel.h> #include <linux/device.h>
@@ -37,8 +39,6 @@#include "cm.h" #include "cm_regbits_24xx.h" -#undef DEBUG -/* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */ #define EN_APLL_STOPPED 0#define EN_APLL_LOCKED 3
@@ -476,7 +476,8 @@omap2_osc_clk_recalc (&osc_ck); -for (clkp = onchip_clks; clkp < onchip_clks +ARRAY_SIZE (onchip_clks); +for (clkp = onchip_24xx_clks; + clkp < onchip_24xx_clks +ARRAY_SIZE (onchip_24xx_clks); clkp++) {if ((*clkp)->flags &CLOCK_IN_OMAP242X &&cpu_is_omap2420 ()) {
Paul Walmsley
maintainerPATCH 3/7 omap2 clock: add support for inverted enable bits
In reply to Paul WalmsleyOn 3430ES2 (and presumably beyond), some clock tree branches from DPLL3 & 4 can be powered down by setting 'PWRDN' bits in CM_CLKEN_PLL. It appears that an easy way to power these branches down in our existing clock framework is to use the PWRDN bits as clock enable bits for the specific DPLL branches they affect. The problem with this is that the meaning of a set PWRDN bit is 'disable,' not 'enable.' So, introduce a new clock flag, INVERT_ENABLE, that clears the bit on 'clock enable,' and sets the bit on 'clock disable.' This flag is used on all PWRDN clock branches in the 3430 clock framework.
--- arch/arm/mach-omap2/clock.c | 21 +++++++++++++++++---- include/asm-arm/arch-omap/clock.h | 3 ++- 2 files changed, 19 insertions(+), 5 deletions(-)
arch/arm/mach-omap2/clock.c +17 -4
@@ -170,6 +170,11 @@ }; +/* +* Note: We don't need special code here for INVERT_ENABLE +* for the time being since INVERT_ENABLE only applies to clocks enabled by +* CM_CLKEN_PLL +*/ static void omap2_clk_wait_ready (struct clk *clk) {void __iomem *reg, *other_reg, *st_reg;
@@ -224,7 +229,10 @@ } regval32 =cm_read_reg (clk->enable_reg); - regval32 |= (1 << clk->enable_bit); +if (clk->flags &INVERT_ENABLE ) + regval32 &= ~(1 << clk->enable_bit); +else + regval32 |= (1 << clk->enable_bit);cm_write_reg (regval32, clk->enable_reg);wmb ();
@@ -257,7 +265,10 @@ } regval32 =cm_read_reg (clk->enable_reg); - regval32 &= ~(1 << clk->enable_bit); +if (clk->flags &INVERT_ENABLE ) + regval32 |= (1 << clk->enable_bit); +else + regval32 &= ~(1 << clk->enable_bit);cm_write_reg (regval32, clk->enable_reg);wmb (); }
@@ -709,10 +720,12 @@#ifdef CONFIG_OMAP_RESET_CLOCKS void __init omap2_clk_disable_unused (struct clk *clk) { -u32 regval32; +u32 regval32, v; + + v = (clk->flags &INVERT_ENABLE ) ? (1 << clk->enable_bit) :0 ; regval32 =cm_read_reg (clk->enable_reg); -if ((regval32 & (1 << clk->enable_bit)) ==0 ) +if ((regval32 & (1 << clk->enable_bit)) == v)return ;printk (KERN_INFO "Disabling unused clock \"%s\"\n" , clk->name);
include/asm-arm/arch-omap/clock.h +2 -1
@@ -104,7 +104,8 @@#define DELAYED_APP (1 << 9)/* Delay application of clock */ #define CONFIG_PARTICIPANT (1 << 10)/* Fundamental clock */ #define ENABLE_ON_INIT (1 << 11)/* Enable upon framework init */ -/* bits 12-20 are currently free */ +#define INVERT_ENABLE (1 << 12)/* 0 enables, 1 disables */ +/* bits 13-20 are currently free */ #define CLOCK_IN_OMAP310 (1 << 21)#define CLOCK_IN_OMAP730 (1 << 22)#define CLOCK_IN_OMAP1510 (1 << 23)
Paul Walmsley
maintainerPATCH 4/7 omap2 clock: add OMAP3430 clock definitions, basic code
In reply to Paul WalmsleyDefine the clock tree, and add basic supporting clock code, for the OMAP34xx chips. The definitions and code go into two new files, clock34xx.[ch].
The 34xx clock tree and code is written to reuse as much of the existing OMAP clock infrastructure as is reasonable, and to introduce the minimum amount possible of special-case code. One notable addition is the expansion of the dpll_params structure to include the additional DPLL control registers used on OMAP34XX; most of these extra registers are used in subsequent patches.
The patches seek to follow the TRM closely. One implication of this is that several intermediary clocks are defined that are not software-controllable, and could normally be removed. Some examples include omap_96m_fck, core_l3_ick, corex2_fck. I included these clocks for several reasons. Any further changes in pre-production OMAP34xx silicon revisions may cause one of these clocks to become software-controllable; the extra clocks make it easier to double-check this patch against the TRM, if anyone wishes to do so; and ultimately, it is easier to remove these clocks than to add them back in. I anticipate that we will remove these intermediary clocks once the 3430 silicon and clock definitions mature.
There are some notable divergences between the TRM and the patch. They include:
* Clock suffixes end in "ck" rather than "clk"; this follows OMAP2 clock naming style to minimize driver changes in the rest of the tree.
* The dpll*_alwon_fck clocks have been removed (they are not software controllable, and are unlikely to change)
* Some documentation in the TRM is inconsistent; I sought to apply the most likely resolution in the code.
--- arch/arm/mach-omap2/Makefile | 1 arch/arm/mach-omap2/clock.c | 45 arch/arm/mach-omap2/clock34xx.c | 222 +++ arch/arm/mach-omap2/clock34xx.h | 2214 +++++++++++++++++++++++++++++++++ arch/arm/mach-omap2/cm.h | 2 arch/arm/mach-omap2/cm_regbits_34xx.h | 138 +- arch/arm/mach-omap2/prcm_common.h | 41 arch/arm/mach-omap2/prm.h | 2 arch/arm/mach-omap2/prm_regbits_34xx.h | 9 include/asm-arm/arch-omap/clock.h | 9 10 files changed, 2655 insertions(+), 28 deletions(-)
arch/arm/mach-omap2/clock34xx.h new file +2214 -0
@@ -0,0 +1,2214 @@ +/* +* OMAP3 clock framework +* +* Copyright (C) 2007 Texas Instruments, Inc. +* Copyright (C) 2007 Nokia Corporation +* +* Written by Paul Walmsley +*/ + +#ifndef __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H +#define __ARCH_ARM_MACH_OMAP2_CLOCK34XX_H + +#include "clock.h" +#include "cm.h" +#include "cm_regbits_34xx.h" +#include "prm.h" +#include "prm_regbits_34xx.h" + +static void omap3_dpll_recalc (struct clk *clk); +static void omap3_clkoutx2_recalc (struct clk *clk); + +/* REVISIT: this stuff should be moved to a scm.h file */ +/* CONTROL_DEVCONF0 bits */ +#define OMAP3430_MCBSP2_CLKS_MASK (1 << 6) +#define OMAP3430_MCBSP1_CLKS_MASK (1 << 2) +/* OMAP34XX_CONTROL_DEVCONF1 bits */ +#define OMAP3430_MCBSP5_CLKS_MASK (1 << 4) +#define OMAP3430_MCBSP4_CLKS_MASK (1 << 2) +#define OMAP3430_MCBSP3_CLKS_MASK (1 << 0) + +/* +* DPLL1 supplies clock to the MPU. +* DPLL2 supplies clock to the IVA2. +* DPLL3 supplies CORE domain clocks. +* DPLL4 supplies peripheral clocks. +*/ + +/* PRM CLOCKS */ + +/* According to timer32k.c, this is a 32768Hz clock, not a 32000Hz clock. */ +static struct clk omap_32k_fck = { + .name ="omap_32k_fck" , + .rate =32768 , + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +static struct clk secure_32k_fck = { + .name ="secure_32k_fck" , + .rate =32768 , + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +/* Virtual source clocks for osc_sys_ck */ +static struct clk virt_12m_ck = { + .name ="virt_12m_ck" , + .rate =12000000 , + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +static struct clk virt_13m_ck = { + .name ="virt_13m_ck" , + .rate =13000000 , + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +/* 3430ES2 only */ +static struct clk virt_16_8m_ck = { + .name ="virt_16_8m_ck" , + .rate =16800000 , + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +static struct clk virt_19_2m_ck = { + .name ="virt_19_2m_ck" , + .rate =19200000 , + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +static struct clk virt_26m_ck = { + .name ="virt_26m_ck" , + .rate =26000000 , + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +static struct clk virt_38_4m_ck = { + .name ="virt_38_4m_ck" , + .rate =38400000 , + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +static const struct clksel_rate osc_sys_12m_rates[] = { + { .div =1 , .val =0 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate osc_sys_13m_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +/* 3430ES2 only */ +static const struct clksel_rate osc_sys_16_8m_rates[] = { + { .div =1 , .val =5 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate osc_sys_19_2m_rates[] = { + { .div =1 , .val =2 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate osc_sys_26m_rates[] = { + { .div =1 , .val =3 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate osc_sys_38_4m_rates[] = { + { .div =1 , .val =4 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel osc_sys_clksel[] = { + { .parent = &virt_12m_ck, .rates = osc_sys_12m_rates }, + { .parent = &virt_13m_ck, .rates = osc_sys_13m_rates }, + { .parent = &virt_16_8m_ck, .rates = osc_sys_16_8m_rates }, + { .parent = &virt_19_2m_ck, .rates = osc_sys_19_2m_rates }, + { .parent = &virt_26m_ck, .rates = osc_sys_26m_rates }, + { .parent = &virt_38_4m_ck, .rates = osc_sys_38_4m_rates }, + { .parent =NULL }, +}; + +/* Oscillator clock */ +/* 12, 13, 16.8, 19.2, 26, or 38.4 MHz */ +static struct clk osc_sys_ck = { + .name ="osc_sys_ck" , + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP3430_PRM_CLKSEL , + .clksel_mask =OMAP3430_SYS_CLKIN_SEL_MASK , + .clksel = osc_sys_clksel, +/* REVISIT: deal with autoextclkmode? */ + .flags =CLOCK_IN_OMAP343X |RATE_FIXED |RATE_PROPAGATES | +ALWAYS_ENABLED , + .recalc = &omap2_clksel_recalc, +}; + +static const struct clksel_rate sys_osc_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =2 , .val =2 , .flags =RATE_IN_343X }, + { .div =0 } +}; + +static const struct clksel sys_clksel[] = { + { .parent = &osc_sys_ck, .rates = sys_osc_rates }, + { .parent =NULL } +}; + +/* Latency: this clock is only enabled after PRM_CLKSETUP.SETUP_TIME */ +/* Feeds DPLLs - divided first by PRM_CLKSRC_CTRL.SYSCLKDIV? */ +static struct clk sys_ck = { + .name ="sys_ck" , + .parent = &osc_sys_ck, + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP3430_PRM_CLKSRC_CTRL , + .clksel_mask =OMAP_SYSCLKDIV_MASK , + .clksel = sys_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |ALWAYS_ENABLED , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk sys_altclk = { + .name ="sys_altclk" , + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +/* Optional external clock input for some McBSPs */ +static struct clk mcbsp_clks = { + .name ="mcbsp_clks" , + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |ALWAYS_ENABLED , + .recalc = &propagate_rate, +}; + +/* PRM EXTERNAL CLOCK OUTPUT */ + +static struct clk sys_clkout1 = { + .name ="sys_clkout1" , + .parent = &osc_sys_ck, + .enable_reg =OMAP3430_PRM_CLKOUT_CTRL , + .enable_bit =OMAP3430_CLKOUT_EN_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* DPLLS */ + +/* CM CLOCKS */ + +/* DPLL1 */ +/* MPU clock source */ +/* Type: DPLL */ +static const struct dpll_data dpll1_dd = { + .mult_div1_reg =OMAP_CM_REGADDR (MPU_MOD ,OMAP3430_CM_CLKSEL1_PLL ), + .mult_mask =OMAP3430_MPU_DPLL_MULT_MASK , + .div1_mask =OMAP3430_MPU_DPLL_DIV_MASK , + .div2_reg =OMAP_CM_REGADDR (MPU_MOD ,OMAP3430_CM_CLKSEL2_PLL ), + .div2_mask =OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK , + .control_reg =OMAP_CM_REGADDR (MPU_MOD ,OMAP3430_CM_CLKEN_PLL ), + .enable_mask =OMAP3430_EN_MPU_DPLL_MASK , + .auto_recal_bit =OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT , + .recal_en_bit =OMAP3430_MPU_DPLL_RECAL_EN_SHIFT , + .recal_st_bit =OMAP3430_MPU_DPLL_ST_SHIFT , +}; + +static struct clk dpll1_ck = { + .name ="dpll1_ck" , + .parent = &sys_ck, + .dpll_data = &dpll1_dd, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap3_dpll_recalc, +}; + +/* DPLL2 */ +/* IVA2 clock source */ +/* Type: DPLL */ + +static const struct dpll_data dpll2_dd = { + .mult_div1_reg =OMAP_CM_REGADDR (OMAP3430_IVA2_MOD ,OMAP3430_CM_CLKSEL1_PLL ), + .mult_mask =OMAP3430_IVA2_DPLL_MULT_MASK , + .div1_mask =OMAP3430_IVA2_DPLL_DIV_MASK , + .div2_reg =OMAP_CM_REGADDR (OMAP3430_IVA2_MOD ,OMAP3430_CM_CLKSEL2_PLL ), + .div2_mask =OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK , + .control_reg =OMAP_CM_REGADDR (OMAP3430_IVA2_MOD ,OMAP3430_CM_CLKEN_PLL ), + .enable_mask =OMAP3430_EN_IVA2_DPLL_MASK , + .auto_recal_bit =OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT , + .recal_en_bit =OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT , + .recal_st_bit =OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT , +}; + +static struct clk dpll2_ck = { + .name ="dpll2_ck" , + .parent = &sys_ck, + .dpll_data = &dpll2_dd, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap3_dpll_recalc, +}; + +/* DPLL3 */ +/* Source clock for all interfaces and for some device fclks */ +/* Type: DPLL */ +static const struct dpll_data dpll3_dd = { + .mult_div1_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKSEL1 ), + .mult_mask =OMAP3430_CORE_DPLL_MULT_MASK , + .div1_mask =OMAP3430_CORE_DPLL_DIV_MASK , + .div2_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKSEL1 ), + .div2_mask =OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK , + .control_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKEN ), + .enable_mask =OMAP3430_EN_CORE_DPLL_MASK , + .auto_recal_bit =OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT , + .recal_en_bit =OMAP3430_CORE_DPLL_RECAL_EN_SHIFT , + .recal_st_bit =OMAP3430_CORE_DPLL_ST_SHIFT , +}; + +static struct clk dpll3_ck = { + .name ="dpll3_ck" , + .parent = &sys_ck, + .dpll_data = &dpll3_dd, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap3_dpll_recalc, +}; + +static const struct clksel_rate div16_dpll_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =2 , .val =2 , .flags =RATE_IN_343X }, + { .div =3 , .val =3 , .flags =RATE_IN_343X }, + { .div =4 , .val =4 , .flags =RATE_IN_343X }, + { .div =5 , .val =5 , .flags =RATE_IN_343X }, + { .div =6 , .val =6 , .flags =RATE_IN_343X }, + { .div =7 , .val =7 , .flags =RATE_IN_343X }, + { .div =8 , .val =8 , .flags =RATE_IN_343X }, + { .div =9 , .val =9 , .flags =RATE_IN_343X }, + { .div =10 , .val =10 , .flags =RATE_IN_343X }, + { .div =11 , .val =11 , .flags =RATE_IN_343X }, + { .div =12 , .val =12 , .flags =RATE_IN_343X }, + { .div =13 , .val =13 , .flags =RATE_IN_343X }, + { .div =14 , .val =14 , .flags =RATE_IN_343X }, + { .div =15 , .val =15 , .flags =RATE_IN_343X }, + { .div =16 , .val =16 , .flags =RATE_IN_343X }, + { .div =0 } +}; + +static const struct clksel_rate div2_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =2 , .val =2 , .flags =RATE_IN_343X }, + { .div =0 }, +}; + +static const struct clksel div2_dpll3m2_clksel[] = { + { .parent = &dpll3_ck, .rates = div2_rates }, + { .parent =NULL } +}; + +/* +* REVISIT: Not sure what to do about clksel & these M2 divider clocks. +* Shouldn't they be changed in SRAM? +* This should probably remain a 'read-only' clksel clock. +*/ +static struct clk dpll3_m2_ck = { + .name ="dpll3_m2_ck" , + .parent = &dpll3_ck, + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKSEL1 ), + .clksel_mask =OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK , + .clksel = div2_dpll3m2_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk core_ck = { + .name ="core_ck" , + .parent = &dpll3_m2_ck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +/* +* This virtual clock provides the CLKOUTX2 output from the DPLL if the +* DPLL isn't bypassed +*/ +static struct clk dpll3_x2_ck = { + .name ="dpll3_x2_ck" , + .parent = &core_ck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap3_clkoutx2_recalc, +}; + +static struct clk dpll3_m2x2_ck = { + .name ="dpll3_m2x2_ck" , + .parent = &dpll3_x2_ck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +/* The PWRDN bit is apparently only available on 3430ES2 and above */ +static struct clk dpll3_m3x2_ck = { + .name ="dpll3_m3x2_ck" , + .parent = &dpll3_x2_ck, + .enable_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKEN ), + .enable_bit =OMAP3430_PWRDN_EMU_CORE_SHIFT , + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |INVERT_ENABLE , + .recalc = &followparent_recalc, +}; + +static const struct clksel div16_dpll3_clksel[] = { + { .parent = &dpll3_x2_ck, .rates = div16_dpll_rates }, + { .parent =NULL } +}; + +static struct clk emul_core_alwon_ck = { + .name ="emul_core_alwon_ck" , + .parent = &dpll3_x2_ck, + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_EMU_MOD ,CM_CLKSEL1 ), + .clksel_mask =OMAP3430_DIV_DPLL3_MASK , + .clksel = div16_dpll3_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* DPLL4 */ +/* Supplies 96MHz, 54Mhz TV DAC, DSS fclk, CAM sensor clock, emul trace clk */ +/* Type: DPLL */ +static const struct dpll_data dpll4_dd = { + .mult_div1_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKSEL2 ), + .mult_mask =OMAP3430_PERIPH_DPLL_MULT_MASK , + .div1_mask =OMAP3430_PERIPH_DPLL_DIV_MASK , + .control_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKEN ), + .enable_mask =OMAP3430_EN_PERIPH_DPLL_MASK , + .auto_recal_bit =OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT , + .recal_en_bit =OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT , + .recal_st_bit =OMAP3430_PERIPH_DPLL_ST_SHIFT , +}; + +static struct clk dpll4_ck = { + .name ="dpll4_ck" , + .parent = &sys_ck, + .dpll_data = &dpll4_dd, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap3_dpll_recalc, +}; + +/* +* This virtual clock provides the CLKOUTX2 output from the DPLL if the +* DPLL isn't bypassed +*/ +static struct clk dpll4_x2_ck = { + .name ="dpll4_x2_ck" , + .parent = &dpll4_ck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap3_clkoutx2_recalc, +}; + +static const struct clksel div16_dpll4_clksel[] = { + { .parent = &dpll4_x2_ck, .rates = div16_dpll_rates }, + { .parent =NULL } +}; + +/* The PWRDN bit is apparently only available on 3430ES2 and above */ +static struct clk dpll4_m2x2_ck = { + .name ="dpll4_m2x2_ck" , + .parent = &dpll4_x2_ck, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKEN ), + .enable_bit =OMAP3430_PWRDN_96M_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (PLL_MOD ,OMAP3430_CM_CLKSEL3 ), + .clksel_mask =OMAP3430_DIV_96M_MASK , + .clksel = div16_dpll4_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |INVERT_ENABLE , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk omap_96m_alwon_fck = { + .name ="omap_96m_alwon_fck" , + .parent = &dpll4_m2x2_ck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk omap_96m_fck = { + .name ="omap_96m_fck" , + .parent = &omap_96m_alwon_fck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk cm_96m_fck = { + .name ="cm_96m_fck" , + .parent = &dpll4_m2x2_ck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +/* The PWRDN bit is apparently only available on 3430ES2 and above */ +static struct clk dpll4_m3x2_ck = { + .name ="dpll4_m3x2_ck" , + .parent = &dpll4_x2_ck, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKEN ), + .enable_bit =OMAP3430_PWRDN_TV_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_DSS_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_TV_MASK , + .clksel = div16_dpll4_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |INVERT_ENABLE , + .recalc = &omap2_clksel_recalc, +}; + +static const struct clksel_rate omap_54m_d4m3x2_rates[] = { + { .div =1 , .val =0 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate omap_54m_alt_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel omap_54m_clksel[] = { + { .parent = &dpll4_m3x2_ck, .rates = omap_54m_d4m3x2_rates }, + { .parent = &sys_altclk, .rates = omap_54m_alt_rates }, + { .parent =NULL } +}; + +static struct clk omap_54m_fck = { + .name ="omap_54m_fck" , + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKSEL1 ), + .clksel_mask =OMAP3430_SOURCE_54M , + .clksel = omap_54m_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +static const struct clksel_rate omap_48m_96md2_rates[] = { + { .div =2 , .val =0 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate omap_48m_alt_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel omap_48m_clksel[] = { + { .parent = &cm_96m_fck, .rates = omap_48m_96md2_rates }, + { .parent = &sys_altclk, .rates = omap_48m_alt_rates }, + { .parent =NULL } +}; + +static struct clk omap_48m_fck = { + .name ="omap_48m_fck" , + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKSEL1 ), + .clksel_mask =OMAP3430_SOURCE_48M , + .clksel = omap_48m_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk omap_12m_fck = { + .name ="omap_12m_fck" , + .parent = &omap_48m_fck, + .fixed_div =4 , + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_fixed_divisor_recalc, +}; + +/* The PWRDN bit is apparently only available on 3430ES2 and above */ +static struct clk dpll4_m4x2_ck = { + .name ="dpll4_m4x2_ck" , + .parent = &dpll4_x2_ck, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKEN ), + .enable_bit =OMAP3430_PWRDN_CAM_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_DSS_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_DSS1_MASK , + .clksel = div16_dpll4_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |INVERT_ENABLE , + .recalc = &omap2_clksel_recalc, +}; + +/* The PWRDN bit is apparently only available on 3430ES2 and above */ +static struct clk dpll4_m5x2_ck = { + .name ="dpll4_m5x2_ck" , + .parent = &dpll4_x2_ck, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKEN ), + .enable_bit =OMAP3430_PWRDN_CAM_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_CAM_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_CAM_MASK , + .clksel = div16_dpll4_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |INVERT_ENABLE , + .recalc = &omap2_clksel_recalc, +}; + +/* The PWRDN bit is apparently only available on 3430ES2 and above */ +static struct clk dpll4_m6x2_ck = { + .name ="dpll4_m6x2_ck" , + .parent = &dpll4_x2_ck, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (PLL_MOD ,CM_CLKEN ), + .enable_bit =OMAP3430_PWRDN_EMU_PERIPH_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_EMU_MOD ,CM_CLKSEL1 ), + .clksel_mask =OMAP3430_DIV_DPLL4_MASK , + .clksel = div16_dpll4_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES |INVERT_ENABLE , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk emul_per_alwon_ck = { + .name ="emul_per_alwon_ck" , + .parent = &dpll4_m6x2_ck, + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + + +/* CM EXTERNAL CLOCK OUTPUTS */ + +static const struct clksel_rate clkout2_src_core_rates[] = { + { .div =1 , .val =0 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate clkout2_src_sys_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate clkout2_src_96m_rates[] = { + { .div =1 , .val =2 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate clkout2_src_54m_rates[] = { + { .div =1 , .val =3 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel clkout2_src_clksel[] = { + { .parent = &core_ck, .rates = clkout2_src_core_rates }, + { .parent = &sys_ck, .rates = clkout2_src_sys_rates }, + { .parent = &omap_96m_alwon_fck, .rates = clkout2_src_96m_rates }, + { .parent = &omap_54m_fck, .rates = clkout2_src_54m_rates }, + { .parent =NULL } +}; + +static struct clk clkout2_src_ck = { + .name ="clkout2_src_ck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP3430_CM_CLKOUT_CTRL , + .enable_bit =OMAP3430_CLKOUT2_EN_SHIFT , + .clksel_reg =OMAP3430_CM_CLKOUT_CTRL , + .clksel_mask =OMAP3430_CLKOUT2SOURCE_MASK , + .clksel = clkout2_src_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +static const struct clksel_rate sys_clkout2_rates[] = { + { .div =1 , .val =0 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =2 , .val =1 , .flags =RATE_IN_343X }, + { .div =4 , .val =2 , .flags =RATE_IN_343X }, + { .div =8 , .val =3 , .flags =RATE_IN_343X }, + { .div =16 , .val =4 , .flags =RATE_IN_343X }, + { .div =0 }, +}; + +static const struct clksel sys_clkout2_clksel[] = { + { .parent = &clkout2_src_ck, .rates = sys_clkout2_rates }, + { .parent =NULL }, +}; + +static struct clk sys_clkout2 = { + .name ="sys_clkout2" , + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP3430_CM_CLKOUT_CTRL , + .clksel_mask =OMAP3430_CLKOUT2_DIV_MASK , + .clksel = sys_clkout2_clksel, + .flags =CLOCK_IN_OMAP343X |PARENT_CONTROLS_CLOCK , + .recalc = &omap2_clksel_recalc, +}; + +/* CM OUTPUT CLOCKS */ + +static struct clk corex2_fck = { + .name ="corex2_fck" , + .parent = &dpll3_m2x2_ck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +/* DPLL power domain clock controls */ + +static const struct clksel div2_core_clksel[] = { + { .parent = &core_ck, .rates = div2_rates }, + { .parent =NULL } +}; + +/* TRM s. 4.7.7.4 lists the input for these two clocks as CORE_CK, +but presuming that is an error, or at least an overgeneralization */ +/* REVISIT: Are these in DPLL power domain or CM power domain? docs +may be inconsistent here? */ +static struct clk dpll1_fck = { + .name ="dpll1_fck" , + .parent = &core_ck, + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (MPU_MOD ,OMAP3430_CM_CLKSEL1_PLL ), + .clksel_mask =OMAP3430_MPU_CLK_SRC_MASK , + .clksel = div2_core_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk dpll2_fck = { + .name ="dpll2_fck" , + .parent = &core_ck, + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_IVA2_MOD ,OMAP3430_CM_CLKSEL1_PLL ), + .clksel_mask =OMAP3430_IVA2_CLK_SRC_MASK , + .clksel = div2_core_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +/* Common interface clocks */ + +static struct clk l3_ick = { + .name ="l3_ick" , + .parent = &core_ck, + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_L3_MASK , + .clksel = div2_core_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +static const struct clksel div2_l3_clksel[] = { + { .parent = &l3_ick, .rates = div2_rates }, + { .parent =NULL } +}; + +static struct clk l4_ick = { + .name ="l4_ick" , + .parent = &l3_ick, + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_L4_MASK , + .clksel = div2_l3_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, + +}; + +static const struct clksel div2_l4_clksel[] = { + { .parent = &l4_ick, .rates = div2_rates }, + { .parent =NULL } +}; + +static struct clk rm_ick = { + .name ="rm_ick" , + .parent = &l4_ick, + .init = &omap2_init_clksel_parent, + .clksel_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_RM_MASK , + .clksel = div2_l4_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +/* GFX power domain */ + +/* REVISIT: These clocks have disappeared in the 3430 ES2 TRM ?? */ + +static const struct clksel gfx_l3_clksel[] = { + { .parent = &l3_ick, .rates = gfx_l3_rates }, + { .parent =NULL } +}; + +static struct clk gfx_l3_fck = { + .name ="gfx_l3_fck" , + .parent = &l3_ick, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (GFX_MOD ,CM_ICLKEN ), + .enable_bit =OMAP_EN_GFX_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (GFX_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP_CLKSEL_GFX_MASK , + .clksel = gfx_l3_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gfx_l3_ick = { + .name ="gfx_l3_ick" , + .parent = &l3_ick, + .enable_reg =OMAP_CM_REGADDR (GFX_MOD ,CM_ICLKEN ), + .enable_bit =OMAP_EN_GFX_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gfx_cg1_ck = { + .name ="gfx_cg1_ck" , + .parent = &gfx_l3_fck,/* REVISIT: correct? */ + .enable_reg =OMAP_CM_REGADDR (GFX_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_2D_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gfx_cg2_ck = { + .name ="gfx_cg2_ck" , + .parent = &gfx_l3_fck,/* REVISIT: correct? */ + .enable_reg =OMAP_CM_REGADDR (GFX_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_3D_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* CORE power domain */ + +static struct clk d2d_26m_fck = { + .name ="d2d_26m_fck" , + .parent = &sys_ck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_D2D_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static const struct clksel omap343x_gpt_clksel[] = { + { .parent = &omap_32k_fck, .rates = gpt_32k_rates }, + { .parent = &sys_ck, .rates = gpt_sys_rates }, + { .parent =NULL } +}; + +static struct clk gpt10_fck = { + .name ="gpt10_fck" , + .parent = &sys_ck, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_GPT10_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT10_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gpt11_fck = { + .name ="gpt11_fck" , + .parent = &sys_ck, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_GPT11_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT11_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +/* CORE 96M FCLK-derived clocks */ + +static struct clk core_96m_fck = { + .name ="core_96m_fck" , + .parent = &omap_96m_fck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk mmc2_fck = { + .name ="mmc2_fck" , + .parent = &core_96m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MMC2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mspro_fck = { + .name ="mspro_fck" , + .parent = &core_96m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MSPRO_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mmc1_fck = { + .name ="mmc1_fck" , + .parent = &core_96m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MMC1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk i2c3_fck = { + .name ="i2c3_fck" , + .parent = &core_96m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_I2C3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk i2c2_fck = { + .name ="i2c2_fck" , + .parent = &core_96m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_I2C2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk i2c1_fck = { + .name ="i2c1_fck" , + .parent = &core_96m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_I2C1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* +* MCBSP 1 & 5 get their 96MHz clock from core_96m_fck; +* MCBSP 2, 3, 4 get their 96MHz clock from per_96m_fck. +*/ +static const struct clksel_rate common_mcbsp_96m_rates[] = { + { .div =1 , .val =0 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel_rate common_mcbsp_mcbsp_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =0 } +}; + +static const struct clksel mcbsp_15_clksel[] = { + { .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates }, + { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, + { .parent =NULL } +}; + +static struct clk mcbsp5_fck = { + .name ="mcbsp5_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCBSP5_SHIFT , + .clksel_reg = (void __iomem *)IO_ADDRESS (OMAP34XX_CONTROL_DEVCONF1 ), + .clksel_mask =OMAP3430_MCBSP5_CLKS_MASK , + .clksel = mcbsp_15_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk mcbsp1_fck = { + .name ="mcbsp1_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCBSP1_SHIFT , + .clksel_reg = (void __iomem *)IO_ADDRESS (OMAP34XX_CONTROL_DEVCONF0 ), + .clksel_mask =OMAP3430_MCBSP1_CLKS_MASK , + .clksel = mcbsp_15_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +/* CORE_48M_FCK-derived clocks */ + +static struct clk core_48m_fck = { + .name ="core_48m_fck" , + .parent = &omap_48m_fck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk mcspi4_fck = { + .name ="mcspi4_fck" , + .parent = &core_48m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCSPI4_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcspi3_fck = { + .name ="mcspi3_fck" , + .parent = &core_48m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCSPI3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcspi2_fck = { + .name ="mcspi2_fck" , + .parent = &core_48m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCSPI2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcspi1_fck = { + .name ="mcspi1_fck" , + .parent = &core_48m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCSPI1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk uart2_fck = { + .name ="uart2_fck" , + .parent = &core_48m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_UART2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk uart1_fck = { + .name ="uart1_fck" , + .parent = &core_48m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_UART1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk fshostusb_fck = { + .name ="fshostusb_fck" , + .parent = &core_48m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_FSHOSTUSB_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* CORE_12M_FCK based clocks */ + +static struct clk core_12m_fck = { + .name ="core_12m_fck" , + .parent = &omap_12m_fck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk hdq_fck = { + .name ="hdq_fck" , + .parent = &core_12m_fck, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_HDQ_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* DPLL3-derived clock */ + +static const struct clksel_rate ssi_ssr_corex2_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =2 , .val =2 , .flags =RATE_IN_343X }, + { .div =3 , .val =3 , .flags =RATE_IN_343X }, + { .div =4 , .val =4 , .flags =RATE_IN_343X }, + { .div =6 , .val =6 , .flags =RATE_IN_343X }, + { .div =8 , .val =8 , .flags =RATE_IN_343X }, + { .div =0 } +}; + +static const struct clksel ssi_ssr_clksel[] = { + { .parent = &corex2_fck, .rates = ssi_ssr_corex2_rates }, + { .parent =NULL } +}; + +static struct clk ssi_ssr_fck = { + .name ="ssi_ssr_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_SSI_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_SSI_MASK , + .clksel = ssi_ssr_clksel, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk ssi_sst_fck = { + .name ="ssi_sst_fck" , + .parent = &ssi_ssr_fck, + .fixed_div =2 , + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_fixed_divisor_recalc, +}; + + + +/* CORE_L3_ICK based clocks */ + +static struct clk core_l3_ick = { + .name ="core_l3_ick" , + .parent = &l3_ick, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk hsotgusb_ick = { + .name ="hsotgusb_fck" , + .parent = &core_l3_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_HSOTGUSB_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk sdrc_ick = { + .name ="sdrc_ick" , + .parent = &core_l3_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_SDRC_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpmc_fck = { + .name ="gpmc_fck" , + .parent = &core_l3_ick, + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* SECURITY_L3_ICK based clocks */ + +static struct clk security_l3_ick = { + .name ="security_l3_ick" , + .parent = &l3_ick, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk pka_ick = { + .name ="pka_ick" , + .parent = &security_l3_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN2 ), + .enable_bit =OMAP3430_EN_PKA_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* CORE_L4_ICK based clocks */ + +static struct clk core_l4_ick = { + .name ="core_l4_ick" , + .parent = &l4_ick, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk aes2_ick = { + .name ="aes2_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_AES2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk sha12_ick = { + .name ="sha12_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_SHA12_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk des2_ick = { + .name ="des2_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_DES2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mmc2_ick = { + .name ="mmc2_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MMC2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mmc1_ick = { + .name ="mmc1_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MMC1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mspro_ick = { + .name ="mspro_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MSPRO_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk hdq_ick = { + .name ="hdq_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_HDQ_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcspi4_ick = { + .name ="mcspi4_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MCSPI4_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcspi3_ick = { + .name ="mcspi3_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MCSPI3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcspi2_ick = { + .name ="mcspi2_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MCSPI2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcspi1_ick = { + .name ="mcspi1_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MCSPI1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk i2c3_ick = { + .name ="i2c3_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_I2C3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk i2c2_ick = { + .name ="i2c2_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_I2C2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk i2c1_ick = { + .name ="i2c1_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_I2C1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk uart2_ick = { + .name ="uart2_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_UART2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk uart1_ick = { + .name ="uart1_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_UART1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt11_ick = { + .name ="gpt11_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_GPT11_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt10_ick = { + .name ="gpt10_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_GPT10_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcbsp5_ick = { + .name ="mcbsp5_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MCBSP5_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcbsp1_ick = { + .name ="mcbsp1_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MCBSP1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk fac_ick = { + .name ="fac_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_FAC_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mailboxes_ick = { + .name ="mailboxes_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_MAILBOXES_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk omapctrl_ick = { + .name ="omapctrl_ick" , + .parent = &core_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_OMAPCTRL_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* SSI_L4_ICK based clocks */ + +static struct clk ssi_l4_ick = { + .name ="ssi_l4_ick" , + .parent = &l4_ick, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk ssi_ick = { + .name ="ssi_ick" , + .parent = &ssi_l4_ick, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_SSI_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* REVISIT: Technically the TRM claims that this is CORE_CLK based, +* but l4_ick makes more sense to me */ + +static const struct clksel_rate usb_l4_l4_rates[] = { + { .div =1 , .val =1 , .flags =RATE_IN_343X |DEFAULT_RATE }, + { .div =2 , .val =2 , .flags =RATE_IN_343X }, + { .div =0 } +}; + +static const struct clksel usb_l4_clksel[] = { + { .parent = &l4_ick, .rates = usb_l4_l4_rates }, + { .parent =NULL }, +}; + +static struct clk usb_l4_ick = { + .name ="usb_l4_ick" , + .parent = &l4_ick, + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN1 ), + .enable_bit =OMAP3430_EN_FSHOSTUSB_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_FSHOSTUSB_MASK , + .clksel = usb_l4_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +/* XXX MDM_INTC_ICK, SAD2D_ICK ?? */ + +/* SECURITY_L4_ICK2 based clocks */ + +static struct clk security_l4_ick2 = { + .name ="security_l4_ick2" , + .parent = &l4_ick, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk aes1_ick = { + .name ="aes1_ick" , + .parent = &security_l4_ick2, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN2 ), + .enable_bit =OMAP3430_EN_AES1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk rng_ick = { + .name ="rng_ick" , + .parent = &security_l4_ick2, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN2 ), + .enable_bit =OMAP3430_EN_RNG_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk sha11_ick = { + .name ="sha11_ick" , + .parent = &security_l4_ick2, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN2 ), + .enable_bit =OMAP3430_EN_SHA11_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk des1_ick = { + .name ="des1_ick" , + .parent = &security_l4_ick2, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_ICLKEN2 ), + .enable_bit =OMAP3430_EN_DES1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* DSS */ + +static struct clk dss1_alwon_fck = { + .name ="dss1_alwon_fck" , + .parent = &dpll4_m4x2_ck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_DSS_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_DSS1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk dss_tv_fck = { + .name ="dss_tv_fck" , + .parent = &omap_54m_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_DSS_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_TV_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk dss_96m_fck = { + .name ="dss_96m_fck" , + .parent = &omap_96m_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_DSS_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_TV_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk dss2_alwon_fck = { + .name ="dss2_alwon_fck" , + .parent = &sys_ck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_DSS_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_DSS2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk dss_l3_ick = { + .name ="dss_l3_ick" , + .parent = &l3_ick, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_DSS_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk dss_l4_ick = { + .name ="dss_l4_ick" , + .parent = &l4_ick, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_DSS_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* CAM */ + +static struct clk cam_mclk = { + .name ="cam_mclk" , + .parent = &dpll4_m5x2_ck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_CAM_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_CAM_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk cam_l3_ick = { + .name ="cam_l3_ick" , + .parent = &l3_ick, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_CAM_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_CAM_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk cam_l4_ick = { + .name ="cam_l4_ick" , + .parent = &l4_ick, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_CAM_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_CAM_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* WKUP */ + +static struct clk gpt1_fck = { + .name ="gpt1_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT1_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT1_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk wkup_32k_fck = { + .name ="wkup_32k_fck" , + .parent = &omap_32k_fck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk gpio1_fck = { + .name ="gpio1_fck" , + .parent = &wkup_32k_fck, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPIO1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk wdt2_fck = { + .name ="wdt2_fck" , + .parent = &wkup_32k_fck, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_WDT2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk wkup_l4_ick = { + .name ="wkup_l4_ick" , + .parent = &sys_ck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk wdt2_ick = { + .name ="wdt2_ick" , + .parent = &wkup_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_WDT2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk wdt1_ick = { + .name ="wdt1_ick" , + .parent = &wkup_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_WDT1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio1_ick = { + .name ="gpio1_ick" , + .parent = &wkup_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPIO1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk omap_32ksync_ick = { + .name ="omap_32ksync_ick" , + .parent = &wkup_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_32KSYNC_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt12_ick = { + .name ="gpt12_ick" , + .parent = &wkup_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT12_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt1_ick = { + .name ="gpt1_ick" , + .parent = &wkup_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT1_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + + + +/* PER clock domain */ + +static struct clk per_96m_fck = { + .name ="per_96m_fck" , + .parent = &omap_96m_alwon_fck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk per_48m_fck = { + .name ="per_48m_fck" , + .parent = &omap_48m_fck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk uart3_fck = { + .name ="uart3_fck" , + .parent = &per_48m_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_UART3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt2_fck = { + .name ="gpt2_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT2_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT2_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gpt3_fck = { + .name ="gpt3_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT3_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT3_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gpt4_fck = { + .name ="gpt4_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT4_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT4_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gpt5_fck = { + .name ="gpt5_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT5_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT5_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gpt6_fck = { + .name ="gpt6_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT6_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT6_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gpt7_fck = { + .name ="gpt7_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT7_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT7_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gpt8_fck = { + .name ="gpt8_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT8_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT8_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk gpt9_fck = { + .name ="gpt9_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT9_SHIFT , + .clksel_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_CLKSEL ), + .clksel_mask =OMAP3430_CLKSEL_GPT9_MASK , + .clksel = omap343x_gpt_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk per_32k_alwon_fck = { + .name ="per_32k_alwon_fck" , + .parent = &omap_32k_fck, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk gpio6_fck = { + .name ="gpio6_fck" , + .parent = &per_32k_alwon_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT6_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio5_fck = { + .name ="gpio5_fck" , + .parent = &per_32k_alwon_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT5_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio4_fck = { + .name ="gpio4_fck" , + .parent = &per_32k_alwon_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT4_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio3_fck = { + .name ="gpio3_fck" , + .parent = &per_32k_alwon_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio2_fck = { + .name ="gpio2_fck" , + .parent = &per_32k_alwon_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_GPT2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk wdt3_fck = { + .name ="wdt3_fck" , + .parent = &per_32k_alwon_fck, + .enable_reg =OMAP_CM_REGADDR (OMAP3430_PER_MOD ,CM_FCLKEN ), + .enable_bit =OMAP3430_EN_WDT3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk per_l4_ick = { + .name ="per_l4_ick" , + .parent = &l4_ick, + .flags =CLOCK_IN_OMAP343X |RATE_PROPAGATES , + .recalc = &followparent_recalc, +}; + +static struct clk gpio6_ick = { + .name ="gpio6_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPIO6_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio5_ick = { + .name ="gpio5_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPIO5_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio4_ick = { + .name ="gpio4_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPIO4_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio3_ick = { + .name ="gpio3_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPIO3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpio2_ick = { + .name ="gpio2_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPIO2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk wdt3_ick = { + .name ="wdt3_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_WDT3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk uart3_ick = { + .name ="uart3_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_UART3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt9_ick = { + .name ="gpt9_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT9_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt8_ick = { + .name ="gpt8_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT8_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt7_ick = { + .name ="gpt7_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT7_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt6_ick = { + .name ="gpt6_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT6_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt5_ick = { + .name ="gpt5_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT5_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt4_ick = { + .name ="gpt4_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT4_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt3_ick = { + .name ="gpt3_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk gpt2_ick = { + .name ="gpt2_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_GPT2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcbsp2_ick = { + .name ="mcbsp2_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_MCBSP2_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcbsp3_ick = { + .name ="mcbsp3_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_MCBSP3_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk mcbsp4_ick = { + .name ="mcbsp4_ick" , + .parent = &per_l4_ick, + .enable_reg =OMAP_CM_REGADDR (WKUP_MOD ,CM_ICLKEN ), + .enable_bit =OMAP3430_EN_MCBSP4_SHIFT , + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static const struct clksel mcbsp_234_clksel[] = { + { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates }, + { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, + { .parent =NULL } +}; + +static struct clk mcbsp2_fck = { + .name ="mcbsp2_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCBSP2_SHIFT , + .clksel_reg = (void __iomem *)IO_ADDRESS (OMAP34XX_CONTROL_DEVCONF0 ), + .clksel_mask =OMAP3430_MCBSP2_CLKS_MASK , + .clksel = mcbsp_234_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk mcbsp3_fck = { + .name ="mcbsp3_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCBSP3_SHIFT , + .clksel_reg = (void __iomem *)IO_ADDRESS (OMAP34XX_CONTROL_DEVCONF1 ), + .clksel_mask =OMAP3430_MCBSP3_CLKS_MASK , + .clksel = mcbsp_234_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +static struct clk mcbsp4_fck = { + .name ="mcbsp4_fck" , + .init = &omap2_init_clksel_parent, + .enable_reg =OMAP_CM_REGADDR (CORE_MOD ,CM_FCLKEN1 ), + .enable_bit =OMAP3430_EN_MCBSP4_SHIFT , + .clksel_reg = (void __iomem *)IO_ADDRESS (OMAP34XX_CONTROL_DEVCONF1 ), + .clksel_mask =OMAP3430_MCBSP4_CLKS_MASK , + .clksel = mcbsp_234_clksel, + .flags =CLOCK_IN_OMAP343X , + .recalc = &omap2_clksel_recalc, +}; + +/* SR clocks */ + +/* REVISIT: dependent on en_sr1 && en_sr2 - use custom enable/disable? */ +static struct clk sr_alwon_fck = { + .name ="sr_alwon_fck" , + .parent = &sys_ck, + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +static struct clk sr_l4_ick = { + .name ="sr_l4_ick" , + .parent = &l4_ick, + .flags =CLOCK_IN_OMAP343X , + .recalc = &followparent_recalc, +}; + +/* SECURE_32K_FCK clocks */ + +static struct clk gpt12_fck = { + .name ="gpt12_fck" , + .parent = &secure_32k_fck, + .flags =CLOCK_IN_OMAP343X |ALWAYS_ENABLED , + .recalc = &followparent_recalc, +}; + +static struct clk wdt1_fck = { + .name ="wdt1_fck" , + .parent = &secure_32k_fck, + .flags =CLOCK_IN_OMAP343X |ALWAYS_ENABLED , + .recalc = &followparent_recalc, +}; + + +static struct clk *onchip_34xx_clks[]__initdata = { + &omap_32k_fck, + &virt_12m_ck, + &virt_13m_ck, + &virt_16_8m_ck, + &virt_19_2m_ck, + &virt_26m_ck, + &virt_38_4m_ck, + &osc_sys_ck, + &sys_ck, + &sys_altclk, + &sys_clkout1, + &dpll1_ck, + &dpll2_ck, + &dpll3_ck, + &core_ck, + &dpll3_x2_ck, + &dpll3_m2_ck, + &dpll3_m2x2_ck, + &dpll3_m3x2_ck, + &emul_core_alwon_ck, + &dpll4_ck, + &dpll4_x2_ck, + &omap_96m_alwon_fck, + &omap_96m_fck, + &cm_96m_fck, + &omap_54m_fck, + &omap_48m_fck, + &omap_12m_fck, + &dpll4_m2x2_ck, + &dpll4_m3x2_ck, + &dpll4_m4x2_ck, + &dpll4_m5x2_ck, + &dpll4_m6x2_ck, + &emul_per_alwon_ck, + &clkout2_src_ck, + &sys_clkout2, + &corex2_fck, + &dpll1_fck, + &dpll2_fck, + &l3_ick, + &l4_ick, + &rm_ick, + &gfx_l3_fck, + &gfx_l3_ick, + &gfx_cg1_ck, + &gfx_cg2_ck, + &d2d_26m_fck, + &gpt10_fck, + &gpt11_fck, + &core_96m_fck, + &mmc2_fck, + &mspro_fck, + &mmc1_fck, + &i2c3_fck, + &i2c2_fck, + &i2c1_fck, + &mcbsp5_fck, + &mcbsp1_fck, + &core_48m_fck, + &mcspi4_fck, + &mcspi3_fck, + &mcspi2_fck, + &mcspi1_fck, + &uart2_fck, + &uart1_fck, + &fshostusb_fck, + &core_12m_fck, + &hdq_fck, + &ssi_ssr_fck, + &ssi_sst_fck, + &core_l3_ick, + &hsotgusb_ick, + &sdrc_ick, + &gpmc_fck, + &security_l3_ick, + &pka_ick, + &core_l4_ick, + &aes2_ick, + &sha12_ick, + &des2_ick, + &mmc2_ick, + &mmc1_ick, + &mspro_ick, + &hdq_ick, + &mcspi4_ick, + &mcspi3_ick, + &mcspi2_ick, + &mcspi1_ick, + &i2c3_ick, + &i2c2_ick, + &i2c1_ick, + &uart2_ick, + &uart1_ick, + &gpt11_ick, + &gpt10_ick, + &mcbsp5_ick, + &mcbsp1_ick, + &fac_ick, + &mailboxes_ick, + &omapctrl_ick, + &ssi_l4_ick, + &ssi_ick, + &usb_l4_ick, + &security_l4_ick2, + &aes1_ick, + &rng_ick, + &sha11_ick, + &des1_ick, + &dss1_alwon_fck, + &dss_tv_fck, + &dss_96m_fck, + &dss2_alwon_fck, + &dss_l3_ick, + &dss_l4_ick, + &cam_mclk, + &cam_l3_ick, + &cam_l4_ick, + &gpt1_fck, + &wkup_32k_fck, + &gpio1_fck, + &wdt2_fck, + &wkup_l4_ick, + &wdt2_ick, + &wdt1_ick, + &gpio1_ick, + &omap_32ksync_ick, + &gpt12_ick, + &gpt1_ick, + &per_96m_fck, + &per_48m_fck, + &uart3_fck, + &gpt2_fck, + &gpt3_fck, + &gpt4_fck, + &gpt5_fck, + &gpt6_fck, + &gpt7_fck, + &gpt8_fck, + &gpt9_fck, + &per_32k_alwon_fck, + &gpio6_fck, + &gpio5_fck, + &gpio4_fck, + &gpio3_fck, + &gpio2_fck, + &wdt3_fck, + &per_l4_ick, + &gpio6_ick, + &gpio5_ick, + &gpio4_ick, + &gpio3_ick, + &gpio2_ick, + &wdt3_ick, + &uart3_ick, + &gpt9_ick, + &gpt8_ick, + &gpt7_ick, + &gpt6_ick, + &gpt5_ick, + &gpt4_ick, + &gpt3_ick, + &gpt2_ick, + &mcbsp2_ick, + &mcbsp3_ick, + &mcbsp4_ick, + &mcbsp2_fck, + &mcbsp3_fck, + &mcbsp4_fck, + &sr_alwon_fck, + &sr_l4_ick, + &secure_32k_fck, + &gpt12_fck, + &wdt1_fck, +}; + +#endif
arch/arm/mach-omap2/cm.h +2 -0
@@ -30,6 +30,8 @@#define OMAP3430_CM_SYSCONFIG OMAP_CM_REGADDR(OCP_MOD, 0x0010)#define OMAP3430_CM_POLCTRL OMAP_CM_REGADDR(OCP_MOD, 0x009c) +#define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070) +/* Clock management global register get/set */
arch/arm/mach-omap2/prm.h +2 -0
@@ -87,6 +87,8 @@#define OMAP3430_PRM_VP2_VOLTAGE OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00e0)#define OMAP3430_PRM_VP2_STATUS OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00e4) +#define OMAP3430_PRM_CLKSEL OMAP_PRM_REGADDR(OMAP3430_CCR_MOD, 0x0040) +#define OMAP3430_PRM_CLKOUT_CTRL OMAP_PRM_REGADDR(OMAP3430_CCR_MOD, 0x0070)/* Power/reset management global register get/set */
arch/arm/mach-omap2/clock34xx.c new file +222 -0
222 lines not on this page · raw message
arch/arm/mach-omap2/Makefile +1 -0
@@ -13,6 +13,7 @@ # Clock framework obj-$(CONFIG_ARCH_OMAP2) += clock24xx.o +obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o # DSP obj-$(CONFIG_OMAP_MMU_FWK) += mmu_mach.o
include/asm-arm/arch-omap/clock.h +9 -0
@@ -33,6 +33,15 @@void __iomem *mult_div1_reg;u32 mult_mask;u32 div1_mask; +void __iomem *div2_reg; +u32 div2_mask; +# if defined(CONFIG_ARCH_OMAP3 ) +void __iomem *control_reg; +u32 enable_mask; +u8 auto_recal_bit; +u8 recal_en_bit; +u8 recal_st_bit; +# endif };#endif
arch/arm/mach-omap2/clock.c +33 -12
89 lines not on this page · raw message
arch/arm/mach-omap2/cm_regbits_34xx.h +122 -16
326 lines not on this page · raw message
arch/arm/mach-omap2/prcm_common.h +41 -0
109 lines not on this page · raw message
arch/arm/mach-omap2/prm_regbits_34xx.h +9 -0
@@ -228,9 +228,13 @@#define OMAP3430_VP1_OPPCHANGEDONE_ST (1 << 10)#define OMAP3430_IO_ST (1 << 9)
Lines of this file are not shown. View the raw message.
The rest of this diff is not shown. View the raw message.
Part of the diff is not shown here. View the raw message.
Paul Walmsley
maintainerPATCH 5/7 gpmc: fix GPMC code to boot on 3430
In reply to Paul WalmsleyThe GPMC clock name in OMAP3430 is gpmc_fck.
--- arch/arm/mach-omap2/gpmc.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/arm/mach-omap2/gpmc.c +5 -1
@@ -395,7 +395,11 @@ {u32 l; - gpmc_l3_clk =clk_get (NULL ,"core_l3_ck" ); +if (cpu_is_omap24xx ()) + gpmc_l3_clk =clk_get (NULL ,"core_l3_ck" ); +else if (cpu_is_omap34xx ()) + gpmc_l3_clk =clk_get (NULL ,"gpmc_fck" ); +BUG_ON (IS_ERR (gpmc_l3_clk)); l =gpmc_read_reg (GPMC_REVISION );
Paul Walmsley
maintainerPATCH 6/7 dmtimer: fix source clocks for 3430
In reply to Paul WalmsleyFix dmtimer source clock names for OMAP3430.
--- arch/arm/plat-omap/dmtimer.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/arm/plat-omap/dmtimer.c +2 -3
@@ -162,12 +162,11 @@static const char *omap3_dm_source_names[]__initdata = {"sys_ck" , -"func_32k_ck" , -"alt_ck" , +"omap_32k_fck" ,NULL }; -static struct clk **omap3_dm_source_clocks[3 ]; +static struct clk **omap3_dm_source_clocks[2 ];static const int dm_timer_count =ARRAY_SIZE (omap3_dm_timers);#else
Paul Walmsley
maintainerPATCH 7/7 gpio: fix GPIO clock code for 3430
In reply to Paul WalmsleyFix GPIO code to use the correct clock names for OMAP3430.
--- arch/arm/plat-omap/gpio.c | 40 +++++++++++++++++++++++++++++++++++---- include/asm-arm/arch-omap/gpio.h | 2 + 2 files changed, 38 insertions(+), 4 deletions(-)
arch/arm/plat-omap/gpio.c +36 -4
@@ -1277,21 +1277,30 @@/*---------------------------------------------------------------------*/ static int initialized; +#if !defined(CONFIG_ARCH_OMAP34XX )static struct clk * gpio_ick;static struct clk * gpio_fck; +#endif -#if defined(CONFIG_ARCH_OMAP2430 ) || defined(CONFIG_ARCH_OMAP34XX ) +#if defined(CONFIG_ARCH_OMAP2430 )static struct clk * gpio5_ick;static struct clk * gpio5_fck;#endif +#if defined(CONFIG_ARCH_OMAP3 ) +static struct clk *gpio_fclks[OMAP34XX_NR_GPIOS ]; +static struct clk *gpio_iclks[OMAP34XX_NR_GPIOS ]; +#endif +static int __init _omap_gpio_init (void ) {int i;struct gpio_bank *bank; +char clk_name[11 ]; initialized =1 ; +#if defined(CONFIG_ARCH_OMAP1 )if (cpu_is_omap15xx ()) { gpio_ick =clk_get (NULL ,"arm_gpio_ck" );if (IS_ERR (gpio_ick))
@@ -1299,6 +1308,8 @@ elseclk_enable (gpio_ick ); } +#endif +#if defined(CONFIG_ARCH_OMAP2 )if (cpu_class_is_omap2 ()) { gpio_ick =clk_get (NULL ,"gpios_ick" );if (IS_ERR (gpio_ick))
@@ -1314,8 +1325,8 @@/* * On 2430 & 3430 GPIO 5 uses CORE L4 ICLK */ -#if defined(CONFIG_ARCH_OMAP2430 ) || defined(CONFIG_ARCH_OMAP3430 ) -if (cpu_is_omap2430 () ||cpu_is_omap3430 ()) { +#if defined(CONFIG_ARCH_OMAP2430 ) +if (cpu_is_omap2430 ()) { gpio5_ick =clk_get (NULL ,"gpio5_ick" );if (IS_ERR (gpio5_ick))printk ("Could not get gpio5_ick\n" );
@@ -1329,6 +1340,27 @@ }#endif } +#endif + +#if defined(CONFIG_ARCH_OMAP3 ) +if (cpu_is_omap34xx ()) { +for (i =0 ; i <OMAP34XX_NR_GPIOS ; i++) { +sprintf (clk_name,"gpio%d_ick" , i +1 ); + gpio_iclks[i] =clk_get (NULL , clk_name); +if (IS_ERR (gpio_iclks[i])) +printk (KERN_ERR "Could not get %s\n" , clk_name); +else +clk_enable (gpio_iclks[i]); +sprintf (clk_name,"gpio%d_fck" , i +1 ); + gpio_fclks[i] =clk_get (NULL , clk_name); +if (IS_ERR (gpio_fclks[i])) +printk (KERN_ERR "Could not get %s\n" , clk_name); +else +clk_enable (gpio_fclks[i]); + } + } +#endif +#ifdef CONFIG_ARCH_OMAP15XX if (cpu_is_omap15xx ()) {
@@ -1380,7 +1412,7 @@if (cpu_is_omap34xx ()) {int rev; - gpio_bank_count =6 ; + gpio_bank_count =OMAP34XX_NR_GPIOS ; gpio_bank = gpio_bank_34xx; rev =omap_readl (gpio_bank[0 ].base +OMAP24XX_GPIO_REVISION ); printk(KERN_INFO "OMAP34xx GPIO hardware version %d.%d\n",
include/asm-arm/arch-omap/gpio.h +2 -0
@@ -62,6 +62,8 @@#define OMAP_MPUIO_LATCH 0x34#endif +#define OMAP34XX_NR_GPIOS 6 +#define OMAP_MPUIO (nr) (OMAP_MAX_GPIO_LINES + (nr))#define OMAP_GPIO_IS_MPUIO (nr) ((nr) >= OMAP_MAX_GPIO_LINES)
Tony Lindgren
maintainerQuoted 9 lines · Paul Walmsley
Hello,
this is take two of the initial OMAP3430 clock tree patches, with several bug fixes. UART clock enable warnings are now fixed, and some clocks that didn't recalculate rates correctly are now fixed. A few more details are in the per-patch notes.
Boot tested on N800 and 3430SDP. Diffstat and size have been updated at the end of the message. Testing welcome, as always.
Great, I've pushed this series.
Tony