* [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices
@ 2026-06-23 13:19 Diogo Silva
2026-06-23 13:19 ` [PATCH v2 1/2] drm/exynos: Remove dependency on DRM simple helpers Diogo Silva
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Diogo Silva @ 2026-06-23 13:19 UTC (permalink / raw)
To: Jingoo Han, Inki Dae, Seung-Woo Kim, Kyungmin Park, David Airlie,
Simona Vetter, Krzysztof Kozlowski, Alim Akhtar
Cc: dri-devel, linux-arm-kernel, linux-samsung-soc, linux-kernel,
Diogo Silva
This series does two things:
- Open-code drm_simple_encoder_init() since it is deprecated
- Handle the error code from drm_encoder_init (previously
drm_simple_encoder_init) to prevent silent failures and
cleanup of uninitialized encoders
Signed-off-by: Diogo Silva <diogompaissilva@gmail.com>
---
Changes in v2:
- Fix mistake in exynos_drm_vidi
- Fix indentation
- Link to v1: https://lore.kernel.org/r/20260623-exynos-drm-simple-v1-0-bb52f098b1ee@gmail.com
---
Diogo Silva (2):
drm/exynos: Remove dependency on DRM simple helpers
drm/exynos: Add error handling to drm_encoder_init()
drivers/gpu/drm/exynos/exynos_dp.c | 13 +++++++++++--
drivers/gpu/drm/exynos/exynos_drm_dpi.c | 14 ++++++++++++--
drivers/gpu/drm/exynos/exynos_drm_dsi.c | 11 +++++++++--
drivers/gpu/drm/exynos/exynos_drm_vidi.c | 14 ++++++++++++--
drivers/gpu/drm/exynos/exynos_hdmi.c | 15 +++++++++++++--
5 files changed, 57 insertions(+), 10 deletions(-)
---
base-commit: 60326b17f877e12846167bf8ef83680b9875218a
change-id: 20260623-exynos-drm-simple-bb5386d64597
Best regards,
--
Diogo Silva <diogompaissilva@gmail.com>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] drm/exynos: Remove dependency on DRM simple helpers
2026-06-23 13:19 [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices Diogo Silva
@ 2026-06-23 13:19 ` Diogo Silva
2026-06-23 13:19 ` [PATCH v2 2/2] drm/exynos: Add error handling to drm_encoder_init() Diogo Silva
2026-07-05 6:23 ` [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices Inki Dae
2 siblings, 0 replies; 5+ messages in thread
From: Diogo Silva @ 2026-06-23 13:19 UTC (permalink / raw)
To: Jingoo Han, Inki Dae, Seung-Woo Kim, Kyungmin Park, David Airlie,
Simona Vetter, Krzysztof Kozlowski, Alim Akhtar
Cc: dri-devel, linux-arm-kernel, linux-samsung-soc, linux-kernel,
Diogo Silva
Simple KMS helper are deprecated since they only add an intermediate
layer between drivers and the atomic modesetting.
This patch removes the dependency on drm simple helpers from exynos
DRM drivers.
Signed-off-by: Diogo Silva <diogompaissilva@gmail.com>
---
drivers/gpu/drm/exynos/exynos_dp.c | 9 +++++++--
drivers/gpu/drm/exynos/exynos_drm_dpi.c | 9 +++++++--
drivers/gpu/drm/exynos/exynos_drm_dsi.c | 9 +++++++--
drivers/gpu/drm/exynos/exynos_drm_vidi.c | 9 +++++++--
drivers/gpu/drm/exynos/exynos_hdmi.c | 10 ++++++++--
5 files changed, 36 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index b80540328150..a2095fb43483 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -24,11 +24,11 @@
#include <drm/drm_bridge.h>
#include <drm/drm_bridge_connector.h>
#include <drm/drm_crtc.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_of.h>
#include <drm/drm_panel.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
-#include <drm/drm_simple_kms_helper.h>
#include <drm/exynos_drm.h>
#include "exynos_drm_crtc.h"
@@ -79,6 +79,10 @@ static void exynos_dp_nop(struct drm_encoder *encoder)
/* do nothing */
}
+static const struct drm_encoder_funcs exynos_dp_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static const struct drm_encoder_helper_funcs exynos_dp_encoder_helper_funcs = {
.mode_set = exynos_dp_mode_set,
.enable = exynos_dp_nop,
@@ -95,7 +99,8 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
dp->drm_dev = drm_dev;
- drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
+ drm_encoder_init(drm_dev, encoder, &exynos_dp_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
drm_encoder_helper_add(encoder, &exynos_dp_encoder_helper_funcs);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
index 0dc36df6ada3..4a3d443a15e6 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
@@ -12,10 +12,10 @@
#include <linux/regulator/consumer.h>
#include <drm/drm_atomic_helper.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_panel.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
-#include <drm/drm_simple_kms_helper.h>
#include <video/of_videomode.h>
#include <video/videomode.h>
@@ -140,6 +140,10 @@ static void exynos_dpi_disable(struct drm_encoder *encoder)
}
}
+static const struct drm_encoder_funcs exynos_dpi_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static const struct drm_encoder_helper_funcs exynos_dpi_encoder_helper_funcs = {
.mode_set = exynos_dpi_mode_set,
.enable = exynos_dpi_enable,
@@ -194,7 +198,8 @@ int exynos_dpi_bind(struct drm_device *dev, struct drm_encoder *encoder)
{
int ret;
- drm_simple_encoder_init(dev, encoder, DRM_MODE_ENCODER_TMDS);
+ drm_encoder_init(dev, encoder, &exynos_dpi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
drm_encoder_helper_add(encoder, &exynos_dpi_encoder_helper_funcs);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index c4d098ab7863..25c438cdc744 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -13,7 +13,7 @@
#include <drm/bridge/samsung-dsim.h>
#include <drm/drm_probe_helper.h>
-#include <drm/drm_simple_kms_helper.h>
+#include <drm/drm_encoder.h>
#include "exynos_drm_crtc.h"
#include "exynos_drm_drv.h"
@@ -22,6 +22,10 @@ struct exynos_dsi {
struct drm_encoder encoder;
};
+static const struct drm_encoder_funcs exynos_drm_dsi_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static irqreturn_t exynos_dsi_te_irq_handler(struct samsung_dsim *dsim)
{
struct exynos_dsi *dsi = dsim->priv;
@@ -79,7 +83,8 @@ static int exynos_dsi_bind(struct device *dev, struct device *master, void *data
struct drm_device *drm_dev = data;
int ret;
- drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
+ drm_encoder_init(drm_dev, encoder, &exynos_drm_dsi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_LCD);
if (ret < 0)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index 67bbf9b8bc0e..d905dc703c06 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -13,10 +13,10 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
-#include <drm/drm_simple_kms_helper.h>
#include <drm/drm_vblank.h>
#include <drm/exynos_drm.h>
@@ -403,6 +403,10 @@ static void exynos_vidi_disable(struct drm_encoder *encoder)
{
}
+static const struct drm_encoder_funcs exynos_vidi_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
static const struct drm_encoder_helper_funcs exynos_vidi_encoder_helper_funcs = {
.mode_set = exynos_vidi_mode_set,
.enable = exynos_vidi_enable,
@@ -445,7 +449,8 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
return PTR_ERR(ctx->crtc);
}
- drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
+ drm_encoder_init(drm_dev, encoder, &exynos_vidi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
drm_encoder_helper_add(encoder, &exynos_vidi_encoder_helper_funcs);
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 09b2cabb236f..26baf5357997 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -36,9 +36,9 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_bridge.h>
#include <drm/drm_edid.h>
+#include <drm/drm_encoder.h>
#include <drm/drm_print.h>
#include <drm/drm_probe_helper.h>
-#include <drm/drm_simple_kms_helper.h>
#include "exynos_drm_crtc.h"
#include "regs-hdmi.h"
@@ -1575,6 +1575,11 @@ static void hdmi_disable(struct drm_encoder *encoder)
mutex_unlock(&hdata->mutex);
}
+static const struct drm_encoder_funcs exynos_hdmi_encoder_funcs = {
+ .destroy = drm_encoder_cleanup,
+};
+
+
static const struct drm_encoder_helper_funcs exynos_hdmi_encoder_helper_funcs = {
.mode_fixup = hdmi_mode_fixup,
.enable = hdmi_enable,
@@ -1862,7 +1867,8 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data)
hdata->phy_clk.enable = hdmiphy_clk_enable;
- drm_simple_encoder_init(drm_dev, encoder, DRM_MODE_ENCODER_TMDS);
+ drm_encoder_init(drm_dev, encoder, &exynos_hdmi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
drm_encoder_helper_add(encoder, &exynos_hdmi_encoder_helper_funcs);
--
2.51.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] drm/exynos: Add error handling to drm_encoder_init()
2026-06-23 13:19 [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices Diogo Silva
2026-06-23 13:19 ` [PATCH v2 1/2] drm/exynos: Remove dependency on DRM simple helpers Diogo Silva
@ 2026-06-23 13:19 ` Diogo Silva
2026-07-05 6:23 ` [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices Inki Dae
2 siblings, 0 replies; 5+ messages in thread
From: Diogo Silva @ 2026-06-23 13:19 UTC (permalink / raw)
To: Jingoo Han, Inki Dae, Seung-Woo Kim, Kyungmin Park, David Airlie,
Simona Vetter, Krzysztof Kozlowski, Alim Akhtar
Cc: dri-devel, linux-arm-kernel, linux-samsung-soc, linux-kernel,
Diogo Silva
Not handling the return code on drm_encoder_init can lead to silent
failure and/or a drm_encoder_cleanup on a non-initialized encoder.
This patch adds error handling to the drm_encoder_init calls to prevent
that from happening.
Signed-off-by: Diogo Silva <diogompaissilva@gmail.com>
---
drivers/gpu/drm/exynos/exynos_dp.c | 8 ++++++--
drivers/gpu/drm/exynos/exynos_drm_dpi.c | 9 +++++++--
drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 ++++--
drivers/gpu/drm/exynos/exynos_drm_vidi.c | 9 +++++++--
drivers/gpu/drm/exynos/exynos_hdmi.c | 9 +++++++--
5 files changed, 31 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/drm/exynos/exynos_dp.c b/drivers/gpu/drm/exynos/exynos_dp.c
index a2095fb43483..1598892c602b 100644
--- a/drivers/gpu/drm/exynos/exynos_dp.c
+++ b/drivers/gpu/drm/exynos/exynos_dp.c
@@ -99,8 +99,12 @@ static int exynos_dp_bind(struct device *dev, struct device *master, void *data)
dp->drm_dev = drm_dev;
- drm_encoder_init(drm_dev, encoder, &exynos_dp_encoder_funcs,
- DRM_MODE_ENCODER_TMDS, NULL);
+ ret = drm_encoder_init(drm_dev, encoder, &exynos_dp_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
+ if (ret) {
+ dev_err(dp->dev, "Failed to initialize encoder\n");
+ return ret;
+ }
drm_encoder_helper_add(encoder, &exynos_dp_encoder_helper_funcs);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dpi.c b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
index 4a3d443a15e6..4e42a1da81d1 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dpi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dpi.c
@@ -198,8 +198,13 @@ int exynos_dpi_bind(struct drm_device *dev, struct drm_encoder *encoder)
{
int ret;
- drm_encoder_init(dev, encoder, &exynos_dpi_encoder_funcs,
- DRM_MODE_ENCODER_TMDS, NULL);
+ ret = drm_encoder_init(dev, encoder, &exynos_dpi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
+ if (ret) {
+ DRM_DEV_ERROR(encoder_to_dpi(encoder)->dev,
+ "failed to create encoder ret = %d\n", ret);
+ return ret;
+ }
drm_encoder_helper_add(encoder, &exynos_dpi_encoder_helper_funcs);
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
index 25c438cdc744..6b7561ac9bb0 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c
@@ -83,8 +83,10 @@ static int exynos_dsi_bind(struct device *dev, struct device *master, void *data
struct drm_device *drm_dev = data;
int ret;
- drm_encoder_init(drm_dev, encoder, &exynos_drm_dsi_encoder_funcs,
- DRM_MODE_ENCODER_TMDS, NULL);
+ ret = drm_encoder_init(drm_dev, encoder, &exynos_drm_dsi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
+ if (ret)
+ return ret;
ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_LCD);
if (ret < 0)
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
index d905dc703c06..59dea853d364 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c
@@ -449,8 +449,13 @@ static int vidi_bind(struct device *dev, struct device *master, void *data)
return PTR_ERR(ctx->crtc);
}
- drm_encoder_init(drm_dev, encoder, &exynos_vidi_encoder_funcs,
- DRM_MODE_ENCODER_TMDS, NULL);
+ ret = drm_encoder_init(drm_dev, encoder, &exynos_vidi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
+ if (ret) {
+ DRM_DEV_ERROR(dev, "failed to initialize encoder ret = %d\n",
+ ret);
+ return ret;
+ }
drm_encoder_helper_add(encoder, &exynos_vidi_encoder_helper_funcs);
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 26baf5357997..f44586ce0fdf 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -1867,8 +1867,13 @@ static int hdmi_bind(struct device *dev, struct device *master, void *data)
hdata->phy_clk.enable = hdmiphy_clk_enable;
- drm_encoder_init(drm_dev, encoder, &exynos_hdmi_encoder_funcs,
- DRM_MODE_ENCODER_TMDS, NULL);
+ ret = drm_encoder_init(drm_dev, encoder, &exynos_hdmi_encoder_funcs,
+ DRM_MODE_ENCODER_TMDS, NULL);
+ if (ret) {
+ DRM_DEV_ERROR(dev, "failed to initialize encoder ret = %d\n",
+ ret);
+ return ret;
+ }
drm_encoder_helper_add(encoder, &exynos_hdmi_encoder_helper_funcs);
--
2.51.2
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices
2026-06-23 13:19 [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices Diogo Silva
2026-06-23 13:19 ` [PATCH v2 1/2] drm/exynos: Remove dependency on DRM simple helpers Diogo Silva
2026-06-23 13:19 ` [PATCH v2 2/2] drm/exynos: Add error handling to drm_encoder_init() Diogo Silva
@ 2026-07-05 6:23 ` Inki Dae
2026-07-05 7:53 ` Diogo Silva
2 siblings, 1 reply; 5+ messages in thread
From: Inki Dae @ 2026-07-05 6:23 UTC (permalink / raw)
To: Diogo Silva
Cc: Jingoo Han, Seung-Woo Kim, Kyungmin Park, David Airlie,
Simona Vetter, Krzysztof Kozlowski, Alim Akhtar, dri-devel,
linux-arm-kernel, linux-samsung-soc, linux-kernel
Hi,
It looks like you may have forgotten to post the v2 patch. Could you
please check?
Thanks,
Inki Dae
2026년 6월 23일 (화) 오후 10:19, Diogo Silva <diogompaissilva@gmail.com>님이 작성:
>
> This series does two things:
> - Open-code drm_simple_encoder_init() since it is deprecated
> - Handle the error code from drm_encoder_init (previously
> drm_simple_encoder_init) to prevent silent failures and
> cleanup of uninitialized encoders
>
> Signed-off-by: Diogo Silva <diogompaissilva@gmail.com>
> ---
> Changes in v2:
> - Fix mistake in exynos_drm_vidi
> - Fix indentation
> - Link to v1: https://lore.kernel.org/r/20260623-exynos-drm-simple-v1-0-bb52f098b1ee@gmail.com
>
> ---
> Diogo Silva (2):
> drm/exynos: Remove dependency on DRM simple helpers
> drm/exynos: Add error handling to drm_encoder_init()
>
> drivers/gpu/drm/exynos/exynos_dp.c | 13 +++++++++++--
> drivers/gpu/drm/exynos/exynos_drm_dpi.c | 14 ++++++++++++--
> drivers/gpu/drm/exynos/exynos_drm_dsi.c | 11 +++++++++--
> drivers/gpu/drm/exynos/exynos_drm_vidi.c | 14 ++++++++++++--
> drivers/gpu/drm/exynos/exynos_hdmi.c | 15 +++++++++++++--
> 5 files changed, 57 insertions(+), 10 deletions(-)
> ---
> base-commit: 60326b17f877e12846167bf8ef83680b9875218a
> change-id: 20260623-exynos-drm-simple-bb5386d64597
>
> Best regards,
> --
> Diogo Silva <diogompaissilva@gmail.com>
>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices
2026-07-05 6:23 ` [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices Inki Dae
@ 2026-07-05 7:53 ` Diogo Silva
0 siblings, 0 replies; 5+ messages in thread
From: Diogo Silva @ 2026-07-05 7:53 UTC (permalink / raw)
To: Inki Dae
Cc: Jingoo Han, Seung-Woo Kim, Kyungmin Park, David Airlie,
Simona Vetter, Krzysztof Kozlowski, Alim Akhtar, dri-devel,
linux-arm-kernel, linux-samsung-soc, linux-kernel
Hi Inki,
> It looks like you may have forgotten to post the v2 patch. Could you
> please check?
I think they are here:
https://lore.kernel.org/all/20260623-exynos-drm-simple-v2-1-a8d59678b7d2@gmail.com/
https://lore.kernel.org/all/20260623-exynos-drm-simple-v2-2-a8d59678b7d2@gmail.com/
If I did something wrong tell me and I will re-send them.
Thanks,
Diogo
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-07-05 7:54 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-23 13:19 [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices Diogo Silva
2026-06-23 13:19 ` [PATCH v2 1/2] drm/exynos: Remove dependency on DRM simple helpers Diogo Silva
2026-06-23 13:19 ` [PATCH v2 2/2] drm/exynos: Add error handling to drm_encoder_init() Diogo Silva
2026-07-05 6:23 ` [PATCH v2 0/2] drm/exynos: DRM encoder improvements for Exynos devices Inki Dae
2026-07-05 7:53 ` Diogo Silva
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox