}
 }
 
+static void rockchip_cpuclk_set_pre_muxs(struct rockchip_cpuclk *cpuclk,
+                                        const struct rockchip_cpuclk_rate_table *rate)
+{
+       int i;
+
+       /* alternate parent is active now. set the pre_muxs */
+       for (i = 0; i < ARRAY_SIZE(rate->pre_muxs); i++) {
+               const struct rockchip_cpuclk_clksel *clksel = &rate->pre_muxs[i];
+
+               if (!clksel->reg)
+                       break;
+
+               pr_debug("%s: setting reg 0x%x to 0x%x\n",
+                        __func__, clksel->reg, clksel->val);
+               writel(clksel->val, cpuclk->reg_base + clksel->reg);
+       }
+}
+
+static void rockchip_cpuclk_set_post_muxs(struct rockchip_cpuclk *cpuclk,
+                                         const struct rockchip_cpuclk_rate_table *rate)
+{
+       int i;
+
+       /* alternate parent is active now. set the muxs */
+       for (i = 0; i < ARRAY_SIZE(rate->post_muxs); i++) {
+               const struct rockchip_cpuclk_clksel *clksel = &rate->post_muxs[i];
+
+               if (!clksel->reg)
+                       break;
+
+               pr_debug("%s: setting reg 0x%x to 0x%x\n",
+                        __func__, clksel->reg, clksel->val);
+               writel(clksel->val, cpuclk->reg_base + clksel->reg);
+       }
+}
+
 static int rockchip_cpuclk_pre_rate_change(struct rockchip_cpuclk *cpuclk,
                                           struct clk_notifier_data *ndata)
 {
                               cpuclk->reg_base + reg_data->core_reg[i]);
                }
        }
+
+       rockchip_cpuclk_set_pre_muxs(cpuclk, rate);
+
        /* select alternate parent */
        if (reg_data->mux_core_reg)
                writel(HIWORD_UPDATE(reg_data->mux_core_alt,
                                     reg_data->mux_core_shift),
                       cpuclk->reg_base + reg_data->core_reg[0]);
 
+       rockchip_cpuclk_set_post_muxs(cpuclk, rate);
+
        /* remove dividers */
        for (i = 0; i < reg_data->num_cores; i++) {
                writel(HIWORD_UPDATE(0, reg_data->div_core_mask[i],