1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * linux/arch/arm/mach-omap1/clock_data.c
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2004 - 2005, 2009-2010 Nokia Corporation
6*4882a593Smuzhiyun * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
7*4882a593Smuzhiyun * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * To do:
10*4882a593Smuzhiyun * - Clocks that are only available on some chips should be marked with the
11*4882a593Smuzhiyun * chips that they are present on.
12*4882a593Smuzhiyun */
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun #include <linux/kernel.h>
15*4882a593Smuzhiyun #include <linux/io.h>
16*4882a593Smuzhiyun #include <linux/clk.h>
17*4882a593Smuzhiyun #include <linux/cpufreq.h>
18*4882a593Smuzhiyun #include <linux/delay.h>
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #include <asm/mach-types.h> /* for machine_is_* */
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #include "soc.h"
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun #include <mach/hardware.h>
25*4882a593Smuzhiyun #include <mach/usb.h> /* for OTG_BASE */
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun #include "iomap.h"
28*4882a593Smuzhiyun #include "clock.h"
29*4882a593Smuzhiyun #include "sram.h"
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun /* Some ARM_IDLECT1 bit shifts - used in struct arm_idlect1_clk */
32*4882a593Smuzhiyun #define IDL_CLKOUT_ARM_SHIFT 12
33*4882a593Smuzhiyun #define IDLTIM_ARM_SHIFT 9
34*4882a593Smuzhiyun #define IDLAPI_ARM_SHIFT 8
35*4882a593Smuzhiyun #define IDLIF_ARM_SHIFT 6
36*4882a593Smuzhiyun #define IDLLB_ARM_SHIFT 4 /* undocumented? */
37*4882a593Smuzhiyun #define OMAP1510_IDLLCD_ARM_SHIFT 3 /* undocumented? */
38*4882a593Smuzhiyun #define IDLPER_ARM_SHIFT 2
39*4882a593Smuzhiyun #define IDLXORP_ARM_SHIFT 1
40*4882a593Smuzhiyun #define IDLWDT_ARM_SHIFT 0
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun /* Some MOD_CONF_CTRL_0 bit shifts - used in struct clk.enable_bit */
43*4882a593Smuzhiyun #define CONF_MOD_UART3_CLK_MODE_R 31
44*4882a593Smuzhiyun #define CONF_MOD_UART2_CLK_MODE_R 30
45*4882a593Smuzhiyun #define CONF_MOD_UART1_CLK_MODE_R 29
46*4882a593Smuzhiyun #define CONF_MOD_MMC_SD_CLK_REQ_R 23
47*4882a593Smuzhiyun #define CONF_MOD_MCBSP3_AUXON 20
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun /* Some MOD_CONF_CTRL_1 bit shifts - used in struct clk.enable_bit */
50*4882a593Smuzhiyun #define CONF_MOD_SOSSI_CLK_EN_R 16
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun /* Some OTG_SYSCON_2-specific bit fields */
53*4882a593Smuzhiyun #define OTG_SYSCON_2_UHOST_EN_SHIFT 8
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun /* Some SOFT_REQ_REG bit fields - used in struct clk.enable_bit */
56*4882a593Smuzhiyun #define SOFT_MMC2_DPLL_REQ_SHIFT 13
57*4882a593Smuzhiyun #define SOFT_MMC_DPLL_REQ_SHIFT 12
58*4882a593Smuzhiyun #define SOFT_UART3_DPLL_REQ_SHIFT 11
59*4882a593Smuzhiyun #define SOFT_UART2_DPLL_REQ_SHIFT 10
60*4882a593Smuzhiyun #define SOFT_UART1_DPLL_REQ_SHIFT 9
61*4882a593Smuzhiyun #define SOFT_USB_OTG_DPLL_REQ_SHIFT 8
62*4882a593Smuzhiyun #define SOFT_CAM_DPLL_REQ_SHIFT 7
63*4882a593Smuzhiyun #define SOFT_COM_MCKO_REQ_SHIFT 6
64*4882a593Smuzhiyun #define SOFT_PERIPH_REQ_SHIFT 5 /* sys_ck gate for UART2 ? */
65*4882a593Smuzhiyun #define USB_REQ_EN_SHIFT 4
66*4882a593Smuzhiyun #define SOFT_USB_REQ_SHIFT 3 /* sys_ck gate for USB host? */
67*4882a593Smuzhiyun #define SOFT_SDW_REQ_SHIFT 2 /* sys_ck gate for Bluetooth? */
68*4882a593Smuzhiyun #define SOFT_COM_REQ_SHIFT 1 /* sys_ck gate for com proc? */
69*4882a593Smuzhiyun #define SOFT_DPLL_REQ_SHIFT 0
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun /*
72*4882a593Smuzhiyun * Omap1 clocks
73*4882a593Smuzhiyun */
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun static struct clk ck_ref = {
76*4882a593Smuzhiyun .name = "ck_ref",
77*4882a593Smuzhiyun .ops = &clkops_null,
78*4882a593Smuzhiyun .rate = 12000000,
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun static struct clk ck_dpll1 = {
82*4882a593Smuzhiyun .name = "ck_dpll1",
83*4882a593Smuzhiyun .ops = &clkops_null,
84*4882a593Smuzhiyun .parent = &ck_ref,
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun /*
88*4882a593Smuzhiyun * FIXME: This clock seems to be necessary but no-one has asked for its
89*4882a593Smuzhiyun * activation. [ FIX: SoSSI, SSR ]
90*4882a593Smuzhiyun */
91*4882a593Smuzhiyun static struct arm_idlect1_clk ck_dpll1out = {
92*4882a593Smuzhiyun .clk = {
93*4882a593Smuzhiyun .name = "ck_dpll1out",
94*4882a593Smuzhiyun .ops = &clkops_generic,
95*4882a593Smuzhiyun .parent = &ck_dpll1,
96*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL | ENABLE_REG_32BIT |
97*4882a593Smuzhiyun ENABLE_ON_INIT,
98*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
99*4882a593Smuzhiyun .enable_bit = EN_CKOUT_ARM,
100*4882a593Smuzhiyun .recalc = &followparent_recalc,
101*4882a593Smuzhiyun },
102*4882a593Smuzhiyun .idlect_shift = IDL_CLKOUT_ARM_SHIFT,
103*4882a593Smuzhiyun };
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun static struct clk sossi_ck = {
106*4882a593Smuzhiyun .name = "ck_sossi",
107*4882a593Smuzhiyun .ops = &clkops_generic,
108*4882a593Smuzhiyun .parent = &ck_dpll1out.clk,
109*4882a593Smuzhiyun .flags = CLOCK_NO_IDLE_PARENT | ENABLE_REG_32BIT,
110*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_1),
111*4882a593Smuzhiyun .enable_bit = CONF_MOD_SOSSI_CLK_EN_R,
112*4882a593Smuzhiyun .recalc = &omap1_sossi_recalc,
113*4882a593Smuzhiyun .set_rate = &omap1_set_sossi_rate,
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun static struct clk arm_ck = {
117*4882a593Smuzhiyun .name = "arm_ck",
118*4882a593Smuzhiyun .ops = &clkops_null,
119*4882a593Smuzhiyun .parent = &ck_dpll1,
120*4882a593Smuzhiyun .rate_offset = CKCTL_ARMDIV_OFFSET,
121*4882a593Smuzhiyun .recalc = &omap1_ckctl_recalc,
122*4882a593Smuzhiyun .round_rate = omap1_clk_round_rate_ckctl_arm,
123*4882a593Smuzhiyun .set_rate = omap1_clk_set_rate_ckctl_arm,
124*4882a593Smuzhiyun };
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun static struct arm_idlect1_clk armper_ck = {
127*4882a593Smuzhiyun .clk = {
128*4882a593Smuzhiyun .name = "armper_ck",
129*4882a593Smuzhiyun .ops = &clkops_generic,
130*4882a593Smuzhiyun .parent = &ck_dpll1,
131*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL,
132*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
133*4882a593Smuzhiyun .enable_bit = EN_PERCK,
134*4882a593Smuzhiyun .rate_offset = CKCTL_PERDIV_OFFSET,
135*4882a593Smuzhiyun .recalc = &omap1_ckctl_recalc,
136*4882a593Smuzhiyun .round_rate = omap1_clk_round_rate_ckctl_arm,
137*4882a593Smuzhiyun .set_rate = omap1_clk_set_rate_ckctl_arm,
138*4882a593Smuzhiyun },
139*4882a593Smuzhiyun .idlect_shift = IDLPER_ARM_SHIFT,
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun /*
143*4882a593Smuzhiyun * FIXME: This clock seems to be necessary but no-one has asked for its
144*4882a593Smuzhiyun * activation. [ GPIO code for 1510 ]
145*4882a593Smuzhiyun */
146*4882a593Smuzhiyun static struct clk arm_gpio_ck = {
147*4882a593Smuzhiyun .name = "ick",
148*4882a593Smuzhiyun .ops = &clkops_generic,
149*4882a593Smuzhiyun .parent = &ck_dpll1,
150*4882a593Smuzhiyun .flags = ENABLE_ON_INIT,
151*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
152*4882a593Smuzhiyun .enable_bit = EN_GPIOCK,
153*4882a593Smuzhiyun .recalc = &followparent_recalc,
154*4882a593Smuzhiyun };
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun static struct arm_idlect1_clk armxor_ck = {
157*4882a593Smuzhiyun .clk = {
158*4882a593Smuzhiyun .name = "armxor_ck",
159*4882a593Smuzhiyun .ops = &clkops_generic,
160*4882a593Smuzhiyun .parent = &ck_ref,
161*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL,
162*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
163*4882a593Smuzhiyun .enable_bit = EN_XORPCK,
164*4882a593Smuzhiyun .recalc = &followparent_recalc,
165*4882a593Smuzhiyun },
166*4882a593Smuzhiyun .idlect_shift = IDLXORP_ARM_SHIFT,
167*4882a593Smuzhiyun };
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun static struct arm_idlect1_clk armtim_ck = {
170*4882a593Smuzhiyun .clk = {
171*4882a593Smuzhiyun .name = "armtim_ck",
172*4882a593Smuzhiyun .ops = &clkops_generic,
173*4882a593Smuzhiyun .parent = &ck_ref,
174*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL,
175*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
176*4882a593Smuzhiyun .enable_bit = EN_TIMCK,
177*4882a593Smuzhiyun .recalc = &followparent_recalc,
178*4882a593Smuzhiyun },
179*4882a593Smuzhiyun .idlect_shift = IDLTIM_ARM_SHIFT,
180*4882a593Smuzhiyun };
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun static struct arm_idlect1_clk armwdt_ck = {
183*4882a593Smuzhiyun .clk = {
184*4882a593Smuzhiyun .name = "armwdt_ck",
185*4882a593Smuzhiyun .ops = &clkops_generic,
186*4882a593Smuzhiyun .parent = &ck_ref,
187*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL,
188*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
189*4882a593Smuzhiyun .enable_bit = EN_WDTCK,
190*4882a593Smuzhiyun .fixed_div = 14,
191*4882a593Smuzhiyun .recalc = &omap_fixed_divisor_recalc,
192*4882a593Smuzhiyun },
193*4882a593Smuzhiyun .idlect_shift = IDLWDT_ARM_SHIFT,
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun static struct clk arminth_ck16xx = {
197*4882a593Smuzhiyun .name = "arminth_ck",
198*4882a593Smuzhiyun .ops = &clkops_null,
199*4882a593Smuzhiyun .parent = &arm_ck,
200*4882a593Smuzhiyun .recalc = &followparent_recalc,
201*4882a593Smuzhiyun /* Note: On 16xx the frequency can be divided by 2 by programming
202*4882a593Smuzhiyun * ARM_CKCTL:ARM_INTHCK_SEL(14) to 1
203*4882a593Smuzhiyun *
204*4882a593Smuzhiyun * 1510 version is in TC clocks.
205*4882a593Smuzhiyun */
206*4882a593Smuzhiyun };
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun static struct clk dsp_ck = {
209*4882a593Smuzhiyun .name = "dsp_ck",
210*4882a593Smuzhiyun .ops = &clkops_generic,
211*4882a593Smuzhiyun .parent = &ck_dpll1,
212*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_CKCTL),
213*4882a593Smuzhiyun .enable_bit = EN_DSPCK,
214*4882a593Smuzhiyun .rate_offset = CKCTL_DSPDIV_OFFSET,
215*4882a593Smuzhiyun .recalc = &omap1_ckctl_recalc,
216*4882a593Smuzhiyun .round_rate = omap1_clk_round_rate_ckctl_arm,
217*4882a593Smuzhiyun .set_rate = omap1_clk_set_rate_ckctl_arm,
218*4882a593Smuzhiyun };
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun static struct clk dspmmu_ck = {
221*4882a593Smuzhiyun .name = "dspmmu_ck",
222*4882a593Smuzhiyun .ops = &clkops_null,
223*4882a593Smuzhiyun .parent = &ck_dpll1,
224*4882a593Smuzhiyun .rate_offset = CKCTL_DSPMMUDIV_OFFSET,
225*4882a593Smuzhiyun .recalc = &omap1_ckctl_recalc,
226*4882a593Smuzhiyun .round_rate = omap1_clk_round_rate_ckctl_arm,
227*4882a593Smuzhiyun .set_rate = omap1_clk_set_rate_ckctl_arm,
228*4882a593Smuzhiyun };
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun static struct clk dspper_ck = {
231*4882a593Smuzhiyun .name = "dspper_ck",
232*4882a593Smuzhiyun .ops = &clkops_dspck,
233*4882a593Smuzhiyun .parent = &ck_dpll1,
234*4882a593Smuzhiyun .enable_reg = DSP_IDLECT2,
235*4882a593Smuzhiyun .enable_bit = EN_PERCK,
236*4882a593Smuzhiyun .rate_offset = CKCTL_PERDIV_OFFSET,
237*4882a593Smuzhiyun .recalc = &omap1_ckctl_recalc_dsp_domain,
238*4882a593Smuzhiyun .round_rate = omap1_clk_round_rate_ckctl_arm,
239*4882a593Smuzhiyun .set_rate = &omap1_clk_set_rate_dsp_domain,
240*4882a593Smuzhiyun };
241*4882a593Smuzhiyun
242*4882a593Smuzhiyun static struct clk dspxor_ck = {
243*4882a593Smuzhiyun .name = "dspxor_ck",
244*4882a593Smuzhiyun .ops = &clkops_dspck,
245*4882a593Smuzhiyun .parent = &ck_ref,
246*4882a593Smuzhiyun .enable_reg = DSP_IDLECT2,
247*4882a593Smuzhiyun .enable_bit = EN_XORPCK,
248*4882a593Smuzhiyun .recalc = &followparent_recalc,
249*4882a593Smuzhiyun };
250*4882a593Smuzhiyun
251*4882a593Smuzhiyun static struct clk dsptim_ck = {
252*4882a593Smuzhiyun .name = "dsptim_ck",
253*4882a593Smuzhiyun .ops = &clkops_dspck,
254*4882a593Smuzhiyun .parent = &ck_ref,
255*4882a593Smuzhiyun .enable_reg = DSP_IDLECT2,
256*4882a593Smuzhiyun .enable_bit = EN_DSPTIMCK,
257*4882a593Smuzhiyun .recalc = &followparent_recalc,
258*4882a593Smuzhiyun };
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun static struct arm_idlect1_clk tc_ck = {
261*4882a593Smuzhiyun .clk = {
262*4882a593Smuzhiyun .name = "tc_ck",
263*4882a593Smuzhiyun .ops = &clkops_null,
264*4882a593Smuzhiyun .parent = &ck_dpll1,
265*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL,
266*4882a593Smuzhiyun .rate_offset = CKCTL_TCDIV_OFFSET,
267*4882a593Smuzhiyun .recalc = &omap1_ckctl_recalc,
268*4882a593Smuzhiyun .round_rate = omap1_clk_round_rate_ckctl_arm,
269*4882a593Smuzhiyun .set_rate = omap1_clk_set_rate_ckctl_arm,
270*4882a593Smuzhiyun },
271*4882a593Smuzhiyun .idlect_shift = IDLIF_ARM_SHIFT,
272*4882a593Smuzhiyun };
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun static struct clk arminth_ck1510 = {
275*4882a593Smuzhiyun .name = "arminth_ck",
276*4882a593Smuzhiyun .ops = &clkops_null,
277*4882a593Smuzhiyun .parent = &tc_ck.clk,
278*4882a593Smuzhiyun .recalc = &followparent_recalc,
279*4882a593Smuzhiyun /* Note: On 1510 the frequency follows TC_CK
280*4882a593Smuzhiyun *
281*4882a593Smuzhiyun * 16xx version is in MPU clocks.
282*4882a593Smuzhiyun */
283*4882a593Smuzhiyun };
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun static struct clk tipb_ck = {
286*4882a593Smuzhiyun /* No-idle controlled by "tc_ck" */
287*4882a593Smuzhiyun .name = "tipb_ck",
288*4882a593Smuzhiyun .ops = &clkops_null,
289*4882a593Smuzhiyun .parent = &tc_ck.clk,
290*4882a593Smuzhiyun .recalc = &followparent_recalc,
291*4882a593Smuzhiyun };
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun static struct clk l3_ocpi_ck = {
294*4882a593Smuzhiyun /* No-idle controlled by "tc_ck" */
295*4882a593Smuzhiyun .name = "l3_ocpi_ck",
296*4882a593Smuzhiyun .ops = &clkops_generic,
297*4882a593Smuzhiyun .parent = &tc_ck.clk,
298*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3),
299*4882a593Smuzhiyun .enable_bit = EN_OCPI_CK,
300*4882a593Smuzhiyun .recalc = &followparent_recalc,
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun
303*4882a593Smuzhiyun static struct clk tc1_ck = {
304*4882a593Smuzhiyun .name = "tc1_ck",
305*4882a593Smuzhiyun .ops = &clkops_generic,
306*4882a593Smuzhiyun .parent = &tc_ck.clk,
307*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3),
308*4882a593Smuzhiyun .enable_bit = EN_TC1_CK,
309*4882a593Smuzhiyun .recalc = &followparent_recalc,
310*4882a593Smuzhiyun };
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun /*
313*4882a593Smuzhiyun * FIXME: This clock seems to be necessary but no-one has asked for its
314*4882a593Smuzhiyun * activation. [ pm.c (SRAM), CCP, Camera ]
315*4882a593Smuzhiyun */
316*4882a593Smuzhiyun static struct clk tc2_ck = {
317*4882a593Smuzhiyun .name = "tc2_ck",
318*4882a593Smuzhiyun .ops = &clkops_generic,
319*4882a593Smuzhiyun .parent = &tc_ck.clk,
320*4882a593Smuzhiyun .flags = ENABLE_ON_INIT,
321*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT3),
322*4882a593Smuzhiyun .enable_bit = EN_TC2_CK,
323*4882a593Smuzhiyun .recalc = &followparent_recalc,
324*4882a593Smuzhiyun };
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun static struct clk dma_ck = {
327*4882a593Smuzhiyun /* No-idle controlled by "tc_ck" */
328*4882a593Smuzhiyun .name = "dma_ck",
329*4882a593Smuzhiyun .ops = &clkops_null,
330*4882a593Smuzhiyun .parent = &tc_ck.clk,
331*4882a593Smuzhiyun .recalc = &followparent_recalc,
332*4882a593Smuzhiyun };
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun static struct clk dma_lcdfree_ck = {
335*4882a593Smuzhiyun .name = "dma_lcdfree_ck",
336*4882a593Smuzhiyun .ops = &clkops_null,
337*4882a593Smuzhiyun .parent = &tc_ck.clk,
338*4882a593Smuzhiyun .recalc = &followparent_recalc,
339*4882a593Smuzhiyun };
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun static struct arm_idlect1_clk api_ck = {
342*4882a593Smuzhiyun .clk = {
343*4882a593Smuzhiyun .name = "api_ck",
344*4882a593Smuzhiyun .ops = &clkops_generic,
345*4882a593Smuzhiyun .parent = &tc_ck.clk,
346*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL,
347*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
348*4882a593Smuzhiyun .enable_bit = EN_APICK,
349*4882a593Smuzhiyun .recalc = &followparent_recalc,
350*4882a593Smuzhiyun },
351*4882a593Smuzhiyun .idlect_shift = IDLAPI_ARM_SHIFT,
352*4882a593Smuzhiyun };
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun static struct arm_idlect1_clk lb_ck = {
355*4882a593Smuzhiyun .clk = {
356*4882a593Smuzhiyun .name = "lb_ck",
357*4882a593Smuzhiyun .ops = &clkops_generic,
358*4882a593Smuzhiyun .parent = &tc_ck.clk,
359*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL,
360*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
361*4882a593Smuzhiyun .enable_bit = EN_LBCK,
362*4882a593Smuzhiyun .recalc = &followparent_recalc,
363*4882a593Smuzhiyun },
364*4882a593Smuzhiyun .idlect_shift = IDLLB_ARM_SHIFT,
365*4882a593Smuzhiyun };
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun static struct clk rhea1_ck = {
368*4882a593Smuzhiyun .name = "rhea1_ck",
369*4882a593Smuzhiyun .ops = &clkops_null,
370*4882a593Smuzhiyun .parent = &tc_ck.clk,
371*4882a593Smuzhiyun .recalc = &followparent_recalc,
372*4882a593Smuzhiyun };
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun static struct clk rhea2_ck = {
375*4882a593Smuzhiyun .name = "rhea2_ck",
376*4882a593Smuzhiyun .ops = &clkops_null,
377*4882a593Smuzhiyun .parent = &tc_ck.clk,
378*4882a593Smuzhiyun .recalc = &followparent_recalc,
379*4882a593Smuzhiyun };
380*4882a593Smuzhiyun
381*4882a593Smuzhiyun static struct clk lcd_ck_16xx = {
382*4882a593Smuzhiyun .name = "lcd_ck",
383*4882a593Smuzhiyun .ops = &clkops_generic,
384*4882a593Smuzhiyun .parent = &ck_dpll1,
385*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
386*4882a593Smuzhiyun .enable_bit = EN_LCDCK,
387*4882a593Smuzhiyun .rate_offset = CKCTL_LCDDIV_OFFSET,
388*4882a593Smuzhiyun .recalc = &omap1_ckctl_recalc,
389*4882a593Smuzhiyun .round_rate = omap1_clk_round_rate_ckctl_arm,
390*4882a593Smuzhiyun .set_rate = omap1_clk_set_rate_ckctl_arm,
391*4882a593Smuzhiyun };
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun static struct arm_idlect1_clk lcd_ck_1510 = {
394*4882a593Smuzhiyun .clk = {
395*4882a593Smuzhiyun .name = "lcd_ck",
396*4882a593Smuzhiyun .ops = &clkops_generic,
397*4882a593Smuzhiyun .parent = &ck_dpll1,
398*4882a593Smuzhiyun .flags = CLOCK_IDLE_CONTROL,
399*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ARM_IDLECT2),
400*4882a593Smuzhiyun .enable_bit = EN_LCDCK,
401*4882a593Smuzhiyun .rate_offset = CKCTL_LCDDIV_OFFSET,
402*4882a593Smuzhiyun .recalc = &omap1_ckctl_recalc,
403*4882a593Smuzhiyun .round_rate = omap1_clk_round_rate_ckctl_arm,
404*4882a593Smuzhiyun .set_rate = omap1_clk_set_rate_ckctl_arm,
405*4882a593Smuzhiyun },
406*4882a593Smuzhiyun .idlect_shift = OMAP1510_IDLLCD_ARM_SHIFT,
407*4882a593Smuzhiyun };
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun /*
410*4882a593Smuzhiyun * XXX The enable_bit here is misused - it simply switches between 12MHz
411*4882a593Smuzhiyun * and 48MHz. Reimplement with clksel.
412*4882a593Smuzhiyun *
413*4882a593Smuzhiyun * XXX does this need SYSC register handling?
414*4882a593Smuzhiyun */
415*4882a593Smuzhiyun static struct clk uart1_1510 = {
416*4882a593Smuzhiyun .name = "uart1_ck",
417*4882a593Smuzhiyun .ops = &clkops_null,
418*4882a593Smuzhiyun /* Direct from ULPD, no real parent */
419*4882a593Smuzhiyun .parent = &armper_ck.clk,
420*4882a593Smuzhiyun .rate = 12000000,
421*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
422*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
423*4882a593Smuzhiyun .enable_bit = CONF_MOD_UART1_CLK_MODE_R,
424*4882a593Smuzhiyun .set_rate = &omap1_set_uart_rate,
425*4882a593Smuzhiyun .recalc = &omap1_uart_recalc,
426*4882a593Smuzhiyun };
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun /*
429*4882a593Smuzhiyun * XXX The enable_bit here is misused - it simply switches between 12MHz
430*4882a593Smuzhiyun * and 48MHz. Reimplement with clksel.
431*4882a593Smuzhiyun *
432*4882a593Smuzhiyun * XXX SYSC register handling does not belong in the clock framework
433*4882a593Smuzhiyun */
434*4882a593Smuzhiyun static struct uart_clk uart1_16xx = {
435*4882a593Smuzhiyun .clk = {
436*4882a593Smuzhiyun .name = "uart1_ck",
437*4882a593Smuzhiyun .ops = &clkops_uart_16xx,
438*4882a593Smuzhiyun /* Direct from ULPD, no real parent */
439*4882a593Smuzhiyun .parent = &armper_ck.clk,
440*4882a593Smuzhiyun .rate = 48000000,
441*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
442*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
443*4882a593Smuzhiyun .enable_bit = CONF_MOD_UART1_CLK_MODE_R,
444*4882a593Smuzhiyun },
445*4882a593Smuzhiyun .sysc_addr = 0xfffb0054,
446*4882a593Smuzhiyun };
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun /*
449*4882a593Smuzhiyun * XXX The enable_bit here is misused - it simply switches between 12MHz
450*4882a593Smuzhiyun * and 48MHz. Reimplement with clksel.
451*4882a593Smuzhiyun *
452*4882a593Smuzhiyun * XXX does this need SYSC register handling?
453*4882a593Smuzhiyun */
454*4882a593Smuzhiyun static struct clk uart2_ck = {
455*4882a593Smuzhiyun .name = "uart2_ck",
456*4882a593Smuzhiyun .ops = &clkops_null,
457*4882a593Smuzhiyun /* Direct from ULPD, no real parent */
458*4882a593Smuzhiyun .parent = &armper_ck.clk,
459*4882a593Smuzhiyun .rate = 12000000,
460*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
461*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
462*4882a593Smuzhiyun .enable_bit = CONF_MOD_UART2_CLK_MODE_R,
463*4882a593Smuzhiyun .set_rate = &omap1_set_uart_rate,
464*4882a593Smuzhiyun .recalc = &omap1_uart_recalc,
465*4882a593Smuzhiyun };
466*4882a593Smuzhiyun
467*4882a593Smuzhiyun /*
468*4882a593Smuzhiyun * XXX The enable_bit here is misused - it simply switches between 12MHz
469*4882a593Smuzhiyun * and 48MHz. Reimplement with clksel.
470*4882a593Smuzhiyun *
471*4882a593Smuzhiyun * XXX does this need SYSC register handling?
472*4882a593Smuzhiyun */
473*4882a593Smuzhiyun static struct clk uart3_1510 = {
474*4882a593Smuzhiyun .name = "uart3_ck",
475*4882a593Smuzhiyun .ops = &clkops_null,
476*4882a593Smuzhiyun /* Direct from ULPD, no real parent */
477*4882a593Smuzhiyun .parent = &armper_ck.clk,
478*4882a593Smuzhiyun .rate = 12000000,
479*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
480*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
481*4882a593Smuzhiyun .enable_bit = CONF_MOD_UART3_CLK_MODE_R,
482*4882a593Smuzhiyun .set_rate = &omap1_set_uart_rate,
483*4882a593Smuzhiyun .recalc = &omap1_uart_recalc,
484*4882a593Smuzhiyun };
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun /*
487*4882a593Smuzhiyun * XXX The enable_bit here is misused - it simply switches between 12MHz
488*4882a593Smuzhiyun * and 48MHz. Reimplement with clksel.
489*4882a593Smuzhiyun *
490*4882a593Smuzhiyun * XXX SYSC register handling does not belong in the clock framework
491*4882a593Smuzhiyun */
492*4882a593Smuzhiyun static struct uart_clk uart3_16xx = {
493*4882a593Smuzhiyun .clk = {
494*4882a593Smuzhiyun .name = "uart3_ck",
495*4882a593Smuzhiyun .ops = &clkops_uart_16xx,
496*4882a593Smuzhiyun /* Direct from ULPD, no real parent */
497*4882a593Smuzhiyun .parent = &armper_ck.clk,
498*4882a593Smuzhiyun .rate = 48000000,
499*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
500*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
501*4882a593Smuzhiyun .enable_bit = CONF_MOD_UART3_CLK_MODE_R,
502*4882a593Smuzhiyun },
503*4882a593Smuzhiyun .sysc_addr = 0xfffb9854,
504*4882a593Smuzhiyun };
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun static struct clk usb_clko = { /* 6 MHz output on W4_USB_CLKO */
507*4882a593Smuzhiyun .name = "usb_clko",
508*4882a593Smuzhiyun .ops = &clkops_generic,
509*4882a593Smuzhiyun /* Direct from ULPD, no parent */
510*4882a593Smuzhiyun .rate = 6000000,
511*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT,
512*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(ULPD_CLOCK_CTRL),
513*4882a593Smuzhiyun .enable_bit = USB_MCLK_EN_BIT,
514*4882a593Smuzhiyun };
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun static struct clk usb_hhc_ck1510 = {
517*4882a593Smuzhiyun .name = "usb_hhc_ck",
518*4882a593Smuzhiyun .ops = &clkops_generic,
519*4882a593Smuzhiyun /* Direct from ULPD, no parent */
520*4882a593Smuzhiyun .rate = 48000000, /* Actually 2 clocks, 12MHz and 48MHz */
521*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT,
522*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
523*4882a593Smuzhiyun .enable_bit = USB_HOST_HHC_UHOST_EN,
524*4882a593Smuzhiyun };
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun static struct clk usb_hhc_ck16xx = {
527*4882a593Smuzhiyun .name = "usb_hhc_ck",
528*4882a593Smuzhiyun .ops = &clkops_generic,
529*4882a593Smuzhiyun /* Direct from ULPD, no parent */
530*4882a593Smuzhiyun .rate = 48000000,
531*4882a593Smuzhiyun /* OTG_SYSCON_2.OTG_PADEN == 0 (not 1510-compatible) */
532*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT,
533*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(OTG_BASE + 0x08), /* OTG_SYSCON_2 */
534*4882a593Smuzhiyun .enable_bit = OTG_SYSCON_2_UHOST_EN_SHIFT
535*4882a593Smuzhiyun };
536*4882a593Smuzhiyun
537*4882a593Smuzhiyun static struct clk usb_dc_ck = {
538*4882a593Smuzhiyun .name = "usb_dc_ck",
539*4882a593Smuzhiyun .ops = &clkops_generic,
540*4882a593Smuzhiyun /* Direct from ULPD, no parent */
541*4882a593Smuzhiyun .rate = 48000000,
542*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),
543*4882a593Smuzhiyun .enable_bit = SOFT_USB_OTG_DPLL_REQ_SHIFT,
544*4882a593Smuzhiyun };
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun static struct clk uart1_7xx = {
547*4882a593Smuzhiyun .name = "uart1_ck",
548*4882a593Smuzhiyun .ops = &clkops_generic,
549*4882a593Smuzhiyun /* Direct from ULPD, no parent */
550*4882a593Smuzhiyun .rate = 12000000,
551*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),
552*4882a593Smuzhiyun .enable_bit = 9,
553*4882a593Smuzhiyun };
554*4882a593Smuzhiyun
555*4882a593Smuzhiyun static struct clk uart2_7xx = {
556*4882a593Smuzhiyun .name = "uart2_ck",
557*4882a593Smuzhiyun .ops = &clkops_generic,
558*4882a593Smuzhiyun /* Direct from ULPD, no parent */
559*4882a593Smuzhiyun .rate = 12000000,
560*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),
561*4882a593Smuzhiyun .enable_bit = 11,
562*4882a593Smuzhiyun };
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun static struct clk mclk_1510 = {
565*4882a593Smuzhiyun .name = "mclk",
566*4882a593Smuzhiyun .ops = &clkops_generic,
567*4882a593Smuzhiyun /* Direct from ULPD, no parent. May be enabled by ext hardware. */
568*4882a593Smuzhiyun .rate = 12000000,
569*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),
570*4882a593Smuzhiyun .enable_bit = SOFT_COM_MCKO_REQ_SHIFT,
571*4882a593Smuzhiyun };
572*4882a593Smuzhiyun
573*4882a593Smuzhiyun static struct clk mclk_16xx = {
574*4882a593Smuzhiyun .name = "mclk",
575*4882a593Smuzhiyun .ops = &clkops_generic,
576*4882a593Smuzhiyun /* Direct from ULPD, no parent. May be enabled by ext hardware. */
577*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(COM_CLK_DIV_CTRL_SEL),
578*4882a593Smuzhiyun .enable_bit = COM_ULPD_PLL_CLK_REQ,
579*4882a593Smuzhiyun .set_rate = &omap1_set_ext_clk_rate,
580*4882a593Smuzhiyun .round_rate = &omap1_round_ext_clk_rate,
581*4882a593Smuzhiyun .init = &omap1_init_ext_clk,
582*4882a593Smuzhiyun };
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun static struct clk bclk_1510 = {
585*4882a593Smuzhiyun .name = "bclk",
586*4882a593Smuzhiyun .ops = &clkops_generic,
587*4882a593Smuzhiyun /* Direct from ULPD, no parent. May be enabled by ext hardware. */
588*4882a593Smuzhiyun .rate = 12000000,
589*4882a593Smuzhiyun };
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun static struct clk bclk_16xx = {
592*4882a593Smuzhiyun .name = "bclk",
593*4882a593Smuzhiyun .ops = &clkops_generic,
594*4882a593Smuzhiyun /* Direct from ULPD, no parent. May be enabled by ext hardware. */
595*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(SWD_CLK_DIV_CTRL_SEL),
596*4882a593Smuzhiyun .enable_bit = SWD_ULPD_PLL_CLK_REQ,
597*4882a593Smuzhiyun .set_rate = &omap1_set_ext_clk_rate,
598*4882a593Smuzhiyun .round_rate = &omap1_round_ext_clk_rate,
599*4882a593Smuzhiyun .init = &omap1_init_ext_clk,
600*4882a593Smuzhiyun };
601*4882a593Smuzhiyun
602*4882a593Smuzhiyun static struct clk mmc1_ck = {
603*4882a593Smuzhiyun .name = "mmc1_ck",
604*4882a593Smuzhiyun .ops = &clkops_generic,
605*4882a593Smuzhiyun /* Functional clock is direct from ULPD, interface clock is ARMPER */
606*4882a593Smuzhiyun .parent = &armper_ck.clk,
607*4882a593Smuzhiyun .rate = 48000000,
608*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
609*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
610*4882a593Smuzhiyun .enable_bit = CONF_MOD_MMC_SD_CLK_REQ_R,
611*4882a593Smuzhiyun };
612*4882a593Smuzhiyun
613*4882a593Smuzhiyun /*
614*4882a593Smuzhiyun * XXX MOD_CONF_CTRL_0 bit 20 is defined in the 1510 TRM as
615*4882a593Smuzhiyun * CONF_MOD_MCBSP3_AUXON ??
616*4882a593Smuzhiyun */
617*4882a593Smuzhiyun static struct clk mmc2_ck = {
618*4882a593Smuzhiyun .name = "mmc2_ck",
619*4882a593Smuzhiyun .ops = &clkops_generic,
620*4882a593Smuzhiyun /* Functional clock is direct from ULPD, interface clock is ARMPER */
621*4882a593Smuzhiyun .parent = &armper_ck.clk,
622*4882a593Smuzhiyun .rate = 48000000,
623*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
624*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(MOD_CONF_CTRL_0),
625*4882a593Smuzhiyun .enable_bit = 20,
626*4882a593Smuzhiyun };
627*4882a593Smuzhiyun
628*4882a593Smuzhiyun static struct clk mmc3_ck = {
629*4882a593Smuzhiyun .name = "mmc3_ck",
630*4882a593Smuzhiyun .ops = &clkops_generic,
631*4882a593Smuzhiyun /* Functional clock is direct from ULPD, interface clock is ARMPER */
632*4882a593Smuzhiyun .parent = &armper_ck.clk,
633*4882a593Smuzhiyun .rate = 48000000,
634*4882a593Smuzhiyun .flags = ENABLE_REG_32BIT | CLOCK_NO_IDLE_PARENT,
635*4882a593Smuzhiyun .enable_reg = OMAP1_IO_ADDRESS(SOFT_REQ_REG),
636*4882a593Smuzhiyun .enable_bit = SOFT_MMC_DPLL_REQ_SHIFT,
637*4882a593Smuzhiyun };
638*4882a593Smuzhiyun
639*4882a593Smuzhiyun static struct clk virtual_ck_mpu = {
640*4882a593Smuzhiyun .name = "mpu",
641*4882a593Smuzhiyun .ops = &clkops_null,
642*4882a593Smuzhiyun .parent = &arm_ck, /* Is smarter alias for */
643*4882a593Smuzhiyun .recalc = &followparent_recalc,
644*4882a593Smuzhiyun .set_rate = &omap1_select_table_rate,
645*4882a593Smuzhiyun .round_rate = &omap1_round_to_table_rate,
646*4882a593Smuzhiyun };
647*4882a593Smuzhiyun
648*4882a593Smuzhiyun /* virtual functional clock domain for I2C. Just for making sure that ARMXOR_CK
649*4882a593Smuzhiyun remains active during MPU idle whenever this is enabled */
650*4882a593Smuzhiyun static struct clk i2c_fck = {
651*4882a593Smuzhiyun .name = "i2c_fck",
652*4882a593Smuzhiyun .ops = &clkops_null,
653*4882a593Smuzhiyun .flags = CLOCK_NO_IDLE_PARENT,
654*4882a593Smuzhiyun .parent = &armxor_ck.clk,
655*4882a593Smuzhiyun .recalc = &followparent_recalc,
656*4882a593Smuzhiyun };
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun static struct clk i2c_ick = {
659*4882a593Smuzhiyun .name = "i2c_ick",
660*4882a593Smuzhiyun .ops = &clkops_null,
661*4882a593Smuzhiyun .flags = CLOCK_NO_IDLE_PARENT,
662*4882a593Smuzhiyun .parent = &armper_ck.clk,
663*4882a593Smuzhiyun .recalc = &followparent_recalc,
664*4882a593Smuzhiyun };
665*4882a593Smuzhiyun
666*4882a593Smuzhiyun /*
667*4882a593Smuzhiyun * clkdev integration
668*4882a593Smuzhiyun */
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun static struct omap_clk omap_clks[] = {
671*4882a593Smuzhiyun /* non-ULPD clocks */
672*4882a593Smuzhiyun CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX),
673*4882a593Smuzhiyun CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310 | CK_7XX),
674*4882a593Smuzhiyun /* CK_GEN1 clocks */
675*4882a593Smuzhiyun CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX),
676*4882a593Smuzhiyun CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX),
677*4882a593Smuzhiyun CLK(NULL, "arm_ck", &arm_ck, CK_16XX | CK_1510 | CK_310),
678*4882a593Smuzhiyun CLK(NULL, "armper_ck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310),
679*4882a593Smuzhiyun CLK("omap_gpio.0", "ick", &arm_gpio_ck, CK_1510 | CK_310),
680*4882a593Smuzhiyun CLK(NULL, "armxor_ck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
681*4882a593Smuzhiyun CLK(NULL, "armtim_ck", &armtim_ck.clk, CK_16XX | CK_1510 | CK_310),
682*4882a593Smuzhiyun CLK("omap_wdt", "fck", &armwdt_ck.clk, CK_16XX | CK_1510 | CK_310),
683*4882a593Smuzhiyun CLK("omap_wdt", "ick", &armper_ck.clk, CK_16XX),
684*4882a593Smuzhiyun CLK("omap_wdt", "ick", &dummy_ck, CK_1510 | CK_310),
685*4882a593Smuzhiyun CLK(NULL, "arminth_ck", &arminth_ck1510, CK_1510 | CK_310),
686*4882a593Smuzhiyun CLK(NULL, "arminth_ck", &arminth_ck16xx, CK_16XX),
687*4882a593Smuzhiyun /* CK_GEN2 clocks */
688*4882a593Smuzhiyun CLK(NULL, "dsp_ck", &dsp_ck, CK_16XX | CK_1510 | CK_310),
689*4882a593Smuzhiyun CLK(NULL, "dspmmu_ck", &dspmmu_ck, CK_16XX | CK_1510 | CK_310),
690*4882a593Smuzhiyun CLK(NULL, "dspper_ck", &dspper_ck, CK_16XX | CK_1510 | CK_310),
691*4882a593Smuzhiyun CLK(NULL, "dspxor_ck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),
692*4882a593Smuzhiyun CLK(NULL, "dsptim_ck", &dsptim_ck, CK_16XX | CK_1510 | CK_310),
693*4882a593Smuzhiyun /* CK_GEN3 clocks */
694*4882a593Smuzhiyun CLK(NULL, "tc_ck", &tc_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
695*4882a593Smuzhiyun CLK(NULL, "tipb_ck", &tipb_ck, CK_1510 | CK_310),
696*4882a593Smuzhiyun CLK(NULL, "l3_ocpi_ck", &l3_ocpi_ck, CK_16XX | CK_7XX),
697*4882a593Smuzhiyun CLK(NULL, "tc1_ck", &tc1_ck, CK_16XX),
698*4882a593Smuzhiyun CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),
699*4882a593Smuzhiyun CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310),
700*4882a593Smuzhiyun CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX),
701*4882a593Smuzhiyun CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
702*4882a593Smuzhiyun CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310),
703*4882a593Smuzhiyun CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX),
704*4882a593Smuzhiyun CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX),
705*4882a593Smuzhiyun CLK(NULL, "lcd_ck", &lcd_ck_16xx, CK_16XX | CK_7XX),
706*4882a593Smuzhiyun CLK(NULL, "lcd_ck", &lcd_ck_1510.clk, CK_1510 | CK_310),
707*4882a593Smuzhiyun /* ULPD clocks */
708*4882a593Smuzhiyun CLK(NULL, "uart1_ck", &uart1_1510, CK_1510 | CK_310),
709*4882a593Smuzhiyun CLK(NULL, "uart1_ck", &uart1_16xx.clk, CK_16XX),
710*4882a593Smuzhiyun CLK(NULL, "uart1_ck", &uart1_7xx, CK_7XX),
711*4882a593Smuzhiyun CLK(NULL, "uart2_ck", &uart2_ck, CK_16XX | CK_1510 | CK_310),
712*4882a593Smuzhiyun CLK(NULL, "uart2_ck", &uart2_7xx, CK_7XX),
713*4882a593Smuzhiyun CLK(NULL, "uart3_ck", &uart3_1510, CK_1510 | CK_310),
714*4882a593Smuzhiyun CLK(NULL, "uart3_ck", &uart3_16xx.clk, CK_16XX),
715*4882a593Smuzhiyun CLK(NULL, "usb_clko", &usb_clko, CK_16XX | CK_1510 | CK_310),
716*4882a593Smuzhiyun CLK(NULL, "usb_hhc_ck", &usb_hhc_ck1510, CK_1510 | CK_310),
717*4882a593Smuzhiyun CLK(NULL, "usb_hhc_ck", &usb_hhc_ck16xx, CK_16XX),
718*4882a593Smuzhiyun CLK(NULL, "usb_dc_ck", &usb_dc_ck, CK_16XX | CK_7XX),
719*4882a593Smuzhiyun CLK(NULL, "mclk", &mclk_1510, CK_1510 | CK_310),
720*4882a593Smuzhiyun CLK(NULL, "mclk", &mclk_16xx, CK_16XX),
721*4882a593Smuzhiyun CLK(NULL, "bclk", &bclk_1510, CK_1510 | CK_310),
722*4882a593Smuzhiyun CLK(NULL, "bclk", &bclk_16xx, CK_16XX),
723*4882a593Smuzhiyun CLK("mmci-omap.0", "fck", &mmc1_ck, CK_16XX | CK_1510 | CK_310),
724*4882a593Smuzhiyun CLK("mmci-omap.0", "fck", &mmc3_ck, CK_7XX),
725*4882a593Smuzhiyun CLK("mmci-omap.0", "ick", &armper_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
726*4882a593Smuzhiyun CLK("mmci-omap.1", "fck", &mmc2_ck, CK_16XX),
727*4882a593Smuzhiyun CLK("mmci-omap.1", "ick", &armper_ck.clk, CK_16XX),
728*4882a593Smuzhiyun /* Virtual clocks */
729*4882a593Smuzhiyun CLK(NULL, "mpu", &virtual_ck_mpu, CK_16XX | CK_1510 | CK_310),
730*4882a593Smuzhiyun CLK("omap_i2c.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX),
731*4882a593Smuzhiyun CLK("omap_i2c.1", "ick", &i2c_ick, CK_16XX),
732*4882a593Smuzhiyun CLK("omap_i2c.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX),
733*4882a593Smuzhiyun CLK("omap1_spi100k.1", "fck", &dummy_ck, CK_7XX),
734*4882a593Smuzhiyun CLK("omap1_spi100k.1", "ick", &dummy_ck, CK_7XX),
735*4882a593Smuzhiyun CLK("omap1_spi100k.2", "fck", &dummy_ck, CK_7XX),
736*4882a593Smuzhiyun CLK("omap1_spi100k.2", "ick", &dummy_ck, CK_7XX),
737*4882a593Smuzhiyun CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310),
738*4882a593Smuzhiyun CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX),
739*4882a593Smuzhiyun CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310),
740*4882a593Smuzhiyun CLK("omap-mcbsp.2", "ick", &armper_ck.clk, CK_16XX),
741*4882a593Smuzhiyun CLK("omap-mcbsp.2", "ick", &dummy_ck, CK_1510 | CK_310),
742*4882a593Smuzhiyun CLK("omap-mcbsp.3", "ick", &dspper_ck, CK_16XX),
743*4882a593Smuzhiyun CLK("omap-mcbsp.3", "ick", &dummy_ck, CK_1510 | CK_310),
744*4882a593Smuzhiyun CLK("omap-mcbsp.1", "fck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),
745*4882a593Smuzhiyun CLK("omap-mcbsp.2", "fck", &armper_ck.clk, CK_16XX | CK_1510 | CK_310),
746*4882a593Smuzhiyun CLK("omap-mcbsp.3", "fck", &dspxor_ck, CK_16XX | CK_1510 | CK_310),
747*4882a593Smuzhiyun };
748*4882a593Smuzhiyun
749*4882a593Smuzhiyun /*
750*4882a593Smuzhiyun * init
751*4882a593Smuzhiyun */
752*4882a593Smuzhiyun
omap1_show_rates(void)753*4882a593Smuzhiyun static void __init omap1_show_rates(void)
754*4882a593Smuzhiyun {
755*4882a593Smuzhiyun pr_notice("Clocking rate (xtal/DPLL1/MPU): %ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
756*4882a593Smuzhiyun ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
757*4882a593Smuzhiyun ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
758*4882a593Smuzhiyun arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
759*4882a593Smuzhiyun }
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun u32 cpu_mask;
762*4882a593Smuzhiyun
omap1_clk_init(void)763*4882a593Smuzhiyun int __init omap1_clk_init(void)
764*4882a593Smuzhiyun {
765*4882a593Smuzhiyun struct omap_clk *c;
766*4882a593Smuzhiyun int crystal_type = 0; /* Default 12 MHz */
767*4882a593Smuzhiyun u32 reg;
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun #ifdef CONFIG_DEBUG_LL
770*4882a593Smuzhiyun /*
771*4882a593Smuzhiyun * Resets some clocks that may be left on from bootloader,
772*4882a593Smuzhiyun * but leaves serial clocks on.
773*4882a593Smuzhiyun */
774*4882a593Smuzhiyun omap_writel(0x3 << 29, MOD_CONF_CTRL_0);
775*4882a593Smuzhiyun #endif
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun /* USB_REQ_EN will be disabled later if necessary (usb_dc_ck) */
778*4882a593Smuzhiyun reg = omap_readw(SOFT_REQ_REG) & (1 << 4);
779*4882a593Smuzhiyun omap_writew(reg, SOFT_REQ_REG);
780*4882a593Smuzhiyun if (!cpu_is_omap15xx())
781*4882a593Smuzhiyun omap_writew(0, SOFT_REQ_REG2);
782*4882a593Smuzhiyun
783*4882a593Smuzhiyun /* By default all idlect1 clocks are allowed to idle */
784*4882a593Smuzhiyun arm_idlect1_mask = ~0;
785*4882a593Smuzhiyun
786*4882a593Smuzhiyun for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)
787*4882a593Smuzhiyun clk_preinit(c->lk.clk);
788*4882a593Smuzhiyun
789*4882a593Smuzhiyun cpu_mask = 0;
790*4882a593Smuzhiyun if (cpu_is_omap1710())
791*4882a593Smuzhiyun cpu_mask |= CK_1710;
792*4882a593Smuzhiyun if (cpu_is_omap16xx())
793*4882a593Smuzhiyun cpu_mask |= CK_16XX;
794*4882a593Smuzhiyun if (cpu_is_omap1510())
795*4882a593Smuzhiyun cpu_mask |= CK_1510;
796*4882a593Smuzhiyun if (cpu_is_omap7xx())
797*4882a593Smuzhiyun cpu_mask |= CK_7XX;
798*4882a593Smuzhiyun if (cpu_is_omap310())
799*4882a593Smuzhiyun cpu_mask |= CK_310;
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun for (c = omap_clks; c < omap_clks + ARRAY_SIZE(omap_clks); c++)
802*4882a593Smuzhiyun if (c->cpu & cpu_mask) {
803*4882a593Smuzhiyun clkdev_add(&c->lk);
804*4882a593Smuzhiyun clk_register(c->lk.clk);
805*4882a593Smuzhiyun }
806*4882a593Smuzhiyun
807*4882a593Smuzhiyun /* Pointers to these clocks are needed by code in clock.c */
808*4882a593Smuzhiyun api_ck_p = clk_get(NULL, "api_ck");
809*4882a593Smuzhiyun ck_dpll1_p = clk_get(NULL, "ck_dpll1");
810*4882a593Smuzhiyun ck_ref_p = clk_get(NULL, "ck_ref");
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun if (cpu_is_omap7xx())
813*4882a593Smuzhiyun ck_ref.rate = 13000000;
814*4882a593Smuzhiyun if (cpu_is_omap16xx() && crystal_type == 2)
815*4882a593Smuzhiyun ck_ref.rate = 19200000;
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun pr_info("Clocks: ARM_SYSST: 0x%04x DPLL_CTL: 0x%04x ARM_CKCTL: 0x%04x\n",
818*4882a593Smuzhiyun omap_readw(ARM_SYSST), omap_readw(DPLL_CTL),
819*4882a593Smuzhiyun omap_readw(ARM_CKCTL));
820*4882a593Smuzhiyun
821*4882a593Smuzhiyun /* We want to be in syncronous scalable mode */
822*4882a593Smuzhiyun omap_writew(0x1000, ARM_SYSST);
823*4882a593Smuzhiyun
824*4882a593Smuzhiyun
825*4882a593Smuzhiyun /*
826*4882a593Smuzhiyun * Initially use the values set by bootloader. Determine PLL rate and
827*4882a593Smuzhiyun * recalculate dependent clocks as if kernel had changed PLL or
828*4882a593Smuzhiyun * divisors. See also omap1_clk_late_init() that can reprogram dpll1
829*4882a593Smuzhiyun * after the SRAM is initialized.
830*4882a593Smuzhiyun */
831*4882a593Smuzhiyun {
832*4882a593Smuzhiyun unsigned pll_ctl_val = omap_readw(DPLL_CTL);
833*4882a593Smuzhiyun
834*4882a593Smuzhiyun ck_dpll1.rate = ck_ref.rate; /* Base xtal rate */
835*4882a593Smuzhiyun if (pll_ctl_val & 0x10) {
836*4882a593Smuzhiyun /* PLL enabled, apply multiplier and divisor */
837*4882a593Smuzhiyun if (pll_ctl_val & 0xf80)
838*4882a593Smuzhiyun ck_dpll1.rate *= (pll_ctl_val & 0xf80) >> 7;
839*4882a593Smuzhiyun ck_dpll1.rate /= ((pll_ctl_val & 0x60) >> 5) + 1;
840*4882a593Smuzhiyun } else {
841*4882a593Smuzhiyun /* PLL disabled, apply bypass divisor */
842*4882a593Smuzhiyun switch (pll_ctl_val & 0xc) {
843*4882a593Smuzhiyun case 0:
844*4882a593Smuzhiyun break;
845*4882a593Smuzhiyun case 0x4:
846*4882a593Smuzhiyun ck_dpll1.rate /= 2;
847*4882a593Smuzhiyun break;
848*4882a593Smuzhiyun default:
849*4882a593Smuzhiyun ck_dpll1.rate /= 4;
850*4882a593Smuzhiyun break;
851*4882a593Smuzhiyun }
852*4882a593Smuzhiyun }
853*4882a593Smuzhiyun }
854*4882a593Smuzhiyun propagate_rate(&ck_dpll1);
855*4882a593Smuzhiyun /* Cache rates for clocks connected to ck_ref (not dpll1) */
856*4882a593Smuzhiyun propagate_rate(&ck_ref);
857*4882a593Smuzhiyun omap1_show_rates();
858*4882a593Smuzhiyun if (machine_is_omap_perseus2() || machine_is_omap_fsample()) {
859*4882a593Smuzhiyun /* Select slicer output as OMAP input clock */
860*4882a593Smuzhiyun omap_writew(omap_readw(OMAP7XX_PCC_UPLD_CTRL) & ~0x1,
861*4882a593Smuzhiyun OMAP7XX_PCC_UPLD_CTRL);
862*4882a593Smuzhiyun }
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun /* Amstrad Delta wants BCLK high when inactive */
865*4882a593Smuzhiyun if (machine_is_ams_delta())
866*4882a593Smuzhiyun omap_writel(omap_readl(ULPD_CLOCK_CTRL) |
867*4882a593Smuzhiyun (1 << SDW_MCLK_INV_BIT),
868*4882a593Smuzhiyun ULPD_CLOCK_CTRL);
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun /* Turn off DSP and ARM_TIMXO. Make sure ARM_INTHCK is not divided */
871*4882a593Smuzhiyun /* (on 730, bit 13 must not be cleared) */
872*4882a593Smuzhiyun if (cpu_is_omap7xx())
873*4882a593Smuzhiyun omap_writew(omap_readw(ARM_CKCTL) & 0x2fff, ARM_CKCTL);
874*4882a593Smuzhiyun else
875*4882a593Smuzhiyun omap_writew(omap_readw(ARM_CKCTL) & 0x0fff, ARM_CKCTL);
876*4882a593Smuzhiyun
877*4882a593Smuzhiyun /* Put DSP/MPUI into reset until needed */
878*4882a593Smuzhiyun omap_writew(0, ARM_RSTCT1);
879*4882a593Smuzhiyun omap_writew(1, ARM_RSTCT2);
880*4882a593Smuzhiyun omap_writew(0x400, ARM_IDLECT1);
881*4882a593Smuzhiyun
882*4882a593Smuzhiyun /*
883*4882a593Smuzhiyun * According to OMAP5910 Erratum SYS_DMA_1, bit DMACK_REQ (bit 8)
884*4882a593Smuzhiyun * of the ARM_IDLECT2 register must be set to zero. The power-on
885*4882a593Smuzhiyun * default value of this bit is one.
886*4882a593Smuzhiyun */
887*4882a593Smuzhiyun omap_writew(0x0000, ARM_IDLECT2); /* Turn LCD clock off also */
888*4882a593Smuzhiyun
889*4882a593Smuzhiyun /*
890*4882a593Smuzhiyun * Only enable those clocks we will need, let the drivers
891*4882a593Smuzhiyun * enable other clocks as necessary
892*4882a593Smuzhiyun */
893*4882a593Smuzhiyun clk_enable(&armper_ck.clk);
894*4882a593Smuzhiyun clk_enable(&armxor_ck.clk);
895*4882a593Smuzhiyun clk_enable(&armtim_ck.clk); /* This should be done by timer code */
896*4882a593Smuzhiyun
897*4882a593Smuzhiyun if (cpu_is_omap15xx())
898*4882a593Smuzhiyun clk_enable(&arm_gpio_ck);
899*4882a593Smuzhiyun
900*4882a593Smuzhiyun return 0;
901*4882a593Smuzhiyun }
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun #define OMAP1_DPLL1_SANE_VALUE 60000000
904*4882a593Smuzhiyun
omap1_clk_late_init(void)905*4882a593Smuzhiyun void __init omap1_clk_late_init(void)
906*4882a593Smuzhiyun {
907*4882a593Smuzhiyun unsigned long rate = ck_dpll1.rate;
908*4882a593Smuzhiyun
909*4882a593Smuzhiyun /* Find the highest supported frequency and enable it */
910*4882a593Smuzhiyun if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) {
911*4882a593Smuzhiyun pr_err("System frequencies not set, using default. Check your config.\n");
912*4882a593Smuzhiyun /*
913*4882a593Smuzhiyun * Reprogramming the DPLL is tricky, it must be done from SRAM.
914*4882a593Smuzhiyun */
915*4882a593Smuzhiyun omap_sram_reprogram_clock(0x2290, 0x0005);
916*4882a593Smuzhiyun ck_dpll1.rate = OMAP1_DPLL1_SANE_VALUE;
917*4882a593Smuzhiyun }
918*4882a593Smuzhiyun propagate_rate(&ck_dpll1);
919*4882a593Smuzhiyun omap1_show_rates();
920*4882a593Smuzhiyun loops_per_jiffy = cpufreq_scale(loops_per_jiffy, rate, ck_dpll1.rate);
921*4882a593Smuzhiyun }
922