162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/mach-omap1/clock_data.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2004 - 2005, 2009-2010 Nokia Corporation 662306a36Sopenharmony_ci * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> 762306a36Sopenharmony_ci * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * To do: 1062306a36Sopenharmony_ci * - Clocks that are only available on some chips should be marked with the 1162306a36Sopenharmony_ci * chips that they are present on. 1262306a36Sopenharmony_ci */ 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/kernel.h> 1562306a36Sopenharmony_ci#include <linux/io.h> 1662306a36Sopenharmony_ci#include <linux/clk.h> 1762306a36Sopenharmony_ci#include <linux/clkdev.h> 1862306a36Sopenharmony_ci#include <linux/clk-provider.h> 1962306a36Sopenharmony_ci#include <linux/cpufreq.h> 2062306a36Sopenharmony_ci#include <linux/delay.h> 2162306a36Sopenharmony_ci#include <linux/soc/ti/omap1-io.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#include <asm/mach-types.h> /* for machine_is_* */ 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#include "soc.h" 2662306a36Sopenharmony_ci#include "hardware.h" 2762306a36Sopenharmony_ci#include "usb.h" /* for OTG_BASE */ 2862306a36Sopenharmony_ci#include "iomap.h" 2962306a36Sopenharmony_ci#include "clock.h" 3062306a36Sopenharmony_ci#include "sram.h" 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* Some ARM_IDLECT1 bit shifts - used in struct arm_idlect1_clk */ 3362306a36Sopenharmony_ci#define IDL_CLKOUT_ARM_SHIFT 12 3462306a36Sopenharmony_ci#define IDLTIM_ARM_SHIFT 9 3562306a36Sopenharmony_ci#define IDLAPI_ARM_SHIFT 8 3662306a36Sopenharmony_ci#define IDLIF_ARM_SHIFT 6 3762306a36Sopenharmony_ci#define IDLLB_ARM_SHIFT 4 /* undocumented? */ 3862306a36Sopenharmony_ci#define OMAP1510_IDLLCD_ARM_SHIFT 3 /* undocumented? */ 3962306a36Sopenharmony_ci#define IDLPER_ARM_SHIFT 2 4062306a36Sopenharmony_ci#define IDLXORP_ARM_SHIFT 1 4162306a36Sopenharmony_ci#define IDLWDT_ARM_SHIFT 0 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/* Some MOD_CONF_CTRL_0 bit shifts - used in struct clk.enable_bit */ 4462306a36Sopenharmony_ci#define CONF_MOD_UART3_CLK_MODE_R 31 4562306a36Sopenharmony_ci#define CONF_MOD_UART2_CLK_MODE_R 30 4662306a36Sopenharmony_ci#define CONF_MOD_UART1_CLK_MODE_R 29 4762306a36Sopenharmony_ci#define CONF_MOD_MMC_SD_CLK_REQ_R 23 4862306a36Sopenharmony_ci#define CONF_MOD_MCBSP3_AUXON 20 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci/* Some MOD_CONF_CTRL_1 bit shifts - used in struct clk.enable_bit */ 5162306a36Sopenharmony_ci#define CONF_MOD_SOSSI_CLK_EN_R 16 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* Some OTG_SYSCON_2-specific bit fields */ 5462306a36Sopenharmony_ci#define OTG_SYSCON_2_UHOST_EN_SHIFT 8 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci/* Some SOFT_REQ_REG bit fields - used in struct clk.enable_bit */ 5762306a36Sopenharmony_ci#define SOFT_MMC2_DPLL_REQ_SHIFT 13 5862306a36Sopenharmony_ci#define SOFT_MMC_DPLL_REQ_SHIFT 12 5962306a36Sopenharmony_ci#define SOFT_UART3_DPLL_REQ_SHIFT 11 6062306a36Sopenharmony_ci#define SOFT_UART2_DPLL_REQ_SHIFT 10 6162306a36Sopenharmony_ci#define SOFT_UART1_DPLL_REQ_SHIFT 9 6262306a36Sopenharmony_ci#define SOFT_USB_OTG_DPLL_REQ_SHIFT 8 6362306a36Sopenharmony_ci#define SOFT_CAM_DPLL_REQ_SHIFT 7 6462306a36Sopenharmony_ci#define SOFT_COM_MCKO_REQ_SHIFT 6 6562306a36Sopenharmony_ci#define SOFT_PERIPH_REQ_SHIFT 5 /* sys_ck gate for UART2 ? */ 6662306a36Sopenharmony_ci#define USB_REQ_EN_SHIFT 4 6762306a36Sopenharmony_ci#define SOFT_USB_REQ_SHIFT 3 /* sys_ck gate for USB host? */ 6862306a36Sopenharmony_ci#define SOFT_SDW_REQ_SHIFT 2 /* sys_ck gate for Bluetooth? */ 6962306a36Sopenharmony_ci#define SOFT_COM_REQ_SHIFT 1 /* sys_ck gate for com proc? */ 7062306a36Sopenharmony_ci#define SOFT_DPLL_REQ_SHIFT 0 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* 7362306a36Sopenharmony_ci * Omap1 clocks 7462306a36Sopenharmony_ci */ 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistatic struct omap1_clk ck_ref = { 7762306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("ck_ref", &omap1_clk_rate_ops, 0), 7862306a36Sopenharmony_ci .rate = 12000000, 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic struct omap1_clk ck_dpll1 = { 8262306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("ck_dpll1", "ck_ref", &omap1_clk_rate_ops, 8362306a36Sopenharmony_ci /* 8462306a36Sopenharmony_ci * force recursive refresh of rates of the clock 8562306a36Sopenharmony_ci * and its children when clk_get_rate() is called 8662306a36Sopenharmony_ci */ 8762306a36Sopenharmony_ci CLK_GET_RATE_NOCACHE), 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* 9162306a36Sopenharmony_ci * FIXME: This clock seems to be necessary but no-one has asked for its 9262306a36Sopenharmony_ci * activation. [ FIX: SoSSI, SSR ] 9362306a36Sopenharmony_ci */ 9462306a36Sopenharmony_cistatic struct arm_idlect1_clk ck_dpll1out = { 9562306a36Sopenharmony_ci .clk = { 9662306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("ck_dpll1out", "ck_dpll1", &omap1_clk_gate_ops, 0), 9762306a36Sopenharmony_ci .ops = &clkops_generic, 9862306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL | ENABLE_REG_32BIT, 9962306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 10062306a36Sopenharmony_ci .enable_bit = EN_CKOUT_ARM, 10162306a36Sopenharmony_ci }, 10262306a36Sopenharmony_ci .idlect_shift = IDL_CLKOUT_ARM_SHIFT, 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistatic struct omap1_clk sossi_ck = { 10662306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("ck_sossi", "ck_dpll1out", &omap1_clk_full_ops, 0), 10762306a36Sopenharmony_ci .ops = &clkops_generic, 10862306a36Sopenharmony_ci .flags = CLOCK_NO_IDLE_PARENT | ENABLE_REG_32BIT, 10962306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_1), 11062306a36Sopenharmony_ci .enable_bit = CONF_MOD_SOSSI_CLK_EN_R, 11162306a36Sopenharmony_ci .recalc = &omap1_sossi_recalc, 11262306a36Sopenharmony_ci .round_rate = &omap1_round_sossi_rate, 11362306a36Sopenharmony_ci .set_rate = &omap1_set_sossi_rate, 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_cistatic struct omap1_clk arm_ck = { 11762306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("arm_ck", "ck_dpll1", &omap1_clk_rate_ops, 0), 11862306a36Sopenharmony_ci .rate_offset = CKCTL_ARMDIV_OFFSET, 11962306a36Sopenharmony_ci .recalc = &omap1_ckctl_recalc, 12062306a36Sopenharmony_ci .round_rate = omap1_clk_round_rate_ckctl_arm, 12162306a36Sopenharmony_ci .set_rate = omap1_clk_set_rate_ckctl_arm, 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic struct arm_idlect1_clk armper_ck = { 12562306a36Sopenharmony_ci .clk = { 12662306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("armper_ck", "ck_dpll1", &omap1_clk_full_ops, 12762306a36Sopenharmony_ci CLK_IS_CRITICAL), 12862306a36Sopenharmony_ci .ops = &clkops_generic, 12962306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL, 13062306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 13162306a36Sopenharmony_ci .enable_bit = EN_PERCK, 13262306a36Sopenharmony_ci .rate_offset = CKCTL_PERDIV_OFFSET, 13362306a36Sopenharmony_ci .recalc = &omap1_ckctl_recalc, 13462306a36Sopenharmony_ci .round_rate = omap1_clk_round_rate_ckctl_arm, 13562306a36Sopenharmony_ci .set_rate = omap1_clk_set_rate_ckctl_arm, 13662306a36Sopenharmony_ci }, 13762306a36Sopenharmony_ci .idlect_shift = IDLPER_ARM_SHIFT, 13862306a36Sopenharmony_ci}; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* 14162306a36Sopenharmony_ci * FIXME: This clock seems to be necessary but no-one has asked for its 14262306a36Sopenharmony_ci * activation. [ GPIO code for 1510 ] 14362306a36Sopenharmony_ci */ 14462306a36Sopenharmony_cistatic struct omap1_clk arm_gpio_ck = { 14562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("ick", "ck_dpll1", &omap1_clk_gate_ops, CLK_IS_CRITICAL), 14662306a36Sopenharmony_ci .ops = &clkops_generic, 14762306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 14862306a36Sopenharmony_ci .enable_bit = EN_GPIOCK, 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic struct arm_idlect1_clk armxor_ck = { 15262306a36Sopenharmony_ci .clk = { 15362306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("armxor_ck", "ck_ref", &omap1_clk_gate_ops, 15462306a36Sopenharmony_ci CLK_IS_CRITICAL), 15562306a36Sopenharmony_ci .ops = &clkops_generic, 15662306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL, 15762306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 15862306a36Sopenharmony_ci .enable_bit = EN_XORPCK, 15962306a36Sopenharmony_ci }, 16062306a36Sopenharmony_ci .idlect_shift = IDLXORP_ARM_SHIFT, 16162306a36Sopenharmony_ci}; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic struct arm_idlect1_clk armtim_ck = { 16462306a36Sopenharmony_ci .clk = { 16562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("armtim_ck", "ck_ref", &omap1_clk_gate_ops, 16662306a36Sopenharmony_ci CLK_IS_CRITICAL), 16762306a36Sopenharmony_ci .ops = &clkops_generic, 16862306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL, 16962306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 17062306a36Sopenharmony_ci .enable_bit = EN_TIMCK, 17162306a36Sopenharmony_ci }, 17262306a36Sopenharmony_ci .idlect_shift = IDLTIM_ARM_SHIFT, 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic struct arm_idlect1_clk armwdt_ck = { 17662306a36Sopenharmony_ci .clk = { 17762306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("armwdt_ck", "ck_ref", &omap1_clk_full_ops, 0), 17862306a36Sopenharmony_ci .ops = &clkops_generic, 17962306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL, 18062306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 18162306a36Sopenharmony_ci .enable_bit = EN_WDTCK, 18262306a36Sopenharmony_ci .fixed_div = 14, 18362306a36Sopenharmony_ci .recalc = &omap_fixed_divisor_recalc, 18462306a36Sopenharmony_ci }, 18562306a36Sopenharmony_ci .idlect_shift = IDLWDT_ARM_SHIFT, 18662306a36Sopenharmony_ci}; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_cistatic struct omap1_clk arminth_ck16xx = { 18962306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("arminth_ck", "arm_ck", &omap1_clk_null_ops, 0), 19062306a36Sopenharmony_ci /* Note: On 16xx the frequency can be divided by 2 by programming 19162306a36Sopenharmony_ci * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1 19262306a36Sopenharmony_ci * 19362306a36Sopenharmony_ci * 1510 version is in TC clocks. 19462306a36Sopenharmony_ci */ 19562306a36Sopenharmony_ci}; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_cistatic struct omap1_clk dsp_ck = { 19862306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("dsp_ck", "ck_dpll1", &omap1_clk_full_ops, 0), 19962306a36Sopenharmony_ci .ops = &clkops_generic, 20062306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_CKCTL), 20162306a36Sopenharmony_ci .enable_bit = EN_DSPCK, 20262306a36Sopenharmony_ci .rate_offset = CKCTL_DSPDIV_OFFSET, 20362306a36Sopenharmony_ci .recalc = &omap1_ckctl_recalc, 20462306a36Sopenharmony_ci .round_rate = omap1_clk_round_rate_ckctl_arm, 20562306a36Sopenharmony_ci .set_rate = omap1_clk_set_rate_ckctl_arm, 20662306a36Sopenharmony_ci}; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_cistatic struct omap1_clk dspmmu_ck = { 20962306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("dspmmu_ck", "ck_dpll1", &omap1_clk_rate_ops, 0), 21062306a36Sopenharmony_ci .rate_offset = CKCTL_DSPMMUDIV_OFFSET, 21162306a36Sopenharmony_ci .recalc = &omap1_ckctl_recalc, 21262306a36Sopenharmony_ci .round_rate = omap1_clk_round_rate_ckctl_arm, 21362306a36Sopenharmony_ci .set_rate = omap1_clk_set_rate_ckctl_arm, 21462306a36Sopenharmony_ci}; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistatic struct omap1_clk dspper_ck = { 21762306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("dspper_ck", "ck_dpll1", &omap1_clk_full_ops, 0), 21862306a36Sopenharmony_ci .ops = &clkops_dspck, 21962306a36Sopenharmony_ci .enable_reg = DSP_IDLECT2, 22062306a36Sopenharmony_ci .enable_bit = EN_PERCK, 22162306a36Sopenharmony_ci .rate_offset = CKCTL_PERDIV_OFFSET, 22262306a36Sopenharmony_ci .recalc = &omap1_ckctl_recalc_dsp_domain, 22362306a36Sopenharmony_ci .round_rate = omap1_clk_round_rate_ckctl_arm, 22462306a36Sopenharmony_ci .set_rate = &omap1_clk_set_rate_dsp_domain, 22562306a36Sopenharmony_ci}; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_cistatic struct omap1_clk dspxor_ck = { 22862306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("dspxor_ck", "ck_ref", &omap1_clk_gate_ops, 0), 22962306a36Sopenharmony_ci .ops = &clkops_dspck, 23062306a36Sopenharmony_ci .enable_reg = DSP_IDLECT2, 23162306a36Sopenharmony_ci .enable_bit = EN_XORPCK, 23262306a36Sopenharmony_ci}; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_cistatic struct omap1_clk dsptim_ck = { 23562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("dsptim_ck", "ck_ref", &omap1_clk_gate_ops, 0), 23662306a36Sopenharmony_ci .ops = &clkops_dspck, 23762306a36Sopenharmony_ci .enable_reg = DSP_IDLECT2, 23862306a36Sopenharmony_ci .enable_bit = EN_DSPTIMCK, 23962306a36Sopenharmony_ci}; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_cistatic struct arm_idlect1_clk tc_ck = { 24262306a36Sopenharmony_ci .clk = { 24362306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("tc_ck", "ck_dpll1", &omap1_clk_rate_ops, 0), 24462306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL, 24562306a36Sopenharmony_ci .rate_offset = CKCTL_TCDIV_OFFSET, 24662306a36Sopenharmony_ci .recalc = &omap1_ckctl_recalc, 24762306a36Sopenharmony_ci .round_rate = omap1_clk_round_rate_ckctl_arm, 24862306a36Sopenharmony_ci .set_rate = omap1_clk_set_rate_ckctl_arm, 24962306a36Sopenharmony_ci }, 25062306a36Sopenharmony_ci .idlect_shift = IDLIF_ARM_SHIFT, 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cistatic struct omap1_clk arminth_ck1510 = { 25462306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("arminth_ck", "tc_ck", &omap1_clk_null_ops, 0), 25562306a36Sopenharmony_ci /* Note: On 1510 the frequency follows TC_CK 25662306a36Sopenharmony_ci * 25762306a36Sopenharmony_ci * 16xx version is in MPU clocks. 25862306a36Sopenharmony_ci */ 25962306a36Sopenharmony_ci}; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_cistatic struct omap1_clk tipb_ck = { 26262306a36Sopenharmony_ci /* No-idle controlled by "tc_ck" */ 26362306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("tipb_ck", "tc_ck", &omap1_clk_null_ops, 0), 26462306a36Sopenharmony_ci}; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_cistatic struct omap1_clk l3_ocpi_ck = { 26762306a36Sopenharmony_ci /* No-idle controlled by "tc_ck" */ 26862306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("l3_ocpi_ck", "tc_ck", &omap1_clk_gate_ops, 0), 26962306a36Sopenharmony_ci .ops = &clkops_generic, 27062306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3), 27162306a36Sopenharmony_ci .enable_bit = EN_OCPI_CK, 27262306a36Sopenharmony_ci}; 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic struct omap1_clk tc1_ck = { 27562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("tc1_ck", "tc_ck", &omap1_clk_gate_ops, 0), 27662306a36Sopenharmony_ci .ops = &clkops_generic, 27762306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3), 27862306a36Sopenharmony_ci .enable_bit = EN_TC1_CK, 27962306a36Sopenharmony_ci}; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci/* 28262306a36Sopenharmony_ci * FIXME: This clock seems to be necessary but no-one has asked for its 28362306a36Sopenharmony_ci * activation. [ pm.c (SRAM), CCP, Camera ] 28462306a36Sopenharmony_ci */ 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_cistatic struct omap1_clk tc2_ck = { 28762306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("tc2_ck", "tc_ck", &omap1_clk_gate_ops, CLK_IS_CRITICAL), 28862306a36Sopenharmony_ci .ops = &clkops_generic, 28962306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3), 29062306a36Sopenharmony_ci .enable_bit = EN_TC2_CK, 29162306a36Sopenharmony_ci}; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cistatic struct omap1_clk dma_ck = { 29462306a36Sopenharmony_ci /* No-idle controlled by "tc_ck" */ 29562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("dma_ck", "tc_ck", &omap1_clk_null_ops, 0), 29662306a36Sopenharmony_ci}; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistatic struct omap1_clk dma_lcdfree_ck = { 29962306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("dma_lcdfree_ck", "tc_ck", &omap1_clk_null_ops, 0), 30062306a36Sopenharmony_ci}; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistatic struct arm_idlect1_clk api_ck = { 30362306a36Sopenharmony_ci .clk = { 30462306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("api_ck", "tc_ck", &omap1_clk_gate_ops, 0), 30562306a36Sopenharmony_ci .ops = &clkops_generic, 30662306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL, 30762306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 30862306a36Sopenharmony_ci .enable_bit = EN_APICK, 30962306a36Sopenharmony_ci }, 31062306a36Sopenharmony_ci .idlect_shift = IDLAPI_ARM_SHIFT, 31162306a36Sopenharmony_ci}; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_cistatic struct arm_idlect1_clk lb_ck = { 31462306a36Sopenharmony_ci .clk = { 31562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("lb_ck", "tc_ck", &omap1_clk_gate_ops, 0), 31662306a36Sopenharmony_ci .ops = &clkops_generic, 31762306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL, 31862306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 31962306a36Sopenharmony_ci .enable_bit = EN_LBCK, 32062306a36Sopenharmony_ci }, 32162306a36Sopenharmony_ci .idlect_shift = IDLLB_ARM_SHIFT, 32262306a36Sopenharmony_ci}; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistatic struct omap1_clk rhea1_ck = { 32562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("rhea1_ck", "tc_ck", &omap1_clk_null_ops, 0), 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic struct omap1_clk rhea2_ck = { 32962306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("rhea2_ck", "tc_ck", &omap1_clk_null_ops, 0), 33062306a36Sopenharmony_ci}; 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_cistatic struct omap1_clk lcd_ck_16xx = { 33362306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("lcd_ck", "ck_dpll1", &omap1_clk_full_ops, 0), 33462306a36Sopenharmony_ci .ops = &clkops_generic, 33562306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 33662306a36Sopenharmony_ci .enable_bit = EN_LCDCK, 33762306a36Sopenharmony_ci .rate_offset = CKCTL_LCDDIV_OFFSET, 33862306a36Sopenharmony_ci .recalc = &omap1_ckctl_recalc, 33962306a36Sopenharmony_ci .round_rate = omap1_clk_round_rate_ckctl_arm, 34062306a36Sopenharmony_ci .set_rate = omap1_clk_set_rate_ckctl_arm, 34162306a36Sopenharmony_ci}; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_cistatic struct arm_idlect1_clk lcd_ck_1510 = { 34462306a36Sopenharmony_ci .clk = { 34562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("lcd_ck", "ck_dpll1", &omap1_clk_full_ops, 0), 34662306a36Sopenharmony_ci .ops = &clkops_generic, 34762306a36Sopenharmony_ci .flags = CLOCK_IDLE_CONTROL, 34862306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2), 34962306a36Sopenharmony_ci .enable_bit = EN_LCDCK, 35062306a36Sopenharmony_ci .rate_offset = CKCTL_LCDDIV_OFFSET, 35162306a36Sopenharmony_ci .recalc = &omap1_ckctl_recalc, 35262306a36Sopenharmony_ci .round_rate = omap1_clk_round_rate_ckctl_arm, 35362306a36Sopenharmony_ci .set_rate = omap1_clk_set_rate_ckctl_arm, 35462306a36Sopenharmony_ci }, 35562306a36Sopenharmony_ci .idlect_shift = OMAP1510_IDLLCD_ARM_SHIFT, 35662306a36Sopenharmony_ci}; 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci/* 36062306a36Sopenharmony_ci * XXX The enable_bit here is misused - it simply switches between 12MHz 36162306a36Sopenharmony_ci * and 48MHz. Reimplement with clk_mux. 36262306a36Sopenharmony_ci * 36362306a36Sopenharmony_ci * XXX does this need SYSC register handling? 36462306a36Sopenharmony_ci */ 36562306a36Sopenharmony_cistatic struct omap1_clk uart1_1510 = { 36662306a36Sopenharmony_ci /* Direct from ULPD, no real parent */ 36762306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("uart1_ck", "armper_ck", &omap1_clk_full_ops, 0), 36862306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, 36962306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), 37062306a36Sopenharmony_ci .enable_bit = CONF_MOD_UART1_CLK_MODE_R, 37162306a36Sopenharmony_ci .round_rate = &omap1_round_uart_rate, 37262306a36Sopenharmony_ci .set_rate = &omap1_set_uart_rate, 37362306a36Sopenharmony_ci .recalc = &omap1_uart_recalc, 37462306a36Sopenharmony_ci}; 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci/* 37762306a36Sopenharmony_ci * XXX The enable_bit here is misused - it simply switches between 12MHz 37862306a36Sopenharmony_ci * and 48MHz. Reimplement with clk_mux. 37962306a36Sopenharmony_ci * 38062306a36Sopenharmony_ci * XXX SYSC register handling does not belong in the clock framework 38162306a36Sopenharmony_ci */ 38262306a36Sopenharmony_cistatic struct uart_clk uart1_16xx = { 38362306a36Sopenharmony_ci .clk = { 38462306a36Sopenharmony_ci .ops = &clkops_uart_16xx, 38562306a36Sopenharmony_ci /* Direct from ULPD, no real parent */ 38662306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("uart1_ck", "armper_ck", &omap1_clk_full_ops, 0), 38762306a36Sopenharmony_ci .rate = 48000000, 38862306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, 38962306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), 39062306a36Sopenharmony_ci .enable_bit = CONF_MOD_UART1_CLK_MODE_R, 39162306a36Sopenharmony_ci }, 39262306a36Sopenharmony_ci .sysc_addr = 0xfffb0054, 39362306a36Sopenharmony_ci}; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci/* 39662306a36Sopenharmony_ci * XXX The enable_bit here is misused - it simply switches between 12MHz 39762306a36Sopenharmony_ci * and 48MHz. Reimplement with clk_mux. 39862306a36Sopenharmony_ci * 39962306a36Sopenharmony_ci * XXX does this need SYSC register handling? 40062306a36Sopenharmony_ci */ 40162306a36Sopenharmony_cistatic struct omap1_clk uart2_ck = { 40262306a36Sopenharmony_ci /* Direct from ULPD, no real parent */ 40362306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("uart2_ck", "armper_ck", &omap1_clk_full_ops, 0), 40462306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, 40562306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), 40662306a36Sopenharmony_ci .enable_bit = CONF_MOD_UART2_CLK_MODE_R, 40762306a36Sopenharmony_ci .round_rate = &omap1_round_uart_rate, 40862306a36Sopenharmony_ci .set_rate = &omap1_set_uart_rate, 40962306a36Sopenharmony_ci .recalc = &omap1_uart_recalc, 41062306a36Sopenharmony_ci}; 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci/* 41362306a36Sopenharmony_ci * XXX The enable_bit here is misused - it simply switches between 12MHz 41462306a36Sopenharmony_ci * and 48MHz. Reimplement with clk_mux. 41562306a36Sopenharmony_ci * 41662306a36Sopenharmony_ci * XXX does this need SYSC register handling? 41762306a36Sopenharmony_ci */ 41862306a36Sopenharmony_cistatic struct omap1_clk uart3_1510 = { 41962306a36Sopenharmony_ci /* Direct from ULPD, no real parent */ 42062306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("uart3_ck", "armper_ck", &omap1_clk_full_ops, 0), 42162306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, 42262306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), 42362306a36Sopenharmony_ci .enable_bit = CONF_MOD_UART3_CLK_MODE_R, 42462306a36Sopenharmony_ci .round_rate = &omap1_round_uart_rate, 42562306a36Sopenharmony_ci .set_rate = &omap1_set_uart_rate, 42662306a36Sopenharmony_ci .recalc = &omap1_uart_recalc, 42762306a36Sopenharmony_ci}; 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci/* 43062306a36Sopenharmony_ci * XXX The enable_bit here is misused - it simply switches between 12MHz 43162306a36Sopenharmony_ci * and 48MHz. Reimplement with clk_mux. 43262306a36Sopenharmony_ci * 43362306a36Sopenharmony_ci * XXX SYSC register handling does not belong in the clock framework 43462306a36Sopenharmony_ci */ 43562306a36Sopenharmony_cistatic struct uart_clk uart3_16xx = { 43662306a36Sopenharmony_ci .clk = { 43762306a36Sopenharmony_ci .ops = &clkops_uart_16xx, 43862306a36Sopenharmony_ci /* Direct from ULPD, no real parent */ 43962306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("uart3_ck", "armper_ck", &omap1_clk_full_ops, 0), 44062306a36Sopenharmony_ci .rate = 48000000, 44162306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, 44262306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), 44362306a36Sopenharmony_ci .enable_bit = CONF_MOD_UART3_CLK_MODE_R, 44462306a36Sopenharmony_ci }, 44562306a36Sopenharmony_ci .sysc_addr = 0xfffb9854, 44662306a36Sopenharmony_ci}; 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_cistatic struct omap1_clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */ 44962306a36Sopenharmony_ci .ops = &clkops_generic, 45062306a36Sopenharmony_ci /* Direct from ULPD, no parent */ 45162306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("usb_clko", &omap1_clk_full_ops, 0), 45262306a36Sopenharmony_ci .rate = 6000000, 45362306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT, 45462306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(ULPD_CLOCK_CTRL), 45562306a36Sopenharmony_ci .enable_bit = USB_MCLK_EN_BIT, 45662306a36Sopenharmony_ci}; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_cistatic struct omap1_clk usb_hhc_ck1510 = { 45962306a36Sopenharmony_ci .ops = &clkops_generic, 46062306a36Sopenharmony_ci /* Direct from ULPD, no parent */ 46162306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("usb_hhc_ck", &omap1_clk_full_ops, 0), 46262306a36Sopenharmony_ci .rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */ 46362306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT, 46462306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), 46562306a36Sopenharmony_ci .enable_bit = USB_HOST_HHC_UHOST_EN, 46662306a36Sopenharmony_ci}; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_cistatic struct omap1_clk usb_hhc_ck16xx = { 46962306a36Sopenharmony_ci .ops = &clkops_generic, 47062306a36Sopenharmony_ci /* Direct from ULPD, no parent */ 47162306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("usb_hhc_ck", &omap1_clk_full_ops, 0), 47262306a36Sopenharmony_ci .rate = 48000000, 47362306a36Sopenharmony_ci /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */ 47462306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT, 47562306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(OTG_BASE + 0x08), /* OTG_SYSCON_2 */ 47662306a36Sopenharmony_ci .enable_bit = OTG_SYSCON_2_UHOST_EN_SHIFT 47762306a36Sopenharmony_ci}; 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_cistatic struct omap1_clk usb_dc_ck = { 48062306a36Sopenharmony_ci .ops = &clkops_generic, 48162306a36Sopenharmony_ci /* Direct from ULPD, no parent */ 48262306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("usb_dc_ck", &omap1_clk_full_ops, 0), 48362306a36Sopenharmony_ci .rate = 48000000, 48462306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), 48562306a36Sopenharmony_ci .enable_bit = SOFT_USB_OTG_DPLL_REQ_SHIFT, 48662306a36Sopenharmony_ci}; 48762306a36Sopenharmony_ci 48862306a36Sopenharmony_cistatic struct omap1_clk uart1_7xx = { 48962306a36Sopenharmony_ci .ops = &clkops_generic, 49062306a36Sopenharmony_ci /* Direct from ULPD, no parent */ 49162306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("uart1_ck", &omap1_clk_full_ops, 0), 49262306a36Sopenharmony_ci .rate = 12000000, 49362306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), 49462306a36Sopenharmony_ci .enable_bit = 9, 49562306a36Sopenharmony_ci}; 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_cistatic struct omap1_clk uart2_7xx = { 49862306a36Sopenharmony_ci .ops = &clkops_generic, 49962306a36Sopenharmony_ci /* Direct from ULPD, no parent */ 50062306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("uart2_ck", &omap1_clk_full_ops, 0), 50162306a36Sopenharmony_ci .rate = 12000000, 50262306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), 50362306a36Sopenharmony_ci .enable_bit = 11, 50462306a36Sopenharmony_ci}; 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_cistatic struct omap1_clk mclk_1510 = { 50762306a36Sopenharmony_ci .ops = &clkops_generic, 50862306a36Sopenharmony_ci /* Direct from ULPD, no parent. May be enabled by ext hardware. */ 50962306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("mclk", &omap1_clk_full_ops, 0), 51062306a36Sopenharmony_ci .rate = 12000000, 51162306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), 51262306a36Sopenharmony_ci .enable_bit = SOFT_COM_MCKO_REQ_SHIFT, 51362306a36Sopenharmony_ci}; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_cistatic struct omap1_clk mclk_16xx = { 51662306a36Sopenharmony_ci .ops = &clkops_generic, 51762306a36Sopenharmony_ci /* Direct from ULPD, no parent. May be enabled by ext hardware. */ 51862306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("mclk", &omap1_clk_full_ops, 0), 51962306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(COM_CLK_DIV_CTRL_SEL), 52062306a36Sopenharmony_ci .enable_bit = COM_ULPD_PLL_CLK_REQ, 52162306a36Sopenharmony_ci .set_rate = &omap1_set_ext_clk_rate, 52262306a36Sopenharmony_ci .round_rate = &omap1_round_ext_clk_rate, 52362306a36Sopenharmony_ci .init = &omap1_init_ext_clk, 52462306a36Sopenharmony_ci}; 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_cistatic struct omap1_clk bclk_1510 = { 52762306a36Sopenharmony_ci /* Direct from ULPD, no parent. May be enabled by ext hardware. */ 52862306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("bclk", &omap1_clk_rate_ops, 0), 52962306a36Sopenharmony_ci .rate = 12000000, 53062306a36Sopenharmony_ci}; 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_cistatic struct omap1_clk bclk_16xx = { 53362306a36Sopenharmony_ci .ops = &clkops_generic, 53462306a36Sopenharmony_ci /* Direct from ULPD, no parent. May be enabled by ext hardware. */ 53562306a36Sopenharmony_ci .hw.init = CLK_HW_INIT_NO_PARENT("bclk", &omap1_clk_full_ops, 0), 53662306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(SWD_CLK_DIV_CTRL_SEL), 53762306a36Sopenharmony_ci .enable_bit = SWD_ULPD_PLL_CLK_REQ, 53862306a36Sopenharmony_ci .set_rate = &omap1_set_ext_clk_rate, 53962306a36Sopenharmony_ci .round_rate = &omap1_round_ext_clk_rate, 54062306a36Sopenharmony_ci .init = &omap1_init_ext_clk, 54162306a36Sopenharmony_ci}; 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_cistatic struct omap1_clk mmc1_ck = { 54462306a36Sopenharmony_ci .ops = &clkops_generic, 54562306a36Sopenharmony_ci /* Functional clock is direct from ULPD, interface clock is ARMPER */ 54662306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("mmc1_ck", "armper_ck", &omap1_clk_full_ops, 0), 54762306a36Sopenharmony_ci .rate = 48000000, 54862306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, 54962306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), 55062306a36Sopenharmony_ci .enable_bit = CONF_MOD_MMC_SD_CLK_REQ_R, 55162306a36Sopenharmony_ci}; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci/* 55462306a36Sopenharmony_ci * XXX MOD_CONF_CTRL_0 bit 20 is defined in the 1510 TRM as 55562306a36Sopenharmony_ci * CONF_MOD_MCBSP3_AUXON ?? 55662306a36Sopenharmony_ci */ 55762306a36Sopenharmony_cistatic struct omap1_clk mmc2_ck = { 55862306a36Sopenharmony_ci .ops = &clkops_generic, 55962306a36Sopenharmony_ci /* Functional clock is direct from ULPD, interface clock is ARMPER */ 56062306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("mmc2_ck", "armper_ck", &omap1_clk_full_ops, 0), 56162306a36Sopenharmony_ci .rate = 48000000, 56262306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, 56362306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0), 56462306a36Sopenharmony_ci .enable_bit = 20, 56562306a36Sopenharmony_ci}; 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_cistatic struct omap1_clk mmc3_ck = { 56862306a36Sopenharmony_ci .ops = &clkops_generic, 56962306a36Sopenharmony_ci /* Functional clock is direct from ULPD, interface clock is ARMPER */ 57062306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("mmc3_ck", "armper_ck", &omap1_clk_full_ops, 0), 57162306a36Sopenharmony_ci .rate = 48000000, 57262306a36Sopenharmony_ci .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT, 57362306a36Sopenharmony_ci .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG), 57462306a36Sopenharmony_ci .enable_bit = SOFT_MMC_DPLL_REQ_SHIFT, 57562306a36Sopenharmony_ci}; 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_cistatic struct omap1_clk virtual_ck_mpu = { 57862306a36Sopenharmony_ci /* Is smarter alias for arm_ck */ 57962306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("mpu", "arm_ck", &omap1_clk_rate_ops, 0), 58062306a36Sopenharmony_ci .recalc = &followparent_recalc, 58162306a36Sopenharmony_ci .set_rate = &omap1_select_table_rate, 58262306a36Sopenharmony_ci .round_rate = &omap1_round_to_table_rate, 58362306a36Sopenharmony_ci}; 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci/* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK 58662306a36Sopenharmony_ciremains active during MPU idle whenever this is enabled */ 58762306a36Sopenharmony_cistatic struct omap1_clk i2c_fck = { 58862306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("i2c_fck", "armxor_ck", &omap1_clk_gate_ops, 0), 58962306a36Sopenharmony_ci .flags = CLOCK_NO_IDLE_PARENT, 59062306a36Sopenharmony_ci}; 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_cistatic struct omap1_clk i2c_ick = { 59362306a36Sopenharmony_ci .hw.init = CLK_HW_INIT("i2c_ick", "armper_ck", &omap1_clk_gate_ops, 0), 59462306a36Sopenharmony_ci .flags = CLOCK_NO_IDLE_PARENT, 59562306a36Sopenharmony_ci}; 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci/* 59862306a36Sopenharmony_ci * clkdev integration 59962306a36Sopenharmony_ci */ 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_cistatic struct omap_clk omap_clks[] = { 60262306a36Sopenharmony_ci /* non-ULPD clocks */ 60362306a36Sopenharmony_ci CLK(NULL, "ck_ref", &ck_ref.hw, CK_16XX | CK_1510 | CK_310 | CK_7XX), 60462306a36Sopenharmony_ci CLK(NULL, "ck_dpll1", &ck_dpll1.hw, CK_16XX | CK_1510 | CK_310 | CK_7XX), 60562306a36Sopenharmony_ci /* CK_GEN1 clocks */ 60662306a36Sopenharmony_ci CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk.hw, CK_16XX), 60762306a36Sopenharmony_ci CLK(NULL, "ck_sossi", &sossi_ck.hw, CK_16XX), 60862306a36Sopenharmony_ci CLK(NULL, "arm_ck", &arm_ck.hw, CK_16XX | CK_1510 | CK_310), 60962306a36Sopenharmony_ci CLK(NULL, "armper_ck", &armper_ck.clk.hw, CK_16XX | CK_1510 | CK_310), 61062306a36Sopenharmony_ci CLK("omap_gpio.0", "ick", &arm_gpio_ck.hw, CK_1510 | CK_310), 61162306a36Sopenharmony_ci CLK(NULL, "armxor_ck", &armxor_ck.clk.hw, CK_16XX | CK_1510 | CK_310 | CK_7XX), 61262306a36Sopenharmony_ci CLK(NULL, "armtim_ck", &armtim_ck.clk.hw, CK_16XX | CK_1510 | CK_310), 61362306a36Sopenharmony_ci CLK("omap_wdt", "fck", &armwdt_ck.clk.hw, CK_16XX | CK_1510 | CK_310), 61462306a36Sopenharmony_ci CLK("omap_wdt", "ick", &armper_ck.clk.hw, CK_16XX), 61562306a36Sopenharmony_ci CLK("omap_wdt", "ick", &dummy_ck.hw, CK_1510 | CK_310), 61662306a36Sopenharmony_ci CLK(NULL, "arminth_ck", &arminth_ck1510.hw, CK_1510 | CK_310), 61762306a36Sopenharmony_ci CLK(NULL, "arminth_ck", &arminth_ck16xx.hw, CK_16XX), 61862306a36Sopenharmony_ci /* CK_GEN2 clocks */ 61962306a36Sopenharmony_ci CLK(NULL, "dsp_ck", &dsp_ck.hw, CK_16XX | CK_1510 | CK_310), 62062306a36Sopenharmony_ci CLK(NULL, "dspmmu_ck", &dspmmu_ck.hw, CK_16XX | CK_1510 | CK_310), 62162306a36Sopenharmony_ci CLK(NULL, "dspper_ck", &dspper_ck.hw, CK_16XX | CK_1510 | CK_310), 62262306a36Sopenharmony_ci CLK(NULL, "dspxor_ck", &dspxor_ck.hw, CK_16XX | CK_1510 | CK_310), 62362306a36Sopenharmony_ci CLK(NULL, "dsptim_ck", &dsptim_ck.hw, CK_16XX | CK_1510 | CK_310), 62462306a36Sopenharmony_ci /* CK_GEN3 clocks */ 62562306a36Sopenharmony_ci CLK(NULL, "tc_ck", &tc_ck.clk.hw, CK_16XX | CK_1510 | CK_310 | CK_7XX), 62662306a36Sopenharmony_ci CLK(NULL, "tipb_ck", &tipb_ck.hw, CK_1510 | CK_310), 62762306a36Sopenharmony_ci CLK(NULL, "l3_ocpi_ck", &l3_ocpi_ck.hw, CK_16XX | CK_7XX), 62862306a36Sopenharmony_ci CLK(NULL, "tc1_ck", &tc1_ck.hw, CK_16XX), 62962306a36Sopenharmony_ci CLK(NULL, "tc2_ck", &tc2_ck.hw, CK_16XX), 63062306a36Sopenharmony_ci CLK(NULL, "dma_ck", &dma_ck.hw, CK_16XX | CK_1510 | CK_310), 63162306a36Sopenharmony_ci CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck.hw, CK_16XX), 63262306a36Sopenharmony_ci CLK(NULL, "api_ck", &api_ck.clk.hw, CK_16XX | CK_1510 | CK_310 | CK_7XX), 63362306a36Sopenharmony_ci CLK(NULL, "lb_ck", &lb_ck.clk.hw, CK_1510 | CK_310), 63462306a36Sopenharmony_ci CLK(NULL, "rhea1_ck", &rhea1_ck.hw, CK_16XX), 63562306a36Sopenharmony_ci CLK(NULL, "rhea2_ck", &rhea2_ck.hw, CK_16XX), 63662306a36Sopenharmony_ci CLK(NULL, "lcd_ck", &lcd_ck_16xx.hw, CK_16XX | CK_7XX), 63762306a36Sopenharmony_ci CLK(NULL, "lcd_ck", &lcd_ck_1510.clk.hw, CK_1510 | CK_310), 63862306a36Sopenharmony_ci /* ULPD clocks */ 63962306a36Sopenharmony_ci CLK(NULL, "uart1_ck", &uart1_1510.hw, CK_1510 | CK_310), 64062306a36Sopenharmony_ci CLK(NULL, "uart1_ck", &uart1_16xx.clk.hw, CK_16XX), 64162306a36Sopenharmony_ci CLK(NULL, "uart1_ck", &uart1_7xx.hw, CK_7XX), 64262306a36Sopenharmony_ci CLK(NULL, "uart2_ck", &uart2_ck.hw, CK_16XX | CK_1510 | CK_310), 64362306a36Sopenharmony_ci CLK(NULL, "uart2_ck", &uart2_7xx.hw, CK_7XX), 64462306a36Sopenharmony_ci CLK(NULL, "uart3_ck", &uart3_1510.hw, CK_1510 | CK_310), 64562306a36Sopenharmony_ci CLK(NULL, "uart3_ck", &uart3_16xx.clk.hw, CK_16XX), 64662306a36Sopenharmony_ci CLK(NULL, "usb_clko", &usb_clko.hw, CK_16XX | CK_1510 | CK_310), 64762306a36Sopenharmony_ci CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510.hw, CK_1510 | CK_310), 64862306a36Sopenharmony_ci CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx.hw, CK_16XX), 64962306a36Sopenharmony_ci CLK(NULL, "usb_dc_ck", &usb_dc_ck.hw, CK_16XX | CK_7XX), 65062306a36Sopenharmony_ci CLK(NULL, "mclk", &mclk_1510.hw, CK_1510 | CK_310), 65162306a36Sopenharmony_ci CLK(NULL, "mclk", &mclk_16xx.hw, CK_16XX), 65262306a36Sopenharmony_ci CLK(NULL, "bclk", &bclk_1510.hw, CK_1510 | CK_310), 65362306a36Sopenharmony_ci CLK(NULL, "bclk", &bclk_16xx.hw, CK_16XX), 65462306a36Sopenharmony_ci CLK("mmci-omap.0", "fck", &mmc1_ck.hw, CK_16XX | CK_1510 | CK_310), 65562306a36Sopenharmony_ci CLK("mmci-omap.0", "fck", &mmc3_ck.hw, CK_7XX), 65662306a36Sopenharmony_ci CLK("mmci-omap.0", "ick", &armper_ck.clk.hw, CK_16XX | CK_1510 | CK_310 | CK_7XX), 65762306a36Sopenharmony_ci CLK("mmci-omap.1", "fck", &mmc2_ck.hw, CK_16XX), 65862306a36Sopenharmony_ci CLK("mmci-omap.1", "ick", &armper_ck.clk.hw, CK_16XX), 65962306a36Sopenharmony_ci /* Virtual clocks */ 66062306a36Sopenharmony_ci CLK(NULL, "mpu", &virtual_ck_mpu.hw, CK_16XX | CK_1510 | CK_310), 66162306a36Sopenharmony_ci CLK("omap_i2c.1", "fck", &i2c_fck.hw, CK_16XX | CK_1510 | CK_310 | CK_7XX), 66262306a36Sopenharmony_ci CLK("omap_i2c.1", "ick", &i2c_ick.hw, CK_16XX), 66362306a36Sopenharmony_ci CLK("omap_i2c.1", "ick", &dummy_ck.hw, CK_1510 | CK_310 | CK_7XX), 66462306a36Sopenharmony_ci CLK("omap1_spi100k.1", "fck", &dummy_ck.hw, CK_7XX), 66562306a36Sopenharmony_ci CLK("omap1_spi100k.1", "ick", &dummy_ck.hw, CK_7XX), 66662306a36Sopenharmony_ci CLK("omap1_spi100k.2", "fck", &dummy_ck.hw, CK_7XX), 66762306a36Sopenharmony_ci CLK("omap1_spi100k.2", "ick", &dummy_ck.hw, CK_7XX), 66862306a36Sopenharmony_ci CLK("omap_uwire", "fck", &armxor_ck.clk.hw, CK_16XX | CK_1510 | CK_310), 66962306a36Sopenharmony_ci CLK("omap-mcbsp.1", "ick", &dspper_ck.hw, CK_16XX), 67062306a36Sopenharmony_ci CLK("omap-mcbsp.1", "ick", &dummy_ck.hw, CK_1510 | CK_310), 67162306a36Sopenharmony_ci CLK("omap-mcbsp.2", "ick", &armper_ck.clk.hw, CK_16XX), 67262306a36Sopenharmony_ci CLK("omap-mcbsp.2", "ick", &dummy_ck.hw, CK_1510 | CK_310), 67362306a36Sopenharmony_ci CLK("omap-mcbsp.3", "ick", &dspper_ck.hw, CK_16XX), 67462306a36Sopenharmony_ci CLK("omap-mcbsp.3", "ick", &dummy_ck.hw, CK_1510 | CK_310), 67562306a36Sopenharmony_ci CLK("omap-mcbsp.1", "fck", &dspxor_ck.hw, CK_16XX | CK_1510 | CK_310), 67662306a36Sopenharmony_ci CLK("omap-mcbsp.2", "fck", &armper_ck.clk.hw, CK_16XX | CK_1510 | CK_310), 67762306a36Sopenharmony_ci CLK("omap-mcbsp.3", "fck", &dspxor_ck.hw, CK_16XX | CK_1510 | CK_310), 67862306a36Sopenharmony_ci}; 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci/* 68162306a36Sopenharmony_ci * init 68262306a36Sopenharmony_ci */ 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_cistatic void __init omap1_show_rates(void) 68562306a36Sopenharmony_ci{ 68662306a36Sopenharmony_ci pr_notice("Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n", 68762306a36Sopenharmony_ci ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10, 68862306a36Sopenharmony_ci ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10, 68962306a36Sopenharmony_ci arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10); 69062306a36Sopenharmony_ci} 69162306a36Sopenharmony_ci 69262306a36Sopenharmony_ciu32 cpu_mask; 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_ciint __init omap1_clk_init(void) 69562306a36Sopenharmony_ci{ 69662306a36Sopenharmony_ci struct omap_clk *c; 69762306a36Sopenharmony_ci u32 reg; 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_LL 70062306a36Sopenharmony_ci /* Make sure UART clocks are enabled early */ 70162306a36Sopenharmony_ci if (cpu_is_omap16xx()) 70262306a36Sopenharmony_ci omap_writel(omap_readl(MOD_CONF_CTRL_0) | 70362306a36Sopenharmony_ci CONF_MOD_UART1_CLK_MODE_R | 70462306a36Sopenharmony_ci CONF_MOD_UART3_CLK_MODE_R, MOD_CONF_CTRL_0); 70562306a36Sopenharmony_ci#endif 70662306a36Sopenharmony_ci 70762306a36Sopenharmony_ci /* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */ 70862306a36Sopenharmony_ci reg = omap_readw(SOFT_REQ_REG) & (1 << 4); 70962306a36Sopenharmony_ci omap_writew(reg, SOFT_REQ_REG); 71062306a36Sopenharmony_ci if (!cpu_is_omap15xx()) 71162306a36Sopenharmony_ci omap_writew(0, SOFT_REQ_REG2); 71262306a36Sopenharmony_ci 71362306a36Sopenharmony_ci /* By default all idlect1 clocks are allowed to idle */ 71462306a36Sopenharmony_ci arm_idlect1_mask = ~0; 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_ci cpu_mask = 0; 71762306a36Sopenharmony_ci if (cpu_is_omap1710()) 71862306a36Sopenharmony_ci cpu_mask |= CK_1710; 71962306a36Sopenharmony_ci if (cpu_is_omap16xx()) 72062306a36Sopenharmony_ci cpu_mask |= CK_16XX; 72162306a36Sopenharmony_ci if (cpu_is_omap1510()) 72262306a36Sopenharmony_ci cpu_mask |= CK_1510; 72362306a36Sopenharmony_ci if (cpu_is_omap310()) 72462306a36Sopenharmony_ci cpu_mask |= CK_310; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci /* Pointers to these clocks are needed by code in clock.c */ 72762306a36Sopenharmony_ci api_ck_p = &api_ck.clk; 72862306a36Sopenharmony_ci ck_dpll1_p = &ck_dpll1; 72962306a36Sopenharmony_ci ck_ref_p = &ck_ref; 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci pr_info("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: 0x%04x\n", 73262306a36Sopenharmony_ci omap_readw(ARM_SYSST), omap_readw(DPLL_CTL), 73362306a36Sopenharmony_ci omap_readw(ARM_CKCTL)); 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_ci /* We want to be in synchronous scalable mode */ 73662306a36Sopenharmony_ci omap_writew(0x1000, ARM_SYSST); 73762306a36Sopenharmony_ci 73862306a36Sopenharmony_ci 73962306a36Sopenharmony_ci /* 74062306a36Sopenharmony_ci * Initially use the values set by bootloader. Determine PLL rate and 74162306a36Sopenharmony_ci * recalculate dependent clocks as if kernel had changed PLL or 74262306a36Sopenharmony_ci * divisors. See also omap1_clk_late_init() that can reprogram dpll1 74362306a36Sopenharmony_ci * after the SRAM is initialized. 74462306a36Sopenharmony_ci */ 74562306a36Sopenharmony_ci { 74662306a36Sopenharmony_ci unsigned pll_ctl_val = omap_readw(DPLL_CTL); 74762306a36Sopenharmony_ci 74862306a36Sopenharmony_ci ck_dpll1.rate = ck_ref.rate; /* Base xtal rate */ 74962306a36Sopenharmony_ci if (pll_ctl_val & 0x10) { 75062306a36Sopenharmony_ci /* PLL enabled, apply multiplier and divisor */ 75162306a36Sopenharmony_ci if (pll_ctl_val & 0xf80) 75262306a36Sopenharmony_ci ck_dpll1.rate *= (pll_ctl_val & 0xf80) >> 7; 75362306a36Sopenharmony_ci ck_dpll1.rate /= ((pll_ctl_val & 0x60) >> 5) + 1; 75462306a36Sopenharmony_ci } else { 75562306a36Sopenharmony_ci /* PLL disabled, apply bypass divisor */ 75662306a36Sopenharmony_ci switch (pll_ctl_val & 0xc) { 75762306a36Sopenharmony_ci case 0: 75862306a36Sopenharmony_ci break; 75962306a36Sopenharmony_ci case 0x4: 76062306a36Sopenharmony_ci ck_dpll1.rate /= 2; 76162306a36Sopenharmony_ci break; 76262306a36Sopenharmony_ci default: 76362306a36Sopenharmony_ci ck_dpll1.rate /= 4; 76462306a36Sopenharmony_ci break; 76562306a36Sopenharmony_ci } 76662306a36Sopenharmony_ci } 76762306a36Sopenharmony_ci } 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci /* Amstrad Delta wants BCLK high when inactive */ 77062306a36Sopenharmony_ci if (machine_is_ams_delta()) 77162306a36Sopenharmony_ci omap_writel(omap_readl(ULPD_CLOCK_CTRL) | 77262306a36Sopenharmony_ci (1 << SDW_MCLK_INV_BIT), 77362306a36Sopenharmony_ci ULPD_CLOCK_CTRL); 77462306a36Sopenharmony_ci 77562306a36Sopenharmony_ci /* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */ 77662306a36Sopenharmony_ci omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL); 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci /* Put DSP/MPUI into reset until needed */ 77962306a36Sopenharmony_ci omap_writew(0, ARM_RSTCT1); 78062306a36Sopenharmony_ci omap_writew(1, ARM_RSTCT2); 78162306a36Sopenharmony_ci omap_writew(0x400, ARM_IDLECT1); 78262306a36Sopenharmony_ci 78362306a36Sopenharmony_ci /* 78462306a36Sopenharmony_ci * According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8) 78562306a36Sopenharmony_ci * of the ARM_IDLECT2 register must be set to zero. The power-on 78662306a36Sopenharmony_ci * default value of this bit is one. 78762306a36Sopenharmony_ci */ 78862306a36Sopenharmony_ci omap_writew(0x0000, ARM_IDLECT2); /* Turn LCD clock off also */ 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_ci for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++) { 79162306a36Sopenharmony_ci if (!(c->cpu & cpu_mask)) 79262306a36Sopenharmony_ci continue; 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci if (c->lk.clk_hw->init) { /* NULL if provider already registered */ 79562306a36Sopenharmony_ci const struct clk_init_data *init = c->lk.clk_hw->init; 79662306a36Sopenharmony_ci const char *name = c->lk.clk_hw->init->name; 79762306a36Sopenharmony_ci int err; 79862306a36Sopenharmony_ci 79962306a36Sopenharmony_ci err = clk_hw_register(NULL, c->lk.clk_hw); 80062306a36Sopenharmony_ci if (err < 0) { 80162306a36Sopenharmony_ci pr_err("failed to register clock \"%s\"! (%d)\n", name, err); 80262306a36Sopenharmony_ci /* may be tried again, restore init data */ 80362306a36Sopenharmony_ci c->lk.clk_hw->init = init; 80462306a36Sopenharmony_ci continue; 80562306a36Sopenharmony_ci } 80662306a36Sopenharmony_ci } 80762306a36Sopenharmony_ci 80862306a36Sopenharmony_ci clk_hw_register_clkdev(c->lk.clk_hw, c->lk.con_id, c->lk.dev_id); 80962306a36Sopenharmony_ci } 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_ci omap1_show_rates(); 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci return 0; 81462306a36Sopenharmony_ci} 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_ci#define OMAP1_DPLL1_SANE_VALUE 60000000 81762306a36Sopenharmony_ci 81862306a36Sopenharmony_civoid __init omap1_clk_late_init(void) 81962306a36Sopenharmony_ci{ 82062306a36Sopenharmony_ci unsigned long rate = ck_dpll1.rate; 82162306a36Sopenharmony_ci 82262306a36Sopenharmony_ci /* Find the highest supported frequency and enable it */ 82362306a36Sopenharmony_ci if (omap1_select_table_rate(&virtual_ck_mpu, ~0, arm_ck.rate)) { 82462306a36Sopenharmony_ci pr_err("System frequencies not set, using default. Check your config.\n"); 82562306a36Sopenharmony_ci /* 82662306a36Sopenharmony_ci * Reprogramming the DPLL is tricky, it must be done from SRAM. 82762306a36Sopenharmony_ci */ 82862306a36Sopenharmony_ci omap_sram_reprogram_clock(0x2290, 0x0005); 82962306a36Sopenharmony_ci ck_dpll1.rate = OMAP1_DPLL1_SANE_VALUE; 83062306a36Sopenharmony_ci } 83162306a36Sopenharmony_ci propagate_rate(&ck_dpll1); 83262306a36Sopenharmony_ci omap1_show_rates(); 83362306a36Sopenharmony_ci loops_per_jiffy = cpufreq_scale(loops_per_jiffy, rate, ck_dpll1.rate); 83462306a36Sopenharmony_ci} 835