diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2016-10-05 19:29:24 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-10-05 19:29:23 -0700 |
| commit | 52ae4541e46f44d0a3b2b27f2b01ff860e8b94de (patch) | |
| tree | be8b2fba3378fd80c3a0529cf430eb6a311ae810 | |
| parent | 165da9cba09128e72060291fef1d0241a5d82faa (diff) | |
| parent | 77f0fde9a36abaad114bdf5d9b79e4f9416f7896 (diff) | |
Merge "msm: kgsl: Reschedule idle work in case transition to idle state fails"
| -rw-r--r-- | drivers/gpu/msm/kgsl_pwrctrl.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c index 1f2178848664..0fcc0c3b0d49 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.c +++ b/drivers/gpu/msm/kgsl_pwrctrl.c @@ -1913,20 +1913,38 @@ void kgsl_idle_check(struct work_struct *work) { struct kgsl_device *device = container_of(work, struct kgsl_device, idle_check_ws); + int ret = 0; + unsigned int requested_state; + WARN_ON(device == NULL); if (device == NULL) return; mutex_lock(&device->mutex); + requested_state = device->requested_state; + if (device->state == KGSL_STATE_ACTIVE || device->state == KGSL_STATE_NAP) { - if (!atomic_read(&device->active_cnt)) - kgsl_pwrctrl_change_state(device, + if (!atomic_read(&device->active_cnt)) { + ret = kgsl_pwrctrl_change_state(device, device->requested_state); + if (ret == -EBUSY) { + /* + * If the GPU is currently busy, restore + * the requested state and reschedule + * idle work. + */ + kgsl_pwrctrl_request_state(device, + requested_state); + kgsl_schedule_work(&device->idle_check_ws); + } + } + + if (!ret) + kgsl_pwrctrl_request_state(device, KGSL_STATE_NONE); - kgsl_pwrctrl_request_state(device, KGSL_STATE_NONE); if (device->state == KGSL_STATE_ACTIVE) mod_timer(&device->idle_timer, jiffies + |
