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 */