Move the suspend semaphore inside the suspend/resume routines.
Signed-off-by: Nicușor Cîțu <nicusor.citu@nxp.com>
gcmkHEADER_ARG("Device=%p", Device);
+ /* Acquire the suspend semaphore. */
+ gcmkONERROR(gckOS_AcquireSemaphore(Device->os, Device->suspendSemaphore));
+ Device->suspendSemaphoreAcquired = gcvTRUE;
+
for (i = 0; i < gcdMAX_GPU_COUNT; i++)
{
if (Device->kernels[i] == gcvNULL)
Device->statesStored[i] = gcvPOWER_INVALID;
}
+ /* Release the suspend semaphore. */
+ if (Device->suspendSemaphoreAcquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(Device->os,
+ Device->suspendSemaphore));
+ Device->suspendSemaphoreAcquired = gcvFALSE;
+ }
+
gcmkFOOTER();
return status;
}
#if gcdENABLE_VG
if (i == gcvCORE_VG)
{
- gcmkERR_RETURN(gckVGHARDWARE_SetPowerState(hardware, gcvPOWER_ON));
+ gcmkONERROR(gckVGHARDWARE_SetPowerState(hardware, gcvPOWER_ON));
}
else
#endif
{
- gcmkERR_RETURN(gckHARDWARE_SetPowerState(hardware, gcvPOWER_ON));
+ gcmkONERROR(gckHARDWARE_SetPowerState(hardware, gcvPOWER_ON));
}
/* Convert global state to corresponding internal state. */
#if gcdENABLE_VG
if (i == gcvCORE_VG)
{
- gcmkERR_RETURN(gckVGHARDWARE_SetPowerState(hardware, state));
+ gcmkONERROR(gckVGHARDWARE_SetPowerState(hardware, state));
}
else
#endif
{
- gcmkERR_RETURN(gckHARDWARE_SetPowerState(hardware, state));
+ gcmkONERROR(gckHARDWARE_SetPowerState(hardware, state));
}
/* Reset stored state. */
Device->statesStored[i] = gcvPOWER_INVALID;
}
+OnError:
+ /* Release the suspend semaphore. */
+ if (Device->suspendSemaphoreAcquired)
+ {
+ gcmkVERIFY_OK(gckOS_ReleaseSemaphore(Device->os,
+ Device->suspendSemaphore));
+ Device->suspendSemaphoreAcquired = gcvFALSE;
+ }
+
gcmkFOOTER();
return status;
}
/* States before suspend. */
gceCHIPPOWERSTATE statesStored[gcdMAX_GPU_COUNT];
gctPOINTER suspendSemaphore;
+ gctBOOL suspendSemaphoreAcquired;
gcsDEBUGFS_DIR debugfsDir;
static int gpu_suspend(struct platform_device *dev, pm_message_t state)
{
gceSTATUS status;
- gctBOOL sem_acquired = gcvFALSE;
gckGALDEVICE device = platform_get_drvdata(dev);
if (!device)
return -1;
}
- /* Acquire the suspend management semaphore. */
- gcmkONERROR(gckOS_AcquireSemaphore(device->os,
- device->suspendSemaphore));
-
- sem_acquired = gcvTRUE;
-
/* Power off the GPU. */
- gcmkONERROR(gckGALDEVICE_Suspend(device, gcvPOWER_OFF));
-
- return 0;
+ status = gckGALDEVICE_Suspend(device, gcvPOWER_OFF);
-OnError:
- /* Release the suspend semaphore. */
- if (sem_acquired)
- {
- gcmkVERIFY_OK(gckOS_ReleaseSemaphore(device->os,
- device->suspendSemaphore));
- }
+ if (gcmIS_ERROR(status))
+ return -1;
- return -1;
+ return 0;
}
static int gpu_resume(struct platform_device *dev)
/* Resume GPU to previous state. */
status = gckGALDEVICE_Resume(device);
- /* Release the suspend semaphore. */
- gcmkVERIFY_OK(gckOS_ReleaseSemaphore(device->os, device->suspendSemaphore));
-
if (gcmIS_ERROR(status))
return -1;
int i;
gckGALDEVICE device = platform_get_drvdata(pdevice);
gctBOOL mutex_acquired = gcvFALSE;
- gctBOOL sem_acquired = gcvFALSE;
gceSTATUS status;
if (!device)
gcvINFINITE));
mutex_acquired = gcvTRUE;
- /* Acquire the suspend semaphore. */
- gcmkONERROR(gckOS_AcquireSemaphore(device->os, device->suspendSemaphore));
- sem_acquired = gcvTRUE;
-
/* Suspend the GPU. */
gcmkONERROR(gckGALDEVICE_Suspend(device, gcvPOWER_SUSPEND));
gcmVERIFY_OK(gckGALDEVICE_Resume(device));
OnError:
- /* Release the suspend semaphore. */
- if (sem_acquired)
- {
- gcmkVERIFY_OK(gckOS_ReleaseSemaphore(device->os,
- device->suspendSemaphore));
- }
-
/* Release the commit mutex. */
if (mutex_acquired)
{