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 <[email protected]>
---
 drivers/gpu/drm/exynos/exynos_dp.c       | 6 +++++-
 drivers/gpu/drm/exynos/exynos_drm_dpi.c  | 7 ++++++-
 drivers/gpu/drm/exynos/exynos_drm_dsi.c  | 4 +++-
 drivers/gpu/drm/exynos/exynos_drm_vidi.c | 7 ++++++-
 drivers/gpu/drm/exynos/exynos_hdmi.c     | 7 ++++++-
 5 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_dp.c 
b/drivers/gpu/drm/exynos/exynos_dp.c
index a2095fb43483..3311674aa32a 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,
+       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..495fcabca0a1 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,
+       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..73f7c9fe611a 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,
+       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 b0f3cfc2a283..a639f2ee4933 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,
+       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..17323c9233ad 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,
+       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

Reply via email to