diff mbox series

[v2,1/8] drm/panfrost: Fix possible suspend in panfrost_remove

Message ID 20190823021216.5862-2-robh@kernel.org
State Accepted
Commit aebe8c22a9121e89cdd5c725f2ebed1ee237ff16
Headers show
Series [v2,1/8] drm/panfrost: Fix possible suspend in panfrost_remove | expand

Commit Message

Rob Herring Aug. 23, 2019, 2:12 a.m. UTC
Calls to panfrost_device_fini() access the h/w, but we already done a
pm_runtime_put_sync_autosuspend() beforehand. This only works if the
autosuspend delay is long enough. A 0ms delay will hang the system when
removing the device. Fix this by moving the pm_runtime_put_sync_suspend()
after the panfrost_device_fini() call.

Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
Cc: Steven Price <steven.price@arm.com>
Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Signed-off-by: Rob Herring <robh@kernel.org>
---
v2: new patch

 drivers/gpu/drm/panfrost/panfrost_drv.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Steven Price Aug. 23, 2019, 2:50 p.m. UTC | #1
On 23/08/2019 03:12, Rob Herring wrote:
> Calls to panfrost_device_fini() access the h/w, but we already done a
> pm_runtime_put_sync_autosuspend() beforehand. This only works if the
> autosuspend delay is long enough. A 0ms delay will hang the system when
> removing the device. Fix this by moving the pm_runtime_put_sync_suspend()
> after the panfrost_device_fini() call.
> 
> Cc: Tomeu Vizoso <tomeu.vizoso@collabora.com>
> Cc: Steven Price <steven.price@arm.com>
> Cc: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
> Cc: David Airlie <airlied@linux.ie>
> Cc: Daniel Vetter <daniel@ffwll.ch>
> Signed-off-by: Rob Herring <robh@kernel.org>

Reviewed-by: Steven Price <steven.price@arm.com>

> ---
> v2: new patch
> 
>   drivers/gpu/drm/panfrost/panfrost_drv.c | 6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
> index 44a558c6e17e..d74442d71048 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
> @@ -570,11 +570,13 @@ static int panfrost_remove(struct platform_device *pdev)
>   
>   	drm_dev_unregister(ddev);
>   	panfrost_gem_shrinker_cleanup(ddev);
> +
>   	pm_runtime_get_sync(pfdev->dev);
> -	pm_runtime_put_sync_autosuspend(pfdev->dev);
> -	pm_runtime_disable(pfdev->dev);
>   	panfrost_devfreq_fini(pfdev);
>   	panfrost_device_fini(pfdev);
> +	pm_runtime_put_sync_suspend(pfdev->dev);
> +	pm_runtime_disable(pfdev->dev);
> +
>   	drm_dev_put(ddev);
>   	return 0;
>   }
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
index 44a558c6e17e..d74442d71048 100644
--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
+++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
@@ -570,11 +570,13 @@  static int panfrost_remove(struct platform_device *pdev)
 
 	drm_dev_unregister(ddev);
 	panfrost_gem_shrinker_cleanup(ddev);
+
 	pm_runtime_get_sync(pfdev->dev);
-	pm_runtime_put_sync_autosuspend(pfdev->dev);
-	pm_runtime_disable(pfdev->dev);
 	panfrost_devfreq_fini(pfdev);
 	panfrost_device_fini(pfdev);
+	pm_runtime_put_sync_suspend(pfdev->dev);
+	pm_runtime_disable(pfdev->dev);
+
 	drm_dev_put(ddev);
 	return 0;
 }