OMAP: DSS2: check for manager when enabling display
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Thu, 23 Jun 2011 13:38:21 +0000 (16:38 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Wed, 14 Sep 2011 15:08:23 +0000 (18:08 +0300)
None of the DSS interface drivers check if an overlay manager is
connected to the display when the display is being enabled. This leads
to null pointer crash if the display has no manager.

This patch checks for the manager and returns an error if it is null.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/video/omap2/dss/dpi.c
drivers/video/omap2/dss/dsi.c
drivers/video/omap2/dss/hdmi.c
drivers/video/omap2/dss/rfbi.c
drivers/video/omap2/dss/sdi.c

index f053b180ecd7d14e00808c32afe4166e8e21d6d8..046ce0806e1439ca57c67d7e5c4c2860b97054d4 100644 (file)
@@ -176,6 +176,11 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
 {
        int r;
 
+       if (dssdev->manager == NULL) {
+               DSSERR("failed to enable display: no manager\n");
+               return -ENODEV;
+       }
+
        r = omap_dss_start_device(dssdev);
        if (r) {
                DSSERR("failed to start device\n");
index 7adbbeb84334f3a9ec857c8f7d00b394b2082f6c..12da2fbd79317e4b43104d64c0b27b017e740626 100644 (file)
@@ -4211,6 +4211,12 @@ int omapdss_dsi_display_enable(struct omap_dss_device *dssdev)
 
        mutex_lock(&dsi->lock);
 
+       if (dssdev->manager == NULL) {
+               DSSERR("failed to enable display: no manager\n");
+               r = -ENODEV;
+               goto err_start_dev;
+       }
+
        r = omap_dss_start_device(dssdev);
        if (r) {
                DSSERR("failed to start device\n");
index 256f27a9064ac75ee5c3397a21db07b5948d482c..376732339efe57bc2b87e21618bcfe6fa29ffa43 100644 (file)
@@ -1231,6 +1231,12 @@ int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev)
 
        mutex_lock(&hdmi.lock);
 
+       if (dssdev->manager == NULL) {
+               DSSERR("failed to enable display: no manager\n");
+               r = -ENODEV;
+               goto err0;
+       }
+
        r = omap_dss_start_device(dssdev);
        if (r) {
                DSSERR("failed to start device\n");
index 39f4c597026accec26621bfc5cdedd75ad1e9c4b..1bb8ce11f6bce229f3f82d46c14a714e7c8d6138 100644 (file)
@@ -860,6 +860,11 @@ int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev)
 {
        int r;
 
+       if (dssdev->manager == NULL) {
+               DSSERR("failed to enable display: no manager\n");
+               return -ENODEV;
+       }
+
        r = rfbi_runtime_get();
        if (r)
                return r;
index 3a688c871a45579d8a695af71e88f91160a5e67c..df2b3c3658a2661e1a1d995247c7be5d4cf00763 100644 (file)
@@ -55,6 +55,11 @@ int omapdss_sdi_display_enable(struct omap_dss_device *dssdev)
        unsigned long pck;
        int r;
 
+       if (dssdev->manager == NULL) {
+               DSSERR("failed to enable display: no manager\n");
+               return -ENODEV;
+       }
+
        r = omap_dss_start_device(dssdev);
        if (r) {
                DSSERR("failed to start device\n");