Commit c478768c authored by Douglas Anderson's avatar Douglas Anderson

drm/armada: Call drm_atomic_helper_shutdown() at shutdown time

Based on grepping through the source code this driver appears to be
missing a call to drm_atomic_helper_shutdown() at system shutdown
time. Among other things, this means that if a panel is in use that it
won't be cleanly powered off at system shutdown time.

The fact that we should call drm_atomic_helper_shutdown() in the case
of OS shutdown/restart comes straight out of the kernel doc "driver
instance overview" in drm_drv.c.

This driver was fairly easy to update. The drm_device is stored in the
drvdata so we just have to make sure the drvdata is NULL whenever the
device is not bound. To make things simpler,
drm_atomic_helper_shutdown() has been modified to consider a NULL
drm_device as a noop in the patch ("drm/atomic-helper:
drm_atomic_helper_shutdown(NULL) should be a noop").
Suggested-by: default avatarMaxime Ripard <mripard@kernel.org>
Reviewed-by: default avatarMaxime Ripard <mripard@kernel.org>
Signed-off-by: default avatarDouglas Anderson <dianders@chromium.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20230901164111.RFT.1.I3d5598bd73a59b5ded71430736c93f67dc5dea61@changeid
parent cd273b7f
...@@ -148,6 +148,7 @@ static int armada_drm_bind(struct device *dev) ...@@ -148,6 +148,7 @@ static int armada_drm_bind(struct device *dev)
err_kms: err_kms:
drm_mode_config_cleanup(&priv->drm); drm_mode_config_cleanup(&priv->drm);
drm_mm_takedown(&priv->linear); drm_mm_takedown(&priv->linear);
dev_set_drvdata(dev, NULL);
return ret; return ret;
} }
...@@ -166,6 +167,7 @@ static void armada_drm_unbind(struct device *dev) ...@@ -166,6 +167,7 @@ static void armada_drm_unbind(struct device *dev)
drm_mode_config_cleanup(&priv->drm); drm_mode_config_cleanup(&priv->drm);
drm_mm_takedown(&priv->linear); drm_mm_takedown(&priv->linear);
dev_set_drvdata(dev, NULL);
} }
static void armada_add_endpoints(struct device *dev, static void armada_add_endpoints(struct device *dev,
...@@ -230,6 +232,11 @@ static int armada_drm_remove(struct platform_device *pdev) ...@@ -230,6 +232,11 @@ static int armada_drm_remove(struct platform_device *pdev)
return 0; return 0;
} }
static void armada_drm_shutdown(struct platform_device *pdev)
{
drm_atomic_helper_shutdown(platform_get_drvdata(pdev));
}
static const struct platform_device_id armada_drm_platform_ids[] = { static const struct platform_device_id armada_drm_platform_ids[] = {
{ {
.name = "armada-drm", .name = "armada-drm",
...@@ -243,6 +250,7 @@ MODULE_DEVICE_TABLE(platform, armada_drm_platform_ids); ...@@ -243,6 +250,7 @@ MODULE_DEVICE_TABLE(platform, armada_drm_platform_ids);
static struct platform_driver armada_drm_platform_driver = { static struct platform_driver armada_drm_platform_driver = {
.probe = armada_drm_probe, .probe = armada_drm_probe,
.remove = armada_drm_remove, .remove = armada_drm_remove,
.shutdown = armada_drm_shutdown,
.driver = { .driver = {
.name = "armada-drm", .name = "armada-drm",
}, },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment