void __iomem *reg_div;
        u8 shift_div;
        struct regmap *nb_pm_base;
+       unsigned long l1_expiration;
 };
 
 #define to_clk_double_div(_hw) container_of(_hw, struct clk_double_div, hw)
  * 2. Sleep 20ms for stabling VDD voltage
  * 3. Then switch from L1 (500/600 MHz) to L0 (1000/1200 MHz).
  */
-static void clk_pm_cpu_set_rate_wa(unsigned long rate, struct regmap *base)
+static void clk_pm_cpu_set_rate_wa(struct clk_pm_cpu *pm_cpu,
+                                  unsigned int new_level, unsigned long rate,
+                                  struct regmap *base)
 {
        unsigned int cur_level;
 
-       if (rate < 1000 * 1000 * 1000)
-               return;
-
        regmap_read(base, ARMADA_37XX_NB_CPU_LOAD, &cur_level);
        cur_level &= ARMADA_37XX_NB_CPU_LOAD_MASK;
-       if (cur_level <= ARMADA_37XX_DVFS_LOAD_1)
+
+       if (cur_level == new_level)
+               return;
+
+       /*
+        * System wants to go to L1 on its own. If we are going from L2/L3,
+        * remember when 20ms will expire. If from L0, set the value so that
+        * next switch to L0 won't have to wait.
+        */
+       if (new_level == ARMADA_37XX_DVFS_LOAD_1) {
+               if (cur_level == ARMADA_37XX_DVFS_LOAD_0)
+                       pm_cpu->l1_expiration = jiffies;
+               else
+                       pm_cpu->l1_expiration = jiffies + msecs_to_jiffies(20);
                return;
+       }
+
+       /*
+        * If we are setting to L2/L3, just invalidate L1 expiration time,
+        * sleeping is not needed.
+        */
+       if (rate < 1000*1000*1000)
+               goto invalidate_l1_exp;
+
+       /*
+        * We are going to L0 with rate >= 1GHz. Check whether we have been at
+        * L1 for long enough time. If not, go to L1 for 20ms.
+        */
+       if (pm_cpu->l1_expiration && jiffies >= pm_cpu->l1_expiration)
+               goto invalidate_l1_exp;
 
        regmap_update_bits(base, ARMADA_37XX_NB_CPU_LOAD,
                           ARMADA_37XX_NB_CPU_LOAD_MASK,
                           ARMADA_37XX_DVFS_LOAD_1);
        msleep(20);
+
+invalidate_l1_exp:
+       pm_cpu->l1_expiration = 0;
 }
 
 static int clk_pm_cpu_set_rate(struct clk_hw *hw, unsigned long rate,
                        reg = ARMADA_37XX_NB_CPU_LOAD;
                        mask = ARMADA_37XX_NB_CPU_LOAD_MASK;
 
-                       clk_pm_cpu_set_rate_wa(rate, base);
+                       /* Apply workaround when base CPU frequency is 1000 or 1200 MHz */
+                       if (parent_rate >= 1000*1000*1000)
+                               clk_pm_cpu_set_rate_wa(pm_cpu, load_level, rate, base);
 
                        regmap_update_bits(base, reg, mask, load_level);