blob: 1f522a1b9229e14fe3e40bf0f856bd88aa9c4837 [file] [log] [blame]
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001/* Copyright (c) 2013, The Linux Foundation. All rights reserved.
2 *
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/io.h>
18#include <linux/spinlock.h>
19#include <linux/delay.h>
20#include <linux/clk.h>
21#include <linux/iopoll.h>
Patrick Daly48e00f32013-01-28 19:13:47 -080022#include <linux/regulator/consumer.h>
Patrick Dalyeb370ea2012-10-23 11:57:50 -070023
24#include <mach/rpm-regulator-smd.h>
25#include <mach/socinfo.h>
26#include <mach/rpm-smd.h>
27
28#include "clock-local2.h"
29#include "clock-pll.h"
30#include "clock-rpm.h"
31#include "clock-voter.h"
32#include "clock-mdss-8974.h"
33#include "clock.h"
34
35enum {
36 GCC_BASE,
37 MMSS_BASE,
38 LPASS_BASE,
39 APCS_BASE,
40 APCS_PLL_BASE,
41 N_BASES,
42};
43
44static void __iomem *virt_bases[N_BASES];
45
46#define GCC_REG_BASE(x) (void __iomem *)(virt_bases[GCC_BASE] + (x))
47#define MMSS_REG_BASE(x) (void __iomem *)(virt_bases[MMSS_BASE] + (x))
48#define LPASS_REG_BASE(x) (void __iomem *)(virt_bases[LPASS_BASE] + (x))
49#define APCS_REG_BASE(x) (void __iomem *)(virt_bases[APCS_BASE] + (x))
50
51/* Mux source select values */
52#define xo_source_val 0
53#define gpll0_source_val 1
54#define gpll1_source_val 2
55
56#define xo_mm_source_val 0
57#define mmpll0_pll_mm_source_val 1
58#define mmpll1_pll_mm_source_val 2
59#define mmpll2_pll_mm_source_val 3
60#define gpll0_mm_source_val 5
61#define dsipll_750_mm_source_val 1
62#define dsipll_667_mm_source_val 1
Patrick Daly5555c2c2013-03-06 21:25:26 -080063#define dsipll0_byte_mm_source_val 1
64#define dsipll0_pixel_mm_source_val 1
Patrick Dalyeb370ea2012-10-23 11:57:50 -070065
66#define gpll1_hsic_source_val 4
67
68#define xo_lpass_source_val 0
69#define lpaaudio_pll_lpass_source_val 1
70#define gpll0_lpass_source_val 5
71
72/* Prevent a divider of -1 */
73#define FIXDIV(div) (div ? (2 * (div) - 1) : (0))
74
75#define F_GCC(f, s, div, m, n) \
76 { \
77 .freq_hz = (f), \
78 .src_clk = &s.c, \
79 .m_val = (m), \
80 .n_val = ~((n)-(m)) * !!(n), \
81 .d_val = ~(n),\
82 .div_src_val = BVAL(4, 0, (int)(FIXDIV(div))) \
83 | BVAL(10, 8, s##_source_val), \
84 }
85
86#define F_MMSS(f, s, div, m, n) \
87 { \
88 .freq_hz = (f), \
89 .src_clk = &s.c, \
90 .m_val = (m), \
91 .n_val = ~((n)-(m)) * !!(n), \
92 .d_val = ~(n),\
93 .div_src_val = BVAL(4, 0, (int)(FIXDIV(div))) \
94 | BVAL(10, 8, s##_mm_source_val), \
95 }
96
97#define F_MDSS(f, s, div, m, n) \
98 { \
99 .freq_hz = (f), \
100 .m_val = (m), \
101 .n_val = ~((n)-(m)) * !!(n), \
102 .d_val = ~(n),\
103 .div_src_val = BVAL(4, 0, (int)(FIXDIV(div))) \
104 | BVAL(10, 8, s##_mm_source_val), \
105 }
106
107#define F_HSIC(f, s, div, m, n) \
108 { \
109 .freq_hz = (f), \
110 .src_clk = &s.c, \
111 .m_val = (m), \
112 .n_val = ~((n)-(m)) * !!(n), \
113 .d_val = ~(n),\
114 .div_src_val = BVAL(4, 0, (int)(FIXDIV(div))) \
115 | BVAL(10, 8, s##_hsic_source_val), \
116 }
117
118#define F_LPASS(f, s, div, m, n) \
119 { \
120 .freq_hz = (f), \
121 .src_clk = &s.c, \
122 .m_val = (m), \
123 .n_val = ~((n)-(m)) * !!(n), \
124 .d_val = ~(n),\
125 .div_src_val = BVAL(4, 0, (int)(FIXDIV(div))) \
126 | BVAL(10, 8, s##_lpass_source_val), \
127 }
128
129#define F_APCS_PLL(f, l, m, n, pre_div, post_div, vco) \
130 { \
131 .freq_hz = (f), \
132 .l_val = (l), \
133 .m_val = (m), \
134 .n_val = (n), \
135 .pre_div_val = BVAL(12, 12, (pre_div)), \
136 .post_div_val = BVAL(9, 8, (post_div)), \
137 .vco_val = BVAL(29, 28, (vco)), \
138 }
139
140#define VDD_DIG_FMAX_MAP1(l1, f1) \
141 .vdd_class = &vdd_dig, \
142 .fmax = (unsigned long[VDD_DIG_NUM]) { \
143 [VDD_DIG_##l1] = (f1), \
144 }, \
145 .num_fmax = VDD_DIG_NUM
146
147#define VDD_DIG_FMAX_MAP2(l1, f1, l2, f2) \
148 .vdd_class = &vdd_dig, \
149 .fmax = (unsigned long[VDD_DIG_NUM]) { \
150 [VDD_DIG_##l1] = (f1), \
151 [VDD_DIG_##l2] = (f2), \
152 }, \
153 .num_fmax = VDD_DIG_NUM
154
155#define VDD_DIG_FMAX_MAP3(l1, f1, l2, f2, l3, f3) \
156 .vdd_class = &vdd_dig, \
157 .fmax = (unsigned long[VDD_DIG_NUM]) { \
158 [VDD_DIG_##l1] = (f1), \
159 [VDD_DIG_##l2] = (f2), \
160 [VDD_DIG_##l3] = (f3), \
161 }, \
162 .num_fmax = VDD_DIG_NUM
163
164enum vdd_dig_levels {
165 VDD_DIG_NONE,
166 VDD_DIG_LOW,
167 VDD_DIG_NOMINAL,
168 VDD_DIG_HIGH,
169 VDD_DIG_NUM
170};
171
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800172static const int *vdd_corner[] = {
173 [VDD_DIG_NONE] = VDD_UV(RPM_REGULATOR_CORNER_NONE),
174 [VDD_DIG_LOW] = VDD_UV(RPM_REGULATOR_CORNER_SVS_SOC),
175 [VDD_DIG_NOMINAL] = VDD_UV(RPM_REGULATOR_CORNER_NORMAL),
176 [VDD_DIG_HIGH] = VDD_UV(RPM_REGULATOR_CORNER_SUPER_TURBO),
Patrick Dalyeb370ea2012-10-23 11:57:50 -0700177};
178
Patrick Dalyebc26bc2013-02-05 11:49:07 -0800179static DEFINE_VDD_REGULATORS(vdd_dig, VDD_DIG_NUM, 1, vdd_corner);
Patrick Dalyeb370ea2012-10-23 11:57:50 -0700180
181#define RPM_MISC_CLK_TYPE 0x306b6c63
182#define RPM_BUS_CLK_TYPE 0x316b6c63
183#define RPM_MEM_CLK_TYPE 0x326b6c63
184
185#define RPM_SMD_KEY_ENABLE 0x62616E45
186
187#define CXO_ID 0x0
188#define QDSS_ID 0x1
189
190#define PNOC_ID 0x0
191#define SNOC_ID 0x1
192#define CNOC_ID 0x2
193#define MMSSNOC_AHB_ID 0x3
194
195#define BIMC_ID 0x0
196#define OXILI_ID 0x1
197#define OCMEM_ID 0x2
198
199#define D0_ID 1
200#define D1_ID 2
201#define A0_ID 4
202#define A1_ID 5
203#define A2_ID 6
204#define DIFF_CLK_ID 7
205#define DIV_CLK1_ID 11
206#define DIV_CLK2_ID 12
207
208DEFINE_CLK_RPM_SMD(pnoc_clk, pnoc_a_clk, RPM_BUS_CLK_TYPE, PNOC_ID, NULL);
209DEFINE_CLK_RPM_SMD(snoc_clk, snoc_a_clk, RPM_BUS_CLK_TYPE, SNOC_ID, NULL);
210DEFINE_CLK_RPM_SMD(cnoc_clk, cnoc_a_clk, RPM_BUS_CLK_TYPE, CNOC_ID, NULL);
211DEFINE_CLK_RPM_SMD(mmssnoc_ahb_clk, mmssnoc_ahb_a_clk, RPM_BUS_CLK_TYPE,
212 MMSSNOC_AHB_ID, NULL);
213
214DEFINE_CLK_RPM_SMD(bimc_clk, bimc_a_clk, RPM_MEM_CLK_TYPE, BIMC_ID, NULL);
215DEFINE_CLK_RPM_SMD(ocmemgx_clk, ocmemgx_a_clk, RPM_MEM_CLK_TYPE, OCMEM_ID,
216 NULL);
217DEFINE_CLK_RPM_SMD(gfx3d_clk_src, gfx3d_a_clk_src, RPM_MEM_CLK_TYPE, OXILI_ID,
218 NULL);
219
220DEFINE_CLK_RPM_SMD_BRANCH(xo, xo_a_clk,
221 RPM_MISC_CLK_TYPE, CXO_ID, 19200000);
222DEFINE_CLK_RPM_SMD_QDSS(qdss_clk, qdss_a_clk, RPM_MISC_CLK_TYPE, QDSS_ID);
223
224DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d0, cxo_d0_a, D0_ID);
225DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_d1, cxo_d1_a, D1_ID);
226DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a0, cxo_a0_a, A0_ID);
227DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a1, cxo_a1_a, A1_ID);
228DEFINE_CLK_RPM_SMD_XO_BUFFER(cxo_a2, cxo_a2_a, A2_ID);
229DEFINE_CLK_RPM_SMD_XO_BUFFER(div_clk1, div_a_clk1, DIV_CLK1_ID);
230DEFINE_CLK_RPM_SMD_XO_BUFFER(div_clk2, div_a_clk2, DIV_CLK2_ID);
231DEFINE_CLK_RPM_SMD_XO_BUFFER(diff_clk, diff_a_clk, DIFF_CLK_ID);
232
233DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d0_pin, cxo_d0_a_pin, D0_ID);
234DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_d1_pin, cxo_d1_a_pin, D1_ID);
235DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a0_pin, cxo_a0_a_pin, A0_ID);
236DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a1_pin, cxo_a1_a_pin, A1_ID);
237DEFINE_CLK_RPM_SMD_XO_BUFFER_PINCTRL(cxo_a2_pin, cxo_a2_a_pin, A2_ID);
238
239struct measure_mux_entry {
240 struct clk *c;
241 int base;
242 u32 debug_mux;
243};
244
245static struct branch_clk oxilicx_axi_clk;
246
247#define MSS_DEBUG_CLOCK_CTL 0x0078
248#define LPASS_DEBUG_CLK_CTL 0x29000
249#define GLB_CLK_DIAG 0x01C
250#define GLB_TEST_BUS_SEL 0x020
251
252#define MMPLL0_PLL_MODE (0x0000)
253#define MMPLL0_PLL_L_VAL (0x0004)
254#define MMPLL0_PLL_M_VAL (0x0008)
255#define MMPLL0_PLL_N_VAL (0x000C)
256#define MMPLL0_PLL_USER_CTL (0x0010)
257#define MMPLL0_PLL_STATUS (0x001C)
258#define MMPLL1_PLL_MODE (0x0040)
259#define MMPLL1_PLL_L_VAL (0x0044)
260#define MMPLL1_PLL_M_VAL (0x0048)
261#define MMPLL1_PLL_N_VAL (0x004C)
262#define MMPLL1_PLL_USER_CTL (0x0050)
263#define MMPLL1_PLL_STATUS (0x005C)
264#define MMSS_PLL_VOTE_APCS (0x0100)
265#define VCODEC0_CMD_RCGR (0x1000)
266#define VENUS0_VCODEC0_CBCR (0x1028)
267#define VENUS0_AHB_CBCR (0x1030)
268#define VENUS0_AXI_CBCR (0x1034)
269#define PCLK0_CMD_RCGR (0x2000)
270#define MDP_CMD_RCGR (0x2040)
271#define VSYNC_CMD_RCGR (0x2080)
272#define BYTE0_CMD_RCGR (0x2120)
273#define ESC0_CMD_RCGR (0x2160)
274#define MDSS_AHB_CBCR (0x2308)
275#define MDSS_AXI_CBCR (0x2310)
276#define MDSS_PCLK0_CBCR (0x2314)
277#define MDSS_MDP_CBCR (0x231C)
278#define MDSS_MDP_LUT_CBCR (0x2320)
279#define MDSS_VSYNC_CBCR (0x2328)
280#define MDSS_BYTE0_CBCR (0x233C)
281#define MDSS_ESC0_CBCR (0x2344)
282#define CSI0PHYTIMER_CMD_RCGR (0x3000)
283#define CAMSS_PHY0_CSI0PHYTIMER_CBCR (0x3024)
284#define CSI1PHYTIMER_CMD_RCGR (0x3030)
285#define CAMSS_PHY1_CSI1PHYTIMER_CBCR (0x3054)
286#define CSI0_CMD_RCGR (0x3090)
287#define CAMSS_CSI0_CBCR (0x30B4)
288#define CAMSS_CSI0_AHB_CBCR (0x30BC)
289#define CAMSS_CSI0PHY_CBCR (0x30C4)
290#define CAMSS_CSI0RDI_CBCR (0x30D4)
291#define CAMSS_CSI0PIX_CBCR (0x30E4)
292#define CSI1_CMD_RCGR (0x3100)
293#define CAMSS_CSI1_CBCR (0x3124)
294#define CAMSS_CSI1_AHB_CBCR (0x3128)
295#define CAMSS_CSI1PHY_CBCR (0x3134)
296#define CAMSS_CSI1RDI_CBCR (0x3144)
297#define CAMSS_CSI1PIX_CBCR (0x3154)
298#define CAMSS_ISPIF_AHB_CBCR (0x3224)
299#define CCI_CMD_RCGR (0x3300)
300#define CAMSS_CCI_CCI_CBCR (0x3344)
301#define CAMSS_CCI_CCI_AHB_CBCR (0x3348)
302#define MCLK0_CMD_RCGR (0x3360)
303#define CAMSS_MCLK0_CBCR (0x3384)
304#define MCLK1_CMD_RCGR (0x3390)
305#define CAMSS_MCLK1_CBCR (0x33B4)
306#define MMSS_GP0_CMD_RCGR (0x3420)
307#define CAMSS_GP0_CBCR (0x3444)
308#define MMSS_GP1_CMD_RCGR (0x3450)
309#define CAMSS_GP1_CBCR (0x3474)
310#define CAMSS_TOP_AHB_CBCR (0x3484)
311#define CAMSS_MICRO_AHB_CBCR (0x3494)
312#define JPEG0_CMD_RCGR (0x3500)
313#define CAMSS_JPEG_JPEG0_CBCR (0x35A8)
314#define CAMSS_JPEG_JPEG_AHB_CBCR (0x35B4)
315#define CAMSS_JPEG_JPEG_AXI_CBCR (0x35B8)
316#define VFE0_CMD_RCGR (0x3600)
317#define CPP_CMD_RCGR (0x3640)
318#define CAMSS_VFE_VFE0_CBCR (0x36A8)
319#define CAMSS_VFE_CPP_CBCR (0x36B0)
320#define CAMSS_VFE_CPP_AHB_CBCR (0x36B4)
321#define CAMSS_VFE_VFE_AHB_CBCR (0x36B8)
322#define CAMSS_VFE_VFE_AXI_CBCR (0x36BC)
323#define CAMSS_CSI_VFE0_CBCR (0x3704)
324#define OXILI_GFX3D_CBCR (0x4028)
325#define OXILICX_AXI_CBCR (0x4038)
326#define OXILICX_AHB_CBCR (0x403C)
Patrick Dalyeb370ea2012-10-23 11:57:50 -0700327#define MMPLL2_PLL_MODE (0x4100)
328#define MMPLL2_PLL_STATUS (0x411C)
329#define MMSS_MMSSNOC_AHB_CBCR (0x5024)
330#define MMSS_MMSSNOC_BTO_AHB_CBCR (0x5028)
331#define MMSS_MISC_AHB_CBCR (0x502C)
332#define AXI_CMD_RCGR (0x5040)
333#define MMSS_S0_AXI_CBCR (0x5064)
334#define MMSS_MMSSNOC_AXI_CBCR (0x506C)
335#define MMSS_DEBUG_CLK_CTL (0x0900)
336#define GPLL0_MODE (0x0000)
337#define GPLL0_L_VAL (0x0004)
338#define GPLL0_M_VAL (0x0008)
339#define GPLL0_N_VAL (0x000C)
340#define GPLL0_USER_CTL (0x0010)
341#define GPLL0_STATUS (0x001C)
342#define GPLL1_MODE (0x0040)
343#define GPLL1_L_VAL (0x0044)
344#define GPLL1_M_VAL (0x0048)
345#define GPLL1_N_VAL (0x004C)
346#define GPLL1_USER_CTL (0x0050)
347#define GPLL1_STATUS (0x005C)
348#define PERIPH_NOC_AHB_CBCR (0x0184)
349#define NOC_CONF_XPU_AHB_CBCR (0x01C0)
350#define MMSS_NOC_CFG_AHB_CBCR (0x024C)
351#define MSS_CFG_AHB_CBCR (0x0280)
352#define MSS_Q6_BIMC_AXI_CBCR (0x0284)
353#define USB_HS_HSIC_BCR (0x0400)
354#define USB_HSIC_AHB_CBCR (0x0408)
355#define USB_HSIC_SYSTEM_CMD_RCGR (0x041C)
356#define USB_HSIC_SYSTEM_CBCR (0x040C)
357#define USB_HSIC_CMD_RCGR (0x0440)
358#define USB_HSIC_CBCR (0x0410)
359#define USB_HSIC_IO_CAL_CMD_RCGR (0x0458)
360#define USB_HSIC_IO_CAL_CBCR (0x0414)
361#define USB_HS_BCR (0x0480)
362#define USB_HS_SYSTEM_CBCR (0x0484)
363#define USB_HS_AHB_CBCR (0x0488)
364#define USB_HS_SYSTEM_CMD_RCGR (0x0490)
365#define USB2A_PHY_SLEEP_CBCR (0x04AC)
366#define SDCC1_APPS_CMD_RCGR (0x04D0)
367#define SDCC1_APPS_CBCR (0x04C4)
368#define SDCC1_AHB_CBCR (0x04C8)
369#define SDCC2_APPS_CMD_RCGR (0x0510)
370#define SDCC2_APPS_CBCR (0x0504)
371#define SDCC2_AHB_CBCR (0x0508)
372#define SDCC3_APPS_CMD_RCGR (0x0550)
373#define SDCC3_APPS_CBCR (0x0544)
374#define SDCC3_AHB_CBCR (0x0548)
375#define BLSP1_AHB_CBCR (0x05C4)
376#define BLSP1_QUP1_SPI_APPS_CBCR (0x0644)
377#define BLSP1_QUP1_I2C_APPS_CBCR (0x0648)
378#define BLSP1_QUP1_I2C_APPS_CMD_RCGR (0x0660)
379#define BLSP1_QUP2_I2C_APPS_CMD_RCGR (0x06E0)
380#define BLSP1_QUP3_I2C_APPS_CMD_RCGR (0x0760)
381#define BLSP1_QUP4_I2C_APPS_CMD_RCGR (0x07E0)
382#define BLSP1_QUP5_I2C_APPS_CMD_RCGR (0x0860)
383#define BLSP1_QUP6_I2C_APPS_CMD_RCGR (0x08E0)
384#define BLSP1_QUP1_SPI_APPS_CMD_RCGR (0x064C)
385#define BLSP1_UART1_APPS_CBCR (0x0684)
386#define BLSP1_UART1_APPS_CMD_RCGR (0x068C)
387#define BLSP1_QUP2_SPI_APPS_CBCR (0x06C4)
388#define BLSP1_QUP2_I2C_APPS_CBCR (0x06C8)
389#define BLSP1_QUP2_SPI_APPS_CMD_RCGR (0x06CC)
390#define BLSP1_UART2_APPS_CBCR (0x0704)
391#define BLSP1_UART2_APPS_CMD_RCGR (0x070C)
392#define BLSP1_QUP3_SPI_APPS_CBCR (0x0744)
393#define BLSP1_QUP3_I2C_APPS_CBCR (0x0748)
394#define BLSP1_QUP3_SPI_APPS_CMD_RCGR (0x074C)
395#define BLSP1_UART3_APPS_CBCR (0x0784)
396#define BLSP1_UART3_APPS_CMD_RCGR (0x078C)
397#define BLSP1_QUP4_SPI_APPS_CBCR (0x07C4)
398#define BLSP1_QUP4_I2C_APPS_CBCR (0x07C8)
399#define BLSP1_QUP4_SPI_APPS_CMD_RCGR (0x07CC)
400#define BLSP1_UART4_APPS_CBCR (0x0804)
401#define BLSP1_UART4_APPS_CMD_RCGR (0x080C)
402#define BLSP1_QUP5_SPI_APPS_CBCR (0x0844)
403#define BLSP1_QUP5_I2C_APPS_CBCR (0x0848)
404#define BLSP1_QUP5_SPI_APPS_CMD_RCGR (0x084C)
405#define BLSP1_UART5_APPS_CBCR (0x0884)
406#define BLSP1_UART5_APPS_CMD_RCGR (0x088C)
407#define BLSP1_QUP6_SPI_APPS_CBCR (0x08C4)
408#define BLSP1_QUP6_I2C_APPS_CBCR (0x08C8)
409#define BLSP1_QUP6_SPI_APPS_CMD_RCGR (0x08CC)
410#define BLSP1_UART6_APPS_CBCR (0x0904)
411#define BLSP1_UART6_APPS_CMD_RCGR (0x090C)
412#define PDM_AHB_CBCR (0x0CC4)
413#define PDM_XO4_CBCR (0x0CC8)
414#define PDM2_CBCR (0x0CCC)
415#define PDM2_CMD_RCGR (0x0CD0)
416#define PRNG_AHB_CBCR (0x0D04)
417#define BAM_DMA_AHB_CBCR (0x0D44)
418#define BOOT_ROM_AHB_CBCR (0x0E04)
419#define CE1_CMD_RCGR (0x1050)
420#define CE1_CBCR (0x1044)
421#define CE1_AXI_CBCR (0x1048)
422#define CE1_AHB_CBCR (0x104C)
423#define GCC_XO_DIV4_CBCR (0x10C8)
424#define LPASS_Q6_AXI_CBCR (0x11C0)
425#define APCS_GPLL_ENA_VOTE (0x1480)
426#define APCS_CLOCK_BRANCH_ENA_VOTE (0x1484)
427#define APCS_CLOCK_SLEEP_ENA_VOTE (0x1488)
428#define GCC_DEBUG_CLK_CTL (0x1880)
429#define CLOCK_FRQ_MEASURE_CTL (0x1884)
430#define CLOCK_FRQ_MEASURE_STATUS (0x1888)
431#define PLLTEST_PAD_CFG (0x188C)
432#define GP1_CBCR (0x1900)
433#define GP1_CMD_RCGR (0x1904)
434#define GP2_CBCR (0x1940)
435#define GP2_CMD_RCGR (0x1944)
436#define GP3_CBCR (0x1980)
437#define GP3_CMD_RCGR (0x1984)
Patrick Dalyeb370ea2012-10-23 11:57:50 -0700438#define Q6SS_BCR (0x6000)
Patrick Dalyeb370ea2012-10-23 11:57:50 -0700439#define Q6SS_AHB_LFABIF_CBCR (0x22000)
440#define Q6SS_AHBM_CBCR (0x22004)
Patrick Dalyeb370ea2012-10-23 11:57:50 -0700441#define Q6SS_XO_CBCR (0x26000)
442
443static unsigned int soft_vote_gpll0;
444
445static struct pll_vote_clk gpll0 = {
446 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
447 .en_mask = BIT(0),
448 .status_reg = (void __iomem *)GPLL0_STATUS,
449 .status_mask = BIT(17),
450 .soft_vote = &soft_vote_gpll0,
451 .soft_vote_mask = PLL_SOFT_VOTE_PRIMARY,
452 .base = &virt_bases[GCC_BASE],
453 .c = {
454 .rate = 600000000,
455 .parent = &xo.c,
456 .dbg_name = "gpll0",
457 .ops = &clk_ops_pll_acpu_vote,
458 CLK_INIT(gpll0.c),
459 },
460};
461
462/*Don't vote for xo if using this clock to allow xo shutdown*/
463static struct pll_vote_clk gpll0_ao = {
464 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
465 .en_mask = BIT(0),
466 .status_reg = (void __iomem *)GPLL0_STATUS,
467 .status_mask = BIT(17),
468 .soft_vote = &soft_vote_gpll0,
469 .soft_vote_mask = PLL_SOFT_VOTE_ACPU,
470 .base = &virt_bases[GCC_BASE],
471 .c = {
472 .rate = 600000000,
473 .dbg_name = "gpll0_ao",
474 .ops = &clk_ops_pll_acpu_vote,
475 CLK_INIT(gpll0_ao.c),
476 },
477};
478
479static struct pll_vote_clk gpll1 = {
480 .en_reg = (void __iomem *)APCS_GPLL_ENA_VOTE,
481 .en_mask = BIT(1),
482 .status_reg = (void __iomem *)GPLL1_STATUS,
483 .status_mask = BIT(17),
484 .base = &virt_bases[GCC_BASE],
485 .c = {
486 .rate = 480000000,
487 .parent = &xo.c,
488 .dbg_name = "gpll1",
489 .ops = &clk_ops_pll_vote,
490 CLK_INIT(gpll1.c),
491 },
492};
493
494static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_i2c_apps_clk[] = {
Patrick Daly4f832432013-02-26 12:40:49 -0800495 F_GCC( 19200000, xo, 1, 0, 0),
496 F_GCC( 50000000, gpll0, 12, 0, 0),
Patrick Dalyeb370ea2012-10-23 11:57:50 -0700497 F_END
498};
499
500static struct rcg_clk blsp1_qup1_i2c_apps_clk_src = {
501 .cmd_rcgr_reg = BLSP1_QUP1_I2C_APPS_CMD_RCGR,
502 .set_rate = set_rate_hid,
503 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
504 .current_freq = &rcg_dummy_freq,
505 .base = &virt_bases[GCC_BASE],
506 .c = {
507 .dbg_name = "blsp1_qup1_i2c_apps_clk_src",
508 .ops = &clk_ops_rcg,
509 VDD_DIG_FMAX_MAP1(LOW, 50000000),
510 CLK_INIT(blsp1_qup1_i2c_apps_clk_src.c),
511 },
512};
513
514static struct clk_freq_tbl ftbl_gcc_blsp1_qup1_6_spi_apps_clk[] = {
515 F_GCC( 960000, xo, 10, 1, 2),
516 F_GCC( 4800000, xo, 4, 0, 0),
517 F_GCC( 9600000, xo, 2, 0, 0),
518 F_GCC( 15000000, gpll0, 10, 1, 4),
519 F_GCC( 19200000, xo, 1, 0, 0),
520 F_GCC( 25000000, gpll0, 12, 1, 2),
521 F_GCC( 50000000, gpll0, 12, 0, 0),
522 F_END
523};
524
525static struct rcg_clk blsp1_qup1_spi_apps_clk_src = {
526 .cmd_rcgr_reg = BLSP1_QUP1_SPI_APPS_CMD_RCGR,
527 .set_rate = set_rate_mnd,
528 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
529 .current_freq = &rcg_dummy_freq,
530 .base = &virt_bases[GCC_BASE],
531 .c = {
532 .dbg_name = "blsp1_qup1_spi_apps_clk_src",
533 .ops = &clk_ops_rcg_mnd,
534 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
535 CLK_INIT(blsp1_qup1_spi_apps_clk_src.c),
536 },
537};
538
539static struct rcg_clk blsp1_qup2_i2c_apps_clk_src = {
540 .cmd_rcgr_reg = BLSP1_QUP2_I2C_APPS_CMD_RCGR,
541 .set_rate = set_rate_hid,
542 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
543 .current_freq = &rcg_dummy_freq,
544 .base = &virt_bases[GCC_BASE],
545 .c = {
546 .dbg_name = "blsp1_qup2_i2c_apps_clk_src",
547 .ops = &clk_ops_rcg,
548 VDD_DIG_FMAX_MAP1(LOW, 50000000),
549 CLK_INIT(blsp1_qup2_i2c_apps_clk_src.c),
550 },
551};
552
553static struct rcg_clk blsp1_qup2_spi_apps_clk_src = {
554 .cmd_rcgr_reg = BLSP1_QUP2_SPI_APPS_CMD_RCGR,
555 .set_rate = set_rate_mnd,
556 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
557 .current_freq = &rcg_dummy_freq,
558 .base = &virt_bases[GCC_BASE],
559 .c = {
560 .dbg_name = "blsp1_qup2_spi_apps_clk_src",
561 .ops = &clk_ops_rcg_mnd,
562 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
563 CLK_INIT(blsp1_qup2_spi_apps_clk_src.c),
564 },
565};
566
567static struct rcg_clk blsp1_qup3_i2c_apps_clk_src = {
568 .cmd_rcgr_reg = BLSP1_QUP3_I2C_APPS_CMD_RCGR,
569 .set_rate = set_rate_hid,
570 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
571 .current_freq = &rcg_dummy_freq,
572 .base = &virt_bases[GCC_BASE],
573 .c = {
574 .dbg_name = "blsp1_qup3_i2c_apps_clk_src",
575 .ops = &clk_ops_rcg,
576 VDD_DIG_FMAX_MAP1(LOW, 50000000),
577 CLK_INIT(blsp1_qup3_i2c_apps_clk_src.c),
578 },
579};
580
581static struct rcg_clk blsp1_qup3_spi_apps_clk_src = {
582 .cmd_rcgr_reg = BLSP1_QUP3_SPI_APPS_CMD_RCGR,
583 .set_rate = set_rate_mnd,
584 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
585 .current_freq = &rcg_dummy_freq,
586 .base = &virt_bases[GCC_BASE],
587 .c = {
588 .dbg_name = "blsp1_qup3_spi_apps_clk_src",
589 .ops = &clk_ops_rcg_mnd,
590 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
591 CLK_INIT(blsp1_qup3_spi_apps_clk_src.c),
592 },
593};
594
595static struct rcg_clk blsp1_qup4_i2c_apps_clk_src = {
596 .cmd_rcgr_reg = BLSP1_QUP4_I2C_APPS_CMD_RCGR,
597 .set_rate = set_rate_hid,
598 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
599 .current_freq = &rcg_dummy_freq,
600 .base = &virt_bases[GCC_BASE],
601 .c = {
602 .dbg_name = "blsp1_qup4_i2c_apps_clk_src",
603 .ops = &clk_ops_rcg,
604 VDD_DIG_FMAX_MAP1(LOW, 50000000),
605 CLK_INIT(blsp1_qup4_i2c_apps_clk_src.c),
606 },
607};
608
609static struct rcg_clk blsp1_qup4_spi_apps_clk_src = {
610 .cmd_rcgr_reg = BLSP1_QUP4_SPI_APPS_CMD_RCGR,
611 .set_rate = set_rate_mnd,
612 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
613 .current_freq = &rcg_dummy_freq,
614 .base = &virt_bases[GCC_BASE],
615 .c = {
616 .dbg_name = "blsp1_qup4_spi_apps_clk_src",
617 .ops = &clk_ops_rcg_mnd,
618 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
619 CLK_INIT(blsp1_qup4_spi_apps_clk_src.c),
620 },
621};
622
623static struct rcg_clk blsp1_qup5_i2c_apps_clk_src = {
624 .cmd_rcgr_reg = BLSP1_QUP5_I2C_APPS_CMD_RCGR,
625 .set_rate = set_rate_hid,
626 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
627 .current_freq = &rcg_dummy_freq,
628 .base = &virt_bases[GCC_BASE],
629 .c = {
630 .dbg_name = "blsp1_qup5_i2c_apps_clk_src",
631 .ops = &clk_ops_rcg,
632 VDD_DIG_FMAX_MAP1(LOW, 50000000),
633 CLK_INIT(blsp1_qup5_i2c_apps_clk_src.c),
634 },
635};
636
637static struct rcg_clk blsp1_qup5_spi_apps_clk_src = {
638 .cmd_rcgr_reg = BLSP1_QUP5_SPI_APPS_CMD_RCGR,
639 .set_rate = set_rate_mnd,
640 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
641 .current_freq = &rcg_dummy_freq,
642 .base = &virt_bases[GCC_BASE],
643 .c = {
644 .dbg_name = "blsp1_qup5_spi_apps_clk_src",
645 .ops = &clk_ops_rcg_mnd,
646 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
647 CLK_INIT(blsp1_qup5_spi_apps_clk_src.c),
648 },
649};
650
651static struct rcg_clk blsp1_qup6_i2c_apps_clk_src = {
652 .cmd_rcgr_reg = BLSP1_QUP6_I2C_APPS_CMD_RCGR,
653 .set_rate = set_rate_hid,
654 .freq_tbl = ftbl_gcc_blsp1_qup1_6_i2c_apps_clk,
655 .current_freq = &rcg_dummy_freq,
656 .base = &virt_bases[GCC_BASE],
657 .c = {
658 .dbg_name = "blsp1_qup6_i2c_apps_clk_src",
659 .ops = &clk_ops_rcg,
660 VDD_DIG_FMAX_MAP1(LOW, 50000000),
661 CLK_INIT(blsp1_qup6_i2c_apps_clk_src.c),
662 },
663};
664
665static struct rcg_clk blsp1_qup6_spi_apps_clk_src = {
666 .cmd_rcgr_reg = BLSP1_QUP6_SPI_APPS_CMD_RCGR,
667 .set_rate = set_rate_mnd,
668 .freq_tbl = ftbl_gcc_blsp1_qup1_6_spi_apps_clk,
669 .current_freq = &rcg_dummy_freq,
670 .base = &virt_bases[GCC_BASE],
671 .c = {
672 .dbg_name = "blsp1_qup6_spi_apps_clk_src",
673 .ops = &clk_ops_rcg_mnd,
674 VDD_DIG_FMAX_MAP2(LOW, 25000000, NOMINAL, 50000000),
675 CLK_INIT(blsp1_qup6_spi_apps_clk_src.c),
676 },
677};
678
679static struct clk_freq_tbl ftbl_gcc_blsp1_uart1_6_apps_clk[] = {
680 F_GCC( 3686400, gpll0, 1, 96, 15625),
681 F_GCC( 7372800, gpll0, 1, 192, 15625),
682 F_GCC( 14745600, gpll0, 1, 384, 15625),
683 F_GCC( 16000000, gpll0, 5, 2, 15),
684 F_GCC( 19200000, xo, 1, 0, 0),
685 F_GCC( 24000000, gpll0, 5, 1, 5),
686 F_GCC( 32000000, gpll0, 1, 4, 75),
687 F_GCC( 40000000, gpll0, 15, 0, 0),
688 F_GCC( 46400000, gpll0, 1, 29, 375),
689 F_GCC( 48000000, gpll0, 12.5, 0, 0),
690 F_GCC( 51200000, gpll0, 1, 32, 375),
691 F_GCC( 56000000, gpll0, 1, 7, 75),
692 F_GCC( 58982400, gpll0, 1, 1536, 15625),
693 F_GCC( 60000000, gpll0, 10, 0, 0),
694 F_END
695};
696
697static struct rcg_clk blsp1_uart1_apps_clk_src = {
698 .cmd_rcgr_reg = BLSP1_UART1_APPS_CMD_RCGR,
699 .set_rate = set_rate_mnd,
700 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
701 .current_freq = &rcg_dummy_freq,
702 .base = &virt_bases[GCC_BASE],
703 .c = {
704 .dbg_name = "blsp1_uart1_apps_clk_src",
705 .ops = &clk_ops_rcg_mnd,
706 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
707 CLK_INIT(blsp1_uart1_apps_clk_src.c),
708 },
709};
710
711static struct rcg_clk blsp1_uart2_apps_clk_src = {
712 .cmd_rcgr_reg = BLSP1_UART2_APPS_CMD_RCGR,
713 .set_rate = set_rate_mnd,
714 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
715 .current_freq = &rcg_dummy_freq,
716 .base = &virt_bases[GCC_BASE],
717 .c = {
718 .dbg_name = "blsp1_uart2_apps_clk_src",
719 .ops = &clk_ops_rcg_mnd,
720 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
721 CLK_INIT(blsp1_uart2_apps_clk_src.c),
722 },
723};
724
725static struct rcg_clk blsp1_uart3_apps_clk_src = {
726 .cmd_rcgr_reg = BLSP1_UART3_APPS_CMD_RCGR,
727 .set_rate = set_rate_mnd,
728 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
729 .current_freq = &rcg_dummy_freq,
730 .base = &virt_bases[GCC_BASE],
731 .c = {
732 .dbg_name = "blsp1_uart3_apps_clk_src",
733 .ops = &clk_ops_rcg_mnd,
734 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
735 CLK_INIT(blsp1_uart3_apps_clk_src.c),
736 },
737};
738
739static struct rcg_clk blsp1_uart4_apps_clk_src = {
740 .cmd_rcgr_reg = BLSP1_UART4_APPS_CMD_RCGR,
741 .set_rate = set_rate_mnd,
742 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
743 .current_freq = &rcg_dummy_freq,
744 .base = &virt_bases[GCC_BASE],
745 .c = {
746 .dbg_name = "blsp1_uart4_apps_clk_src",
747 .ops = &clk_ops_rcg_mnd,
748 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
749 CLK_INIT(blsp1_uart4_apps_clk_src.c),
750 },
751};
752
753static struct rcg_clk blsp1_uart5_apps_clk_src = {
754 .cmd_rcgr_reg = BLSP1_UART5_APPS_CMD_RCGR,
755 .set_rate = set_rate_mnd,
756 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
757 .current_freq = &rcg_dummy_freq,
758 .base = &virt_bases[GCC_BASE],
759 .c = {
760 .dbg_name = "blsp1_uart5_apps_clk_src",
761 .ops = &clk_ops_rcg_mnd,
762 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
763 CLK_INIT(blsp1_uart5_apps_clk_src.c),
764 },
765};
766
767static struct rcg_clk blsp1_uart6_apps_clk_src = {
768 .cmd_rcgr_reg = BLSP1_UART6_APPS_CMD_RCGR,
769 .set_rate = set_rate_mnd,
770 .freq_tbl = ftbl_gcc_blsp1_uart1_6_apps_clk,
771 .current_freq = &rcg_dummy_freq,
772 .base = &virt_bases[GCC_BASE],
773 .c = {
774 .dbg_name = "blsp1_uart6_apps_clk_src",
775 .ops = &clk_ops_rcg_mnd,
776 VDD_DIG_FMAX_MAP2(LOW, 31580000, NOMINAL, 63160000),
777 CLK_INIT(blsp1_uart6_apps_clk_src.c),
778 },
779};
780
781static struct clk_freq_tbl ftbl_gcc_ce1_clk[] = {
782 F_GCC( 50000000, gpll0, 12, 0, 0),
783 F_GCC( 100000000, gpll0, 6, 0, 0),
784 F_END
785};
786
787static struct rcg_clk ce1_clk_src = {
788 .cmd_rcgr_reg = CE1_CMD_RCGR,
789 .set_rate = set_rate_hid,
790 .freq_tbl = ftbl_gcc_ce1_clk,
791 .current_freq = &rcg_dummy_freq,
792 .base = &virt_bases[GCC_BASE],
793 .c = {
794 .dbg_name = "ce1_clk_src",
795 .ops = &clk_ops_rcg,
796 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
797 CLK_INIT(ce1_clk_src.c),
798 },
799};
800
801static struct clk_freq_tbl ftbl_gcc_gp1_3_clk[] = {
802 F_GCC( 19200000, xo, 1, 0, 0),
803 F_END
804};
805
806static struct rcg_clk gp1_clk_src = {
807 .cmd_rcgr_reg = GP1_CMD_RCGR,
808 .set_rate = set_rate_mnd,
809 .freq_tbl = ftbl_gcc_gp1_3_clk,
810 .current_freq = &rcg_dummy_freq,
811 .base = &virt_bases[GCC_BASE],
812 .c = {
813 .dbg_name = "gp1_clk_src",
814 .ops = &clk_ops_rcg_mnd,
815 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
816 CLK_INIT(gp1_clk_src.c),
817 },
818};
819
820static struct rcg_clk gp2_clk_src = {
821 .cmd_rcgr_reg = GP2_CMD_RCGR,
822 .set_rate = set_rate_mnd,
823 .freq_tbl = ftbl_gcc_gp1_3_clk,
824 .current_freq = &rcg_dummy_freq,
825 .base = &virt_bases[GCC_BASE],
826 .c = {
827 .dbg_name = "gp2_clk_src",
828 .ops = &clk_ops_rcg_mnd,
829 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
830 CLK_INIT(gp2_clk_src.c),
831 },
832};
833
834static struct rcg_clk gp3_clk_src = {
835 .cmd_rcgr_reg = GP3_CMD_RCGR,
836 .set_rate = set_rate_mnd,
837 .freq_tbl = ftbl_gcc_gp1_3_clk,
838 .current_freq = &rcg_dummy_freq,
839 .base = &virt_bases[GCC_BASE],
840 .c = {
841 .dbg_name = "gp3_clk_src",
842 .ops = &clk_ops_rcg_mnd,
843 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
844 CLK_INIT(gp3_clk_src.c),
845 },
846};
847
848static struct clk_freq_tbl ftbl_gcc_pdm2_clk[] = {
849 F_GCC( 60000000, gpll0, 10, 0, 0),
850 F_END
851};
852
853static struct rcg_clk pdm2_clk_src = {
854 .cmd_rcgr_reg = PDM2_CMD_RCGR,
855 .set_rate = set_rate_hid,
856 .freq_tbl = ftbl_gcc_pdm2_clk,
857 .current_freq = &rcg_dummy_freq,
858 .base = &virt_bases[GCC_BASE],
859 .c = {
860 .dbg_name = "pdm2_clk_src",
861 .ops = &clk_ops_rcg,
862 VDD_DIG_FMAX_MAP1(LOW, 60000000),
863 CLK_INIT(pdm2_clk_src.c),
864 },
865};
866
867static struct clk_freq_tbl ftbl_gcc_sdcc1_3_apps_clk[] = {
868 F_GCC( 144000, xo, 16, 3, 25),
869 F_GCC( 400000, xo, 12, 1, 4),
870 F_GCC( 20000000, gpll0, 15, 1, 2),
871 F_GCC( 25000000, gpll0, 12, 1, 2),
872 F_GCC( 50000000, gpll0, 12, 0, 0),
873 F_GCC( 100000000, gpll0, 6, 0, 0),
874 F_GCC( 200000000, gpll0, 3, 0, 0),
875 F_END
876};
877
878static struct rcg_clk sdcc1_apps_clk_src = {
879 .cmd_rcgr_reg = SDCC1_APPS_CMD_RCGR,
880 .set_rate = set_rate_mnd,
881 .freq_tbl = ftbl_gcc_sdcc1_3_apps_clk,
882 .current_freq = &rcg_dummy_freq,
883 .base = &virt_bases[GCC_BASE],
884 .c = {
885 .dbg_name = "sdcc1_apps_clk_src",
886 .ops = &clk_ops_rcg_mnd,
887 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
888 CLK_INIT(sdcc1_apps_clk_src.c),
889 },
890};
891
892static struct rcg_clk sdcc2_apps_clk_src = {
893 .cmd_rcgr_reg = SDCC2_APPS_CMD_RCGR,
894 .set_rate = set_rate_mnd,
895 .freq_tbl = ftbl_gcc_sdcc1_3_apps_clk,
896 .current_freq = &rcg_dummy_freq,
897 .base = &virt_bases[GCC_BASE],
898 .c = {
899 .dbg_name = "sdcc2_apps_clk_src",
900 .ops = &clk_ops_rcg_mnd,
901 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
902 CLK_INIT(sdcc2_apps_clk_src.c),
903 },
904};
905
906static struct rcg_clk sdcc3_apps_clk_src = {
907 .cmd_rcgr_reg = SDCC3_APPS_CMD_RCGR,
908 .set_rate = set_rate_mnd,
909 .freq_tbl = ftbl_gcc_sdcc1_3_apps_clk,
910 .current_freq = &rcg_dummy_freq,
911 .base = &virt_bases[GCC_BASE],
912 .c = {
913 .dbg_name = "sdcc3_apps_clk_src",
914 .ops = &clk_ops_rcg_mnd,
915 VDD_DIG_FMAX_MAP2(LOW, 50000000, NOMINAL, 100000000),
916 CLK_INIT(sdcc3_apps_clk_src.c),
917 },
918};
919
920static struct clk_freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
921 F_GCC( 75000000, gpll0, 8, 0, 0),
922 F_END
923};
924
925static struct rcg_clk usb_hs_system_clk_src = {
926 .cmd_rcgr_reg = USB_HS_SYSTEM_CMD_RCGR,
927 .set_rate = set_rate_hid,
928 .freq_tbl = ftbl_gcc_usb_hs_system_clk,
929 .current_freq = &rcg_dummy_freq,
930 .base = &virt_bases[GCC_BASE],
931 .c = {
932 .dbg_name = "usb_hs_system_clk_src",
933 .ops = &clk_ops_rcg,
934 VDD_DIG_FMAX_MAP2(LOW, 37500000, NOMINAL, 75000000),
935 CLK_INIT(usb_hs_system_clk_src.c),
936 },
937};
938
939static struct clk_freq_tbl ftbl_gcc_usb_hsic_clk[] = {
940 F_HSIC( 480000000, gpll1, 0, 0, 0),
941 F_END
942};
943
944static struct rcg_clk usb_hsic_clk_src = {
945 .cmd_rcgr_reg = USB_HSIC_CMD_RCGR,
946 .set_rate = set_rate_hid,
947 .freq_tbl = ftbl_gcc_usb_hsic_clk,
948 .current_freq = &rcg_dummy_freq,
949 .base = &virt_bases[GCC_BASE],
950 .c = {
951 .dbg_name = "usb_hsic_clk_src",
952 .ops = &clk_ops_rcg,
953 VDD_DIG_FMAX_MAP1(LOW, 480000000),
954 CLK_INIT(usb_hsic_clk_src.c),
955 },
956};
957
958static struct clk_freq_tbl ftbl_gcc_usb_hsic_io_cal_clk[] = {
959 F_GCC( 9600000, xo, 2, 0, 0),
960 F_END
961};
962
963static struct rcg_clk usb_hsic_io_cal_clk_src = {
964 .cmd_rcgr_reg = USB_HSIC_IO_CAL_CMD_RCGR,
965 .set_rate = set_rate_hid,
966 .freq_tbl = ftbl_gcc_usb_hsic_io_cal_clk,
967 .current_freq = &rcg_dummy_freq,
968 .base = &virt_bases[GCC_BASE],
969 .c = {
970 .dbg_name = "usb_hsic_io_cal_clk_src",
971 .ops = &clk_ops_rcg,
972 VDD_DIG_FMAX_MAP1(LOW, 9600000),
973 CLK_INIT(usb_hsic_io_cal_clk_src.c),
974 },
975};
976
977static struct clk_freq_tbl ftbl_gcc_usb_hsic_system_clk[] = {
978 F_GCC( 75000000, gpll0, 8, 0, 0),
979 F_END
980};
981
982static struct rcg_clk usb_hsic_system_clk_src = {
983 .cmd_rcgr_reg = USB_HSIC_SYSTEM_CMD_RCGR,
984 .set_rate = set_rate_hid,
985 .freq_tbl = ftbl_gcc_usb_hsic_system_clk,
986 .current_freq = &rcg_dummy_freq,
987 .base = &virt_bases[GCC_BASE],
988 .c = {
989 .dbg_name = "usb_hsic_system_clk_src",
990 .ops = &clk_ops_rcg,
991 VDD_DIG_FMAX_MAP2(LOW, 37500000, NOMINAL, 75000000),
992 CLK_INIT(usb_hsic_system_clk_src.c),
993 },
994};
995
996static struct local_vote_clk gcc_bam_dma_ahb_clk = {
997 .cbcr_reg = BAM_DMA_AHB_CBCR,
998 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
999 .en_mask = BIT(12),
1000 .base = &virt_bases[GCC_BASE],
1001 .c = {
1002 .dbg_name = "gcc_bam_dma_ahb_clk",
1003 .ops = &clk_ops_vote,
1004 CLK_INIT(gcc_bam_dma_ahb_clk.c),
1005 },
1006};
1007
1008static struct local_vote_clk gcc_blsp1_ahb_clk = {
1009 .cbcr_reg = BLSP1_AHB_CBCR,
1010 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1011 .en_mask = BIT(17),
1012 .base = &virt_bases[GCC_BASE],
1013 .c = {
1014 .dbg_name = "gcc_blsp1_ahb_clk",
1015 .ops = &clk_ops_vote,
1016 CLK_INIT(gcc_blsp1_ahb_clk.c),
1017 },
1018};
1019
1020static struct branch_clk gcc_blsp1_qup1_i2c_apps_clk = {
1021 .cbcr_reg = BLSP1_QUP1_I2C_APPS_CBCR,
1022 .has_sibling = 0,
1023 .base = &virt_bases[GCC_BASE],
1024 .c = {
1025 .dbg_name = "gcc_blsp1_qup1_i2c_apps_clk",
1026 .parent = &blsp1_qup1_i2c_apps_clk_src.c,
1027 .ops = &clk_ops_branch,
1028 CLK_INIT(gcc_blsp1_qup1_i2c_apps_clk.c),
1029 },
1030};
1031
1032static struct branch_clk gcc_blsp1_qup1_spi_apps_clk = {
1033 .cbcr_reg = BLSP1_QUP1_SPI_APPS_CBCR,
1034 .has_sibling = 0,
1035 .base = &virt_bases[GCC_BASE],
1036 .c = {
1037 .dbg_name = "gcc_blsp1_qup1_spi_apps_clk",
1038 .parent = &blsp1_qup1_spi_apps_clk_src.c,
1039 .ops = &clk_ops_branch,
1040 CLK_INIT(gcc_blsp1_qup1_spi_apps_clk.c),
1041 },
1042};
1043
1044static struct branch_clk gcc_blsp1_qup2_i2c_apps_clk = {
1045 .cbcr_reg = BLSP1_QUP2_I2C_APPS_CBCR,
1046 .has_sibling = 0,
1047 .base = &virt_bases[GCC_BASE],
1048 .c = {
1049 .dbg_name = "gcc_blsp1_qup2_i2c_apps_clk",
1050 .parent = &blsp1_qup2_i2c_apps_clk_src.c,
1051 .ops = &clk_ops_branch,
1052 CLK_INIT(gcc_blsp1_qup2_i2c_apps_clk.c),
1053 },
1054};
1055
1056static struct branch_clk gcc_blsp1_qup2_spi_apps_clk = {
1057 .cbcr_reg = BLSP1_QUP2_SPI_APPS_CBCR,
1058 .has_sibling = 0,
1059 .base = &virt_bases[GCC_BASE],
1060 .c = {
1061 .dbg_name = "gcc_blsp1_qup2_spi_apps_clk",
1062 .parent = &blsp1_qup2_spi_apps_clk_src.c,
1063 .ops = &clk_ops_branch,
1064 CLK_INIT(gcc_blsp1_qup2_spi_apps_clk.c),
1065 },
1066};
1067
1068static struct branch_clk gcc_blsp1_qup3_i2c_apps_clk = {
1069 .cbcr_reg = BLSP1_QUP3_I2C_APPS_CBCR,
1070 .has_sibling = 0,
1071 .base = &virt_bases[GCC_BASE],
1072 .c = {
1073 .dbg_name = "gcc_blsp1_qup3_i2c_apps_clk",
1074 .parent = &blsp1_qup3_i2c_apps_clk_src.c,
1075 .ops = &clk_ops_branch,
1076 CLK_INIT(gcc_blsp1_qup3_i2c_apps_clk.c),
1077 },
1078};
1079
1080static struct branch_clk gcc_blsp1_qup3_spi_apps_clk = {
1081 .cbcr_reg = BLSP1_QUP3_SPI_APPS_CBCR,
1082 .has_sibling = 0,
1083 .base = &virt_bases[GCC_BASE],
1084 .c = {
1085 .dbg_name = "gcc_blsp1_qup3_spi_apps_clk",
1086 .parent = &blsp1_qup3_spi_apps_clk_src.c,
1087 .ops = &clk_ops_branch,
1088 CLK_INIT(gcc_blsp1_qup3_spi_apps_clk.c),
1089 },
1090};
1091
1092static struct branch_clk gcc_blsp1_qup4_i2c_apps_clk = {
1093 .cbcr_reg = BLSP1_QUP4_I2C_APPS_CBCR,
1094 .has_sibling = 0,
1095 .base = &virt_bases[GCC_BASE],
1096 .c = {
1097 .dbg_name = "gcc_blsp1_qup4_i2c_apps_clk",
1098 .parent = &blsp1_qup4_i2c_apps_clk_src.c,
1099 .ops = &clk_ops_branch,
1100 CLK_INIT(gcc_blsp1_qup4_i2c_apps_clk.c),
1101 },
1102};
1103
1104static struct branch_clk gcc_blsp1_qup4_spi_apps_clk = {
1105 .cbcr_reg = BLSP1_QUP4_SPI_APPS_CBCR,
1106 .has_sibling = 0,
1107 .base = &virt_bases[GCC_BASE],
1108 .c = {
1109 .dbg_name = "gcc_blsp1_qup4_spi_apps_clk",
1110 .parent = &blsp1_qup4_spi_apps_clk_src.c,
1111 .ops = &clk_ops_branch,
1112 CLK_INIT(gcc_blsp1_qup4_spi_apps_clk.c),
1113 },
1114};
1115
1116static struct branch_clk gcc_blsp1_qup5_i2c_apps_clk = {
1117 .cbcr_reg = BLSP1_QUP5_I2C_APPS_CBCR,
1118 .has_sibling = 0,
1119 .base = &virt_bases[GCC_BASE],
1120 .c = {
1121 .dbg_name = "gcc_blsp1_qup5_i2c_apps_clk",
1122 .parent = &blsp1_qup5_i2c_apps_clk_src.c,
1123 .ops = &clk_ops_branch,
1124 CLK_INIT(gcc_blsp1_qup5_i2c_apps_clk.c),
1125 },
1126};
1127
1128static struct branch_clk gcc_blsp1_qup5_spi_apps_clk = {
1129 .cbcr_reg = BLSP1_QUP5_SPI_APPS_CBCR,
1130 .has_sibling = 0,
1131 .base = &virt_bases[GCC_BASE],
1132 .c = {
1133 .dbg_name = "gcc_blsp1_qup5_spi_apps_clk",
1134 .parent = &blsp1_qup5_spi_apps_clk_src.c,
1135 .ops = &clk_ops_branch,
1136 CLK_INIT(gcc_blsp1_qup5_spi_apps_clk.c),
1137 },
1138};
1139
1140static struct branch_clk gcc_blsp1_qup6_i2c_apps_clk = {
1141 .cbcr_reg = BLSP1_QUP6_I2C_APPS_CBCR,
1142 .has_sibling = 0,
1143 .base = &virt_bases[GCC_BASE],
1144 .c = {
1145 .dbg_name = "gcc_blsp1_qup6_i2c_apps_clk",
1146 .parent = &blsp1_qup6_i2c_apps_clk_src.c,
1147 .ops = &clk_ops_branch,
1148 CLK_INIT(gcc_blsp1_qup6_i2c_apps_clk.c),
1149 },
1150};
1151
1152static struct branch_clk gcc_blsp1_qup6_spi_apps_clk = {
1153 .cbcr_reg = BLSP1_QUP6_SPI_APPS_CBCR,
1154 .has_sibling = 0,
1155 .base = &virt_bases[GCC_BASE],
1156 .c = {
1157 .dbg_name = "gcc_blsp1_qup6_spi_apps_clk",
1158 .parent = &blsp1_qup6_spi_apps_clk_src.c,
1159 .ops = &clk_ops_branch,
1160 CLK_INIT(gcc_blsp1_qup6_spi_apps_clk.c),
1161 },
1162};
1163
1164static struct branch_clk gcc_blsp1_uart1_apps_clk = {
1165 .cbcr_reg = BLSP1_UART1_APPS_CBCR,
1166 .has_sibling = 0,
1167 .base = &virt_bases[GCC_BASE],
1168 .c = {
1169 .dbg_name = "gcc_blsp1_uart1_apps_clk",
1170 .parent = &blsp1_uart1_apps_clk_src.c,
1171 .ops = &clk_ops_branch,
1172 CLK_INIT(gcc_blsp1_uart1_apps_clk.c),
1173 },
1174};
1175
1176static struct branch_clk gcc_blsp1_uart2_apps_clk = {
1177 .cbcr_reg = BLSP1_UART2_APPS_CBCR,
1178 .has_sibling = 0,
1179 .base = &virt_bases[GCC_BASE],
1180 .c = {
1181 .dbg_name = "gcc_blsp1_uart2_apps_clk",
1182 .parent = &blsp1_uart2_apps_clk_src.c,
1183 .ops = &clk_ops_branch,
1184 CLK_INIT(gcc_blsp1_uart2_apps_clk.c),
1185 },
1186};
1187
1188static struct branch_clk gcc_blsp1_uart3_apps_clk = {
1189 .cbcr_reg = BLSP1_UART3_APPS_CBCR,
1190 .has_sibling = 0,
1191 .base = &virt_bases[GCC_BASE],
1192 .c = {
1193 .dbg_name = "gcc_blsp1_uart3_apps_clk",
1194 .parent = &blsp1_uart3_apps_clk_src.c,
1195 .ops = &clk_ops_branch,
1196 CLK_INIT(gcc_blsp1_uart3_apps_clk.c),
1197 },
1198};
1199
1200static struct branch_clk gcc_blsp1_uart4_apps_clk = {
1201 .cbcr_reg = BLSP1_UART4_APPS_CBCR,
1202 .has_sibling = 0,
1203 .base = &virt_bases[GCC_BASE],
1204 .c = {
1205 .dbg_name = "gcc_blsp1_uart4_apps_clk",
1206 .parent = &blsp1_uart4_apps_clk_src.c,
1207 .ops = &clk_ops_branch,
1208 CLK_INIT(gcc_blsp1_uart4_apps_clk.c),
1209 },
1210};
1211
1212static struct branch_clk gcc_blsp1_uart5_apps_clk = {
1213 .cbcr_reg = BLSP1_UART5_APPS_CBCR,
1214 .has_sibling = 0,
1215 .base = &virt_bases[GCC_BASE],
1216 .c = {
1217 .dbg_name = "gcc_blsp1_uart5_apps_clk",
1218 .parent = &blsp1_uart5_apps_clk_src.c,
1219 .ops = &clk_ops_branch,
1220 CLK_INIT(gcc_blsp1_uart5_apps_clk.c),
1221 },
1222};
1223
1224static struct branch_clk gcc_blsp1_uart6_apps_clk = {
1225 .cbcr_reg = BLSP1_UART6_APPS_CBCR,
1226 .has_sibling = 0,
1227 .base = &virt_bases[GCC_BASE],
1228 .c = {
1229 .dbg_name = "gcc_blsp1_uart6_apps_clk",
1230 .parent = &blsp1_uart6_apps_clk_src.c,
1231 .ops = &clk_ops_branch,
1232 CLK_INIT(gcc_blsp1_uart6_apps_clk.c),
1233 },
1234};
1235
1236static struct local_vote_clk gcc_boot_rom_ahb_clk = {
1237 .cbcr_reg = BOOT_ROM_AHB_CBCR,
1238 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1239 .en_mask = BIT(10),
1240 .base = &virt_bases[GCC_BASE],
1241 .c = {
1242 .dbg_name = "gcc_boot_rom_ahb_clk",
1243 .ops = &clk_ops_vote,
1244 CLK_INIT(gcc_boot_rom_ahb_clk.c),
1245 },
1246};
1247
1248static struct local_vote_clk gcc_ce1_ahb_clk = {
1249 .cbcr_reg = CE1_AHB_CBCR,
1250 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1251 .en_mask = BIT(3),
1252 .base = &virt_bases[GCC_BASE],
1253 .c = {
1254 .dbg_name = "gcc_ce1_ahb_clk",
1255 .ops = &clk_ops_vote,
1256 CLK_INIT(gcc_ce1_ahb_clk.c),
1257 },
1258};
1259
1260static struct local_vote_clk gcc_ce1_axi_clk = {
1261 .cbcr_reg = CE1_AXI_CBCR,
1262 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1263 .en_mask = BIT(4),
1264 .base = &virt_bases[GCC_BASE],
1265 .c = {
1266 .dbg_name = "gcc_ce1_axi_clk",
1267 .ops = &clk_ops_vote,
1268 CLK_INIT(gcc_ce1_axi_clk.c),
1269 },
1270};
1271
1272static struct local_vote_clk gcc_ce1_clk = {
1273 .cbcr_reg = CE1_CBCR,
1274 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1275 .en_mask = BIT(5),
1276 .base = &virt_bases[GCC_BASE],
1277 .c = {
1278 .dbg_name = "gcc_ce1_clk",
1279 .ops = &clk_ops_vote,
1280 CLK_INIT(gcc_ce1_clk.c),
1281 },
1282};
1283
1284static struct branch_clk gcc_gp1_clk = {
1285 .cbcr_reg = GP1_CBCR,
1286 .has_sibling = 0,
1287 .base = &virt_bases[GCC_BASE],
1288 .c = {
1289 .dbg_name = "gcc_gp1_clk",
1290 .parent = &gp1_clk_src.c,
1291 .ops = &clk_ops_branch,
1292 CLK_INIT(gcc_gp1_clk.c),
1293 },
1294};
1295
1296static struct branch_clk gcc_gp2_clk = {
1297 .cbcr_reg = GP2_CBCR,
1298 .has_sibling = 0,
1299 .base = &virt_bases[GCC_BASE],
1300 .c = {
1301 .dbg_name = "gcc_gp2_clk",
1302 .parent = &gp2_clk_src.c,
1303 .ops = &clk_ops_branch,
1304 CLK_INIT(gcc_gp2_clk.c),
1305 },
1306};
1307
1308static struct branch_clk gcc_gp3_clk = {
1309 .cbcr_reg = GP3_CBCR,
1310 .has_sibling = 0,
1311 .base = &virt_bases[GCC_BASE],
1312 .c = {
1313 .dbg_name = "gcc_gp3_clk",
1314 .parent = &gp3_clk_src.c,
1315 .ops = &clk_ops_branch,
1316 CLK_INIT(gcc_gp3_clk.c),
1317 },
1318};
1319
1320static struct branch_clk gcc_lpass_q6_axi_clk = {
1321 .cbcr_reg = LPASS_Q6_AXI_CBCR,
1322 .has_sibling = 1,
1323 .base = &virt_bases[GCC_BASE],
1324 .c = {
1325 .dbg_name = "gcc_lpass_q6_axi_clk",
1326 .ops = &clk_ops_branch,
1327 CLK_INIT(gcc_lpass_q6_axi_clk.c),
1328 },
1329};
1330
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001331static struct branch_clk gcc_mss_cfg_ahb_clk = {
1332 .cbcr_reg = MSS_CFG_AHB_CBCR,
1333 .has_sibling = 1,
1334 .base = &virt_bases[GCC_BASE],
1335 .c = {
1336 .dbg_name = "gcc_mss_cfg_ahb_clk",
1337 .ops = &clk_ops_branch,
1338 CLK_INIT(gcc_mss_cfg_ahb_clk.c),
1339 },
1340};
1341
1342static struct branch_clk gcc_mss_q6_bimc_axi_clk = {
1343 .cbcr_reg = MSS_Q6_BIMC_AXI_CBCR,
1344 .has_sibling = 1,
1345 .base = &virt_bases[GCC_BASE],
1346 .c = {
1347 .dbg_name = "gcc_mss_q6_bimc_axi_clk",
1348 .ops = &clk_ops_branch,
1349 CLK_INIT(gcc_mss_q6_bimc_axi_clk.c),
1350 },
1351};
1352
1353static struct branch_clk gcc_noc_conf_xpu_ahb_clk = {
1354 .cbcr_reg = NOC_CONF_XPU_AHB_CBCR,
1355 .has_sibling = 1,
1356 .base = &virt_bases[GCC_BASE],
1357 .c = {
1358 .dbg_name = "gcc_noc_conf_xpu_ahb_clk",
1359 .ops = &clk_ops_branch,
1360 CLK_INIT(gcc_noc_conf_xpu_ahb_clk.c),
1361 },
1362};
1363
1364static struct branch_clk gcc_pdm2_clk = {
1365 .cbcr_reg = PDM2_CBCR,
1366 .has_sibling = 0,
1367 .base = &virt_bases[GCC_BASE],
1368 .c = {
1369 .dbg_name = "gcc_pdm2_clk",
1370 .parent = &pdm2_clk_src.c,
1371 .ops = &clk_ops_branch,
1372 CLK_INIT(gcc_pdm2_clk.c),
1373 },
1374};
1375
1376static struct branch_clk gcc_pdm_ahb_clk = {
1377 .cbcr_reg = PDM_AHB_CBCR,
1378 .has_sibling = 1,
1379 .base = &virt_bases[GCC_BASE],
1380 .c = {
1381 .dbg_name = "gcc_pdm_ahb_clk",
1382 .ops = &clk_ops_branch,
1383 CLK_INIT(gcc_pdm_ahb_clk.c),
1384 },
1385};
1386
1387static struct branch_clk gcc_pdm_xo4_clk = {
1388 .cbcr_reg = PDM_XO4_CBCR,
1389 .has_sibling = 1,
1390 .base = &virt_bases[GCC_BASE],
1391 .c = {
1392 .dbg_name = "gcc_pdm_xo4_clk",
1393 .parent = &xo.c,
1394 .ops = &clk_ops_branch,
1395 CLK_INIT(gcc_pdm_xo4_clk.c),
1396 },
1397};
1398
1399static struct branch_clk gcc_periph_noc_ahb_clk = {
1400 .cbcr_reg = PERIPH_NOC_AHB_CBCR,
1401 .has_sibling = 1,
1402 .base = &virt_bases[GCC_BASE],
1403 .c = {
1404 .dbg_name = "gcc_periph_noc_ahb_clk",
1405 .ops = &clk_ops_branch,
1406 CLK_INIT(gcc_periph_noc_ahb_clk.c),
1407 },
1408};
1409
1410static struct local_vote_clk gcc_prng_ahb_clk = {
1411 .cbcr_reg = PRNG_AHB_CBCR,
1412 .vote_reg = APCS_CLOCK_BRANCH_ENA_VOTE,
1413 .en_mask = BIT(13),
1414 .base = &virt_bases[GCC_BASE],
1415 .c = {
1416 .dbg_name = "gcc_prng_ahb_clk",
1417 .ops = &clk_ops_vote,
1418 CLK_INIT(gcc_prng_ahb_clk.c),
1419 },
1420};
1421
1422static struct branch_clk gcc_sdcc1_ahb_clk = {
1423 .cbcr_reg = SDCC1_AHB_CBCR,
1424 .has_sibling = 1,
1425 .base = &virt_bases[GCC_BASE],
1426 .c = {
1427 .dbg_name = "gcc_sdcc1_ahb_clk",
1428 .ops = &clk_ops_branch,
1429 CLK_INIT(gcc_sdcc1_ahb_clk.c),
1430 },
1431};
1432
1433static struct branch_clk gcc_sdcc1_apps_clk = {
1434 .cbcr_reg = SDCC1_APPS_CBCR,
1435 .has_sibling = 0,
1436 .base = &virt_bases[GCC_BASE],
1437 .c = {
1438 .dbg_name = "gcc_sdcc1_apps_clk",
1439 .parent = &sdcc1_apps_clk_src.c,
1440 .ops = &clk_ops_branch,
1441 CLK_INIT(gcc_sdcc1_apps_clk.c),
1442 },
1443};
1444
1445static struct branch_clk gcc_sdcc2_ahb_clk = {
1446 .cbcr_reg = SDCC2_AHB_CBCR,
1447 .has_sibling = 1,
1448 .base = &virt_bases[GCC_BASE],
1449 .c = {
1450 .dbg_name = "gcc_sdcc2_ahb_clk",
1451 .ops = &clk_ops_branch,
1452 CLK_INIT(gcc_sdcc2_ahb_clk.c),
1453 },
1454};
1455
1456static struct branch_clk gcc_sdcc2_apps_clk = {
1457 .cbcr_reg = SDCC2_APPS_CBCR,
1458 .has_sibling = 0,
1459 .base = &virt_bases[GCC_BASE],
1460 .c = {
1461 .dbg_name = "gcc_sdcc2_apps_clk",
1462 .parent = &sdcc2_apps_clk_src.c,
1463 .ops = &clk_ops_branch,
1464 CLK_INIT(gcc_sdcc2_apps_clk.c),
1465 },
1466};
1467
1468static struct branch_clk gcc_sdcc3_ahb_clk = {
1469 .cbcr_reg = SDCC3_AHB_CBCR,
1470 .has_sibling = 1,
1471 .base = &virt_bases[GCC_BASE],
1472 .c = {
1473 .dbg_name = "gcc_sdcc3_ahb_clk",
1474 .ops = &clk_ops_branch,
1475 CLK_INIT(gcc_sdcc3_ahb_clk.c),
1476 },
1477};
1478
1479static struct branch_clk gcc_sdcc3_apps_clk = {
1480 .cbcr_reg = SDCC3_APPS_CBCR,
1481 .has_sibling = 0,
1482 .base = &virt_bases[GCC_BASE],
1483 .c = {
1484 .dbg_name = "gcc_sdcc3_apps_clk",
1485 .parent = &sdcc3_apps_clk_src.c,
1486 .ops = &clk_ops_branch,
1487 CLK_INIT(gcc_sdcc3_apps_clk.c),
1488 },
1489};
1490
1491static struct branch_clk gcc_usb2a_phy_sleep_clk = {
1492 .cbcr_reg = USB2A_PHY_SLEEP_CBCR,
1493 .has_sibling = 1,
1494 .base = &virt_bases[GCC_BASE],
1495 .c = {
1496 .dbg_name = "gcc_usb2a_phy_sleep_clk",
1497 .ops = &clk_ops_branch,
1498 CLK_INIT(gcc_usb2a_phy_sleep_clk.c),
1499 },
1500};
1501
1502static struct branch_clk gcc_usb_hs_ahb_clk = {
1503 .cbcr_reg = USB_HS_AHB_CBCR,
1504 .has_sibling = 1,
1505 .base = &virt_bases[GCC_BASE],
1506 .c = {
1507 .dbg_name = "gcc_usb_hs_ahb_clk",
1508 .ops = &clk_ops_branch,
1509 CLK_INIT(gcc_usb_hs_ahb_clk.c),
1510 },
1511};
1512
1513static struct branch_clk gcc_usb_hs_system_clk = {
1514 .cbcr_reg = USB_HS_SYSTEM_CBCR,
1515 .has_sibling = 0,
1516 .bcr_reg = USB_HS_BCR,
1517 .base = &virt_bases[GCC_BASE],
1518 .c = {
1519 .dbg_name = "gcc_usb_hs_system_clk",
1520 .parent = &usb_hs_system_clk_src.c,
1521 .ops = &clk_ops_branch,
1522 CLK_INIT(gcc_usb_hs_system_clk.c),
1523 },
1524};
1525
1526static struct branch_clk gcc_usb_hsic_ahb_clk = {
1527 .cbcr_reg = USB_HSIC_AHB_CBCR,
1528 .has_sibling = 1,
1529 .base = &virt_bases[GCC_BASE],
1530 .c = {
1531 .dbg_name = "gcc_usb_hsic_ahb_clk",
1532 .ops = &clk_ops_branch,
1533 CLK_INIT(gcc_usb_hsic_ahb_clk.c),
1534 },
1535};
1536
1537static struct branch_clk gcc_usb_hsic_clk = {
1538 .cbcr_reg = USB_HSIC_CBCR,
1539 .has_sibling = 0,
1540 .bcr_reg = USB_HS_HSIC_BCR,
1541 .base = &virt_bases[GCC_BASE],
1542 .c = {
1543 .dbg_name = "gcc_usb_hsic_clk",
1544 .parent = &usb_hsic_clk_src.c,
1545 .ops = &clk_ops_branch,
1546 CLK_INIT(gcc_usb_hsic_clk.c),
1547 },
1548};
1549
1550static struct branch_clk gcc_usb_hsic_io_cal_clk = {
1551 .cbcr_reg = USB_HSIC_IO_CAL_CBCR,
1552 .has_sibling = 0,
1553 .base = &virt_bases[GCC_BASE],
1554 .c = {
1555 .dbg_name = "gcc_usb_hsic_io_cal_clk",
1556 .parent = &usb_hsic_io_cal_clk_src.c,
1557 .ops = &clk_ops_branch,
1558 CLK_INIT(gcc_usb_hsic_io_cal_clk.c),
1559 },
1560};
1561
1562static struct branch_clk gcc_usb_hsic_system_clk = {
1563 .cbcr_reg = USB_HSIC_SYSTEM_CBCR,
1564 .has_sibling = 0,
1565 .bcr_reg = USB_HS_HSIC_BCR,
1566 .base = &virt_bases[GCC_BASE],
1567 .c = {
1568 .dbg_name = "gcc_usb_hsic_system_clk",
1569 .parent = &usb_hsic_system_clk_src.c,
1570 .ops = &clk_ops_branch,
1571 CLK_INIT(gcc_usb_hsic_system_clk.c),
1572 },
1573};
1574
1575static struct measure_mux_entry measure_mux_GCC[] = {
1576 { &gcc_periph_noc_ahb_clk.c, GCC_BASE, 0x0010 },
1577 { &gcc_noc_conf_xpu_ahb_clk.c, GCC_BASE, 0x0018 },
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001578 { &gcc_mss_cfg_ahb_clk.c, GCC_BASE, 0x0030 },
1579 { &gcc_mss_q6_bimc_axi_clk.c, GCC_BASE, 0x0031 },
1580 { &gcc_usb_hsic_ahb_clk.c, GCC_BASE, 0x0058 },
1581 { &gcc_usb_hsic_system_clk.c, GCC_BASE, 0x0059 },
1582 { &gcc_usb_hsic_clk.c, GCC_BASE, 0x005a },
1583 { &gcc_usb_hsic_io_cal_clk.c, GCC_BASE, 0x005b },
1584 { &gcc_usb_hs_system_clk.c, GCC_BASE, 0x0060 },
1585 { &gcc_usb_hs_ahb_clk.c, GCC_BASE, 0x0061 },
1586 { &gcc_usb2a_phy_sleep_clk.c, GCC_BASE, 0x0063 },
1587 { &gcc_sdcc1_apps_clk.c, GCC_BASE, 0x0068 },
1588 { &gcc_sdcc1_ahb_clk.c, GCC_BASE, 0x0069 },
1589 { &gcc_sdcc2_apps_clk.c, GCC_BASE, 0x0070 },
1590 { &gcc_sdcc2_ahb_clk.c, GCC_BASE, 0x0071 },
1591 { &gcc_sdcc3_apps_clk.c, GCC_BASE, 0x0078 },
1592 { &gcc_sdcc3_ahb_clk.c, GCC_BASE, 0x0079 },
1593 { &gcc_blsp1_ahb_clk.c, GCC_BASE, 0x0088 },
1594 { &gcc_blsp1_qup1_spi_apps_clk.c, GCC_BASE, 0x008a },
1595 { &gcc_blsp1_qup1_i2c_apps_clk.c, GCC_BASE, 0x008b },
1596 { &gcc_blsp1_uart1_apps_clk.c, GCC_BASE, 0x008c },
1597 { &gcc_blsp1_qup2_spi_apps_clk.c, GCC_BASE, 0x008e },
1598 { &gcc_blsp1_qup2_i2c_apps_clk.c, GCC_BASE, 0x0090 },
1599 { &gcc_blsp1_uart2_apps_clk.c, GCC_BASE, 0x0091 },
1600 { &gcc_blsp1_qup3_spi_apps_clk.c, GCC_BASE, 0x0093 },
1601 { &gcc_blsp1_qup3_i2c_apps_clk.c, GCC_BASE, 0x0094 },
1602 { &gcc_blsp1_uart3_apps_clk.c, GCC_BASE, 0x0095 },
1603 { &gcc_blsp1_qup4_spi_apps_clk.c, GCC_BASE, 0x0098 },
1604 { &gcc_blsp1_qup4_i2c_apps_clk.c, GCC_BASE, 0x0099 },
1605 { &gcc_blsp1_uart4_apps_clk.c, GCC_BASE, 0x009a },
1606 { &gcc_blsp1_qup5_spi_apps_clk.c, GCC_BASE, 0x009c },
1607 { &gcc_blsp1_qup5_i2c_apps_clk.c, GCC_BASE, 0x009d },
1608 { &gcc_blsp1_uart5_apps_clk.c, GCC_BASE, 0x009e },
1609 { &gcc_blsp1_qup6_spi_apps_clk.c, GCC_BASE, 0x00a1 },
1610 { &gcc_blsp1_qup6_i2c_apps_clk.c, GCC_BASE, 0x00a2 },
1611 { &gcc_blsp1_uart6_apps_clk.c, GCC_BASE, 0x00a3 },
1612 { &gcc_pdm_ahb_clk.c, GCC_BASE, 0x00d0 },
1613 { &gcc_pdm_xo4_clk.c, GCC_BASE, 0x00d1 },
1614 { &gcc_pdm2_clk.c, GCC_BASE, 0x00d2 },
1615 { &gcc_prng_ahb_clk.c, GCC_BASE, 0x00d8 },
1616 { &gcc_bam_dma_ahb_clk.c, GCC_BASE, 0x00e0 },
1617 { &gcc_boot_rom_ahb_clk.c, GCC_BASE, 0x00f8 },
1618 { &gcc_ce1_clk.c, GCC_BASE, 0x0138 },
1619 { &gcc_ce1_axi_clk.c, GCC_BASE, 0x0139 },
1620 { &gcc_ce1_ahb_clk.c, GCC_BASE, 0x013a },
1621 { &gcc_lpass_q6_axi_clk.c, GCC_BASE, 0x0160 },
1622 {&dummy_clk, N_BASES, 0x0000},
1623};
1624
1625static struct pll_vote_clk mmpll0_pll = {
1626 .en_reg = (void __iomem *)MMSS_PLL_VOTE_APCS,
1627 .en_mask = BIT(0),
1628 .status_reg = (void __iomem *)MMPLL0_PLL_STATUS,
1629 .status_mask = BIT(17),
1630 .base = &virt_bases[MMSS_BASE],
1631 .c = {
1632 .rate = 800000000,
1633 .parent = &xo.c,
1634 .dbg_name = "mmpll0_pll",
1635 .ops = &clk_ops_pll_vote,
1636 CLK_INIT(mmpll0_pll.c),
1637 },
1638};
1639
1640static struct pll_vote_clk mmpll1_pll = {
1641 .en_reg = (void __iomem *)MMSS_PLL_VOTE_APCS,
1642 .en_mask = BIT(1),
1643 .status_reg = (void __iomem *)MMPLL1_PLL_STATUS,
1644 .status_mask = BIT(17),
1645 .base = &virt_bases[MMSS_BASE],
1646 .c = {
1647 .rate = 1000000000,
1648 .parent = &xo.c,
1649 .dbg_name = "mmpll1_pll",
1650 .ops = &clk_ops_pll_vote,
1651 CLK_INIT(mmpll1_pll.c),
1652 },
1653};
1654
1655static struct clk_freq_tbl ftbl_mmss_mmssnoc_axi_clk[] = {
1656 F_MMSS( 19200000, xo, 1, 0, 0),
1657 F_MMSS( 37500000, gpll0, 16, 0, 0),
1658 F_MMSS( 50000000, gpll0, 12, 0, 0),
1659 F_MMSS( 75000000, gpll0, 8, 0, 0),
1660 F_MMSS( 100000000, gpll0, 6, 0, 0),
1661 F_MMSS( 150000000, gpll0, 4, 0, 0),
1662 F_MMSS( 200000000, mmpll0_pll, 4, 0, 0),
pfang948c93e2013-03-20 17:04:18 -07001663 F_MMSS( 266666666, mmpll0_pll, 3, 0, 0),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001664 F_END
1665};
1666
1667static struct rcg_clk axi_clk_src = {
1668 .cmd_rcgr_reg = AXI_CMD_RCGR,
1669 .set_rate = set_rate_hid,
1670 .freq_tbl = ftbl_mmss_mmssnoc_axi_clk,
1671 .current_freq = &rcg_dummy_freq,
1672 .base = &virt_bases[MMSS_BASE],
1673 .c = {
1674 .dbg_name = "axi_clk_src",
1675 .ops = &clk_ops_rcg,
1676 VDD_DIG_FMAX_MAP3(LOW, 100000000, NOMINAL, 200000000, HIGH,
Patrick Dalye02a5632013-02-12 20:23:35 -08001677 266670000),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001678 CLK_INIT(axi_clk_src.c),
1679 },
1680};
1681
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001682static struct clk_freq_tbl ftbl_camss_csi0_1_clk[] = {
1683 F_MMSS( 100000000, gpll0, 6, 0, 0),
1684 F_MMSS( 200000000, mmpll0_pll, 4, 0, 0),
1685 F_END
1686};
1687
1688static struct rcg_clk csi0_clk_src = {
1689 .cmd_rcgr_reg = CSI0_CMD_RCGR,
1690 .set_rate = set_rate_hid,
1691 .freq_tbl = ftbl_camss_csi0_1_clk,
1692 .current_freq = &rcg_dummy_freq,
1693 .base = &virt_bases[MMSS_BASE],
1694 .c = {
1695 .dbg_name = "csi0_clk_src",
1696 .ops = &clk_ops_rcg,
1697 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1698 CLK_INIT(csi0_clk_src.c),
1699 },
1700};
1701
1702static struct rcg_clk csi1_clk_src = {
1703 .cmd_rcgr_reg = CSI1_CMD_RCGR,
1704 .set_rate = set_rate_hid,
1705 .freq_tbl = ftbl_camss_csi0_1_clk,
1706 .current_freq = &rcg_dummy_freq,
1707 .base = &virt_bases[MMSS_BASE],
1708 .c = {
1709 .dbg_name = "csi1_clk_src",
1710 .ops = &clk_ops_rcg,
1711 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1712 CLK_INIT(csi1_clk_src.c),
1713 },
1714};
1715
1716static struct clk_freq_tbl ftbl_camss_vfe_vfe0_clk[] = {
1717 F_MMSS( 37500000, gpll0, 16, 0, 0),
1718 F_MMSS( 50000000, gpll0, 12, 0, 0),
1719 F_MMSS( 60000000, gpll0, 10, 0, 0),
1720 F_MMSS( 80000000, gpll0, 7.5, 0, 0),
1721 F_MMSS( 100000000, gpll0, 6, 0, 0),
1722 F_MMSS( 109090000, gpll0, 5.5, 0, 0),
1723 F_MMSS( 133330000, gpll0, 4.5, 0, 0),
1724 F_MMSS( 200000000, gpll0, 3, 0, 0),
1725 F_MMSS( 228570000, mmpll0_pll, 3.5, 0, 0),
1726 F_MMSS( 266670000, mmpll0_pll, 3, 0, 0),
1727 F_MMSS( 320000000, mmpll0_pll, 2.5, 0, 0),
1728 F_END
1729};
1730
1731static struct rcg_clk vfe0_clk_src = {
1732 .cmd_rcgr_reg = VFE0_CMD_RCGR,
1733 .set_rate = set_rate_hid,
1734 .freq_tbl = ftbl_camss_vfe_vfe0_clk,
1735 .current_freq = &rcg_dummy_freq,
1736 .base = &virt_bases[MMSS_BASE],
1737 .c = {
1738 .dbg_name = "vfe0_clk_src",
1739 .ops = &clk_ops_rcg,
1740 VDD_DIG_FMAX_MAP3(LOW, 133330000, NOMINAL, 266670000, HIGH,
Patrick Dalye02a5632013-02-12 20:23:35 -08001741 320000000),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001742 CLK_INIT(vfe0_clk_src.c),
1743 },
1744};
1745
1746static struct clk_freq_tbl ftbl_mdss_mdp_clk[] = {
1747 F_MMSS( 37500000, gpll0, 16, 0, 0),
1748 F_MMSS( 60000000, gpll0, 10, 0, 0),
1749 F_MMSS( 75000000, gpll0, 8, 0, 0),
1750 F_MMSS( 92310000, gpll0, 6.5, 0, 0),
1751 F_MMSS( 100000000, gpll0, 6, 0, 0),
1752 F_MMSS( 133330000, mmpll0_pll, 6, 0, 0),
1753 F_MMSS( 177780000, mmpll0_pll, 4.5, 0, 0),
1754 F_MMSS( 200000000, mmpll0_pll, 4, 0, 0),
1755 F_END
1756};
1757
1758static struct rcg_clk mdp_clk_src = {
1759 .cmd_rcgr_reg = MDP_CMD_RCGR,
1760 .set_rate = set_rate_hid,
1761 .freq_tbl = ftbl_mdss_mdp_clk,
1762 .current_freq = &rcg_dummy_freq,
1763 .base = &virt_bases[MMSS_BASE],
1764 .c = {
1765 .dbg_name = "mdp_clk_src",
1766 .ops = &clk_ops_rcg,
1767 VDD_DIG_FMAX_MAP3(LOW, 92310000, NOMINAL, 177780000, HIGH,
Patrick Dalye02a5632013-02-12 20:23:35 -08001768 200000000),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001769 CLK_INIT(mdp_clk_src.c),
1770 },
1771};
1772
1773static struct clk_freq_tbl ftbl_camss_jpeg_jpeg0_clk[] = {
1774 F_MMSS( 75000000, gpll0, 8, 0, 0),
1775 F_MMSS( 133330000, gpll0, 4.5, 0, 0),
1776 F_MMSS( 200000000, gpll0, 3, 0, 0),
1777 F_MMSS( 228570000, mmpll0_pll, 3.5, 0, 0),
1778 F_MMSS( 266670000, mmpll0_pll, 3, 0, 0),
1779 F_MMSS( 320000000, mmpll0_pll, 2.5, 0, 0),
1780 F_END
1781};
1782
1783static struct rcg_clk jpeg0_clk_src = {
1784 .cmd_rcgr_reg = JPEG0_CMD_RCGR,
1785 .set_rate = set_rate_hid,
1786 .freq_tbl = ftbl_camss_jpeg_jpeg0_clk,
1787 .current_freq = &rcg_dummy_freq,
1788 .base = &virt_bases[MMSS_BASE],
1789 .c = {
1790 .dbg_name = "jpeg0_clk_src",
1791 .ops = &clk_ops_rcg,
1792 VDD_DIG_FMAX_MAP3(LOW, 133330000, NOMINAL, 266670000, HIGH,
Patrick Dalye02a5632013-02-12 20:23:35 -08001793 320000000),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001794 CLK_INIT(jpeg0_clk_src.c),
1795 },
1796};
1797
Patrick Daly5555c2c2013-03-06 21:25:26 -08001798static struct branch_clk mdss_ahb_clk;
1799static struct clk dsipll0_byte_clk_src = {
1800 .depends = &mdss_ahb_clk.c,
1801 .parent = &xo.c,
1802 .dbg_name = "dsipll0_byte_clk_src",
1803 .ops = &clk_ops_dsi_byte_pll,
1804 CLK_INIT(dsipll0_byte_clk_src),
1805};
1806
1807static struct clk dsipll0_pixel_clk_src = {
1808 .depends = &mdss_ahb_clk.c,
1809 .parent = &xo.c,
1810 .dbg_name = "dsipll0_pixel_clk_src",
1811 .ops = &clk_ops_dsi_pixel_pll,
1812 CLK_INIT(dsipll0_pixel_clk_src),
1813};
1814
Vikram Mulukutlaae13f3c2013-03-20 18:03:29 -07001815static struct clk_freq_tbl pixel_freq_tbl[] = {
1816 {
1817 .src_clk = &dsipll0_pixel_clk_src,
1818 .div_src_val = BVAL(10, 8, dsipll0_pixel_mm_source_val),
1819 },
1820 F_END
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001821};
1822
1823static struct rcg_clk pclk0_clk_src = {
1824 .cmd_rcgr_reg = PCLK0_CMD_RCGR,
Vikram Mulukutlaae13f3c2013-03-20 18:03:29 -07001825 .current_freq = pixel_freq_tbl,
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001826 .base = &virt_bases[MMSS_BASE],
1827 .c = {
Patrick Daly5555c2c2013-03-06 21:25:26 -08001828 .parent = &dsipll0_pixel_clk_src,
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001829 .dbg_name = "pclk0_clk_src",
Patrick Daly5555c2c2013-03-06 21:25:26 -08001830 .ops = &clk_ops_pixel,
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001831 VDD_DIG_FMAX_MAP2(LOW, 83330000, NOMINAL, 166670000),
1832 CLK_INIT(pclk0_clk_src.c),
1833 },
1834};
1835
1836static struct clk_freq_tbl ftbl_venus0_vcodec0_clk[] = {
1837 F_MMSS( 66700000, gpll0, 9, 0, 0),
1838 F_MMSS( 100000000, gpll0, 6, 0, 0),
1839 F_MMSS( 133330000, mmpll0_pll, 6, 0, 0),
Patrick Daly4f832432013-02-26 12:40:49 -08001840 F_MMSS( 160000000, mmpll0_pll, 5, 0, 0),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001841 F_END
1842};
1843
1844static struct rcg_clk vcodec0_clk_src = {
1845 .cmd_rcgr_reg = VCODEC0_CMD_RCGR,
1846 .set_rate = set_rate_mnd,
1847 .freq_tbl = ftbl_venus0_vcodec0_clk,
1848 .current_freq = &rcg_dummy_freq,
1849 .base = &virt_bases[MMSS_BASE],
1850 .c = {
1851 .dbg_name = "vcodec0_clk_src",
1852 .ops = &clk_ops_rcg_mnd,
1853 VDD_DIG_FMAX_MAP3(LOW, 66670000, NOMINAL, 133330000, HIGH,
Patrick Dalye02a5632013-02-12 20:23:35 -08001854 160000000),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001855 CLK_INIT(vcodec0_clk_src.c),
1856 },
1857};
1858
1859static struct clk_freq_tbl ftbl_camss_cci_cci_clk[] = {
1860 F_MMSS( 19200000, xo, 1, 0, 0),
1861 F_END
1862};
1863
1864static struct rcg_clk cci_clk_src = {
1865 .cmd_rcgr_reg = CCI_CMD_RCGR,
1866 .set_rate = set_rate_mnd,
1867 .freq_tbl = ftbl_camss_cci_cci_clk,
1868 .current_freq = &rcg_dummy_freq,
1869 .base = &virt_bases[MMSS_BASE],
1870 .c = {
1871 .dbg_name = "cci_clk_src",
1872 .ops = &clk_ops_rcg_mnd,
1873 VDD_DIG_FMAX_MAP2(LOW, 20000000, NOMINAL, 40000000),
1874 CLK_INIT(cci_clk_src.c),
1875 },
1876};
1877
1878static struct clk_freq_tbl ftbl_camss_gp0_1_clk[] = {
1879 F_MMSS( 10000, xo, 16, 1, 120),
1880 F_MMSS( 24000, xo, 16, 1, 50),
1881 F_MMSS( 6000000, gpll0, 10, 1, 10),
1882 F_MMSS( 12000000, gpll0, 10, 1, 5),
1883 F_MMSS( 13000000, gpll0, 4, 13, 150),
1884 F_MMSS( 24000000, gpll0, 5, 1, 5),
1885 F_END
1886};
1887
1888static struct rcg_clk mmss_gp0_clk_src = {
1889 .cmd_rcgr_reg = MMSS_GP0_CMD_RCGR,
1890 .set_rate = set_rate_mnd,
1891 .freq_tbl = ftbl_camss_gp0_1_clk,
1892 .current_freq = &rcg_dummy_freq,
1893 .base = &virt_bases[MMSS_BASE],
1894 .c = {
1895 .dbg_name = "mmss_gp0_clk_src",
1896 .ops = &clk_ops_rcg_mnd,
1897 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1898 CLK_INIT(mmss_gp0_clk_src.c),
1899 },
1900};
1901
1902static struct rcg_clk mmss_gp1_clk_src = {
1903 .cmd_rcgr_reg = MMSS_GP1_CMD_RCGR,
1904 .set_rate = set_rate_mnd,
1905 .freq_tbl = ftbl_camss_gp0_1_clk,
1906 .current_freq = &rcg_dummy_freq,
1907 .base = &virt_bases[MMSS_BASE],
1908 .c = {
1909 .dbg_name = "mmss_gp1_clk_src",
1910 .ops = &clk_ops_rcg_mnd,
1911 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1912 CLK_INIT(mmss_gp1_clk_src.c),
1913 },
1914};
1915
1916static struct clk_freq_tbl ftbl_camss_mclk0_1_clk[] = {
Patrick Daly42d2b7a2013-03-07 17:12:33 -08001917 F_MMSS( 19200000, xo, 1, 0, 0),
1918 F_MMSS( 24000000, gpll0, 5, 1, 5),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07001919 F_MMSS( 66670000, gpll0, 9, 0, 0),
1920 F_END
1921};
1922
1923static struct rcg_clk mclk0_clk_src = {
1924 .cmd_rcgr_reg = MCLK0_CMD_RCGR,
1925 .set_rate = set_rate_mnd,
1926 .freq_tbl = ftbl_camss_mclk0_1_clk,
1927 .current_freq = &rcg_dummy_freq,
1928 .base = &virt_bases[MMSS_BASE],
1929 .c = {
1930 .dbg_name = "mclk0_clk_src",
1931 .ops = &clk_ops_rcg_mnd,
1932 VDD_DIG_FMAX_MAP1(LOW, 66670000),
1933 CLK_INIT(mclk0_clk_src.c),
1934 },
1935};
1936
1937static struct rcg_clk mclk1_clk_src = {
1938 .cmd_rcgr_reg = MCLK1_CMD_RCGR,
1939 .set_rate = set_rate_mnd,
1940 .freq_tbl = ftbl_camss_mclk0_1_clk,
1941 .current_freq = &rcg_dummy_freq,
1942 .base = &virt_bases[MMSS_BASE],
1943 .c = {
1944 .dbg_name = "mclk1_clk_src",
1945 .ops = &clk_ops_rcg_mnd,
1946 VDD_DIG_FMAX_MAP1(LOW, 66670000),
1947 CLK_INIT(mclk1_clk_src.c),
1948 },
1949};
1950
1951static struct clk_freq_tbl ftbl_camss_phy0_1_csi0_1phytimer_clk[] = {
1952 F_MMSS( 100000000, gpll0, 6, 0, 0),
1953 F_MMSS( 200000000, mmpll0_pll, 4, 0, 0),
1954 F_END
1955};
1956
1957static struct rcg_clk csi0phytimer_clk_src = {
1958 .cmd_rcgr_reg = CSI0PHYTIMER_CMD_RCGR,
1959 .set_rate = set_rate_hid,
1960 .freq_tbl = ftbl_camss_phy0_1_csi0_1phytimer_clk,
1961 .current_freq = &rcg_dummy_freq,
1962 .base = &virt_bases[MMSS_BASE],
1963 .c = {
1964 .dbg_name = "csi0phytimer_clk_src",
1965 .ops = &clk_ops_rcg,
1966 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1967 CLK_INIT(csi0phytimer_clk_src.c),
1968 },
1969};
1970
1971static struct rcg_clk csi1phytimer_clk_src = {
1972 .cmd_rcgr_reg = CSI1PHYTIMER_CMD_RCGR,
1973 .set_rate = set_rate_hid,
1974 .freq_tbl = ftbl_camss_phy0_1_csi0_1phytimer_clk,
1975 .current_freq = &rcg_dummy_freq,
1976 .base = &virt_bases[MMSS_BASE],
1977 .c = {
1978 .dbg_name = "csi1phytimer_clk_src",
1979 .ops = &clk_ops_rcg,
1980 VDD_DIG_FMAX_MAP2(LOW, 100000000, NOMINAL, 200000000),
1981 CLK_INIT(csi1phytimer_clk_src.c),
1982 },
1983};
1984
1985static struct clk_freq_tbl ftbl_camss_vfe_cpp_clk[] = {
1986 F_MMSS( 133330000, gpll0, 4.5, 0, 0),
1987 F_MMSS( 266670000, mmpll0_pll, 3, 0, 0),
1988 F_MMSS( 320000000, mmpll0_pll, 2.5, 0, 0),
1989 F_END
1990};
1991
1992static struct rcg_clk cpp_clk_src = {
1993 .cmd_rcgr_reg = CPP_CMD_RCGR,
1994 .set_rate = set_rate_hid,
1995 .freq_tbl = ftbl_camss_vfe_cpp_clk,
1996 .current_freq = &rcg_dummy_freq,
1997 .base = &virt_bases[MMSS_BASE],
1998 .c = {
1999 .dbg_name = "cpp_clk_src",
2000 .ops = &clk_ops_rcg,
2001 VDD_DIG_FMAX_MAP3(LOW, 133330000, NOMINAL, 266670000, HIGH,
Patrick Dalye02a5632013-02-12 20:23:35 -08002002 320000000),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002003 CLK_INIT(cpp_clk_src.c),
2004 },
2005};
2006
Vikram Mulukutlaae13f3c2013-03-20 18:03:29 -07002007static struct clk_freq_tbl byte_freq_tbl[] = {
2008 {
2009 .src_clk = &dsipll0_byte_clk_src,
2010 .div_src_val = BVAL(10, 8, dsipll0_byte_mm_source_val),
2011 },
2012 F_END
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002013};
2014
2015static struct rcg_clk byte0_clk_src = {
2016 .cmd_rcgr_reg = BYTE0_CMD_RCGR,
Vikram Mulukutlaae13f3c2013-03-20 18:03:29 -07002017 .current_freq = byte_freq_tbl,
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002018 .base = &virt_bases[MMSS_BASE],
2019 .c = {
Patrick Daly5555c2c2013-03-06 21:25:26 -08002020 .parent = &dsipll0_byte_clk_src,
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002021 .dbg_name = "byte0_clk_src",
Patrick Daly5555c2c2013-03-06 21:25:26 -08002022 .ops = &clk_ops_byte,
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002023 VDD_DIG_FMAX_MAP2(LOW, 62500000, NOMINAL, 125000000),
2024 CLK_INIT(byte0_clk_src.c),
2025 },
2026};
2027
2028static struct clk_freq_tbl ftbl_mdss_esc0_clk[] = {
2029 F_MDSS( 19200000, xo, 1, 0, 0),
2030 F_END
2031};
2032
2033static struct rcg_clk esc0_clk_src = {
2034 .cmd_rcgr_reg = ESC0_CMD_RCGR,
2035 .set_rate = set_rate_hid,
2036 .freq_tbl = ftbl_mdss_esc0_clk,
2037 .current_freq = &rcg_dummy_freq,
2038 .base = &virt_bases[MMSS_BASE],
2039 .c = {
2040 .dbg_name = "esc0_clk_src",
2041 .ops = &clk_ops_rcg,
2042 VDD_DIG_FMAX_MAP2(LOW, 20000000, NOMINAL, 40000000),
2043 CLK_INIT(esc0_clk_src.c),
2044 },
2045};
2046
2047static struct clk_freq_tbl ftbl_mdss_vsync_clk[] = {
2048 F_MDSS( 19200000, xo, 1, 0, 0),
2049 F_END
2050};
2051
2052static struct rcg_clk vsync_clk_src = {
2053 .cmd_rcgr_reg = VSYNC_CMD_RCGR,
2054 .set_rate = set_rate_hid,
2055 .freq_tbl = ftbl_mdss_vsync_clk,
2056 .current_freq = &rcg_dummy_freq,
2057 .base = &virt_bases[MMSS_BASE],
2058 .c = {
2059 .dbg_name = "vsync_clk_src",
2060 .ops = &clk_ops_rcg,
2061 VDD_DIG_FMAX_MAP2(LOW, 20000000, NOMINAL, 40000000),
2062 CLK_INIT(vsync_clk_src.c),
2063 },
2064};
2065
2066static struct branch_clk camss_cci_cci_ahb_clk = {
2067 .cbcr_reg = CAMSS_CCI_CCI_AHB_CBCR,
2068 .has_sibling = 1,
2069 .base = &virt_bases[MMSS_BASE],
2070 .c = {
2071 .dbg_name = "camss_cci_cci_ahb_clk",
2072 .ops = &clk_ops_branch,
2073 CLK_INIT(camss_cci_cci_ahb_clk.c),
2074 },
2075};
2076
2077static struct branch_clk camss_cci_cci_clk = {
2078 .cbcr_reg = CAMSS_CCI_CCI_CBCR,
2079 .has_sibling = 0,
2080 .base = &virt_bases[MMSS_BASE],
2081 .c = {
2082 .dbg_name = "camss_cci_cci_clk",
2083 .parent = &cci_clk_src.c,
2084 .ops = &clk_ops_branch,
2085 CLK_INIT(camss_cci_cci_clk.c),
2086 },
2087};
2088
2089static struct branch_clk camss_csi0_ahb_clk = {
2090 .cbcr_reg = CAMSS_CSI0_AHB_CBCR,
2091 .has_sibling = 1,
2092 .base = &virt_bases[MMSS_BASE],
2093 .c = {
2094 .dbg_name = "camss_csi0_ahb_clk",
2095 .ops = &clk_ops_branch,
2096 CLK_INIT(camss_csi0_ahb_clk.c),
2097 },
2098};
2099
2100static struct branch_clk camss_csi0_clk = {
2101 .cbcr_reg = CAMSS_CSI0_CBCR,
2102 .has_sibling = 1,
2103 .base = &virt_bases[MMSS_BASE],
2104 .c = {
2105 .dbg_name = "camss_csi0_clk",
2106 .parent = &csi0_clk_src.c,
2107 .ops = &clk_ops_branch,
2108 CLK_INIT(camss_csi0_clk.c),
2109 },
2110};
2111
2112static struct branch_clk camss_csi0phy_clk = {
2113 .cbcr_reg = CAMSS_CSI0PHY_CBCR,
2114 .has_sibling = 1,
2115 .base = &virt_bases[MMSS_BASE],
2116 .c = {
2117 .dbg_name = "camss_csi0phy_clk",
2118 .parent = &csi0_clk_src.c,
2119 .ops = &clk_ops_branch,
2120 CLK_INIT(camss_csi0phy_clk.c),
2121 },
2122};
2123
2124static struct branch_clk camss_csi0pix_clk = {
2125 .cbcr_reg = CAMSS_CSI0PIX_CBCR,
2126 .has_sibling = 1,
2127 .base = &virt_bases[MMSS_BASE],
2128 .c = {
2129 .dbg_name = "camss_csi0pix_clk",
2130 .parent = &csi0_clk_src.c,
2131 .ops = &clk_ops_branch,
2132 CLK_INIT(camss_csi0pix_clk.c),
2133 },
2134};
2135
2136static struct branch_clk camss_csi0rdi_clk = {
2137 .cbcr_reg = CAMSS_CSI0RDI_CBCR,
2138 .has_sibling = 1,
2139 .base = &virt_bases[MMSS_BASE],
2140 .c = {
2141 .dbg_name = "camss_csi0rdi_clk",
2142 .parent = &csi0_clk_src.c,
2143 .ops = &clk_ops_branch,
2144 CLK_INIT(camss_csi0rdi_clk.c),
2145 },
2146};
2147
2148static struct branch_clk camss_csi1_ahb_clk = {
2149 .cbcr_reg = CAMSS_CSI1_AHB_CBCR,
2150 .has_sibling = 1,
2151 .base = &virt_bases[MMSS_BASE],
2152 .c = {
2153 .dbg_name = "camss_csi1_ahb_clk",
2154 .ops = &clk_ops_branch,
2155 CLK_INIT(camss_csi1_ahb_clk.c),
2156 },
2157};
2158
2159static struct branch_clk camss_csi1_clk = {
2160 .cbcr_reg = CAMSS_CSI1_CBCR,
2161 .has_sibling = 1,
2162 .base = &virt_bases[MMSS_BASE],
2163 .c = {
2164 .dbg_name = "camss_csi1_clk",
2165 .parent = &csi1_clk_src.c,
2166 .ops = &clk_ops_branch,
2167 CLK_INIT(camss_csi1_clk.c),
2168 },
2169};
2170
2171static struct branch_clk camss_csi1phy_clk = {
2172 .cbcr_reg = CAMSS_CSI1PHY_CBCR,
2173 .has_sibling = 1,
2174 .base = &virt_bases[MMSS_BASE],
2175 .c = {
2176 .dbg_name = "camss_csi1phy_clk",
2177 .parent = &csi1_clk_src.c,
2178 .ops = &clk_ops_branch,
2179 CLK_INIT(camss_csi1phy_clk.c),
2180 },
2181};
2182
2183static struct branch_clk camss_csi1pix_clk = {
2184 .cbcr_reg = CAMSS_CSI1PIX_CBCR,
2185 .has_sibling = 1,
2186 .base = &virt_bases[MMSS_BASE],
2187 .c = {
2188 .dbg_name = "camss_csi1pix_clk",
2189 .parent = &csi1_clk_src.c,
2190 .ops = &clk_ops_branch,
2191 CLK_INIT(camss_csi1pix_clk.c),
2192 },
2193};
2194
2195static struct branch_clk camss_csi1rdi_clk = {
2196 .cbcr_reg = CAMSS_CSI1RDI_CBCR,
2197 .has_sibling = 1,
2198 .base = &virt_bases[MMSS_BASE],
2199 .c = {
2200 .dbg_name = "camss_csi1rdi_clk",
2201 .parent = &csi1_clk_src.c,
2202 .ops = &clk_ops_branch,
2203 CLK_INIT(camss_csi1rdi_clk.c),
2204 },
2205};
2206
2207static struct branch_clk camss_csi_vfe0_clk = {
2208 .cbcr_reg = CAMSS_CSI_VFE0_CBCR,
2209 .has_sibling = 1,
2210 .base = &virt_bases[MMSS_BASE],
2211 .c = {
2212 .dbg_name = "camss_csi_vfe0_clk",
2213 .parent = &vfe0_clk_src.c,
2214 .ops = &clk_ops_branch,
2215 CLK_INIT(camss_csi_vfe0_clk.c),
2216 },
2217};
2218
2219static struct branch_clk camss_gp0_clk = {
2220 .cbcr_reg = CAMSS_GP0_CBCR,
2221 .has_sibling = 0,
2222 .base = &virt_bases[MMSS_BASE],
2223 .c = {
2224 .dbg_name = "camss_gp0_clk",
2225 .parent = &mmss_gp0_clk_src.c,
2226 .ops = &clk_ops_branch,
2227 CLK_INIT(camss_gp0_clk.c),
2228 },
2229};
2230
2231static struct branch_clk camss_gp1_clk = {
2232 .cbcr_reg = CAMSS_GP1_CBCR,
2233 .has_sibling = 0,
2234 .base = &virt_bases[MMSS_BASE],
2235 .c = {
2236 .dbg_name = "camss_gp1_clk",
2237 .parent = &mmss_gp1_clk_src.c,
2238 .ops = &clk_ops_branch,
2239 CLK_INIT(camss_gp1_clk.c),
2240 },
2241};
2242
2243static struct branch_clk camss_ispif_ahb_clk = {
2244 .cbcr_reg = CAMSS_ISPIF_AHB_CBCR,
2245 .has_sibling = 1,
2246 .base = &virt_bases[MMSS_BASE],
2247 .c = {
2248 .dbg_name = "camss_ispif_ahb_clk",
2249 .ops = &clk_ops_branch,
2250 CLK_INIT(camss_ispif_ahb_clk.c),
2251 },
2252};
2253
2254static struct branch_clk camss_jpeg_jpeg0_clk = {
2255 .cbcr_reg = CAMSS_JPEG_JPEG0_CBCR,
2256 .has_sibling = 0,
2257 .base = &virt_bases[MMSS_BASE],
2258 .c = {
2259 .dbg_name = "camss_jpeg_jpeg0_clk",
2260 .parent = &jpeg0_clk_src.c,
2261 .ops = &clk_ops_branch,
2262 CLK_INIT(camss_jpeg_jpeg0_clk.c),
2263 },
2264};
2265
2266static struct branch_clk camss_jpeg_jpeg_ahb_clk = {
2267 .cbcr_reg = CAMSS_JPEG_JPEG_AHB_CBCR,
2268 .has_sibling = 1,
2269 .base = &virt_bases[MMSS_BASE],
2270 .c = {
2271 .dbg_name = "camss_jpeg_jpeg_ahb_clk",
2272 .ops = &clk_ops_branch,
2273 CLK_INIT(camss_jpeg_jpeg_ahb_clk.c),
2274 },
2275};
2276
2277static struct branch_clk camss_jpeg_jpeg_axi_clk = {
2278 .cbcr_reg = CAMSS_JPEG_JPEG_AXI_CBCR,
2279 .has_sibling = 1,
2280 .base = &virt_bases[MMSS_BASE],
2281 .c = {
2282 .dbg_name = "camss_jpeg_jpeg_axi_clk",
2283 .parent = &axi_clk_src.c,
2284 .ops = &clk_ops_branch,
2285 CLK_INIT(camss_jpeg_jpeg_axi_clk.c),
2286 },
2287};
2288
2289static struct branch_clk camss_mclk0_clk = {
2290 .cbcr_reg = CAMSS_MCLK0_CBCR,
2291 .has_sibling = 0,
2292 .base = &virt_bases[MMSS_BASE],
2293 .c = {
2294 .dbg_name = "camss_mclk0_clk",
2295 .parent = &mclk0_clk_src.c,
2296 .ops = &clk_ops_branch,
2297 CLK_INIT(camss_mclk0_clk.c),
2298 },
2299};
2300
2301static struct branch_clk camss_mclk1_clk = {
2302 .cbcr_reg = CAMSS_MCLK1_CBCR,
2303 .has_sibling = 0,
2304 .base = &virt_bases[MMSS_BASE],
2305 .c = {
2306 .dbg_name = "camss_mclk1_clk",
2307 .parent = &mclk1_clk_src.c,
2308 .ops = &clk_ops_branch,
2309 CLK_INIT(camss_mclk1_clk.c),
2310 },
2311};
2312
2313static struct branch_clk camss_micro_ahb_clk = {
2314 .cbcr_reg = CAMSS_MICRO_AHB_CBCR,
2315 .has_sibling = 1,
2316 .base = &virt_bases[MMSS_BASE],
2317 .c = {
2318 .dbg_name = "camss_micro_ahb_clk",
2319 .ops = &clk_ops_branch,
2320 CLK_INIT(camss_micro_ahb_clk.c),
2321 },
2322};
2323
2324static struct branch_clk camss_phy0_csi0phytimer_clk = {
2325 .cbcr_reg = CAMSS_PHY0_CSI0PHYTIMER_CBCR,
2326 .has_sibling = 0,
2327 .base = &virt_bases[MMSS_BASE],
2328 .c = {
2329 .dbg_name = "camss_phy0_csi0phytimer_clk",
2330 .parent = &csi0phytimer_clk_src.c,
2331 .ops = &clk_ops_branch,
2332 CLK_INIT(camss_phy0_csi0phytimer_clk.c),
2333 },
2334};
2335
2336static struct branch_clk camss_phy1_csi1phytimer_clk = {
2337 .cbcr_reg = CAMSS_PHY1_CSI1PHYTIMER_CBCR,
2338 .has_sibling = 0,
2339 .base = &virt_bases[MMSS_BASE],
2340 .c = {
2341 .dbg_name = "camss_phy1_csi1phytimer_clk",
2342 .parent = &csi1phytimer_clk_src.c,
2343 .ops = &clk_ops_branch,
2344 CLK_INIT(camss_phy1_csi1phytimer_clk.c),
2345 },
2346};
2347
2348static struct branch_clk camss_top_ahb_clk = {
2349 .cbcr_reg = CAMSS_TOP_AHB_CBCR,
2350 .has_sibling = 1,
2351 .base = &virt_bases[MMSS_BASE],
2352 .c = {
2353 .dbg_name = "camss_top_ahb_clk",
2354 .ops = &clk_ops_branch,
2355 CLK_INIT(camss_top_ahb_clk.c),
2356 },
2357};
2358
2359static struct branch_clk camss_vfe_cpp_ahb_clk = {
2360 .cbcr_reg = CAMSS_VFE_CPP_AHB_CBCR,
2361 .has_sibling = 1,
2362 .base = &virt_bases[MMSS_BASE],
2363 .c = {
2364 .dbg_name = "camss_vfe_cpp_ahb_clk",
2365 .ops = &clk_ops_branch,
2366 CLK_INIT(camss_vfe_cpp_ahb_clk.c),
2367 },
2368};
2369
2370static struct branch_clk camss_vfe_cpp_clk = {
2371 .cbcr_reg = CAMSS_VFE_CPP_CBCR,
2372 .has_sibling = 0,
2373 .base = &virt_bases[MMSS_BASE],
2374 .c = {
2375 .dbg_name = "camss_vfe_cpp_clk",
2376 .parent = &cpp_clk_src.c,
2377 .ops = &clk_ops_branch,
2378 CLK_INIT(camss_vfe_cpp_clk.c),
2379 },
2380};
2381
2382static struct branch_clk camss_vfe_vfe0_clk = {
2383 .cbcr_reg = CAMSS_VFE_VFE0_CBCR,
2384 .has_sibling = 1,
2385 .base = &virt_bases[MMSS_BASE],
2386 .c = {
2387 .dbg_name = "camss_vfe_vfe0_clk",
2388 .parent = &vfe0_clk_src.c,
2389 .ops = &clk_ops_branch,
2390 CLK_INIT(camss_vfe_vfe0_clk.c),
2391 },
2392};
2393
2394static struct branch_clk camss_vfe_vfe_ahb_clk = {
2395 .cbcr_reg = CAMSS_VFE_VFE_AHB_CBCR,
2396 .has_sibling = 1,
2397 .base = &virt_bases[MMSS_BASE],
2398 .c = {
2399 .dbg_name = "camss_vfe_vfe_ahb_clk",
2400 .ops = &clk_ops_branch,
2401 CLK_INIT(camss_vfe_vfe_ahb_clk.c),
2402 },
2403};
2404
2405static struct branch_clk camss_vfe_vfe_axi_clk = {
2406 .cbcr_reg = CAMSS_VFE_VFE_AXI_CBCR,
2407 .has_sibling = 1,
2408 .base = &virt_bases[MMSS_BASE],
2409 .c = {
2410 .dbg_name = "camss_vfe_vfe_axi_clk",
2411 .parent = &axi_clk_src.c,
2412 .ops = &clk_ops_branch,
2413 CLK_INIT(camss_vfe_vfe_axi_clk.c),
2414 },
2415};
2416
2417static struct branch_clk mdss_ahb_clk = {
2418 .cbcr_reg = MDSS_AHB_CBCR,
2419 .has_sibling = 1,
2420 .base = &virt_bases[MMSS_BASE],
2421 .c = {
2422 .dbg_name = "mdss_ahb_clk",
2423 .ops = &clk_ops_branch,
2424 CLK_INIT(mdss_ahb_clk.c),
2425 },
2426};
2427
2428static struct branch_clk mdss_axi_clk = {
2429 .cbcr_reg = MDSS_AXI_CBCR,
2430 .has_sibling = 1,
2431 .base = &virt_bases[MMSS_BASE],
2432 .c = {
2433 .dbg_name = "mdss_axi_clk",
2434 .parent = &axi_clk_src.c,
2435 .ops = &clk_ops_branch,
2436 CLK_INIT(mdss_axi_clk.c),
2437 },
2438};
2439
2440static struct branch_clk mdss_byte0_clk = {
2441 .cbcr_reg = MDSS_BYTE0_CBCR,
2442 .has_sibling = 0,
2443 .base = &virt_bases[MMSS_BASE],
2444 .c = {
2445 .dbg_name = "mdss_byte0_clk",
2446 .parent = &byte0_clk_src.c,
2447 .ops = &clk_ops_branch,
2448 CLK_INIT(mdss_byte0_clk.c),
2449 },
2450};
2451
2452static struct branch_clk mdss_esc0_clk = {
2453 .cbcr_reg = MDSS_ESC0_CBCR,
2454 .has_sibling = 0,
2455 .base = &virt_bases[MMSS_BASE],
2456 .c = {
2457 .dbg_name = "mdss_esc0_clk",
2458 .parent = &esc0_clk_src.c,
2459 .ops = &clk_ops_branch,
2460 CLK_INIT(mdss_esc0_clk.c),
2461 },
2462};
2463
2464static struct branch_clk mdss_mdp_clk = {
2465 .cbcr_reg = MDSS_MDP_CBCR,
2466 .has_sibling = 1,
2467 .base = &virt_bases[MMSS_BASE],
2468 .c = {
2469 .dbg_name = "mdss_mdp_clk",
2470 .parent = &mdp_clk_src.c,
2471 .ops = &clk_ops_branch,
2472 CLK_INIT(mdss_mdp_clk.c),
2473 },
2474};
2475
2476static struct branch_clk mdss_mdp_lut_clk = {
2477 .cbcr_reg = MDSS_MDP_LUT_CBCR,
2478 .has_sibling = 1,
2479 .base = &virt_bases[MMSS_BASE],
2480 .c = {
2481 .dbg_name = "mdss_mdp_lut_clk",
2482 .parent = &mdp_clk_src.c,
2483 .ops = &clk_ops_branch,
2484 CLK_INIT(mdss_mdp_lut_clk.c),
2485 },
2486};
2487
2488static struct branch_clk mdss_pclk0_clk = {
2489 .cbcr_reg = MDSS_PCLK0_CBCR,
2490 .has_sibling = 0,
2491 .base = &virt_bases[MMSS_BASE],
2492 .c = {
2493 .dbg_name = "mdss_pclk0_clk",
2494 .parent = &pclk0_clk_src.c,
2495 .ops = &clk_ops_branch,
2496 CLK_INIT(mdss_pclk0_clk.c),
2497 },
2498};
2499
2500static struct branch_clk mdss_vsync_clk = {
2501 .cbcr_reg = MDSS_VSYNC_CBCR,
2502 .has_sibling = 0,
2503 .base = &virt_bases[MMSS_BASE],
2504 .c = {
2505 .dbg_name = "mdss_vsync_clk",
2506 .parent = &vsync_clk_src.c,
2507 .ops = &clk_ops_branch,
2508 CLK_INIT(mdss_vsync_clk.c),
2509 },
2510};
2511
2512static struct branch_clk mmss_misc_ahb_clk = {
2513 .cbcr_reg = MMSS_MISC_AHB_CBCR,
2514 .has_sibling = 1,
2515 .base = &virt_bases[MMSS_BASE],
2516 .c = {
2517 .dbg_name = "mmss_misc_ahb_clk",
2518 .ops = &clk_ops_branch,
2519 CLK_INIT(mmss_misc_ahb_clk.c),
2520 },
2521};
2522
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002523static struct branch_clk mmss_mmssnoc_bto_ahb_clk = {
2524 .cbcr_reg = MMSS_MMSSNOC_BTO_AHB_CBCR,
2525 .has_sibling = 1,
2526 .base = &virt_bases[MMSS_BASE],
2527 .c = {
2528 .dbg_name = "mmss_mmssnoc_bto_ahb_clk",
2529 .ops = &clk_ops_branch,
2530 CLK_INIT(mmss_mmssnoc_bto_ahb_clk.c),
2531 },
2532};
2533
2534static struct branch_clk mmss_mmssnoc_axi_clk = {
2535 .cbcr_reg = MMSS_MMSSNOC_AXI_CBCR,
2536 .has_sibling = 1,
2537 .base = &virt_bases[MMSS_BASE],
2538 .c = {
2539 .dbg_name = "mmss_mmssnoc_axi_clk",
2540 .parent = &axi_clk_src.c,
2541 .ops = &clk_ops_branch,
2542 CLK_INIT(mmss_mmssnoc_axi_clk.c),
2543 },
2544};
2545
2546static struct branch_clk mmss_s0_axi_clk = {
2547 .cbcr_reg = MMSS_S0_AXI_CBCR,
2548 .has_sibling = 0,
2549 .max_div = 0,
2550 .base = &virt_bases[MMSS_BASE],
2551 .c = {
2552 .dbg_name = "mmss_s0_axi_clk",
2553 .parent = &axi_clk_src.c,
2554 .ops = &clk_ops_branch,
2555 CLK_INIT(mmss_s0_axi_clk.c),
2556 .depends = &mmss_mmssnoc_axi_clk.c,
2557 },
2558};
2559
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002560static struct branch_clk oxili_gfx3d_clk = {
2561 .cbcr_reg = OXILI_GFX3D_CBCR,
Patrick Daly295173b2013-03-11 13:35:40 -07002562 .has_sibling = 0,
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002563 .max_div = 0,
2564 .base = &virt_bases[MMSS_BASE],
2565 .c = {
2566 .dbg_name = "oxili_gfx3d_clk",
2567 .parent = &gfx3d_clk_src.c,
2568 .ops = &clk_ops_branch,
2569 CLK_INIT(oxili_gfx3d_clk.c),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002570 },
2571};
2572
2573static struct branch_clk oxilicx_ahb_clk = {
2574 .cbcr_reg = OXILICX_AHB_CBCR,
2575 .has_sibling = 1,
2576 .base = &virt_bases[MMSS_BASE],
2577 .c = {
2578 .dbg_name = "oxilicx_ahb_clk",
2579 .ops = &clk_ops_branch,
2580 CLK_INIT(oxilicx_ahb_clk.c),
2581 },
2582};
2583
2584static struct branch_clk oxilicx_axi_clk = {
2585 .cbcr_reg = OXILICX_AXI_CBCR,
2586 .has_sibling = 1,
2587 .base = &virt_bases[MMSS_BASE],
2588 .c = {
2589 .dbg_name = "oxilicx_axi_clk",
2590 .parent = &axi_clk_src.c,
2591 .ops = &clk_ops_branch,
2592 CLK_INIT(oxilicx_axi_clk.c),
2593 },
2594};
2595
2596static struct branch_clk venus0_ahb_clk = {
2597 .cbcr_reg = VENUS0_AHB_CBCR,
2598 .has_sibling = 1,
2599 .base = &virt_bases[MMSS_BASE],
2600 .c = {
2601 .dbg_name = "venus0_ahb_clk",
2602 .ops = &clk_ops_branch,
2603 CLK_INIT(venus0_ahb_clk.c),
2604 },
2605};
2606
2607static struct branch_clk venus0_axi_clk = {
2608 .cbcr_reg = VENUS0_AXI_CBCR,
2609 .has_sibling = 1,
2610 .base = &virt_bases[MMSS_BASE],
2611 .c = {
2612 .dbg_name = "venus0_axi_clk",
2613 .parent = &axi_clk_src.c,
2614 .ops = &clk_ops_branch,
2615 CLK_INIT(venus0_axi_clk.c),
2616 },
2617};
2618
2619static struct branch_clk venus0_vcodec0_clk = {
2620 .cbcr_reg = VENUS0_VCODEC0_CBCR,
2621 .has_sibling = 0,
2622 .base = &virt_bases[MMSS_BASE],
2623 .c = {
2624 .dbg_name = "venus0_vcodec0_clk",
2625 .parent = &vcodec0_clk_src.c,
2626 .ops = &clk_ops_branch,
2627 CLK_INIT(venus0_vcodec0_clk.c),
2628 },
2629};
2630
2631static struct measure_mux_entry measure_mux_MMSS[] = {
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002632 { &mmss_mmssnoc_bto_ahb_clk.c, MMSS_BASE, 0x0002 },
2633 { &mmss_misc_ahb_clk.c, MMSS_BASE, 0x0003 },
2634 { &mmss_mmssnoc_axi_clk.c, MMSS_BASE, 0x0004 },
2635 { &mmss_s0_axi_clk.c, MMSS_BASE, 0x0005 },
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002636 { &oxilicx_axi_clk.c, MMSS_BASE, 0x000b },
2637 { &oxilicx_ahb_clk.c, MMSS_BASE, 0x000c },
2638 { &oxili_gfx3d_clk.c, MMSS_BASE, 0x000d },
2639 { &venus0_vcodec0_clk.c, MMSS_BASE, 0x000e },
2640 { &venus0_axi_clk.c, MMSS_BASE, 0x000f },
2641 { &venus0_ahb_clk.c, MMSS_BASE, 0x0011 },
2642 { &mdss_mdp_clk.c, MMSS_BASE, 0x0014 },
2643 { &mdss_mdp_lut_clk.c, MMSS_BASE, 0x0015 },
2644 { &mdss_pclk0_clk.c, MMSS_BASE, 0x0016 },
2645 { &mdss_vsync_clk.c, MMSS_BASE, 0x001c },
2646 { &mdss_byte0_clk.c, MMSS_BASE, 0x001e },
2647 { &mdss_esc0_clk.c, MMSS_BASE, 0x0020 },
2648 { &mdss_ahb_clk.c, MMSS_BASE, 0x0022 },
2649 { &mdss_axi_clk.c, MMSS_BASE, 0x0024 },
2650 { &camss_top_ahb_clk.c, MMSS_BASE, 0x0025 },
2651 { &camss_micro_ahb_clk.c, MMSS_BASE, 0x0026 },
2652 { &camss_gp0_clk.c, MMSS_BASE, 0x0027 },
2653 { &camss_gp1_clk.c, MMSS_BASE, 0x0028 },
2654 { &camss_mclk0_clk.c, MMSS_BASE, 0x0029 },
2655 { &camss_mclk1_clk.c, MMSS_BASE, 0x002a },
2656 { &camss_cci_cci_clk.c, MMSS_BASE, 0x002d },
2657 { &camss_cci_cci_ahb_clk.c, MMSS_BASE, 0x002e },
2658 { &camss_phy0_csi0phytimer_clk.c, MMSS_BASE, 0x002f },
2659 { &camss_phy1_csi1phytimer_clk.c, MMSS_BASE, 0x0030 },
2660 { &camss_jpeg_jpeg0_clk.c, MMSS_BASE, 0x0032 },
2661 { &camss_jpeg_jpeg_ahb_clk.c, MMSS_BASE, 0x0035 },
2662 { &camss_jpeg_jpeg_axi_clk.c, MMSS_BASE, 0x0036 },
2663 { &camss_vfe_vfe0_clk.c, MMSS_BASE, 0x0038 },
2664 { &camss_vfe_cpp_clk.c, MMSS_BASE, 0x003a },
2665 { &camss_vfe_cpp_ahb_clk.c, MMSS_BASE, 0x003b },
2666 { &camss_vfe_vfe_ahb_clk.c, MMSS_BASE, 0x003c },
2667 { &camss_vfe_vfe_axi_clk.c, MMSS_BASE, 0x003d },
2668 { &camss_csi_vfe0_clk.c, MMSS_BASE, 0x003f },
2669 { &camss_csi0_clk.c, MMSS_BASE, 0x0041 },
2670 { &camss_csi0_ahb_clk.c, MMSS_BASE, 0x0042 },
2671 { &camss_csi0phy_clk.c, MMSS_BASE, 0x0043 },
2672 { &camss_csi0rdi_clk.c, MMSS_BASE, 0x0044 },
2673 { &camss_csi0pix_clk.c, MMSS_BASE, 0x0045 },
2674 { &camss_csi1_clk.c, MMSS_BASE, 0x0046 },
2675 { &camss_csi1_ahb_clk.c, MMSS_BASE, 0x0047 },
2676 { &camss_csi1phy_clk.c, MMSS_BASE, 0x0048 },
2677 { &camss_csi1rdi_clk.c, MMSS_BASE, 0x0049 },
2678 { &camss_csi1pix_clk.c, MMSS_BASE, 0x004a },
2679 { &camss_ispif_ahb_clk.c, MMSS_BASE, 0x0055 },
2680 {&dummy_clk, N_BASES, 0x0000},
2681};
2682
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002683static struct branch_clk q6ss_ahb_lfabif_clk = {
2684 .cbcr_reg = Q6SS_AHB_LFABIF_CBCR,
2685 .has_sibling = 1,
2686 .base = &virt_bases[LPASS_BASE],
2687 .c = {
2688 .dbg_name = "q6ss_ahb_lfabif_clk",
2689 .ops = &clk_ops_branch,
2690 CLK_INIT(q6ss_ahb_lfabif_clk.c),
2691 },
2692};
2693
2694static struct branch_clk q6ss_ahbm_clk = {
2695 .cbcr_reg = Q6SS_AHBM_CBCR,
2696 .has_sibling = 1,
2697 .base = &virt_bases[LPASS_BASE],
2698 .c = {
2699 .dbg_name = "q6ss_ahbm_clk",
2700 .ops = &clk_ops_branch,
2701 CLK_INIT(q6ss_ahbm_clk.c),
2702 },
2703};
2704
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002705static struct branch_clk q6ss_xo_clk = {
2706 .cbcr_reg = Q6SS_XO_CBCR,
2707 .has_sibling = 1,
2708 .bcr_reg = Q6SS_BCR,
2709 .base = &virt_bases[LPASS_BASE],
2710 .c = {
2711 .dbg_name = "q6ss_xo_clk",
2712 .parent = &xo.c,
2713 .ops = &clk_ops_branch,
2714 CLK_INIT(q6ss_xo_clk.c),
2715 },
2716};
2717
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002718static struct measure_mux_entry measure_mux_LPASS[] = {
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002719 { &q6ss_ahbm_clk.c, LPASS_BASE, 0x001d },
2720 { &q6ss_ahb_lfabif_clk.c, LPASS_BASE, 0x001e },
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002721 { &q6ss_xo_clk.c, LPASS_BASE, 0x002b },
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002722 {&dummy_clk, N_BASES, 0x0000},
2723};
2724
2725
2726static DEFINE_CLK_MEASURE(apc0_m_clk);
2727static DEFINE_CLK_MEASURE(apc1_m_clk);
2728static DEFINE_CLK_MEASURE(apc2_m_clk);
2729static DEFINE_CLK_MEASURE(apc3_m_clk);
2730static DEFINE_CLK_MEASURE(l2_m_clk);
2731
2732static struct measure_mux_entry measure_mux_APSS[] = {
2733 {&apc0_m_clk, APCS_BASE, 0x00010},
2734 {&apc1_m_clk, APCS_BASE, 0x00114},
2735 {&apc2_m_clk, APCS_BASE, 0x00220},
2736 {&apc3_m_clk, APCS_BASE, 0x00324},
2737 {&l2_m_clk, APCS_BASE, 0x01000},
2738 {&dummy_clk, N_BASES, 0x0000}
2739};
2740
2741#define APCS_SH_PLL_MODE (0x000)
2742#define APCS_SH_PLL_L_VAL (0x004)
2743#define APCS_SH_PLL_M_VAL (0x008)
2744#define APCS_SH_PLL_N_VAL (0x00C)
2745#define APCS_SH_PLL_USER_CTL (0x010)
2746#define APCS_SH_PLL_CONFIG_CTL (0x014)
2747#define APCS_SH_PLL_STATUS (0x01C)
2748
2749enum vdd_sr2_pll_levels {
2750 VDD_SR2_PLL_OFF,
2751 VDD_SR2_PLL_ON,
2752 VDD_SR2_PLL_NUM
2753};
2754
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002755static const int *vdd_sr2_levels[] = {
2756 [VDD_SR2_PLL_OFF] = VDD_UV(0),
2757 [VDD_SR2_PLL_ON] = VDD_UV(1800000),
2758};
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002759
Patrick Dalyebc26bc2013-02-05 11:49:07 -08002760static DEFINE_VDD_REGULATORS(vdd_sr2_pll, VDD_SR2_PLL_NUM, 1, vdd_sr2_levels);
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002761
2762static struct pll_freq_tbl apcs_pll_freq[] = {
2763 F_APCS_PLL( 384000000, 20, 0x0, 0x1, 0x0, 0x0, 0x0),
2764 F_APCS_PLL( 787200000, 41, 0x0, 0x1, 0x0, 0x0, 0x0),
2765 F_APCS_PLL( 998400000, 52, 0x0, 0x1, 0x0, 0x0, 0x0),
2766 F_APCS_PLL(1190400000, 62, 0x0, 0x1, 0x0, 0x0, 0x0),
2767 PLL_F_END
2768};
2769
2770static struct pll_clk a7sspll = {
2771 .mode_reg = (void __iomem *)APCS_SH_PLL_MODE,
2772 .l_reg = (void __iomem *)APCS_SH_PLL_L_VAL,
2773 .m_reg = (void __iomem *)APCS_SH_PLL_M_VAL,
2774 .n_reg = (void __iomem *)APCS_SH_PLL_N_VAL,
2775 .config_reg = (void __iomem *)APCS_SH_PLL_USER_CTL,
2776 .status_reg = (void __iomem *)APCS_SH_PLL_STATUS,
2777 .freq_tbl = apcs_pll_freq,
2778 .masks = {
2779 .vco_mask = BM(29, 28),
2780 .pre_div_mask = BIT(12),
2781 .post_div_mask = BM(9, 8),
2782 .mn_en_mask = BIT(24),
2783 .main_output_mask = BIT(0),
2784 },
2785 .base = &virt_bases[APCS_PLL_BASE],
2786 .c = {
2787 .dbg_name = "a7sspll",
2788 .ops = &clk_ops_sr2_pll,
2789 .vdd_class = &vdd_sr2_pll,
2790 .fmax = (unsigned long [VDD_SR2_PLL_NUM]) {
2791 [VDD_SR2_PLL_ON] = ULONG_MAX,
2792 },
2793 .num_fmax = VDD_SR2_PLL_NUM,
2794 CLK_INIT(a7sspll.c),
2795 /*
2796 * Need to skip handoff of the acpu pll to avoid
2797 * turning off the pll when the cpu is using it
2798 */
2799 .flags = CLKFLAG_SKIP_HANDOFF,
2800 },
2801};
2802
2803static DEFINE_CLK_VOTER(pnoc_msmbus_clk, &pnoc_clk.c, LONG_MAX);
2804static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX);
2805static DEFINE_CLK_VOTER(cnoc_msmbus_clk, &cnoc_clk.c, LONG_MAX);
2806static DEFINE_CLK_VOTER(pnoc_msmbus_a_clk, &pnoc_a_clk.c, LONG_MAX);
2807static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX);
2808static DEFINE_CLK_VOTER(cnoc_msmbus_a_clk, &cnoc_a_clk.c, LONG_MAX);
2809
2810static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX);
2811static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX);
2812static DEFINE_CLK_VOTER(bimc_acpu_a_clk, &bimc_a_clk.c, LONG_MAX);
2813static DEFINE_CLK_VOTER(oxili_gfx3d_clk_src, &gfx3d_clk_src.c, LONG_MAX);
2814static DEFINE_CLK_VOTER(ocmemgx_msmbus_clk, &ocmemgx_clk.c, LONG_MAX);
2815static DEFINE_CLK_VOTER(ocmemgx_msmbus_a_clk, &ocmemgx_a_clk.c, LONG_MAX);
2816static DEFINE_CLK_VOTER(ocmemgx_core_clk, &ocmemgx_clk.c, LONG_MAX);
2817
2818static DEFINE_CLK_VOTER(pnoc_sps_clk, &pnoc_clk.c, LONG_MAX);
2819
2820#ifdef CONFIG_DEBUG_FS
2821static int measure_clk_set_parent(struct clk *c, struct clk *parent)
2822{
2823 struct measure_clk *clk = to_measure_clk(c);
2824 unsigned long flags;
Patrick Dalyb4997982013-01-31 11:45:28 -08002825 u32 regval, clk_sel, found = 0;
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002826 int i;
Patrick Dalyb4997982013-01-31 11:45:28 -08002827 static const struct measure_mux_entry *array[] = {
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002828 measure_mux_GCC,
2829 measure_mux_MMSS,
2830 measure_mux_LPASS,
2831 measure_mux_APSS,
2832 NULL
2833 };
Patrick Dalyb4997982013-01-31 11:45:28 -08002834 const struct measure_mux_entry *mux = array[0];
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002835
2836 if (!parent)
2837 return -EINVAL;
2838
Patrick Dalyb4997982013-01-31 11:45:28 -08002839 for (i = 0; array[i] && !found; i++) {
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002840 for (mux = array[i]; mux->c != &dummy_clk; mux++)
Patrick Dalyb4997982013-01-31 11:45:28 -08002841 if (mux->c == parent) {
2842 found = 1;
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002843 break;
Patrick Dalyb4997982013-01-31 11:45:28 -08002844 }
Patrick Dalyeb370ea2012-10-23 11:57:50 -07002845 }
2846
2847 if (mux->c == &dummy_clk)
2848 return -EINVAL;
2849
2850 spin_lock_irqsave(&local_clock_reg_lock, flags);
2851 /*
2852 * Program the test vector, measurement period (sample_ticks)
2853 * and scaling multiplier.
2854 */
2855 clk->sample_ticks = 0x10000;
2856 clk->multiplier = 1;
2857
2858 switch (mux->base) {
2859
2860 case GCC_BASE:
2861 writel_relaxed(0, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2862 clk_sel = mux->debug_mux;
2863 break;
2864
2865 case MMSS_BASE:
2866 writel_relaxed(0, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2867 clk_sel = 0x02C;
2868 regval = BVAL(11, 0, mux->debug_mux);
2869 writel_relaxed(regval, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2870
2871 /* Activate debug clock output */
2872 regval |= BIT(16);
2873 writel_relaxed(regval, MMSS_REG_BASE(MMSS_DEBUG_CLK_CTL));
2874 break;
2875
2876 case LPASS_BASE:
2877 writel_relaxed(0, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2878 clk_sel = 0x161;
2879 regval = BVAL(11, 0, mux->debug_mux);
2880 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2881
2882 /* Activate debug clock output */
2883 regval |= BIT(20);
2884 writel_relaxed(regval, LPASS_REG_BASE(LPASS_DEBUG_CLK_CTL));
2885 break;
2886
2887 case APCS_BASE:
2888 clk->multiplier = 4;
2889 clk_sel = 362;
2890 regval = readl_relaxed(APCS_REG_BASE(GLB_CLK_DIAG));
2891 regval &= ~0xC0037335;
2892 /* configure a divider of 4 */
2893 regval = BVAL(31, 30, 0x3) | mux->debug_mux;
2894 writel_relaxed(regval, APCS_REG_BASE(GLB_CLK_DIAG));
2895 break;
2896
2897 default:
2898 return -EINVAL;
2899 }
2900
2901 /* Set debug mux clock index */
2902 regval = BVAL(8, 0, clk_sel);
2903 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2904
2905 /* Activate debug clock output */
2906 regval |= BIT(16);
2907 writel_relaxed(regval, GCC_REG_BASE(GCC_DEBUG_CLK_CTL));
2908
2909 /* Make sure test vector is set before starting measurements. */
2910 mb();
2911 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2912
2913 return 0;
2914}
2915
2916/* Sample clock for 'ticks' reference clock ticks. */
2917static u32 run_measurement(unsigned ticks)
2918{
2919 /* Stop counters and set the XO4 counter start value. */
2920 writel_relaxed(ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL));
2921
2922 /* Wait for timer to become ready. */
2923 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2924 BIT(25)) != 0)
2925 cpu_relax();
2926
2927 /* Run measurement and wait for completion. */
2928 writel_relaxed(BIT(20)|ticks, GCC_REG_BASE(CLOCK_FRQ_MEASURE_CTL));
2929 while ((readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2930 BIT(25)) == 0)
2931 cpu_relax();
2932
2933 /* Return measured ticks. */
2934 return readl_relaxed(GCC_REG_BASE(CLOCK_FRQ_MEASURE_STATUS)) &
2935 BM(24, 0);
2936}
2937
2938/*
2939 * Perform a hardware rate measurement for a given clock.
2940 * FOR DEBUG USE ONLY: Measurements take ~15 ms!
2941 */
2942static unsigned long measure_clk_get_rate(struct clk *c)
2943{
2944 unsigned long flags;
2945 u32 gcc_xo4_reg_backup;
2946 u64 raw_count_short, raw_count_full;
2947 struct measure_clk *clk = to_measure_clk(c);
2948 unsigned ret;
2949
2950 ret = clk_prepare_enable(&xo.c);
2951 if (ret) {
2952 pr_warn("CXO clock failed to enable. Can't measure\n");
2953 return 0;
2954 }
2955
2956 spin_lock_irqsave(&local_clock_reg_lock, flags);
2957
2958 /* Enable CXO/4 and RINGOSC branch. */
2959 gcc_xo4_reg_backup = readl_relaxed(GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2960 writel_relaxed(0x1, GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2961
2962 /*
2963 * The ring oscillator counter will not reset if the measured clock
2964 * is not running. To detect this, run a short measurement before
2965 * the full measurement. If the raw results of the two are the same
2966 * then the clock must be off.
2967 */
2968
2969 /* Run a short measurement. (~1 ms) */
2970 raw_count_short = run_measurement(0x1000);
2971 /* Run a full measurement. (~14 ms) */
2972 raw_count_full = run_measurement(clk->sample_ticks);
2973
2974 writel_relaxed(gcc_xo4_reg_backup, GCC_REG_BASE(GCC_XO_DIV4_CBCR));
2975
2976 /* Return 0 if the clock is off. */
2977 if (raw_count_full == raw_count_short) {
2978 ret = 0;
2979 } else {
2980 /* Compute rate in Hz. */
2981 raw_count_full = ((raw_count_full * 10) + 15) * 4800000;
2982 do_div(raw_count_full, ((clk->sample_ticks * 10) + 35));
2983 ret = (raw_count_full * clk->multiplier);
2984 }
2985
2986 writel_relaxed(0x51A00, GCC_REG_BASE(PLLTEST_PAD_CFG));
2987 spin_unlock_irqrestore(&local_clock_reg_lock, flags);
2988
2989 clk_disable_unprepare(&xo.c);
2990
2991 return ret;
2992}
2993
2994#else /* !CONFIG_DEBUG_FS */
2995static int measure_clk_set_parent(struct clk *clk, struct clk *parent)
2996{
2997 return -EINVAL;
2998}
2999
3000static unsigned long measure_clk_get_rate(struct clk *clk)
3001{
3002 return 0;
3003}
3004#endif /* CONFIG_DEBUG_FS */
3005
3006static struct clk_ops clk_ops_measure = {
3007 .set_parent = measure_clk_set_parent,
3008 .get_rate = measure_clk_get_rate,
3009};
3010
3011static struct measure_clk measure_clk = {
3012 .c = {
3013 .dbg_name = "measure_clk",
3014 .ops = &clk_ops_measure,
3015 CLK_INIT(measure_clk.c),
3016 },
3017 .multiplier = 1,
3018};
3019
3020static struct clk_lookup msm_clocks_8226[] = {
3021 /* Debug Clocks */
3022 CLK_LOOKUP("measure", measure_clk.c, "debug"),
3023 CLK_LOOKUP("apc0_m_clk", apc0_m_clk, ""),
3024 CLK_LOOKUP("apc1_m_clk", apc1_m_clk, ""),
3025 CLK_LOOKUP("apc2_m_clk", apc2_m_clk, ""),
3026 CLK_LOOKUP("apc3_m_clk", apc3_m_clk, ""),
3027 CLK_LOOKUP("l2_m_clk", l2_m_clk, ""),
3028
3029 /* PIL-LPASS */
3030 CLK_LOOKUP("xo", xo.c, "fe200000.qcom,lpass"),
3031 CLK_LOOKUP("core_clk", q6ss_xo_clk.c, "fe200000.qcom,lpass"),
3032 CLK_LOOKUP("bus_clk", gcc_lpass_q6_axi_clk.c, "fe200000.qcom,lpass"),
3033 CLK_LOOKUP("iface_clk", q6ss_ahb_lfabif_clk.c, "fe200000.qcom,lpass"),
3034 CLK_LOOKUP("reg_clk", q6ss_ahbm_clk.c, "fe200000.qcom,lpass"),
3035
3036 /* PIL-MODEM */
3037 CLK_LOOKUP("xo", xo.c, "fc880000.qcom,mss"),
3038 CLK_LOOKUP("bus_clk", gcc_mss_q6_bimc_axi_clk.c, "fc880000.qcom,mss"),
3039 CLK_LOOKUP("iface_clk", gcc_mss_cfg_ahb_clk.c, "fc880000.qcom,mss"),
3040 CLK_LOOKUP("mem_clk", gcc_boot_rom_ahb_clk.c, "fc880000.qcom,mss"),
3041
3042 /* PIL-PRONTO */
3043 CLK_LOOKUP("xo", xo.c, "fb21b000.qcom,pronto"),
3044
3045 /* PIL-VENUS */
3046 CLK_LOOKUP("src_clk", vcodec0_clk_src.c, "fdce0000.qcom,venus"),
3047 CLK_LOOKUP("core_clk", venus0_vcodec0_clk.c, "fdce0000.qcom,venus"),
3048 CLK_LOOKUP("iface_clk", venus0_ahb_clk.c, "fdce0000.qcom,venus"),
3049 CLK_LOOKUP("bus_clk", venus0_axi_clk.c, "fdce0000.qcom,venus"),
3050 CLK_LOOKUP("mem_clk", venus0_ahb_clk.c, "fdce0000.qcom,venus"),
3051
3052 /* ACPUCLOCK */
3053 CLK_LOOKUP("xo", xo_a_clk.c, "f9011050.qcom,acpuclk"),
3054 CLK_LOOKUP("gpll0", gpll0_ao.c, "f9011050.qcom,acpuclk"),
3055 CLK_LOOKUP("a7sspll", a7sspll.c, "f9011050.qcom,acpuclk"),
3056
3057 /* WCNSS CLOCKS */
Patrick Dalyc6355d22013-03-06 13:39:48 -08003058 CLK_LOOKUP("xo", xo.c, "fb000000.qcom,wcnss-wlan"),
3059 CLK_LOOKUP("rf_clk", cxo_a2.c, "fb000000.qcom,wcnss-wlan"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003060
3061 /* BUS DRIVER */
3062 CLK_LOOKUP("bus_clk", cnoc_msmbus_clk.c, "msm_config_noc"),
3063 CLK_LOOKUP("bus_a_clk", cnoc_msmbus_a_clk.c, "msm_config_noc"),
3064 CLK_LOOKUP("bus_clk", snoc_msmbus_clk.c, "msm_sys_noc"),
3065 CLK_LOOKUP("bus_a_clk", snoc_msmbus_a_clk.c, "msm_sys_noc"),
3066 CLK_LOOKUP("bus_clk", pnoc_msmbus_clk.c, "msm_periph_noc"),
3067 CLK_LOOKUP("bus_a_clk", pnoc_msmbus_a_clk.c, "msm_periph_noc"),
3068 CLK_LOOKUP("mem_clk", bimc_msmbus_clk.c, "msm_bimc"),
3069 CLK_LOOKUP("mem_a_clk", bimc_msmbus_a_clk.c, "msm_bimc"),
3070 CLK_LOOKUP("mem_clk", bimc_acpu_a_clk.c, ""),
3071 CLK_LOOKUP("ocmem_clk", ocmemgx_msmbus_clk.c, "msm_bus"),
3072 CLK_LOOKUP("ocmem_a_clk", ocmemgx_msmbus_a_clk.c, "msm_bus"),
3073 CLK_LOOKUP("bus_clk", mmss_s0_axi_clk.c, "msm_mmss_noc"),
3074 CLK_LOOKUP("bus_a_clk", mmss_s0_axi_clk.c, "msm_mmss_noc"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003075
Aparna Das8c8e9752013-02-28 21:23:24 -08003076 /* CoreSight clocks */
3077 CLK_LOOKUP("core_clk", qdss_clk.c, "fc322000.tmc"),
3078 CLK_LOOKUP("core_clk", qdss_clk.c, "fc318000.tpiu"),
3079 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31c000.replicator"),
3080 CLK_LOOKUP("core_clk", qdss_clk.c, "fc307000.tmc"),
3081 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31b000.funnel"),
3082 CLK_LOOKUP("core_clk", qdss_clk.c, "fc319000.funnel"),
3083 CLK_LOOKUP("core_clk", qdss_clk.c, "fc31a000.funnel"),
3084 CLK_LOOKUP("core_clk", qdss_clk.c, "fc345000.funnel"),
3085 CLK_LOOKUP("core_clk", qdss_clk.c, "fc364000.funnel"),
3086 CLK_LOOKUP("core_clk", qdss_clk.c, "fc321000.stm"),
3087 CLK_LOOKUP("core_clk", qdss_clk.c, "fc33c000.etm"),
3088 CLK_LOOKUP("core_clk", qdss_clk.c, "fc33d000.etm"),
3089 CLK_LOOKUP("core_clk", qdss_clk.c, "fc33e000.etm"),
3090 CLK_LOOKUP("core_clk", qdss_clk.c, "fc33f000.etm"),
Pushkar Joshi14676cc2013-03-11 14:53:53 -07003091 CLK_LOOKUP("core_clk", qdss_clk.c, "fc33c000.jtagmm"),
3092 CLK_LOOKUP("core_clk", qdss_clk.c, "fc33d000.jtagmm"),
3093 CLK_LOOKUP("core_clk", qdss_clk.c, "fc33e000.jtagmm"),
3094 CLK_LOOKUP("core_clk", qdss_clk.c, "fc33f000.jtagmm"),
Aparna Dasbb65be42013-03-07 12:39:45 -08003095 CLK_LOOKUP("core_clk", qdss_clk.c, "fc308000.cti"),
3096 CLK_LOOKUP("core_clk", qdss_clk.c, "fc309000.cti"),
3097 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30a000.cti"),
3098 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30b000.cti"),
3099 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30c000.cti"),
3100 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30d000.cti"),
3101 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30e000.cti"),
3102 CLK_LOOKUP("core_clk", qdss_clk.c, "fc30f000.cti"),
3103 CLK_LOOKUP("core_clk", qdss_clk.c, "fc310000.cti"),
3104 CLK_LOOKUP("core_clk", qdss_clk.c, "fc340000.cti"),
3105 CLK_LOOKUP("core_clk", qdss_clk.c, "fc341000.cti"),
3106 CLK_LOOKUP("core_clk", qdss_clk.c, "fc342000.cti"),
3107 CLK_LOOKUP("core_clk", qdss_clk.c, "fc343000.cti"),
3108 CLK_LOOKUP("core_clk", qdss_clk.c, "fc344000.cti"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003109
Aparna Das8c8e9752013-02-28 21:23:24 -08003110 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc322000.tmc"),
3111 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc318000.tpiu"),
3112 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31c000.replicator"),
3113 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc307000.tmc"),
3114 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31b000.funnel"),
3115 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc319000.funnel"),
3116 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc31a000.funnel"),
3117 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc345000.funnel"),
3118 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc364000.funnel"),
3119 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc321000.stm"),
3120 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc33c000.etm"),
3121 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc33d000.etm"),
3122 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc33e000.etm"),
3123 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc33f000.etm"),
Pushkar Joshi14676cc2013-03-11 14:53:53 -07003124 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc33c000.jtagmm"),
3125 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc33d000.jtagmm"),
3126 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc33e000.jtagmm"),
3127 CLK_LOOKUP("core_a_clk", qdss_clk.c, "fc33f000.jtagmm"),
Aparna Dasbb65be42013-03-07 12:39:45 -08003128 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc308000.cti"),
3129 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc309000.cti"),
3130 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30a000.cti"),
3131 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30b000.cti"),
3132 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30c000.cti"),
3133 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30d000.cti"),
3134 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30e000.cti"),
3135 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc30f000.cti"),
3136 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc310000.cti"),
3137 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc340000.cti"),
3138 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc341000.cti"),
3139 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc342000.cti"),
3140 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc343000.cti"),
3141 CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "fc344000.cti"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003142
3143 /* HSUSB-OTG Clocks */
3144 CLK_LOOKUP("xo", xo.c, "f9a55000.usb"),
3145 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "f9a55000.usb"),
3146 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "f9a55000.usb"),
3147
3148 /* SPS CLOCKS */
3149 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "f9984000.qcom,sps"),
3150 CLK_LOOKUP("dma_bam_pclk", gcc_bam_dma_ahb_clk.c, "f9884000.qcom,sps"),
3151 CLK_LOOKUP("dfab_clk", pnoc_sps_clk.c, "msm_sps"),
3152 CLK_LOOKUP("dma_bam_pclk", gcc_bam_dma_ahb_clk.c, "msm_sps"),
3153
3154 /* I2C Clocks */
3155 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9926000.i2c"),
3156 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, "f9926000.i2c"),
3157
Amy Maloche41708ba2013-03-03 15:19:27 -08003158 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9927000.i2c"),
3159 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, "f9927000.i2c"),
3160
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003161 /* lsuart-v14 Clocks */
3162 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f991f000.serial"),
3163 CLK_LOOKUP("core_clk", gcc_blsp1_uart3_apps_clk.c, "f991f000.serial"),
3164
3165 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f995e000.serial"),
3166 CLK_LOOKUP("core_clk", gcc_blsp1_uart2_apps_clk.c, "f995e000.serial"),
3167
Gilad Avidovd59217c2013-02-01 13:45:59 -07003168 CLK_LOOKUP("iface_clk", gcc_blsp1_ahb_clk.c, "f9923000.spi"),
3169 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_spi_apps_clk.c, "f9923000.spi"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003170
3171 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "qseecom"),
3172 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "qseecom"),
3173 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "qseecom"),
3174 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "qseecom"),
3175
Patrick Dalyd5234252013-03-07 16:35:08 -08003176 CLK_LOOKUP("core_clk", gcc_ce1_clk.c, "scm"),
3177 CLK_LOOKUP("iface_clk", gcc_ce1_ahb_clk.c, "scm"),
3178 CLK_LOOKUP("bus_clk", gcc_ce1_axi_clk.c, "scm"),
3179 CLK_LOOKUP("core_clk_src", ce1_clk_src.c, "scm"),
3180
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003181 /* SDCC */
3182 CLK_LOOKUP("iface_clk", gcc_sdcc1_ahb_clk.c, "f9824000.qcom,sdcc"),
3183 CLK_LOOKUP("core_clk", gcc_sdcc1_apps_clk.c, "f9824000.qcom,sdcc"),
3184 CLK_LOOKUP("iface_clk", gcc_sdcc1_ahb_clk.c, "msm_sdcc.1"),
3185 CLK_LOOKUP("core_clk", gcc_sdcc1_apps_clk.c, "msm_sdcc.1"),
3186
3187 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "f98a4000.qcom,sdcc"),
3188 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "f98a4000.qcom,sdcc"),
3189 CLK_LOOKUP("iface_clk", gcc_sdcc2_ahb_clk.c, "msm_sdcc.2"),
3190 CLK_LOOKUP("core_clk", gcc_sdcc2_apps_clk.c, "msm_sdcc.2"),
3191
3192 CLK_LOOKUP("iface_clk", gcc_sdcc3_ahb_clk.c, "msm_sdcc.3"),
3193 CLK_LOOKUP("core_clk", gcc_sdcc3_apps_clk.c, "msm_sdcc.3"),
3194
3195 CLK_LOOKUP("sleep_a_clk", gcc_usb2a_phy_sleep_clk.c, "msm_dwc3"),
3196 CLK_LOOKUP("ref_clk", diff_clk.c, "msm_dwc3"),
3197
3198
3199 CLK_LOOKUP("bus_clk", pnoc_clk.c, ""),
3200 CLK_LOOKUP("bus_clk", pnoc_a_clk.c, ""),
3201 CLK_LOOKUP("bus_clk", snoc_clk.c, ""),
3202 CLK_LOOKUP("bus_clk", snoc_a_clk.c, ""),
3203 CLK_LOOKUP("bus_clk", cnoc_clk.c, ""),
3204 CLK_LOOKUP("bus_clk", cnoc_a_clk.c, ""),
3205 CLK_LOOKUP("bus_clk", mmssnoc_ahb_clk.c, ""),
3206 CLK_LOOKUP("bus_clk", mmssnoc_ahb_a_clk.c, ""),
3207 CLK_LOOKUP("bus_clk", bimc_clk.c, ""),
3208 CLK_LOOKUP("bus_clk", bimc_a_clk.c, ""),
3209 CLK_LOOKUP("bus_clk_src", axi_clk_src.c, ""),
3210
3211 CLK_LOOKUP("gpll0", gpll0.c, ""),
3212 CLK_LOOKUP("gpll1", gpll1.c, ""),
3213 CLK_LOOKUP("mmpll0", mmpll0_pll.c, ""),
3214 CLK_LOOKUP("mmpll1", mmpll1_pll.c, ""),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003215
3216 CLK_LOOKUP("core_clk", gcc_blsp1_qup1_i2c_apps_clk.c, ""),
3217 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_i2c_apps_clk.c, ""),
3218 CLK_LOOKUP("core_clk", gcc_blsp1_qup2_spi_apps_clk.c, ""),
3219 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_i2c_apps_clk.c, ""),
3220 CLK_LOOKUP("core_clk", gcc_blsp1_qup3_spi_apps_clk.c, ""),
3221 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_i2c_apps_clk.c, ""),
3222 CLK_LOOKUP("core_clk", gcc_blsp1_qup4_spi_apps_clk.c, ""),
3223 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_i2c_apps_clk.c, ""),
3224 CLK_LOOKUP("core_clk", gcc_blsp1_qup5_spi_apps_clk.c, ""),
3225 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_i2c_apps_clk.c, ""),
3226 CLK_LOOKUP("core_clk", gcc_blsp1_qup6_spi_apps_clk.c, ""),
3227 CLK_LOOKUP("core_clk", gcc_blsp1_uart1_apps_clk.c, ""),
3228 CLK_LOOKUP("core_clk", gcc_blsp1_uart4_apps_clk.c, ""),
3229 CLK_LOOKUP("core_clk", gcc_blsp1_uart5_apps_clk.c, ""),
3230 CLK_LOOKUP("core_clk", gcc_blsp1_uart6_apps_clk.c, ""),
3231 CLK_LOOKUP("core_clk", gcc_pdm2_clk.c, ""),
3232 CLK_LOOKUP("iface_clk", gcc_pdm_ahb_clk.c, ""),
3233 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, ""),
3234 CLK_LOOKUP("core_clk", gcc_gp1_clk.c, ""),
3235 CLK_LOOKUP("core_clk", gcc_gp2_clk.c, ""),
3236 CLK_LOOKUP("core_clk", gcc_gp3_clk.c, ""),
3237
3238 CLK_LOOKUP("iface_clk", gcc_usb_hsic_ahb_clk.c, "msm_hsic_host"),
3239 CLK_LOOKUP("phy_clk", gcc_usb_hsic_clk.c, "msm_hsic_host"),
3240 CLK_LOOKUP("cal_clk", gcc_usb_hsic_io_cal_clk.c, "msm_hsic_host"),
3241 CLK_LOOKUP("core_clk", gcc_usb_hsic_system_clk.c, "msm_hsic_host"),
3242 CLK_LOOKUP("ref_clk", div_clk2.c, "msm_smsc_hub"),
3243 CLK_LOOKUP("iface_clk", gcc_usb_hs_ahb_clk.c, "msm_ehci_host"),
3244 CLK_LOOKUP("core_clk", gcc_usb_hs_system_clk.c, "msm_ehci_host"),
3245 CLK_LOOKUP("pwm_clk", div_clk2.c, "0-0048"),
3246
3247 /* Multimedia clocks */
3248 CLK_LOOKUP("byte_clk", mdss_byte0_clk.c, "fd922800.qcom,mdss_dsi"),
3249 CLK_LOOKUP("core_clk", mdss_esc0_clk.c, "fd922800.qcom,mdss_dsi"),
3250 CLK_LOOKUP("pixel_clk", mdss_pclk0_clk.c, "fd922800.qcom,mdss_dsi"),
3251 CLK_LOOKUP("iface_clk", mdss_ahb_clk.c, "mdss_dsi_clk_ctrl"),
3252
Adrian Salido-Morenof840a032013-03-01 23:10:03 -08003253 CLK_LOOKUP("core_clk", mdss_mdp_clk.c, "fd900000.qcom,mdss_mdp"),
3254 CLK_LOOKUP("lut_clk", mdss_mdp_lut_clk.c, "fd900000.qcom,mdss_mdp"),
3255 CLK_LOOKUP("core_clk_src", mdp_clk_src.c, "fd900000.qcom,mdss_mdp"),
3256 CLK_LOOKUP("vsync_clk", mdss_vsync_clk.c, "fd900000.qcom,mdss_mdp"),
3257 CLK_LOOKUP("iface_clk", mdss_ahb_clk.c, "fd900000.qcom,mdss_mdp"),
3258 CLK_LOOKUP("bus_clk", mdss_axi_clk.c, "fd900000.qcom,mdss_mdp"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003259
3260 CLK_LOOKUP("iface_clk", mdss_ahb_clk.c, "fd928000.qcom,iommu"),
3261 CLK_LOOKUP("core_clk", mdss_axi_clk.c, "fd928000.qcom,iommu"),
3262
3263 /* MM sensor clocks */
Su Liud1c66ee2013-03-22 15:29:48 -07003264 CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6f.qcom,camera"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003265 CLK_LOOKUP("cam_src_clk", mclk1_clk_src.c, "90.qcom,camera"),
Su Liud1c66ee2013-03-22 15:29:48 -07003266 CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6d.qcom,camera"),
3267 CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6f.qcom,camera"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003268 CLK_LOOKUP("cam_clk", camss_mclk1_clk.c, "90.qcom,camera"),
Su Liud1c66ee2013-03-22 15:29:48 -07003269 CLK_LOOKUP("cam_clk", camss_mclk0_clk.c, "6d.qcom,camera"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003270
3271 /* CCI clocks */
3272 CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
3273 "fda0c000.qcom,cci"),
3274 CLK_LOOKUP("cci_ahb_clk", camss_cci_cci_ahb_clk.c,
3275 "fda0c000.qcom,cci"),
3276 CLK_LOOKUP("cci_src_clk", cci_clk_src.c, "fda0c000.qcom,cci"),
3277 CLK_LOOKUP("cci_clk", camss_cci_cci_clk.c, "fda0c000.qcom,cci"),
3278
3279 /* CSIPHY clocks */
3280 CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
3281 "fda0ac00.qcom,csiphy"),
3282 CLK_LOOKUP("ispif_ahb_clk", camss_ispif_ahb_clk.c,
3283 "fda0ac00.qcom,csiphy"),
3284 CLK_LOOKUP("csiphy_timer_src_clk", csi0phytimer_clk_src.c,
3285 "fda0ac00.qcom,csiphy"),
3286 CLK_LOOKUP("csiphy_timer_clk", camss_phy0_csi0phytimer_clk.c,
3287 "fda0ac00.qcom,csiphy"),
3288 CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
3289 "fda0b000.qcom,csiphy"),
3290 CLK_LOOKUP("ispif_ahb_clk", camss_ispif_ahb_clk.c,
3291 "fda0b000.qcom,csiphy"),
3292 CLK_LOOKUP("csiphy_timer_src_clk", csi1phytimer_clk_src.c,
3293 "fda0b000.qcom,csiphy"),
3294 CLK_LOOKUP("csiphy_timer_clk", camss_phy1_csi1phytimer_clk.c,
3295 "fda0b000.qcom,csiphy"),
3296
3297 /* CSID clocks */
3298 CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
3299 "fda08000.qcom,csid"),
3300 CLK_LOOKUP("ispif_ahb_clk", camss_ispif_ahb_clk.c,
3301 "fda08000.qcom,csid"),
3302 CLK_LOOKUP("csi0_ahb_clk", camss_csi0_ahb_clk.c, "fda08000.qcom,csid"),
3303 CLK_LOOKUP("csi0_src_clk", csi0_clk_src.c, "fda08000.qcom,csid"),
3304 CLK_LOOKUP("csi0_phy_clk", camss_csi0phy_clk.c, "fda08000.qcom,csid"),
3305 CLK_LOOKUP("csi0_clk", camss_csi0_clk.c, "fda08000.qcom,csid"),
3306 CLK_LOOKUP("csi0_pix_clk", camss_csi0pix_clk.c, "fda08000.qcom,csid"),
3307 CLK_LOOKUP("csi0_rdi_clk", camss_csi0rdi_clk.c, "fda08000.qcom,csid"),
3308
3309 CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
3310 "fda08400.qcom,csid"),
3311 CLK_LOOKUP("ispif_ahb_clk", camss_ispif_ahb_clk.c,
3312 "fda08400.qcom,csid"),
3313 CLK_LOOKUP("csi0_ahb_clk", camss_csi0_ahb_clk.c, "fda08400.qcom,csid"),
3314 CLK_LOOKUP("csi1_ahb_clk", camss_csi1_ahb_clk.c, "fda08400.qcom,csid"),
3315 CLK_LOOKUP("csi0_src_clk", csi0_clk_src.c, "fda08400.qcom,csid"),
3316 CLK_LOOKUP("csi1_src_clk", csi1_clk_src.c, "fda08400.qcom,csid"),
3317 CLK_LOOKUP("csi0_phy_clk", camss_csi0phy_clk.c, "fda08400.qcom,csid"),
3318 CLK_LOOKUP("csi1_phy_clk", camss_csi1phy_clk.c, "fda08400.qcom,csid"),
3319 CLK_LOOKUP("csi0_pix_clk", camss_csi0pix_clk.c, "fda08400.qcom,csid"),
3320 CLK_LOOKUP("csi1_pix_clk", camss_csi1pix_clk.c, "fda08400.qcom,csid"),
3321 CLK_LOOKUP("csi0_rdi_clk", camss_csi0rdi_clk.c, "fda08400.qcom,csid"),
3322 CLK_LOOKUP("csi1_rdi_clk", camss_csi1rdi_clk.c, "fda08400.qcom,csid"),
3323
3324 /* ISPIF clocks */
3325 CLK_LOOKUP("camss_vfe_vfe_clk", camss_vfe_vfe0_clk.c,
3326 "fda0a000.qcom,ispif"),
3327 CLK_LOOKUP("camss_csi_vfe_clk", camss_csi_vfe0_clk.c,
3328 "fda0a000.qcom,ispif"),
3329
3330 /* VFE clocks */
3331 CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
3332 "fda10000.qcom,vfe"),
3333 CLK_LOOKUP("vfe_clk_src", vfe0_clk_src.c, "fda10000.qcom,vfe"),
3334 CLK_LOOKUP("camss_vfe_vfe_clk", camss_vfe_vfe0_clk.c,
3335 "fda10000.qcom,vfe"),
3336 CLK_LOOKUP("camss_csi_vfe_clk", camss_csi_vfe0_clk.c,
3337 "fda10000.qcom,vfe"),
3338 CLK_LOOKUP("iface_clk", camss_vfe_vfe_ahb_clk.c, "fda10000.qcom,vfe"),
3339 CLK_LOOKUP("bus_clk", camss_vfe_vfe_axi_clk.c, "fda10000.qcom,vfe"),
3340
3341 CLK_LOOKUP("iface_clk", camss_vfe_vfe_ahb_clk.c,
3342 "fda44000.qcom,iommu"),
3343 CLK_LOOKUP("core_clk", camss_vfe_vfe_axi_clk.c, "fda44000.qcom,iommu"),
3344 CLK_LOOKUP("alt_core_clk", camss_top_ahb_clk.c, "fda44000.qcom,iommu"),
3345
3346 /* Jpeg Clocks */
3347 CLK_LOOKUP("core_clk", camss_jpeg_jpeg0_clk.c, "fda1c000.qcom,jpeg"),
3348 CLK_LOOKUP("iface_clk", camss_jpeg_jpeg_ahb_clk.c,
3349 "fda1c000.qcom,jpeg"),
3350 CLK_LOOKUP("bus_clk0", camss_jpeg_jpeg_axi_clk.c,
3351 "fda1c000.qcom,jpeg"),
3352 CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
3353 "fda1c000.qcom,jpeg"),
3354
3355 CLK_LOOKUP("alt_core_clk", camss_top_ahb_clk.c, "fda64000.qcom,iommu"),
3356 CLK_LOOKUP("iface_clk", camss_jpeg_jpeg_ahb_clk.c,
3357 "fda64000.qcom,iommu"),
3358 CLK_LOOKUP("core_clk", camss_jpeg_jpeg_axi_clk.c,
3359 "fda64000.qcom,iommu"),
3360
Su Liudb7b2062013-03-14 20:57:15 -07003361 CLK_LOOKUP("micro_iface_clk", camss_micro_ahb_clk.c,
3362 "fda04000.qcom,cpp"),
3363 CLK_LOOKUP("camss_top_ahb_clk", camss_top_ahb_clk.c,
3364 "fda04000.qcom,cpp"),
3365 CLK_LOOKUP("cpp_iface_clk", camss_vfe_cpp_ahb_clk.c,
3366 "fda04000.qcom,cpp"),
3367 CLK_LOOKUP("cpp_core_clk", camss_vfe_cpp_clk.c, "fda04000.qcom,cpp"),
3368 CLK_LOOKUP("cpp_bus_clk", camss_vfe_vfe_axi_clk.c, "fda04000.qcom,cpp"),
3369 CLK_LOOKUP("vfe_clk_src", vfe0_clk_src.c, "fda04000.qcom,cpp"),
3370 CLK_LOOKUP("camss_vfe_vfe_clk", camss_vfe_vfe0_clk.c,
3371 "fda04000.qcom,cpp"),
3372 CLK_LOOKUP("iface_clk", camss_vfe_vfe_ahb_clk.c, "fda04000.qcom,cpp"),
3373
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003374 /* KGSL Clocks */
3375 CLK_LOOKUP("core_clk", oxili_gfx3d_clk.c, "fdb00000.qcom,kgsl-3d0"),
3376 CLK_LOOKUP("iface_clk", oxilicx_ahb_clk.c, "fdb00000.qcom,kgsl-3d0"),
liu zhongc45eb8b2013-02-21 11:50:24 -08003377 CLK_LOOKUP("mem_iface_clk", oxilicx_axi_clk.c,
3378 "fdb00000.qcom,kgsl-3d0"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003379
3380 CLK_LOOKUP("alt_core_clk", oxili_gfx3d_clk.c, "fdb10000.qcom,iommu"),
3381 CLK_LOOKUP("iface_clk", oxilicx_ahb_clk.c, "fdb10000.qcom,iommu"),
3382 CLK_LOOKUP("core_clk", oxilicx_axi_clk.c, "fdb10000.qcom,iommu"),
3383
3384 CLK_LOOKUP("core_clk", ocmemgx_core_clk.c, "fdd00000.qcom,ocmem"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003385
3386 /* Venus Clocks */
3387 CLK_LOOKUP("core_clk", venus0_vcodec0_clk.c, "fdc00000.qcom,vidc"),
3388 CLK_LOOKUP("iface_clk", venus0_ahb_clk.c, "fdc00000.qcom,vidc"),
3389 CLK_LOOKUP("bus_clk", venus0_axi_clk.c, "fdc00000.qcom,vidc"),
3390
3391 CLK_LOOKUP("alt_core_clk", venus0_vcodec0_clk.c,
3392 "fdc84000.qcom,iommu"),
3393 CLK_LOOKUP("iface_clk", venus0_ahb_clk.c, "fdc84000.qcom,iommu"),
3394 CLK_LOOKUP("core_clk", venus0_axi_clk.c, "fdc84000.qcom,iommu"),
Hariprasad Dhalinarasimha92a13222013-03-12 11:59:28 -07003395 CLK_LOOKUP("iface_clk", gcc_prng_ahb_clk.c, "f9bff000.qcom,msm-rng"),
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003396 CLK_LOOKUP("cam_gp0_clk", camss_gp0_clk.c, ""),
3397 CLK_LOOKUP("cam_gp1_clk", camss_gp1_clk.c, ""),
3398 CLK_LOOKUP("iface_clk", camss_micro_ahb_clk.c, ""),
3399
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003400 CLK_LOOKUP("", mmss_mmssnoc_bto_ahb_clk.c, ""),
3401 CLK_LOOKUP("", mmss_mmssnoc_axi_clk.c, ""),
3402 CLK_LOOKUP("", mmss_s0_axi_clk.c, ""),
Bhalchandra Gajared5a4ba72013-03-11 16:15:13 -07003403
3404 /* Audio clocks */
3405 CLK_LOOKUP("osr_clk", div_clk1.c, "msm-dai-q6-dev.224"),
3406 CLK_LOOKUP("osr_clk", div_clk1.c, "msm-dai-q6-dev.4106"),
3407 CLK_LOOKUP("osr_clk", div_clk1.c, "msm-dai-q6-dev.16384"),
3408 CLK_LOOKUP("osr_clk", div_clk1.c, "msm-dai-q6-dev.16386"),
3409 CLK_LOOKUP("osr_clk", div_clk1.c, "msm-dai-q6-dev.16390"),
3410 CLK_LOOKUP("osr_clk", div_clk1.c, "msm-dai-q6-dev.16391"),
3411
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003412};
3413
3414static struct clk_lookup msm_clocks_8226_rumi[] = {
3415 CLK_DUMMY("core_clk", BLSP1_UART_CLK, "f991f000.serial", OFF),
3416 CLK_DUMMY("iface_clk", BLSP1_UART_CLK, "f991f000.serial", OFF),
3417 CLK_DUMMY("iface_clk", HSUSB_IFACE_CLK, "f9a55000.usb", OFF),
3418 CLK_DUMMY("core_clk", HSUSB_CORE_CLK, "f9a55000.usb", OFF),
3419 CLK_DUMMY("iface_clk", NULL, "msm_sdcc.1", OFF),
3420 CLK_DUMMY("core_clk", NULL, "msm_sdcc.1", OFF),
3421 CLK_DUMMY("bus_clk", NULL, "msm_sdcc.1", OFF),
3422 CLK_DUMMY("iface_clk", NULL, "msm_sdcc.2", OFF),
3423 CLK_DUMMY("core_clk", NULL, "msm_sdcc.2", OFF),
3424 CLK_DUMMY("bus_clk", NULL, "msm_sdcc.2", OFF),
3425};
3426
3427struct clock_init_data msm8226_rumi_clock_init_data __initdata = {
3428 .table = msm_clocks_8226_rumi,
3429 .size = ARRAY_SIZE(msm_clocks_8226_rumi),
3430};
3431
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003432static void __init reg_init(void)
3433{
Patrick Dalye02a5632013-02-12 20:23:35 -08003434 u32 regval;
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003435
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003436 /* Vote for GPLL0 to turn on. Needed by acpuclock. */
3437 regval = readl_relaxed(GCC_REG_BASE(APCS_GPLL_ENA_VOTE));
3438 regval |= BIT(0);
3439 writel_relaxed(regval, GCC_REG_BASE(APCS_GPLL_ENA_VOTE));
3440
3441 /*
Patrick Daly3668dd62013-03-04 20:27:55 -08003442 * No clocks need to be enabled during sleep.
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003443 */
3444 writel_relaxed(0x0, GCC_REG_BASE(APCS_CLOCK_SLEEP_ENA_VOTE));
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003445}
Patrick Dalye02a5632013-02-12 20:23:35 -08003446
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003447static void __init msm8226_clock_post_init(void)
3448{
Vikram Mulukutla441db7a2013-03-15 13:56:33 -07003449 /*
3450 * Hold an active set vote for CXO; this is because CXO is expected
3451 * to remain on whenever CPUs aren't power collapsed.
3452 */
3453 clk_prepare_enable(&xo_a_clk.c);
3454
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003455 /* Set rates for single-rate clocks. */
3456 clk_set_rate(&usb_hs_system_clk_src.c,
3457 usb_hs_system_clk_src.freq_tbl[0].freq_hz);
3458 clk_set_rate(&usb_hsic_clk_src.c,
3459 usb_hsic_clk_src.freq_tbl[0].freq_hz);
3460 clk_set_rate(&usb_hsic_io_cal_clk_src.c,
3461 usb_hsic_io_cal_clk_src.freq_tbl[0].freq_hz);
3462 clk_set_rate(&usb_hsic_system_clk_src.c,
3463 usb_hsic_system_clk_src.freq_tbl[0].freq_hz);
3464 clk_set_rate(&pdm2_clk_src.c, pdm2_clk_src.freq_tbl[0].freq_hz);
3465 clk_set_rate(&cci_clk_src.c, cci_clk_src.freq_tbl[0].freq_hz);
3466 clk_set_rate(&mclk0_clk_src.c, mclk0_clk_src.freq_tbl[0].freq_hz);
3467 clk_set_rate(&mclk1_clk_src.c, mclk1_clk_src.freq_tbl[0].freq_hz);
3468 clk_set_rate(&esc0_clk_src.c, esc0_clk_src.freq_tbl[0].freq_hz);
3469 clk_set_rate(&vsync_clk_src.c, vsync_clk_src.freq_tbl[0].freq_hz);
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003470}
3471
3472#define GCC_CC_PHYS 0xFC400000
3473#define GCC_CC_SIZE SZ_16K
3474
3475#define MMSS_CC_PHYS 0xFD8C0000
3476#define MMSS_CC_SIZE SZ_256K
3477
3478#define LPASS_CC_PHYS 0xFE000000
3479#define LPASS_CC_SIZE SZ_256K
3480
3481#define APCS_KPSS_SH_PLL_PHYS 0xF9016000
3482#define APCS_KPSS_SH_PLL_SIZE SZ_64
3483
3484#define APCS_KPSS_GLB_PHYS 0xF9011000
3485#define APCS_KPSS_GLB_SIZE SZ_4K
3486
3487
3488static void __init msm8226_clock_pre_init(void)
3489{
3490 virt_bases[GCC_BASE] = ioremap(GCC_CC_PHYS, GCC_CC_SIZE);
3491 if (!virt_bases[GCC_BASE])
3492 panic("clock-8226: Unable to ioremap GCC memory!");
3493
3494 virt_bases[MMSS_BASE] = ioremap(MMSS_CC_PHYS, MMSS_CC_SIZE);
3495 if (!virt_bases[MMSS_BASE])
3496 panic("clock-8226: Unable to ioremap MMSS_CC memory!");
3497
3498 virt_bases[LPASS_BASE] = ioremap(LPASS_CC_PHYS, LPASS_CC_SIZE);
3499 if (!virt_bases[LPASS_BASE])
3500 panic("clock-8226: Unable to ioremap LPASS_CC memory!");
3501
3502 virt_bases[APCS_BASE] = ioremap(APCS_KPSS_GLB_PHYS,
3503 APCS_KPSS_GLB_SIZE);
3504 if (!virt_bases[APCS_BASE])
3505 panic("clock-8226: Unable to ioremap APCS_GCC_CC memory!");
3506
3507 virt_bases[APCS_PLL_BASE] = ioremap(APCS_KPSS_SH_PLL_PHYS,
3508 APCS_KPSS_SH_PLL_SIZE);
3509 if (!virt_bases[APCS_PLL_BASE])
3510 panic("clock-8226: Unable to ioremap APCS_GCC_CC memory!");
3511
3512 clk_ops_local_pll.enable = sr_hpm_lp_pll_clk_enable;
3513
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003514 vdd_dig.regulator[0] = regulator_get(NULL, "vdd_dig");
3515 if (IS_ERR(vdd_dig.regulator[0]))
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003516 panic("clock-8226: Unable to get the vdd_dig regulator!");
3517
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003518 vdd_sr2_pll.regulator[0] = regulator_get(NULL, "vdd_sr2_pll");
3519 if (IS_ERR(vdd_sr2_pll.regulator[0]))
Patrick Daly48e00f32013-01-28 19:13:47 -08003520 panic("clock-8226: Unable to get the sr2_pll regulator!");
3521
3522 /*
Patrick Daly3668dd62013-03-04 20:27:55 -08003523 * These regulators are used at boot. Ensure they stay on
3524 * while the clock framework comes online.
Patrick Daly48e00f32013-01-28 19:13:47 -08003525 */
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003526 regulator_set_voltage(vdd_sr2_pll.regulator[0], 1800000, 1800000);
3527 regulator_enable(vdd_sr2_pll.regulator[0]);
Patrick Daly48e00f32013-01-28 19:13:47 -08003528
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003529 vote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
Patrick Dalyebc26bc2013-02-05 11:49:07 -08003530 regulator_enable(vdd_dig.regulator[0]);
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003531
3532 /*
3533 * Hold an active set vote at a rate of 40MHz for the MMSS NOC AHB
3534 * source. Sleep set vote is 0.
3535 * RPM will also turn on gcc_mmss_noc_cfg_ahb_clk, which is needed to
3536 * access mmss clock controller registers.
3537 */
3538 clk_set_rate(&mmssnoc_ahb_a_clk.c, 40000000);
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003539
Vikram Mulukutla29a06a32013-03-14 10:54:02 -07003540 /* Set an initial rate (fmax at nominal) on the MMSSNOC AXI clock */
3541 clk_set_rate(&axi_clk_src.c, 200000000);
3542
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003543 enable_rpm_scaling();
3544
3545 reg_init();
Patrick Daly5555c2c2013-03-06 21:25:26 -08003546
3547 /*
3548 * MDSS needs the ahb clock and needs to init before we register the
3549 * lookup table.
3550 */
3551 mdss_clk_ctrl_pre_init(&mdss_ahb_clk.c);
Patrick Dalyeb370ea2012-10-23 11:57:50 -07003552}
3553
3554static int __init msm8226_clock_late_init(void)
3555{
3556 return unvote_vdd_level(&vdd_dig, VDD_DIG_HIGH);
3557}
3558
3559struct clock_init_data msm8226_clock_init_data __initdata = {
3560 .table = msm_clocks_8226,
3561 .size = ARRAY_SIZE(msm_clocks_8226),
3562 .pre_init = msm8226_clock_pre_init,
3563 .post_init = msm8226_clock_post_init,
3564 .late_init = msm8226_clock_late_init,
3565};