diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c
index a4c93e74e9c267ebdfe48247f2db0d2741bd97db..9d64defa00aa7ca32b77eec32a8f77b5df04c47a 100644
--- a/drivers/gpu/msm/adreno.c
+++ b/drivers/gpu/msm/adreno.c
@@ -2776,6 +2776,13 @@ static unsigned int adreno_gpuid(struct kgsl_device *device,
return (0x0003 << 16) | ((int) adreno_dev->gpurev);
}
+static void adreno_resume(struct kgsl_device *device)
+{
+ struct adreno_device *adreno_dev = ADRENO_DEVICE(device);
+
+ adreno_dispatcher_resume(adreno_dev);
+}
+
static const struct kgsl_functable adreno_functable = {
/* Mandatory functions */
.regread = adreno_regread,
@@ -2807,6 +2814,7 @@ static const struct kgsl_functable adreno_functable = {
.setproperty = adreno_setproperty,
.postmortem_dump = adreno_dump,
.drawctxt_sched = adreno_drawctxt_sched,
+ .resume = adreno_resume,
};
static struct platform_driver adreno_platform_driver = {
diff --git a/drivers/gpu/msm/adreno.h b/drivers/gpu/msm/adreno.h
index 06e93915b3d9ab3e5855a064cf4e6751c5dd7415..3429b5004bc153de9f977ab838498d46bf73331a 100644
--- a/drivers/gpu/msm/adreno.h
+++ b/drivers/gpu/msm/adreno.h
@@ -489,6 +489,7 @@ int adreno_dispatcher_queue_cmd(struct adreno_device *adreno_dev,
void adreno_dispatcher_schedule(struct kgsl_device *device);
void adreno_dispatcher_pause(struct adreno_device *adreno_dev);
+void adreno_dispatcher_resume(struct adreno_device *adreno_dev);
void adreno_dispatcher_queue_context(struct kgsl_device *device,
struct adreno_context *drawctxt);
int adreno_reset(struct kgsl_device *device);
diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c
index c0e91a7379448260abd75a3da06f890a2cb552f7..eaadcffb56e4b44e1a559db509b246a9ef8f8924 100644
--- a/drivers/gpu/msm/adreno_dispatch.c
+++ b/drivers/gpu/msm/adreno_dispatch.c
@@ -1495,6 +1495,19 @@ void adreno_dispatcher_pause(struct adreno_device *adreno_dev)
dispatcher->state = ADRENO_DISPATCHER_PAUSE;
}
+/**
+ * adreno_dispatcher_resume() - resume the dispatcher
+ * @adreno_dev: pointer to the adreno device structure
+ *
+ * Set the dispatcher active so it can start accepting commands again
+ */
+void adreno_dispatcher_resume(struct adreno_device *adreno_dev)
+{
+ struct adreno_dispatcher *dispatcher = &adreno_dev->dispatcher;
+
+ dispatcher->state = ADRENO_DISPATCHER_ACTIVE;
+}
+
/**
* adreno_dispatcher_start() - activate the dispatcher
* @adreno_dev: pointer to the adreno device structure
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index 95da9bfc2d6db74c04f675e3132d42824e3768ad..e08570564e49c88e231690fc7f63f03d451d545f 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -694,6 +694,10 @@ static int kgsl_resume_device(struct kgsl_device *device)
}
kgsl_pwrctrl_request_state(device, KGSL_STATE_NONE);
+ /* Call the GPU specific resume function */
+ if (device->ftbl->resume)
+ device->ftbl->resume(device);
+
mutex_unlock(&device->mutex);
KGSL_PWR_WARN(device, "resume end\n");
return 0;
diff --git a/drivers/gpu/msm/kgsl_device.h b/drivers/gpu/msm/kgsl_device.h
index 9f2d70f04f6b6428a37be55fc0532f3c7cb12c93..2201c0dd7036f2453eccdb960adbfcef307ba457 100644
--- a/drivers/gpu/msm/kgsl_device.h
+++ b/drivers/gpu/msm/kgsl_device.h
@@ -135,6 +135,7 @@ struct kgsl_functable {
struct kgsl_event *event);
void (*drawctxt_sched)(struct kgsl_device *device,
struct kgsl_context *context);
+ void (*resume)(struct kgsl_device *device);
};
/* MH register values */