blob: 28fafcb6bf5762cb25d6d158c3ad61088c85d60f [file] [log] [blame]
Manu Gautam5143b252012-01-05 19:25:23 -08001/* Copyright (c) 2009-2012, Code Aurora Forum. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/kernel.h>
14#include <linux/init.h>
15#include <linux/err.h>
16#include <linux/ctype.h>
17#include <linux/bitops.h>
18#include <linux/io.h>
19#include <linux/spinlock.h>
20#include <linux/delay.h>
21#include <linux/clk.h>
22
23#include <asm/clkdev.h>
24#include <asm/mach-types.h>
25
26#include <mach/msm_iomap.h>
27#include <mach/clk.h>
28#include <mach/rpm-regulator.h>
Stephen Boyd94625ef2011-07-12 17:06:01 -070029#include <mach/socinfo.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070030
31#include "clock-local.h"
32#include "clock-rpm.h"
33#include "clock-voter.h"
34#include "clock-dss-8960.h"
35#include "devices.h"
Vikram Mulukutla681d8682012-03-09 23:56:20 -080036#include "clock-pll.h"
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070037
38#define REG(off) (MSM_CLK_CTL_BASE + (off))
39#define REG_MM(off) (MSM_MMSS_CLK_CTL_BASE + (off))
40#define REG_LPA(off) (MSM_LPASS_CLK_CTL_BASE + (off))
Matt Wagantall8b38f942011-08-02 18:23:18 -070041#define REG_GCC(off) (MSM_APCS_GCC_BASE + (off))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070042
43/* Peripheral clock registers. */
Stephen Boyda52d7e32011-11-10 11:59:00 -080044#define ADM0_PBUS_CLK_CTL_REG REG(0x2208)
Tianyi Gou352955d2012-05-18 19:44:01 -070045#define SFAB_SATA_S_HCLK_CTL_REG REG(0x2480)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070046#define CE1_HCLK_CTL_REG REG(0x2720)
47#define CE1_CORE_CLK_CTL_REG REG(0x2724)
Tianyi Gou05e01102012-02-08 22:15:49 -080048#define PRNG_CLK_NS_REG REG(0x2E80)
Tianyi Gou41515e22011-09-01 19:37:43 -070049#define CE3_HCLK_CTL_REG REG(0x36C4)
50#define CE3_CORE_CLK_CTL_REG REG(0x36CC)
51#define CE3_CLK_SRC_NS_REG REG(0x36C0)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070052#define DMA_BAM_HCLK_CTL REG(0x25C0)
Tianyi Gou6613de52012-01-27 17:57:53 -080053#define CLK_HALT_AFAB_SFAB_STATEA_REG REG(0x2FC0)
Tianyi Gou41515e22011-09-01 19:37:43 -070054#define CLK_HALT_AFAB_SFAB_STATEB_REG REG(0x2FC4)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070055#define CLK_HALT_CFPB_STATEA_REG REG(0x2FCC)
56#define CLK_HALT_CFPB_STATEB_REG REG(0x2FD0)
57#define CLK_HALT_CFPB_STATEC_REG REG(0x2FD4)
58#define CLK_HALT_DFAB_STATE_REG REG(0x2FC8)
Tianyi Gou41515e22011-09-01 19:37:43 -070059/* 8064 name CLK_HALT_GSS_KPSS_MISC_STATE_REG */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070060#define CLK_HALT_MSS_SMPSS_MISC_STATE_REG REG(0x2FDC)
61#define CLK_HALT_SFPB_MISC_STATE_REG REG(0x2FD8)
Stephen Boyd973e4ba2011-07-12 17:06:01 -070062#define CLK_HALT_AFAB_SFAB_STATEB_REG REG(0x2FC4)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070063#define CLK_TEST_REG REG(0x2FA0)
Matt Wagantall7625a4c2011-11-01 16:17:53 -070064#define GPn_MD_REG(n) REG(0x2D00+(0x20*(n)))
65#define GPn_NS_REG(n) REG(0x2D24+(0x20*(n)))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070066#define GSBIn_HCLK_CTL_REG(n) REG(0x29C0+(0x20*((n)-1)))
67#define GSBIn_QUP_APPS_MD_REG(n) REG(0x29C8+(0x20*((n)-1)))
68#define GSBIn_QUP_APPS_NS_REG(n) REG(0x29CC+(0x20*((n)-1)))
69#define GSBIn_RESET_REG(n) REG(0x29DC+(0x20*((n)-1)))
70#define GSBIn_UART_APPS_MD_REG(n) REG(0x29D0+(0x20*((n)-1)))
71#define GSBIn_UART_APPS_NS_REG(n) REG(0x29D4+(0x20*((n)-1)))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070072#define PDM_CLK_NS_REG REG(0x2CC0)
Tianyi Gou41515e22011-09-01 19:37:43 -070073/* 8064 name BB_PLL_ENA_APCS_REG */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070074#define BB_PLL_ENA_SC0_REG REG(0x34C0)
Tianyi Gou59608a72012-01-31 22:19:30 -080075#define BB_PLL_ENA_RPM_REG REG(0x34A0)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070076#define BB_PLL0_STATUS_REG REG(0x30D8)
77#define BB_PLL5_STATUS_REG REG(0x30F8)
78#define BB_PLL6_STATUS_REG REG(0x3118)
79#define BB_PLL7_STATUS_REG REG(0x3138)
80#define BB_PLL8_L_VAL_REG REG(0x3144)
81#define BB_PLL8_M_VAL_REG REG(0x3148)
82#define BB_PLL8_MODE_REG REG(0x3140)
83#define BB_PLL8_N_VAL_REG REG(0x314C)
84#define BB_PLL8_STATUS_REG REG(0x3158)
85#define BB_PLL8_CONFIG_REG REG(0x3154)
86#define BB_PLL8_TEST_CTL_REG REG(0x3150)
Stephen Boyd94625ef2011-07-12 17:06:01 -070087#define BB_MMCC_PLL2_MODE_REG REG(0x3160)
88#define BB_MMCC_PLL2_TEST_CTL_REG REG(0x3170)
Tianyi Gou41515e22011-09-01 19:37:43 -070089#define BB_PLL14_MODE_REG REG(0x31C0)
90#define BB_PLL14_L_VAL_REG REG(0x31C4)
91#define BB_PLL14_M_VAL_REG REG(0x31C8)
92#define BB_PLL14_N_VAL_REG REG(0x31CC)
93#define BB_PLL14_TEST_CTL_REG REG(0x31D0)
94#define BB_PLL14_CONFIG_REG REG(0x31D4)
Stephen Boyd94625ef2011-07-12 17:06:01 -070095#define BB_PLL14_STATUS_REG REG(0x31D8)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070096#define PLLTEST_PAD_CFG_REG REG(0x2FA4)
97#define PMEM_ACLK_CTL_REG REG(0x25A0)
98#define RINGOSC_NS_REG REG(0x2DC0)
99#define RINGOSC_STATUS_REG REG(0x2DCC)
100#define RINGOSC_TCXO_CTL_REG REG(0x2DC4)
Stephen Boyda52d7e32011-11-10 11:59:00 -0800101#define RPM_MSG_RAM_HCLK_CTL_REG REG(0x27E0)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700102#define SC0_U_CLK_BRANCH_ENA_VOTE_REG REG(0x3080)
103#define SDCn_APPS_CLK_MD_REG(n) REG(0x2828+(0x20*((n)-1)))
104#define SDCn_APPS_CLK_NS_REG(n) REG(0x282C+(0x20*((n)-1)))
105#define SDCn_HCLK_CTL_REG(n) REG(0x2820+(0x20*((n)-1)))
106#define SDCn_RESET_REG(n) REG(0x2830+(0x20*((n)-1)))
107#define SLIMBUS_XO_SRC_CLK_CTL_REG REG(0x2628)
108#define TSIF_HCLK_CTL_REG REG(0x2700)
109#define TSIF_REF_CLK_MD_REG REG(0x270C)
110#define TSIF_REF_CLK_NS_REG REG(0x2710)
111#define TSSC_CLK_CTL_REG REG(0x2CA0)
Tianyi Gou352955d2012-05-18 19:44:01 -0700112#define SATA_HCLK_CTL_REG REG(0x2C00)
Tianyi Gou41515e22011-09-01 19:37:43 -0700113#define SATA_CLK_SRC_NS_REG REG(0x2C08)
114#define SATA_RXOOB_CLK_CTL_REG REG(0x2C0C)
115#define SATA_PMALIVE_CLK_CTL_REG REG(0x2C10)
116#define SATA_PHY_REF_CLK_CTL_REG REG(0x2C14)
Tianyi Gou352955d2012-05-18 19:44:01 -0700117#define SATA_ACLK_CTL_REG REG(0x2C20)
Tianyi Gou41515e22011-09-01 19:37:43 -0700118#define SATA_PHY_CFG_CLK_CTL_REG REG(0x2C40)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700119#define USB_FSn_HCLK_CTL_REG(n) REG(0x2960+(0x20*((n)-1)))
120#define USB_FSn_RESET_REG(n) REG(0x2974+(0x20*((n)-1)))
121#define USB_FSn_SYSTEM_CLK_CTL_REG(n) REG(0x296C+(0x20*((n)-1)))
122#define USB_FSn_XCVR_FS_CLK_MD_REG(n) REG(0x2964+(0x20*((n)-1)))
123#define USB_FSn_XCVR_FS_CLK_NS_REG(n) REG(0x2968+(0x20*((n)-1)))
124#define USB_HS1_HCLK_CTL_REG REG(0x2900)
Tianyi Gou41515e22011-09-01 19:37:43 -0700125#define USB_HS1_HCLK_FS_REG REG(0x2904)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700126#define USB_HS1_RESET_REG REG(0x2910)
127#define USB_HS1_XCVR_FS_CLK_MD_REG REG(0x2908)
128#define USB_HS1_XCVR_FS_CLK_NS_REG REG(0x290C)
Tianyi Gou41515e22011-09-01 19:37:43 -0700129#define USB_HS3_HCLK_CTL_REG REG(0x3700)
130#define USB_HS3_HCLK_FS_REG REG(0x3704)
131#define USB_HS3_RESET_REG REG(0x3710)
132#define USB_HS3_XCVR_FS_CLK_MD_REG REG(0X3708)
133#define USB_HS3_XCVR_FS_CLK_NS_REG REG(0X370C)
134#define USB_HS4_HCLK_CTL_REG REG(0x3720)
135#define USB_HS4_HCLK_FS_REG REG(0x3724)
136#define USB_HS4_RESET_REG REG(0x3730)
137#define USB_HS4_XCVR_FS_CLK_MD_REG REG(0X3728)
138#define USB_HS4_XCVR_FS_CLK_NS_REG REG(0X372C)
Stephen Boyd94625ef2011-07-12 17:06:01 -0700139#define USB_HSIC_HCLK_CTL_REG REG(0x2920)
140#define USB_HSIC_HSIC_CLK_CTL_REG REG(0x2B44)
141#define USB_HSIC_HSIC_CLK_SRC_CTL_REG REG(0x2B40)
142#define USB_HSIC_HSIO_CAL_CLK_CTL_REG REG(0x2B48)
143#define USB_HSIC_RESET_REG REG(0x2934)
144#define USB_HSIC_SYSTEM_CLK_CTL_REG REG(0x292C)
145#define USB_HSIC_XCVR_FS_CLK_MD_REG REG(0x2924)
146#define USB_HSIC_XCVR_FS_CLK_NS_REG REG(0x2928)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700147#define USB_PHY0_RESET_REG REG(0x2E20)
Tianyi Gou41515e22011-09-01 19:37:43 -0700148#define PCIE_ALT_REF_CLK_NS_REG REG(0x3860)
Tianyi Gou6613de52012-01-27 17:57:53 -0800149#define PCIE_ACLK_CTL_REG REG(0x22C0)
Tianyi Gou41515e22011-09-01 19:37:43 -0700150#define PCIE_HCLK_CTL_REG REG(0x22CC)
Tianyi Gou6613de52012-01-27 17:57:53 -0800151#define PCIE_PCLK_CTL_REG REG(0x22D0)
Tianyi Gou41515e22011-09-01 19:37:43 -0700152#define GPLL1_MODE_REG REG(0x3160)
153#define GPLL1_L_VAL_REG REG(0x3164)
154#define GPLL1_M_VAL_REG REG(0x3168)
155#define GPLL1_N_VAL_REG REG(0x316C)
156#define GPLL1_CONFIG_REG REG(0x3174)
157#define GPLL1_STATUS_REG REG(0x3178)
158#define PXO_SRC_CLK_CTL_REG REG(0x2EA0)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700159
160/* Multimedia clock registers. */
161#define AHB_EN_REG REG_MM(0x0008)
162#define AHB_EN2_REG REG_MM(0x0038)
Tianyi Gou41515e22011-09-01 19:37:43 -0700163#define AHB_EN3_REG REG_MM(0x0248)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700164#define AHB_NS_REG REG_MM(0x0004)
165#define AXI_NS_REG REG_MM(0x0014)
Stephen Boyd94625ef2011-07-12 17:06:01 -0700166#define CAMCLK0_NS_REG REG_MM(0x0148)
167#define CAMCLK0_CC_REG REG_MM(0x0140)
168#define CAMCLK0_MD_REG REG_MM(0x0144)
169#define CAMCLK1_NS_REG REG_MM(0x015C)
170#define CAMCLK1_CC_REG REG_MM(0x0154)
171#define CAMCLK1_MD_REG REG_MM(0x0158)
172#define CAMCLK2_NS_REG REG_MM(0x0228)
173#define CAMCLK2_CC_REG REG_MM(0x0220)
174#define CAMCLK2_MD_REG REG_MM(0x0224)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700175#define CSI0_NS_REG REG_MM(0x0048)
176#define CSI0_CC_REG REG_MM(0x0040)
177#define CSI0_MD_REG REG_MM(0x0044)
178#define CSI1_NS_REG REG_MM(0x0010)
179#define CSI1_CC_REG REG_MM(0x0024)
180#define CSI1_MD_REG REG_MM(0x0028)
Stephen Boyd94625ef2011-07-12 17:06:01 -0700181#define CSI2_NS_REG REG_MM(0x0234)
182#define CSI2_CC_REG REG_MM(0x022C)
183#define CSI2_MD_REG REG_MM(0x0230)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700184#define CSIPHYTIMER_CC_REG REG_MM(0x0160)
185#define CSIPHYTIMER_MD_REG REG_MM(0x0164)
186#define CSIPHYTIMER_NS_REG REG_MM(0x0168)
187#define DSI1_BYTE_NS_REG REG_MM(0x00B0)
188#define DSI1_BYTE_CC_REG REG_MM(0x0090)
189#define DSI2_BYTE_NS_REG REG_MM(0x00BC)
190#define DSI2_BYTE_CC_REG REG_MM(0x00B4)
191#define DSI1_ESC_NS_REG REG_MM(0x011C)
192#define DSI1_ESC_CC_REG REG_MM(0x00CC)
193#define DSI2_ESC_NS_REG REG_MM(0x0150)
194#define DSI2_ESC_CC_REG REG_MM(0x013C)
195#define DSI_PIXEL_CC_REG REG_MM(0x0130)
196#define DSI2_PIXEL_CC_REG REG_MM(0x0094)
Patrick Dalye6f489042012-07-11 15:29:15 -0700197#define DSI2_PIXEL_CC2_REG REG_MM(0x0264)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700198#define DBG_BUS_VEC_A_REG REG_MM(0x01C8)
199#define DBG_BUS_VEC_B_REG REG_MM(0x01CC)
200#define DBG_BUS_VEC_C_REG REG_MM(0x01D0)
201#define DBG_BUS_VEC_D_REG REG_MM(0x01D4)
202#define DBG_BUS_VEC_E_REG REG_MM(0x01D8)
203#define DBG_BUS_VEC_F_REG REG_MM(0x01DC)
204#define DBG_BUS_VEC_G_REG REG_MM(0x01E0)
205#define DBG_BUS_VEC_H_REG REG_MM(0x01E4)
206#define DBG_BUS_VEC_I_REG REG_MM(0x01E8)
Tianyi Gou41515e22011-09-01 19:37:43 -0700207#define DBG_BUS_VEC_J_REG REG_MM(0x0240)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700208#define DBG_CFG_REG_HS_REG REG_MM(0x01B4)
209#define DBG_CFG_REG_LS_REG REG_MM(0x01B8)
210#define GFX2D0_CC_REG REG_MM(0x0060)
211#define GFX2D0_MD0_REG REG_MM(0x0064)
212#define GFX2D0_MD1_REG REG_MM(0x0068)
213#define GFX2D0_NS_REG REG_MM(0x0070)
214#define GFX2D1_CC_REG REG_MM(0x0074)
215#define GFX2D1_MD0_REG REG_MM(0x0078)
216#define GFX2D1_MD1_REG REG_MM(0x006C)
217#define GFX2D1_NS_REG REG_MM(0x007C)
218#define GFX3D_CC_REG REG_MM(0x0080)
219#define GFX3D_MD0_REG REG_MM(0x0084)
220#define GFX3D_MD1_REG REG_MM(0x0088)
221#define GFX3D_NS_REG REG_MM(0x008C)
222#define IJPEG_CC_REG REG_MM(0x0098)
223#define IJPEG_MD_REG REG_MM(0x009C)
224#define IJPEG_NS_REG REG_MM(0x00A0)
225#define JPEGD_CC_REG REG_MM(0x00A4)
226#define JPEGD_NS_REG REG_MM(0x00AC)
Tianyi Gou41515e22011-09-01 19:37:43 -0700227#define VCAP_CC_REG REG_MM(0x0178)
228#define VCAP_NS_REG REG_MM(0x021C)
229#define VCAP_MD0_REG REG_MM(0x01EC)
230#define VCAP_MD1_REG REG_MM(0x0218)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700231#define MAXI_EN_REG REG_MM(0x0018)
232#define MAXI_EN2_REG REG_MM(0x0020)
233#define MAXI_EN3_REG REG_MM(0x002C)
234#define MAXI_EN4_REG REG_MM(0x0114)
Tianyi Gou41515e22011-09-01 19:37:43 -0700235#define MAXI_EN5_REG REG_MM(0x0244)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700236#define MDP_CC_REG REG_MM(0x00C0)
237#define MDP_LUT_CC_REG REG_MM(0x016C)
238#define MDP_MD0_REG REG_MM(0x00C4)
239#define MDP_MD1_REG REG_MM(0x00C8)
240#define MDP_NS_REG REG_MM(0x00D0)
241#define MISC_CC_REG REG_MM(0x0058)
242#define MISC_CC2_REG REG_MM(0x005C)
Stephen Boyd94625ef2011-07-12 17:06:01 -0700243#define MISC_CC3_REG REG_MM(0x0238)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700244#define MM_PLL1_MODE_REG REG_MM(0x031C)
Tianyi Gou41515e22011-09-01 19:37:43 -0700245#define MM_PLL1_L_VAL_REG REG_MM(0x0320)
246#define MM_PLL1_M_VAL_REG REG_MM(0x0324)
247#define MM_PLL1_N_VAL_REG REG_MM(0x0328)
248#define MM_PLL1_CONFIG_REG REG_MM(0x032C)
249#define MM_PLL1_TEST_CTL_REG REG_MM(0x0330)
250#define MM_PLL1_STATUS_REG REG_MM(0x0334)
251#define MM_PLL3_MODE_REG REG_MM(0x0338)
Tianyi Gou621f8742011-09-01 21:45:01 -0700252#define MM_PLL3_L_VAL_REG REG_MM(0x033C)
253#define MM_PLL3_M_VAL_REG REG_MM(0x0340)
254#define MM_PLL3_N_VAL_REG REG_MM(0x0344)
255#define MM_PLL3_CONFIG_REG REG_MM(0x0348)
256#define MM_PLL3_TEST_CTL_REG REG_MM(0x034C)
257#define MM_PLL3_STATUS_REG REG_MM(0x0350)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700258#define ROT_CC_REG REG_MM(0x00E0)
259#define ROT_NS_REG REG_MM(0x00E8)
260#define SAXI_EN_REG REG_MM(0x0030)
261#define SW_RESET_AHB_REG REG_MM(0x020C)
262#define SW_RESET_AHB2_REG REG_MM(0x0200)
263#define SW_RESET_ALL_REG REG_MM(0x0204)
264#define SW_RESET_AXI_REG REG_MM(0x0208)
265#define SW_RESET_CORE_REG REG_MM(0x0210)
Stephen Boyd94625ef2011-07-12 17:06:01 -0700266#define SW_RESET_CORE2_REG REG_MM(0x0214)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700267#define TV_CC_REG REG_MM(0x00EC)
268#define TV_CC2_REG REG_MM(0x0124)
269#define TV_MD_REG REG_MM(0x00F0)
270#define TV_NS_REG REG_MM(0x00F4)
271#define VCODEC_CC_REG REG_MM(0x00F8)
272#define VCODEC_MD0_REG REG_MM(0x00FC)
273#define VCODEC_MD1_REG REG_MM(0x0128)
274#define VCODEC_NS_REG REG_MM(0x0100)
275#define VFE_CC_REG REG_MM(0x0104)
276#define VFE_MD_REG REG_MM(0x0108)
277#define VFE_NS_REG REG_MM(0x010C)
Stephen Boyd94625ef2011-07-12 17:06:01 -0700278#define VFE_CC2_REG REG_MM(0x023C)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700279#define VPE_CC_REG REG_MM(0x0110)
280#define VPE_NS_REG REG_MM(0x0118)
281
282/* Low-power Audio clock registers. */
Stephen Boyd3939c8d2011-08-29 17:36:22 -0700283#define LCC_CLK_HS_DEBUG_CFG_REG REG_LPA(0x00A4)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700284#define LCC_CLK_LS_DEBUG_CFG_REG REG_LPA(0x00A8)
285#define LCC_CODEC_I2S_MIC_MD_REG REG_LPA(0x0064)
286#define LCC_CODEC_I2S_MIC_NS_REG REG_LPA(0x0060)
287#define LCC_CODEC_I2S_MIC_STATUS_REG REG_LPA(0x0068)
288#define LCC_CODEC_I2S_SPKR_MD_REG REG_LPA(0x0070)
289#define LCC_CODEC_I2S_SPKR_NS_REG REG_LPA(0x006C)
290#define LCC_CODEC_I2S_SPKR_STATUS_REG REG_LPA(0x0074)
291#define LCC_MI2S_MD_REG REG_LPA(0x004C)
292#define LCC_MI2S_NS_REG REG_LPA(0x0048)
293#define LCC_MI2S_STATUS_REG REG_LPA(0x0050)
294#define LCC_PCM_MD_REG REG_LPA(0x0058)
295#define LCC_PCM_NS_REG REG_LPA(0x0054)
296#define LCC_PCM_STATUS_REG REG_LPA(0x005C)
Tianyi Gouc29c3242011-10-12 21:02:15 -0700297#define LCC_PLL0_MODE_REG REG_LPA(0x0000)
298#define LCC_PLL0_L_VAL_REG REG_LPA(0x0004)
299#define LCC_PLL0_M_VAL_REG REG_LPA(0x0008)
300#define LCC_PLL0_N_VAL_REG REG_LPA(0x000C)
301#define LCC_PLL0_CONFIG_REG REG_LPA(0x0014)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700302#define LCC_PLL0_STATUS_REG REG_LPA(0x0018)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700303#define LCC_SPARE_I2S_MIC_MD_REG REG_LPA(0x007C)
304#define LCC_SPARE_I2S_MIC_NS_REG REG_LPA(0x0078)
305#define LCC_SPARE_I2S_MIC_STATUS_REG REG_LPA(0x0080)
306#define LCC_SPARE_I2S_SPKR_MD_REG REG_LPA(0x0088)
307#define LCC_SPARE_I2S_SPKR_NS_REG REG_LPA(0x0084)
308#define LCC_SPARE_I2S_SPKR_STATUS_REG REG_LPA(0x008C)
309#define LCC_SLIMBUS_NS_REG REG_LPA(0x00CC)
310#define LCC_SLIMBUS_MD_REG REG_LPA(0x00D0)
311#define LCC_SLIMBUS_STATUS_REG REG_LPA(0x00D4)
312#define LCC_AHBEX_BRANCH_CTL_REG REG_LPA(0x00E4)
Tianyi Gouc29c3242011-10-12 21:02:15 -0700313#define LCC_PRI_PLL_CLK_CTL_REG REG_LPA(0x00C4)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700314
Matt Wagantall8b38f942011-08-02 18:23:18 -0700315#define GCC_APCS_CLK_DIAG REG_GCC(0x001C)
316
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700317/* MUX source input identifiers. */
318#define pxo_to_bb_mux 0
Matt Wagantall7625a4c2011-11-01 16:17:53 -0700319#define cxo_to_bb_mux 5
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700320#define pll0_to_bb_mux 2
321#define pll8_to_bb_mux 3
322#define pll6_to_bb_mux 4
323#define gnd_to_bb_mux 5
Stephen Boyd94625ef2011-07-12 17:06:01 -0700324#define pll3_to_bb_mux 6
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700325#define pxo_to_mm_mux 0
326#define pll1_to_mm_mux 1
Tianyi Gou41515e22011-09-01 19:37:43 -0700327#define pll2_to_mm_mux 1 /* or MMCC_PLL1 */
328#define pll8_to_mm_mux 2 /* or GCC_PERF */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700329#define pll0_to_mm_mux 3
Tianyi Gou41515e22011-09-01 19:37:43 -0700330#define pll15_to_mm_mux 3 /* or MM_PLL3 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700331#define gnd_to_mm_mux 4
Stephen Boyd7a776cd2011-10-20 12:46:04 -0700332#define pll3_to_mm_mux 3 /* or MMCC_PLL2 */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700333#define hdmi_pll_to_mm_mux 3
334#define cxo_to_xo_mux 0
335#define pxo_to_xo_mux 1
336#define gnd_to_xo_mux 3
337#define pxo_to_lpa_mux 0
338#define cxo_to_lpa_mux 1
339#define pll4_to_lpa_mux 2
340#define gnd_to_lpa_mux 6
Tianyi Gou41515e22011-09-01 19:37:43 -0700341#define pxo_to_pcie_mux 0
342#define pll3_to_pcie_mux 1
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700343
344/* Test Vector Macros */
345#define TEST_TYPE_PER_LS 1
346#define TEST_TYPE_PER_HS 2
347#define TEST_TYPE_MM_LS 3
348#define TEST_TYPE_MM_HS 4
349#define TEST_TYPE_LPA 5
Matt Wagantall8b38f942011-08-02 18:23:18 -0700350#define TEST_TYPE_CPUL2 6
Stephen Boyd3939c8d2011-08-29 17:36:22 -0700351#define TEST_TYPE_LPA_HS 7
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700352#define TEST_TYPE_SHIFT 24
353#define TEST_CLK_SEL_MASK BM(23, 0)
354#define TEST_VECTOR(s, t) (((t) << TEST_TYPE_SHIFT) | BVAL(23, 0, (s)))
355#define TEST_PER_LS(s) TEST_VECTOR((s), TEST_TYPE_PER_LS)
356#define TEST_PER_HS(s) TEST_VECTOR((s), TEST_TYPE_PER_HS)
357#define TEST_MM_LS(s) TEST_VECTOR((s), TEST_TYPE_MM_LS)
358#define TEST_MM_HS(s) TEST_VECTOR((s), TEST_TYPE_MM_HS)
359#define TEST_LPA(s) TEST_VECTOR((s), TEST_TYPE_LPA)
Stephen Boyd3939c8d2011-08-29 17:36:22 -0700360#define TEST_LPA_HS(s) TEST_VECTOR((s), TEST_TYPE_LPA_HS)
Matt Wagantall8b38f942011-08-02 18:23:18 -0700361#define TEST_CPUL2(s) TEST_VECTOR((s), TEST_TYPE_CPUL2)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700362
363#define MN_MODE_DUAL_EDGE 0x2
364
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700365struct pll_rate {
366 const uint32_t l_val;
367 const uint32_t m_val;
368 const uint32_t n_val;
369 const uint32_t vco;
370 const uint32_t post_div;
371 const uint32_t i_bits;
372};
373#define PLL_RATE(l, m, n, v, d, i) { l, m, n, v, (d>>1), i }
374
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700375enum vdd_dig_levels {
376 VDD_DIG_NONE,
377 VDD_DIG_LOW,
378 VDD_DIG_NOMINAL,
379 VDD_DIG_HIGH
380};
381
Saravana Kannan298ec392012-02-08 19:21:47 -0800382static int set_vdd_dig_8960(struct clk_vdd_class *vdd_class, int level)
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700383{
384 static const int vdd_uv[] = {
385 [VDD_DIG_NONE] = 0,
386 [VDD_DIG_LOW] = 945000,
387 [VDD_DIG_NOMINAL] = 1050000,
388 [VDD_DIG_HIGH] = 1150000
389 };
Saravana Kannan298ec392012-02-08 19:21:47 -0800390 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_S3, RPM_VREG_VOTER3,
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700391 vdd_uv[level], 1150000, 1);
392}
393
Saravana Kannan298ec392012-02-08 19:21:47 -0800394static DEFINE_VDD_CLASS(vdd_dig, set_vdd_dig_8960);
395
Patrick Dalyc9f51b92012-08-27 16:10:26 -0700396static int rpm_vreg_dig_8930 = RPM_VREG_ID_PM8038_VDD_DIG_CORNER;
Saravana Kannan298ec392012-02-08 19:21:47 -0800397static int set_vdd_dig_8930(struct clk_vdd_class *vdd_class, int level)
398{
Saravana Kannanebaa3ac2012-02-08 19:55:44 -0800399 static const int vdd_corner[] = {
400 [VDD_DIG_NONE] = RPM_VREG_CORNER_NONE,
401 [VDD_DIG_LOW] = RPM_VREG_CORNER_LOW,
402 [VDD_DIG_NOMINAL] = RPM_VREG_CORNER_NOMINAL,
403 [VDD_DIG_HIGH] = RPM_VREG_CORNER_HIGH,
Saravana Kannan298ec392012-02-08 19:21:47 -0800404 };
Patrick Dalyc9f51b92012-08-27 16:10:26 -0700405 return rpm_vreg_set_voltage(rpm_vreg_dig_8930,
Saravana Kannanebaa3ac2012-02-08 19:55:44 -0800406 RPM_VREG_VOTER3,
407 vdd_corner[level],
408 RPM_VREG_CORNER_HIGH, 1);
Saravana Kannan298ec392012-02-08 19:21:47 -0800409}
Matt Wagantalle18bbc82011-10-06 10:07:28 -0700410
411#define VDD_DIG_FMAX_MAP1(l1, f1) \
412 .vdd_class = &vdd_dig, \
413 .fmax[VDD_DIG_##l1] = (f1)
414#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
415 .vdd_class = &vdd_dig, \
416 .fmax[VDD_DIG_##l1] = (f1), \
417 .fmax[VDD_DIG_##l2] = (f2)
418#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \
419 .vdd_class = &vdd_dig, \
420 .fmax[VDD_DIG_##l1] = (f1), \
421 .fmax[VDD_DIG_##l2] = (f2), \
422 .fmax[VDD_DIG_##l3] = (f3)
423
Matt Wagantall82feaa12012-07-09 10:54:49 -0700424enum vdd_sr2_hdmi_pll_levels {
425 VDD_SR2_HDMI_PLL_OFF,
426 VDD_SR2_HDMI_PLL_ON
Matt Wagantallc57577d2011-10-06 17:06:53 -0700427};
428
Matt Wagantall82feaa12012-07-09 10:54:49 -0700429static int set_vdd_sr2_hdmi_pll_8960(struct clk_vdd_class *vdd_class, int level)
Matt Wagantallc57577d2011-10-06 17:06:53 -0700430{
Tianyi Goubf3d0b12012-01-23 14:37:28 -0800431 int rc = 0;
Saravana Kannan298ec392012-02-08 19:21:47 -0800432
Matt Wagantall82feaa12012-07-09 10:54:49 -0700433 if (level == VDD_SR2_HDMI_PLL_OFF) {
Saravana Kannan298ec392012-02-08 19:21:47 -0800434 rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_L23,
435 RPM_VREG_VOTER3, 0, 0, 1);
436 if (rc)
437 return rc;
438 rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_S8,
439 RPM_VREG_VOTER3, 0, 0, 1);
440 if (rc)
441 rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_L23,
442 RPM_VREG_VOTER3, 1800000, 1800000, 1);
Tianyi Goue1faaf22012-01-24 16:07:19 -0800443 } else {
Saravana Kannan298ec392012-02-08 19:21:47 -0800444 rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_S8,
David Collins9a81d6c2012-03-29 15:11:33 -0700445 RPM_VREG_VOTER3, 2050000, 2100000, 1);
Saravana Kannan298ec392012-02-08 19:21:47 -0800446 if (rc)
447 return rc;
448 rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_L23,
449 RPM_VREG_VOTER3, 1800000, 1800000, 1);
450 if (rc)
451 rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_S8,
Tianyi Goubf3d0b12012-01-23 14:37:28 -0800452 RPM_VREG_VOTER3, 0, 0, 1);
Matt Wagantallc57577d2011-10-06 17:06:53 -0700453 }
454
455 return rc;
456}
457
Matt Wagantall82feaa12012-07-09 10:54:49 -0700458static DEFINE_VDD_CLASS(vdd_sr2_hdmi_pll, set_vdd_sr2_hdmi_pll_8960);
Saravana Kannan298ec392012-02-08 19:21:47 -0800459
460static int sr2_lreg_uv[] = {
Matt Wagantall82feaa12012-07-09 10:54:49 -0700461 [VDD_SR2_HDMI_PLL_OFF] = 0,
462 [VDD_SR2_HDMI_PLL_ON] = 1800000,
Saravana Kannan298ec392012-02-08 19:21:47 -0800463};
464
Matt Wagantall82feaa12012-07-09 10:54:49 -0700465static int set_vdd_sr2_hdmi_pll_8064(struct clk_vdd_class *vdd_class, int level)
Saravana Kannan298ec392012-02-08 19:21:47 -0800466{
467 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8921_LVS7, RPM_VREG_VOTER3,
468 sr2_lreg_uv[level], sr2_lreg_uv[level], 1);
469}
470
Patrick Dalyc9f51b92012-08-27 16:10:26 -0700471static int set_vdd_sr2_hdmi_pll_8930_pm8917(struct clk_vdd_class *vdd_class,
472 int level)
473{
474 int rc = 0;
475
476 if (level == VDD_SR2_HDMI_PLL_OFF) {
477 rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_L23,
478 RPM_VREG_VOTER3, 0, 0, 1);
479 if (rc)
480 return rc;
481 rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_S8,
482 RPM_VREG_VOTER3, 0, 0, 1);
483 if (rc)
484 rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_L23,
485 RPM_VREG_VOTER3, 1800000, 1800000, 1);
486 } else {
487 rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_S8,
488 RPM_VREG_VOTER3, 2050000, 2100000, 1);
489 if (rc)
490 return rc;
491 rc = rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_L23,
492 RPM_VREG_VOTER3, 1800000, 1800000, 1);
493 if (rc)
494 rpm_vreg_set_voltage(RPM_VREG_ID_PM8917_S8,
495 RPM_VREG_VOTER3, 0, 0, 1);
496 }
497
498 return rc;
499}
500
Matt Wagantall82feaa12012-07-09 10:54:49 -0700501static int set_vdd_sr2_hdmi_pll_8930(struct clk_vdd_class *vdd_class, int level)
Saravana Kannan298ec392012-02-08 19:21:47 -0800502{
503 return rpm_vreg_set_voltage(RPM_VREG_ID_PM8038_L23, RPM_VREG_VOTER3,
504 sr2_lreg_uv[level], sr2_lreg_uv[level], 1);
505}
Matt Wagantallc57577d2011-10-06 17:06:53 -0700506
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700507/*
508 * Clock Descriptions
509 */
510
Stephen Boyd72a80352012-01-26 15:57:38 -0800511DEFINE_CLK_RPM_BRANCH(pxo_clk, pxo_a_clk, PXO, 27000000);
512DEFINE_CLK_RPM_BRANCH(cxo_clk, cxo_a_clk, CXO, 19200000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700513
514static struct pll_clk pll2_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700515 .mode_reg = MM_PLL1_MODE_REG,
516 .parent = &pxo_clk.c,
517 .c = {
518 .dbg_name = "pll2_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800519 .rate = 800000000,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800520 .ops = &clk_ops_local_pll,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700521 CLK_INIT(pll2_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800522 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700523 },
524};
525
Stephen Boyd94625ef2011-07-12 17:06:01 -0700526static struct pll_clk pll3_clk = {
Stephen Boyd94625ef2011-07-12 17:06:01 -0700527 .mode_reg = BB_MMCC_PLL2_MODE_REG,
528 .parent = &pxo_clk.c,
529 .c = {
530 .dbg_name = "pll3_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800531 .rate = 1200000000,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800532 .ops = &clk_ops_local_pll,
Matt Wagantall82feaa12012-07-09 10:54:49 -0700533 .vdd_class = &vdd_sr2_hdmi_pll,
534 .fmax[VDD_SR2_HDMI_PLL_ON] = ULONG_MAX,
Stephen Boyd94625ef2011-07-12 17:06:01 -0700535 CLK_INIT(pll3_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800536 .warned = true,
Stephen Boyd94625ef2011-07-12 17:06:01 -0700537 },
538};
539
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700540static struct pll_vote_clk pll4_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700541 .en_reg = BB_PLL_ENA_SC0_REG,
542 .en_mask = BIT(4),
543 .status_reg = LCC_PLL0_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800544 .status_mask = BIT(16),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700545 .parent = &pxo_clk.c,
546 .c = {
547 .dbg_name = "pll4_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800548 .rate = 393216000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700549 .ops = &clk_ops_pll_vote,
550 CLK_INIT(pll4_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800551 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700552 },
553};
554
555static struct pll_vote_clk pll8_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700556 .en_reg = BB_PLL_ENA_SC0_REG,
557 .en_mask = BIT(8),
558 .status_reg = BB_PLL8_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800559 .status_mask = BIT(16),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700560 .parent = &pxo_clk.c,
561 .c = {
562 .dbg_name = "pll8_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800563 .rate = 384000000,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700564 .ops = &clk_ops_pll_vote,
565 CLK_INIT(pll8_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800566 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700567 },
568};
569
Stephen Boyd94625ef2011-07-12 17:06:01 -0700570static struct pll_vote_clk pll14_clk = {
Stephen Boyd94625ef2011-07-12 17:06:01 -0700571 .en_reg = BB_PLL_ENA_SC0_REG,
572 .en_mask = BIT(14),
573 .status_reg = BB_PLL14_STATUS_REG,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800574 .status_mask = BIT(16),
Stephen Boyd94625ef2011-07-12 17:06:01 -0700575 .parent = &pxo_clk.c,
576 .c = {
577 .dbg_name = "pll14_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800578 .rate = 480000000,
Stephen Boyd94625ef2011-07-12 17:06:01 -0700579 .ops = &clk_ops_pll_vote,
580 CLK_INIT(pll14_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800581 .warned = true,
Stephen Boyd94625ef2011-07-12 17:06:01 -0700582 },
583};
584
Tianyi Gou41515e22011-09-01 19:37:43 -0700585static struct pll_clk pll15_clk = {
Tianyi Gou41515e22011-09-01 19:37:43 -0700586 .mode_reg = MM_PLL3_MODE_REG,
587 .parent = &pxo_clk.c,
588 .c = {
589 .dbg_name = "pll15_clk",
Tianyi Gou7949ecb2012-02-14 14:25:32 -0800590 .rate = 975000000,
Vikram Mulukutla681d8682012-03-09 23:56:20 -0800591 .ops = &clk_ops_local_pll,
Tianyi Gou41515e22011-09-01 19:37:43 -0700592 CLK_INIT(pll15_clk.c),
Stephen Boyd3bbf3462012-01-12 00:19:23 -0800593 .warned = true,
Tianyi Gou41515e22011-09-01 19:37:43 -0700594 },
595};
596
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700597/* AXI Interfaces */
598static struct branch_clk gmem_axi_clk = {
599 .b = {
600 .ctl_reg = MAXI_EN_REG,
601 .en_mask = BIT(24),
602 .halt_reg = DBG_BUS_VEC_E_REG,
603 .halt_bit = 6,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -0800604 .retain_reg = MAXI_EN2_REG,
605 .retain_mask = BIT(21),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700606 },
607 .c = {
608 .dbg_name = "gmem_axi_clk",
609 .ops = &clk_ops_branch,
610 CLK_INIT(gmem_axi_clk.c),
611 },
612};
613
614static struct branch_clk ijpeg_axi_clk = {
615 .b = {
616 .ctl_reg = MAXI_EN_REG,
617 .en_mask = BIT(21),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800618 .hwcg_reg = MAXI_EN_REG,
619 .hwcg_mask = BIT(11),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700620 .reset_reg = SW_RESET_AXI_REG,
621 .reset_mask = BIT(14),
622 .halt_reg = DBG_BUS_VEC_E_REG,
623 .halt_bit = 4,
624 },
625 .c = {
626 .dbg_name = "ijpeg_axi_clk",
627 .ops = &clk_ops_branch,
628 CLK_INIT(ijpeg_axi_clk.c),
629 },
630};
631
632static struct branch_clk imem_axi_clk = {
633 .b = {
634 .ctl_reg = MAXI_EN_REG,
635 .en_mask = BIT(22),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800636 .hwcg_reg = MAXI_EN_REG,
637 .hwcg_mask = BIT(15),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700638 .reset_reg = SW_RESET_CORE_REG,
639 .reset_mask = BIT(10),
640 .halt_reg = DBG_BUS_VEC_E_REG,
641 .halt_bit = 7,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -0800642 .retain_reg = MAXI_EN2_REG,
643 .retain_mask = BIT(10),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700644 },
645 .c = {
646 .dbg_name = "imem_axi_clk",
647 .ops = &clk_ops_branch,
648 CLK_INIT(imem_axi_clk.c),
649 },
650};
651
652static struct branch_clk jpegd_axi_clk = {
653 .b = {
654 .ctl_reg = MAXI_EN_REG,
655 .en_mask = BIT(25),
656 .halt_reg = DBG_BUS_VEC_E_REG,
657 .halt_bit = 5,
658 },
659 .c = {
660 .dbg_name = "jpegd_axi_clk",
661 .ops = &clk_ops_branch,
662 CLK_INIT(jpegd_axi_clk.c),
663 },
664};
665
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700666static struct branch_clk vcodec_axi_b_clk = {
667 .b = {
668 .ctl_reg = MAXI_EN4_REG,
669 .en_mask = BIT(23),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800670 .hwcg_reg = MAXI_EN4_REG,
671 .hwcg_mask = BIT(22),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700672 .halt_reg = DBG_BUS_VEC_I_REG,
673 .halt_bit = 25,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -0800674 .retain_reg = MAXI_EN4_REG,
675 .retain_mask = BIT(21),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700676 },
677 .c = {
678 .dbg_name = "vcodec_axi_b_clk",
679 .ops = &clk_ops_branch,
680 CLK_INIT(vcodec_axi_b_clk.c),
681 },
682};
683
Matt Wagantall91f42702011-07-14 12:01:15 -0700684static struct branch_clk vcodec_axi_a_clk = {
685 .b = {
686 .ctl_reg = MAXI_EN4_REG,
687 .en_mask = BIT(25),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800688 .hwcg_reg = MAXI_EN4_REG,
689 .hwcg_mask = BIT(24),
Matt Wagantall91f42702011-07-14 12:01:15 -0700690 .halt_reg = DBG_BUS_VEC_I_REG,
691 .halt_bit = 26,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -0800692 .retain_reg = MAXI_EN4_REG,
693 .retain_mask = BIT(10),
Matt Wagantall91f42702011-07-14 12:01:15 -0700694 },
Matt Wagantall91f42702011-07-14 12:01:15 -0700695 .c = {
696 .dbg_name = "vcodec_axi_a_clk",
697 .ops = &clk_ops_branch,
698 CLK_INIT(vcodec_axi_a_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -0700699 .depends = &vcodec_axi_b_clk.c,
Matt Wagantall91f42702011-07-14 12:01:15 -0700700 },
701};
702
703static struct branch_clk vcodec_axi_clk = {
704 .b = {
705 .ctl_reg = MAXI_EN_REG,
706 .en_mask = BIT(19),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800707 .hwcg_reg = MAXI_EN_REG,
708 .hwcg_mask = BIT(13),
Matt Wagantall91f42702011-07-14 12:01:15 -0700709 .reset_reg = SW_RESET_AXI_REG,
Gopikrishnaiah Anandan83b6e852012-01-05 17:47:02 -0800710 .reset_mask = BIT(4)|BIT(5)|BIT(7),
Matt Wagantall91f42702011-07-14 12:01:15 -0700711 .halt_reg = DBG_BUS_VEC_E_REG,
712 .halt_bit = 3,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -0800713 .retain_reg = MAXI_EN2_REG,
714 .retain_mask = BIT(28),
Matt Wagantall91f42702011-07-14 12:01:15 -0700715 },
Matt Wagantall91f42702011-07-14 12:01:15 -0700716 .c = {
717 .dbg_name = "vcodec_axi_clk",
718 .ops = &clk_ops_branch,
719 CLK_INIT(vcodec_axi_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -0700720 .depends = &vcodec_axi_a_clk.c,
Matt Wagantall91f42702011-07-14 12:01:15 -0700721 },
722};
723
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700724static struct branch_clk vfe_axi_clk = {
725 .b = {
726 .ctl_reg = MAXI_EN_REG,
727 .en_mask = BIT(18),
728 .reset_reg = SW_RESET_AXI_REG,
729 .reset_mask = BIT(9),
730 .halt_reg = DBG_BUS_VEC_E_REG,
731 .halt_bit = 0,
732 },
733 .c = {
734 .dbg_name = "vfe_axi_clk",
735 .ops = &clk_ops_branch,
736 CLK_INIT(vfe_axi_clk.c),
737 },
738};
739
740static struct branch_clk mdp_axi_clk = {
741 .b = {
742 .ctl_reg = MAXI_EN_REG,
743 .en_mask = BIT(23),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800744 .hwcg_reg = MAXI_EN_REG,
745 .hwcg_mask = BIT(16),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700746 .reset_reg = SW_RESET_AXI_REG,
747 .reset_mask = BIT(13),
748 .halt_reg = DBG_BUS_VEC_E_REG,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700749 .halt_bit = 8,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -0800750 .retain_reg = MAXI_EN_REG,
751 .retain_mask = BIT(0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700752 },
753 .c = {
754 .dbg_name = "mdp_axi_clk",
755 .ops = &clk_ops_branch,
756 CLK_INIT(mdp_axi_clk.c),
757 },
758};
759
760static struct branch_clk rot_axi_clk = {
761 .b = {
762 .ctl_reg = MAXI_EN2_REG,
763 .en_mask = BIT(24),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800764 .hwcg_reg = MAXI_EN2_REG,
765 .hwcg_mask = BIT(25),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700766 .reset_reg = SW_RESET_AXI_REG,
767 .reset_mask = BIT(6),
768 .halt_reg = DBG_BUS_VEC_E_REG,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700769 .halt_bit = 2,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -0800770 .retain_reg = MAXI_EN3_REG,
771 .retain_mask = BIT(10),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700772 },
773 .c = {
774 .dbg_name = "rot_axi_clk",
775 .ops = &clk_ops_branch,
776 CLK_INIT(rot_axi_clk.c),
777 },
778};
779
780static struct branch_clk vpe_axi_clk = {
781 .b = {
782 .ctl_reg = MAXI_EN2_REG,
783 .en_mask = BIT(26),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800784 .hwcg_reg = MAXI_EN2_REG,
785 .hwcg_mask = BIT(27),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700786 .reset_reg = SW_RESET_AXI_REG,
787 .reset_mask = BIT(15),
788 .halt_reg = DBG_BUS_VEC_E_REG,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700789 .halt_bit = 1,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -0800790 .retain_reg = MAXI_EN3_REG,
791 .retain_mask = BIT(21),
792
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700793 },
794 .c = {
795 .dbg_name = "vpe_axi_clk",
796 .ops = &clk_ops_branch,
797 CLK_INIT(vpe_axi_clk.c),
798 },
799};
800
Tianyi Gou41515e22011-09-01 19:37:43 -0700801static struct branch_clk vcap_axi_clk = {
802 .b = {
803 .ctl_reg = MAXI_EN5_REG,
804 .en_mask = BIT(12),
Tianyi Gouf3095ea2012-05-22 14:16:06 -0700805 .hwcg_reg = MAXI_EN5_REG,
806 .hwcg_mask = BIT(11),
Tianyi Gou41515e22011-09-01 19:37:43 -0700807 .reset_reg = SW_RESET_AXI_REG,
808 .reset_mask = BIT(16),
809 .halt_reg = DBG_BUS_VEC_J_REG,
810 .halt_bit = 20,
811 },
812 .c = {
813 .dbg_name = "vcap_axi_clk",
814 .ops = &clk_ops_branch,
815 CLK_INIT(vcap_axi_clk.c),
816 },
817};
818
Tianyi Goue3d4f542012-03-15 17:06:45 -0700819/* gfx3d_axi_clk is set as a dependency of gmem_axi_clk at runtime */
Patrick Dalye6f489042012-07-11 15:29:15 -0700820static struct branch_clk gfx3d_axi_clk = {
Tianyi Gou621f8742011-09-01 21:45:01 -0700821 .b = {
822 .ctl_reg = MAXI_EN5_REG,
823 .en_mask = BIT(25),
Tianyi Gouf3095ea2012-05-22 14:16:06 -0700824 .hwcg_reg = MAXI_EN5_REG,
825 .hwcg_mask = BIT(24),
Tianyi Gou621f8742011-09-01 21:45:01 -0700826 .reset_reg = SW_RESET_AXI_REG,
827 .reset_mask = BIT(17),
828 .halt_reg = DBG_BUS_VEC_J_REG,
829 .halt_bit = 30,
830 },
831 .c = {
832 .dbg_name = "gfx3d_axi_clk",
833 .ops = &clk_ops_branch,
Patrick Dalye6f489042012-07-11 15:29:15 -0700834 CLK_INIT(gfx3d_axi_clk.c),
Tianyi Goue3d4f542012-03-15 17:06:45 -0700835 },
836};
837
838static struct branch_clk gfx3d_axi_clk_8930 = {
839 .b = {
840 .ctl_reg = MAXI_EN5_REG,
841 .en_mask = BIT(12),
842 .reset_reg = SW_RESET_AXI_REG,
843 .reset_mask = BIT(16),
844 .halt_reg = DBG_BUS_VEC_J_REG,
845 .halt_bit = 12,
846 },
847 .c = {
848 .dbg_name = "gfx3d_axi_clk",
849 .ops = &clk_ops_branch,
850 CLK_INIT(gfx3d_axi_clk_8930.c),
Tianyi Gou621f8742011-09-01 21:45:01 -0700851 },
852};
853
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700854/* AHB Interfaces */
855static struct branch_clk amp_p_clk = {
856 .b = {
857 .ctl_reg = AHB_EN_REG,
858 .en_mask = BIT(24),
Matt Wagantalld40857a2012-04-10 19:15:43 -0700859 .reset_reg = SW_RESET_CORE_REG,
860 .reset_mask = BIT(20),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700861 .halt_reg = DBG_BUS_VEC_F_REG,
862 .halt_bit = 18,
863 },
864 .c = {
865 .dbg_name = "amp_p_clk",
866 .ops = &clk_ops_branch,
867 CLK_INIT(amp_p_clk.c),
868 },
869};
870
Matt Wagantallc23eee92011-08-16 23:06:52 -0700871static struct branch_clk csi_p_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700872 .b = {
873 .ctl_reg = AHB_EN_REG,
874 .en_mask = BIT(7),
875 .reset_reg = SW_RESET_AHB_REG,
876 .reset_mask = BIT(17),
877 .halt_reg = DBG_BUS_VEC_F_REG,
878 .halt_bit = 16,
879 },
880 .c = {
Matt Wagantallc23eee92011-08-16 23:06:52 -0700881 .dbg_name = "csi_p_clk",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700882 .ops = &clk_ops_branch,
Matt Wagantallc23eee92011-08-16 23:06:52 -0700883 CLK_INIT(csi_p_clk.c),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700884 },
885};
886
887static struct branch_clk dsi1_m_p_clk = {
888 .b = {
889 .ctl_reg = AHB_EN_REG,
890 .en_mask = BIT(9),
891 .reset_reg = SW_RESET_AHB_REG,
892 .reset_mask = BIT(6),
893 .halt_reg = DBG_BUS_VEC_F_REG,
894 .halt_bit = 19,
895 },
896 .c = {
897 .dbg_name = "dsi1_m_p_clk",
898 .ops = &clk_ops_branch,
899 CLK_INIT(dsi1_m_p_clk.c),
900 },
901};
902
903static struct branch_clk dsi1_s_p_clk = {
904 .b = {
905 .ctl_reg = AHB_EN_REG,
906 .en_mask = BIT(18),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800907 .hwcg_reg = AHB_EN2_REG,
908 .hwcg_mask = BIT(20),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700909 .reset_reg = SW_RESET_AHB_REG,
910 .reset_mask = BIT(5),
911 .halt_reg = DBG_BUS_VEC_F_REG,
912 .halt_bit = 21,
913 },
914 .c = {
915 .dbg_name = "dsi1_s_p_clk",
916 .ops = &clk_ops_branch,
917 CLK_INIT(dsi1_s_p_clk.c),
918 },
919};
920
921static struct branch_clk dsi2_m_p_clk = {
922 .b = {
923 .ctl_reg = AHB_EN_REG,
924 .en_mask = BIT(17),
925 .reset_reg = SW_RESET_AHB2_REG,
926 .reset_mask = BIT(1),
927 .halt_reg = DBG_BUS_VEC_E_REG,
928 .halt_bit = 18,
929 },
930 .c = {
931 .dbg_name = "dsi2_m_p_clk",
932 .ops = &clk_ops_branch,
933 CLK_INIT(dsi2_m_p_clk.c),
934 },
935};
936
937static struct branch_clk dsi2_s_p_clk = {
938 .b = {
939 .ctl_reg = AHB_EN_REG,
940 .en_mask = BIT(22),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800941 .hwcg_reg = AHB_EN2_REG,
942 .hwcg_mask = BIT(15),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700943 .reset_reg = SW_RESET_AHB2_REG,
944 .reset_mask = BIT(0),
945 .halt_reg = DBG_BUS_VEC_F_REG,
946 .halt_bit = 20,
947 },
948 .c = {
949 .dbg_name = "dsi2_s_p_clk",
950 .ops = &clk_ops_branch,
951 CLK_INIT(dsi2_s_p_clk.c),
952 },
953};
954
955static struct branch_clk gfx2d0_p_clk = {
956 .b = {
957 .ctl_reg = AHB_EN_REG,
958 .en_mask = BIT(19),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800959 .hwcg_reg = AHB_EN2_REG,
960 .hwcg_mask = BIT(28),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700961 .reset_reg = SW_RESET_AHB_REG,
962 .reset_mask = BIT(12),
963 .halt_reg = DBG_BUS_VEC_F_REG,
964 .halt_bit = 2,
965 },
966 .c = {
967 .dbg_name = "gfx2d0_p_clk",
968 .ops = &clk_ops_branch,
Matt Wagantall158f73b2012-05-16 11:29:35 -0700969 .flags = CLKFLAG_SKIP_HANDOFF,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700970 CLK_INIT(gfx2d0_p_clk.c),
971 },
972};
973
974static struct branch_clk gfx2d1_p_clk = {
975 .b = {
976 .ctl_reg = AHB_EN_REG,
977 .en_mask = BIT(2),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800978 .hwcg_reg = AHB_EN2_REG,
979 .hwcg_mask = BIT(29),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700980 .reset_reg = SW_RESET_AHB_REG,
981 .reset_mask = BIT(11),
982 .halt_reg = DBG_BUS_VEC_F_REG,
983 .halt_bit = 3,
984 },
985 .c = {
986 .dbg_name = "gfx2d1_p_clk",
987 .ops = &clk_ops_branch,
Matt Wagantall158f73b2012-05-16 11:29:35 -0700988 .flags = CLKFLAG_SKIP_HANDOFF,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700989 CLK_INIT(gfx2d1_p_clk.c),
990 },
991};
992
993static struct branch_clk gfx3d_p_clk = {
994 .b = {
995 .ctl_reg = AHB_EN_REG,
996 .en_mask = BIT(3),
Stephen Boyda52d7e32011-11-10 11:59:00 -0800997 .hwcg_reg = AHB_EN2_REG,
998 .hwcg_mask = BIT(27),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700999 .reset_reg = SW_RESET_AHB_REG,
1000 .reset_mask = BIT(10),
1001 .halt_reg = DBG_BUS_VEC_F_REG,
1002 .halt_bit = 4,
1003 },
1004 .c = {
1005 .dbg_name = "gfx3d_p_clk",
1006 .ops = &clk_ops_branch,
1007 CLK_INIT(gfx3d_p_clk.c),
1008 },
1009};
1010
1011static struct branch_clk hdmi_m_p_clk = {
1012 .b = {
1013 .ctl_reg = AHB_EN_REG,
1014 .en_mask = BIT(14),
Stephen Boyda52d7e32011-11-10 11:59:00 -08001015 .hwcg_reg = AHB_EN2_REG,
1016 .hwcg_mask = BIT(21),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001017 .reset_reg = SW_RESET_AHB_REG,
1018 .reset_mask = BIT(9),
1019 .halt_reg = DBG_BUS_VEC_F_REG,
1020 .halt_bit = 5,
1021 },
1022 .c = {
1023 .dbg_name = "hdmi_m_p_clk",
1024 .ops = &clk_ops_branch,
1025 CLK_INIT(hdmi_m_p_clk.c),
1026 },
1027};
1028
1029static struct branch_clk hdmi_s_p_clk = {
1030 .b = {
1031 .ctl_reg = AHB_EN_REG,
1032 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08001033 .hwcg_reg = AHB_EN2_REG,
1034 .hwcg_mask = BIT(22),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001035 .reset_reg = SW_RESET_AHB_REG,
1036 .reset_mask = BIT(9),
1037 .halt_reg = DBG_BUS_VEC_F_REG,
1038 .halt_bit = 6,
1039 },
1040 .c = {
1041 .dbg_name = "hdmi_s_p_clk",
1042 .ops = &clk_ops_branch,
1043 CLK_INIT(hdmi_s_p_clk.c),
1044 },
1045};
1046
1047static struct branch_clk ijpeg_p_clk = {
1048 .b = {
1049 .ctl_reg = AHB_EN_REG,
1050 .en_mask = BIT(5),
1051 .reset_reg = SW_RESET_AHB_REG,
1052 .reset_mask = BIT(7),
1053 .halt_reg = DBG_BUS_VEC_F_REG,
1054 .halt_bit = 9,
1055 },
1056 .c = {
1057 .dbg_name = "ijpeg_p_clk",
1058 .ops = &clk_ops_branch,
1059 CLK_INIT(ijpeg_p_clk.c),
1060 },
1061};
1062
1063static struct branch_clk imem_p_clk = {
1064 .b = {
1065 .ctl_reg = AHB_EN_REG,
1066 .en_mask = BIT(6),
Stephen Boyda52d7e32011-11-10 11:59:00 -08001067 .hwcg_reg = AHB_EN2_REG,
1068 .hwcg_mask = BIT(12),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001069 .reset_reg = SW_RESET_AHB_REG,
1070 .reset_mask = BIT(8),
1071 .halt_reg = DBG_BUS_VEC_F_REG,
1072 .halt_bit = 10,
1073 },
1074 .c = {
1075 .dbg_name = "imem_p_clk",
1076 .ops = &clk_ops_branch,
1077 CLK_INIT(imem_p_clk.c),
1078 },
1079};
1080
1081static struct branch_clk jpegd_p_clk = {
1082 .b = {
1083 .ctl_reg = AHB_EN_REG,
1084 .en_mask = BIT(21),
1085 .reset_reg = SW_RESET_AHB_REG,
1086 .reset_mask = BIT(4),
1087 .halt_reg = DBG_BUS_VEC_F_REG,
1088 .halt_bit = 7,
1089 },
1090 .c = {
1091 .dbg_name = "jpegd_p_clk",
1092 .ops = &clk_ops_branch,
1093 CLK_INIT(jpegd_p_clk.c),
1094 },
1095};
1096
1097static struct branch_clk mdp_p_clk = {
1098 .b = {
1099 .ctl_reg = AHB_EN_REG,
1100 .en_mask = BIT(10),
1101 .reset_reg = SW_RESET_AHB_REG,
1102 .reset_mask = BIT(3),
1103 .halt_reg = DBG_BUS_VEC_F_REG,
1104 .halt_bit = 11,
1105 },
1106 .c = {
1107 .dbg_name = "mdp_p_clk",
1108 .ops = &clk_ops_branch,
1109 CLK_INIT(mdp_p_clk.c),
1110 },
1111};
1112
1113static struct branch_clk rot_p_clk = {
1114 .b = {
1115 .ctl_reg = AHB_EN_REG,
1116 .en_mask = BIT(12),
1117 .reset_reg = SW_RESET_AHB_REG,
1118 .reset_mask = BIT(2),
1119 .halt_reg = DBG_BUS_VEC_F_REG,
1120 .halt_bit = 13,
1121 },
1122 .c = {
1123 .dbg_name = "rot_p_clk",
1124 .ops = &clk_ops_branch,
1125 CLK_INIT(rot_p_clk.c),
1126 },
1127};
1128
1129static struct branch_clk smmu_p_clk = {
1130 .b = {
1131 .ctl_reg = AHB_EN_REG,
1132 .en_mask = BIT(15),
Stephen Boyda52d7e32011-11-10 11:59:00 -08001133 .hwcg_reg = AHB_EN_REG,
1134 .hwcg_mask = BIT(26),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001135 .halt_reg = DBG_BUS_VEC_F_REG,
1136 .halt_bit = 22,
1137 },
1138 .c = {
1139 .dbg_name = "smmu_p_clk",
1140 .ops = &clk_ops_branch,
1141 CLK_INIT(smmu_p_clk.c),
1142 },
1143};
1144
1145static struct branch_clk tv_enc_p_clk = {
1146 .b = {
1147 .ctl_reg = AHB_EN_REG,
1148 .en_mask = BIT(25),
1149 .reset_reg = SW_RESET_AHB_REG,
1150 .reset_mask = BIT(15),
1151 .halt_reg = DBG_BUS_VEC_F_REG,
1152 .halt_bit = 23,
1153 },
1154 .c = {
1155 .dbg_name = "tv_enc_p_clk",
1156 .ops = &clk_ops_branch,
1157 CLK_INIT(tv_enc_p_clk.c),
1158 },
1159};
1160
1161static struct branch_clk vcodec_p_clk = {
1162 .b = {
1163 .ctl_reg = AHB_EN_REG,
1164 .en_mask = BIT(11),
Stephen Boyda52d7e32011-11-10 11:59:00 -08001165 .hwcg_reg = AHB_EN2_REG,
1166 .hwcg_mask = BIT(26),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001167 .reset_reg = SW_RESET_AHB_REG,
1168 .reset_mask = BIT(1),
1169 .halt_reg = DBG_BUS_VEC_F_REG,
1170 .halt_bit = 12,
1171 },
1172 .c = {
1173 .dbg_name = "vcodec_p_clk",
1174 .ops = &clk_ops_branch,
1175 CLK_INIT(vcodec_p_clk.c),
1176 },
1177};
1178
1179static struct branch_clk vfe_p_clk = {
1180 .b = {
1181 .ctl_reg = AHB_EN_REG,
1182 .en_mask = BIT(13),
1183 .reset_reg = SW_RESET_AHB_REG,
1184 .reset_mask = BIT(0),
1185 .halt_reg = DBG_BUS_VEC_F_REG,
1186 .halt_bit = 14,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08001187 .retain_reg = AHB_EN2_REG,
1188 .retain_mask = BIT(0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001189 },
1190 .c = {
1191 .dbg_name = "vfe_p_clk",
1192 .ops = &clk_ops_branch,
1193 CLK_INIT(vfe_p_clk.c),
1194 },
1195};
1196
1197static struct branch_clk vpe_p_clk = {
1198 .b = {
1199 .ctl_reg = AHB_EN_REG,
1200 .en_mask = BIT(16),
1201 .reset_reg = SW_RESET_AHB_REG,
1202 .reset_mask = BIT(14),
1203 .halt_reg = DBG_BUS_VEC_F_REG,
1204 .halt_bit = 15,
1205 },
1206 .c = {
1207 .dbg_name = "vpe_p_clk",
1208 .ops = &clk_ops_branch,
1209 CLK_INIT(vpe_p_clk.c),
1210 },
1211};
1212
Tianyi Gou41515e22011-09-01 19:37:43 -07001213static struct branch_clk vcap_p_clk = {
1214 .b = {
1215 .ctl_reg = AHB_EN3_REG,
1216 .en_mask = BIT(1),
Tianyi Gouf3095ea2012-05-22 14:16:06 -07001217 .hwcg_reg = AHB_EN3_REG,
1218 .hwcg_mask = BIT(0),
Tianyi Gou41515e22011-09-01 19:37:43 -07001219 .reset_reg = SW_RESET_AHB2_REG,
1220 .reset_mask = BIT(2),
1221 .halt_reg = DBG_BUS_VEC_J_REG,
1222 .halt_bit = 23,
1223 },
1224 .c = {
1225 .dbg_name = "vcap_p_clk",
1226 .ops = &clk_ops_branch,
1227 CLK_INIT(vcap_p_clk.c),
1228 },
1229};
1230
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001231/*
1232 * Peripheral Clocks
1233 */
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001234#define CLK_GP(i, n, h_r, h_b) \
1235 struct rcg_clk i##_clk = { \
1236 .b = { \
1237 .ctl_reg = GPn_NS_REG(n), \
1238 .en_mask = BIT(9), \
1239 .halt_reg = h_r, \
1240 .halt_bit = h_b, \
1241 }, \
1242 .ns_reg = GPn_NS_REG(n), \
1243 .md_reg = GPn_MD_REG(n), \
1244 .root_en_mask = BIT(11), \
1245 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001246 .mnd_en_mask = BIT(8), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001247 .set_rate = set_rate_mnd, \
1248 .freq_tbl = clk_tbl_gp, \
1249 .current_freq = &rcg_dummy_freq, \
1250 .c = { \
1251 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001252 .ops = &clk_ops_rcg, \
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001253 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000), \
1254 CLK_INIT(i##_clk.c), \
1255 }, \
1256 }
1257#define F_GP(f, s, d, m, n) \
1258 { \
1259 .freq_hz = f, \
1260 .src_clk = &s##_clk.c, \
1261 .md_val = MD8(16, m, 0, n), \
1262 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001263 }
1264static struct clk_freq_tbl clk_tbl_gp[] = {
1265 F_GP( 0, gnd, 1, 0, 0),
1266 F_GP( 9600000, cxo, 2, 0, 0),
1267 F_GP( 13500000, pxo, 2, 0, 0),
1268 F_GP( 19200000, cxo, 1, 0, 0),
1269 F_GP( 27000000, pxo, 1, 0, 0),
1270 F_GP( 64000000, pll8, 2, 1, 3),
1271 F_GP( 76800000, pll8, 1, 1, 5),
1272 F_GP( 96000000, pll8, 4, 0, 0),
1273 F_GP(128000000, pll8, 3, 0, 0),
1274 F_GP(192000000, pll8, 2, 0, 0),
Matt Wagantall7625a4c2011-11-01 16:17:53 -07001275 F_END
1276};
1277
1278static CLK_GP(gp0, 0, CLK_HALT_SFPB_MISC_STATE_REG, 7);
1279static CLK_GP(gp1, 1, CLK_HALT_SFPB_MISC_STATE_REG, 6);
1280static CLK_GP(gp2, 2, CLK_HALT_SFPB_MISC_STATE_REG, 5);
1281
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001282#define CLK_GSBI_UART(i, n, h_r, h_b) \
1283 struct rcg_clk i##_clk = { \
1284 .b = { \
1285 .ctl_reg = GSBIn_UART_APPS_NS_REG(n), \
1286 .en_mask = BIT(9), \
1287 .reset_reg = GSBIn_RESET_REG(n), \
1288 .reset_mask = BIT(0), \
1289 .halt_reg = h_r, \
1290 .halt_bit = h_b, \
1291 }, \
1292 .ns_reg = GSBIn_UART_APPS_NS_REG(n), \
1293 .md_reg = GSBIn_UART_APPS_MD_REG(n), \
1294 .root_en_mask = BIT(11), \
1295 .ns_mask = (BM(31, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001296 .mnd_en_mask = BIT(8), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001297 .set_rate = set_rate_mnd, \
1298 .freq_tbl = clk_tbl_gsbi_uart, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001299 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001300 .c = { \
1301 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001302 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001303 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001304 CLK_INIT(i##_clk.c), \
1305 }, \
1306 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001307#define F_GSBI_UART(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001308 { \
1309 .freq_hz = f, \
1310 .src_clk = &s##_clk.c, \
1311 .md_val = MD16(m, n), \
1312 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001313 }
1314static struct clk_freq_tbl clk_tbl_gsbi_uart[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001315 F_GSBI_UART( 0, gnd, 1, 0, 0),
Matt Wagantall9a561f72012-01-19 16:13:12 -08001316 F_GSBI_UART( 1843200, pll8, 2, 6, 625),
1317 F_GSBI_UART( 3686400, pll8, 2, 12, 625),
1318 F_GSBI_UART( 7372800, pll8, 2, 24, 625),
1319 F_GSBI_UART(14745600, pll8, 2, 48, 625),
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001320 F_GSBI_UART(16000000, pll8, 4, 1, 6),
1321 F_GSBI_UART(24000000, pll8, 4, 1, 4),
1322 F_GSBI_UART(32000000, pll8, 4, 1, 3),
1323 F_GSBI_UART(40000000, pll8, 1, 5, 48),
1324 F_GSBI_UART(46400000, pll8, 1, 29, 240),
1325 F_GSBI_UART(48000000, pll8, 4, 1, 2),
1326 F_GSBI_UART(51200000, pll8, 1, 2, 15),
1327 F_GSBI_UART(56000000, pll8, 1, 7, 48),
1328 F_GSBI_UART(58982400, pll8, 1, 96, 625),
1329 F_GSBI_UART(64000000, pll8, 2, 1, 3),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001330 F_END
1331};
1332
1333static CLK_GSBI_UART(gsbi1_uart, 1, CLK_HALT_CFPB_STATEA_REG, 10);
1334static CLK_GSBI_UART(gsbi2_uart, 2, CLK_HALT_CFPB_STATEA_REG, 6);
1335static CLK_GSBI_UART(gsbi3_uart, 3, CLK_HALT_CFPB_STATEA_REG, 2);
1336static CLK_GSBI_UART(gsbi4_uart, 4, CLK_HALT_CFPB_STATEB_REG, 26);
1337static CLK_GSBI_UART(gsbi5_uart, 5, CLK_HALT_CFPB_STATEB_REG, 22);
1338static CLK_GSBI_UART(gsbi6_uart, 6, CLK_HALT_CFPB_STATEB_REG, 18);
1339static CLK_GSBI_UART(gsbi7_uart, 7, CLK_HALT_CFPB_STATEB_REG, 14);
1340static CLK_GSBI_UART(gsbi8_uart, 8, CLK_HALT_CFPB_STATEB_REG, 10);
1341static CLK_GSBI_UART(gsbi9_uart, 9, CLK_HALT_CFPB_STATEB_REG, 6);
1342static CLK_GSBI_UART(gsbi10_uart, 10, CLK_HALT_CFPB_STATEB_REG, 2);
1343static CLK_GSBI_UART(gsbi11_uart, 11, CLK_HALT_CFPB_STATEC_REG, 17);
1344static CLK_GSBI_UART(gsbi12_uart, 12, CLK_HALT_CFPB_STATEC_REG, 13);
1345
1346#define CLK_GSBI_QUP(i, n, h_r, h_b) \
1347 struct rcg_clk i##_clk = { \
1348 .b = { \
1349 .ctl_reg = GSBIn_QUP_APPS_NS_REG(n), \
1350 .en_mask = BIT(9), \
1351 .reset_reg = GSBIn_RESET_REG(n), \
1352 .reset_mask = BIT(0), \
1353 .halt_reg = h_r, \
1354 .halt_bit = h_b, \
1355 }, \
1356 .ns_reg = GSBIn_QUP_APPS_NS_REG(n), \
1357 .md_reg = GSBIn_QUP_APPS_MD_REG(n), \
1358 .root_en_mask = BIT(11), \
1359 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001360 .mnd_en_mask = BIT(8), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001361 .set_rate = set_rate_mnd, \
1362 .freq_tbl = clk_tbl_gsbi_qup, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001363 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001364 .c = { \
1365 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001366 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001367 VDD_DIG_FMAX_MAP2(LOW, 24000000, NOMINAL, 52000000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001368 CLK_INIT(i##_clk.c), \
1369 }, \
1370 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001371#define F_GSBI_QUP(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001372 { \
1373 .freq_hz = f, \
1374 .src_clk = &s##_clk.c, \
1375 .md_val = MD8(16, m, 0, n), \
1376 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001377 }
1378static struct clk_freq_tbl clk_tbl_gsbi_qup[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001379 F_GSBI_QUP( 0, gnd, 1, 0, 0),
1380 F_GSBI_QUP( 1100000, pxo, 1, 2, 49),
1381 F_GSBI_QUP( 5400000, pxo, 1, 1, 5),
1382 F_GSBI_QUP(10800000, pxo, 1, 2, 5),
1383 F_GSBI_QUP(15060000, pll8, 1, 2, 51),
1384 F_GSBI_QUP(24000000, pll8, 4, 1, 4),
1385 F_GSBI_QUP(25600000, pll8, 1, 1, 15),
1386 F_GSBI_QUP(27000000, pxo, 1, 0, 0),
1387 F_GSBI_QUP(48000000, pll8, 4, 1, 2),
1388 F_GSBI_QUP(51200000, pll8, 1, 2, 15),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001389 F_END
1390};
1391
1392static CLK_GSBI_QUP(gsbi1_qup, 1, CLK_HALT_CFPB_STATEA_REG, 9);
1393static CLK_GSBI_QUP(gsbi2_qup, 2, CLK_HALT_CFPB_STATEA_REG, 4);
1394static CLK_GSBI_QUP(gsbi3_qup, 3, CLK_HALT_CFPB_STATEA_REG, 0);
1395static CLK_GSBI_QUP(gsbi4_qup, 4, CLK_HALT_CFPB_STATEB_REG, 24);
1396static CLK_GSBI_QUP(gsbi5_qup, 5, CLK_HALT_CFPB_STATEB_REG, 20);
1397static CLK_GSBI_QUP(gsbi6_qup, 6, CLK_HALT_CFPB_STATEB_REG, 16);
1398static CLK_GSBI_QUP(gsbi7_qup, 7, CLK_HALT_CFPB_STATEB_REG, 12);
1399static CLK_GSBI_QUP(gsbi8_qup, 8, CLK_HALT_CFPB_STATEB_REG, 8);
1400static CLK_GSBI_QUP(gsbi9_qup, 9, CLK_HALT_CFPB_STATEB_REG, 4);
1401static CLK_GSBI_QUP(gsbi10_qup, 10, CLK_HALT_CFPB_STATEB_REG, 0);
1402static CLK_GSBI_QUP(gsbi11_qup, 11, CLK_HALT_CFPB_STATEC_REG, 15);
1403static CLK_GSBI_QUP(gsbi12_qup, 12, CLK_HALT_CFPB_STATEC_REG, 11);
1404
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001405#define F_PDM(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001406 { \
1407 .freq_hz = f, \
1408 .src_clk = &s##_clk.c, \
1409 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001410 }
1411static struct clk_freq_tbl clk_tbl_pdm[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001412 F_PDM( 0, gnd, 1),
1413 F_PDM(27000000, pxo, 1),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001414 F_END
1415};
1416
1417static struct rcg_clk pdm_clk = {
1418 .b = {
1419 .ctl_reg = PDM_CLK_NS_REG,
1420 .en_mask = BIT(9),
1421 .reset_reg = PDM_CLK_NS_REG,
1422 .reset_mask = BIT(12),
1423 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1424 .halt_bit = 3,
1425 },
1426 .ns_reg = PDM_CLK_NS_REG,
1427 .root_en_mask = BIT(11),
1428 .ns_mask = BM(1, 0),
1429 .set_rate = set_rate_nop,
1430 .freq_tbl = clk_tbl_pdm,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001431 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001432 .c = {
1433 .dbg_name = "pdm_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001434 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001435 VDD_DIG_FMAX_MAP1(LOW, 27000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001436 CLK_INIT(pdm_clk.c),
1437 },
1438};
1439
1440static struct branch_clk pmem_clk = {
1441 .b = {
1442 .ctl_reg = PMEM_ACLK_CTL_REG,
1443 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08001444 .hwcg_reg = PMEM_ACLK_CTL_REG,
1445 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001446 .halt_reg = CLK_HALT_DFAB_STATE_REG,
1447 .halt_bit = 20,
1448 },
1449 .c = {
1450 .dbg_name = "pmem_clk",
1451 .ops = &clk_ops_branch,
1452 CLK_INIT(pmem_clk.c),
1453 },
1454};
1455
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001456#define F_PRNG(f, s) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001457 { \
1458 .freq_hz = f, \
1459 .src_clk = &s##_clk.c, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001460 }
Stephen Boyd842a1f62012-04-26 19:07:38 -07001461static struct clk_freq_tbl clk_tbl_prng_32[] = {
1462 F_PRNG(32000000, pll8),
1463 F_END
1464};
1465
1466static struct clk_freq_tbl clk_tbl_prng_64[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001467 F_PRNG(64000000, pll8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001468 F_END
1469};
1470
1471static struct rcg_clk prng_clk = {
1472 .b = {
1473 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
1474 .en_mask = BIT(10),
1475 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
1476 .halt_check = HALT_VOTED,
1477 .halt_bit = 10,
1478 },
1479 .set_rate = set_rate_nop,
Stephen Boyd842a1f62012-04-26 19:07:38 -07001480 .freq_tbl = clk_tbl_prng_32,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001481 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001482 .c = {
1483 .dbg_name = "prng_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001484 .ops = &clk_ops_rcg,
Stephen Boyd842a1f62012-04-26 19:07:38 -07001485 VDD_DIG_FMAX_MAP2(LOW, 32000000, NOMINAL, 64000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001486 CLK_INIT(prng_clk.c),
1487 },
1488};
1489
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001490#define CLK_SDC(name, n, h_b, fmax_low, fmax_nom) \
Stephen Boyda78a7402011-08-02 11:23:39 -07001491 struct rcg_clk name = { \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001492 .b = { \
1493 .ctl_reg = SDCn_APPS_CLK_NS_REG(n), \
1494 .en_mask = BIT(9), \
1495 .reset_reg = SDCn_RESET_REG(n), \
1496 .reset_mask = BIT(0), \
Stephen Boyda78a7402011-08-02 11:23:39 -07001497 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001498 .halt_bit = h_b, \
1499 }, \
1500 .ns_reg = SDCn_APPS_CLK_NS_REG(n), \
1501 .md_reg = SDCn_APPS_CLK_MD_REG(n), \
1502 .root_en_mask = BIT(11), \
1503 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001504 .mnd_en_mask = BIT(8), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001505 .set_rate = set_rate_mnd, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001506 .freq_tbl = clk_tbl_sdc, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001507 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001508 .c = { \
Stephen Boyda78a7402011-08-02 11:23:39 -07001509 .dbg_name = #name, \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001510 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001511 VDD_DIG_FMAX_MAP2(LOW, fmax_low, NOMINAL, fmax_nom), \
Stephen Boyda78a7402011-08-02 11:23:39 -07001512 CLK_INIT(name.c), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001513 }, \
1514 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001515#define F_SDC(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001516 { \
1517 .freq_hz = f, \
1518 .src_clk = &s##_clk.c, \
1519 .md_val = MD8(16, m, 0, n), \
1520 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001521 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001522static struct clk_freq_tbl clk_tbl_sdc[] = {
1523 F_SDC( 0, gnd, 1, 0, 0),
1524 F_SDC( 144000, pxo, 3, 2, 125),
1525 F_SDC( 400000, pll8, 4, 1, 240),
1526 F_SDC( 16000000, pll8, 4, 1, 6),
1527 F_SDC( 17070000, pll8, 1, 2, 45),
1528 F_SDC( 20210000, pll8, 1, 1, 19),
1529 F_SDC( 24000000, pll8, 4, 1, 4),
1530 F_SDC( 48000000, pll8, 4, 1, 2),
1531 F_SDC( 64000000, pll8, 3, 1, 2),
1532 F_SDC( 96000000, pll8, 4, 0, 0),
Subhash Jadavanibd238ba2011-11-24 15:12:39 +05301533 F_SDC(192000000, pll8, 2, 0, 0),
Stephen Boyda78a7402011-08-02 11:23:39 -07001534 F_END
1535};
1536
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001537static CLK_SDC(sdc1_clk, 1, 6, 52000000, 104000000);
1538static CLK_SDC(sdc2_clk, 2, 5, 52000000, 104000000);
1539static CLK_SDC(sdc3_clk, 3, 4, 104000000, 208000000);
1540static CLK_SDC(sdc4_clk, 4, 3, 33000000, 67000000);
1541static CLK_SDC(sdc5_clk, 5, 2, 33000000, 67000000);
Stephen Boyda78a7402011-08-02 11:23:39 -07001542
Patrick Dalyedb86f42012-08-23 19:07:30 -07001543static unsigned long fmax_sdc1_8064v2[MAX_VDD_LEVELS] __initdata = {
1544 [VDD_DIG_LOW] = 100000000,
1545 [VDD_DIG_NOMINAL] = 200000000,
1546};
1547
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001548#define F_TSIF_REF(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001549 { \
1550 .freq_hz = f, \
1551 .src_clk = &s##_clk.c, \
1552 .md_val = MD16(m, n), \
1553 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001554 }
1555static struct clk_freq_tbl clk_tbl_tsif_ref[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001556 F_TSIF_REF( 0, gnd, 1, 0, 0),
1557 F_TSIF_REF(105000, pxo, 1, 1, 256),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001558 F_END
1559};
1560
1561static struct rcg_clk tsif_ref_clk = {
1562 .b = {
1563 .ctl_reg = TSIF_REF_CLK_NS_REG,
1564 .en_mask = BIT(9),
1565 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1566 .halt_bit = 5,
1567 },
1568 .ns_reg = TSIF_REF_CLK_NS_REG,
1569 .md_reg = TSIF_REF_CLK_MD_REG,
1570 .root_en_mask = BIT(11),
1571 .ns_mask = (BM(31, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001572 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001573 .set_rate = set_rate_mnd,
1574 .freq_tbl = clk_tbl_tsif_ref,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001575 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001576 .c = {
1577 .dbg_name = "tsif_ref_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001578 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001579 VDD_DIG_FMAX_MAP2(LOW, 27000000, NOMINAL, 54000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001580 CLK_INIT(tsif_ref_clk.c),
1581 },
1582};
1583
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001584#define F_TSSC(f, s) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001585 { \
1586 .freq_hz = f, \
1587 .src_clk = &s##_clk.c, \
1588 .ns_val = NS_SRC_SEL(1, 0, s##_to_xo_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001589 }
1590static struct clk_freq_tbl clk_tbl_tssc[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001591 F_TSSC( 0, gnd),
1592 F_TSSC(27000000, pxo),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001593 F_END
1594};
1595
1596static struct rcg_clk tssc_clk = {
1597 .b = {
1598 .ctl_reg = TSSC_CLK_CTL_REG,
1599 .en_mask = BIT(4),
1600 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1601 .halt_bit = 4,
1602 },
1603 .ns_reg = TSSC_CLK_CTL_REG,
1604 .ns_mask = BM(1, 0),
1605 .set_rate = set_rate_nop,
1606 .freq_tbl = clk_tbl_tssc,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001607 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001608 .c = {
1609 .dbg_name = "tssc_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001610 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001611 VDD_DIG_FMAX_MAP1(LOW, 27000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001612 CLK_INIT(tssc_clk.c),
1613 },
1614};
1615
Tianyi Gou41515e22011-09-01 19:37:43 -07001616#define CLK_USB_HS(name, n, h_b) \
1617 static struct rcg_clk name = { \
1618 .b = { \
1619 .ctl_reg = USB_HS##n##_XCVR_FS_CLK_NS_REG, \
1620 .en_mask = BIT(9), \
1621 .reset_reg = USB_HS##n##_RESET_REG, \
1622 .reset_mask = BIT(0), \
1623 .halt_reg = CLK_HALT_DFAB_STATE_REG, \
1624 .halt_bit = h_b, \
1625 }, \
1626 .ns_reg = USB_HS##n##_XCVR_FS_CLK_NS_REG, \
1627 .md_reg = USB_HS##n##_XCVR_FS_CLK_MD_REG, \
1628 .root_en_mask = BIT(11), \
1629 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001630 .mnd_en_mask = BIT(8), \
Tianyi Gou41515e22011-09-01 19:37:43 -07001631 .set_rate = set_rate_mnd, \
1632 .freq_tbl = clk_tbl_usb, \
1633 .current_freq = &rcg_dummy_freq, \
1634 .c = { \
1635 .dbg_name = #name, \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001636 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001637 VDD_DIG_FMAX_MAP1(NOMINAL, 64000000), \
Tianyi Gou41515e22011-09-01 19:37:43 -07001638 CLK_INIT(name.c), \
1639 }, \
1640}
1641
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001642#define F_USB(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001643 { \
1644 .freq_hz = f, \
1645 .src_clk = &s##_clk.c, \
1646 .md_val = MD8(16, m, 0, n), \
1647 .ns_val = NS(23, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_bb_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001648 }
1649static struct clk_freq_tbl clk_tbl_usb[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001650 F_USB( 0, gnd, 1, 0, 0),
1651 F_USB(60000000, pll8, 1, 5, 32),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001652 F_END
1653};
1654
Tianyi Gou41515e22011-09-01 19:37:43 -07001655CLK_USB_HS(usb_hs1_xcvr_clk, 1, 0);
1656CLK_USB_HS(usb_hs3_xcvr_clk, 3, 30);
1657CLK_USB_HS(usb_hs4_xcvr_clk, 4, 2);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001658
Stephen Boyd94625ef2011-07-12 17:06:01 -07001659static struct clk_freq_tbl clk_tbl_usb_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001660 F_USB( 0, gnd, 1, 0, 0),
1661 F_USB(60000000, pll8, 1, 5, 32),
Stephen Boyd94625ef2011-07-12 17:06:01 -07001662 F_END
1663};
1664
1665static struct rcg_clk usb_hsic_xcvr_fs_clk = {
1666 .b = {
1667 .ctl_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
1668 .en_mask = BIT(9),
1669 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1670 .halt_bit = 26,
1671 },
1672 .ns_reg = USB_HSIC_XCVR_FS_CLK_NS_REG,
1673 .md_reg = USB_HSIC_XCVR_FS_CLK_MD_REG,
1674 .root_en_mask = BIT(11),
1675 .ns_mask = (BM(23, 16) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08001676 .mnd_en_mask = BIT(8),
Stephen Boyd94625ef2011-07-12 17:06:01 -07001677 .set_rate = set_rate_mnd,
1678 .freq_tbl = clk_tbl_usb_hsic,
1679 .current_freq = &rcg_dummy_freq,
1680 .c = {
1681 .dbg_name = "usb_hsic_xcvr_fs_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001682 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001683 VDD_DIG_FMAX_MAP1(LOW, 60000000),
Stephen Boyd94625ef2011-07-12 17:06:01 -07001684 CLK_INIT(usb_hsic_xcvr_fs_clk.c),
1685 },
1686};
1687
1688static struct branch_clk usb_hsic_system_clk = {
1689 .b = {
1690 .ctl_reg = USB_HSIC_SYSTEM_CLK_CTL_REG,
1691 .en_mask = BIT(4),
1692 .reset_reg = USB_HSIC_RESET_REG,
1693 .reset_mask = BIT(0),
1694 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1695 .halt_bit = 24,
1696 },
1697 .parent = &usb_hsic_xcvr_fs_clk.c,
1698 .c = {
1699 .dbg_name = "usb_hsic_system_clk",
1700 .ops = &clk_ops_branch,
1701 CLK_INIT(usb_hsic_system_clk.c),
1702 },
1703};
1704
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001705#define F_USB_HSIC(f, s) \
Stephen Boyd94625ef2011-07-12 17:06:01 -07001706 { \
1707 .freq_hz = f, \
1708 .src_clk = &s##_clk.c, \
Stephen Boyd94625ef2011-07-12 17:06:01 -07001709 }
1710static struct clk_freq_tbl clk_tbl_usb2_hsic[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001711 F_USB_HSIC(480000000, pll14),
Stephen Boyd94625ef2011-07-12 17:06:01 -07001712 F_END
1713};
1714
1715static struct rcg_clk usb_hsic_hsic_src_clk = {
1716 .b = {
1717 .ctl_reg = USB_HSIC_HSIC_CLK_SRC_CTL_REG,
1718 .halt_check = NOCHECK,
1719 },
1720 .root_en_mask = BIT(0),
1721 .set_rate = set_rate_nop,
1722 .freq_tbl = clk_tbl_usb2_hsic,
1723 .current_freq = &rcg_dummy_freq,
1724 .c = {
1725 .dbg_name = "usb_hsic_hsic_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001726 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001727 VDD_DIG_FMAX_MAP1(LOW, 480000000),
Stephen Boyd94625ef2011-07-12 17:06:01 -07001728 CLK_INIT(usb_hsic_hsic_src_clk.c),
1729 },
1730};
1731
1732static struct branch_clk usb_hsic_hsic_clk = {
1733 .b = {
1734 .ctl_reg = USB_HSIC_HSIC_CLK_CTL_REG,
1735 .en_mask = BIT(0),
1736 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1737 .halt_bit = 19,
1738 },
1739 .parent = &usb_hsic_hsic_src_clk.c,
1740 .c = {
1741 .dbg_name = "usb_hsic_hsic_clk",
1742 .ops = &clk_ops_branch,
1743 CLK_INIT(usb_hsic_hsic_clk.c),
1744 },
1745};
1746
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001747#define F_USB_HSIO_CAL(f, s) \
Stephen Boyd94625ef2011-07-12 17:06:01 -07001748 { \
1749 .freq_hz = f, \
1750 .src_clk = &s##_clk.c, \
Stephen Boyd94625ef2011-07-12 17:06:01 -07001751 }
1752static struct clk_freq_tbl clk_tbl_usb_hsio_cal[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001753 F_USB_HSIO_CAL(9000000, pxo),
Stephen Boyd94625ef2011-07-12 17:06:01 -07001754 F_END
1755};
1756
1757static struct rcg_clk usb_hsic_hsio_cal_clk = {
1758 .b = {
1759 .ctl_reg = USB_HSIC_HSIO_CAL_CLK_CTL_REG,
1760 .en_mask = BIT(0),
1761 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1762 .halt_bit = 23,
1763 },
1764 .set_rate = set_rate_nop,
1765 .freq_tbl = clk_tbl_usb_hsio_cal,
1766 .current_freq = &rcg_dummy_freq,
1767 .c = {
1768 .dbg_name = "usb_hsic_hsio_cal_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001769 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001770 VDD_DIG_FMAX_MAP1(LOW, 10000000),
Stephen Boyd94625ef2011-07-12 17:06:01 -07001771 CLK_INIT(usb_hsic_hsio_cal_clk.c),
1772 },
1773};
1774
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001775static struct branch_clk usb_phy0_clk = {
1776 .b = {
1777 .reset_reg = USB_PHY0_RESET_REG,
1778 .reset_mask = BIT(0),
1779 },
1780 .c = {
1781 .dbg_name = "usb_phy0_clk",
1782 .ops = &clk_ops_reset,
1783 CLK_INIT(usb_phy0_clk.c),
1784 },
1785};
1786
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001787#define CLK_USB_FS(i, n, fmax_nom) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001788 struct rcg_clk i##_clk = { \
1789 .ns_reg = USB_FSn_XCVR_FS_CLK_NS_REG(n), \
1790 .b = { \
1791 .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(n), \
1792 .halt_check = NOCHECK, \
1793 }, \
1794 .md_reg = USB_FSn_XCVR_FS_CLK_MD_REG(n), \
1795 .root_en_mask = BIT(11), \
1796 .ns_mask = (BM(23, 16) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08001797 .mnd_en_mask = BIT(8), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001798 .set_rate = set_rate_mnd, \
1799 .freq_tbl = clk_tbl_usb, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07001800 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001801 .c = { \
1802 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07001803 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001804 VDD_DIG_FMAX_MAP1(NOMINAL, fmax_nom), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001805 CLK_INIT(i##_clk.c), \
1806 }, \
1807 }
1808
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001809static CLK_USB_FS(usb_fs1_src, 1, 64000000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001810static struct branch_clk usb_fs1_xcvr_clk = {
1811 .b = {
1812 .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(1),
1813 .en_mask = BIT(9),
1814 .reset_reg = USB_FSn_RESET_REG(1),
1815 .reset_mask = BIT(1),
1816 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1817 .halt_bit = 15,
1818 },
1819 .parent = &usb_fs1_src_clk.c,
1820 .c = {
1821 .dbg_name = "usb_fs1_xcvr_clk",
1822 .ops = &clk_ops_branch,
1823 CLK_INIT(usb_fs1_xcvr_clk.c),
1824 },
1825};
1826
1827static struct branch_clk usb_fs1_sys_clk = {
1828 .b = {
1829 .ctl_reg = USB_FSn_SYSTEM_CLK_CTL_REG(1),
1830 .en_mask = BIT(4),
1831 .reset_reg = USB_FSn_RESET_REG(1),
1832 .reset_mask = BIT(0),
1833 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1834 .halt_bit = 16,
1835 },
1836 .parent = &usb_fs1_src_clk.c,
1837 .c = {
1838 .dbg_name = "usb_fs1_sys_clk",
1839 .ops = &clk_ops_branch,
1840 CLK_INIT(usb_fs1_sys_clk.c),
1841 },
1842};
1843
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001844static CLK_USB_FS(usb_fs2_src, 2, 60000000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001845static struct branch_clk usb_fs2_xcvr_clk = {
1846 .b = {
1847 .ctl_reg = USB_FSn_XCVR_FS_CLK_NS_REG(2),
1848 .en_mask = BIT(9),
1849 .reset_reg = USB_FSn_RESET_REG(2),
1850 .reset_mask = BIT(1),
1851 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1852 .halt_bit = 12,
1853 },
1854 .parent = &usb_fs2_src_clk.c,
1855 .c = {
1856 .dbg_name = "usb_fs2_xcvr_clk",
1857 .ops = &clk_ops_branch,
1858 CLK_INIT(usb_fs2_xcvr_clk.c),
1859 },
1860};
1861
1862static struct branch_clk usb_fs2_sys_clk = {
1863 .b = {
1864 .ctl_reg = USB_FSn_SYSTEM_CLK_CTL_REG(2),
1865 .en_mask = BIT(4),
1866 .reset_reg = USB_FSn_RESET_REG(2),
1867 .reset_mask = BIT(0),
1868 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
1869 .halt_bit = 13,
1870 },
1871 .parent = &usb_fs2_src_clk.c,
1872 .c = {
1873 .dbg_name = "usb_fs2_sys_clk",
1874 .ops = &clk_ops_branch,
1875 CLK_INIT(usb_fs2_sys_clk.c),
1876 },
1877};
1878
1879/* Fast Peripheral Bus Clocks */
1880static struct branch_clk ce1_core_clk = {
1881 .b = {
1882 .ctl_reg = CE1_CORE_CLK_CTL_REG,
1883 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08001884 .hwcg_reg = CE1_CORE_CLK_CTL_REG,
1885 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001886 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1887 .halt_bit = 27,
1888 },
1889 .c = {
1890 .dbg_name = "ce1_core_clk",
1891 .ops = &clk_ops_branch,
1892 CLK_INIT(ce1_core_clk.c),
1893 },
1894};
Tianyi Gou41515e22011-09-01 19:37:43 -07001895
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001896static struct branch_clk ce1_p_clk = {
1897 .b = {
1898 .ctl_reg = CE1_HCLK_CTL_REG,
1899 .en_mask = BIT(4),
1900 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
1901 .halt_bit = 1,
1902 },
1903 .c = {
1904 .dbg_name = "ce1_p_clk",
1905 .ops = &clk_ops_branch,
1906 CLK_INIT(ce1_p_clk.c),
1907 },
1908};
1909
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001910#define F_CE3(f, s, d) \
Tianyi Gou41515e22011-09-01 19:37:43 -07001911 { \
1912 .freq_hz = f, \
1913 .src_clk = &s##_clk.c, \
1914 .ns_val = NS_DIVSRC(6, 3, d, 2, 0, s##_to_bb_mux), \
Tianyi Gou41515e22011-09-01 19:37:43 -07001915 }
1916
1917static struct clk_freq_tbl clk_tbl_ce3[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001918 F_CE3( 0, gnd, 1),
1919 F_CE3( 48000000, pll8, 8),
1920 F_CE3(100000000, pll3, 12),
Patrick Dalyedb86f42012-08-23 19:07:30 -07001921 F_CE3(120000000, pll3, 10),
Tianyi Gou41515e22011-09-01 19:37:43 -07001922 F_END
1923};
1924
1925static struct rcg_clk ce3_src_clk = {
1926 .b = {
1927 .ctl_reg = CE3_CLK_SRC_NS_REG,
1928 .halt_check = NOCHECK,
1929 },
1930 .ns_reg = CE3_CLK_SRC_NS_REG,
1931 .root_en_mask = BIT(7),
1932 .ns_mask = BM(6, 0),
1933 .set_rate = set_rate_nop,
1934 .freq_tbl = clk_tbl_ce3,
1935 .current_freq = &rcg_dummy_freq,
1936 .c = {
1937 .dbg_name = "ce3_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07001938 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07001939 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
Tianyi Gou41515e22011-09-01 19:37:43 -07001940 CLK_INIT(ce3_src_clk.c),
1941 },
1942};
1943
Patrick Dalyedb86f42012-08-23 19:07:30 -07001944static unsigned long fmax_ce3_8064v2[MAX_VDD_LEVELS] __initdata = {
1945 [VDD_DIG_LOW] = 57000000,
1946 [VDD_DIG_NOMINAL] = 120000000,
1947};
1948
Tianyi Gou41515e22011-09-01 19:37:43 -07001949static struct branch_clk ce3_core_clk = {
1950 .b = {
1951 .ctl_reg = CE3_CORE_CLK_CTL_REG,
1952 .en_mask = BIT(4),
1953 .reset_reg = CE3_CORE_CLK_CTL_REG,
1954 .reset_mask = BIT(7),
1955 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
1956 .halt_bit = 5,
1957 },
1958 .parent = &ce3_src_clk.c,
1959 .c = {
1960 .dbg_name = "ce3_core_clk",
1961 .ops = &clk_ops_branch,
1962 CLK_INIT(ce3_core_clk.c),
1963 }
1964};
1965
1966static struct branch_clk ce3_p_clk = {
1967 .b = {
1968 .ctl_reg = CE3_HCLK_CTL_REG,
1969 .en_mask = BIT(4),
1970 .reset_reg = CE3_HCLK_CTL_REG,
1971 .reset_mask = BIT(7),
1972 .halt_reg = CLK_HALT_AFAB_SFAB_STATEB_REG,
1973 .halt_bit = 16,
1974 },
1975 .parent = &ce3_src_clk.c,
1976 .c = {
1977 .dbg_name = "ce3_p_clk",
1978 .ops = &clk_ops_branch,
1979 CLK_INIT(ce3_p_clk.c),
1980 }
1981};
1982
Tianyi Gou352955d2012-05-18 19:44:01 -07001983#define F_SATA(f, s, d) \
1984 { \
1985 .freq_hz = f, \
1986 .src_clk = &s##_clk.c, \
1987 .ns_val = NS_DIVSRC(6, 3, d, 2, 0, s##_to_bb_mux), \
1988 }
1989
1990static struct clk_freq_tbl clk_tbl_sata[] = {
1991 F_SATA( 0, gnd, 1),
1992 F_SATA( 48000000, pll8, 8),
1993 F_SATA(100000000, pll3, 12),
1994 F_END
1995};
1996
1997static struct rcg_clk sata_src_clk = {
1998 .b = {
1999 .ctl_reg = SATA_CLK_SRC_NS_REG,
2000 .halt_check = NOCHECK,
2001 },
2002 .ns_reg = SATA_CLK_SRC_NS_REG,
2003 .root_en_mask = BIT(7),
2004 .ns_mask = BM(6, 0),
2005 .set_rate = set_rate_nop,
2006 .freq_tbl = clk_tbl_sata,
2007 .current_freq = &rcg_dummy_freq,
2008 .c = {
2009 .dbg_name = "sata_src_clk",
2010 .ops = &clk_ops_rcg,
2011 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
2012 CLK_INIT(sata_src_clk.c),
2013 },
2014};
2015
2016static struct branch_clk sata_rxoob_clk = {
2017 .b = {
2018 .ctl_reg = SATA_RXOOB_CLK_CTL_REG,
2019 .en_mask = BIT(4),
2020 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
2021 .halt_bit = 26,
2022 },
2023 .parent = &sata_src_clk.c,
2024 .c = {
2025 .dbg_name = "sata_rxoob_clk",
2026 .ops = &clk_ops_branch,
2027 CLK_INIT(sata_rxoob_clk.c),
2028 },
2029};
2030
2031static struct branch_clk sata_pmalive_clk = {
2032 .b = {
2033 .ctl_reg = SATA_PMALIVE_CLK_CTL_REG,
2034 .en_mask = BIT(4),
2035 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
2036 .halt_bit = 25,
2037 },
2038 .parent = &sata_src_clk.c,
2039 .c = {
2040 .dbg_name = "sata_pmalive_clk",
2041 .ops = &clk_ops_branch,
2042 CLK_INIT(sata_pmalive_clk.c),
2043 },
2044};
2045
Tianyi Gou41515e22011-09-01 19:37:43 -07002046static struct branch_clk sata_phy_ref_clk = {
2047 .b = {
2048 .ctl_reg = SATA_PHY_REF_CLK_CTL_REG,
2049 .en_mask = BIT(4),
2050 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
2051 .halt_bit = 24,
2052 },
2053 .parent = &pxo_clk.c,
2054 .c = {
2055 .dbg_name = "sata_phy_ref_clk",
2056 .ops = &clk_ops_branch,
2057 CLK_INIT(sata_phy_ref_clk.c),
2058 },
2059};
2060
Tianyi Gou352955d2012-05-18 19:44:01 -07002061static struct branch_clk sata_a_clk = {
2062 .b = {
2063 .ctl_reg = SATA_ACLK_CTL_REG,
2064 .en_mask = BIT(4),
2065 .halt_reg = CLK_HALT_AFAB_SFAB_STATEA_REG,
2066 .halt_bit = 12,
2067 },
2068 .c = {
2069 .dbg_name = "sata_a_clk",
2070 .ops = &clk_ops_branch,
2071 CLK_INIT(sata_a_clk.c),
2072 },
2073};
2074
2075static struct branch_clk sata_p_clk = {
2076 .b = {
2077 .ctl_reg = SATA_HCLK_CTL_REG,
2078 .en_mask = BIT(4),
2079 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
2080 .halt_bit = 27,
2081 },
2082 .c = {
2083 .dbg_name = "sata_p_clk",
2084 .ops = &clk_ops_branch,
2085 CLK_INIT(sata_p_clk.c),
2086 },
2087};
2088
2089static struct branch_clk sfab_sata_s_p_clk = {
2090 .b = {
2091 .ctl_reg = SFAB_SATA_S_HCLK_CTL_REG,
2092 .en_mask = BIT(4),
2093 .halt_reg = CLK_HALT_AFAB_SFAB_STATEB_REG,
2094 .halt_bit = 14,
2095 },
2096 .c = {
2097 .dbg_name = "sfab_sata_s_p_clk",
2098 .ops = &clk_ops_branch,
2099 CLK_INIT(sfab_sata_s_p_clk.c),
2100 },
2101};
Tianyi Gou41515e22011-09-01 19:37:43 -07002102static struct branch_clk pcie_p_clk = {
2103 .b = {
2104 .ctl_reg = PCIE_HCLK_CTL_REG,
2105 .en_mask = BIT(4),
2106 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
2107 .halt_bit = 8,
2108 },
2109 .c = {
2110 .dbg_name = "pcie_p_clk",
2111 .ops = &clk_ops_branch,
2112 CLK_INIT(pcie_p_clk.c),
2113 },
2114};
2115
Tianyi Gou6613de52012-01-27 17:57:53 -08002116static struct branch_clk pcie_phy_ref_clk = {
2117 .b = {
2118 .ctl_reg = PCIE_PCLK_CTL_REG,
2119 .en_mask = BIT(4),
2120 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
2121 .halt_bit = 29,
2122 },
2123 .c = {
2124 .dbg_name = "pcie_phy_ref_clk",
2125 .ops = &clk_ops_branch,
2126 CLK_INIT(pcie_phy_ref_clk.c),
2127 },
2128};
2129
2130static struct branch_clk pcie_a_clk = {
2131 .b = {
2132 .ctl_reg = PCIE_ACLK_CTL_REG,
2133 .en_mask = BIT(4),
2134 .halt_reg = CLK_HALT_AFAB_SFAB_STATEA_REG,
2135 .halt_bit = 13,
2136 },
2137 .c = {
2138 .dbg_name = "pcie_a_clk",
2139 .ops = &clk_ops_branch,
2140 CLK_INIT(pcie_a_clk.c),
2141 },
2142};
2143
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002144static struct branch_clk dma_bam_p_clk = {
2145 .b = {
2146 .ctl_reg = DMA_BAM_HCLK_CTL,
2147 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002148 .hwcg_reg = DMA_BAM_HCLK_CTL,
2149 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002150 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2151 .halt_bit = 12,
2152 },
2153 .c = {
2154 .dbg_name = "dma_bam_p_clk",
2155 .ops = &clk_ops_branch,
2156 CLK_INIT(dma_bam_p_clk.c),
2157 },
2158};
2159
2160static struct branch_clk gsbi1_p_clk = {
2161 .b = {
2162 .ctl_reg = GSBIn_HCLK_CTL_REG(1),
2163 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002164 .hwcg_reg = GSBIn_HCLK_CTL_REG(1),
2165 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002166 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
2167 .halt_bit = 11,
2168 },
2169 .c = {
2170 .dbg_name = "gsbi1_p_clk",
2171 .ops = &clk_ops_branch,
2172 CLK_INIT(gsbi1_p_clk.c),
2173 },
2174};
2175
2176static struct branch_clk gsbi2_p_clk = {
2177 .b = {
2178 .ctl_reg = GSBIn_HCLK_CTL_REG(2),
2179 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002180 .hwcg_reg = GSBIn_HCLK_CTL_REG(2),
2181 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002182 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
2183 .halt_bit = 7,
2184 },
2185 .c = {
2186 .dbg_name = "gsbi2_p_clk",
2187 .ops = &clk_ops_branch,
2188 CLK_INIT(gsbi2_p_clk.c),
2189 },
2190};
2191
2192static struct branch_clk gsbi3_p_clk = {
2193 .b = {
2194 .ctl_reg = GSBIn_HCLK_CTL_REG(3),
2195 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002196 .hwcg_reg = GSBIn_HCLK_CTL_REG(3),
2197 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002198 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
2199 .halt_bit = 3,
2200 },
2201 .c = {
2202 .dbg_name = "gsbi3_p_clk",
2203 .ops = &clk_ops_branch,
2204 CLK_INIT(gsbi3_p_clk.c),
2205 },
2206};
2207
2208static struct branch_clk gsbi4_p_clk = {
2209 .b = {
2210 .ctl_reg = GSBIn_HCLK_CTL_REG(4),
2211 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002212 .hwcg_reg = GSBIn_HCLK_CTL_REG(4),
2213 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002214 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
2215 .halt_bit = 27,
2216 },
2217 .c = {
2218 .dbg_name = "gsbi4_p_clk",
2219 .ops = &clk_ops_branch,
2220 CLK_INIT(gsbi4_p_clk.c),
2221 },
2222};
2223
2224static struct branch_clk gsbi5_p_clk = {
2225 .b = {
2226 .ctl_reg = GSBIn_HCLK_CTL_REG(5),
2227 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002228 .hwcg_reg = GSBIn_HCLK_CTL_REG(5),
2229 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002230 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
2231 .halt_bit = 23,
2232 },
2233 .c = {
2234 .dbg_name = "gsbi5_p_clk",
2235 .ops = &clk_ops_branch,
2236 CLK_INIT(gsbi5_p_clk.c),
2237 },
2238};
2239
2240static struct branch_clk gsbi6_p_clk = {
2241 .b = {
2242 .ctl_reg = GSBIn_HCLK_CTL_REG(6),
2243 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002244 .hwcg_reg = GSBIn_HCLK_CTL_REG(6),
2245 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002246 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
2247 .halt_bit = 19,
2248 },
2249 .c = {
2250 .dbg_name = "gsbi6_p_clk",
2251 .ops = &clk_ops_branch,
2252 CLK_INIT(gsbi6_p_clk.c),
2253 },
2254};
2255
2256static struct branch_clk gsbi7_p_clk = {
2257 .b = {
2258 .ctl_reg = GSBIn_HCLK_CTL_REG(7),
2259 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002260 .hwcg_reg = GSBIn_HCLK_CTL_REG(7),
2261 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002262 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
2263 .halt_bit = 15,
2264 },
2265 .c = {
2266 .dbg_name = "gsbi7_p_clk",
2267 .ops = &clk_ops_branch,
2268 CLK_INIT(gsbi7_p_clk.c),
2269 },
2270};
2271
2272static struct branch_clk gsbi8_p_clk = {
2273 .b = {
2274 .ctl_reg = GSBIn_HCLK_CTL_REG(8),
2275 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002276 .hwcg_reg = GSBIn_HCLK_CTL_REG(8),
2277 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002278 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
2279 .halt_bit = 11,
2280 },
2281 .c = {
2282 .dbg_name = "gsbi8_p_clk",
2283 .ops = &clk_ops_branch,
2284 CLK_INIT(gsbi8_p_clk.c),
2285 },
2286};
2287
2288static struct branch_clk gsbi9_p_clk = {
2289 .b = {
2290 .ctl_reg = GSBIn_HCLK_CTL_REG(9),
2291 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002292 .hwcg_reg = GSBIn_HCLK_CTL_REG(9),
2293 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002294 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
2295 .halt_bit = 7,
2296 },
2297 .c = {
2298 .dbg_name = "gsbi9_p_clk",
2299 .ops = &clk_ops_branch,
2300 CLK_INIT(gsbi9_p_clk.c),
2301 },
2302};
2303
2304static struct branch_clk gsbi10_p_clk = {
2305 .b = {
2306 .ctl_reg = GSBIn_HCLK_CTL_REG(10),
2307 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002308 .hwcg_reg = GSBIn_HCLK_CTL_REG(10),
2309 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002310 .halt_reg = CLK_HALT_CFPB_STATEB_REG,
2311 .halt_bit = 3,
2312 },
2313 .c = {
2314 .dbg_name = "gsbi10_p_clk",
2315 .ops = &clk_ops_branch,
2316 CLK_INIT(gsbi10_p_clk.c),
2317 },
2318};
2319
2320static struct branch_clk gsbi11_p_clk = {
2321 .b = {
2322 .ctl_reg = GSBIn_HCLK_CTL_REG(11),
2323 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002324 .hwcg_reg = GSBIn_HCLK_CTL_REG(11),
2325 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002326 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
2327 .halt_bit = 18,
2328 },
2329 .c = {
2330 .dbg_name = "gsbi11_p_clk",
2331 .ops = &clk_ops_branch,
2332 CLK_INIT(gsbi11_p_clk.c),
2333 },
2334};
2335
2336static struct branch_clk gsbi12_p_clk = {
2337 .b = {
2338 .ctl_reg = GSBIn_HCLK_CTL_REG(12),
2339 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002340 .hwcg_reg = GSBIn_HCLK_CTL_REG(12),
2341 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002342 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
2343 .halt_bit = 14,
2344 },
2345 .c = {
2346 .dbg_name = "gsbi12_p_clk",
2347 .ops = &clk_ops_branch,
2348 CLK_INIT(gsbi12_p_clk.c),
2349 },
2350};
2351
Tianyi Gou41515e22011-09-01 19:37:43 -07002352static struct branch_clk sata_phy_cfg_clk = {
2353 .b = {
2354 .ctl_reg = SATA_PHY_CFG_CLK_CTL_REG,
2355 .en_mask = BIT(4),
2356 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
2357 .halt_bit = 12,
2358 },
2359 .c = {
2360 .dbg_name = "sata_phy_cfg_clk",
2361 .ops = &clk_ops_branch,
2362 CLK_INIT(sata_phy_cfg_clk.c),
Stephen Boyd973e4ba2011-07-12 17:06:01 -07002363 },
2364};
2365
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002366static struct branch_clk tsif_p_clk = {
2367 .b = {
2368 .ctl_reg = TSIF_HCLK_CTL_REG,
2369 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002370 .hwcg_reg = TSIF_HCLK_CTL_REG,
2371 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002372 .halt_reg = CLK_HALT_CFPB_STATEC_REG,
2373 .halt_bit = 7,
2374 },
2375 .c = {
2376 .dbg_name = "tsif_p_clk",
2377 .ops = &clk_ops_branch,
2378 CLK_INIT(tsif_p_clk.c),
2379 },
2380};
2381
2382static struct branch_clk usb_fs1_p_clk = {
2383 .b = {
2384 .ctl_reg = USB_FSn_HCLK_CTL_REG(1),
2385 .en_mask = BIT(4),
2386 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
2387 .halt_bit = 17,
2388 },
2389 .c = {
2390 .dbg_name = "usb_fs1_p_clk",
2391 .ops = &clk_ops_branch,
2392 CLK_INIT(usb_fs1_p_clk.c),
2393 },
2394};
2395
2396static struct branch_clk usb_fs2_p_clk = {
2397 .b = {
2398 .ctl_reg = USB_FSn_HCLK_CTL_REG(2),
2399 .en_mask = BIT(4),
2400 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
2401 .halt_bit = 14,
2402 },
2403 .c = {
2404 .dbg_name = "usb_fs2_p_clk",
2405 .ops = &clk_ops_branch,
2406 CLK_INIT(usb_fs2_p_clk.c),
2407 },
2408};
2409
2410static struct branch_clk usb_hs1_p_clk = {
2411 .b = {
2412 .ctl_reg = USB_HS1_HCLK_CTL_REG,
2413 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002414 .hwcg_reg = USB_HS1_HCLK_CTL_REG,
2415 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002416 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2417 .halt_bit = 1,
2418 },
2419 .c = {
2420 .dbg_name = "usb_hs1_p_clk",
2421 .ops = &clk_ops_branch,
2422 CLK_INIT(usb_hs1_p_clk.c),
2423 },
2424};
2425
Tianyi Gou41515e22011-09-01 19:37:43 -07002426static struct branch_clk usb_hs3_p_clk = {
2427 .b = {
2428 .ctl_reg = USB_HS3_HCLK_CTL_REG,
2429 .en_mask = BIT(4),
2430 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2431 .halt_bit = 31,
2432 },
2433 .c = {
2434 .dbg_name = "usb_hs3_p_clk",
2435 .ops = &clk_ops_branch,
2436 CLK_INIT(usb_hs3_p_clk.c),
2437 },
2438};
2439
2440static struct branch_clk usb_hs4_p_clk = {
2441 .b = {
2442 .ctl_reg = USB_HS4_HCLK_CTL_REG,
2443 .en_mask = BIT(4),
2444 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2445 .halt_bit = 7,
2446 },
2447 .c = {
2448 .dbg_name = "usb_hs4_p_clk",
2449 .ops = &clk_ops_branch,
2450 CLK_INIT(usb_hs4_p_clk.c),
2451 },
2452};
2453
Stephen Boyd94625ef2011-07-12 17:06:01 -07002454static struct branch_clk usb_hsic_p_clk = {
2455 .b = {
2456 .ctl_reg = USB_HSIC_HCLK_CTL_REG,
2457 .en_mask = BIT(4),
2458 .halt_reg = CLK_HALT_CFPB_STATEA_REG,
2459 .halt_bit = 28,
2460 },
2461 .c = {
2462 .dbg_name = "usb_hsic_p_clk",
2463 .ops = &clk_ops_branch,
2464 CLK_INIT(usb_hsic_p_clk.c),
2465 },
2466};
2467
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002468static struct branch_clk sdc1_p_clk = {
2469 .b = {
2470 .ctl_reg = SDCn_HCLK_CTL_REG(1),
2471 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002472 .hwcg_reg = SDCn_HCLK_CTL_REG(1),
2473 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002474 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2475 .halt_bit = 11,
2476 },
2477 .c = {
2478 .dbg_name = "sdc1_p_clk",
2479 .ops = &clk_ops_branch,
2480 CLK_INIT(sdc1_p_clk.c),
2481 },
2482};
2483
2484static struct branch_clk sdc2_p_clk = {
2485 .b = {
2486 .ctl_reg = SDCn_HCLK_CTL_REG(2),
2487 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002488 .hwcg_reg = SDCn_HCLK_CTL_REG(2),
2489 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002490 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2491 .halt_bit = 10,
2492 },
2493 .c = {
2494 .dbg_name = "sdc2_p_clk",
2495 .ops = &clk_ops_branch,
2496 CLK_INIT(sdc2_p_clk.c),
2497 },
2498};
2499
2500static struct branch_clk sdc3_p_clk = {
2501 .b = {
2502 .ctl_reg = SDCn_HCLK_CTL_REG(3),
2503 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002504 .hwcg_reg = SDCn_HCLK_CTL_REG(3),
2505 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002506 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2507 .halt_bit = 9,
2508 },
2509 .c = {
2510 .dbg_name = "sdc3_p_clk",
2511 .ops = &clk_ops_branch,
2512 CLK_INIT(sdc3_p_clk.c),
2513 },
2514};
2515
2516static struct branch_clk sdc4_p_clk = {
2517 .b = {
2518 .ctl_reg = SDCn_HCLK_CTL_REG(4),
2519 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002520 .hwcg_reg = SDCn_HCLK_CTL_REG(4),
2521 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002522 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2523 .halt_bit = 8,
2524 },
2525 .c = {
2526 .dbg_name = "sdc4_p_clk",
2527 .ops = &clk_ops_branch,
2528 CLK_INIT(sdc4_p_clk.c),
2529 },
2530};
2531
2532static struct branch_clk sdc5_p_clk = {
2533 .b = {
2534 .ctl_reg = SDCn_HCLK_CTL_REG(5),
2535 .en_mask = BIT(4),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002536 .hwcg_reg = SDCn_HCLK_CTL_REG(5),
2537 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002538 .halt_reg = CLK_HALT_DFAB_STATE_REG,
2539 .halt_bit = 7,
2540 },
2541 .c = {
2542 .dbg_name = "sdc5_p_clk",
2543 .ops = &clk_ops_branch,
2544 CLK_INIT(sdc5_p_clk.c),
2545 },
2546};
2547
2548/* HW-Voteable Clocks */
2549static struct branch_clk adm0_clk = {
2550 .b = {
2551 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2552 .en_mask = BIT(2),
2553 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
2554 .halt_check = HALT_VOTED,
2555 .halt_bit = 14,
2556 },
2557 .c = {
2558 .dbg_name = "adm0_clk",
2559 .ops = &clk_ops_branch,
2560 CLK_INIT(adm0_clk.c),
2561 },
2562};
2563
2564static struct branch_clk adm0_p_clk = {
2565 .b = {
2566 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2567 .en_mask = BIT(3),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002568 .hwcg_reg = ADM0_PBUS_CLK_CTL_REG,
2569 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002570 .halt_reg = CLK_HALT_MSS_SMPSS_MISC_STATE_REG,
2571 .halt_check = HALT_VOTED,
2572 .halt_bit = 13,
2573 },
2574 .c = {
2575 .dbg_name = "adm0_p_clk",
2576 .ops = &clk_ops_branch,
2577 CLK_INIT(adm0_p_clk.c),
2578 },
2579};
2580
2581static struct branch_clk pmic_arb0_p_clk = {
2582 .b = {
2583 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2584 .en_mask = BIT(8),
2585 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
2586 .halt_check = HALT_VOTED,
2587 .halt_bit = 22,
2588 },
2589 .c = {
2590 .dbg_name = "pmic_arb0_p_clk",
2591 .ops = &clk_ops_branch,
2592 CLK_INIT(pmic_arb0_p_clk.c),
2593 },
2594};
2595
2596static struct branch_clk pmic_arb1_p_clk = {
2597 .b = {
2598 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2599 .en_mask = BIT(9),
2600 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
2601 .halt_check = HALT_VOTED,
2602 .halt_bit = 21,
2603 },
2604 .c = {
2605 .dbg_name = "pmic_arb1_p_clk",
2606 .ops = &clk_ops_branch,
2607 CLK_INIT(pmic_arb1_p_clk.c),
2608 },
2609};
2610
2611static struct branch_clk pmic_ssbi2_clk = {
2612 .b = {
2613 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2614 .en_mask = BIT(7),
2615 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
2616 .halt_check = HALT_VOTED,
2617 .halt_bit = 23,
2618 },
2619 .c = {
2620 .dbg_name = "pmic_ssbi2_clk",
2621 .ops = &clk_ops_branch,
2622 CLK_INIT(pmic_ssbi2_clk.c),
2623 },
2624};
2625
2626static struct branch_clk rpm_msg_ram_p_clk = {
2627 .b = {
2628 .ctl_reg = SC0_U_CLK_BRANCH_ENA_VOTE_REG,
2629 .en_mask = BIT(6),
Stephen Boyda52d7e32011-11-10 11:59:00 -08002630 .hwcg_reg = RPM_MSG_RAM_HCLK_CTL_REG,
2631 .hwcg_mask = BIT(6),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002632 .halt_reg = CLK_HALT_SFPB_MISC_STATE_REG,
2633 .halt_check = HALT_VOTED,
2634 .halt_bit = 12,
2635 },
2636 .c = {
2637 .dbg_name = "rpm_msg_ram_p_clk",
2638 .ops = &clk_ops_branch,
2639 CLK_INIT(rpm_msg_ram_p_clk.c),
2640 },
2641};
2642
2643/*
2644 * Multimedia Clocks
2645 */
2646
Stephen Boyd94625ef2011-07-12 17:06:01 -07002647#define CLK_CAM(name, n, hb) \
2648 struct rcg_clk name = { \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002649 .b = { \
Stephen Boyd94625ef2011-07-12 17:06:01 -07002650 .ctl_reg = CAMCLK##n##_CC_REG, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002651 .en_mask = BIT(0), \
2652 .halt_reg = DBG_BUS_VEC_I_REG, \
2653 .halt_bit = hb, \
2654 }, \
Stephen Boyd94625ef2011-07-12 17:06:01 -07002655 .ns_reg = CAMCLK##n##_NS_REG, \
2656 .md_reg = CAMCLK##n##_MD_REG, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002657 .root_en_mask = BIT(2), \
Stephen Boyd94625ef2011-07-12 17:06:01 -07002658 .ns_mask = BM(31, 24) | BM(15, 14) | BM(2, 0), \
Matt Wagantall07c45472012-02-10 23:27:24 -08002659 .mnd_en_mask = BIT(5), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002660 .ctl_mask = BM(7, 6), \
2661 .set_rate = set_rate_mnd_8, \
2662 .freq_tbl = clk_tbl_cam, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002663 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002664 .c = { \
Stephen Boyd94625ef2011-07-12 17:06:01 -07002665 .dbg_name = #name, \
Stephen Boyd409b8b42012-04-10 12:12:56 -07002666 .ops = &clk_ops_rcg, \
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002667 VDD_DIG_FMAX_MAP2(LOW, 64000000, NOMINAL, 128000000), \
Stephen Boyd94625ef2011-07-12 17:06:01 -07002668 CLK_INIT(name.c), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002669 }, \
2670 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002671#define F_CAM(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002672 { \
2673 .freq_hz = f, \
2674 .src_clk = &s##_clk.c, \
2675 .md_val = MD8(8, m, 0, n), \
2676 .ns_val = NS_MM(31, 24, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \
2677 .ctl_val = CC(6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002678 }
2679static struct clk_freq_tbl clk_tbl_cam[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002680 F_CAM( 0, gnd, 1, 0, 0),
2681 F_CAM( 6000000, pll8, 4, 1, 16),
2682 F_CAM( 8000000, pll8, 4, 1, 12),
2683 F_CAM( 12000000, pll8, 4, 1, 8),
2684 F_CAM( 16000000, pll8, 4, 1, 6),
2685 F_CAM( 19200000, pll8, 4, 1, 5),
2686 F_CAM( 24000000, pll8, 4, 1, 4),
2687 F_CAM( 32000000, pll8, 4, 1, 3),
2688 F_CAM( 48000000, pll8, 4, 1, 2),
2689 F_CAM( 64000000, pll8, 3, 1, 2),
2690 F_CAM( 96000000, pll8, 4, 0, 0),
2691 F_CAM(128000000, pll8, 3, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002692 F_END
2693};
2694
Stephen Boyd94625ef2011-07-12 17:06:01 -07002695static CLK_CAM(cam0_clk, 0, 15);
2696static CLK_CAM(cam1_clk, 1, 16);
2697static CLK_CAM(cam2_clk, 2, 31);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002698
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002699#define F_CSI(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002700 { \
2701 .freq_hz = f, \
2702 .src_clk = &s##_clk.c, \
2703 .md_val = MD8(8, m, 0, n), \
2704 .ns_val = NS_MM(31, 24, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \
2705 .ctl_val = CC(6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002706 }
2707static struct clk_freq_tbl clk_tbl_csi[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002708 F_CSI( 0, gnd, 1, 0, 0),
Stephen Boyd092fd182011-10-21 15:56:30 -07002709 F_CSI( 27000000, pxo, 1, 0, 0),
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002710 F_CSI( 85330000, pll8, 1, 2, 9),
2711 F_CSI(177780000, pll2, 1, 2, 9),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002712 F_END
2713};
2714
2715static struct rcg_clk csi0_src_clk = {
2716 .ns_reg = CSI0_NS_REG,
2717 .b = {
2718 .ctl_reg = CSI0_CC_REG,
2719 .halt_check = NOCHECK,
2720 },
2721 .md_reg = CSI0_MD_REG,
2722 .root_en_mask = BIT(2),
Stephen Boyd94625ef2011-07-12 17:06:01 -07002723 .ns_mask = BM(31, 24) | BM(15, 14) | BM(2, 0),
Matt Wagantall07c45472012-02-10 23:27:24 -08002724 .mnd_en_mask = BIT(5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002725 .ctl_mask = BM(7, 6),
2726 .set_rate = set_rate_mnd,
2727 .freq_tbl = clk_tbl_csi,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002728 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002729 .c = {
2730 .dbg_name = "csi0_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002731 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002732 VDD_DIG_FMAX_MAP2(LOW, 86000000, NOMINAL, 178000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002733 CLK_INIT(csi0_src_clk.c),
Matt Wagantall67b8a9232012-07-20 17:16:03 -07002734 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002735 },
2736};
2737
2738static struct branch_clk csi0_clk = {
2739 .b = {
2740 .ctl_reg = CSI0_CC_REG,
2741 .en_mask = BIT(0),
2742 .reset_reg = SW_RESET_CORE_REG,
2743 .reset_mask = BIT(8),
2744 .halt_reg = DBG_BUS_VEC_B_REG,
2745 .halt_bit = 13,
2746 },
2747 .parent = &csi0_src_clk.c,
2748 .c = {
2749 .dbg_name = "csi0_clk",
2750 .ops = &clk_ops_branch,
2751 CLK_INIT(csi0_clk.c),
Matt Wagantall67b8a9232012-07-20 17:16:03 -07002752 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002753 },
2754};
2755
2756static struct branch_clk csi0_phy_clk = {
2757 .b = {
2758 .ctl_reg = CSI0_CC_REG,
2759 .en_mask = BIT(8),
2760 .reset_reg = SW_RESET_CORE_REG,
2761 .reset_mask = BIT(29),
2762 .halt_reg = DBG_BUS_VEC_I_REG,
2763 .halt_bit = 9,
2764 },
2765 .parent = &csi0_src_clk.c,
2766 .c = {
2767 .dbg_name = "csi0_phy_clk",
2768 .ops = &clk_ops_branch,
2769 CLK_INIT(csi0_phy_clk.c),
2770 },
2771};
2772
2773static struct rcg_clk csi1_src_clk = {
2774 .ns_reg = CSI1_NS_REG,
2775 .b = {
2776 .ctl_reg = CSI1_CC_REG,
2777 .halt_check = NOCHECK,
2778 },
2779 .md_reg = CSI1_MD_REG,
2780 .root_en_mask = BIT(2),
Stephen Boyd94625ef2011-07-12 17:06:01 -07002781 .ns_mask = BM(31, 24) | BM(15, 14) | BM(2, 0),
Matt Wagantall07c45472012-02-10 23:27:24 -08002782 .mnd_en_mask = BIT(5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002783 .ctl_mask = BM(7, 6),
2784 .set_rate = set_rate_mnd,
2785 .freq_tbl = clk_tbl_csi,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07002786 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002787 .c = {
2788 .dbg_name = "csi1_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002789 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002790 VDD_DIG_FMAX_MAP2(LOW, 86000000, NOMINAL, 178000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002791 CLK_INIT(csi1_src_clk.c),
Matt Wagantall67b8a9232012-07-20 17:16:03 -07002792 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002793 },
2794};
2795
2796static struct branch_clk csi1_clk = {
2797 .b = {
2798 .ctl_reg = CSI1_CC_REG,
2799 .en_mask = BIT(0),
2800 .reset_reg = SW_RESET_CORE_REG,
2801 .reset_mask = BIT(18),
2802 .halt_reg = DBG_BUS_VEC_B_REG,
2803 .halt_bit = 14,
2804 },
2805 .parent = &csi1_src_clk.c,
2806 .c = {
2807 .dbg_name = "csi1_clk",
2808 .ops = &clk_ops_branch,
2809 CLK_INIT(csi1_clk.c),
Matt Wagantall67b8a9232012-07-20 17:16:03 -07002810 .warned = true,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002811 },
2812};
2813
2814static struct branch_clk csi1_phy_clk = {
2815 .b = {
2816 .ctl_reg = CSI1_CC_REG,
2817 .en_mask = BIT(8),
2818 .reset_reg = SW_RESET_CORE_REG,
2819 .reset_mask = BIT(28),
2820 .halt_reg = DBG_BUS_VEC_I_REG,
2821 .halt_bit = 10,
2822 },
2823 .parent = &csi1_src_clk.c,
2824 .c = {
2825 .dbg_name = "csi1_phy_clk",
2826 .ops = &clk_ops_branch,
2827 CLK_INIT(csi1_phy_clk.c),
2828 },
2829};
2830
Stephen Boyd94625ef2011-07-12 17:06:01 -07002831static struct rcg_clk csi2_src_clk = {
2832 .ns_reg = CSI2_NS_REG,
2833 .b = {
2834 .ctl_reg = CSI2_CC_REG,
2835 .halt_check = NOCHECK,
2836 },
2837 .md_reg = CSI2_MD_REG,
2838 .root_en_mask = BIT(2),
2839 .ns_mask = BM(31, 24) | BM(15, 14) | BM(2, 0),
Matt Wagantall07c45472012-02-10 23:27:24 -08002840 .mnd_en_mask = BIT(5),
Stephen Boyd94625ef2011-07-12 17:06:01 -07002841 .ctl_mask = BM(7, 6),
2842 .set_rate = set_rate_mnd,
2843 .freq_tbl = clk_tbl_csi,
2844 .current_freq = &rcg_dummy_freq,
2845 .c = {
2846 .dbg_name = "csi2_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07002847 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07002848 VDD_DIG_FMAX_MAP2(LOW, 86000000, NOMINAL, 178000000),
Stephen Boyd94625ef2011-07-12 17:06:01 -07002849 CLK_INIT(csi2_src_clk.c),
Matt Wagantall67b8a9232012-07-20 17:16:03 -07002850 .warned = true,
Stephen Boyd94625ef2011-07-12 17:06:01 -07002851 },
2852};
2853
2854static struct branch_clk csi2_clk = {
2855 .b = {
2856 .ctl_reg = CSI2_CC_REG,
2857 .en_mask = BIT(0),
2858 .reset_reg = SW_RESET_CORE2_REG,
2859 .reset_mask = BIT(2),
2860 .halt_reg = DBG_BUS_VEC_B_REG,
2861 .halt_bit = 29,
2862 },
2863 .parent = &csi2_src_clk.c,
2864 .c = {
2865 .dbg_name = "csi2_clk",
2866 .ops = &clk_ops_branch,
2867 CLK_INIT(csi2_clk.c),
Matt Wagantall67b8a9232012-07-20 17:16:03 -07002868 .warned = true,
Stephen Boyd94625ef2011-07-12 17:06:01 -07002869 },
2870};
2871
2872static struct branch_clk csi2_phy_clk = {
2873 .b = {
2874 .ctl_reg = CSI2_CC_REG,
2875 .en_mask = BIT(8),
2876 .reset_reg = SW_RESET_CORE_REG,
2877 .reset_mask = BIT(31),
2878 .halt_reg = DBG_BUS_VEC_I_REG,
2879 .halt_bit = 29,
2880 },
2881 .parent = &csi2_src_clk.c,
2882 .c = {
2883 .dbg_name = "csi2_phy_clk",
2884 .ops = &clk_ops_branch,
2885 CLK_INIT(csi2_phy_clk.c),
2886 },
2887};
2888
Stephen Boyd092fd182011-10-21 15:56:30 -07002889static struct clk *pix_rdi_mux_map[] = {
2890 [0] = &csi0_clk.c,
2891 [1] = &csi1_clk.c,
2892 [2] = &csi2_clk.c,
2893 NULL,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002894};
2895
Stephen Boyd092fd182011-10-21 15:56:30 -07002896struct pix_rdi_clk {
Stephen Boyd2c2875f2012-01-24 17:36:34 -08002897 bool prepared;
Stephen Boyd092fd182011-10-21 15:56:30 -07002898 bool enabled;
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07002899 unsigned long cur_rate;
Stephen Boyd092fd182011-10-21 15:56:30 -07002900
2901 void __iomem *const s_reg;
2902 u32 s_mask;
2903
2904 void __iomem *const s2_reg;
2905 u32 s2_mask;
2906
2907 struct branch b;
2908 struct clk c;
2909};
2910
Matt Wagantallf82f2942012-01-27 13:56:13 -08002911static inline struct pix_rdi_clk *to_pix_rdi_clk(struct clk *c)
Stephen Boyd092fd182011-10-21 15:56:30 -07002912{
Matt Wagantallf82f2942012-01-27 13:56:13 -08002913 return container_of(c, struct pix_rdi_clk, c);
Stephen Boyd092fd182011-10-21 15:56:30 -07002914}
2915
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07002916static int pix_rdi_clk_set_rate(struct clk *c, unsigned long rate)
Stephen Boyd092fd182011-10-21 15:56:30 -07002917{
2918 int ret, i;
2919 u32 reg;
2920 unsigned long flags;
Matt Wagantallf82f2942012-01-27 13:56:13 -08002921 struct pix_rdi_clk *rdi = to_pix_rdi_clk(c);
Stephen Boyd092fd182011-10-21 15:56:30 -07002922 struct clk **mux_map = pix_rdi_mux_map;
Stephen Boyd2c2875f2012-01-24 17:36:34 -08002923 unsigned long old_rate = rdi->cur_rate;
Stephen Boyd092fd182011-10-21 15:56:30 -07002924
2925 /*
2926 * These clocks select three inputs via two muxes. One mux selects
2927 * between csi0 and csi1 and the second mux selects between that mux's
2928 * output and csi2. The source and destination selections for each
2929 * mux must be clocking for the switch to succeed so just turn on
2930 * all three sources because it's easier than figuring out what source
2931 * needs to be on at what time.
2932 */
2933 for (i = 0; mux_map[i]; i++) {
Stephen Boyd2c2875f2012-01-24 17:36:34 -08002934 ret = clk_prepare_enable(mux_map[i]);
Stephen Boyd092fd182011-10-21 15:56:30 -07002935 if (ret)
2936 goto err;
2937 }
2938 if (rate >= i) {
2939 ret = -EINVAL;
2940 goto err;
2941 }
2942 /* Keep the new source on when switching inputs of an enabled clock */
Stephen Boyd2c2875f2012-01-24 17:36:34 -08002943 if (rdi->prepared) {
2944 ret = clk_prepare(mux_map[rate]);
2945 if (ret)
2946 goto err;
Stephen Boyd092fd182011-10-21 15:56:30 -07002947 }
Stephen Boyd2c2875f2012-01-24 17:36:34 -08002948 spin_lock_irqsave(&c->lock, flags);
2949 if (rdi->enabled) {
2950 ret = clk_enable(mux_map[rate]);
2951 if (ret) {
2952 spin_unlock_irqrestore(&c->lock, flags);
2953 clk_unprepare(mux_map[rate]);
2954 goto err;
2955 }
2956 }
2957 spin_lock(&local_clock_reg_lock);
Matt Wagantallf82f2942012-01-27 13:56:13 -08002958 reg = readl_relaxed(rdi->s2_reg);
2959 reg &= ~rdi->s2_mask;
2960 reg |= rate == 2 ? rdi->s2_mask : 0;
2961 writel_relaxed(reg, rdi->s2_reg);
Stephen Boyd092fd182011-10-21 15:56:30 -07002962 /*
2963 * Wait at least 6 cycles of slowest clock
2964 * for the glitch-free MUX to fully switch sources.
2965 */
2966 mb();
2967 udelay(1);
Matt Wagantallf82f2942012-01-27 13:56:13 -08002968 reg = readl_relaxed(rdi->s_reg);
2969 reg &= ~rdi->s_mask;
2970 reg |= rate == 1 ? rdi->s_mask : 0;
2971 writel_relaxed(reg, rdi->s_reg);
Stephen Boyd092fd182011-10-21 15:56:30 -07002972 /*
2973 * Wait at least 6 cycles of slowest clock
2974 * for the glitch-free MUX to fully switch sources.
2975 */
2976 mb();
2977 udelay(1);
Matt Wagantallf82f2942012-01-27 13:56:13 -08002978 rdi->cur_rate = rate;
Stephen Boyd2c2875f2012-01-24 17:36:34 -08002979 spin_unlock(&local_clock_reg_lock);
2980
2981 if (rdi->enabled)
2982 clk_disable(mux_map[old_rate]);
2983 spin_unlock_irqrestore(&c->lock, flags);
2984 if (rdi->prepared)
2985 clk_unprepare(mux_map[old_rate]);
Stephen Boyd092fd182011-10-21 15:56:30 -07002986err:
2987 for (i--; i >= 0; i--)
Stephen Boyd2c2875f2012-01-24 17:36:34 -08002988 clk_disable_unprepare(mux_map[i]);
Stephen Boyd092fd182011-10-21 15:56:30 -07002989
2990 return 0;
2991}
2992
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07002993static unsigned long pix_rdi_clk_get_rate(struct clk *c)
Stephen Boyd092fd182011-10-21 15:56:30 -07002994{
2995 return to_pix_rdi_clk(c)->cur_rate;
2996}
2997
Stephen Boyd2c2875f2012-01-24 17:36:34 -08002998static int pix_rdi_clk_prepare(struct clk *c)
2999{
3000 struct pix_rdi_clk *rdi = to_pix_rdi_clk(c);
3001 rdi->prepared = true;
3002 return 0;
3003}
3004
Stephen Boyd092fd182011-10-21 15:56:30 -07003005static int pix_rdi_clk_enable(struct clk *c)
3006{
3007 unsigned long flags;
Matt Wagantallf82f2942012-01-27 13:56:13 -08003008 struct pix_rdi_clk *rdi = to_pix_rdi_clk(c);
Stephen Boyd092fd182011-10-21 15:56:30 -07003009
3010 spin_lock_irqsave(&local_clock_reg_lock, flags);
Matt Wagantall0de1b3f2012-06-05 19:52:43 -07003011 __branch_enable_reg(&rdi->b, rdi->c.dbg_name);
Stephen Boyd092fd182011-10-21 15:56:30 -07003012 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
Matt Wagantallf82f2942012-01-27 13:56:13 -08003013 rdi->enabled = true;
Stephen Boyd092fd182011-10-21 15:56:30 -07003014
3015 return 0;
3016}
3017
3018static void pix_rdi_clk_disable(struct clk *c)
3019{
3020 unsigned long flags;
Matt Wagantallf82f2942012-01-27 13:56:13 -08003021 struct pix_rdi_clk *rdi = to_pix_rdi_clk(c);
Stephen Boyd092fd182011-10-21 15:56:30 -07003022
3023 spin_lock_irqsave(&local_clock_reg_lock, flags);
Matt Wagantall0de1b3f2012-06-05 19:52:43 -07003024 __branch_disable_reg(&rdi->b, rdi->c.dbg_name);
Stephen Boyd092fd182011-10-21 15:56:30 -07003025 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
Matt Wagantallf82f2942012-01-27 13:56:13 -08003026 rdi->enabled = false;
Stephen Boyd092fd182011-10-21 15:56:30 -07003027}
3028
Stephen Boyd2c2875f2012-01-24 17:36:34 -08003029static void pix_rdi_clk_unprepare(struct clk *c)
3030{
3031 struct pix_rdi_clk *rdi = to_pix_rdi_clk(c);
3032 rdi->prepared = false;
3033}
3034
Matt Wagantallf82f2942012-01-27 13:56:13 -08003035static int pix_rdi_clk_reset(struct clk *c, enum clk_reset_action action)
Stephen Boyd092fd182011-10-21 15:56:30 -07003036{
Matt Wagantallf82f2942012-01-27 13:56:13 -08003037 return branch_reset(&to_pix_rdi_clk(c)->b, action);
Stephen Boyd092fd182011-10-21 15:56:30 -07003038}
3039
3040static struct clk *pix_rdi_clk_get_parent(struct clk *c)
3041{
Matt Wagantallf82f2942012-01-27 13:56:13 -08003042 return pix_rdi_mux_map[to_pix_rdi_clk(c)->cur_rate];
Stephen Boyd092fd182011-10-21 15:56:30 -07003043}
3044
3045static int pix_rdi_clk_list_rate(struct clk *c, unsigned n)
3046{
3047 if (pix_rdi_mux_map[n])
3048 return n;
3049 return -ENXIO;
3050}
3051
Matt Wagantalla15833b2012-04-03 11:00:56 -07003052static enum handoff pix_rdi_clk_handoff(struct clk *c)
Stephen Boyd092fd182011-10-21 15:56:30 -07003053{
3054 u32 reg;
Matt Wagantallf82f2942012-01-27 13:56:13 -08003055 struct pix_rdi_clk *rdi = to_pix_rdi_clk(c);
Matt Wagantalla15833b2012-04-03 11:00:56 -07003056 enum handoff ret;
3057
Matt Wagantallf82f2942012-01-27 13:56:13 -08003058 ret = branch_handoff(&rdi->b, &rdi->c);
Matt Wagantalla15833b2012-04-03 11:00:56 -07003059 if (ret == HANDOFF_DISABLED_CLK)
3060 return ret;
Stephen Boyd092fd182011-10-21 15:56:30 -07003061
Matt Wagantallf82f2942012-01-27 13:56:13 -08003062 reg = readl_relaxed(rdi->s_reg);
3063 rdi->cur_rate = reg & rdi->s_mask ? 1 : 0;
3064 reg = readl_relaxed(rdi->s2_reg);
3065 rdi->cur_rate = reg & rdi->s2_mask ? 2 : rdi->cur_rate;
Matt Wagantalla15833b2012-04-03 11:00:56 -07003066
3067 return HANDOFF_ENABLED_CLK;
Stephen Boyd092fd182011-10-21 15:56:30 -07003068}
3069
3070static struct clk_ops clk_ops_pix_rdi_8960 = {
Stephen Boyd2c2875f2012-01-24 17:36:34 -08003071 .prepare = pix_rdi_clk_prepare,
Stephen Boyd092fd182011-10-21 15:56:30 -07003072 .enable = pix_rdi_clk_enable,
3073 .disable = pix_rdi_clk_disable,
Stephen Boyd2c2875f2012-01-24 17:36:34 -08003074 .unprepare = pix_rdi_clk_unprepare,
Stephen Boyd092fd182011-10-21 15:56:30 -07003075 .handoff = pix_rdi_clk_handoff,
3076 .set_rate = pix_rdi_clk_set_rate,
3077 .get_rate = pix_rdi_clk_get_rate,
3078 .list_rate = pix_rdi_clk_list_rate,
3079 .reset = pix_rdi_clk_reset,
Stephen Boyd092fd182011-10-21 15:56:30 -07003080 .get_parent = pix_rdi_clk_get_parent,
3081};
3082
3083static struct pix_rdi_clk csi_pix_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003084 .b = {
3085 .ctl_reg = MISC_CC_REG,
3086 .en_mask = BIT(26),
3087 .halt_check = DELAY,
3088 .reset_reg = SW_RESET_CORE_REG,
3089 .reset_mask = BIT(26),
3090 },
Stephen Boyd092fd182011-10-21 15:56:30 -07003091 .s_reg = MISC_CC_REG,
3092 .s_mask = BIT(25),
3093 .s2_reg = MISC_CC3_REG,
3094 .s2_mask = BIT(13),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003095 .c = {
3096 .dbg_name = "csi_pix_clk",
Stephen Boyd092fd182011-10-21 15:56:30 -07003097 .ops = &clk_ops_pix_rdi_8960,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003098 CLK_INIT(csi_pix_clk.c),
3099 },
3100};
3101
Stephen Boyd092fd182011-10-21 15:56:30 -07003102static struct pix_rdi_clk csi_pix1_clk = {
Stephen Boyd94625ef2011-07-12 17:06:01 -07003103 .b = {
3104 .ctl_reg = MISC_CC3_REG,
3105 .en_mask = BIT(10),
3106 .halt_check = DELAY,
3107 .reset_reg = SW_RESET_CORE_REG,
3108 .reset_mask = BIT(30),
3109 },
Stephen Boyd092fd182011-10-21 15:56:30 -07003110 .s_reg = MISC_CC3_REG,
3111 .s_mask = BIT(8),
3112 .s2_reg = MISC_CC3_REG,
3113 .s2_mask = BIT(9),
Stephen Boyd94625ef2011-07-12 17:06:01 -07003114 .c = {
3115 .dbg_name = "csi_pix1_clk",
Stephen Boyd092fd182011-10-21 15:56:30 -07003116 .ops = &clk_ops_pix_rdi_8960,
Stephen Boyd94625ef2011-07-12 17:06:01 -07003117 CLK_INIT(csi_pix1_clk.c),
3118 },
3119};
3120
Stephen Boyd092fd182011-10-21 15:56:30 -07003121static struct pix_rdi_clk csi_rdi_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003122 .b = {
3123 .ctl_reg = MISC_CC_REG,
3124 .en_mask = BIT(13),
3125 .halt_check = DELAY,
3126 .reset_reg = SW_RESET_CORE_REG,
3127 .reset_mask = BIT(27),
3128 },
Stephen Boyd092fd182011-10-21 15:56:30 -07003129 .s_reg = MISC_CC_REG,
3130 .s_mask = BIT(12),
3131 .s2_reg = MISC_CC3_REG,
3132 .s2_mask = BIT(12),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003133 .c = {
3134 .dbg_name = "csi_rdi_clk",
Stephen Boyd092fd182011-10-21 15:56:30 -07003135 .ops = &clk_ops_pix_rdi_8960,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003136 CLK_INIT(csi_rdi_clk.c),
3137 },
3138};
3139
Stephen Boyd092fd182011-10-21 15:56:30 -07003140static struct pix_rdi_clk csi_rdi1_clk = {
Stephen Boyd94625ef2011-07-12 17:06:01 -07003141 .b = {
3142 .ctl_reg = MISC_CC3_REG,
3143 .en_mask = BIT(2),
3144 .halt_check = DELAY,
3145 .reset_reg = SW_RESET_CORE2_REG,
3146 .reset_mask = BIT(1),
3147 },
Stephen Boyd092fd182011-10-21 15:56:30 -07003148 .s_reg = MISC_CC3_REG,
3149 .s_mask = BIT(0),
3150 .s2_reg = MISC_CC3_REG,
3151 .s2_mask = BIT(1),
Stephen Boyd94625ef2011-07-12 17:06:01 -07003152 .c = {
3153 .dbg_name = "csi_rdi1_clk",
Stephen Boyd092fd182011-10-21 15:56:30 -07003154 .ops = &clk_ops_pix_rdi_8960,
Stephen Boyd94625ef2011-07-12 17:06:01 -07003155 CLK_INIT(csi_rdi1_clk.c),
3156 },
3157};
3158
Stephen Boyd092fd182011-10-21 15:56:30 -07003159static struct pix_rdi_clk csi_rdi2_clk = {
Stephen Boyd94625ef2011-07-12 17:06:01 -07003160 .b = {
3161 .ctl_reg = MISC_CC3_REG,
3162 .en_mask = BIT(6),
3163 .halt_check = DELAY,
3164 .reset_reg = SW_RESET_CORE2_REG,
3165 .reset_mask = BIT(0),
3166 },
Stephen Boyd092fd182011-10-21 15:56:30 -07003167 .s_reg = MISC_CC3_REG,
3168 .s_mask = BIT(4),
3169 .s2_reg = MISC_CC3_REG,
3170 .s2_mask = BIT(5),
Stephen Boyd94625ef2011-07-12 17:06:01 -07003171 .c = {
3172 .dbg_name = "csi_rdi2_clk",
Stephen Boyd092fd182011-10-21 15:56:30 -07003173 .ops = &clk_ops_pix_rdi_8960,
Stephen Boyd94625ef2011-07-12 17:06:01 -07003174 CLK_INIT(csi_rdi2_clk.c),
3175 },
3176};
3177
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003178#define F_CSI_PHYTIMER(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003179 { \
3180 .freq_hz = f, \
3181 .src_clk = &s##_clk.c, \
3182 .md_val = MD8(8, m, 0, n), \
3183 .ns_val = NS_MM(31, 24, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \
3184 .ctl_val = CC(6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003185 }
3186static struct clk_freq_tbl clk_tbl_csi_phytimer[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003187 F_CSI_PHYTIMER( 0, gnd, 1, 0, 0),
3188 F_CSI_PHYTIMER( 85330000, pll8, 1, 2, 9),
3189 F_CSI_PHYTIMER(177780000, pll2, 1, 2, 9),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003190 F_END
3191};
3192
3193static struct rcg_clk csiphy_timer_src_clk = {
3194 .ns_reg = CSIPHYTIMER_NS_REG,
3195 .b = {
3196 .ctl_reg = CSIPHYTIMER_CC_REG,
3197 .halt_check = NOCHECK,
3198 },
3199 .md_reg = CSIPHYTIMER_MD_REG,
3200 .root_en_mask = BIT(2),
3201 .ns_mask = (BM(31, 24) | BM(15, 14) | BM(2, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08003202 .mnd_en_mask = BIT(5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003203 .ctl_mask = BM(7, 6),
3204 .set_rate = set_rate_mnd_8,
3205 .freq_tbl = clk_tbl_csi_phytimer,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003206 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003207 .c = {
3208 .dbg_name = "csiphy_timer_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003209 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003210 VDD_DIG_FMAX_MAP2(LOW, 86000000, NOMINAL, 178000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003211 CLK_INIT(csiphy_timer_src_clk.c),
3212 },
3213};
3214
3215static struct branch_clk csi0phy_timer_clk = {
3216 .b = {
3217 .ctl_reg = CSIPHYTIMER_CC_REG,
3218 .en_mask = BIT(0),
3219 .halt_reg = DBG_BUS_VEC_I_REG,
3220 .halt_bit = 17,
3221 },
3222 .parent = &csiphy_timer_src_clk.c,
3223 .c = {
3224 .dbg_name = "csi0phy_timer_clk",
3225 .ops = &clk_ops_branch,
3226 CLK_INIT(csi0phy_timer_clk.c),
3227 },
3228};
3229
3230static struct branch_clk csi1phy_timer_clk = {
3231 .b = {
3232 .ctl_reg = CSIPHYTIMER_CC_REG,
3233 .en_mask = BIT(9),
3234 .halt_reg = DBG_BUS_VEC_I_REG,
3235 .halt_bit = 18,
3236 },
3237 .parent = &csiphy_timer_src_clk.c,
3238 .c = {
3239 .dbg_name = "csi1phy_timer_clk",
3240 .ops = &clk_ops_branch,
3241 CLK_INIT(csi1phy_timer_clk.c),
3242 },
3243};
3244
Stephen Boyd94625ef2011-07-12 17:06:01 -07003245static struct branch_clk csi2phy_timer_clk = {
3246 .b = {
3247 .ctl_reg = CSIPHYTIMER_CC_REG,
3248 .en_mask = BIT(11),
3249 .halt_reg = DBG_BUS_VEC_I_REG,
3250 .halt_bit = 30,
3251 },
3252 .parent = &csiphy_timer_src_clk.c,
3253 .c = {
3254 .dbg_name = "csi2phy_timer_clk",
3255 .ops = &clk_ops_branch,
3256 CLK_INIT(csi2phy_timer_clk.c),
3257 },
3258};
3259
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003260#define F_DSI(d) \
3261 { \
3262 .freq_hz = d, \
3263 .ns_val = BVAL(15, 12, (d-1)), \
3264 }
3265/*
3266 * The DSI_BYTE/ESC clock is sourced from the DSI PHY PLL, which may change rate
3267 * without this clock driver knowing. So, overload the clk_set_rate() to set
3268 * the divider (1 to 16) of the clock with respect to the PLL rate.
3269 */
3270static struct clk_freq_tbl clk_tbl_dsi_byte[] = {
3271 F_DSI(1), F_DSI(2), F_DSI(3), F_DSI(4),
3272 F_DSI(5), F_DSI(6), F_DSI(7), F_DSI(8),
3273 F_DSI(9), F_DSI(10), F_DSI(11), F_DSI(12),
3274 F_DSI(13), F_DSI(14), F_DSI(15), F_DSI(16),
3275 F_END
3276};
3277
Matt Wagantall735e41b2012-07-23 17:18:58 -07003278static struct branch_clk dsi1_reset_clk = {
3279 .b = {
3280 .reset_reg = SW_RESET_CORE_REG,
3281 .reset_mask = BIT(7),
3282 .halt_check = NOCHECK,
3283 },
3284 .c = {
3285 .dbg_name = "dsi1_reset_clk",
3286 .ops = &clk_ops_branch,
3287 CLK_INIT(dsi1_reset_clk.c),
3288 },
3289};
3290
3291static struct branch_clk dsi2_reset_clk = {
3292 .b = {
3293 .reset_reg = SW_RESET_CORE_REG,
3294 .reset_mask = BIT(25),
3295 .halt_check = NOCHECK,
3296 },
3297 .c = {
3298 .dbg_name = "dsi2_reset_clk",
3299 .ops = &clk_ops_branch,
3300 CLK_INIT(dsi2_reset_clk.c),
3301 },
3302};
3303
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003304static struct rcg_clk dsi1_byte_clk = {
3305 .b = {
3306 .ctl_reg = DSI1_BYTE_CC_REG,
3307 .en_mask = BIT(0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003308 .halt_reg = DBG_BUS_VEC_B_REG,
3309 .halt_bit = 21,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003310 .retain_reg = DSI1_BYTE_CC_REG,
3311 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003312 },
3313 .ns_reg = DSI1_BYTE_NS_REG,
3314 .root_en_mask = BIT(2),
3315 .ns_mask = BM(15, 12),
3316 .set_rate = set_rate_nop,
3317 .freq_tbl = clk_tbl_dsi_byte,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003318 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003319 .c = {
3320 .dbg_name = "dsi1_byte_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003321 .ops = &clk_ops_rcg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003322 CLK_INIT(dsi1_byte_clk.c),
3323 },
3324};
3325
3326static struct rcg_clk dsi2_byte_clk = {
3327 .b = {
3328 .ctl_reg = DSI2_BYTE_CC_REG,
3329 .en_mask = BIT(0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003330 .halt_reg = DBG_BUS_VEC_B_REG,
3331 .halt_bit = 20,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003332 .retain_reg = DSI2_BYTE_CC_REG,
3333 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003334 },
3335 .ns_reg = DSI2_BYTE_NS_REG,
3336 .root_en_mask = BIT(2),
3337 .ns_mask = BM(15, 12),
3338 .set_rate = set_rate_nop,
3339 .freq_tbl = clk_tbl_dsi_byte,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003340 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003341 .c = {
3342 .dbg_name = "dsi2_byte_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003343 .ops = &clk_ops_rcg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003344 CLK_INIT(dsi2_byte_clk.c),
3345 },
3346};
3347
3348static struct rcg_clk dsi1_esc_clk = {
3349 .b = {
3350 .ctl_reg = DSI1_ESC_CC_REG,
3351 .en_mask = BIT(0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003352 .halt_reg = DBG_BUS_VEC_I_REG,
3353 .halt_bit = 1,
3354 },
3355 .ns_reg = DSI1_ESC_NS_REG,
3356 .root_en_mask = BIT(2),
3357 .ns_mask = BM(15, 12),
3358 .set_rate = set_rate_nop,
3359 .freq_tbl = clk_tbl_dsi_byte,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003360 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003361 .c = {
3362 .dbg_name = "dsi1_esc_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003363 .ops = &clk_ops_rcg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003364 CLK_INIT(dsi1_esc_clk.c),
3365 },
3366};
3367
3368static struct rcg_clk dsi2_esc_clk = {
3369 .b = {
3370 .ctl_reg = DSI2_ESC_CC_REG,
3371 .en_mask = BIT(0),
3372 .halt_reg = DBG_BUS_VEC_I_REG,
3373 .halt_bit = 3,
3374 },
3375 .ns_reg = DSI2_ESC_NS_REG,
3376 .root_en_mask = BIT(2),
3377 .ns_mask = BM(15, 12),
3378 .set_rate = set_rate_nop,
3379 .freq_tbl = clk_tbl_dsi_byte,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003380 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003381 .c = {
3382 .dbg_name = "dsi2_esc_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003383 .ops = &clk_ops_rcg,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003384 CLK_INIT(dsi2_esc_clk.c),
3385 },
3386};
3387
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003388#define F_GFX2D(f, s, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003389 { \
3390 .freq_hz = f, \
3391 .src_clk = &s##_clk.c, \
3392 .md_val = MD4(4, m, 0, n), \
3393 .ns_val = NS_MND_BANKED4(20, 16, n, m, 3, 0, s##_to_mm_mux), \
3394 .ctl_val = CC_BANKED(9, 6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003395 }
3396static struct clk_freq_tbl clk_tbl_gfx2d[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003397 F_GFX2D( 0, gnd, 0, 0),
3398 F_GFX2D( 27000000, pxo, 0, 0),
3399 F_GFX2D( 48000000, pll8, 1, 8),
3400 F_GFX2D( 54857000, pll8, 1, 7),
3401 F_GFX2D( 64000000, pll8, 1, 6),
3402 F_GFX2D( 76800000, pll8, 1, 5),
3403 F_GFX2D( 96000000, pll8, 1, 4),
3404 F_GFX2D(128000000, pll8, 1, 3),
3405 F_GFX2D(145455000, pll2, 2, 11),
3406 F_GFX2D(160000000, pll2, 1, 5),
3407 F_GFX2D(177778000, pll2, 2, 9),
3408 F_GFX2D(200000000, pll2, 1, 4),
3409 F_GFX2D(228571000, pll2, 2, 7),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003410 F_END
3411};
3412
3413static struct bank_masks bmnd_info_gfx2d0 = {
3414 .bank_sel_mask = BIT(11),
3415 .bank0_mask = {
3416 .md_reg = GFX2D0_MD0_REG,
3417 .ns_mask = BM(23, 20) | BM(5, 3),
3418 .rst_mask = BIT(25),
3419 .mnd_en_mask = BIT(8),
3420 .mode_mask = BM(10, 9),
3421 },
3422 .bank1_mask = {
3423 .md_reg = GFX2D0_MD1_REG,
3424 .ns_mask = BM(19, 16) | BM(2, 0),
3425 .rst_mask = BIT(24),
3426 .mnd_en_mask = BIT(5),
3427 .mode_mask = BM(7, 6),
3428 },
3429};
3430
3431static struct rcg_clk gfx2d0_clk = {
3432 .b = {
3433 .ctl_reg = GFX2D0_CC_REG,
3434 .en_mask = BIT(0),
3435 .reset_reg = SW_RESET_CORE_REG,
3436 .reset_mask = BIT(14),
3437 .halt_reg = DBG_BUS_VEC_A_REG,
3438 .halt_bit = 9,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003439 .retain_reg = GFX2D0_CC_REG,
3440 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003441 },
3442 .ns_reg = GFX2D0_NS_REG,
3443 .root_en_mask = BIT(2),
3444 .set_rate = set_rate_mnd_banked,
3445 .freq_tbl = clk_tbl_gfx2d,
Stephen Boydc78d9a72011-07-20 00:46:24 -07003446 .bank_info = &bmnd_info_gfx2d0,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003447 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003448 .c = {
3449 .dbg_name = "gfx2d0_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003450 .ops = &clk_ops_rcg,
Matt Wagantall158f73b2012-05-16 11:29:35 -07003451 .flags = CLKFLAG_SKIP_HANDOFF,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003452 VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000,
3453 HIGH, 228571000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003454 CLK_INIT(gfx2d0_clk.c),
3455 },
3456};
3457
3458static struct bank_masks bmnd_info_gfx2d1 = {
3459 .bank_sel_mask = BIT(11),
3460 .bank0_mask = {
3461 .md_reg = GFX2D1_MD0_REG,
3462 .ns_mask = BM(23, 20) | BM(5, 3),
3463 .rst_mask = BIT(25),
3464 .mnd_en_mask = BIT(8),
3465 .mode_mask = BM(10, 9),
3466 },
3467 .bank1_mask = {
3468 .md_reg = GFX2D1_MD1_REG,
3469 .ns_mask = BM(19, 16) | BM(2, 0),
3470 .rst_mask = BIT(24),
3471 .mnd_en_mask = BIT(5),
3472 .mode_mask = BM(7, 6),
3473 },
3474};
3475
3476static struct rcg_clk gfx2d1_clk = {
3477 .b = {
3478 .ctl_reg = GFX2D1_CC_REG,
3479 .en_mask = BIT(0),
3480 .reset_reg = SW_RESET_CORE_REG,
3481 .reset_mask = BIT(13),
3482 .halt_reg = DBG_BUS_VEC_A_REG,
3483 .halt_bit = 14,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003484 .retain_reg = GFX2D1_CC_REG,
3485 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003486 },
3487 .ns_reg = GFX2D1_NS_REG,
3488 .root_en_mask = BIT(2),
3489 .set_rate = set_rate_mnd_banked,
3490 .freq_tbl = clk_tbl_gfx2d,
Stephen Boydc78d9a72011-07-20 00:46:24 -07003491 .bank_info = &bmnd_info_gfx2d1,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003492 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003493 .c = {
3494 .dbg_name = "gfx2d1_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003495 .ops = &clk_ops_rcg,
Matt Wagantall158f73b2012-05-16 11:29:35 -07003496 .flags = CLKFLAG_SKIP_HANDOFF,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003497 VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000,
3498 HIGH, 228571000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003499 CLK_INIT(gfx2d1_clk.c),
3500 },
3501};
3502
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003503#define F_GFX3D(f, s, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003504 { \
3505 .freq_hz = f, \
3506 .src_clk = &s##_clk.c, \
3507 .md_val = MD4(4, m, 0, n), \
3508 .ns_val = NS_MND_BANKED4(18, 14, n, m, 3, 0, s##_to_mm_mux), \
3509 .ctl_val = CC_BANKED(9, 6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003510 }
Tianyi Gou41515e22011-09-01 19:37:43 -07003511
Patrick Dalye6f489042012-07-11 15:29:15 -07003512static struct clk_freq_tbl clk_tbl_gfx3d_8960ab[] = {
3513 F_GFX3D( 0, gnd, 0, 0),
3514 F_GFX3D( 27000000, pxo, 0, 0),
3515 F_GFX3D( 48000000, pll8, 1, 8),
3516 F_GFX3D( 54857000, pll8, 1, 7),
3517 F_GFX3D( 64000000, pll8, 1, 6),
3518 F_GFX3D( 76800000, pll8, 1, 5),
3519 F_GFX3D( 96000000, pll8, 1, 4),
3520 F_GFX3D(128000000, pll8, 1, 3),
3521 F_GFX3D(145455000, pll2, 2, 11),
3522 F_GFX3D(160000000, pll2, 1, 5),
3523 F_GFX3D(177778000, pll2, 2, 9),
3524 F_GFX3D(200000000, pll2, 1, 4),
3525 F_GFX3D(228571000, pll2, 2, 7),
3526 F_GFX3D(266667000, pll2, 1, 3),
3527 F_GFX3D(320000000, pll2, 2, 5),
3528 F_GFX3D(325000000, pll3, 1, 2),
3529 F_GFX3D(400000000, pll2, 1, 2),
3530 F_END
3531};
3532
Tianyi Gou41515e22011-09-01 19:37:43 -07003533static struct clk_freq_tbl clk_tbl_gfx3d_8960[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003534 F_GFX3D( 0, gnd, 0, 0),
3535 F_GFX3D( 27000000, pxo, 0, 0),
3536 F_GFX3D( 48000000, pll8, 1, 8),
3537 F_GFX3D( 54857000, pll8, 1, 7),
3538 F_GFX3D( 64000000, pll8, 1, 6),
3539 F_GFX3D( 76800000, pll8, 1, 5),
3540 F_GFX3D( 96000000, pll8, 1, 4),
3541 F_GFX3D(128000000, pll8, 1, 3),
3542 F_GFX3D(145455000, pll2, 2, 11),
3543 F_GFX3D(160000000, pll2, 1, 5),
3544 F_GFX3D(177778000, pll2, 2, 9),
3545 F_GFX3D(200000000, pll2, 1, 4),
3546 F_GFX3D(228571000, pll2, 2, 7),
3547 F_GFX3D(266667000, pll2, 1, 3),
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003548 F_GFX3D(300000000, pll3, 1, 4),
3549 F_GFX3D(320000000, pll2, 2, 5),
3550 F_GFX3D(400000000, pll2, 1, 2),
Stephen Boyd94625ef2011-07-12 17:06:01 -07003551 F_END
3552};
3553
Tianyi Gou41515e22011-09-01 19:37:43 -07003554static struct clk_freq_tbl clk_tbl_gfx3d_8064[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003555 F_GFX3D( 0, gnd, 0, 0),
3556 F_GFX3D( 27000000, pxo, 0, 0),
3557 F_GFX3D( 48000000, pll8, 1, 8),
3558 F_GFX3D( 54857000, pll8, 1, 7),
3559 F_GFX3D( 64000000, pll8, 1, 6),
3560 F_GFX3D( 76800000, pll8, 1, 5),
3561 F_GFX3D( 96000000, pll8, 1, 4),
3562 F_GFX3D(128000000, pll8, 1, 3),
3563 F_GFX3D(145455000, pll2, 2, 11),
3564 F_GFX3D(160000000, pll2, 1, 5),
3565 F_GFX3D(177778000, pll2, 2, 9),
Patrick Dalyedb86f42012-08-23 19:07:30 -07003566 F_GFX3D(192000000, pll8, 1, 2),
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003567 F_GFX3D(200000000, pll2, 1, 4),
3568 F_GFX3D(228571000, pll2, 2, 7),
3569 F_GFX3D(266667000, pll2, 1, 3),
3570 F_GFX3D(400000000, pll2, 1, 2),
Patrick Dalyedb86f42012-08-23 19:07:30 -07003571 F_GFX3D(450000000, pll15, 1, 2),
Tianyi Gou41515e22011-09-01 19:37:43 -07003572 F_END
3573};
3574
Tianyi Goue3d4f542012-03-15 17:06:45 -07003575static struct clk_freq_tbl clk_tbl_gfx3d_8930[] = {
3576 F_GFX3D( 0, gnd, 0, 0),
3577 F_GFX3D( 27000000, pxo, 0, 0),
3578 F_GFX3D( 48000000, pll8, 1, 8),
3579 F_GFX3D( 54857000, pll8, 1, 7),
3580 F_GFX3D( 64000000, pll8, 1, 6),
3581 F_GFX3D( 76800000, pll8, 1, 5),
3582 F_GFX3D( 96000000, pll8, 1, 4),
3583 F_GFX3D(128000000, pll8, 1, 3),
3584 F_GFX3D(145455000, pll2, 2, 11),
3585 F_GFX3D(160000000, pll2, 1, 5),
3586 F_GFX3D(177778000, pll2, 2, 9),
Tianyi Gou4d33c9c2012-03-30 11:10:15 -07003587 F_GFX3D(192000000, pll8, 1, 2),
Tianyi Goue3d4f542012-03-15 17:06:45 -07003588 F_GFX3D(200000000, pll2, 1, 4),
3589 F_GFX3D(228571000, pll2, 2, 7),
3590 F_GFX3D(266667000, pll2, 1, 3),
Tianyi Goue3d4f542012-03-15 17:06:45 -07003591 F_GFX3D(320000000, pll2, 2, 5),
3592 F_GFX3D(400000000, pll2, 1, 2),
3593 F_GFX3D(450000000, pll15, 1, 2),
3594 F_END
3595};
3596
Patrick Dalyedb86f42012-08-23 19:07:30 -07003597static unsigned long fmax_gfx3d_8064ab[MAX_VDD_LEVELS] __initdata = {
3598 [VDD_DIG_LOW] = 128000000,
3599 [VDD_DIG_NOMINAL] = 325000000,
3600 [VDD_DIG_HIGH] = 450000000
3601};
3602
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003603static unsigned long fmax_gfx3d_8064[MAX_VDD_LEVELS] __initdata = {
3604 [VDD_DIG_LOW] = 128000000,
3605 [VDD_DIG_NOMINAL] = 325000000,
3606 [VDD_DIG_HIGH] = 400000000
3607};
3608
Tianyi Goue3d4f542012-03-15 17:06:45 -07003609static unsigned long fmax_gfx3d_8930[MAX_VDD_LEVELS] __initdata = {
Tianyi Gou4d33c9c2012-03-30 11:10:15 -07003610 [VDD_DIG_LOW] = 192000000,
Tianyi Goue3d4f542012-03-15 17:06:45 -07003611 [VDD_DIG_NOMINAL] = 320000000,
Patrick Dalyebe63c52012-08-07 15:41:30 -07003612 [VDD_DIG_HIGH] = 400000000
3613};
3614
3615static unsigned long fmax_gfx3d_8930aa[MAX_VDD_LEVELS] __initdata = {
3616 [VDD_DIG_LOW] = 192000000,
3617 [VDD_DIG_NOMINAL] = 320000000,
Tianyi Goue3d4f542012-03-15 17:06:45 -07003618 [VDD_DIG_HIGH] = 450000000
3619};
3620
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003621static struct bank_masks bmnd_info_gfx3d = {
3622 .bank_sel_mask = BIT(11),
3623 .bank0_mask = {
3624 .md_reg = GFX3D_MD0_REG,
3625 .ns_mask = BM(21, 18) | BM(5, 3),
3626 .rst_mask = BIT(23),
3627 .mnd_en_mask = BIT(8),
3628 .mode_mask = BM(10, 9),
3629 },
3630 .bank1_mask = {
3631 .md_reg = GFX3D_MD1_REG,
3632 .ns_mask = BM(17, 14) | BM(2, 0),
3633 .rst_mask = BIT(22),
3634 .mnd_en_mask = BIT(5),
3635 .mode_mask = BM(7, 6),
3636 },
3637};
3638
3639static struct rcg_clk gfx3d_clk = {
3640 .b = {
3641 .ctl_reg = GFX3D_CC_REG,
3642 .en_mask = BIT(0),
3643 .reset_reg = SW_RESET_CORE_REG,
3644 .reset_mask = BIT(12),
3645 .halt_reg = DBG_BUS_VEC_A_REG,
3646 .halt_bit = 4,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003647 .retain_reg = GFX3D_CC_REG,
3648 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003649 },
3650 .ns_reg = GFX3D_NS_REG,
3651 .root_en_mask = BIT(2),
3652 .set_rate = set_rate_mnd_banked,
Tianyi Gou41515e22011-09-01 19:37:43 -07003653 .freq_tbl = clk_tbl_gfx3d_8960,
Stephen Boydc78d9a72011-07-20 00:46:24 -07003654 .bank_info = &bmnd_info_gfx3d,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003655 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003656 .c = {
3657 .dbg_name = "gfx3d_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003658 .ops = &clk_ops_rcg,
Tianyi Gou3022dfd2012-01-25 15:50:05 -08003659 VDD_DIG_FMAX_MAP3(LOW, 128000000, NOMINAL, 300000000,
3660 HIGH, 400000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003661 CLK_INIT(gfx3d_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07003662 .depends = &gmem_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003663 },
3664};
3665
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003666#define F_VCAP(f, s, m, n) \
Tianyi Gou621f8742011-09-01 21:45:01 -07003667 { \
3668 .freq_hz = f, \
3669 .src_clk = &s##_clk.c, \
3670 .md_val = MD4(4, m, 0, n), \
3671 .ns_val = NS_MND_BANKED4(18, 14, n, m, 3, 0, s##_to_mm_mux), \
3672 .ctl_val = CC_BANKED(9, 6, n), \
Tianyi Gou621f8742011-09-01 21:45:01 -07003673 }
3674
3675static struct clk_freq_tbl clk_tbl_vcap[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003676 F_VCAP( 0, gnd, 0, 0),
3677 F_VCAP( 27000000, pxo, 0, 0),
3678 F_VCAP( 54860000, pll8, 1, 7),
3679 F_VCAP( 64000000, pll8, 1, 6),
3680 F_VCAP( 76800000, pll8, 1, 5),
3681 F_VCAP(128000000, pll8, 1, 3),
3682 F_VCAP(160000000, pll2, 1, 5),
3683 F_VCAP(200000000, pll2, 1, 4),
Tianyi Gou621f8742011-09-01 21:45:01 -07003684 F_END
3685};
3686
3687static struct bank_masks bmnd_info_vcap = {
3688 .bank_sel_mask = BIT(11),
3689 .bank0_mask = {
3690 .md_reg = VCAP_MD0_REG,
3691 .ns_mask = BM(21, 18) | BM(5, 3),
3692 .rst_mask = BIT(23),
3693 .mnd_en_mask = BIT(8),
3694 .mode_mask = BM(10, 9),
3695 },
3696 .bank1_mask = {
3697 .md_reg = VCAP_MD1_REG,
3698 .ns_mask = BM(17, 14) | BM(2, 0),
3699 .rst_mask = BIT(22),
3700 .mnd_en_mask = BIT(5),
3701 .mode_mask = BM(7, 6),
3702 },
3703};
3704
3705static struct rcg_clk vcap_clk = {
3706 .b = {
3707 .ctl_reg = VCAP_CC_REG,
3708 .en_mask = BIT(0),
3709 .halt_reg = DBG_BUS_VEC_J_REG,
3710 .halt_bit = 15,
3711 },
3712 .ns_reg = VCAP_NS_REG,
3713 .root_en_mask = BIT(2),
3714 .set_rate = set_rate_mnd_banked,
3715 .freq_tbl = clk_tbl_vcap,
3716 .bank_info = &bmnd_info_vcap,
3717 .current_freq = &rcg_dummy_freq,
3718 .c = {
3719 .dbg_name = "vcap_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003720 .ops = &clk_ops_rcg,
Tianyi Gou621f8742011-09-01 21:45:01 -07003721 .depends = &vcap_axi_clk.c,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003722 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
Tianyi Gou621f8742011-09-01 21:45:01 -07003723 CLK_INIT(vcap_clk.c),
3724 },
3725};
3726
3727static struct branch_clk vcap_npl_clk = {
3728 .b = {
3729 .ctl_reg = VCAP_CC_REG,
3730 .en_mask = BIT(13),
3731 .halt_reg = DBG_BUS_VEC_J_REG,
3732 .halt_bit = 25,
3733 },
3734 .parent = &vcap_clk.c,
3735 .c = {
3736 .dbg_name = "vcap_npl_clk",
3737 .ops = &clk_ops_branch,
3738 CLK_INIT(vcap_npl_clk.c),
3739 },
3740};
3741
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003742#define F_IJPEG(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003743 { \
3744 .freq_hz = f, \
3745 .src_clk = &s##_clk.c, \
3746 .md_val = MD8(8, m, 0, n), \
3747 .ns_val = NS_MM(23, 16, n, m, 15, 12, d, 2, 0, s##_to_mm_mux), \
3748 .ctl_val = CC(6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003749 }
Tianyi Gou41515e22011-09-01 19:37:43 -07003750
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003751static struct clk_freq_tbl clk_tbl_ijpeg[] = {
3752 F_IJPEG( 0, gnd, 1, 0, 0),
3753 F_IJPEG( 27000000, pxo, 1, 0, 0),
3754 F_IJPEG( 36570000, pll8, 1, 2, 21),
3755 F_IJPEG( 54860000, pll8, 7, 0, 0),
3756 F_IJPEG( 96000000, pll8, 4, 0, 0),
3757 F_IJPEG(109710000, pll8, 1, 2, 7),
3758 F_IJPEG(128000000, pll8, 3, 0, 0),
3759 F_IJPEG(153600000, pll8, 1, 2, 5),
3760 F_IJPEG(200000000, pll2, 4, 0, 0),
3761 F_IJPEG(228571000, pll2, 1, 2, 7),
3762 F_IJPEG(266667000, pll2, 1, 1, 3),
3763 F_IJPEG(320000000, pll2, 1, 2, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003764 F_END
3765};
3766
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003767static unsigned long fmax_ijpeg_8064[MAX_VDD_LEVELS] __initdata = {
3768 [VDD_DIG_LOW] = 128000000,
3769 [VDD_DIG_NOMINAL] = 266667000,
3770 [VDD_DIG_HIGH] = 320000000
Tianyi Gou41515e22011-09-01 19:37:43 -07003771};
3772
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003773static struct rcg_clk ijpeg_clk = {
3774 .b = {
3775 .ctl_reg = IJPEG_CC_REG,
3776 .en_mask = BIT(0),
3777 .reset_reg = SW_RESET_CORE_REG,
3778 .reset_mask = BIT(9),
3779 .halt_reg = DBG_BUS_VEC_A_REG,
3780 .halt_bit = 24,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003781 .retain_reg = IJPEG_CC_REG,
3782 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003783 },
3784 .ns_reg = IJPEG_NS_REG,
3785 .md_reg = IJPEG_MD_REG,
3786 .root_en_mask = BIT(2),
3787 .ns_mask = (BM(23, 16) | BM(15, 12) | BM(2, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08003788 .mnd_en_mask = BIT(5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003789 .ctl_mask = BM(7, 6),
3790 .set_rate = set_rate_mnd,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003791 .freq_tbl = clk_tbl_ijpeg,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003792 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003793 .c = {
3794 .dbg_name = "ijpeg_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003795 .ops = &clk_ops_rcg,
Tianyi Gou3022dfd2012-01-25 15:50:05 -08003796 VDD_DIG_FMAX_MAP3(LOW, 110000000, NOMINAL, 266667000,
3797 HIGH, 320000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003798 CLK_INIT(ijpeg_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07003799 .depends = &ijpeg_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003800 },
3801};
3802
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003803#define F_JPEGD(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003804 { \
3805 .freq_hz = f, \
3806 .src_clk = &s##_clk.c, \
3807 .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003808 }
3809static struct clk_freq_tbl clk_tbl_jpegd[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003810 F_JPEGD( 0, gnd, 1),
3811 F_JPEGD( 64000000, pll8, 6),
3812 F_JPEGD( 76800000, pll8, 5),
3813 F_JPEGD( 96000000, pll8, 4),
3814 F_JPEGD(160000000, pll2, 5),
3815 F_JPEGD(200000000, pll2, 4),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003816 F_END
3817};
3818
3819static struct rcg_clk jpegd_clk = {
3820 .b = {
3821 .ctl_reg = JPEGD_CC_REG,
3822 .en_mask = BIT(0),
3823 .reset_reg = SW_RESET_CORE_REG,
3824 .reset_mask = BIT(19),
3825 .halt_reg = DBG_BUS_VEC_A_REG,
3826 .halt_bit = 19,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003827 .retain_reg = JPEGD_CC_REG,
3828 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003829 },
3830 .ns_reg = JPEGD_NS_REG,
3831 .root_en_mask = BIT(2),
3832 .ns_mask = (BM(15, 12) | BM(2, 0)),
3833 .set_rate = set_rate_nop,
3834 .freq_tbl = clk_tbl_jpegd,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003835 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003836 .c = {
3837 .dbg_name = "jpegd_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003838 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003839 VDD_DIG_FMAX_MAP2(LOW, 96000000, NOMINAL, 200000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003840 CLK_INIT(jpegd_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07003841 .depends = &jpegd_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003842 },
3843};
3844
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003845#define F_MDP(f, s, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003846 { \
3847 .freq_hz = f, \
3848 .src_clk = &s##_clk.c, \
3849 .md_val = MD8(8, m, 0, n), \
3850 .ns_val = NS_MND_BANKED8(22, 14, n, m, 3, 0, s##_to_mm_mux), \
3851 .ctl_val = CC_BANKED(9, 6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003852 }
Patrick Dalye6f489042012-07-11 15:29:15 -07003853static struct clk_freq_tbl clk_tbl_mdp_8960ab[] = {
3854 F_MDP( 0, gnd, 0, 0),
3855 F_MDP( 9600000, pll8, 1, 40),
3856 F_MDP( 13710000, pll8, 1, 28),
3857 F_MDP( 27000000, pxo, 0, 0),
3858 F_MDP( 29540000, pll8, 1, 13),
3859 F_MDP( 34910000, pll8, 1, 11),
3860 F_MDP( 38400000, pll8, 1, 10),
3861 F_MDP( 59080000, pll8, 2, 13),
3862 F_MDP( 76800000, pll8, 1, 5),
3863 F_MDP( 85330000, pll8, 2, 9),
3864 F_MDP( 96000000, pll8, 1, 4),
3865 F_MDP(128000000, pll8, 1, 3),
3866 F_MDP(160000000, pll2, 1, 5),
3867 F_MDP(177780000, pll2, 2, 9),
3868 F_MDP(200000000, pll2, 1, 4),
3869 F_MDP(228571000, pll2, 2, 7),
3870 F_MDP(266667000, pll2, 1, 3),
3871 F_END
3872};
3873
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003874static struct clk_freq_tbl clk_tbl_mdp[] = {
3875 F_MDP( 0, gnd, 0, 0),
3876 F_MDP( 9600000, pll8, 1, 40),
3877 F_MDP( 13710000, pll8, 1, 28),
3878 F_MDP( 27000000, pxo, 0, 0),
3879 F_MDP( 29540000, pll8, 1, 13),
3880 F_MDP( 34910000, pll8, 1, 11),
3881 F_MDP( 38400000, pll8, 1, 10),
3882 F_MDP( 59080000, pll8, 2, 13),
3883 F_MDP( 76800000, pll8, 1, 5),
3884 F_MDP( 85330000, pll8, 2, 9),
3885 F_MDP( 96000000, pll8, 1, 4),
3886 F_MDP(128000000, pll8, 1, 3),
3887 F_MDP(160000000, pll2, 1, 5),
3888 F_MDP(177780000, pll2, 2, 9),
3889 F_MDP(200000000, pll2, 1, 4),
3890 F_MDP(266667000, pll2, 1, 3),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003891 F_END
3892};
3893
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003894static unsigned long fmax_mdp_8064[MAX_VDD_LEVELS] __initdata = {
3895 [VDD_DIG_LOW] = 128000000,
3896 [VDD_DIG_NOMINAL] = 266667000
Tianyi Gou621f8742011-09-01 21:45:01 -07003897};
3898
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003899static struct bank_masks bmnd_info_mdp = {
3900 .bank_sel_mask = BIT(11),
3901 .bank0_mask = {
3902 .md_reg = MDP_MD0_REG,
3903 .ns_mask = BM(29, 22) | BM(5, 3),
3904 .rst_mask = BIT(31),
3905 .mnd_en_mask = BIT(8),
3906 .mode_mask = BM(10, 9),
3907 },
3908 .bank1_mask = {
3909 .md_reg = MDP_MD1_REG,
3910 .ns_mask = BM(21, 14) | BM(2, 0),
3911 .rst_mask = BIT(30),
3912 .mnd_en_mask = BIT(5),
3913 .mode_mask = BM(7, 6),
3914 },
3915};
3916
3917static struct rcg_clk mdp_clk = {
3918 .b = {
3919 .ctl_reg = MDP_CC_REG,
3920 .en_mask = BIT(0),
3921 .reset_reg = SW_RESET_CORE_REG,
3922 .reset_mask = BIT(21),
3923 .halt_reg = DBG_BUS_VEC_C_REG,
3924 .halt_bit = 10,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003925 .retain_reg = MDP_CC_REG,
3926 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003927 },
3928 .ns_reg = MDP_NS_REG,
3929 .root_en_mask = BIT(2),
3930 .set_rate = set_rate_mnd_banked,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003931 .freq_tbl = clk_tbl_mdp,
Stephen Boydc78d9a72011-07-20 00:46:24 -07003932 .bank_info = &bmnd_info_mdp,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003933 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003934 .c = {
3935 .dbg_name = "mdp_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003936 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003937 VDD_DIG_FMAX_MAP2(LOW, 96000000, NOMINAL, 200000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003938 CLK_INIT(mdp_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07003939 .depends = &mdp_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003940 },
3941};
3942
3943static struct branch_clk lut_mdp_clk = {
3944 .b = {
3945 .ctl_reg = MDP_LUT_CC_REG,
3946 .en_mask = BIT(0),
3947 .halt_reg = DBG_BUS_VEC_I_REG,
3948 .halt_bit = 13,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08003949 .retain_reg = MDP_LUT_CC_REG,
3950 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003951 },
3952 .parent = &mdp_clk.c,
3953 .c = {
3954 .dbg_name = "lut_mdp_clk",
3955 .ops = &clk_ops_branch,
3956 CLK_INIT(lut_mdp_clk.c),
3957 },
3958};
3959
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003960#define F_MDP_VSYNC(f, s) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003961 { \
3962 .freq_hz = f, \
3963 .src_clk = &s##_clk.c, \
3964 .ns_val = NS_SRC_SEL(13, 13, s##_to_bb_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003965 }
3966static struct clk_freq_tbl clk_tbl_mdp_vsync[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003967 F_MDP_VSYNC(27000000, pxo),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003968 F_END
3969};
3970
3971static struct rcg_clk mdp_vsync_clk = {
3972 .b = {
3973 .ctl_reg = MISC_CC_REG,
3974 .en_mask = BIT(6),
3975 .reset_reg = SW_RESET_CORE_REG,
3976 .reset_mask = BIT(3),
3977 .halt_reg = DBG_BUS_VEC_B_REG,
3978 .halt_bit = 22,
3979 },
3980 .ns_reg = MISC_CC2_REG,
3981 .ns_mask = BIT(13),
3982 .set_rate = set_rate_nop,
3983 .freq_tbl = clk_tbl_mdp_vsync,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07003984 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003985 .c = {
3986 .dbg_name = "mdp_vsync_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07003987 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003988 VDD_DIG_FMAX_MAP1(LOW, 27000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003989 CLK_INIT(mdp_vsync_clk.c),
3990 },
3991};
3992
Matt Wagantalle18bbc82011-10-06 10:07:28 -07003993#define F_ROT(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003994 { \
3995 .freq_hz = f, \
3996 .src_clk = &s##_clk.c, \
3997 .ns_val = NS_DIVSRC_BANKED(29, 26, 25, 22, d, \
3998 21, 19, 18, 16, s##_to_mm_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07003999 }
4000static struct clk_freq_tbl clk_tbl_rot[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004001 F_ROT( 0, gnd, 1),
4002 F_ROT( 27000000, pxo, 1),
4003 F_ROT( 29540000, pll8, 13),
4004 F_ROT( 32000000, pll8, 12),
4005 F_ROT( 38400000, pll8, 10),
4006 F_ROT( 48000000, pll8, 8),
4007 F_ROT( 54860000, pll8, 7),
4008 F_ROT( 64000000, pll8, 6),
4009 F_ROT( 76800000, pll8, 5),
4010 F_ROT( 96000000, pll8, 4),
4011 F_ROT(100000000, pll2, 8),
4012 F_ROT(114290000, pll2, 7),
4013 F_ROT(133330000, pll2, 6),
4014 F_ROT(160000000, pll2, 5),
4015 F_ROT(200000000, pll2, 4),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004016 F_END
4017};
4018
4019static struct bank_masks bdiv_info_rot = {
4020 .bank_sel_mask = BIT(30),
4021 .bank0_mask = {
4022 .ns_mask = BM(25, 22) | BM(18, 16),
4023 },
4024 .bank1_mask = {
4025 .ns_mask = BM(29, 26) | BM(21, 19),
4026 },
4027};
4028
4029static struct rcg_clk rot_clk = {
4030 .b = {
4031 .ctl_reg = ROT_CC_REG,
4032 .en_mask = BIT(0),
4033 .reset_reg = SW_RESET_CORE_REG,
4034 .reset_mask = BIT(2),
4035 .halt_reg = DBG_BUS_VEC_C_REG,
4036 .halt_bit = 15,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08004037 .retain_reg = ROT_CC_REG,
4038 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004039 },
4040 .ns_reg = ROT_NS_REG,
4041 .root_en_mask = BIT(2),
4042 .set_rate = set_rate_div_banked,
4043 .freq_tbl = clk_tbl_rot,
Stephen Boydc78d9a72011-07-20 00:46:24 -07004044 .bank_info = &bdiv_info_rot,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004045 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004046 .c = {
4047 .dbg_name = "rot_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07004048 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004049 VDD_DIG_FMAX_MAP2(LOW, 96000000, NOMINAL, 200000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004050 CLK_INIT(rot_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07004051 .depends = &rot_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004052 },
4053};
4054
Jaeseong GIMefd46332012-06-19 06:30:38 -07004055#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL
Matt Wagantallf82f2942012-01-27 13:56:13 -08004056static int hdmi_pll_clk_enable(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004057{
4058 int ret;
4059 unsigned long flags;
4060 spin_lock_irqsave(&local_clock_reg_lock, flags);
4061 ret = hdmi_pll_enable();
4062 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
4063 return ret;
4064}
4065
Matt Wagantallf82f2942012-01-27 13:56:13 -08004066static void hdmi_pll_clk_disable(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004067{
4068 unsigned long flags;
4069 spin_lock_irqsave(&local_clock_reg_lock, flags);
4070 hdmi_pll_disable();
4071 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
4072}
4073
Matt Wagantallf82f2942012-01-27 13:56:13 -08004074static struct clk *hdmi_pll_clk_get_parent(struct clk *c)
Stephen Boyd5b35dee2011-09-21 12:17:38 -07004075{
4076 return &pxo_clk.c;
4077}
4078
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004079static struct clk_ops clk_ops_hdmi_pll = {
4080 .enable = hdmi_pll_clk_enable,
4081 .disable = hdmi_pll_clk_disable,
Stephen Boyd5b35dee2011-09-21 12:17:38 -07004082 .get_parent = hdmi_pll_clk_get_parent,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004083};
4084
4085static struct clk hdmi_pll_clk = {
4086 .dbg_name = "hdmi_pll_clk",
4087 .ops = &clk_ops_hdmi_pll,
Matt Wagantall82feaa12012-07-09 10:54:49 -07004088 .vdd_class = &vdd_sr2_hdmi_pll,
4089 .fmax[VDD_SR2_HDMI_PLL_ON] = ULONG_MAX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004090 CLK_INIT(hdmi_pll_clk),
4091};
4092
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004093#define F_TV_GND(f, s, p_r, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004094 { \
4095 .freq_hz = f, \
4096 .src_clk = &s##_clk.c, \
4097 .md_val = MD8(8, m, 0, n), \
4098 .ns_val = NS_MM(23, 16, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \
4099 .ctl_val = CC(6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004100 }
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004101#define F_TV(f, s, p_r, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004102 { \
4103 .freq_hz = f, \
4104 .src_clk = &s##_clk, \
4105 .md_val = MD8(8, m, 0, n), \
4106 .ns_val = NS_MM(23, 16, n, m, 15, 14, d, 2, 0, s##_to_mm_mux), \
4107 .ctl_val = CC(6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004108 .extra_freq_data = (void *)p_r, \
4109 }
4110/* Switching TV freqs requires PLL reconfiguration. */
4111static struct clk_freq_tbl clk_tbl_tv[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004112 F_TV_GND( 0, gnd, 0, 1, 0, 0),
4113 F_TV( 25200000, hdmi_pll, 25200000, 1, 0, 0),
4114 F_TV( 27000000, hdmi_pll, 27000000, 1, 0, 0),
4115 F_TV( 27030000, hdmi_pll, 27030000, 1, 0, 0),
4116 F_TV( 74250000, hdmi_pll, 74250000, 1, 0, 0),
4117 F_TV(148500000, hdmi_pll, 148500000, 1, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004118 F_END
4119};
Jaeseong GIMefd46332012-06-19 06:30:38 -07004120#else
4121static struct clk_freq_tbl clk_tbl_tv[] = {
4122};
4123#endif
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004124
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004125static unsigned long fmax_tv_src_8064[MAX_VDD_LEVELS] __initdata = {
4126 [VDD_DIG_LOW] = 74250000,
4127 [VDD_DIG_NOMINAL] = 149000000
4128};
4129
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004130/*
4131 * Unlike other clocks, the TV rate is adjusted through PLL
4132 * re-programming. It is also routed through an MND divider.
4133 */
Matt Wagantallf82f2942012-01-27 13:56:13 -08004134void set_rate_tv(struct rcg_clk *rcg, struct clk_freq_tbl *nf)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004135{
Jaeseong GIM20676622012-06-19 18:20:35 -07004136#ifdef CONFIG_FB_MSM_HDMI_MSM_PANEL
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004137 unsigned long pll_rate = (unsigned long)nf->extra_freq_data;
Matt Wagantallf6c39a12012-07-09 19:24:42 -07004138 if (pll_rate) {
Devin Kim4bdc71f2012-09-17 21:15:02 -07004139 hdmi_pll_set_rate(pll_rate);
Matt Wagantallf6c39a12012-07-09 19:24:42 -07004140 hdmi_pll_clk.rate = pll_rate;
4141 }
Jaeseong GIM20676622012-06-19 18:20:35 -07004142#endif
Matt Wagantallf82f2942012-01-27 13:56:13 -08004143 set_rate_mnd(rcg, nf);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004144}
4145
4146static struct rcg_clk tv_src_clk = {
4147 .ns_reg = TV_NS_REG,
4148 .b = {
4149 .ctl_reg = TV_CC_REG,
4150 .halt_check = NOCHECK,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08004151 .retain_reg = TV_CC_REG,
4152 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004153 },
4154 .md_reg = TV_MD_REG,
4155 .root_en_mask = BIT(2),
4156 .ns_mask = (BM(23, 16) | BM(15, 14) | BM(2, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08004157 .mnd_en_mask = BIT(5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004158 .ctl_mask = BM(7, 6),
4159 .set_rate = set_rate_tv,
4160 .freq_tbl = clk_tbl_tv,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004161 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004162 .c = {
4163 .dbg_name = "tv_src_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07004164 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004165 VDD_DIG_FMAX_MAP2(LOW, 27030000, NOMINAL, 149000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004166 CLK_INIT(tv_src_clk.c),
4167 },
4168};
4169
Tianyi Gou51918802012-01-26 14:05:43 -08004170static struct cdiv_clk tv_src_div_clk = {
4171 .b = {
4172 .ctl_reg = TV_NS_REG,
4173 .halt_check = NOCHECK,
4174 },
4175 .ns_reg = TV_NS_REG,
4176 .div_offset = 6,
4177 .max_div = 2,
4178 .c = {
4179 .dbg_name = "tv_src_div_clk",
4180 .ops = &clk_ops_cdiv,
4181 CLK_INIT(tv_src_div_clk.c),
Stephen Boydd51d5e82012-06-18 18:09:50 -07004182 .rate = ULONG_MAX,
Tianyi Gou51918802012-01-26 14:05:43 -08004183 },
4184};
4185
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004186static struct branch_clk tv_enc_clk = {
4187 .b = {
4188 .ctl_reg = TV_CC_REG,
4189 .en_mask = BIT(8),
4190 .reset_reg = SW_RESET_CORE_REG,
4191 .reset_mask = BIT(0),
4192 .halt_reg = DBG_BUS_VEC_D_REG,
4193 .halt_bit = 9,
4194 },
4195 .parent = &tv_src_clk.c,
4196 .c = {
4197 .dbg_name = "tv_enc_clk",
4198 .ops = &clk_ops_branch,
4199 CLK_INIT(tv_enc_clk.c),
4200 },
4201};
4202
4203static struct branch_clk tv_dac_clk = {
4204 .b = {
4205 .ctl_reg = TV_CC_REG,
4206 .en_mask = BIT(10),
4207 .halt_reg = DBG_BUS_VEC_D_REG,
4208 .halt_bit = 10,
4209 },
4210 .parent = &tv_src_clk.c,
4211 .c = {
4212 .dbg_name = "tv_dac_clk",
4213 .ops = &clk_ops_branch,
4214 CLK_INIT(tv_dac_clk.c),
4215 },
4216};
4217
4218static struct branch_clk mdp_tv_clk = {
4219 .b = {
4220 .ctl_reg = TV_CC_REG,
4221 .en_mask = BIT(0),
4222 .reset_reg = SW_RESET_CORE_REG,
4223 .reset_mask = BIT(4),
4224 .halt_reg = DBG_BUS_VEC_D_REG,
4225 .halt_bit = 12,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08004226 .retain_reg = TV_CC2_REG,
4227 .retain_mask = BIT(10),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004228 },
4229 .parent = &tv_src_clk.c,
4230 .c = {
4231 .dbg_name = "mdp_tv_clk",
4232 .ops = &clk_ops_branch,
4233 CLK_INIT(mdp_tv_clk.c),
4234 },
4235};
4236
4237static struct branch_clk hdmi_tv_clk = {
4238 .b = {
4239 .ctl_reg = TV_CC_REG,
4240 .en_mask = BIT(12),
4241 .reset_reg = SW_RESET_CORE_REG,
4242 .reset_mask = BIT(1),
4243 .halt_reg = DBG_BUS_VEC_D_REG,
4244 .halt_bit = 11,
4245 },
4246 .parent = &tv_src_clk.c,
4247 .c = {
4248 .dbg_name = "hdmi_tv_clk",
4249 .ops = &clk_ops_branch,
4250 CLK_INIT(hdmi_tv_clk.c),
4251 },
4252};
4253
Tianyi Gou51918802012-01-26 14:05:43 -08004254static struct branch_clk rgb_tv_clk = {
4255 .b = {
4256 .ctl_reg = TV_CC2_REG,
4257 .en_mask = BIT(14),
4258 .halt_reg = DBG_BUS_VEC_J_REG,
4259 .halt_bit = 27,
4260 },
4261 .parent = &tv_src_clk.c,
4262 .c = {
4263 .dbg_name = "rgb_tv_clk",
4264 .ops = &clk_ops_branch,
4265 CLK_INIT(rgb_tv_clk.c),
4266 },
4267};
4268
4269static struct branch_clk npl_tv_clk = {
4270 .b = {
4271 .ctl_reg = TV_CC2_REG,
4272 .en_mask = BIT(16),
4273 .halt_reg = DBG_BUS_VEC_J_REG,
4274 .halt_bit = 26,
4275 },
4276 .parent = &tv_src_clk.c,
4277 .c = {
4278 .dbg_name = "npl_tv_clk",
4279 .ops = &clk_ops_branch,
4280 CLK_INIT(npl_tv_clk.c),
4281 },
4282};
4283
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004284static struct branch_clk hdmi_app_clk = {
4285 .b = {
4286 .ctl_reg = MISC_CC2_REG,
4287 .en_mask = BIT(11),
4288 .reset_reg = SW_RESET_CORE_REG,
4289 .reset_mask = BIT(11),
4290 .halt_reg = DBG_BUS_VEC_B_REG,
4291 .halt_bit = 25,
4292 },
4293 .c = {
4294 .dbg_name = "hdmi_app_clk",
4295 .ops = &clk_ops_branch,
4296 CLK_INIT(hdmi_app_clk.c),
4297 },
4298};
4299
4300static struct bank_masks bmnd_info_vcodec = {
4301 .bank_sel_mask = BIT(13),
4302 .bank0_mask = {
4303 .md_reg = VCODEC_MD0_REG,
4304 .ns_mask = BM(18, 11) | BM(2, 0),
4305 .rst_mask = BIT(31),
4306 .mnd_en_mask = BIT(5),
4307 .mode_mask = BM(7, 6),
4308 },
4309 .bank1_mask = {
4310 .md_reg = VCODEC_MD1_REG,
4311 .ns_mask = BM(26, 19) | BM(29, 27),
4312 .rst_mask = BIT(30),
4313 .mnd_en_mask = BIT(10),
4314 .mode_mask = BM(12, 11),
4315 },
4316};
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004317#define F_VCODEC(f, s, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004318 { \
4319 .freq_hz = f, \
4320 .src_clk = &s##_clk.c, \
4321 .md_val = MD8(8, m, 0, n), \
4322 .ns_val = NS_MND_BANKED8(11, 19, n, m, 0, 27, s##_to_mm_mux), \
4323 .ctl_val = CC_BANKED(6, 11, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004324 }
4325static struct clk_freq_tbl clk_tbl_vcodec[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004326 F_VCODEC( 0, gnd, 0, 0),
4327 F_VCODEC( 27000000, pxo, 0, 0),
4328 F_VCODEC( 32000000, pll8, 1, 12),
4329 F_VCODEC( 48000000, pll8, 1, 8),
4330 F_VCODEC( 54860000, pll8, 1, 7),
4331 F_VCODEC( 96000000, pll8, 1, 4),
4332 F_VCODEC(133330000, pll2, 1, 6),
4333 F_VCODEC(200000000, pll2, 1, 4),
4334 F_VCODEC(228570000, pll2, 2, 7),
Patrick Dalyedb86f42012-08-23 19:07:30 -07004335 F_VCODEC(266670000, pll2, 1, 3),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004336 F_END
4337};
4338
4339static struct rcg_clk vcodec_clk = {
4340 .b = {
4341 .ctl_reg = VCODEC_CC_REG,
4342 .en_mask = BIT(0),
4343 .reset_reg = SW_RESET_CORE_REG,
4344 .reset_mask = BIT(6),
4345 .halt_reg = DBG_BUS_VEC_C_REG,
4346 .halt_bit = 29,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08004347 .retain_reg = VCODEC_CC_REG,
4348 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004349 },
4350 .ns_reg = VCODEC_NS_REG,
4351 .root_en_mask = BIT(2),
4352 .set_rate = set_rate_mnd_banked,
Stephen Boydc78d9a72011-07-20 00:46:24 -07004353 .bank_info = &bmnd_info_vcodec,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004354 .freq_tbl = clk_tbl_vcodec,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004355 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004356 .c = {
4357 .dbg_name = "vcodec_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07004358 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004359 VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000,
4360 HIGH, 228571000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004361 CLK_INIT(vcodec_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07004362 .depends = &vcodec_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004363 },
4364};
4365
Patrick Dalyedb86f42012-08-23 19:07:30 -07004366static unsigned long fmax_vcodec_8064v2[MAX_VDD_LEVELS] __initdata = {
4367 [VDD_DIG_LOW] = 100000000,
4368 [VDD_DIG_NOMINAL] = 200000000,
4369 [VDD_DIG_HIGH] = 266670000,
4370};
4371
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004372#define F_VPE(f, s, d) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004373 { \
4374 .freq_hz = f, \
4375 .src_clk = &s##_clk.c, \
4376 .ns_val = NS_DIVSRC(15, 12, d, 2, 0, s##_to_mm_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004377 }
4378static struct clk_freq_tbl clk_tbl_vpe[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004379 F_VPE( 0, gnd, 1),
4380 F_VPE( 27000000, pxo, 1),
4381 F_VPE( 34909000, pll8, 11),
4382 F_VPE( 38400000, pll8, 10),
4383 F_VPE( 64000000, pll8, 6),
4384 F_VPE( 76800000, pll8, 5),
4385 F_VPE( 96000000, pll8, 4),
4386 F_VPE(100000000, pll2, 8),
4387 F_VPE(160000000, pll2, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004388 F_END
4389};
4390
4391static struct rcg_clk vpe_clk = {
4392 .b = {
4393 .ctl_reg = VPE_CC_REG,
4394 .en_mask = BIT(0),
4395 .reset_reg = SW_RESET_CORE_REG,
4396 .reset_mask = BIT(17),
4397 .halt_reg = DBG_BUS_VEC_A_REG,
4398 .halt_bit = 28,
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08004399 .retain_reg = VPE_CC_REG,
4400 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004401 },
4402 .ns_reg = VPE_NS_REG,
4403 .root_en_mask = BIT(2),
4404 .ns_mask = (BM(15, 12) | BM(2, 0)),
4405 .set_rate = set_rate_nop,
4406 .freq_tbl = clk_tbl_vpe,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004407 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004408 .c = {
4409 .dbg_name = "vpe_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07004410 .ops = &clk_ops_rcg,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004411 VDD_DIG_FMAX_MAP2(LOW, 76800000, NOMINAL, 160000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004412 CLK_INIT(vpe_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07004413 .depends = &vpe_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004414 },
4415};
4416
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004417#define F_VFE(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004418 { \
4419 .freq_hz = f, \
4420 .src_clk = &s##_clk.c, \
4421 .md_val = MD8(8, m, 0, n), \
4422 .ns_val = NS_MM(23, 16, n, m, 11, 10, d, 2, 0, s##_to_mm_mux), \
4423 .ctl_val = CC(6, n), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004424 }
Tianyi Gou41515e22011-09-01 19:37:43 -07004425
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004426static struct clk_freq_tbl clk_tbl_vfe[] = {
4427 F_VFE( 0, gnd, 1, 0, 0),
4428 F_VFE( 13960000, pll8, 1, 2, 55),
4429 F_VFE( 27000000, pxo, 1, 0, 0),
4430 F_VFE( 36570000, pll8, 1, 2, 21),
4431 F_VFE( 38400000, pll8, 2, 1, 5),
4432 F_VFE( 45180000, pll8, 1, 2, 17),
4433 F_VFE( 48000000, pll8, 2, 1, 4),
4434 F_VFE( 54860000, pll8, 1, 1, 7),
4435 F_VFE( 64000000, pll8, 2, 1, 3),
4436 F_VFE( 76800000, pll8, 1, 1, 5),
4437 F_VFE( 96000000, pll8, 2, 1, 2),
4438 F_VFE(109710000, pll8, 1, 2, 7),
4439 F_VFE(128000000, pll8, 1, 1, 3),
4440 F_VFE(153600000, pll8, 1, 2, 5),
4441 F_VFE(200000000, pll2, 2, 1, 2),
4442 F_VFE(228570000, pll2, 1, 2, 7),
4443 F_VFE(266667000, pll2, 1, 1, 3),
4444 F_VFE(320000000, pll2, 1, 2, 5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004445 F_END
4446};
4447
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004448static unsigned long fmax_vfe_8064[MAX_VDD_LEVELS] __initdata = {
4449 [VDD_DIG_LOW] = 128000000,
4450 [VDD_DIG_NOMINAL] = 266667000,
4451 [VDD_DIG_HIGH] = 320000000
Tianyi Gou41515e22011-09-01 19:37:43 -07004452};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004453
4454static struct rcg_clk vfe_clk = {
4455 .b = {
4456 .ctl_reg = VFE_CC_REG,
4457 .reset_reg = SW_RESET_CORE_REG,
4458 .reset_mask = BIT(15),
4459 .halt_reg = DBG_BUS_VEC_B_REG,
4460 .halt_bit = 6,
4461 .en_mask = BIT(0),
Matt Wagantall7e0b6c92012-01-20 18:48:05 -08004462 .retain_reg = VFE_CC2_REG,
4463 .retain_mask = BIT(31),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004464 },
4465 .ns_reg = VFE_NS_REG,
4466 .md_reg = VFE_MD_REG,
4467 .root_en_mask = BIT(2),
4468 .ns_mask = (BM(23, 16) | BM(11, 10) | BM(2, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08004469 .mnd_en_mask = BIT(5),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004470 .ctl_mask = BM(7, 6),
4471 .set_rate = set_rate_mnd,
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004472 .freq_tbl = clk_tbl_vfe,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004473 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004474 .c = {
4475 .dbg_name = "vfe_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07004476 .ops = &clk_ops_rcg,
Tianyi Gou3022dfd2012-01-25 15:50:05 -08004477 VDD_DIG_FMAX_MAP3(LOW, 110000000, NOMINAL, 266667000,
4478 HIGH, 320000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004479 CLK_INIT(vfe_clk.c),
Stephen Boyd7fa26742011-08-11 23:22:29 -07004480 .depends = &vfe_axi_clk.c,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004481 },
4482};
4483
Matt Wagantallc23eee92011-08-16 23:06:52 -07004484static struct branch_clk csi_vfe_clk = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004485 .b = {
4486 .ctl_reg = VFE_CC_REG,
4487 .en_mask = BIT(12),
4488 .reset_reg = SW_RESET_CORE_REG,
4489 .reset_mask = BIT(24),
4490 .halt_reg = DBG_BUS_VEC_B_REG,
4491 .halt_bit = 8,
4492 },
4493 .parent = &vfe_clk.c,
4494 .c = {
Matt Wagantallc23eee92011-08-16 23:06:52 -07004495 .dbg_name = "csi_vfe_clk",
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004496 .ops = &clk_ops_branch,
Matt Wagantallc23eee92011-08-16 23:06:52 -07004497 CLK_INIT(csi_vfe_clk.c),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004498 },
4499};
4500
4501/*
4502 * Low Power Audio Clocks
4503 */
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004504#define F_AIF_OSR(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004505 { \
4506 .freq_hz = f, \
4507 .src_clk = &s##_clk.c, \
4508 .md_val = MD8(8, m, 0, n), \
4509 .ns_val = NS(31, 24, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004510 }
Matt Wagantall86e03822011-12-12 10:59:24 -08004511static struct clk_freq_tbl clk_tbl_aif_osr_492[] = {
4512 F_AIF_OSR( 0, gnd, 1, 0, 0),
4513 F_AIF_OSR( 512000, pll4, 4, 1, 240),
4514 F_AIF_OSR( 768000, pll4, 4, 1, 160),
4515 F_AIF_OSR( 1024000, pll4, 4, 1, 120),
4516 F_AIF_OSR( 1536000, pll4, 4, 1, 80),
4517 F_AIF_OSR( 2048000, pll4, 4, 1, 60),
4518 F_AIF_OSR( 3072000, pll4, 4, 1, 40),
4519 F_AIF_OSR( 4096000, pll4, 4, 1, 30),
4520 F_AIF_OSR( 6144000, pll4, 4, 1, 20),
4521 F_AIF_OSR( 8192000, pll4, 4, 1, 15),
4522 F_AIF_OSR(12288000, pll4, 4, 1, 10),
4523 F_AIF_OSR(24576000, pll4, 4, 1, 5),
Matt Wagantall988e4432012-10-10 23:36:20 -07004524 F_AIF_OSR(27000000, pxo, 1, 0, 0),
Matt Wagantall86e03822011-12-12 10:59:24 -08004525 F_END
4526};
4527
4528static struct clk_freq_tbl clk_tbl_aif_osr_393[] = {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004529 F_AIF_OSR( 0, gnd, 1, 0, 0),
4530 F_AIF_OSR( 512000, pll4, 4, 1, 192),
4531 F_AIF_OSR( 768000, pll4, 4, 1, 128),
4532 F_AIF_OSR( 1024000, pll4, 4, 1, 96),
4533 F_AIF_OSR( 1536000, pll4, 4, 1, 64),
4534 F_AIF_OSR( 2048000, pll4, 4, 1, 48),
4535 F_AIF_OSR( 3072000, pll4, 4, 1, 32),
4536 F_AIF_OSR( 4096000, pll4, 4, 1, 24),
4537 F_AIF_OSR( 6144000, pll4, 4, 1, 16),
4538 F_AIF_OSR( 8192000, pll4, 4, 1, 12),
4539 F_AIF_OSR(12288000, pll4, 4, 1, 8),
4540 F_AIF_OSR(24576000, pll4, 4, 1, 4),
Matt Wagantall988e4432012-10-10 23:36:20 -07004541 F_AIF_OSR(27000000, pxo, 1, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004542 F_END
4543};
4544
4545#define CLK_AIF_OSR(i, ns, md, h_r) \
4546 struct rcg_clk i##_clk = { \
4547 .b = { \
4548 .ctl_reg = ns, \
4549 .en_mask = BIT(17), \
4550 .reset_reg = ns, \
4551 .reset_mask = BIT(19), \
4552 .halt_reg = h_r, \
4553 .halt_check = ENABLE, \
4554 .halt_bit = 1, \
4555 }, \
4556 .ns_reg = ns, \
4557 .md_reg = md, \
4558 .root_en_mask = BIT(9), \
4559 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08004560 .mnd_en_mask = BIT(8), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004561 .set_rate = set_rate_mnd, \
Matt Wagantall86e03822011-12-12 10:59:24 -08004562 .freq_tbl = clk_tbl_aif_osr_393, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004563 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004564 .c = { \
4565 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07004566 .ops = &clk_ops_rcg, \
Matt Wagantall988e4432012-10-10 23:36:20 -07004567 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004568 CLK_INIT(i##_clk.c), \
4569 }, \
4570 }
4571#define CLK_AIF_OSR_DIV(i, ns, md, h_r) \
4572 struct rcg_clk i##_clk = { \
4573 .b = { \
4574 .ctl_reg = ns, \
4575 .en_mask = BIT(21), \
4576 .reset_reg = ns, \
4577 .reset_mask = BIT(23), \
4578 .halt_reg = h_r, \
4579 .halt_check = ENABLE, \
4580 .halt_bit = 1, \
4581 }, \
4582 .ns_reg = ns, \
4583 .md_reg = md, \
4584 .root_en_mask = BIT(9), \
4585 .ns_mask = (BM(31, 24) | BM(6, 0)), \
Matt Wagantall07c45472012-02-10 23:27:24 -08004586 .mnd_en_mask = BIT(8), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004587 .set_rate = set_rate_mnd, \
Matt Wagantall86e03822011-12-12 10:59:24 -08004588 .freq_tbl = clk_tbl_aif_osr_393, \
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004589 .current_freq = &rcg_dummy_freq, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004590 .c = { \
4591 .dbg_name = #i "_clk", \
Stephen Boyd409b8b42012-04-10 12:12:56 -07004592 .ops = &clk_ops_rcg, \
Matt Wagantall988e4432012-10-10 23:36:20 -07004593 VDD_DIG_FMAX_MAP1(LOW, 27000000), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004594 CLK_INIT(i##_clk.c), \
4595 }, \
4596 }
4597
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004598#define CLK_AIF_BIT(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08004599 struct cdiv_clk i##_clk = { \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004600 .b = { \
4601 .ctl_reg = ns, \
4602 .en_mask = BIT(15), \
4603 .halt_reg = h_r, \
4604 .halt_check = DELAY, \
4605 }, \
4606 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08004607 .ext_mask = BIT(14), \
4608 .div_offset = 10, \
4609 .max_div = 16, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004610 .c = { \
4611 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08004612 .ops = &clk_ops_cdiv, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004613 CLK_INIT(i##_clk.c), \
Stephen Boydd51d5e82012-06-18 18:09:50 -07004614 .rate = ULONG_MAX, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004615 }, \
4616 }
4617
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004618#define CLK_AIF_BIT_DIV(i, ns, h_r) \
Stephen Boyd9fd19642011-11-16 11:11:09 -08004619 struct cdiv_clk i##_clk = { \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004620 .b = { \
4621 .ctl_reg = ns, \
4622 .en_mask = BIT(19), \
4623 .halt_reg = h_r, \
Stephen Boyd7bb9cf82012-01-25 18:09:01 -08004624 .halt_check = DELAY, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004625 }, \
4626 .ns_reg = ns, \
Stephen Boyd9fd19642011-11-16 11:11:09 -08004627 .ext_mask = BIT(18), \
4628 .div_offset = 10, \
4629 .max_div = 256, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004630 .c = { \
4631 .dbg_name = #i "_clk", \
Stephen Boyd9fd19642011-11-16 11:11:09 -08004632 .ops = &clk_ops_cdiv, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004633 CLK_INIT(i##_clk.c), \
Stephen Boydd51d5e82012-06-18 18:09:50 -07004634 .rate = ULONG_MAX, \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004635 }, \
4636 }
4637
4638static CLK_AIF_OSR(mi2s_osr, LCC_MI2S_NS_REG, LCC_MI2S_MD_REG,
4639 LCC_MI2S_STATUS_REG);
4640static CLK_AIF_BIT(mi2s_bit, LCC_MI2S_NS_REG, LCC_MI2S_STATUS_REG);
4641
4642static CLK_AIF_OSR_DIV(codec_i2s_mic_osr, LCC_CODEC_I2S_MIC_NS_REG,
4643 LCC_CODEC_I2S_MIC_MD_REG, LCC_CODEC_I2S_MIC_STATUS_REG);
4644static CLK_AIF_BIT_DIV(codec_i2s_mic_bit, LCC_CODEC_I2S_MIC_NS_REG,
4645 LCC_CODEC_I2S_MIC_STATUS_REG);
4646
4647static CLK_AIF_OSR_DIV(spare_i2s_mic_osr, LCC_SPARE_I2S_MIC_NS_REG,
4648 LCC_SPARE_I2S_MIC_MD_REG, LCC_SPARE_I2S_MIC_STATUS_REG);
4649static CLK_AIF_BIT_DIV(spare_i2s_mic_bit, LCC_SPARE_I2S_MIC_NS_REG,
4650 LCC_SPARE_I2S_MIC_STATUS_REG);
4651
4652static CLK_AIF_OSR_DIV(codec_i2s_spkr_osr, LCC_CODEC_I2S_SPKR_NS_REG,
4653 LCC_CODEC_I2S_SPKR_MD_REG, LCC_CODEC_I2S_SPKR_STATUS_REG);
4654static CLK_AIF_BIT_DIV(codec_i2s_spkr_bit, LCC_CODEC_I2S_SPKR_NS_REG,
4655 LCC_CODEC_I2S_SPKR_STATUS_REG);
4656
4657static CLK_AIF_OSR_DIV(spare_i2s_spkr_osr, LCC_SPARE_I2S_SPKR_NS_REG,
4658 LCC_SPARE_I2S_SPKR_MD_REG, LCC_SPARE_I2S_SPKR_STATUS_REG);
4659static CLK_AIF_BIT_DIV(spare_i2s_spkr_bit, LCC_SPARE_I2S_SPKR_NS_REG,
4660 LCC_SPARE_I2S_SPKR_STATUS_REG);
4661
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004662#define F_PCM(f, s, d, m, n) \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004663 { \
4664 .freq_hz = f, \
4665 .src_clk = &s##_clk.c, \
4666 .md_val = MD16(m, n), \
4667 .ns_val = NS(31, 16, n, m, 5, 4, 3, d, 2, 0, s##_to_lpa_mux), \
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004668 }
Matt Wagantall86e03822011-12-12 10:59:24 -08004669static struct clk_freq_tbl clk_tbl_pcm_492[] = {
4670 { .ns_val = BIT(10) /* external input */ },
Stephen Boyde9ed94d2012-08-02 10:57:11 -07004671 F_PCM( 256000, pll4, 4, 1, 480),
Matt Wagantall86e03822011-12-12 10:59:24 -08004672 F_PCM( 512000, pll4, 4, 1, 240),
4673 F_PCM( 768000, pll4, 4, 1, 160),
4674 F_PCM( 1024000, pll4, 4, 1, 120),
4675 F_PCM( 1536000, pll4, 4, 1, 80),
4676 F_PCM( 2048000, pll4, 4, 1, 60),
4677 F_PCM( 3072000, pll4, 4, 1, 40),
4678 F_PCM( 4096000, pll4, 4, 1, 30),
4679 F_PCM( 6144000, pll4, 4, 1, 20),
4680 F_PCM( 8192000, pll4, 4, 1, 15),
4681 F_PCM(12288000, pll4, 4, 1, 10),
4682 F_PCM(24576000, pll4, 4, 1, 5),
Matt Wagantall988e4432012-10-10 23:36:20 -07004683 F_PCM(27000000, pxo, 1, 0, 0),
Matt Wagantall86e03822011-12-12 10:59:24 -08004684 F_END
4685};
4686
4687static struct clk_freq_tbl clk_tbl_pcm_393[] = {
Stephen Boyd630f3252012-01-31 00:10:08 -08004688 { .ns_val = BIT(10) /* external input */ },
Stephen Boyde9ed94d2012-08-02 10:57:11 -07004689 F_PCM( 256000, pll4, 4, 1, 384),
Matt Wagantalle18bbc82011-10-06 10:07:28 -07004690 F_PCM( 512000, pll4, 4, 1, 192),
4691 F_PCM( 768000, pll4, 4, 1, 128),
4692 F_PCM( 1024000, pll4, 4, 1, 96),
4693 F_PCM( 1536000, pll4, 4, 1, 64),
4694 F_PCM( 2048000, pll4, 4, 1, 48),
4695 F_PCM( 3072000, pll4, 4, 1, 32),
4696 F_PCM( 4096000, pll4, 4, 1, 24),
4697 F_PCM( 6144000, pll4, 4, 1, 16),
4698 F_PCM( 8192000, pll4, 4, 1, 12),
4699 F_PCM(12288000, pll4, 4, 1, 8),
4700 F_PCM(24576000, pll4, 4, 1, 4),
Matt Wagantall988e4432012-10-10 23:36:20 -07004701 F_PCM(27000000, pxo, 1, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004702 F_END
4703};
4704
4705static struct rcg_clk pcm_clk = {
4706 .b = {
4707 .ctl_reg = LCC_PCM_NS_REG,
4708 .en_mask = BIT(11),
4709 .reset_reg = LCC_PCM_NS_REG,
4710 .reset_mask = BIT(13),
4711 .halt_reg = LCC_PCM_STATUS_REG,
4712 .halt_check = ENABLE,
4713 .halt_bit = 0,
4714 },
4715 .ns_reg = LCC_PCM_NS_REG,
4716 .md_reg = LCC_PCM_MD_REG,
4717 .root_en_mask = BIT(9),
Stephen Boyd630f3252012-01-31 00:10:08 -08004718 .ns_mask = BM(31, 16) | BIT(10) | BM(6, 0),
Matt Wagantall07c45472012-02-10 23:27:24 -08004719 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004720 .set_rate = set_rate_mnd,
Matt Wagantall86e03822011-12-12 10:59:24 -08004721 .freq_tbl = clk_tbl_pcm_393,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004722 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004723 .c = {
4724 .dbg_name = "pcm_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07004725 .ops = &clk_ops_rcg,
Matt Wagantall988e4432012-10-10 23:36:20 -07004726 VDD_DIG_FMAX_MAP1(LOW, 27000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004727 CLK_INIT(pcm_clk.c),
Stephen Boydc5492fc2012-06-18 18:47:03 -07004728 .rate = ULONG_MAX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004729 },
4730};
4731
4732static struct rcg_clk audio_slimbus_clk = {
4733 .b = {
4734 .ctl_reg = LCC_SLIMBUS_NS_REG,
4735 .en_mask = BIT(10),
4736 .reset_reg = LCC_AHBEX_BRANCH_CTL_REG,
4737 .reset_mask = BIT(5),
4738 .halt_reg = LCC_SLIMBUS_STATUS_REG,
4739 .halt_check = ENABLE,
4740 .halt_bit = 0,
4741 },
4742 .ns_reg = LCC_SLIMBUS_NS_REG,
4743 .md_reg = LCC_SLIMBUS_MD_REG,
4744 .root_en_mask = BIT(9),
4745 .ns_mask = (BM(31, 24) | BM(6, 0)),
Matt Wagantall07c45472012-02-10 23:27:24 -08004746 .mnd_en_mask = BIT(8),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004747 .set_rate = set_rate_mnd,
Matt Wagantall86e03822011-12-12 10:59:24 -08004748 .freq_tbl = clk_tbl_aif_osr_393,
Matt Wagantall84f43fd2011-08-16 23:28:38 -07004749 .current_freq = &rcg_dummy_freq,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004750 .c = {
4751 .dbg_name = "audio_slimbus_clk",
Stephen Boyd409b8b42012-04-10 12:12:56 -07004752 .ops = &clk_ops_rcg,
Matt Wagantall988e4432012-10-10 23:36:20 -07004753 VDD_DIG_FMAX_MAP1(LOW, 27000000),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004754 CLK_INIT(audio_slimbus_clk.c),
4755 },
4756};
4757
4758static struct branch_clk sps_slimbus_clk = {
4759 .b = {
4760 .ctl_reg = LCC_SLIMBUS_NS_REG,
4761 .en_mask = BIT(12),
4762 .halt_reg = LCC_SLIMBUS_STATUS_REG,
4763 .halt_check = ENABLE,
4764 .halt_bit = 1,
4765 },
4766 .parent = &audio_slimbus_clk.c,
4767 .c = {
4768 .dbg_name = "sps_slimbus_clk",
4769 .ops = &clk_ops_branch,
4770 CLK_INIT(sps_slimbus_clk.c),
4771 },
4772};
4773
4774static struct branch_clk slimbus_xo_src_clk = {
4775 .b = {
4776 .ctl_reg = SLIMBUS_XO_SRC_CLK_CTL_REG,
4777 .en_mask = BIT(2),
4778 .halt_reg = CLK_HALT_DFAB_STATE_REG,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004779 .halt_bit = 28,
4780 },
4781 .parent = &sps_slimbus_clk.c,
4782 .c = {
4783 .dbg_name = "slimbus_xo_src_clk",
4784 .ops = &clk_ops_branch,
4785 CLK_INIT(slimbus_xo_src_clk.c),
4786 },
4787};
4788
Matt Wagantall735f01a2011-08-12 12:40:28 -07004789DEFINE_CLK_RPM(afab_clk, afab_a_clk, APPS_FABRIC, NULL);
4790DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
4791DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
4792DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
4793DEFINE_CLK_RPM(mmfab_clk, mmfab_a_clk, MM_FABRIC, NULL);
4794DEFINE_CLK_RPM(mmfpb_clk, mmfpb_a_clk, MMFPB, NULL);
4795DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
4796DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
Stephen Boydc7fc3b12012-05-17 14:42:46 -07004797DEFINE_CLK_RPM_QDSS(qdss_clk, qdss_a_clk);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004798
Matt Wagantall35e78fc2012-04-05 14:18:44 -07004799static DEFINE_CLK_VOTER(sfab_msmbus_a_clk, &sfab_a_clk.c, 0);
4800static DEFINE_CLK_VOTER(sfab_tmr_a_clk, &sfab_a_clk.c, 0);
Stephen Boydd7a143a2012-02-16 17:59:26 -08004801
Matt Wagantall35e78fc2012-04-05 14:18:44 -07004802static DEFINE_CLK_VOTER(dfab_dsps_clk, &dfab_clk.c, 0);
4803static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c, 0);
4804static DEFINE_CLK_VOTER(dfab_usb_hs3_clk, &dfab_clk.c, 0);
4805static DEFINE_CLK_VOTER(dfab_usb_hs4_clk, &dfab_clk.c, 0);
4806static DEFINE_CLK_VOTER(dfab_sdc1_clk, &dfab_clk.c, 0);
4807static DEFINE_CLK_VOTER(dfab_sdc2_clk, &dfab_clk.c, 0);
4808static DEFINE_CLK_VOTER(dfab_sdc3_clk, &dfab_clk.c, 0);
4809static DEFINE_CLK_VOTER(dfab_sdc4_clk, &dfab_clk.c, 0);
4810static DEFINE_CLK_VOTER(dfab_sdc5_clk, &dfab_clk.c, 0);
4811static DEFINE_CLK_VOTER(dfab_sps_clk, &dfab_clk.c, 0);
4812static DEFINE_CLK_VOTER(dfab_bam_dmux_clk, &dfab_clk.c, 0);
4813static DEFINE_CLK_VOTER(dfab_scm_clk, &dfab_clk.c, 0);
Matt Wagantall35e78fc2012-04-05 14:18:44 -07004814static DEFINE_CLK_VOTER(dfab_msmbus_clk, &dfab_clk.c, 0);
4815static DEFINE_CLK_VOTER(dfab_msmbus_a_clk, &dfab_a_clk.c, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004816
Matt Wagantall42cd12a2012-03-30 18:02:40 -07004817static DEFINE_CLK_VOTER(ebi1_msmbus_clk, &ebi1_clk.c, LONG_MAX);
Matt Wagantall35e78fc2012-04-05 14:18:44 -07004818static DEFINE_CLK_VOTER(ebi1_adm_clk, &ebi1_clk.c, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004819
Matt Wagantall33bac7e2012-05-22 14:59:05 -07004820static DEFINE_CLK_VOTER(ebi1_acpu_a_clk, &ebi1_a_clk.c, LONG_MAX);
4821static DEFINE_CLK_VOTER(ebi1_msmbus_a_clk, &ebi1_a_clk.c, LONG_MAX);
4822static DEFINE_CLK_VOTER(afab_acpu_a_clk, &afab_a_clk.c, LONG_MAX);
4823static DEFINE_CLK_VOTER(afab_msmbus_a_clk, &afab_a_clk.c, LONG_MAX);
4824
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004825#ifdef CONFIG_DEBUG_FS
4826struct measure_sel {
4827 u32 test_vector;
Matt Wagantallf82f2942012-01-27 13:56:13 -08004828 struct clk *c;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004829};
4830
Matt Wagantall8b38f942011-08-02 18:23:18 -07004831static DEFINE_CLK_MEASURE(l2_m_clk);
4832static DEFINE_CLK_MEASURE(krait0_m_clk);
4833static DEFINE_CLK_MEASURE(krait1_m_clk);
Tianyi Gou455c13c2012-02-02 16:33:24 -08004834static DEFINE_CLK_MEASURE(krait2_m_clk);
4835static DEFINE_CLK_MEASURE(krait3_m_clk);
Stephen Boyd3939c8d2011-08-29 17:36:22 -07004836static DEFINE_CLK_MEASURE(q6sw_clk);
4837static DEFINE_CLK_MEASURE(q6fw_clk);
4838static DEFINE_CLK_MEASURE(q6_func_clk);
Matt Wagantall8b38f942011-08-02 18:23:18 -07004839
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004840static struct measure_sel measure_mux[] = {
4841 { TEST_PER_LS(0x08), &slimbus_xo_src_clk.c },
4842 { TEST_PER_LS(0x12), &sdc1_p_clk.c },
4843 { TEST_PER_LS(0x13), &sdc1_clk.c },
4844 { TEST_PER_LS(0x14), &sdc2_p_clk.c },
4845 { TEST_PER_LS(0x15), &sdc2_clk.c },
4846 { TEST_PER_LS(0x16), &sdc3_p_clk.c },
4847 { TEST_PER_LS(0x17), &sdc3_clk.c },
4848 { TEST_PER_LS(0x18), &sdc4_p_clk.c },
4849 { TEST_PER_LS(0x19), &sdc4_clk.c },
4850 { TEST_PER_LS(0x1A), &sdc5_p_clk.c },
4851 { TEST_PER_LS(0x1B), &sdc5_clk.c },
Matt Wagantall7625a4c2011-11-01 16:17:53 -07004852 { TEST_PER_LS(0x1F), &gp0_clk.c },
4853 { TEST_PER_LS(0x20), &gp1_clk.c },
4854 { TEST_PER_LS(0x21), &gp2_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004855 { TEST_PER_LS(0x25), &dfab_clk.c },
4856 { TEST_PER_LS(0x25), &dfab_a_clk.c },
4857 { TEST_PER_LS(0x26), &pmem_clk.c },
4858 { TEST_PER_LS(0x32), &dma_bam_p_clk.c },
4859 { TEST_PER_LS(0x33), &cfpb_clk.c },
4860 { TEST_PER_LS(0x33), &cfpb_a_clk.c },
4861 { TEST_PER_LS(0x3D), &gsbi1_p_clk.c },
4862 { TEST_PER_LS(0x3E), &gsbi1_uart_clk.c },
4863 { TEST_PER_LS(0x3F), &gsbi1_qup_clk.c },
4864 { TEST_PER_LS(0x41), &gsbi2_p_clk.c },
4865 { TEST_PER_LS(0x42), &gsbi2_uart_clk.c },
4866 { TEST_PER_LS(0x44), &gsbi2_qup_clk.c },
4867 { TEST_PER_LS(0x45), &gsbi3_p_clk.c },
4868 { TEST_PER_LS(0x46), &gsbi3_uart_clk.c },
4869 { TEST_PER_LS(0x48), &gsbi3_qup_clk.c },
4870 { TEST_PER_LS(0x49), &gsbi4_p_clk.c },
4871 { TEST_PER_LS(0x4A), &gsbi4_uart_clk.c },
4872 { TEST_PER_LS(0x4C), &gsbi4_qup_clk.c },
4873 { TEST_PER_LS(0x4D), &gsbi5_p_clk.c },
4874 { TEST_PER_LS(0x4E), &gsbi5_uart_clk.c },
4875 { TEST_PER_LS(0x50), &gsbi5_qup_clk.c },
4876 { TEST_PER_LS(0x51), &gsbi6_p_clk.c },
4877 { TEST_PER_LS(0x52), &gsbi6_uart_clk.c },
4878 { TEST_PER_LS(0x54), &gsbi6_qup_clk.c },
4879 { TEST_PER_LS(0x55), &gsbi7_p_clk.c },
4880 { TEST_PER_LS(0x56), &gsbi7_uart_clk.c },
4881 { TEST_PER_LS(0x58), &gsbi7_qup_clk.c },
4882 { TEST_PER_LS(0x59), &gsbi8_p_clk.c },
Tianyi Gou352955d2012-05-18 19:44:01 -07004883 { TEST_PER_LS(0x59), &sfab_sata_s_p_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004884 { TEST_PER_LS(0x5A), &gsbi8_uart_clk.c },
Tianyi Gou352955d2012-05-18 19:44:01 -07004885 { TEST_PER_LS(0x5A), &sata_p_clk.c },
4886 { TEST_PER_LS(0x5B), &sata_rxoob_clk.c },
4887 { TEST_PER_LS(0x5C), &sata_pmalive_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004888 { TEST_PER_LS(0x5C), &gsbi8_qup_clk.c },
4889 { TEST_PER_LS(0x5D), &gsbi9_p_clk.c },
4890 { TEST_PER_LS(0x5E), &gsbi9_uart_clk.c },
4891 { TEST_PER_LS(0x60), &gsbi9_qup_clk.c },
4892 { TEST_PER_LS(0x61), &gsbi10_p_clk.c },
4893 { TEST_PER_LS(0x62), &gsbi10_uart_clk.c },
4894 { TEST_PER_LS(0x64), &gsbi10_qup_clk.c },
4895 { TEST_PER_LS(0x65), &gsbi11_p_clk.c },
4896 { TEST_PER_LS(0x66), &gsbi11_uart_clk.c },
4897 { TEST_PER_LS(0x68), &gsbi11_qup_clk.c },
4898 { TEST_PER_LS(0x69), &gsbi12_p_clk.c },
4899 { TEST_PER_LS(0x6A), &gsbi12_uart_clk.c },
4900 { TEST_PER_LS(0x6C), &gsbi12_qup_clk.c },
Tianyi Gou41515e22011-09-01 19:37:43 -07004901 { TEST_PER_LS(0x5E), &pcie_p_clk.c },
4902 { TEST_PER_LS(0x5F), &ce3_p_clk.c },
4903 { TEST_PER_LS(0x60), &ce3_core_clk.c },
4904 { TEST_PER_LS(0x63), &usb_hs3_p_clk.c },
4905 { TEST_PER_LS(0x64), &usb_hs3_xcvr_clk.c },
4906 { TEST_PER_LS(0x65), &usb_hs4_p_clk.c },
4907 { TEST_PER_LS(0x66), &usb_hs4_xcvr_clk.c },
4908 { TEST_PER_LS(0x6B), &sata_phy_ref_clk.c },
4909 { TEST_PER_LS(0x6C), &sata_phy_cfg_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004910 { TEST_PER_LS(0x78), &sfpb_clk.c },
4911 { TEST_PER_LS(0x78), &sfpb_a_clk.c },
4912 { TEST_PER_LS(0x7A), &pmic_ssbi2_clk.c },
4913 { TEST_PER_LS(0x7B), &pmic_arb0_p_clk.c },
4914 { TEST_PER_LS(0x7C), &pmic_arb1_p_clk.c },
4915 { TEST_PER_LS(0x7D), &prng_clk.c },
4916 { TEST_PER_LS(0x7F), &rpm_msg_ram_p_clk.c },
4917 { TEST_PER_LS(0x80), &adm0_p_clk.c },
4918 { TEST_PER_LS(0x84), &usb_hs1_p_clk.c },
4919 { TEST_PER_LS(0x85), &usb_hs1_xcvr_clk.c },
Stephen Boyd94625ef2011-07-12 17:06:01 -07004920 { TEST_PER_LS(0x86), &usb_hsic_p_clk.c },
4921 { TEST_PER_LS(0x87), &usb_hsic_system_clk.c },
4922 { TEST_PER_LS(0x88), &usb_hsic_xcvr_fs_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004923 { TEST_PER_LS(0x89), &usb_fs1_p_clk.c },
4924 { TEST_PER_LS(0x8A), &usb_fs1_sys_clk.c },
4925 { TEST_PER_LS(0x8B), &usb_fs1_xcvr_clk.c },
4926 { TEST_PER_LS(0x8C), &usb_fs2_p_clk.c },
4927 { TEST_PER_LS(0x8D), &usb_fs2_sys_clk.c },
4928 { TEST_PER_LS(0x8E), &usb_fs2_xcvr_clk.c },
4929 { TEST_PER_LS(0x8F), &tsif_p_clk.c },
4930 { TEST_PER_LS(0x91), &tsif_ref_clk.c },
4931 { TEST_PER_LS(0x92), &ce1_p_clk.c },
4932 { TEST_PER_LS(0x94), &tssc_clk.c },
Stephen Boyd94625ef2011-07-12 17:06:01 -07004933 { TEST_PER_LS(0x9D), &usb_hsic_hsio_cal_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004934 { TEST_PER_LS(0xA4), &ce1_core_clk.c },
4935
4936 { TEST_PER_HS(0x07), &afab_clk.c },
4937 { TEST_PER_HS(0x07), &afab_a_clk.c },
4938 { TEST_PER_HS(0x18), &sfab_clk.c },
4939 { TEST_PER_HS(0x18), &sfab_a_clk.c },
Stephen Boyd3939c8d2011-08-29 17:36:22 -07004940 { TEST_PER_HS(0x26), &q6sw_clk },
4941 { TEST_PER_HS(0x27), &q6fw_clk },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004942 { TEST_PER_HS(0x2A), &adm0_clk.c },
Tianyi Gou352955d2012-05-18 19:44:01 -07004943 { TEST_PER_HS(0x31), &sata_a_clk.c },
Tianyi Gou6613de52012-01-27 17:57:53 -08004944 { TEST_PER_HS(0x2D), &pcie_phy_ref_clk.c },
4945 { TEST_PER_HS(0x32), &pcie_a_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004946 { TEST_PER_HS(0x34), &ebi1_clk.c },
4947 { TEST_PER_HS(0x34), &ebi1_a_clk.c },
Stephen Boyd94625ef2011-07-12 17:06:01 -07004948 { TEST_PER_HS(0x50), &usb_hsic_hsic_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004949
4950 { TEST_MM_LS(0x00), &dsi1_byte_clk.c },
4951 { TEST_MM_LS(0x01), &dsi2_byte_clk.c },
4952 { TEST_MM_LS(0x02), &cam1_clk.c },
4953 { TEST_MM_LS(0x06), &amp_p_clk.c },
Matt Wagantallc23eee92011-08-16 23:06:52 -07004954 { TEST_MM_LS(0x07), &csi_p_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004955 { TEST_MM_LS(0x08), &dsi2_s_p_clk.c },
4956 { TEST_MM_LS(0x09), &dsi1_m_p_clk.c },
4957 { TEST_MM_LS(0x0A), &dsi1_s_p_clk.c },
4958 { TEST_MM_LS(0x0C), &gfx2d0_p_clk.c },
4959 { TEST_MM_LS(0x0D), &gfx2d1_p_clk.c },
4960 { TEST_MM_LS(0x0E), &gfx3d_p_clk.c },
4961 { TEST_MM_LS(0x0F), &hdmi_m_p_clk.c },
4962 { TEST_MM_LS(0x10), &hdmi_s_p_clk.c },
4963 { TEST_MM_LS(0x11), &ijpeg_p_clk.c },
4964 { TEST_MM_LS(0x12), &imem_p_clk.c },
4965 { TEST_MM_LS(0x13), &jpegd_p_clk.c },
4966 { TEST_MM_LS(0x14), &mdp_p_clk.c },
4967 { TEST_MM_LS(0x16), &rot_p_clk.c },
4968 { TEST_MM_LS(0x17), &dsi1_esc_clk.c },
4969 { TEST_MM_LS(0x18), &smmu_p_clk.c },
4970 { TEST_MM_LS(0x19), &tv_enc_p_clk.c },
4971 { TEST_MM_LS(0x1A), &vcodec_p_clk.c },
4972 { TEST_MM_LS(0x1B), &vfe_p_clk.c },
4973 { TEST_MM_LS(0x1C), &vpe_p_clk.c },
4974 { TEST_MM_LS(0x1D), &cam0_clk.c },
4975 { TEST_MM_LS(0x1F), &hdmi_app_clk.c },
4976 { TEST_MM_LS(0x20), &mdp_vsync_clk.c },
4977 { TEST_MM_LS(0x21), &tv_dac_clk.c },
4978 { TEST_MM_LS(0x22), &tv_enc_clk.c },
4979 { TEST_MM_LS(0x23), &dsi2_esc_clk.c },
4980 { TEST_MM_LS(0x25), &mmfpb_clk.c },
4981 { TEST_MM_LS(0x25), &mmfpb_a_clk.c },
4982 { TEST_MM_LS(0x26), &dsi2_m_p_clk.c },
Stephen Boyd94625ef2011-07-12 17:06:01 -07004983 { TEST_MM_LS(0x27), &cam2_clk.c },
Tianyi Gou41515e22011-09-01 19:37:43 -07004984 { TEST_MM_LS(0x28), &vcap_p_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004985
4986 { TEST_MM_HS(0x00), &csi0_clk.c },
4987 { TEST_MM_HS(0x01), &csi1_clk.c },
Matt Wagantallc23eee92011-08-16 23:06:52 -07004988 { TEST_MM_HS(0x04), &csi_vfe_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07004989 { TEST_MM_HS(0x05), &ijpeg_clk.c },
4990 { TEST_MM_HS(0x06), &vfe_clk.c },
4991 { TEST_MM_HS(0x07), &gfx2d0_clk.c },
4992 { TEST_MM_HS(0x08), &gfx2d1_clk.c },
4993 { TEST_MM_HS(0x09), &gfx3d_clk.c },
4994 { TEST_MM_HS(0x0A), &jpegd_clk.c },
4995 { TEST_MM_HS(0x0B), &vcodec_clk.c },
4996 { TEST_MM_HS(0x0F), &mmfab_clk.c },
4997 { TEST_MM_HS(0x0F), &mmfab_a_clk.c },
4998 { TEST_MM_HS(0x11), &gmem_axi_clk.c },
4999 { TEST_MM_HS(0x12), &ijpeg_axi_clk.c },
5000 { TEST_MM_HS(0x13), &imem_axi_clk.c },
5001 { TEST_MM_HS(0x14), &jpegd_axi_clk.c },
5002 { TEST_MM_HS(0x15), &mdp_axi_clk.c },
5003 { TEST_MM_HS(0x16), &rot_axi_clk.c },
5004 { TEST_MM_HS(0x17), &vcodec_axi_clk.c },
5005 { TEST_MM_HS(0x18), &vfe_axi_clk.c },
5006 { TEST_MM_HS(0x19), &vpe_axi_clk.c },
5007 { TEST_MM_HS(0x1A), &mdp_clk.c },
5008 { TEST_MM_HS(0x1B), &rot_clk.c },
5009 { TEST_MM_HS(0x1C), &vpe_clk.c },
5010 { TEST_MM_HS(0x1E), &hdmi_tv_clk.c },
5011 { TEST_MM_HS(0x1F), &mdp_tv_clk.c },
5012 { TEST_MM_HS(0x24), &csi0_phy_clk.c },
5013 { TEST_MM_HS(0x25), &csi1_phy_clk.c },
5014 { TEST_MM_HS(0x26), &csi_pix_clk.c },
5015 { TEST_MM_HS(0x27), &csi_rdi_clk.c },
5016 { TEST_MM_HS(0x28), &lut_mdp_clk.c },
5017 { TEST_MM_HS(0x29), &vcodec_axi_a_clk.c },
5018 { TEST_MM_HS(0x2A), &vcodec_axi_b_clk.c },
5019 { TEST_MM_HS(0x2B), &csi1phy_timer_clk.c },
5020 { TEST_MM_HS(0x2C), &csi0phy_timer_clk.c },
Stephen Boyd94625ef2011-07-12 17:06:01 -07005021 { TEST_MM_HS(0x2D), &csi2_clk.c },
5022 { TEST_MM_HS(0x2E), &csi2_phy_clk.c },
5023 { TEST_MM_HS(0x2F), &csi2phy_timer_clk.c },
5024 { TEST_MM_HS(0x30), &csi_pix1_clk.c },
5025 { TEST_MM_HS(0x31), &csi_rdi1_clk.c },
5026 { TEST_MM_HS(0x32), &csi_rdi2_clk.c },
Tianyi Gou621f8742011-09-01 21:45:01 -07005027 { TEST_MM_HS(0x33), &vcap_clk.c },
5028 { TEST_MM_HS(0x34), &vcap_npl_clk.c },
Tianyi Goue3d4f542012-03-15 17:06:45 -07005029 { TEST_MM_HS(0x34), &gfx3d_axi_clk_8930.c },
Tianyi Gou7747a962012-02-03 15:03:55 -08005030 { TEST_MM_HS(0x35), &vcap_axi_clk.c },
Tianyi Gou51918802012-01-26 14:05:43 -08005031 { TEST_MM_HS(0x36), &rgb_tv_clk.c },
5032 { TEST_MM_HS(0x37), &npl_tv_clk.c },
Patrick Dalye6f489042012-07-11 15:29:15 -07005033 { TEST_MM_HS(0x38), &gfx3d_axi_clk.c },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005034
5035 { TEST_LPA(0x0F), &mi2s_bit_clk.c },
5036 { TEST_LPA(0x10), &codec_i2s_mic_bit_clk.c },
5037 { TEST_LPA(0x11), &codec_i2s_spkr_bit_clk.c },
5038 { TEST_LPA(0x12), &spare_i2s_mic_bit_clk.c },
5039 { TEST_LPA(0x13), &spare_i2s_spkr_bit_clk.c },
5040 { TEST_LPA(0x14), &pcm_clk.c },
5041 { TEST_LPA(0x1D), &audio_slimbus_clk.c },
Matt Wagantall8b38f942011-08-02 18:23:18 -07005042
Stephen Boyd3939c8d2011-08-29 17:36:22 -07005043 { TEST_LPA_HS(0x00), &q6_func_clk },
5044
Stephen Boyd46fdf0d2011-11-22 12:25:09 -08005045 { TEST_CPUL2(0x2), &l2_m_clk },
5046 { TEST_CPUL2(0x0), &krait0_m_clk },
5047 { TEST_CPUL2(0x1), &krait1_m_clk },
Tianyi Gou455c13c2012-02-02 16:33:24 -08005048 { TEST_CPUL2(0x4), &krait2_m_clk },
5049 { TEST_CPUL2(0x5), &krait3_m_clk },
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005050};
5051
Matt Wagantallf82f2942012-01-27 13:56:13 -08005052static struct measure_sel *find_measure_sel(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005053{
5054 int i;
5055
5056 for (i = 0; i < ARRAY_SIZE(measure_mux); i++)
Matt Wagantallf82f2942012-01-27 13:56:13 -08005057 if (measure_mux[i].c == c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005058 return &measure_mux[i];
5059 return NULL;
5060}
5061
Matt Wagantall8b38f942011-08-02 18:23:18 -07005062static int measure_clk_set_parent(struct clk *c, struct clk *parent)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005063{
5064 int ret = 0;
5065 u32 clk_sel;
5066 struct measure_sel *p;
Matt Wagantallf82f2942012-01-27 13:56:13 -08005067 struct measure_clk *measure = to_measure_clk(c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005068 unsigned long flags;
5069
5070 if (!parent)
5071 return -EINVAL;
5072
5073 p = find_measure_sel(parent);
5074 if (!p)
5075 return -EINVAL;
5076
5077 spin_lock_irqsave(&local_clock_reg_lock, flags);
5078
Matt Wagantall8b38f942011-08-02 18:23:18 -07005079 /*
5080 * Program the test vector, measurement period (sample_ticks)
5081 * and scaling multiplier.
5082 */
Matt Wagantallf82f2942012-01-27 13:56:13 -08005083 measure->sample_ticks = 0x10000;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005084 clk_sel = p->test_vector & TEST_CLK_SEL_MASK;
Matt Wagantallf82f2942012-01-27 13:56:13 -08005085 measure->multiplier = 1;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005086 switch (p->test_vector >> TEST_TYPE_SHIFT) {
5087 case TEST_TYPE_PER_LS:
5088 writel_relaxed(0x4030D00|BVAL(7, 0, clk_sel), CLK_TEST_REG);
5089 break;
5090 case TEST_TYPE_PER_HS:
5091 writel_relaxed(0x4020000|BVAL(16, 10, clk_sel), CLK_TEST_REG);
5092 break;
5093 case TEST_TYPE_MM_LS:
5094 writel_relaxed(0x4030D97, CLK_TEST_REG);
5095 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), DBG_CFG_REG_LS_REG);
5096 break;
5097 case TEST_TYPE_MM_HS:
5098 writel_relaxed(0x402B800, CLK_TEST_REG);
5099 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0), DBG_CFG_REG_HS_REG);
5100 break;
5101 case TEST_TYPE_LPA:
5102 writel_relaxed(0x4030D98, CLK_TEST_REG);
5103 writel_relaxed(BVAL(6, 1, clk_sel)|BIT(0),
5104 LCC_CLK_LS_DEBUG_CFG_REG);
5105 break;
Stephen Boyd3939c8d2011-08-29 17:36:22 -07005106 case TEST_TYPE_LPA_HS:
5107 writel_relaxed(0x402BC00, CLK_TEST_REG);
5108 writel_relaxed(BVAL(2, 1, clk_sel)|BIT(0),
5109 LCC_CLK_HS_DEBUG_CFG_REG);
5110 break;
Matt Wagantall8b38f942011-08-02 18:23:18 -07005111 case TEST_TYPE_CPUL2:
5112 writel_relaxed(0x4030400, CLK_TEST_REG);
5113 writel_relaxed(0x80|BVAL(5, 3, clk_sel), GCC_APCS_CLK_DIAG);
Matt Wagantallf82f2942012-01-27 13:56:13 -08005114 measure->sample_ticks = 0x4000;
5115 measure->multiplier = 2;
Matt Wagantall8b38f942011-08-02 18:23:18 -07005116 break;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005117 default:
5118 ret = -EPERM;
5119 }
5120 /* Make sure test vector is set before starting measurements. */
5121 mb();
5122
5123 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
5124
5125 return ret;
5126}
5127
5128/* Sample clock for 'ticks' reference clock ticks. */
5129static u32 run_measurement(unsigned ticks)
5130{
5131 /* Stop counters and set the XO4 counter start value. */
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005132 writel_relaxed(ticks, RINGOSC_TCXO_CTL_REG);
5133
5134 /* Wait for timer to become ready. */
5135 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) != 0)
5136 cpu_relax();
5137
5138 /* Run measurement and wait for completion. */
5139 writel_relaxed(BIT(20)|ticks, RINGOSC_TCXO_CTL_REG);
5140 while ((readl_relaxed(RINGOSC_STATUS_REG) & BIT(25)) == 0)
5141 cpu_relax();
5142
5143 /* Stop counters. */
5144 writel_relaxed(0x0, RINGOSC_TCXO_CTL_REG);
5145
5146 /* Return measured ticks. */
5147 return readl_relaxed(RINGOSC_STATUS_REG) & BM(24, 0);
5148}
5149
5150
5151/* Perform a hardware rate measurement for a given clock.
5152 FOR DEBUG USE ONLY: Measurements take ~15 ms! */
Matt Wagantall9de3bfb2011-11-03 20:13:12 -07005153static unsigned long measure_clk_get_rate(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005154{
5155 unsigned long flags;
5156 u32 pdm_reg_backup, ringosc_reg_backup;
5157 u64 raw_count_short, raw_count_full;
Matt Wagantallf82f2942012-01-27 13:56:13 -08005158 struct measure_clk *measure = to_measure_clk(c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005159 unsigned ret;
5160
Stephen Boyde334aeb2012-01-24 12:17:29 -08005161 ret = clk_prepare_enable(&cxo_clk.c);
Stephen Boyd3a35f0b2012-01-11 16:18:26 -08005162 if (ret) {
5163 pr_warning("CXO clock failed to enable. Can't measure\n");
5164 return 0;
5165 }
5166
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005167 spin_lock_irqsave(&local_clock_reg_lock, flags);
5168
5169 /* Enable CXO/4 and RINGOSC branch and root. */
5170 pdm_reg_backup = readl_relaxed(PDM_CLK_NS_REG);
5171 ringosc_reg_backup = readl_relaxed(RINGOSC_NS_REG);
5172 writel_relaxed(0x2898, PDM_CLK_NS_REG);
5173 writel_relaxed(0xA00, RINGOSC_NS_REG);
5174
5175 /*
5176 * The ring oscillator counter will not reset if the measured clock
5177 * is not running. To detect this, run a short measurement before
5178 * the full measurement. If the raw results of the two are the same
5179 * then the clock must be off.
5180 */
5181
5182 /* Run a short measurement. (~1 ms) */
5183 raw_count_short = run_measurement(0x1000);
5184 /* Run a full measurement. (~14 ms) */
Matt Wagantallf82f2942012-01-27 13:56:13 -08005185 raw_count_full = run_measurement(measure->sample_ticks);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005186
5187 writel_relaxed(ringosc_reg_backup, RINGOSC_NS_REG);
5188 writel_relaxed(pdm_reg_backup, PDM_CLK_NS_REG);
5189
5190 /* Return 0 if the clock is off. */
5191 if (raw_count_full == raw_count_short)
5192 ret = 0;
5193 else {
5194 /* Compute rate in Hz. */
5195 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
Matt Wagantallf82f2942012-01-27 13:56:13 -08005196 do_div(raw_count_full, ((measure->sample_ticks * 10) + 35));
5197 ret = (raw_count_full * measure->multiplier);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005198 }
5199
5200 /* Route dbg_hs_clk to PLLTEST. 300mV single-ended amplitude. */
Stephen Boyd69da8402011-07-14 17:45:31 -07005201 writel_relaxed(0x38F8, PLLTEST_PAD_CFG_REG);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005202 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
5203
Stephen Boyde334aeb2012-01-24 12:17:29 -08005204 clk_disable_unprepare(&cxo_clk.c);
Stephen Boyd3a35f0b2012-01-11 16:18:26 -08005205
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005206 return ret;
5207}
5208#else /* !CONFIG_DEBUG_FS */
Matt Wagantallf82f2942012-01-27 13:56:13 -08005209static int measure_clk_set_parent(struct clk *c, struct clk *parent)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005210{
5211 return -EINVAL;
5212}
5213
Matt Wagantallf82f2942012-01-27 13:56:13 -08005214static unsigned long measure_clk_get_rate(struct clk *c)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005215{
5216 return 0;
5217}
5218#endif /* CONFIG_DEBUG_FS */
5219
Matt Wagantallae053222012-05-14 19:42:07 -07005220static struct clk_ops clk_ops_measure = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005221 .set_parent = measure_clk_set_parent,
5222 .get_rate = measure_clk_get_rate,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005223};
5224
Matt Wagantall8b38f942011-08-02 18:23:18 -07005225static struct measure_clk measure_clk = {
5226 .c = {
5227 .dbg_name = "measure_clk",
Matt Wagantallae053222012-05-14 19:42:07 -07005228 .ops = &clk_ops_measure,
Matt Wagantall8b38f942011-08-02 18:23:18 -07005229 CLK_INIT(measure_clk.c),
5230 },
5231 .multiplier = 1,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005232};
5233
Tianyi Goua8b3cce2011-11-08 14:37:26 -08005234static struct clk_lookup msm_clocks_8064[] = {
Stephen Boyd72a80352012-01-26 15:57:38 -08005235 CLK_LOOKUP("xo", cxo_a_clk.c, ""),
5236 CLK_LOOKUP("xo", pxo_a_clk.c, ""),
Mohan Pallaka804ca592012-06-14 14:37:38 +05305237 CLK_LOOKUP("pwm_clk", cxo_clk.c, "0-0048"),
Stephen Boyded630b02012-01-26 15:26:47 -08005238 CLK_LOOKUP("cxo", cxo_clk.c, "wcnss_wlan.0"),
5239 CLK_LOOKUP("cxo", cxo_clk.c, "pil_riva"),
5240 CLK_LOOKUP("xo", pxo_clk.c, "pil_qdsp6v4.0"),
5241 CLK_LOOKUP("xo", cxo_clk.c, "pil_qdsp6v4.1"),
5242 CLK_LOOKUP("xo", cxo_clk.c, "pil_qdsp6v4.2"),
Matt Wagantall292aace2012-01-26 19:12:34 -08005243 CLK_LOOKUP("xo", cxo_clk.c, "pil_gss"),
Stephen Boyd69d35e32012-02-14 15:33:30 -08005244 CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"),
Stephen Boyd5a190a82012-03-01 14:45:15 -08005245 CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"),
David Collinsa7d23532012-08-02 10:48:16 -07005246 CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"),
Stephen Boyded630b02012-01-26 15:26:47 -08005247 CLK_LOOKUP("pll2", pll2_clk.c, NULL),
5248 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
5249 CLK_LOOKUP("pll4", pll4_clk.c, NULL),
5250 CLK_LOOKUP("measure", measure_clk.c, "debug"),
Tianyi Gou41515e22011-09-01 19:37:43 -07005251
Matt Wagantalld75f1312012-05-23 16:17:35 -07005252 CLK_LOOKUP("bus_clk", afab_clk.c, ""),
5253 CLK_LOOKUP("bus_clk", afab_a_clk.c, ""),
5254 CLK_LOOKUP("bus_clk", cfpb_clk.c, ""),
5255 CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""),
5256 CLK_LOOKUP("bus_clk", dfab_clk.c, ""),
5257 CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""),
5258 CLK_LOOKUP("mem_clk", ebi1_clk.c, ""),
5259 CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""),
5260 CLK_LOOKUP("bus_clk", mmfab_clk.c, ""),
5261 CLK_LOOKUP("bus_clk", mmfab_a_clk.c, ""),
5262 CLK_LOOKUP("bus_clk", mmfpb_clk.c, ""),
5263 CLK_LOOKUP("bus_clk", mmfpb_a_clk.c, ""),
5264 CLK_LOOKUP("bus_clk", sfab_clk.c, ""),
5265 CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""),
5266 CLK_LOOKUP("bus_clk", sfpb_clk.c, ""),
5267 CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""),
5268
Tianyi Gou21a0e802012-02-04 22:34:10 -08005269 CLK_LOOKUP("bus_clk", afab_clk.c, "msm_apps_fab"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07005270 CLK_LOOKUP("bus_a_clk", afab_msmbus_a_clk.c, "msm_apps_fab"),
Tianyi Gou21a0e802012-02-04 22:34:10 -08005271 CLK_LOOKUP("bus_clk", cfpb_clk.c, "msm_cpss_fpb"),
5272 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, "msm_cpss_fpb"),
5273 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
Stephen Boydd7a143a2012-02-16 17:59:26 -08005274 CLK_LOOKUP("bus_a_clk", sfab_msmbus_a_clk.c, "msm_sys_fab"),
Tianyi Gou21a0e802012-02-04 22:34:10 -08005275 CLK_LOOKUP("bus_clk", sfpb_clk.c, "msm_sys_fpb"),
5276 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, "msm_sys_fpb"),
5277 CLK_LOOKUP("bus_clk", mmfab_clk.c, "msm_mm_fab"),
5278 CLK_LOOKUP("bus_a_clk", mmfab_a_clk.c, "msm_mm_fab"),
5279 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07005280 CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"),
Gagan Macbc5f81d2012-04-04 15:03:12 -06005281 CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"),
5282 CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"),
Pratik Patelf17b1472012-05-25 22:23:52 -07005283 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, ""),
Pratik Patel3b0ca882012-06-01 16:54:14 -07005284 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-tpiu.0"),
5285 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etb.0"),
5286 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-funnel.0"),
5287 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.0"),
5288 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.1"),
5289 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.2"),
5290 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.3"),
Matt Wagantallb2710b82011-11-16 19:55:17 -08005291
Tianyi Gou21a0e802012-02-04 22:34:10 -08005292 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, ""),
Tianyi Gou21a0e802012-02-04 22:34:10 -08005293 CLK_LOOKUP("mmfpb_clk", mmfpb_clk.c, ""),
5294 CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, "clock-8960"),
5295 CLK_LOOKUP("cfpb_a_clk", cfpb_a_clk.c, "clock-8960"),
Tianyi Gou41515e22011-09-01 19:37:43 -07005296
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005297 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
5298 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
5299 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
Devin Kimb0a55c82012-06-26 12:44:15 -07005300#ifdef CONFIG_MACH_LGE
Devin Kima3085422012-06-14 18:23:41 -07005301 CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, ""),
Devin Kimb0a55c82012-06-26 12:44:15 -07005302#else
5303 CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, "msm_serial_hsl.1"),
5304#endif
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005305 CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, ""),
5306 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
Devin Kimb0a55c82012-06-26 12:44:15 -07005307#ifdef CONFIG_MACH_LGE
Devin Kima3085422012-06-14 18:23:41 -07005308 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, "msm_serial_hsl.0"),
Devin Kimb0a55c82012-06-26 12:44:15 -07005309#else
5310 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, ""),
5311#endif
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005312 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, ""),
5313 CLK_LOOKUP("core_clk", gsbi6_uart_clk.c, ""),
Devin Kimb0a55c82012-06-26 12:44:15 -07005314#ifdef CONFIG_MACH_LGE
Devin Kima3085422012-06-14 18:23:41 -07005315 CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, ""),
Devin Kimb0a55c82012-06-26 12:44:15 -07005316#else
5317 CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, "msm_serial_hsl.0"),
5318#endif
David Keitel3c40fc52012-02-09 17:53:52 -08005319 CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "qup_i2c.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005320 CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, ""),
Jing Lin04601f92012-02-05 15:36:07 -08005321 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "qup_i2c.3"),
Kevin Chand07220e2012-02-13 15:52:22 -08005322 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, "qup_i2c.4"),
Stepan Moskovchenko64999002012-01-31 15:52:59 -08005323 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "spi_qsd.0"),
Joel King8f839b92012-04-01 14:37:46 -07005324 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, "qup_i2c.5"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005325 CLK_LOOKUP("core_clk", gsbi6_qup_clk.c, ""),
5326 CLK_LOOKUP("core_clk", gsbi7_qup_clk.c, ""),
5327 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
Tianyi Gou50f23812012-02-06 16:04:19 -08005328 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Tianyi Gou05e01102012-02-08 22:15:49 -08005329 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Tianyi Gou43208a02011-09-27 15:35:13 -07005330 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
5331 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
5332 CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"),
5333 CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"),
Joel Nider6cbe66a2012-06-26 11:11:59 +03005334 CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.0"),
5335 CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.0"),
5336 CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tsif.1"),
5337 CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tsif.1"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005338 CLK_LOOKUP("core_clk", tssc_clk.c, ""),
Manu Gautam5143b252012-01-05 19:25:23 -08005339 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
5340 CLK_LOOKUP("alt_core_clk", usb_hs3_xcvr_clk.c, "msm_ehci_host.0"),
5341 CLK_LOOKUP("alt_core_clk", usb_hs4_xcvr_clk.c, "msm_ehci_host.1"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005342 CLK_LOOKUP("src_clk", usb_fs1_src_clk.c, ""),
5343 CLK_LOOKUP("alt_core_clk", usb_fs1_xcvr_clk.c, ""),
5344 CLK_LOOKUP("sys_clk", usb_fs1_sys_clk.c, ""),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005345 CLK_LOOKUP("ref_clk", sata_phy_ref_clk.c, ""),
5346 CLK_LOOKUP("cfg_clk", sata_phy_cfg_clk.c, ""),
Tianyi Gou352955d2012-05-18 19:44:01 -07005347 CLK_LOOKUP("src_clk", sata_src_clk.c, ""),
5348 CLK_LOOKUP("core_rxoob_clk", sata_rxoob_clk.c, ""),
5349 CLK_LOOKUP("core_pmalive_clk", sata_pmalive_clk.c, ""),
5350 CLK_LOOKUP("bus_clk", sata_a_clk.c, ""),
5351 CLK_LOOKUP("iface_clk", sata_p_clk.c, ""),
5352 CLK_LOOKUP("slave_iface_clk", sfab_sata_s_p_clk.c, ""),
Ramesh Masavarapu28311912011-10-27 11:04:12 -07005353 CLK_LOOKUP("iface_clk", ce3_p_clk.c, "qce.0"),
5354 CLK_LOOKUP("iface_clk", ce3_p_clk.c, "qcrypto.0"),
5355 CLK_LOOKUP("core_clk", ce3_core_clk.c, "qce.0"),
5356 CLK_LOOKUP("core_clk", ce3_core_clk.c, "qcrypto.0"),
5357 CLK_LOOKUP("ce3_core_src_clk", ce3_src_clk.c, "qce.0"),
5358 CLK_LOOKUP("ce3_core_src_clk", ce3_src_clk.c, "qcrypto.0"),
Tianyi Gou41515e22011-09-01 19:37:43 -07005359 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
Devin Kimb0a55c82012-06-26 12:44:15 -07005360#ifdef CONFIG_MACH_LGE
Devin Kima3085422012-06-14 18:23:41 -07005361 CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, ""),
Devin Kimb0a55c82012-06-26 12:44:15 -07005362#else
5363 CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "msm_serial_hsl.1"),
5364#endif
David Keitel3c40fc52012-02-09 17:53:52 -08005365 CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "qup_i2c.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005366 CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, ""),
Jing Lin04601f92012-02-05 15:36:07 -08005367 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "qup_i2c.3"),
Devin Kimb0a55c82012-06-26 12:44:15 -07005368#ifdef CONFIG_MACH_LGE
Devin Kima3085422012-06-14 18:23:41 -07005369 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "msm_serial_hsl.0"),
Devin Kimb0a55c82012-06-26 12:44:15 -07005370#endif
Kevin Chand07220e2012-02-13 15:52:22 -08005371 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "qup_i2c.4"),
Stepan Moskovchenko64999002012-01-31 15:52:59 -08005372 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "spi_qsd.0"),
Joel King8f839b92012-04-01 14:37:46 -07005373 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "qup_i2c.5"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005374 CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, ""),
Devin Kimb0a55c82012-06-26 12:44:15 -07005375#ifdef CONFIG_MACH_LGE
Devin Kima3085422012-06-14 18:23:41 -07005376 CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, ""),
Devin Kimb0a55c82012-06-26 12:44:15 -07005377#else
5378 CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, "msm_serial_hsl.0"),
5379#endif
Joel Nider6d7d16c2012-05-30 18:02:42 +03005380 CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tspp.0"),
5381 CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tspp.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005382 CLK_LOOKUP("iface_clk", usb_fs1_p_clk.c, ""),
Manu Gautam5143b252012-01-05 19:25:23 -08005383 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
Manu Gautam7483f172011-11-08 15:22:26 +05305384 CLK_LOOKUP("iface_clk", usb_hs3_p_clk.c, "msm_ehci_host.0"),
5385 CLK_LOOKUP("iface_clk", usb_hs4_p_clk.c, "msm_ehci_host.1"),
Tianyi Gou43208a02011-09-27 15:35:13 -07005386 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
5387 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
5388 CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"),
5389 CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"),
Devin Kim52a79fa2012-06-27 13:14:23 -07005390#ifdef CONFIG_MSM_PCIE
Niranjana Vishwanathapura06f89332012-05-03 17:11:13 -06005391 CLK_LOOKUP("iface_clk", pcie_p_clk.c, "msm_pcie"),
5392 CLK_LOOKUP("ref_clk", pcie_phy_ref_clk.c, "msm_pcie"),
5393 CLK_LOOKUP("bus_clk", pcie_a_clk.c, "msm_pcie"),
Devin Kim52a79fa2012-06-27 13:14:23 -07005394#endif
Tianyi Gou41515e22011-09-01 19:37:43 -07005395 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
5396 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005397 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
5398 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
5399 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
5400 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
insup.choi18f68162012-07-02 15:24:23 -07005401#if defined(CONFIG_MACH_LGE)
5402 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-000d"),
5403 CLK_LOOKUP("cam_clk", cam2_clk.c, "4-006e"),
5404#else /* QCT Original */
Kevin Chand07220e2012-02-13 15:52:22 -08005405 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-001a"),
Sreesudhan Ramakrish Ramkumar3381da72012-01-27 08:08:32 -08005406 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0034"),
Sreesudhan Ramakrish Ramkumar8002a792012-04-09 17:42:58 -07005407 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0020"),
Sreesudhan Ramakrish Ramkumar6c6f57c2012-02-21 15:12:44 -08005408 CLK_LOOKUP("cam_clk", cam1_clk.c, "4-0048"),
Kevin Chand07220e2012-02-13 15:52:22 -08005409 CLK_LOOKUP("cam_clk", cam1_clk.c, "4-006c"),
insup.choi18f68162012-07-02 15:24:23 -07005410#endif
Kevin Chand07220e2012-02-13 15:52:22 -08005411 CLK_LOOKUP("csi_src_clk", csi0_src_clk.c, "msm_csid.0"),
5412 CLK_LOOKUP("csi_src_clk", csi1_src_clk.c, "msm_csid.1"),
5413 CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, "msm_csid.2"),
5414 CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_csid.0"),
5415 CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_csid.1"),
5416 CLK_LOOKUP("csi_clk", csi2_clk.c, "msm_csid.2"),
5417 CLK_LOOKUP("csi_phy_clk", csi0_phy_clk.c, "msm_csid.0"),
5418 CLK_LOOKUP("csi_phy_clk", csi1_phy_clk.c, "msm_csid.1"),
5419 CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, "msm_csid.2"),
5420 CLK_LOOKUP("csi_pix_clk", csi_pix_clk.c, "msm_ispif.0"),
5421 CLK_LOOKUP("csi_pix1_clk", csi_pix1_clk.c, "msm_ispif.0"),
5422 CLK_LOOKUP("csi_rdi_clk", csi_rdi_clk.c, "msm_ispif.0"),
5423 CLK_LOOKUP("csi_rdi1_clk", csi_rdi1_clk.c, "msm_ispif.0"),
5424 CLK_LOOKUP("csi_rdi2_clk", csi_rdi2_clk.c, "msm_ispif.0"),
5425 CLK_LOOKUP("csiphy_timer_src_clk",
5426 csiphy_timer_src_clk.c, "msm_csiphy.0"),
5427 CLK_LOOKUP("csiphy_timer_src_clk",
5428 csiphy_timer_src_clk.c, "msm_csiphy.1"),
5429 CLK_LOOKUP("csiphy_timer_src_clk",
5430 csiphy_timer_src_clk.c, "msm_csiphy.2"),
5431 CLK_LOOKUP("csiphy_timer_clk", csi0phy_timer_clk.c, "msm_csiphy.0"),
5432 CLK_LOOKUP("csiphy_timer_clk", csi1phy_timer_clk.c, "msm_csiphy.1"),
5433 CLK_LOOKUP("csiphy_timer_clk", csi2phy_timer_clk.c, "msm_csiphy.2"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005434 CLK_LOOKUP("byte_clk", dsi1_byte_clk.c, "mipi_dsi.1"),
5435 CLK_LOOKUP("byte_clk", dsi2_byte_clk.c, "mipi_dsi.2"),
5436 CLK_LOOKUP("esc_clk", dsi1_esc_clk.c, "mipi_dsi.1"),
5437 CLK_LOOKUP("esc_clk", dsi2_esc_clk.c, "mipi_dsi.2"),
Tianyi Gou51918802012-01-26 14:05:43 -08005438 CLK_LOOKUP("rgb_clk", rgb_tv_clk.c, ""),
5439 CLK_LOOKUP("npl_clk", npl_tv_clk.c, ""),
5440
Pu Chen86b4be92011-11-03 17:27:57 -07005441 CLK_LOOKUP("core_clk", gfx3d_clk.c, "kgsl-3d0.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005442 CLK_LOOKUP("core_clk", gfx3d_clk.c, "footswitch-8x60.2"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07005443 CLK_LOOKUP("bus_clk",
Patrick Dalye6f489042012-07-11 15:29:15 -07005444 gfx3d_axi_clk.c, "footswitch-8x60.2"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005445 CLK_LOOKUP("iface_clk", vcap_p_clk.c, ""),
Terence Hampson2e1705f2012-04-11 19:55:29 -04005446 CLK_LOOKUP("iface_clk", vcap_p_clk.c, "msm_vcap.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005447 CLK_LOOKUP("iface_clk", vcap_p_clk.c, "footswitch-8x60.10"),
5448 CLK_LOOKUP("bus_clk", vcap_axi_clk.c, "footswitch-8x60.10"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005449 CLK_LOOKUP("core_clk", vcap_clk.c, ""),
Terence Hampson2e1705f2012-04-11 19:55:29 -04005450 CLK_LOOKUP("core_clk", vcap_clk.c, "msm_vcap.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005451 CLK_LOOKUP("core_clk", vcap_clk.c, "footswitch-8x60.10"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005452 CLK_LOOKUP("vcap_npl_clk", vcap_npl_clk.c, ""),
Terence Hampson2e1705f2012-04-11 19:55:29 -04005453 CLK_LOOKUP("vcap_npl_clk", vcap_npl_clk.c, "msm_vcap.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005454 CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"),
Matt Wagantallf45cd362012-05-03 21:09:44 -07005455 CLK_LOOKUP("mem_clk", imem_axi_clk.c, "msm_gemini.0"),
5456 CLK_LOOKUP("core_clk", ijpeg_clk.c, "msm_gemini.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005457 CLK_LOOKUP("core_clk", ijpeg_clk.c, "footswitch-8x60.3"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005458 CLK_LOOKUP("core_clk", jpegd_clk.c, ""),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005459 CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005460 CLK_LOOKUP("core_clk", mdp_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005461 CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"),
Matt Wagantallb82a5132011-12-12 22:26:41 -08005462 CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005463 CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "mdp.0"),
Matt Wagantallb82a5132011-12-12 22:26:41 -08005464 CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "footswitch-8x60.4"),
Matt Wagantallbb90da92011-10-25 15:07:52 -07005465 CLK_LOOKUP("core_clk", rot_clk.c, "msm_rotator.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005466 CLK_LOOKUP("core_clk", rot_clk.c, "footswitch-8x60.6"),
Matt Wagantall61286312012-02-22 15:55:09 -08005467 CLK_LOOKUP("tv_src_clk", tv_src_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005468 CLK_LOOKUP("src_clk", tv_src_clk.c, "dtv.0"),
5469 CLK_LOOKUP("div_clk", tv_src_div_clk.c, ""),
Greg Griscofa47b532011-11-11 10:32:06 -08005470 CLK_LOOKUP("core_clk", vcodec_clk.c, "msm_vidc.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005471 CLK_LOOKUP("core_clk", vcodec_clk.c, "footswitch-8x60.7"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005472 CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "dtv.0"),
Tianyi Gou51918802012-01-26 14:05:43 -08005473 CLK_LOOKUP("tv_clk", mdp_tv_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005474 CLK_LOOKUP("hdmi_clk", hdmi_tv_clk.c, "dtv.0"),
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -08005475 CLK_LOOKUP("core_clk", hdmi_app_clk.c, "hdmi_msm.1"),
Ujwal Pateld041f982012-03-27 19:51:44 -07005476 CLK_LOOKUP("vpe_clk", vpe_clk.c, "msm_vpe.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005477 CLK_LOOKUP("core_clk", vpe_clk.c, "footswitch-8x60.9"),
Kevin Chand07220e2012-02-13 15:52:22 -08005478 CLK_LOOKUP("vfe_clk", vfe_clk.c, "msm_vfe.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005479 CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-8x60.8"),
Kevin Chand07220e2012-02-13 15:52:22 -08005480 CLK_LOOKUP("csi_vfe_clk", csi_vfe_clk.c, "msm_vfe.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005481 CLK_LOOKUP("bus_clk", vfe_axi_clk.c, "footswitch-8x60.8"),
5482 CLK_LOOKUP("bus_clk", mdp_axi_clk.c, "footswitch-8x60.4"),
5483 CLK_LOOKUP("bus_clk", rot_axi_clk.c, "footswitch-8x60.6"),
5484 CLK_LOOKUP("bus_clk", vcodec_axi_clk.c, "footswitch-8x60.7"),
5485 CLK_LOOKUP("bus_a_clk", vcodec_axi_a_clk.c, "footswitch-8x60.7"),
5486 CLK_LOOKUP("bus_b_clk", vcodec_axi_b_clk.c, "footswitch-8x60.7"),
5487 CLK_LOOKUP("bus_clk", vpe_axi_clk.c, "footswitch-8x60.9"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005488 CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.1"),
5489 CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.2"),
Kevin Chand07220e2012-02-13 15:52:22 -08005490 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.0"),
5491 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.1"),
5492 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.2"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005493 CLK_LOOKUP("master_iface_clk", dsi1_m_p_clk.c, "mipi_dsi.1"),
5494 CLK_LOOKUP("slave_iface_clk", dsi1_s_p_clk.c, "mipi_dsi.1"),
5495 CLK_LOOKUP("master_iface_clk", dsi2_m_p_clk.c, "mipi_dsi.2"),
5496 CLK_LOOKUP("slave_iface_clk", dsi2_s_p_clk.c, "mipi_dsi.2"),
Pu Chen86b4be92011-11-03 17:27:57 -07005497 CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "kgsl-3d0.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005498 CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "footswitch-8x60.2"),
Aravind Venkateswaran0507c8c2012-02-16 17:16:05 -08005499 CLK_LOOKUP("master_iface_clk", hdmi_m_p_clk.c, "hdmi_msm.1"),
5500 CLK_LOOKUP("slave_iface_clk", hdmi_s_p_clk.c, "hdmi_msm.1"),
Matt Wagantallf45cd362012-05-03 21:09:44 -07005501 CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "msm_gemini.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005502 CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "footswitch-8x60.3"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005503 CLK_LOOKUP("iface_clk", jpegd_p_clk.c, ""),
Matt Wagantall5d44ef22012-01-23 11:01:05 -08005504 CLK_LOOKUP("mem_iface_clk", imem_p_clk.c, "kgsl-3d0.0"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005505 CLK_LOOKUP("iface_clk", mdp_p_clk.c, "mdp.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005506 CLK_LOOKUP("iface_clk", mdp_p_clk.c, "footswitch-8x60.4"),
Stepan Moskovchenko279b7852012-01-31 20:42:46 -08005507 CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu"),
Matt Wagantallbb90da92011-10-25 15:07:52 -07005508 CLK_LOOKUP("iface_clk", rot_p_clk.c, "msm_rotator.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005509 CLK_LOOKUP("iface_clk", rot_p_clk.c, "footswitch-8x60.6"),
Greg Griscofa47b532011-11-11 10:32:06 -08005510 CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "msm_vidc.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005511 CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "footswitch-8x60.7"),
Kevin Chand07220e2012-02-13 15:52:22 -08005512 CLK_LOOKUP("vfe_pclk", vfe_p_clk.c, "msm_vfe.0"),
Matt Wagantallc9a780c2011-10-28 12:12:18 -07005513 CLK_LOOKUP("iface_clk", vfe_p_clk.c, "footswitch-8x60.8"),
Kevin Chanb20742b2012-02-27 15:47:35 -08005514 CLK_LOOKUP("vpe_pclk", vpe_p_clk.c, "msm_vpe.0"),
Matt Wagantall61286312012-02-22 15:55:09 -08005515 CLK_LOOKUP("iface_clk", vpe_p_clk.c, "footswitch-8x60.9"),
Tianyi Gou21a0e802012-02-04 22:34:10 -08005516
Patrick Lai04baee942012-05-01 14:38:47 -07005517 CLK_LOOKUP("bit_clk", mi2s_bit_clk.c,
5518 "msm-dai-q6-mi2s"),
5519 CLK_LOOKUP("osr_clk", mi2s_osr_clk.c,
5520 "msm-dai-q6-mi2s"),
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08005521 CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c,
5522 "msm-dai-q6.1"),
5523 CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c,
5524 "msm-dai-q6.1"),
5525 CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c,
5526 "msm-dai-q6.5"),
5527 CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c,
5528 "msm-dai-q6.5"),
5529 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
5530 "msm-dai-q6.16384"),
5531 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
5532 "msm-dai-q6.16384"),
5533 CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c,
5534 "msm-dai-q6.4"),
5535 CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c,
5536 "msm-dai-q6.4"),
5537 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"),
Kiran Kandi5f4ab692012-02-23 11:23:56 -08005538 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005539 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, ""),
Tianyi Gou44a81b02012-02-06 17:49:07 -08005540 CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005541 CLK_LOOKUP("core_clk", jpegd_axi_clk.c, ""),
5542 CLK_LOOKUP("core_clk", vpe_axi_clk.c, ""),
5543 CLK_LOOKUP("core_clk", mdp_axi_clk.c, ""),
5544 CLK_LOOKUP("core_clk", vcap_axi_clk.c, ""),
5545 CLK_LOOKUP("core_clk", rot_axi_clk.c, ""),
5546 CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, ""),
5547 CLK_LOOKUP("core_clk", vfe_axi_clk.c, ""),
5548 CLK_LOOKUP("core_clk", vcodec_axi_a_clk.c, ""),
5549 CLK_LOOKUP("core_clk", vcodec_axi_b_clk.c, ""),
Patrick Dalye6f489042012-07-11 15:29:15 -07005550 CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, ""),
Tianyi Gou21a0e802012-02-04 22:34:10 -08005551
5552 CLK_LOOKUP("dfab_dsps_clk", dfab_dsps_clk.c, NULL),
5553 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
5554 CLK_LOOKUP("core_clk", dfab_usb_hs3_clk.c, "msm_ehci_host.0"),
5555 CLK_LOOKUP("core_clk", dfab_usb_hs3_clk.c, "msm_ehci_host.1"),
5556 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
5557 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
5558 CLK_LOOKUP("bus_clk", dfab_sdc3_clk.c, "msm_sdcc.3"),
5559 CLK_LOOKUP("bus_clk", dfab_sdc4_clk.c, "msm_sdcc.4"),
5560 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
5561 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
5562 CLK_LOOKUP("bus_clk", dfab_scm_clk.c, "scm"),
5563
Manu Gautam5143b252012-01-05 19:25:23 -08005564 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_fs_clk.c, "msm_hsic_host"),
5565 CLK_LOOKUP("phy_clk", usb_hsic_hsic_clk.c, "msm_hsic_host"),
5566 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
5567 CLK_LOOKUP("core_clk", usb_hsic_system_clk.c, "msm_hsic_host"),
5568 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
Tianyi Gou41515e22011-09-01 19:37:43 -07005569
Stepan Moskovchenko279b7852012-01-31 20:42:46 -08005570 CLK_LOOKUP("core_clk", jpegd_axi_clk.c, "msm_iommu.0"),
5571 CLK_LOOKUP("core_clk", vpe_axi_clk.c, "msm_iommu.1"),
5572 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu.2"),
5573 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu.3"),
5574 CLK_LOOKUP("core_clk", rot_axi_clk.c, "msm_iommu.4"),
5575 CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, "msm_iommu.5"),
5576 CLK_LOOKUP("core_clk", vfe_axi_clk.c, "msm_iommu.6"),
5577 CLK_LOOKUP("core_clk", vcodec_axi_a_clk.c, "msm_iommu.7"),
5578 CLK_LOOKUP("core_clk", vcodec_axi_b_clk.c, "msm_iommu.8"),
Patrick Dalye6f489042012-07-11 15:29:15 -07005579 CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, "msm_iommu.9"),
5580 CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, "msm_iommu.10"),
5581
Stepan Moskovchenko279b7852012-01-31 20:42:46 -08005582 CLK_LOOKUP("core_clk", vcap_axi_clk.c, "msm_iommu.11"),
5583
Deepak Kotur954b1782012-04-24 17:58:19 -07005584 CLK_LOOKUP("mdp_iommu_clk", mdp_axi_clk.c, "msm_vidc.0"),
5585 CLK_LOOKUP("rot_iommu_clk", rot_axi_clk.c, "msm_vidc.0"),
5586 CLK_LOOKUP("vcodec_iommu0_clk", vcodec_axi_a_clk.c, "msm_vidc.0"),
5587 CLK_LOOKUP("vcodec_iommu1_clk", vcodec_axi_b_clk.c, "msm_vidc.0"),
5588 CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "msm_vidc.0"),
Stephen Boyd7b973de2012-03-09 12:26:16 -08005589 CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "pil_vidc"),
5590 CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "pil_vidc"),
5591
Jeff Ohlstein8c116c72011-10-27 17:34:48 -07005592 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07005593 CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""),
5594 CLK_LOOKUP("bus_clk", afab_acpu_a_clk.c, ""),
Tianyi Gou41515e22011-09-01 19:37:43 -07005595
Matt Wagantallc33c1ed2012-07-23 17:19:08 -07005596 CLK_LOOKUP("reset1_clk", dsi1_reset_clk.c, "footswitch-8x60.4"),
5597 CLK_LOOKUP("reset2_clk", dsi2_reset_clk.c, "footswitch-8x60.4"),
Matt Wagantall735e41b2012-07-23 17:18:58 -07005598
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005599 CLK_LOOKUP("l2_mclk", l2_m_clk, ""),
5600 CLK_LOOKUP("krait0_mclk", krait0_m_clk, ""),
5601 CLK_LOOKUP("krait1_mclk", krait1_m_clk, ""),
Tianyi Gou455c13c2012-02-02 16:33:24 -08005602 CLK_LOOKUP("krait2_mclk", krait2_m_clk, ""),
5603 CLK_LOOKUP("krait3_mclk", krait3_m_clk, ""),
Tianyi Gou41515e22011-09-01 19:37:43 -07005604};
5605
Patrick Dalye6f489042012-07-11 15:29:15 -07005606static struct clk_lookup msm_clocks_8960_common[] __initdata = {
Stephen Boyd72a80352012-01-26 15:57:38 -08005607 CLK_LOOKUP("xo", cxo_a_clk.c, ""),
5608 CLK_LOOKUP("xo", pxo_a_clk.c, ""),
Stephen Boyded630b02012-01-26 15:26:47 -08005609 CLK_LOOKUP("cxo", cxo_clk.c, "wcnss_wlan.0"),
5610 CLK_LOOKUP("cxo", cxo_clk.c, "pil_riva"),
5611 CLK_LOOKUP("xo", pxo_clk.c, "pil_qdsp6v4.0"),
5612 CLK_LOOKUP("xo", cxo_clk.c, "pil_qdsp6v4.1"),
5613 CLK_LOOKUP("xo", cxo_clk.c, "pil_qdsp6v4.2"),
Stephen Boyd69d35e32012-02-14 15:33:30 -08005614 CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"),
Stephen Boyd5a190a82012-03-01 14:45:15 -08005615 CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"),
David Collinsa7d23532012-08-02 10:48:16 -07005616 CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"),
Stephen Boyded630b02012-01-26 15:26:47 -08005617 CLK_LOOKUP("pll2", pll2_clk.c, NULL),
5618 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
5619 CLK_LOOKUP("pll4", pll4_clk.c, NULL),
5620 CLK_LOOKUP("measure", measure_clk.c, "debug"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005621
Matt Wagantalld75f1312012-05-23 16:17:35 -07005622 CLK_LOOKUP("bus_clk", afab_clk.c, ""),
5623 CLK_LOOKUP("bus_clk", afab_a_clk.c, ""),
5624 CLK_LOOKUP("bus_clk", cfpb_clk.c, ""),
5625 CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""),
5626 CLK_LOOKUP("bus_clk", dfab_clk.c, ""),
5627 CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""),
5628 CLK_LOOKUP("mem_clk", ebi1_clk.c, ""),
5629 CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""),
5630 CLK_LOOKUP("bus_clk", mmfab_clk.c, ""),
5631 CLK_LOOKUP("bus_clk", mmfab_a_clk.c, ""),
5632 CLK_LOOKUP("bus_clk", mmfpb_clk.c, ""),
5633 CLK_LOOKUP("bus_clk", mmfpb_a_clk.c, ""),
5634 CLK_LOOKUP("bus_clk", sfab_clk.c, ""),
5635 CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""),
5636 CLK_LOOKUP("bus_clk", sfpb_clk.c, ""),
5637 CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""),
5638
Matt Wagantallb2710b82011-11-16 19:55:17 -08005639 CLK_LOOKUP("bus_clk", afab_clk.c, "msm_apps_fab"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07005640 CLK_LOOKUP("bus_a_clk", afab_msmbus_a_clk.c, "msm_apps_fab"),
Matt Wagantallb2710b82011-11-16 19:55:17 -08005641 CLK_LOOKUP("bus_clk", cfpb_clk.c, "msm_cpss_fpb"),
5642 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, "msm_cpss_fpb"),
5643 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
Stephen Boydd7a143a2012-02-16 17:59:26 -08005644 CLK_LOOKUP("bus_a_clk", sfab_msmbus_a_clk.c, "msm_sys_fab"),
Matt Wagantallb2710b82011-11-16 19:55:17 -08005645 CLK_LOOKUP("bus_clk", sfpb_clk.c, "msm_sys_fpb"),
5646 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, "msm_sys_fpb"),
5647 CLK_LOOKUP("bus_clk", mmfab_clk.c, "msm_mm_fab"),
5648 CLK_LOOKUP("bus_a_clk", mmfab_a_clk.c, "msm_mm_fab"),
5649 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07005650 CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"),
Gagan Macbc5f81d2012-04-04 15:03:12 -06005651 CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"),
5652 CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"),
Pratik Patelf17b1472012-05-25 22:23:52 -07005653 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, ""),
Pratik Patel3b0ca882012-06-01 16:54:14 -07005654 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-tpiu.0"),
5655 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etb.0"),
5656 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-funnel.0"),
5657 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.0"),
5658 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.1"),
5659 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.2"),
5660 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.3"),
Matt Wagantallb2710b82011-11-16 19:55:17 -08005661
5662 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Matt Wagantallb2710b82011-11-16 19:55:17 -08005663 CLK_LOOKUP("mmfpb_clk", mmfpb_clk.c, NULL),
5664 CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, "clock-8960"),
5665 CLK_LOOKUP("cfpb_a_clk", cfpb_a_clk.c, "clock-8960"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005666
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005667 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
5668 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
5669 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
5670 CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, ""),
5671 CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, ""),
5672 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
5673 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, ""),
Matt Wagantalle2522372011-08-17 14:52:21 -07005674 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, "msm_serial_hsl.0"),
5675 CLK_LOOKUP("core_clk", gsbi6_uart_clk.c, "msm_serial_hs.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005676 CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, ""),
Mayank Rana1f02d952012-07-04 19:11:20 +05305677 /* used on 8960 SGLTE for console */
Stepan Moskovchenko2b4b1cd2012-03-29 18:21:04 -07005678 CLK_LOOKUP("core_clk", gsbi8_uart_clk.c, "msm_serial_hsl.1"),
Mayank Rana1f02d952012-07-04 19:11:20 +05305679 /* used on 8960 standalone with Atheros Bluetooth */
5680 CLK_LOOKUP("core_clk", gsbi8_uart_clk.c, "msm_serial_hs.2"),
Mayank Ranae009c922012-03-22 03:02:06 +05305681 CLK_LOOKUP("core_clk", gsbi9_uart_clk.c, "msm_serial_hs.1"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005682 CLK_LOOKUP("core_clk", gsbi10_uart_clk.c, ""),
5683 CLK_LOOKUP("core_clk", gsbi11_uart_clk.c, ""),
5684 CLK_LOOKUP("core_clk", gsbi12_uart_clk.c, ""),
Matt Wagantallac294852011-08-17 15:44:58 -07005685 CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "spi_qsd.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005686 CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, ""),
Matt Wagantallac294852011-08-17 15:44:58 -07005687 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "qup_i2c.3"),
5688 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, "qup_i2c.4"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005689 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, ""),
5690 CLK_LOOKUP("core_clk", gsbi6_qup_clk.c, ""),
5691 CLK_LOOKUP("core_clk", gsbi7_qup_clk.c, ""),
5692 CLK_LOOKUP("core_clk", gsbi8_qup_clk.c, ""),
Tianyi Goue3d4f542012-03-15 17:06:45 -07005693 CLK_LOOKUP("core_clk", gsbi9_qup_clk.c, ""),
Matt Wagantallac294852011-08-17 15:44:58 -07005694 CLK_LOOKUP("core_clk", gsbi10_qup_clk.c, "qup_i2c.10"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005695 CLK_LOOKUP("core_clk", gsbi11_qup_clk.c, ""),
Matt Wagantallac294852011-08-17 15:44:58 -07005696 CLK_LOOKUP("core_clk", gsbi12_qup_clk.c, "qup_i2c.12"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005697 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
Vikram Mulukutladd0a2372011-09-19 15:58:21 -07005698 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
Matt Wagantallc1205292011-08-11 17:19:31 -07005699 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
Matt Wagantall37ce3842011-08-17 16:00:36 -07005700 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
5701 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
5702 CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"),
5703 CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"),
5704 CLK_LOOKUP("core_clk", sdc5_clk.c, "msm_sdcc.5"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005705 CLK_LOOKUP("slimbus_xo_src_clk", slimbus_xo_src_clk.c, NULL),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005706 CLK_LOOKUP("core_clk", tssc_clk.c, ""),
Manu Gautam5143b252012-01-05 19:25:23 -08005707 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
5708 CLK_LOOKUP("phy_clk", usb_phy0_clk.c, "msm_otg"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005709 CLK_LOOKUP("alt_core_clk", usb_fs1_xcvr_clk.c, ""),
5710 CLK_LOOKUP("sys_clk", usb_fs1_sys_clk.c, ""),
5711 CLK_LOOKUP("src_clk", usb_fs1_src_clk.c, ""),
5712 CLK_LOOKUP("alt_core_clk", usb_fs2_xcvr_clk.c, ""),
5713 CLK_LOOKUP("sys_clk", usb_fs2_sys_clk.c, ""),
5714 CLK_LOOKUP("src_clk", usb_fs2_src_clk.c, ""),
Tianyi Gou3022dfd2012-01-25 15:50:05 -08005715 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_fs_clk.c, "msm_hsic_host"),
5716 CLK_LOOKUP("phy_clk", usb_hsic_hsic_clk.c, "msm_hsic_host"),
5717 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
5718 CLK_LOOKUP("core_clk", usb_hsic_system_clk.c, "msm_hsic_host"),
5719 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
Matt Wagantallc4b3a4d2011-08-17 16:58:39 -07005720 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
Matt Wagantalle0b11452011-09-13 17:25:33 -07005721 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
Matt Wagantallc4b3a4d2011-08-17 16:58:39 -07005722 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
Matt Wagantalle0b11452011-09-13 17:25:33 -07005723 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005724 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
Matt Wagantallac294852011-08-17 15:44:58 -07005725 CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "spi_qsd.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005726 CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, ""),
Matt Wagantallac294852011-08-17 15:44:58 -07005727 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "qup_i2c.3"),
5728 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "qup_i2c.4"),
Matt Wagantalle2522372011-08-17 14:52:21 -07005729 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "msm_serial_hsl.0"),
5730 CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, "msm_serial_hs.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005731 CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, ""),
Mayank Rana1f02d952012-07-04 19:11:20 +05305732 /* used on 8960 SGLTE for serial console */
Stepan Moskovchenko2b4b1cd2012-03-29 18:21:04 -07005733 CLK_LOOKUP("iface_clk", gsbi8_p_clk.c, "msm_serial_hsl.1"),
Mayank Rana1f02d952012-07-04 19:11:20 +05305734 /* used on 8960 standalone with Atheros Bluetooth */
5735 CLK_LOOKUP("iface_clk", gsbi8_p_clk.c, "msm_serial_hs.2"),
Mayank Ranae009c922012-03-22 03:02:06 +05305736 CLK_LOOKUP("iface_clk", gsbi9_p_clk.c, "msm_serial_hs.1"),
Matt Wagantallac294852011-08-17 15:44:58 -07005737 CLK_LOOKUP("iface_clk", gsbi10_p_clk.c, "qup_i2c.10"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005738 CLK_LOOKUP("iface_clk", gsbi11_p_clk.c, ""),
Matt Wagantallac294852011-08-17 15:44:58 -07005739 CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "qup_i2c.12"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005740 CLK_LOOKUP("iface_clk", tsif_p_clk.c, ""),
Joel Nider6d7d16c2012-05-30 18:02:42 +03005741 CLK_LOOKUP("ref_clk", tsif_ref_clk.c, "msm_tspp.0"),
5742 CLK_LOOKUP("iface_clk", tsif_p_clk.c, "msm_tspp.0"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005743 CLK_LOOKUP("iface_clk", usb_fs1_p_clk.c, ""),
5744 CLK_LOOKUP("iface_clk", usb_fs2_p_clk.c, ""),
Manu Gautam5143b252012-01-05 19:25:23 -08005745 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
Matt Wagantall37ce3842011-08-17 16:00:36 -07005746 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
5747 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
5748 CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"),
5749 CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"),
5750 CLK_LOOKUP("iface_clk", sdc5_p_clk.c, "msm_sdcc.5"),
Matt Wagantalle1a86062011-08-18 17:46:10 -07005751 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
5752 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005753 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
5754 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
5755 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
5756 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
Kevin Chan09f4e662011-12-16 08:17:02 -08005757 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-001a"),
5758 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-006c"),
5759 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0048"),
Tianyi Gou3022dfd2012-01-25 15:50:05 -08005760 CLK_LOOKUP("cam_clk", cam2_clk.c, NULL),
Sreesudhan Ramakrish Ramkumar8f11b8b2012-01-04 17:09:05 -08005761 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0020"),
Sreesudhan Ramakrish Ramkumar3381da72012-01-27 08:08:32 -08005762 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0034"),
Kevin Chanc8b52e82011-10-25 23:20:21 -07005763 CLK_LOOKUP("csi_src_clk", csi0_src_clk.c, "msm_csid.0"),
5764 CLK_LOOKUP("csi_src_clk", csi1_src_clk.c, "msm_csid.1"),
Sreesudhan Ramakrish Ramkumarb1edcd02012-01-17 11:33:05 -08005765 CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, "msm_csid.2"),
Kevin Chanc8b52e82011-10-25 23:20:21 -07005766 CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_csid.0"),
5767 CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_csid.1"),
Sreesudhan Ramakrish Ramkumarb1edcd02012-01-17 11:33:05 -08005768 CLK_LOOKUP("csi_clk", csi2_clk.c, "msm_csid.2"),
Kevin Chanc8b52e82011-10-25 23:20:21 -07005769 CLK_LOOKUP("csi_phy_clk", csi0_phy_clk.c, "msm_csid.0"),
5770 CLK_LOOKUP("csi_phy_clk", csi1_phy_clk.c, "msm_csid.1"),
Sreesudhan Ramakrish Ramkumarb1edcd02012-01-17 11:33:05 -08005771 CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, "msm_csid.2"),
Kevin Chane12c6672011-10-26 11:55:26 -07005772 CLK_LOOKUP("csi_pix_clk", csi_pix_clk.c, "msm_ispif.0"),
5773 CLK_LOOKUP("csi_rdi_clk", csi_rdi_clk.c, "msm_ispif.0"),
Tianyi Gou3022dfd2012-01-25 15:50:05 -08005774 CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, NULL),
5775 CLK_LOOKUP("csi_clk", csi2_clk.c, NULL),
5776 CLK_LOOKUP("csi_pix1_clk", csi_pix1_clk.c, "msm_ispif.0"),
5777 CLK_LOOKUP("csi_rdi1_clk", csi_rdi1_clk.c, "msm_ispif.0"),
5778 CLK_LOOKUP("csi_rdi2_clk", csi_rdi2_clk.c, "msm_ispif.0"),
5779 CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, NULL),
5780 CLK_LOOKUP("csi2phy_timer_clk", csi2phy_timer_clk.c, NULL),
Kevin Chanf6216f22011-10-25 18:40:11 -07005781 CLK_LOOKUP("csiphy_timer_src_clk",
5782 csiphy_timer_src_clk.c, "msm_csiphy.0"),
5783 CLK_LOOKUP("csiphy_timer_src_clk",
5784 csiphy_timer_src_clk.c, "msm_csiphy.1"),
Sreesudhan Ramakrish Ramkumarb1edcd02012-01-17 11:33:05 -08005785 CLK_LOOKUP("csiphy_timer_src_clk",
5786 csiphy_timer_src_clk.c, "msm_csiphy.2"),
Kevin Chanf6216f22011-10-25 18:40:11 -07005787 CLK_LOOKUP("csiphy_timer_clk", csi0phy_timer_clk.c, "msm_csiphy.0"),
5788 CLK_LOOKUP("csiphy_timer_clk", csi1phy_timer_clk.c, "msm_csiphy.1"),
Sreesudhan Ramakrish Ramkumarb1edcd02012-01-17 11:33:05 -08005789 CLK_LOOKUP("csiphy_timer_clk", csi2phy_timer_clk.c, "msm_csiphy.2"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005790 CLK_LOOKUP("byte_clk", dsi1_byte_clk.c, "mipi_dsi.1"),
5791 CLK_LOOKUP("byte_clk", dsi2_byte_clk.c, "mipi_dsi.2"),
5792 CLK_LOOKUP("esc_clk", dsi1_esc_clk.c, "mipi_dsi.1"),
5793 CLK_LOOKUP("esc_clk", dsi2_esc_clk.c, "mipi_dsi.2"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07005794 CLK_LOOKUP("core_clk", gfx3d_clk.c, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005795 CLK_LOOKUP("core_clk", gfx3d_clk.c, "footswitch-8x60.2"),
5796 CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"),
Matt Wagantallf45cd362012-05-03 21:09:44 -07005797 CLK_LOOKUP("mem_clk", imem_axi_clk.c, "msm_gemini.0"),
5798 CLK_LOOKUP("core_clk", ijpeg_clk.c, "msm_gemini.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005799 CLK_LOOKUP("core_clk", ijpeg_clk.c, "footswitch-8x60.3"),
Kalyani Oruganti465d1e12012-05-15 10:23:05 -07005800 CLK_LOOKUP("core_clk", jpegd_clk.c, "msm_mercury.0"),
5801 CLK_LOOKUP("iface_clk", jpegd_p_clk.c, "msm_mercury.0"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005802 CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005803 CLK_LOOKUP("core_clk", mdp_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005804 CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"),
Matt Wagantallb82a5132011-12-12 22:26:41 -08005805 CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005806 CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "mdp.0"),
Matt Wagantallb82a5132011-12-12 22:26:41 -08005807 CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "footswitch-8x60.4"),
Matt Wagantallbb90da92011-10-25 15:07:52 -07005808 CLK_LOOKUP("core_clk", rot_clk.c, "msm_rotator.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005809 CLK_LOOKUP("core_clk", rot_clk.c, "footswitch-8x60.6"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005810 CLK_LOOKUP("src_clk", tv_src_clk.c, "dtv.0"),
5811 CLK_LOOKUP("src_clk", tv_src_clk.c, "tvenc.0"),
Matt Wagantallb82a5132011-12-12 22:26:41 -08005812 CLK_LOOKUP("tv_src_clk", tv_src_clk.c, "footswitch-8x60.4"),
Matt Wagantall3f7660b2011-08-17 21:25:13 -07005813 CLK_LOOKUP("core_clk", vcodec_clk.c, "msm_vidc.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005814 CLK_LOOKUP("core_clk", vcodec_clk.c, "footswitch-8x60.7"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005815 CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "dtv.0"),
5816 CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "tvenc.0"),
Matt Wagantallb82a5132011-12-12 22:26:41 -08005817 CLK_LOOKUP("tv_clk", mdp_tv_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005818 CLK_LOOKUP("hdmi_clk", hdmi_tv_clk.c, "dtv.0"),
Matt Wagantall5a4f1ba2011-08-18 18:13:03 -07005819 CLK_LOOKUP("core_clk", hdmi_app_clk.c, "hdmi_msm.1"),
Kevin Chana0853122011-11-07 19:48:44 -08005820 CLK_LOOKUP("vpe_clk", vpe_clk.c, "msm_vpe.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005821 CLK_LOOKUP("core_clk", vpe_clk.c, "footswitch-8x60.9"),
Kevin Chan5827c552011-10-28 18:36:32 -07005822 CLK_LOOKUP("vfe_clk", vfe_clk.c, "msm_vfe.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005823 CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-8x60.8"),
Kevin Chan5827c552011-10-28 18:36:32 -07005824 CLK_LOOKUP("csi_vfe_clk", csi_vfe_clk.c, "msm_vfe.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005825 CLK_LOOKUP("bus_clk", vfe_axi_clk.c, "footswitch-8x60.8"),
5826 CLK_LOOKUP("bus_clk", mdp_axi_clk.c, "footswitch-8x60.4"),
5827 CLK_LOOKUP("bus_clk", rot_axi_clk.c, "footswitch-8x60.6"),
5828 CLK_LOOKUP("bus_clk", vcodec_axi_clk.c, "footswitch-8x60.7"),
5829 CLK_LOOKUP("bus_a_clk", vcodec_axi_a_clk.c, "footswitch-8x60.7"),
5830 CLK_LOOKUP("bus_b_clk", vcodec_axi_b_clk.c, "footswitch-8x60.7"),
5831 CLK_LOOKUP("bus_clk", vpe_axi_clk.c, "footswitch-8x60.9"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005832 CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.1"),
5833 CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.2"),
Kevin Chanc8b52e82011-10-25 23:20:21 -07005834 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.0"),
5835 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.1"),
Sreesudhan Ramakrish Ramkumarb1edcd02012-01-17 11:33:05 -08005836 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.2"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005837 CLK_LOOKUP("master_iface_clk", dsi1_m_p_clk.c, "mipi_dsi.1"),
5838 CLK_LOOKUP("slave_iface_clk", dsi1_s_p_clk.c, "mipi_dsi.1"),
5839 CLK_LOOKUP("master_iface_clk", dsi2_m_p_clk.c, "mipi_dsi.2"),
5840 CLK_LOOKUP("slave_iface_clk", dsi2_s_p_clk.c, "mipi_dsi.2"),
Matt Wagantall9dc01632011-08-17 18:55:04 -07005841 CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "kgsl-3d0.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005842 CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "footswitch-8x60.2"),
Matt Wagantall5a4f1ba2011-08-18 18:13:03 -07005843 CLK_LOOKUP("master_iface_clk", hdmi_m_p_clk.c, "hdmi_msm.1"),
5844 CLK_LOOKUP("slave_iface_clk", hdmi_s_p_clk.c, "hdmi_msm.1"),
Matt Wagantallf45cd362012-05-03 21:09:44 -07005845 CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "msm_gemini.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005846 CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "footswitch-8x60.3"),
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005847 CLK_LOOKUP("iface_clk", jpegd_p_clk.c, ""),
Matt Wagantall5d44ef22012-01-23 11:01:05 -08005848 CLK_LOOKUP("mem_iface_clk", imem_p_clk.c, "kgsl-3d0.0"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07005849 CLK_LOOKUP("iface_clk", mdp_p_clk.c, "mdp.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005850 CLK_LOOKUP("iface_clk", mdp_p_clk.c, "footswitch-8x60.4"),
Matt Wagantalle604d712011-10-21 15:38:18 -07005851 CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu"),
Matt Wagantallbb90da92011-10-25 15:07:52 -07005852 CLK_LOOKUP("iface_clk", rot_p_clk.c, "msm_rotator.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005853 CLK_LOOKUP("iface_clk", rot_p_clk.c, "footswitch-8x60.6"),
Matt Wagantall3f7660b2011-08-17 21:25:13 -07005854 CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "msm_vidc.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005855 CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "footswitch-8x60.7"),
Kevin Chan5827c552011-10-28 18:36:32 -07005856 CLK_LOOKUP("vfe_pclk", vfe_p_clk.c, "msm_vfe.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005857 CLK_LOOKUP("iface_clk", vfe_p_clk.c, "footswitch-8x60.8"),
Kevin Chana0853122011-11-07 19:48:44 -08005858 CLK_LOOKUP("vpe_pclk", vpe_p_clk.c, "msm_vpe.0"),
Matt Wagantall49722712011-08-17 18:50:53 -07005859 CLK_LOOKUP("iface_clk", vpe_p_clk.c, "footswitch-8x60.9"),
Patrick Lai04baee942012-05-01 14:38:47 -07005860 CLK_LOOKUP("bit_clk", mi2s_bit_clk.c,
5861 "msm-dai-q6-mi2s"),
5862 CLK_LOOKUP("osr_clk", mi2s_osr_clk.c,
5863 "msm-dai-q6-mi2s"),
Kuirong Wanga9c3acc2012-02-09 17:00:45 -08005864 CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c,
5865 "msm-dai-q6.1"),
5866 CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c,
5867 "msm-dai-q6.1"),
5868 CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c,
5869 "msm-dai-q6.5"),
5870 CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c,
5871 "msm-dai-q6.5"),
5872 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
5873 "msm-dai-q6.16384"),
5874 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
5875 "msm-dai-q6.16384"),
5876 CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c,
5877 "msm-dai-q6.4"),
5878 CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c,
5879 "msm-dai-q6.4"),
5880 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"),
Kiran Kandi5f4ab692012-02-23 11:23:56 -08005881 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.3"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005882 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
Tianyi Gou44a81b02012-02-06 17:49:07 -08005883 CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"),
Matt Wagantalle604d712011-10-21 15:38:18 -07005884 CLK_LOOKUP("core_clk", jpegd_axi_clk.c, "msm_iommu.0"),
5885 CLK_LOOKUP("core_clk", vpe_axi_clk.c, "msm_iommu.1"),
5886 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu.2"),
5887 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu.3"),
5888 CLK_LOOKUP("core_clk", rot_axi_clk.c, "msm_iommu.4"),
5889 CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, "msm_iommu.5"),
5890 CLK_LOOKUP("core_clk", vfe_axi_clk.c, "msm_iommu.6"),
5891 CLK_LOOKUP("core_clk", vcodec_axi_a_clk.c, "msm_iommu.7"),
5892 CLK_LOOKUP("core_clk", vcodec_axi_b_clk.c, "msm_iommu.8"),
5893 CLK_LOOKUP("core_clk", gfx3d_clk.c, "msm_iommu.9"),
Gopikrishnaiah Anandan4d05ed32012-01-13 11:08:44 -08005894
5895 CLK_LOOKUP("mdp_iommu_clk", mdp_axi_clk.c, "msm_vidc.0"),
5896 CLK_LOOKUP("rot_iommu_clk", rot_axi_clk.c, "msm_vidc.0"),
5897 CLK_LOOKUP("vcodec_iommu0_clk", vcodec_axi_a_clk.c, "msm_vidc.0"),
5898 CLK_LOOKUP("vcodec_iommu1_clk", vcodec_axi_b_clk.c, "msm_vidc.0"),
5899 CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "msm_vidc.0"),
Stephen Boyd7b973de2012-03-09 12:26:16 -08005900 CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "pil_vidc"),
5901 CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "pil_vidc"),
Gopikrishnaiah Anandan4d05ed32012-01-13 11:08:44 -08005902
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005903 CLK_LOOKUP("dfab_dsps_clk", dfab_dsps_clk.c, NULL),
Manu Gautam5143b252012-01-05 19:25:23 -08005904 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
Matt Wagantall37ce3842011-08-17 16:00:36 -07005905 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
5906 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
5907 CLK_LOOKUP("bus_clk", dfab_sdc3_clk.c, "msm_sdcc.3"),
5908 CLK_LOOKUP("bus_clk", dfab_sdc4_clk.c, "msm_sdcc.4"),
5909 CLK_LOOKUP("bus_clk", dfab_sdc5_clk.c, "msm_sdcc.5"),
Yan He160633e2011-06-30 12:18:56 -07005910 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
Stephen Boyd1c51a492011-10-26 12:11:47 -07005911 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
Stephen Boydef5d1c42011-12-15 20:47:14 -08005912 CLK_LOOKUP("bus_clk", dfab_scm_clk.c, "scm"),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005913
Matt Wagantalle1a86062011-08-18 17:46:10 -07005914 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07005915 CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""),
5916 CLK_LOOKUP("bus_clk", afab_acpu_a_clk.c, ""),
Matt Wagantall8b38f942011-08-02 18:23:18 -07005917
Matt Wagantallc33c1ed2012-07-23 17:19:08 -07005918 CLK_LOOKUP("reset1_clk", dsi1_reset_clk.c, "footswitch-8x60.4"),
5919 CLK_LOOKUP("reset2_clk", dsi2_reset_clk.c, "footswitch-8x60.4"),
Matt Wagantall735e41b2012-07-23 17:18:58 -07005920
Matt Wagantallc00f95d2012-01-05 14:22:45 -08005921 CLK_LOOKUP("l2_mclk", l2_m_clk, ""),
5922 CLK_LOOKUP("krait0_mclk", krait0_m_clk, ""),
5923 CLK_LOOKUP("krait1_mclk", krait1_m_clk, ""),
5924 CLK_LOOKUP("q6sw_clk", q6sw_clk, ""),
5925 CLK_LOOKUP("q6fw_clk", q6fw_clk, ""),
5926 CLK_LOOKUP("q6_func_clk", q6_func_clk, ""),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07005927};
5928
Patrick Dalye6f489042012-07-11 15:29:15 -07005929static struct clk_lookup msm_clocks_8960_only[] __initdata = {
5930 CLK_LOOKUP("enc_clk", tv_enc_clk.c, "tvenc.0"),
5931 CLK_LOOKUP("dac_clk", tv_dac_clk.c, "tvenc.0"),
5932 CLK_LOOKUP("iface_clk", tv_enc_p_clk.c, "tvenc.0"),
5933
5934 CLK_LOOKUP("core_clk", gfx2d0_clk.c, "kgsl-2d0.0"),
5935 CLK_LOOKUP("core_clk", gfx2d0_clk.c, "footswitch-8x60.0"),
5936 CLK_LOOKUP("core_clk", gfx2d1_clk.c, "kgsl-2d1.1"),
5937 CLK_LOOKUP("core_clk", gfx2d1_clk.c, "footswitch-8x60.1"),
5938 CLK_LOOKUP("iface_clk", gfx2d0_p_clk.c, "kgsl-2d0.0"),
5939 CLK_LOOKUP("iface_clk", gfx2d0_p_clk.c, "footswitch-8x60.0"),
5940 CLK_LOOKUP("iface_clk", gfx2d1_p_clk.c, "kgsl-2d1.1"),
5941 CLK_LOOKUP("iface_clk", gfx2d1_p_clk.c, "footswitch-8x60.1"),
5942 CLK_LOOKUP("core_clk", gfx2d0_clk.c, "msm_iommu.10"),
5943 CLK_LOOKUP("core_clk", gfx2d1_clk.c, "msm_iommu.11"),
5944};
5945
5946static struct clk_lookup msm_clocks_8960ab_only[] __initdata = {
5947 CLK_LOOKUP("bus_clk", gfx3d_axi_clk.c, "footswitch-8x60.2"),
Joel King336f2242012-08-19 22:32:14 -07005948 CLK_LOOKUP("core_clk", gfx3d_axi_clk.c, "msm_iommu.10"),
Patrick Dalye6f489042012-07-11 15:29:15 -07005949 CLK_LOOKUP("div_clk", tv_src_div_clk.c, ""),
5950};
5951
5952static struct clk_lookup msm_clocks_8960[ARRAY_SIZE(msm_clocks_8960_common)
5953 + ARRAY_SIZE(msm_clocks_8960_only)
5954 + ARRAY_SIZE(msm_clocks_8960ab_only)];
5955
Tianyi Goue3d4f542012-03-15 17:06:45 -07005956static struct clk_lookup msm_clocks_8930[] = {
Stephen Boydbe1a7392012-04-02 20:17:11 -07005957 CLK_LOOKUP("xo", cxo_clk.c, "msm_xo"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07005958 CLK_LOOKUP("cxo", cxo_clk.c, "wcnss_wlan.0"),
5959 CLK_LOOKUP("cxo", cxo_clk.c, "pil_riva"),
5960 CLK_LOOKUP("xo", pxo_clk.c, "pil_qdsp6v4.0"),
5961 CLK_LOOKUP("xo", cxo_clk.c, "pil_qdsp6v4.1"),
5962 CLK_LOOKUP("xo", cxo_clk.c, "pil_qdsp6v4.2"),
5963 CLK_LOOKUP("xo", cxo_clk.c, "BAM_RMNT"),
David Collinsa7d23532012-08-02 10:48:16 -07005964 CLK_LOOKUP("vref_buff", cxo_clk.c, "rpm-regulator"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07005965 CLK_LOOKUP("pll2", pll2_clk.c, NULL),
5966 CLK_LOOKUP("pll8", pll8_clk.c, NULL),
5967 CLK_LOOKUP("pll4", pll4_clk.c, NULL),
5968 CLK_LOOKUP("measure", measure_clk.c, "debug"),
5969
Matt Wagantalld75f1312012-05-23 16:17:35 -07005970 CLK_LOOKUP("bus_clk", afab_clk.c, ""),
5971 CLK_LOOKUP("bus_clk", afab_a_clk.c, ""),
5972 CLK_LOOKUP("bus_clk", cfpb_clk.c, ""),
5973 CLK_LOOKUP("bus_clk", cfpb_a_clk.c, ""),
5974 CLK_LOOKUP("bus_clk", dfab_clk.c, ""),
5975 CLK_LOOKUP("bus_clk", dfab_a_clk.c, ""),
5976 CLK_LOOKUP("mem_clk", ebi1_clk.c, ""),
5977 CLK_LOOKUP("mem_clk", ebi1_a_clk.c, ""),
5978 CLK_LOOKUP("bus_clk", mmfab_clk.c, ""),
5979 CLK_LOOKUP("bus_clk", mmfab_a_clk.c, ""),
5980 CLK_LOOKUP("bus_clk", mmfpb_clk.c, ""),
5981 CLK_LOOKUP("bus_clk", mmfpb_a_clk.c, ""),
5982 CLK_LOOKUP("bus_clk", sfab_clk.c, ""),
5983 CLK_LOOKUP("bus_clk", sfab_a_clk.c, ""),
5984 CLK_LOOKUP("bus_clk", sfpb_clk.c, ""),
5985 CLK_LOOKUP("bus_clk", sfpb_a_clk.c, ""),
5986
Tianyi Goue3d4f542012-03-15 17:06:45 -07005987 CLK_LOOKUP("bus_clk", afab_clk.c, "msm_apps_fab"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07005988 CLK_LOOKUP("bus_a_clk", afab_msmbus_a_clk.c, "msm_apps_fab"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07005989 CLK_LOOKUP("bus_clk", cfpb_clk.c, "msm_cpss_fpb"),
5990 CLK_LOOKUP("bus_a_clk", cfpb_a_clk.c, "msm_cpss_fpb"),
5991 CLK_LOOKUP("bus_clk", sfab_clk.c, "msm_sys_fab"),
5992 CLK_LOOKUP("bus_a_clk", sfab_msmbus_a_clk.c, "msm_sys_fab"),
5993 CLK_LOOKUP("bus_clk", sfpb_clk.c, "msm_sys_fpb"),
5994 CLK_LOOKUP("bus_a_clk", sfpb_a_clk.c, "msm_sys_fpb"),
5995 CLK_LOOKUP("bus_clk", mmfab_clk.c, "msm_mm_fab"),
5996 CLK_LOOKUP("bus_a_clk", mmfab_a_clk.c, "msm_mm_fab"),
5997 CLK_LOOKUP("mem_clk", ebi1_msmbus_clk.c, "msm_bus"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07005998 CLK_LOOKUP("mem_a_clk", ebi1_msmbus_a_clk.c, "msm_bus"),
Gagan Macbc5f81d2012-04-04 15:03:12 -06005999 CLK_LOOKUP("dfab_clk", dfab_msmbus_clk.c, "msm_bus"),
6000 CLK_LOOKUP("dfab_a_clk", dfab_msmbus_a_clk.c, "msm_bus"),
Pratik Patelf17b1472012-05-25 22:23:52 -07006001 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, ""),
Pratik Patel3b0ca882012-06-01 16:54:14 -07006002 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-tpiu.0"),
6003 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etb.0"),
6004 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-funnel.0"),
6005 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.0"),
6006 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.1"),
6007 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.2"),
6008 CLK_LOOKUP("core_clk", qdss_clk.c, "coresight-etm.3"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006009
6010 CLK_LOOKUP("ebi1_clk", ebi1_clk.c, NULL),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006011 CLK_LOOKUP("mmfpb_clk", mmfpb_clk.c, NULL),
6012 CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, "clock-8960"),
6013 CLK_LOOKUP("cfpb_a_clk", cfpb_a_clk.c, "clock-8960"),
6014
6015 CLK_LOOKUP("core_clk", gp0_clk.c, ""),
6016 CLK_LOOKUP("core_clk", gp1_clk.c, ""),
6017 CLK_LOOKUP("core_clk", gp2_clk.c, ""),
6018 CLK_LOOKUP("core_clk", gsbi1_uart_clk.c, ""),
6019 CLK_LOOKUP("core_clk", gsbi2_uart_clk.c, ""),
6020 CLK_LOOKUP("core_clk", gsbi3_uart_clk.c, ""),
6021 CLK_LOOKUP("core_clk", gsbi4_uart_clk.c, ""),
6022 CLK_LOOKUP("core_clk", gsbi5_uart_clk.c, "msm_serial_hsl.0"),
6023 CLK_LOOKUP("core_clk", gsbi6_uart_clk.c, "msm_serial_hs.0"),
6024 CLK_LOOKUP("core_clk", gsbi7_uart_clk.c, ""),
6025 CLK_LOOKUP("core_clk", gsbi8_uart_clk.c, ""),
6026 CLK_LOOKUP("core_clk", gsbi9_uart_clk.c, ""),
6027 CLK_LOOKUP("core_clk", gsbi10_uart_clk.c, ""),
6028 CLK_LOOKUP("core_clk", gsbi11_uart_clk.c, ""),
6029 CLK_LOOKUP("core_clk", gsbi12_uart_clk.c, ""),
6030 CLK_LOOKUP("core_clk", gsbi1_qup_clk.c, "spi_qsd.0"),
6031 CLK_LOOKUP("core_clk", gsbi2_qup_clk.c, ""),
6032 CLK_LOOKUP("core_clk", gsbi3_qup_clk.c, "qup_i2c.3"),
6033 CLK_LOOKUP("core_clk", gsbi4_qup_clk.c, "qup_i2c.4"),
6034 CLK_LOOKUP("core_clk", gsbi5_qup_clk.c, ""),
6035 CLK_LOOKUP("core_clk", gsbi6_qup_clk.c, ""),
6036 CLK_LOOKUP("core_clk", gsbi7_qup_clk.c, ""),
6037 CLK_LOOKUP("core_clk", gsbi8_qup_clk.c, ""),
6038 CLK_LOOKUP("core_clk", gsbi9_qup_clk.c, "qup_i2c.0"),
6039 CLK_LOOKUP("core_clk", gsbi10_qup_clk.c, "qup_i2c.10"),
6040 CLK_LOOKUP("core_clk", gsbi11_qup_clk.c, ""),
6041 CLK_LOOKUP("core_clk", gsbi12_qup_clk.c, "qup_i2c.12"),
6042 CLK_LOOKUP("core_clk", pdm_clk.c, ""),
6043 CLK_LOOKUP("mem_clk", pmem_clk.c, "msm_sps"),
6044 CLK_LOOKUP("core_clk", prng_clk.c, "msm_rng.0"),
6045 CLK_LOOKUP("core_clk", sdc1_clk.c, "msm_sdcc.1"),
6046 CLK_LOOKUP("core_clk", sdc2_clk.c, "msm_sdcc.2"),
6047 CLK_LOOKUP("core_clk", sdc3_clk.c, "msm_sdcc.3"),
6048 CLK_LOOKUP("core_clk", sdc4_clk.c, "msm_sdcc.4"),
6049 CLK_LOOKUP("core_clk", sdc5_clk.c, "msm_sdcc.5"),
6050 CLK_LOOKUP("ref_clk", tsif_ref_clk.c, ""),
6051 CLK_LOOKUP("core_clk", tssc_clk.c, ""),
6052 CLK_LOOKUP("alt_core_clk", usb_hs1_xcvr_clk.c, "msm_otg"),
6053 CLK_LOOKUP("phy_clk", usb_phy0_clk.c, "msm_otg"),
6054 CLK_LOOKUP("alt_core_clk", usb_fs1_xcvr_clk.c, ""),
6055 CLK_LOOKUP("sys_clk", usb_fs1_sys_clk.c, ""),
6056 CLK_LOOKUP("src_clk", usb_fs1_src_clk.c, ""),
6057 CLK_LOOKUP("alt_core_clk", usb_fs2_xcvr_clk.c, ""),
6058 CLK_LOOKUP("sys_clk", usb_fs2_sys_clk.c, ""),
6059 CLK_LOOKUP("src_clk", usb_fs2_src_clk.c, ""),
6060 CLK_LOOKUP("alt_core_clk", usb_hsic_xcvr_fs_clk.c, "msm_hsic_host"),
6061 CLK_LOOKUP("phy_clk", usb_hsic_hsic_clk.c, "msm_hsic_host"),
6062 CLK_LOOKUP("cal_clk", usb_hsic_hsio_cal_clk.c, "msm_hsic_host"),
6063 CLK_LOOKUP("core_clk", usb_hsic_system_clk.c, "msm_hsic_host"),
6064 CLK_LOOKUP("iface_clk", usb_hsic_p_clk.c, "msm_hsic_host"),
6065 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qce.0"),
6066 CLK_LOOKUP("iface_clk", ce1_p_clk.c, "qcrypto.0"),
6067 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qce.0"),
6068 CLK_LOOKUP("core_clk", ce1_core_clk.c, "qcrypto.0"),
6069 CLK_LOOKUP("dma_bam_pclk", dma_bam_p_clk.c, NULL),
6070 CLK_LOOKUP("iface_clk", gsbi1_p_clk.c, "spi_qsd.0"),
6071 CLK_LOOKUP("iface_clk", gsbi2_p_clk.c, ""),
6072 CLK_LOOKUP("iface_clk", gsbi3_p_clk.c, "qup_i2c.3"),
6073 CLK_LOOKUP("iface_clk", gsbi4_p_clk.c, "qup_i2c.4"),
6074 CLK_LOOKUP("iface_clk", gsbi5_p_clk.c, "msm_serial_hsl.0"),
6075 CLK_LOOKUP("iface_clk", gsbi6_p_clk.c, "msm_serial_hs.0"),
6076 CLK_LOOKUP("iface_clk", gsbi7_p_clk.c, ""),
6077 CLK_LOOKUP("iface_clk", gsbi8_p_clk.c, ""),
6078 CLK_LOOKUP("iface_clk", gsbi9_p_clk.c, "qup_i2c.0"),
6079 CLK_LOOKUP("iface_clk", gsbi10_p_clk.c, "qup_i2c.10"),
6080 CLK_LOOKUP("iface_clk", gsbi11_p_clk.c, ""),
6081 CLK_LOOKUP("iface_clk", gsbi12_p_clk.c, "qup_i2c.12"),
6082 CLK_LOOKUP("iface_clk", tsif_p_clk.c, ""),
6083 CLK_LOOKUP("iface_clk", usb_fs1_p_clk.c, ""),
6084 CLK_LOOKUP("iface_clk", usb_fs2_p_clk.c, ""),
6085 CLK_LOOKUP("iface_clk", usb_hs1_p_clk.c, "msm_otg"),
6086 CLK_LOOKUP("iface_clk", sdc1_p_clk.c, "msm_sdcc.1"),
6087 CLK_LOOKUP("iface_clk", sdc2_p_clk.c, "msm_sdcc.2"),
6088 CLK_LOOKUP("iface_clk", sdc3_p_clk.c, "msm_sdcc.3"),
6089 CLK_LOOKUP("iface_clk", sdc4_p_clk.c, "msm_sdcc.4"),
6090 CLK_LOOKUP("iface_clk", sdc5_p_clk.c, "msm_sdcc.5"),
6091 CLK_LOOKUP("core_clk", adm0_clk.c, "msm_dmov"),
6092 CLK_LOOKUP("iface_clk", adm0_p_clk.c, "msm_dmov"),
6093 CLK_LOOKUP("iface_clk", pmic_arb0_p_clk.c, ""),
6094 CLK_LOOKUP("iface_clk", pmic_arb1_p_clk.c, ""),
6095 CLK_LOOKUP("core_clk", pmic_ssbi2_clk.c, ""),
6096 CLK_LOOKUP("mem_clk", rpm_msg_ram_p_clk.c, ""),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006097 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-001a"),
Hody Hung994f4622012-04-24 10:27:45 -07006098 CLK_LOOKUP("cam_clk", cam1_clk.c, "4-006c"),
Sreesudhan Ramakrish Ramkumar981c82c2012-04-30 17:31:37 -07006099 CLK_LOOKUP("cam_clk", cam1_clk.c, "4-0048"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006100 CLK_LOOKUP("cam_clk", cam2_clk.c, NULL),
6101 CLK_LOOKUP("cam_clk", cam0_clk.c, "4-0020"),
6102 CLK_LOOKUP("csi_src_clk", csi0_src_clk.c, "msm_csid.0"),
6103 CLK_LOOKUP("csi_src_clk", csi1_src_clk.c, "msm_csid.1"),
6104 CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, "msm_csid.2"),
6105 CLK_LOOKUP("csi_clk", csi0_clk.c, "msm_csid.0"),
6106 CLK_LOOKUP("csi_clk", csi1_clk.c, "msm_csid.1"),
6107 CLK_LOOKUP("csi_clk", csi2_clk.c, "msm_csid.2"),
6108 CLK_LOOKUP("csi_phy_clk", csi0_phy_clk.c, "msm_csid.0"),
6109 CLK_LOOKUP("csi_phy_clk", csi1_phy_clk.c, "msm_csid.1"),
6110 CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, "msm_csid.2"),
6111 CLK_LOOKUP("csi_pix_clk", csi_pix_clk.c, "msm_ispif.0"),
6112 CLK_LOOKUP("csi_rdi_clk", csi_rdi_clk.c, "msm_ispif.0"),
6113 CLK_LOOKUP("csi_src_clk", csi2_src_clk.c, NULL),
6114 CLK_LOOKUP("csi_clk", csi2_clk.c, NULL),
6115 CLK_LOOKUP("csi_pix1_clk", csi_pix1_clk.c, "msm_ispif.0"),
6116 CLK_LOOKUP("csi_rdi1_clk", csi_rdi1_clk.c, "msm_ispif.0"),
6117 CLK_LOOKUP("csi_rdi2_clk", csi_rdi2_clk.c, "msm_ispif.0"),
6118 CLK_LOOKUP("csi_phy_clk", csi2_phy_clk.c, NULL),
6119 CLK_LOOKUP("csi2phy_timer_clk", csi2phy_timer_clk.c, NULL),
6120 CLK_LOOKUP("csiphy_timer_src_clk",
6121 csiphy_timer_src_clk.c, "msm_csiphy.0"),
6122 CLK_LOOKUP("csiphy_timer_src_clk",
6123 csiphy_timer_src_clk.c, "msm_csiphy.1"),
6124 CLK_LOOKUP("csiphy_timer_src_clk",
6125 csiphy_timer_src_clk.c, "msm_csiphy.2"),
6126 CLK_LOOKUP("csiphy_timer_clk", csi0phy_timer_clk.c, "msm_csiphy.0"),
6127 CLK_LOOKUP("csiphy_timer_clk", csi1phy_timer_clk.c, "msm_csiphy.1"),
6128 CLK_LOOKUP("csiphy_timer_clk", csi2phy_timer_clk.c, "msm_csiphy.2"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006129 CLK_LOOKUP("byte_clk", dsi1_byte_clk.c, "mipi_dsi.1"),
6130 CLK_LOOKUP("esc_clk", dsi1_esc_clk.c, "mipi_dsi.1"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006131 CLK_LOOKUP("core_clk", gfx3d_clk.c, "kgsl-3d0.0"),
6132 CLK_LOOKUP("core_clk", gfx3d_clk.c, "footswitch-8x60.2"),
6133 CLK_LOOKUP("bus_clk",
6134 gfx3d_axi_clk_8930.c, "footswitch-8x60.2"),
6135 CLK_LOOKUP("bus_clk", ijpeg_axi_clk.c, "footswitch-8x60.3"),
Matt Wagantallf45cd362012-05-03 21:09:44 -07006136 CLK_LOOKUP("mem_clk", imem_axi_clk.c, "msm_gemini.0"),
6137 CLK_LOOKUP("core_clk", ijpeg_clk.c, "msm_gemini.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006138 CLK_LOOKUP("core_clk", ijpeg_clk.c, "footswitch-8x60.3"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006139 CLK_LOOKUP("core_clk", mdp_clk.c, "mdp.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006140 CLK_LOOKUP("core_clk", mdp_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006141 CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "mdp.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006142 CLK_LOOKUP("vsync_clk", mdp_vsync_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006143 CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "mdp.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006144 CLK_LOOKUP("lut_clk", lut_mdp_clk.c, "footswitch-8x60.4"),
6145 CLK_LOOKUP("core_clk", rot_clk.c, "msm_rotator.0"),
6146 CLK_LOOKUP("core_clk", rot_clk.c, "footswitch-8x60.6"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006147 CLK_LOOKUP("src_clk", tv_src_clk.c, "dtv.0"),
6148 CLK_LOOKUP("src_clk", tv_src_clk.c, "tvenc.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006149 CLK_LOOKUP("tv_src_clk", tv_src_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006150 CLK_LOOKUP("dac_clk", tv_dac_clk.c, "tvenc.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006151 CLK_LOOKUP("core_clk", vcodec_clk.c, "msm_vidc.0"),
6152 CLK_LOOKUP("core_clk", vcodec_clk.c, "footswitch-8x60.7"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006153 CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "dtv.0"),
6154 CLK_LOOKUP("mdp_clk", mdp_tv_clk.c, "tvenc.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006155 CLK_LOOKUP("tv_clk", mdp_tv_clk.c, "footswitch-8x60.4"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006156 CLK_LOOKUP("hdmi_clk", hdmi_tv_clk.c, "dtv.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006157 CLK_LOOKUP("core_clk", hdmi_app_clk.c, "hdmi_msm.1"),
6158 CLK_LOOKUP("vpe_clk", vpe_clk.c, "msm_vpe.0"),
6159 CLK_LOOKUP("core_clk", vpe_clk.c, "footswitch-8x60.9"),
6160 CLK_LOOKUP("vfe_clk", vfe_clk.c, "msm_vfe.0"),
6161 CLK_LOOKUP("core_clk", vfe_clk.c, "footswitch-8x60.8"),
6162 CLK_LOOKUP("csi_vfe_clk", csi_vfe_clk.c, "msm_vfe.0"),
6163 CLK_LOOKUP("bus_clk", vfe_axi_clk.c, "footswitch-8x60.8"),
6164 CLK_LOOKUP("bus_clk", mdp_axi_clk.c, "footswitch-8x60.4"),
6165 CLK_LOOKUP("bus_clk", rot_axi_clk.c, "footswitch-8x60.6"),
6166 CLK_LOOKUP("bus_clk", vcodec_axi_clk.c, "footswitch-8x60.7"),
6167 CLK_LOOKUP("bus_a_clk", vcodec_axi_a_clk.c, "footswitch-8x60.7"),
6168 CLK_LOOKUP("bus_b_clk", vcodec_axi_b_clk.c, "footswitch-8x60.7"),
6169 CLK_LOOKUP("bus_clk", vpe_axi_clk.c, "footswitch-8x60.9"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006170 CLK_LOOKUP("arb_clk", amp_p_clk.c, "mipi_dsi.1"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006171 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.0"),
6172 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.1"),
6173 CLK_LOOKUP("csi_pclk", csi_p_clk.c, "msm_csid.2"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006174 CLK_LOOKUP("master_iface_clk", dsi1_m_p_clk.c, "mipi_dsi.1"),
6175 CLK_LOOKUP("slave_iface_clk", dsi1_s_p_clk.c, "mipi_dsi.1"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006176 CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "kgsl-3d0.0"),
6177 CLK_LOOKUP("iface_clk", gfx3d_p_clk.c, "footswitch-8x60.2"),
6178 CLK_LOOKUP("master_iface_clk", hdmi_m_p_clk.c, "hdmi_msm.1"),
6179 CLK_LOOKUP("slave_iface_clk", hdmi_s_p_clk.c, "hdmi_msm.1"),
Matt Wagantallf45cd362012-05-03 21:09:44 -07006180 CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "msm_gemini.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006181 CLK_LOOKUP("iface_clk", ijpeg_p_clk.c, "footswitch-8x60.3"),
6182 CLK_LOOKUP("mem_iface_clk", imem_p_clk.c, "kgsl-3d0.0"),
Ravishangar Kalyanam1b064f52012-03-15 18:17:54 -07006183 CLK_LOOKUP("iface_clk", mdp_p_clk.c, "mdp.0"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006184 CLK_LOOKUP("iface_clk", mdp_p_clk.c, "footswitch-8x60.4"),
6185 CLK_LOOKUP("iface_clk", smmu_p_clk.c, "msm_iommu"),
6186 CLK_LOOKUP("iface_clk", rot_p_clk.c, "msm_rotator.0"),
6187 CLK_LOOKUP("iface_clk", rot_p_clk.c, "footswitch-8x60.6"),
6188 CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "msm_vidc.0"),
6189 CLK_LOOKUP("iface_clk", vcodec_p_clk.c, "footswitch-8x60.7"),
6190 CLK_LOOKUP("vfe_pclk", vfe_p_clk.c, "msm_vfe.0"),
6191 CLK_LOOKUP("iface_clk", vfe_p_clk.c, "footswitch-8x60.8"),
6192 CLK_LOOKUP("vpe_pclk", vpe_p_clk.c, "msm_vpe.0"),
6193 CLK_LOOKUP("iface_clk", vpe_p_clk.c, "footswitch-8x60.9"),
6194 CLK_LOOKUP("bit_clk", mi2s_bit_clk.c, "msm-dai-q6.6"),
6195 CLK_LOOKUP("osr_clk", mi2s_osr_clk.c, "msm-dai-q6.6"),
6196 CLK_LOOKUP("bit_clk", codec_i2s_mic_bit_clk.c,
6197 "msm-dai-q6.1"),
6198 CLK_LOOKUP("osr_clk", codec_i2s_mic_osr_clk.c,
6199 "msm-dai-q6.1"),
6200 CLK_LOOKUP("bit_clk", spare_i2s_mic_bit_clk.c,
6201 "msm-dai-q6.5"),
6202 CLK_LOOKUP("osr_clk", spare_i2s_mic_osr_clk.c,
6203 "msm-dai-q6.5"),
6204 CLK_LOOKUP("bit_clk", codec_i2s_spkr_bit_clk.c,
6205 "msm-dai-q6.16384"),
6206 CLK_LOOKUP("osr_clk", codec_i2s_spkr_osr_clk.c,
6207 "msm-dai-q6.16384"),
6208 CLK_LOOKUP("bit_clk", spare_i2s_spkr_bit_clk.c,
6209 "msm-dai-q6.4"),
6210 CLK_LOOKUP("osr_clk", spare_i2s_spkr_osr_clk.c,
6211 "msm-dai-q6.4"),
6212 CLK_LOOKUP("pcm_clk", pcm_clk.c, "msm-dai-q6.2"),
6213 CLK_LOOKUP("sps_slimbus_clk", sps_slimbus_clk.c, NULL),
6214 CLK_LOOKUP("core_clk", audio_slimbus_clk.c, "msm_slim_ctrl.1"),
6215 CLK_LOOKUP("core_clk", vpe_axi_clk.c, "msm_iommu.1"),
6216 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu.2"),
6217 CLK_LOOKUP("core_clk", mdp_axi_clk.c, "msm_iommu.3"),
6218 CLK_LOOKUP("core_clk", rot_axi_clk.c, "msm_iommu.4"),
6219 CLK_LOOKUP("core_clk", ijpeg_axi_clk.c, "msm_iommu.5"),
6220 CLK_LOOKUP("core_clk", vfe_axi_clk.c, "msm_iommu.6"),
6221 CLK_LOOKUP("core_clk", vcodec_axi_a_clk.c, "msm_iommu.7"),
6222 CLK_LOOKUP("core_clk", vcodec_axi_b_clk.c, "msm_iommu.8"),
6223 CLK_LOOKUP("core_clk", gfx3d_axi_clk_8930.c, "msm_iommu.9"),
6224 CLK_LOOKUP("core_clk", gfx3d_axi_clk_8930.c, "msm_iommu.10"),
6225
6226 CLK_LOOKUP("mdp_iommu_clk", mdp_axi_clk.c, "msm_vidc.0"),
6227 CLK_LOOKUP("rot_iommu_clk", rot_axi_clk.c, "msm_vidc.0"),
6228 CLK_LOOKUP("vcodec_iommu0_clk", vcodec_axi_a_clk.c, "msm_vidc.0"),
6229 CLK_LOOKUP("vcodec_iommu1_clk", vcodec_axi_b_clk.c, "msm_vidc.0"),
6230 CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "msm_vidc.0"),
Stephen Boyd7b973de2012-03-09 12:26:16 -08006231 CLK_LOOKUP("core_clk", vcodec_axi_clk.c, "pil_vidc"),
6232 CLK_LOOKUP("smmu_iface_clk", smmu_p_clk.c, "pil_vidc"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006233
6234 CLK_LOOKUP("dfab_dsps_clk", dfab_dsps_clk.c, NULL),
6235 CLK_LOOKUP("core_clk", dfab_usb_hs_clk.c, "msm_otg"),
6236 CLK_LOOKUP("bus_clk", dfab_sdc1_clk.c, "msm_sdcc.1"),
6237 CLK_LOOKUP("bus_clk", dfab_sdc2_clk.c, "msm_sdcc.2"),
6238 CLK_LOOKUP("bus_clk", dfab_sdc3_clk.c, "msm_sdcc.3"),
6239 CLK_LOOKUP("bus_clk", dfab_sdc4_clk.c, "msm_sdcc.4"),
6240 CLK_LOOKUP("bus_clk", dfab_sdc5_clk.c, "msm_sdcc.5"),
6241 CLK_LOOKUP("dfab_clk", dfab_sps_clk.c, "msm_sps"),
6242 CLK_LOOKUP("bus_clk", dfab_bam_dmux_clk.c, "BAM_RMNT"),
6243 CLK_LOOKUP("bus_clk", dfab_scm_clk.c, "scm"),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006244
6245 CLK_LOOKUP("mem_clk", ebi1_adm_clk.c, "msm_dmov"),
Matt Wagantall33bac7e2012-05-22 14:59:05 -07006246 CLK_LOOKUP("mem_clk", ebi1_acpu_a_clk.c, ""),
6247 CLK_LOOKUP("bus_clk", afab_acpu_a_clk.c, ""),
Tianyi Goue3d4f542012-03-15 17:06:45 -07006248
Matt Wagantallc33c1ed2012-07-23 17:19:08 -07006249 CLK_LOOKUP("reset1_clk", dsi1_reset_clk.c, "footswitch-8x60.4"),
Matt Wagantall735e41b2012-07-23 17:18:58 -07006250
Tianyi Goue3d4f542012-03-15 17:06:45 -07006251 CLK_LOOKUP("l2_mclk", l2_m_clk, ""),
6252 CLK_LOOKUP("krait0_mclk", krait0_m_clk, ""),
6253 CLK_LOOKUP("krait1_mclk", krait1_m_clk, ""),
6254 CLK_LOOKUP("q6sw_clk", q6sw_clk, ""),
6255 CLK_LOOKUP("q6fw_clk", q6fw_clk, ""),
6256 CLK_LOOKUP("q6_func_clk", q6_func_clk, ""),
6257};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006258/*
6259 * Miscellaneous clock register initializations
6260 */
6261
6262/* Read, modify, then write-back a register. */
6263static void __init rmwreg(uint32_t val, void *reg, uint32_t mask)
6264{
6265 uint32_t regval = readl_relaxed(reg);
6266 regval &= ~mask;
6267 regval |= val;
6268 writel_relaxed(regval, reg);
6269}
6270
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006271static struct pll_config_regs pll4_regs __initdata = {
6272 .l_reg = LCC_PLL0_L_VAL_REG,
6273 .m_reg = LCC_PLL0_M_VAL_REG,
6274 .n_reg = LCC_PLL0_N_VAL_REG,
6275 .config_reg = LCC_PLL0_CONFIG_REG,
6276 .mode_reg = LCC_PLL0_MODE_REG,
6277};
Tianyi Gou41515e22011-09-01 19:37:43 -07006278
Matt Wagantall86e03822011-12-12 10:59:24 -08006279static struct pll_config pll4_config_393 __initdata = {
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006280 .l = 0xE,
6281 .m = 0x27A,
6282 .n = 0x465,
6283 .vco_val = 0x0,
6284 .vco_mask = BM(17, 16),
6285 .pre_div_val = 0x0,
6286 .pre_div_mask = BIT(19),
6287 .post_div_val = 0x0,
6288 .post_div_mask = BM(21, 20),
6289 .mn_ena_val = BIT(22),
6290 .mn_ena_mask = BIT(22),
6291 .main_output_val = BIT(23),
6292 .main_output_mask = BIT(23),
6293};
Tianyi Gou41515e22011-09-01 19:37:43 -07006294
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006295static struct pll_config_regs pll15_regs __initdata = {
6296 .l_reg = MM_PLL3_L_VAL_REG,
6297 .m_reg = MM_PLL3_M_VAL_REG,
6298 .n_reg = MM_PLL3_N_VAL_REG,
6299 .config_reg = MM_PLL3_CONFIG_REG,
6300 .mode_reg = MM_PLL3_MODE_REG,
6301};
Tianyi Gou358c3862011-10-18 17:03:41 -07006302
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006303static struct pll_config pll15_config __initdata = {
6304 .l = (0x24 | BVAL(31, 7, 0x620)),
6305 .m = 0x1,
6306 .n = 0x9,
6307 .vco_val = BVAL(17, 16, 0x2),
6308 .vco_mask = BM(17, 16),
6309 .pre_div_val = 0x0,
6310 .pre_div_mask = BIT(19),
6311 .post_div_val = 0x0,
6312 .post_div_mask = BM(21, 20),
6313 .mn_ena_val = BIT(22),
6314 .mn_ena_mask = BIT(22),
6315 .main_output_val = BIT(23),
6316 .main_output_mask = BIT(23),
6317};
Tianyi Gou41515e22011-09-01 19:37:43 -07006318
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006319static struct pll_config_regs pll14_regs __initdata = {
6320 .l_reg = BB_PLL14_L_VAL_REG,
6321 .m_reg = BB_PLL14_M_VAL_REG,
6322 .n_reg = BB_PLL14_N_VAL_REG,
6323 .config_reg = BB_PLL14_CONFIG_REG,
6324 .mode_reg = BB_PLL14_MODE_REG,
6325};
6326
6327static struct pll_config pll14_config __initdata = {
6328 .l = (0x11 | BVAL(31, 7, 0x620)),
6329 .m = 0x7,
6330 .n = 0x9,
6331 .vco_val = 0x0,
6332 .vco_mask = BM(17, 16),
6333 .pre_div_val = 0x0,
6334 .pre_div_mask = BIT(19),
6335 .post_div_val = 0x0,
6336 .post_div_mask = BM(21, 20),
6337 .mn_ena_val = BIT(22),
6338 .mn_ena_mask = BIT(22),
6339 .main_output_val = BIT(23),
6340 .main_output_mask = BIT(23),
6341};
Tianyi Gou41515e22011-09-01 19:37:43 -07006342
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006343static void __init reg_init(void)
6344{
Stephen Boydd471e7a2011-11-19 01:37:39 -08006345 void __iomem *imem_reg;
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006346
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006347 /* Deassert MM SW_RESET_ALL signal. */
6348 writel_relaxed(0, SW_RESET_ALL_REG);
6349
Tianyi Gou8c1a1182011-10-10 14:47:11 -07006350 /*
Tianyi Goue3d4f542012-03-15 17:06:45 -07006351 * Some bits are only used on 8960 or 8064 or 8930 and are marked as
6352 * reserved bits on the other SoCs. Writing to these reserved bits
Tianyi Gou8c1a1182011-10-10 14:47:11 -07006353 * should have no effect.
6354 */
Stephen Boydd471e7a2011-11-19 01:37:39 -08006355 /*
6356 * Initialize MM AHB registers: Enable the FPB clock and disable HW
Patrick Dalye6f489042012-07-11 15:29:15 -07006357 * gating on 8627 and 8960 for all clocks. Also set VFE_AHB's
Stephen Boydd471e7a2011-11-19 01:37:39 -08006358 * FORCE_CORE_ON bit to prevent its memory from being collapsed when
6359 * the clock is halted. The sleep and wake-up delays are set to safe
6360 * values.
6361 */
Patrick Dalye6f489042012-07-11 15:29:15 -07006362 if (cpu_is_msm8627() || cpu_is_msm8960ab()) {
Stephen Boydd471e7a2011-11-19 01:37:39 -08006363 rmwreg(0x00000003, AHB_EN_REG, 0x6C000103);
6364 writel_relaxed(0x000007F9, AHB_EN2_REG);
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006365 } else {
David Garibaldie93bdc72012-08-17 16:05:22 -07006366 rmwreg(0x40000000, AHB_EN_REG, 0x6C000103);
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006367 writel_relaxed(0x3C7097F9, AHB_EN2_REG);
Stephen Boydd471e7a2011-11-19 01:37:39 -08006368 }
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006369
Patrick Dalyedb86f42012-08-23 19:07:30 -07006370 if (cpu_is_apq8064() || cpu_is_apq8064ab())
Tianyi Gouf3095ea2012-05-22 14:16:06 -07006371 rmwreg(0x00000001, AHB_EN3_REG, 0x00000001);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006372
6373 /* Deassert all locally-owned MM AHB resets. */
6374 rmwreg(0, SW_RESET_AHB_REG, 0xFFF7DFFF);
Tianyi Gou41515e22011-09-01 19:37:43 -07006375 rmwreg(0, SW_RESET_AHB2_REG, 0x0000000F);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006376
6377 /* Initialize MM AXI registers: Enable HW gating for all clocks that
6378 * support it. Also set FORCE_CORE_ON bits, and any sleep and wake-up
6379 * delays to safe values. */
Patrick Dalye6f489042012-07-11 15:29:15 -07006380 if (cpu_is_msm8960ab() || (cpu_is_msm8960() &&
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006381 SOCINFO_VERSION_MAJOR(socinfo_get_version()) < 3) ||
6382 cpu_is_msm8627()) {
Stephen Boydd471e7a2011-11-19 01:37:39 -08006383 rmwreg(0x000007F9, MAXI_EN_REG, 0x0803FFFF);
6384 rmwreg(0x3027FCFF, MAXI_EN2_REG, 0x3A3FFFFF);
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006385 } else {
6386 rmwreg(0x0003AFF9, MAXI_EN_REG, 0x0803FFFF);
6387 rmwreg(0x3A27FCFF, MAXI_EN2_REG, 0x3A3FFFFF);
Stephen Boydd471e7a2011-11-19 01:37:39 -08006388 }
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006389
Matt Wagantall53d968f2011-07-19 13:22:53 -07006390 rmwreg(0x0027FCFF, MAXI_EN3_REG, 0x003FFFFF);
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006391 rmwreg(0x0027FCFF, MAXI_EN4_REG, 0x017FFFFF);
6392
Patrick Dalyedb86f42012-08-23 19:07:30 -07006393 if (cpu_is_apq8064() || cpu_is_apq8064ab())
Tianyi Gouf3095ea2012-05-22 14:16:06 -07006394 rmwreg(0x019FECFF, MAXI_EN5_REG, 0x01FFEFFF);
Stepan Moskovchenko0df9bb22012-07-06 18:19:15 -07006395 if (cpu_is_msm8930() || cpu_is_msm8930aa() || cpu_is_msm8627())
Tianyi Goue3d4f542012-03-15 17:06:45 -07006396 rmwreg(0x000004FF, MAXI_EN5_REG, 0x00000FFF);
Patrick Dalye6f489042012-07-11 15:29:15 -07006397 if (cpu_is_msm8960ab())
6398 rmwreg(0x009FE000, MAXI_EN5_REG, 0x01FFE000);
6399
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006400 if (cpu_is_msm8627())
Stephen Boydd471e7a2011-11-19 01:37:39 -08006401 rmwreg(0x000003C7, SAXI_EN_REG, 0x00003FFF);
Patrick Dalye6f489042012-07-11 15:29:15 -07006402 else if (cpu_is_msm8960ab())
6403 rmwreg(0x000001C6, SAXI_EN_REG, 0x00001DF6);
Tianyi Gou33caa5d2012-06-18 12:04:11 -07006404 else
6405 rmwreg(0x00003C38, SAXI_EN_REG, 0x00003FFF);
Stephen Boydd471e7a2011-11-19 01:37:39 -08006406
6407 /* Enable IMEM's clk_on signal */
6408 imem_reg = ioremap(0x04b00040, 4);
6409 if (imem_reg) {
6410 writel_relaxed(0x3, imem_reg);
6411 iounmap(imem_reg);
6412 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006413
6414 /* Initialize MM CC registers: Set MM FORCE_CORE_ON bits so that core
6415 * memories retain state even when not clocked. Also, set sleep and
6416 * wake-up delays to safe values. */
Matt Wagantall53d968f2011-07-19 13:22:53 -07006417 rmwreg(0x00000000, CSI0_CC_REG, 0x00000410);
6418 rmwreg(0x00000000, CSI1_CC_REG, 0x00000410);
6419 rmwreg(0x80FF0000, DSI1_BYTE_CC_REG, 0xE0FF0010);
Matt Wagantall53d968f2011-07-19 13:22:53 -07006420 rmwreg(0x80FF0000, DSI_PIXEL_CC_REG, 0xE0FF0010);
Tarun Karra6fbc00a2011-12-13 09:23:47 -07006421 rmwreg(0xC0FF0000, GFX3D_CC_REG, 0xE0FF0010);
Matt Wagantall53d968f2011-07-19 13:22:53 -07006422 rmwreg(0x80FF0000, IJPEG_CC_REG, 0xE0FF0010);
Matt Wagantall53d968f2011-07-19 13:22:53 -07006423 rmwreg(0x80FF0000, MDP_CC_REG, 0xE1FF0010);
6424 rmwreg(0x80FF0000, MDP_LUT_CC_REG, 0xE0FF0010);
6425 rmwreg(0x80FF0000, ROT_CC_REG, 0xE0FF0010);
Matt Wagantall53d968f2011-07-19 13:22:53 -07006426 rmwreg(0x000004FF, TV_CC2_REG, 0x000007FF);
6427 rmwreg(0xC0FF0000, VCODEC_CC_REG, 0xE0FF0010);
6428 rmwreg(0x80FF0000, VFE_CC_REG, 0xE0FF4010);
Stephen Boyd94625ef2011-07-12 17:06:01 -07006429 rmwreg(0x800000FF, VFE_CC2_REG, 0xE00000FF);
Matt Wagantall53d968f2011-07-19 13:22:53 -07006430 rmwreg(0x80FF0000, VPE_CC_REG, 0xE0FF0010);
Patrick Dalyedb86f42012-08-23 19:07:30 -07006431 if (cpu_is_msm8960ab() || cpu_is_msm8960() || cpu_is_apq8064()
6432 || cpu_is_apq8064ab()) {
Tianyi Goue3d4f542012-03-15 17:06:45 -07006433 rmwreg(0x80FF0000, DSI2_BYTE_CC_REG, 0xE0FF0010);
6434 rmwreg(0x80FF0000, DSI2_PIXEL_CC_REG, 0xE0FF0010);
6435 rmwreg(0x80FF0000, JPEGD_CC_REG, 0xE0FF0010);
6436 }
Patrick Dalye6f489042012-07-11 15:29:15 -07006437 if (cpu_is_msm8960ab())
6438 rmwreg(0x00000001, DSI2_PIXEL_CC2_REG, 0x00000001);
6439
Stepan Moskovchenko0df9bb22012-07-06 18:19:15 -07006440 if (cpu_is_msm8960() || cpu_is_msm8930() || cpu_is_msm8930aa() ||
6441 cpu_is_msm8627())
Patrick Dalye6f489042012-07-11 15:29:15 -07006442 rmwreg(0x80FF0000, TV_CC_REG, 0xE1FFC010);
6443 if (cpu_is_msm8960ab())
6444 rmwreg(0x00000000, TV_CC_REG, 0x00004010);
Tianyi Goue3d4f542012-03-15 17:06:45 -07006445
6446 if (cpu_is_msm8960()) {
Tianyi Gou8c1a1182011-10-10 14:47:11 -07006447 rmwreg(0x80FF0000, GFX2D0_CC_REG, 0xE0FF0010);
6448 rmwreg(0x80FF0000, GFX2D1_CC_REG, 0xE0FF0010);
Tianyi Gou8c1a1182011-10-10 14:47:11 -07006449 }
Patrick Dalyedb86f42012-08-23 19:07:30 -07006450 if (cpu_is_apq8064() || cpu_is_apq8064ab()) {
Tianyi Gou8c1a1182011-10-10 14:47:11 -07006451 rmwreg(0x00000000, TV_CC_REG, 0x00004010);
Tianyi Gou621f8742011-09-01 21:45:01 -07006452 rmwreg(0x80FF0000, VCAP_CC_REG, 0xE0FF1010);
Tianyi Gou8c1a1182011-10-10 14:47:11 -07006453 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006454
Tianyi Gou41515e22011-09-01 19:37:43 -07006455 /*
6456 * Initialize USB_HS_HCLK_FS registers: Set FORCE_C_ON bits so that
6457 * core remain active during halt state of the clk. Also, set sleep
6458 * and wake-up value to max.
6459 */
6460 rmwreg(0x0000004F, USB_HS1_HCLK_FS_REG, 0x0000007F);
Patrick Dalyedb86f42012-08-23 19:07:30 -07006461 if (cpu_is_apq8064() || cpu_is_apq8064ab()) {
Tianyi Gou8c1a1182011-10-10 14:47:11 -07006462 rmwreg(0x0000004F, USB_HS3_HCLK_FS_REG, 0x0000007F);
6463 rmwreg(0x0000004F, USB_HS4_HCLK_FS_REG, 0x0000007F);
6464 }
Tianyi Gou41515e22011-09-01 19:37:43 -07006465
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006466 /* De-assert MM AXI resets to all hardware blocks. */
6467 writel_relaxed(0, SW_RESET_AXI_REG);
6468
6469 /* Deassert all MM core resets. */
6470 writel_relaxed(0, SW_RESET_CORE_REG);
Tianyi Gou41515e22011-09-01 19:37:43 -07006471 writel_relaxed(0, SW_RESET_CORE2_REG);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006472
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006473 /* Enable TSSC and PDM PXO sources. */
6474 writel_relaxed(BIT(11), TSSC_CLK_CTL_REG);
6475 writel_relaxed(BIT(15), PDM_CLK_NS_REG);
6476
6477 /* Source SLIMBus xo src from slimbus reference clock */
Patrick Dalye6f489042012-07-11 15:29:15 -07006478 if (cpu_is_msm8960ab() || cpu_is_msm8960())
Tianyi Gou8c1a1182011-10-10 14:47:11 -07006479 writel_relaxed(0x3, SLIMBUS_XO_SRC_CLK_CTL_REG);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006480
6481 /* Source the dsi_byte_clks from the DSI PHY PLLs */
6482 rmwreg(0x1, DSI1_BYTE_NS_REG, 0x7);
Patrick Dalyedb86f42012-08-23 19:07:30 -07006483 if (cpu_is_msm8960ab() || cpu_is_msm8960() || cpu_is_apq8064()
6484 || cpu_is_apq8064ab())
Tianyi Goue3d4f542012-03-15 17:06:45 -07006485 rmwreg(0x2, DSI2_BYTE_NS_REG, 0x7);
Tianyi Gou41515e22011-09-01 19:37:43 -07006486
Siddhartha Agrawal482459c2012-05-24 15:28:53 -07006487 /* Source the dsi1_esc_clk from the DSI1 PHY PLLs */
6488 rmwreg(0x1, DSI1_ESC_NS_REG, 0x7);
6489
Tianyi Gou352955d2012-05-18 19:44:01 -07006490 /*
6491 * Source the sata_phy_ref_clk from PXO and set predivider of
6492 * sata_pmalive_clk to 1.
6493 */
Patrick Dalyedb86f42012-08-23 19:07:30 -07006494 if (cpu_is_apq8064() || cpu_is_apq8064ab()) {
Tianyi Gou41515e22011-09-01 19:37:43 -07006495 rmwreg(0, SATA_PHY_REF_CLK_CTL_REG, 0x1);
Tianyi Gou352955d2012-05-18 19:44:01 -07006496 rmwreg(0, SATA_PMALIVE_CLK_CTL_REG, 0x3);
6497 }
Tianyi Gou41515e22011-09-01 19:37:43 -07006498
6499 /*
Tianyi Gou05e01102012-02-08 22:15:49 -08006500 * TODO: Programming below PLLs and prng_clk is temporary and
6501 * needs to be removed after bootloaders program them.
Tianyi Gou41515e22011-09-01 19:37:43 -07006502 */
Patrick Dalyedb86f42012-08-23 19:07:30 -07006503 if (cpu_is_apq8064() || cpu_is_apq8064ab()) {
Tianyi Gou317aa862012-02-06 14:31:07 -08006504 u32 is_pll_enabled;
Tianyi Gou41515e22011-09-01 19:37:43 -07006505
6506 /* Program pxo_src_clk to source from PXO */
6507 rmwreg(0x1, PXO_SRC_CLK_CTL_REG, 0x7);
6508
Tianyi Gou41515e22011-09-01 19:37:43 -07006509 /* Check if PLL14 is active */
6510 is_pll_enabled = readl_relaxed(BB_PLL14_STATUS_REG) & BIT(16);
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006511 if (!is_pll_enabled)
Tianyi Goudf71f2e2011-10-24 22:25:04 -07006512 /* Ref clk = 27MHz and program pll14 to 480MHz */
Vikram Mulukutlae12adf62012-07-18 13:55:31 -07006513 configure_sr_pll(&pll14_config, &pll14_regs, 1);
6514
6515 /* Program PLL15 to 975MHz with ref clk = 27MHz */
6516 configure_sr_pll(&pll15_config, &pll15_regs, 0);
Tianyi Gou621f8742011-09-01 21:45:01 -07006517
Tianyi Gouc29c3242011-10-12 21:02:15 -07006518 /* Check if PLL4 is active */
6519 is_pll_enabled = readl_relaxed(LCC_PLL0_STATUS_REG) & BIT(16);
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006520 if (!is_pll_enabled)
Tianyi Goudf71f2e2011-10-24 22:25:04 -07006521 /* Ref clk = 27MHz and program pll4 to 393.2160MHz */
Vikram Mulukutlae12adf62012-07-18 13:55:31 -07006522 configure_sr_pll(&pll4_config_393, &pll4_regs, 1);
Tianyi Gouc29c3242011-10-12 21:02:15 -07006523
6524 /* Enable PLL4 source on the LPASS Primary PLL Mux */
6525 writel_relaxed(0x1, LCC_PRI_PLL_CLK_CTL_REG);
Tianyi Gou05e01102012-02-08 22:15:49 -08006526
6527 /* Program prng_clk to 64MHz if it isn't configured */
6528 if (!readl_relaxed(PRNG_CLK_NS_REG))
6529 writel_relaxed(0x2B, PRNG_CLK_NS_REG);
Tianyi Gou41515e22011-09-01 19:37:43 -07006530 }
Tianyi Gou65c536a2012-03-20 23:20:29 -07006531
Patrick Dalyedb86f42012-08-23 19:07:30 -07006532 if (cpu_is_apq8064()) {
6533 /* Program PLL15 to 975MHz with ref clk = 27MHz */
6534 configure_sr_pll(&pll15_config, &pll15_regs, 0);
6535 } else if (cpu_is_apq8064ab()) {
6536 /* Program PLL15 to 900MHZ */
6537 pll15_config.l = 0x21 | BVAL(31, 7, 0x620);
6538 pll15_config.m = 0x1;
6539 pll15_config.n = 0x3;
6540 configure_sr_pll(&pll15_config, &pll15_regs, 0);
6541 }
6542
Tianyi Gou65c536a2012-03-20 23:20:29 -07006543 /*
6544 * Program PLL15 to 900MHz with ref clk = 27MHz and
6545 * only enable PLL main output.
6546 */
Stepan Moskovchenko0df9bb22012-07-06 18:19:15 -07006547 if (cpu_is_msm8930() || cpu_is_msm8930aa() || cpu_is_msm8627()) {
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006548 pll15_config.l = 0x21 | BVAL(31, 7, 0x600);
6549 pll15_config.m = 0x1;
6550 pll15_config.n = 0x3;
Vikram Mulukutlae12adf62012-07-18 13:55:31 -07006551 configure_sr_pll(&pll15_config, &pll15_regs, 0);
Vikram Mulukutla5b146722012-04-23 18:17:50 -07006552 /* Disable AUX and BIST outputs */
6553 writel_relaxed(0, MM_PLL3_TEST_CTL_REG);
Tianyi Gou65c536a2012-03-20 23:20:29 -07006554 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006555}
6556
Patrick Dalye6f489042012-07-11 15:29:15 -07006557struct clock_init_data msm8960_clock_init_data __initdata;
Matt Wagantallb64888f2012-04-02 21:35:07 -07006558static void __init msm8960_clock_pre_init(void)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006559{
Matt Wagantall86e03822011-12-12 10:59:24 -08006560 /* Initialize clock registers. */
6561 reg_init();
6562
Patrick Dalyedb86f42012-08-23 19:07:30 -07006563 if (cpu_is_apq8064() || cpu_is_apq8064ab())
Matt Wagantall82feaa12012-07-09 10:54:49 -07006564 vdd_sr2_hdmi_pll.set_vdd = set_vdd_sr2_hdmi_pll_8064;
Tianyi Goubf3d0b12012-01-23 14:37:28 -08006565
Matt Wagantall86e03822011-12-12 10:59:24 -08006566 /* Detect PLL4 programmed for alternate 491.52MHz clock plan. */
6567 if (readl_relaxed(LCC_PLL0_L_VAL_REG) == 0x12) {
6568 pll4_clk.c.rate = 491520000;
6569 audio_slimbus_clk.freq_tbl = clk_tbl_aif_osr_492;
6570 mi2s_osr_clk.freq_tbl = clk_tbl_aif_osr_492;
6571 codec_i2s_mic_osr_clk.freq_tbl = clk_tbl_aif_osr_492;
6572 spare_i2s_mic_osr_clk.freq_tbl = clk_tbl_aif_osr_492;
6573 codec_i2s_spkr_osr_clk.freq_tbl = clk_tbl_aif_osr_492;
6574 spare_i2s_spkr_osr_clk.freq_tbl = clk_tbl_aif_osr_492;
6575 pcm_clk.freq_tbl = clk_tbl_pcm_492;
6576 }
6577
Patrick Dalye6f489042012-07-11 15:29:15 -07006578 if (cpu_is_msm8960() || cpu_is_msm8960ab())
6579 memcpy(msm_clocks_8960, msm_clocks_8960_common,
6580 sizeof(msm_clocks_8960_common));
6581 if (cpu_is_msm8960ab()) {
6582 pll3_clk.c.rate = 650000000;
6583 gfx3d_clk.freq_tbl = clk_tbl_gfx3d_8960ab;
6584 gfx3d_clk.c.fmax[VDD_DIG_LOW] = 192000000;
6585 gfx3d_clk.c.fmax[VDD_DIG_NOMINAL] = 325000000;
6586 gfx3d_clk.c.fmax[VDD_DIG_HIGH] = 400000000;
6587 mdp_clk.freq_tbl = clk_tbl_mdp_8960ab;
6588 mdp_clk.c.fmax[VDD_DIG_LOW] = 128000000;
6589 mdp_clk.c.fmax[VDD_DIG_NOMINAL] = 266667000;
6590
6591 memcpy(msm_clocks_8960 + ARRAY_SIZE(msm_clocks_8960_common),
6592 msm_clocks_8960ab_only, sizeof(msm_clocks_8960ab_only));
6593 msm8960_clock_init_data.size -=
6594 ARRAY_SIZE(msm_clocks_8960_only);
Joel King336f2242012-08-19 22:32:14 -07006595
6596 gmem_axi_clk.c.depends = &gfx3d_axi_clk.c;
Patrick Dalye6f489042012-07-11 15:29:15 -07006597 } else if (cpu_is_msm8960()) {
6598 memcpy(msm_clocks_8960 + ARRAY_SIZE(msm_clocks_8960_common),
6599 msm_clocks_8960_only, sizeof(msm_clocks_8960_only));
6600 msm8960_clock_init_data.size -=
6601 ARRAY_SIZE(msm_clocks_8960ab_only);
6602 }
Tianyi Gou41515e22011-09-01 19:37:43 -07006603 /*
Matt Wagantalle18bbc82011-10-06 10:07:28 -07006604 * Change the freq tables for and voltage requirements for
Patrick Dalyedb86f42012-08-23 19:07:30 -07006605 * clocks which differ between chips.
Tianyi Gou41515e22011-09-01 19:37:43 -07006606 */
6607 if (cpu_is_apq8064()) {
6608 gfx3d_clk.freq_tbl = clk_tbl_gfx3d_8064;
Matt Wagantalle18bbc82011-10-06 10:07:28 -07006609
6610 memcpy(gfx3d_clk.c.fmax, fmax_gfx3d_8064,
6611 sizeof(gfx3d_clk.c.fmax));
Patrick Dalyedb86f42012-08-23 19:07:30 -07006612 }
6613 if (cpu_is_apq8064ab()) {
6614 gfx3d_clk.freq_tbl = clk_tbl_gfx3d_8064;
6615
6616 memcpy(gfx3d_clk.c.fmax, fmax_gfx3d_8064ab,
6617 sizeof(gfx3d_clk.c.fmax));
6618 }
6619 if ((cpu_is_apq8064() &&
6620 SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2) ||
6621 cpu_is_apq8064ab()) {
6622
6623 memcpy(vcodec_clk.c.fmax, fmax_vcodec_8064v2,
6624 sizeof(vcodec_clk.c.fmax));
6625 memcpy(ce3_src_clk.c.fmax, fmax_ce3_8064v2,
6626 sizeof(ce3_src_clk.c.fmax));
6627 memcpy(sdc1_clk.c.fmax, fmax_sdc1_8064v2,
6628 sizeof(sdc1_clk.c.fmax));
6629 }
6630 if (cpu_is_apq8064() || cpu_is_apq8064ab()) {
Matt Wagantalle18bbc82011-10-06 10:07:28 -07006631 memcpy(ijpeg_clk.c.fmax, fmax_ijpeg_8064,
6632 sizeof(ijpeg_clk.c.fmax));
6633 memcpy(mdp_clk.c.fmax, fmax_mdp_8064,
6634 sizeof(ijpeg_clk.c.fmax));
6635 memcpy(tv_src_clk.c.fmax, fmax_tv_src_8064,
6636 sizeof(tv_src_clk.c.fmax));
6637 memcpy(vfe_clk.c.fmax, fmax_vfe_8064,
6638 sizeof(vfe_clk.c.fmax));
6639
Patrick Dalye6f489042012-07-11 15:29:15 -07006640 gmem_axi_clk.c.depends = &gfx3d_axi_clk.c;
Tianyi Goue3d4f542012-03-15 17:06:45 -07006641 }
6642
6643 /*
6644 * Change the freq tables and voltage requirements for
6645 * clocks which differ between 8960 and 8930.
6646 */
Patrick Dalyebe63c52012-08-07 15:41:30 -07006647 if (cpu_is_msm8930() || cpu_is_msm8627()) {
Tianyi Goue3d4f542012-03-15 17:06:45 -07006648 memcpy(gfx3d_clk.c.fmax, fmax_gfx3d_8930,
6649 sizeof(gfx3d_clk.c.fmax));
Patrick Dalyebe63c52012-08-07 15:41:30 -07006650 } else if (cpu_is_msm8930aa()) {
6651 memcpy(gfx3d_clk.c.fmax, fmax_gfx3d_8930aa,
6652 sizeof(gfx3d_clk.c.fmax));
6653 }
6654 if (cpu_is_msm8930() || cpu_is_msm8930aa() || cpu_is_msm8627()) {
6655 gfx3d_clk.freq_tbl = clk_tbl_gfx3d_8930;
Tianyi Goue3d4f542012-03-15 17:06:45 -07006656 pll15_clk.c.rate = 900000000;
6657 gmem_axi_clk.c.depends = &gfx3d_axi_clk_8930.c;
Tianyi Gou41515e22011-09-01 19:37:43 -07006658 }
Stephen Boyd842a1f62012-04-26 19:07:38 -07006659 if ((readl_relaxed(PRNG_CLK_NS_REG) & 0x7F) == 0x2B)
6660 prng_clk.freq_tbl = clk_tbl_prng_64;
Stephen Boyd94625ef2011-07-12 17:06:01 -07006661
Matt Wagantalle18bbc82011-10-06 10:07:28 -07006662 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006663
Vikram Mulukutla681d8682012-03-09 23:56:20 -08006664 clk_ops_local_pll.enable = sr_pll_clk_enable;
Matt Wagantallb64888f2012-04-02 21:35:07 -07006665}
6666
Patrick Dalyc9f51b92012-08-27 16:10:26 -07006667static void __init msm8930_pm8917_clock_pre_init(void)
6668{
6669 /* detect pmic8917 from board file, and call this init function */
6670
6671 vdd_dig.set_vdd = set_vdd_dig_8930;
6672 rpm_vreg_dig_8930 = RPM_VREG_ID_PM8917_VDD_DIG_CORNER;
6673 vdd_sr2_hdmi_pll.set_vdd = set_vdd_sr2_hdmi_pll_8930_pm8917;
6674
6675 msm8960_clock_pre_init();
6676}
6677
6678static void __init msm8930_clock_pre_init(void)
6679{
6680 vdd_dig.set_vdd = set_vdd_dig_8930;
6681 vdd_sr2_hdmi_pll.set_vdd = set_vdd_sr2_hdmi_pll_8930;
6682
6683 msm8960_clock_pre_init();
6684}
6685
Matt Wagantallb64888f2012-04-02 21:35:07 -07006686static void __init msm8960_clock_post_init(void)
6687{
6688 /* Keep PXO on whenever APPS cpu is active */
6689 clk_prepare_enable(&pxo_a_clk.c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006690
Matt Wagantalle655cd72012-04-09 10:15:03 -07006691 /* Reset 3D core while clocked to ensure it resets completely. */
6692 clk_set_rate(&gfx3d_clk.c, 27000000);
6693 clk_prepare_enable(&gfx3d_clk.c);
6694 clk_reset(&gfx3d_clk.c, CLK_RESET_ASSERT);
6695 udelay(5);
6696 clk_reset(&gfx3d_clk.c, CLK_RESET_DEASSERT);
6697 clk_disable_unprepare(&gfx3d_clk.c);
6698
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006699 /* Initialize rates for clocks that only support one. */
6700 clk_set_rate(&pdm_clk.c, 27000000);
Stephen Boyd842a1f62012-04-26 19:07:38 -07006701 clk_set_rate(&prng_clk.c, prng_clk.freq_tbl->freq_hz);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006702 clk_set_rate(&mdp_vsync_clk.c, 27000000);
6703 clk_set_rate(&tsif_ref_clk.c, 105000);
6704 clk_set_rate(&tssc_clk.c, 27000000);
6705 clk_set_rate(&usb_hs1_xcvr_clk.c, 60000000);
Patrick Dalyedb86f42012-08-23 19:07:30 -07006706 if (cpu_is_apq8064() || cpu_is_apq8064ab()) {
Tianyi Gou41515e22011-09-01 19:37:43 -07006707 clk_set_rate(&usb_hs3_xcvr_clk.c, 60000000);
6708 clk_set_rate(&usb_hs4_xcvr_clk.c, 60000000);
6709 }
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006710 clk_set_rate(&usb_fs1_src_clk.c, 60000000);
Patrick Dalye6f489042012-07-11 15:29:15 -07006711 if (cpu_is_msm8960ab() || cpu_is_msm8960() || cpu_is_msm8930() ||
6712 cpu_is_msm8930aa() || cpu_is_msm8627())
Tianyi Gou41515e22011-09-01 19:37:43 -07006713 clk_set_rate(&usb_fs2_src_clk.c, 60000000);
Stephen Boyd94625ef2011-07-12 17:06:01 -07006714 clk_set_rate(&usb_hsic_xcvr_fs_clk.c, 60000000);
6715 clk_set_rate(&usb_hsic_hsic_src_clk.c, 480000000);
6716 clk_set_rate(&usb_hsic_hsio_cal_clk.c, 9000000);
Lena Salman127823f2012-02-14 17:13:53 +02006717 clk_set_rate(&usb_hsic_system_clk.c, 60000000);
Stephen Boyd092fd182011-10-21 15:56:30 -07006718 /*
6719 * Set the CSI rates to a safe default to avoid warnings when
6720 * switching csi pix and rdi clocks.
6721 */
6722 clk_set_rate(&csi0_src_clk.c, 27000000);
6723 clk_set_rate(&csi1_src_clk.c, 27000000);
6724 clk_set_rate(&csi2_src_clk.c, 27000000);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006725
6726 /*
Stephen Boyd60496bb2011-10-17 13:51:37 -07006727 * The halt status bits for these clocks may be incorrect at boot.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006728 * Toggle these clocks on and off to refresh them.
6729 */
Stephen Boyd409b8b42012-04-10 12:12:56 -07006730 clk_prepare_enable(&pdm_clk.c);
6731 clk_disable_unprepare(&pdm_clk.c);
6732 clk_prepare_enable(&tssc_clk.c);
6733 clk_disable_unprepare(&tssc_clk.c);
Stephen Boyde334aeb2012-01-24 12:17:29 -08006734 clk_prepare_enable(&usb_hsic_hsic_clk.c);
6735 clk_disable_unprepare(&usb_hsic_hsic_clk.c);
Stephen Boydd7a143a2012-02-16 17:59:26 -08006736
6737 /*
6738 * Keep sfab floor @ 54MHz so that Krait AHB is at least 27MHz at all
6739 * times when Apps CPU is active. This ensures the timer's requirement
6740 * of Krait AHB running 4 times as fast as the timer itself.
6741 */
6742 clk_set_rate(&sfab_tmr_a_clk.c, 54000000);
Stephen Boyde334aeb2012-01-24 12:17:29 -08006743 clk_prepare_enable(&sfab_tmr_a_clk.c);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006744}
6745
Stephen Boydbb600ae2011-08-02 20:11:40 -07006746static int __init msm8960_clock_late_init(void)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006747{
Stephen Boyda3787f32011-09-16 18:55:13 -07006748 int rc;
6749 struct clk *mmfpb_a_clk = clk_get_sys("clock-8960", "mmfpb_a_clk");
Stephen Boyd85436132011-09-16 18:55:13 -07006750 struct clk *cfpb_a_clk = clk_get_sys("clock-8960", "cfpb_a_clk");
Stephen Boyda3787f32011-09-16 18:55:13 -07006751
6752 /* Vote for MMFPB to be at least 76.8MHz when an Apps CPU is active. */
6753 if (WARN(IS_ERR(mmfpb_a_clk), "mmfpb_a_clk not found (%ld)\n",
6754 PTR_ERR(mmfpb_a_clk)))
6755 return PTR_ERR(mmfpb_a_clk);
Matt Wagantallde555f562011-11-08 14:18:07 -08006756 rc = clk_set_rate(mmfpb_a_clk, 76800000);
Stephen Boyda3787f32011-09-16 18:55:13 -07006757 if (WARN(rc, "mmfpb_a_clk rate was not set (%d)\n", rc))
6758 return rc;
Stephen Boyde334aeb2012-01-24 12:17:29 -08006759 rc = clk_prepare_enable(mmfpb_a_clk);
Stephen Boyda3787f32011-09-16 18:55:13 -07006760 if (WARN(rc, "mmfpb_a_clk not enabled (%d)\n", rc))
6761 return rc;
6762
Stephen Boyd85436132011-09-16 18:55:13 -07006763 /* Vote for CFPB to be at least 64MHz when an Apps CPU is active. */
6764 if (WARN(IS_ERR(cfpb_a_clk), "cfpb_a_clk not found (%ld)\n",
6765 PTR_ERR(cfpb_a_clk)))
6766 return PTR_ERR(cfpb_a_clk);
Matt Wagantallde555f562011-11-08 14:18:07 -08006767 rc = clk_set_rate(cfpb_a_clk, 64000000);
Stephen Boyd85436132011-09-16 18:55:13 -07006768 if (WARN(rc, "cfpb_a_clk rate was not set (%d)\n", rc))
6769 return rc;
Stephen Boyde334aeb2012-01-24 12:17:29 -08006770 rc = clk_prepare_enable(cfpb_a_clk);
Stephen Boyd85436132011-09-16 18:55:13 -07006771 if (WARN(rc, "cfpb_a_clk not enabled (%d)\n", rc))
6772 return rc;
Matt Wagantalle18bbc82011-10-06 10:07:28 -07006773
6774 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07006775}
Stephen Boydbb600ae2011-08-02 20:11:40 -07006776
6777struct clock_init_data msm8960_clock_init_data __initdata = {
6778 .table = msm_clocks_8960,
6779 .size = ARRAY_SIZE(msm_clocks_8960),
Matt Wagantallb64888f2012-04-02 21:35:07 -07006780 .pre_init = msm8960_clock_pre_init,
6781 .post_init = msm8960_clock_post_init,
Stephen Boydbb600ae2011-08-02 20:11:40 -07006782 .late_init = msm8960_clock_late_init,
6783};
Tianyi Gou41515e22011-09-01 19:37:43 -07006784
6785struct clock_init_data apq8064_clock_init_data __initdata = {
6786 .table = msm_clocks_8064,
6787 .size = ARRAY_SIZE(msm_clocks_8064),
Matt Wagantallb64888f2012-04-02 21:35:07 -07006788 .pre_init = msm8960_clock_pre_init,
6789 .post_init = msm8960_clock_post_init,
Tianyi Gou41515e22011-09-01 19:37:43 -07006790 .late_init = msm8960_clock_late_init,
6791};
Tianyi Goue3d4f542012-03-15 17:06:45 -07006792
6793struct clock_init_data msm8930_clock_init_data __initdata = {
6794 .table = msm_clocks_8930,
6795 .size = ARRAY_SIZE(msm_clocks_8930),
Patrick Dalyc9f51b92012-08-27 16:10:26 -07006796 .pre_init = msm8930_clock_pre_init,
6797 .post_init = msm8960_clock_post_init,
6798 .late_init = msm8960_clock_late_init,
6799};
6800
6801struct clock_init_data msm8930_pm8917_clock_init_data __initdata = {
6802 .table = msm_clocks_8930,
6803 .size = ARRAY_SIZE(msm_clocks_8930),
6804 .pre_init = msm8930_pm8917_clock_pre_init,
Matt Wagantallb64888f2012-04-02 21:35:07 -07006805 .post_init = msm8960_clock_post_init,
Tianyi Goue3d4f542012-03-15 17:06:45 -07006806 .late_init = msm8960_clock_late_init,
6807};