aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2013-04-23 08:35:35 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2013-06-17 07:00:42 -0400
commitbe8e8e1c62678765868c0bc7b8b5209c38af105c (patch)
tree405e8641bb55bbd9ab0b82f304961bb1a19474d7
parente724366498ead17579686f7ad83235f911a9c4f7 (diff)
OMAPDSS: add helpers to get mgr or output from display
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>
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.c5
-rw-r--r--drivers/video/omap2/dss/manager-sysfs.c4
-rw-r--r--drivers/video/omap2/dss/output.c19
-rw-r--r--drivers/video/omap2/omapfb/omapfb-ioctl.c9
-rw-r--r--drivers/video/omap2/omapfb/omapfb-main.c16
-rw-r--r--include/video/omapdss.h3
6 files changed, 43 insertions, 13 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c
index 826586ffbe83..b3577cb367af 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.c
+++ b/drivers/gpu/drm/omapdrm/omap_drv.c
@@ -247,6 +247,9 @@ static int omap_modeset_init(struct drm_device *dev)
247 struct drm_encoder *encoder = priv->encoders[i]; 247 struct drm_encoder *encoder = priv->encoders[i];
248 struct omap_dss_device *dssdev = 248 struct omap_dss_device *dssdev =
249 omap_encoder_get_dssdev(encoder); 249 omap_encoder_get_dssdev(encoder);
250 struct omap_dss_output *output;
251
252 output = omapdss_find_output_from_display(dssdev);
250 253
251 /* figure out which crtc's we can connect the encoder to: */ 254 /* figure out which crtc's we can connect the encoder to: */
252 encoder->possible_crtcs = 0; 255 encoder->possible_crtcs = 0;
@@ -259,7 +262,7 @@ static int omap_modeset_init(struct drm_device *dev)
259 supported_outputs = 262 supported_outputs =
260 dss_feat_get_supported_outputs(crtc_channel); 263 dss_feat_get_supported_outputs(crtc_channel);
261 264
262 if (supported_outputs & dssdev->output->id) 265 if (supported_outputs & output->id)
263 encoder->possible_crtcs |= (1 << id); 266 encoder->possible_crtcs |= (1 << id);
264 } 267 }
265 } 268 }
diff --git a/drivers/video/omap2/dss/manager-sysfs.c b/drivers/video/omap2/dss/manager-sysfs.c
index 9a2fb59b6f89..51046819f33b 100644
--- a/drivers/video/omap2/dss/manager-sysfs.c
+++ b/drivers/video/omap2/dss/manager-sysfs.c
@@ -78,7 +78,9 @@ static ssize_t manager_display_store(struct omap_overlay_manager *mgr,
78 } 78 }
79 79
80 if (dssdev) { 80 if (dssdev) {
81 struct omap_dss_output *out = dssdev->output; 81 struct omap_dss_output *out;
82
83 out = omapdss_find_output_from_display(dssdev);
82 84
83 /* 85 /*
84 * a registered device should have an output connected to it 86 * a registered device should have an output connected to it
diff --git a/drivers/video/omap2/dss/output.c b/drivers/video/omap2/dss/output.c
index 4d01001497f4..ab2c0f0ab244 100644
--- a/drivers/video/omap2/dss/output.c
+++ b/drivers/video/omap2/dss/output.c
@@ -141,6 +141,25 @@ struct omap_dss_output *omap_dss_find_output_by_node(struct device_node *node)
141} 141}
142EXPORT_SYMBOL(omap_dss_find_output_by_node); 142EXPORT_SYMBOL(omap_dss_find_output_by_node);
143 143
144struct omap_dss_output *omapdss_find_output_from_display(struct omap_dss_device *dssdev)
145{
146 return dssdev->output;
147}
148EXPORT_SYMBOL(omapdss_find_output_from_display);
149
150struct omap_overlay_manager *omapdss_find_mgr_from_display(struct omap_dss_device *dssdev)
151{
152 struct omap_dss_output *out;
153
154 out = omapdss_find_output_from_display(dssdev);
155
156 if (out == NULL)
157 return NULL;
158
159 return out->manager;
160}
161EXPORT_SYMBOL(omapdss_find_mgr_from_display);
162
144static const struct dss_mgr_ops *dss_mgr_ops; 163static const struct dss_mgr_ops *dss_mgr_ops;
145 164
146int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops) 165int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops)
diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c
index d30b45d72649..146b6f5428db 100644
--- a/drivers/video/omap2/omapfb/omapfb-ioctl.c
+++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c
@@ -770,12 +770,17 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg)
770 770
771 case OMAPFB_WAITFORVSYNC: 771 case OMAPFB_WAITFORVSYNC:
772 DBG("ioctl WAITFORVSYNC\n"); 772 DBG("ioctl WAITFORVSYNC\n");
773 if (!display || !display->output || !display->output->manager) { 773
774 if (!display) {
774 r = -EINVAL; 775 r = -EINVAL;
775 break; 776 break;
776 } 777 }
777 778
778 mgr = display->output->manager; 779 mgr = omapdss_find_mgr_from_display(display);
780 if (!mgr) {
781 r = -EINVAL;
782 break;
783 }
779 784
780 r = mgr->wait_for_vsync(mgr); 785 r = mgr->wait_for_vsync(mgr);
781 break; 786 break;
diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
index 856917b33616..cc8953c4faa1 100644
--- a/drivers/video/omap2/omapfb/omapfb-main.c
+++ b/drivers/video/omap2/omapfb/omapfb-main.c
@@ -2363,18 +2363,16 @@ static int omapfb_init_connections(struct omapfb2_device *fbdev,
2363 int i, r; 2363 int i, r;
2364 struct omap_overlay_manager *mgr; 2364 struct omap_overlay_manager *mgr;
2365 2365
2366 if (!def_dssdev->output) {
2367 dev_err(fbdev->dev, "no output for the default display\n");
2368 return -EINVAL;
2369 }
2370
2371 for (i = 0; i < fbdev->num_displays; ++i) { 2366 for (i = 0; i < fbdev->num_displays; ++i) {
2372 struct omap_dss_device *dssdev = fbdev->displays[i].dssdev; 2367 struct omap_dss_device *dssdev = fbdev->displays[i].dssdev;
2373 struct omap_dss_output *out = dssdev->output; 2368 struct omap_dss_output *out;
2374 2369
2375 mgr = omap_dss_get_overlay_manager(out->dispc_channel); 2370 out = omapdss_find_output_from_display(dssdev);
2371 if (!out)
2372 continue;
2376 2373
2377 if (!mgr || !out) 2374 mgr = omap_dss_get_overlay_manager(out->dispc_channel);
2375 if (!mgr)
2378 continue; 2376 continue;
2379 2377
2380 if (mgr->output) 2378 if (mgr->output)
@@ -2383,7 +2381,7 @@ static int omapfb_init_connections(struct omapfb2_device *fbdev,
2383 mgr->set_output(mgr, out); 2381 mgr->set_output(mgr, out);
2384 } 2382 }
2385 2383
2386 mgr = def_dssdev->output->manager; 2384 mgr = omapdss_find_mgr_from_display(def_dssdev);
2387 2385
2388 if (!mgr) { 2386 if (!mgr) {
2389 dev_err(fbdev->dev, "no ovl manager for the default display\n"); 2387 dev_err(fbdev->dev, "no ovl manager for the default display\n");
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index 25a944e080b4..898f81247859 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -786,6 +786,9 @@ int omapdss_output_set_device(struct omap_dss_output *out,
786 struct omap_dss_device *dssdev); 786 struct omap_dss_device *dssdev);
787int omapdss_output_unset_device(struct omap_dss_output *out); 787int omapdss_output_unset_device(struct omap_dss_output *out);
788 788
789struct omap_dss_output *omapdss_find_output_from_display(struct omap_dss_device *dssdev);
790struct omap_overlay_manager *omapdss_find_mgr_from_display(struct omap_dss_device *dssdev);
791
789void omapdss_default_get_resolution(struct omap_dss_device *dssdev, 792void omapdss_default_get_resolution(struct omap_dss_device *dssdev,
790 u16 *xres, u16 *yres); 793 u16 *xres, u16 *yres);
791int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev); 794int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev);