Failed tilcdc_crtc_create() error handling was broken, this patch
should fix it.

Signed-off-by: Jyri Sarha <jsarha at ti.com>
---
 drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 12 +++++++-----
 drivers/gpu/drm/tilcdc/tilcdc_drv.c  | 11 ++++-------
 drivers/gpu/drm/tilcdc/tilcdc_drv.h  |  2 +-
 3 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c 
b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
index 7ea34c2..4605942 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
@@ -957,7 +957,7 @@ irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc)
        return IRQ_HANDLED;
 }

-struct drm_crtc *tilcdc_crtc_create(struct drm_device *dev)
+int tilcdc_crtc_create(struct drm_device *dev)
 {
        struct tilcdc_drm_private *priv = dev->dev_private;
        struct tilcdc_crtc *tilcdc_crtc;
@@ -967,7 +967,7 @@ struct drm_crtc *tilcdc_crtc_create(struct drm_device *dev)
        tilcdc_crtc = devm_kzalloc(dev->dev, sizeof(*tilcdc_crtc), GFP_KERNEL);
        if (!tilcdc_crtc) {
                dev_err(dev->dev, "allocation failed\n");
-               return NULL;
+               return -ENOMEM;
        }

        if (priv->rev == 1) {
@@ -977,7 +977,7 @@ struct drm_crtc *tilcdc_crtc_create(struct drm_device *dev)
                                        &tilcdc_crtc->palette_dma_handle,
                                        GFP_KERNEL | __GFP_ZERO);
                if (!tilcdc_crtc->palette_base)
-                       return ERR_PTR(-ENOMEM);
+                       return -ENOMEM;
        }

        crtc = &tilcdc_crtc->base;
@@ -1020,13 +1020,15 @@ struct drm_crtc *tilcdc_crtc_create(struct drm_device 
*dev)
                if (!crtc->port) { /* This should never happen */
                        dev_err(dev->dev, "Port node not found in %s\n",
                                dev->dev->of_node->full_name);
+                       ret = -EINVAL;
                        goto fail;
                }
        }

-       return crtc;
+       priv->crtc = crtc;
+       return 0;

 fail:
        tilcdc_crtc_destroy(crtc);
-       return NULL;
+       return -ENOMEM;
 }
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c 
b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 7f4d3bc..b1bbbfe 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -153,13 +153,11 @@ static int tilcdc_commit(struct drm_device *dev,
        .atomic_commit = tilcdc_commit,
 };

-static int modeset_init(struct drm_device *dev)
+static void modeset_init(struct drm_device *dev)
 {
        struct tilcdc_drm_private *priv = dev->dev_private;
        struct tilcdc_module *mod;

-       priv->crtc = tilcdc_crtc_create(dev);
-
        list_for_each_entry(mod, &module_list, list) {
                DBG("loading module: %s", mod->name);
                mod->funcs->modeset_init(mod, dev);
@@ -170,8 +168,6 @@ static int modeset_init(struct drm_device *dev)
        dev->mode_config.max_width = tilcdc_crtc_max_width(priv->crtc);
        dev->mode_config.max_height = 2048;
        dev->mode_config.funcs = &mode_config_funcs;
-
-       return 0;
 }

 #ifdef CONFIG_CPU_FREQ
@@ -370,11 +366,12 @@ static int tilcdc_init(struct drm_driver *ddrv, struct 
device *dev)
                }
        }

-       ret = modeset_init(ddev);
+       ret = tilcdc_crtc_create(ddev);
        if (ret < 0) {
-               dev_err(dev, "failed to initialize mode setting\n");
+               dev_err(dev, "failed to create crtc\n");
                goto init_failed;
        }
+       modeset_init(ddev);

        if (priv->is_componentized) {
                ret = component_bind_all(dev, ddev);
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.h 
b/drivers/gpu/drm/tilcdc/tilcdc_drv.h
index 411f8a8..0e71daf 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.h
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.h
@@ -168,7 +168,7 @@ struct tilcdc_panel_info {

 #define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)

-struct drm_crtc *tilcdc_crtc_create(struct drm_device *dev);
+int tilcdc_crtc_create(struct drm_device *dev);
 irqreturn_t tilcdc_crtc_irq(struct drm_crtc *crtc);
 void tilcdc_crtc_update_clk(struct drm_crtc *crtc);
 void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc,
-- 
1.9.1

Reply via email to