aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/omap2/dss/dpi.c
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2012-09-06 07:29:31 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2012-09-18 09:15:02 -0400
commit1521653c72596aaf1899c8d79a3f541f79ff238b (patch)
treeac36b818043b270996d952fae1ca515026e52b6a /drivers/video/omap2/dss/dpi.c
parent6a03fca96e4d4d010be52e11fc7b8ab89da9d2cf (diff)
OMAPDSS: register only one display device per output
We have boards with multiple panel devices connected to the same physical output, of which only one panel can be enabled at one time. Examples of these are Overo, where you can use different daughter boards that have different LCDs, and 3430SDP which has an LCD and a DVI output and a physical switch to select the active display. These are supported by omapdss so that we add all the possible display devices at probe, but the displays are inactive until somebody enables one. At this point the panel driver starts using the DSS, thus reserving the physcal resource and excluding the other panels. This is problematic: - Panel drivers can't allocate their resources properly at probe(), because the resources can be shared with other panels. Thus they can be only reserved at enable time. - Managing this in omapdss is confusing. It's not natural to have child devices, which may not even exist (for example, a daughterboard that is not connected). Only some boards have multiple displays per output, and of those, only very few have possibility of switching the display during runtime. Because of the above points: - We don't want to make omapdss and all the panel drivers more complex just because some boards have complex setups. - Only few boards support runtime switching, and afaik even then it's not required. So we don't need to support runtime switching. Thus we'll change to a model where we will have only one display device per output and this cannot be (currently) changed at runtime. We'll still have the possibility to select the display from multiple options during boot with the default display option. This patch accomplishes the above by changing how the output drivers register the display device. Instead of registering all the devices given from the board file, we'll only register one. If the default display option is set, the output driver selects that display from its displays. If the default display is not set, or the default display is not one of the output's displays, the output driver selects the first display. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video/omap2/dss/dpi.c')
-rw-r--r--drivers/video/omap2/dss/dpi.c47
1 files changed, 37 insertions, 10 deletions
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c
index 703fc1d8ec8..6f9a199a68a 100644
--- a/drivers/video/omap2/dss/dpi.c
+++ b/drivers/video/omap2/dss/dpi.c
@@ -371,10 +371,14 @@ static int __init dpi_init_display(struct omap_dss_device *dssdev)
371 return 0; 371 return 0;
372} 372}
373 373
374static void __init dpi_probe_pdata(struct platform_device *pdev) 374static struct omap_dss_device * __init dpi_find_dssdev(struct platform_device *pdev)
375{ 375{
376 struct omap_dss_board_info *pdata = pdev->dev.platform_data; 376 struct omap_dss_board_info *pdata = pdev->dev.platform_data;
377 int i, r; 377 const char *def_disp_name = dss_get_default_display_name();
378 struct omap_dss_device *def_dssdev;
379 int i;
380
381 def_dssdev = NULL;
378 382
379 for (i = 0; i < pdata->num_devices; ++i) { 383 for (i = 0; i < pdata->num_devices; ++i) {
380 struct omap_dss_device *dssdev = pdata->devices[i]; 384 struct omap_dss_device *dssdev = pdata->devices[i];
@@ -382,16 +386,39 @@ static void __init dpi_probe_pdata(struct platform_device *pdev)
382 if (dssdev->type != OMAP_DISPLAY_TYPE_DPI) 386 if (dssdev->type != OMAP_DISPLAY_TYPE_DPI)
383 continue; 387 continue;
384 388
385 r = dpi_init_display(dssdev); 389 if (def_dssdev == NULL)
386 if (r) { 390 def_dssdev = dssdev;
387 DSSERR("device %s init failed: %d\n", dssdev->name, r); 391
388 continue; 392 if (def_disp_name != NULL &&
393 strcmp(dssdev->name, def_disp_name) == 0) {
394 def_dssdev = dssdev;
395 break;
389 } 396 }
397 }
390 398
391 r = omap_dss_register_device(dssdev, &pdev->dev); 399 return def_dssdev;
392 if (r) 400}
393 DSSERR("device %s register failed: %d\n", 401
394 dssdev->name, r); 402static void __init dpi_probe_pdata(struct platform_device *pdev)
403{
404 struct omap_dss_device *dssdev;
405 int r;
406
407 dssdev = dpi_find_dssdev(pdev);
408
409 if (!dssdev)
410 return;
411
412 r = dpi_init_display(dssdev);
413 if (r) {
414 DSSERR("device %s init failed: %d\n", dssdev->name, r);
415 return;
416 }
417
418 r = omap_dss_register_device(dssdev, &pdev->dev);
419 if (r) {
420 DSSERR("device %s register failed: %d\n", dssdev->name, r);
421 return;
395 } 422 }
396} 423}
397 424