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 |
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 --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; }
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(-)