2 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
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.
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.
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>
21 #include <linux/of_device.h>
22 #include <linux/clk.h>
23 #include <linux/clk-provider.h>
24 #include <linux/regmap.h>
25 #include <linux/reset-controller.h>
27 #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
28 #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
31 #include "clk-regmap.h"
34 #include "clk-branch.h"
46 #define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
48 static const struct parent_map mmcc_pxo_pll8_pll2_map[] = {
54 static const char * const mmcc_pxo_pll8_pll2[] = {
60 static const struct parent_map mmcc_pxo_pll8_pll2_pll3_map[] = {
67 static const char * const mmcc_pxo_pll8_pll2_pll15[] = {
74 static const struct parent_map mmcc_pxo_pll8_pll2_pll15_map[] = {
81 static const char * const mmcc_pxo_pll8_pll2_pll3[] = {
88 static struct clk_pll pll2 = {
96 .clkr.hw.init = &(struct clk_init_data){
98 .parent_names = (const char *[]){ "pxo" },
104 static struct clk_pll pll15 = {
112 .clkr.hw.init = &(struct clk_init_data){
114 .parent_names = (const char *[]){ "pxo" },
120 static const struct pll_config pll15_config = {
124 .vco_val = 0x2 << 16,
125 .vco_mask = 0x3 << 16,
127 .pre_div_mask = BIT(19),
129 .post_div_mask = 0x3 << 20,
130 .mn_ena_mask = BIT(22),
131 .main_output_mask = BIT(23),
134 static 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 },
149 static struct clk_rcg camclk0_src = {
154 .mnctr_reset_bit = 8,
156 .mnctr_mode_shift = 6,
167 .parent_map = mmcc_pxo_pll8_pll2_map,
169 .freq_tbl = clk_tbl_cam,
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,
182 static struct clk_branch camclk0_clk = {
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" },
192 .ops = &clk_branch_ops,
198 static struct clk_rcg camclk1_src = {
203 .mnctr_reset_bit = 8,
205 .mnctr_mode_shift = 6,
216 .parent_map = mmcc_pxo_pll8_pll2_map,
218 .freq_tbl = clk_tbl_cam,
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,
231 static struct clk_branch camclk1_clk = {
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" },
241 .ops = &clk_branch_ops,
247 static struct clk_rcg camclk2_src = {
252 .mnctr_reset_bit = 8,
254 .mnctr_mode_shift = 6,
265 .parent_map = mmcc_pxo_pll8_pll2_map,
267 .freq_tbl = clk_tbl_cam,
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,
280 static struct clk_branch camclk2_clk = {
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" },
290 .ops = &clk_branch_ops,
296 static 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 },
303 static struct clk_rcg csi0_src = {
308 .mnctr_reset_bit = 7,
309 .mnctr_mode_shift = 6,
320 .parent_map = mmcc_pxo_pll8_pll2_map,
322 .freq_tbl = clk_tbl_csi,
324 .enable_reg = 0x0040,
325 .enable_mask = BIT(2),
326 .hw.init = &(struct clk_init_data){
328 .parent_names = mmcc_pxo_pll8_pll2,
335 static struct clk_branch csi0_clk = {
339 .enable_reg = 0x0040,
340 .enable_mask = BIT(0),
341 .hw.init = &(struct clk_init_data){
342 .parent_names = (const char *[]){ "csi0_src" },
345 .ops = &clk_branch_ops,
346 .flags = CLK_SET_RATE_PARENT,
351 static struct clk_branch csi0_phy_clk = {
355 .enable_reg = 0x0040,
356 .enable_mask = BIT(8),
357 .hw.init = &(struct clk_init_data){
358 .parent_names = (const char *[]){ "csi0_src" },
360 .name = "csi0_phy_clk",
361 .ops = &clk_branch_ops,
362 .flags = CLK_SET_RATE_PARENT,
367 static struct clk_rcg csi1_src = {
372 .mnctr_reset_bit = 7,
373 .mnctr_mode_shift = 6,
384 .parent_map = mmcc_pxo_pll8_pll2_map,
386 .freq_tbl = clk_tbl_csi,
388 .enable_reg = 0x0024,
389 .enable_mask = BIT(2),
390 .hw.init = &(struct clk_init_data){
392 .parent_names = mmcc_pxo_pll8_pll2,
399 static struct clk_branch csi1_clk = {
403 .enable_reg = 0x0024,
404 .enable_mask = BIT(0),
405 .hw.init = &(struct clk_init_data){
406 .parent_names = (const char *[]){ "csi1_src" },
409 .ops = &clk_branch_ops,
410 .flags = CLK_SET_RATE_PARENT,
415 static struct clk_branch csi1_phy_clk = {
419 .enable_reg = 0x0024,
420 .enable_mask = BIT(8),
421 .hw.init = &(struct clk_init_data){
422 .parent_names = (const char *[]){ "csi1_src" },
424 .name = "csi1_phy_clk",
425 .ops = &clk_branch_ops,
426 .flags = CLK_SET_RATE_PARENT,
431 static struct clk_rcg csi2_src = {
436 .mnctr_reset_bit = 7,
437 .mnctr_mode_shift = 6,
448 .parent_map = mmcc_pxo_pll8_pll2_map,
450 .freq_tbl = clk_tbl_csi,
452 .enable_reg = 0x022c,
453 .enable_mask = BIT(2),
454 .hw.init = &(struct clk_init_data){
456 .parent_names = mmcc_pxo_pll8_pll2,
463 static struct clk_branch csi2_clk = {
467 .enable_reg = 0x022c,
468 .enable_mask = BIT(0),
469 .hw.init = &(struct clk_init_data){
470 .parent_names = (const char *[]){ "csi2_src" },
473 .ops = &clk_branch_ops,
474 .flags = CLK_SET_RATE_PARENT,
479 static struct clk_branch csi2_phy_clk = {
483 .enable_reg = 0x022c,
484 .enable_mask = BIT(8),
485 .hw.init = &(struct clk_init_data){
486 .parent_names = (const char *[]){ "csi2_src" },
488 .name = "csi2_phy_clk",
489 .ops = &clk_branch_ops,
490 .flags = CLK_SET_RATE_PARENT,
500 struct clk_regmap clkr;
503 #define to_clk_pix_rdi(_hw) \
504 container_of(to_clk_regmap(_hw), struct clk_pix_rdi, clkr)
506 static int pix_rdi_set_parent(struct clk_hw *hw, u8 index)
511 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
512 int num_parents = clk_hw_get_num_parents(hw);
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.
522 for (i = 0; i < num_parents; i++) {
523 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
524 ret = clk_prepare_enable(p->clk);
533 regmap_update_bits(rdi->clkr.regmap, rdi->s2_reg, rdi->s2_mask, val);
535 * Wait at least 6 cycles of slowest clock
536 * for the glitch-free MUX to fully switch sources.
544 regmap_update_bits(rdi->clkr.regmap, rdi->s_reg, rdi->s_mask, val);
546 * Wait at least 6 cycles of slowest clock
547 * for the glitch-free MUX to fully switch sources.
552 for (i--; i >= 0; i--) {
553 struct clk_hw *p = clk_hw_get_parent_by_index(hw, i);
554 clk_disable_unprepare(p->clk);
560 static u8 pix_rdi_get_parent(struct clk_hw *hw)
563 struct clk_pix_rdi *rdi = to_clk_pix_rdi(hw);
566 regmap_read(rdi->clkr.regmap, rdi->s2_reg, &val);
567 if (val & rdi->s2_mask)
570 regmap_read(rdi->clkr.regmap, rdi->s_reg, &val);
571 if (val & rdi->s_mask)
577 static 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,
585 static const char * const pix_rdi_parents[] = {
591 static struct clk_pix_rdi csi_pix_clk = {
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,
603 .ops = &clk_ops_pix_rdi,
608 static struct clk_pix_rdi csi_pix1_clk = {
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,
620 .ops = &clk_ops_pix_rdi,
625 static struct clk_pix_rdi csi_rdi_clk = {
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,
637 .ops = &clk_ops_pix_rdi,
642 static struct clk_pix_rdi csi_rdi1_clk = {
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,
654 .ops = &clk_ops_pix_rdi,
659 static struct clk_pix_rdi csi_rdi2_clk = {
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,
671 .ops = &clk_ops_pix_rdi,
676 static struct freq_tbl clk_tbl_csiphytimer[] = {
677 { 85330000, P_PLL8, 1, 2, 9 },
678 { 177780000, P_PLL2, 1, 2, 9 },
682 static struct clk_rcg csiphytimer_src = {
687 .mnctr_reset_bit = 8,
689 .mnctr_mode_shift = 6,
700 .parent_map = mmcc_pxo_pll8_pll2_map,
702 .freq_tbl = clk_tbl_csiphytimer,
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,
715 static const char * const csixphy_timer_src[] = { "csiphytimer_src" };
717 static struct clk_branch csiphy0_timer_clk = {
721 .enable_reg = 0x0160,
722 .enable_mask = BIT(0),
723 .hw.init = &(struct clk_init_data){
724 .parent_names = csixphy_timer_src,
726 .name = "csiphy0_timer_clk",
727 .ops = &clk_branch_ops,
728 .flags = CLK_SET_RATE_PARENT,
733 static struct clk_branch csiphy1_timer_clk = {
737 .enable_reg = 0x0160,
738 .enable_mask = BIT(9),
739 .hw.init = &(struct clk_init_data){
740 .parent_names = csixphy_timer_src,
742 .name = "csiphy1_timer_clk",
743 .ops = &clk_branch_ops,
744 .flags = CLK_SET_RATE_PARENT,
749 static struct clk_branch csiphy2_timer_clk = {
753 .enable_reg = 0x0160,
754 .enable_mask = BIT(11),
755 .hw.init = &(struct clk_init_data){
756 .parent_names = csixphy_timer_src,
758 .name = "csiphy2_timer_clk",
759 .ops = &clk_branch_ops,
760 .flags = CLK_SET_RATE_PARENT,
765 static struct freq_tbl clk_tbl_gfx2d[] = {
766 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),
781 static struct clk_dyn_rcg gfx2d0_src = {
789 .mnctr_reset_bit = 25,
790 .mnctr_mode_shift = 9,
797 .mnctr_reset_bit = 24,
798 .mnctr_mode_shift = 6,
805 .parent_map = mmcc_pxo_pll8_pll2_map,
809 .parent_map = mmcc_pxo_pll8_pll2_map,
812 .freq_tbl = clk_tbl_gfx2d,
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,
820 .ops = &clk_dyn_rcg_ops,
825 static struct clk_branch gfx2d0_clk = {
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" },
835 .ops = &clk_branch_ops,
836 .flags = CLK_SET_RATE_PARENT,
841 static struct clk_dyn_rcg gfx2d1_src = {
849 .mnctr_reset_bit = 25,
850 .mnctr_mode_shift = 9,
857 .mnctr_reset_bit = 24,
858 .mnctr_mode_shift = 6,
865 .parent_map = mmcc_pxo_pll8_pll2_map,
869 .parent_map = mmcc_pxo_pll8_pll2_map,
872 .freq_tbl = clk_tbl_gfx2d,
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,
880 .ops = &clk_dyn_rcg_ops,
885 static struct clk_branch gfx2d1_clk = {
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" },
895 .ops = &clk_branch_ops,
896 .flags = CLK_SET_RATE_PARENT,
901 static struct freq_tbl clk_tbl_gfx3d[] = {
902 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),
921 static 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),
942 static struct clk_dyn_rcg gfx3d_src = {
950 .mnctr_reset_bit = 25,
951 .mnctr_mode_shift = 9,
958 .mnctr_reset_bit = 24,
959 .mnctr_mode_shift = 6,
966 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
970 .parent_map = mmcc_pxo_pll8_pll2_pll3_map,
973 .freq_tbl = clk_tbl_gfx3d,
975 .enable_reg = 0x0080,
976 .enable_mask = BIT(2),
977 .hw.init = &(struct clk_init_data){
979 .parent_names = mmcc_pxo_pll8_pll2_pll3,
981 .ops = &clk_dyn_rcg_ops,
986 static const struct clk_init_data gfx3d_8064_init = {
988 .parent_names = mmcc_pxo_pll8_pll2_pll15,
990 .ops = &clk_dyn_rcg_ops,
993 static struct clk_branch gfx3d_clk = {
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" },
1003 .ops = &clk_branch_ops,
1004 .flags = CLK_SET_RATE_PARENT,
1009 static 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),
1020 static struct clk_dyn_rcg vcap_src = {
1021 .ns_reg[0] = 0x021c,
1022 .ns_reg[1] = 0x021c,
1023 .md_reg[0] = 0x01ec,
1024 .md_reg[1] = 0x0218,
1028 .mnctr_reset_bit = 23,
1029 .mnctr_mode_shift = 9,
1036 .mnctr_reset_bit = 22,
1037 .mnctr_mode_shift = 6,
1044 .parent_map = mmcc_pxo_pll8_pll2_map,
1048 .parent_map = mmcc_pxo_pll8_pll2_map,
1051 .freq_tbl = clk_tbl_vcap,
1053 .enable_reg = 0x0178,
1054 .enable_mask = BIT(2),
1055 .hw.init = &(struct clk_init_data){
1057 .parent_names = mmcc_pxo_pll8_pll2,
1059 .ops = &clk_dyn_rcg_ops,
1064 static struct clk_branch vcap_clk = {
1068 .enable_reg = 0x0178,
1069 .enable_mask = BIT(0),
1070 .hw.init = &(struct clk_init_data){
1072 .parent_names = (const char *[]){ "vcap_src" },
1074 .ops = &clk_branch_ops,
1075 .flags = CLK_SET_RATE_PARENT,
1080 static struct clk_branch vcap_npl_clk = {
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" },
1090 .ops = &clk_branch_ops,
1091 .flags = CLK_SET_RATE_PARENT,
1096 static 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 },
1111 static struct clk_rcg ijpeg_src = {
1116 .mnctr_reset_bit = 7,
1117 .mnctr_mode_shift = 6,
1123 .pre_div_shift = 12,
1128 .parent_map = mmcc_pxo_pll8_pll2_map,
1130 .freq_tbl = clk_tbl_ijpeg,
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,
1138 .ops = &clk_rcg_ops,
1143 static struct clk_branch ijpeg_clk = {
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" },
1153 .ops = &clk_branch_ops,
1154 .flags = CLK_SET_RATE_PARENT,
1159 static 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 },
1168 static struct clk_rcg jpegd_src = {
1171 .pre_div_shift = 12,
1176 .parent_map = mmcc_pxo_pll8_pll2_map,
1178 .freq_tbl = clk_tbl_jpegd,
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,
1186 .ops = &clk_rcg_ops,
1191 static struct clk_branch jpegd_clk = {
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" },
1201 .ops = &clk_branch_ops,
1202 .flags = CLK_SET_RATE_PARENT,
1207 static 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 },
1227 static struct clk_dyn_rcg mdp_src = {
1228 .ns_reg[0] = 0x00d0,
1229 .ns_reg[1] = 0x00d0,
1230 .md_reg[0] = 0x00c4,
1231 .md_reg[1] = 0x00c8,
1235 .mnctr_reset_bit = 31,
1236 .mnctr_mode_shift = 9,
1243 .mnctr_reset_bit = 30,
1244 .mnctr_mode_shift = 6,
1251 .parent_map = mmcc_pxo_pll8_pll2_map,
1255 .parent_map = mmcc_pxo_pll8_pll2_map,
1258 .freq_tbl = clk_tbl_mdp,
1260 .enable_reg = 0x00c0,
1261 .enable_mask = BIT(2),
1262 .hw.init = &(struct clk_init_data){
1264 .parent_names = mmcc_pxo_pll8_pll2,
1266 .ops = &clk_dyn_rcg_ops,
1271 static struct clk_branch mdp_clk = {
1275 .enable_reg = 0x00c0,
1276 .enable_mask = BIT(0),
1277 .hw.init = &(struct clk_init_data){
1279 .parent_names = (const char *[]){ "mdp_src" },
1281 .ops = &clk_branch_ops,
1282 .flags = CLK_SET_RATE_PARENT,
1287 static struct clk_branch mdp_lut_clk = {
1291 .enable_reg = 0x016c,
1292 .enable_mask = BIT(0),
1293 .hw.init = &(struct clk_init_data){
1294 .parent_names = (const char *[]){ "mdp_src" },
1296 .name = "mdp_lut_clk",
1297 .ops = &clk_branch_ops,
1298 .flags = CLK_SET_RATE_PARENT,
1303 static struct clk_branch mdp_vsync_clk = {
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" },
1313 .ops = &clk_branch_ops
1318 static 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 },
1336 static struct clk_dyn_rcg rot_src = {
1337 .ns_reg[0] = 0x00e8,
1338 .ns_reg[1] = 0x00e8,
1341 .pre_div_shift = 22,
1345 .pre_div_shift = 26,
1349 .src_sel_shift = 16,
1350 .parent_map = mmcc_pxo_pll8_pll2_map,
1353 .src_sel_shift = 19,
1354 .parent_map = mmcc_pxo_pll8_pll2_map,
1357 .freq_tbl = clk_tbl_rot,
1359 .enable_reg = 0x00e0,
1360 .enable_mask = BIT(2),
1361 .hw.init = &(struct clk_init_data){
1363 .parent_names = mmcc_pxo_pll8_pll2,
1365 .ops = &clk_dyn_rcg_ops,
1370 static struct clk_branch rot_clk = {
1374 .enable_reg = 0x00e0,
1375 .enable_mask = BIT(0),
1376 .hw.init = &(struct clk_init_data){
1378 .parent_names = (const char *[]){ "rot_src" },
1380 .ops = &clk_branch_ops,
1381 .flags = CLK_SET_RATE_PARENT,
1386 static const struct parent_map mmcc_pxo_hdmi_map[] = {
1391 static const char * const mmcc_pxo_hdmi[] = {
1396 static struct freq_tbl clk_tbl_tv[] = {
1397 { .src = P_HDMI_PLL, .pre_div = 1 },
1401 static struct clk_rcg tv_src = {
1406 .mnctr_reset_bit = 7,
1407 .mnctr_mode_shift = 6,
1413 .pre_div_shift = 14,
1418 .parent_map = mmcc_pxo_hdmi_map,
1420 .freq_tbl = clk_tbl_tv,
1422 .enable_reg = 0x00ec,
1423 .enable_mask = BIT(2),
1424 .hw.init = &(struct clk_init_data){
1426 .parent_names = mmcc_pxo_hdmi,
1428 .ops = &clk_rcg_bypass_ops,
1429 .flags = CLK_SET_RATE_PARENT,
1434 static const char * const tv_src_name[] = { "tv_src" };
1436 static struct clk_branch tv_enc_clk = {
1440 .enable_reg = 0x00ec,
1441 .enable_mask = BIT(8),
1442 .hw.init = &(struct clk_init_data){
1443 .parent_names = tv_src_name,
1445 .name = "tv_enc_clk",
1446 .ops = &clk_branch_ops,
1447 .flags = CLK_SET_RATE_PARENT,
1452 static struct clk_branch tv_dac_clk = {
1456 .enable_reg = 0x00ec,
1457 .enable_mask = BIT(10),
1458 .hw.init = &(struct clk_init_data){
1459 .parent_names = tv_src_name,
1461 .name = "tv_dac_clk",
1462 .ops = &clk_branch_ops,
1463 .flags = CLK_SET_RATE_PARENT,
1468 static struct clk_branch mdp_tv_clk = {
1472 .enable_reg = 0x00ec,
1473 .enable_mask = BIT(0),
1474 .hw.init = &(struct clk_init_data){
1475 .parent_names = tv_src_name,
1477 .name = "mdp_tv_clk",
1478 .ops = &clk_branch_ops,
1479 .flags = CLK_SET_RATE_PARENT,
1484 static struct clk_branch hdmi_tv_clk = {
1488 .enable_reg = 0x00ec,
1489 .enable_mask = BIT(12),
1490 .hw.init = &(struct clk_init_data){
1491 .parent_names = tv_src_name,
1493 .name = "hdmi_tv_clk",
1494 .ops = &clk_branch_ops,
1495 .flags = CLK_SET_RATE_PARENT,
1500 static struct clk_branch rgb_tv_clk = {
1504 .enable_reg = 0x0124,
1505 .enable_mask = BIT(14),
1506 .hw.init = &(struct clk_init_data){
1507 .parent_names = tv_src_name,
1509 .name = "rgb_tv_clk",
1510 .ops = &clk_branch_ops,
1511 .flags = CLK_SET_RATE_PARENT,
1516 static struct clk_branch npl_tv_clk = {
1520 .enable_reg = 0x0124,
1521 .enable_mask = BIT(16),
1522 .hw.init = &(struct clk_init_data){
1523 .parent_names = tv_src_name,
1525 .name = "npl_tv_clk",
1526 .ops = &clk_branch_ops,
1527 .flags = CLK_SET_RATE_PARENT,
1532 static struct clk_branch hdmi_app_clk = {
1536 .enable_reg = 0x005c,
1537 .enable_mask = BIT(11),
1538 .hw.init = &(struct clk_init_data){
1539 .parent_names = (const char *[]){ "pxo" },
1541 .name = "hdmi_app_clk",
1542 .ops = &clk_branch_ops,
1547 static struct freq_tbl clk_tbl_vcodec[] = {
1548 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),
1560 static struct clk_dyn_rcg vcodec_src = {
1561 .ns_reg[0] = 0x0100,
1562 .ns_reg[1] = 0x0100,
1563 .md_reg[0] = 0x00fc,
1564 .md_reg[1] = 0x0128,
1568 .mnctr_reset_bit = 31,
1569 .mnctr_mode_shift = 6,
1576 .mnctr_reset_bit = 30,
1577 .mnctr_mode_shift = 11,
1583 .src_sel_shift = 27,
1584 .parent_map = mmcc_pxo_pll8_pll2_map,
1588 .parent_map = mmcc_pxo_pll8_pll2_map,
1591 .freq_tbl = clk_tbl_vcodec,
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,
1599 .ops = &clk_dyn_rcg_ops,
1604 static struct clk_branch vcodec_clk = {
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" },
1614 .ops = &clk_branch_ops,
1615 .flags = CLK_SET_RATE_PARENT,
1620 static 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 },
1632 static struct clk_rcg vpe_src = {
1635 .pre_div_shift = 12,
1640 .parent_map = mmcc_pxo_pll8_pll2_map,
1642 .freq_tbl = clk_tbl_vpe,
1644 .enable_reg = 0x0110,
1645 .enable_mask = BIT(2),
1646 .hw.init = &(struct clk_init_data){
1648 .parent_names = mmcc_pxo_pll8_pll2,
1650 .ops = &clk_rcg_ops,
1655 static struct clk_branch vpe_clk = {
1659 .enable_reg = 0x0110,
1660 .enable_mask = BIT(0),
1661 .hw.init = &(struct clk_init_data){
1663 .parent_names = (const char *[]){ "vpe_src" },
1665 .ops = &clk_branch_ops,
1666 .flags = CLK_SET_RATE_PARENT,
1671 static 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 },
1692 static struct clk_rcg vfe_src = {
1696 .mnctr_reset_bit = 7,
1697 .mnctr_mode_shift = 6,
1703 .pre_div_shift = 10,
1708 .parent_map = mmcc_pxo_pll8_pll2_map,
1710 .freq_tbl = clk_tbl_vfe,
1712 .enable_reg = 0x0104,
1713 .enable_mask = BIT(2),
1714 .hw.init = &(struct clk_init_data){
1716 .parent_names = mmcc_pxo_pll8_pll2,
1718 .ops = &clk_rcg_ops,
1723 static struct clk_branch vfe_clk = {
1727 .enable_reg = 0x0104,
1728 .enable_mask = BIT(0),
1729 .hw.init = &(struct clk_init_data){
1731 .parent_names = (const char *[]){ "vfe_src" },
1733 .ops = &clk_branch_ops,
1734 .flags = CLK_SET_RATE_PARENT,
1739 static struct clk_branch vfe_csi_clk = {
1743 .enable_reg = 0x0104,
1744 .enable_mask = BIT(12),
1745 .hw.init = &(struct clk_init_data){
1746 .parent_names = (const char *[]){ "vfe_src" },
1748 .name = "vfe_csi_clk",
1749 .ops = &clk_branch_ops,
1750 .flags = CLK_SET_RATE_PARENT,
1755 static struct clk_branch gmem_axi_clk = {
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,
1769 static struct clk_branch ijpeg_axi_clk = {
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,
1785 static struct clk_branch mmss_imem_axi_clk = {
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,
1801 static struct clk_branch jpegd_axi_clk = {
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,
1815 static struct clk_branch vcodec_axi_b_clk = {
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,
1831 static struct clk_branch vcodec_axi_a_clk = {
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,
1847 static struct clk_branch vcodec_axi_clk = {
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,
1863 static struct clk_branch vfe_axi_clk = {
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,
1877 static struct clk_branch mdp_axi_clk = {
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,
1893 static struct clk_branch rot_axi_clk = {
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,
1909 static struct clk_branch vcap_axi_clk = {
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,
1925 static struct clk_branch vpe_axi_clk = {
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,
1941 static struct clk_branch gfx3d_axi_clk = {
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,
1957 static struct clk_branch amp_ahb_clk = {
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,
1971 static struct clk_branch csi_ahb_clk = {
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
1985 static struct clk_branch dsi_m_ahb_clk = {
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,
1999 static struct clk_branch dsi_s_ahb_clk = {
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,
2015 static struct clk_branch dsi2_m_ahb_clk = {
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
2029 static struct clk_branch dsi2_s_ahb_clk = {
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,
2045 static struct clk_branch gfx2d0_ahb_clk = {
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,
2061 static struct clk_branch gfx2d1_ahb_clk = {
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,
2077 static struct clk_branch gfx3d_ahb_clk = {
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,
2093 static struct clk_branch hdmi_m_ahb_clk = {
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,
2109 static struct clk_branch hdmi_s_ahb_clk = {
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,
2125 static struct clk_branch ijpeg_ahb_clk = {
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
2139 static struct clk_branch mmss_imem_ahb_clk = {
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
2155 static struct clk_branch jpegd_ahb_clk = {
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,
2169 static struct clk_branch mdp_ahb_clk = {
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,
2183 static struct clk_branch rot_ahb_clk = {
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
2197 static struct clk_branch smmu_ahb_clk = {
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,
2213 static struct clk_branch tv_enc_ahb_clk = {
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,
2227 static struct clk_branch vcap_ahb_clk = {
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,
2241 static struct clk_branch vcodec_ahb_clk = {
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,
2257 static struct clk_branch vfe_ahb_clk = {
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,
2271 static struct clk_branch vpe_ahb_clk = {
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,
2285 static struct clk_regmap *mmcc_msm8960_clks[] = {
2286 [TV_ENC_AHB_CLK] = &tv_enc_ahb_clk.clkr,
2287 [AMP_AHB_CLK] = &_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,
2375 static 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 },
2453 static struct clk_regmap *mmcc_apq8064_clks[] = {
2454 [AMP_AHB_CLK] = &_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,
2543 static 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 },
2622 static const struct regmap_config mmcc_msm8960_regmap_config = {
2626 .max_register = 0x334,
2630 static const struct regmap_config mmcc_apq8064_regmap_config = {
2634 .max_register = 0x350,
2638 static 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),
2646 static 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),
2654 static const struct of_device_id mmcc_msm8960_match_table[] = {
2655 { .compatible = "qcom,mmcc-msm8960", .data = &mmcc_msm8960_desc },
2656 { .compatible = "qcom,mmcc-apq8064", .data = &mmcc_apq8064_desc },
2659 MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
2661 static int mmcc_msm8960_probe(struct platform_device *pdev)
2663 const struct of_device_id *match;
2664 struct regmap *regmap;
2666 struct device *dev = &pdev->dev;
2668 match = of_match_device(mmcc_msm8960_match_table, dev);
2672 is_8064 = of_device_is_compatible(dev->of_node, "qcom,mmcc-apq8064");
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;
2680 regmap = qcom_cc_map(pdev, match->data);
2682 return PTR_ERR(regmap);
2684 clk_pll_configure_sr(&pll15, regmap, &pll15_config, false);
2686 return qcom_cc_really_probe(pdev, match->data, regmap);
2689 static int mmcc_msm8960_remove(struct platform_device *pdev)
2691 qcom_cc_remove(pdev);
2695 static struct platform_driver mmcc_msm8960_driver = {
2696 .probe = mmcc_msm8960_probe,
2697 .remove = mmcc_msm8960_remove,
2699 .name = "mmcc-msm8960",
2700 .of_match_table = mmcc_msm8960_match_table,
2704 module_platform_driver(mmcc_msm8960_driver);
2706 MODULE_DESCRIPTION("QCOM MMCC MSM8960 Driver");
2707 MODULE_LICENSE("GPL v2");
2708 MODULE_ALIAS("platform:mmcc-msm8960");