1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 2011
5 * Ben Gray <ben.r.gray@gmail.com>.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. The name of the company nor the name of the author may be used to
17 * endorse or promote products derived from this software without specific
18 * prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY BEN GRAY ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL BEN GRAY BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 #include <sys/kernel.h>
38 #include <sys/module.h>
39 #include <sys/bus.h>
40 #include <sys/resource.h>
41 #include <sys/rman.h>
42 #include <sys/lock.h>
43 #include <sys/malloc.h>
44
45 #include <machine/bus.h>
46 #include <machine/resource.h>
47 #include <machine/intr.h>
48
49 #include <arm/arm/mpcore_timervar.h>
50 #include <arm/ti/tivar.h>
51 #include <arm/ti/ti_prcm.h>
52 #include <arm/ti/omap4/omap4_reg.h>
53
54 #include <dev/ofw/openfirm.h>
55 #include <dev/ofw/ofw_bus.h>
56 #include <dev/ofw/ofw_bus_subr.h>
57
58 /*
59 * This file defines the clock configuration for the OMAP4xxx series of
60 * devices.
61 *
62 * How This is Suppose to Work
63 * ===========================
64 * - There is a top level omap_prcm module that defines all OMAP SoC drivers
65 * should use to enable/disable the system clocks regardless of the version
66 * of OMAP device they are running on. This top level PRCM module is just
67 * a thin shim to chip specific functions that perform the donkey work of
68 * configuring the clock - this file is the 'donkey' for OMAP44xx devices.
69 *
70 * - The key bit in this file is the omap_clk_devmap array, it's
71 * used by the omap_prcm driver to determine what clocks are valid and which
72 * functions to call to manipulate them.
73 *
74 * - In essence you just need to define some callbacks for each of the
75 * clocks and then you're done.
76 *
77 * - The other thing that is worth noting is that when the omap_prcm device
78 * is registered you typically pass in some memory ranges which are the
79 * SYS_MEMORY resources. These resources are in turn allocated using
80 * bus_allocate_resources(...) and the resource handles are passed to all
81 * individual clock callback handlers.
82 *
83 *
84 *
85 * OMAP4 devices are different from the previous OMAP3 devices in that there
86 * is no longer a separate functional and interface clock for each module,
87 * instead there is typically an interface clock that spans many modules.
88 */
89
90 #define FREQ_96MHZ 96000000
91 #define FREQ_64MHZ 64000000
92 #define FREQ_48MHZ 48000000
93 #define FREQ_32KHZ 32000
94
95 #define PRM_INSTANCE 1
96 #define CM1_INSTANCE 2
97 #define CM2_INSTANCE 3
98
99 /**
100 * Address offsets from the PRM memory region to the top level clock control
101 * registers.
102 */
103 #define CKGEN_PRM_OFFSET 0x00000100UL
104 #define MPU_PRM_OFFSET 0x00000300UL
105 #define DSP_PRM_OFFSET 0x00000400UL
106 #define ABE_PRM_OFFSET 0x00000500UL
107 #define ALWAYS_ON_PRM_OFFSET 0x00000600UL
108 #define CORE_PRM_OFFSET 0x00000700UL
109 #define IVAHD_PRM_OFFSET 0x00000F00UL
110 #define CAM_PRM_OFFSET 0x00001000UL
111 #define DSS_PRM_OFFSET 0x00001100UL
112 #define SGX_PRM_OFFSET 0x00001200UL
113 #define L3INIT_PRM_OFFSET 0x00001300UL
114 #define L4PER_PRM_OFFSET 0x00001400UL
115 #define WKUP_PRM_OFFSET 0x00001700UL
116 #define WKUP_CM_OFFSET 0x00001800UL
117 #define EMU_PRM_OFFSET 0x00001900UL
118 #define EMU_CM_OFFSET 0x00001A00UL
119 #define DEVICE_PRM_OFFSET 0x00001B00UL
120 #define INSTR_PRM_OFFSET 0x00001F00UL
121
122 #define CM_ABE_DSS_SYS_CLKSEL_OFFSET (CKGEN_PRM_OFFSET + 0x0000UL)
123 #define CM_L4_WKUP_CLKSELL_OFFSET (CKGEN_PRM_OFFSET + 0x0008UL)
124 #define CM_ABE_PLL_REF_CLKSEL_OFFSET (CKGEN_PRM_OFFSET + 0x000CUL)
125 #define CM_SYS_CLKSEL_OFFSET (CKGEN_PRM_OFFSET + 0x0010UL)
126
127 /**
128 * Address offsets from the CM1 memory region to the top level clock control
129 * registers.
130 */
131 #define CKGEN_CM1_OFFSET 0x00000100UL
132 #define MPU_CM1_OFFSET 0x00000300UL
133 #define DSP_CM1_OFFSET 0x00000400UL
134 #define ABE_CM1_OFFSET 0x00000500UL
135 #define RESTORE_CM1_OFFSET 0x00000E00UL
136 #define INSTR_CM1_OFFSET 0x00000F00UL
137
138 #define CM_CLKSEL_DPLL_MPU (CKGEN_CM1_OFFSET + 0x006CUL)
139
140 /**
141 * Address offsets from the CM2 memory region to the top level clock control
142 * registers.
143 */
144 #define INTRCONN_SOCKET_CM2_OFFSET 0x00000000UL
145 #define CKGEN_CM2_OFFSET 0x00000100UL
146 #define ALWAYS_ON_CM2_OFFSET 0x00000600UL
147 #define CORE_CM2_OFFSET 0x00000700UL
148 #define IVAHD_CM2_OFFSET 0x00000F00UL
149 #define CAM_CM2_OFFSET 0x00001000UL
150 #define DSS_CM2_OFFSET 0x00001100UL
151 #define SGX_CM2_OFFSET 0x00001200UL
152 #define L3INIT_CM2_OFFSET 0x00001300UL
153 #define L4PER_CM2_OFFSET 0x00001400UL
154 #define RESTORE_CM2_OFFSET 0x00001E00UL
155 #define INSTR_CM2_OFFSET 0x00001F00UL
156
157 #define CLKCTRL_MODULEMODE_MASK 0x00000003UL
158 #define CLKCTRL_MODULEMODE_DISABLE 0x00000000UL
159 #define CLKCTRL_MODULEMODE_AUTO 0x00000001UL
160 #define CLKCTRL_MODULEMODE_ENABLE 0x00000001UL
161
162 #define CLKCTRL_IDLEST_MASK 0x00030000UL
163 #define CLKCTRL_IDLEST_ENABLED 0x00000000UL
164 #define CLKCTRL_IDLEST_WAKING 0x00010000UL
165 #define CLKCTRL_IDLEST_IDLE 0x00020000UL
166 #define CLKCTRL_IDLEST_DISABLED 0x00030000UL
167
168 static struct ofw_compat_data compat_data[] = {
169 {"ti,omap4-cm1", (uintptr_t)CM1_INSTANCE},
170 {"ti,omap4-cm2", (uintptr_t)CM2_INSTANCE},
171 {"ti,omap4-prm", (uintptr_t)PRM_INSTANCE},
172 {NULL, (uintptr_t)0},
173 };
174
175 struct omap4_prcm_softc {
176 struct resource *sc_res;
177 int sc_rid;
178 int sc_instance;
179 int attach_done;
180 };
181
182 static int omap4_clk_generic_activate(struct ti_clock_dev *clkdev);
183 static int omap4_clk_generic_deactivate(struct ti_clock_dev *clkdev);
184 static int omap4_clk_generic_accessible(struct ti_clock_dev *clkdev);
185 static int omap4_clk_generic_set_source(struct ti_clock_dev *clkdev, clk_src_t clksrc);
186 static int omap4_clk_generic_get_source_freq(struct ti_clock_dev *clkdev, unsigned int *freq);
187
188 static int omap4_clk_gptimer_set_source(struct ti_clock_dev *clkdev, clk_src_t clksrc);
189 static int omap4_clk_gptimer_get_source_freq(struct ti_clock_dev *clkdev, unsigned int *freq);
190
191 static int omap4_clk_hsmmc_set_source(struct ti_clock_dev *clkdev, clk_src_t clksrc);
192 static int omap4_clk_hsmmc_get_source_freq(struct ti_clock_dev *clkdev, unsigned int *freq);
193
194 static int omap4_clk_hsusbhost_set_source(struct ti_clock_dev *clkdev, clk_src_t clksrc);
195 static int omap4_clk_hsusbhost_activate(struct ti_clock_dev *clkdev);
196 static int omap4_clk_hsusbhost_deactivate(struct ti_clock_dev *clkdev);
197 static int omap4_clk_hsusbhost_accessible(struct ti_clock_dev *clkdev);
198
199 static int omap4_clk_get_sysclk_freq(struct ti_clock_dev *clkdev, unsigned int *freq);
200 static int omap4_clk_get_arm_fclk_freq(struct ti_clock_dev *clkdev, unsigned int *freq);
201
202 /**
203 * omap_clk_devmap - Array of clock devices available on OMAP4xxx devices
204 *
205 * This map only defines which clocks are valid and the callback functions
206 * for clock activate, deactivate, etc. It is used by the top level omap_prcm
207 * driver.
208 *
209 * The actual details of the clocks (config registers, bit fields, sources,
210 * etc) are in the private g_omap3_clk_details array below.
211 *
212 */
213
214 #define OMAP4_GENERIC_CLOCK_DEV(i) \
215 { .id = (i), \
216 .clk_activate = omap4_clk_generic_activate, \
217 .clk_deactivate = omap4_clk_generic_deactivate, \
218 .clk_set_source = omap4_clk_generic_set_source, \
219 .clk_accessible = omap4_clk_generic_accessible, \
220 .clk_get_source_freq = omap4_clk_generic_get_source_freq, \
221 .clk_set_source_freq = NULL \
222 }
223
224 #define OMAP4_GPTIMER_CLOCK_DEV(i) \
225 { .id = (i), \
226 .clk_activate = omap4_clk_generic_activate, \
227 .clk_deactivate = omap4_clk_generic_deactivate, \
228 .clk_set_source = omap4_clk_gptimer_set_source, \
229 .clk_accessible = omap4_clk_generic_accessible, \
230 .clk_get_source_freq = omap4_clk_gptimer_get_source_freq, \
231 .clk_set_source_freq = NULL \
232 }
233
234 #define OMAP4_HSMMC_CLOCK_DEV(i) \
235 { .id = (i), \
236 .clk_activate = omap4_clk_generic_activate, \
237 .clk_deactivate = omap4_clk_generic_deactivate, \
238 .clk_set_source = omap4_clk_hsmmc_set_source, \
239 .clk_accessible = omap4_clk_generic_accessible, \
240 .clk_get_source_freq = omap4_clk_hsmmc_get_source_freq, \
241 .clk_set_source_freq = NULL \
242 }
243
244 #define OMAP4_HSUSBHOST_CLOCK_DEV(i) \
245 { .id = (i), \
246 .clk_activate = omap4_clk_hsusbhost_activate, \
247 .clk_deactivate = omap4_clk_hsusbhost_deactivate, \
248 .clk_set_source = omap4_clk_hsusbhost_set_source, \
249 .clk_accessible = omap4_clk_hsusbhost_accessible, \
250 .clk_get_source_freq = NULL, \
251 .clk_set_source_freq = NULL \
252 }
253
254 struct ti_clock_dev ti_omap4_clk_devmap[] = {
255 /* System clocks */
256 { .id = SYS_CLK,
257 .clk_activate = NULL,
258 .clk_deactivate = NULL,
259 .clk_set_source = NULL,
260 .clk_accessible = NULL,
261 .clk_get_source_freq = omap4_clk_get_sysclk_freq,
262 .clk_set_source_freq = NULL,
263 },
264 /* MPU (ARM) core clocks */
265 { .id = MPU_CLK,
266 .clk_activate = NULL,
267 .clk_deactivate = NULL,
268 .clk_set_source = NULL,
269 .clk_accessible = NULL,
270 .clk_get_source_freq = omap4_clk_get_arm_fclk_freq,
271 .clk_set_source_freq = NULL,
272 },
273
274 /* UART device clocks */
275 OMAP4_GENERIC_CLOCK_DEV(UART1_CLK),
276 OMAP4_GENERIC_CLOCK_DEV(UART2_CLK),
277 OMAP4_GENERIC_CLOCK_DEV(UART3_CLK),
278 OMAP4_GENERIC_CLOCK_DEV(UART4_CLK),
279
280 /* Timer device source clocks */
281 OMAP4_GPTIMER_CLOCK_DEV(TIMER1_CLK),
282 OMAP4_GPTIMER_CLOCK_DEV(TIMER2_CLK),
283 OMAP4_GPTIMER_CLOCK_DEV(TIMER3_CLK),
284 OMAP4_GPTIMER_CLOCK_DEV(TIMER4_CLK),
285 OMAP4_GPTIMER_CLOCK_DEV(TIMER5_CLK),
286 OMAP4_GPTIMER_CLOCK_DEV(TIMER6_CLK),
287 OMAP4_GPTIMER_CLOCK_DEV(TIMER7_CLK),
288 OMAP4_GPTIMER_CLOCK_DEV(TIMER8_CLK),
289 OMAP4_GPTIMER_CLOCK_DEV(TIMER9_CLK),
290 OMAP4_GPTIMER_CLOCK_DEV(TIMER10_CLK),
291 OMAP4_GPTIMER_CLOCK_DEV(TIMER11_CLK),
292
293 /* MMC device clocks (MMC1 and MMC2 can have different input clocks) */
294 OMAP4_HSMMC_CLOCK_DEV(MMC1_CLK),
295 OMAP4_HSMMC_CLOCK_DEV(MMC2_CLK),
296 OMAP4_GENERIC_CLOCK_DEV(MMC3_CLK),
297 OMAP4_GENERIC_CLOCK_DEV(MMC4_CLK),
298 OMAP4_GENERIC_CLOCK_DEV(MMC5_CLK),
299
300 /* USB HS (high speed TLL, EHCI and OHCI) */
301 OMAP4_HSUSBHOST_CLOCK_DEV(USBTLL_CLK),
302 OMAP4_HSUSBHOST_CLOCK_DEV(USBHSHOST_CLK),
303 OMAP4_HSUSBHOST_CLOCK_DEV(USBFSHOST_CLK),
304 OMAP4_HSUSBHOST_CLOCK_DEV(USBP1_PHY_CLK),
305 OMAP4_HSUSBHOST_CLOCK_DEV(USBP2_PHY_CLK),
306 OMAP4_HSUSBHOST_CLOCK_DEV(USBP1_UTMI_CLK),
307 OMAP4_HSUSBHOST_CLOCK_DEV(USBP2_UTMI_CLK),
308 OMAP4_HSUSBHOST_CLOCK_DEV(USBP1_HSIC_CLK),
309 OMAP4_HSUSBHOST_CLOCK_DEV(USBP2_HSIC_CLK),
310
311 /* GPIO */
312 OMAP4_GENERIC_CLOCK_DEV(GPIO1_CLK),
313 OMAP4_GENERIC_CLOCK_DEV(GPIO2_CLK),
314 OMAP4_GENERIC_CLOCK_DEV(GPIO3_CLK),
315 OMAP4_GENERIC_CLOCK_DEV(GPIO4_CLK),
316 OMAP4_GENERIC_CLOCK_DEV(GPIO5_CLK),
317 OMAP4_GENERIC_CLOCK_DEV(GPIO6_CLK),
318
319 /* sDMA */
320 OMAP4_GENERIC_CLOCK_DEV(SDMA_CLK),
321
322 /* I2C */
323 OMAP4_GENERIC_CLOCK_DEV(I2C1_CLK),
324 OMAP4_GENERIC_CLOCK_DEV(I2C2_CLK),
325 OMAP4_GENERIC_CLOCK_DEV(I2C3_CLK),
326 OMAP4_GENERIC_CLOCK_DEV(I2C4_CLK),
327 { INVALID_CLK_IDENT, NULL, NULL, NULL, NULL }
328 };
329
330 /**
331 * omap4_clk_details - Stores details for all the different clocks supported
332 *
333 * Whenever an operation on a clock is being performed (activated, deactivated,
334 * etc) this array is looked up to find the correct register and bit(s) we
335 * should be modifying.
336 *
337 */
338 struct omap4_clk_details {
339 clk_ident_t id;
340
341 uint32_t instance;
342 uint32_t clksel_reg;
343
344 int32_t src_freq;
345
346 uint32_t enable_mode;
347 };
348
349 #define OMAP4_GENERIC_CLOCK_DETAILS(i, f, di, r, e) \
350 { .id = (i), \
351 .instance = (di), \
352 .clksel_reg = (r), \
353 .src_freq = (f), \
354 .enable_mode = (e), \
355 }
356
357 static struct omap4_clk_details g_omap4_clk_details[] = {
358 /* UART */
359 OMAP4_GENERIC_CLOCK_DETAILS(UART1_CLK, FREQ_48MHZ, CM2_INSTANCE,
360 (L4PER_CM2_OFFSET + 0x0140), CLKCTRL_MODULEMODE_ENABLE),
361 OMAP4_GENERIC_CLOCK_DETAILS(UART2_CLK, FREQ_48MHZ, CM2_INSTANCE,
362 (L4PER_CM2_OFFSET + 0x0148), CLKCTRL_MODULEMODE_ENABLE),
363 OMAP4_GENERIC_CLOCK_DETAILS(UART3_CLK, FREQ_48MHZ, CM2_INSTANCE,
364 (L4PER_CM2_OFFSET + 0x0150), CLKCTRL_MODULEMODE_ENABLE),
365 OMAP4_GENERIC_CLOCK_DETAILS(UART4_CLK, FREQ_48MHZ, CM2_INSTANCE,
366 (L4PER_CM2_OFFSET + 0x0158), CLKCTRL_MODULEMODE_ENABLE),
367
368 /* General purpose timers */
369 OMAP4_GENERIC_CLOCK_DETAILS(TIMER1_CLK, -1, PRM_INSTANCE,
370 (WKUP_CM_OFFSET + 0x040), CLKCTRL_MODULEMODE_ENABLE),
371 OMAP4_GENERIC_CLOCK_DETAILS(TIMER2_CLK, -1, CM2_INSTANCE,
372 (L4PER_CM2_OFFSET + 0x038), CLKCTRL_MODULEMODE_ENABLE),
373 OMAP4_GENERIC_CLOCK_DETAILS(TIMER3_CLK, -1, CM2_INSTANCE,
374 (L4PER_CM2_OFFSET + 0x040), CLKCTRL_MODULEMODE_ENABLE),
375 OMAP4_GENERIC_CLOCK_DETAILS(TIMER4_CLK, -1, CM2_INSTANCE,
376 (L4PER_CM2_OFFSET + 0x048), CLKCTRL_MODULEMODE_ENABLE),
377 OMAP4_GENERIC_CLOCK_DETAILS(TIMER5_CLK, -1, CM1_INSTANCE,
378 (ABE_CM1_OFFSET + 0x068), CLKCTRL_MODULEMODE_ENABLE),
379 OMAP4_GENERIC_CLOCK_DETAILS(TIMER6_CLK, -1, CM1_INSTANCE,
380 (ABE_CM1_OFFSET + 0x070), CLKCTRL_MODULEMODE_ENABLE),
381 OMAP4_GENERIC_CLOCK_DETAILS(TIMER7_CLK, -1, CM1_INSTANCE,
382 (ABE_CM1_OFFSET + 0x078), CLKCTRL_MODULEMODE_ENABLE),
383 OMAP4_GENERIC_CLOCK_DETAILS(TIMER8_CLK, -1, CM1_INSTANCE,
384 (ABE_CM1_OFFSET + 0x080), CLKCTRL_MODULEMODE_ENABLE),
385 OMAP4_GENERIC_CLOCK_DETAILS(TIMER9_CLK, -1, CM2_INSTANCE,
386 (L4PER_CM2_OFFSET + 0x050), CLKCTRL_MODULEMODE_ENABLE),
387 OMAP4_GENERIC_CLOCK_DETAILS(TIMER10_CLK, -1, CM2_INSTANCE,
388 (L4PER_CM2_OFFSET + 0x028), CLKCTRL_MODULEMODE_ENABLE),
389 OMAP4_GENERIC_CLOCK_DETAILS(TIMER11_CLK, -1, CM2_INSTANCE,
390 (L4PER_CM2_OFFSET + 0x030), CLKCTRL_MODULEMODE_ENABLE),
391
392 /* HSMMC (MMC1 and MMC2 can have different input clocks) */
393 OMAP4_GENERIC_CLOCK_DETAILS(MMC1_CLK, -1, CM2_INSTANCE,
394 (L3INIT_CM2_OFFSET + 0x028), /*CLKCTRL_MODULEMODE_ENABLE*/2),
395 OMAP4_GENERIC_CLOCK_DETAILS(MMC2_CLK, -1, CM2_INSTANCE,
396 (L3INIT_CM2_OFFSET + 0x030), /*CLKCTRL_MODULEMODE_ENABLE*/2),
397 OMAP4_GENERIC_CLOCK_DETAILS(MMC3_CLK, FREQ_48MHZ, CM2_INSTANCE,
398 (L4PER_CM2_OFFSET + 0x120), /*CLKCTRL_MODULEMODE_ENABLE*/2),
399 OMAP4_GENERIC_CLOCK_DETAILS(MMC4_CLK, FREQ_48MHZ, CM2_INSTANCE,
400 (L4PER_CM2_OFFSET + 0x128), /*CLKCTRL_MODULEMODE_ENABLE*/2),
401 OMAP4_GENERIC_CLOCK_DETAILS(MMC5_CLK, FREQ_48MHZ, CM2_INSTANCE,
402 (L4PER_CM2_OFFSET + 0x160), /*CLKCTRL_MODULEMODE_ENABLE*/1),
403
404 /* GPIO modules */
405 OMAP4_GENERIC_CLOCK_DETAILS(GPIO1_CLK, -1, PRM_INSTANCE,
406 (WKUP_CM_OFFSET + 0x038), CLKCTRL_MODULEMODE_AUTO),
407 OMAP4_GENERIC_CLOCK_DETAILS(GPIO2_CLK, -1, CM2_INSTANCE,
408 (L4PER_CM2_OFFSET + 0x060), CLKCTRL_MODULEMODE_AUTO),
409 OMAP4_GENERIC_CLOCK_DETAILS(GPIO3_CLK, -1, CM2_INSTANCE,
410 (L4PER_CM2_OFFSET + 0x068), CLKCTRL_MODULEMODE_AUTO),
411 OMAP4_GENERIC_CLOCK_DETAILS(GPIO4_CLK, -1, CM2_INSTANCE,
412 (L4PER_CM2_OFFSET + 0x070), CLKCTRL_MODULEMODE_AUTO),
413 OMAP4_GENERIC_CLOCK_DETAILS(GPIO5_CLK, -1, CM2_INSTANCE,
414 (L4PER_CM2_OFFSET + 0x078), CLKCTRL_MODULEMODE_AUTO),
415 OMAP4_GENERIC_CLOCK_DETAILS(GPIO6_CLK, -1, CM2_INSTANCE,
416 (L4PER_CM2_OFFSET + 0x080), CLKCTRL_MODULEMODE_AUTO),
417
418 /* sDMA block */
419 OMAP4_GENERIC_CLOCK_DETAILS(SDMA_CLK, -1, CM2_INSTANCE,
420 (CORE_CM2_OFFSET + 0x300), CLKCTRL_MODULEMODE_AUTO),
421
422 /* I2C modules */
423 OMAP4_GENERIC_CLOCK_DETAILS(I2C1_CLK, -1, CM2_INSTANCE,
424 (L4PER_CM2_OFFSET + 0x0A0), CLKCTRL_MODULEMODE_ENABLE),
425 OMAP4_GENERIC_CLOCK_DETAILS(I2C2_CLK, -1, CM2_INSTANCE,
426 (L4PER_CM2_OFFSET + 0x0A8), CLKCTRL_MODULEMODE_ENABLE),
427 OMAP4_GENERIC_CLOCK_DETAILS(I2C3_CLK, -1, CM2_INSTANCE,
428 (L4PER_CM2_OFFSET + 0x0B0), CLKCTRL_MODULEMODE_ENABLE),
429 OMAP4_GENERIC_CLOCK_DETAILS(I2C4_CLK, -1, CM2_INSTANCE,
430 (L4PER_CM2_OFFSET + 0x0B8), CLKCTRL_MODULEMODE_ENABLE),
431
432 { INVALID_CLK_IDENT, 0, 0, 0, 0 },
433 };
434
435 /**
436 * MAX_MODULE_ENABLE_WAIT - the number of loops to wait for the module to come
437 * alive.
438 *
439 */
440 #define MAX_MODULE_ENABLE_WAIT 100
441
442 /**
443 * ARRAY_SIZE - Macro to return the number of elements in a static const array.
444 *
445 */
446 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
447
448 /**
449 * omap4_clk_details - writes a 32-bit value to one of the timer registers
450 * @timer: Timer device context
451 * @off: The offset of a register from the timer register address range
452 * @val: The value to write into the register
453 *
454 *
455 * RETURNS:
456 * nothing
457 */
458 static struct omap4_clk_details*
459 omap4_clk_details(clk_ident_t id)
460 {
461 struct omap4_clk_details *walker;
462
463 for (walker = g_omap4_clk_details; walker->id != INVALID_CLK_IDENT; walker++) {
464 if (id == walker->id)
465 return (walker);
466 }
467
468 return NULL;
469 }
470
471 static struct omap4_prcm_softc *
472 omap4_prcm_get_instance_softc(int module_instance)
473 {
474 int i, maxunit;
475 devclass_t prcm_devclass;
476 device_t dev;
477 struct omap4_prcm_softc *sc;
478
479 prcm_devclass = devclass_find("omap4_prcm");
480 maxunit = devclass_get_maxunit(prcm_devclass);
481
482 for (i = 0; i < maxunit; i++) {
483 dev = devclass_get_device(prcm_devclass, i);
484 sc = device_get_softc(dev);
485 if (sc->sc_instance == module_instance)
486 return (sc);
487 }
488
489 return (NULL);
490 }
491
492 /**
493 * omap4_clk_generic_activate - checks if a module is accessible
494 * @module: identifier for the module to check, see omap3_prcm.h for a list
495 * of possible modules.
496 * Example: OMAP3_MODULE_MMC1
497 *
498 *
499 *
500 * LOCKING:
501 * Inherits the locks from the omap_prcm driver, no internal locking.
502 *
503 * RETURNS:
504 * Returns 0 on success or a positive error code on failure.
505 */
506 static int
507 omap4_clk_generic_activate(struct ti_clock_dev *clkdev)
508 {
509 struct omap4_prcm_softc *sc;
510 struct omap4_clk_details* clk_details;
511 struct resource* clk_mem_res;
512 uint32_t clksel;
513 unsigned int i;
514 clk_details = omap4_clk_details(clkdev->id);
515
516 if (clk_details == NULL)
517 return (ENXIO);
518
519 sc = omap4_prcm_get_instance_softc(clk_details->instance);
520 if (sc == NULL)
521 return ENXIO;
522
523 clk_mem_res = sc->sc_res;
524
525 if (clk_mem_res == NULL)
526 return (EINVAL);
527
528 /* All the 'generic' clocks have a CLKCTRL register which is more or less
529 * generic - the have at least two fielda called MODULEMODE and IDLEST.
530 */
531 clksel = bus_read_4(clk_mem_res, clk_details->clksel_reg);
532 clksel &= ~CLKCTRL_MODULEMODE_MASK;
533 clksel |= clk_details->enable_mode;
534 bus_write_4(clk_mem_res, clk_details->clksel_reg, clksel);
535
536 /* Now poll on the IDLEST register to tell us if the module has come up.
537 * TODO: We need to take into account the parent clocks.
538 */
539
540 /* Try MAX_MODULE_ENABLE_WAIT number of times to check if enabled */
541 for (i = 0; i < MAX_MODULE_ENABLE_WAIT; i++) {
542 clksel = bus_read_4(clk_mem_res, clk_details->clksel_reg);
543 if ((clksel & CLKCTRL_IDLEST_MASK) == CLKCTRL_IDLEST_ENABLED)
544 break;
545 DELAY(10);
546 }
547
548 /* Check the enabled state */
549 if ((clksel & CLKCTRL_IDLEST_MASK) != CLKCTRL_IDLEST_ENABLED) {
550 printf("Error: failed to enable module with clock %d\n", clkdev->id);
551 printf("Error: 0x%08x => 0x%08x\n", clk_details->clksel_reg, clksel);
552 return (ETIMEDOUT);
553 }
554
555 return (0);
556 }
557
558 /**
559 * omap4_clk_generic_deactivate - checks if a module is accessible
560 * @module: identifier for the module to check, see omap3_prcm.h for a list
561 * of possible modules.
562 * Example: OMAP3_MODULE_MMC1
563 *
564 *
565 *
566 * LOCKING:
567 * Inherits the locks from the omap_prcm driver, no internal locking.
568 *
569 * RETURNS:
570 * Returns 0 on success or a positive error code on failure.
571 */
572 static int
573 omap4_clk_generic_deactivate(struct ti_clock_dev *clkdev)
574 {
575 struct omap4_prcm_softc *sc;
576 struct omap4_clk_details* clk_details;
577 struct resource* clk_mem_res;
578 uint32_t clksel;
579
580 clk_details = omap4_clk_details(clkdev->id);
581
582 if (clk_details == NULL)
583 return (ENXIO);
584
585 sc = omap4_prcm_get_instance_softc(clk_details->instance);
586 if (sc == NULL)
587 return ENXIO;
588
589 clk_mem_res = sc->sc_res;
590
591 if (clk_mem_res == NULL)
592 return (EINVAL);
593
594 /* All the 'generic' clocks have a CLKCTRL register which is more or less
595 * generic - the have at least two fielda called MODULEMODE and IDLEST.
596 */
597 clksel = bus_read_4(clk_mem_res, clk_details->clksel_reg);
598 clksel &= ~CLKCTRL_MODULEMODE_MASK;
599 clksel |= CLKCTRL_MODULEMODE_DISABLE;
600 bus_write_4(clk_mem_res, clk_details->clksel_reg, clksel);
601
602 return (0);
603 }
604
605 /**
606 * omap4_clk_generic_set_source - checks if a module is accessible
607 * @module: identifier for the module to check, see omap3_prcm.h for a list
608 * of possible modules.
609 * Example: OMAP3_MODULE_MMC1
610 *
611 *
612 *
613 * LOCKING:
614 * Inherits the locks from the omap_prcm driver, no internal locking.
615 *
616 * RETURNS:
617 * Returns 0 on success or a positive error code on failure.
618 */
619 static int
620 omap4_clk_generic_set_source(struct ti_clock_dev *clkdev,
621 clk_src_t clksrc)
622 {
623
624 return (0);
625 }
626
627 /**
628 * omap4_clk_generic_accessible - checks if a module is accessible
629 * @module: identifier for the module to check, see omap3_prcm.h for a list
630 * of possible modules.
631 * Example: OMAP3_MODULE_MMC1
632 *
633 *
634 *
635 * LOCKING:
636 * Inherits the locks from the omap_prcm driver, no internal locking.
637 *
638 * RETURNS:
639 * Returns 0 on success or a negative error code on failure.
640 */
641 static int
642 omap4_clk_generic_accessible(struct ti_clock_dev *clkdev)
643 {
644 struct omap4_prcm_softc *sc;
645 struct omap4_clk_details* clk_details;
646 struct resource* clk_mem_res;
647 uint32_t clksel;
648
649 clk_details = omap4_clk_details(clkdev->id);
650
651 if (clk_details == NULL)
652 return (ENXIO);
653
654 sc = omap4_prcm_get_instance_softc(clk_details->instance);
655 if (sc == NULL)
656 return ENXIO;
657
658 clk_mem_res = sc->sc_res;
659
660 if (clk_mem_res == NULL)
661 return (EINVAL);
662
663 clksel = bus_read_4(clk_mem_res, clk_details->clksel_reg);
664
665 /* Check the enabled state */
666 if ((clksel & CLKCTRL_IDLEST_MASK) != CLKCTRL_IDLEST_ENABLED)
667 return (0);
668
669 return (1);
670 }
671
672 /**
673 * omap4_clk_generic_get_source_freq - checks if a module is accessible
674 * @module: identifier for the module to check, see omap3_prcm.h for a list
675 * of possible modules.
676 * Example: OMAP3_MODULE_MMC1
677 *
678 *
679 *
680 * LOCKING:
681 * Inherits the locks from the omap_prcm driver, no internal locking.
682 *
683 * RETURNS:
684 * Returns 0 on success or a negative error code on failure.
685 */
686 static int
687 omap4_clk_generic_get_source_freq(struct ti_clock_dev *clkdev,
688 unsigned int *freq
689 )
690 {
691 struct omap4_clk_details* clk_details = omap4_clk_details(clkdev->id);
692
693 if (clk_details == NULL)
694 return (ENXIO);
695
696 /* Simply return the stored frequency */
697 if (freq)
698 *freq = (unsigned int)clk_details->src_freq;
699
700 return (0);
701 }
702
703 /**
704 * omap4_clk_gptimer_set_source - checks if a module is accessible
705 * @module: identifier for the module to check, see omap3_prcm.h for a list
706 * of possible modules.
707 * Example: OMAP3_MODULE_MMC1
708 *
709 *
710 *
711 * LOCKING:
712 * Inherits the locks from the omap_prcm driver, no internal locking.
713 *
714 * RETURNS:
715 * Returns 0 on success or a negative error code on failure.
716 */
717 static int
718 omap4_clk_gptimer_set_source(struct ti_clock_dev *clkdev,
719 clk_src_t clksrc)
720 {
721 struct omap4_prcm_softc *sc;
722 struct omap4_clk_details* clk_details;
723 struct resource* clk_mem_res;
724
725 clk_details = omap4_clk_details(clkdev->id);
726
727 if (clk_details == NULL)
728 return (ENXIO);
729
730 sc = omap4_prcm_get_instance_softc(clk_details->instance);
731 if (sc == NULL)
732 return ENXIO;
733
734 clk_mem_res = sc->sc_res;
735
736 if (clk_mem_res == NULL)
737 return (EINVAL);
738
739 /* TODO: Implement */
740
741 return (0);
742 }
743
744 /**
745 * omap4_clk_gptimer_get_source_freq - checks if a module is accessible
746 * @module: identifier for the module to check, see omap3_prcm.h for a list
747 * of possible modules.
748 * Example: OMAP3_MODULE_MMC1
749 *
750 *
751 *
752 * LOCKING:
753 * Inherits the locks from the omap_prcm driver, no internal locking.
754 *
755 * RETURNS:
756 * Returns 0 on success or a negative error code on failure.
757 */
758 static int
759 omap4_clk_gptimer_get_source_freq(struct ti_clock_dev *clkdev,
760 unsigned int *freq
761 )
762 {
763 struct omap4_prcm_softc *sc;
764 struct omap4_clk_details* clk_details;
765 struct resource* clk_mem_res;
766 uint32_t clksel;
767 unsigned int src_freq;
768
769 clk_details = omap4_clk_details(clkdev->id);
770
771 if (clk_details == NULL)
772 return (ENXIO);
773
774 sc = omap4_prcm_get_instance_softc(clk_details->instance);
775 if (sc == NULL)
776 return ENXIO;
777
778 clk_mem_res = sc->sc_res;
779
780 if (clk_mem_res == NULL)
781 return (EINVAL);
782
783 /* Need to read the CLKSEL field to determine the clock source */
784 clksel = bus_read_4(clk_mem_res, clk_details->clksel_reg);
785 if (clksel & (0x1UL << 24))
786 src_freq = FREQ_32KHZ;
787 else
788 omap4_clk_get_sysclk_freq(NULL, &src_freq);
789
790 /* Return the frequency */
791 if (freq)
792 *freq = src_freq;
793
794 return (0);
795 }
796
797 /**
798 * omap4_clk_hsmmc_set_source - sets the source clock (freq)
799 * @clkdev: pointer to the clockdev structure (id field will contain clock id)
800 *
801 * The MMC 1 and 2 clocks can be source from either a 64MHz or 96MHz clock.
802 *
803 * LOCKING:
804 * Inherits the locks from the omap_prcm driver, no internal locking.
805 *
806 * RETURNS:
807 * Returns 0 on success or a negative error code on failure.
808 */
809 static int
810 omap4_clk_hsmmc_set_source(struct ti_clock_dev *clkdev,
811 clk_src_t clksrc)
812 {
813 struct omap4_prcm_softc *sc;
814 struct omap4_clk_details* clk_details;
815 struct resource* clk_mem_res;
816 uint32_t clksel;
817
818 clk_details = omap4_clk_details(clkdev->id);
819
820 if (clk_details == NULL)
821 return (ENXIO);
822
823 sc = omap4_prcm_get_instance_softc(clk_details->instance);
824 if (sc == NULL)
825 return ENXIO;
826
827 clk_mem_res = sc->sc_res;
828
829 if (clk_mem_res == NULL)
830 return (EINVAL);
831
832 /* For MMC modules 3, 4 & 5 you can't change the freq, it's always 48MHz */
833 if ((clkdev->id == MMC3_CLK) || (clkdev->id == MMC4_CLK) ||
834 (clkdev->id == MMC5_CLK)) {
835 if (clksrc != F48MHZ_CLK)
836 return (EINVAL);
837 return 0;
838 }
839
840 clksel = bus_read_4(clk_mem_res, clk_details->clksel_reg);
841
842 /* Bit 24 is set if 96MHz clock or cleared for 64MHz clock */
843 if (clksrc == F64MHZ_CLK)
844 clksel &= ~(0x1UL << 24);
845 else if (clksrc == F96MHZ_CLK)
846 clksel |= (0x1UL << 24);
847 else
848 return (EINVAL);
849
850 bus_write_4(clk_mem_res, clk_details->clksel_reg, clksel);
851
852 return (0);
853 }
854
855 /**
856 * omap4_clk_hsmmc_get_source_freq - checks if a module is accessible
857 * @clkdev: pointer to the clockdev structure (id field will contain clock id)
858 *
859 *
860 *
861 * LOCKING:
862 * Inherits the locks from the omap_prcm driver, no internal locking.
863 *
864 * RETURNS:
865 * Returns 0 on success or a negative error code on failure.
866 */
867 static int
868 omap4_clk_hsmmc_get_source_freq(struct ti_clock_dev *clkdev,
869 unsigned int *freq
870 )
871 {
872 struct omap4_prcm_softc *sc;
873 struct omap4_clk_details* clk_details;
874 struct resource* clk_mem_res;
875 uint32_t clksel;
876 unsigned int src_freq;
877
878 clk_details = omap4_clk_details(clkdev->id);
879
880 if (clk_details == NULL)
881 return (ENXIO);
882
883 sc = omap4_prcm_get_instance_softc(clk_details->instance);
884 if (sc == NULL)
885 return ENXIO;
886
887 clk_mem_res = sc->sc_res;
888
889 if (clk_mem_res == NULL)
890 return (EINVAL);
891
892 switch (clkdev->id) {
893 case MMC1_CLK:
894 case MMC2_CLK:
895 /* Need to read the CLKSEL field to determine the clock source */
896 clksel = bus_read_4(clk_mem_res, clk_details->clksel_reg);
897 if (clksel & (0x1UL << 24))
898 src_freq = FREQ_96MHZ;
899 else
900 src_freq = FREQ_64MHZ;
901 break;
902 case MMC3_CLK:
903 case MMC4_CLK:
904 case MMC5_CLK:
905 src_freq = FREQ_48MHZ;
906 break;
907 default:
908 return (EINVAL);
909 }
910
911 /* Return the frequency */
912 if (freq)
913 *freq = src_freq;
914
915 return (0);
916 }
917
918 /**
919 * omap4_clk_get_sysclk_freq - gets the sysclk frequency
920 * @sc: pointer to the clk module/device context
921 *
922 * Read the clocking information from the power-control/boot-strap registers,
923 * and stored in two global variables.
924 *
925 * RETURNS:
926 * nothing, values are saved in global variables
927 */
928 static int
929 omap4_clk_get_sysclk_freq(struct ti_clock_dev *clkdev,
930 unsigned int *freq)
931 {
932 uint32_t clksel;
933 uint32_t sysclk;
934 struct omap4_prcm_softc *sc;
935
936 sc = omap4_prcm_get_instance_softc(PRM_INSTANCE);
937 if (sc == NULL)
938 return ENXIO;
939
940 /* Read the input clock freq from the configuration register (CM_SYS_CLKSEL) */
941 clksel = bus_read_4(sc->sc_res, CM_SYS_CLKSEL_OFFSET);
942 switch (clksel & 0x7) {
943 case 0x1:
944 /* 12Mhz */
945 sysclk = 12000000;
946 break;
947 case 0x3:
948 /* 16.8Mhz */
949 sysclk = 16800000;
950 break;
951 case 0x4:
952 /* 19.2Mhz */
953 sysclk = 19200000;
954 break;
955 case 0x5:
956 /* 26Mhz */
957 sysclk = 26000000;
958 break;
959 case 0x7:
960 /* 38.4Mhz */
961 sysclk = 38400000;
962 break;
963 default:
964 panic("%s: Invalid clock freq", __func__);
965 }
966
967 /* Return the value */
968 if (freq)
969 *freq = sysclk;
970
971 return (0);
972 }
973
974 /**
975 * omap4_clk_get_arm_fclk_freq - gets the MPU clock frequency
976 * @clkdev: ignored
977 * @freq: pointer which upon return will contain the freq in hz
978 * @mem_res: array of allocated memory resources
979 *
980 * Reads the frequency setting information registers and returns the value
981 * in the freq variable.
982 *
983 * RETURNS:
984 * returns 0 on success, a positive error code on failure.
985 */
986 static int
987 omap4_clk_get_arm_fclk_freq(struct ti_clock_dev *clkdev,
988 unsigned int *freq)
989 {
990 uint32_t clksel;
991 uint32_t pll_mult, pll_div;
992 uint32_t mpuclk, sysclk;
993 struct omap4_prcm_softc *sc;
994
995 sc = omap4_prcm_get_instance_softc(CM1_INSTANCE);
996 if (sc == NULL)
997 return ENXIO;
998
999 /* Read the clksel register which contains the DPLL multiple and divide
1000 * values. These are applied to the sysclk.
1001 */
1002 clksel = bus_read_4(sc->sc_res, CM_CLKSEL_DPLL_MPU);
1003
1004 pll_mult = ((clksel >> 8) & 0x7ff);
1005 pll_div = (clksel & 0x7f) + 1;
1006
1007 /* Get the system clock freq */
1008 omap4_clk_get_sysclk_freq(NULL, &sysclk);
1009
1010 /* Calculate the MPU freq */
1011 mpuclk = ((uint64_t)sysclk * pll_mult) / pll_div;
1012
1013 /* Return the value */
1014 if (freq)
1015 *freq = mpuclk;
1016
1017 return (0);
1018 }
1019
1020 /**
1021 * omap4_clk_hsusbhost_activate - activates the USB clocks for the given module
1022 * @clkdev: pointer to the clock device structure.
1023 * @mem_res: array of memory resources allocated by the top level PRCM driver.
1024 *
1025 * The USB clocking setup seems to be a bit more tricky than the other modules,
1026 * to start with the clocking diagram for the HS host module shows 13 different
1027 * clocks. So to try and make it easier to follow the clocking activation
1028 * and deactivation is handled in its own set of callbacks.
1029 *
1030 * LOCKING:
1031 * Inherits the locks from the omap_prcm driver, no internal locking.
1032 *
1033 * RETURNS:
1034 * Returns 0 on success or a positive error code on failure.
1035 */
1036
1037 struct dpll_param {
1038 unsigned int m;
1039 unsigned int n;
1040 unsigned int m2;
1041 unsigned int m3;
1042 unsigned int m4;
1043 unsigned int m5;
1044 unsigned int m6;
1045 unsigned int m7;
1046 };
1047 /* USB parameters */
1048 struct dpll_param usb_dpll_param[7] = {
1049 /* 12M values */
1050 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
1051 /* 13M values */
1052 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
1053 /* 16.8M values */
1054 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
1055 /* 19.2M values */
1056 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
1057 /* 26M values */
1058 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
1059 /* 27M values */
1060 {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},
1061 /* 38.4M values */
1062 #ifdef CONFIG_OMAP4_SDC
1063 {0x32, 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0},
1064 #else
1065 {0x32, 0x1, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0},
1066 #endif
1067 };
1068 static int
1069 omap4_clk_hsusbhost_activate(struct ti_clock_dev *clkdev)
1070 {
1071 struct omap4_prcm_softc *sc;
1072 struct resource* clk_mem_res;
1073 uint32_t clksel_reg_off;
1074 uint32_t clksel;
1075 unsigned int i;
1076
1077 sc = omap4_prcm_get_instance_softc(CM2_INSTANCE);
1078 if (sc == NULL)
1079 return ENXIO;
1080
1081 switch (clkdev->id) {
1082 case USBTLL_CLK:
1083 /* For the USBTLL module we need to enable the following clocks:
1084 * - INIT_L4_ICLK (will be enabled by bootloader)
1085 * - TLL_CH0_FCLK
1086 * - TLL_CH1_FCLK
1087 */
1088
1089 /* We need the CM_L3INIT_HSUSBTLL_CLKCTRL register in CM2 register set */
1090 clk_mem_res = sc->sc_res;
1091 clksel_reg_off = L3INIT_CM2_OFFSET + 0x68;
1092
1093 /* Enable the module and also enable the optional func clocks for
1094 * channels 0 & 1 (is this needed ?)
1095 */
1096 clksel = bus_read_4(clk_mem_res, clksel_reg_off);
1097 clksel &= ~CLKCTRL_MODULEMODE_MASK;
1098 clksel |= CLKCTRL_MODULEMODE_ENABLE;
1099
1100 clksel |= (0x1 << 8); /* USB-HOST optional clock: USB_CH0_CLK */
1101 clksel |= (0x1 << 9); /* USB-HOST optional clock: USB_CH1_CLK */
1102 break;
1103
1104 case USBHSHOST_CLK:
1105 case USBP1_PHY_CLK:
1106 case USBP2_PHY_CLK:
1107 case USBP1_UTMI_CLK:
1108 case USBP2_UTMI_CLK:
1109 case USBP1_HSIC_CLK:
1110 case USBP2_HSIC_CLK:
1111 /* For the USB HS HOST module we need to enable the following clocks:
1112 * - INIT_L4_ICLK (will be enabled by bootloader)
1113 * - INIT_L3_ICLK (will be enabled by bootloader)
1114 * - INIT_48MC_FCLK
1115 * - UTMI_ROOT_GFCLK (UTMI only, create a new clock for that ?)
1116 * - UTMI_P1_FCLK (UTMI only, create a new clock for that ?)
1117 * - UTMI_P2_FCLK (UTMI only, create a new clock for that ?)
1118 * - HSIC_P1_60 (HSIC only, create a new clock for that ?)
1119 * - HSIC_P1_480 (HSIC only, create a new clock for that ?)
1120 * - HSIC_P2_60 (HSIC only, create a new clock for that ?)
1121 * - HSIC_P2_480 (HSIC only, create a new clock for that ?)
1122 */
1123
1124 /* We need the CM_L3INIT_HSUSBHOST_CLKCTRL register in CM2 register set */
1125 clk_mem_res = sc->sc_res;
1126 clksel_reg_off = L3INIT_CM2_OFFSET + 0x58;
1127 clksel = bus_read_4(clk_mem_res, clksel_reg_off);
1128 /* Enable the module and also enable the optional func clocks */
1129 if (clkdev->id == USBHSHOST_CLK) {
1130 clksel &= ~CLKCTRL_MODULEMODE_MASK;
1131 clksel |= /*CLKCTRL_MODULEMODE_ENABLE*/2;
1132
1133 clksel |= (0x1 << 15); /* USB-HOST clock control: FUNC48MCLK */
1134 }
1135
1136 else if (clkdev->id == USBP1_UTMI_CLK)
1137 clksel |= (0x1 << 8); /* UTMI_P1_CLK */
1138 else if (clkdev->id == USBP2_UTMI_CLK)
1139 clksel |= (0x1 << 9); /* UTMI_P2_CLK */
1140
1141 else if (clkdev->id == USBP1_HSIC_CLK)
1142 clksel |= (0x5 << 11); /* HSIC60M_P1_CLK + HSIC480M_P1_CLK */
1143 else if (clkdev->id == USBP2_HSIC_CLK)
1144 clksel |= (0x5 << 12); /* HSIC60M_P2_CLK + HSIC480M_P2_CLK */
1145
1146 break;
1147
1148 default:
1149 return (EINVAL);
1150 }
1151
1152 bus_write_4(clk_mem_res, clksel_reg_off, clksel);
1153
1154 /* Try MAX_MODULE_ENABLE_WAIT number of times to check if enabled */
1155 for (i = 0; i < MAX_MODULE_ENABLE_WAIT; i++) {
1156 clksel = bus_read_4(clk_mem_res, clksel_reg_off);
1157 if ((clksel & CLKCTRL_IDLEST_MASK) == CLKCTRL_IDLEST_ENABLED)
1158 break;
1159 }
1160
1161 /* Check the enabled state */
1162 if ((clksel & CLKCTRL_IDLEST_MASK) != CLKCTRL_IDLEST_ENABLED) {
1163 printf("Error: HERE failed to enable module with clock %d\n", clkdev->id);
1164 printf("Error: 0x%08x => 0x%08x\n", clksel_reg_off, clksel);
1165 return (ETIMEDOUT);
1166 }
1167
1168 return (0);
1169 }
1170
1171 /**
1172 * omap4_clk_generic_deactivate - checks if a module is accessible
1173 * @clkdev: pointer to the clock device structure.
1174 * @mem_res: array of memory resources allocated by the top level PRCM driver.
1175 *
1176 *
1177 *
1178 * LOCKING:
1179 * Inherits the locks from the omap_prcm driver, no internal locking.
1180 *
1181 * RETURNS:
1182 * Returns 0 on success or a positive error code on failure.
1183 */
1184 static int
1185 omap4_clk_hsusbhost_deactivate(struct ti_clock_dev *clkdev)
1186 {
1187 struct omap4_prcm_softc *sc;
1188 struct resource* clk_mem_res;
1189 uint32_t clksel_reg_off;
1190 uint32_t clksel;
1191
1192 sc = omap4_prcm_get_instance_softc(CM2_INSTANCE);
1193 if (sc == NULL)
1194 return ENXIO;
1195
1196 switch (clkdev->id) {
1197 case USBTLL_CLK:
1198 /* We need the CM_L3INIT_HSUSBTLL_CLKCTRL register in CM2 register set */
1199 clk_mem_res = sc->sc_res;
1200 clksel_reg_off = L3INIT_CM2_OFFSET + 0x68;
1201
1202 clksel = bus_read_4(clk_mem_res, clksel_reg_off);
1203 clksel &= ~CLKCTRL_MODULEMODE_MASK;
1204 clksel |= CLKCTRL_MODULEMODE_DISABLE;
1205 break;
1206
1207 case USBHSHOST_CLK:
1208 case USBP1_PHY_CLK:
1209 case USBP2_PHY_CLK:
1210 case USBP1_UTMI_CLK:
1211 case USBP2_UTMI_CLK:
1212 case USBP1_HSIC_CLK:
1213 case USBP2_HSIC_CLK:
1214 /* For the USB HS HOST module we need to enable the following clocks:
1215 * - INIT_L4_ICLK (will be enabled by bootloader)
1216 * - INIT_L3_ICLK (will be enabled by bootloader)
1217 * - INIT_48MC_FCLK
1218 * - UTMI_ROOT_GFCLK (UTMI only, create a new clock for that ?)
1219 * - UTMI_P1_FCLK (UTMI only, create a new clock for that ?)
1220 * - UTMI_P2_FCLK (UTMI only, create a new clock for that ?)
1221 * - HSIC_P1_60 (HSIC only, create a new clock for that ?)
1222 * - HSIC_P1_480 (HSIC only, create a new clock for that ?)
1223 * - HSIC_P2_60 (HSIC only, create a new clock for that ?)
1224 * - HSIC_P2_480 (HSIC only, create a new clock for that ?)
1225 */
1226
1227 /* We need the CM_L3INIT_HSUSBHOST_CLKCTRL register in CM2 register set */
1228 clk_mem_res = sc->sc_res;
1229 clksel_reg_off = L3INIT_CM2_OFFSET + 0x58;
1230 clksel = bus_read_4(clk_mem_res, clksel_reg_off);
1231
1232 /* Enable the module and also enable the optional func clocks */
1233 if (clkdev->id == USBHSHOST_CLK) {
1234 clksel &= ~CLKCTRL_MODULEMODE_MASK;
1235 clksel |= CLKCTRL_MODULEMODE_DISABLE;
1236
1237 clksel &= ~(0x1 << 15); /* USB-HOST clock control: FUNC48MCLK */
1238 }
1239
1240 else if (clkdev->id == USBP1_UTMI_CLK)
1241 clksel &= ~(0x1 << 8); /* UTMI_P1_CLK */
1242 else if (clkdev->id == USBP2_UTMI_CLK)
1243 clksel &= ~(0x1 << 9); /* UTMI_P2_CLK */
1244
1245 else if (clkdev->id == USBP1_HSIC_CLK)
1246 clksel &= ~(0x5 << 11); /* HSIC60M_P1_CLK + HSIC480M_P1_CLK */
1247 else if (clkdev->id == USBP2_HSIC_CLK)
1248 clksel &= ~(0x5 << 12); /* HSIC60M_P2_CLK + HSIC480M_P2_CLK */
1249
1250 break;
1251
1252 default:
1253 return (EINVAL);
1254 }
1255
1256 bus_write_4(clk_mem_res, clksel_reg_off, clksel);
1257
1258 return (0);
1259 }
1260
1261 /**
1262 * omap4_clk_hsusbhost_accessible - checks if a module is accessible
1263 * @clkdev: pointer to the clock device structure.
1264 * @mem_res: array of memory resources allocated by the top level PRCM driver.
1265 *
1266 *
1267 *
1268 * LOCKING:
1269 * Inherits the locks from the omap_prcm driver, no internal locking.
1270 *
1271 * RETURNS:
1272 * Returns 0 if module is not enable, 1 if module is enabled or a negative
1273 * error code on failure.
1274 */
1275 static int
1276 omap4_clk_hsusbhost_accessible(struct ti_clock_dev *clkdev)
1277 {
1278 struct omap4_prcm_softc *sc;
1279 struct resource* clk_mem_res;
1280 uint32_t clksel_reg_off;
1281 uint32_t clksel;
1282
1283 sc = omap4_prcm_get_instance_softc(CM2_INSTANCE);
1284 if (sc == NULL)
1285 return ENXIO;
1286
1287 if (clkdev->id == USBTLL_CLK) {
1288 /* We need the CM_L3INIT_HSUSBTLL_CLKCTRL register in CM2 register set */
1289 clk_mem_res = sc->sc_res;
1290 clksel_reg_off = L3INIT_CM2_OFFSET + 0x68;
1291 }
1292 else if (clkdev->id == USBHSHOST_CLK) {
1293 /* We need the CM_L3INIT_HSUSBHOST_CLKCTRL register in CM2 register set */
1294 clk_mem_res = sc->sc_res;
1295 clksel_reg_off = L3INIT_CM2_OFFSET + 0x58;
1296 }
1297 else {
1298 return (EINVAL);
1299 }
1300
1301 clksel = bus_read_4(clk_mem_res, clksel_reg_off);
1302
1303 /* Check the enabled state */
1304 if ((clksel & CLKCTRL_IDLEST_MASK) != CLKCTRL_IDLEST_ENABLED)
1305 return (0);
1306
1307 return (1);
1308 }
1309
1310 /**
1311 * omap4_clk_hsusbhost_set_source - sets the source clocks
1312 * @clkdev: pointer to the clock device structure.
1313 * @clksrc: the clock source ID for the given clock.
1314 * @mem_res: array of memory resources allocated by the top level PRCM driver.
1315 *
1316 *
1317 *
1318 * LOCKING:
1319 * Inherits the locks from the omap_prcm driver, no internal locking.
1320 *
1321 * RETURNS:
1322 * Returns 0 if successful otherwise a negative error code on failure.
1323 */
1324 static int
1325 omap4_clk_hsusbhost_set_source(struct ti_clock_dev *clkdev,
1326 clk_src_t clksrc)
1327 {
1328 struct omap4_prcm_softc *sc;
1329 struct resource* clk_mem_res;
1330 uint32_t clksel_reg_off;
1331 uint32_t clksel;
1332 unsigned int bit;
1333
1334 sc = omap4_prcm_get_instance_softc(CM2_INSTANCE);
1335 if (sc == NULL)
1336 return ENXIO;
1337
1338 if (clkdev->id == USBP1_PHY_CLK)
1339 bit = 24;
1340 else if (clkdev->id != USBP2_PHY_CLK)
1341 bit = 25;
1342 else
1343 return (EINVAL);
1344
1345 /* We need the CM_L3INIT_HSUSBHOST_CLKCTRL register in CM2 register set */
1346 clk_mem_res = sc->sc_res;
1347 clksel_reg_off = L3INIT_CM2_OFFSET + 0x58;
1348 clksel = bus_read_4(clk_mem_res, clksel_reg_off);
1349
1350 /* Set the clock source to either external or internal */
1351 if (clksrc == EXT_CLK)
1352 clksel |= (0x1 << bit);
1353 else
1354 clksel &= ~(0x1 << bit);
1355
1356 bus_write_4(clk_mem_res, clksel_reg_off, clksel);
1357
1358 return (0);
1359 }
1360
1361 #define PRM_RSTCTRL 0x1b00
1362 #define PRM_RSTCTRL_RESET 0x2
1363
1364 static void
1365 omap4_prcm_reset(void)
1366 {
1367 struct omap4_prcm_softc *sc;
1368
1369 sc = omap4_prcm_get_instance_softc(PRM_INSTANCE);
1370 if (sc == NULL)
1371 return;
1372
1373 bus_write_4(sc->sc_res, PRM_RSTCTRL,
1374 bus_read_4(sc->sc_res, PRM_RSTCTRL) | PRM_RSTCTRL_RESET);
1375 bus_read_4(sc->sc_res, PRM_RSTCTRL);
1376 }
1377
1378 /**
1379 * omap4_prcm_probe - probe function for the driver
1380 * @dev: prcm device handle
1381 *
1382 * Simply sets the name of the driver module.
1383 *
1384 * LOCKING:
1385 * None
1386 *
1387 * RETURNS:
1388 * Always returns 0
1389 */
1390 static int
1391 omap4_prcm_probe(device_t dev)
1392 {
1393 const struct ofw_compat_data *ocd;
1394
1395 if (!ofw_bus_status_okay(dev))
1396 return (ENXIO);
1397
1398 ocd = ofw_bus_search_compatible(dev, compat_data);
1399 if ((int)ocd->ocd_data == 0)
1400 return (ENXIO);
1401
1402 switch ((int)ocd->ocd_data) {
1403 case PRM_INSTANCE:
1404 device_set_desc(dev, "TI OMAP Power, Reset and Clock Management (PRM)");
1405 break;
1406 case CM1_INSTANCE:
1407 device_set_desc(dev, "TI OMAP Power, Reset and Clock Management (C1)");
1408 break;
1409 case CM2_INSTANCE:
1410 device_set_desc(dev, "TI OMAP Power, Reset and Clock Management (C2)");
1411 break;
1412 default:
1413 device_printf(dev, "unknown instance type: %d\n", (int)ocd->ocd_data);
1414 return (ENXIO);
1415 }
1416
1417 return (BUS_PROBE_DEFAULT);
1418 }
1419
1420 /**
1421 * omap_prcm_attach - attach function for the driver
1422 * @dev: prcm device handle
1423 *
1424 * Allocates and sets up the driver context, this simply entails creating a
1425 * bus mappings for the PRCM register set.
1426 *
1427 * LOCKING:
1428 * None
1429 *
1430 * RETURNS:
1431 * Always returns 0
1432 */
1433
1434 extern uint32_t platform_arm_tmr_freq;
1435
1436 static int
1437 omap4_prcm_attach(device_t dev)
1438 {
1439 struct omap4_prcm_softc *sc;
1440 const struct ofw_compat_data *ocd;
1441
1442 sc = device_get_softc(dev);
1443 ocd = ofw_bus_search_compatible(dev, compat_data);
1444 sc->sc_instance = (int)ocd->ocd_data;
1445
1446 sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid,
1447 RF_ACTIVE);
1448 if (sc->sc_res == NULL) {
1449 device_printf(dev, "could not allocate resources\n");
1450 return (ENXIO);
1451 }
1452
1453 ti_cpu_reset = omap4_prcm_reset;
1454
1455 return (0);
1456 }
1457
1458 static void
1459 omap4_prcm_new_pass(device_t dev)
1460 {
1461 struct omap4_prcm_softc *sc = device_get_softc(dev);
1462 unsigned int freq;
1463
1464 if (sc->attach_done ||
1465 bus_current_pass < (BUS_PASS_TIMER + BUS_PASS_ORDER_EARLY)) {
1466 bus_generic_new_pass(dev);
1467 return;
1468 }
1469 sc->attach_done = 1;
1470
1471 /*
1472 * In order to determine ARM frequency we need both RPM and CM1
1473 * instances up and running. So wait until all CRM devices are
1474 * initialized. Should be replaced with proper clock framework
1475 */
1476 if (device_get_unit(dev) == 2) {
1477 omap4_clk_get_arm_fclk_freq(NULL, &freq);
1478 arm_tmr_change_frequency(freq / 2);
1479 }
1480
1481 return;
1482 }
1483
1484 static device_method_t omap4_prcm_methods[] = {
1485 DEVMETHOD(device_probe, omap4_prcm_probe),
1486 DEVMETHOD(device_attach, omap4_prcm_attach),
1487
1488 /* Bus interface */
1489 DEVMETHOD(bus_new_pass, omap4_prcm_new_pass),
1490
1491 {0, 0},
1492 };
1493
1494 static driver_t omap4_prcm_driver = {
1495 "omap4_prcm",
1496 omap4_prcm_methods,
1497 sizeof(struct omap4_prcm_softc),
1498 };
1499
1500 EARLY_DRIVER_MODULE(omap4_prcm, simplebus, omap4_prcm_driver, 0, 0,
1501 BUS_PASS_BUS + BUS_PASS_ORDER_MIDDLE);
1502 MODULE_VERSION(omap4_prcm, 1);
Cache object: 17ec5481689a5038930d14bcc8f93f13
|