static struct cpuidle_driver *cpuidle_curr_driver;
DEFINE_SPINLOCK(cpuidle_driver_lock);
-int cpuidle_driver_refcount;
static void set_power_states(struct cpuidle_driver *drv)
{
if (!drv->power_specified)
set_power_states(drv);
+ drv->refcnt = 0;
+
cpuidle_curr_driver = drv;
spin_unlock(&cpuidle_driver_lock);
spin_lock(&cpuidle_driver_lock);
- if (!WARN_ON(cpuidle_driver_refcount > 0))
+ if (!WARN_ON(drv->refcnt > 0))
cpuidle_curr_driver = NULL;
spin_unlock(&cpuidle_driver_lock);
spin_lock(&cpuidle_driver_lock);
drv = cpuidle_curr_driver;
- cpuidle_driver_refcount++;
+ drv->refcnt++;
spin_unlock(&cpuidle_driver_lock);
return drv;
void cpuidle_driver_unref(void)
{
+ struct cpuidle_driver *drv = cpuidle_curr_driver;
+
spin_lock(&cpuidle_driver_lock);
- if (!WARN_ON(cpuidle_driver_refcount <= 0))
- cpuidle_driver_refcount--;
+ if (drv && !WARN_ON(drv->refcnt <= 0))
+ drv->refcnt--;
spin_unlock(&cpuidle_driver_lock);
}