#define SUPER_CDIV_ENB         BIT(31)
 
+#define TSENSOR_SLOWDOWN       BIT(23)
+
 static struct tegra_clk_super_mux *cclk_super;
 static bool cclk_on_pllx;
 
 static unsigned long cclk_super_recalc_rate(struct clk_hw *hw,
                                            unsigned long parent_rate)
 {
+       struct tegra_clk_super_mux *super = to_clk_super_mux(hw);
+       u32 val = readl_relaxed(super->reg);
+       unsigned int div2;
+
+       /* check whether thermal throttling is active */
+       if (val & TSENSOR_SLOWDOWN)
+               div2 = 1;
+       else
+               div2 = 0;
+
        if (cclk_super_get_parent(hw) == PLLX_INDEX)
-               return parent_rate;
+               return parent_rate >> div2;
 
-       return tegra_clk_super_ops.recalc_rate(hw, parent_rate);
+       return tegra_clk_super_ops.recalc_rate(hw, parent_rate) >> div2;
 }
 
 static int cclk_super_determine_rate(struct clk_hw *hw,
 
        /* CCLKG */
        clk = tegra_clk_register_super_cclk("cclk_g", cclk_g_parents,
                                  ARRAY_SIZE(cclk_g_parents),
-                                 CLK_SET_RATE_PARENT,
+                                 CLK_SET_RATE_PARENT | CLK_GET_RATE_NOCACHE,
                                  clk_base + CCLKG_BURST_POLICY,
                                  0, NULL);
        clks[TEGRA30_CLK_CCLK_G] = clk;