diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_gpu_devfreq.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gpu_devfreq.c | 13 | 
1 files changed, 9 insertions, 4 deletions
| diff --git a/drivers/gpu/drm/msm/msm_gpu_devfreq.c b/drivers/gpu/drm/msm/msm_gpu_devfreq.c index 8b7473f69cb8..384e90c4b2a7 100644 --- a/drivers/gpu/drm/msm/msm_gpu_devfreq.c +++ b/drivers/gpu/drm/msm/msm_gpu_devfreq.c @@ -20,6 +20,10 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq,  	struct msm_gpu *gpu = dev_to_gpu(dev);  	struct dev_pm_opp *opp; +	/* +	 * Note that devfreq_recommended_opp() can modify the freq +	 * to something that actually is in the opp table: +	 */  	opp = devfreq_recommended_opp(dev, freq, flags);  	/* @@ -28,6 +32,7 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq,  	 */  	if (gpu->devfreq.idle_freq) {  		gpu->devfreq.idle_freq = *freq; +		dev_pm_opp_put(opp);  		return 0;  	} @@ -203,9 +208,6 @@ static void msm_devfreq_idle_work(struct kthread_work *work)  	struct msm_gpu *gpu = container_of(df, struct msm_gpu, devfreq);  	unsigned long idle_freq, target_freq = 0; -	if (!df->devfreq) -		return; -  	/*  	 * Hold devfreq lock to synchronize with get_dev_status()/  	 * target() callbacks @@ -227,6 +229,9 @@ void msm_devfreq_idle(struct msm_gpu *gpu)  {  	struct msm_gpu_devfreq *df = &gpu->devfreq; +	if (!df->devfreq) +		return; +  	msm_hrtimer_queue_work(&df->idle_work, ms_to_ktime(1), -			       HRTIMER_MODE_ABS); +			       HRTIMER_MODE_REL);  } |