[PATCH v10 09/12] drm: renesas: rz-du: Move the DRM device initialization to helpers

From: Tommaso Merciai

Date: Fri Nov 13 2026 - 08:36:39 EST


On RZ/G3E the DRM device can be created and destroyed by the component
master bind/unbind. In preparation for it, move its initialization and
teardown from rzg2l_du_probe()/rzg2l_du_remove() to
rzg2l_du_drm_init()/rzg2l_du_drm_fini() helpers.

No functional change intended.

Signed-off-by: Tommaso Merciai <tommaso.merciai.xr@xxxxxxxxxxxxxx>
---
v9->v10:
- New patch.

drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c | 120 +++++++++++--------
1 file changed, 69 insertions(+), 51 deletions(-)

diff --git a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
index d102876c07e1..93d59e2cf8a4 100644
--- a/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
+++ b/drivers/gpu/drm/renesas/rz-du/rzg2l_du_drv.c
@@ -184,24 +184,87 @@ static int rzg2l_du_instance_init(struct rzg2l_du_device *du,
}

/* -----------------------------------------------------------------------------
- * Platform driver
+ * DRM device
*/

struct rzg2l_du_drm {
struct drm_device ddev;
};

-static void rzg2l_du_remove(struct platform_device *pdev)
+static int rzg2l_du_drm_init(struct device *dev)
{
- struct rzg2l_du_device *rcdu = platform_get_drvdata(pdev);
- struct drm_device *ddev = rcdu->ddev;
+ struct rzg2l_du_device *du = dev_get_drvdata(dev);
+ struct rzg2l_du_drm *rzgdrm;
+ struct drm_device *ddev;
+ int ret;
+
+ rzgdrm = devm_drm_dev_alloc(dev, &rzg2l_du_driver,
+ struct rzg2l_du_drm, ddev);
+ if (IS_ERR(rzgdrm))
+ return PTR_ERR(rzgdrm);
+
+ ddev = &rzgdrm->ddev;
+
+ ret = rzg2l_du_modeset_init_drm(ddev);
+ if (ret < 0)
+ goto error;
+
+ ret = rzg2l_du_instance_init(du, ddev);
+ if (ret < 0)
+ goto error;
+
+ ret = rzg2l_du_modeset_init_finish(ddev);
+ if (ret < 0)
+ goto error_fini;
+
+ /*
+ * Register the DRM device with the core and the connectors with
+ * sysfs.
+ */
+ ret = drm_dev_register(ddev, 0);
+ if (ret)
+ goto error_fini;
+
+ du->ddev = ddev;
+
+ drm_info(ddev, "Device %s probed\n", dev_name(dev));
+
+ drm_client_setup(ddev, NULL);
+
+ return 0;
+
+error_fini:
+ drm_kms_helper_poll_fini(ddev);
+error:
+ /*
+ * Don't use dev_err_probe(), as it would overwrite the probe deferral
+ * reason recorded while initializing the DRM/KMS objects.
+ */
+ if (ret != -EPROBE_DEFER)
+ dev_err(dev, "failed to initialize DRM/KMS (%d)\n", ret);
+
+ return ret;
+}
+
+static void rzg2l_du_drm_fini(struct device *dev)
+{
+ struct rzg2l_du_device *du = dev_get_drvdata(dev);
+ struct drm_device *ddev = du->ddev;

drm_dev_unregister(ddev);
drm_atomic_helper_shutdown(ddev);
-
drm_kms_helper_poll_fini(ddev);
}

+/* -----------------------------------------------------------------------------
+ * Platform driver
+ */
+
+static void rzg2l_du_remove(struct platform_device *pdev)
+{
+ rzg2l_du_drm_fini(&pdev->dev);
+}
+
static void rzg2l_du_shutdown(struct platform_device *pdev)
{
struct rzg2l_du_device *rcdu = platform_get_drvdata(pdev);
@@ -213,7 +276,6 @@ static int rzg2l_du_probe(struct platform_device *pdev)
{
const struct rzg2l_du_device_info *info;
struct rzg2l_du_device *rcdu;
- struct rzg2l_du_drm *rzgdrm;
void __iomem *mmio;
int ret;

@@ -242,51 +304,7 @@ static int rzg2l_du_probe(struct platform_device *pdev)
rcdu->info = info;
rcdu->mmio = mmio;

- rzgdrm = devm_drm_dev_alloc(&pdev->dev, &rzg2l_du_driver,
- struct rzg2l_du_drm, ddev);
- if (IS_ERR(rzgdrm))
- return PTR_ERR(rzgdrm);
-
- /* DRM/KMS objects */
- ret = rzg2l_du_modeset_init_drm(&rzgdrm->ddev);
- if (ret < 0)
- goto error;
-
- ret = rzg2l_du_instance_init(rcdu, &rzgdrm->ddev);
- if (ret < 0)
- goto error;
-
- ret = rzg2l_du_modeset_init_finish(&rzgdrm->ddev);
- if (ret < 0)
- goto error_fini;
-
- /*
- * Register the DRM device with the core and the connectors with
- * sysfs.
- */
- ret = drm_dev_register(&rzgdrm->ddev, 0);
- if (ret)
- goto error_fini;
-
- rcdu->ddev = &rzgdrm->ddev;
-
- drm_info(&rzgdrm->ddev, "Device %s probed\n", dev_name(&pdev->dev));
-
- drm_client_setup(&rzgdrm->ddev, NULL);
-
- return 0;
-
-error_fini:
- drm_kms_helper_poll_fini(&rzgdrm->ddev);
-error:
- /*
- * Don't use dev_err_probe(), as it would overwrite the probe deferral
- * reason recorded while initializing the DRM/KMS objects.
- */
- if (ret != -EPROBE_DEFER)
- dev_err(&pdev->dev, "failed to initialize DRM/KMS (%d)\n", ret);
-
- return ret;
+ return rzg2l_du_drm_init(&pdev->dev);
}

static struct platform_driver rzg2l_du_platform_driver = {
--
2.54.0