switch (state) {
 
        case CPUFREQ_PRECHANGE:
+               if (WARN(policy->transition_ongoing,
+                               "In middle of another frequency transition\n"))
+                       return;
+
+               policy->transition_ongoing = true;
+
                /* detect if the driver reported a value as "old frequency"
                 * which is not equal to what the cpufreq core thinks is
                 * "old frequency".
                break;
 
        case CPUFREQ_POSTCHANGE:
+               if (WARN(!policy->transition_ongoing,
+                               "No frequency transition in progress\n"))
+                       return;
+
+               policy->transition_ongoing = false;
+
                adjust_jiffies(CPUFREQ_POSTCHANGE, freqs);
                pr_debug("FREQ: %lu - CPU: %lu", (unsigned long)freqs->new,
                        (unsigned long)freqs->cpu);
 
        if (cpufreq_disabled())
                return -ENODEV;
+       if (policy->transition_ongoing)
+               return -EBUSY;
 
        /* Make sure that target_freq is within supported range */
        if (target_freq > policy->max)