return rate;
 }
 
+static void tegra_clk_pll_restore_context(struct clk_hw *hw)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+       struct clk_hw *parent = clk_hw_get_parent(hw);
+       unsigned long parent_rate = clk_hw_get_rate(parent);
+       unsigned long rate = clk_hw_get_rate(hw);
+
+       if (clk_pll_is_enabled(hw))
+               return;
+
+       if (pll->params->set_defaults)
+               pll->params->set_defaults(pll);
+
+       clk_pll_set_rate(hw, rate, parent_rate);
+
+       if (!__clk_get_enable_count(hw->clk))
+               clk_pll_disable(hw);
+       else
+               clk_pll_enable(hw);
+}
+
 const struct clk_ops tegra_clk_pll_ops = {
        .is_enabled = clk_pll_is_enabled,
        .enable = clk_pll_enable,
        .recalc_rate = clk_pll_recalc_rate,
        .round_rate = clk_pll_round_rate,
        .set_rate = clk_pll_set_rate,
+       .restore_context = tegra_clk_pll_restore_context,
 };
 
 const struct clk_ops tegra_clk_plle_ops = {
 
        return ret;
 }
+
+static void _clk_plle_tegra_init_parent(struct tegra_clk_pll *pll)
+{
+       u32 val, val_aux;
+
+       /* ensure parent is set to pll_ref */
+       val = pll_readl_base(pll);
+       val_aux = pll_readl(pll->params->aux_reg, pll);
+
+       if (val & PLL_BASE_ENABLE) {
+               if ((val_aux & PLLE_AUX_PLLRE_SEL) ||
+                   (val_aux & PLLE_AUX_PLLP_SEL))
+                       WARN(1, "pll_e enabled with unsupported parent %s\n",
+                            (val_aux & PLLE_AUX_PLLP_SEL) ? "pllp_out0" :
+                            "pll_re_vco");
+       } else {
+               val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL);
+               pll_writel(val_aux, pll->params->aux_reg, pll);
+               fence_udelay(1, pll->clk_base);
+       }
+}
 #endif
 
 static struct tegra_clk_pll *_tegra_init_pll(void __iomem *clk_base,
 {
        struct tegra_clk_pll *pll;
        struct clk *clk;
-       u32 val, val_aux;
 
        pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
        if (IS_ERR(pll))
                return ERR_CAST(pll);
 
-       /* ensure parent is set to pll_re_vco */
-
-       val = pll_readl_base(pll);
-       val_aux = pll_readl(pll_params->aux_reg, pll);
-
-       if (val & PLL_BASE_ENABLE) {
-               if ((val_aux & PLLE_AUX_PLLRE_SEL) ||
-                       (val_aux & PLLE_AUX_PLLP_SEL))
-                       WARN(1, "pll_e enabled with unsupported parent %s\n",
-                         (val_aux & PLLE_AUX_PLLP_SEL) ? "pllp_out0" :
-                                       "pll_re_vco");
-       } else {
-               val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL);
-               pll_writel(val_aux, pll_params->aux_reg, pll);
-       }
+       _clk_plle_tegra_init_parent(pll);
 
        clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
                                      &tegra_clk_plle_tegra114_ops);
        .recalc_rate = clk_pll_recalc_rate,
        .round_rate = clk_pll_ramp_round_rate,
        .set_rate = clk_pllxc_set_rate,
+       .restore_context = tegra_clk_pll_restore_context,
 };
 
 struct clk *tegra_clk_register_pllss(const char *name, const char *parent_name,
                spin_unlock_irqrestore(pll->lock, flags);
 }
 
+static void tegra_clk_plle_t210_restore_context(struct clk_hw *hw)
+{
+       struct tegra_clk_pll *pll = to_clk_pll(hw);
+
+       _clk_plle_tegra_init_parent(pll);
+}
+
 static const struct clk_ops tegra_clk_plle_tegra210_ops = {
        .is_enabled =  clk_plle_tegra210_is_enabled,
        .enable = clk_plle_tegra210_enable,
        .disable = clk_plle_tegra210_disable,
        .recalc_rate = clk_pll_recalc_rate,
+       .restore_context = tegra_clk_plle_t210_restore_context,
 };
 
 struct clk *tegra_clk_register_plle_tegra210(const char *name,
 {
        struct tegra_clk_pll *pll;
        struct clk *clk;
-       u32 val, val_aux;
 
        pll = _tegra_init_pll(clk_base, NULL, pll_params, lock);
        if (IS_ERR(pll))
                return ERR_CAST(pll);
 
-       /* ensure parent is set to pll_re_vco */
-
-       val = pll_readl_base(pll);
-       val_aux = pll_readl(pll_params->aux_reg, pll);
-
-       if (val & PLLE_BASE_ENABLE) {
-               if ((val_aux & PLLE_AUX_PLLRE_SEL) ||
-                       (val_aux & PLLE_AUX_PLLP_SEL))
-                       WARN(1, "pll_e enabled with unsupported parent %s\n",
-                         (val_aux & PLLE_AUX_PLLP_SEL) ? "pllp_out0" :
-                                       "pll_re_vco");
-       } else {
-               val_aux &= ~(PLLE_AUX_PLLRE_SEL | PLLE_AUX_PLLP_SEL);
-               pll_writel(val_aux, pll_params->aux_reg, pll);
-       }
+       _clk_plle_tegra_init_parent(pll);
 
        clk = _tegra_clk_register_pll(pll, name, parent_name, flags,
                                      &tegra_clk_plle_tegra210_ops);