void kgsl_g12_updatetimestamp(struct kgsl_device *device) { unsigned int count = 0; KGSL_DRV_DBG("kgsl_g12_updatetimestamp\n"); kgsl_g12_regread(device, ADDR_VGC_IRQ_ACTIVE_CNT >> 2, &count); count >>= 8; count &= 255; device->timestamp += count; KGSL_DRV_DBG("kgsl_g12_updatetimestamp : %i Current :%i\n", device->timestamp, device->current_timestamp); }
/* Caller must hold the device mutex. */ int kgsl_pwrctrl_sleep(struct kgsl_device *device) { KGSL_DRV_DBG("kgsl_pwrctrl_sleep device %d!!!\n", device->id); /* Work through the legal state transitions */ if (device->requested_state == KGSL_STATE_NAP) { if (device->ftbl.device_isidle(device)) goto nap; } else if (device->requested_state == KGSL_STATE_SLEEP) { if (device->state == KGSL_STATE_NAP || device->ftbl.device_isidle(device)) goto sleep; } device->requested_state = KGSL_STATE_NONE; return KGSL_FAILURE; sleep: kgsl_pwrctrl_irq(device, KGSL_PWRFLAGS_IRQ_OFF); kgsl_pwrctrl_axi(device, KGSL_PWRFLAGS_AXI_OFF); goto clk_off; nap: kgsl_pwrctrl_irq(device, KGSL_PWRFLAGS_IRQ_OFF); clk_off: kgsl_pwrctrl_clk(device, KGSL_PWRFLAGS_CLK_OFF); device->state = device->requested_state; device->requested_state = KGSL_STATE_NONE; wake_unlock(&device->idle_wakelock); return KGSL_SUCCESS; }
void kgsl_g12_idle_check(struct work_struct *work) { struct kgsl_device *device = &kgsl_driver.g12_device; KGSL_DRV_DBG("kgsl_g12_idle_check\n"); mutex_lock(&kgsl_driver.mutex); if (device->flags & KGSL_FLAGS_STARTED) { if (kgsl_g12_sleep(device, false) == KGSL_FAILURE) mod_timer(&idle_timer, jiffies + INTERVAL_TIMEOUT); } mutex_unlock(&kgsl_driver.mutex); }