int err = 0;
u32 flags = 0;
- if (!devfreq->governor)
+ if (!mutex_is_locked(&devfreq->lock)) {
+ WARN(true, "devfreq->lock must be locked by the caller.\n");
return -EINVAL;
+ }
- mutex_lock(&devfreq->lock);
+ if (!devfreq->governor)
+ return -EINVAL;
/* Reevaluate the proper frequency */
err = devfreq->governor->get_target_freq(devfreq, &freq);
- if (err) {
- mutex_unlock(&devfreq->lock);
+ if (err)
return err;
- }
/*
* Adjust the freuqency with user freq and QoS.
}
err = devfreq->profile->target(devfreq->dev.parent, &freq, flags);
- if (err) {
- mutex_unlock(&devfreq->lock);
+ if (err)
return err;
- }
if (devfreq->profile->freq_table)
if (devfreq_update_status(devfreq, freq))
"Couldn't update frequency transition information.\n");
devfreq->previous_freq = freq;
-
- mutex_unlock(&devfreq->lock);
-
return err;
}
EXPORT_SYMBOL(update_devfreq);
struct devfreq *devfreq = container_of(work,
struct devfreq, work.work);
+ mutex_lock(&devfreq->lock);
err = update_devfreq(devfreq);
if (err)
dev_err(&devfreq->dev, "dvfs failed with (%d) error\n", err);
queue_delayed_work(devfreq_wq, &devfreq->work,
msecs_to_jiffies(devfreq->profile->polling_ms));
+ mutex_unlock(&devfreq->lock);
}
/**
struct devfreq *devfreq = container_of(nb, struct devfreq, nb);
int ret;
+ mutex_lock(&devfreq->lock);
ret = update_devfreq(devfreq);
+ mutex_unlock(&devfreq->lock);
return ret;
}
{
struct devfreq_cooling_device *devfreq_dev = cdev->devdata;
unsigned int limited_freq;
+ int ret;
/* Request state should be less than max_level */
if (WARN_ON(state > devfreq_dev->max_state))
/* Set the limited frequency to maximum frequency of devfreq */
devfreq_dev->devfreq->max_freq = limited_freq;
- update_devfreq(devfreq_dev->devfreq);
+ mutex_lock(&devfreq_dev->devfreq->lock);
+ ret = update_devfreq(devfreq_dev->devfreq);
+ mutex_unlock(&devfreq_dev->devfreq->lock);
- return 0;
+ return ret;
}
/* Bind devfreq callbacks to thermal cooling device ops */