aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/plat-omap/include/plat/display.h7
-rw-r--r--drivers/video/omap2/displays/panel-taal.c2
-rw-r--r--drivers/video/omap2/dss/core.c3
-rw-r--r--drivers/video/omap2/dss/display.c8
-rw-r--r--drivers/video/omap2/dss/venc.c1
-rw-r--r--drivers/video/omap2/omapfb/omapfb-main.c31
-rw-r--r--drivers/video/omap2/omapfb/omapfb.h6
7 files changed, 43 insertions, 15 deletions
diff --git a/arch/arm/plat-omap/include/plat/display.h b/arch/arm/plat-omap/include/plat/display.h
index 70a9dd318ef9..aadea59b69bc 100644
--- a/arch/arm/plat-omap/include/plat/display.h
+++ b/arch/arm/plat-omap/include/plat/display.h
@@ -433,8 +433,6 @@ struct omap_dss_device {
433 int acb; /* ac-bias pin frequency */ 433 int acb; /* ac-bias pin frequency */
434 434
435 enum omap_panel_config config; 435 enum omap_panel_config config;
436
437 u8 recommended_bpp;
438 } panel; 436 } panel;
439 437
440 struct { 438 struct {
@@ -470,8 +468,6 @@ struct omap_dss_device {
470 int (*suspend)(struct omap_dss_device *dssdev); 468 int (*suspend)(struct omap_dss_device *dssdev);
471 int (*resume)(struct omap_dss_device *dssdev); 469 int (*resume)(struct omap_dss_device *dssdev);
472 470
473 int (*get_recommended_bpp)(struct omap_dss_device *dssdev);
474
475 int (*check_timings)(struct omap_dss_device *dssdev, 471 int (*check_timings)(struct omap_dss_device *dssdev,
476 struct omap_video_timings *timings); 472 struct omap_video_timings *timings);
477 void (*set_timings)(struct omap_dss_device *dssdev, 473 void (*set_timings)(struct omap_dss_device *dssdev,
@@ -530,6 +526,7 @@ struct omap_dss_driver {
530 526
531 void (*get_resolution)(struct omap_dss_device *dssdev, 527 void (*get_resolution)(struct omap_dss_device *dssdev,
532 u16 *xres, u16 *yres); 528 u16 *xres, u16 *yres);
529 int (*get_recommended_bpp)(struct omap_dss_device *dssdev);
533}; 530};
534 531
535int omap_dss_register_driver(struct omap_dss_driver *); 532int omap_dss_register_driver(struct omap_dss_driver *);
@@ -556,6 +553,8 @@ struct omap_overlay *omap_dss_get_overlay(int num);
556 553
557void omapdss_default_get_resolution(struct omap_dss_device *dssdev, 554void omapdss_default_get_resolution(struct omap_dss_device *dssdev,
558 u16 *xres, u16 *yres); 555 u16 *xres, u16 *yres);
556int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev);
557
559typedef void (*omap_dispc_isr_t) (void *arg, u32 mask); 558typedef void (*omap_dispc_isr_t) (void *arg, u32 mask);
560int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask); 559int omap_dispc_register_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
561int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask); 560int omap_dispc_unregister_isr(omap_dispc_isr_t isr, void *arg, u32 mask);
diff --git a/drivers/video/omap2/displays/panel-taal.c b/drivers/video/omap2/displays/panel-taal.c
index 11d69b67a903..e00502ea46e5 100644
--- a/drivers/video/omap2/displays/panel-taal.c
+++ b/drivers/video/omap2/displays/panel-taal.c
@@ -990,6 +990,8 @@ static struct omap_dss_driver taal_driver = {
990 990
991 .setup_update = taal_setup_update, 991 .setup_update = taal_setup_update,
992 .get_resolution = taal_get_resolution, 992 .get_resolution = taal_get_resolution,
993 .get_recommended_bpp = omapdss_default_get_recommended_bpp,
994
993 .enable_te = taal_enable_te, 995 .enable_te = taal_enable_te,
994 .wait_for_te = taal_wait_te, 996 .wait_for_te = taal_wait_te,
995 .set_rotate = taal_rotate, 997 .set_rotate = taal_rotate,
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c
index 2e6ce835ae5c..7ebe50b335ed 100644
--- a/drivers/video/omap2/dss/core.c
+++ b/drivers/video/omap2/dss/core.c
@@ -814,6 +814,9 @@ int omap_dss_register_driver(struct omap_dss_driver *dssdriver)
814 814
815 if (dssdriver->get_resolution == NULL) 815 if (dssdriver->get_resolution == NULL)
816 dssdriver->get_resolution = omapdss_default_get_resolution; 816 dssdriver->get_resolution = omapdss_default_get_resolution;
817 if (dssdriver->get_recommended_bpp == NULL)
818 dssdriver->get_recommended_bpp =
819 omapdss_default_get_recommended_bpp;
817 820
818 return driver_register(&dssdriver->driver); 821 return driver_register(&dssdriver->driver);
819} 822}
diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c
index 3888c191c8a7..af8aae7ef814 100644
--- a/drivers/video/omap2/dss/display.c
+++ b/drivers/video/omap2/dss/display.c
@@ -324,11 +324,8 @@ void default_get_overlay_fifo_thresholds(enum omap_plane plane,
324 *fifo_low = fifo_size - burst_size_bytes; 324 *fifo_low = fifo_size - burst_size_bytes;
325} 325}
326 326
327static int default_get_recommended_bpp(struct omap_dss_device *dssdev) 327int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev)
328{ 328{
329 if (dssdev->panel.recommended_bpp)
330 return dssdev->panel.recommended_bpp;
331
332 switch (dssdev->type) { 329 switch (dssdev->type) {
333 case OMAP_DISPLAY_TYPE_DPI: 330 case OMAP_DISPLAY_TYPE_DPI:
334 if (dssdev->phy.dpi.data_lines == 24) 331 if (dssdev->phy.dpi.data_lines == 24)
@@ -350,6 +347,7 @@ static int default_get_recommended_bpp(struct omap_dss_device *dssdev)
350 BUG(); 347 BUG();
351 } 348 }
352} 349}
350EXPORT_SYMBOL(omapdss_default_get_recommended_bpp);
353 351
354/* Checks if replication logic should be used. Only use for active matrix, 352/* Checks if replication logic should be used. Only use for active matrix,
355 * when overlay is in RGB12U or RGB16 mode, and LCD interface is 353 * when overlay is in RGB12U or RGB16 mode, and LCD interface is
@@ -413,8 +411,6 @@ void dss_init_device(struct platform_device *pdev,
413 return; 411 return;
414 } 412 }
415 413
416 dssdev->get_recommended_bpp = default_get_recommended_bpp;
417
418 switch (dssdev->type) { 414 switch (dssdev->type) {
419 case OMAP_DISPLAY_TYPE_DPI: 415 case OMAP_DISPLAY_TYPE_DPI:
420 r = dpi_init_display(dssdev); 416 r = dpi_init_display(dssdev);
diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
index 65514f0f52fd..d13071dd46e5 100644
--- a/drivers/video/omap2/dss/venc.c
+++ b/drivers/video/omap2/dss/venc.c
@@ -460,6 +460,7 @@ static struct omap_dss_driver venc_driver = {
460 .resume = venc_panel_resume, 460 .resume = venc_panel_resume,
461 461
462 .get_resolution = omapdss_default_get_resolution, 462 .get_resolution = omapdss_default_get_resolution,
463 .get_recommended_bpp = omapdss_default_get_recommended_bpp,
463 464
464 .driver = { 465 .driver = {
465 .name = "venc", 466 .name = "venc",
diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c
index 212d2efb380c..216ed80293b8 100644
--- a/drivers/video/omap2/omapfb/omapfb-main.c
+++ b/drivers/video/omap2/omapfb/omapfb-main.c
@@ -54,6 +54,8 @@ module_param_named(test, omapfb_test_pattern, bool, 0644);
54#endif 54#endif
55 55
56static int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi); 56static int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi);
57static int omapfb_get_recommended_bpp(struct omapfb2_device *fbdev,
58 struct omap_dss_device *dssdev);
57 59
58#ifdef DEBUG 60#ifdef DEBUG
59static void draw_pixel(struct fb_info *fbi, int x, int y, unsigned color) 61static void draw_pixel(struct fb_info *fbi, int x, int y, unsigned color)
@@ -1404,6 +1406,7 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size,
1404 unsigned long paddr) 1406 unsigned long paddr)
1405{ 1407{
1406 struct omapfb_info *ofbi = FB2OFB(fbi); 1408 struct omapfb_info *ofbi = FB2OFB(fbi);
1409 struct omapfb2_device *fbdev = ofbi->fbdev;
1407 struct omap_dss_device *display; 1410 struct omap_dss_device *display;
1408 int bytespp; 1411 int bytespp;
1409 1412
@@ -1412,7 +1415,7 @@ static int omapfb_alloc_fbmem_display(struct fb_info *fbi, unsigned long size,
1412 if (!display) 1415 if (!display)
1413 return 0; 1416 return 0;
1414 1417
1415 switch (display->get_recommended_bpp(display)) { 1418 switch (omapfb_get_recommended_bpp(fbdev, display)) {
1416 case 16: 1419 case 16:
1417 bytespp = 2; 1420 bytespp = 2;
1418 break; 1421 break;
@@ -1760,7 +1763,7 @@ static int omapfb_fb_init(struct omapfb2_device *fbdev, struct fb_info *fbi)
1760 var->yres_virtual = var->yres; 1763 var->yres_virtual = var->yres;
1761 1764
1762 if (!var->bits_per_pixel) { 1765 if (!var->bits_per_pixel) {
1763 switch (display->get_recommended_bpp(display)) { 1766 switch (omapfb_get_recommended_bpp(fbdev, display)) {
1764 case 16: 1767 case 16:
1765 var->bits_per_pixel = 16; 1768 var->bits_per_pixel = 16;
1766 break; 1769 break;
@@ -2011,7 +2014,8 @@ static int omapfb_mode_to_timings(const char *mode_str,
2011 } 2014 }
2012} 2015}
2013 2016
2014static int omapfb_set_def_mode(struct omap_dss_device *display, char *mode_str) 2017static int omapfb_set_def_mode(struct omapfb2_device *fbdev,
2018 struct omap_dss_device *display, char *mode_str)
2015{ 2019{
2016 int r; 2020 int r;
2017 u8 bpp; 2021 u8 bpp;
@@ -2021,7 +2025,9 @@ static int omapfb_set_def_mode(struct omap_dss_device *display, char *mode_str)
2021 if (r) 2025 if (r)
2022 return r; 2026 return r;
2023 2027
2024 display->panel.recommended_bpp = bpp; 2028 fbdev->bpp_overrides[fbdev->num_bpp_overrides].dssdev = display;
2029 fbdev->bpp_overrides[fbdev->num_bpp_overrides].bpp = bpp;
2030 ++fbdev->num_bpp_overrides;
2025 2031
2026 if (!display->check_timings || !display->set_timings) 2032 if (!display->check_timings || !display->set_timings)
2027 return -EINVAL; 2033 return -EINVAL;
@@ -2035,6 +2041,21 @@ static int omapfb_set_def_mode(struct omap_dss_device *display, char *mode_str)
2035 return 0; 2041 return 0;
2036} 2042}
2037 2043
2044static int omapfb_get_recommended_bpp(struct omapfb2_device *fbdev,
2045 struct omap_dss_device *dssdev)
2046{
2047 int i;
2048
2049 BUG_ON(dssdev->driver->get_recommended_bpp == NULL);
2050
2051 for (i = 0; i < fbdev->num_bpp_overrides; ++i) {
2052 if (dssdev == fbdev->bpp_overrides[i].dssdev)
2053 return fbdev->bpp_overrides[i].bpp;
2054 }
2055
2056 return dssdev->driver->get_recommended_bpp(dssdev);
2057}
2058
2038static int omapfb_parse_def_modes(struct omapfb2_device *fbdev) 2059static int omapfb_parse_def_modes(struct omapfb2_device *fbdev)
2039{ 2060{
2040 char *str, *options, *this_opt; 2061 char *str, *options, *this_opt;
@@ -2073,7 +2094,7 @@ static int omapfb_parse_def_modes(struct omapfb2_device *fbdev)
2073 break; 2094 break;
2074 } 2095 }
2075 2096
2076 r = omapfb_set_def_mode(display, mode_str); 2097 r = omapfb_set_def_mode(fbdev, display, mode_str);
2077 if (r) 2098 if (r)
2078 break; 2099 break;
2079 } 2100 }
diff --git a/drivers/video/omap2/omapfb/omapfb.h b/drivers/video/omap2/omapfb/omapfb.h
index 4ae0b64b3f43..cd54fdbfd8bb 100644
--- a/drivers/video/omap2/omapfb/omapfb.h
+++ b/drivers/video/omap2/omapfb/omapfb.h
@@ -83,6 +83,12 @@ struct omapfb2_device {
83 struct omap_overlay *overlays[10]; 83 struct omap_overlay *overlays[10];
84 unsigned num_managers; 84 unsigned num_managers;
85 struct omap_overlay_manager *managers[10]; 85 struct omap_overlay_manager *managers[10];
86
87 unsigned num_bpp_overrides;
88 struct {
89 struct omap_dss_device *dssdev;
90 u8 bpp;
91 } bpp_overrides[10];
86}; 92};
87 93
88struct omapfb_colormode { 94struct omapfb_colormode {