void kgsl_idle_check(struct work_struct *work) { struct kgsl_device *device = container_of(work, struct kgsl_device, idle_check_ws); WARN_ON(device == NULL); if (device == NULL) return; mutex_lock(&device->mutex); if (device->state & (KGSL_STATE_ACTIVE | KGSL_STATE_NAP)) { if ((device->requested_state != KGSL_STATE_SLEEP) && (device->requested_state != KGSL_STATE_SLUMBER)) kgsl_pwrscale_idle(device); if (kgsl_pwrctrl_sleep(device) != 0) { mod_timer(&device->idle_timer, jiffies + device->pwrctrl.interval_timeout); /* If the GPU has been too busy to sleep, make sure * * that is acurately reflected in the % busy numbers. */ device->pwrctrl.busy.no_nap_cnt++; if (device->pwrctrl.busy.no_nap_cnt > UPDATE_BUSY) { kgsl_pwrctrl_busy_time(device, true); device->pwrctrl.busy.no_nap_cnt = 0; } } } else if (device->state & (KGSL_STATE_HUNG | KGSL_STATE_DUMP_AND_RECOVER)) { kgsl_pwrctrl_request_state(device, KGSL_STATE_NONE); } mutex_unlock(&device->mutex); }
void kgsl_idle_check(struct work_struct *work) { struct kgsl_device *device = container_of(work, struct kgsl_device, idle_check_ws); mutex_lock(&device->mutex); if (device->requested_state != KGSL_STATE_SLEEP) kgsl_pwrscale_idle(device); if (device->state & (KGSL_STATE_ACTIVE | KGSL_STATE_NAP)) { if (kgsl_pwrctrl_sleep(device) != 0) mod_timer(&device->idle_timer, jiffies + device->pwrctrl.interval_timeout); } else if (device->state & (KGSL_STATE_HUNG | KGSL_STATE_DUMP_AND_RECOVER)) { device->requested_state = KGSL_STATE_NONE; } mutex_unlock(&device->mutex); }