1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
6 #include <linux/kernel.h>
7 #include <linux/bitops.h>
9 #include <linux/delay.h>
10 #include <linux/platform_device.h>
11 #include <linux/property.h>
12 #include <linux/module.h>
14 #include <linux/clk.h>
15 #include <linux/clk-provider.h>
16 #include <linux/regmap.h>
17 #include <linux/reset-controller.h>
19 #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
20 #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
23 #include "clk-regmap.h"
26 #include "clk-branch.h"
43 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
45 static struct clk_pll pll2 = {
53 .clkr.hw.init = &(struct clk_init_data){
55 .parent_data = (const struct clk_parent_data[]){
56 { .fw_name = "pxo", .name = "pxo_board" },
63 static struct clk_pll pll15 = {
71 .clkr.hw.init = &(struct clk_init_data){
73 .parent_data = (const struct clk_parent_data[]){
74 { .fw_name = "pxo", .name = "pxo_board" },
81 static const struct pll_config pll15_config = {
86 .vco_mask = 0x3 << 16,
88 .pre_div_mask = BIT(19),
90 .post_div_mask = 0x3 << 20,
91 .mn_ena_mask = BIT(22),
92 .main_output_mask = BIT(23),
95 static const struct parent_map mmcc_pxo_pll8_pll2_map[] = {
101 static const struct clk_parent_data mmcc_pxo_pll8_pll2[] = {
102 { .fw_name = "pxo", .name = "pxo_board" },
103 { .fw_name = "pll8_vote", .name = "pll8_vote" },
104 { .hw = &pll2.clkr.hw },
107 static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = {
114 static const struct clk_parent_data mmcc_pxo_pll8_pll2_pll15[] = {
115 { .fw_name = "pxo", .name = "pxo_board" },
116 { .fw_name = "pll8_vote", .name = "pll8_vote" },
117 { .hw = &pll2.clkr.hw },
118 { .hw = &pll15.clkr.hw },
121 static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = {
128 static const struct clk_parent_data mmcc_pxo_pll8_pll2_pll3[] = {
129 { .fw_name = "pxo", .name = "pxo_board" },
130 { .fw_name = "pll8_vote", .name = "pll8_vote" },
131 { .hw = &pll2.clkr.hw },
132 { .fw_name = "pll3", .name = "pll3" },
135 static const struct parent_map mmcc_pxo_dsi2_dsi1_map[] = {
137 { P_DSI2_PLL_DSICLK, 1 },
138 { P_DSI1_PLL_DSICLK, 3 },
141 static const struct clk_parent_data mmcc_pxo_dsi2_dsi1[] = {
142 { .fw_name = "pxo", .name = "pxo_board" },
143 { .fw_name = "dsi2pll", .name = "dsi2pll" },
144 { .fw_name = "dsi1pll", .name = "dsi1pll" },
147 static const struct parent_map mmcc_pxo_dsi2_dsi1_lvds_map[] = {
149 { P_DSI2_PLL_DSICLK, 1 },
151 { P_DSI1_PLL_DSICLK, 3 },
154 static const struct clk_parent_data mmcc_pxo_dsi2_dsi1_lvds[] = {
155 { .fw_name = "pxo", .name = "pxo_board" },
156 { .fw_name = "dsi2pll", .name = "dsi2pll" },
157 { .fw_name = "lvdspll", .name = "mpd4_lvds_pll" },
158 { .fw_name = "dsi1pll", .name = "dsi1pll" },
161 static const struct parent_map mmcc_pxo_dsi1_dsi2_byte_map[] = {
163 { P_DSI1_PLL_BYTECLK, 1 },
164 { P_DSI2_PLL_BYTECLK, 2 },
167 static const struct clk_parent_data mmcc_pxo_dsi1_dsi2_byte[] = {
168 { .fw_name = "pxo", .name = "pxo_board" },
169 { .fw_name = "dsi1pllbyte", .name = "dsi1pllbyte" },
170 { .fw_name = "dsi2pllbyte", .name = "dsi2pllbyte" },
173 static const struct freq_tbl clk_tbl_cam[] = {
174 { 6000000, P_PLL8, 4, 1, 16 },
175 { 8000000, P_PLL8, 4, 1, 12 },
176 { 12000000, P_PLL8, 4, 1, 8 },
177 { 16000000, P_PLL8, 4, 1, 6 },
178 { 19200000, P_PLL8, 4, 1, 5 },
179 { 24000000, P_PLL8, 4, 1, 4 },
180 { 32000000, P_PLL8, 4, 1, 3 },
181 { 48000000, P_PLL8, 4, 1, 2 },
182 { 64000000, P_PLL8, 3, 1, 2 },
183 { 96000000, P_PLL8, 4, 0, 0 },
184 { 128000000, P_PLL8, 3, 0, 0 },
188 static struct clk_rcg camclk0_src = {
193 .mnctr_reset_bit = 8,
195 .mnctr_mode_shift = 6,
206 .parent_map = mmcc_pxo_pll8_pll2_map,
208 .freq_tbl = clk_tbl_cam,
210 .enable_reg = 0x0140,
211 .enable_mask = BIT(2),
212 .hw.init = &(struct clk_init_data){
213 .name = "camclk0_src",
214 .parent_data = mmcc_pxo_pll8_pll2,
215 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
221 static struct clk_branch camclk0_clk = {
225 .enable_reg = 0x0140,
226 .enable_mask = BIT(0),
227 .hw.init = &(struct clk_init_data){
228 .name = "camclk0_clk",
229 .parent_hws = (const struct clk_hw*[]){
233 .ops = &clk_branch_ops,
239 static struct clk_rcg camclk1_src = {
244 .mnctr_reset_bit = 8,
246 .mnctr_mode_shift = 6,
257 .parent_map = mmcc_pxo_pll8_pll2_map,
259 .freq_tbl = clk_tbl_cam,
261 .enable_reg = 0x0154,
262 .enable_mask = BIT(2),
263 .hw.init = &(struct clk_init_data){
264 .name = "camclk1_src",
265 .parent_data = mmcc_pxo_pll8_pll2,
266 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
272 static struct clk_branch camclk1_clk = {
276 .enable_reg = 0x0154,
277 .enable_mask = BIT(0),
278 .hw.init = &(struct clk_init_data){
279 .name = "camclk1_clk",
280 .parent_hws = (const struct clk_hw*[]){
284 .ops = &clk_branch_ops,
290 static struct clk_rcg camclk2_src = {
295 .mnctr_reset_bit = 8,
297 .mnctr_mode_shift = 6,
308 .parent_map = mmcc_pxo_pll8_pll2_map,
310 .freq_tbl = clk_tbl_cam,
312 .enable_reg = 0x0220,
313 .enable_mask = BIT(2),
314 .hw.init = &(struct clk_init_data){
315 .name = "camclk2_src",
316 .parent_data = mmcc_pxo_pll8_pll2,
317 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
323 static struct clk_branch camclk2_clk = {
327 .enable_reg = 0x0220,
328 .enable_mask = BIT(0),
329 .hw.init = &(struct clk_init_data){
330 .name = "camclk2_clk",
331 .parent_hws = (const struct clk_hw*[]){
335 .ops = &clk_branch_ops,
341 static const struct freq_tbl clk_tbl_csi[] = {
342 { 27000000, P_PXO, 1, 0, 0 },
343 { 85330000, P_PLL8, 1, 2, 9 },
344 { 177780000, P_PLL2, 1, 2, 9 },
348 static struct clk_rcg csi0_src = {
353 .mnctr_reset_bit = 7,
354 .mnctr_mode_shift = 6,
365 .parent_map = mmcc_pxo_pll8_pll2_map,
367 .freq_tbl = clk_tbl_csi,
369 .enable_reg = 0x0040,
370 .enable_mask = BIT(2),
371 .hw.init = &(struct clk_init_data){
373 .parent_data = mmcc_pxo_pll8_pll2,
374 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
380 static struct clk_branch csi0_clk = {
384 .enable_reg = 0x0040,
385 .enable_mask = BIT(0),
386 .hw.init = &(struct clk_init_data){
387 .parent_hws = (const struct clk_hw*[]){
392 .ops = &clk_branch_ops,
393 .flags = CLK_SET_RATE_PARENT,
398 static struct clk_branch csi0_phy_clk = {
402 .enable_reg = 0x0040,
403 .enable_mask = BIT(8),
404 .hw.init = &(struct clk_init_data){
405 .parent_hws = (const struct clk_hw*[]){
409 .name = "csi0_phy_clk",
410 .ops = &clk_branch_ops,
411 .flags = CLK_SET_RATE_PARENT,
416 static struct clk_rcg csi1_src = {
421 .mnctr_reset_bit = 7,
422 .mnctr_mode_shift = 6,
433 .parent_map = mmcc_pxo_pll8_pll2_map,
435 .freq_tbl = clk_tbl_csi,
437 .enable_reg = 0x0024,
438 .enable_mask = BIT(2),
439 .hw.init = &(struct clk_init_data){
441 .parent_data = mmcc_pxo_pll8_pll2,
442 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
448 static struct clk_branch csi1_clk = {
452 .enable_reg = 0x0024,
453 .enable_mask = BIT(0),
454 .hw.init = &(struct clk_init_data){
455 .parent_hws = (const struct clk_hw*[]){
460 .ops = &clk_branch_ops,
461 .flags = CLK_SET_RATE_PARENT,
466 static struct clk_branch csi1_phy_clk = {
470 .enable_reg = 0x0024,
471 .enable_mask = BIT(8),
472 .hw.init = &(struct clk_init_data){
473 .parent_hws = (const struct clk_hw*[]){
477 .name = "csi1_phy_clk",
478 .ops = &clk_branch_ops,
479 .flags = CLK_SET_RATE_PARENT,
484 static struct clk_rcg csi2_src = {
489 .mnctr_reset_bit = 7,
490 .mnctr_mode_shift = 6,
501 .parent_map = mmcc_pxo_pll8_pll2_map,
503 .freq_tbl = clk_tbl_csi,
505 .enable_reg = 0x022c,
506 .enable_mask = BIT(2),
507 .hw.init = &(struct clk_init_data){
509 .parent_data = mmcc_pxo_pll8_pll2,
510 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
516 static struct clk_branch csi2_clk = {
520 .enable_reg = 0x022c,
521 .enable_mask = BIT(0),
522 .hw.init = &(struct clk_init_data){
523 .parent_hws = (const struct clk_hw*[]){
528 .ops = &clk_branch_ops,
529 .flags = CLK_SET_RATE_PARENT,
534 static struct clk_branch csi2_phy_clk = {
538 .enable_reg = 0x022c,
539 .enable_mask = BIT(8),
540 .hw.init = &(struct clk_init_data){
541 .parent_hws = (const struct clk_hw*[]){
545 .name = "csi2_phy_clk",
546 .ops = &clk_branch_ops,
547 .flags = CLK_SET_RATE_PARENT,
557 struct clk_regmap clkr;
560 #define to_clk_pix_rdi(_hw) \
561 container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr)
563 static int pix_rdi_set_parent(struct clk_hw *hw, u8 index)
568 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
569 int num_parents = clk_hw_get_num_parents(hw);
572 * These clocks select three inputs via two muxes. One mux selects
573 * between csi0 and csi1 and the second mux selects between that mux's
574 * output and csi2. The source and destination selections for each
575 * mux must be clocking for the switch to succeed so just turn on
576 * all three sources because it's easier than figuring out what source
577 * needs to be on at what time.
579 for (i = 0; i < num_parents; i++) {
580 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
581 ret = clk_prepare_enable(p->clk);
590 regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val);
592 * Wait at least 6 cycles of slowest clock
593 * for the glitch-free MUX to fully switch sources.
601 regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val);
603 * Wait at least 6 cycles of slowest clock
604 * for the glitch-free MUX to fully switch sources.
609 for (i--; i >= 0; i--) {
610 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
611 clk_disable_unprepare(p->clk);
617 static u8 pix_rdi_get_parent(struct clk_hw *hw)
620 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
623 regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val);
624 if (val & rdi->s2_mask)
627 regmap_read(rdi->clkr.regmap, rdi->s_reg, &val);
628 if (val & rdi->s_mask)
634 static const struct clk_ops clk_ops_pix_rdi = {
635 .enable = clk_enable_regmap,
636 .disable = clk_disable_regmap,
637 .set_parent = pix_rdi_set_parent,
638 .get_parent = pix_rdi_get_parent,
639 .determine_rate = __clk_mux_determine_rate,
642 static const struct clk_hw *pix_rdi_parents[] = {
648 static struct clk_pix_rdi csi_pix_clk = {
654 .enable_reg = 0x0058,
655 .enable_mask = BIT(26),
656 .hw.init = &(struct clk_init_data){
657 .name = "csi_pix_clk",
658 .parent_hws = pix_rdi_parents,
659 .num_parents = ARRAY_SIZE(pix_rdi_parents),
660 .ops = &clk_ops_pix_rdi,
665 static struct clk_pix_rdi csi_pix1_clk = {
671 .enable_reg = 0x0238,
672 .enable_mask = BIT(10),
673 .hw.init = &(struct clk_init_data){
674 .name = "csi_pix1_clk",
675 .parent_hws = pix_rdi_parents,
676 .num_parents = ARRAY_SIZE(pix_rdi_parents),
677 .ops = &clk_ops_pix_rdi,
682 static struct clk_pix_rdi csi_rdi_clk = {
688 .enable_reg = 0x0058,
689 .enable_mask = BIT(13),
690 .hw.init = &(struct clk_init_data){
691 .name = "csi_rdi_clk",
692 .parent_hws = pix_rdi_parents,
693 .num_parents = ARRAY_SIZE(pix_rdi_parents),
694 .ops = &clk_ops_pix_rdi,
699 static struct clk_pix_rdi csi_rdi1_clk = {
705 .enable_reg = 0x0238,
706 .enable_mask = BIT(2),
707 .hw.init = &(struct clk_init_data){
708 .name = "csi_rdi1_clk",
709 .parent_hws = pix_rdi_parents,
710 .num_parents = ARRAY_SIZE(pix_rdi_parents),
711 .ops = &clk_ops_pix_rdi,
716 static struct clk_pix_rdi csi_rdi2_clk = {
722 .enable_reg = 0x0238,
723 .enable_mask = BIT(6),
724 .hw.init = &(struct clk_init_data){
725 .name = "csi_rdi2_clk",
726 .parent_hws = pix_rdi_parents,
727 .num_parents = ARRAY_SIZE(pix_rdi_parents),
728 .ops = &clk_ops_pix_rdi,
733 static const struct freq_tbl clk_tbl_csiphytimer[] = {
734 { 85330000, P_PLL8, 1, 2, 9 },
735 { 177780000, P_PLL2, 1, 2, 9 },
739 static struct clk_rcg csiphytimer_src = {
744 .mnctr_reset_bit = 8,
746 .mnctr_mode_shift = 6,
757 .parent_map = mmcc_pxo_pll8_pll2_map,
759 .freq_tbl = clk_tbl_csiphytimer,
761 .enable_reg = 0x0160,
762 .enable_mask = BIT(2),
763 .hw.init = &(struct clk_init_data){
764 .name = "csiphytimer_src",
765 .parent_data = mmcc_pxo_pll8_pll2,
766 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
772 static struct clk_branch csiphy0_timer_clk = {
776 .enable_reg = 0x0160,
777 .enable_mask = BIT(0),
778 .hw.init = &(struct clk_init_data){
779 .parent_hws = (const struct clk_hw*[]){
780 &csiphytimer_src.clkr.hw,
783 .name = "csiphy0_timer_clk",
784 .ops = &clk_branch_ops,
785 .flags = CLK_SET_RATE_PARENT,
790 static struct clk_branch csiphy1_timer_clk = {
794 .enable_reg = 0x0160,
795 .enable_mask = BIT(9),
796 .hw.init = &(struct clk_init_data){
797 .parent_hws = (const struct clk_hw*[]){
798 &csiphytimer_src.clkr.hw,
801 .name = "csiphy1_timer_clk",
802 .ops = &clk_branch_ops,
803 .flags = CLK_SET_RATE_PARENT,
808 static struct clk_branch csiphy2_timer_clk = {
812 .enable_reg = 0x0160,
813 .enable_mask = BIT(11),
814 .hw.init = &(struct clk_init_data){
815 .parent_hws = (const struct clk_hw*[]){
816 &csiphytimer_src.clkr.hw,
819 .name = "csiphy2_timer_clk",
820 .ops = &clk_branch_ops,
821 .flags = CLK_SET_RATE_PARENT,
826 static const struct freq_tbl clk_tbl_gfx2d[] = {
827 F_MN( 27000000, P_PXO, 1, 0),
828 F_MN( 48000000, P_PLL8, 1, 8),
829 F_MN( 54857000, P_PLL8, 1, 7),
830 F_MN( 64000000, P_PLL8, 1, 6),
831 F_MN( 76800000, P_PLL8, 1, 5),
832 F_MN( 96000000, P_PLL8, 1, 4),
833 F_MN(128000000, P_PLL8, 1, 3),
834 F_MN(145455000, P_PLL2, 2, 11),
835 F_MN(160000000, P_PLL2, 1, 5),
836 F_MN(177778000, P_PLL2, 2, 9),
837 F_MN(200000000, P_PLL2, 1, 4),
838 F_MN(228571000, P_PLL2, 2, 7),
842 static struct clk_dyn_rcg gfx2d0_src = {
850 .mnctr_reset_bit = 25,
851 .mnctr_mode_shift = 9,
858 .mnctr_reset_bit = 24,
859 .mnctr_mode_shift = 6,
866 .parent_map = mmcc_pxo_pll8_pll2_map,
870 .parent_map = mmcc_pxo_pll8_pll2_map,
873 .freq_tbl = clk_tbl_gfx2d,
875 .enable_reg = 0x0060,
876 .enable_mask = BIT(2),
877 .hw.init = &(struct clk_init_data){
878 .name = "gfx2d0_src",
879 .parent_data = mmcc_pxo_pll8_pll2,
880 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
881 .ops = &clk_dyn_rcg_ops,
886 static struct clk_branch gfx2d0_clk = {
890 .enable_reg = 0x0060,
891 .enable_mask = BIT(0),
892 .hw.init = &(struct clk_init_data){
893 .name = "gfx2d0_clk",
894 .parent_hws = (const struct clk_hw*[]){
898 .ops = &clk_branch_ops,
899 .flags = CLK_SET_RATE_PARENT,
904 static struct clk_dyn_rcg gfx2d1_src = {
912 .mnctr_reset_bit = 25,
913 .mnctr_mode_shift = 9,
920 .mnctr_reset_bit = 24,
921 .mnctr_mode_shift = 6,
928 .parent_map = mmcc_pxo_pll8_pll2_map,
932 .parent_map = mmcc_pxo_pll8_pll2_map,
935 .freq_tbl = clk_tbl_gfx2d,
937 .enable_reg = 0x0074,
938 .enable_mask = BIT(2),
939 .hw.init = &(struct clk_init_data){
940 .name = "gfx2d1_src",
941 .parent_data = mmcc_pxo_pll8_pll2,
942 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
943 .ops = &clk_dyn_rcg_ops,
948 static struct clk_branch gfx2d1_clk = {
952 .enable_reg = 0x0074,
953 .enable_mask = BIT(0),
954 .hw.init = &(struct clk_init_data){
955 .name = "gfx2d1_clk",
956 .parent_hws = (const struct clk_hw*[]){
960 .ops = &clk_branch_ops,
961 .flags = CLK_SET_RATE_PARENT,
966 static const struct freq_tbl clk_tbl_gfx3d[] = {
967 F_MN( 27000000, P_PXO, 1, 0),
968 F_MN( 48000000, P_PLL8, 1, 8),
969 F_MN( 54857000, P_PLL8, 1, 7),
970 F_MN( 64000000, P_PLL8, 1, 6),
971 F_MN( 76800000, P_PLL8, 1, 5),
972 F_MN( 96000000, P_PLL8, 1, 4),
973 F_MN(128000000, P_PLL8, 1, 3),
974 F_MN(145455000, P_PLL2, 2, 11),
975 F_MN(160000000, P_PLL2, 1, 5),
976 F_MN(177778000, P_PLL2, 2, 9),
977 F_MN(200000000, P_PLL2, 1, 4),
978 F_MN(228571000, P_PLL2, 2, 7),
979 F_MN(266667000, P_PLL2, 1, 3),
980 F_MN(300000000, P_PLL3, 1, 4),
981 F_MN(320000000, P_PLL2, 2, 5),
982 F_MN(400000000, P_PLL2, 1, 2),
986 static const struct freq_tbl clk_tbl_gfx3d_8064[] = {
987 F_MN( 27000000, P_PXO, 0, 0),
988 F_MN( 48000000, P_PLL8, 1, 8),
989 F_MN( 54857000, P_PLL8, 1, 7),
990 F_MN( 64000000, P_PLL8, 1, 6),
991 F_MN( 76800000, P_PLL8, 1, 5),
992 F_MN( 96000000, P_PLL8, 1, 4),
993 F_MN(128000000, P_PLL8, 1, 3),
994 F_MN(145455000, P_PLL2, 2, 11),
995 F_MN(160000000, P_PLL2, 1, 5),
996 F_MN(177778000, P_PLL2, 2, 9),
997 F_MN(192000000, P_PLL8, 1, 2),
998 F_MN(200000000, P_PLL2, 1, 4),
999 F_MN(228571000, P_PLL2, 2, 7),
1000 F_MN(266667000, P_PLL2, 1, 3),
1001 F_MN(320000000, P_PLL2, 2, 5),
1002 F_MN(400000000, P_PLL2, 1, 2),
1003 F_MN(450000000, P_PLL15, 1, 2),
1007 static struct clk_dyn_rcg gfx3d_src = {
1008 .ns_reg[0] = 0x008c,
1009 .ns_reg[1] = 0x008c,
1010 .md_reg[0] = 0x0084,
1011 .md_reg[1] = 0x0088,
1015 .mnctr_reset_bit = 25,
1016 .mnctr_mode_shift = 9,
1023 .mnctr_reset_bit = 24,
1024 .mnctr_mode_shift = 6,
1031 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
1035 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
1038 .freq_tbl = clk_tbl_gfx3d,
1040 .enable_reg = 0x0080,
1041 .enable_mask = BIT(2),
1042 .hw.init = &(struct clk_init_data){
1043 .name = "gfx3d_src",
1044 .parent_data = mmcc_pxo_pll8_pll2_pll3,
1045 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2_pll3),
1046 .ops = &clk_dyn_rcg_ops,
1051 static const struct clk_init_data gfx3d_8064_init = {
1052 .name = "gfx3d_src",
1053 .parent_data = mmcc_pxo_pll8_pll2_pll15,
1054 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2_pll15),
1055 .ops = &clk_dyn_rcg_ops,
1058 static struct clk_branch gfx3d_clk = {
1062 .enable_reg = 0x0080,
1063 .enable_mask = BIT(0),
1064 .hw.init = &(struct clk_init_data){
1065 .name = "gfx3d_clk",
1066 .parent_hws = (const struct clk_hw*[]){
1070 .ops = &clk_branch_ops,
1071 .flags = CLK_SET_RATE_PARENT,
1076 static const struct freq_tbl clk_tbl_vcap[] = {
1077 F_MN( 27000000, P_PXO, 0, 0),
1078 F_MN( 54860000, P_PLL8, 1, 7),
1079 F_MN( 64000000, P_PLL8, 1, 6),
1080 F_MN( 76800000, P_PLL8, 1, 5),
1081 F_MN(128000000, P_PLL8, 1, 3),
1082 F_MN(160000000, P_PLL2, 1, 5),
1083 F_MN(200000000, P_PLL2, 1, 4),
1087 static struct clk_dyn_rcg vcap_src = {
1088 .ns_reg[0] = 0x021c,
1089 .ns_reg[1] = 0x021c,
1090 .md_reg[0] = 0x01ec,
1091 .md_reg[1] = 0x0218,
1095 .mnctr_reset_bit = 23,
1096 .mnctr_mode_shift = 9,
1103 .mnctr_reset_bit = 22,
1104 .mnctr_mode_shift = 6,
1111 .parent_map = mmcc_pxo_pll8_pll2_map,
1115 .parent_map = mmcc_pxo_pll8_pll2_map,
1118 .freq_tbl = clk_tbl_vcap,
1120 .enable_reg = 0x0178,
1121 .enable_mask = BIT(2),
1122 .hw.init = &(struct clk_init_data){
1124 .parent_data = mmcc_pxo_pll8_pll2,
1125 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1126 .ops = &clk_dyn_rcg_ops,
1131 static struct clk_branch vcap_clk = {
1135 .enable_reg = 0x0178,
1136 .enable_mask = BIT(0),
1137 .hw.init = &(struct clk_init_data){
1139 .parent_hws = (const struct clk_hw*[]){
1143 .ops = &clk_branch_ops,
1144 .flags = CLK_SET_RATE_PARENT,
1149 static struct clk_branch vcap_npl_clk = {
1153 .enable_reg = 0x0178,
1154 .enable_mask = BIT(13),
1155 .hw.init = &(struct clk_init_data){
1156 .name = "vcap_npl_clk",
1157 .parent_hws = (const struct clk_hw*[]){
1161 .ops = &clk_branch_ops,
1162 .flags = CLK_SET_RATE_PARENT,
1167 static const struct freq_tbl clk_tbl_ijpeg[] = {
1168 { 27000000, P_PXO, 1, 0, 0 },
1169 { 36570000, P_PLL8, 1, 2, 21 },
1170 { 54860000, P_PLL8, 7, 0, 0 },
1171 { 96000000, P_PLL8, 4, 0, 0 },
1172 { 109710000, P_PLL8, 1, 2, 7 },
1173 { 128000000, P_PLL8, 3, 0, 0 },
1174 { 153600000, P_PLL8, 1, 2, 5 },
1175 { 200000000, P_PLL2, 4, 0, 0 },
1176 { 228571000, P_PLL2, 1, 2, 7 },
1177 { 266667000, P_PLL2, 1, 1, 3 },
1178 { 320000000, P_PLL2, 1, 2, 5 },
1182 static struct clk_rcg ijpeg_src = {
1187 .mnctr_reset_bit = 7,
1188 .mnctr_mode_shift = 6,
1194 .pre_div_shift = 12,
1199 .parent_map = mmcc_pxo_pll8_pll2_map,
1201 .freq_tbl = clk_tbl_ijpeg,
1203 .enable_reg = 0x0098,
1204 .enable_mask = BIT(2),
1205 .hw.init = &(struct clk_init_data){
1206 .name = "ijpeg_src",
1207 .parent_data = mmcc_pxo_pll8_pll2,
1208 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1209 .ops = &clk_rcg_ops,
1214 static struct clk_branch ijpeg_clk = {
1218 .enable_reg = 0x0098,
1219 .enable_mask = BIT(0),
1220 .hw.init = &(struct clk_init_data){
1221 .name = "ijpeg_clk",
1222 .parent_hws = (const struct clk_hw*[]){
1226 .ops = &clk_branch_ops,
1227 .flags = CLK_SET_RATE_PARENT,
1232 static const struct freq_tbl clk_tbl_jpegd[] = {
1233 { 64000000, P_PLL8, 6 },
1234 { 76800000, P_PLL8, 5 },
1235 { 96000000, P_PLL8, 4 },
1236 { 160000000, P_PLL2, 5 },
1237 { 200000000, P_PLL2, 4 },
1241 static struct clk_rcg jpegd_src = {
1244 .pre_div_shift = 12,
1249 .parent_map = mmcc_pxo_pll8_pll2_map,
1251 .freq_tbl = clk_tbl_jpegd,
1253 .enable_reg = 0x00a4,
1254 .enable_mask = BIT(2),
1255 .hw.init = &(struct clk_init_data){
1256 .name = "jpegd_src",
1257 .parent_data = mmcc_pxo_pll8_pll2,
1258 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1259 .ops = &clk_rcg_ops,
1264 static struct clk_branch jpegd_clk = {
1268 .enable_reg = 0x00a4,
1269 .enable_mask = BIT(0),
1270 .hw.init = &(struct clk_init_data){
1271 .name = "jpegd_clk",
1272 .parent_hws = (const struct clk_hw*[]){
1276 .ops = &clk_branch_ops,
1277 .flags = CLK_SET_RATE_PARENT,
1282 static const struct freq_tbl clk_tbl_mdp[] = {
1283 { 9600000, P_PLL8, 1, 1, 40 },
1284 { 13710000, P_PLL8, 1, 1, 28 },
1285 { 27000000, P_PXO, 1, 0, 0 },
1286 { 29540000, P_PLL8, 1, 1, 13 },
1287 { 34910000, P_PLL8, 1, 1, 11 },
1288 { 38400000, P_PLL8, 1, 1, 10 },
1289 { 59080000, P_PLL8, 1, 2, 13 },
1290 { 76800000, P_PLL8, 1, 1, 5 },
1291 { 85330000, P_PLL8, 1, 2, 9 },
1292 { 96000000, P_PLL8, 1, 1, 4 },
1293 { 128000000, P_PLL8, 1, 1, 3 },
1294 { 160000000, P_PLL2, 1, 1, 5 },
1295 { 177780000, P_PLL2, 1, 2, 9 },
1296 { 200000000, P_PLL2, 1, 1, 4 },
1297 { 228571000, P_PLL2, 1, 2, 7 },
1298 { 266667000, P_PLL2, 1, 1, 3 },
1302 static struct clk_dyn_rcg mdp_src = {
1303 .ns_reg[0] = 0x00d0,
1304 .ns_reg[1] = 0x00d0,
1305 .md_reg[0] = 0x00c4,
1306 .md_reg[1] = 0x00c8,
1310 .mnctr_reset_bit = 31,
1311 .mnctr_mode_shift = 9,
1318 .mnctr_reset_bit = 30,
1319 .mnctr_mode_shift = 6,
1326 .parent_map = mmcc_pxo_pll8_pll2_map,
1330 .parent_map = mmcc_pxo_pll8_pll2_map,
1333 .freq_tbl = clk_tbl_mdp,
1335 .enable_reg = 0x00c0,
1336 .enable_mask = BIT(2),
1337 .hw.init = &(struct clk_init_data){
1339 .parent_data = mmcc_pxo_pll8_pll2,
1340 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1341 .ops = &clk_dyn_rcg_ops,
1346 static struct clk_branch mdp_clk = {
1350 .enable_reg = 0x00c0,
1351 .enable_mask = BIT(0),
1352 .hw.init = &(struct clk_init_data){
1354 .parent_hws = (const struct clk_hw*[]){
1358 .ops = &clk_branch_ops,
1359 .flags = CLK_SET_RATE_PARENT,
1364 static struct clk_branch mdp_lut_clk = {
1368 .enable_reg = 0x016c,
1369 .enable_mask = BIT(0),
1370 .hw.init = &(struct clk_init_data){
1371 .parent_hws = (const struct clk_hw*[]){
1375 .name = "mdp_lut_clk",
1376 .ops = &clk_branch_ops,
1377 .flags = CLK_SET_RATE_PARENT,
1382 static struct clk_branch mdp_vsync_clk = {
1386 .enable_reg = 0x0058,
1387 .enable_mask = BIT(6),
1388 .hw.init = &(struct clk_init_data){
1389 .name = "mdp_vsync_clk",
1390 .parent_data = (const struct clk_parent_data[]){
1391 { .fw_name = "pxo", .name = "pxo_board" },
1394 .ops = &clk_branch_ops
1399 static const struct freq_tbl clk_tbl_rot[] = {
1400 { 27000000, P_PXO, 1 },
1401 { 29540000, P_PLL8, 13 },
1402 { 32000000, P_PLL8, 12 },
1403 { 38400000, P_PLL8, 10 },
1404 { 48000000, P_PLL8, 8 },
1405 { 54860000, P_PLL8, 7 },
1406 { 64000000, P_PLL8, 6 },
1407 { 76800000, P_PLL8, 5 },
1408 { 96000000, P_PLL8, 4 },
1409 { 100000000, P_PLL2, 8 },
1410 { 114290000, P_PLL2, 7 },
1411 { 133330000, P_PLL2, 6 },
1412 { 160000000, P_PLL2, 5 },
1413 { 200000000, P_PLL2, 4 },
1417 static struct clk_dyn_rcg rot_src = {
1418 .ns_reg[0] = 0x00e8,
1419 .ns_reg[1] = 0x00e8,
1422 .pre_div_shift = 22,
1426 .pre_div_shift = 26,
1430 .src_sel_shift = 16,
1431 .parent_map = mmcc_pxo_pll8_pll2_map,
1434 .src_sel_shift = 19,
1435 .parent_map = mmcc_pxo_pll8_pll2_map,
1438 .freq_tbl = clk_tbl_rot,
1440 .enable_reg = 0x00e0,
1441 .enable_mask = BIT(2),
1442 .hw.init = &(struct clk_init_data){
1444 .parent_data = mmcc_pxo_pll8_pll2,
1445 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1446 .ops = &clk_dyn_rcg_ops,
1451 static struct clk_branch rot_clk = {
1455 .enable_reg = 0x00e0,
1456 .enable_mask = BIT(0),
1457 .hw.init = &(struct clk_init_data){
1459 .parent_hws = (const struct clk_hw*[]){
1463 .ops = &clk_branch_ops,
1464 .flags = CLK_SET_RATE_PARENT,
1469 static const struct parent_map mmcc_pxo_hdmi_map[] = {
1474 static const struct clk_parent_data mmcc_pxo_hdmi[] = {
1475 { .fw_name = "pxo", .name = "pxo_board" },
1476 { .fw_name = "hdmipll", .name = "hdmi_pll" },
1479 static const struct freq_tbl clk_tbl_tv[] = {
1480 { .src = P_HDMI_PLL, .pre_div = 1 },
1484 static struct clk_rcg tv_src = {
1489 .mnctr_reset_bit = 7,
1490 .mnctr_mode_shift = 6,
1496 .pre_div_shift = 14,
1501 .parent_map = mmcc_pxo_hdmi_map,
1503 .freq_tbl = clk_tbl_tv,
1505 .enable_reg = 0x00ec,
1506 .enable_mask = BIT(2),
1507 .hw.init = &(struct clk_init_data){
1509 .parent_data = mmcc_pxo_hdmi,
1510 .num_parents = ARRAY_SIZE(mmcc_pxo_hdmi),
1511 .ops = &clk_rcg_bypass_ops,
1512 .flags = CLK_SET_RATE_PARENT,
1517 static struct clk_branch tv_enc_clk = {
1521 .enable_reg = 0x00ec,
1522 .enable_mask = BIT(8),
1523 .hw.init = &(struct clk_init_data){
1524 .parent_hws = (const struct clk_hw*[]){
1528 .name = "tv_enc_clk",
1529 .ops = &clk_branch_ops,
1530 .flags = CLK_SET_RATE_PARENT,
1535 static struct clk_branch tv_dac_clk = {
1539 .enable_reg = 0x00ec,
1540 .enable_mask = BIT(10),
1541 .hw.init = &(struct clk_init_data){
1542 .parent_hws = (const struct clk_hw*[]){
1546 .name = "tv_dac_clk",
1547 .ops = &clk_branch_ops,
1548 .flags = CLK_SET_RATE_PARENT,
1553 static struct clk_branch mdp_tv_clk = {
1557 .enable_reg = 0x00ec,
1558 .enable_mask = BIT(0),
1559 .hw.init = &(struct clk_init_data){
1560 .parent_hws = (const struct clk_hw*[]){
1564 .name = "mdp_tv_clk",
1565 .ops = &clk_branch_ops,
1566 .flags = CLK_SET_RATE_PARENT,
1571 static struct clk_branch hdmi_tv_clk = {
1575 .enable_reg = 0x00ec,
1576 .enable_mask = BIT(12),
1577 .hw.init = &(struct clk_init_data){
1578 .parent_hws = (const struct clk_hw*[]){
1582 .name = "hdmi_tv_clk",
1583 .ops = &clk_branch_ops,
1584 .flags = CLK_SET_RATE_PARENT,
1589 static struct clk_branch rgb_tv_clk = {
1593 .enable_reg = 0x0124,
1594 .enable_mask = BIT(14),
1595 .hw.init = &(struct clk_init_data){
1596 .parent_hws = (const struct clk_hw*[]){
1600 .name = "rgb_tv_clk",
1601 .ops = &clk_branch_ops,
1602 .flags = CLK_SET_RATE_PARENT,
1607 static struct clk_branch npl_tv_clk = {
1611 .enable_reg = 0x0124,
1612 .enable_mask = BIT(16),
1613 .hw.init = &(struct clk_init_data){
1614 .parent_hws = (const struct clk_hw*[]){
1618 .name = "npl_tv_clk",
1619 .ops = &clk_branch_ops,
1620 .flags = CLK_SET_RATE_PARENT,
1625 static struct clk_branch hdmi_app_clk = {
1629 .enable_reg = 0x005c,
1630 .enable_mask = BIT(11),
1631 .hw.init = &(struct clk_init_data){
1632 .parent_data = (const struct clk_parent_data[]){
1633 { .fw_name = "pxo", .name = "pxo_board" },
1636 .name = "hdmi_app_clk",
1637 .ops = &clk_branch_ops,
1642 static const struct freq_tbl clk_tbl_vcodec[] = {
1643 F_MN( 27000000, P_PXO, 1, 0),
1644 F_MN( 32000000, P_PLL8, 1, 12),
1645 F_MN( 48000000, P_PLL8, 1, 8),
1646 F_MN( 54860000, P_PLL8, 1, 7),
1647 F_MN( 96000000, P_PLL8, 1, 4),
1648 F_MN(133330000, P_PLL2, 1, 6),
1649 F_MN(200000000, P_PLL2, 1, 4),
1650 F_MN(228570000, P_PLL2, 2, 7),
1651 F_MN(266670000, P_PLL2, 1, 3),
1655 static struct clk_dyn_rcg vcodec_src = {
1656 .ns_reg[0] = 0x0100,
1657 .ns_reg[1] = 0x0100,
1658 .md_reg[0] = 0x00fc,
1659 .md_reg[1] = 0x0128,
1663 .mnctr_reset_bit = 31,
1664 .mnctr_mode_shift = 6,
1671 .mnctr_reset_bit = 30,
1672 .mnctr_mode_shift = 11,
1678 .src_sel_shift = 27,
1679 .parent_map = mmcc_pxo_pll8_pll2_map,
1683 .parent_map = mmcc_pxo_pll8_pll2_map,
1686 .freq_tbl = clk_tbl_vcodec,
1688 .enable_reg = 0x00f8,
1689 .enable_mask = BIT(2),
1690 .hw.init = &(struct clk_init_data){
1691 .name = "vcodec_src",
1692 .parent_data = mmcc_pxo_pll8_pll2,
1693 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1694 .ops = &clk_dyn_rcg_ops,
1699 static struct clk_branch vcodec_clk = {
1703 .enable_reg = 0x00f8,
1704 .enable_mask = BIT(0),
1705 .hw.init = &(struct clk_init_data){
1706 .name = "vcodec_clk",
1707 .parent_hws = (const struct clk_hw*[]){
1711 .ops = &clk_branch_ops,
1712 .flags = CLK_SET_RATE_PARENT,
1717 static const struct freq_tbl clk_tbl_vpe[] = {
1718 { 27000000, P_PXO, 1 },
1719 { 34909000, P_PLL8, 11 },
1720 { 38400000, P_PLL8, 10 },
1721 { 64000000, P_PLL8, 6 },
1722 { 76800000, P_PLL8, 5 },
1723 { 96000000, P_PLL8, 4 },
1724 { 100000000, P_PLL2, 8 },
1725 { 160000000, P_PLL2, 5 },
1729 static struct clk_rcg vpe_src = {
1732 .pre_div_shift = 12,
1737 .parent_map = mmcc_pxo_pll8_pll2_map,
1739 .freq_tbl = clk_tbl_vpe,
1741 .enable_reg = 0x0110,
1742 .enable_mask = BIT(2),
1743 .hw.init = &(struct clk_init_data){
1745 .parent_data = mmcc_pxo_pll8_pll2,
1746 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1747 .ops = &clk_rcg_ops,
1752 static struct clk_branch vpe_clk = {
1756 .enable_reg = 0x0110,
1757 .enable_mask = BIT(0),
1758 .hw.init = &(struct clk_init_data){
1760 .parent_hws = (const struct clk_hw*[]){
1764 .ops = &clk_branch_ops,
1765 .flags = CLK_SET_RATE_PARENT,
1770 static const struct freq_tbl clk_tbl_vfe[] = {
1771 { 13960000, P_PLL8, 1, 2, 55 },
1772 { 27000000, P_PXO, 1, 0, 0 },
1773 { 36570000, P_PLL8, 1, 2, 21 },
1774 { 38400000, P_PLL8, 2, 1, 5 },
1775 { 45180000, P_PLL8, 1, 2, 17 },
1776 { 48000000, P_PLL8, 2, 1, 4 },
1777 { 54860000, P_PLL8, 1, 1, 7 },
1778 { 64000000, P_PLL8, 2, 1, 3 },
1779 { 76800000, P_PLL8, 1, 1, 5 },
1780 { 96000000, P_PLL8, 2, 1, 2 },
1781 { 109710000, P_PLL8, 1, 2, 7 },
1782 { 128000000, P_PLL8, 1, 1, 3 },
1783 { 153600000, P_PLL8, 1, 2, 5 },
1784 { 200000000, P_PLL2, 2, 1, 2 },
1785 { 228570000, P_PLL2, 1, 2, 7 },
1786 { 266667000, P_PLL2, 1, 1, 3 },
1787 { 320000000, P_PLL2, 1, 2, 5 },
1791 static struct clk_rcg vfe_src = {
1795 .mnctr_reset_bit = 7,
1796 .mnctr_mode_shift = 6,
1802 .pre_div_shift = 10,
1807 .parent_map = mmcc_pxo_pll8_pll2_map,
1809 .freq_tbl = clk_tbl_vfe,
1811 .enable_reg = 0x0104,
1812 .enable_mask = BIT(2),
1813 .hw.init = &(struct clk_init_data){
1815 .parent_data = mmcc_pxo_pll8_pll2,
1816 .num_parents = ARRAY_SIZE(mmcc_pxo_pll8_pll2),
1817 .ops = &clk_rcg_ops,
1822 static struct clk_branch vfe_clk = {
1826 .enable_reg = 0x0104,
1827 .enable_mask = BIT(0),
1828 .hw.init = &(struct clk_init_data){
1830 .parent_hws = (const struct clk_hw*[]){
1834 .ops = &clk_branch_ops,
1835 .flags = CLK_SET_RATE_PARENT,
1840 static struct clk_branch vfe_csi_clk = {
1844 .enable_reg = 0x0104,
1845 .enable_mask = BIT(12),
1846 .hw.init = &(struct clk_init_data){
1847 .parent_hws = (const struct clk_hw*[]){
1851 .name = "vfe_csi_clk",
1852 .ops = &clk_branch_ops,
1853 .flags = CLK_SET_RATE_PARENT,
1858 static struct clk_branch gmem_axi_clk = {
1862 .enable_reg = 0x0018,
1863 .enable_mask = BIT(24),
1864 .hw.init = &(struct clk_init_data){
1865 .name = "gmem_axi_clk",
1866 .ops = &clk_branch_ops,
1871 static struct clk_branch ijpeg_axi_clk = {
1877 .enable_reg = 0x0018,
1878 .enable_mask = BIT(21),
1879 .hw.init = &(struct clk_init_data){
1880 .name = "ijpeg_axi_clk",
1881 .ops = &clk_branch_ops,
1886 static struct clk_branch mmss_imem_axi_clk = {
1892 .enable_reg = 0x0018,
1893 .enable_mask = BIT(22),
1894 .hw.init = &(struct clk_init_data){
1895 .name = "mmss_imem_axi_clk",
1896 .ops = &clk_branch_ops,
1901 static struct clk_branch jpegd_axi_clk = {
1905 .enable_reg = 0x0018,
1906 .enable_mask = BIT(25),
1907 .hw.init = &(struct clk_init_data){
1908 .name = "jpegd_axi_clk",
1909 .ops = &clk_branch_ops,
1914 static struct clk_branch vcodec_axi_b_clk = {
1920 .enable_reg = 0x0114,
1921 .enable_mask = BIT(23),
1922 .hw.init = &(struct clk_init_data){
1923 .name = "vcodec_axi_b_clk",
1924 .ops = &clk_branch_ops,
1929 static struct clk_branch vcodec_axi_a_clk = {
1935 .enable_reg = 0x0114,
1936 .enable_mask = BIT(25),
1937 .hw.init = &(struct clk_init_data){
1938 .name = "vcodec_axi_a_clk",
1939 .ops = &clk_branch_ops,
1944 static struct clk_branch vcodec_axi_clk = {
1950 .enable_reg = 0x0018,
1951 .enable_mask = BIT(19),
1952 .hw.init = &(struct clk_init_data){
1953 .name = "vcodec_axi_clk",
1954 .ops = &clk_branch_ops,
1959 static struct clk_branch vfe_axi_clk = {
1963 .enable_reg = 0x0018,
1964 .enable_mask = BIT(18),
1965 .hw.init = &(struct clk_init_data){
1966 .name = "vfe_axi_clk",
1967 .ops = &clk_branch_ops,
1972 static struct clk_branch mdp_axi_clk = {
1978 .enable_reg = 0x0018,
1979 .enable_mask = BIT(23),
1980 .hw.init = &(struct clk_init_data){
1981 .name = "mdp_axi_clk",
1982 .ops = &clk_branch_ops,
1987 static struct clk_branch rot_axi_clk = {
1993 .enable_reg = 0x0020,
1994 .enable_mask = BIT(24),
1995 .hw.init = &(struct clk_init_data){
1996 .name = "rot_axi_clk",
1997 .ops = &clk_branch_ops,
2002 static struct clk_branch vcap_axi_clk = {
2008 .enable_reg = 0x0244,
2009 .enable_mask = BIT(12),
2010 .hw.init = &(struct clk_init_data){
2011 .name = "vcap_axi_clk",
2012 .ops = &clk_branch_ops,
2017 static struct clk_branch vpe_axi_clk = {
2023 .enable_reg = 0x0020,
2024 .enable_mask = BIT(26),
2025 .hw.init = &(struct clk_init_data){
2026 .name = "vpe_axi_clk",
2027 .ops = &clk_branch_ops,
2032 static struct clk_branch gfx3d_axi_clk = {
2038 .enable_reg = 0x0244,
2039 .enable_mask = BIT(25),
2040 .hw.init = &(struct clk_init_data){
2041 .name = "gfx3d_axi_clk",
2042 .ops = &clk_branch_ops,
2047 static struct clk_branch amp_ahb_clk = {
2051 .enable_reg = 0x0008,
2052 .enable_mask = BIT(24),
2053 .hw.init = &(struct clk_init_data){
2054 .name = "amp_ahb_clk",
2055 .ops = &clk_branch_ops,
2060 static struct clk_branch csi_ahb_clk = {
2064 .enable_reg = 0x0008,
2065 .enable_mask = BIT(7),
2066 .hw.init = &(struct clk_init_data){
2067 .name = "csi_ahb_clk",
2068 .ops = &clk_branch_ops,
2073 static struct clk_branch dsi_m_ahb_clk = {
2077 .enable_reg = 0x0008,
2078 .enable_mask = BIT(9),
2079 .hw.init = &(struct clk_init_data){
2080 .name = "dsi_m_ahb_clk",
2081 .ops = &clk_branch_ops,
2086 static struct clk_branch dsi_s_ahb_clk = {
2092 .enable_reg = 0x0008,
2093 .enable_mask = BIT(18),
2094 .hw.init = &(struct clk_init_data){
2095 .name = "dsi_s_ahb_clk",
2096 .ops = &clk_branch_ops,
2101 static struct clk_branch dsi2_m_ahb_clk = {
2105 .enable_reg = 0x0008,
2106 .enable_mask = BIT(17),
2107 .hw.init = &(struct clk_init_data){
2108 .name = "dsi2_m_ahb_clk",
2109 .ops = &clk_branch_ops,
2114 static struct clk_branch dsi2_s_ahb_clk = {
2120 .enable_reg = 0x0008,
2121 .enable_mask = BIT(22),
2122 .hw.init = &(struct clk_init_data){
2123 .name = "dsi2_s_ahb_clk",
2124 .ops = &clk_branch_ops,
2129 static struct clk_rcg dsi1_src = {
2134 .mnctr_reset_bit = 7,
2135 .mnctr_mode_shift = 6,
2141 .pre_div_shift = 14,
2146 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2149 .enable_reg = 0x004c,
2150 .enable_mask = BIT(2),
2151 .hw.init = &(struct clk_init_data){
2153 .parent_data = mmcc_pxo_dsi2_dsi1,
2154 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
2155 .ops = &clk_rcg_bypass2_ops,
2156 .flags = CLK_SET_RATE_PARENT,
2161 static struct clk_branch dsi1_clk = {
2165 .enable_reg = 0x004c,
2166 .enable_mask = BIT(0),
2167 .hw.init = &(struct clk_init_data){
2169 .parent_hws = (const struct clk_hw*[]){
2173 .ops = &clk_branch_ops,
2174 .flags = CLK_SET_RATE_PARENT,
2179 static struct clk_rcg dsi2_src = {
2184 .mnctr_reset_bit = 7,
2185 .mnctr_mode_shift = 6,
2191 .pre_div_shift = 14,
2196 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2199 .enable_reg = 0x003c,
2200 .enable_mask = BIT(2),
2201 .hw.init = &(struct clk_init_data){
2203 .parent_data = mmcc_pxo_dsi2_dsi1,
2204 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
2205 .ops = &clk_rcg_bypass2_ops,
2206 .flags = CLK_SET_RATE_PARENT,
2211 static struct clk_branch dsi2_clk = {
2215 .enable_reg = 0x003c,
2216 .enable_mask = BIT(0),
2217 .hw.init = &(struct clk_init_data){
2219 .parent_hws = (const struct clk_hw*[]){
2223 .ops = &clk_branch_ops,
2224 .flags = CLK_SET_RATE_PARENT,
2229 static struct clk_rcg dsi1_byte_src = {
2232 .pre_div_shift = 12,
2237 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2240 .enable_reg = 0x0090,
2241 .enable_mask = BIT(2),
2242 .hw.init = &(struct clk_init_data){
2243 .name = "dsi1_byte_src",
2244 .parent_data = mmcc_pxo_dsi1_dsi2_byte,
2245 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
2246 .ops = &clk_rcg_bypass2_ops,
2247 .flags = CLK_SET_RATE_PARENT,
2252 static struct clk_branch dsi1_byte_clk = {
2256 .enable_reg = 0x0090,
2257 .enable_mask = BIT(0),
2258 .hw.init = &(struct clk_init_data){
2259 .name = "dsi1_byte_clk",
2260 .parent_hws = (const struct clk_hw*[]){
2261 &dsi1_byte_src.clkr.hw
2264 .ops = &clk_branch_ops,
2265 .flags = CLK_SET_RATE_PARENT,
2270 static struct clk_rcg dsi2_byte_src = {
2273 .pre_div_shift = 12,
2278 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2281 .enable_reg = 0x0130,
2282 .enable_mask = BIT(2),
2283 .hw.init = &(struct clk_init_data){
2284 .name = "dsi2_byte_src",
2285 .parent_data = mmcc_pxo_dsi1_dsi2_byte,
2286 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
2287 .ops = &clk_rcg_bypass2_ops,
2288 .flags = CLK_SET_RATE_PARENT,
2293 static struct clk_branch dsi2_byte_clk = {
2297 .enable_reg = 0x00b4,
2298 .enable_mask = BIT(0),
2299 .hw.init = &(struct clk_init_data){
2300 .name = "dsi2_byte_clk",
2301 .parent_hws = (const struct clk_hw*[]){
2302 &dsi2_byte_src.clkr.hw
2305 .ops = &clk_branch_ops,
2306 .flags = CLK_SET_RATE_PARENT,
2311 static struct clk_rcg dsi1_esc_src = {
2314 .pre_div_shift = 12,
2319 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2322 .enable_reg = 0x00cc,
2323 .enable_mask = BIT(2),
2324 .hw.init = &(struct clk_init_data){
2325 .name = "dsi1_esc_src",
2326 .parent_data = mmcc_pxo_dsi1_dsi2_byte,
2327 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
2328 .ops = &clk_rcg_esc_ops,
2333 static struct clk_branch dsi1_esc_clk = {
2337 .enable_reg = 0x00cc,
2338 .enable_mask = BIT(0),
2339 .hw.init = &(struct clk_init_data){
2340 .name = "dsi1_esc_clk",
2341 .parent_hws = (const struct clk_hw*[]){
2342 &dsi1_esc_src.clkr.hw
2345 .ops = &clk_branch_ops,
2346 .flags = CLK_SET_RATE_PARENT,
2351 static struct clk_rcg dsi2_esc_src = {
2354 .pre_div_shift = 12,
2359 .parent_map = mmcc_pxo_dsi1_dsi2_byte_map,
2362 .enable_reg = 0x013c,
2363 .enable_mask = BIT(2),
2364 .hw.init = &(struct clk_init_data){
2365 .name = "dsi2_esc_src",
2366 .parent_data = mmcc_pxo_dsi1_dsi2_byte,
2367 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi1_dsi2_byte),
2368 .ops = &clk_rcg_esc_ops,
2373 static struct clk_branch dsi2_esc_clk = {
2377 .enable_reg = 0x013c,
2378 .enable_mask = BIT(0),
2379 .hw.init = &(struct clk_init_data){
2380 .name = "dsi2_esc_clk",
2381 .parent_hws = (const struct clk_hw*[]){
2382 &dsi2_esc_src.clkr.hw
2385 .ops = &clk_branch_ops,
2386 .flags = CLK_SET_RATE_PARENT,
2391 static struct clk_rcg dsi1_pixel_src = {
2396 .mnctr_reset_bit = 7,
2397 .mnctr_mode_shift = 6,
2403 .pre_div_shift = 12,
2408 .parent_map = mmcc_pxo_dsi2_dsi1_map,
2411 .enable_reg = 0x0130,
2412 .enable_mask = BIT(2),
2413 .hw.init = &(struct clk_init_data){
2414 .name = "dsi1_pixel_src",
2415 .parent_data = mmcc_pxo_dsi2_dsi1,
2416 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1),
2417 .ops = &clk_rcg_pixel_ops,
2422 static struct clk_branch dsi1_pixel_clk = {
2426 .enable_reg = 0x0130,
2427 .enable_mask = BIT(0),
2428 .hw.init = &(struct clk_init_data){
2429 .name = "mdp_pclk1_clk",
2430 .parent_hws = (const struct clk_hw*[]){
2431 &dsi1_pixel_src.clkr.hw
2434 .ops = &clk_branch_ops,
2435 .flags = CLK_SET_RATE_PARENT,
2440 static struct clk_rcg dsi2_pixel_src = {
2445 .mnctr_reset_bit = 7,
2446 .mnctr_mode_shift = 6,
2452 .pre_div_shift = 12,
2457 .parent_map = mmcc_pxo_dsi2_dsi1_lvds_map,
2460 .enable_reg = 0x0094,
2461 .enable_mask = BIT(2),
2462 .hw.init = &(struct clk_init_data){
2463 .name = "dsi2_pixel_src",
2464 .parent_data = mmcc_pxo_dsi2_dsi1_lvds,
2465 .num_parents = ARRAY_SIZE(mmcc_pxo_dsi2_dsi1_lvds),
2466 .ops = &clk_rcg_pixel_ops,
2471 static struct clk_branch dsi2_pixel_lvds_src = {
2473 .enable_reg = 0x0094,
2474 .enable_mask = BIT(0),
2475 .hw.init = &(struct clk_init_data){
2476 .name = "dsi2_pixel_lvds_src",
2477 .parent_hws = (const struct clk_hw*[]){
2478 &dsi2_pixel_src.clkr.hw
2481 .ops = &clk_branch_simple_ops,
2482 .flags = CLK_SET_RATE_PARENT,
2487 static struct clk_branch dsi2_pixel_clk = {
2491 .enable_reg = 0x0094,
2493 .hw.init = &(struct clk_init_data){
2494 .name = "mdp_pclk2_clk",
2495 .parent_hws = (const struct clk_hw*[]){
2496 &dsi2_pixel_src.clkr.hw
2499 .ops = &clk_branch_ops,
2500 .flags = CLK_SET_RATE_PARENT,
2505 static struct clk_branch lvds_clk = {
2509 .enable_reg = 0x0264,
2510 .enable_mask = BIT(1),
2511 .hw.init = &(struct clk_init_data){
2512 .name = "mdp_lvds_clk",
2513 .parent_hws = (const struct clk_hw*[]){
2514 &dsi2_pixel_lvds_src.clkr.hw
2517 .ops = &clk_branch_ops,
2518 .flags = CLK_SET_RATE_PARENT,
2523 static struct clk_branch gfx2d0_ahb_clk = {
2529 .enable_reg = 0x0008,
2530 .enable_mask = BIT(19),
2531 .hw.init = &(struct clk_init_data){
2532 .name = "gfx2d0_ahb_clk",
2533 .ops = &clk_branch_ops,
2538 static struct clk_branch gfx2d1_ahb_clk = {
2544 .enable_reg = 0x0008,
2545 .enable_mask = BIT(2),
2546 .hw.init = &(struct clk_init_data){
2547 .name = "gfx2d1_ahb_clk",
2548 .ops = &clk_branch_ops,
2553 static struct clk_branch gfx3d_ahb_clk = {
2559 .enable_reg = 0x0008,
2560 .enable_mask = BIT(3),
2561 .hw.init = &(struct clk_init_data){
2562 .name = "gfx3d_ahb_clk",
2563 .ops = &clk_branch_ops,
2568 static struct clk_branch hdmi_m_ahb_clk = {
2574 .enable_reg = 0x0008,
2575 .enable_mask = BIT(14),
2576 .hw.init = &(struct clk_init_data){
2577 .name = "hdmi_m_ahb_clk",
2578 .ops = &clk_branch_ops,
2583 static struct clk_branch hdmi_s_ahb_clk = {
2589 .enable_reg = 0x0008,
2590 .enable_mask = BIT(4),
2591 .hw.init = &(struct clk_init_data){
2592 .name = "hdmi_s_ahb_clk",
2593 .ops = &clk_branch_ops,
2598 static struct clk_branch ijpeg_ahb_clk = {
2602 .enable_reg = 0x0008,
2603 .enable_mask = BIT(5),
2604 .hw.init = &(struct clk_init_data){
2605 .name = "ijpeg_ahb_clk",
2606 .ops = &clk_branch_ops,
2611 static struct clk_branch mmss_imem_ahb_clk = {
2617 .enable_reg = 0x0008,
2618 .enable_mask = BIT(6),
2619 .hw.init = &(struct clk_init_data){
2620 .name = "mmss_imem_ahb_clk",
2621 .ops = &clk_branch_ops,
2626 static struct clk_branch jpegd_ahb_clk = {
2630 .enable_reg = 0x0008,
2631 .enable_mask = BIT(21),
2632 .hw.init = &(struct clk_init_data){
2633 .name = "jpegd_ahb_clk",
2634 .ops = &clk_branch_ops,
2639 static struct clk_branch mdp_ahb_clk = {
2643 .enable_reg = 0x0008,
2644 .enable_mask = BIT(10),
2645 .hw.init = &(struct clk_init_data){
2646 .name = "mdp_ahb_clk",
2647 .ops = &clk_branch_ops,
2652 static struct clk_branch rot_ahb_clk = {
2656 .enable_reg = 0x0008,
2657 .enable_mask = BIT(12),
2658 .hw.init = &(struct clk_init_data){
2659 .name = "rot_ahb_clk",
2660 .ops = &clk_branch_ops,
2665 static struct clk_branch smmu_ahb_clk = {
2671 .enable_reg = 0x0008,
2672 .enable_mask = BIT(15),
2673 .hw.init = &(struct clk_init_data){
2674 .name = "smmu_ahb_clk",
2675 .ops = &clk_branch_ops,
2680 static struct clk_branch tv_enc_ahb_clk = {
2684 .enable_reg = 0x0008,
2685 .enable_mask = BIT(25),
2686 .hw.init = &(struct clk_init_data){
2687 .name = "tv_enc_ahb_clk",
2688 .ops = &clk_branch_ops,
2693 static struct clk_branch vcap_ahb_clk = {
2697 .enable_reg = 0x0248,
2698 .enable_mask = BIT(1),
2699 .hw.init = &(struct clk_init_data){
2700 .name = "vcap_ahb_clk",
2701 .ops = &clk_branch_ops,
2706 static struct clk_branch vcodec_ahb_clk = {
2712 .enable_reg = 0x0008,
2713 .enable_mask = BIT(11),
2714 .hw.init = &(struct clk_init_data){
2715 .name = "vcodec_ahb_clk",
2716 .ops = &clk_branch_ops,
2721 static struct clk_branch vfe_ahb_clk = {
2725 .enable_reg = 0x0008,
2726 .enable_mask = BIT(13),
2727 .hw.init = &(struct clk_init_data){
2728 .name = "vfe_ahb_clk",
2729 .ops = &clk_branch_ops,
2734 static struct clk_branch vpe_ahb_clk = {
2738 .enable_reg = 0x0008,
2739 .enable_mask = BIT(16),
2740 .hw.init = &(struct clk_init_data){
2741 .name = "vpe_ahb_clk",
2742 .ops = &clk_branch_ops,
2747 static struct clk_regmap *mmcc_msm8960_clks[] = {
2748 [TV_ENC_AHB_CLK] = &tv_enc_ahb_clk.clkr,
2749 [AMP_AHB_CLK] = &_ahb_clk.clkr,
2750 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
2751 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
2752 [GFX2D0_AHB_CLK] = &gfx2d0_ahb_clk.clkr,
2753 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
2754 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
2755 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
2756 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
2757 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
2758 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
2759 [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
2760 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
2761 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
2762 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
2763 [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
2764 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
2765 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
2766 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
2767 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
2768 [GFX2D1_AHB_CLK] = &gfx2d1_ahb_clk.clkr,
2769 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
2770 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
2771 [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
2772 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
2773 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
2774 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
2775 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
2776 [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
2777 [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
2778 [ROT_AXI_CLK] = &rot_axi_clk.clkr,
2779 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
2780 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
2781 [CSI0_SRC] = &csi0_src.clkr,
2782 [CSI0_CLK] = &csi0_clk.clkr,
2783 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
2784 [CSI1_SRC] = &csi1_src.clkr,
2785 [CSI1_CLK] = &csi1_clk.clkr,
2786 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
2787 [CSI2_SRC] = &csi2_src.clkr,
2788 [CSI2_CLK] = &csi2_clk.clkr,
2789 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
2790 [DSI_SRC] = &dsi1_src.clkr,
2791 [DSI_CLK] = &dsi1_clk.clkr,
2792 [CSI_PIX_CLK] = &csi_pix_clk.clkr,
2793 [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
2794 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
2795 [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
2796 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
2797 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
2798 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
2799 [GFX2D0_SRC] = &gfx2d0_src.clkr,
2800 [GFX2D0_CLK] = &gfx2d0_clk.clkr,
2801 [GFX2D1_SRC] = &gfx2d1_src.clkr,
2802 [GFX2D1_CLK] = &gfx2d1_clk.clkr,
2803 [GFX3D_SRC] = &gfx3d_src.clkr,
2804 [GFX3D_CLK] = &gfx3d_clk.clkr,
2805 [IJPEG_SRC] = &ijpeg_src.clkr,
2806 [IJPEG_CLK] = &ijpeg_clk.clkr,
2807 [JPEGD_SRC] = &jpegd_src.clkr,
2808 [JPEGD_CLK] = &jpegd_clk.clkr,
2809 [MDP_SRC] = &mdp_src.clkr,
2810 [MDP_CLK] = &mdp_clk.clkr,
2811 [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
2812 [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr,
2813 [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr,
2814 [DSI2_SRC] = &dsi2_src.clkr,
2815 [DSI2_CLK] = &dsi2_clk.clkr,
2816 [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr,
2817 [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr,
2818 [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr,
2819 [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr,
2820 [DSI1_ESC_SRC] = &dsi1_esc_src.clkr,
2821 [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr,
2822 [DSI2_ESC_SRC] = &dsi2_esc_src.clkr,
2823 [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr,
2824 [ROT_SRC] = &rot_src.clkr,
2825 [ROT_CLK] = &rot_clk.clkr,
2826 [TV_ENC_CLK] = &tv_enc_clk.clkr,
2827 [TV_DAC_CLK] = &tv_dac_clk.clkr,
2828 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
2829 [MDP_TV_CLK] = &mdp_tv_clk.clkr,
2830 [TV_SRC] = &tv_src.clkr,
2831 [VCODEC_SRC] = &vcodec_src.clkr,
2832 [VCODEC_CLK] = &vcodec_clk.clkr,
2833 [VFE_SRC] = &vfe_src.clkr,
2834 [VFE_CLK] = &vfe_clk.clkr,
2835 [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
2836 [VPE_SRC] = &vpe_src.clkr,
2837 [VPE_CLK] = &vpe_clk.clkr,
2838 [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr,
2839 [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr,
2840 [CAMCLK0_SRC] = &camclk0_src.clkr,
2841 [CAMCLK0_CLK] = &camclk0_clk.clkr,
2842 [CAMCLK1_SRC] = &camclk1_src.clkr,
2843 [CAMCLK1_CLK] = &camclk1_clk.clkr,
2844 [CAMCLK2_SRC] = &camclk2_src.clkr,
2845 [CAMCLK2_CLK] = &camclk2_clk.clkr,
2846 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
2847 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
2848 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
2849 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
2850 [PLL2] = &pll2.clkr,
2851 [DSI2_PIXEL_LVDS_SRC] = &dsi2_pixel_lvds_src.clkr,
2852 [LVDS_CLK] = &lvds_clk.clkr,
2855 static const struct qcom_reset_map mmcc_msm8960_resets[] = {
2856 [VPE_AXI_RESET] = { 0x0208, 15 },
2857 [IJPEG_AXI_RESET] = { 0x0208, 14 },
2858 [MPD_AXI_RESET] = { 0x0208, 13 },
2859 [VFE_AXI_RESET] = { 0x0208, 9 },
2860 [SP_AXI_RESET] = { 0x0208, 8 },
2861 [VCODEC_AXI_RESET] = { 0x0208, 7 },
2862 [ROT_AXI_RESET] = { 0x0208, 6 },
2863 [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
2864 [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
2865 [FAB_S3_AXI_RESET] = { 0x0208, 3 },
2866 [FAB_S2_AXI_RESET] = { 0x0208, 2 },
2867 [FAB_S1_AXI_RESET] = { 0x0208, 1 },
2868 [FAB_S0_AXI_RESET] = { 0x0208 },
2869 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
2870 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
2871 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
2872 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
2873 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
2874 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
2875 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
2876 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
2877 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
2878 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
2879 [SMMU_GFX2D0_AHB_RESET] = { 0x020c, 21 },
2880 [SMMU_GFX2D1_AHB_RESET] = { 0x020c, 20 },
2881 [APU_AHB_RESET] = { 0x020c, 18 },
2882 [CSI_AHB_RESET] = { 0x020c, 17 },
2883 [TV_ENC_AHB_RESET] = { 0x020c, 15 },
2884 [VPE_AHB_RESET] = { 0x020c, 14 },
2885 [FABRIC_AHB_RESET] = { 0x020c, 13 },
2886 [GFX2D0_AHB_RESET] = { 0x020c, 12 },
2887 [GFX2D1_AHB_RESET] = { 0x020c, 11 },
2888 [GFX3D_AHB_RESET] = { 0x020c, 10 },
2889 [HDMI_AHB_RESET] = { 0x020c, 9 },
2890 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
2891 [IJPEG_AHB_RESET] = { 0x020c, 7 },
2892 [DSI_M_AHB_RESET] = { 0x020c, 6 },
2893 [DSI_S_AHB_RESET] = { 0x020c, 5 },
2894 [JPEGD_AHB_RESET] = { 0x020c, 4 },
2895 [MDP_AHB_RESET] = { 0x020c, 3 },
2896 [ROT_AHB_RESET] = { 0x020c, 2 },
2897 [VCODEC_AHB_RESET] = { 0x020c, 1 },
2898 [VFE_AHB_RESET] = { 0x020c, 0 },
2899 [DSI2_M_AHB_RESET] = { 0x0210, 31 },
2900 [DSI2_S_AHB_RESET] = { 0x0210, 30 },
2901 [CSIPHY2_RESET] = { 0x0210, 29 },
2902 [CSI_PIX1_RESET] = { 0x0210, 28 },
2903 [CSIPHY0_RESET] = { 0x0210, 27 },
2904 [CSIPHY1_RESET] = { 0x0210, 26 },
2905 [DSI2_RESET] = { 0x0210, 25 },
2906 [VFE_CSI_RESET] = { 0x0210, 24 },
2907 [MDP_RESET] = { 0x0210, 21 },
2908 [AMP_RESET] = { 0x0210, 20 },
2909 [JPEGD_RESET] = { 0x0210, 19 },
2910 [CSI1_RESET] = { 0x0210, 18 },
2911 [VPE_RESET] = { 0x0210, 17 },
2912 [MMSS_FABRIC_RESET] = { 0x0210, 16 },
2913 [VFE_RESET] = { 0x0210, 15 },
2914 [GFX2D0_RESET] = { 0x0210, 14 },
2915 [GFX2D1_RESET] = { 0x0210, 13 },
2916 [GFX3D_RESET] = { 0x0210, 12 },
2917 [HDMI_RESET] = { 0x0210, 11 },
2918 [MMSS_IMEM_RESET] = { 0x0210, 10 },
2919 [IJPEG_RESET] = { 0x0210, 9 },
2920 [CSI0_RESET] = { 0x0210, 8 },
2921 [DSI_RESET] = { 0x0210, 7 },
2922 [VCODEC_RESET] = { 0x0210, 6 },
2923 [MDP_TV_RESET] = { 0x0210, 4 },
2924 [MDP_VSYNC_RESET] = { 0x0210, 3 },
2925 [ROT_RESET] = { 0x0210, 2 },
2926 [TV_HDMI_RESET] = { 0x0210, 1 },
2927 [TV_ENC_RESET] = { 0x0210 },
2928 [CSI2_RESET] = { 0x0214, 2 },
2929 [CSI_RDI1_RESET] = { 0x0214, 1 },
2930 [CSI_RDI2_RESET] = { 0x0214 },
2933 static struct clk_regmap *mmcc_apq8064_clks[] = {
2934 [AMP_AHB_CLK] = &_ahb_clk.clkr,
2935 [DSI2_S_AHB_CLK] = &dsi2_s_ahb_clk.clkr,
2936 [JPEGD_AHB_CLK] = &jpegd_ahb_clk.clkr,
2937 [DSI_S_AHB_CLK] = &dsi_s_ahb_clk.clkr,
2938 [DSI2_M_AHB_CLK] = &dsi2_m_ahb_clk.clkr,
2939 [VPE_AHB_CLK] = &vpe_ahb_clk.clkr,
2940 [SMMU_AHB_CLK] = &smmu_ahb_clk.clkr,
2941 [HDMI_M_AHB_CLK] = &hdmi_m_ahb_clk.clkr,
2942 [VFE_AHB_CLK] = &vfe_ahb_clk.clkr,
2943 [ROT_AHB_CLK] = &rot_ahb_clk.clkr,
2944 [VCODEC_AHB_CLK] = &vcodec_ahb_clk.clkr,
2945 [MDP_AHB_CLK] = &mdp_ahb_clk.clkr,
2946 [DSI_M_AHB_CLK] = &dsi_m_ahb_clk.clkr,
2947 [CSI_AHB_CLK] = &csi_ahb_clk.clkr,
2948 [MMSS_IMEM_AHB_CLK] = &mmss_imem_ahb_clk.clkr,
2949 [IJPEG_AHB_CLK] = &ijpeg_ahb_clk.clkr,
2950 [HDMI_S_AHB_CLK] = &hdmi_s_ahb_clk.clkr,
2951 [GFX3D_AHB_CLK] = &gfx3d_ahb_clk.clkr,
2952 [JPEGD_AXI_CLK] = &jpegd_axi_clk.clkr,
2953 [GMEM_AXI_CLK] = &gmem_axi_clk.clkr,
2954 [MDP_AXI_CLK] = &mdp_axi_clk.clkr,
2955 [MMSS_IMEM_AXI_CLK] = &mmss_imem_axi_clk.clkr,
2956 [IJPEG_AXI_CLK] = &ijpeg_axi_clk.clkr,
2957 [GFX3D_AXI_CLK] = &gfx3d_axi_clk.clkr,
2958 [VCODEC_AXI_CLK] = &vcodec_axi_clk.clkr,
2959 [VFE_AXI_CLK] = &vfe_axi_clk.clkr,
2960 [VPE_AXI_CLK] = &vpe_axi_clk.clkr,
2961 [ROT_AXI_CLK] = &rot_axi_clk.clkr,
2962 [VCODEC_AXI_A_CLK] = &vcodec_axi_a_clk.clkr,
2963 [VCODEC_AXI_B_CLK] = &vcodec_axi_b_clk.clkr,
2964 [CSI0_SRC] = &csi0_src.clkr,
2965 [CSI0_CLK] = &csi0_clk.clkr,
2966 [CSI0_PHY_CLK] = &csi0_phy_clk.clkr,
2967 [CSI1_SRC] = &csi1_src.clkr,
2968 [CSI1_CLK] = &csi1_clk.clkr,
2969 [CSI1_PHY_CLK] = &csi1_phy_clk.clkr,
2970 [CSI2_SRC] = &csi2_src.clkr,
2971 [CSI2_CLK] = &csi2_clk.clkr,
2972 [CSI2_PHY_CLK] = &csi2_phy_clk.clkr,
2973 [DSI_SRC] = &dsi1_src.clkr,
2974 [DSI_CLK] = &dsi1_clk.clkr,
2975 [CSI_PIX_CLK] = &csi_pix_clk.clkr,
2976 [CSI_RDI_CLK] = &csi_rdi_clk.clkr,
2977 [MDP_VSYNC_CLK] = &mdp_vsync_clk.clkr,
2978 [HDMI_APP_CLK] = &hdmi_app_clk.clkr,
2979 [CSI_PIX1_CLK] = &csi_pix1_clk.clkr,
2980 [CSI_RDI2_CLK] = &csi_rdi2_clk.clkr,
2981 [CSI_RDI1_CLK] = &csi_rdi1_clk.clkr,
2982 [GFX3D_SRC] = &gfx3d_src.clkr,
2983 [GFX3D_CLK] = &gfx3d_clk.clkr,
2984 [IJPEG_SRC] = &ijpeg_src.clkr,
2985 [IJPEG_CLK] = &ijpeg_clk.clkr,
2986 [JPEGD_SRC] = &jpegd_src.clkr,
2987 [JPEGD_CLK] = &jpegd_clk.clkr,
2988 [MDP_SRC] = &mdp_src.clkr,
2989 [MDP_CLK] = &mdp_clk.clkr,
2990 [MDP_LUT_CLK] = &mdp_lut_clk.clkr,
2991 [DSI2_PIXEL_SRC] = &dsi2_pixel_src.clkr,
2992 [DSI2_PIXEL_CLK] = &dsi2_pixel_clk.clkr,
2993 [DSI2_SRC] = &dsi2_src.clkr,
2994 [DSI2_CLK] = &dsi2_clk.clkr,
2995 [DSI1_BYTE_SRC] = &dsi1_byte_src.clkr,
2996 [DSI1_BYTE_CLK] = &dsi1_byte_clk.clkr,
2997 [DSI2_BYTE_SRC] = &dsi2_byte_src.clkr,
2998 [DSI2_BYTE_CLK] = &dsi2_byte_clk.clkr,
2999 [DSI1_ESC_SRC] = &dsi1_esc_src.clkr,
3000 [DSI1_ESC_CLK] = &dsi1_esc_clk.clkr,
3001 [DSI2_ESC_SRC] = &dsi2_esc_src.clkr,
3002 [DSI2_ESC_CLK] = &dsi2_esc_clk.clkr,
3003 [ROT_SRC] = &rot_src.clkr,
3004 [ROT_CLK] = &rot_clk.clkr,
3005 [TV_DAC_CLK] = &tv_dac_clk.clkr,
3006 [HDMI_TV_CLK] = &hdmi_tv_clk.clkr,
3007 [MDP_TV_CLK] = &mdp_tv_clk.clkr,
3008 [TV_SRC] = &tv_src.clkr,
3009 [VCODEC_SRC] = &vcodec_src.clkr,
3010 [VCODEC_CLK] = &vcodec_clk.clkr,
3011 [VFE_SRC] = &vfe_src.clkr,
3012 [VFE_CLK] = &vfe_clk.clkr,
3013 [VFE_CSI_CLK] = &vfe_csi_clk.clkr,
3014 [VPE_SRC] = &vpe_src.clkr,
3015 [VPE_CLK] = &vpe_clk.clkr,
3016 [DSI_PIXEL_SRC] = &dsi1_pixel_src.clkr,
3017 [DSI_PIXEL_CLK] = &dsi1_pixel_clk.clkr,
3018 [CAMCLK0_SRC] = &camclk0_src.clkr,
3019 [CAMCLK0_CLK] = &camclk0_clk.clkr,
3020 [CAMCLK1_SRC] = &camclk1_src.clkr,
3021 [CAMCLK1_CLK] = &camclk1_clk.clkr,
3022 [CAMCLK2_SRC] = &camclk2_src.clkr,
3023 [CAMCLK2_CLK] = &camclk2_clk.clkr,
3024 [CSIPHYTIMER_SRC] = &csiphytimer_src.clkr,
3025 [CSIPHY2_TIMER_CLK] = &csiphy2_timer_clk.clkr,
3026 [CSIPHY1_TIMER_CLK] = &csiphy1_timer_clk.clkr,
3027 [CSIPHY0_TIMER_CLK] = &csiphy0_timer_clk.clkr,
3028 [PLL2] = &pll2.clkr,
3029 [RGB_TV_CLK] = &rgb_tv_clk.clkr,
3030 [NPL_TV_CLK] = &npl_tv_clk.clkr,
3031 [VCAP_AHB_CLK] = &vcap_ahb_clk.clkr,
3032 [VCAP_AXI_CLK] = &vcap_axi_clk.clkr,
3033 [VCAP_SRC] = &vcap_src.clkr,
3034 [VCAP_CLK] = &vcap_clk.clkr,
3035 [VCAP_NPL_CLK] = &vcap_npl_clk.clkr,
3036 [PLL15] = &pll15.clkr,
3037 [DSI2_PIXEL_LVDS_SRC] = &dsi2_pixel_lvds_src.clkr,
3038 [LVDS_CLK] = &lvds_clk.clkr,
3041 static const struct qcom_reset_map mmcc_apq8064_resets[] = {
3042 [GFX3D_AXI_RESET] = { 0x0208, 17 },
3043 [VCAP_AXI_RESET] = { 0x0208, 16 },
3044 [VPE_AXI_RESET] = { 0x0208, 15 },
3045 [IJPEG_AXI_RESET] = { 0x0208, 14 },
3046 [MPD_AXI_RESET] = { 0x0208, 13 },
3047 [VFE_AXI_RESET] = { 0x0208, 9 },
3048 [SP_AXI_RESET] = { 0x0208, 8 },
3049 [VCODEC_AXI_RESET] = { 0x0208, 7 },
3050 [ROT_AXI_RESET] = { 0x0208, 6 },
3051 [VCODEC_AXI_A_RESET] = { 0x0208, 5 },
3052 [VCODEC_AXI_B_RESET] = { 0x0208, 4 },
3053 [FAB_S3_AXI_RESET] = { 0x0208, 3 },
3054 [FAB_S2_AXI_RESET] = { 0x0208, 2 },
3055 [FAB_S1_AXI_RESET] = { 0x0208, 1 },
3056 [FAB_S0_AXI_RESET] = { 0x0208 },
3057 [SMMU_GFX3D_ABH_RESET] = { 0x020c, 31 },
3058 [SMMU_VPE_AHB_RESET] = { 0x020c, 30 },
3059 [SMMU_VFE_AHB_RESET] = { 0x020c, 29 },
3060 [SMMU_ROT_AHB_RESET] = { 0x020c, 28 },
3061 [SMMU_VCODEC_B_AHB_RESET] = { 0x020c, 27 },
3062 [SMMU_VCODEC_A_AHB_RESET] = { 0x020c, 26 },
3063 [SMMU_MDP1_AHB_RESET] = { 0x020c, 25 },
3064 [SMMU_MDP0_AHB_RESET] = { 0x020c, 24 },
3065 [SMMU_JPEGD_AHB_RESET] = { 0x020c, 23 },
3066 [SMMU_IJPEG_AHB_RESET] = { 0x020c, 22 },
3067 [APU_AHB_RESET] = { 0x020c, 18 },
3068 [CSI_AHB_RESET] = { 0x020c, 17 },
3069 [TV_ENC_AHB_RESET] = { 0x020c, 15 },
3070 [VPE_AHB_RESET] = { 0x020c, 14 },
3071 [FABRIC_AHB_RESET] = { 0x020c, 13 },
3072 [GFX3D_AHB_RESET] = { 0x020c, 10 },
3073 [HDMI_AHB_RESET] = { 0x020c, 9 },
3074 [MSSS_IMEM_AHB_RESET] = { 0x020c, 8 },
3075 [IJPEG_AHB_RESET] = { 0x020c, 7 },
3076 [DSI_M_AHB_RESET] = { 0x020c, 6 },
3077 [DSI_S_AHB_RESET] = { 0x020c, 5 },
3078 [JPEGD_AHB_RESET] = { 0x020c, 4 },
3079 [MDP_AHB_RESET] = { 0x020c, 3 },
3080 [ROT_AHB_RESET] = { 0x020c, 2 },
3081 [VCODEC_AHB_RESET] = { 0x020c, 1 },
3082 [VFE_AHB_RESET] = { 0x020c, 0 },
3083 [SMMU_VCAP_AHB_RESET] = { 0x0200, 3 },
3084 [VCAP_AHB_RESET] = { 0x0200, 2 },
3085 [DSI2_M_AHB_RESET] = { 0x0200, 1 },
3086 [DSI2_S_AHB_RESET] = { 0x0200, 0 },
3087 [CSIPHY2_RESET] = { 0x0210, 31 },
3088 [CSI_PIX1_RESET] = { 0x0210, 30 },
3089 [CSIPHY0_RESET] = { 0x0210, 29 },
3090 [CSIPHY1_RESET] = { 0x0210, 28 },
3091 [CSI_RDI_RESET] = { 0x0210, 27 },
3092 [CSI_PIX_RESET] = { 0x0210, 26 },
3093 [DSI2_RESET] = { 0x0210, 25 },
3094 [VFE_CSI_RESET] = { 0x0210, 24 },
3095 [MDP_RESET] = { 0x0210, 21 },
3096 [AMP_RESET] = { 0x0210, 20 },
3097 [JPEGD_RESET] = { 0x0210, 19 },
3098 [CSI1_RESET] = { 0x0210, 18 },
3099 [VPE_RESET] = { 0x0210, 17 },
3100 [MMSS_FABRIC_RESET] = { 0x0210, 16 },
3101 [VFE_RESET] = { 0x0210, 15 },
3102 [GFX3D_RESET] = { 0x0210, 12 },
3103 [HDMI_RESET] = { 0x0210, 11 },
3104 [MMSS_IMEM_RESET] = { 0x0210, 10 },
3105 [IJPEG_RESET] = { 0x0210, 9 },
3106 [CSI0_RESET] = { 0x0210, 8 },
3107 [DSI_RESET] = { 0x0210, 7 },
3108 [VCODEC_RESET] = { 0x0210, 6 },
3109 [MDP_TV_RESET] = { 0x0210, 4 },
3110 [MDP_VSYNC_RESET] = { 0x0210, 3 },
3111 [ROT_RESET] = { 0x0210, 2 },
3112 [TV_HDMI_RESET] = { 0x0210, 1 },
3113 [VCAP_NPL_RESET] = { 0x0214, 4 },
3114 [VCAP_RESET] = { 0x0214, 3 },
3115 [CSI2_RESET] = { 0x0214, 2 },
3116 [CSI_RDI1_RESET] = { 0x0214, 1 },
3117 [CSI_RDI2_RESET] = { 0x0214 },
3120 static const struct regmap_config mmcc_msm8960_regmap_config = {
3124 .max_register = 0x334,
3128 static const struct regmap_config mmcc_apq8064_regmap_config = {
3132 .max_register = 0x350,
3136 static const struct qcom_cc_desc mmcc_msm8960_desc = {
3137 .config = &mmcc_msm8960_regmap_config,
3138 .clks = mmcc_msm8960_clks,
3139 .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
3140 .resets = mmcc_msm8960_resets,
3141 .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
3144 static const struct qcom_cc_desc mmcc_apq8064_desc = {
3145 .config = &mmcc_apq8064_regmap_config,
3146 .clks = mmcc_apq8064_clks,
3147 .num_clks = ARRAY_SIZE(mmcc_apq8064_clks),
3148 .resets = mmcc_apq8064_resets,
3149 .num_resets = ARRAY_SIZE(mmcc_apq8064_resets),
3152 static const struct of_device_id mmcc_msm8960_match_table[] = {
3153 { .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc },
3154 { .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc },
3157 MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
3159 static int mmcc_msm8960_probe(struct platform_device *pdev)
3161 struct regmap *regmap;
3162 struct device *dev = &pdev->dev;
3163 const struct qcom_cc_desc *desc = device_get_match_data(dev);
3165 if (desc == &mmcc_apq8064_desc) {
3166 gfx3d_src.freq_tbl = clk_tbl_gfx3d_8064;
3167 gfx3d_src.clkr.hw.init = &gfx3d_8064_init;
3168 gfx3d_src.s[0].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
3169 gfx3d_src.s[1].parent_map = mmcc_pxo_pll8_pll2_pll15_map;
3172 regmap = qcom_cc_map(pdev, desc);
3174 return PTR_ERR(regmap);
3176 clk_pll_configure_sr(&pll15, regmap, &pll15_config, false);
3178 return qcom_cc_really_probe(&pdev->dev, desc, regmap);
3181 static struct platform_driver mmcc_msm8960_driver = {
3182 .probe = mmcc_msm8960_probe,
3184 .name = "mmcc-msm8960",
3185 .of_match_table = mmcc_msm8960_match_table,
3189 module_platform_driver(mmcc_msm8960_driver);
3191 MODULE_DESCRIPTION("QCOM MMCC MSM8960 Driver");
3192 MODULE_LICENSE("GPL v2");
3193 MODULE_ALIAS("platform:mmcc-msm8960");