};
 
 /************************** sysfs interface ************************/
-static struct dbs_governor cs_dbs_gov;
 
 static ssize_t store_sampling_down_factor(struct gov_attr_set *attr_set,
                                          const char *buf, size_t count)
 
 /************************** sysfs end ************************/
 
+struct cs_governor {
+       struct dbs_governor dbs_gov;
+       unsigned int usage_count;
+};
+
+static struct cs_governor cs_gov;
+
 static struct policy_dbs_info *cs_alloc(void)
 {
        struct cs_policy_dbs_info *dbs_info;
        kfree(to_dbs_info(policy_dbs));
 }
 
-static int cs_init(struct dbs_data *dbs_data, bool notify)
+static int cs_init(struct dbs_data *dbs_data)
 {
        struct cs_dbs_tuners *tuners;
 
        dbs_data->min_sampling_rate = MIN_SAMPLING_RATE_RATIO *
                jiffies_to_usecs(10);
 
-       if (notify)
+       /*
+        * This function and cs_exit() are only called under gov_dbs_data_mutex
+        * which is global, so the cs_gov.usage_count accesses are guaranteed
+        * to be serialized.
+        */
+       if (!cs_gov.usage_count++)
                cpufreq_register_notifier(&cs_cpufreq_notifier_block,
                                          CPUFREQ_TRANSITION_NOTIFIER);
 
        return 0;
 }
 
-static void cs_exit(struct dbs_data *dbs_data, bool notify)
+static void cs_exit(struct dbs_data *dbs_data)
 {
-       if (notify)
+       /* Protected by gov_dbs_data_mutex - see the comment in cs_init(). */
+       if (!--cs_gov.usage_count)
                cpufreq_unregister_notifier(&cs_cpufreq_notifier_block,
                                            CPUFREQ_TRANSITION_NOTIFIER);
 
        dbs_info->requested_freq = policy->cur;
 }
 
-static struct dbs_governor cs_dbs_gov = {
-       .gov = CPUFREQ_DBS_GOVERNOR_INITIALIZER("conservative"),
-       .kobj_type = { .default_attrs = cs_attributes },
-       .gov_dbs_timer = cs_dbs_timer,
-       .alloc = cs_alloc,
-       .free = cs_free,
-       .init = cs_init,
-       .exit = cs_exit,
-       .start = cs_start,
+static struct cs_governor cs_gov = {
+       .dbs_gov = {
+               .gov = CPUFREQ_DBS_GOVERNOR_INITIALIZER("conservative"),
+               .kobj_type = { .default_attrs = cs_attributes },
+               .gov_dbs_timer = cs_dbs_timer,
+               .alloc = cs_alloc,
+               .free = cs_free,
+               .init = cs_init,
+               .exit = cs_exit,
+               .start = cs_start,
+       },
 };
 
-#define CPU_FREQ_GOV_CONSERVATIVE      (&cs_dbs_gov.gov)
+#define CPU_FREQ_GOV_CONSERVATIVE      (&cs_gov.dbs_gov.gov)
 
 static int dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
                                void *data)
 
 
        gov_attr_set_init(&dbs_data->attr_set, &policy_dbs->list);
 
-       ret = gov->init(dbs_data, !policy->governor->initialized);
+       ret = gov->init(dbs_data);
        if (ret)
                goto free_policy_dbs_info;
 
 
        if (!have_governor_per_policy())
                gov->gdbs_data = NULL;
-       gov->exit(dbs_data, !policy->governor->initialized);
+       gov->exit(dbs_data);
        kfree(dbs_data);
 
 free_policy_dbs_info:
                if (!have_governor_per_policy())
                        gov->gdbs_data = NULL;
 
-               gov->exit(dbs_data, policy->governor->initialized == 1);
+               gov->exit(dbs_data);
                kfree(dbs_data);
        }
 
 
        unsigned int (*gov_dbs_timer)(struct cpufreq_policy *policy);
        struct policy_dbs_info *(*alloc)(void);
        void (*free)(struct policy_dbs_info *policy_dbs);
-       int (*init)(struct dbs_data *dbs_data, bool notify);
-       void (*exit)(struct dbs_data *dbs_data, bool notify);
+       int (*init)(struct dbs_data *dbs_data);
+       void (*exit)(struct dbs_data *dbs_data);
        void (*start)(struct cpufreq_policy *policy);
 };