OMAPDSS: manage output-dssdev connection in output drivers
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 7 Dec 2012 10:50:08 +0000 (12:50 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Fri, 7 Dec 2012 14:55:04 +0000 (16:55 +0200)
We currently attach an output to a dssdev in the initialization code for
dssdevices in display.c. This works, but doesn't quite make sense: an
output entity represents (surprisingly) an output of DSS, which is
managed by an output driver. The output driver also handles adding new
dssdev's for that particular output.

It makes more sense to make the output-dssdev connection in the output
driver. This is also in line with common display framework.

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

index 008e9eecaf72b81fbde927fed59831f47a9b86b6..05f21b6231b74ffa2286442f8bf1e6a817508e08 100644 (file)
@@ -79,17 +79,8 @@ EXPORT_SYMBOL(omapdss_default_get_timings);
 int dss_init_device(struct platform_device *pdev,
                struct omap_dss_device *dssdev)
 {
-       struct omap_dss_output *out;
        int r;
 
-       out = omapdss_get_output_from_dssdev(dssdev);
-
-       r = omapdss_output_set_device(out, dssdev);
-       if (r) {
-               DSSERR("failed to connect output to new device\n");
-               return r;
-       }
-
        r = display_init_sysfs(pdev, dssdev);
        if (r) {
                omapdss_output_unset_device(dssdev->output);
@@ -103,9 +94,6 @@ void dss_uninit_device(struct platform_device *pdev,
                struct omap_dss_device *dssdev)
 {
        display_uninit_sysfs(pdev, dssdev);
-
-       if (dssdev->output)
-               omapdss_output_unset_device(dssdev->output);
 }
 
 static int dss_suspend_device(struct device *dev, void *data)
index c109fa68c01d02c472a81b48a1c250cb69be9510..d5bc47a4f3eed712cb64aaa1bd58a2d0e5e3146c 100644 (file)
@@ -477,9 +477,18 @@ static void __init dpi_probe_pdata(struct platform_device *dpidev)
                return;
        }
 
+       r = omapdss_output_set_device(&dpi.output, dssdev);
+       if (r) {
+               DSSERR("failed to connect output to new device: %s\n",
+                               dssdev->name);
+               dss_put_device(dssdev);
+               return;
+       }
+
        r = dss_add_device(dssdev);
        if (r) {
                DSSERR("device %s register failed: %d\n", dssdev->name, r);
+               omapdss_output_unset_device(&dpi.output);
                dss_put_device(dssdev);
                return;
        }
index cf32dc7e70f211369b5e8967e91cc44a0e01b46e..db9663dcfbd076c5cba03419481048111e49bd7a 100644 (file)
@@ -5146,6 +5146,7 @@ static struct omap_dss_device * __init dsi_find_dssdev(struct platform_device *p
 
 static void __init dsi_probe_pdata(struct platform_device *dsidev)
 {
+       struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
        struct omap_dss_device *plat_dssdev;
        struct omap_dss_device *dssdev;
        int r;
@@ -5168,9 +5169,18 @@ static void __init dsi_probe_pdata(struct platform_device *dsidev)
                return;
        }
 
+       r = omapdss_output_set_device(&dsi->output, dssdev);
+       if (r) {
+               DSSERR("failed to connect output to new device: %s\n",
+                               dssdev->name);
+               dss_put_device(dssdev);
+               return;
+       }
+
        r = dss_add_device(dssdev);
        if (r) {
                DSSERR("device %s register failed: %d\n", dssdev->name, r);
+               omapdss_output_unset_device(&dsi->output);
                dss_put_device(dssdev);
                return;
        }
index 4d6f325cee840677f8b9e2a77807f04e9cdb15e2..bdf843135661dcd165fb970cdf6e13fe61547405 100644 (file)
@@ -212,7 +212,6 @@ int dss_ovl_unset_manager(struct omap_overlay *ovl);
 /* output */
 void dss_register_output(struct omap_dss_output *out);
 void dss_unregister_output(struct omap_dss_output *out);
-struct omap_dss_output *omapdss_get_output_from_dssdev(struct omap_dss_device *dssdev);
 
 /* display */
 int dss_suspend_all_devices(void);
index 24a2eefb7e8c327beb6e3f720469f0e28b12a0cc..769d0828581ccfec1f350b49b8d1d791732e9b04 100644 (file)
@@ -1026,9 +1026,18 @@ static void __init hdmi_probe_pdata(struct platform_device *pdev)
                return;
        }
 
+       r = omapdss_output_set_device(&hdmi.output, dssdev);
+       if (r) {
+               DSSERR("failed to connect output to new device: %s\n",
+                               dssdev->name);
+               dss_put_device(dssdev);
+               return;
+       }
+
        r = dss_add_device(dssdev);
        if (r) {
                DSSERR("device %s register failed: %d\n", dssdev->name, r);
+               omapdss_output_unset_device(&hdmi.output);
                hdmi_uninit_display(dssdev);
                dss_put_device(dssdev);
                return;
index 813f26682b7a836f127449517f9ed82dd2c33dac..1a84b79d5580c1d27e3aeebabf25b556fdbaa281 100644 (file)
@@ -113,36 +113,3 @@ struct omap_dss_output *omap_dss_get_output(enum omap_dss_output_id id)
 
        return NULL;
 }
-
-struct omap_dss_output *omapdss_get_output_from_dssdev(struct omap_dss_device *dssdev)
-{
-       struct omap_dss_output *out = NULL;
-       enum omap_dss_output_id id;
-
-       switch (dssdev->type) {
-       case OMAP_DISPLAY_TYPE_DPI:
-               out = omap_dss_get_output(OMAP_DSS_OUTPUT_DPI);
-               break;
-       case OMAP_DISPLAY_TYPE_DBI:
-               out = omap_dss_get_output(OMAP_DSS_OUTPUT_DBI);
-               break;
-       case OMAP_DISPLAY_TYPE_SDI:
-               out = omap_dss_get_output(OMAP_DSS_OUTPUT_SDI);
-               break;
-       case OMAP_DISPLAY_TYPE_VENC:
-               out = omap_dss_get_output(OMAP_DSS_OUTPUT_VENC);
-               break;
-       case OMAP_DISPLAY_TYPE_HDMI:
-               out = omap_dss_get_output(OMAP_DSS_OUTPUT_HDMI);
-               break;
-       case OMAP_DISPLAY_TYPE_DSI:
-               id = dssdev->phy.dsi.module == 0 ? OMAP_DSS_OUTPUT_DSI1 :
-                                       OMAP_DSS_OUTPUT_DSI2;
-               out = omap_dss_get_output(id);
-               break;
-       default:
-               break;
-       }
-
-       return out;
-}
index 7bfeb13cf3d05d1d81084b9e7ef7f69107cc3f24..ec9fde52716c5063cb0107981977e232c265bae9 100644 (file)
@@ -999,9 +999,18 @@ static void __init rfbi_probe_pdata(struct platform_device *rfbidev)
                return;
        }
 
+       r = omapdss_output_set_device(&rfbi.output, dssdev);
+       if (r) {
+               DSSERR("failed to connect output to new device: %s\n",
+                               dssdev->name);
+               dss_put_device(dssdev);
+               return;
+       }
+
        r = dss_add_device(dssdev);
        if (r) {
                DSSERR("device %s register failed: %d\n", dssdev->name, r);
+               omapdss_output_unset_device(&rfbi.output);
                dss_put_device(dssdev);
                return;
        }
index 882ce89765e7c12a251f3ea3fa99178a40e00ab5..62b5374ce438f3ff7e4db23d4ad5c6d5165456cd 100644 (file)
@@ -254,9 +254,18 @@ static void __init sdi_probe_pdata(struct platform_device *sdidev)
                return;
        }
 
+       r = omapdss_output_set_device(&sdi.output, dssdev);
+       if (r) {
+               DSSERR("failed to connect output to new device: %s\n",
+                               dssdev->name);
+               dss_put_device(dssdev);
+               return;
+       }
+
        r = dss_add_device(dssdev);
        if (r) {
                DSSERR("device %s register failed: %d\n", dssdev->name, r);
+               omapdss_output_unset_device(&sdi.output);
                dss_put_device(dssdev);
                return;
        }
index e8fddc9012cb496316fcf16509f1ff9c69d87179..006caf3cb509778d472d0a28d528cc3bde16748e 100644 (file)
@@ -795,9 +795,18 @@ static void __init venc_probe_pdata(struct platform_device *vencdev)
                return;
        }
 
+       r = omapdss_output_set_device(&venc.output, dssdev);
+       if (r) {
+               DSSERR("failed to connect output to new device: %s\n",
+                               dssdev->name);
+               dss_put_device(dssdev);
+               return;
+       }
+
        r = dss_add_device(dssdev);
        if (r) {
                DSSERR("device %s register failed: %d\n", dssdev->name, r);
+               omapdss_output_unset_device(&venc.output);
                dss_put_device(dssdev);
                return;
        }