Path: blob/master/arch/arm/mach-omap1/clock_data.c
10817 views
/*1* linux/arch/arm/mach-omap1/clock_data.c2*3* Copyright (C) 2004 - 2005, 2009-2010 Nokia Corporation4* Written by Tuukka Tikkanen <[email protected]>5* Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc6*7* This program is free software; you can redistribute it and/or modify8* it under the terms of the GNU General Public License version 2 as9* published by the Free Software Foundation.10*11* To do:12* - Clocks that are only available on some chips should be marked with the13* chips that they are present on.14*/1516#include <linux/kernel.h>17#include <linux/clk.h>18#include <linux/io.h>1920#include <asm/mach-types.h> /* for machine_is_* */2122#include <plat/clock.h>23#include <plat/cpu.h>24#include <plat/clkdev_omap.h>25#include <plat/usb.h> /* for OTG_BASE */2627#include "clock.h"2829/* Some ARM_IDLECT1 bit shifts - used in struct arm_idlect1_clk */30#define IDL_CLKOUT_ARM_SHIFT 1231#define IDLTIM_ARM_SHIFT 932#define IDLAPI_ARM_SHIFT 833#define IDLIF_ARM_SHIFT 634#define IDLLB_ARM_SHIFT 4 /* undocumented? */35#define OMAP1510_IDLLCD_ARM_SHIFT 3 /* undocumented? */36#define IDLPER_ARM_SHIFT 237#define IDLXORP_ARM_SHIFT 138#define IDLWDT_ARM_SHIFT 03940/* Some MOD_CONF_CTRL_0 bit shifts - used in struct clk.enable_bit */41#define CONF_MOD_UART3_CLK_MODE_R 3142#define CONF_MOD_UART2_CLK_MODE_R 3043#define CONF_MOD_UART1_CLK_MODE_R 2944#define CONF_MOD_MMC_SD_CLK_REQ_R 2345#define CONF_MOD_MCBSP3_AUXON 204647/* Some MOD_CONF_CTRL_1 bit shifts - used in struct clk.enable_bit */48#define CONF_MOD_SOSSI_CLK_EN_R 164950/* Some OTG_SYSCON_2-specific bit fields */51#define OTG_SYSCON_2_UHOST_EN_SHIFT 85253/* Some SOFT_REQ_REG bit fields - used in struct clk.enable_bit */54#define SOFT_MMC2_DPLL_REQ_SHIFT 1355#define SOFT_MMC_DPLL_REQ_SHIFT 1256#define SOFT_UART3_DPLL_REQ_SHIFT 1157#define SOFT_UART2_DPLL_REQ_SHIFT 1058#define SOFT_UART1_DPLL_REQ_SHIFT 959#define SOFT_USB_OTG_DPLL_REQ_SHIFT 860#define SOFT_CAM_DPLL_REQ_SHIFT 761#define SOFT_COM_MCKO_REQ_SHIFT 662#define SOFT_PERIPH_REQ_SHIFT 5 /* sys_ck gate for UART2 ? */63#define USB_REQ_EN_SHIFT 464#define SOFT_USB_REQ_SHIFT 3 /* sys_ck gate for USB host? */65#define SOFT_SDW_REQ_SHIFT 2 /* sys_ck gate for Bluetooth? */66#define SOFT_COM_REQ_SHIFT 1 /* sys_ck gate for com proc? */67#define SOFT_DPLL_REQ_SHIFT 06869/*70* Omap1 clocks71*/7273static struct clk ck_ref = {74.name = "ck_ref",75.ops = &clkops_null,76.rate = 12000000,77};7879static struct clk ck_dpll1 = {80.name = "ck_dpll1",81.ops = &clkops_null,82.parent = &ck_ref,83};8485/*86* FIXME: This clock seems to be necessary but no-one has asked for its87* activation. [ FIX: SoSSI, SSR ]88*/89static struct arm_idlect1_clk ck_dpll1out = {90.clk = {91.name = "ck_dpll1out",92.ops = &clkops_generic,93.parent = &ck_dpll1,94.flags = CLOCK_IDLE_CONTROL | ENABLE_REG_32BIT |95ENABLE_ON_INIT,96.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),97.enable_bit = EN_CKOUT_ARM,98.recalc = &followparent_recalc,99},100.idlect_shift = IDL_CLKOUT_ARM_SHIFT,101};102103static struct clk sossi_ck = {104.name = "ck_sossi",105.ops = &clkops_generic,106.parent = &ck_dpll1out.clk,107.flags = CLOCK_NO_IDLE_PARENT | ENABLE_REG_32BIT,108.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_1),109.enable_bit = CONF_MOD_SOSSI_CLK_EN_R,110.recalc = &omap1_sossi_recalc,111.set_rate = &omap1_set_sossi_rate,112};113114static struct clk arm_ck = {115.name = "arm_ck",116.ops = &clkops_null,117.parent = &ck_dpll1,118.rate_offset = CKCTL_ARMDIV_OFFSET,119.recalc = &omap1_ckctl_recalc,120.round_rate = omap1_clk_round_rate_ckctl_arm,121.set_rate = omap1_clk_set_rate_ckctl_arm,122};123124static struct arm_idlect1_clk armper_ck = {125.clk = {126.name = "armper_ck",127.ops = &clkops_generic,128.parent = &ck_dpll1,129.flags = CLOCK_IDLE_CONTROL,130.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),131.enable_bit = EN_PERCK,132.rate_offset = CKCTL_PERDIV_OFFSET,133.recalc = &omap1_ckctl_recalc,134.round_rate = omap1_clk_round_rate_ckctl_arm,135.set_rate = omap1_clk_set_rate_ckctl_arm,136},137.idlect_shift = IDLPER_ARM_SHIFT,138};139140/*141* FIXME: This clock seems to be necessary but no-one has asked for its142* activation. [ GPIO code for 1510 ]143*/144static struct clk arm_gpio_ck = {145.name = "ick",146.ops = &clkops_generic,147.parent = &ck_dpll1,148.flags = ENABLE_ON_INIT,149.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),150.enable_bit = EN_GPIOCK,151.recalc = &followparent_recalc,152};153154static struct arm_idlect1_clk armxor_ck = {155.clk = {156.name = "armxor_ck",157.ops = &clkops_generic,158.parent = &ck_ref,159.flags = CLOCK_IDLE_CONTROL,160.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),161.enable_bit = EN_XORPCK,162.recalc = &followparent_recalc,163},164.idlect_shift = IDLXORP_ARM_SHIFT,165};166167static struct arm_idlect1_clk armtim_ck = {168.clk = {169.name = "armtim_ck",170.ops = &clkops_generic,171.parent = &ck_ref,172.flags = CLOCK_IDLE_CONTROL,173.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),174.enable_bit = EN_TIMCK,175.recalc = &followparent_recalc,176},177.idlect_shift = IDLTIM_ARM_SHIFT,178};179180static struct arm_idlect1_clk armwdt_ck = {181.clk = {182.name = "armwdt_ck",183.ops = &clkops_generic,184.parent = &ck_ref,185.flags = CLOCK_IDLE_CONTROL,186.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),187.enable_bit = EN_WDTCK,188.fixed_div = 14,189.recalc = &omap_fixed_divisor_recalc,190},191.idlect_shift = IDLWDT_ARM_SHIFT,192};193194static struct clk arminth_ck16xx = {195.name = "arminth_ck",196.ops = &clkops_null,197.parent = &arm_ck,198.recalc = &followparent_recalc,199/* Note: On 16xx the frequency can be divided by 2 by programming200* ARM_CKCTL:ARM_INTHCK_SEL(14) to 1201*202* 1510 version is in TC clocks.203*/204};205206static struct clk dsp_ck = {207.name = "dsp_ck",208.ops = &clkops_generic,209.parent = &ck_dpll1,210.enable_reg = OMAP1_IO_ADDRESS(ARM_CKCTL),211.enable_bit = EN_DSPCK,212.rate_offset = CKCTL_DSPDIV_OFFSET,213.recalc = &omap1_ckctl_recalc,214.round_rate = omap1_clk_round_rate_ckctl_arm,215.set_rate = omap1_clk_set_rate_ckctl_arm,216};217218static struct clk dspmmu_ck = {219.name = "dspmmu_ck",220.ops = &clkops_null,221.parent = &ck_dpll1,222.rate_offset = CKCTL_DSPMMUDIV_OFFSET,223.recalc = &omap1_ckctl_recalc,224.round_rate = omap1_clk_round_rate_ckctl_arm,225.set_rate = omap1_clk_set_rate_ckctl_arm,226};227228static struct clk dspper_ck = {229.name = "dspper_ck",230.ops = &clkops_dspck,231.parent = &ck_dpll1,232.enable_reg = DSP_IDLECT2,233.enable_bit = EN_PERCK,234.rate_offset = CKCTL_PERDIV_OFFSET,235.recalc = &omap1_ckctl_recalc_dsp_domain,236.round_rate = omap1_clk_round_rate_ckctl_arm,237.set_rate = &omap1_clk_set_rate_dsp_domain,238};239240static struct clk dspxor_ck = {241.name = "dspxor_ck",242.ops = &clkops_dspck,243.parent = &ck_ref,244.enable_reg = DSP_IDLECT2,245.enable_bit = EN_XORPCK,246.recalc = &followparent_recalc,247};248249static struct clk dsptim_ck = {250.name = "dsptim_ck",251.ops = &clkops_dspck,252.parent = &ck_ref,253.enable_reg = DSP_IDLECT2,254.enable_bit = EN_DSPTIMCK,255.recalc = &followparent_recalc,256};257258static struct arm_idlect1_clk tc_ck = {259.clk = {260.name = "tc_ck",261.ops = &clkops_null,262.parent = &ck_dpll1,263.flags = CLOCK_IDLE_CONTROL,264.rate_offset = CKCTL_TCDIV_OFFSET,265.recalc = &omap1_ckctl_recalc,266.round_rate = omap1_clk_round_rate_ckctl_arm,267.set_rate = omap1_clk_set_rate_ckctl_arm,268},269.idlect_shift = IDLIF_ARM_SHIFT,270};271272static struct clk arminth_ck1510 = {273.name = "arminth_ck",274.ops = &clkops_null,275.parent = &tc_ck.clk,276.recalc = &followparent_recalc,277/* Note: On 1510 the frequency follows TC_CK278*279* 16xx version is in MPU clocks.280*/281};282283static struct clk tipb_ck = {284/* No-idle controlled by "tc_ck" */285.name = "tipb_ck",286.ops = &clkops_null,287.parent = &tc_ck.clk,288.recalc = &followparent_recalc,289};290291static struct clk l3_ocpi_ck = {292/* No-idle controlled by "tc_ck" */293.name = "l3_ocpi_ck",294.ops = &clkops_generic,295.parent = &tc_ck.clk,296.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3),297.enable_bit = EN_OCPI_CK,298.recalc = &followparent_recalc,299};300301static struct clk tc1_ck = {302.name = "tc1_ck",303.ops = &clkops_generic,304.parent = &tc_ck.clk,305.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3),306.enable_bit = EN_TC1_CK,307.recalc = &followparent_recalc,308};309310/*311* FIXME: This clock seems to be necessary but no-one has asked for its312* activation. [ pm.c (SRAM), CCP, Camera ]313*/314static struct clk tc2_ck = {315.name = "tc2_ck",316.ops = &clkops_generic,317.parent = &tc_ck.clk,318.flags = ENABLE_ON_INIT,319.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3),320.enable_bit = EN_TC2_CK,321.recalc = &followparent_recalc,322};323324static struct clk dma_ck = {325/* No-idle controlled by "tc_ck" */326.name = "dma_ck",327.ops = &clkops_null,328.parent = &tc_ck.clk,329.recalc = &followparent_recalc,330};331332static struct clk dma_lcdfree_ck = {333.name = "dma_lcdfree_ck",334.ops = &clkops_null,335.parent = &tc_ck.clk,336.recalc = &followparent_recalc,337};338339static struct arm_idlect1_clk api_ck = {340.clk = {341.name = "api_ck",342.ops = &clkops_generic,343.parent = &tc_ck.clk,344.flags = CLOCK_IDLE_CONTROL,345.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),346.enable_bit = EN_APICK,347.recalc = &followparent_recalc,348},349.idlect_shift = IDLAPI_ARM_SHIFT,350};351352static struct arm_idlect1_clk lb_ck = {353.clk = {354.name = "lb_ck",355.ops = &clkops_generic,356.parent = &tc_ck.clk,357.flags = CLOCK_IDLE_CONTROL,358.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),359.enable_bit = EN_LBCK,360.recalc = &followparent_recalc,361},362.idlect_shift = IDLLB_ARM_SHIFT,363};364365static struct clk rhea1_ck = {366.name = "rhea1_ck",367.ops = &clkops_null,368.parent = &tc_ck.clk,369.recalc = &followparent_recalc,370};371372static struct clk rhea2_ck = {373.name = "rhea2_ck",374.ops = &clkops_null,375.parent = &tc_ck.clk,376.recalc = &followparent_recalc,377};378379static struct clk lcd_ck_16xx = {380.name = "lcd_ck",381.ops = &clkops_generic,382.parent = &ck_dpll1,383.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),384.enable_bit = EN_LCDCK,385.rate_offset = CKCTL_LCDDIV_OFFSET,386.recalc = &omap1_ckctl_recalc,387.round_rate = omap1_clk_round_rate_ckctl_arm,388.set_rate = omap1_clk_set_rate_ckctl_arm,389};390391static struct arm_idlect1_clk lcd_ck_1510 = {392.clk = {393.name = "lcd_ck",394.ops = &clkops_generic,395.parent = &ck_dpll1,396.flags = CLOCK_IDLE_CONTROL,397.enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),398.enable_bit = EN_LCDCK,399.rate_offset = CKCTL_LCDDIV_OFFSET,400.recalc = &omap1_ckctl_recalc,401.round_rate = omap1_clk_round_rate_ckctl_arm,402.set_rate = omap1_clk_set_rate_ckctl_arm,403},404.idlect_shift = OMAP1510_IDLLCD_ARM_SHIFT,405};406407/*408* XXX The enable_bit here is misused - it simply switches between 12MHz409* and 48MHz. Reimplement with clksel.410*411* XXX does this need SYSC register handling?412*/413static struct clk uart1_1510 = {414.name = "uart1_ck",415.ops = &clkops_null,416/* Direct from ULPD, no real parent */417.parent = &armper_ck.clk,418.rate = 12000000,419.flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,420.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),421.enable_bit = CONF_MOD_UART1_CLK_MODE_R,422.set_rate = &omap1_set_uart_rate,423.recalc = &omap1_uart_recalc,424};425426/*427* XXX The enable_bit here is misused - it simply switches between 12MHz428* and 48MHz. Reimplement with clksel.429*430* XXX SYSC register handling does not belong in the clock framework431*/432static struct uart_clk uart1_16xx = {433.clk = {434.name = "uart1_ck",435.ops = &clkops_uart_16xx,436/* Direct from ULPD, no real parent */437.parent = &armper_ck.clk,438.rate = 48000000,439.flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,440.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),441.enable_bit = CONF_MOD_UART1_CLK_MODE_R,442},443.sysc_addr = 0xfffb0054,444};445446/*447* XXX The enable_bit here is misused - it simply switches between 12MHz448* and 48MHz. Reimplement with clksel.449*450* XXX does this need SYSC register handling?451*/452static struct clk uart2_ck = {453.name = "uart2_ck",454.ops = &clkops_null,455/* Direct from ULPD, no real parent */456.parent = &armper_ck.clk,457.rate = 12000000,458.flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,459.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),460.enable_bit = CONF_MOD_UART2_CLK_MODE_R,461.set_rate = &omap1_set_uart_rate,462.recalc = &omap1_uart_recalc,463};464465/*466* XXX The enable_bit here is misused - it simply switches between 12MHz467* and 48MHz. Reimplement with clksel.468*469* XXX does this need SYSC register handling?470*/471static struct clk uart3_1510 = {472.name = "uart3_ck",473.ops = &clkops_null,474/* Direct from ULPD, no real parent */475.parent = &armper_ck.clk,476.rate = 12000000,477.flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,478.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),479.enable_bit = CONF_MOD_UART3_CLK_MODE_R,480.set_rate = &omap1_set_uart_rate,481.recalc = &omap1_uart_recalc,482};483484/*485* XXX The enable_bit here is misused - it simply switches between 12MHz486* and 48MHz. Reimplement with clksel.487*488* XXX SYSC register handling does not belong in the clock framework489*/490static struct uart_clk uart3_16xx = {491.clk = {492.name = "uart3_ck",493.ops = &clkops_uart_16xx,494/* Direct from ULPD, no real parent */495.parent = &armper_ck.clk,496.rate = 48000000,497.flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,498.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),499.enable_bit = CONF_MOD_UART3_CLK_MODE_R,500},501.sysc_addr = 0xfffb9854,502};503504static struct clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */505.name = "usb_clko",506.ops = &clkops_generic,507/* Direct from ULPD, no parent */508.rate = 6000000,509.flags = ENABLE_REG_32BIT,510.enable_reg = OMAP1_IO_ADDRESS(ULPD_CLOCK_CTRL),511.enable_bit = USB_MCLK_EN_BIT,512};513514static struct clk usb_hhc_ck1510 = {515.name = "usb_hhc_ck",516.ops = &clkops_generic,517/* Direct from ULPD, no parent */518.rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */519.flags = ENABLE_REG_32BIT,520.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),521.enable_bit = USB_HOST_HHC_UHOST_EN,522};523524static struct clk usb_hhc_ck16xx = {525.name = "usb_hhc_ck",526.ops = &clkops_generic,527/* Direct from ULPD, no parent */528.rate = 48000000,529/* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */530.flags = ENABLE_REG_32BIT,531.enable_reg = OMAP1_IO_ADDRESS(OTG_BASE + 0x08), /* OTG_SYSCON_2 */532.enable_bit = OTG_SYSCON_2_UHOST_EN_SHIFT533};534535static struct clk usb_dc_ck = {536.name = "usb_dc_ck",537.ops = &clkops_generic,538/* Direct from ULPD, no parent */539.rate = 48000000,540.enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),541.enable_bit = USB_REQ_EN_SHIFT,542};543544static struct clk usb_dc_ck7xx = {545.name = "usb_dc_ck",546.ops = &clkops_generic,547/* Direct from ULPD, no parent */548.rate = 48000000,549.enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),550.enable_bit = SOFT_USB_OTG_DPLL_REQ_SHIFT,551};552553static struct clk uart1_7xx = {554.name = "uart1_ck",555.ops = &clkops_generic,556/* Direct from ULPD, no parent */557.rate = 12000000,558.enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),559.enable_bit = 9,560};561562static struct clk uart2_7xx = {563.name = "uart2_ck",564.ops = &clkops_generic,565/* Direct from ULPD, no parent */566.rate = 12000000,567.enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),568.enable_bit = 11,569};570571static struct clk mclk_1510 = {572.name = "mclk",573.ops = &clkops_generic,574/* Direct from ULPD, no parent. May be enabled by ext hardware. */575.rate = 12000000,576.enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),577.enable_bit = SOFT_COM_MCKO_REQ_SHIFT,578};579580static struct clk mclk_16xx = {581.name = "mclk",582.ops = &clkops_generic,583/* Direct from ULPD, no parent. May be enabled by ext hardware. */584.enable_reg = OMAP1_IO_ADDRESS(COM_CLK_DIV_CTRL_SEL),585.enable_bit = COM_ULPD_PLL_CLK_REQ,586.set_rate = &omap1_set_ext_clk_rate,587.round_rate = &omap1_round_ext_clk_rate,588.init = &omap1_init_ext_clk,589};590591static struct clk bclk_1510 = {592.name = "bclk",593.ops = &clkops_generic,594/* Direct from ULPD, no parent. May be enabled by ext hardware. */595.rate = 12000000,596};597598static struct clk bclk_16xx = {599.name = "bclk",600.ops = &clkops_generic,601/* Direct from ULPD, no parent. May be enabled by ext hardware. */602.enable_reg = OMAP1_IO_ADDRESS(SWD_CLK_DIV_CTRL_SEL),603.enable_bit = SWD_ULPD_PLL_CLK_REQ,604.set_rate = &omap1_set_ext_clk_rate,605.round_rate = &omap1_round_ext_clk_rate,606.init = &omap1_init_ext_clk,607};608609static struct clk mmc1_ck = {610.name = "mmc1_ck",611.ops = &clkops_generic,612/* Functional clock is direct from ULPD, interface clock is ARMPER */613.parent = &armper_ck.clk,614.rate = 48000000,615.flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,616.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),617.enable_bit = CONF_MOD_MMC_SD_CLK_REQ_R,618};619620/*621* XXX MOD_CONF_CTRL_0 bit 20 is defined in the 1510 TRM as622* CONF_MOD_MCBSP3_AUXON ??623*/624static struct clk mmc2_ck = {625.name = "mmc2_ck",626.ops = &clkops_generic,627/* Functional clock is direct from ULPD, interface clock is ARMPER */628.parent = &armper_ck.clk,629.rate = 48000000,630.flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,631.enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),632.enable_bit = 20,633};634635static struct clk mmc3_ck = {636.name = "mmc3_ck",637.ops = &clkops_generic,638/* Functional clock is direct from ULPD, interface clock is ARMPER */639.parent = &armper_ck.clk,640.rate = 48000000,641.flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,642.enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),643.enable_bit = SOFT_MMC_DPLL_REQ_SHIFT,644};645646static struct clk virtual_ck_mpu = {647.name = "mpu",648.ops = &clkops_null,649.parent = &arm_ck, /* Is smarter alias for */650.recalc = &followparent_recalc,651.set_rate = &omap1_select_table_rate,652.round_rate = &omap1_round_to_table_rate,653};654655/* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK656remains active during MPU idle whenever this is enabled */657static struct clk i2c_fck = {658.name = "i2c_fck",659.ops = &clkops_null,660.flags = CLOCK_NO_IDLE_PARENT,661.parent = &armxor_ck.clk,662.recalc = &followparent_recalc,663};664665static struct clk i2c_ick = {666.name = "i2c_ick",667.ops = &clkops_null,668.flags = CLOCK_NO_IDLE_PARENT,669.parent = &armper_ck.clk,670.recalc = &followparent_recalc,671};672673/*674* clkdev integration675*/676677static struct omap_clk omap_clks[] = {678/* non-ULPD clocks */679CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX),680CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310 | CK_7XX),681/* CK_GEN1 clocks */682CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX),683CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX),684CLK(NULL, "arm_ck", &arm_ck, CK_16XX | CK_1510 | CK_310),685CLK(NULL, "armper_ck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310),686CLK("omap_gpio.0", "ick", &arm_gpio_ck, CK_1510 | CK_310),687CLK(NULL, "armxor_ck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),688CLK(NULL, "armtim_ck", &armtim_ck.clk, CK_16XX | CK_1510 | CK_310),689CLK("omap_wdt", "fck", &armwdt_ck.clk, CK_16XX | CK_1510 | CK_310),690CLK("omap_wdt", "ick", &armper_ck.clk, CK_16XX),691CLK("omap_wdt", "ick", &dummy_ck, CK_1510 | CK_310),692CLK(NULL, "arminth_ck", &arminth_ck1510, CK_1510 | CK_310),693CLK(NULL, "arminth_ck", &arminth_ck16xx, CK_16XX),694/* CK_GEN2 clocks */695CLK(NULL, "dsp_ck", &dsp_ck, CK_16XX | CK_1510 | CK_310),696CLK(NULL, "dspmmu_ck", &dspmmu_ck, CK_16XX | CK_1510 | CK_310),697CLK(NULL, "dspper_ck", &dspper_ck, CK_16XX | CK_1510 | CK_310),698CLK(NULL, "dspxor_ck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),699CLK(NULL, "dsptim_ck", &dsptim_ck, CK_16XX | CK_1510 | CK_310),700/* CK_GEN3 clocks */701CLK(NULL, "tc_ck", &tc_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),702CLK(NULL, "tipb_ck", &tipb_ck, CK_1510 | CK_310),703CLK(NULL, "l3_ocpi_ck", &l3_ocpi_ck, CK_16XX | CK_7XX),704CLK(NULL, "tc1_ck", &tc1_ck, CK_16XX),705CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),706CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310),707CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX),708CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),709CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310),710CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX),711CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX),712CLK(NULL, "lcd_ck", &lcd_ck_16xx, CK_16XX | CK_7XX),713CLK(NULL, "lcd_ck", &lcd_ck_1510.clk, CK_1510 | CK_310),714/* ULPD clocks */715CLK(NULL, "uart1_ck", &uart1_1510, CK_1510 | CK_310),716CLK(NULL, "uart1_ck", &uart1_16xx.clk, CK_16XX),717CLK(NULL, "uart1_ck", &uart1_7xx, CK_7XX),718CLK(NULL, "uart2_ck", &uart2_ck, CK_16XX | CK_1510 | CK_310),719CLK(NULL, "uart2_ck", &uart2_7xx, CK_7XX),720CLK(NULL, "uart3_ck", &uart3_1510, CK_1510 | CK_310),721CLK(NULL, "uart3_ck", &uart3_16xx.clk, CK_16XX),722CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310),723CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310),724CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX),725CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX),726CLK(NULL, "usb_dc_ck", &usb_dc_ck7xx, CK_7XX),727CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310),728CLK(NULL, "mclk", &mclk_16xx, CK_16XX),729CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310),730CLK(NULL, "bclk", &bclk_16xx, CK_16XX),731CLK("mmci-omap.0", "fck", &mmc1_ck, CK_16XX | CK_1510 | CK_310),732CLK("mmci-omap.0", "fck", &mmc3_ck, CK_7XX),733CLK("mmci-omap.0", "ick", &armper_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),734CLK("mmci-omap.1", "fck", &mmc2_ck, CK_16XX),735CLK("mmci-omap.1", "ick", &armper_ck.clk, CK_16XX),736/* Virtual clocks */737CLK(NULL, "mpu", &virtual_ck_mpu, CK_16XX | CK_1510 | CK_310),738CLK("omap_i2c.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX),739CLK("omap_i2c.1", "ick", &i2c_ick, CK_16XX),740CLK("omap_i2c.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX),741CLK("omap1_spi100k.1", "fck", &dummy_ck, CK_7XX),742CLK("omap1_spi100k.1", "ick", &dummy_ck, CK_7XX),743CLK("omap1_spi100k.2", "fck", &dummy_ck, CK_7XX),744CLK("omap1_spi100k.2", "ick", &dummy_ck, CK_7XX),745CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310),746CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX),747CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310),748CLK("omap-mcbsp.2", "ick", &armper_ck.clk, CK_16XX),749CLK("omap-mcbsp.2", "ick", &dummy_ck, CK_1510 | CK_310),750CLK("omap-mcbsp.3", "ick", &dspper_ck, CK_16XX),751CLK("omap-mcbsp.3", "ick", &dummy_ck, CK_1510 | CK_310),752CLK("omap-mcbsp.1", "fck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),753CLK("omap-mcbsp.2", "fck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310),754CLK("omap-mcbsp.3", "fck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),755};756757/*758* init759*/760761static struct clk_functions omap1_clk_functions = {762.clk_enable = omap1_clk_enable,763.clk_disable = omap1_clk_disable,764.clk_round_rate = omap1_clk_round_rate,765.clk_set_rate = omap1_clk_set_rate,766.clk_disable_unused = omap1_clk_disable_unused,767};768769int __init omap1_clk_init(void)770{771struct omap_clk *c;772const struct omap_clock_config *info;773int crystal_type = 0; /* Default 12 MHz */774u32 reg, cpu_mask;775776#ifdef CONFIG_DEBUG_LL777/*778* Resets some clocks that may be left on from bootloader,779* but leaves serial clocks on.780*/781omap_writel(0x3 << 29, MOD_CONF_CTRL_0);782#endif783784/* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */785reg = omap_readw(SOFT_REQ_REG) & (1 << 4);786omap_writew(reg, SOFT_REQ_REG);787if (!cpu_is_omap15xx())788omap_writew(0, SOFT_REQ_REG2);789790clk_init(&omap1_clk_functions);791792/* By default all idlect1 clocks are allowed to idle */793arm_idlect1_mask = ~0;794795for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)796clk_preinit(c->lk.clk);797798cpu_mask = 0;799if (cpu_is_omap16xx())800cpu_mask |= CK_16XX;801if (cpu_is_omap1510())802cpu_mask |= CK_1510;803if (cpu_is_omap7xx())804cpu_mask |= CK_7XX;805if (cpu_is_omap310())806cpu_mask |= CK_310;807808for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)809if (c->cpu & cpu_mask) {810clkdev_add(&c->lk);811clk_register(c->lk.clk);812}813814/* Pointers to these clocks are needed by code in clock.c */815api_ck_p = clk_get(NULL, "api_ck");816ck_dpll1_p = clk_get(NULL, "ck_dpll1");817ck_ref_p = clk_get(NULL, "ck_ref");818819info = omap_get_config(OMAP_TAG_CLOCK, struct omap_clock_config);820if (info != NULL) {821if (!cpu_is_omap15xx())822crystal_type = info->system_clock_type;823}824825if (cpu_is_omap7xx())826ck_ref.rate = 13000000;827if (cpu_is_omap16xx() && crystal_type == 2)828ck_ref.rate = 19200000;829830pr_info("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: "831"0x%04x\n", omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),832omap_readw(ARM_CKCTL));833834/* We want to be in syncronous scalable mode */835omap_writew(0x1000, ARM_SYSST);836837#ifdef CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER838/* Use values set by bootloader. Determine PLL rate and recalculate839* dependent clocks as if kernel had changed PLL or divisors.840*/841{842unsigned pll_ctl_val = omap_readw(DPLL_CTL);843844ck_dpll1.rate = ck_ref.rate; /* Base xtal rate */845if (pll_ctl_val & 0x10) {846/* PLL enabled, apply multiplier and divisor */847if (pll_ctl_val & 0xf80)848ck_dpll1.rate *= (pll_ctl_val & 0xf80) >> 7;849ck_dpll1.rate /= ((pll_ctl_val & 0x60) >> 5) + 1;850} else {851/* PLL disabled, apply bypass divisor */852switch (pll_ctl_val & 0xc) {853case 0:854break;855case 0x4:856ck_dpll1.rate /= 2;857break;858default:859ck_dpll1.rate /= 4;860break;861}862}863}864#else865/* Find the highest supported frequency and enable it */866if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) {867printk(KERN_ERR "System frequencies not set. Check your config.\n");868/* Guess sane values (60MHz) */869omap_writew(0x2290, DPLL_CTL);870omap_writew(cpu_is_omap7xx() ? 0x3005 : 0x1005, ARM_CKCTL);871ck_dpll1.rate = 60000000;872}873#endif874propagate_rate(&ck_dpll1);875/* Cache rates for clocks connected to ck_ref (not dpll1) */876propagate_rate(&ck_ref);877printk(KERN_INFO "Clocking rate (xtal/DPLL1/MPU): "878"%ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",879ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,880ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,881arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);882883if (machine_is_omap_perseus2() || machine_is_omap_fsample()) {884/* Select slicer output as OMAP input clock */885omap_writew(omap_readw(OMAP7XX_PCC_UPLD_CTRL) & ~0x1,886OMAP7XX_PCC_UPLD_CTRL);887}888889/* Amstrad Delta wants BCLK high when inactive */890if (machine_is_ams_delta())891omap_writel(omap_readl(ULPD_CLOCK_CTRL) |892(1 << SDW_MCLK_INV_BIT),893ULPD_CLOCK_CTRL);894895/* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */896/* (on 730, bit 13 must not be cleared) */897if (cpu_is_omap7xx())898omap_writew(omap_readw(ARM_CKCTL) & 0x2fff, ARM_CKCTL);899else900omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL);901902/* Put DSP/MPUI into reset until needed */903omap_writew(0, ARM_RSTCT1);904omap_writew(1, ARM_RSTCT2);905omap_writew(0x400, ARM_IDLECT1);906907/*908* According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8)909* of the ARM_IDLECT2 register must be set to zero. The power-on910* default value of this bit is one.911*/912omap_writew(0x0000, ARM_IDLECT2); /* Turn LCD clock off also */913914/*915* Only enable those clocks we will need, let the drivers916* enable other clocks as necessary917*/918clk_enable(&armper_ck.clk);919clk_enable(&armxor_ck.clk);920clk_enable(&armtim_ck.clk); /* This should be done by timer code */921922if (cpu_is_omap15xx())923clk_enable(&arm_gpio_ck);924925return 0;926}927928929