These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / clk / qcom / gcc-msm8916.c
index 5d75bff..d0a0313 100644 (file)
@@ -31,6 +31,7 @@
 #include "clk-rcg.h"
 #include "clk-branch.h"
 #include "reset.h"
+#include "gdsc.h"
 
 enum {
        P_XO,
@@ -44,6 +45,9 @@ enum {
        P_SLEEP_CLK,
        P_DSI0_PHYPLL_BYTE,
        P_DSI0_PHYPLL_DSI,
+       P_EXT_PRI_I2S,
+       P_EXT_SEC_I2S,
+       P_EXT_MCLK,
 };
 
 static const struct parent_map gcc_xo_gpll0_map[] = {
@@ -51,7 +55,7 @@ static const struct parent_map gcc_xo_gpll0_map[] = {
        { P_GPLL0, 1 },
 };
 
-static const char *gcc_xo_gpll0[] = {
+static const char * const gcc_xo_gpll0[] = {
        "xo",
        "gpll0_vote",
 };
@@ -62,7 +66,7 @@ static const struct parent_map gcc_xo_gpll0_bimc_map[] = {
        { P_BIMC, 2 },
 };
 
-static const char *gcc_xo_gpll0_bimc[] = {
+static const char * const gcc_xo_gpll0_bimc[] = {
        "xo",
        "gpll0_vote",
        "bimc_pll_vote",
@@ -75,7 +79,7 @@ static const struct parent_map gcc_xo_gpll0a_gpll1_gpll2a_map[] = {
        { P_GPLL2_AUX, 2 },
 };
 
-static const char *gcc_xo_gpll0a_gpll1_gpll2a[] = {
+static const char * const gcc_xo_gpll0a_gpll1_gpll2a[] = {
        "xo",
        "gpll0_vote",
        "gpll1_vote",
@@ -88,7 +92,7 @@ static const struct parent_map gcc_xo_gpll0_gpll2_map[] = {
        { P_GPLL2, 2 },
 };
 
-static const char *gcc_xo_gpll0_gpll2[] = {
+static const char * const gcc_xo_gpll0_gpll2[] = {
        "xo",
        "gpll0_vote",
        "gpll2_vote",
@@ -99,7 +103,7 @@ static const struct parent_map gcc_xo_gpll0a_map[] = {
        { P_GPLL0_AUX, 2 },
 };
 
-static const char *gcc_xo_gpll0a[] = {
+static const char * const gcc_xo_gpll0a[] = {
        "xo",
        "gpll0_vote",
 };
@@ -111,7 +115,7 @@ static const struct parent_map gcc_xo_gpll0_gpll1a_sleep_map[] = {
        { P_SLEEP_CLK, 6 },
 };
 
-static const char *gcc_xo_gpll0_gpll1a_sleep[] = {
+static const char * const gcc_xo_gpll0_gpll1a_sleep[] = {
        "xo",
        "gpll0_vote",
        "gpll1_vote",
@@ -124,7 +128,7 @@ static const struct parent_map gcc_xo_gpll0_gpll1a_map[] = {
        { P_GPLL1_AUX, 2 },
 };
 
-static const char *gcc_xo_gpll0_gpll1a[] = {
+static const char * const gcc_xo_gpll0_gpll1a[] = {
        "xo",
        "gpll0_vote",
        "gpll1_vote",
@@ -135,7 +139,7 @@ static const struct parent_map gcc_xo_dsibyte_map[] = {
        { P_DSI0_PHYPLL_BYTE, 2 },
 };
 
-static const char *gcc_xo_dsibyte[] = {
+static const char * const gcc_xo_dsibyte[] = {
        "xo",
        "dsi0pllbyte",
 };
@@ -146,7 +150,7 @@ static const struct parent_map gcc_xo_gpll0a_dsibyte_map[] = {
        { P_DSI0_PHYPLL_BYTE, 1 },
 };
 
-static const char *gcc_xo_gpll0a_dsibyte[] = {
+static const char * const gcc_xo_gpll0a_dsibyte[] = {
        "xo",
        "gpll0_vote",
        "dsi0pllbyte",
@@ -158,7 +162,7 @@ static const struct parent_map gcc_xo_gpll0_dsiphy_map[] = {
        { P_DSI0_PHYPLL_DSI, 2 },
 };
 
-static const char *gcc_xo_gpll0_dsiphy[] = {
+static const char * const gcc_xo_gpll0_dsiphy[] = {
        "xo",
        "gpll0_vote",
        "dsi0pll",
@@ -170,7 +174,7 @@ static const struct parent_map gcc_xo_gpll0a_dsiphy_map[] = {
        { P_DSI0_PHYPLL_DSI, 1 },
 };
 
-static const char *gcc_xo_gpll0a_dsiphy[] = {
+static const char * const gcc_xo_gpll0a_dsiphy[] = {
        "xo",
        "gpll0_vote",
        "dsi0pll",
@@ -183,13 +187,83 @@ static const struct parent_map gcc_xo_gpll0a_gpll1_gpll2_map[] = {
        { P_GPLL2, 2 },
 };
 
-static const char *gcc_xo_gpll0a_gpll1_gpll2[] = {
+static const char * const gcc_xo_gpll0a_gpll1_gpll2[] = {
        "xo",
        "gpll0_vote",
        "gpll1_vote",
        "gpll2_vote",
 };
 
+static const struct parent_map gcc_xo_gpll0_gpll1_sleep_map[] = {
+       { P_XO, 0 },
+       { P_GPLL0, 1 },
+       { P_GPLL1, 2 },
+       { P_SLEEP_CLK, 6 }
+};
+
+static const char * const gcc_xo_gpll0_gpll1_sleep[] = {
+       "xo",
+       "gpll0_vote",
+       "gpll1_vote",
+       "sleep_clk",
+};
+
+static const struct parent_map gcc_xo_gpll1_epi2s_emclk_sleep_map[] = {
+       { P_XO, 0 },
+       { P_GPLL1, 1 },
+       { P_EXT_PRI_I2S, 2 },
+       { P_EXT_MCLK, 3 },
+       { P_SLEEP_CLK, 6 }
+};
+
+static const char * const gcc_xo_gpll1_epi2s_emclk_sleep[] = {
+       "xo",
+       "gpll1_vote",
+       "ext_pri_i2s",
+       "ext_mclk",
+       "sleep_clk",
+};
+
+static const struct parent_map gcc_xo_gpll1_esi2s_emclk_sleep_map[] = {
+       { P_XO, 0 },
+       { P_GPLL1, 1 },
+       { P_EXT_SEC_I2S, 2 },
+       { P_EXT_MCLK, 3 },
+       { P_SLEEP_CLK, 6 }
+};
+
+static const char * const gcc_xo_gpll1_esi2s_emclk_sleep[] = {
+       "xo",
+       "gpll1_vote",
+       "ext_sec_i2s",
+       "ext_mclk",
+       "sleep_clk",
+};
+
+static const struct parent_map gcc_xo_sleep_map[] = {
+       { P_XO, 0 },
+       { P_SLEEP_CLK, 6 }
+};
+
+static const char * const gcc_xo_sleep[] = {
+       "xo",
+       "sleep_clk",
+};
+
+static const struct parent_map gcc_xo_gpll1_emclk_sleep_map[] = {
+       { P_XO, 0 },
+       { P_GPLL1, 1 },
+       { P_EXT_MCLK, 2 },
+       { P_SLEEP_CLK, 6 }
+};
+
+static const char * const gcc_xo_gpll1_emclk_sleep[] = {
+       "xo",
+       "gpll1_vote",
+       "ext_mclk",
+       "sleep_clk",
+};
+
 #define F(f, s, h, m, n) { (f), (s), (2 * (h) - 1), (m), (n) }
 
 static struct clk_pll gpll0 = {
@@ -906,21 +980,15 @@ static struct clk_rcg2 gp3_clk_src = {
        },
 };
 
-static struct freq_tbl ftbl_gcc_mdss_byte0_clk[] = {
-       { .src = P_DSI0_PHYPLL_BYTE },
-       { }
-};
-
 static struct clk_rcg2 byte0_clk_src = {
        .cmd_rcgr = 0x4d044,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0a_dsibyte_map,
-       .freq_tbl = ftbl_gcc_mdss_byte0_clk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "byte0_clk_src",
                .parent_names = gcc_xo_gpll0a_dsibyte,
                .num_parents = 3,
-               .ops = &clk_byte_ops,
+               .ops = &clk_byte2_ops,
                .flags = CLK_SET_RATE_PARENT,
        },
 };
@@ -968,17 +1036,11 @@ static struct clk_rcg2 mdp_clk_src = {
        },
 };
 
-static struct freq_tbl ftbl_gcc_mdss_pclk[] = {
-       { .src = P_DSI0_PHYPLL_DSI },
-       { }
-};
-
 static struct clk_rcg2 pclk0_clk_src = {
        .cmd_rcgr = 0x4d000,
        .mnd_width = 8,
        .hid_width = 5,
        .parent_map = gcc_xo_gpll0a_dsiphy_map,
-       .freq_tbl = ftbl_gcc_mdss_pclk,
        .clkr.hw.init = &(struct clk_init_data){
                .name = "pclk0_clk_src",
                .parent_names = gcc_xo_gpll0a_dsiphy,
@@ -1094,6 +1156,30 @@ static struct clk_rcg2 apss_tcu_clk_src = {
        },
 };
 
+static const struct freq_tbl ftbl_gcc_bimc_gpu_clk[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       F(200000000, P_GPLL0, 4, 0, 0),
+       F(266500000, P_BIMC, 4, 0, 0),
+       F(400000000, P_GPLL0, 2, 0, 0),
+       F(533000000, P_BIMC, 2, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 bimc_gpu_clk_src = {
+       .cmd_rcgr = 0x31028,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_bimc_map,
+       .freq_tbl = ftbl_gcc_bimc_gpu_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "bimc_gpu_clk_src",
+               .parent_names = gcc_xo_gpll0_bimc,
+               .num_parents = 3,
+               .flags = CLK_GET_RATE_NOCACHE,
+               .ops = &clk_rcg2_shared_ops,
+       },
+};
+
 static const struct freq_tbl ftbl_gcc_usb_hs_system_clk[] = {
        F(80000000, P_GPLL0, 10, 0, 0),
        { }
@@ -1112,6 +1198,305 @@ static struct clk_rcg2 usb_hs_system_clk_src = {
        },
 };
 
+static const struct freq_tbl ftbl_gcc_ultaudio_ahb_clk[] = {
+       F(3200000, P_XO, 6, 0, 0),
+       F(6400000, P_XO, 3, 0, 0),
+       F(9600000, P_XO, 2, 0, 0),
+       F(19200000, P_XO, 1, 0, 0),
+       F(40000000, P_GPLL0, 10, 1, 2),
+       F(66670000, P_GPLL0, 12, 0, 0),
+       F(80000000, P_GPLL0, 10, 0, 0),
+       F(100000000, P_GPLL0, 8, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 ultaudio_ahbfabric_clk_src = {
+       .cmd_rcgr = 0x1c010,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .parent_map = gcc_xo_gpll0_gpll1_sleep_map,
+       .freq_tbl = ftbl_gcc_ultaudio_ahb_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ultaudio_ahbfabric_clk_src",
+               .parent_names = gcc_xo_gpll0_gpll1_sleep,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_ultaudio_ahbfabric_ixfabric_clk = {
+       .halt_reg = 0x1c028,
+       .clkr = {
+               .enable_reg = 0x1c028,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_ahbfabric_ixfabric_clk",
+                       .parent_names = (const char *[]){
+                               "ultaudio_ahbfabric_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ultaudio_ahbfabric_ixfabric_lpm_clk = {
+       .halt_reg = 0x1c024,
+       .clkr = {
+               .enable_reg = 0x1c024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_ahbfabric_ixfabric_lpm_clk",
+                       .parent_names = (const char *[]){
+                               "ultaudio_ahbfabric_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ultaudio_lpaif_i2s_clk[] = {
+       F(256000, P_XO, 5, 1, 15),
+       F(512000, P_XO, 5, 2, 15),
+       F(705600, P_GPLL1, 16, 1, 80),
+       F(768000, P_XO, 5, 1, 5),
+       F(800000, P_XO, 5, 5, 24),
+       F(1024000, P_GPLL1, 14, 1, 63),
+       F(1152000, P_XO, 1, 3, 50),
+       F(1411200, P_GPLL1, 16, 1, 40),
+       F(1536000, P_XO, 1, 2, 25),
+       F(1600000, P_XO, 12, 0, 0),
+       F(2048000, P_GPLL1, 9, 1, 49),
+       F(2400000, P_XO, 8, 0, 0),
+       F(2822400, P_GPLL1, 16, 1, 20),
+       F(3072000, P_GPLL1, 14, 1, 21),
+       F(4096000, P_GPLL1, 9, 2, 49),
+       F(4800000, P_XO, 4, 0, 0),
+       F(5644800, P_GPLL1, 16, 1, 10),
+       F(6144000, P_GPLL1, 7, 1, 21),
+       F(8192000, P_GPLL1, 9, 4, 49),
+       F(9600000, P_XO, 2, 0, 0),
+       F(11289600, P_GPLL1, 16, 1, 5),
+       F(12288000, P_GPLL1, 7, 2, 21),
+       { }
+};
+
+static struct clk_rcg2 ultaudio_lpaif_pri_i2s_clk_src = {
+       .cmd_rcgr = 0x1c054,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .parent_map = gcc_xo_gpll1_epi2s_emclk_sleep_map,
+       .freq_tbl = ftbl_gcc_ultaudio_lpaif_i2s_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ultaudio_lpaif_pri_i2s_clk_src",
+               .parent_names = gcc_xo_gpll1_epi2s_emclk_sleep,
+               .num_parents = 5,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_ultaudio_lpaif_pri_i2s_clk = {
+       .halt_reg = 0x1c068,
+       .clkr = {
+               .enable_reg = 0x1c068,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_lpaif_pri_i2s_clk",
+                       .parent_names = (const char *[]){
+                               "ultaudio_lpaif_pri_i2s_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 ultaudio_lpaif_sec_i2s_clk_src = {
+       .cmd_rcgr = 0x1c06c,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .parent_map = gcc_xo_gpll1_esi2s_emclk_sleep_map,
+       .freq_tbl = ftbl_gcc_ultaudio_lpaif_i2s_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ultaudio_lpaif_sec_i2s_clk_src",
+               .parent_names = gcc_xo_gpll1_esi2s_emclk_sleep,
+               .num_parents = 5,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_ultaudio_lpaif_sec_i2s_clk = {
+       .halt_reg = 0x1c080,
+       .clkr = {
+               .enable_reg = 0x1c080,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_lpaif_sec_i2s_clk",
+                       .parent_names = (const char *[]){
+                               "ultaudio_lpaif_sec_i2s_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_rcg2 ultaudio_lpaif_aux_i2s_clk_src = {
+       .cmd_rcgr = 0x1c084,
+       .hid_width = 5,
+       .mnd_width = 8,
+       .parent_map = gcc_xo_gpll1_emclk_sleep_map,
+       .freq_tbl = ftbl_gcc_ultaudio_lpaif_i2s_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ultaudio_lpaif_aux_i2s_clk_src",
+               .parent_names = gcc_xo_gpll1_esi2s_emclk_sleep,
+               .num_parents = 5,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_ultaudio_lpaif_aux_i2s_clk = {
+       .halt_reg = 0x1c098,
+       .clkr = {
+               .enable_reg = 0x1c098,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_lpaif_aux_i2s_clk",
+                       .parent_names = (const char *[]){
+                               "ultaudio_lpaif_aux_i2s_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_gcc_ultaudio_xo_clk[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 ultaudio_xo_clk_src = {
+       .cmd_rcgr = 0x1c034,
+       .hid_width = 5,
+       .parent_map = gcc_xo_sleep_map,
+       .freq_tbl = ftbl_gcc_ultaudio_xo_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "ultaudio_xo_clk_src",
+               .parent_names = gcc_xo_sleep,
+               .num_parents = 2,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_ultaudio_avsync_xo_clk = {
+       .halt_reg = 0x1c04c,
+       .clkr = {
+               .enable_reg = 0x1c04c,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_avsync_xo_clk",
+                       .parent_names = (const char *[]){
+                               "ultaudio_xo_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ultaudio_stc_xo_clk = {
+       .halt_reg = 0x1c050,
+       .clkr = {
+               .enable_reg = 0x1c050,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_stc_xo_clk",
+                       .parent_names = (const char *[]){
+                               "ultaudio_xo_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static const struct freq_tbl ftbl_codec_clk[] = {
+       F(19200000, P_XO, 1, 0, 0),
+       F(11289600, P_EXT_MCLK, 1, 0, 0),
+       { }
+};
+
+static struct clk_rcg2 codec_digcodec_clk_src = {
+       .cmd_rcgr = 0x1c09c,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll1_emclk_sleep_map,
+       .freq_tbl = ftbl_codec_clk,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "codec_digcodec_clk_src",
+               .parent_names = gcc_xo_gpll1_emclk_sleep,
+               .num_parents = 4,
+               .ops = &clk_rcg2_ops,
+       },
+};
+
+static struct clk_branch gcc_codec_digcodec_clk = {
+       .halt_reg = 0x1c0b0,
+       .clkr = {
+               .enable_reg = 0x1c0b0,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_codec_digcodec_clk",
+                       .parent_names = (const char *[]){
+                               "codec_digcodec_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ultaudio_pcnoc_mport_clk = {
+       .halt_reg = 0x1c000,
+       .clkr = {
+               .enable_reg = 0x1c000,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_pcnoc_mport_clk",
+                       .parent_names = (const char *[]){
+                               "pcnoc_bfdcd_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_ultaudio_pcnoc_sway_clk = {
+       .halt_reg = 0x1c004,
+       .clkr = {
+               .enable_reg = 0x1c004,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_ultaudio_pcnoc_sway_clk",
+                       .parent_names = (const char *[]){
+                               "pcnoc_bfdcd_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static const struct freq_tbl ftbl_gcc_venus0_vcodec0_clk[] = {
        F(100000000, P_GPLL0, 8, 0, 0),
        F(160000000, P_GPLL0, 5, 0, 0),
@@ -2358,6 +2743,51 @@ static struct clk_branch gcc_sdcc2_apps_clk = {
        },
 };
 
+static struct clk_rcg2 bimc_ddr_clk_src = {
+       .cmd_rcgr = 0x32004,
+       .hid_width = 5,
+       .parent_map = gcc_xo_gpll0_bimc_map,
+       .clkr.hw.init = &(struct clk_init_data){
+               .name = "bimc_ddr_clk_src",
+               .parent_names = gcc_xo_gpll0_bimc,
+               .num_parents = 3,
+               .ops = &clk_rcg2_ops,
+               .flags = CLK_GET_RATE_NOCACHE,
+       },
+};
+
+static struct clk_branch gcc_apss_tcu_clk = {
+       .halt_reg = 0x12018,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(1),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_apss_tcu_clk",
+                       .parent_names = (const char *[]){
+                               "bimc_ddr_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_gfx_tcu_clk = {
+       .halt_reg = 0x12020,
+       .clkr = {
+               .enable_reg = 0x4500c,
+               .enable_mask = BIT(2),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_gfx_tcu_clk",
+                       .parent_names = (const char *[]){
+                               "bimc_ddr_clk_src",
+                       },
+                       .num_parents = 1,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch gcc_gtcu_ahb_clk = {
        .halt_reg = 0x12044,
        .clkr = {
@@ -2375,6 +2805,40 @@ static struct clk_branch gcc_gtcu_ahb_clk = {
        },
 };
 
+static struct clk_branch gcc_bimc_gfx_clk = {
+       .halt_reg = 0x31024,
+       .clkr = {
+               .enable_reg = 0x31024,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_gfx_clk",
+                       .parent_names = (const char *[]){
+                               "bimc_gpu_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
+static struct clk_branch gcc_bimc_gpu_clk = {
+       .halt_reg = 0x31040,
+       .clkr = {
+               .enable_reg = 0x31040,
+               .enable_mask = BIT(0),
+               .hw.init = &(struct clk_init_data){
+                       .name = "gcc_bimc_gpu_clk",
+                       .parent_names = (const char *[]){
+                               "bimc_gpu_clk_src",
+                       },
+                       .num_parents = 1,
+                       .flags = CLK_SET_RATE_PARENT,
+                       .ops = &clk_branch2_ops,
+               },
+       },
+};
+
 static struct clk_branch gcc_jpeg_tbu_clk = {
        .halt_reg = 0x12034,
        .clkr = {
@@ -2562,6 +3026,46 @@ static struct clk_branch gcc_venus0_vcodec0_clk = {
        },
 };
 
+static struct gdsc venus_gdsc = {
+       .gdscr = 0x4c018,
+       .pd = {
+               .name = "venus",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc mdss_gdsc = {
+       .gdscr = 0x4d078,
+       .pd = {
+               .name = "mdss",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc jpeg_gdsc = {
+       .gdscr = 0x5701c,
+       .pd = {
+               .name = "jpeg",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc vfe_gdsc = {
+       .gdscr = 0x58034,
+       .pd = {
+               .name = "vfe",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
+static struct gdsc oxili_gdsc = {
+       .gdscr = 0x5901c,
+       .pd = {
+               .name = "oxili",
+       },
+       .pwrsts = PWRSTS_OFF_ON,
+};
+
 static struct clk_regmap *gcc_msm8916_clocks[] = {
        [GPLL0] = &gpll0.clkr,
        [GPLL0_VOTE] = &gpll0_vote,
@@ -2701,6 +3205,36 @@ static struct clk_regmap *gcc_msm8916_clocks[] = {
        [GCC_VENUS0_AHB_CLK] = &gcc_venus0_ahb_clk.clkr,
        [GCC_VENUS0_AXI_CLK] = &gcc_venus0_axi_clk.clkr,
        [GCC_VENUS0_VCODEC0_CLK] = &gcc_venus0_vcodec0_clk.clkr,
+       [BIMC_DDR_CLK_SRC] = &bimc_ddr_clk_src.clkr,
+       [GCC_APSS_TCU_CLK] = &gcc_apss_tcu_clk.clkr,
+       [GCC_GFX_TCU_CLK] = &gcc_gfx_tcu_clk.clkr,
+       [BIMC_GPU_CLK_SRC] = &bimc_gpu_clk_src.clkr,
+       [GCC_BIMC_GFX_CLK] = &gcc_bimc_gfx_clk.clkr,
+       [GCC_BIMC_GPU_CLK] = &gcc_bimc_gpu_clk.clkr,
+       [ULTAUDIO_AHBFABRIC_CLK_SRC] = &ultaudio_ahbfabric_clk_src.clkr,
+       [ULTAUDIO_LPAIF_PRI_I2S_CLK_SRC] = &ultaudio_lpaif_pri_i2s_clk_src.clkr,
+       [ULTAUDIO_LPAIF_SEC_I2S_CLK_SRC] = &ultaudio_lpaif_sec_i2s_clk_src.clkr,
+       [ULTAUDIO_LPAIF_AUX_I2S_CLK_SRC] = &ultaudio_lpaif_aux_i2s_clk_src.clkr,
+       [ULTAUDIO_XO_CLK_SRC] = &ultaudio_xo_clk_src.clkr,
+       [CODEC_DIGCODEC_CLK_SRC] = &codec_digcodec_clk_src.clkr,
+       [GCC_ULTAUDIO_PCNOC_MPORT_CLK] = &gcc_ultaudio_pcnoc_mport_clk.clkr,
+       [GCC_ULTAUDIO_PCNOC_SWAY_CLK] = &gcc_ultaudio_pcnoc_sway_clk.clkr,
+       [GCC_ULTAUDIO_AVSYNC_XO_CLK] = &gcc_ultaudio_avsync_xo_clk.clkr,
+       [GCC_ULTAUDIO_STC_XO_CLK] = &gcc_ultaudio_stc_xo_clk.clkr,
+       [GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_CLK] = &gcc_ultaudio_ahbfabric_ixfabric_clk.clkr,
+       [GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_LPM_CLK] = &gcc_ultaudio_ahbfabric_ixfabric_lpm_clk.clkr,
+       [GCC_ULTAUDIO_LPAIF_PRI_I2S_CLK] = &gcc_ultaudio_lpaif_pri_i2s_clk.clkr,
+       [GCC_ULTAUDIO_LPAIF_SEC_I2S_CLK] = &gcc_ultaudio_lpaif_sec_i2s_clk.clkr,
+       [GCC_ULTAUDIO_LPAIF_AUX_I2S_CLK] = &gcc_ultaudio_lpaif_aux_i2s_clk.clkr,
+       [GCC_CODEC_DIGCODEC_CLK] = &gcc_codec_digcodec_clk.clkr,
+};
+
+static struct gdsc *gcc_msm8916_gdscs[] = {
+       [VENUS_GDSC] = &venus_gdsc,
+       [MDSS_GDSC] = &mdss_gdsc,
+       [JPEG_GDSC] = &jpeg_gdsc,
+       [VFE_GDSC] = &vfe_gdsc,
+       [OXILI_GDSC] = &oxili_gdsc,
 };
 
 static const struct qcom_reset_map gcc_msm8916_resets[] = {
@@ -2810,6 +3344,8 @@ static const struct qcom_cc_desc gcc_msm8916_desc = {
        .num_clks = ARRAY_SIZE(gcc_msm8916_clocks),
        .resets = gcc_msm8916_resets,
        .num_resets = ARRAY_SIZE(gcc_msm8916_resets),
+       .gdscs = gcc_msm8916_gdscs,
+       .num_gdscs = ARRAY_SIZE(gcc_msm8916_gdscs),
 };
 
 static const struct of_device_id gcc_msm8916_match_table[] = {
@@ -2836,15 +3372,8 @@ static int gcc_msm8916_probe(struct platform_device *pdev)
        return qcom_cc_probe(pdev, &gcc_msm8916_desc);
 }
 
-static int gcc_msm8916_remove(struct platform_device *pdev)
-{
-       qcom_cc_remove(pdev);
-       return 0;
-}
-
 static struct platform_driver gcc_msm8916_driver = {
        .probe          = gcc_msm8916_probe,
-       .remove         = gcc_msm8916_remove,
        .driver         = {
                .name   = "gcc-msm8916",
                .of_match_table = gcc_msm8916_match_table,