Path: blob/master/arch/arm/mach-omap2/clock2420_data.c
10817 views
/*1* OMAP2420 clock data2*3* Copyright (C) 2005-2009 Texas Instruments, Inc.4* Copyright (C) 2004-2011 Nokia Corporation5*6* Contacts:7* Richard Woodruff <[email protected]>8* Paul Walmsley9*10* This program is free software; you can redistribute it and/or modify11* it under the terms of the GNU General Public License version 2 as12* published by the Free Software Foundation.13*/1415#include <linux/kernel.h>16#include <linux/clk.h>17#include <linux/list.h>1819#include <plat/clkdev_omap.h>2021#include "clock.h"22#include "clock2xxx.h"23#include "opp2xxx.h"24#include "cm2xxx_3xxx.h"25#include "prm2xxx_3xxx.h"26#include "prm-regbits-24xx.h"27#include "cm-regbits-24xx.h"28#include "sdrc.h"29#include "control.h"3031#define OMAP_CM_REGADDR OMAP2420_CM_REGADDR3233/*34* 2420 clock tree.35*36* NOTE:In many cases here we are assigning a 'default' parent. In37* many cases the parent is selectable. The set parent calls will38* also switch sources.39*40* Several sources are given initial rates which may be wrong, this will41* be fixed up in the init func.42*43* Things are broadly separated below by clock domains. It is44* noteworthy that most peripherals have dependencies on multiple clock45* domains. Many get their interface clocks from the L4 domain, but get46* functional clocks from fixed sources or other core domain derived47* clocks.48*/4950/* Base external input clocks */51static struct clk func_32k_ck = {52.name = "func_32k_ck",53.ops = &clkops_null,54.rate = 32768,55.clkdm_name = "wkup_clkdm",56};5758static struct clk secure_32k_ck = {59.name = "secure_32k_ck",60.ops = &clkops_null,61.rate = 32768,62.clkdm_name = "wkup_clkdm",63};6465/* Typical 12/13MHz in standalone mode, will be 26Mhz in chassis mode */66static struct clk osc_ck = { /* (*12, *13, 19.2, *26, 38.4)MHz */67.name = "osc_ck",68.ops = &clkops_oscck,69.clkdm_name = "wkup_clkdm",70.recalc = &omap2_osc_clk_recalc,71};7273/* Without modem likely 12MHz, with modem likely 13MHz */74static struct clk sys_ck = { /* (*12, *13, 19.2, 26, 38.4)MHz */75.name = "sys_ck", /* ~ ref_clk also */76.ops = &clkops_null,77.parent = &osc_ck,78.clkdm_name = "wkup_clkdm",79.recalc = &omap2xxx_sys_clk_recalc,80};8182static struct clk alt_ck = { /* Typical 54M or 48M, may not exist */83.name = "alt_ck",84.ops = &clkops_null,85.rate = 54000000,86.clkdm_name = "wkup_clkdm",87};8889/* Optional external clock input for McBSP CLKS */90static struct clk mcbsp_clks = {91.name = "mcbsp_clks",92.ops = &clkops_null,93};9495/*96* Analog domain root source clocks97*/9899/* dpll_ck, is broken out in to special cases through clksel */100/* REVISIT: Rate changes on dpll_ck trigger a full set change. ...101* deal with this102*/103104static struct dpll_data dpll_dd = {105.mult_div1_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),106.mult_mask = OMAP24XX_DPLL_MULT_MASK,107.div1_mask = OMAP24XX_DPLL_DIV_MASK,108.clk_bypass = &sys_ck,109.clk_ref = &sys_ck,110.control_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),111.enable_mask = OMAP24XX_EN_DPLL_MASK,112.max_multiplier = 1023,113.min_divider = 1,114.max_divider = 16,115};116117/*118* XXX Cannot add round_rate here yet, as this is still a composite clock,119* not just a DPLL120*/121static struct clk dpll_ck = {122.name = "dpll_ck",123.ops = &clkops_omap2xxx_dpll_ops,124.parent = &sys_ck, /* Can be func_32k also */125.dpll_data = &dpll_dd,126.clkdm_name = "wkup_clkdm",127.recalc = &omap2_dpllcore_recalc,128.set_rate = &omap2_reprogram_dpllcore,129};130131static struct clk apll96_ck = {132.name = "apll96_ck",133.ops = &clkops_apll96,134.parent = &sys_ck,135.rate = 96000000,136.flags = ENABLE_ON_INIT,137.clkdm_name = "wkup_clkdm",138.enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),139.enable_bit = OMAP24XX_EN_96M_PLL_SHIFT,140};141142static struct clk apll54_ck = {143.name = "apll54_ck",144.ops = &clkops_apll54,145.parent = &sys_ck,146.rate = 54000000,147.flags = ENABLE_ON_INIT,148.clkdm_name = "wkup_clkdm",149.enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),150.enable_bit = OMAP24XX_EN_54M_PLL_SHIFT,151};152153/*154* PRCM digital base sources155*/156157/* func_54m_ck */158159static const struct clksel_rate func_54m_apll54_rates[] = {160{ .div = 1, .val = 0, .flags = RATE_IN_24XX },161{ .div = 0 },162};163164static const struct clksel_rate func_54m_alt_rates[] = {165{ .div = 1, .val = 1, .flags = RATE_IN_24XX },166{ .div = 0 },167};168169static const struct clksel func_54m_clksel[] = {170{ .parent = &apll54_ck, .rates = func_54m_apll54_rates, },171{ .parent = &alt_ck, .rates = func_54m_alt_rates, },172{ .parent = NULL },173};174175static struct clk func_54m_ck = {176.name = "func_54m_ck",177.ops = &clkops_null,178.parent = &apll54_ck, /* can also be alt_clk */179.clkdm_name = "wkup_clkdm",180.init = &omap2_init_clksel_parent,181.clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),182.clksel_mask = OMAP24XX_54M_SOURCE_MASK,183.clksel = func_54m_clksel,184.recalc = &omap2_clksel_recalc,185};186187static struct clk core_ck = {188.name = "core_ck",189.ops = &clkops_null,190.parent = &dpll_ck, /* can also be 32k */191.clkdm_name = "wkup_clkdm",192.recalc = &followparent_recalc,193};194195static struct clk func_96m_ck = {196.name = "func_96m_ck",197.ops = &clkops_null,198.parent = &apll96_ck,199.clkdm_name = "wkup_clkdm",200.recalc = &followparent_recalc,201};202203/* func_48m_ck */204205static const struct clksel_rate func_48m_apll96_rates[] = {206{ .div = 2, .val = 0, .flags = RATE_IN_24XX },207{ .div = 0 },208};209210static const struct clksel_rate func_48m_alt_rates[] = {211{ .div = 1, .val = 1, .flags = RATE_IN_24XX },212{ .div = 0 },213};214215static const struct clksel func_48m_clksel[] = {216{ .parent = &apll96_ck, .rates = func_48m_apll96_rates },217{ .parent = &alt_ck, .rates = func_48m_alt_rates },218{ .parent = NULL }219};220221static struct clk func_48m_ck = {222.name = "func_48m_ck",223.ops = &clkops_null,224.parent = &apll96_ck, /* 96M or Alt */225.clkdm_name = "wkup_clkdm",226.init = &omap2_init_clksel_parent,227.clksel_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKSEL1),228.clksel_mask = OMAP24XX_48M_SOURCE_MASK,229.clksel = func_48m_clksel,230.recalc = &omap2_clksel_recalc,231.round_rate = &omap2_clksel_round_rate,232.set_rate = &omap2_clksel_set_rate233};234235static struct clk func_12m_ck = {236.name = "func_12m_ck",237.ops = &clkops_null,238.parent = &func_48m_ck,239.fixed_div = 4,240.clkdm_name = "wkup_clkdm",241.recalc = &omap_fixed_divisor_recalc,242};243244/* Secure timer, only available in secure mode */245static struct clk wdt1_osc_ck = {246.name = "ck_wdt1_osc",247.ops = &clkops_null, /* RMK: missing? */248.parent = &osc_ck,249.recalc = &followparent_recalc,250};251252/*253* The common_clkout* clksel_rate structs are common to254* sys_clkout, sys_clkout_src, sys_clkout2, and sys_clkout2_src.255* sys_clkout2_* are 2420-only, so the256* clksel_rate flags fields are inaccurate for those clocks. This is257* harmless since access to those clocks are gated by the struct clk258* flags fields, which mark them as 2420-only.259*/260static const struct clksel_rate common_clkout_src_core_rates[] = {261{ .div = 1, .val = 0, .flags = RATE_IN_24XX },262{ .div = 0 }263};264265static const struct clksel_rate common_clkout_src_sys_rates[] = {266{ .div = 1, .val = 1, .flags = RATE_IN_24XX },267{ .div = 0 }268};269270static const struct clksel_rate common_clkout_src_96m_rates[] = {271{ .div = 1, .val = 2, .flags = RATE_IN_24XX },272{ .div = 0 }273};274275static const struct clksel_rate common_clkout_src_54m_rates[] = {276{ .div = 1, .val = 3, .flags = RATE_IN_24XX },277{ .div = 0 }278};279280static const struct clksel common_clkout_src_clksel[] = {281{ .parent = &core_ck, .rates = common_clkout_src_core_rates },282{ .parent = &sys_ck, .rates = common_clkout_src_sys_rates },283{ .parent = &func_96m_ck, .rates = common_clkout_src_96m_rates },284{ .parent = &func_54m_ck, .rates = common_clkout_src_54m_rates },285{ .parent = NULL }286};287288static struct clk sys_clkout_src = {289.name = "sys_clkout_src",290.ops = &clkops_omap2_dflt,291.parent = &func_54m_ck,292.clkdm_name = "wkup_clkdm",293.enable_reg = OMAP2420_PRCM_CLKOUT_CTRL,294.enable_bit = OMAP24XX_CLKOUT_EN_SHIFT,295.init = &omap2_init_clksel_parent,296.clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,297.clksel_mask = OMAP24XX_CLKOUT_SOURCE_MASK,298.clksel = common_clkout_src_clksel,299.recalc = &omap2_clksel_recalc,300.round_rate = &omap2_clksel_round_rate,301.set_rate = &omap2_clksel_set_rate302};303304static const struct clksel_rate common_clkout_rates[] = {305{ .div = 1, .val = 0, .flags = RATE_IN_24XX },306{ .div = 2, .val = 1, .flags = RATE_IN_24XX },307{ .div = 4, .val = 2, .flags = RATE_IN_24XX },308{ .div = 8, .val = 3, .flags = RATE_IN_24XX },309{ .div = 16, .val = 4, .flags = RATE_IN_24XX },310{ .div = 0 },311};312313static const struct clksel sys_clkout_clksel[] = {314{ .parent = &sys_clkout_src, .rates = common_clkout_rates },315{ .parent = NULL }316};317318static struct clk sys_clkout = {319.name = "sys_clkout",320.ops = &clkops_null,321.parent = &sys_clkout_src,322.clkdm_name = "wkup_clkdm",323.clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,324.clksel_mask = OMAP24XX_CLKOUT_DIV_MASK,325.clksel = sys_clkout_clksel,326.recalc = &omap2_clksel_recalc,327.round_rate = &omap2_clksel_round_rate,328.set_rate = &omap2_clksel_set_rate329};330331/* In 2430, new in 2420 ES2 */332static struct clk sys_clkout2_src = {333.name = "sys_clkout2_src",334.ops = &clkops_omap2_dflt,335.parent = &func_54m_ck,336.clkdm_name = "wkup_clkdm",337.enable_reg = OMAP2420_PRCM_CLKOUT_CTRL,338.enable_bit = OMAP2420_CLKOUT2_EN_SHIFT,339.init = &omap2_init_clksel_parent,340.clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,341.clksel_mask = OMAP2420_CLKOUT2_SOURCE_MASK,342.clksel = common_clkout_src_clksel,343.recalc = &omap2_clksel_recalc,344.round_rate = &omap2_clksel_round_rate,345.set_rate = &omap2_clksel_set_rate346};347348static const struct clksel sys_clkout2_clksel[] = {349{ .parent = &sys_clkout2_src, .rates = common_clkout_rates },350{ .parent = NULL }351};352353/* In 2430, new in 2420 ES2 */354static struct clk sys_clkout2 = {355.name = "sys_clkout2",356.ops = &clkops_null,357.parent = &sys_clkout2_src,358.clkdm_name = "wkup_clkdm",359.clksel_reg = OMAP2420_PRCM_CLKOUT_CTRL,360.clksel_mask = OMAP2420_CLKOUT2_DIV_MASK,361.clksel = sys_clkout2_clksel,362.recalc = &omap2_clksel_recalc,363.round_rate = &omap2_clksel_round_rate,364.set_rate = &omap2_clksel_set_rate365};366367static struct clk emul_ck = {368.name = "emul_ck",369.ops = &clkops_omap2_dflt,370.parent = &func_54m_ck,371.clkdm_name = "wkup_clkdm",372.enable_reg = OMAP2420_PRCM_CLKEMUL_CTRL,373.enable_bit = OMAP24XX_EMULATION_EN_SHIFT,374.recalc = &followparent_recalc,375376};377378/*379* MPU clock domain380* Clocks:381* MPU_FCLK, MPU_ICLK382* INT_M_FCLK, INT_M_I_CLK383*384* - Individual clocks are hardware managed.385* - Base divider comes from: CM_CLKSEL_MPU386*387*/388static const struct clksel_rate mpu_core_rates[] = {389{ .div = 1, .val = 1, .flags = RATE_IN_24XX },390{ .div = 2, .val = 2, .flags = RATE_IN_24XX },391{ .div = 4, .val = 4, .flags = RATE_IN_242X },392{ .div = 6, .val = 6, .flags = RATE_IN_242X },393{ .div = 8, .val = 8, .flags = RATE_IN_242X },394{ .div = 0 },395};396397static const struct clksel mpu_clksel[] = {398{ .parent = &core_ck, .rates = mpu_core_rates },399{ .parent = NULL }400};401402static struct clk mpu_ck = { /* Control cpu */403.name = "mpu_ck",404.ops = &clkops_null,405.parent = &core_ck,406.clkdm_name = "mpu_clkdm",407.init = &omap2_init_clksel_parent,408.clksel_reg = OMAP_CM_REGADDR(MPU_MOD, CM_CLKSEL),409.clksel_mask = OMAP24XX_CLKSEL_MPU_MASK,410.clksel = mpu_clksel,411.recalc = &omap2_clksel_recalc,412};413414/*415* DSP (2420-UMA+IVA1) clock domain416* Clocks:417* 2420: UMA_FCLK, UMA_ICLK, IVA_MPU, IVA_COP418*419* Won't be too specific here. The core clock comes into this block420* it is divided then tee'ed. One branch goes directly to xyz enable421* controls. The other branch gets further divided by 2 then possibly422* routed into a synchronizer and out of clocks abc.423*/424static const struct clksel_rate dsp_fck_core_rates[] = {425{ .div = 1, .val = 1, .flags = RATE_IN_24XX },426{ .div = 2, .val = 2, .flags = RATE_IN_24XX },427{ .div = 3, .val = 3, .flags = RATE_IN_24XX },428{ .div = 4, .val = 4, .flags = RATE_IN_24XX },429{ .div = 6, .val = 6, .flags = RATE_IN_242X },430{ .div = 8, .val = 8, .flags = RATE_IN_242X },431{ .div = 12, .val = 12, .flags = RATE_IN_242X },432{ .div = 0 },433};434435static const struct clksel dsp_fck_clksel[] = {436{ .parent = &core_ck, .rates = dsp_fck_core_rates },437{ .parent = NULL }438};439440static struct clk dsp_fck = {441.name = "dsp_fck",442.ops = &clkops_omap2_dflt_wait,443.parent = &core_ck,444.clkdm_name = "dsp_clkdm",445.enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),446.enable_bit = OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT,447.clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),448.clksel_mask = OMAP24XX_CLKSEL_DSP_MASK,449.clksel = dsp_fck_clksel,450.recalc = &omap2_clksel_recalc,451};452453static const struct clksel dsp_ick_clksel[] = {454{ .parent = &dsp_fck, .rates = dsp_ick_rates },455{ .parent = NULL }456};457458static struct clk dsp_ick = {459.name = "dsp_ick", /* apparently ipi and isp */460.ops = &clkops_omap2_iclk_dflt_wait,461.parent = &dsp_fck,462.clkdm_name = "dsp_clkdm",463.enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_ICLKEN),464.enable_bit = OMAP2420_EN_DSP_IPI_SHIFT, /* for ipi */465.clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),466.clksel_mask = OMAP24XX_CLKSEL_DSP_IF_MASK,467.clksel = dsp_ick_clksel,468.recalc = &omap2_clksel_recalc,469};470471/*472* The IVA1 is an ARM7 core on the 2420 that has nothing to do with473* the C54x, but which is contained in the DSP powerdomain. Does not474* exist on later OMAPs.475*/476static struct clk iva1_ifck = {477.name = "iva1_ifck",478.ops = &clkops_omap2_dflt_wait,479.parent = &core_ck,480.clkdm_name = "iva1_clkdm",481.enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),482.enable_bit = OMAP2420_EN_IVA_COP_SHIFT,483.clksel_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_CLKSEL),484.clksel_mask = OMAP2420_CLKSEL_IVA_MASK,485.clksel = dsp_fck_clksel,486.recalc = &omap2_clksel_recalc,487};488489/* IVA1 mpu/int/i/f clocks are /2 of parent */490static struct clk iva1_mpu_int_ifck = {491.name = "iva1_mpu_int_ifck",492.ops = &clkops_omap2_dflt_wait,493.parent = &iva1_ifck,494.clkdm_name = "iva1_clkdm",495.enable_reg = OMAP_CM_REGADDR(OMAP24XX_DSP_MOD, CM_FCLKEN),496.enable_bit = OMAP2420_EN_IVA_MPU_SHIFT,497.fixed_div = 2,498.recalc = &omap_fixed_divisor_recalc,499};500501/*502* L3 clock domain503* L3 clocks are used for both interface and functional clocks to504* multiple entities. Some of these clocks are completely managed505* by hardware, and some others allow software control. Hardware506* managed ones general are based on directly CLK_REQ signals and507* various auto idle settings. The functional spec sets many of these508* as 'tie-high' for their enables.509*510* I-CLOCKS:511* L3-Interconnect, SMS, GPMC, SDRC, OCM_RAM, OCM_ROM, SDMA512* CAM, HS-USB.513* F-CLOCK514* SSI.515*516* GPMC memories and SDRC have timing and clock sensitive registers which517* may very well need notification when the clock changes. Currently for low518* operating points, these are taken care of in sleep.S.519*/520static const struct clksel_rate core_l3_core_rates[] = {521{ .div = 1, .val = 1, .flags = RATE_IN_24XX },522{ .div = 2, .val = 2, .flags = RATE_IN_242X },523{ .div = 4, .val = 4, .flags = RATE_IN_24XX },524{ .div = 6, .val = 6, .flags = RATE_IN_24XX },525{ .div = 8, .val = 8, .flags = RATE_IN_242X },526{ .div = 12, .val = 12, .flags = RATE_IN_242X },527{ .div = 16, .val = 16, .flags = RATE_IN_242X },528{ .div = 0 }529};530531static const struct clksel core_l3_clksel[] = {532{ .parent = &core_ck, .rates = core_l3_core_rates },533{ .parent = NULL }534};535536static struct clk core_l3_ck = { /* Used for ick and fck, interconnect */537.name = "core_l3_ck",538.ops = &clkops_null,539.parent = &core_ck,540.clkdm_name = "core_l3_clkdm",541.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),542.clksel_mask = OMAP24XX_CLKSEL_L3_MASK,543.clksel = core_l3_clksel,544.recalc = &omap2_clksel_recalc,545};546547/* usb_l4_ick */548static const struct clksel_rate usb_l4_ick_core_l3_rates[] = {549{ .div = 1, .val = 1, .flags = RATE_IN_24XX },550{ .div = 2, .val = 2, .flags = RATE_IN_24XX },551{ .div = 4, .val = 4, .flags = RATE_IN_24XX },552{ .div = 0 }553};554555static const struct clksel usb_l4_ick_clksel[] = {556{ .parent = &core_l3_ck, .rates = usb_l4_ick_core_l3_rates },557{ .parent = NULL },558};559560/* It is unclear from TRM whether usb_l4_ick is really in L3 or L4 clkdm */561static struct clk usb_l4_ick = { /* FS-USB interface clock */562.name = "usb_l4_ick",563.ops = &clkops_omap2_iclk_dflt_wait,564.parent = &core_l3_ck,565.clkdm_name = "core_l4_clkdm",566.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),567.enable_bit = OMAP24XX_EN_USB_SHIFT,568.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),569.clksel_mask = OMAP24XX_CLKSEL_USB_MASK,570.clksel = usb_l4_ick_clksel,571.recalc = &omap2_clksel_recalc,572};573574/*575* L4 clock management domain576*577* This domain contains lots of interface clocks from the L4 interface, some578* functional clocks. Fixed APLL functional source clocks are managed in579* this domain.580*/581static const struct clksel_rate l4_core_l3_rates[] = {582{ .div = 1, .val = 1, .flags = RATE_IN_24XX },583{ .div = 2, .val = 2, .flags = RATE_IN_24XX },584{ .div = 0 }585};586587static const struct clksel l4_clksel[] = {588{ .parent = &core_l3_ck, .rates = l4_core_l3_rates },589{ .parent = NULL }590};591592static struct clk l4_ck = { /* used both as an ick and fck */593.name = "l4_ck",594.ops = &clkops_null,595.parent = &core_l3_ck,596.clkdm_name = "core_l4_clkdm",597.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),598.clksel_mask = OMAP24XX_CLKSEL_L4_MASK,599.clksel = l4_clksel,600.recalc = &omap2_clksel_recalc,601};602603/*604* SSI is in L3 management domain, its direct parent is core not l3,605* many core power domain entities are grouped into the L3 clock606* domain.607* SSI_SSR_FCLK, SSI_SST_FCLK, SSI_L4_ICLK608*609* ssr = core/1/2/3/4/5, sst = 1/2 ssr.610*/611static const struct clksel_rate ssi_ssr_sst_fck_core_rates[] = {612{ .div = 1, .val = 1, .flags = RATE_IN_24XX },613{ .div = 2, .val = 2, .flags = RATE_IN_24XX },614{ .div = 3, .val = 3, .flags = RATE_IN_24XX },615{ .div = 4, .val = 4, .flags = RATE_IN_24XX },616{ .div = 6, .val = 6, .flags = RATE_IN_242X },617{ .div = 8, .val = 8, .flags = RATE_IN_242X },618{ .div = 0 }619};620621static const struct clksel ssi_ssr_sst_fck_clksel[] = {622{ .parent = &core_ck, .rates = ssi_ssr_sst_fck_core_rates },623{ .parent = NULL }624};625626static struct clk ssi_ssr_sst_fck = {627.name = "ssi_fck",628.ops = &clkops_omap2_dflt_wait,629.parent = &core_ck,630.clkdm_name = "core_l3_clkdm",631.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),632.enable_bit = OMAP24XX_EN_SSI_SHIFT,633.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),634.clksel_mask = OMAP24XX_CLKSEL_SSI_MASK,635.clksel = ssi_ssr_sst_fck_clksel,636.recalc = &omap2_clksel_recalc,637};638639/*640* Presumably this is the same as SSI_ICLK.641* TRM contradicts itself on what clockdomain SSI_ICLK is in642*/643static struct clk ssi_l4_ick = {644.name = "ssi_l4_ick",645.ops = &clkops_omap2_iclk_dflt_wait,646.parent = &l4_ck,647.clkdm_name = "core_l4_clkdm",648.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),649.enable_bit = OMAP24XX_EN_SSI_SHIFT,650.recalc = &followparent_recalc,651};652653654/*655* GFX clock domain656* Clocks:657* GFX_FCLK, GFX_ICLK658* GFX_CG1(2d), GFX_CG2(3d)659*660* GFX_FCLK runs from L3, and is divided by (1,2,3,4)661* The 2d and 3d clocks run at a hardware determined662* divided value of fclk.663*664*/665666/* This clksel struct is shared between gfx_3d_fck and gfx_2d_fck */667static const struct clksel gfx_fck_clksel[] = {668{ .parent = &core_l3_ck, .rates = gfx_l3_rates },669{ .parent = NULL },670};671672static struct clk gfx_3d_fck = {673.name = "gfx_3d_fck",674.ops = &clkops_omap2_dflt_wait,675.parent = &core_l3_ck,676.clkdm_name = "gfx_clkdm",677.enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),678.enable_bit = OMAP24XX_EN_3D_SHIFT,679.clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),680.clksel_mask = OMAP_CLKSEL_GFX_MASK,681.clksel = gfx_fck_clksel,682.recalc = &omap2_clksel_recalc,683.round_rate = &omap2_clksel_round_rate,684.set_rate = &omap2_clksel_set_rate685};686687static struct clk gfx_2d_fck = {688.name = "gfx_2d_fck",689.ops = &clkops_omap2_dflt_wait,690.parent = &core_l3_ck,691.clkdm_name = "gfx_clkdm",692.enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_FCLKEN),693.enable_bit = OMAP24XX_EN_2D_SHIFT,694.clksel_reg = OMAP_CM_REGADDR(GFX_MOD, CM_CLKSEL),695.clksel_mask = OMAP_CLKSEL_GFX_MASK,696.clksel = gfx_fck_clksel,697.recalc = &omap2_clksel_recalc,698};699700/* This interface clock does not have a CM_AUTOIDLE bit */701static struct clk gfx_ick = {702.name = "gfx_ick", /* From l3 */703.ops = &clkops_omap2_dflt_wait,704.parent = &core_l3_ck,705.clkdm_name = "gfx_clkdm",706.enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),707.enable_bit = OMAP_EN_GFX_SHIFT,708.recalc = &followparent_recalc,709};710711/*712* DSS clock domain713* CLOCKs:714* DSS_L4_ICLK, DSS_L3_ICLK,715* DSS_CLK1, DSS_CLK2, DSS_54MHz_CLK716*717* DSS is both initiator and target.718*/719/* XXX Add RATE_NOT_VALIDATED */720721static const struct clksel_rate dss1_fck_sys_rates[] = {722{ .div = 1, .val = 0, .flags = RATE_IN_24XX },723{ .div = 0 }724};725726static const struct clksel_rate dss1_fck_core_rates[] = {727{ .div = 1, .val = 1, .flags = RATE_IN_24XX },728{ .div = 2, .val = 2, .flags = RATE_IN_24XX },729{ .div = 3, .val = 3, .flags = RATE_IN_24XX },730{ .div = 4, .val = 4, .flags = RATE_IN_24XX },731{ .div = 5, .val = 5, .flags = RATE_IN_24XX },732{ .div = 6, .val = 6, .flags = RATE_IN_24XX },733{ .div = 8, .val = 8, .flags = RATE_IN_24XX },734{ .div = 9, .val = 9, .flags = RATE_IN_24XX },735{ .div = 12, .val = 12, .flags = RATE_IN_24XX },736{ .div = 16, .val = 16, .flags = RATE_IN_24XX },737{ .div = 0 }738};739740static const struct clksel dss1_fck_clksel[] = {741{ .parent = &sys_ck, .rates = dss1_fck_sys_rates },742{ .parent = &core_ck, .rates = dss1_fck_core_rates },743{ .parent = NULL },744};745746static struct clk dss_ick = { /* Enables both L3,L4 ICLK's */747.name = "dss_ick",748.ops = &clkops_omap2_iclk_dflt,749.parent = &l4_ck, /* really both l3 and l4 */750.clkdm_name = "dss_clkdm",751.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),752.enable_bit = OMAP24XX_EN_DSS1_SHIFT,753.recalc = &followparent_recalc,754};755756static struct clk dss1_fck = {757.name = "dss1_fck",758.ops = &clkops_omap2_dflt,759.parent = &core_ck, /* Core or sys */760.clkdm_name = "dss_clkdm",761.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),762.enable_bit = OMAP24XX_EN_DSS1_SHIFT,763.init = &omap2_init_clksel_parent,764.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),765.clksel_mask = OMAP24XX_CLKSEL_DSS1_MASK,766.clksel = dss1_fck_clksel,767.recalc = &omap2_clksel_recalc,768};769770static const struct clksel_rate dss2_fck_sys_rates[] = {771{ .div = 1, .val = 0, .flags = RATE_IN_24XX },772{ .div = 0 }773};774775static const struct clksel_rate dss2_fck_48m_rates[] = {776{ .div = 1, .val = 1, .flags = RATE_IN_24XX },777{ .div = 0 }778};779780static const struct clksel dss2_fck_clksel[] = {781{ .parent = &sys_ck, .rates = dss2_fck_sys_rates },782{ .parent = &func_48m_ck, .rates = dss2_fck_48m_rates },783{ .parent = NULL }784};785786static struct clk dss2_fck = { /* Alt clk used in power management */787.name = "dss2_fck",788.ops = &clkops_omap2_dflt,789.parent = &sys_ck, /* fixed at sys_ck or 48MHz */790.clkdm_name = "dss_clkdm",791.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),792.enable_bit = OMAP24XX_EN_DSS2_SHIFT,793.init = &omap2_init_clksel_parent,794.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),795.clksel_mask = OMAP24XX_CLKSEL_DSS2_MASK,796.clksel = dss2_fck_clksel,797.recalc = &omap2_clksel_recalc,798};799800static struct clk dss_54m_fck = { /* Alt clk used in power management */801.name = "dss_54m_fck", /* 54m tv clk */802.ops = &clkops_omap2_dflt_wait,803.parent = &func_54m_ck,804.clkdm_name = "dss_clkdm",805.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),806.enable_bit = OMAP24XX_EN_TV_SHIFT,807.recalc = &followparent_recalc,808};809810static struct clk wu_l4_ick = {811.name = "wu_l4_ick",812.ops = &clkops_null,813.parent = &sys_ck,814.clkdm_name = "wkup_clkdm",815.recalc = &followparent_recalc,816};817818/*819* CORE power domain ICLK & FCLK defines.820* Many of the these can have more than one possible parent. Entries821* here will likely have an L4 interface parent, and may have multiple822* functional clock parents.823*/824static const struct clksel_rate gpt_alt_rates[] = {825{ .div = 1, .val = 2, .flags = RATE_IN_24XX },826{ .div = 0 }827};828829static const struct clksel omap24xx_gpt_clksel[] = {830{ .parent = &func_32k_ck, .rates = gpt_32k_rates },831{ .parent = &sys_ck, .rates = gpt_sys_rates },832{ .parent = &alt_ck, .rates = gpt_alt_rates },833{ .parent = NULL },834};835836static struct clk gpt1_ick = {837.name = "gpt1_ick",838.ops = &clkops_omap2_iclk_dflt_wait,839.parent = &wu_l4_ick,840.clkdm_name = "wkup_clkdm",841.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),842.enable_bit = OMAP24XX_EN_GPT1_SHIFT,843.recalc = &followparent_recalc,844};845846static struct clk gpt1_fck = {847.name = "gpt1_fck",848.ops = &clkops_omap2_dflt_wait,849.parent = &func_32k_ck,850.clkdm_name = "core_l4_clkdm",851.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),852.enable_bit = OMAP24XX_EN_GPT1_SHIFT,853.init = &omap2_init_clksel_parent,854.clksel_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_CLKSEL1),855.clksel_mask = OMAP24XX_CLKSEL_GPT1_MASK,856.clksel = omap24xx_gpt_clksel,857.recalc = &omap2_clksel_recalc,858.round_rate = &omap2_clksel_round_rate,859.set_rate = &omap2_clksel_set_rate860};861862static struct clk gpt2_ick = {863.name = "gpt2_ick",864.ops = &clkops_omap2_iclk_dflt_wait,865.parent = &l4_ck,866.clkdm_name = "core_l4_clkdm",867.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),868.enable_bit = OMAP24XX_EN_GPT2_SHIFT,869.recalc = &followparent_recalc,870};871872static struct clk gpt2_fck = {873.name = "gpt2_fck",874.ops = &clkops_omap2_dflt_wait,875.parent = &func_32k_ck,876.clkdm_name = "core_l4_clkdm",877.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),878.enable_bit = OMAP24XX_EN_GPT2_SHIFT,879.init = &omap2_init_clksel_parent,880.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),881.clksel_mask = OMAP24XX_CLKSEL_GPT2_MASK,882.clksel = omap24xx_gpt_clksel,883.recalc = &omap2_clksel_recalc,884};885886static struct clk gpt3_ick = {887.name = "gpt3_ick",888.ops = &clkops_omap2_iclk_dflt_wait,889.parent = &l4_ck,890.clkdm_name = "core_l4_clkdm",891.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),892.enable_bit = OMAP24XX_EN_GPT3_SHIFT,893.recalc = &followparent_recalc,894};895896static struct clk gpt3_fck = {897.name = "gpt3_fck",898.ops = &clkops_omap2_dflt_wait,899.parent = &func_32k_ck,900.clkdm_name = "core_l4_clkdm",901.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),902.enable_bit = OMAP24XX_EN_GPT3_SHIFT,903.init = &omap2_init_clksel_parent,904.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),905.clksel_mask = OMAP24XX_CLKSEL_GPT3_MASK,906.clksel = omap24xx_gpt_clksel,907.recalc = &omap2_clksel_recalc,908};909910static struct clk gpt4_ick = {911.name = "gpt4_ick",912.ops = &clkops_omap2_iclk_dflt_wait,913.parent = &l4_ck,914.clkdm_name = "core_l4_clkdm",915.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),916.enable_bit = OMAP24XX_EN_GPT4_SHIFT,917.recalc = &followparent_recalc,918};919920static struct clk gpt4_fck = {921.name = "gpt4_fck",922.ops = &clkops_omap2_dflt_wait,923.parent = &func_32k_ck,924.clkdm_name = "core_l4_clkdm",925.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),926.enable_bit = OMAP24XX_EN_GPT4_SHIFT,927.init = &omap2_init_clksel_parent,928.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),929.clksel_mask = OMAP24XX_CLKSEL_GPT4_MASK,930.clksel = omap24xx_gpt_clksel,931.recalc = &omap2_clksel_recalc,932};933934static struct clk gpt5_ick = {935.name = "gpt5_ick",936.ops = &clkops_omap2_iclk_dflt_wait,937.parent = &l4_ck,938.clkdm_name = "core_l4_clkdm",939.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),940.enable_bit = OMAP24XX_EN_GPT5_SHIFT,941.recalc = &followparent_recalc,942};943944static struct clk gpt5_fck = {945.name = "gpt5_fck",946.ops = &clkops_omap2_dflt_wait,947.parent = &func_32k_ck,948.clkdm_name = "core_l4_clkdm",949.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),950.enable_bit = OMAP24XX_EN_GPT5_SHIFT,951.init = &omap2_init_clksel_parent,952.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),953.clksel_mask = OMAP24XX_CLKSEL_GPT5_MASK,954.clksel = omap24xx_gpt_clksel,955.recalc = &omap2_clksel_recalc,956};957958static struct clk gpt6_ick = {959.name = "gpt6_ick",960.ops = &clkops_omap2_iclk_dflt_wait,961.parent = &l4_ck,962.clkdm_name = "core_l4_clkdm",963.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),964.enable_bit = OMAP24XX_EN_GPT6_SHIFT,965.recalc = &followparent_recalc,966};967968static struct clk gpt6_fck = {969.name = "gpt6_fck",970.ops = &clkops_omap2_dflt_wait,971.parent = &func_32k_ck,972.clkdm_name = "core_l4_clkdm",973.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),974.enable_bit = OMAP24XX_EN_GPT6_SHIFT,975.init = &omap2_init_clksel_parent,976.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),977.clksel_mask = OMAP24XX_CLKSEL_GPT6_MASK,978.clksel = omap24xx_gpt_clksel,979.recalc = &omap2_clksel_recalc,980};981982static struct clk gpt7_ick = {983.name = "gpt7_ick",984.ops = &clkops_omap2_iclk_dflt_wait,985.parent = &l4_ck,986.clkdm_name = "core_l4_clkdm",987.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),988.enable_bit = OMAP24XX_EN_GPT7_SHIFT,989.recalc = &followparent_recalc,990};991992static struct clk gpt7_fck = {993.name = "gpt7_fck",994.ops = &clkops_omap2_dflt_wait,995.parent = &func_32k_ck,996.clkdm_name = "core_l4_clkdm",997.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),998.enable_bit = OMAP24XX_EN_GPT7_SHIFT,999.init = &omap2_init_clksel_parent,1000.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),1001.clksel_mask = OMAP24XX_CLKSEL_GPT7_MASK,1002.clksel = omap24xx_gpt_clksel,1003.recalc = &omap2_clksel_recalc,1004};10051006static struct clk gpt8_ick = {1007.name = "gpt8_ick",1008.ops = &clkops_omap2_iclk_dflt_wait,1009.parent = &l4_ck,1010.clkdm_name = "core_l4_clkdm",1011.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1012.enable_bit = OMAP24XX_EN_GPT8_SHIFT,1013.recalc = &followparent_recalc,1014};10151016static struct clk gpt8_fck = {1017.name = "gpt8_fck",1018.ops = &clkops_omap2_dflt_wait,1019.parent = &func_32k_ck,1020.clkdm_name = "core_l4_clkdm",1021.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1022.enable_bit = OMAP24XX_EN_GPT8_SHIFT,1023.init = &omap2_init_clksel_parent,1024.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),1025.clksel_mask = OMAP24XX_CLKSEL_GPT8_MASK,1026.clksel = omap24xx_gpt_clksel,1027.recalc = &omap2_clksel_recalc,1028};10291030static struct clk gpt9_ick = {1031.name = "gpt9_ick",1032.ops = &clkops_omap2_iclk_dflt_wait,1033.parent = &l4_ck,1034.clkdm_name = "core_l4_clkdm",1035.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1036.enable_bit = OMAP24XX_EN_GPT9_SHIFT,1037.recalc = &followparent_recalc,1038};10391040static struct clk gpt9_fck = {1041.name = "gpt9_fck",1042.ops = &clkops_omap2_dflt_wait,1043.parent = &func_32k_ck,1044.clkdm_name = "core_l4_clkdm",1045.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1046.enable_bit = OMAP24XX_EN_GPT9_SHIFT,1047.init = &omap2_init_clksel_parent,1048.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),1049.clksel_mask = OMAP24XX_CLKSEL_GPT9_MASK,1050.clksel = omap24xx_gpt_clksel,1051.recalc = &omap2_clksel_recalc,1052};10531054static struct clk gpt10_ick = {1055.name = "gpt10_ick",1056.ops = &clkops_omap2_iclk_dflt_wait,1057.parent = &l4_ck,1058.clkdm_name = "core_l4_clkdm",1059.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1060.enable_bit = OMAP24XX_EN_GPT10_SHIFT,1061.recalc = &followparent_recalc,1062};10631064static struct clk gpt10_fck = {1065.name = "gpt10_fck",1066.ops = &clkops_omap2_dflt_wait,1067.parent = &func_32k_ck,1068.clkdm_name = "core_l4_clkdm",1069.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1070.enable_bit = OMAP24XX_EN_GPT10_SHIFT,1071.init = &omap2_init_clksel_parent,1072.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),1073.clksel_mask = OMAP24XX_CLKSEL_GPT10_MASK,1074.clksel = omap24xx_gpt_clksel,1075.recalc = &omap2_clksel_recalc,1076};10771078static struct clk gpt11_ick = {1079.name = "gpt11_ick",1080.ops = &clkops_omap2_iclk_dflt_wait,1081.parent = &l4_ck,1082.clkdm_name = "core_l4_clkdm",1083.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1084.enable_bit = OMAP24XX_EN_GPT11_SHIFT,1085.recalc = &followparent_recalc,1086};10871088static struct clk gpt11_fck = {1089.name = "gpt11_fck",1090.ops = &clkops_omap2_dflt_wait,1091.parent = &func_32k_ck,1092.clkdm_name = "core_l4_clkdm",1093.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1094.enable_bit = OMAP24XX_EN_GPT11_SHIFT,1095.init = &omap2_init_clksel_parent,1096.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),1097.clksel_mask = OMAP24XX_CLKSEL_GPT11_MASK,1098.clksel = omap24xx_gpt_clksel,1099.recalc = &omap2_clksel_recalc,1100};11011102static struct clk gpt12_ick = {1103.name = "gpt12_ick",1104.ops = &clkops_omap2_iclk_dflt_wait,1105.parent = &l4_ck,1106.clkdm_name = "core_l4_clkdm",1107.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1108.enable_bit = OMAP24XX_EN_GPT12_SHIFT,1109.recalc = &followparent_recalc,1110};11111112static struct clk gpt12_fck = {1113.name = "gpt12_fck",1114.ops = &clkops_omap2_dflt_wait,1115.parent = &secure_32k_ck,1116.clkdm_name = "core_l4_clkdm",1117.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1118.enable_bit = OMAP24XX_EN_GPT12_SHIFT,1119.init = &omap2_init_clksel_parent,1120.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL2),1121.clksel_mask = OMAP24XX_CLKSEL_GPT12_MASK,1122.clksel = omap24xx_gpt_clksel,1123.recalc = &omap2_clksel_recalc,1124};11251126static struct clk mcbsp1_ick = {1127.name = "mcbsp1_ick",1128.ops = &clkops_omap2_iclk_dflt_wait,1129.parent = &l4_ck,1130.clkdm_name = "core_l4_clkdm",1131.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1132.enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,1133.recalc = &followparent_recalc,1134};11351136static const struct clksel_rate common_mcbsp_96m_rates[] = {1137{ .div = 1, .val = 0, .flags = RATE_IN_24XX },1138{ .div = 0 }1139};11401141static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {1142{ .div = 1, .val = 1, .flags = RATE_IN_24XX },1143{ .div = 0 }1144};11451146static const struct clksel mcbsp_fck_clksel[] = {1147{ .parent = &func_96m_ck, .rates = common_mcbsp_96m_rates },1148{ .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },1149{ .parent = NULL }1150};11511152static struct clk mcbsp1_fck = {1153.name = "mcbsp1_fck",1154.ops = &clkops_omap2_dflt_wait,1155.parent = &func_96m_ck,1156.init = &omap2_init_clksel_parent,1157.clkdm_name = "core_l4_clkdm",1158.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1159.enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,1160.clksel_reg = OMAP242X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),1161.clksel_mask = OMAP2_MCBSP1_CLKS_MASK,1162.clksel = mcbsp_fck_clksel,1163.recalc = &omap2_clksel_recalc,1164};11651166static struct clk mcbsp2_ick = {1167.name = "mcbsp2_ick",1168.ops = &clkops_omap2_iclk_dflt_wait,1169.parent = &l4_ck,1170.clkdm_name = "core_l4_clkdm",1171.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1172.enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,1173.recalc = &followparent_recalc,1174};11751176static struct clk mcbsp2_fck = {1177.name = "mcbsp2_fck",1178.ops = &clkops_omap2_dflt_wait,1179.parent = &func_96m_ck,1180.init = &omap2_init_clksel_parent,1181.clkdm_name = "core_l4_clkdm",1182.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1183.enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,1184.clksel_reg = OMAP242X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),1185.clksel_mask = OMAP2_MCBSP2_CLKS_MASK,1186.clksel = mcbsp_fck_clksel,1187.recalc = &omap2_clksel_recalc,1188};11891190static struct clk mcspi1_ick = {1191.name = "mcspi1_ick",1192.ops = &clkops_omap2_iclk_dflt_wait,1193.parent = &l4_ck,1194.clkdm_name = "core_l4_clkdm",1195.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1196.enable_bit = OMAP24XX_EN_MCSPI1_SHIFT,1197.recalc = &followparent_recalc,1198};11991200static struct clk mcspi1_fck = {1201.name = "mcspi1_fck",1202.ops = &clkops_omap2_dflt_wait,1203.parent = &func_48m_ck,1204.clkdm_name = "core_l4_clkdm",1205.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1206.enable_bit = OMAP24XX_EN_MCSPI1_SHIFT,1207.recalc = &followparent_recalc,1208};12091210static struct clk mcspi2_ick = {1211.name = "mcspi2_ick",1212.ops = &clkops_omap2_iclk_dflt_wait,1213.parent = &l4_ck,1214.clkdm_name = "core_l4_clkdm",1215.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1216.enable_bit = OMAP24XX_EN_MCSPI2_SHIFT,1217.recalc = &followparent_recalc,1218};12191220static struct clk mcspi2_fck = {1221.name = "mcspi2_fck",1222.ops = &clkops_omap2_dflt_wait,1223.parent = &func_48m_ck,1224.clkdm_name = "core_l4_clkdm",1225.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1226.enable_bit = OMAP24XX_EN_MCSPI2_SHIFT,1227.recalc = &followparent_recalc,1228};12291230static struct clk uart1_ick = {1231.name = "uart1_ick",1232.ops = &clkops_omap2_iclk_dflt_wait,1233.parent = &l4_ck,1234.clkdm_name = "core_l4_clkdm",1235.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1236.enable_bit = OMAP24XX_EN_UART1_SHIFT,1237.recalc = &followparent_recalc,1238};12391240static struct clk uart1_fck = {1241.name = "uart1_fck",1242.ops = &clkops_omap2_dflt_wait,1243.parent = &func_48m_ck,1244.clkdm_name = "core_l4_clkdm",1245.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1246.enable_bit = OMAP24XX_EN_UART1_SHIFT,1247.recalc = &followparent_recalc,1248};12491250static struct clk uart2_ick = {1251.name = "uart2_ick",1252.ops = &clkops_omap2_iclk_dflt_wait,1253.parent = &l4_ck,1254.clkdm_name = "core_l4_clkdm",1255.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1256.enable_bit = OMAP24XX_EN_UART2_SHIFT,1257.recalc = &followparent_recalc,1258};12591260static struct clk uart2_fck = {1261.name = "uart2_fck",1262.ops = &clkops_omap2_dflt_wait,1263.parent = &func_48m_ck,1264.clkdm_name = "core_l4_clkdm",1265.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1266.enable_bit = OMAP24XX_EN_UART2_SHIFT,1267.recalc = &followparent_recalc,1268};12691270static struct clk uart3_ick = {1271.name = "uart3_ick",1272.ops = &clkops_omap2_iclk_dflt_wait,1273.parent = &l4_ck,1274.clkdm_name = "core_l4_clkdm",1275.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN2),1276.enable_bit = OMAP24XX_EN_UART3_SHIFT,1277.recalc = &followparent_recalc,1278};12791280static struct clk uart3_fck = {1281.name = "uart3_fck",1282.ops = &clkops_omap2_dflt_wait,1283.parent = &func_48m_ck,1284.clkdm_name = "core_l4_clkdm",1285.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),1286.enable_bit = OMAP24XX_EN_UART3_SHIFT,1287.recalc = &followparent_recalc,1288};12891290static struct clk gpios_ick = {1291.name = "gpios_ick",1292.ops = &clkops_omap2_iclk_dflt_wait,1293.parent = &wu_l4_ick,1294.clkdm_name = "wkup_clkdm",1295.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),1296.enable_bit = OMAP24XX_EN_GPIOS_SHIFT,1297.recalc = &followparent_recalc,1298};12991300static struct clk gpios_fck = {1301.name = "gpios_fck",1302.ops = &clkops_omap2_dflt_wait,1303.parent = &func_32k_ck,1304.clkdm_name = "wkup_clkdm",1305.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),1306.enable_bit = OMAP24XX_EN_GPIOS_SHIFT,1307.recalc = &followparent_recalc,1308};13091310static struct clk mpu_wdt_ick = {1311.name = "mpu_wdt_ick",1312.ops = &clkops_omap2_iclk_dflt_wait,1313.parent = &wu_l4_ick,1314.clkdm_name = "wkup_clkdm",1315.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),1316.enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT,1317.recalc = &followparent_recalc,1318};13191320static struct clk mpu_wdt_fck = {1321.name = "mpu_wdt_fck",1322.ops = &clkops_omap2_dflt_wait,1323.parent = &func_32k_ck,1324.clkdm_name = "wkup_clkdm",1325.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_FCLKEN),1326.enable_bit = OMAP24XX_EN_MPU_WDT_SHIFT,1327.recalc = &followparent_recalc,1328};13291330static struct clk sync_32k_ick = {1331.name = "sync_32k_ick",1332.ops = &clkops_omap2_iclk_dflt_wait,1333.parent = &wu_l4_ick,1334.clkdm_name = "wkup_clkdm",1335.flags = ENABLE_ON_INIT,1336.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),1337.enable_bit = OMAP24XX_EN_32KSYNC_SHIFT,1338.recalc = &followparent_recalc,1339};13401341static struct clk wdt1_ick = {1342.name = "wdt1_ick",1343.ops = &clkops_omap2_iclk_dflt_wait,1344.parent = &wu_l4_ick,1345.clkdm_name = "wkup_clkdm",1346.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),1347.enable_bit = OMAP24XX_EN_WDT1_SHIFT,1348.recalc = &followparent_recalc,1349};13501351static struct clk omapctrl_ick = {1352.name = "omapctrl_ick",1353.ops = &clkops_omap2_iclk_dflt_wait,1354.parent = &wu_l4_ick,1355.clkdm_name = "wkup_clkdm",1356.flags = ENABLE_ON_INIT,1357.enable_reg = OMAP_CM_REGADDR(WKUP_MOD, CM_ICLKEN),1358.enable_bit = OMAP24XX_EN_OMAPCTRL_SHIFT,1359.recalc = &followparent_recalc,1360};13611362static struct clk cam_ick = {1363.name = "cam_ick",1364.ops = &clkops_omap2_iclk_dflt,1365.parent = &l4_ck,1366.clkdm_name = "core_l4_clkdm",1367.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1368.enable_bit = OMAP24XX_EN_CAM_SHIFT,1369.recalc = &followparent_recalc,1370};13711372/*1373* cam_fck controls both CAM_MCLK and CAM_FCLK. It should probably be1374* split into two separate clocks, since the parent clocks are different1375* and the clockdomains are also different.1376*/1377static struct clk cam_fck = {1378.name = "cam_fck",1379.ops = &clkops_omap2_dflt,1380.parent = &func_96m_ck,1381.clkdm_name = "core_l3_clkdm",1382.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1383.enable_bit = OMAP24XX_EN_CAM_SHIFT,1384.recalc = &followparent_recalc,1385};13861387static struct clk mailboxes_ick = {1388.name = "mailboxes_ick",1389.ops = &clkops_omap2_iclk_dflt_wait,1390.parent = &l4_ck,1391.clkdm_name = "core_l4_clkdm",1392.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1393.enable_bit = OMAP24XX_EN_MAILBOXES_SHIFT,1394.recalc = &followparent_recalc,1395};13961397static struct clk wdt4_ick = {1398.name = "wdt4_ick",1399.ops = &clkops_omap2_iclk_dflt_wait,1400.parent = &l4_ck,1401.clkdm_name = "core_l4_clkdm",1402.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1403.enable_bit = OMAP24XX_EN_WDT4_SHIFT,1404.recalc = &followparent_recalc,1405};14061407static struct clk wdt4_fck = {1408.name = "wdt4_fck",1409.ops = &clkops_omap2_dflt_wait,1410.parent = &func_32k_ck,1411.clkdm_name = "core_l4_clkdm",1412.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1413.enable_bit = OMAP24XX_EN_WDT4_SHIFT,1414.recalc = &followparent_recalc,1415};14161417static struct clk wdt3_ick = {1418.name = "wdt3_ick",1419.ops = &clkops_omap2_iclk_dflt_wait,1420.parent = &l4_ck,1421.clkdm_name = "core_l4_clkdm",1422.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1423.enable_bit = OMAP2420_EN_WDT3_SHIFT,1424.recalc = &followparent_recalc,1425};14261427static struct clk wdt3_fck = {1428.name = "wdt3_fck",1429.ops = &clkops_omap2_dflt_wait,1430.parent = &func_32k_ck,1431.clkdm_name = "core_l4_clkdm",1432.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1433.enable_bit = OMAP2420_EN_WDT3_SHIFT,1434.recalc = &followparent_recalc,1435};14361437static struct clk mspro_ick = {1438.name = "mspro_ick",1439.ops = &clkops_omap2_iclk_dflt_wait,1440.parent = &l4_ck,1441.clkdm_name = "core_l4_clkdm",1442.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1443.enable_bit = OMAP24XX_EN_MSPRO_SHIFT,1444.recalc = &followparent_recalc,1445};14461447static struct clk mspro_fck = {1448.name = "mspro_fck",1449.ops = &clkops_omap2_dflt_wait,1450.parent = &func_96m_ck,1451.clkdm_name = "core_l4_clkdm",1452.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1453.enable_bit = OMAP24XX_EN_MSPRO_SHIFT,1454.recalc = &followparent_recalc,1455};14561457static struct clk mmc_ick = {1458.name = "mmc_ick",1459.ops = &clkops_omap2_iclk_dflt_wait,1460.parent = &l4_ck,1461.clkdm_name = "core_l4_clkdm",1462.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1463.enable_bit = OMAP2420_EN_MMC_SHIFT,1464.recalc = &followparent_recalc,1465};14661467static struct clk mmc_fck = {1468.name = "mmc_fck",1469.ops = &clkops_omap2_dflt_wait,1470.parent = &func_96m_ck,1471.clkdm_name = "core_l4_clkdm",1472.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1473.enable_bit = OMAP2420_EN_MMC_SHIFT,1474.recalc = &followparent_recalc,1475};14761477static struct clk fac_ick = {1478.name = "fac_ick",1479.ops = &clkops_omap2_iclk_dflt_wait,1480.parent = &l4_ck,1481.clkdm_name = "core_l4_clkdm",1482.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1483.enable_bit = OMAP24XX_EN_FAC_SHIFT,1484.recalc = &followparent_recalc,1485};14861487static struct clk fac_fck = {1488.name = "fac_fck",1489.ops = &clkops_omap2_dflt_wait,1490.parent = &func_12m_ck,1491.clkdm_name = "core_l4_clkdm",1492.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1493.enable_bit = OMAP24XX_EN_FAC_SHIFT,1494.recalc = &followparent_recalc,1495};14961497static struct clk eac_ick = {1498.name = "eac_ick",1499.ops = &clkops_omap2_iclk_dflt_wait,1500.parent = &l4_ck,1501.clkdm_name = "core_l4_clkdm",1502.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1503.enable_bit = OMAP2420_EN_EAC_SHIFT,1504.recalc = &followparent_recalc,1505};15061507static struct clk eac_fck = {1508.name = "eac_fck",1509.ops = &clkops_omap2_dflt_wait,1510.parent = &func_96m_ck,1511.clkdm_name = "core_l4_clkdm",1512.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1513.enable_bit = OMAP2420_EN_EAC_SHIFT,1514.recalc = &followparent_recalc,1515};15161517static struct clk hdq_ick = {1518.name = "hdq_ick",1519.ops = &clkops_omap2_iclk_dflt_wait,1520.parent = &l4_ck,1521.clkdm_name = "core_l4_clkdm",1522.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1523.enable_bit = OMAP24XX_EN_HDQ_SHIFT,1524.recalc = &followparent_recalc,1525};15261527static struct clk hdq_fck = {1528.name = "hdq_fck",1529.ops = &clkops_omap2_dflt_wait,1530.parent = &func_12m_ck,1531.clkdm_name = "core_l4_clkdm",1532.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1533.enable_bit = OMAP24XX_EN_HDQ_SHIFT,1534.recalc = &followparent_recalc,1535};15361537static struct clk i2c2_ick = {1538.name = "i2c2_ick",1539.ops = &clkops_omap2_iclk_dflt_wait,1540.parent = &l4_ck,1541.clkdm_name = "core_l4_clkdm",1542.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1543.enable_bit = OMAP2420_EN_I2C2_SHIFT,1544.recalc = &followparent_recalc,1545};15461547static struct clk i2c2_fck = {1548.name = "i2c2_fck",1549.ops = &clkops_omap2_dflt_wait,1550.parent = &func_12m_ck,1551.clkdm_name = "core_l4_clkdm",1552.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1553.enable_bit = OMAP2420_EN_I2C2_SHIFT,1554.recalc = &followparent_recalc,1555};15561557static struct clk i2c1_ick = {1558.name = "i2c1_ick",1559.ops = &clkops_omap2_iclk_dflt_wait,1560.parent = &l4_ck,1561.clkdm_name = "core_l4_clkdm",1562.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1563.enable_bit = OMAP2420_EN_I2C1_SHIFT,1564.recalc = &followparent_recalc,1565};15661567static struct clk i2c1_fck = {1568.name = "i2c1_fck",1569.ops = &clkops_omap2_dflt_wait,1570.parent = &func_12m_ck,1571.clkdm_name = "core_l4_clkdm",1572.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1573.enable_bit = OMAP2420_EN_I2C1_SHIFT,1574.recalc = &followparent_recalc,1575};15761577/*1578* The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE1579* accesses derived from this data.1580*/1581static struct clk gpmc_fck = {1582.name = "gpmc_fck",1583.ops = &clkops_omap2_iclk_idle_only,1584.parent = &core_l3_ck,1585.flags = ENABLE_ON_INIT,1586.clkdm_name = "core_l3_clkdm",1587.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),1588.enable_bit = OMAP24XX_AUTO_GPMC_SHIFT,1589.recalc = &followparent_recalc,1590};15911592static struct clk sdma_fck = {1593.name = "sdma_fck",1594.ops = &clkops_null, /* RMK: missing? */1595.parent = &core_l3_ck,1596.clkdm_name = "core_l3_clkdm",1597.recalc = &followparent_recalc,1598};15991600/*1601* The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE1602* accesses derived from this data.1603*/1604static struct clk sdma_ick = {1605.name = "sdma_ick",1606.ops = &clkops_omap2_iclk_idle_only,1607.parent = &core_l3_ck,1608.clkdm_name = "core_l3_clkdm",1609.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),1610.enable_bit = OMAP24XX_AUTO_SDMA_SHIFT,1611.recalc = &followparent_recalc,1612};16131614/*1615* The enable_reg/enable_bit in this clock is only used for CM_AUTOIDLE1616* accesses derived from this data.1617*/1618static struct clk sdrc_ick = {1619.name = "sdrc_ick",1620.ops = &clkops_omap2_iclk_idle_only,1621.parent = &core_l3_ck,1622.flags = ENABLE_ON_INIT,1623.clkdm_name = "core_l3_clkdm",1624.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN3),1625.enable_bit = OMAP24XX_AUTO_SDRC_SHIFT,1626.recalc = &followparent_recalc,1627};16281629static struct clk vlynq_ick = {1630.name = "vlynq_ick",1631.ops = &clkops_omap2_iclk_dflt_wait,1632.parent = &core_l3_ck,1633.clkdm_name = "core_l3_clkdm",1634.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_ICLKEN1),1635.enable_bit = OMAP2420_EN_VLYNQ_SHIFT,1636.recalc = &followparent_recalc,1637};16381639static const struct clksel_rate vlynq_fck_96m_rates[] = {1640{ .div = 1, .val = 0, .flags = RATE_IN_242X },1641{ .div = 0 }1642};16431644static const struct clksel_rate vlynq_fck_core_rates[] = {1645{ .div = 1, .val = 1, .flags = RATE_IN_242X },1646{ .div = 2, .val = 2, .flags = RATE_IN_242X },1647{ .div = 3, .val = 3, .flags = RATE_IN_242X },1648{ .div = 4, .val = 4, .flags = RATE_IN_242X },1649{ .div = 6, .val = 6, .flags = RATE_IN_242X },1650{ .div = 8, .val = 8, .flags = RATE_IN_242X },1651{ .div = 9, .val = 9, .flags = RATE_IN_242X },1652{ .div = 12, .val = 12, .flags = RATE_IN_242X },1653{ .div = 16, .val = 16, .flags = RATE_IN_242X },1654{ .div = 18, .val = 18, .flags = RATE_IN_242X },1655{ .div = 0 }1656};16571658static const struct clksel vlynq_fck_clksel[] = {1659{ .parent = &func_96m_ck, .rates = vlynq_fck_96m_rates },1660{ .parent = &core_ck, .rates = vlynq_fck_core_rates },1661{ .parent = NULL }1662};16631664static struct clk vlynq_fck = {1665.name = "vlynq_fck",1666.ops = &clkops_omap2_dflt_wait,1667.parent = &func_96m_ck,1668.clkdm_name = "core_l3_clkdm",1669.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),1670.enable_bit = OMAP2420_EN_VLYNQ_SHIFT,1671.init = &omap2_init_clksel_parent,1672.clksel_reg = OMAP_CM_REGADDR(CORE_MOD, CM_CLKSEL1),1673.clksel_mask = OMAP2420_CLKSEL_VLYNQ_MASK,1674.clksel = vlynq_fck_clksel,1675.recalc = &omap2_clksel_recalc,1676};16771678static struct clk des_ick = {1679.name = "des_ick",1680.ops = &clkops_omap2_iclk_dflt_wait,1681.parent = &l4_ck,1682.clkdm_name = "core_l4_clkdm",1683.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),1684.enable_bit = OMAP24XX_EN_DES_SHIFT,1685.recalc = &followparent_recalc,1686};16871688static struct clk sha_ick = {1689.name = "sha_ick",1690.ops = &clkops_omap2_iclk_dflt_wait,1691.parent = &l4_ck,1692.clkdm_name = "core_l4_clkdm",1693.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),1694.enable_bit = OMAP24XX_EN_SHA_SHIFT,1695.recalc = &followparent_recalc,1696};16971698static struct clk rng_ick = {1699.name = "rng_ick",1700.ops = &clkops_omap2_iclk_dflt_wait,1701.parent = &l4_ck,1702.clkdm_name = "core_l4_clkdm",1703.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),1704.enable_bit = OMAP24XX_EN_RNG_SHIFT,1705.recalc = &followparent_recalc,1706};17071708static struct clk aes_ick = {1709.name = "aes_ick",1710.ops = &clkops_omap2_iclk_dflt_wait,1711.parent = &l4_ck,1712.clkdm_name = "core_l4_clkdm",1713.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),1714.enable_bit = OMAP24XX_EN_AES_SHIFT,1715.recalc = &followparent_recalc,1716};17171718static struct clk pka_ick = {1719.name = "pka_ick",1720.ops = &clkops_omap2_iclk_dflt_wait,1721.parent = &l4_ck,1722.clkdm_name = "core_l4_clkdm",1723.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_ICLKEN4),1724.enable_bit = OMAP24XX_EN_PKA_SHIFT,1725.recalc = &followparent_recalc,1726};17271728static struct clk usb_fck = {1729.name = "usb_fck",1730.ops = &clkops_omap2_dflt_wait,1731.parent = &func_48m_ck,1732.clkdm_name = "core_l3_clkdm",1733.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),1734.enable_bit = OMAP24XX_EN_USB_SHIFT,1735.recalc = &followparent_recalc,1736};17371738/*1739* This clock is a composite clock which does entire set changes then1740* forces a rebalance. It keys on the MPU speed, but it really could1741* be any key speed part of a set in the rate table.1742*1743* to really change a set, you need memory table sets which get changed1744* in sram, pre-notifiers & post notifiers, changing the top set, without1745* having low level display recalc's won't work... this is why dpm notifiers1746* work, isr's off, walk a list of clocks already _off_ and not messing with1747* the bus.1748*1749* This clock should have no parent. It embodies the entire upper level1750* active set. A parent will mess up some of the init also.1751*/1752static struct clk virt_prcm_set = {1753.name = "virt_prcm_set",1754.ops = &clkops_null,1755.parent = &mpu_ck, /* Indexed by mpu speed, no parent */1756.recalc = &omap2_table_mpu_recalc, /* sets are keyed on mpu rate */1757.set_rate = &omap2_select_table_rate,1758.round_rate = &omap2_round_to_table_rate,1759};176017611762/*1763* clkdev integration1764*/17651766static struct omap_clk omap2420_clks[] = {1767/* external root sources */1768CLK(NULL, "func_32k_ck", &func_32k_ck, CK_242X),1769CLK(NULL, "secure_32k_ck", &secure_32k_ck, CK_242X),1770CLK(NULL, "osc_ck", &osc_ck, CK_242X),1771CLK(NULL, "sys_ck", &sys_ck, CK_242X),1772CLK(NULL, "alt_ck", &alt_ck, CK_242X),1773CLK("omap-mcbsp.1", "pad_fck", &mcbsp_clks, CK_242X),1774CLK("omap-mcbsp.2", "pad_fck", &mcbsp_clks, CK_242X),1775CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_242X),1776/* internal analog sources */1777CLK(NULL, "dpll_ck", &dpll_ck, CK_242X),1778CLK(NULL, "apll96_ck", &apll96_ck, CK_242X),1779CLK(NULL, "apll54_ck", &apll54_ck, CK_242X),1780/* internal prcm root sources */1781CLK(NULL, "func_54m_ck", &func_54m_ck, CK_242X),1782CLK(NULL, "core_ck", &core_ck, CK_242X),1783CLK("omap-mcbsp.1", "prcm_fck", &func_96m_ck, CK_242X),1784CLK("omap-mcbsp.2", "prcm_fck", &func_96m_ck, CK_242X),1785CLK(NULL, "func_96m_ck", &func_96m_ck, CK_242X),1786CLK(NULL, "func_48m_ck", &func_48m_ck, CK_242X),1787CLK(NULL, "func_12m_ck", &func_12m_ck, CK_242X),1788CLK(NULL, "ck_wdt1_osc", &wdt1_osc_ck, CK_242X),1789CLK(NULL, "sys_clkout_src", &sys_clkout_src, CK_242X),1790CLK(NULL, "sys_clkout", &sys_clkout, CK_242X),1791CLK(NULL, "sys_clkout2_src", &sys_clkout2_src, CK_242X),1792CLK(NULL, "sys_clkout2", &sys_clkout2, CK_242X),1793CLK(NULL, "emul_ck", &emul_ck, CK_242X),1794/* mpu domain clocks */1795CLK(NULL, "mpu_ck", &mpu_ck, CK_242X),1796/* dsp domain clocks */1797CLK(NULL, "dsp_fck", &dsp_fck, CK_242X),1798CLK(NULL, "dsp_ick", &dsp_ick, CK_242X),1799CLK(NULL, "iva1_ifck", &iva1_ifck, CK_242X),1800CLK(NULL, "iva1_mpu_int_ifck", &iva1_mpu_int_ifck, CK_242X),1801/* GFX domain clocks */1802CLK(NULL, "gfx_3d_fck", &gfx_3d_fck, CK_242X),1803CLK(NULL, "gfx_2d_fck", &gfx_2d_fck, CK_242X),1804CLK(NULL, "gfx_ick", &gfx_ick, CK_242X),1805/* DSS domain clocks */1806CLK("omapdss_dss", "ick", &dss_ick, CK_242X),1807CLK("omapdss_dss", "fck", &dss1_fck, CK_242X),1808CLK("omapdss_dss", "sys_clk", &dss2_fck, CK_242X),1809CLK("omapdss_dss", "tv_clk", &dss_54m_fck, CK_242X),1810/* L3 domain clocks */1811CLK(NULL, "core_l3_ck", &core_l3_ck, CK_242X),1812CLK(NULL, "ssi_fck", &ssi_ssr_sst_fck, CK_242X),1813CLK(NULL, "usb_l4_ick", &usb_l4_ick, CK_242X),1814/* L4 domain clocks */1815CLK(NULL, "l4_ck", &l4_ck, CK_242X),1816CLK(NULL, "ssi_l4_ick", &ssi_l4_ick, CK_242X),1817CLK(NULL, "wu_l4_ick", &wu_l4_ick, CK_242X),1818/* virtual meta-group clock */1819CLK(NULL, "virt_prcm_set", &virt_prcm_set, CK_242X),1820/* general l4 interface ck, multi-parent functional clk */1821CLK(NULL, "gpt1_ick", &gpt1_ick, CK_242X),1822CLK(NULL, "gpt1_fck", &gpt1_fck, CK_242X),1823CLK(NULL, "gpt2_ick", &gpt2_ick, CK_242X),1824CLK(NULL, "gpt2_fck", &gpt2_fck, CK_242X),1825CLK(NULL, "gpt3_ick", &gpt3_ick, CK_242X),1826CLK(NULL, "gpt3_fck", &gpt3_fck, CK_242X),1827CLK(NULL, "gpt4_ick", &gpt4_ick, CK_242X),1828CLK(NULL, "gpt4_fck", &gpt4_fck, CK_242X),1829CLK(NULL, "gpt5_ick", &gpt5_ick, CK_242X),1830CLK(NULL, "gpt5_fck", &gpt5_fck, CK_242X),1831CLK(NULL, "gpt6_ick", &gpt6_ick, CK_242X),1832CLK(NULL, "gpt6_fck", &gpt6_fck, CK_242X),1833CLK(NULL, "gpt7_ick", &gpt7_ick, CK_242X),1834CLK(NULL, "gpt7_fck", &gpt7_fck, CK_242X),1835CLK(NULL, "gpt8_ick", &gpt8_ick, CK_242X),1836CLK(NULL, "gpt8_fck", &gpt8_fck, CK_242X),1837CLK(NULL, "gpt9_ick", &gpt9_ick, CK_242X),1838CLK(NULL, "gpt9_fck", &gpt9_fck, CK_242X),1839CLK(NULL, "gpt10_ick", &gpt10_ick, CK_242X),1840CLK(NULL, "gpt10_fck", &gpt10_fck, CK_242X),1841CLK(NULL, "gpt11_ick", &gpt11_ick, CK_242X),1842CLK(NULL, "gpt11_fck", &gpt11_fck, CK_242X),1843CLK(NULL, "gpt12_ick", &gpt12_ick, CK_242X),1844CLK(NULL, "gpt12_fck", &gpt12_fck, CK_242X),1845CLK("omap-mcbsp.1", "ick", &mcbsp1_ick, CK_242X),1846CLK("omap-mcbsp.1", "fck", &mcbsp1_fck, CK_242X),1847CLK("omap-mcbsp.2", "ick", &mcbsp2_ick, CK_242X),1848CLK("omap-mcbsp.2", "fck", &mcbsp2_fck, CK_242X),1849CLK("omap2_mcspi.1", "ick", &mcspi1_ick, CK_242X),1850CLK("omap2_mcspi.1", "fck", &mcspi1_fck, CK_242X),1851CLK("omap2_mcspi.2", "ick", &mcspi2_ick, CK_242X),1852CLK("omap2_mcspi.2", "fck", &mcspi2_fck, CK_242X),1853CLK(NULL, "uart1_ick", &uart1_ick, CK_242X),1854CLK(NULL, "uart1_fck", &uart1_fck, CK_242X),1855CLK(NULL, "uart2_ick", &uart2_ick, CK_242X),1856CLK(NULL, "uart2_fck", &uart2_fck, CK_242X),1857CLK(NULL, "uart3_ick", &uart3_ick, CK_242X),1858CLK(NULL, "uart3_fck", &uart3_fck, CK_242X),1859CLK(NULL, "gpios_ick", &gpios_ick, CK_242X),1860CLK(NULL, "gpios_fck", &gpios_fck, CK_242X),1861CLK("omap_wdt", "ick", &mpu_wdt_ick, CK_242X),1862CLK("omap_wdt", "fck", &mpu_wdt_fck, CK_242X),1863CLK(NULL, "sync_32k_ick", &sync_32k_ick, CK_242X),1864CLK(NULL, "wdt1_ick", &wdt1_ick, CK_242X),1865CLK(NULL, "omapctrl_ick", &omapctrl_ick, CK_242X),1866CLK("omap24xxcam", "fck", &cam_fck, CK_242X),1867CLK("omap24xxcam", "ick", &cam_ick, CK_242X),1868CLK(NULL, "mailboxes_ick", &mailboxes_ick, CK_242X),1869CLK(NULL, "wdt4_ick", &wdt4_ick, CK_242X),1870CLK(NULL, "wdt4_fck", &wdt4_fck, CK_242X),1871CLK(NULL, "wdt3_ick", &wdt3_ick, CK_242X),1872CLK(NULL, "wdt3_fck", &wdt3_fck, CK_242X),1873CLK(NULL, "mspro_ick", &mspro_ick, CK_242X),1874CLK(NULL, "mspro_fck", &mspro_fck, CK_242X),1875CLK("mmci-omap.0", "ick", &mmc_ick, CK_242X),1876CLK("mmci-omap.0", "fck", &mmc_fck, CK_242X),1877CLK(NULL, "fac_ick", &fac_ick, CK_242X),1878CLK(NULL, "fac_fck", &fac_fck, CK_242X),1879CLK(NULL, "eac_ick", &eac_ick, CK_242X),1880CLK(NULL, "eac_fck", &eac_fck, CK_242X),1881CLK("omap_hdq.0", "ick", &hdq_ick, CK_242X),1882CLK("omap_hdq.1", "fck", &hdq_fck, CK_242X),1883CLK("omap_i2c.1", "ick", &i2c1_ick, CK_242X),1884CLK("omap_i2c.1", "fck", &i2c1_fck, CK_242X),1885CLK("omap_i2c.2", "ick", &i2c2_ick, CK_242X),1886CLK("omap_i2c.2", "fck", &i2c2_fck, CK_242X),1887CLK(NULL, "gpmc_fck", &gpmc_fck, CK_242X),1888CLK(NULL, "sdma_fck", &sdma_fck, CK_242X),1889CLK(NULL, "sdma_ick", &sdma_ick, CK_242X),1890CLK(NULL, "sdrc_ick", &sdrc_ick, CK_242X),1891CLK(NULL, "vlynq_ick", &vlynq_ick, CK_242X),1892CLK(NULL, "vlynq_fck", &vlynq_fck, CK_242X),1893CLK(NULL, "des_ick", &des_ick, CK_242X),1894CLK("omap-sham", "ick", &sha_ick, CK_242X),1895CLK("omap_rng", "ick", &rng_ick, CK_242X),1896CLK("omap-aes", "ick", &aes_ick, CK_242X),1897CLK(NULL, "pka_ick", &pka_ick, CK_242X),1898CLK(NULL, "usb_fck", &usb_fck, CK_242X),1899CLK("musb-hdrc", "fck", &osc_ck, CK_242X),1900};19011902/*1903* init code1904*/19051906int __init omap2420_clk_init(void)1907{1908const struct prcm_config *prcm;1909struct omap_clk *c;1910u32 clkrate;19111912prcm_clksrc_ctrl = OMAP2420_PRCM_CLKSRC_CTRL;1913cm_idlest_pll = OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST);1914cpu_mask = RATE_IN_242X;1915rate_table = omap2420_rate_table;19161917clk_init(&omap2_clk_functions);19181919for (c = omap2420_clks; c < omap2420_clks + ARRAY_SIZE(omap2420_clks);1920c++)1921clk_preinit(c->lk.clk);19221923osc_ck.rate = omap2_osc_clk_recalc(&osc_ck);1924propagate_rate(&osc_ck);1925sys_ck.rate = omap2xxx_sys_clk_recalc(&sys_ck);1926propagate_rate(&sys_ck);19271928for (c = omap2420_clks; c < omap2420_clks + ARRAY_SIZE(omap2420_clks);1929c++) {1930clkdev_add(&c->lk);1931clk_register(c->lk.clk);1932omap2_init_clk_clkdm(c->lk.clk);1933}19341935/* Disable autoidle on all clocks; let the PM code enable it later */1936omap_clk_disable_autoidle_all();19371938/* Check the MPU rate set by bootloader */1939clkrate = omap2xxx_clk_get_core_rate(&dpll_ck);1940for (prcm = rate_table; prcm->mpu_speed; prcm++) {1941if (!(prcm->flags & cpu_mask))1942continue;1943if (prcm->xtal_speed != sys_ck.rate)1944continue;1945if (prcm->dpll_speed <= clkrate)1946break;1947}1948curr_prcm_set = prcm;19491950recalculate_root_clocks();19511952pr_info("Clocking rate (Crystal/DPLL/MPU): %ld.%01ld/%ld/%ld MHz\n",1953(sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,1954(dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;19551956/*1957* Only enable those clocks we will need, let the drivers1958* enable other clocks as necessary1959*/1960clk_enable_init_clocks();19611962/* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */1963vclk = clk_get(NULL, "virt_prcm_set");1964sclk = clk_get(NULL, "sys_ck");1965dclk = clk_get(NULL, "dpll_ck");19661967return 0;1968}1969197019711972