Hi Geert and Doug, Thank you for the patch. On Tue, Dec 05, 2023 at 12:30:02PM +0100, Geert Uytterhoeven wrote: > From: Douglas Anderson <dianders@xxxxxxxxxxxx> > > Based on grepping through the source code, this driver appears to be > missing a call to drm_atomic_helper_shutdown() at system shutdown time. > This is important because drm_helper_force_disable_all() will cause > panels to get disabled cleanly which may be important for their power > sequencing. Future changes will remove any custom powering off in > individual panel drivers so the DRM drivers need to start getting this > right. > > The fact that we should call drm_atomic_helper_shutdown() in the case of > OS shutdown comes straight out of the kernel doc "driver instance > overview" in drm_drv.c. > > Suggested-by: Maxime Ripard <mripard@xxxxxxxxxx> > Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx> > Link: https://lore.kernel.org/r/20230901164111.RFT.15.Iaf638a1d4c8b3c307a6192efabb4cbb06b195f15@changeid > [geert: s/drm_helper_force_disable_all/drm_atomic_helper_shutdown/] > [geert: shmob_drm_remove() already calls drm_atomic_helper_shutdown] > Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> Reviewed-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > --- > Tested on Atmark Techno Armadillo-800-EVA, where the PWM instance > driving the backlight is now stopped on shutdown. > Panel-simple does print two new warnings: > > +panel-simple panel: Skipping disable of already disabled panel > +panel-simple panel: Skipping unprepare of already unprepared panel Have you investigated where this comes from ? > reboot: System halted > --- > drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c > index bd16d4780c6436c3..a15162be26f259a4 100644 > --- a/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c > +++ b/drivers/gpu/drm/renesas/shmobile/shmob_drm_drv.c > @@ -171,6 +171,13 @@ static void shmob_drm_remove(struct platform_device *pdev) > drm_kms_helper_poll_fini(ddev); > } > > +static void shmob_drm_shutdown(struct platform_device *pdev) > +{ > + struct shmob_drm_device *sdev = platform_get_drvdata(pdev); > + > + drm_atomic_helper_shutdown(&sdev->ddev); > +} > + > static int shmob_drm_probe(struct platform_device *pdev) > { > struct shmob_drm_platform_data *pdata = pdev->dev.platform_data; > @@ -274,6 +281,7 @@ static const struct of_device_id shmob_drm_of_table[] __maybe_unused = { > static struct platform_driver shmob_drm_platform_driver = { > .probe = shmob_drm_probe, > .remove_new = shmob_drm_remove, > + .shutdown = shmob_drm_shutdown, > .driver = { > .name = "shmob-drm", > .of_match_table = of_match_ptr(shmob_drm_of_table), -- Regards, Laurent Pinchart