/* If cpu is last user of policy, free policy */
        if (cpus == 1) {
+               __cpufreq_governor(data, CPUFREQ_GOV_POLICY_EXIT);
+
                lock_policy_rwsem_read(cpu);
                kobj = &data->kobj;
                cmp = &data->kobj_unregister;
 static int __cpufreq_set_policy(struct cpufreq_policy *data,
                                struct cpufreq_policy *policy)
 {
-       int ret = 0;
+       int ret = 0, failed = 1;
 
        pr_debug("setting new policy for CPU %u: %u - %u kHz\n", policy->cpu,
                policy->min, policy->max);
                        pr_debug("governor switch\n");
 
                        /* end old governor */
-                       if (data->governor)
+                       if (data->governor) {
                                __cpufreq_governor(data, CPUFREQ_GOV_STOP);
+                               __cpufreq_governor(data,
+                                               CPUFREQ_GOV_POLICY_EXIT);
+                       }
 
                        /* start new governor */
                        data->governor = policy->governor;
-                       if (__cpufreq_governor(data, CPUFREQ_GOV_START)) {
+                       if (!__cpufreq_governor(data, CPUFREQ_GOV_POLICY_INIT)) {
+                               if (!__cpufreq_governor(data, CPUFREQ_GOV_START))
+                                       failed = 0;
+                               else
+                                       __cpufreq_governor(data,
+                                                       CPUFREQ_GOV_POLICY_EXIT);
+                       }
+
+                       if (failed) {
                                /* new governor failed, so re-start old one */
                                pr_debug("starting governor %s failed\n",
                                                        data->governor->name);
                                if (old_gov) {
                                        data->governor = old_gov;
+                                       __cpufreq_governor(data,
+                                                       CPUFREQ_GOV_POLICY_INIT);
                                        __cpufreq_governor(data,
                                                           CPUFREQ_GOV_START);
                                }
 
                                         * governors are used */
        unsigned int            policy; /* see above */
        struct cpufreq_governor *governor; /* see below */
+       void                    *governor_data;
 
        struct work_struct      update; /* if update_policy() needs to be
                                         * called, but you're in IRQ context */
  *                          CPUFREQ GOVERNORS                        *
  *********************************************************************/
 
-#define CPUFREQ_GOV_START  1
-#define CPUFREQ_GOV_STOP   2
-#define CPUFREQ_GOV_LIMITS 3
+#define CPUFREQ_GOV_START      1
+#define CPUFREQ_GOV_STOP       2
+#define CPUFREQ_GOV_LIMITS     3
+#define CPUFREQ_GOV_POLICY_INIT        4
+#define CPUFREQ_GOV_POLICY_EXIT        5
 
 struct cpufreq_governor {
        char    name[CPUFREQ_NAME_LEN];