OMAPDSS: add helpers to get mgr or output from display
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Tue, 23 Apr 2013 12:35:35 +0000 (15:35 +0300)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Mon, 17 Jun 2013 11:00:42 +0000 (14:00 +0300)
Add two helper functions that can be used to find either the DSS output
or the overlay manager that is connected to the given display.

This hides how the output and the manager are actually connected, making
it easier to change the connections in the future.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
drivers/gpu/drm/omapdrm/omap_drv.c
drivers/video/omap2/dss/manager-sysfs.c
drivers/video/omap2/dss/output.c
drivers/video/omap2/omapfb/omapfb-ioctl.c
drivers/video/omap2/omapfb/omapfb-main.c
include/video/omapdss.h

index 826586ffbe835d94983f779b372149d92143b863..b3577cb367af82eebe4d54bf191afaec7f015a41 100644 (file)
@@ -247,6 +247,9 @@ static int omap_modeset_init(struct drm_device *dev)
                struct drm_encoder *encoder = priv->encoders[i];
                struct omap_dss_device *dssdev =
                                        omap_encoder_get_dssdev(encoder);
+               struct omap_dss_output *output;
+
+               output = omapdss_find_output_from_display(dssdev);
 
                /* figure out which crtc's we can connect the encoder to: */
                encoder->possible_crtcs = 0;
@@ -259,7 +262,7 @@ static int omap_modeset_init(struct drm_device *dev)
                        supported_outputs =
                                dss_feat_get_supported_outputs(crtc_channel);
 
-                       if (supported_outputs & dssdev->output->id)
+                       if (supported_outputs & output->id)
                                encoder->possible_crtcs |= (1 << id);
                }
        }
index 9a2fb59b6f897695cf961cc73342c2da1b70f277..51046819f33b3ab949a197d2d027095cf43fd9e3 100644 (file)
@@ -78,7 +78,9 @@ static ssize_t manager_display_store(struct omap_overlay_manager *mgr,
        }
 
        if (dssdev) {
-               struct omap_dss_output *out = dssdev->output;
+               struct omap_dss_output *out;
+
+               out = omapdss_find_output_from_display(dssdev);
 
                /*
                 * a registered device should have an output connected to it
index 4d01001497f4112316eaf0b1254ad26ef75e47f7..ab2c0f0ab244388d2454d707f829a2f99a77f370 100644 (file)
@@ -141,6 +141,25 @@ struct omap_dss_output *omap_dss_find_output_by_node(struct device_node *node)
 }
 EXPORT_SYMBOL(omap_dss_find_output_by_node);
 
+struct omap_dss_output *omapdss_find_output_from_display(struct omap_dss_device *dssdev)
+{
+       return dssdev->output;
+}
+EXPORT_SYMBOL(omapdss_find_output_from_display);
+
+struct omap_overlay_manager *omapdss_find_mgr_from_display(struct omap_dss_device *dssdev)
+{
+       struct omap_dss_output *out;
+
+       out = omapdss_find_output_from_display(dssdev);
+
+       if (out == NULL)
+               return NULL;
+
+       return out->manager;
+}
+EXPORT_SYMBOL(omapdss_find_mgr_from_display);
+
 static const struct dss_mgr_ops *dss_mgr_ops;
 
 int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops)
index d30b45d7264972590a4cf39a9131cc619eb9fbb2..146b6f5428dbc97f5c981c07389be5dd575ad2b3 100644 (file)
@@ -770,12 +770,17 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
 
        case OMAPFB_WAITFORVSYNC:
                DBG("ioctl WAITFORVSYNC\n");
-               if (!display || !display->output || !display->output->manager) {
+
+               if (!display) {
                        r = -EINVAL;
                        break;
                }
 
-               mgr = display->output->manager;
+               mgr = omapdss_find_mgr_from_display(display);
+               if (!mgr) {
+                       r = -EINVAL;
+                       break;
+               }
 
                r = mgr->wait_for_vsync(mgr);
                break;
index 856917b3361665137d676fda89f1c0f426ae41c2..cc8953c4faa1405a88209bf4076ab762df51d804 100644 (file)
@@ -2363,18 +2363,16 @@ static int omapfb_init_connections(struct omapfb2_device *fbdev,
        int i, r;
        struct omap_overlay_manager *mgr;
 
-       if (!def_dssdev->output) {
-               dev_err(fbdev->dev, "no output for the default display\n");
-               return -EINVAL;
-       }
-
        for (i = 0; i < fbdev->num_displays; ++i) {
                struct omap_dss_device *dssdev = fbdev->displays[i].dssdev;
-               struct omap_dss_output *out = dssdev->output;
+               struct omap_dss_output *out;
 
-               mgr = omap_dss_get_overlay_manager(out->dispc_channel);
+               out = omapdss_find_output_from_display(dssdev);
+               if (!out)
+                       continue;
 
-               if (!mgr || !out)
+               mgr = omap_dss_get_overlay_manager(out->dispc_channel);
+               if (!mgr)
                        continue;
 
                if (mgr->output)
@@ -2383,7 +2381,7 @@ static int omapfb_init_connections(struct omapfb2_device *fbdev,
                mgr->set_output(mgr, out);
        }
 
-       mgr = def_dssdev->output->manager;
+       mgr = omapdss_find_mgr_from_display(def_dssdev);
 
        if (!mgr) {
                dev_err(fbdev->dev, "no ovl manager for the default display\n");
index 25a944e080b4107d41141a2040aaa5c007e36698..898f812478598b7efee8aef0fe94263370d678b0 100644 (file)
@@ -786,6 +786,9 @@ int omapdss_output_set_device(struct omap_dss_output *out,
                struct omap_dss_device *dssdev);
 int omapdss_output_unset_device(struct omap_dss_output *out);
 
+struct omap_dss_output *omapdss_find_output_from_display(struct omap_dss_device *dssdev);
+struct omap_overlay_manager *omapdss_find_mgr_from_display(struct omap_dss_device *dssdev);
+
 void omapdss_default_get_resolution(struct omap_dss_device *dssdev,
                u16 *xres, u16 *yres);
 int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev);
This page took 0.0365 seconds and 5 git commands to generate.