diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index fe43f4892f7..d8e5559dc47 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -1558,6 +1558,8 @@ static int __devexit adreno_remove(struct platform_device *pdev) adreno_ringbuffer_close(&adreno_dev->ringbuffer); kgsl_device_platform_remove(device); + clear_bit(ADRENO_DEVICE_INITIALIZED, &adreno_dev->priv); + return 0; } @@ -1568,6 +1570,12 @@ static int adreno_init(struct kgsl_device *device) int i; kgsl_pwrctrl_set_state(device, KGSL_STATE_INIT); + /* + * initialization only needs to be done once initially until + * device is shutdown + */ + if (test_bit(ADRENO_DEVICE_INITIALIZED, &adreno_dev->priv)) + return 0; /* Power up the device */ kgsl_pwrctrl_enable(device); @@ -1593,6 +1601,7 @@ static int adreno_init(struct kgsl_device *device) BUG_ON(1); } + kgsl_pwrctrl_set_state(device, KGSL_STATE_INIT); /* * Check if firmware supports the sync lock PM4 packets needed * for IOMMUv1 @@ -1631,6 +1640,8 @@ static int adreno_init(struct kgsl_device *device) if (adreno_is_a330v2(adreno_dev)) adreno_a3xx_pwron_fixup_init(adreno_dev); + set_bit(ADRENO_DEVICE_INITIALIZED, &adreno_dev->priv); + return 0; } diff --git a/drivers/gpu/msm/adreno.h b/drivers/gpu/msm/adreno.h index 076391d710a..bcd25a36a70 100644 --- a/drivers/gpu/msm/adreno.h +++ b/drivers/gpu/msm/adreno.h @@ -194,6 +194,7 @@ struct adreno_device { enum adreno_device_flags { ADRENO_DEVICE_PWRON = 0, ADRENO_DEVICE_PWRON_FIXUP = 1, + ADRENO_DEVICE_INITIALIZED = 2, }; #define PERFCOUNTER_FLAG_NONE 0x0