blob: bad02aebf959b6caed9b1941d8b9decf4152f7dd [file] [log] [blame]
Stephen Boyd6d00b562014-01-15 10:47:29 -08001/*
2 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <linux/kernel.h>
15#include <linux/bitops.h>
16#include <linux/err.h>
17#include <linux/delay.h>
18#include <linux/platform_device.h>
19#include <linux/module.h>
20#include <linux/of.h>
21#include <linux/of_device.h>
Stephen Boyd88036092015-06-19 15:00:46 -070022#include <linux/clk.h>
Stephen Boyd6d00b562014-01-15 10:47:29 -080023#include <linux/clk-provider.h>
24#include <linux/regmap.h>
25#include <linux/reset-controller.h>
26
27#include <dt-bindings/clock/qcom,mmcc-msm8960.h>
28#include <dt-bindings/reset/qcom,mmcc-msm8960.h>
29
Stephen Boyd49fc8252014-03-21 17:59:37 -070030#include "common.h"
Stephen Boyd6d00b562014-01-15 10:47:29 -080031#include "clk-regmap.h"
32#include "clk-pll.h"
33#include "clk-rcg.h"
34#include "clk-branch.h"
35#include "reset.h"
36
Georgi Djakov293d2e972015-03-20 18:30:26 +020037enum {
38 P_PXO,
39 P_PLL8,
40 P_PLL2,
41 P_PLL3,
42 P_PLL15,
43 P_HDMI_PLL,
44};
Stephen Boyd6d00b562014-01-15 10:47:29 -080045
Stephen Boydff207832014-07-08 18:36:06 -070046#define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
Stephen Boyd6d00b562014-01-15 10:47:29 -080047
Georgi Djakov293d2e972015-03-20 18:30:26 +020048static const struct parent_map mmcc_pxo_pll8_pll2_map[] = {
49 { P_PXO, 0 },
50 { P_PLL8, 2 },
51 { P_PLL2, 1 }
Stephen Boyd6d00b562014-01-15 10:47:29 -080052};
53
Georgi Djakovadb11a42015-07-06 16:51:30 +030054static const char * const mmcc_pxo_pll8_pll2[] = {
Stephen Boyd6d00b562014-01-15 10:47:29 -080055 "pxo",
56 "pll8_vote",
57 "pll2",
58};
59
Georgi Djakov293d2e972015-03-20 18:30:26 +020060static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = {
61 { P_PXO, 0 },
62 { P_PLL8, 2 },
63 { P_PLL2, 1 },
64 { P_PLL3, 3 }
Stephen Boyd6d00b562014-01-15 10:47:29 -080065};
66
Georgi Djakovadb11a42015-07-06 16:51:30 +030067static const char * const mmcc_pxo_pll8_pll2_pll15[] = {
Stephen Boyde216ce62014-07-15 14:52:22 -070068 "pxo",
69 "pll8_vote",
70 "pll2",
71 "pll15",
72};
73
Georgi Djakov293d2e972015-03-20 18:30:26 +020074static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = {
75 { P_PXO, 0 },
76 { P_PLL8, 2 },
77 { P_PLL2, 1 },
78 { P_PLL15, 3 }
Stephen Boyde216ce62014-07-15 14:52:22 -070079};
80
Georgi Djakovadb11a42015-07-06 16:51:30 +030081static const char * const mmcc_pxo_pll8_pll2_pll3[] = {
Stephen Boyd6d00b562014-01-15 10:47:29 -080082 "pxo",
Stephen Boyd6d00b562014-01-15 10:47:29 -080083 "pll8_vote",
Stephen Boydff207832014-07-08 18:36:06 -070084 "pll2",
Stephen Boyd6d00b562014-01-15 10:47:29 -080085 "pll3",
86};
87
88static struct clk_pll pll2 = {
89 .l_reg = 0x320,
90 .m_reg = 0x324,
91 .n_reg = 0x328,
92 .config_reg = 0x32c,
93 .mode_reg = 0x31c,
94 .status_reg = 0x334,
95 .status_bit = 16,
96 .clkr.hw.init = &(struct clk_init_data){
97 .name = "pll2",
98 .parent_names = (const char *[]){ "pxo" },
99 .num_parents = 1,
100 .ops = &clk_pll_ops,
101 },
102};
103
Stephen Boyde216ce62014-07-15 14:52:22 -0700104static struct clk_pll pll15 = {
105 .l_reg = 0x33c,
106 .m_reg = 0x340,
107 .n_reg = 0x344,
108 .config_reg = 0x348,
109 .mode_reg = 0x338,
110 .status_reg = 0x350,
111 .status_bit = 16,
112 .clkr.hw.init = &(struct clk_init_data){
113 .name = "pll15",
114 .parent_names = (const char *[]){ "pxo" },
115 .num_parents = 1,
116 .ops = &clk_pll_ops,
117 },
118};
119
120static const struct pll_config pll15_config = {
121 .l = 33,
122 .m = 1,
123 .n = 3,
124 .vco_val = 0x2 << 16,
125 .vco_mask = 0x3 << 16,
126 .pre_div_val = 0x0,
127 .pre_div_mask = BIT(19),
128 .post_div_val = 0x0,
129 .post_div_mask = 0x3 << 20,
130 .mn_ena_mask = BIT(22),
131 .main_output_mask = BIT(23),
132};
133
Stephen Boyd6d00b562014-01-15 10:47:29 -0800134static struct freq_tbl clk_tbl_cam[] = {
135 { 6000000, P_PLL8, 4, 1, 16 },
136 { 8000000, P_PLL8, 4, 1, 12 },
137 { 12000000, P_PLL8, 4, 1, 8 },
138 { 16000000, P_PLL8, 4, 1, 6 },
139 { 19200000, P_PLL8, 4, 1, 5 },
140 { 24000000, P_PLL8, 4, 1, 4 },
141 { 32000000, P_PLL8, 4, 1, 3 },
142 { 48000000, P_PLL8, 4, 1, 2 },
143 { 64000000, P_PLL8, 3, 1, 2 },
144 { 96000000, P_PLL8, 4, 0, 0 },
145 { 128000000, P_PLL8, 3, 0, 0 },
146 { }
147};
148
149static struct clk_rcg camclk0_src = {
150 .ns_reg = 0x0148,
151 .md_reg = 0x0144,
152 .mn = {
153 .mnctr_en_bit = 5,
154 .mnctr_reset_bit = 8,
155 .reset_in_cc = true,
156 .mnctr_mode_shift = 6,
157 .n_val_shift = 24,
158 .m_val_shift = 8,
159 .width = 8,
160 },
161 .p = {
162 .pre_div_shift = 14,
163 .pre_div_width = 2,
164 },
165 .s = {
166 .src_sel_shift = 0,
167 .parent_map = mmcc_pxo_pll8_pll2_map,
168 },
169 .freq_tbl = clk_tbl_cam,
170 .clkr = {
171 .enable_reg = 0x0140,
172 .enable_mask = BIT(2),
173 .hw.init = &(struct clk_init_data){
174 .name = "camclk0_src",
175 .parent_names = mmcc_pxo_pll8_pll2,
176 .num_parents = 3,
177 .ops = &clk_rcg_ops,
178 },
179 },
180};
181
182static struct clk_branch camclk0_clk = {
183 .halt_reg = 0x01e8,
184 .halt_bit = 15,
185 .clkr = {
186 .enable_reg = 0x0140,
187 .enable_mask = BIT(0),
188 .hw.init = &(struct clk_init_data){
189 .name = "camclk0_clk",
190 .parent_names = (const char *[]){ "camclk0_src" },
191 .num_parents = 1,
192 .ops = &clk_branch_ops,
193 },
194 },
195
196};
197
198static struct clk_rcg camclk1_src = {
199 .ns_reg = 0x015c,
200 .md_reg = 0x0158,
201 .mn = {
202 .mnctr_en_bit = 5,
203 .mnctr_reset_bit = 8,
204 .reset_in_cc = true,
205 .mnctr_mode_shift = 6,
206 .n_val_shift = 24,
207 .m_val_shift = 8,
208 .width = 8,
209 },
210 .p = {
211 .pre_div_shift = 14,
212 .pre_div_width = 2,
213 },
214 .s = {
215 .src_sel_shift = 0,
216 .parent_map = mmcc_pxo_pll8_pll2_map,
217 },
218 .freq_tbl = clk_tbl_cam,
219 .clkr = {
220 .enable_reg = 0x0154,
221 .enable_mask = BIT(2),
222 .hw.init = &(struct clk_init_data){
223 .name = "camclk1_src",
224 .parent_names = mmcc_pxo_pll8_pll2,
225 .num_parents = 3,
226 .ops = &clk_rcg_ops,
227 },
228 },
229};
230
231static struct clk_branch camclk1_clk = {
232 .halt_reg = 0x01e8,
233 .halt_bit = 16,
234 .clkr = {
235 .enable_reg = 0x0154,
236 .enable_mask = BIT(0),
237 .hw.init = &(struct clk_init_data){
238 .name = "camclk1_clk",
239 .parent_names = (const char *[]){ "camclk1_src" },
240 .num_parents = 1,
241 .ops = &clk_branch_ops,
242 },
243 },
244
245};
246
247static struct clk_rcg camclk2_src = {
248 .ns_reg = 0x0228,
249 .md_reg = 0x0224,
250 .mn = {
251 .mnctr_en_bit = 5,
252 .mnctr_reset_bit = 8,
253 .reset_in_cc = true,
254 .mnctr_mode_shift = 6,
255 .n_val_shift = 24,
256 .m_val_shift = 8,
257 .width = 8,
258 },
259 .p = {
260 .pre_div_shift = 14,
261 .pre_div_width = 2,
262 },
263 .s = {
264 .src_sel_shift = 0,
265 .parent_map = mmcc_pxo_pll8_pll2_map,
266 },
267 .freq_tbl = clk_tbl_cam,
268 .clkr = {
269 .enable_reg = 0x0220,
270 .enable_mask = BIT(2),
271 .hw.init = &(struct clk_init_data){
272 .name = "camclk2_src",
273 .parent_names = mmcc_pxo_pll8_pll2,
274 .num_parents = 3,
275 .ops = &clk_rcg_ops,
276 },
277 },
278};
279
280static struct clk_branch camclk2_clk = {
281 .halt_reg = 0x01e8,
282 .halt_bit = 16,
283 .clkr = {
284 .enable_reg = 0x0220,
285 .enable_mask = BIT(0),
286 .hw.init = &(struct clk_init_data){
287 .name = "camclk2_clk",
288 .parent_names = (const char *[]){ "camclk2_src" },
289 .num_parents = 1,
290 .ops = &clk_branch_ops,
291 },
292 },
293
294};
295
296static struct freq_tbl clk_tbl_csi[] = {
297 { 27000000, P_PXO, 1, 0, 0 },
298 { 85330000, P_PLL8, 1, 2, 9 },
299 { 177780000, P_PLL2, 1, 2, 9 },
300 { }
301};
302
303static struct clk_rcg csi0_src = {
304 .ns_reg = 0x0048,
305 .md_reg = 0x0044,
306 .mn = {
307 .mnctr_en_bit = 5,
308 .mnctr_reset_bit = 7,
309 .mnctr_mode_shift = 6,
310 .n_val_shift = 24,
311 .m_val_shift = 8,
312 .width = 8,
313 },
314 .p = {
315 .pre_div_shift = 14,
316 .pre_div_width = 2,
317 },
318 .s = {
319 .src_sel_shift = 0,
320 .parent_map = mmcc_pxo_pll8_pll2_map,
321 },
322 .freq_tbl = clk_tbl_csi,
323 .clkr = {
324 .enable_reg = 0x0040,
325 .enable_mask = BIT(2),
326 .hw.init = &(struct clk_init_data){
327 .name = "csi0_src",
328 .parent_names = mmcc_pxo_pll8_pll2,
329 .num_parents = 3,
330 .ops = &clk_rcg_ops,
331 },
332 },
333};
334
335static struct clk_branch csi0_clk = {
336 .halt_reg = 0x01cc,
337 .halt_bit = 13,
338 .clkr = {
339 .enable_reg = 0x0040,
340 .enable_mask = BIT(0),
341 .hw.init = &(struct clk_init_data){
342 .parent_names = (const char *[]){ "csi0_src" },
343 .num_parents = 1,
344 .name = "csi0_clk",
345 .ops = &clk_branch_ops,
346 .flags = CLK_SET_RATE_PARENT,
347 },
348 },
349};
350
351static struct clk_branch csi0_phy_clk = {
352 .halt_reg = 0x01e8,
353 .halt_bit = 9,
354 .clkr = {
355 .enable_reg = 0x0040,
356 .enable_mask = BIT(8),
357 .hw.init = &(struct clk_init_data){
358 .parent_names = (const char *[]){ "csi0_src" },
359 .num_parents = 1,
360 .name = "csi0_phy_clk",
361 .ops = &clk_branch_ops,
362 .flags = CLK_SET_RATE_PARENT,
363 },
364 },
365};
366
367static struct clk_rcg csi1_src = {
368 .ns_reg = 0x0010,
369 .md_reg = 0x0028,
370 .mn = {
371 .mnctr_en_bit = 5,
372 .mnctr_reset_bit = 7,
373 .mnctr_mode_shift = 6,
374 .n_val_shift = 24,
375 .m_val_shift = 8,
376 .width = 8,
377 },
378 .p = {
379 .pre_div_shift = 14,
380 .pre_div_width = 2,
381 },
382 .s = {
383 .src_sel_shift = 0,
384 .parent_map = mmcc_pxo_pll8_pll2_map,
385 },
386 .freq_tbl = clk_tbl_csi,
387 .clkr = {
388 .enable_reg = 0x0024,
389 .enable_mask = BIT(2),
390 .hw.init = &(struct clk_init_data){
391 .name = "csi1_src",
392 .parent_names = mmcc_pxo_pll8_pll2,
393 .num_parents = 3,
394 .ops = &clk_rcg_ops,
395 },
396 },
397};
398
399static struct clk_branch csi1_clk = {
400 .halt_reg = 0x01cc,
401 .halt_bit = 14,
402 .clkr = {
403 .enable_reg = 0x0024,
404 .enable_mask = BIT(0),
405 .hw.init = &(struct clk_init_data){
406 .parent_names = (const char *[]){ "csi1_src" },
407 .num_parents = 1,
408 .name = "csi1_clk",
409 .ops = &clk_branch_ops,
410 .flags = CLK_SET_RATE_PARENT,
411 },
412 },
413};
414
415static struct clk_branch csi1_phy_clk = {
416 .halt_reg = 0x01e8,
417 .halt_bit = 10,
418 .clkr = {
419 .enable_reg = 0x0024,
420 .enable_mask = BIT(8),
421 .hw.init = &(struct clk_init_data){
422 .parent_names = (const char *[]){ "csi1_src" },
423 .num_parents = 1,
424 .name = "csi1_phy_clk",
425 .ops = &clk_branch_ops,
426 .flags = CLK_SET_RATE_PARENT,
427 },
428 },
429};
430
431static struct clk_rcg csi2_src = {
432 .ns_reg = 0x0234,
433 .md_reg = 0x022c,
434 .mn = {
435 .mnctr_en_bit = 5,
436 .mnctr_reset_bit = 7,
437 .mnctr_mode_shift = 6,
438 .n_val_shift = 24,
439 .m_val_shift = 8,
440 .width = 8,
441 },
442 .p = {
443 .pre_div_shift = 14,
444 .pre_div_width = 2,
445 },
446 .s = {
447 .src_sel_shift = 0,
448 .parent_map = mmcc_pxo_pll8_pll2_map,
449 },
450 .freq_tbl = clk_tbl_csi,
451 .clkr = {
452 .enable_reg = 0x022c,
453 .enable_mask = BIT(2),
454 .hw.init = &(struct clk_init_data){
455 .name = "csi2_src",
456 .parent_names = mmcc_pxo_pll8_pll2,
457 .num_parents = 3,
458 .ops = &clk_rcg_ops,
459 },
460 },
461};
462
463static struct clk_branch csi2_clk = {
464 .halt_reg = 0x01cc,
465 .halt_bit = 29,
466 .clkr = {
467 .enable_reg = 0x022c,
468 .enable_mask = BIT(0),
469 .hw.init = &(struct clk_init_data){
470 .parent_names = (const char *[]){ "csi2_src" },
471 .num_parents = 1,
472 .name = "csi2_clk",
473 .ops = &clk_branch_ops,
474 .flags = CLK_SET_RATE_PARENT,
475 },
476 },
477};
478
479static struct clk_branch csi2_phy_clk = {
480 .halt_reg = 0x01e8,
481 .halt_bit = 29,
482 .clkr = {
483 .enable_reg = 0x022c,
484 .enable_mask = BIT(8),
485 .hw.init = &(struct clk_init_data){
486 .parent_names = (const char *[]){ "csi2_src" },
487 .num_parents = 1,
488 .name = "csi2_phy_clk",
489 .ops = &clk_branch_ops,
490 .flags = CLK_SET_RATE_PARENT,
491 },
492 },
493};
494
495struct clk_pix_rdi {
496 u32 s_reg;
497 u32 s_mask;
498 u32 s2_reg;
499 u32 s2_mask;
500 struct clk_regmap clkr;
501};
502
503#define to_clk_pix_rdi(_hw) \
504 container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr)
505
506static int pix_rdi_set_parent(struct clk_hw *hw, u8 index)
507{
508 int i;
509 int ret = 0;
510 u32 val;
511 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
Stephen Boyd497295a2015-06-25 16:53:23 -0700512 int num_parents = clk_hw_get_num_parents(hw);
Stephen Boyd6d00b562014-01-15 10:47:29 -0800513
514 /*
515 * These clocks select three inputs via two muxes. One mux selects
516 * between csi0 and csi1 and the second mux selects between that mux's
517 * output and csi2. The source and destination selections for each
518 * mux must be clocking for the switch to succeed so just turn on
519 * all three sources because it's easier than figuring out what source
520 * needs to be on at what time.
521 */
522 for (i = 0; i < num_parents; i++) {
Stephen Boydac2693952015-07-30 17:20:57 -0700523 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
524 ret = clk_prepare_enable(p->clk);
Stephen Boyd6d00b562014-01-15 10:47:29 -0800525 if (ret)
526 goto err;
527 }
528
529 if (index == 2)
530 val = rdi->s2_mask;
531 else
532 val = 0;
533 regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val);
534 /*
535 * Wait at least 6 cycles of slowest clock
536 * for the glitch-free MUX to fully switch sources.
537 */
538 udelay(1);
539
540 if (index == 1)
541 val = rdi->s_mask;
542 else
543 val = 0;
544 regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val);
545 /*
546 * Wait at least 6 cycles of slowest clock
547 * for the glitch-free MUX to fully switch sources.
548 */
549 udelay(1);
550
551err:
Stephen Boydac2693952015-07-30 17:20:57 -0700552 for (i--; i >= 0; i--) {
553 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
554 clk_disable_unprepare(p->clk);
555 }
Stephen Boyd6d00b562014-01-15 10:47:29 -0800556
557 return ret;
558}
559
560static u8 pix_rdi_get_parent(struct clk_hw *hw)
561{
562 u32 val;
563 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
564
565
566 regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val);
567 if (val & rdi->s2_mask)
568 return 2;
569
570 regmap_read(rdi->clkr.regmap, rdi->s_reg, &val);
571 if (val & rdi->s_mask)
572 return 1;
573
574 return 0;
575}
576
577static const struct clk_ops clk_ops_pix_rdi = {
578 .enable = clk_enable_regmap,
579 .disable = clk_disable_regmap,
580 .set_parent = pix_rdi_set_parent,
581 .get_parent = pix_rdi_get_parent,
582 .determine_rate = __clk_mux_determine_rate,
583};
584
Georgi Djakovadb11a42015-07-06 16:51:30 +0300585static const char * const pix_rdi_parents[] = {
Stephen Boyd6d00b562014-01-15 10:47:29 -0800586 "csi0_clk",
587 "csi1_clk",
588 "csi2_clk",
589};
590
591static struct clk_pix_rdi csi_pix_clk = {
592 .s_reg = 0x0058,
593 .s_mask = BIT(25),
594 .s2_reg = 0x0238,
595 .s2_mask = BIT(13),
596 .clkr = {
597 .enable_reg = 0x0058,
598 .enable_mask = BIT(26),
599 .hw.init = &(struct clk_init_data){
600 .name = "csi_pix_clk",
601 .parent_names = pix_rdi_parents,
602 .num_parents = 3,
603 .ops = &clk_ops_pix_rdi,
604 },
605 },
606};
607
608static struct clk_pix_rdi csi_pix1_clk = {
609 .s_reg = 0x0238,
610 .s_mask = BIT(8),
611 .s2_reg = 0x0238,
612 .s2_mask = BIT(9),
613 .clkr = {
614 .enable_reg = 0x0238,
615 .enable_mask = BIT(10),
616 .hw.init = &(struct clk_init_data){
617 .name = "csi_pix1_clk",
618 .parent_names = pix_rdi_parents,
619 .num_parents = 3,
620 .ops = &clk_ops_pix_rdi,
621 },
622 },
623};
624
625static struct clk_pix_rdi csi_rdi_clk = {
626 .s_reg = 0x0058,
627 .s_mask = BIT(12),
628 .s2_reg = 0x0238,
629 .s2_mask = BIT(12),
630 .clkr = {
631 .enable_reg = 0x0058,
632 .enable_mask = BIT(13),
633 .hw.init = &(struct clk_init_data){
634 .name = "csi_rdi_clk",
635 .parent_names = pix_rdi_parents,
636 .num_parents = 3,
637 .ops = &clk_ops_pix_rdi,
638 },
639 },
640};
641
642static struct clk_pix_rdi csi_rdi1_clk = {
643 .s_reg = 0x0238,
644 .s_mask = BIT(0),
645 .s2_reg = 0x0238,
646 .s2_mask = BIT(1),
647 .clkr = {
648 .enable_reg = 0x0238,
649 .enable_mask = BIT(2),
650 .hw.init = &(struct clk_init_data){
651 .name = "csi_rdi1_clk",
652 .parent_names = pix_rdi_parents,
653 .num_parents = 3,
654 .ops = &clk_ops_pix_rdi,
655 },
656 },
657};
658
659static struct clk_pix_rdi csi_rdi2_clk = {
660 .s_reg = 0x0238,
661 .s_mask = BIT(4),
662 .s2_reg = 0x0238,
663 .s2_mask = BIT(5),
664 .clkr = {
665 .enable_reg = 0x0238,
666 .enable_mask = BIT(6),
667 .hw.init = &(struct clk_init_data){
668 .name = "csi_rdi2_clk",
669 .parent_names = pix_rdi_parents,
670 .num_parents = 3,
671 .ops = &clk_ops_pix_rdi,
672 },
673 },
674};
675
676static struct freq_tbl clk_tbl_csiphytimer[] = {
677 { 85330000, P_PLL8, 1, 2, 9 },
678 { 177780000, P_PLL2, 1, 2, 9 },
679 { }
680};
681
682static struct clk_rcg csiphytimer_src = {
683 .ns_reg = 0x0168,
684 .md_reg = 0x0164,
685 .mn = {
686 .mnctr_en_bit = 5,
687 .mnctr_reset_bit = 8,
688 .reset_in_cc = true,
689 .mnctr_mode_shift = 6,
690 .n_val_shift = 24,
691 .m_val_shift = 8,
692 .width = 8,
693 },
694 .p = {
695 .pre_div_shift = 14,
696 .pre_div_width = 2,
697 },
698 .s = {
699 .src_sel_shift = 0,
700 .parent_map = mmcc_pxo_pll8_pll2_map,
701 },
702 .freq_tbl = clk_tbl_csiphytimer,
703 .clkr = {
704 .enable_reg = 0x0160,
705 .enable_mask = BIT(2),
706 .hw.init = &(struct clk_init_data){
707 .name = "csiphytimer_src",
708 .parent_names = mmcc_pxo_pll8_pll2,
709 .num_parents = 3,
710 .ops = &clk_rcg_ops,
711 },
712 },
713};
714
Georgi Djakovadb11a42015-07-06 16:51:30 +0300715static const char * const csixphy_timer_src[] = { "csiphytimer_src" };
Stephen Boyd6d00b562014-01-15 10:47:29 -0800716
717static struct clk_branch csiphy0_timer_clk = {
718 .halt_reg = 0x01e8,
719 .halt_bit = 17,
720 .clkr = {
721 .enable_reg = 0x0160,
722 .enable_mask = BIT(0),
723 .hw.init = &(struct clk_init_data){
724 .parent_names = csixphy_timer_src,
725 .num_parents = 1,
726 .name = "csiphy0_timer_clk",
727 .ops = &clk_branch_ops,
728 .flags = CLK_SET_RATE_PARENT,
729 },
730 },
731};
732
733static struct clk_branch csiphy1_timer_clk = {
734 .halt_reg = 0x01e8,
735 .halt_bit = 18,
736 .clkr = {
737 .enable_reg = 0x0160,
738 .enable_mask = BIT(9),
739 .hw.init = &(struct clk_init_data){
740 .parent_names = csixphy_timer_src,
741 .num_parents = 1,
742 .name = "csiphy1_timer_clk",
743 .ops = &clk_branch_ops,
744 .flags = CLK_SET_RATE_PARENT,
745 },
746 },
747};
748
749static struct clk_branch csiphy2_timer_clk = {
750 .halt_reg = 0x01e8,
751 .halt_bit = 30,
752 .clkr = {
753 .enable_reg = 0x0160,
754 .enable_mask = BIT(11),
755 .hw.init = &(struct clk_init_data){
756 .parent_names = csixphy_timer_src,
757 .num_parents = 1,
758 .name = "csiphy2_timer_clk",
759 .ops = &clk_branch_ops,
760 .flags = CLK_SET_RATE_PARENT,
761 },
762 },
763};
764
765static struct freq_tbl clk_tbl_gfx2d[] = {
Stephen Boydff207832014-07-08 18:36:06 -0700766 F_MN( 27000000, P_PXO, 1, 0),
767 F_MN( 48000000, P_PLL8, 1, 8),
768 F_MN( 54857000, P_PLL8, 1, 7),
769 F_MN( 64000000, P_PLL8, 1, 6),
770 F_MN( 76800000, P_PLL8, 1, 5),
771 F_MN( 96000000, P_PLL8, 1, 4),
772 F_MN(128000000, P_PLL8, 1, 3),
773 F_MN(145455000, P_PLL2, 2, 11),
774 F_MN(160000000, P_PLL2, 1, 5),
775 F_MN(177778000, P_PLL2, 2, 9),
776 F_MN(200000000, P_PLL2, 1, 4),
777 F_MN(228571000, P_PLL2, 2, 7),
Stephen Boyd6d00b562014-01-15 10:47:29 -0800778 { }
779};
780
781static struct clk_dyn_rcg gfx2d0_src = {
Stephen Boyd229fd4a2014-04-28 15:59:16 -0700782 .ns_reg[0] = 0x0070,
783 .ns_reg[1] = 0x0070,
Stephen Boyd6d00b562014-01-15 10:47:29 -0800784 .md_reg[0] = 0x0064,
785 .md_reg[1] = 0x0068,
Stephen Boyd229fd4a2014-04-28 15:59:16 -0700786 .bank_reg = 0x0060,
Stephen Boyd6d00b562014-01-15 10:47:29 -0800787 .mn[0] = {
788 .mnctr_en_bit = 8,
789 .mnctr_reset_bit = 25,
790 .mnctr_mode_shift = 9,
791 .n_val_shift = 20,
792 .m_val_shift = 4,
793 .width = 4,
794 },
795 .mn[1] = {
796 .mnctr_en_bit = 5,
797 .mnctr_reset_bit = 24,
798 .mnctr_mode_shift = 6,
799 .n_val_shift = 16,
800 .m_val_shift = 4,
801 .width = 4,
802 },
803 .s[0] = {
804 .src_sel_shift = 3,
805 .parent_map = mmcc_pxo_pll8_pll2_map,
806 },
807 .s[1] = {
808 .src_sel_shift = 0,
809 .parent_map = mmcc_pxo_pll8_pll2_map,
810 },
811 .mux_sel_bit = 11,
812 .freq_tbl = clk_tbl_gfx2d,
813 .clkr = {
814 .enable_reg = 0x0060,
815 .enable_mask = BIT(2),
816 .hw.init = &(struct clk_init_data){
817 .name = "gfx2d0_src",
818 .parent_names = mmcc_pxo_pll8_pll2,
819 .num_parents = 3,
820 .ops = &clk_dyn_rcg_ops,
821 },
822 },
823};
824
825static struct clk_branch gfx2d0_clk = {
826 .halt_reg = 0x01c8,
827 .halt_bit = 9,
828 .clkr = {
829 .enable_reg = 0x0060,
830 .enable_mask = BIT(0),
831 .hw.init = &(struct clk_init_data){
832 .name = "gfx2d0_clk",
833 .parent_names = (const char *[]){ "gfx2d0_src" },
834 .num_parents = 1,
835 .ops = &clk_branch_ops,
836 .flags = CLK_SET_RATE_PARENT,
837 },
838 },
839};
840
841static struct clk_dyn_rcg gfx2d1_src = {
Stephen Boyd229fd4a2014-04-28 15:59:16 -0700842 .ns_reg[0] = 0x007c,
843 .ns_reg[1] = 0x007c,
Stephen Boyd6d00b562014-01-15 10:47:29 -0800844 .md_reg[0] = 0x0078,
845 .md_reg[1] = 0x006c,
Stephen Boyd229fd4a2014-04-28 15:59:16 -0700846 .bank_reg = 0x0074,
Stephen Boyd6d00b562014-01-15 10:47:29 -0800847 .mn[0] = {
848 .mnctr_en_bit = 8,
849 .mnctr_reset_bit = 25,
850 .mnctr_mode_shift = 9,
851 .n_val_shift = 20,
852 .m_val_shift = 4,
853 .width = 4,
854 },
855 .mn[1] = {
856 .mnctr_en_bit = 5,
857 .mnctr_reset_bit = 24,
858 .mnctr_mode_shift = 6,
859 .n_val_shift = 16,
860 .m_val_shift = 4,
861 .width = 4,
862 },
863 .s[0] = {
864 .src_sel_shift = 3,
865 .parent_map = mmcc_pxo_pll8_pll2_map,
866 },
867 .s[1] = {
868 .src_sel_shift = 0,
869 .parent_map = mmcc_pxo_pll8_pll2_map,
870 },
871 .mux_sel_bit = 11,
872 .freq_tbl = clk_tbl_gfx2d,
873 .clkr = {
874 .enable_reg = 0x0074,
875 .enable_mask = BIT(2),
876 .hw.init = &(struct clk_init_data){
877 .name = "gfx2d1_src",
878 .parent_names = mmcc_pxo_pll8_pll2,
879 .num_parents = 3,
880 .ops = &clk_dyn_rcg_ops,
881 },
882 },
883};
884
885static struct clk_branch gfx2d1_clk = {
886 .halt_reg = 0x01c8,
887 .halt_bit = 14,
888 .clkr = {
889 .enable_reg = 0x0074,
890 .enable_mask = BIT(0),
891 .hw.init = &(struct clk_init_data){
892 .name = "gfx2d1_clk",
893 .parent_names = (const char *[]){ "gfx2d1_src" },
894 .num_parents = 1,
895 .ops = &clk_branch_ops,
896 .flags = CLK_SET_RATE_PARENT,
897 },
898 },
899};
900
901static struct freq_tbl clk_tbl_gfx3d[] = {
Stephen Boydff207832014-07-08 18:36:06 -0700902 F_MN( 27000000, P_PXO, 1, 0),
903 F_MN( 48000000, P_PLL8, 1, 8),
904 F_MN( 54857000, P_PLL8, 1, 7),
905 F_MN( 64000000, P_PLL8, 1, 6),
906 F_MN( 76800000, P_PLL8, 1, 5),
907 F_MN( 96000000, P_PLL8, 1, 4),
908 F_MN(128000000, P_PLL8, 1, 3),
909 F_MN(145455000, P_PLL2, 2, 11),
910 F_MN(160000000, P_PLL2, 1, 5),
911 F_MN(177778000, P_PLL2, 2, 9),
912 F_MN(200000000, P_PLL2, 1, 4),
913 F_MN(228571000, P_PLL2, 2, 7),
914 F_MN(266667000, P_PLL2, 1, 3),
915 F_MN(300000000, P_PLL3, 1, 4),
916 F_MN(320000000, P_PLL2, 2, 5),
917 F_MN(400000000, P_PLL2, 1, 2),
Stephen Boyd6d00b562014-01-15 10:47:29 -0800918 { }
919};
920
Stephen Boyde216ce62014-07-15 14:52:22 -0700921static struct freq_tbl clk_tbl_gfx3d_8064[] = {
922 F_MN( 27000000, P_PXO, 0, 0),
923 F_MN( 48000000, P_PLL8, 1, 8),
924 F_MN( 54857000, P_PLL8, 1, 7),
925 F_MN( 64000000, P_PLL8, 1, 6),
926 F_MN( 76800000, P_PLL8, 1, 5),
927 F_MN( 96000000, P_PLL8, 1, 4),
928 F_MN(128000000, P_PLL8, 1, 3),
929 F_MN(145455000, P_PLL2, 2, 11),
930 F_MN(160000000, P_PLL2, 1, 5),
931 F_MN(177778000, P_PLL2, 2, 9),
932 F_MN(192000000, P_PLL8, 1, 2),
933 F_MN(200000000, P_PLL2, 1, 4),
934 F_MN(228571000, P_PLL2, 2, 7),
935 F_MN(266667000, P_PLL2, 1, 3),
936 F_MN(320000000, P_PLL2, 2, 5),
937 F_MN(400000000, P_PLL2, 1, 2),
938 F_MN(450000000, P_PLL15, 1, 2),
Stephen Boyd6d00b562014-01-15 10:47:29 -0800939 { }
940};
941
942static struct clk_dyn_rcg gfx3d_src = {
Stephen Boyd229fd4a2014-04-28 15:59:16 -0700943 .ns_reg[0] = 0x008c,
944 .ns_reg[1] = 0x008c,
Stephen Boyd6d00b562014-01-15 10:47:29 -0800945 .md_reg[0] = 0x0084,
946 .md_reg[1] = 0x0088,
Stephen Boyd229fd4a2014-04-28 15:59:16 -0700947 .bank_reg = 0x0080,
Stephen Boyd6d00b562014-01-15 10:47:29 -0800948 .mn[0] = {
949 .mnctr_en_bit = 8,
950 .mnctr_reset_bit = 25,
951 .mnctr_mode_shift = 9,
952 .n_val_shift = 18,
953 .m_val_shift = 4,
954 .width = 4,
955 },
956 .mn[1] = {
957 .mnctr_en_bit = 5,
958 .mnctr_reset_bit = 24,
959 .mnctr_mode_shift = 6,
960 .n_val_shift = 14,
961 .m_val_shift = 4,
962 .width = 4,
963 },
964 .s[0] = {
965 .src_sel_shift = 3,
966 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
967 },
968 .s[1] = {
969 .src_sel_shift = 0,
970 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
971 },
972 .mux_sel_bit = 11,
973 .freq_tbl = clk_tbl_gfx3d,
974 .clkr = {
975 .enable_reg = 0x0080,
976 .enable_mask = BIT(2),
977 .hw.init = &(struct clk_init_data){
978 .name = "gfx3d_src",
979 .parent_names = mmcc_pxo_pll8_pll2_pll3,
Stephen Boydff207832014-07-08 18:36:06 -0700980 .num_parents = 4,
Stephen Boyd6d00b562014-01-15 10:47:29 -0800981 .ops = &clk_dyn_rcg_ops,
982 },
983 },
984};
985
Stephen Boyde216ce62014-07-15 14:52:22 -0700986static const struct clk_init_data gfx3d_8064_init = {
987 .name = "gfx3d_src",
988 .parent_names = mmcc_pxo_pll8_pll2_pll15,
989 .num_parents = 4,
990 .ops = &clk_dyn_rcg_ops,
991};
992
Stephen Boyd6d00b562014-01-15 10:47:29 -0800993static struct clk_branch gfx3d_clk = {
994 .halt_reg = 0x01c8,
995 .halt_bit = 4,
996 .clkr = {
997 .enable_reg = 0x0080,
998 .enable_mask = BIT(0),
999 .hw.init = &(struct clk_init_data){
1000 .name = "gfx3d_clk",
1001 .parent_names = (const char *[]){ "gfx3d_src" },
1002 .num_parents = 1,
1003 .ops = &clk_branch_ops,
1004 .flags = CLK_SET_RATE_PARENT,
1005 },
1006 },
1007};
1008
Stephen Boyde216ce62014-07-15 14:52:22 -07001009static struct freq_tbl clk_tbl_vcap[] = {
1010 F_MN( 27000000, P_PXO, 0, 0),
1011 F_MN( 54860000, P_PLL8, 1, 7),
1012 F_MN( 64000000, P_PLL8, 1, 6),
1013 F_MN( 76800000, P_PLL8, 1, 5),
1014 F_MN(128000000, P_PLL8, 1, 3),
1015 F_MN(160000000, P_PLL2, 1, 5),
1016 F_MN(200000000, P_PLL2, 1, 4),
1017 { }
1018};
1019
1020static struct clk_dyn_rcg vcap_src = {
Stephen Boyd229fd4a2014-04-28 15:59:16 -07001021 .ns_reg[0] = 0x021c,
1022 .ns_reg[1] = 0x021c,
Stephen Boyde216ce62014-07-15 14:52:22 -07001023 .md_reg[0] = 0x01ec,
1024 .md_reg[1] = 0x0218,
Stephen Boyd229fd4a2014-04-28 15:59:16 -07001025 .bank_reg = 0x0178,
Stephen Boyde216ce62014-07-15 14:52:22 -07001026 .mn[0] = {
1027 .mnctr_en_bit = 8,
1028 .mnctr_reset_bit = 23,
1029 .mnctr_mode_shift = 9,
1030 .n_val_shift = 18,
1031 .m_val_shift = 4,
1032 .width = 4,
1033 },
1034 .mn[1] = {
1035 .mnctr_en_bit = 5,
1036 .mnctr_reset_bit = 22,
1037 .mnctr_mode_shift = 6,
1038 .n_val_shift = 14,
1039 .m_val_shift = 4,
1040 .width = 4,
1041 },
1042 .s[0] = {
1043 .src_sel_shift = 3,
1044 .parent_map = mmcc_pxo_pll8_pll2_map,
1045 },
1046 .s[1] = {
1047 .src_sel_shift = 0,
1048 .parent_map = mmcc_pxo_pll8_pll2_map,
1049 },
1050 .mux_sel_bit = 11,
1051 .freq_tbl = clk_tbl_vcap,
1052 .clkr = {
1053 .enable_reg = 0x0178,
1054 .enable_mask = BIT(2),
1055 .hw.init = &(struct clk_init_data){
1056 .name = "vcap_src",
1057 .parent_names = mmcc_pxo_pll8_pll2,
1058 .num_parents = 3,
1059 .ops = &clk_dyn_rcg_ops,
1060 },
1061 },
1062};
1063
1064static struct clk_branch vcap_clk = {
1065 .halt_reg = 0x0240,
1066 .halt_bit = 15,
1067 .clkr = {
1068 .enable_reg = 0x0178,
1069 .enable_mask = BIT(0),
1070 .hw.init = &(struct clk_init_data){
1071 .name = "vcap_clk",
1072 .parent_names = (const char *[]){ "vcap_src" },
1073 .num_parents = 1,
1074 .ops = &clk_branch_ops,
1075 .flags = CLK_SET_RATE_PARENT,
1076 },
1077 },
1078};
1079
1080static struct clk_branch vcap_npl_clk = {
1081 .halt_reg = 0x0240,
1082 .halt_bit = 25,
1083 .clkr = {
1084 .enable_reg = 0x0178,
1085 .enable_mask = BIT(13),
1086 .hw.init = &(struct clk_init_data){
1087 .name = "vcap_npl_clk",
1088 .parent_names = (const char *[]){ "vcap_src" },
1089 .num_parents = 1,
1090 .ops = &clk_branch_ops,
1091 .flags = CLK_SET_RATE_PARENT,
1092 },
1093 },
1094};
1095
Stephen Boyd6d00b562014-01-15 10:47:29 -08001096static struct freq_tbl clk_tbl_ijpeg[] = {
1097 { 27000000, P_PXO, 1, 0, 0 },
1098 { 36570000, P_PLL8, 1, 2, 21 },
1099 { 54860000, P_PLL8, 7, 0, 0 },
1100 { 96000000, P_PLL8, 4, 0, 0 },
1101 { 109710000, P_PLL8, 1, 2, 7 },
1102 { 128000000, P_PLL8, 3, 0, 0 },
1103 { 153600000, P_PLL8, 1, 2, 5 },
1104 { 200000000, P_PLL2, 4, 0, 0 },
1105 { 228571000, P_PLL2, 1, 2, 7 },
1106 { 266667000, P_PLL2, 1, 1, 3 },
1107 { 320000000, P_PLL2, 1, 2, 5 },
1108 { }
1109};
1110
1111static struct clk_rcg ijpeg_src = {
1112 .ns_reg = 0x00a0,
1113 .md_reg = 0x009c,
1114 .mn = {
1115 .mnctr_en_bit = 5,
1116 .mnctr_reset_bit = 7,
1117 .mnctr_mode_shift = 6,
1118 .n_val_shift = 16,
1119 .m_val_shift = 8,
1120 .width = 8,
1121 },
1122 .p = {
1123 .pre_div_shift = 12,
1124 .pre_div_width = 2,
1125 },
1126 .s = {
1127 .src_sel_shift = 0,
1128 .parent_map = mmcc_pxo_pll8_pll2_map,
1129 },
1130 .freq_tbl = clk_tbl_ijpeg,
1131 .clkr = {
1132 .enable_reg = 0x0098,
1133 .enable_mask = BIT(2),
1134 .hw.init = &(struct clk_init_data){
1135 .name = "ijpeg_src",
1136 .parent_names = mmcc_pxo_pll8_pll2,
1137 .num_parents = 3,
1138 .ops = &clk_rcg_ops,
1139 },
1140 },
1141};
1142
1143static struct clk_branch ijpeg_clk = {
1144 .halt_reg = 0x01c8,
1145 .halt_bit = 24,
1146 .clkr = {
1147 .enable_reg = 0x0098,
1148 .enable_mask = BIT(0),
1149 .hw.init = &(struct clk_init_data){
1150 .name = "ijpeg_clk",
1151 .parent_names = (const char *[]){ "ijpeg_src" },
1152 .num_parents = 1,
1153 .ops = &clk_branch_ops,
1154 .flags = CLK_SET_RATE_PARENT,
1155 },
1156 },
1157};
1158
1159static struct freq_tbl clk_tbl_jpegd[] = {
1160 { 64000000, P_PLL8, 6 },
1161 { 76800000, P_PLL8, 5 },
1162 { 96000000, P_PLL8, 4 },
1163 { 160000000, P_PLL2, 5 },
1164 { 200000000, P_PLL2, 4 },
1165 { }
1166};
1167
1168static struct clk_rcg jpegd_src = {
1169 .ns_reg = 0x00ac,
1170 .p = {
1171 .pre_div_shift = 12,
Stephen Boydff207832014-07-08 18:36:06 -07001172 .pre_div_width = 4,
Stephen Boyd6d00b562014-01-15 10:47:29 -08001173 },
1174 .s = {
1175 .src_sel_shift = 0,
1176 .parent_map = mmcc_pxo_pll8_pll2_map,
1177 },
1178 .freq_tbl = clk_tbl_jpegd,
1179 .clkr = {
1180 .enable_reg = 0x00a4,
1181 .enable_mask = BIT(2),
1182 .hw.init = &(struct clk_init_data){
1183 .name = "jpegd_src",
1184 .parent_names = mmcc_pxo_pll8_pll2,
1185 .num_parents = 3,
1186 .ops = &clk_rcg_ops,
1187 },
1188 },
1189};
1190
1191static struct clk_branch jpegd_clk = {
1192 .halt_reg = 0x01c8,
1193 .halt_bit = 19,
1194 .clkr = {
1195 .enable_reg = 0x00a4,
1196 .enable_mask = BIT(0),
1197 .hw.init = &(struct clk_init_data){
1198 .name = "jpegd_clk",
1199 .parent_names = (const char *[]){ "jpegd_src" },
1200 .num_parents = 1,
1201 .ops = &clk_branch_ops,
1202 .flags = CLK_SET_RATE_PARENT,
1203 },
1204 },
1205};
1206
1207static struct freq_tbl clk_tbl_mdp[] = {
1208 { 9600000, P_PLL8, 1, 1, 40 },
1209 { 13710000, P_PLL8, 1, 1, 28 },
1210 { 27000000, P_PXO, 1, 0, 0 },
1211 { 29540000, P_PLL8, 1, 1, 13 },
1212 { 34910000, P_PLL8, 1, 1, 11 },
1213 { 38400000, P_PLL8, 1, 1, 10 },
1214 { 59080000, P_PLL8, 1, 2, 13 },
1215 { 76800000, P_PLL8, 1, 1, 5 },
1216 { 85330000, P_PLL8, 1, 2, 9 },
1217 { 96000000, P_PLL8, 1, 1, 4 },
1218 { 128000000, P_PLL8, 1, 1, 3 },
1219 { 160000000, P_PLL2, 1, 1, 5 },
1220 { 177780000, P_PLL2, 1, 2, 9 },
1221 { 200000000, P_PLL2, 1, 1, 4 },
1222 { 228571000, P_PLL2, 1, 2, 7 },
1223 { 266667000, P_PLL2, 1, 1, 3 },
1224 { }
1225};
1226
1227static struct clk_dyn_rcg mdp_src = {
Stephen Boyd229fd4a2014-04-28 15:59:16 -07001228 .ns_reg[0] = 0x00d0,
1229 .ns_reg[1] = 0x00d0,
Stephen Boyd6d00b562014-01-15 10:47:29 -08001230 .md_reg[0] = 0x00c4,
1231 .md_reg[1] = 0x00c8,
Stephen Boyd229fd4a2014-04-28 15:59:16 -07001232 .bank_reg = 0x00c0,
Stephen Boyd6d00b562014-01-15 10:47:29 -08001233 .mn[0] = {
1234 .mnctr_en_bit = 8,
1235 .mnctr_reset_bit = 31,
1236 .mnctr_mode_shift = 9,
1237 .n_val_shift = 22,
1238 .m_val_shift = 8,
1239 .width = 8,
1240 },
1241 .mn[1] = {
1242 .mnctr_en_bit = 5,
1243 .mnctr_reset_bit = 30,
1244 .mnctr_mode_shift = 6,
1245 .n_val_shift = 14,
1246 .m_val_shift = 8,
1247 .width = 8,
1248 },
1249 .s[0] = {
1250 .src_sel_shift = 3,
1251 .parent_map = mmcc_pxo_pll8_pll2_map,
1252 },
1253 .s[1] = {
1254 .src_sel_shift = 0,
1255 .parent_map = mmcc_pxo_pll8_pll2_map,
1256 },
1257 .mux_sel_bit = 11,
1258 .freq_tbl = clk_tbl_mdp,
1259 .clkr = {
1260 .enable_reg = 0x00c0,
1261 .enable_mask = BIT(2),
1262 .hw.init = &(struct clk_init_data){
1263 .name = "mdp_src",
1264 .parent_names = mmcc_pxo_pll8_pll2,
1265 .num_parents = 3,
1266 .ops = &clk_dyn_rcg_ops,
1267 },
1268 },
1269};
1270
1271static struct clk_branch mdp_clk = {
1272 .halt_reg = 0x01d0,
1273 .halt_bit = 10,
1274 .clkr = {
1275 .enable_reg = 0x00c0,
1276 .enable_mask = BIT(0),
1277 .hw.init = &(struct clk_init_data){
1278 .name = "mdp_clk",
1279 .parent_names = (const char *[]){ "mdp_src" },
1280 .num_parents = 1,
1281 .ops = &clk_branch_ops,
1282 .flags = CLK_SET_RATE_PARENT,
1283 },
1284 },
1285};
1286
1287static struct clk_branch mdp_lut_clk = {
1288 .halt_reg = 0x01e8,
1289 .halt_bit = 13,
1290 .clkr = {
1291 .enable_reg = 0x016c,
1292 .enable_mask = BIT(0),
1293 .hw.init = &(struct clk_init_data){
Stephen Boydf87dfca2014-07-08 18:36:06 -07001294 .parent_names = (const char *[]){ "mdp_src" },
Stephen Boyd6d00b562014-01-15 10:47:29 -08001295 .num_parents = 1,
1296 .name = "mdp_lut_clk",
1297 .ops = &clk_branch_ops,
1298 .flags = CLK_SET_RATE_PARENT,
1299 },
1300 },
1301};
1302
1303static struct clk_branch mdp_vsync_clk = {
1304 .halt_reg = 0x01cc,
1305 .halt_bit = 22,
1306 .clkr = {
1307 .enable_reg = 0x0058,
1308 .enable_mask = BIT(6),
1309 .hw.init = &(struct clk_init_data){
1310 .name = "mdp_vsync_clk",
1311 .parent_names = (const char *[]){ "pxo" },
1312 .num_parents = 1,
1313 .ops = &clk_branch_ops
1314 },
1315 },
1316};
1317
1318static struct freq_tbl clk_tbl_rot[] = {
1319 { 27000000, P_PXO, 1 },
1320 { 29540000, P_PLL8, 13 },
1321 { 32000000, P_PLL8, 12 },
1322 { 38400000, P_PLL8, 10 },
1323 { 48000000, P_PLL8, 8 },
1324 { 54860000, P_PLL8, 7 },
1325 { 64000000, P_PLL8, 6 },
1326 { 76800000, P_PLL8, 5 },
1327 { 96000000, P_PLL8, 4 },
1328 { 100000000, P_PLL2, 8 },
1329 { 114290000, P_PLL2, 7 },
1330 { 133330000, P_PLL2, 6 },
1331 { 160000000, P_PLL2, 5 },
1332 { 200000000, P_PLL2, 4 },
1333 { }
1334};
1335
1336static struct clk_dyn_rcg rot_src = {
Stephen Boyd229fd4a2014-04-28 15:59:16 -07001337 .ns_reg[0] = 0x00e8,
1338 .ns_reg[1] = 0x00e8,
1339 .bank_reg = 0x00e8,
Stephen Boyd6d00b562014-01-15 10:47:29 -08001340 .p[0] = {
1341 .pre_div_shift = 22,
1342 .pre_div_width = 4,
1343 },
1344 .p[1] = {
1345 .pre_div_shift = 26,
1346 .pre_div_width = 4,
1347 },
1348 .s[0] = {
1349 .src_sel_shift = 16,
1350 .parent_map = mmcc_pxo_pll8_pll2_map,
1351 },
1352 .s[1] = {
1353 .src_sel_shift = 19,
1354 .parent_map = mmcc_pxo_pll8_pll2_map,
1355 },
1356 .mux_sel_bit = 30,
1357 .freq_tbl = clk_tbl_rot,
1358 .clkr = {
1359 .enable_reg = 0x00e0,
1360 .enable_mask = BIT(2),
1361 .hw.init = &(struct clk_init_data){
1362 .name = "rot_src",
1363 .parent_names = mmcc_pxo_pll8_pll2,
1364 .num_parents = 3,
1365 .ops = &clk_dyn_rcg_ops,
1366 },
1367 },
1368};
1369
1370static struct clk_branch rot_clk = {
1371 .halt_reg = 0x01d0,
1372 .halt_bit = 15,
1373 .clkr = {
1374 .enable_reg = 0x00e0,
1375 .enable_mask = BIT(0),
1376 .hw.init = &(struct clk_init_data){
1377 .name = "rot_clk",
1378 .parent_names = (const char *[]){ "rot_src" },
1379 .num_parents = 1,
1380 .ops = &clk_branch_ops,
1381 .flags = CLK_SET_RATE_PARENT,
1382 },
1383 },
1384};
1385
Georgi Djakov293d2e972015-03-20 18:30:26 +02001386static const struct parent_map mmcc_pxo_hdmi_map[] = {
1387 { P_PXO, 0 },
1388 { P_HDMI_PLL, 3 }
Stephen Boyd6d00b562014-01-15 10:47:29 -08001389};
1390
Georgi Djakovadb11a42015-07-06 16:51:30 +03001391static const char * const mmcc_pxo_hdmi[] = {
Stephen Boyd6d00b562014-01-15 10:47:29 -08001392 "pxo",
1393 "hdmi_pll",
1394};
1395
1396static struct freq_tbl clk_tbl_tv[] = {
Stephen Boyd404c1ff2014-07-11 12:55:27 -07001397 { .src = P_HDMI_PLL, .pre_div = 1 },
Stephen Boyd6d00b562014-01-15 10:47:29 -08001398 { }
1399};
1400
1401static struct clk_rcg tv_src = {
1402 .ns_reg = 0x00f4,
1403 .md_reg = 0x00f0,
1404 .mn = {
1405 .mnctr_en_bit = 5,
1406 .mnctr_reset_bit = 7,
1407 .mnctr_mode_shift = 6,
1408 .n_val_shift = 16,
1409 .m_val_shift = 8,
1410 .width = 8,
1411 },
1412 .p = {
1413 .pre_div_shift = 14,
1414 .pre_div_width = 2,
1415 },
1416 .s = {
1417 .src_sel_shift = 0,
1418 .parent_map = mmcc_pxo_hdmi_map,
1419 },
1420 .freq_tbl = clk_tbl_tv,
1421 .clkr = {
1422 .enable_reg = 0x00ec,
1423 .enable_mask = BIT(2),
1424 .hw.init = &(struct clk_init_data){
1425 .name = "tv_src",
1426 .parent_names = mmcc_pxo_hdmi,
1427 .num_parents = 2,
Stephen Boyd404c1ff2014-07-11 12:55:27 -07001428 .ops = &clk_rcg_bypass_ops,
Stephen Boyd6d00b562014-01-15 10:47:29 -08001429 .flags = CLK_SET_RATE_PARENT,
1430 },
1431 },
1432};
1433
Georgi Djakovadb11a42015-07-06 16:51:30 +03001434static const char * const tv_src_name[] = { "tv_src" };
Stephen Boyd6d00b562014-01-15 10:47:29 -08001435
1436static struct clk_branch tv_enc_clk = {
1437 .halt_reg = 0x01d4,
1438 .halt_bit = 9,
1439 .clkr = {
1440 .enable_reg = 0x00ec,
1441 .enable_mask = BIT(8),
1442 .hw.init = &(struct clk_init_data){
1443 .parent_names = tv_src_name,
1444 .num_parents = 1,
1445 .name = "tv_enc_clk",
1446 .ops = &clk_branch_ops,
1447 .flags = CLK_SET_RATE_PARENT,
1448 },
1449 },
1450};
1451
1452static struct clk_branch tv_dac_clk = {
1453 .halt_reg = 0x01d4,
1454 .halt_bit = 10,
1455 .clkr = {
1456 .enable_reg = 0x00ec,
1457 .enable_mask = BIT(10),
1458 .hw.init = &(struct clk_init_data){
1459 .parent_names = tv_src_name,
1460 .num_parents = 1,
1461 .name = "tv_dac_clk",
1462 .ops = &clk_branch_ops,
1463 .flags = CLK_SET_RATE_PARENT,
1464 },
1465 },
1466};
1467
1468static struct clk_branch mdp_tv_clk = {
1469 .halt_reg = 0x01d4,
1470 .halt_bit = 12,
1471 .clkr = {
1472 .enable_reg = 0x00ec,
1473 .enable_mask = BIT(0),
1474 .hw.init = &(struct clk_init_data){
1475 .parent_names = tv_src_name,
1476 .num_parents = 1,
1477 .name = "mdp_tv_clk",
1478 .ops = &clk_branch_ops,
1479 .flags = CLK_SET_RATE_PARENT,
1480 },
1481 },
1482};
1483
1484static struct clk_branch hdmi_tv_clk = {
1485 .halt_reg = 0x01d4,
1486 .halt_bit = 11,
1487 .clkr = {
1488 .enable_reg = 0x00ec,
1489 .enable_mask = BIT(12),
1490 .hw.init = &(struct clk_init_data){
1491 .parent_names = tv_src_name,
1492 .num_parents = 1,
1493 .name = "hdmi_tv_clk",
1494 .ops = &clk_branch_ops,
1495 .flags = CLK_SET_RATE_PARENT,
1496 },
1497 },
1498};
1499
Stephen Boyde216ce62014-07-15 14:52:22 -07001500static struct clk_branch rgb_tv_clk = {
1501 .halt_reg = 0x0240,
1502 .halt_bit = 27,
1503 .clkr = {
1504 .enable_reg = 0x0124,
1505 .enable_mask = BIT(14),
1506 .hw.init = &(struct clk_init_data){
1507 .parent_names = tv_src_name,
1508 .num_parents = 1,
1509 .name = "rgb_tv_clk",
1510 .ops = &clk_branch_ops,
1511 .flags = CLK_SET_RATE_PARENT,
1512 },
1513 },
1514};
1515
1516static struct clk_branch npl_tv_clk = {
1517 .halt_reg = 0x0240,
1518 .halt_bit = 26,
1519 .clkr = {
1520 .enable_reg = 0x0124,
1521 .enable_mask = BIT(16),
1522 .hw.init = &(struct clk_init_data){
1523 .parent_names = tv_src_name,
1524 .num_parents = 1,
1525 .name = "npl_tv_clk",
1526 .ops = &clk_branch_ops,
1527 .flags = CLK_SET_RATE_PARENT,
1528 },
1529 },
1530};
1531
Stephen Boyd6d00b562014-01-15 10:47:29 -08001532static struct clk_branch hdmi_app_clk = {
1533 .halt_reg = 0x01cc,
1534 .halt_bit = 25,
1535 .clkr = {
1536 .enable_reg = 0x005c,
1537 .enable_mask = BIT(11),
1538 .hw.init = &(struct clk_init_data){
1539 .parent_names = (const char *[]){ "pxo" },
1540 .num_parents = 1,
1541 .name = "hdmi_app_clk",
1542 .ops = &clk_branch_ops,
1543 },
1544 },
1545};
1546
1547static struct freq_tbl clk_tbl_vcodec[] = {
Stephen Boydff207832014-07-08 18:36:06 -07001548 F_MN( 27000000, P_PXO, 1, 0),
1549 F_MN( 32000000, P_PLL8, 1, 12),
1550 F_MN( 48000000, P_PLL8, 1, 8),
1551 F_MN( 54860000, P_PLL8, 1, 7),
1552 F_MN( 96000000, P_PLL8, 1, 4),
1553 F_MN(133330000, P_PLL2, 1, 6),
1554 F_MN(200000000, P_PLL2, 1, 4),
1555 F_MN(228570000, P_PLL2, 2, 7),
1556 F_MN(266670000, P_PLL2, 1, 3),
Stephen Boyd6d00b562014-01-15 10:47:29 -08001557 { }
1558};
1559
1560static struct clk_dyn_rcg vcodec_src = {
Stephen Boyd229fd4a2014-04-28 15:59:16 -07001561 .ns_reg[0] = 0x0100,
1562 .ns_reg[1] = 0x0100,
Stephen Boyd6d00b562014-01-15 10:47:29 -08001563 .md_reg[0] = 0x00fc,
1564 .md_reg[1] = 0x0128,
Stephen Boyd229fd4a2014-04-28 15:59:16 -07001565 .bank_reg = 0x00f8,
Stephen Boyd6d00b562014-01-15 10:47:29 -08001566 .mn[0] = {
1567 .mnctr_en_bit = 5,
1568 .mnctr_reset_bit = 31,
1569 .mnctr_mode_shift = 6,
1570 .n_val_shift = 11,
1571 .m_val_shift = 8,
1572 .width = 8,
1573 },
1574 .mn[1] = {
1575 .mnctr_en_bit = 10,
1576 .mnctr_reset_bit = 30,
1577 .mnctr_mode_shift = 11,
1578 .n_val_shift = 19,
1579 .m_val_shift = 8,
1580 .width = 8,
1581 },
1582 .s[0] = {
1583 .src_sel_shift = 27,
1584 .parent_map = mmcc_pxo_pll8_pll2_map,
1585 },
1586 .s[1] = {
1587 .src_sel_shift = 0,
1588 .parent_map = mmcc_pxo_pll8_pll2_map,
1589 },
1590 .mux_sel_bit = 13,
1591 .freq_tbl = clk_tbl_vcodec,
1592 .clkr = {
1593 .enable_reg = 0x00f8,
1594 .enable_mask = BIT(2),
1595 .hw.init = &(struct clk_init_data){
1596 .name = "vcodec_src",
1597 .parent_names = mmcc_pxo_pll8_pll2,
1598 .num_parents = 3,
1599 .ops = &clk_dyn_rcg_ops,
1600 },
1601 },
1602};
1603
1604static struct clk_branch vcodec_clk = {
1605 .halt_reg = 0x01d0,
1606 .halt_bit = 29,
1607 .clkr = {
1608 .enable_reg = 0x00f8,
1609 .enable_mask = BIT(0),
1610 .hw.init = &(struct clk_init_data){
1611 .name = "vcodec_clk",
1612 .parent_names = (const char *[]){ "vcodec_src" },
1613 .num_parents = 1,
1614 .ops = &clk_branch_ops,
1615 .flags = CLK_SET_RATE_PARENT,
1616 },
1617 },
1618};
1619
1620static struct freq_tbl clk_tbl_vpe[] = {
1621 { 27000000, P_PXO, 1 },
1622 { 34909000, P_PLL8, 11 },
1623 { 38400000, P_PLL8, 10 },
1624 { 64000000, P_PLL8, 6 },
1625 { 76800000, P_PLL8, 5 },
1626 { 96000000, P_PLL8, 4 },
1627 { 100000000, P_PLL2, 8 },
1628 { 160000000, P_PLL2, 5 },
1629 { }
1630};
1631
1632static struct clk_rcg vpe_src = {
1633 .ns_reg = 0x0118,
1634 .p = {
1635 .pre_div_shift = 12,
1636 .pre_div_width = 4,
1637 },
1638 .s = {
1639 .src_sel_shift = 0,
1640 .parent_map = mmcc_pxo_pll8_pll2_map,
1641 },
1642 .freq_tbl = clk_tbl_vpe,
1643 .clkr = {
1644 .enable_reg = 0x0110,
1645 .enable_mask = BIT(2),
1646 .hw.init = &(struct clk_init_data){
1647 .name = "vpe_src",
1648 .parent_names = mmcc_pxo_pll8_pll2,
1649 .num_parents = 3,
1650 .ops = &clk_rcg_ops,
1651 },
1652 },
1653};
1654
1655static struct clk_branch vpe_clk = {
1656 .halt_reg = 0x01c8,
1657 .halt_bit = 28,
1658 .clkr = {
1659 .enable_reg = 0x0110,
1660 .enable_mask = BIT(0),
1661 .hw.init = &(struct clk_init_data){
1662 .name = "vpe_clk",
1663 .parent_names = (const char *[]){ "vpe_src" },
1664 .num_parents = 1,
1665 .ops = &clk_branch_ops,
1666 .flags = CLK_SET_RATE_PARENT,
1667 },
1668 },
1669};
1670
1671static struct freq_tbl clk_tbl_vfe[] = {
1672 { 13960000, P_PLL8, 1, 2, 55 },
1673 { 27000000, P_PXO, 1, 0, 0 },
1674 { 36570000, P_PLL8, 1, 2, 21 },
1675 { 38400000, P_PLL8, 2, 1, 5 },
1676 { 45180000, P_PLL8, 1, 2, 17 },
1677 { 48000000, P_PLL8, 2, 1, 4 },
1678 { 54860000, P_PLL8, 1, 1, 7 },
1679 { 64000000, P_PLL8, 2, 1, 3 },
1680 { 76800000, P_PLL8, 1, 1, 5 },
1681 { 96000000, P_PLL8, 2, 1, 2 },
1682 { 109710000, P_PLL8, 1, 2, 7 },
1683 { 128000000, P_PLL8, 1, 1, 3 },
1684 { 153600000, P_PLL8, 1, 2, 5 },
1685 { 200000000, P_PLL2, 2, 1, 2 },
1686 { 228570000, P_PLL2, 1, 2, 7 },
1687 { 266667000, P_PLL2, 1, 1, 3 },
1688 { 320000000, P_PLL2, 1, 2, 5 },
1689 { }
1690};
1691
1692static struct clk_rcg vfe_src = {
1693 .ns_reg = 0x0108,
1694 .mn = {
1695 .mnctr_en_bit = 5,
1696 .mnctr_reset_bit = 7,
1697 .mnctr_mode_shift = 6,
1698 .n_val_shift = 16,
1699 .m_val_shift = 8,
1700 .width = 8,
1701 },
1702 .p = {
1703 .pre_div_shift = 10,
1704 .pre_div_width = 1,
1705 },
1706 .s = {
1707 .src_sel_shift = 0,
1708 .parent_map = mmcc_pxo_pll8_pll2_map,
1709 },
1710 .freq_tbl = clk_tbl_vfe,
1711 .clkr = {
1712 .enable_reg = 0x0104,
1713 .enable_mask = BIT(2),
1714 .hw.init = &(struct clk_init_data){
1715 .name = "vfe_src",
1716 .parent_names = mmcc_pxo_pll8_pll2,
1717 .num_parents = 3,
1718 .ops = &clk_rcg_ops,
1719 },
1720 },
1721};
1722
1723static struct clk_branch vfe_clk = {
1724 .halt_reg = 0x01cc,
1725 .halt_bit = 6,
1726 .clkr = {
1727 .enable_reg = 0x0104,
1728 .enable_mask = BIT(0),
1729 .hw.init = &(struct clk_init_data){
1730 .name = "vfe_clk",
1731 .parent_names = (const char *[]){ "vfe_src" },
1732 .num_parents = 1,
1733 .ops = &clk_branch_ops,
1734 .flags = CLK_SET_RATE_PARENT,
1735 },
1736 },
1737};
1738
1739static struct clk_branch vfe_csi_clk = {
1740 .halt_reg = 0x01cc,
1741 .halt_bit = 8,
1742 .clkr = {
1743 .enable_reg = 0x0104,
1744 .enable_mask = BIT(12),
1745 .hw.init = &(struct clk_init_data){
1746 .parent_names = (const char *[]){ "vfe_src" },
1747 .num_parents = 1,
1748 .name = "vfe_csi_clk",
1749 .ops = &clk_branch_ops,
1750 .flags = CLK_SET_RATE_PARENT,
1751 },
1752 },
1753};
1754
1755static struct clk_branch gmem_axi_clk = {
1756 .halt_reg = 0x01d8,
1757 .halt_bit = 6,
1758 .clkr = {
1759 .enable_reg = 0x0018,
1760 .enable_mask = BIT(24),
1761 .hw.init = &(struct clk_init_data){
1762 .name = "gmem_axi_clk",
1763 .ops = &clk_branch_ops,
1764 .flags = CLK_IS_ROOT,
1765 },
1766 },
1767};
1768
1769static struct clk_branch ijpeg_axi_clk = {
1770 .hwcg_reg = 0x0018,
1771 .hwcg_bit = 11,
1772 .halt_reg = 0x01d8,
1773 .halt_bit = 4,
1774 .clkr = {
1775 .enable_reg = 0x0018,
1776 .enable_mask = BIT(21),
1777 .hw.init = &(struct clk_init_data){
1778 .name = "ijpeg_axi_clk",
1779 .ops = &clk_branch_ops,
1780 .flags = CLK_IS_ROOT,
1781 },
1782 },
1783};
1784
1785static struct clk_branch mmss_imem_axi_clk = {
1786 .hwcg_reg = 0x0018,
1787 .hwcg_bit = 15,
1788 .halt_reg = 0x01d8,
1789 .halt_bit = 7,
1790 .clkr = {
1791 .enable_reg = 0x0018,
1792 .enable_mask = BIT(22),
1793 .hw.init = &(struct clk_init_data){
1794 .name = "mmss_imem_axi_clk",
1795 .ops = &clk_branch_ops,
1796 .flags = CLK_IS_ROOT,
1797 },
1798 },
1799};
1800
1801static struct clk_branch jpegd_axi_clk = {
1802 .halt_reg = 0x01d8,
1803 .halt_bit = 5,
1804 .clkr = {
1805 .enable_reg = 0x0018,
1806 .enable_mask = BIT(25),
1807 .hw.init = &(struct clk_init_data){
1808 .name = "jpegd_axi_clk",
1809 .ops = &clk_branch_ops,
1810 .flags = CLK_IS_ROOT,
1811 },
1812 },
1813};
1814
1815static struct clk_branch vcodec_axi_b_clk = {
1816 .hwcg_reg = 0x0114,
1817 .hwcg_bit = 22,
1818 .halt_reg = 0x01e8,
1819 .halt_bit = 25,
1820 .clkr = {
1821 .enable_reg = 0x0114,
1822 .enable_mask = BIT(23),
1823 .hw.init = &(struct clk_init_data){
1824 .name = "vcodec_axi_b_clk",
1825 .ops = &clk_branch_ops,
1826 .flags = CLK_IS_ROOT,
1827 },
1828 },
1829};
1830
1831static struct clk_branch vcodec_axi_a_clk = {
1832 .hwcg_reg = 0x0114,
1833 .hwcg_bit = 24,
1834 .halt_reg = 0x01e8,
1835 .halt_bit = 26,
1836 .clkr = {
1837 .enable_reg = 0x0114,
1838 .enable_mask = BIT(25),
1839 .hw.init = &(struct clk_init_data){
1840 .name = "vcodec_axi_a_clk",
1841 .ops = &clk_branch_ops,
1842 .flags = CLK_IS_ROOT,
1843 },
1844 },
1845};
1846
1847static struct clk_branch vcodec_axi_clk = {
1848 .hwcg_reg = 0x0018,
1849 .hwcg_bit = 13,
1850 .halt_reg = 0x01d8,
1851 .halt_bit = 3,
1852 .clkr = {
1853 .enable_reg = 0x0018,
1854 .enable_mask = BIT(19),
1855 .hw.init = &(struct clk_init_data){
1856 .name = "vcodec_axi_clk",
1857 .ops = &clk_branch_ops,
1858 .flags = CLK_IS_ROOT,
1859 },
1860 },
1861};
1862
1863static struct clk_branch vfe_axi_clk = {
1864 .halt_reg = 0x01d8,
1865 .halt_bit = 0,
1866 .clkr = {
1867 .enable_reg = 0x0018,
1868 .enable_mask = BIT(18),
1869 .hw.init = &(struct clk_init_data){
1870 .name = "vfe_axi_clk",
1871 .ops = &clk_branch_ops,
1872 .flags = CLK_IS_ROOT,
1873 },
1874 },
1875};
1876
1877static struct clk_branch mdp_axi_clk = {
1878 .hwcg_reg = 0x0018,
1879 .hwcg_bit = 16,
1880 .halt_reg = 0x01d8,
1881 .halt_bit = 8,
1882 .clkr = {
1883 .enable_reg = 0x0018,
1884 .enable_mask = BIT(23),
1885 .hw.init = &(struct clk_init_data){
1886 .name = "mdp_axi_clk",
1887 .ops = &clk_branch_ops,
1888 .flags = CLK_IS_ROOT,
1889 },
1890 },
1891};
1892
1893static struct clk_branch rot_axi_clk = {
1894 .hwcg_reg = 0x0020,
1895 .hwcg_bit = 25,
1896 .halt_reg = 0x01d8,
1897 .halt_bit = 2,
1898 .clkr = {
1899 .enable_reg = 0x0020,
1900 .enable_mask = BIT(24),
1901 .hw.init = &(struct clk_init_data){
1902 .name = "rot_axi_clk",
1903 .ops = &clk_branch_ops,
1904 .flags = CLK_IS_ROOT,
1905 },
1906 },
1907};
1908
Stephen Boyde216ce62014-07-15 14:52:22 -07001909static struct clk_branch vcap_axi_clk = {
1910 .halt_reg = 0x0240,
1911 .halt_bit = 20,
1912 .hwcg_reg = 0x0244,
1913 .hwcg_bit = 11,
1914 .clkr = {
1915 .enable_reg = 0x0244,
1916 .enable_mask = BIT(12),
1917 .hw.init = &(struct clk_init_data){
1918 .name = "vcap_axi_clk",
1919 .ops = &clk_branch_ops,
1920 .flags = CLK_IS_ROOT,
1921 },
1922 },
1923};
1924
Stephen Boyd6d00b562014-01-15 10:47:29 -08001925static struct clk_branch vpe_axi_clk = {
1926 .hwcg_reg = 0x0020,
1927 .hwcg_bit = 27,
1928 .halt_reg = 0x01d8,
1929 .halt_bit = 1,
1930 .clkr = {
1931 .enable_reg = 0x0020,
1932 .enable_mask = BIT(26),
1933 .hw.init = &(struct clk_init_data){
1934 .name = "vpe_axi_clk",
1935 .ops = &clk_branch_ops,
1936 .flags = CLK_IS_ROOT,
1937 },
1938 },
1939};
1940
1941static struct clk_branch gfx3d_axi_clk = {
1942 .hwcg_reg = 0x0244,
1943 .hwcg_bit = 24,
1944 .halt_reg = 0x0240,
1945 .halt_bit = 30,
1946 .clkr = {
1947 .enable_reg = 0x0244,
1948 .enable_mask = BIT(25),
1949 .hw.init = &(struct clk_init_data){
1950 .name = "gfx3d_axi_clk",
1951 .ops = &clk_branch_ops,
1952 .flags = CLK_IS_ROOT,
1953 },
1954 },
1955};
1956
1957static struct clk_branch amp_ahb_clk = {
1958 .halt_reg = 0x01dc,
1959 .halt_bit = 18,
1960 .clkr = {
1961 .enable_reg = 0x0008,
1962 .enable_mask = BIT(24),
1963 .hw.init = &(struct clk_init_data){
1964 .name = "amp_ahb_clk",
1965 .ops = &clk_branch_ops,
1966 .flags = CLK_IS_ROOT,
1967 },
1968 },
1969};
1970
1971static struct clk_branch csi_ahb_clk = {
1972 .halt_reg = 0x01dc,
1973 .halt_bit = 16,
1974 .clkr = {
1975 .enable_reg = 0x0008,
1976 .enable_mask = BIT(7),
1977 .hw.init = &(struct clk_init_data){
1978 .name = "csi_ahb_clk",
1979 .ops = &clk_branch_ops,
1980 .flags = CLK_IS_ROOT
1981 },
1982 },
1983};
1984
1985static struct clk_branch dsi_m_ahb_clk = {
1986 .halt_reg = 0x01dc,
1987 .halt_bit = 19,
1988 .clkr = {
1989 .enable_reg = 0x0008,
1990 .enable_mask = BIT(9),
1991 .hw.init = &(struct clk_init_data){
1992 .name = "dsi_m_ahb_clk",
1993 .ops = &clk_branch_ops,
1994 .flags = CLK_IS_ROOT,
1995 },
1996 },
1997};
1998
1999static struct clk_branch dsi_s_ahb_clk = {
2000 .hwcg_reg = 0x0038,
2001 .hwcg_bit = 20,
2002 .halt_reg = 0x01dc,
2003 .halt_bit = 21,
2004 .clkr = {
2005 .enable_reg = 0x0008,
2006 .enable_mask = BIT(18),
2007 .hw.init = &(struct clk_init_data){
2008 .name = "dsi_s_ahb_clk",
2009 .ops = &clk_branch_ops,
2010 .flags = CLK_IS_ROOT,
2011 },
2012 },
2013};
2014
2015static struct clk_branch dsi2_m_ahb_clk = {
2016 .halt_reg = 0x01d8,
2017 .halt_bit = 18,
2018 .clkr = {
2019 .enable_reg = 0x0008,
2020 .enable_mask = BIT(17),
2021 .hw.init = &(struct clk_init_data){
2022 .name = "dsi2_m_ahb_clk",
2023 .ops = &clk_branch_ops,
2024 .flags = CLK_IS_ROOT
2025 },
2026 },
2027};
2028
2029static struct clk_branch dsi2_s_ahb_clk = {
2030 .hwcg_reg = 0x0038,
2031 .hwcg_bit = 15,
2032 .halt_reg = 0x01dc,
2033 .halt_bit = 20,
2034 .clkr = {
2035 .enable_reg = 0x0008,
2036 .enable_mask = BIT(22),
2037 .hw.init = &(struct clk_init_data){
2038 .name = "dsi2_s_ahb_clk",
2039 .ops = &clk_branch_ops,
2040 .flags = CLK_IS_ROOT,
2041 },
2042 },
2043};
2044
2045static struct clk_branch gfx2d0_ahb_clk = {
2046 .hwcg_reg = 0x0038,
2047 .hwcg_bit = 28,
2048 .halt_reg = 0x01dc,
2049 .halt_bit = 2,
2050 .clkr = {
2051 .enable_reg = 0x0008,
2052 .enable_mask = BIT(19),
2053 .hw.init = &(struct clk_init_data){
2054 .name = "gfx2d0_ahb_clk",
2055 .ops = &clk_branch_ops,
2056 .flags = CLK_IS_ROOT,
2057 },
2058 },
2059};
2060
2061static struct clk_branch gfx2d1_ahb_clk = {
2062 .hwcg_reg = 0x0038,
2063 .hwcg_bit = 29,
2064 .halt_reg = 0x01dc,
2065 .halt_bit = 3,
2066 .clkr = {
2067 .enable_reg = 0x0008,
2068 .enable_mask = BIT(2),
2069 .hw.init = &(struct clk_init_data){
2070 .name = "gfx2d1_ahb_clk",
2071 .ops = &clk_branch_ops,
2072 .flags = CLK_IS_ROOT,
2073 },
2074 },
2075};
2076
2077static struct clk_branch gfx3d_ahb_clk = {
2078 .hwcg_reg = 0x0038,
2079 .hwcg_bit = 27,
2080 .halt_reg = 0x01dc,
2081 .halt_bit = 4,
2082 .clkr = {
2083 .enable_reg = 0x0008,
2084 .enable_mask = BIT(3),
2085 .hw.init = &(struct clk_init_data){
2086 .name = "gfx3d_ahb_clk",
2087 .ops = &clk_branch_ops,
2088 .flags = CLK_IS_ROOT,
2089 },
2090 },
2091};
2092
2093static struct clk_branch hdmi_m_ahb_clk = {
2094 .hwcg_reg = 0x0038,
2095 .hwcg_bit = 21,
2096 .halt_reg = 0x01dc,
2097 .halt_bit = 5,
2098 .clkr = {
2099 .enable_reg = 0x0008,
2100 .enable_mask = BIT(14),
2101 .hw.init = &(struct clk_init_data){
2102 .name = "hdmi_m_ahb_clk",
2103 .ops = &clk_branch_ops,
2104 .flags = CLK_IS_ROOT,
2105 },
2106 },
2107};
2108
2109static struct clk_branch hdmi_s_ahb_clk = {
2110 .hwcg_reg = 0x0038,
2111 .hwcg_bit = 22,
2112 .halt_reg = 0x01dc,
2113 .halt_bit = 6,
2114 .clkr = {
2115 .enable_reg = 0x0008,
2116 .enable_mask = BIT(4),
2117 .hw.init = &(struct clk_init_data){
2118 .name = "hdmi_s_ahb_clk",
2119 .ops = &clk_branch_ops,
2120 .flags = CLK_IS_ROOT,
2121 },
2122 },
2123};
2124
2125static struct clk_branch ijpeg_ahb_clk = {
2126 .halt_reg = 0x01dc,
2127 .halt_bit = 9,
2128 .clkr = {
2129 .enable_reg = 0x0008,
2130 .enable_mask = BIT(5),
2131 .hw.init = &(struct clk_init_data){
2132 .name = "ijpeg_ahb_clk",
2133 .ops = &clk_branch_ops,
2134 .flags = CLK_IS_ROOT
2135 },
2136 },
2137};
2138
2139static struct clk_branch mmss_imem_ahb_clk = {
2140 .hwcg_reg = 0x0038,
2141 .hwcg_bit = 12,
2142 .halt_reg = 0x01dc,
2143 .halt_bit = 10,
2144 .clkr = {
2145 .enable_reg = 0x0008,
2146 .enable_mask = BIT(6),
2147 .hw.init = &(struct clk_init_data){
2148 .name = "mmss_imem_ahb_clk",
2149 .ops = &clk_branch_ops,
2150 .flags = CLK_IS_ROOT
2151 },
2152 },
2153};
2154
2155static struct clk_branch jpegd_ahb_clk = {
2156 .halt_reg = 0x01dc,
2157 .halt_bit = 7,
2158 .clkr = {
2159 .enable_reg = 0x0008,
2160 .enable_mask = BIT(21),
2161 .hw.init = &(struct clk_init_data){
2162 .name = "jpegd_ahb_clk",
2163 .ops = &clk_branch_ops,
2164 .flags = CLK_IS_ROOT,
2165 },
2166 },
2167};
2168
2169static struct clk_branch mdp_ahb_clk = {
2170 .halt_reg = 0x01dc,
2171 .halt_bit = 11,
2172 .clkr = {
2173 .enable_reg = 0x0008,
2174 .enable_mask = BIT(10),
2175 .hw.init = &(struct clk_init_data){
2176 .name = "mdp_ahb_clk",
2177 .ops = &clk_branch_ops,
2178 .flags = CLK_IS_ROOT,
2179 },
2180 },
2181};
2182
2183static struct clk_branch rot_ahb_clk = {
2184 .halt_reg = 0x01dc,
2185 .halt_bit = 13,
2186 .clkr = {
2187 .enable_reg = 0x0008,
2188 .enable_mask = BIT(12),
2189 .hw.init = &(struct clk_init_data){
2190 .name = "rot_ahb_clk",
2191 .ops = &clk_branch_ops,
2192 .flags = CLK_IS_ROOT
2193 },
2194 },
2195};
2196
2197static struct clk_branch smmu_ahb_clk = {
2198 .hwcg_reg = 0x0008,
2199 .hwcg_bit = 26,
2200 .halt_reg = 0x01dc,
2201 .halt_bit = 22,
2202 .clkr = {
2203 .enable_reg = 0x0008,
2204 .enable_mask = BIT(15),
2205 .hw.init = &(struct clk_init_data){
2206 .name = "smmu_ahb_clk",
2207 .ops = &clk_branch_ops,
2208 .flags = CLK_IS_ROOT,
2209 },
2210 },
2211};
2212
2213static struct clk_branch tv_enc_ahb_clk = {
2214 .halt_reg = 0x01dc,
2215 .halt_bit = 23,
2216 .clkr = {
2217 .enable_reg = 0x0008,
2218 .enable_mask = BIT(25),
2219 .hw.init = &(struct clk_init_data){
2220 .name = "tv_enc_ahb_clk",
2221 .ops = &clk_branch_ops,
2222 .flags = CLK_IS_ROOT,
2223 },
2224 },
2225};
2226
Stephen Boyde216ce62014-07-15 14:52:22 -07002227static struct clk_branch vcap_ahb_clk = {
2228 .halt_reg = 0x0240,
2229 .halt_bit = 23,
2230 .clkr = {
2231 .enable_reg = 0x0248,
2232 .enable_mask = BIT(1),
2233 .hw.init = &(struct clk_init_data){
2234 .name = "vcap_ahb_clk",
2235 .ops = &clk_branch_ops,
2236 .flags = CLK_IS_ROOT,
2237 },
2238 },
2239};
2240
Stephen Boyd6d00b562014-01-15 10:47:29 -08002241static struct clk_branch vcodec_ahb_clk = {
2242 .hwcg_reg = 0x0038,
2243 .hwcg_bit = 26,
2244 .halt_reg = 0x01dc,
2245 .halt_bit = 12,
2246 .clkr = {
2247 .enable_reg = 0x0008,
2248 .enable_mask = BIT(11),
2249 .hw.init = &(struct clk_init_data){
2250 .name = "vcodec_ahb_clk",
2251 .ops = &clk_branch_ops,
2252 .flags = CLK_IS_ROOT,
2253 },
2254 },
2255};
2256
2257static struct clk_branch vfe_ahb_clk = {
2258 .halt_reg = 0x01dc,
2259 .halt_bit = 14,
2260 .clkr = {
2261 .enable_reg = 0x0008,
2262 .enable_mask = BIT(13),
2263 .hw.init = &(struct clk_init_data){
2264 .name = "vfe_ahb_clk",
2265 .ops = &clk_branch_ops,
2266 .flags = CLK_IS_ROOT,
2267 },
2268 },
2269};
2270
2271static struct clk_branch vpe_ahb_clk = {
2272 .halt_reg = 0x01dc,
2273 .halt_bit = 15,
2274 .clkr = {
2275 .enable_reg = 0x0008,
2276 .enable_mask = BIT(16),
2277 .hw.init = &(struct clk_init_data){
2278 .name = "vpe_ahb_clk",
2279 .ops = &clk_branch_ops,
2280 .flags = CLK_IS_ROOT,
2281 },
2282 },
2283};
2284
2285static struct clk_regmap *mmcc_msm8960_clks[] = {
2286 [TV_ENC_AHB_CLK] = &tv_enc_ahb_clk.clkr,
2287 [AMP_AHB_CLK] = &amp_ahb_clk.clkr,
2288 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
2289 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
2290 [GFX2D0_AHB_CLK] = &gfx2d0_ahb_clk.clkr,
2291 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
2292 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
2293 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
2294 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
2295 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
2296 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
2297 [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
2298 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
2299 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
2300 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
2301 [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
2302 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
2303 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
2304 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
2305 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
2306 [GFX2D1_AHB_CLK] = &gfx2d1_ahb_clk.clkr,
2307 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
2308 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
2309 [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
2310 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
2311 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
2312 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
2313 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
2314 [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
2315 [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
2316 [ROT_AXI_CLK] = &rot_axi_clk.clkr,
2317 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
2318 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
2319 [CSI0_SRC] = &csi0_src.clkr,
2320 [CSI0_CLK] = &csi0_clk.clkr,
2321 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
2322 [CSI1_SRC] = &csi1_src.clkr,
2323 [CSI1_CLK] = &csi1_clk.clkr,
2324 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
2325 [CSI2_SRC] = &csi2_src.clkr,
2326 [CSI2_CLK] = &csi2_clk.clkr,
2327 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
2328 [CSI_PIX_CLK] = &csi_pix_clk.clkr,
2329 [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
2330 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
2331 [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
2332 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
2333 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
2334 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
2335 [GFX2D0_SRC] = &gfx2d0_src.clkr,
2336 [GFX2D0_CLK] = &gfx2d0_clk.clkr,
2337 [GFX2D1_SRC] = &gfx2d1_src.clkr,
2338 [GFX2D1_CLK] = &gfx2d1_clk.clkr,
2339 [GFX3D_SRC] = &gfx3d_src.clkr,
2340 [GFX3D_CLK] = &gfx3d_clk.clkr,
2341 [IJPEG_SRC] = &ijpeg_src.clkr,
2342 [IJPEG_CLK] = &ijpeg_clk.clkr,
2343 [JPEGD_SRC] = &jpegd_src.clkr,
2344 [JPEGD_CLK] = &jpegd_clk.clkr,
2345 [MDP_SRC] = &mdp_src.clkr,
2346 [MDP_CLK] = &mdp_clk.clkr,
2347 [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
2348 [ROT_SRC] = &rot_src.clkr,
2349 [ROT_CLK] = &rot_clk.clkr,
2350 [TV_ENC_CLK] = &tv_enc_clk.clkr,
2351 [TV_DAC_CLK] = &tv_dac_clk.clkr,
2352 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
2353 [MDP_TV_CLK] = &mdp_tv_clk.clkr,
2354 [TV_SRC] = &tv_src.clkr,
2355 [VCODEC_SRC] = &vcodec_src.clkr,
2356 [VCODEC_CLK] = &vcodec_clk.clkr,
2357 [VFE_SRC] = &vfe_src.clkr,
2358 [VFE_CLK] = &vfe_clk.clkr,
2359 [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
2360 [VPE_SRC] = &vpe_src.clkr,
2361 [VPE_CLK] = &vpe_clk.clkr,
2362 [CAMCLK0_SRC] = &camclk0_src.clkr,
2363 [CAMCLK0_CLK] = &camclk0_clk.clkr,
2364 [CAMCLK1_SRC] = &camclk1_src.clkr,
2365 [CAMCLK1_CLK] = &camclk1_clk.clkr,
2366 [CAMCLK2_SRC] = &camclk2_src.clkr,
2367 [CAMCLK2_CLK] = &camclk2_clk.clkr,
2368 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
2369 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
2370 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
2371 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
2372 [PLL2] = &pll2.clkr,
2373};
2374
2375static const struct qcom_reset_map mmcc_msm8960_resets[] = {
2376 [VPE_AXI_RESET] = { 0x0208, 15 },
2377 [IJPEG_AXI_RESET] = { 0x0208, 14 },
2378 [MPD_AXI_RESET] = { 0x0208, 13 },
2379 [VFE_AXI_RESET] = { 0x0208, 9 },
2380 [SP_AXI_RESET] = { 0x0208, 8 },
2381 [VCODEC_AXI_RESET] = { 0x0208, 7 },
2382 [ROT_AXI_RESET] = { 0x0208, 6 },
2383 [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
2384 [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
2385 [FAB_S3_AXI_RESET] = { 0x0208, 3 },
2386 [FAB_S2_AXI_RESET] = { 0x0208, 2 },
2387 [FAB_S1_AXI_RESET] = { 0x0208, 1 },
2388 [FAB_S0_AXI_RESET] = { 0x0208 },
2389 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
2390 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
2391 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
2392 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
2393 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
2394 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
2395 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
2396 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
2397 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
2398 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
2399 [SMMU_GFX2D0_AHB_RESET] = { 0x020c, 21 },
2400 [SMMU_GFX2D1_AHB_RESET] = { 0x020c, 20 },
2401 [APU_AHB_RESET] = { 0x020c, 18 },
2402 [CSI_AHB_RESET] = { 0x020c, 17 },
2403 [TV_ENC_AHB_RESET] = { 0x020c, 15 },
2404 [VPE_AHB_RESET] = { 0x020c, 14 },
2405 [FABRIC_AHB_RESET] = { 0x020c, 13 },
2406 [GFX2D0_AHB_RESET] = { 0x020c, 12 },
2407 [GFX2D1_AHB_RESET] = { 0x020c, 11 },
2408 [GFX3D_AHB_RESET] = { 0x020c, 10 },
2409 [HDMI_AHB_RESET] = { 0x020c, 9 },
2410 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
2411 [IJPEG_AHB_RESET] = { 0x020c, 7 },
2412 [DSI_M_AHB_RESET] = { 0x020c, 6 },
2413 [DSI_S_AHB_RESET] = { 0x020c, 5 },
2414 [JPEGD_AHB_RESET] = { 0x020c, 4 },
2415 [MDP_AHB_RESET] = { 0x020c, 3 },
2416 [ROT_AHB_RESET] = { 0x020c, 2 },
2417 [VCODEC_AHB_RESET] = { 0x020c, 1 },
2418 [VFE_AHB_RESET] = { 0x020c, 0 },
2419 [DSI2_M_AHB_RESET] = { 0x0210, 31 },
2420 [DSI2_S_AHB_RESET] = { 0x0210, 30 },
2421 [CSIPHY2_RESET] = { 0x0210, 29 },
2422 [CSI_PIX1_RESET] = { 0x0210, 28 },
2423 [CSIPHY0_RESET] = { 0x0210, 27 },
2424 [CSIPHY1_RESET] = { 0x0210, 26 },
2425 [DSI2_RESET] = { 0x0210, 25 },
2426 [VFE_CSI_RESET] = { 0x0210, 24 },
2427 [MDP_RESET] = { 0x0210, 21 },
2428 [AMP_RESET] = { 0x0210, 20 },
2429 [JPEGD_RESET] = { 0x0210, 19 },
2430 [CSI1_RESET] = { 0x0210, 18 },
2431 [VPE_RESET] = { 0x0210, 17 },
2432 [MMSS_FABRIC_RESET] = { 0x0210, 16 },
2433 [VFE_RESET] = { 0x0210, 15 },
2434 [GFX2D0_RESET] = { 0x0210, 14 },
2435 [GFX2D1_RESET] = { 0x0210, 13 },
2436 [GFX3D_RESET] = { 0x0210, 12 },
2437 [HDMI_RESET] = { 0x0210, 11 },
2438 [MMSS_IMEM_RESET] = { 0x0210, 10 },
2439 [IJPEG_RESET] = { 0x0210, 9 },
2440 [CSI0_RESET] = { 0x0210, 8 },
2441 [DSI_RESET] = { 0x0210, 7 },
2442 [VCODEC_RESET] = { 0x0210, 6 },
2443 [MDP_TV_RESET] = { 0x0210, 4 },
2444 [MDP_VSYNC_RESET] = { 0x0210, 3 },
2445 [ROT_RESET] = { 0x0210, 2 },
2446 [TV_HDMI_RESET] = { 0x0210, 1 },
2447 [TV_ENC_RESET] = { 0x0210 },
2448 [CSI2_RESET] = { 0x0214, 2 },
2449 [CSI_RDI1_RESET] = { 0x0214, 1 },
2450 [CSI_RDI2_RESET] = { 0x0214 },
2451};
2452
Stephen Boyde216ce62014-07-15 14:52:22 -07002453static struct clk_regmap *mmcc_apq8064_clks[] = {
2454 [AMP_AHB_CLK] = &amp_ahb_clk.clkr,
2455 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
2456 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
2457 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
2458 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
2459 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
2460 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
2461 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
2462 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
2463 [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
2464 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
2465 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
2466 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
2467 [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
2468 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
2469 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
2470 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
2471 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
2472 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
2473 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
2474 [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
2475 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
2476 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
2477 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
2478 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
2479 [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
2480 [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
2481 [ROT_AXI_CLK] = &rot_axi_clk.clkr,
2482 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
2483 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
2484 [CSI0_SRC] = &csi0_src.clkr,
2485 [CSI0_CLK] = &csi0_clk.clkr,
2486 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
2487 [CSI1_SRC] = &csi1_src.clkr,
2488 [CSI1_CLK] = &csi1_clk.clkr,
2489 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
2490 [CSI2_SRC] = &csi2_src.clkr,
2491 [CSI2_CLK] = &csi2_clk.clkr,
2492 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
2493 [CSI_PIX_CLK] = &csi_pix_clk.clkr,
2494 [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
2495 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
2496 [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
2497 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
2498 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
2499 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
2500 [GFX3D_SRC] = &gfx3d_src.clkr,
2501 [GFX3D_CLK] = &gfx3d_clk.clkr,
2502 [IJPEG_SRC] = &ijpeg_src.clkr,
2503 [IJPEG_CLK] = &ijpeg_clk.clkr,
2504 [JPEGD_SRC] = &jpegd_src.clkr,
2505 [JPEGD_CLK] = &jpegd_clk.clkr,
2506 [MDP_SRC] = &mdp_src.clkr,
2507 [MDP_CLK] = &mdp_clk.clkr,
2508 [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
2509 [ROT_SRC] = &rot_src.clkr,
2510 [ROT_CLK] = &rot_clk.clkr,
2511 [TV_DAC_CLK] = &tv_dac_clk.clkr,
2512 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
2513 [MDP_TV_CLK] = &mdp_tv_clk.clkr,
2514 [TV_SRC] = &tv_src.clkr,
2515 [VCODEC_SRC] = &vcodec_src.clkr,
2516 [VCODEC_CLK] = &vcodec_clk.clkr,
2517 [VFE_SRC] = &vfe_src.clkr,
2518 [VFE_CLK] = &vfe_clk.clkr,
2519 [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
2520 [VPE_SRC] = &vpe_src.clkr,
2521 [VPE_CLK] = &vpe_clk.clkr,
2522 [CAMCLK0_SRC] = &camclk0_src.clkr,
2523 [CAMCLK0_CLK] = &camclk0_clk.clkr,
2524 [CAMCLK1_SRC] = &camclk1_src.clkr,
2525 [CAMCLK1_CLK] = &camclk1_clk.clkr,
2526 [CAMCLK2_SRC] = &camclk2_src.clkr,
2527 [CAMCLK2_CLK] = &camclk2_clk.clkr,
2528 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
2529 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
2530 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
2531 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
2532 [PLL2] = &pll2.clkr,
2533 [RGB_TV_CLK] = &rgb_tv_clk.clkr,
2534 [NPL_TV_CLK] = &npl_tv_clk.clkr,
2535 [VCAP_AHB_CLK] = &vcap_ahb_clk.clkr,
2536 [VCAP_AXI_CLK] = &vcap_axi_clk.clkr,
2537 [VCAP_SRC] = &vcap_src.clkr,
2538 [VCAP_CLK] = &vcap_clk.clkr,
2539 [VCAP_NPL_CLK] = &vcap_npl_clk.clkr,
2540 [PLL15] = &pll15.clkr,
2541};
2542
2543static const struct qcom_reset_map mmcc_apq8064_resets[] = {
2544 [GFX3D_AXI_RESET] = { 0x0208, 17 },
2545 [VCAP_AXI_RESET] = { 0x0208, 16 },
2546 [VPE_AXI_RESET] = { 0x0208, 15 },
2547 [IJPEG_AXI_RESET] = { 0x0208, 14 },
2548 [MPD_AXI_RESET] = { 0x0208, 13 },
2549 [VFE_AXI_RESET] = { 0x0208, 9 },
2550 [SP_AXI_RESET] = { 0x0208, 8 },
2551 [VCODEC_AXI_RESET] = { 0x0208, 7 },
2552 [ROT_AXI_RESET] = { 0x0208, 6 },
2553 [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
2554 [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
2555 [FAB_S3_AXI_RESET] = { 0x0208, 3 },
2556 [FAB_S2_AXI_RESET] = { 0x0208, 2 },
2557 [FAB_S1_AXI_RESET] = { 0x0208, 1 },
2558 [FAB_S0_AXI_RESET] = { 0x0208 },
2559 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
2560 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
2561 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
2562 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
2563 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
2564 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
2565 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
2566 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
2567 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
2568 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
2569 [APU_AHB_RESET] = { 0x020c, 18 },
2570 [CSI_AHB_RESET] = { 0x020c, 17 },
2571 [TV_ENC_AHB_RESET] = { 0x020c, 15 },
2572 [VPE_AHB_RESET] = { 0x020c, 14 },
2573 [FABRIC_AHB_RESET] = { 0x020c, 13 },
2574 [GFX3D_AHB_RESET] = { 0x020c, 10 },
2575 [HDMI_AHB_RESET] = { 0x020c, 9 },
2576 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
2577 [IJPEG_AHB_RESET] = { 0x020c, 7 },
2578 [DSI_M_AHB_RESET] = { 0x020c, 6 },
2579 [DSI_S_AHB_RESET] = { 0x020c, 5 },
2580 [JPEGD_AHB_RESET] = { 0x020c, 4 },
2581 [MDP_AHB_RESET] = { 0x020c, 3 },
2582 [ROT_AHB_RESET] = { 0x020c, 2 },
2583 [VCODEC_AHB_RESET] = { 0x020c, 1 },
2584 [VFE_AHB_RESET] = { 0x020c, 0 },
2585 [SMMU_VCAP_AHB_RESET] = { 0x0200, 3 },
2586 [VCAP_AHB_RESET] = { 0x0200, 2 },
2587 [DSI2_M_AHB_RESET] = { 0x0200, 1 },
2588 [DSI2_S_AHB_RESET] = { 0x0200, 0 },
2589 [CSIPHY2_RESET] = { 0x0210, 31 },
2590 [CSI_PIX1_RESET] = { 0x0210, 30 },
2591 [CSIPHY0_RESET] = { 0x0210, 29 },
2592 [CSIPHY1_RESET] = { 0x0210, 28 },
2593 [CSI_RDI_RESET] = { 0x0210, 27 },
2594 [CSI_PIX_RESET] = { 0x0210, 26 },
2595 [DSI2_RESET] = { 0x0210, 25 },
2596 [VFE_CSI_RESET] = { 0x0210, 24 },
2597 [MDP_RESET] = { 0x0210, 21 },
2598 [AMP_RESET] = { 0x0210, 20 },
2599 [JPEGD_RESET] = { 0x0210, 19 },
2600 [CSI1_RESET] = { 0x0210, 18 },
2601 [VPE_RESET] = { 0x0210, 17 },
2602 [MMSS_FABRIC_RESET] = { 0x0210, 16 },
2603 [VFE_RESET] = { 0x0210, 15 },
2604 [GFX3D_RESET] = { 0x0210, 12 },
2605 [HDMI_RESET] = { 0x0210, 11 },
2606 [MMSS_IMEM_RESET] = { 0x0210, 10 },
2607 [IJPEG_RESET] = { 0x0210, 9 },
2608 [CSI0_RESET] = { 0x0210, 8 },
2609 [DSI_RESET] = { 0x0210, 7 },
2610 [VCODEC_RESET] = { 0x0210, 6 },
2611 [MDP_TV_RESET] = { 0x0210, 4 },
2612 [MDP_VSYNC_RESET] = { 0x0210, 3 },
2613 [ROT_RESET] = { 0x0210, 2 },
2614 [TV_HDMI_RESET] = { 0x0210, 1 },
2615 [VCAP_NPL_RESET] = { 0x0214, 4 },
2616 [VCAP_RESET] = { 0x0214, 3 },
2617 [CSI2_RESET] = { 0x0214, 2 },
2618 [CSI_RDI1_RESET] = { 0x0214, 1 },
2619 [CSI_RDI2_RESET] = { 0x0214 },
2620};
2621
Stephen Boyd6d00b562014-01-15 10:47:29 -08002622static const struct regmap_config mmcc_msm8960_regmap_config = {
2623 .reg_bits = 32,
2624 .reg_stride = 4,
2625 .val_bits = 32,
2626 .max_register = 0x334,
2627 .fast_io = true,
2628};
2629
Stephen Boyde216ce62014-07-15 14:52:22 -07002630static const struct regmap_config mmcc_apq8064_regmap_config = {
2631 .reg_bits = 32,
2632 .reg_stride = 4,
2633 .val_bits = 32,
2634 .max_register = 0x350,
2635 .fast_io = true,
2636};
2637
Stephen Boyd49fc8252014-03-21 17:59:37 -07002638static const struct qcom_cc_desc mmcc_msm8960_desc = {
2639 .config = &mmcc_msm8960_regmap_config,
2640 .clks = mmcc_msm8960_clks,
2641 .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
2642 .resets = mmcc_msm8960_resets,
2643 .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
2644};
2645
Stephen Boyde216ce62014-07-15 14:52:22 -07002646static const struct qcom_cc_desc mmcc_apq8064_desc = {
2647 .config = &mmcc_apq8064_regmap_config,
2648 .clks = mmcc_apq8064_clks,
2649 .num_clks = ARRAY_SIZE(mmcc_apq8064_clks),
2650 .resets = mmcc_apq8064_resets,
2651 .num_resets = ARRAY_SIZE(mmcc_apq8064_resets),
2652};
2653
Stephen Boyd6d00b562014-01-15 10:47:29 -08002654static const struct of_device_id mmcc_msm8960_match_table[] = {
Stephen Boyde216ce62014-07-15 14:52:22 -07002655 { .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc },
2656 { .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc },
Stephen Boyd6d00b562014-01-15 10:47:29 -08002657 { }
2658};
2659MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
2660
Stephen Boyd6d00b562014-01-15 10:47:29 -08002661static int mmcc_msm8960_probe(struct platform_device *pdev)
2662{
Stephen Boyde216ce62014-07-15 14:52:22 -07002663 const struct of_device_id *match;
2664 struct regmap *regmap;
2665 bool is_8064;
2666 struct device *dev = &pdev->dev;
2667
2668 match = of_match_device(mmcc_msm8960_match_table, dev);
2669 if (!match)
2670 return -EINVAL;
2671
2672 is_8064 = of_device_is_compatible(dev->of_node, "qcom,mmcc-apq8064");
2673 if (is_8064) {
2674 gfx3d_src.freq_tbl = clk_tbl_gfx3d_8064;
2675 gfx3d_src.clkr.hw.init = &gfx3d_8064_init;
2676 gfx3d_src.s[0].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
2677 gfx3d_src.s[1].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
2678 }
2679
2680 regmap = qcom_cc_map(pdev, match->data);
2681 if (IS_ERR(regmap))
2682 return PTR_ERR(regmap);
2683
2684 clk_pll_configure_sr(&pll15, regmap, &pll15_config, false);
2685
2686 return qcom_cc_really_probe(pdev, match->data, regmap);
Stephen Boyd6d00b562014-01-15 10:47:29 -08002687}
2688
2689static int mmcc_msm8960_remove(struct platform_device *pdev)
2690{
Stephen Boyd49fc8252014-03-21 17:59:37 -07002691 qcom_cc_remove(pdev);
Stephen Boyd6d00b562014-01-15 10:47:29 -08002692 return 0;
2693}
2694
2695static struct platform_driver mmcc_msm8960_driver = {
2696 .probe = mmcc_msm8960_probe,
2697 .remove = mmcc_msm8960_remove,
2698 .driver = {
2699 .name = "mmcc-msm8960",
Stephen Boyd6d00b562014-01-15 10:47:29 -08002700 .of_match_table = mmcc_msm8960_match_table,
2701 },
2702};
2703
2704module_platform_driver(mmcc_msm8960_driver);
2705
2706MODULE_DESCRIPTION("QCOM MMCC MSM8960 Driver");
2707MODULE_LICENSE("GPL v2");
2708MODULE_ALIAS("platform:mmcc-msm8960");