blob: 0ba8e34bc316e6421cb8e1b22b3fb775b5ad7faf [file] [log] [blame]
Rajan Vaja35116132018-01-17 02:39:25 -08001/*
Mounika Grace Akulafc4f17b2019-01-09 17:38:12 +05302 * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved.
Rajan Vaja35116132018-01-17 02:39:25 -08003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7/*
8 * ZynqMP system level PM-API functions for clock control.
9 */
10
Jolly Shah69fb5bf2018-02-07 16:25:41 -080011#include <stdbool.h>
Rajan Vaja35116132018-01-17 02:39:25 -080012#include <string.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000013
14#include <arch_helpers.h>
15#include <lib/mmio.h>
16#include <plat/common/platform.h>
17
Rajan Vaja35116132018-01-17 02:39:25 -080018#include "pm_api_clock.h"
19#include "pm_api_sys.h"
20#include "pm_client.h"
21#include "pm_common.h"
22#include "pm_ipi.h"
23
Jolly Shah69fb5bf2018-02-07 16:25:41 -080024#define CLK_NODE_MAX U(6)
Rajan Vaja35116132018-01-17 02:39:25 -080025
Jolly Shah69fb5bf2018-02-07 16:25:41 -080026#define CLK_PARENTS_ID_LEN U(16)
27#define CLK_TOPOLOGY_NODE_OFFSET U(16)
28#define CLK_TOPOLOGY_PAYLOAD_LEN U(12)
29#define CLK_PARENTS_PAYLOAD_LEN U(12)
Jolly Shah69fb5bf2018-02-07 16:25:41 -080030#define CLK_TYPE_SHIFT U(2)
31#define CLK_CLKFLAGS_SHIFT U(8)
32#define CLK_TYPEFLAGS_SHIFT U(24)
Rajan Vajaf065c7f2019-03-15 14:19:25 +053033#define CLK_TYPEFLAGS2_SHIFT U(4)
34#define CLK_TYPEFLAGS_BITS_MASK U(0xFF)
35#define CLK_TYPEFLAGS2_BITS_MASK U(0x0F00)
36#define CLK_TYPEFLAGS_BITS U(8)
Rajan Vajad98455b2018-01-17 02:39:26 -080037
38#define CLK_EXTERNAL_PARENT (PARENT_CLK_EXTERNAL << CLK_PARENTS_ID_LEN)
39
Jolly Shah69fb5bf2018-02-07 16:25:41 -080040#define NA_MULT U(0)
41#define NA_DIV U(0)
42#define NA_SHIFT U(0)
43#define NA_WIDTH U(0)
44#define NA_CLK_FLAGS U(0)
45#define NA_TYPE_FLAGS U(0)
Rajan Vajad98455b2018-01-17 02:39:26 -080046
47/* PLL nodes related definitions */
Jolly Shah69fb5bf2018-02-07 16:25:41 -080048#define PLL_PRESRC_MUX_SHIFT U(20)
49#define PLL_PRESRC_MUX_WIDTH U(3)
50#define PLL_POSTSRC_MUX_SHIFT U(24)
51#define PLL_POSTSRC_MUX_WIDTH U(3)
52#define PLL_DIV2_MUX_SHIFT U(16)
53#define PLL_DIV2_MUX_WIDTH U(1)
54#define PLL_BYPASS_MUX_SHIFT U(3)
55#define PLL_BYPASS_MUX_WIDTH U(1)
Rajan Vajad98455b2018-01-17 02:39:26 -080056
57/* Peripheral nodes related definitions */
58/* Peripheral Clocks */
Jolly Shah69fb5bf2018-02-07 16:25:41 -080059#define PERIPH_MUX_SHIFT U(0)
60#define PERIPH_MUX_WIDTH U(3)
61#define PERIPH_DIV1_SHIFT U(8)
62#define PERIPH_DIV1_WIDTH U(6)
63#define PERIPH_DIV2_SHIFT U(16)
64#define PERIPH_DIV2_WIDTH U(6)
65#define PERIPH_GATE_SHIFT U(24)
66#define PERIPH_GATE_WIDTH U(1)
Rajan Vajad98455b2018-01-17 02:39:26 -080067
Jolly Shah69fb5bf2018-02-07 16:25:41 -080068#define USB_GATE_SHIFT U(25)
Rajan Vajad98455b2018-01-17 02:39:26 -080069
70/* External clock related definitions */
71
72#define EXT_CLK_MIO_DATA(mio) \
73 [EXT_CLK_INDEX(EXT_CLK_MIO##mio)] = { \
74 .name = "mio_clk_"#mio, \
75 }
76
77#define EXT_CLK_INDEX(n) (n - CLK_MAX_OUTPUT_CLK)
78
79/* Clock control related definitions */
80#define BIT_MASK(x, y) (((1U << (y)) - 1) << (x))
81
Jolly Shah69fb5bf2018-02-07 16:25:41 -080082#define ISPLL(id) (id == CLK_APLL_INT || \
83 id == CLK_DPLL_INT || \
84 id == CLK_VPLL_INT || \
85 id == CLK_IOPLL_INT || \
86 id == CLK_RPLL_INT)
87
Rajan Vajad98455b2018-01-17 02:39:26 -080088
89#define PLLCTRL_BP_MASK BIT(3)
Jolly Shah69fb5bf2018-02-07 16:25:41 -080090#define PLLCTRL_RESET_MASK U(1)
91#define PLL_FRAC_OFFSET U(8)
92#define PLL_FRAC_MODE U(1)
93#define PLL_INT_MODE U(0)
94#define PLL_FRAC_MODE_MASK U(0x80000000)
95#define PLL_FRAC_MODE_SHIFT U(31)
96#define PLL_FRAC_DATA_MASK U(0xFFFF)
97#define PLL_FRAC_DATA_SHIFT U(0)
98#define PLL_FBDIV_MASK U(0x7F00)
99#define PLL_FBDIV_WIDTH U(7)
100#define PLL_FBDIV_SHIFT U(8)
Rajan Vajad98455b2018-01-17 02:39:26 -0800101
Jolly Shah69fb5bf2018-02-07 16:25:41 -0800102#define CLK_PLL_RESET_ASSERT U(1)
103#define CLK_PLL_RESET_RELEASE U(2)
Rajan Vajad98455b2018-01-17 02:39:26 -0800104#define CLK_PLL_RESET_PULSE (CLK_PLL_RESET_ASSERT | CLK_PLL_RESET_RELEASE)
105
106/* Common topology definitions */
107#define GENERIC_MUX \
108 { \
109 .type = TYPE_MUX, \
110 .offset = PERIPH_MUX_SHIFT, \
111 .width = PERIPH_MUX_WIDTH, \
112 .clkflags = CLK_SET_RATE_NO_REPARENT | \
113 CLK_IS_BASIC, \
114 .typeflags = NA_TYPE_FLAGS, \
115 .mult = NA_MULT, \
116 .div = NA_DIV, \
117 }
118
119#define IGNORE_UNUSED_MUX \
120 { \
121 .type = TYPE_MUX, \
122 .offset = PERIPH_MUX_SHIFT, \
123 .width = PERIPH_MUX_WIDTH, \
124 .clkflags = CLK_IGNORE_UNUSED | \
125 CLK_SET_RATE_NO_REPARENT | \
126 CLK_IS_BASIC, \
127 .typeflags = NA_TYPE_FLAGS, \
128 .mult = NA_MULT, \
129 .div = NA_DIV, \
130 }
131
132#define GENERIC_DIV(id) \
133 { \
134 .type = TYPE_DIV##id, \
135 .offset = PERIPH_DIV##id##_SHIFT, \
136 .width = PERIPH_DIV##id##_WIDTH, \
137 .clkflags = CLK_SET_RATE_NO_REPARENT | \
138 CLK_IS_BASIC, \
139 .typeflags = CLK_DIVIDER_ONE_BASED | \
140 CLK_DIVIDER_ALLOW_ZERO, \
141 .mult = NA_MULT, \
142 .div = NA_DIV, \
143 }
144
145#define IGNORE_UNUSED_DIV(id) \
146 { \
147 .type = TYPE_DIV##id, \
148 .offset = PERIPH_DIV##id##_SHIFT, \
149 .width = PERIPH_DIV##id##_WIDTH, \
150 .clkflags = CLK_IGNORE_UNUSED | \
151 CLK_SET_RATE_NO_REPARENT | \
152 CLK_IS_BASIC, \
153 .typeflags = CLK_DIVIDER_ONE_BASED | \
154 CLK_DIVIDER_ALLOW_ZERO, \
155 .mult = NA_MULT, \
156 .div = NA_DIV, \
157 }
158
159#define GENERIC_GATE \
160 { \
161 .type = TYPE_GATE, \
162 .offset = PERIPH_GATE_SHIFT, \
163 .width = PERIPH_GATE_WIDTH, \
164 .clkflags = CLK_SET_RATE_PARENT | \
165 CLK_SET_RATE_GATE | \
166 CLK_IS_BASIC, \
167 .typeflags = NA_TYPE_FLAGS, \
168 .mult = NA_MULT, \
169 .div = NA_DIV, \
170 }
171
172#define IGNORE_UNUSED_GATE \
173 { \
174 .type = TYPE_GATE, \
175 .offset = PERIPH_GATE_SHIFT, \
176 .width = PERIPH_GATE_WIDTH, \
177 .clkflags = CLK_SET_RATE_PARENT | \
178 CLK_IGNORE_UNUSED | \
179 CLK_IS_BASIC, \
180 .typeflags = NA_TYPE_FLAGS, \
181 .mult = NA_MULT, \
182 .div = NA_DIV, \
183 }
184
Rajan Vaja35116132018-01-17 02:39:25 -0800185/**
186 * struct pm_clock_node - Clock topology node information
187 * @type: Topology type (mux/div1/div2/gate/pll/fixed factor)
188 * @offset: Offset in control register
189 * @width: Width of the specific type in control register
190 * @clkflags: Clk specific flags
191 * @typeflags: Type specific flags
192 * @mult: Multiplier for fixed factor
193 * @div: Divisor for fixed factor
194 */
195struct pm_clock_node {
196 uint16_t clkflags;
197 uint16_t typeflags;
198 uint8_t type;
199 uint8_t offset;
200 uint8_t width;
201 uint8_t mult:4;
202 uint8_t div:4;
203};
204
205/**
206 * struct pm_clock - Clock structure
207 * @name: Clock name
208 * @control_reg: Control register address
209 * @status_reg: Status register address
210 * @parents: Parents for first clock node. Lower byte indicates parent
211 * clock id and upper byte indicate flags for that id.
212 * pm_clock_node: Clock nodes
213 */
214struct pm_clock {
215 char name[CLK_NAME_LEN];
216 uint8_t num_nodes;
217 unsigned int control_reg;
218 unsigned int status_reg;
219 int32_t (*parents)[];
220 struct pm_clock_node(*nodes)[];
221};
222
Rajan Vajad98455b2018-01-17 02:39:26 -0800223/**
224 * struct pm_clock - Clock structure
225 * @name: Clock name
226 */
227struct pm_ext_clock {
228 char name[CLK_NAME_LEN];
229};
230
231/* PLL Clocks */
232static struct pm_clock_node generic_pll_nodes[] = {
233 {
234 .type = TYPE_PLL,
235 .offset = NA_SHIFT,
236 .width = NA_WIDTH,
237 .clkflags = CLK_SET_RATE_NO_REPARENT,
238 .typeflags = NA_TYPE_FLAGS,
239 .mult = NA_MULT,
240 .div = NA_DIV,
241 },
242};
243
244static struct pm_clock_node ignore_unused_pll_nodes[] = {
245 {
246 .type = TYPE_PLL,
247 .offset = NA_SHIFT,
248 .width = NA_WIDTH,
249 .clkflags = CLK_IGNORE_UNUSED | CLK_SET_RATE_NO_REPARENT,
250 .typeflags = NA_TYPE_FLAGS,
251 .mult = NA_MULT,
252 .div = NA_DIV,
253 },
254};
255
256static struct pm_clock_node generic_pll_pre_src_nodes[] = {
257 {
258 .type = TYPE_MUX,
259 .offset = PLL_PRESRC_MUX_SHIFT,
260 .width = PLL_PRESRC_MUX_WIDTH,
261 .clkflags = CLK_IS_BASIC,
262 .typeflags = NA_TYPE_FLAGS,
263 .mult = NA_MULT,
264 .div = NA_DIV,
265 },
266};
267
268static struct pm_clock_node generic_pll_half_nodes[] = {
269 {
270 .type = TYPE_FIXEDFACTOR,
271 .offset = NA_SHIFT,
272 .width = NA_WIDTH,
273 .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT,
274 .typeflags = NA_TYPE_FLAGS,
275 .mult = 1,
276 .div = 2,
277 },
278};
279
280static struct pm_clock_node generic_pll_int_nodes[] = {
281 {
282 .type = TYPE_MUX,
283 .offset = PLL_DIV2_MUX_SHIFT,
284 .width = PLL_DIV2_MUX_WIDTH,
285 .clkflags = CLK_SET_RATE_NO_REPARENT |
286 CLK_SET_RATE_PARENT |
287 CLK_IS_BASIC,
288 .typeflags = NA_TYPE_FLAGS,
289 .mult = NA_MULT,
290 .div = NA_DIV,
291 },
292};
293
294static struct pm_clock_node generic_pll_post_src_nodes[] = {
295 {
296 .type = TYPE_MUX,
297 .offset = PLL_POSTSRC_MUX_SHIFT,
298 .width = PLL_POSTSRC_MUX_WIDTH,
299 .clkflags = CLK_IS_BASIC,
300 .typeflags = NA_TYPE_FLAGS,
301 .mult = NA_MULT,
302 .div = NA_DIV,
303 },
304};
305
306static struct pm_clock_node generic_pll_system_nodes[] = {
307 {
308 .type = TYPE_MUX,
309 .offset = PLL_BYPASS_MUX_SHIFT,
310 .width = PLL_BYPASS_MUX_WIDTH,
311 .clkflags = CLK_SET_RATE_NO_REPARENT |
312 CLK_SET_RATE_PARENT |
313 CLK_IS_BASIC,
314 .typeflags = NA_TYPE_FLAGS,
315 .mult = NA_MULT,
316 .div = NA_DIV,
317 },
318};
319
320static struct pm_clock_node acpu_nodes[] = {
321 {
322 .type = TYPE_MUX,
323 .offset = PERIPH_MUX_SHIFT,
324 .width = PERIPH_MUX_WIDTH,
325 .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC,
326 .typeflags = NA_TYPE_FLAGS,
327 .mult = NA_MULT,
328 .div = NA_DIV,
329 },
330 {
331 .type = TYPE_DIV1,
332 .offset = PERIPH_DIV1_SHIFT,
333 .width = PERIPH_DIV1_WIDTH,
334 .clkflags = CLK_IS_BASIC,
335 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
336 .mult = NA_MULT,
337 .div = NA_DIV,
338 },
Rajan Vajad98455b2018-01-17 02:39:26 -0800339};
340
341static struct pm_clock_node generic_mux_div_nodes[] = {
342 GENERIC_MUX,
343 GENERIC_DIV(1),
344};
345
346static struct pm_clock_node generic_mux_div_gate_nodes[] = {
347 GENERIC_MUX,
348 GENERIC_DIV(1),
349 GENERIC_GATE,
350};
351
352static struct pm_clock_node generic_mux_div_unused_gate_nodes[] = {
353 GENERIC_MUX,
354 GENERIC_DIV(1),
355 IGNORE_UNUSED_GATE,
356};
357
358static struct pm_clock_node generic_mux_div_div_gate_nodes[] = {
359 GENERIC_MUX,
360 GENERIC_DIV(1),
361 GENERIC_DIV(2),
362 GENERIC_GATE,
363};
364
365static struct pm_clock_node dp_audio_video_ref_nodes[] = {
366 {
367 .type = TYPE_MUX,
368 .offset = PERIPH_MUX_SHIFT,
369 .width = PERIPH_MUX_WIDTH,
370 .clkflags = CLK_SET_RATE_NO_REPARENT |
Rajan Vaja13d8a152019-03-15 14:19:26 +0530371 CLK_SET_RATE_PARENT | CLK_IS_BASIC,
372 .typeflags = CLK_FRAC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800373 .mult = NA_MULT,
374 .div = NA_DIV,
375 },
376 {
377 .type = TYPE_DIV1,
378 .offset = PERIPH_DIV1_SHIFT,
379 .width = PERIPH_DIV1_WIDTH,
380 .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT |
Rajan Vaja13d8a152019-03-15 14:19:26 +0530381 CLK_IS_BASIC,
382 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO |
383 CLK_FRAC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800384 .mult = NA_MULT,
385 .div = NA_DIV,
386 },
387 {
388 .type = TYPE_DIV2,
389 .offset = PERIPH_DIV2_SHIFT,
390 .width = PERIPH_DIV2_WIDTH,
391 .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_SET_RATE_PARENT |
Rajan Vaja13d8a152019-03-15 14:19:26 +0530392 CLK_IS_BASIC,
393 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO |
394 CLK_FRAC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800395 .mult = NA_MULT,
396 .div = NA_DIV,
397 },
398 {
399 .type = TYPE_GATE,
400 .offset = PERIPH_GATE_SHIFT,
401 .width = PERIPH_GATE_WIDTH,
402 .clkflags = CLK_SET_RATE_PARENT |
403 CLK_SET_RATE_GATE |
404 CLK_IS_BASIC,
405 .typeflags = NA_TYPE_FLAGS,
406 .mult = NA_MULT,
407 .div = NA_DIV,
408 },
409};
410
411static struct pm_clock_node usb_nodes[] = {
412 GENERIC_MUX,
413 GENERIC_DIV(1),
414 GENERIC_DIV(2),
415 {
416 .type = TYPE_GATE,
417 .offset = USB_GATE_SHIFT,
418 .width = PERIPH_GATE_WIDTH,
419 .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC |
420 CLK_SET_RATE_GATE,
421 .typeflags = NA_TYPE_FLAGS,
422 .mult = NA_MULT,
423 .div = NA_DIV,
424 },
425};
426
427static struct pm_clock_node generic_domain_crossing_nodes[] = {
428 {
429 .type = TYPE_DIV1,
430 .offset = 8,
431 .width = 6,
432 .clkflags = CLK_IS_BASIC,
433 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
434 .mult = NA_MULT,
435 .div = NA_DIV,
436 },
437};
438
439static struct pm_clock_node rpll_to_fpd_nodes[] = {
440 {
441 .type = TYPE_DIV1,
442 .offset = 8,
443 .width = 6,
444 .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
445 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
446 .mult = NA_MULT,
447 .div = NA_DIV,
448 },
449};
450
451static struct pm_clock_node acpu_half_nodes[] = {
452 {
453 .type = TYPE_FIXEDFACTOR,
454 .offset = 0,
455 .width = 1,
456 .clkflags = 0,
457 .typeflags = 0,
458 .mult = 1,
459 .div = 2,
460 },
461 {
462 .type = TYPE_GATE,
463 .offset = 25,
464 .width = PERIPH_GATE_WIDTH,
465 .clkflags = CLK_IGNORE_UNUSED |
466 CLK_SET_RATE_PARENT |
467 CLK_IS_BASIC,
468 .typeflags = NA_TYPE_FLAGS,
469 .mult = NA_MULT,
470 .div = NA_DIV,
471 },
472};
473
Jolly Shah3c8ffd42019-01-02 13:45:53 -0800474static struct pm_clock_node acpu_full_nodes[] = {
475 {
476 .type = TYPE_GATE,
477 .offset = 24,
478 .width = PERIPH_GATE_WIDTH,
479 .clkflags = CLK_IGNORE_UNUSED |
480 CLK_SET_RATE_PARENT |
481 CLK_IS_BASIC,
482 .typeflags = NA_TYPE_FLAGS,
483 .mult = NA_MULT,
484 .div = NA_DIV,
485 },
486};
487
Rajan Vajad98455b2018-01-17 02:39:26 -0800488static struct pm_clock_node wdt_nodes[] = {
489 {
490 .type = TYPE_MUX,
491 .offset = 0,
492 .width = 1,
493 .clkflags = CLK_SET_RATE_PARENT |
494 CLK_SET_RATE_NO_REPARENT |
495 CLK_IS_BASIC,
496 .typeflags = NA_TYPE_FLAGS,
497 .mult = NA_MULT,
498 .div = NA_DIV,
499 },
500};
501
502static struct pm_clock_node ddr_nodes[] = {
503 GENERIC_MUX,
504 {
505 .type = TYPE_DIV1,
506 .offset = 8,
507 .width = 6,
Siva Durga Prasad Paladugue2aa8272018-09-04 17:37:27 +0530508 .clkflags = CLK_IS_BASIC | CLK_IS_CRITICAL,
Rajan Vajad98455b2018-01-17 02:39:26 -0800509 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
510 .mult = NA_MULT,
511 .div = NA_DIV,
512 },
513};
514
515static struct pm_clock_node pl_nodes[] = {
516 GENERIC_MUX,
517 {
518 .type = TYPE_DIV1,
519 .offset = PERIPH_DIV1_SHIFT,
520 .width = PERIPH_DIV1_WIDTH,
521 .clkflags = CLK_IS_BASIC,
522 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
523 .mult = NA_MULT,
524 .div = NA_DIV,
525 },
526 {
527 .type = TYPE_DIV2,
528 .offset = PERIPH_DIV2_SHIFT,
529 .width = PERIPH_DIV2_WIDTH,
530 .clkflags = CLK_IS_BASIC | CLK_SET_RATE_PARENT,
531 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
532 .mult = NA_MULT,
533 .div = NA_DIV,
534 },
535 {
536 .type = TYPE_GATE,
537 .offset = PERIPH_GATE_SHIFT,
538 .width = PERIPH_GATE_WIDTH,
539 .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
540 .typeflags = NA_TYPE_FLAGS,
541 .mult = NA_MULT,
542 .div = NA_DIV,
543 },
544};
545
546static struct pm_clock_node gpu_pp0_nodes[] = {
547 {
548 .type = TYPE_GATE,
549 .offset = 25,
550 .width = PERIPH_GATE_WIDTH,
551 .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
552 .typeflags = NA_TYPE_FLAGS,
553 .mult = NA_MULT,
554 .div = NA_DIV,
555 },
556};
557
558static struct pm_clock_node gpu_pp1_nodes[] = {
559 {
560 .type = TYPE_GATE,
561 .offset = 26,
562 .width = PERIPH_GATE_WIDTH,
563 .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
564 .typeflags = NA_TYPE_FLAGS,
565 .mult = NA_MULT,
566 .div = NA_DIV,
567 },
568};
569
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200570static struct pm_clock_node gem_ref_ungated_nodes[] = {
Rajan Vajad98455b2018-01-17 02:39:26 -0800571 GENERIC_MUX,
572 {
573 .type = TYPE_DIV1,
574 .offset = 8,
575 .width = 6,
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200576 .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800577 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
578 .mult = NA_MULT,
579 .div = NA_DIV,
580 },
581 {
582 .type = TYPE_DIV2,
583 .offset = 16,
584 .width = 6,
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200585 .clkflags = CLK_SET_RATE_NO_REPARENT | CLK_IS_BASIC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800586 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
587 .mult = NA_MULT,
588 .div = NA_DIV,
589 },
Rajan Vajad98455b2018-01-17 02:39:26 -0800590};
591
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200592static struct pm_clock_node gem0_ref_nodes[] = {
Rajan Vajad98455b2018-01-17 02:39:26 -0800593 {
594 .type = TYPE_MUX,
595 .offset = 1,
596 .width = 1,
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200597 .clkflags = CLK_SET_RATE_PARENT |
598 CLK_SET_RATE_NO_REPARENT |
599 CLK_IS_BASIC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800600 .typeflags = NA_TYPE_FLAGS,
601 .mult = NA_MULT,
602 .div = NA_DIV,
603 },
604};
605
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200606static struct pm_clock_node gem1_ref_nodes[] = {
Rajan Vajad98455b2018-01-17 02:39:26 -0800607 {
608 .type = TYPE_MUX,
609 .offset = 6,
610 .width = 1,
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200611 .clkflags = CLK_SET_RATE_PARENT |
612 CLK_SET_RATE_NO_REPARENT |
613 CLK_IS_BASIC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800614 .typeflags = NA_TYPE_FLAGS,
615 .mult = NA_MULT,
616 .div = NA_DIV,
617 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200618};
619
620static struct pm_clock_node gem2_ref_nodes[] = {
Rajan Vajad98455b2018-01-17 02:39:26 -0800621 {
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200622 .type = TYPE_MUX,
623 .offset = 11,
624 .width = 1,
625 .clkflags = CLK_SET_RATE_PARENT |
626 CLK_SET_RATE_NO_REPARENT |
627 CLK_IS_BASIC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800628 .typeflags = NA_TYPE_FLAGS,
629 .mult = NA_MULT,
630 .div = NA_DIV,
631 },
632};
633
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200634static struct pm_clock_node gem3_ref_nodes[] = {
Rajan Vajad98455b2018-01-17 02:39:26 -0800635 {
636 .type = TYPE_MUX,
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200637 .offset = 16,
Rajan Vajad98455b2018-01-17 02:39:26 -0800638 .width = 1,
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200639 .clkflags = CLK_SET_RATE_PARENT |
640 CLK_SET_RATE_NO_REPARENT |
641 CLK_IS_BASIC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800642 .typeflags = NA_TYPE_FLAGS,
643 .mult = NA_MULT,
644 .div = NA_DIV,
645 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200646};
647
648static struct pm_clock_node gem_tx_nodes[] = {
Rajan Vajad98455b2018-01-17 02:39:26 -0800649 {
650 .type = TYPE_GATE,
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200651 .offset = 25,
Rajan Vajad98455b2018-01-17 02:39:26 -0800652 .width = PERIPH_GATE_WIDTH,
653 .clkflags = CLK_SET_RATE_PARENT | CLK_IS_BASIC,
654 .typeflags = NA_TYPE_FLAGS,
655 .mult = NA_MULT,
656 .div = NA_DIV,
657 },
658};
659
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200660static struct pm_clock_node gem_rx_nodes[] = {
Rajan Vajad98455b2018-01-17 02:39:26 -0800661 {
662 .type = TYPE_GATE,
663 .offset = 26,
664 .width = PERIPH_GATE_WIDTH,
Mirela Simonovicc55a3902018-09-17 14:25:16 +0200665 .clkflags = CLK_IS_BASIC,
Rajan Vajad98455b2018-01-17 02:39:26 -0800666 .typeflags = NA_TYPE_FLAGS,
667 .mult = NA_MULT,
668 .div = NA_DIV,
669 },
670};
671
672static struct pm_clock_node gem_tsu_nodes[] = {
673 {
674 .type = TYPE_MUX,
675 .offset = 20,
676 .width = 2,
677 .clkflags = CLK_SET_RATE_PARENT |
678 CLK_SET_RATE_NO_REPARENT |
679 CLK_IS_BASIC,
680 .typeflags = NA_TYPE_FLAGS,
681 .mult = NA_MULT,
682 .div = NA_DIV,
683 },
684};
685
686static struct pm_clock_node can0_mio_nodes[] = {
687 {
688 .type = TYPE_MUX,
689 .offset = 0,
690 .width = 7,
691 .clkflags = CLK_SET_RATE_PARENT |
692 CLK_SET_RATE_NO_REPARENT |
693 CLK_IS_BASIC,
694 .typeflags = NA_TYPE_FLAGS,
695 .mult = NA_MULT,
696 .div = NA_DIV,
697 },
698};
699
700static struct pm_clock_node can1_mio_nodes[] = {
701 {
702 .type = TYPE_MUX,
703 .offset = 15,
704 .width = 1,
705 .clkflags = CLK_SET_RATE_PARENT |
706 CLK_SET_RATE_NO_REPARENT |
707 CLK_IS_BASIC,
708 .typeflags = NA_TYPE_FLAGS,
709 .mult = NA_MULT,
710 .div = NA_DIV,
711 },
712};
713
714static struct pm_clock_node can0_nodes[] = {
715 {
716 .type = TYPE_MUX,
717 .offset = 7,
718 .width = 1,
719 .clkflags = CLK_SET_RATE_PARENT |
720 CLK_SET_RATE_NO_REPARENT |
721 CLK_IS_BASIC,
722 .typeflags = NA_TYPE_FLAGS,
723 .mult = NA_MULT,
724 .div = NA_DIV,
725 },
726};
727
728static struct pm_clock_node can1_nodes[] = {
729 {
730 .type = TYPE_MUX,
731 .offset = 22,
732 .width = 1,
733 .clkflags = CLK_SET_RATE_PARENT |
734 CLK_SET_RATE_NO_REPARENT |
735 CLK_IS_BASIC,
736 .typeflags = NA_TYPE_FLAGS,
737 .mult = NA_MULT,
738 .div = NA_DIV,
739 },
740};
741
742static struct pm_clock_node cpu_r5_core_nodes[] = {
743 {
744 .type = TYPE_GATE,
745 .offset = 25,
746 .width = PERIPH_GATE_WIDTH,
747 .clkflags = CLK_IGNORE_UNUSED |
748 CLK_IS_BASIC,
749 .typeflags = NA_TYPE_FLAGS,
750 .mult = NA_MULT,
751 .div = NA_DIV,
752 },
753};
754
755static struct pm_clock_node dll_ref_nodes[] = {
756 {
757 .type = TYPE_MUX,
758 .offset = 0,
759 .width = 3,
760 .clkflags = CLK_SET_RATE_PARENT |
761 CLK_SET_RATE_NO_REPARENT |
762 CLK_IS_BASIC,
763 .typeflags = NA_TYPE_FLAGS,
764 .mult = NA_MULT,
765 .div = NA_DIV,
766 },
767};
768
769static struct pm_clock_node timestamp_ref_nodes[] = {
770 GENERIC_MUX,
771 {
772 .type = TYPE_DIV1,
773 .offset = 8,
774 .width = 6,
775 .clkflags = CLK_IS_BASIC,
776 .typeflags = CLK_DIVIDER_ONE_BASED | CLK_DIVIDER_ALLOW_ZERO,
777 .mult = NA_MULT,
778 .div = NA_DIV,
779 },
780 IGNORE_UNUSED_GATE,
781};
782
783static int32_t can_mio_parents[] = {
784 EXT_CLK_MIO0, EXT_CLK_MIO1, EXT_CLK_MIO2, EXT_CLK_MIO3,
785 EXT_CLK_MIO4, EXT_CLK_MIO5, EXT_CLK_MIO6, EXT_CLK_MIO7,
786 EXT_CLK_MIO8, EXT_CLK_MIO9, EXT_CLK_MIO10, EXT_CLK_MIO11,
787 EXT_CLK_MIO12, EXT_CLK_MIO13, EXT_CLK_MIO14, EXT_CLK_MIO15,
788 EXT_CLK_MIO16, EXT_CLK_MIO17, EXT_CLK_MIO18, EXT_CLK_MIO19,
789 EXT_CLK_MIO20, EXT_CLK_MIO21, EXT_CLK_MIO22, EXT_CLK_MIO23,
790 EXT_CLK_MIO24, EXT_CLK_MIO25, EXT_CLK_MIO26, EXT_CLK_MIO27,
791 EXT_CLK_MIO28, EXT_CLK_MIO29, EXT_CLK_MIO30, EXT_CLK_MIO31,
792 EXT_CLK_MIO32, EXT_CLK_MIO33, EXT_CLK_MIO34, EXT_CLK_MIO35,
793 EXT_CLK_MIO36, EXT_CLK_MIO37, EXT_CLK_MIO38, EXT_CLK_MIO39,
794 EXT_CLK_MIO40, EXT_CLK_MIO41, EXT_CLK_MIO42, EXT_CLK_MIO43,
795 EXT_CLK_MIO44, EXT_CLK_MIO45, EXT_CLK_MIO46, EXT_CLK_MIO47,
796 EXT_CLK_MIO48, EXT_CLK_MIO49, EXT_CLK_MIO50, EXT_CLK_MIO51,
797 EXT_CLK_MIO52, EXT_CLK_MIO53, EXT_CLK_MIO54, EXT_CLK_MIO55,
798 EXT_CLK_MIO56, EXT_CLK_MIO57, EXT_CLK_MIO58, EXT_CLK_MIO59,
799 EXT_CLK_MIO60, EXT_CLK_MIO61, EXT_CLK_MIO62, EXT_CLK_MIO63,
800 EXT_CLK_MIO64, EXT_CLK_MIO65, EXT_CLK_MIO66, EXT_CLK_MIO67,
801 EXT_CLK_MIO68, EXT_CLK_MIO69, EXT_CLK_MIO70, EXT_CLK_MIO71,
802 EXT_CLK_MIO72, EXT_CLK_MIO73, EXT_CLK_MIO74, EXT_CLK_MIO75,
803 EXT_CLK_MIO76, EXT_CLK_MIO77, CLK_NA_PARENT
804};
805
Rajan Vaja35116132018-01-17 02:39:25 -0800806/* Clock array containing clock informaton */
Rajan Vajad98455b2018-01-17 02:39:26 -0800807static struct pm_clock clocks[] = {
808 [CLK_APLL_INT] = {
809 .name = "apll_int",
810 .control_reg = CRF_APB_APLL_CTRL,
811 .status_reg = CRF_APB_PLL_STATUS,
812 .parents = &((int32_t []) {CLK_APLL_PRE_SRC, CLK_NA_PARENT}),
813 .nodes = &ignore_unused_pll_nodes,
814 .num_nodes = ARRAY_SIZE(ignore_unused_pll_nodes),
815 },
816 [CLK_APLL_PRE_SRC] = {
817 .name = "apll_pre_src",
818 .control_reg = CRF_APB_APLL_CTRL,
819 .status_reg = CRF_APB_PLL_STATUS,
820 .parents = &((int32_t []) {
821 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
822 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
823 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
824 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
825 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
826 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
827 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
828 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
829 CLK_NA_PARENT
830 }),
831 .nodes = &generic_pll_pre_src_nodes,
832 .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
833 },
834 [CLK_APLL_HALF] = {
835 .name = "apll_half",
836 .control_reg = CRF_APB_APLL_CTRL,
837 .status_reg = CRF_APB_PLL_STATUS,
838 .parents = &((int32_t []) {CLK_APLL_INT, CLK_NA_PARENT}),
839 .nodes = &generic_pll_half_nodes,
840 .num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
841 },
842 [CLK_APLL_INT_MUX] = {
843 .name = "apll_int_mux",
844 .control_reg = CRF_APB_APLL_CTRL,
845 .status_reg = CRF_APB_PLL_STATUS,
846 .parents = &((int32_t []) {
847 CLK_APLL_INT,
848 CLK_APLL_HALF,
849 CLK_NA_PARENT
850 }),
851 .nodes = &generic_pll_int_nodes,
852 .num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
853 },
854 [CLK_APLL_POST_SRC] = {
855 .name = "apll_post_src",
856 .control_reg = CRF_APB_APLL_CTRL,
857 .status_reg = CRF_APB_PLL_STATUS,
858 .parents = &((int32_t []) {
859 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
860 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
861 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
862 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
863 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
864 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
865 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
866 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
867 CLK_NA_PARENT
868 }),
869 .nodes = &generic_pll_post_src_nodes,
870 .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
871 },
872 [CLK_APLL] = {
873 .name = "apll",
874 .control_reg = CRF_APB_APLL_CTRL,
875 .status_reg = CRF_APB_PLL_STATUS,
876 .parents = &((int32_t []) {
877 CLK_APLL_INT_MUX,
878 CLK_APLL_POST_SRC,
879 CLK_NA_PARENT
880 }),
881 .nodes = &generic_pll_system_nodes,
882 .num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
883 },
884 [CLK_DPLL_INT] = {
885 .name = "dpll_int",
886 .control_reg = CRF_APB_DPLL_CTRL,
887 .status_reg = CRF_APB_PLL_STATUS,
888 .parents = &((int32_t []) {CLK_DPLL_PRE_SRC, CLK_NA_PARENT}),
889 .nodes = &generic_pll_nodes,
890 .num_nodes = ARRAY_SIZE(generic_pll_nodes),
891 },
892 [CLK_DPLL_PRE_SRC] = {
893 .name = "dpll_pre_src",
894 .control_reg = CRF_APB_DPLL_CTRL,
895 .status_reg = CRF_APB_PLL_STATUS,
896 .parents = &((int32_t []) {
897 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
898 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
899 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
900 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
901 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
902 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
903 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
904 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
905 CLK_NA_PARENT
906 }),
907 .nodes = &generic_pll_pre_src_nodes,
908 .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
909 },
910 [CLK_DPLL_HALF] = {
911 .name = "dpll_half",
912 .control_reg = CRF_APB_DPLL_CTRL,
913 .status_reg = CRF_APB_PLL_STATUS,
914 .parents = &((int32_t []) {CLK_DPLL_INT, CLK_NA_PARENT}),
915 .nodes = &generic_pll_half_nodes,
916 .num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
917 },
918 [CLK_DPLL_INT_MUX] = {
919 .name = "dpll_int_mux",
920 .control_reg = CRF_APB_DPLL_CTRL,
921 .status_reg = CRF_APB_PLL_STATUS,
922 .parents = &((int32_t []) {
923 CLK_DPLL_INT,
924 CLK_DPLL_HALF,
925 CLK_NA_PARENT
926 }),
927 .nodes = &generic_pll_int_nodes,
928 .num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
929 },
930 [CLK_DPLL_POST_SRC] = {
931 .name = "dpll_post_src",
932 .control_reg = CRF_APB_DPLL_CTRL,
933 .status_reg = CRF_APB_PLL_STATUS,
934 .parents = &((int32_t []) {
935 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
936 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
937 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
938 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
939 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
940 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
941 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
942 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
943 CLK_NA_PARENT
944 }),
945 .nodes = &generic_pll_post_src_nodes,
946 .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
947 },
948 [CLK_DPLL] = {
949 .name = "dpll",
950 .control_reg = CRF_APB_DPLL_CTRL,
951 .status_reg = CRF_APB_PLL_STATUS,
952 .parents = &((int32_t []) {
953 CLK_DPLL_INT_MUX,
954 CLK_DPLL_POST_SRC,
955 CLK_NA_PARENT
956 }),
957 .nodes = &generic_pll_system_nodes,
958 .num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
959 },
960 [CLK_VPLL_INT] = {
961 .name = "vpll_int",
962 .control_reg = CRF_APB_VPLL_CTRL,
963 .status_reg = CRF_APB_PLL_STATUS,
964 .parents = &((int32_t []) {CLK_VPLL_PRE_SRC, CLK_NA_PARENT}),
965 .nodes = &ignore_unused_pll_nodes,
966 .num_nodes = ARRAY_SIZE(ignore_unused_pll_nodes),
967 },
968 [CLK_VPLL_PRE_SRC] = {
969 .name = "vpll_pre_src",
970 .control_reg = CRF_APB_VPLL_CTRL,
971 .status_reg = CRF_APB_PLL_STATUS,
972 .parents = &((int32_t []) {
973 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
974 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
975 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
976 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
977 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
978 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
979 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
980 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
981 CLK_NA_PARENT
982 }),
983 .nodes = &generic_pll_pre_src_nodes,
984 .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
985 },
986 [CLK_VPLL_HALF] = {
987 .name = "vpll_half",
988 .control_reg = CRF_APB_VPLL_CTRL,
989 .status_reg = CRF_APB_PLL_STATUS,
990 .parents = &((int32_t []) {CLK_VPLL_INT, CLK_NA_PARENT}),
991 .nodes = &generic_pll_half_nodes,
992 .num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
993 },
994 [CLK_VPLL_INT_MUX] = {
995 .name = "vpll_int_mux",
996 .control_reg = CRF_APB_VPLL_CTRL,
997 .status_reg = CRF_APB_PLL_STATUS,
998 .parents = &((int32_t []) {
999 CLK_VPLL_INT,
1000 CLK_VPLL_HALF,
1001 CLK_NA_PARENT
1002 }),
1003 .nodes = &generic_pll_int_nodes,
1004 .num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
1005 },
1006 [CLK_VPLL_POST_SRC] = {
1007 .name = "vpll_post_src",
1008 .control_reg = CRF_APB_VPLL_CTRL,
1009 .status_reg = CRF_APB_PLL_STATUS,
1010 .parents = &((int32_t []) {
1011 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1012 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1013 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1014 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1015 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1016 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1017 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1018 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1019 CLK_NA_PARENT
1020 }),
1021 .nodes = &generic_pll_post_src_nodes,
1022 .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
1023 },
1024 [CLK_VPLL] = {
1025 .name = "vpll",
1026 .control_reg = CRF_APB_VPLL_CTRL,
1027 .status_reg = CRF_APB_PLL_STATUS,
1028 .parents = &((int32_t []) {
1029 CLK_VPLL_INT_MUX,
1030 CLK_VPLL_POST_SRC,
1031 CLK_NA_PARENT
1032 }),
1033 .nodes = &generic_pll_system_nodes,
1034 .num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
1035 },
1036 [CLK_IOPLL_INT] = {
1037 .name = "iopll_int",
1038 .control_reg = CRL_APB_IOPLL_CTRL,
1039 .status_reg = CRF_APB_PLL_STATUS,
1040 .parents = &((int32_t []) {CLK_IOPLL_PRE_SRC, CLK_NA_PARENT}),
1041 .nodes = &generic_pll_nodes,
1042 .num_nodes = ARRAY_SIZE(generic_pll_nodes),
1043 },
1044 [CLK_IOPLL_PRE_SRC] = {
1045 .name = "iopll_pre_src",
1046 .control_reg = CRL_APB_IOPLL_CTRL,
1047 .status_reg = CRF_APB_PLL_STATUS,
1048 .parents = &((int32_t []) {
1049 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1050 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1051 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1052 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1053 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1054 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1055 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1056 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1057 CLK_NA_PARENT
1058 }),
1059 .nodes = &generic_pll_pre_src_nodes,
1060 .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
1061 },
1062 [CLK_IOPLL_HALF] = {
1063 .name = "iopll_half",
1064 .control_reg = CRL_APB_IOPLL_CTRL,
1065 .status_reg = CRF_APB_PLL_STATUS,
1066 .parents = &((int32_t []) {CLK_IOPLL_INT, CLK_NA_PARENT}),
1067 .nodes = &generic_pll_half_nodes,
1068 .num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
1069 },
1070 [CLK_IOPLL_INT_MUX] = {
1071 .name = "iopll_int_mux",
1072 .control_reg = CRL_APB_IOPLL_CTRL,
1073 .status_reg = CRF_APB_PLL_STATUS,
1074 .parents = &((int32_t []) {
1075 CLK_IOPLL_INT,
1076 CLK_IOPLL_HALF,
1077 CLK_NA_PARENT
1078 }),
1079 .nodes = &generic_pll_int_nodes,
1080 .num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
1081 },
1082 [CLK_IOPLL_POST_SRC] = {
1083 .name = "iopll_post_src",
1084 .control_reg = CRL_APB_IOPLL_CTRL,
1085 .status_reg = CRF_APB_PLL_STATUS,
1086 .parents = &((int32_t []) {
1087 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1088 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1089 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1090 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1091 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1092 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1093 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1094 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1095 CLK_NA_PARENT
1096 }),
1097 .nodes = &generic_pll_post_src_nodes,
1098 .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
1099 },
1100 [CLK_IOPLL] = {
1101 .name = "iopll",
1102 .control_reg = CRL_APB_IOPLL_CTRL,
1103 .status_reg = CRF_APB_PLL_STATUS,
1104 .parents = &((int32_t []) {
1105 CLK_IOPLL_INT_MUX,
1106 CLK_IOPLL_POST_SRC,
1107 CLK_NA_PARENT
1108 }),
1109 .nodes = &generic_pll_system_nodes,
1110 .num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
1111 },
1112 [CLK_RPLL_INT] = {
1113 .name = "rpll_int",
1114 .control_reg = CRL_APB_RPLL_CTRL,
1115 .status_reg = CRF_APB_PLL_STATUS,
1116 .parents = &((int32_t []) {CLK_RPLL_PRE_SRC, CLK_NA_PARENT}),
1117 .nodes = &generic_pll_nodes,
1118 .num_nodes = ARRAY_SIZE(generic_pll_nodes),
1119 },
1120 [CLK_RPLL_PRE_SRC] = {
1121 .name = "rpll_pre_src",
1122 .control_reg = CRL_APB_RPLL_CTRL,
1123 .status_reg = CRF_APB_PLL_STATUS,
1124 .parents = &((int32_t []) {
1125 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1126 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1127 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1128 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1129 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1130 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1131 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1132 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1133 CLK_NA_PARENT
1134 }),
1135
1136 .nodes = &generic_pll_pre_src_nodes,
1137 .num_nodes = ARRAY_SIZE(generic_pll_pre_src_nodes),
1138 },
1139 [CLK_RPLL_HALF] = {
1140 .name = "rpll_half",
1141 .control_reg = CRL_APB_RPLL_CTRL,
1142 .status_reg = CRF_APB_PLL_STATUS,
1143 .parents = &((int32_t []) {CLK_RPLL_INT, CLK_NA_PARENT}),
1144 .nodes = &generic_pll_half_nodes,
1145 .num_nodes = ARRAY_SIZE(generic_pll_half_nodes),
1146 },
1147 [CLK_RPLL_INT_MUX] = {
1148 .name = "rpll_int_mux",
1149 .control_reg = CRL_APB_RPLL_CTRL,
1150 .status_reg = CRF_APB_PLL_STATUS,
1151 .parents = &((int32_t []) {
1152 CLK_RPLL_INT,
1153 CLK_RPLL_HALF,
1154 CLK_NA_PARENT
1155 }),
1156 .nodes = &generic_pll_int_nodes,
1157 .num_nodes = ARRAY_SIZE(generic_pll_int_nodes),
1158 },
1159 [CLK_RPLL_POST_SRC] = {
1160 .name = "rpll_post_src",
1161 .control_reg = CRL_APB_RPLL_CTRL,
1162 .status_reg = CRF_APB_PLL_STATUS,
1163 .parents = &((int32_t []) {
1164 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1165 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1166 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1167 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1168 EXT_CLK_VIDEO | CLK_EXTERNAL_PARENT,
1169 EXT_CLK_PSS_ALT_REF | CLK_EXTERNAL_PARENT,
1170 EXT_CLK_AUX_REF | CLK_EXTERNAL_PARENT,
1171 EXT_CLK_GT_CRX_REF | CLK_EXTERNAL_PARENT,
1172 CLK_NA_PARENT
1173 }),
1174 .nodes = &generic_pll_post_src_nodes,
1175 .num_nodes = ARRAY_SIZE(generic_pll_post_src_nodes),
1176 },
1177 [CLK_RPLL] = {
1178 .name = "rpll",
1179 .control_reg = CRL_APB_RPLL_CTRL,
1180 .status_reg = CRL_APB_PLL_STATUS,
1181 .parents = &((int32_t []) {
1182 CLK_RPLL_INT_MUX,
1183 CLK_RPLL_POST_SRC,
1184 CLK_NA_PARENT
1185 }),
1186 .nodes = &generic_pll_system_nodes,
1187 .num_nodes = ARRAY_SIZE(generic_pll_system_nodes),
1188 },
1189 /* Peripheral Clocks */
1190 [CLK_ACPU] = {
1191 .name = "acpu",
1192 .control_reg = CRF_APB_ACPU_CTRL,
1193 .status_reg = 0,
1194 .parents = &((int32_t []) {
1195 CLK_APLL,
1196 CLK_DUMMY_PARENT,
1197 CLK_DPLL,
1198 CLK_VPLL,
1199 CLK_NA_PARENT
1200 }),
1201 .nodes = &acpu_nodes,
1202 .num_nodes = ARRAY_SIZE(acpu_nodes),
1203 },
Jolly Shah3c8ffd42019-01-02 13:45:53 -08001204 [CLK_ACPU_FULL] = {
1205 .name = "acpu_full",
1206 .control_reg = CRF_APB_ACPU_CTRL,
1207 .status_reg = 0,
1208 .parents = &((int32_t []) {
1209 CLK_ACPU | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
1210 CLK_NA_PARENT
1211 }),
1212 .nodes = &acpu_full_nodes,
1213 .num_nodes = ARRAY_SIZE(acpu_full_nodes),
1214 },
Rajan Vajad98455b2018-01-17 02:39:26 -08001215 [CLK_DBG_TRACE] = {
1216 .name = "dbg_trace",
1217 .control_reg = CRF_APB_DBG_TRACE_CTRL,
1218 .status_reg = 0,
1219 .parents = &((int32_t []) {
1220 CLK_IOPLL_TO_FPD,
1221 CLK_DUMMY_PARENT,
1222 CLK_DPLL,
1223 CLK_APLL,
1224 CLK_NA_PARENT
1225 }),
1226 .nodes = &generic_mux_div_gate_nodes,
1227 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1228 },
1229 [CLK_DBG_FPD] = {
1230 .name = "dbg_fpd",
1231 .control_reg = CRF_APB_DBG_FPD_CTRL,
1232 .status_reg = 0,
1233 .parents = &((int32_t []) {
1234 CLK_IOPLL_TO_FPD,
1235 CLK_DUMMY_PARENT,
1236 CLK_DPLL,
1237 CLK_APLL,
1238 CLK_NA_PARENT
1239 }),
1240 .nodes = &generic_mux_div_gate_nodes,
1241 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1242 },
1243 [CLK_DBG_TSTMP] = {
1244 .name = "dbg_tstmp",
1245 .control_reg = CRF_APB_DBG_TSTMP_CTRL,
1246 .status_reg = 0,
1247 .parents = &((int32_t []) {
1248 CLK_IOPLL_TO_FPD,
1249 CLK_DUMMY_PARENT,
1250 CLK_DPLL,
1251 CLK_APLL,
1252 CLK_NA_PARENT
1253 }),
1254 .nodes = &generic_mux_div_nodes,
1255 .num_nodes = ARRAY_SIZE(generic_mux_div_nodes),
1256 },
1257 [CLK_DP_VIDEO_REF] = {
1258 .name = "dp_video_ref",
1259 .control_reg = CRF_APB_DP_VIDEO_REF_CTRL,
1260 .status_reg = 0,
1261 .parents = &((int32_t []) {
1262 CLK_VPLL,
1263 CLK_DUMMY_PARENT,
1264 CLK_DPLL,
1265 CLK_RPLL_TO_FPD,
1266 CLK_NA_PARENT
1267 }),
1268 .nodes = &dp_audio_video_ref_nodes,
1269 .num_nodes = ARRAY_SIZE(dp_audio_video_ref_nodes),
1270 },
1271 [CLK_DP_AUDIO_REF] = {
1272 .name = "dp_audio_ref",
1273 .control_reg = CRF_APB_DP_AUDIO_REF_CTRL,
1274 .status_reg = 0,
1275 .parents = &((int32_t []) {
1276 CLK_VPLL,
1277 CLK_DUMMY_PARENT,
1278 CLK_DPLL,
1279 CLK_RPLL_TO_FPD,
1280 CLK_NA_PARENT
1281 }),
1282 .nodes = &dp_audio_video_ref_nodes,
1283 .num_nodes = ARRAY_SIZE(dp_audio_video_ref_nodes),
1284 },
1285 [CLK_DP_STC_REF] = {
1286 .name = "dp_stc_ref",
1287 .control_reg = CRF_APB_DP_STC_REF_CTRL,
1288 .status_reg = 0,
1289 .parents = &((int32_t []) {
1290 CLK_VPLL,
1291 CLK_DUMMY_PARENT,
1292 CLK_DPLL,
1293 CLK_RPLL_TO_FPD,
1294 CLK_NA_PARENT
1295 }),
1296 .nodes = &generic_mux_div_div_gate_nodes,
1297 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1298 },
1299 [CLK_DPDMA_REF] = {
1300 .name = "dpdma_ref",
1301 .control_reg = CRF_APB_DPDMA_REF_CTRL,
1302 .status_reg = 0,
1303 .parents = &((int32_t []) {
1304 CLK_APLL,
1305 CLK_DUMMY_PARENT,
1306 CLK_VPLL,
1307 CLK_DPLL,
1308 CLK_NA_PARENT
1309 }),
1310 .nodes = &generic_mux_div_gate_nodes,
1311 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1312 },
1313 [CLK_DDR_REF] = {
1314 .name = "ddr_ref",
1315 .control_reg = CRF_APB_DDR_CTRL,
1316 .status_reg = 0,
1317 .parents = &((int32_t []) {
1318 CLK_DPLL,
1319 CLK_VPLL,
1320 CLK_NA_PARENT
1321 }),
1322 .nodes = &ddr_nodes,
1323 .num_nodes = ARRAY_SIZE(ddr_nodes),
1324 },
1325 [CLK_GPU_REF] = {
1326 .name = "gpu_ref",
1327 .control_reg = CRF_APB_GPU_REF_CTRL,
1328 .status_reg = 0,
1329 .parents = &((int32_t []) {
1330 CLK_IOPLL_TO_FPD,
1331 CLK_DUMMY_PARENT,
1332 CLK_VPLL,
1333 CLK_DPLL,
1334 CLK_NA_PARENT
1335 }),
1336 .nodes = &generic_mux_div_gate_nodes,
1337 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1338 },
1339 [CLK_SATA_REF] = {
1340 .name = "sata_ref",
1341 .control_reg = CRF_APB_SATA_REF_CTRL,
1342 .status_reg = 0,
1343 .parents = &((int32_t []) {
1344 CLK_IOPLL_TO_FPD,
1345 CLK_DUMMY_PARENT,
1346 CLK_APLL,
1347 CLK_DPLL,
1348 CLK_NA_PARENT
1349 }),
1350 .nodes = &generic_mux_div_gate_nodes,
1351 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1352 },
1353 [CLK_PCIE_REF] = {
1354 .name = "pcie_ref",
1355 .control_reg = CRF_APB_PCIE_REF_CTRL,
1356 .status_reg = 0,
1357 .parents = &((int32_t []) {
1358 CLK_IOPLL_TO_FPD,
1359 CLK_DUMMY_PARENT,
1360 CLK_RPLL_TO_FPD,
1361 CLK_DPLL,
1362 CLK_NA_PARENT
1363 }),
1364 .nodes = &generic_mux_div_gate_nodes,
1365 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1366 },
1367 [CLK_GDMA_REF] = {
1368 .name = "gdma_ref",
1369 .control_reg = CRF_APB_GDMA_REF_CTRL,
1370 .status_reg = 0,
1371 .parents = &((int32_t []) {
1372 CLK_APLL,
1373 CLK_DUMMY_PARENT,
1374 CLK_VPLL,
1375 CLK_DPLL,
1376 CLK_NA_PARENT
1377 }),
1378 .nodes = &generic_mux_div_gate_nodes,
1379 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1380 },
1381 [CLK_GTGREF0_REF] = {
1382 .name = "gtgref0_ref",
1383 .control_reg = CRF_APB_GTGREF0_REF_CTRL,
1384 .status_reg = 0,
1385 .parents = &((int32_t []) {
1386 CLK_IOPLL_TO_FPD,
1387 CLK_DUMMY_PARENT,
1388 CLK_APLL,
1389 CLK_DPLL,
1390 CLK_NA_PARENT
1391 }),
1392 .nodes = &generic_mux_div_gate_nodes,
1393 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1394 },
1395 [CLK_TOPSW_MAIN] = {
1396 .name = "topsw_main",
1397 .control_reg = CRF_APB_TOPSW_MAIN_CTRL,
1398 .status_reg = 0,
1399 .parents = &((int32_t []) {
1400 CLK_APLL,
1401 CLK_DUMMY_PARENT,
1402 CLK_VPLL,
1403 CLK_DPLL,
1404 CLK_NA_PARENT
1405 }),
1406 .nodes = &generic_mux_div_unused_gate_nodes,
1407 .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1408 },
1409 [CLK_TOPSW_LSBUS] = {
1410 .name = "topsw_lsbus",
1411 .control_reg = CRF_APB_TOPSW_LSBUS_CTRL,
1412 .status_reg = 0,
1413 .parents = &((int32_t []) {
1414 CLK_APLL,
1415 CLK_DUMMY_PARENT,
1416 CLK_IOPLL_TO_FPD,
1417 CLK_DPLL,
1418 CLK_NA_PARENT
1419 }),
1420 .nodes = &generic_mux_div_unused_gate_nodes,
1421 .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1422 },
1423 [CLK_IOU_SWITCH] = {
1424 .name = "iou_switch",
1425 .control_reg = CRL_APB_IOU_SWITCH_CTRL,
1426 .status_reg = 0,
1427 .parents = &((int32_t []) {
1428 CLK_RPLL,
1429 CLK_DUMMY_PARENT,
1430 CLK_IOPLL,
1431 CLK_DPLL_TO_LPD,
1432 CLK_NA_PARENT
1433 }),
1434 .nodes = &generic_mux_div_unused_gate_nodes,
1435 .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1436 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +02001437 [CLK_GEM0_REF_UNGATED] = {
1438 .name = "gem0_ref_ung",
Rajan Vajad98455b2018-01-17 02:39:26 -08001439 .control_reg = CRL_APB_GEM0_REF_CTRL,
1440 .status_reg = 0,
1441 .parents = &((int32_t []) {
1442 CLK_IOPLL,
1443 CLK_DUMMY_PARENT,
1444 CLK_RPLL,
1445 CLK_DPLL_TO_LPD,
1446 CLK_NA_PARENT
1447 }),
Mirela Simonovicc55a3902018-09-17 14:25:16 +02001448 .nodes = &gem_ref_ungated_nodes,
1449 .num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes),
Rajan Vajad98455b2018-01-17 02:39:26 -08001450 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +02001451 [CLK_GEM1_REF_UNGATED] = {
1452 .name = "gem1_ref_ung",
Rajan Vajad98455b2018-01-17 02:39:26 -08001453 .control_reg = CRL_APB_GEM1_REF_CTRL,
1454 .status_reg = 0,
1455 .parents = &((int32_t []) {
1456 CLK_IOPLL,
1457 CLK_DUMMY_PARENT,
1458 CLK_RPLL,
1459 CLK_DPLL_TO_LPD,
1460 CLK_NA_PARENT
1461 }),
Mirela Simonovicc55a3902018-09-17 14:25:16 +02001462 .nodes = &gem_ref_ungated_nodes,
1463 .num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes),
Rajan Vajad98455b2018-01-17 02:39:26 -08001464 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +02001465 [CLK_GEM2_REF_UNGATED] = {
1466 .name = "gem2_ref_ung",
Rajan Vajad98455b2018-01-17 02:39:26 -08001467 .control_reg = CRL_APB_GEM2_REF_CTRL,
1468 .status_reg = 0,
1469 .parents = &((int32_t []) {
1470 CLK_IOPLL,
1471 CLK_DUMMY_PARENT,
1472 CLK_RPLL,
1473 CLK_DPLL_TO_LPD,
1474 CLK_NA_PARENT
1475 }),
Mirela Simonovicc55a3902018-09-17 14:25:16 +02001476 .nodes = &gem_ref_ungated_nodes,
1477 .num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes),
Rajan Vajad98455b2018-01-17 02:39:26 -08001478 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +02001479 [CLK_GEM3_REF_UNGATED] = {
1480 .name = "gem3_ref_ung",
Rajan Vajad98455b2018-01-17 02:39:26 -08001481 .control_reg = CRL_APB_GEM3_REF_CTRL,
1482 .status_reg = 0,
1483 .parents = &((int32_t []) {
1484 CLK_IOPLL,
1485 CLK_DUMMY_PARENT,
1486 CLK_RPLL,
1487 CLK_DPLL_TO_LPD,
1488 CLK_NA_PARENT
1489 }),
Mirela Simonovicc55a3902018-09-17 14:25:16 +02001490 .nodes = &gem_ref_ungated_nodes,
1491 .num_nodes = ARRAY_SIZE(gem_ref_ungated_nodes),
1492 },
1493 [CLK_GEM0_REF] = {
1494 .name = "gem0_ref",
1495 .control_reg = IOU_SLCR_GEM_CLK_CTRL,
1496 .status_reg = 0,
1497 .parents = &((int32_t []) {
1498 CLK_GEM0_REF_UNGATED |
1499 (PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN),
1500 EXT_CLK_GEM0_TX_EMIO | CLK_EXTERNAL_PARENT,
1501 CLK_NA_PARENT
1502 }),
1503 .nodes = &gem0_ref_nodes,
1504 .num_nodes = ARRAY_SIZE(gem0_ref_nodes),
1505 },
1506 [CLK_GEM1_REF] = {
1507 .name = "gem1_ref",
1508 .control_reg = IOU_SLCR_GEM_CLK_CTRL,
1509 .status_reg = 0,
1510 .parents = &((int32_t []) {
1511 CLK_GEM1_REF_UNGATED |
1512 (PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN),
1513 EXT_CLK_GEM1_TX_EMIO | CLK_EXTERNAL_PARENT,
1514 CLK_NA_PARENT
1515 }),
1516 .nodes = &gem1_ref_nodes,
1517 .num_nodes = ARRAY_SIZE(gem1_ref_nodes),
1518 },
1519 [CLK_GEM2_REF] = {
1520 .name = "gem2_ref",
1521 .control_reg = IOU_SLCR_GEM_CLK_CTRL,
1522 .status_reg = 0,
1523 .parents = &((int32_t []) {
1524 CLK_GEM2_REF_UNGATED |
1525 (PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN),
1526 EXT_CLK_GEM2_TX_EMIO | CLK_EXTERNAL_PARENT,
1527 CLK_NA_PARENT
1528 }),
1529 .nodes = &gem2_ref_nodes,
1530 .num_nodes = ARRAY_SIZE(gem2_ref_nodes),
1531 },
1532 [CLK_GEM3_REF] = {
1533 .name = "gem3_ref",
1534 .control_reg = IOU_SLCR_GEM_CLK_CTRL,
1535 .status_reg = 0,
1536 .parents = &((int32_t []) {
1537 CLK_GEM3_REF_UNGATED |
1538 (PARENT_CLK_NODE3 << CLK_PARENTS_ID_LEN),
1539 EXT_CLK_GEM3_TX_EMIO | CLK_EXTERNAL_PARENT,
1540 CLK_NA_PARENT
1541 }),
1542 .nodes = &gem3_ref_nodes,
1543 .num_nodes = ARRAY_SIZE(gem3_ref_nodes),
Rajan Vajad98455b2018-01-17 02:39:26 -08001544 },
1545 [CLK_USB0_BUS_REF] = {
1546 .name = "usb0_bus_ref",
1547 .control_reg = CRL_APB_USB0_BUS_REF_CTRL,
1548 .status_reg = 0,
1549 .parents = &((int32_t []) {
1550 CLK_IOPLL,
1551 CLK_DUMMY_PARENT,
1552 CLK_RPLL,
1553 CLK_DPLL_TO_LPD,
1554 CLK_NA_PARENT
1555 }),
1556 .nodes = &usb_nodes,
1557 .num_nodes = ARRAY_SIZE(usb_nodes),
1558 },
1559 [CLK_USB1_BUS_REF] = {
1560 .name = "usb1_bus_ref",
1561 .control_reg = CRL_APB_USB1_BUS_REF_CTRL,
1562 .status_reg = 0,
1563 .parents = &((int32_t []) {
1564 CLK_IOPLL,
1565 CLK_DUMMY_PARENT,
1566 CLK_RPLL,
1567 CLK_DPLL_TO_LPD,
1568 CLK_NA_PARENT
1569 }),
1570 .nodes = &usb_nodes,
1571 .num_nodes = ARRAY_SIZE(usb_nodes),
1572 },
1573 [CLK_USB3_DUAL_REF] = {
1574 .name = "usb3_dual_ref",
1575 .control_reg = CRL_APB_USB3_DUAL_REF_CTRL,
1576 .status_reg = 0,
1577 .parents = &((int32_t []) {
1578 CLK_IOPLL,
1579 CLK_DUMMY_PARENT,
1580 CLK_RPLL,
1581 CLK_DPLL_TO_LPD,
1582 CLK_NA_PARENT
1583 }),
1584 .nodes = &usb_nodes,
1585 .num_nodes = ARRAY_SIZE(usb_nodes),
1586 },
1587 [CLK_QSPI_REF] = {
1588 .name = "qspi_ref",
1589 .control_reg = CRL_APB_QSPI_REF_CTRL,
1590 .status_reg = 0,
1591 .parents = &((int32_t []) {
1592 CLK_IOPLL,
1593 CLK_DUMMY_PARENT,
1594 CLK_RPLL,
1595 CLK_DPLL_TO_LPD,
1596 CLK_NA_PARENT
1597 }),
1598 .nodes = &generic_mux_div_div_gate_nodes,
1599 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1600 },
1601 [CLK_SDIO0_REF] = {
1602 .name = "sdio0_ref",
1603 .control_reg = CRL_APB_SDIO0_REF_CTRL,
1604 .status_reg = 0,
1605 .parents = &((int32_t []) {
1606 CLK_IOPLL,
1607 CLK_DUMMY_PARENT,
1608 CLK_RPLL,
1609 CLK_VPLL_TO_LPD,
1610 CLK_NA_PARENT
1611 }),
1612 .nodes = &generic_mux_div_div_gate_nodes,
1613 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1614 },
1615 [CLK_SDIO1_REF] = {
1616 .name = "sdio1_ref",
1617 .control_reg = CRL_APB_SDIO1_REF_CTRL,
1618 .status_reg = 0,
1619 .parents = &((int32_t []) {
1620 CLK_IOPLL,
1621 CLK_DUMMY_PARENT,
1622 CLK_RPLL,
1623 CLK_VPLL_TO_LPD,
1624 CLK_NA_PARENT
1625 }),
1626 .nodes = &generic_mux_div_div_gate_nodes,
1627 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1628 },
1629 [CLK_UART0_REF] = {
1630 .name = "uart0_ref",
1631 .control_reg = CRL_APB_UART0_REF_CTRL,
1632 .status_reg = 0,
1633 .parents = &((int32_t []) {
1634 CLK_IOPLL,
1635 CLK_DUMMY_PARENT,
1636 CLK_RPLL,
1637 CLK_DPLL_TO_LPD,
1638 CLK_NA_PARENT
1639 }),
1640 .nodes = &generic_mux_div_div_gate_nodes,
1641 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1642 },
1643 [CLK_UART1_REF] = {
1644 .name = "uart1_ref",
1645 .control_reg = CRL_APB_UART1_REF_CTRL,
1646 .status_reg = 0,
1647 .parents = &((int32_t []) {
1648 CLK_IOPLL,
1649 CLK_DUMMY_PARENT,
1650 CLK_RPLL,
1651 CLK_DPLL_TO_LPD,
1652 CLK_NA_PARENT
1653 }),
1654 .nodes = &generic_mux_div_div_gate_nodes,
1655 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1656 },
1657 [CLK_SPI0_REF] = {
1658 .name = "spi0_ref",
1659 .control_reg = CRL_APB_SPI0_REF_CTRL,
1660 .status_reg = 0,
1661 .parents = &((int32_t []) {
1662 CLK_IOPLL,
1663 CLK_DUMMY_PARENT,
1664 CLK_RPLL,
1665 CLK_DPLL_TO_LPD,
1666 CLK_NA_PARENT
1667 }),
1668 .nodes = &generic_mux_div_div_gate_nodes,
1669 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1670 },
1671 [CLK_SPI1_REF] = {
1672 .name = "spi1_ref",
1673 .control_reg = CRL_APB_SPI1_REF_CTRL,
1674 .status_reg = 0,
1675 .parents = &((int32_t []) {
1676 CLK_IOPLL,
1677 CLK_DUMMY_PARENT,
1678 CLK_RPLL,
1679 CLK_DPLL_TO_LPD,
1680 CLK_NA_PARENT
1681 }),
1682 .nodes = &generic_mux_div_div_gate_nodes,
1683 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1684 },
1685 [CLK_CAN0_REF] = {
1686 .name = "can0_ref",
1687 .control_reg = CRL_APB_CAN0_REF_CTRL,
1688 .status_reg = 0,
1689 .parents = &((int32_t []) {
1690 CLK_IOPLL,
1691 CLK_DUMMY_PARENT,
1692 CLK_RPLL,
1693 CLK_DPLL_TO_LPD,
1694 CLK_NA_PARENT
1695 }),
1696 .nodes = &generic_mux_div_div_gate_nodes,
1697 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1698 },
1699 [CLK_CAN1_REF] = {
1700 .name = "can1_ref",
1701 .control_reg = CRL_APB_CAN1_REF_CTRL,
1702 .status_reg = 0,
1703 .parents = &((int32_t []) {
1704 CLK_IOPLL,
1705 CLK_DUMMY_PARENT,
1706 CLK_RPLL,
1707 CLK_DPLL_TO_LPD,
1708 CLK_NA_PARENT
1709 }),
1710 .nodes = &generic_mux_div_div_gate_nodes,
1711 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1712 },
1713 [CLK_NAND_REF] = {
1714 .name = "nand_ref",
1715 .control_reg = CRL_APB_NAND_REF_CTRL,
1716 .status_reg = 0,
1717 .parents = &((int32_t []) {
1718 CLK_IOPLL,
1719 CLK_DUMMY_PARENT,
1720 CLK_RPLL,
1721 CLK_DPLL_TO_LPD,
1722 CLK_NA_PARENT
1723 }),
1724 .nodes = &generic_mux_div_div_gate_nodes,
1725 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1726 },
1727 [CLK_GEM_TSU_REF] = {
1728 .name = "gem_tsu_ref",
1729 .control_reg = CRL_APB_GEM_TSU_REF_CTRL,
1730 .status_reg = 0,
1731 .parents = &((int32_t []) {
1732 CLK_IOPLL,
1733 CLK_DUMMY_PARENT,
1734 CLK_RPLL,
1735 CLK_DPLL_TO_LPD,
1736 CLK_NA_PARENT
1737 }),
1738 .nodes = &generic_mux_div_div_gate_nodes,
1739 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1740 },
1741 [CLK_DLL_REF] = {
1742 .name = "dll_ref",
1743 .control_reg = CRL_APB_DLL_REF_CTRL,
1744 .status_reg = 0,
1745 .parents = &((int32_t []) {
1746 CLK_IOPLL,
1747 CLK_RPLL,
1748 CLK_NA_PARENT
1749 }),
1750 .nodes = &dll_ref_nodes,
1751 .num_nodes = ARRAY_SIZE(dll_ref_nodes),
1752 },
1753 [CLK_ADMA_REF] = {
1754 .name = "adma_ref",
1755 .control_reg = CRL_APB_ADMA_REF_CTRL,
1756 .status_reg = 0,
1757 .parents = &((int32_t []) {
1758 CLK_RPLL,
1759 CLK_DUMMY_PARENT,
1760 CLK_IOPLL,
1761 CLK_DPLL_TO_LPD,
1762 CLK_NA_PARENT
1763 }),
1764 .nodes = &generic_mux_div_gate_nodes,
1765 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1766 },
1767 [CLK_DBG_LPD] = {
1768 .name = "dbg_lpd",
1769 .control_reg = CRL_APB_DBG_LPD_CTRL,
1770 .status_reg = 0,
1771 .parents = &((int32_t []) {
1772 CLK_RPLL,
1773 CLK_DUMMY_PARENT,
1774 CLK_IOPLL,
1775 CLK_DPLL_TO_LPD,
1776 CLK_NA_PARENT
1777 }),
1778 .nodes = &generic_mux_div_gate_nodes,
1779 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1780 },
1781 [CLK_CPU_R5] = {
1782 .name = "cpu_r5",
1783 .control_reg = CRL_APB_CPU_R5_CTRL,
1784 .status_reg = 0,
1785 .parents = &((int32_t []) {
1786 CLK_RPLL,
1787 CLK_DUMMY_PARENT,
1788 CLK_IOPLL,
1789 CLK_DPLL_TO_LPD,
1790 CLK_NA_PARENT
1791 }),
1792 .nodes = &generic_mux_div_unused_gate_nodes,
1793 .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1794 },
1795 [CLK_CSU_PLL] = {
1796 .name = "csu_pll",
1797 .control_reg = CRL_APB_CSU_PLL_CTRL,
1798 .status_reg = 0,
1799 .parents = &((int32_t []) {
1800 CLK_IOPLL,
1801 CLK_DUMMY_PARENT,
1802 CLK_RPLL,
1803 CLK_DPLL_TO_LPD,
1804 CLK_NA_PARENT
1805 }),
1806 .nodes = &generic_mux_div_gate_nodes,
1807 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1808 },
1809 [CLK_PCAP] = {
1810 .name = "pcap",
1811 .control_reg = CRL_APB_PCAP_CTRL,
1812 .status_reg = 0,
1813 .parents = &((int32_t []) {
1814 CLK_IOPLL,
1815 CLK_DUMMY_PARENT,
1816 CLK_RPLL,
1817 CLK_DPLL_TO_LPD,
1818 CLK_NA_PARENT
1819 }),
1820 .nodes = &generic_mux_div_gate_nodes,
1821 .num_nodes = ARRAY_SIZE(generic_mux_div_gate_nodes),
1822 },
1823 [CLK_LPD_LSBUS] = {
1824 .name = "lpd_lsbus",
1825 .control_reg = CRL_APB_LPD_LSBUS_CTRL,
1826 .status_reg = 0,
1827 .parents = &((int32_t []) {
1828 CLK_RPLL,
1829 CLK_DUMMY_PARENT,
1830 CLK_IOPLL,
1831 CLK_DPLL_TO_LPD,
1832 CLK_NA_PARENT
1833 }),
1834 .nodes = &generic_mux_div_unused_gate_nodes,
1835 .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1836 },
1837 [CLK_LPD_SWITCH] = {
1838 .name = "lpd_switch",
1839 .control_reg = CRL_APB_LPD_SWITCH_CTRL,
1840 .status_reg = 0,
1841 .parents = &((int32_t []) {
1842 CLK_RPLL,
1843 CLK_DUMMY_PARENT,
1844 CLK_IOPLL,
1845 CLK_DPLL_TO_LPD,
1846 CLK_NA_PARENT
1847 }),
1848 .nodes = &generic_mux_div_unused_gate_nodes,
1849 .num_nodes = ARRAY_SIZE(generic_mux_div_unused_gate_nodes),
1850 },
1851 [CLK_I2C0_REF] = {
1852 .name = "i2c0_ref",
1853 .control_reg = CRL_APB_I2C0_REF_CTRL,
1854 .status_reg = 0,
1855 .parents = &((int32_t []) {
1856 CLK_IOPLL,
1857 CLK_DUMMY_PARENT,
1858 CLK_RPLL,
1859 CLK_DPLL_TO_LPD,
1860 CLK_NA_PARENT
1861 }),
1862 .nodes = &generic_mux_div_div_gate_nodes,
1863 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1864 },
1865 [CLK_I2C1_REF] = {
1866 .name = "i2c1_ref",
1867 .control_reg = CRL_APB_I2C1_REF_CTRL,
1868 .status_reg = 0,
1869 .parents = &((int32_t []) {
1870 CLK_IOPLL,
1871 CLK_DUMMY_PARENT,
1872 CLK_RPLL,
1873 CLK_DPLL_TO_LPD,
1874 CLK_NA_PARENT
1875 }),
1876 .nodes = &generic_mux_div_div_gate_nodes,
1877 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1878 },
1879 [CLK_TIMESTAMP_REF] = {
1880 .name = "timestamp_ref",
1881 .control_reg = CRL_APB_TIMESTAMP_REF_CTRL,
1882 .status_reg = 0,
1883 .parents = &((int32_t []) {
1884 CLK_IOPLL,
1885 CLK_DUMMY_PARENT,
1886 CLK_RPLL,
1887 CLK_DPLL_TO_LPD,
1888 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1889 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1890 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1891 EXT_CLK_PSS_REF | CLK_EXTERNAL_PARENT,
1892 CLK_NA_PARENT
1893 }),
1894 .nodes = &timestamp_ref_nodes,
1895 .num_nodes = ARRAY_SIZE(timestamp_ref_nodes),
1896 },
1897 [CLK_PL0_REF] = {
1898 .name = "pl0_ref",
1899 .control_reg = CRL_APB_PL0_REF_CTRL,
1900 .status_reg = 0,
1901 .parents = &((int32_t []) {
1902 CLK_IOPLL,
1903 CLK_DUMMY_PARENT,
1904 CLK_RPLL,
1905 CLK_DPLL_TO_LPD,
1906 CLK_NA_PARENT
1907 }),
1908 .nodes = &pl_nodes,
1909 .num_nodes = ARRAY_SIZE(pl_nodes),
1910 },
1911 [CLK_PL1_REF] = {
1912 .name = "pl1_ref",
1913 .control_reg = CRL_APB_PL1_REF_CTRL,
1914 .status_reg = 0,
1915 .parents = &((int32_t []) {
1916 CLK_IOPLL,
1917 CLK_DUMMY_PARENT,
1918 CLK_RPLL,
1919 CLK_DPLL_TO_LPD,
1920 CLK_NA_PARENT
1921 }),
1922 .nodes = &pl_nodes,
1923 .num_nodes = ARRAY_SIZE(pl_nodes),
1924 },
1925 [CLK_PL2_REF] = {
1926 .name = "pl2_ref",
1927 .control_reg = CRL_APB_PL2_REF_CTRL,
1928 .status_reg = 0,
1929 .parents = &((int32_t []) {
1930 CLK_IOPLL,
1931 CLK_DUMMY_PARENT,
1932 CLK_RPLL,
1933 CLK_DPLL_TO_LPD,
1934 CLK_NA_PARENT
1935 }),
1936 .nodes = &pl_nodes,
1937 .num_nodes = ARRAY_SIZE(pl_nodes),
1938 },
1939 [CLK_PL3_REF] = {
1940 .name = "pl3_ref",
1941 .control_reg = CRL_APB_PL3_REF_CTRL,
1942 .status_reg = 0,
1943 .parents = &((int32_t []) {
1944 CLK_IOPLL,
1945 CLK_DUMMY_PARENT,
1946 CLK_RPLL,
1947 CLK_DPLL_TO_LPD,
1948 CLK_NA_PARENT
1949 }),
1950 .nodes = &pl_nodes,
1951 .num_nodes = ARRAY_SIZE(pl_nodes),
1952 },
1953 [CLK_AMS_REF] = {
1954 .name = "ams_ref",
1955 .control_reg = CRL_APB_AMS_REF_CTRL,
1956 .status_reg = 0,
1957 .parents = &((int32_t []) {
1958 CLK_RPLL,
1959 CLK_DUMMY_PARENT,
1960 CLK_IOPLL,
1961 CLK_DPLL_TO_LPD,
1962 CLK_NA_PARENT
1963 }),
1964 .nodes = &generic_mux_div_div_gate_nodes,
1965 .num_nodes = ARRAY_SIZE(generic_mux_div_div_gate_nodes),
1966 },
1967 [CLK_IOPLL_TO_FPD] = {
1968 .name = "iopll_to_fpd",
1969 .control_reg = CRL_APB_IOPLL_TO_FPD_CTRL,
1970 .status_reg = 0,
1971 .parents = &((int32_t []) {CLK_IOPLL, CLK_NA_PARENT}),
1972 .nodes = &generic_domain_crossing_nodes,
1973 .num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes),
1974 },
1975 [CLK_RPLL_TO_FPD] = {
1976 .name = "rpll_to_fpd",
1977 .control_reg = CRL_APB_RPLL_TO_FPD_CTRL,
1978 .status_reg = 0,
1979 .parents = &((int32_t []) {CLK_RPLL, CLK_NA_PARENT}),
1980 .nodes = &rpll_to_fpd_nodes,
1981 .num_nodes = ARRAY_SIZE(rpll_to_fpd_nodes),
1982 },
1983 [CLK_APLL_TO_LPD] = {
1984 .name = "apll_to_lpd",
1985 .control_reg = CRF_APB_APLL_TO_LPD_CTRL,
1986 .status_reg = 0,
1987 .parents = &((int32_t []) {CLK_APLL, CLK_NA_PARENT}),
1988 .nodes = &generic_domain_crossing_nodes,
1989 .num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes),
1990 },
1991 [CLK_DPLL_TO_LPD] = {
1992 .name = "dpll_to_lpd",
1993 .control_reg = CRF_APB_DPLL_TO_LPD_CTRL,
1994 .status_reg = 0,
1995 .parents = &((int32_t []) {CLK_DPLL, CLK_NA_PARENT}),
1996 .nodes = &generic_domain_crossing_nodes,
1997 .num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes),
1998 },
1999 [CLK_VPLL_TO_LPD] = {
2000 .name = "vpll_to_lpd",
2001 .control_reg = CRF_APB_VPLL_TO_LPD_CTRL,
2002 .status_reg = 0,
2003 .parents = &((int32_t []) {CLK_VPLL, CLK_NA_PARENT}),
2004 .nodes = &generic_domain_crossing_nodes,
2005 .num_nodes = ARRAY_SIZE(generic_domain_crossing_nodes),
2006 },
Rajan Vajad98455b2018-01-17 02:39:26 -08002007 [CLK_GEM0_TX] = {
2008 .name = "gem0_tx",
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002009 .control_reg = CRL_APB_GEM0_REF_CTRL,
2010 .status_reg = 0,
Rajan Vajad98455b2018-01-17 02:39:26 -08002011 .parents = &((int32_t []) {
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002012 CLK_GEM0_REF,
Rajan Vajad98455b2018-01-17 02:39:26 -08002013 CLK_NA_PARENT
2014 }),
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002015 .nodes = &gem_tx_nodes,
2016 .num_nodes = ARRAY_SIZE(gem_tx_nodes),
Rajan Vajad98455b2018-01-17 02:39:26 -08002017 },
Rajan Vajad98455b2018-01-17 02:39:26 -08002018 [CLK_GEM1_TX] = {
2019 .name = "gem1_tx",
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002020 .control_reg = CRL_APB_GEM1_REF_CTRL,
2021 .status_reg = 0,
Rajan Vajad98455b2018-01-17 02:39:26 -08002022 .parents = &((int32_t []) {
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002023 CLK_GEM1_REF,
Rajan Vajad98455b2018-01-17 02:39:26 -08002024 CLK_NA_PARENT
2025 }),
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002026 .nodes = &gem_tx_nodes,
2027 .num_nodes = ARRAY_SIZE(gem_tx_nodes),
Rajan Vajad98455b2018-01-17 02:39:26 -08002028 },
Rajan Vajad98455b2018-01-17 02:39:26 -08002029 [CLK_GEM2_TX] = {
2030 .name = "gem2_tx",
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002031 .control_reg = CRL_APB_GEM2_REF_CTRL,
2032 .status_reg = 0,
Rajan Vajad98455b2018-01-17 02:39:26 -08002033 .parents = &((int32_t []) {
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002034 CLK_GEM2_REF,
Rajan Vajad98455b2018-01-17 02:39:26 -08002035 CLK_NA_PARENT
2036 }),
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002037 .nodes = &gem_tx_nodes,
2038 .num_nodes = ARRAY_SIZE(gem_tx_nodes),
Rajan Vajad98455b2018-01-17 02:39:26 -08002039 },
Rajan Vajad98455b2018-01-17 02:39:26 -08002040 [CLK_GEM3_TX] = {
2041 .name = "gem3_tx",
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002042 .control_reg = CRL_APB_GEM3_REF_CTRL,
2043 .status_reg = 0,
2044 .parents = &((int32_t []) {
2045 CLK_GEM3_REF,
2046 CLK_NA_PARENT
2047 }),
2048 .nodes = &gem_tx_nodes,
2049 .num_nodes = ARRAY_SIZE(gem_tx_nodes),
2050 },
2051 [CLK_GEM0_RX] = {
2052 .name = "gem0_rx",
2053 .control_reg = CRL_APB_GEM0_REF_CTRL,
2054 .status_reg = 0,
Rajan Vajad98455b2018-01-17 02:39:26 -08002055 .parents = &((int32_t []) {
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002056 EXT_CLK_GEM0_RX_EMIO | CLK_EXTERNAL_PARENT,
Rajan Vajad98455b2018-01-17 02:39:26 -08002057 CLK_NA_PARENT
2058 }),
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002059 .nodes = &gem_rx_nodes,
2060 .num_nodes = ARRAY_SIZE(gem_rx_nodes),
2061 },
2062 [CLK_GEM1_RX] = {
2063 .name = "gem1_rx",
2064 .control_reg = CRL_APB_GEM1_REF_CTRL,
2065 .status_reg = 0,
2066 .parents = &((int32_t []) {
2067 EXT_CLK_GEM1_RX_EMIO | CLK_EXTERNAL_PARENT,
2068 CLK_NA_PARENT
2069 }),
2070 .nodes = &gem_rx_nodes,
2071 .num_nodes = ARRAY_SIZE(gem_rx_nodes),
2072 },
2073 [CLK_GEM2_RX] = {
2074 .name = "gem2_rx",
2075 .control_reg = CRL_APB_GEM2_REF_CTRL,
2076 .status_reg = 0,
2077 .parents = &((int32_t []) {
2078 EXT_CLK_GEM2_RX_EMIO | CLK_EXTERNAL_PARENT,
2079 CLK_NA_PARENT
2080 }),
2081 .nodes = &gem_rx_nodes,
2082 .num_nodes = ARRAY_SIZE(gem_rx_nodes),
2083 },
2084 [CLK_GEM3_RX] = {
2085 .name = "gem3_rx",
2086 .control_reg = CRL_APB_GEM3_REF_CTRL,
2087 .status_reg = 0,
2088 .parents = &((int32_t []) {
2089 EXT_CLK_GEM3_RX_EMIO | CLK_EXTERNAL_PARENT,
2090 CLK_NA_PARENT
2091 }),
2092 .nodes = &gem_rx_nodes,
2093 .num_nodes = ARRAY_SIZE(gem_rx_nodes),
Rajan Vajad98455b2018-01-17 02:39:26 -08002094 },
2095 [CLK_ACPU_HALF] = {
2096 .name = "acpu_half",
2097 .control_reg = CRF_APB_ACPU_CTRL,
2098 .status_reg = 0,
2099 .parents = &((int32_t []) {
2100 CLK_ACPU | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
2101 CLK_NA_PARENT
2102 }),
2103 .nodes = &acpu_half_nodes,
2104 .num_nodes = ARRAY_SIZE(acpu_half_nodes),
2105 },
Mounika Grace Akulafc4f17b2019-01-09 17:38:12 +05302106 [CLK_FPD_WDT] = {
2107 .name = "fpd_wdt",
Siva Durga Prasad Paladugu90539cd2018-09-04 17:33:19 +05302108 .control_reg = FPD_SLCR_WDT_CLK_SEL,
Rajan Vajad98455b2018-01-17 02:39:26 -08002109 .status_reg = 0,
2110 .parents = &((int32_t []) {
2111 CLK_TOPSW_LSBUS,
2112 EXT_CLK_SWDT0 | CLK_EXTERNAL_PARENT,
Rajan Vajad98455b2018-01-17 02:39:26 -08002113 CLK_NA_PARENT
2114 }),
2115 .nodes = &wdt_nodes,
2116 .num_nodes = ARRAY_SIZE(wdt_nodes),
2117 },
2118 [CLK_GPU_PP0_REF] = {
2119 .name = "gpu_pp0_ref",
2120 .control_reg = CRF_APB_GPU_REF_CTRL,
2121 .status_reg = 0,
2122 .parents = &((int32_t []) {
2123 CLK_GPU_REF | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
2124 CLK_NA_PARENT
2125 }),
2126 .nodes = &gpu_pp0_nodes,
2127 .num_nodes = ARRAY_SIZE(gpu_pp0_nodes),
2128 },
2129 [CLK_GPU_PP1_REF] = {
2130 .name = "gpu_pp1_ref",
2131 .control_reg = CRF_APB_GPU_REF_CTRL,
2132 .status_reg = 0,
2133 .parents = &((int32_t []) {
2134 CLK_GPU_REF | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
2135 CLK_NA_PARENT
2136 }),
2137 .nodes = &gpu_pp1_nodes,
2138 .num_nodes = ARRAY_SIZE(gpu_pp1_nodes),
2139 },
2140 [CLK_GEM_TSU] = {
2141 .name = "gem_tsu",
2142 .control_reg = IOU_SLCR_GEM_CLK_CTRL,
2143 .status_reg = 0,
2144 .parents = &((int32_t []) {
2145 CLK_GEM_TSU_REF,
2146 CLK_GEM_TSU_REF,
2147 EXT_CLK_MIO26 | CLK_EXTERNAL_PARENT,
2148 EXT_CLK_MIO50_OR_MIO51 | CLK_EXTERNAL_PARENT,
2149 CLK_NA_PARENT
2150 }),
2151 .nodes = &gem_tsu_nodes,
2152 .num_nodes = ARRAY_SIZE(gem_tsu_nodes),
2153 },
2154 [CLK_CPU_R5_CORE] = {
2155 .name = "cpu_r5_core",
2156 .control_reg = CRL_APB_CPU_R5_CTRL,
2157 .status_reg = 0,
2158 .parents = &((int32_t []) {
2159 CLK_CPU_R5 | PARENT_CLK_NODE2 << CLK_PARENTS_ID_LEN,
2160 CLK_DUMMY_PARENT,
2161 CLK_NA_PARENT
2162 }),
2163 .nodes = &cpu_r5_core_nodes,
2164 .num_nodes = ARRAY_SIZE(cpu_r5_core_nodes),
2165 },
2166 [CLK_CAN0_MIO] = {
2167 .name = "can0_mio",
2168 .control_reg = IOU_SLCR_CAN_MIO_CTRL,
2169 .status_reg = 0,
2170 .parents = &can_mio_parents,
2171 .nodes = &can0_mio_nodes,
2172 .num_nodes = ARRAY_SIZE(can0_mio_nodes),
2173 },
2174 [CLK_CAN1_MIO] = {
2175 .name = "can1_mio",
2176 .control_reg = IOU_SLCR_CAN_MIO_CTRL,
2177 .status_reg = 0,
2178 .parents = &can_mio_parents,
2179 .nodes = &can1_mio_nodes,
2180 .num_nodes = ARRAY_SIZE(can1_mio_nodes),
2181 },
2182 [CLK_CAN0] = {
2183 .name = "can0",
2184 .control_reg = IOU_SLCR_CAN_MIO_CTRL,
2185 .status_reg = 0,
2186 .parents = &((int32_t []) {
2187 CLK_CAN0_REF,
2188 CLK_CAN0_MIO,
2189 CLK_NA_PARENT
2190 }),
2191 .nodes = &can0_nodes,
2192 .num_nodes = ARRAY_SIZE(can0_nodes),
2193 },
2194 [CLK_CAN1] = {
2195 .name = "can1",
2196 .control_reg = IOU_SLCR_CAN_MIO_CTRL,
2197 .status_reg = 0,
2198 .parents = &((int32_t []) {
2199 CLK_CAN1_REF,
2200 CLK_CAN1_MIO,
2201 CLK_NA_PARENT
2202 }),
2203 .nodes = &can1_nodes,
2204 .num_nodes = ARRAY_SIZE(can1_nodes),
2205 },
Mounika Grace Akula591ad4d2019-01-09 17:38:13 +05302206 [CLK_LPD_WDT] = {
2207 .name = "lpd_wdt",
2208 .control_reg = IOU_SLCR_WDT_CLK_SEL,
2209 .status_reg = 0,
2210 .parents = &((int32_t []) {
2211 CLK_LPD_LSBUS,
2212 EXT_CLK_SWDT1 | CLK_EXTERNAL_PARENT,
2213 CLK_NA_PARENT
2214 }),
2215 .nodes = &wdt_nodes,
2216 .num_nodes = ARRAY_SIZE(wdt_nodes),
2217 },
Rajan Vajad98455b2018-01-17 02:39:26 -08002218};
2219
2220static struct pm_ext_clock ext_clocks[] = {
2221 [EXT_CLK_INDEX(EXT_CLK_PSS_REF)] = {
2222 .name = "pss_ref_clk",
2223 },
2224 [EXT_CLK_INDEX(EXT_CLK_VIDEO)] = {
2225 .name = "video_clk",
2226 },
2227 [EXT_CLK_INDEX(EXT_CLK_PSS_ALT_REF)] = {
2228 .name = "pss_alt_ref_clk",
2229 },
2230 [EXT_CLK_INDEX(EXT_CLK_AUX_REF)] = {
2231 .name = "aux_ref_clk",
2232 },
2233 [EXT_CLK_INDEX(EXT_CLK_GT_CRX_REF)] = {
2234 .name = "video_clk",
2235 },
2236 [EXT_CLK_INDEX(EXT_CLK_SWDT0)] = {
2237 .name = "swdt0_ext_clk",
2238 },
2239 [EXT_CLK_INDEX(EXT_CLK_SWDT1)] = {
2240 .name = "swdt1_ext_clk",
2241 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002242 [EXT_CLK_INDEX(EXT_CLK_GEM0_TX_EMIO)] = {
2243 .name = "gem0_tx_ext",
Rajan Vajad98455b2018-01-17 02:39:26 -08002244 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002245 [EXT_CLK_INDEX(EXT_CLK_GEM1_TX_EMIO)] = {
2246 .name = "gem1_tx_ext",
Rajan Vajad98455b2018-01-17 02:39:26 -08002247 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002248 [EXT_CLK_INDEX(EXT_CLK_GEM2_TX_EMIO)] = {
2249 .name = "gem2_tx_ext",
2250 },
2251 [EXT_CLK_INDEX(EXT_CLK_GEM3_TX_EMIO)] = {
2252 .name = "gem3_tx_ext",
2253 },
2254 [EXT_CLK_INDEX(EXT_CLK_GEM0_RX_EMIO)] = {
2255 .name = "gem0_rx_ext",
2256 },
2257 [EXT_CLK_INDEX(EXT_CLK_GEM1_RX_EMIO)] = {
2258 .name = "gem1_rx_ext",
2259 },
2260 [EXT_CLK_INDEX(EXT_CLK_GEM2_RX_EMIO)] = {
2261 .name = "gem2_rx_ext",
Rajan Vajad98455b2018-01-17 02:39:26 -08002262 },
Mirela Simonovicc55a3902018-09-17 14:25:16 +02002263 [EXT_CLK_INDEX(EXT_CLK_GEM3_RX_EMIO)] = {
2264 .name = "gem3_rx_ext",
Rajan Vajad98455b2018-01-17 02:39:26 -08002265 },
2266 [EXT_CLK_INDEX(EXT_CLK_MIO50_OR_MIO51)] = {
2267 .name = "mio_clk_50_51",
2268 },
2269 EXT_CLK_MIO_DATA(0),
2270 EXT_CLK_MIO_DATA(1),
2271 EXT_CLK_MIO_DATA(2),
2272 EXT_CLK_MIO_DATA(3),
2273 EXT_CLK_MIO_DATA(4),
2274 EXT_CLK_MIO_DATA(5),
2275 EXT_CLK_MIO_DATA(6),
2276 EXT_CLK_MIO_DATA(7),
2277 EXT_CLK_MIO_DATA(8),
2278 EXT_CLK_MIO_DATA(9),
2279 EXT_CLK_MIO_DATA(10),
2280 EXT_CLK_MIO_DATA(11),
2281 EXT_CLK_MIO_DATA(12),
2282 EXT_CLK_MIO_DATA(13),
2283 EXT_CLK_MIO_DATA(14),
2284 EXT_CLK_MIO_DATA(15),
2285 EXT_CLK_MIO_DATA(16),
2286 EXT_CLK_MIO_DATA(17),
2287 EXT_CLK_MIO_DATA(18),
2288 EXT_CLK_MIO_DATA(19),
2289 EXT_CLK_MIO_DATA(20),
2290 EXT_CLK_MIO_DATA(21),
2291 EXT_CLK_MIO_DATA(22),
2292 EXT_CLK_MIO_DATA(23),
2293 EXT_CLK_MIO_DATA(24),
2294 EXT_CLK_MIO_DATA(25),
2295 EXT_CLK_MIO_DATA(26),
2296 EXT_CLK_MIO_DATA(27),
2297 EXT_CLK_MIO_DATA(28),
2298 EXT_CLK_MIO_DATA(29),
2299 EXT_CLK_MIO_DATA(30),
2300 EXT_CLK_MIO_DATA(31),
2301 EXT_CLK_MIO_DATA(32),
2302 EXT_CLK_MIO_DATA(33),
2303 EXT_CLK_MIO_DATA(34),
2304 EXT_CLK_MIO_DATA(35),
2305 EXT_CLK_MIO_DATA(36),
2306 EXT_CLK_MIO_DATA(37),
2307 EXT_CLK_MIO_DATA(38),
2308 EXT_CLK_MIO_DATA(39),
2309 EXT_CLK_MIO_DATA(40),
2310 EXT_CLK_MIO_DATA(41),
2311 EXT_CLK_MIO_DATA(42),
2312 EXT_CLK_MIO_DATA(43),
2313 EXT_CLK_MIO_DATA(44),
2314 EXT_CLK_MIO_DATA(45),
2315 EXT_CLK_MIO_DATA(46),
2316 EXT_CLK_MIO_DATA(47),
2317 EXT_CLK_MIO_DATA(48),
2318 EXT_CLK_MIO_DATA(49),
2319 EXT_CLK_MIO_DATA(50),
2320 EXT_CLK_MIO_DATA(51),
2321 EXT_CLK_MIO_DATA(52),
2322 EXT_CLK_MIO_DATA(53),
2323 EXT_CLK_MIO_DATA(54),
2324 EXT_CLK_MIO_DATA(55),
2325 EXT_CLK_MIO_DATA(56),
2326 EXT_CLK_MIO_DATA(57),
2327 EXT_CLK_MIO_DATA(58),
2328 EXT_CLK_MIO_DATA(59),
2329 EXT_CLK_MIO_DATA(60),
2330 EXT_CLK_MIO_DATA(61),
2331 EXT_CLK_MIO_DATA(62),
2332 EXT_CLK_MIO_DATA(63),
2333 EXT_CLK_MIO_DATA(64),
2334 EXT_CLK_MIO_DATA(65),
2335 EXT_CLK_MIO_DATA(66),
2336 EXT_CLK_MIO_DATA(67),
2337 EXT_CLK_MIO_DATA(68),
2338 EXT_CLK_MIO_DATA(69),
2339 EXT_CLK_MIO_DATA(70),
2340 EXT_CLK_MIO_DATA(71),
2341 EXT_CLK_MIO_DATA(72),
2342 EXT_CLK_MIO_DATA(73),
2343 EXT_CLK_MIO_DATA(74),
2344 EXT_CLK_MIO_DATA(75),
2345 EXT_CLK_MIO_DATA(76),
2346 EXT_CLK_MIO_DATA(77),
2347};
2348
2349/* Array of clock which are invalid for this variant */
Jolly Shahf5a1e9f2019-01-02 13:48:19 -08002350static uint32_t pm_clk_invalid_list[] = {CLK_USB0, CLK_USB1, CLK_CSU_SPB,
2351 CLK_ACPU_FULL,
2352 CLK_ACPU_HALF,
Jolly Shahe508acf2019-01-02 13:53:33 -08002353 CLK_APLL_TO_LPD,
Jolly Shahc5b4abf2019-01-04 12:03:44 -08002354 CLK_DBG_FPD,
2355 CLK_DBG_LPD,
2356 CLK_DBG_TRACE,
2357 CLK_DBG_TSTMP,
2358 CLK_DDR_REF,
2359 CLK_TOPSW_MAIN,
Jolly Shahc5b4abf2019-01-04 12:03:44 -08002360 CLK_GTGREF0_REF,
2361 CLK_LPD_SWITCH,
Jolly Shahc5b4abf2019-01-04 12:03:44 -08002362 CLK_CPU_R5,
2363 CLK_CPU_R5_CORE,
2364 CLK_CSU_SPB,
2365 CLK_CSU_PLL,
2366 CLK_PCAP,
2367 CLK_IOU_SWITCH,
2368 CLK_DLL_REF,
2369 CLK_TIMESTAMP_REF,
Jolly Shahf5a1e9f2019-01-02 13:48:19 -08002370};
Rajan Vajad98455b2018-01-17 02:39:26 -08002371
Rajan Vajad98455b2018-01-17 02:39:26 -08002372/**
2373 * pm_clock_valid - Check if clock is valid or not
2374 * @clock_id Id of the clock to be queried
2375 *
2376 * This function is used to check if given clock is valid
2377 * or not for the chip variant.
2378 *
2379 * List of invalid clocks are maintained in array list for
2380 * different variants.
2381 *
2382 * Return: Returns 1 if clock is valid else 0.
2383 */
Jolly Shah69fb5bf2018-02-07 16:25:41 -08002384static bool pm_clock_valid(unsigned int clock_id)
Rajan Vajad98455b2018-01-17 02:39:26 -08002385{
Jolly Shah69fb5bf2018-02-07 16:25:41 -08002386 unsigned int i;
Rajan Vajad98455b2018-01-17 02:39:26 -08002387
2388 for (i = 0; i < ARRAY_SIZE(pm_clk_invalid_list); i++)
2389 if (pm_clk_invalid_list[i] == clock_id)
2390 return 0;
2391
2392 return 1;
2393}
2394
2395/**
Rajan Vajad98455b2018-01-17 02:39:26 -08002396 * pm_clock_type - Get clock's type
2397 * @clock_id Id of the clock to be queried
2398 *
2399 * This function is used to check type of clock (OUTPUT/EXTERNAL).
2400 *
2401 * Return: Returns type of clock (OUTPUT/EXTERNAL).
2402 */
2403static unsigned int pm_clock_type(unsigned int clock_id)
2404{
2405 return (clock_id < CLK_MAX_OUTPUT_CLK) ?
2406 CLK_TYPE_OUTPUT : CLK_TYPE_EXTERNAL;
2407}
Rajan Vaja35116132018-01-17 02:39:25 -08002408
2409/**
Rajan Vajada959402018-07-20 03:16:27 -07002410 * pm_api_clock_get_num_clocks() - PM call to request number of clocks
2411 * @nclocks Number of clocks
2412 *
2413 * This function is used by master to get number of clocks.
2414 *
2415 * @return Returns success.
2416 */
2417enum pm_ret_status pm_api_clock_get_num_clocks(unsigned int *nclocks)
2418{
2419 *nclocks = CLK_MAX;
2420
2421 return PM_RET_SUCCESS;
2422}
2423
2424/**
Rajan Vaja35116132018-01-17 02:39:25 -08002425 * pm_api_clock_get_name() - PM call to request a clock's name
2426 * @clock_id Clock ID
2427 * @name Name of clock (max 16 bytes)
2428 *
2429 * This function is used by master to get nmae of clock specified
2430 * by given clock ID.
2431 *
2432 * @return Returns success. In case of error, name data is 0.
2433 */
2434enum pm_ret_status pm_api_clock_get_name(unsigned int clock_id, char *name)
2435{
Rajan Vajad98455b2018-01-17 02:39:26 -08002436 if (clock_id == CLK_MAX)
2437 memcpy(name, END_OF_CLK, CLK_NAME_LEN);
2438 else if (!pm_clock_valid(clock_id))
2439 memset(name, 0, CLK_NAME_LEN);
2440 else if (clock_id < CLK_MAX_OUTPUT_CLK)
2441 memcpy(name, clocks[clock_id].name, CLK_NAME_LEN);
2442 else
2443 memcpy(name, ext_clocks[clock_id - CLK_MAX_OUTPUT_CLK].name,
2444 CLK_NAME_LEN);
2445
2446 return PM_RET_SUCCESS;
Rajan Vaja35116132018-01-17 02:39:25 -08002447}
2448
2449/**
2450 * pm_api_clock_get_topology() - PM call to request a clock's topology
2451 * @clock_id Clock ID
2452 * @index Topology index for next toplogy node
2453 * @topology Buffer to store nodes in topology and flags
2454 *
2455 * This function is used by master to get topology information for the
2456 * clock specified by given clock ID. Each response would return 3
2457 * topology nodes. To get next nodes, caller needs to call this API with
2458 * index of next node. Index starts from 0.
2459 *
2460 * @return Returns status, either success or error+reason
2461 */
2462enum pm_ret_status pm_api_clock_get_topology(unsigned int clock_id,
2463 unsigned int index,
2464 uint32_t *topology)
2465{
Rajan Vajad98455b2018-01-17 02:39:26 -08002466 struct pm_clock_node *clock_nodes;
2467 uint8_t num_nodes;
2468 unsigned int i;
Rajan Vajaf065c7f2019-03-15 14:19:25 +05302469 uint16_t typeflags;
Rajan Vajad98455b2018-01-17 02:39:26 -08002470
2471 if (!pm_clock_valid(clock_id))
2472 return PM_RET_ERROR_ARGS;
2473
2474 if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT)
2475 return PM_RET_ERROR_NOTSUPPORTED;
2476
2477
2478 memset(topology, 0, CLK_TOPOLOGY_PAYLOAD_LEN);
2479 clock_nodes = *clocks[clock_id].nodes;
2480 num_nodes = clocks[clock_id].num_nodes;
2481
2482 /* Skip parent till index */
2483 if (index >= num_nodes)
2484 return PM_RET_SUCCESS;
2485
Jolly Shah69fb5bf2018-02-07 16:25:41 -08002486 for (i = 0; i < 3U; i++) {
Rajan Vajad98455b2018-01-17 02:39:26 -08002487 if ((index + i) == num_nodes)
2488 break;
Rajan Vajaf065c7f2019-03-15 14:19:25 +05302489 topology[i] = clock_nodes[index + i].type;
Rajan Vajad98455b2018-01-17 02:39:26 -08002490 topology[i] |= clock_nodes[index + i].clkflags <<
2491 CLK_CLKFLAGS_SHIFT;
Rajan Vajaf065c7f2019-03-15 14:19:25 +05302492 typeflags = clock_nodes[index + i].typeflags;
2493 topology[i] |= (typeflags & CLK_TYPEFLAGS_BITS_MASK) <<
Rajan Vajad98455b2018-01-17 02:39:26 -08002494 CLK_TYPEFLAGS_SHIFT;
Rajan Vajaf065c7f2019-03-15 14:19:25 +05302495 topology[i] |= (typeflags & CLK_TYPEFLAGS2_BITS_MASK) >>
2496 (CLK_TYPEFLAGS_BITS - CLK_TYPEFLAGS2_SHIFT);
Rajan Vajad98455b2018-01-17 02:39:26 -08002497 }
2498
2499 return PM_RET_SUCCESS;
Rajan Vaja35116132018-01-17 02:39:25 -08002500}
2501
2502/**
2503 * pm_api_clock_get_fixedfactor_params() - PM call to request a clock's fixed
2504 * factor parameters for fixed clock
2505 * @clock_id Clock ID
2506 * @mul Multiplication value
2507 * @div Divisor value
2508 *
2509 * This function is used by master to get fixed factor parameers for the
2510 * fixed clock. This API is application only for the fixed clock.
2511 *
2512 * @return Returns status, either success or error+reason
2513 */
2514enum pm_ret_status pm_api_clock_get_fixedfactor_params(unsigned int clock_id,
2515 uint32_t *mul,
2516 uint32_t *div)
2517{
Rajan Vajad98455b2018-01-17 02:39:26 -08002518 struct pm_clock_node *clock_nodes;
2519 uint8_t num_nodes;
2520 unsigned int type, i;
2521
2522 if (!pm_clock_valid(clock_id))
2523 return PM_RET_ERROR_ARGS;
2524
2525 if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT)
2526 return PM_RET_ERROR_NOTSUPPORTED;
2527
2528 clock_nodes = *clocks[clock_id].nodes;
2529 num_nodes = clocks[clock_id].num_nodes;
2530
2531 for (i = 0; i < num_nodes; i++) {
2532 type = clock_nodes[i].type;
2533 if (type == TYPE_FIXEDFACTOR) {
2534 *mul = clock_nodes[i].mult;
2535 *div = clock_nodes[i].div;
2536 break;
2537 }
2538 }
2539
2540 /* Clock is not fixed clock */
2541 if (i == num_nodes)
2542 return PM_RET_ERROR_ARGS;
2543
2544 return PM_RET_SUCCESS;
Rajan Vaja35116132018-01-17 02:39:25 -08002545}
2546
2547/**
2548 * pm_api_clock_get_parents() - PM call to request a clock's first 3 parents
2549 * @clock_id Clock ID
2550 * @index Index of next parent
2551 * @parents Parents of the given clock
2552 *
2553 * This function is used by master to get clock's parents information.
2554 * This API will return 3 parents with a single response. To get other
2555 * parents, master should call same API in loop with new parent index
2556 * till error is returned.
2557 *
2558 * E.g First call should have index 0 which will return parents 0, 1 and
2559 * 2. Next call, index should be 3 which will return parent 3,4 and 5 and
2560 * so on.
2561 *
2562 * @return Returns status, either success or error+reason
2563 */
2564enum pm_ret_status pm_api_clock_get_parents(unsigned int clock_id,
2565 unsigned int index,
2566 uint32_t *parents)
2567{
Jolly Shah69fb5bf2018-02-07 16:25:41 -08002568 unsigned int i;
Rajan Vajad98455b2018-01-17 02:39:26 -08002569 int32_t *clk_parents;
2570
2571 if (!pm_clock_valid(clock_id))
2572 return PM_RET_ERROR_ARGS;
2573
2574 if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT)
2575 return PM_RET_ERROR_NOTSUPPORTED;
2576
2577 clk_parents = *clocks[clock_id].parents;
Jolly Shah69fb5bf2018-02-07 16:25:41 -08002578 if (clk_parents == NULL)
Rajan Vajad98455b2018-01-17 02:39:26 -08002579 return PM_RET_ERROR_ARGS;
2580
2581 memset(parents, 0, CLK_PARENTS_PAYLOAD_LEN);
2582
2583 /* Skip parent till index */
2584 for (i = 0; i < index; i++)
2585 if (clk_parents[i] == CLK_NA_PARENT)
2586 return PM_RET_SUCCESS;
2587
2588 for (i = 0; i < 3; i++) {
2589 parents[i] = clk_parents[index + i];
2590 if (clk_parents[index + i] == CLK_NA_PARENT)
2591 break;
2592 }
2593
2594 return PM_RET_SUCCESS;
Rajan Vaja35116132018-01-17 02:39:25 -08002595}
2596
2597/**
2598 * pm_api_clock_get_attributes() - PM call to request a clock's attributes
2599 * @clock_id Clock ID
2600 * @attr Clock attributes
2601 *
2602 * This function is used by master to get clock's attributes
2603 * (e.g. valid, clock type, etc).
2604 *
2605 * @return Returns status, either success or error+reason
2606 */
2607enum pm_ret_status pm_api_clock_get_attributes(unsigned int clock_id,
2608 uint32_t *attr)
2609{
Rajan Vajad98455b2018-01-17 02:39:26 -08002610 if (clock_id >= CLK_MAX)
2611 return PM_RET_ERROR_ARGS;
2612
2613 /* Clock valid bit */
2614 *attr = pm_clock_valid(clock_id);
2615
Rajan Vajad98455b2018-01-17 02:39:26 -08002616 /* Clock type (Output/External) */
2617 *attr |= (pm_clock_type(clock_id) << CLK_TYPE_SHIFT);
2618
2619 return PM_RET_SUCCESS;
2620}
2621
2622/**
Jolly Shahb4c99462019-01-02 12:40:17 -08002623 * struct pm_pll - PLL related data required to map IOCTL-based PLL control
2624 * implemented by linux to system-level EEMI APIs
2625 * @nid: PLL node ID
2626 * @cid: PLL clock ID
Jolly Shah407fc0a2019-01-04 11:57:40 -08002627 * @pre_src: Pre-source PLL clock ID
2628 * @post_src: Post-source PLL clock ID
2629 * @div2: DIV2 PLL clock ID
2630 * @bypass: PLL output clock ID that maps to bypass select output
Jolly Shahcb5bc752019-01-02 12:46:46 -08002631 * @mode: PLL mode currently set via IOCTL (PLL_FRAC_MODE/PLL_INT_MODE)
Rajan Vajad98455b2018-01-17 02:39:26 -08002632 */
Jolly Shahb4c99462019-01-02 12:40:17 -08002633struct pm_pll {
2634 const enum pm_node_id nid;
2635 const enum clock_id cid;
Jolly Shah407fc0a2019-01-04 11:57:40 -08002636 const enum clock_id pre_src;
2637 const enum clock_id post_src;
2638 const enum clock_id div2;
2639 const enum clock_id bypass;
Jolly Shahcb5bc752019-01-02 12:46:46 -08002640 uint8_t mode;
Jolly Shahb4c99462019-01-02 12:40:17 -08002641};
Rajan Vajad98455b2018-01-17 02:39:26 -08002642
Jolly Shahb4c99462019-01-02 12:40:17 -08002643static struct pm_pll pm_plls[] = {
2644 {
2645 .nid = NODE_IOPLL,
2646 .cid = CLK_IOPLL_INT,
Jolly Shah407fc0a2019-01-04 11:57:40 -08002647 .pre_src = CLK_IOPLL_PRE_SRC,
2648 .post_src = CLK_IOPLL_POST_SRC,
2649 .div2 = CLK_IOPLL_INT_MUX,
2650 .bypass = CLK_IOPLL,
Jolly Shahb4c99462019-01-02 12:40:17 -08002651 }, {
2652 .nid = NODE_RPLL,
2653 .cid = CLK_RPLL_INT,
Jolly Shah407fc0a2019-01-04 11:57:40 -08002654 .pre_src = CLK_RPLL_PRE_SRC,
2655 .post_src = CLK_RPLL_POST_SRC,
2656 .div2 = CLK_RPLL_INT_MUX,
2657 .bypass = CLK_RPLL,
Jolly Shahb4c99462019-01-02 12:40:17 -08002658 }, {
2659 .nid = NODE_APLL,
2660 .cid = CLK_APLL_INT,
Jolly Shah407fc0a2019-01-04 11:57:40 -08002661 .pre_src = CLK_APLL_PRE_SRC,
2662 .post_src = CLK_APLL_POST_SRC,
2663 .div2 = CLK_APLL_INT_MUX,
2664 .bypass = CLK_APLL,
Jolly Shahb4c99462019-01-02 12:40:17 -08002665 }, {
2666 .nid = NODE_VPLL,
2667 .cid = CLK_VPLL_INT,
Jolly Shah407fc0a2019-01-04 11:57:40 -08002668 .pre_src = CLK_VPLL_PRE_SRC,
2669 .post_src = CLK_VPLL_POST_SRC,
2670 .div2 = CLK_VPLL_INT_MUX,
2671 .bypass = CLK_VPLL,
Jolly Shahb4c99462019-01-02 12:40:17 -08002672 }, {
2673 .nid = NODE_DPLL,
2674 .cid = CLK_DPLL_INT,
Jolly Shah407fc0a2019-01-04 11:57:40 -08002675 .pre_src = CLK_DPLL_PRE_SRC,
2676 .post_src = CLK_DPLL_POST_SRC,
2677 .div2 = CLK_DPLL_INT_MUX,
2678 .bypass = CLK_DPLL,
Jolly Shahb4c99462019-01-02 12:40:17 -08002679 },
2680};
Rajan Vajad98455b2018-01-17 02:39:26 -08002681
2682/**
Jolly Shahb4c99462019-01-02 12:40:17 -08002683 * pm_clock_get_pll() - Get PLL structure by PLL clock ID
2684 * @clock_id Clock ID of the target PLL
Rajan Vajad98455b2018-01-17 02:39:26 -08002685 *
Jolly Shahb4c99462019-01-02 12:40:17 -08002686 * @return Pointer to PLL structure if found, NULL otherwise
Rajan Vajad98455b2018-01-17 02:39:26 -08002687 */
Jolly Shaha5209802019-01-04 11:45:59 -08002688struct pm_pll *pm_clock_get_pll(enum clock_id clock_id)
Rajan Vajad98455b2018-01-17 02:39:26 -08002689{
Jolly Shahb4c99462019-01-02 12:40:17 -08002690 uint32_t i;
Rajan Vajad98455b2018-01-17 02:39:26 -08002691
Jolly Shahb4c99462019-01-02 12:40:17 -08002692 for (i = 0; i < ARRAY_SIZE(pm_plls); i++) {
2693 if (pm_plls[i].cid == clock_id)
2694 return &pm_plls[i];
Rajan Vajad98455b2018-01-17 02:39:26 -08002695 }
Rajan Vajad98455b2018-01-17 02:39:26 -08002696
Jolly Shahb4c99462019-01-02 12:40:17 -08002697 return NULL;
Rajan Vaja35116132018-01-17 02:39:25 -08002698}
2699
2700/**
Jolly Shahb4c99462019-01-02 12:40:17 -08002701 * pm_clock_get_pll_node_id() - Get PLL node ID by PLL clock ID
2702 * @clock_id Clock ID of the target PLL
2703 * @node_id Location to store node ID of the target PLL
Rajan Vaja35116132018-01-17 02:39:25 -08002704 *
Jolly Shahb4c99462019-01-02 12:40:17 -08002705 * @return PM_RET_SUCCESS if node ID is found, PM_RET_ERROR_ARGS otherwise
Rajan Vaja35116132018-01-17 02:39:25 -08002706 */
Jolly Shahb4c99462019-01-02 12:40:17 -08002707enum pm_ret_status pm_clock_get_pll_node_id(enum clock_id clock_id,
2708 enum pm_node_id *node_id)
Rajan Vaja35116132018-01-17 02:39:25 -08002709{
Jolly Shahb4c99462019-01-02 12:40:17 -08002710 struct pm_pll *pll = pm_clock_get_pll(clock_id);
Rajan Vajad98455b2018-01-17 02:39:26 -08002711
Jolly Shahb4c99462019-01-02 12:40:17 -08002712 if (pll) {
2713 *node_id = pll->nid;
2714 return PM_RET_SUCCESS;
2715 }
Rajan Vajad98455b2018-01-17 02:39:26 -08002716
Jolly Shahb4c99462019-01-02 12:40:17 -08002717 return PM_RET_ERROR_ARGS;
Rajan Vajad98455b2018-01-17 02:39:26 -08002718}
2719
2720/**
Jolly Shah407fc0a2019-01-04 11:57:40 -08002721 * pm_clock_get_pll_by_related_clk() - Get PLL structure by PLL-related clock ID
2722 * @clock_id Clock ID
Rajan Vajad98455b2018-01-17 02:39:26 -08002723 *
Jolly Shah407fc0a2019-01-04 11:57:40 -08002724 * @return Pointer to PLL structure if found, NULL otherwise
Rajan Vajad98455b2018-01-17 02:39:26 -08002725 */
Jolly Shah407fc0a2019-01-04 11:57:40 -08002726struct pm_pll *pm_clock_get_pll_by_related_clk(enum clock_id clock_id)
Rajan Vajad98455b2018-01-17 02:39:26 -08002727{
Jolly Shah407fc0a2019-01-04 11:57:40 -08002728 uint32_t i;
Rajan Vajad98455b2018-01-17 02:39:26 -08002729
Jolly Shah407fc0a2019-01-04 11:57:40 -08002730 for (i = 0; i < ARRAY_SIZE(pm_plls); i++) {
2731 if (pm_plls[i].pre_src == clock_id ||
2732 pm_plls[i].post_src == clock_id ||
2733 pm_plls[i].div2 == clock_id ||
2734 pm_plls[i].bypass == clock_id) {
2735 return &pm_plls[i];
Rajan Vajad98455b2018-01-17 02:39:26 -08002736 }
Rajan Vajad98455b2018-01-17 02:39:26 -08002737 }
Rajan Vajad98455b2018-01-17 02:39:26 -08002738
Jolly Shah407fc0a2019-01-04 11:57:40 -08002739 return NULL;
Rajan Vaja35116132018-01-17 02:39:25 -08002740}
2741
2742/**
Jolly Shaha5209802019-01-04 11:45:59 -08002743 * pm_clock_pll_enable() - "Enable" the PLL clock (lock the PLL)
2744 * @pll: PLL to be locked
Rajan Vaja35116132018-01-17 02:39:25 -08002745 *
Jolly Shaha5209802019-01-04 11:45:59 -08002746 * This function is used to map IOCTL/linux-based PLL handling to system-level
2747 * EEMI APIs
Rajan Vaja35116132018-01-17 02:39:25 -08002748 *
Jolly Shaha5209802019-01-04 11:45:59 -08002749 * Return: Error if the argument is not valid or status as returned by PMU
Rajan Vaja35116132018-01-17 02:39:25 -08002750 */
Jolly Shaha5209802019-01-04 11:45:59 -08002751enum pm_ret_status pm_clock_pll_enable(struct pm_pll *pll)
Rajan Vaja35116132018-01-17 02:39:25 -08002752{
Jolly Shaha5209802019-01-04 11:45:59 -08002753 if (!pll)
Rajan Vajad98455b2018-01-17 02:39:26 -08002754 return PM_RET_ERROR_ARGS;
2755
Jolly Shaha5209802019-01-04 11:45:59 -08002756 /* Set the PLL mode according to the buffered mode value */
2757 if (pll->mode == PLL_FRAC_MODE)
2758 return pm_pll_set_mode(pll->nid, PM_PLL_MODE_FRACTIONAL);
Siva Durga Prasad Paladuguafaeb0d2018-09-04 17:49:32 +05302759
Jolly Shaha5209802019-01-04 11:45:59 -08002760 return pm_pll_set_mode(pll->nid, PM_PLL_MODE_INTEGER);
Rajan Vaja35116132018-01-17 02:39:25 -08002761}
2762
2763/**
Jolly Shaha9057a02019-01-02 12:54:40 -08002764 * pm_clock_pll_disable - "Disable" the PLL clock (bypass/reset the PLL)
2765 * @pll PLL to be bypassed/reset
Rajan Vaja35116132018-01-17 02:39:25 -08002766 *
Jolly Shaha9057a02019-01-02 12:54:40 -08002767 * This function is used to map IOCTL/linux-based PLL handling to system-level
2768 * EEMI APIs
Rajan Vaja35116132018-01-17 02:39:25 -08002769 *
Jolly Shaha9057a02019-01-02 12:54:40 -08002770 * Return: Error if the argument is not valid or status as returned by PMU
Rajan Vaja35116132018-01-17 02:39:25 -08002771 */
Jolly Shaha9057a02019-01-02 12:54:40 -08002772enum pm_ret_status pm_clock_pll_disable(struct pm_pll *pll)
Rajan Vaja35116132018-01-17 02:39:25 -08002773{
Jolly Shaha9057a02019-01-02 12:54:40 -08002774 if (!pll)
Rajan Vajad98455b2018-01-17 02:39:26 -08002775 return PM_RET_ERROR_ARGS;
2776
Jolly Shaha9057a02019-01-02 12:54:40 -08002777 return pm_pll_set_mode(pll->nid, PM_PLL_MODE_RESET);
Rajan Vajad98455b2018-01-17 02:39:26 -08002778}
2779
Rajan Vaja35116132018-01-17 02:39:25 -08002780/**
Jolly Shah99e8ac92019-01-02 12:55:41 -08002781 * pm_clock_pll_get_state - Get state of the PLL
2782 * @pll Pointer to the target PLL structure
2783 * @state Location to store the state: 1/0 ("Enabled"/"Disabled")
Rajan Vaja35116132018-01-17 02:39:25 -08002784 *
Jolly Shah99e8ac92019-01-02 12:55:41 -08002785 * "Enable" actually means that the PLL is locked and its bypass is deasserted,
2786 * "Disable" means that it is bypassed.
Rajan Vaja35116132018-01-17 02:39:25 -08002787 *
Jolly Shah99e8ac92019-01-02 12:55:41 -08002788 * Return: PM_RET_ERROR_ARGS error if the argument is not valid, success if
2789 * returned state value is valid or an error if returned by PMU
Rajan Vaja35116132018-01-17 02:39:25 -08002790 */
Jolly Shah99e8ac92019-01-02 12:55:41 -08002791enum pm_ret_status pm_clock_pll_get_state(struct pm_pll *pll,
2792 unsigned int *state)
Rajan Vaja35116132018-01-17 02:39:25 -08002793{
Jolly Shah99e8ac92019-01-02 12:55:41 -08002794 enum pm_ret_status status;
2795 enum pm_pll_mode mode;
Rajan Vajad98455b2018-01-17 02:39:26 -08002796
Jolly Shah99e8ac92019-01-02 12:55:41 -08002797 if (!pll || !state)
Rajan Vajad98455b2018-01-17 02:39:26 -08002798 return PM_RET_ERROR_ARGS;
2799
Jolly Shah99e8ac92019-01-02 12:55:41 -08002800 status = pm_pll_get_mode(pll->nid, &mode);
2801 if (status != PM_RET_SUCCESS)
2802 return status;
Rajan Vajad98455b2018-01-17 02:39:26 -08002803
Jolly Shah99e8ac92019-01-02 12:55:41 -08002804 if (mode == PM_PLL_MODE_RESET)
2805 *state = 0;
Rajan Vajad98455b2018-01-17 02:39:26 -08002806 else
Jolly Shah99e8ac92019-01-02 12:55:41 -08002807 *state = 1;
Rajan Vaja35116132018-01-17 02:39:25 -08002808
Jolly Shah99e8ac92019-01-02 12:55:41 -08002809 return PM_RET_SUCCESS;
Rajan Vaja35116132018-01-17 02:39:25 -08002810}
2811
2812/**
Jolly Shah407fc0a2019-01-04 11:57:40 -08002813 * pm_clock_pll_set_parent - Set the clock parent for PLL-related clock id
2814 * @pll Target PLL structure
2815 * @clock_id Id of the clock
2816 * @parent_index parent index (=mux select value)
Rajan Vaja35116132018-01-17 02:39:25 -08002817 *
Jolly Shah407fc0a2019-01-04 11:57:40 -08002818 * The whole clock-tree implementation relies on the fact that parent indexes
2819 * match to the multiplexer select values. This function has to rely on that
2820 * assumption as well => parent_index is actually the mux select value.
Rajan Vaja35116132018-01-17 02:39:25 -08002821 *
2822 * Return: Returns status, either success or error+reason.
2823 */
Jolly Shah407fc0a2019-01-04 11:57:40 -08002824enum pm_ret_status pm_clock_pll_set_parent(struct pm_pll *pll,
2825 enum clock_id clock_id,
2826 unsigned int parent_index)
Rajan Vaja35116132018-01-17 02:39:25 -08002827{
Jolly Shah407fc0a2019-01-04 11:57:40 -08002828 if (!pll)
Rajan Vajad98455b2018-01-17 02:39:26 -08002829 return PM_RET_ERROR_ARGS;
Jolly Shah407fc0a2019-01-04 11:57:40 -08002830 if (pll->pre_src == clock_id)
2831 return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_PRE_SRC,
2832 parent_index);
2833 if (pll->post_src == clock_id)
2834 return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_POST_SRC,
2835 parent_index);
2836 if (pll->div2 == clock_id)
2837 return pm_pll_set_parameter(pll->nid, PM_PLL_PARAM_DIV2,
2838 parent_index);
Rajan Vajad98455b2018-01-17 02:39:26 -08002839
Jolly Shah407fc0a2019-01-04 11:57:40 -08002840 return PM_RET_ERROR_ARGS;
Rajan Vaja35116132018-01-17 02:39:25 -08002841}
2842
2843/**
Jolly Shah7c8e79c2019-01-02 13:44:25 -08002844 * pm_clock_pll_get_parent - Get mux select value of PLL-related clock parent
2845 * @pll Target PLL structure
2846 * @clock_id Id of the clock
2847 * @parent_index parent index (=mux select value)
Rajan Vaja35116132018-01-17 02:39:25 -08002848 *
Jolly Shah7c8e79c2019-01-02 13:44:25 -08002849 * This function is used by master to get parent index for PLL-related clock.
Rajan Vaja35116132018-01-17 02:39:25 -08002850 *
2851 * Return: Returns status, either success or error+reason.
2852 */
Jolly Shah7c8e79c2019-01-02 13:44:25 -08002853enum pm_ret_status pm_clock_pll_get_parent(struct pm_pll *pll,
2854 enum clock_id clock_id,
2855 unsigned int *parent_index)
Rajan Vaja35116132018-01-17 02:39:25 -08002856{
Jolly Shah7c8e79c2019-01-02 13:44:25 -08002857 if (!pll)
Rajan Vajad98455b2018-01-17 02:39:26 -08002858 return PM_RET_ERROR_ARGS;
Jolly Shah7c8e79c2019-01-02 13:44:25 -08002859 if (pll->pre_src == clock_id)
2860 return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_PRE_SRC,
2861 parent_index);
2862 if (pll->post_src == clock_id)
2863 return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_POST_SRC,
2864 parent_index);
2865 if (pll->div2 == clock_id)
2866 return pm_pll_get_parameter(pll->nid, PM_PLL_PARAM_DIV2,
2867 parent_index);
2868 if (pll->bypass == clock_id) {
2869 *parent_index = 0;
2870 return PM_RET_SUCCESS;
Rajan Vajad98455b2018-01-17 02:39:26 -08002871 }
Rajan Vajad98455b2018-01-17 02:39:26 -08002872
Jolly Shah7c8e79c2019-01-02 13:44:25 -08002873 return PM_RET_ERROR_ARGS;
Rajan Vaja35116132018-01-17 02:39:25 -08002874}
2875
2876/**
Jolly Shahcb5bc752019-01-02 12:46:46 -08002877 * pm_clock_set_pll_mode() - Set PLL mode
2878 * @clock_id PLL clock id
2879 * @mode Mode fractional/integer
Rajan Vaja35116132018-01-17 02:39:25 -08002880 *
Jolly Shahcb5bc752019-01-02 12:46:46 -08002881 * This function buffers/saves the PLL mode that is set.
Rajan Vaja35116132018-01-17 02:39:25 -08002882 *
Jolly Shahcb5bc752019-01-02 12:46:46 -08002883 * @return Success if mode is buffered or error if an argument is invalid
Rajan Vaja35116132018-01-17 02:39:25 -08002884 */
Jolly Shahcb5bc752019-01-02 12:46:46 -08002885enum pm_ret_status pm_clock_set_pll_mode(enum clock_id clock_id,
2886 unsigned int mode)
Rajan Vaja35116132018-01-17 02:39:25 -08002887{
Jolly Shahcb5bc752019-01-02 12:46:46 -08002888 struct pm_pll *pll = pm_clock_get_pll(clock_id);
Rajan Vajad98455b2018-01-17 02:39:26 -08002889
Jolly Shahcb5bc752019-01-02 12:46:46 -08002890 if (!pll || (mode != PLL_FRAC_MODE && mode != PLL_INT_MODE))
Rajan Vajad98455b2018-01-17 02:39:26 -08002891 return PM_RET_ERROR_ARGS;
Jolly Shahcb5bc752019-01-02 12:46:46 -08002892 pll->mode = mode;
Rajan Vajad98455b2018-01-17 02:39:26 -08002893
Jolly Shahcb5bc752019-01-02 12:46:46 -08002894 return PM_RET_SUCCESS;
Rajan Vaja35116132018-01-17 02:39:25 -08002895}
2896
2897/**
Jolly Shah77eb52f2019-01-02 12:49:21 -08002898 * pm_clock_get_pll_mode() - Get PLL mode
2899 * @clock_id PLL clock id
2900 * @mode Location to store the mode (fractional/integer)
Rajan Vaja35116132018-01-17 02:39:25 -08002901 *
Jolly Shah77eb52f2019-01-02 12:49:21 -08002902 * This function returns buffered PLL mode.
Rajan Vaja35116132018-01-17 02:39:25 -08002903 *
Jolly Shah77eb52f2019-01-02 12:49:21 -08002904 * @return Success if mode is stored or error if an argument is invalid
Rajan Vaja35116132018-01-17 02:39:25 -08002905 */
Jolly Shah77eb52f2019-01-02 12:49:21 -08002906enum pm_ret_status pm_clock_get_pll_mode(enum clock_id clock_id,
2907 unsigned int *mode)
Rajan Vaja35116132018-01-17 02:39:25 -08002908{
Jolly Shah77eb52f2019-01-02 12:49:21 -08002909 struct pm_pll *pll = pm_clock_get_pll(clock_id);
Rajan Vajad98455b2018-01-17 02:39:26 -08002910
Jolly Shah77eb52f2019-01-02 12:49:21 -08002911 if (!pll || !mode)
Rajan Vajad98455b2018-01-17 02:39:26 -08002912 return PM_RET_ERROR_ARGS;
Jolly Shah77eb52f2019-01-02 12:49:21 -08002913 *mode = pll->mode;
Rajan Vajad98455b2018-01-17 02:39:26 -08002914
Jolly Shah77eb52f2019-01-02 12:49:21 -08002915 return PM_RET_SUCCESS;
Rajan Vaja35116132018-01-17 02:39:25 -08002916}
2917
2918/**
Jolly Shaha5209802019-01-04 11:45:59 -08002919 * pm_clock_id_is_valid() - Check if given clock ID is valid
2920 * @clock_id ID of the clock to be checked
Rajan Vaja35116132018-01-17 02:39:25 -08002921 *
Jolly Shaha5209802019-01-04 11:45:59 -08002922 * @return Returns success if clock_id is valid, otherwise an error
Rajan Vaja35116132018-01-17 02:39:25 -08002923 */
Jolly Shaha5209802019-01-04 11:45:59 -08002924enum pm_ret_status pm_clock_id_is_valid(unsigned int clock_id)
Rajan Vaja35116132018-01-17 02:39:25 -08002925{
Jolly Shaha5209802019-01-04 11:45:59 -08002926 if (!pm_clock_valid(clock_id))
Rajan Vajad98455b2018-01-17 02:39:26 -08002927 return PM_RET_ERROR_ARGS;
2928
Jolly Shaha5209802019-01-04 11:45:59 -08002929 if (pm_clock_type(clock_id) != CLK_TYPE_OUTPUT)
Rajan Vajad98455b2018-01-17 02:39:26 -08002930 return PM_RET_ERROR_NOTSUPPORTED;
2931
Jolly Shaha5209802019-01-04 11:45:59 -08002932 return PM_RET_SUCCESS;
Rajan Vaja35116132018-01-17 02:39:25 -08002933}
2934
2935/**
Jolly Shah4dd11762019-01-04 11:53:37 -08002936 * pm_clock_has_div() - Check if the clock has divider with given ID
2937 * @clock_id Clock ID
2938 * @div_id Divider ID
Rajan Vaja35116132018-01-17 02:39:25 -08002939 *
Jolly Shah4dd11762019-01-04 11:53:37 -08002940 * @return True(1)=clock has the divider, false(0)=otherwise
Rajan Vaja35116132018-01-17 02:39:25 -08002941 */
Jolly Shah4dd11762019-01-04 11:53:37 -08002942uint8_t pm_clock_has_div(unsigned int clock_id, enum pm_clock_div_id div_id)
Rajan Vaja35116132018-01-17 02:39:25 -08002943{
Jolly Shah4dd11762019-01-04 11:53:37 -08002944 uint32_t i;
2945 struct pm_clock_node *nodes;
Rajan Vajad98455b2018-01-17 02:39:26 -08002946
Jolly Shah4dd11762019-01-04 11:53:37 -08002947 if (clock_id >= CLK_MAX_OUTPUT_CLK)
2948 return 0;
Rajan Vajad98455b2018-01-17 02:39:26 -08002949
Jolly Shah4dd11762019-01-04 11:53:37 -08002950 nodes = *clocks[clock_id].nodes;
2951 for (i = 0; i < clocks[clock_id].num_nodes; i++) {
2952 if (nodes[i].type == TYPE_DIV1) {
2953 if (div_id == PM_CLOCK_DIV0_ID)
2954 return 1;
2955 } else if (nodes[i].type == TYPE_DIV2) {
2956 if (div_id == PM_CLOCK_DIV1_ID)
2957 return 1;
2958 }
2959 }
Rajan Vajad98455b2018-01-17 02:39:26 -08002960
Jolly Shah4dd11762019-01-04 11:53:37 -08002961 return 0;
Rajan Vaja35116132018-01-17 02:39:25 -08002962}