{
return 0;
}
+
static inline void rk_pm_disable_regulator(struct kbase_device *kbdev)
{
}
platform->is_powered = false;
KBASE_TIMELINE_GPU_POWER(kbdev, 0);
+ wake_unlock(&platform->wake_lock);
}
static int kbase_platform_rk_init(struct kbase_device *kbdev)
platform->power_off_wq = create_freezable_workqueue("gpu_power_off_wq");
if (!platform->power_off_wq) {
E("couldn't create workqueue");
- return -ENOMEM;
+ ret = -ENOMEM;
+ goto err_wq;
}
INIT_DEFERRABLE_WORK(&platform->work, rk_pm_power_off_delay_work);
+
+ wake_lock_init(&platform->wake_lock, WAKE_LOCK_SUSPEND, "gpu");
+
platform->utilisation_period = DEFAULT_UTILISATION_PERIOD_IN_MS;
ret = kbase_platform_rk_create_sysfs_files(kbdev->dev);
if (ret) {
E("fail to create sysfs_files. ret = %d.", ret);
- goto EXIT;
+ goto err_sysfs_files;
}
kbdev->platform_context = (void *)platform;
pm_runtime_enable(kbdev->dev);
-EXIT:
+ return 0;
+
+err_sysfs_files:
+ wake_lock_destroy(&platform->wake_lock);
+ destroy_workqueue(platform->power_off_wq);
+err_wq:
return ret;
}
kbdev->platform_context = NULL;
if (platform) {
+ wake_lock_destroy(&platform->wake_lock);
destroy_workqueue(platform->power_off_wq);
platform->is_powered = false;
platform->kbdev = NULL;
platform->is_powered = true;
KBASE_TIMELINE_GPU_POWER(kbdev, 1);
+ wake_lock(&platform->wake_lock);
return ret;
}
#ifndef _MALI_KBASE_RK_H_
#define _MALI_KBASE_RK_H_
+#include <linux/wakelock.h>
+
/*---------------------------------------------------------------------------*/
#define DEFAULT_UTILISATION_PERIOD_IN_MS (100)
* and 'power_off_callback'.
*/
bool is_powered;
+
struct kbase_device *kbdev;
+
struct workqueue_struct *power_off_wq;
+ /* delayed_work_to_power_off_gpu. */
struct delayed_work work;
unsigned int delay_ms;
+
+ /*
+ * WAKE_LOCK_SUSPEND for ensuring to run
+ * delayed_work_to_power_off_gpu before suspend.
+ */
+ struct wake_lock wake_lock;
+
/* debug only, the period in ms to count gpu_utilisation. */
unsigned int utilisation_period;
};