diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-26 13:02:39 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-26 13:02:39 -0400 |
| commit | 2c518959f082c549d6c6dd9b5380aec40c3eb07f (patch) | |
| tree | 163deeedb0532e2c7df805cc052f117b32d33fe3 | |
| parent | 4f6876031ee105466f400661a0dd3fa66c4f0c09 (diff) | |
| parent | 18016e35d448d35739f8640b51476709c07e95db (diff) | |
Merge branch 'for-linus' of git://gitorious.org/linux-omap-dss2/linux
* 'for-linus' of git://gitorious.org/linux-omap-dss2/linux:
OMAP: DSS2: don't power off a panel twice
OMAP: DSS2: OMAPFB: Allow usage of def_vrfb only for omap2,3
OMAP: DSS2: OMAPFB: make VRFB depends on OMAP2,3
OMAP: DSS2: OMAPFB: Allow FB_OMAP2 to build without VRFB
arm/omap: simplify conditional
OMAP: DSS2: DSI: Remove extra iounmap in error path
OMAP: DSS2: Use dss_features framework on DSS2 code
OMAP: DSS2: Introduce dss_features files
video/omap: remove mux.h include
ARM: omap/fb: move get_fbmem_region() to .init.text
ARM: omap/fb: move omapfb_reserve_sram to .init.text
ARM: omap/fb: move omap_init_fb to .init.text
OMAP: DSS2: OMAPFB: swap front and back porches for both hsync and vsync
OMAP: DSS2: make filter coefficient tables human readable
OMAP: DSS2: Add SPI dependency to Kconfig of ACX565AKM panel
21 files changed, 475 insertions, 228 deletions
diff --git a/arch/arm/plat-omap/fb.c b/arch/arm/plat-omap/fb.c index bb78c1532fae..c9e5d7298c40 100644 --- a/arch/arm/plat-omap/fb.c +++ b/arch/arm/plat-omap/fb.c | |||
| @@ -96,7 +96,7 @@ static int fbmem_region_reserved(unsigned long start, size_t size) | |||
| 96 | * Get the region_idx`th region from board config/ATAG and convert it to | 96 | * Get the region_idx`th region from board config/ATAG and convert it to |
| 97 | * our internal format. | 97 | * our internal format. |
| 98 | */ | 98 | */ |
| 99 | static int get_fbmem_region(int region_idx, struct omapfb_mem_region *rg) | 99 | static int __init get_fbmem_region(int region_idx, struct omapfb_mem_region *rg) |
| 100 | { | 100 | { |
| 101 | const struct omap_fbmem_config *conf; | 101 | const struct omap_fbmem_config *conf; |
| 102 | u32 paddr; | 102 | u32 paddr; |
| @@ -128,7 +128,7 @@ static int set_fbmem_region_type(struct omapfb_mem_region *rg, int mem_type, | |||
| 128 | * type = 0 && paddr = 0, a default don't care case maps to | 128 | * type = 0 && paddr = 0, a default don't care case maps to |
| 129 | * the SDRAM type. | 129 | * the SDRAM type. |
| 130 | */ | 130 | */ |
| 131 | if (rg->type || (!rg->type && !rg->paddr)) | 131 | if (rg->type || !rg->paddr) |
| 132 | return 0; | 132 | return 0; |
| 133 | if (ranges_overlap(rg->paddr, rg->size, mem_start, mem_size)) { | 133 | if (ranges_overlap(rg->paddr, rg->size, mem_start, mem_size)) { |
| 134 | rg->type = mem_type; | 134 | rg->type = mem_type; |
| @@ -260,7 +260,7 @@ void __init omapfb_reserve_sdram_memblock(void) | |||
| 260 | * this point, since the driver built as a module would have problem with | 260 | * this point, since the driver built as a module would have problem with |
| 261 | * freeing / reallocating the regions. | 261 | * freeing / reallocating the regions. |
| 262 | */ | 262 | */ |
| 263 | unsigned long omapfb_reserve_sram(unsigned long sram_pstart, | 263 | unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, |
| 264 | unsigned long sram_vstart, | 264 | unsigned long sram_vstart, |
| 265 | unsigned long sram_size, | 265 | unsigned long sram_size, |
| 266 | unsigned long pstart_avail, | 266 | unsigned long pstart_avail, |
| @@ -334,7 +334,7 @@ void omapfb_set_ctrl_platform_data(void *data) | |||
| 334 | omapfb_config.ctrl_platform_data = data; | 334 | omapfb_config.ctrl_platform_data = data; |
| 335 | } | 335 | } |
| 336 | 336 | ||
| 337 | static inline int omap_init_fb(void) | 337 | static int __init omap_init_fb(void) |
| 338 | { | 338 | { |
| 339 | const struct omap_lcd_config *conf; | 339 | const struct omap_lcd_config *conf; |
| 340 | 340 | ||
| @@ -379,7 +379,7 @@ void omapfb_set_platform_data(struct omapfb_platform_data *data) | |||
| 379 | omapfb_config = *data; | 379 | omapfb_config = *data; |
| 380 | } | 380 | } |
| 381 | 381 | ||
| 382 | static inline int omap_init_fb(void) | 382 | static int __init omap_init_fb(void) |
| 383 | { | 383 | { |
| 384 | return platform_device_register(&omap_fb_device); | 384 | return platform_device_register(&omap_fb_device); |
| 385 | } | 385 | } |
| @@ -390,7 +390,7 @@ void omapfb_reserve_sdram_memblock(void) | |||
| 390 | { | 390 | { |
| 391 | } | 391 | } |
| 392 | 392 | ||
| 393 | unsigned long omapfb_reserve_sram(unsigned long sram_pstart, | 393 | unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, |
| 394 | unsigned long sram_vstart, | 394 | unsigned long sram_vstart, |
| 395 | unsigned long sram_size, | 395 | unsigned long sram_size, |
| 396 | unsigned long start_avail, | 396 | unsigned long start_avail, |
| @@ -409,7 +409,7 @@ void omapfb_reserve_sdram_memblock(void) | |||
| 409 | { | 409 | { |
| 410 | } | 410 | } |
| 411 | 411 | ||
| 412 | unsigned long omapfb_reserve_sram(unsigned long sram_pstart, | 412 | unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, |
| 413 | unsigned long sram_vstart, | 413 | unsigned long sram_vstart, |
| 414 | unsigned long sram_size, | 414 | unsigned long sram_size, |
| 415 | unsigned long start_avail, | 415 | unsigned long start_avail, |
diff --git a/arch/arm/plat-omap/include/plat/display.h b/arch/arm/plat-omap/include/plat/display.h index 8bd15bdb4132..c915a661f1f5 100644 --- a/arch/arm/plat-omap/include/plat/display.h +++ b/arch/arm/plat-omap/include/plat/display.h | |||
| @@ -81,37 +81,6 @@ enum omap_color_mode { | |||
| 81 | OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32 */ | 81 | OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32 */ |
| 82 | OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32 */ | 82 | OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32 */ |
| 83 | OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32 */ | 83 | OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32 */ |
| 84 | |||
| 85 | OMAP_DSS_COLOR_GFX_OMAP2 = | ||
| 86 | OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | | ||
| 87 | OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | | ||
| 88 | OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 | | ||
| 89 | OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P, | ||
| 90 | |||
| 91 | OMAP_DSS_COLOR_VID_OMAP2 = | ||
| 92 | OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | | ||
| 93 | OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 | | ||
| 94 | OMAP_DSS_COLOR_UYVY, | ||
| 95 | |||
| 96 | OMAP_DSS_COLOR_GFX_OMAP3 = | ||
| 97 | OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | | ||
| 98 | OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | | ||
| 99 | OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | | ||
| 100 | OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | | ||
| 101 | OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 | | ||
| 102 | OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, | ||
| 103 | |||
| 104 | OMAP_DSS_COLOR_VID1_OMAP3 = | ||
| 105 | OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 | | ||
| 106 | OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P | | ||
| 107 | OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY, | ||
| 108 | |||
| 109 | OMAP_DSS_COLOR_VID2_OMAP3 = | ||
| 110 | OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | | ||
| 111 | OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | | ||
| 112 | OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 | | ||
| 113 | OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 | | ||
| 114 | OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, | ||
| 115 | }; | 84 | }; |
| 116 | 85 | ||
| 117 | enum omap_lcd_display_type { | 86 | enum omap_lcd_display_type { |
diff --git a/arch/arm/plat-omap/include/plat/vrfb.h b/arch/arm/plat-omap/include/plat/vrfb.h index d8a03ced3b10..3792bdea2f6d 100644 --- a/arch/arm/plat-omap/include/plat/vrfb.h +++ b/arch/arm/plat-omap/include/plat/vrfb.h | |||
| @@ -35,6 +35,7 @@ struct vrfb { | |||
| 35 | bool yuv_mode; | 35 | bool yuv_mode; |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | #ifdef CONFIG_OMAP2_VRFB | ||
| 38 | extern int omap_vrfb_request_ctx(struct vrfb *vrfb); | 39 | extern int omap_vrfb_request_ctx(struct vrfb *vrfb); |
| 39 | extern void omap_vrfb_release_ctx(struct vrfb *vrfb); | 40 | extern void omap_vrfb_release_ctx(struct vrfb *vrfb); |
| 40 | extern void omap_vrfb_adjust_size(u16 *width, u16 *height, | 41 | extern void omap_vrfb_adjust_size(u16 *width, u16 *height, |
| @@ -47,4 +48,19 @@ extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, | |||
| 47 | extern int omap_vrfb_map_angle(struct vrfb *vrfb, u16 height, u8 rot); | 48 | extern int omap_vrfb_map_angle(struct vrfb *vrfb, u16 height, u8 rot); |
| 48 | extern void omap_vrfb_restore_context(void); | 49 | extern void omap_vrfb_restore_context(void); |
| 49 | 50 | ||
| 51 | #else | ||
| 52 | static inline int omap_vrfb_request_ctx(struct vrfb *vrfb) { return 0; } | ||
| 53 | static inline void omap_vrfb_release_ctx(struct vrfb *vrfb) {} | ||
| 54 | static inline void omap_vrfb_adjust_size(u16 *width, u16 *height, | ||
| 55 | u8 bytespp) {} | ||
| 56 | static inline u32 omap_vrfb_min_phys_size(u16 width, u16 height, u8 bytespp) | ||
| 57 | { return 0; } | ||
| 58 | static inline u16 omap_vrfb_max_height(u32 phys_size, u16 width, u8 bytespp) | ||
| 59 | { return 0; } | ||
| 60 | static inline void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr, | ||
| 61 | u16 width, u16 height, unsigned bytespp, bool yuv_mode) {} | ||
| 62 | static inline int omap_vrfb_map_angle(struct vrfb *vrfb, u16 height, u8 rot) | ||
| 63 | { return 0; } | ||
| 64 | static inline void omap_vrfb_restore_context(void) {} | ||
| 65 | #endif | ||
| 50 | #endif /* __VRFB_H */ | 66 | #endif /* __VRFB_H */ |
diff --git a/drivers/video/omap/lcd_omap3beagle.c b/drivers/video/omap/lcd_omap3beagle.c index ca75cc2a87a5..d7c6c3e0afc6 100644 --- a/drivers/video/omap/lcd_omap3beagle.c +++ b/drivers/video/omap/lcd_omap3beagle.c | |||
| @@ -25,8 +25,6 @@ | |||
| 25 | #include <linux/gpio.h> | 25 | #include <linux/gpio.h> |
| 26 | #include <linux/i2c/twl.h> | 26 | #include <linux/i2c/twl.h> |
| 27 | 27 | ||
| 28 | #include <plat/mux.h> | ||
| 29 | #include <plat/mux.h> | ||
| 30 | #include <asm/mach-types.h> | 28 | #include <asm/mach-types.h> |
| 31 | 29 | ||
| 32 | #include "omapfb.h" | 30 | #include "omapfb.h" |
diff --git a/drivers/video/omap2/displays/Kconfig b/drivers/video/omap2/displays/Kconfig index 881c9f77c75a..12327bbfdbbb 100644 --- a/drivers/video/omap2/displays/Kconfig +++ b/drivers/video/omap2/displays/Kconfig | |||
| @@ -40,7 +40,7 @@ config PANEL_TPO_TD043MTEA1 | |||
| 40 | 40 | ||
| 41 | config PANEL_ACX565AKM | 41 | config PANEL_ACX565AKM |
| 42 | tristate "ACX565AKM Panel" | 42 | tristate "ACX565AKM Panel" |
| 43 | depends on OMAP2_DSS_SDI | 43 | depends on OMAP2_DSS_SDI && SPI |
| 44 | select BACKLIGHT_CLASS_DEVICE | 44 | select BACKLIGHT_CLASS_DEVICE |
| 45 | help | 45 | help |
| 46 | This is the LCD panel used on Nokia N900 | 46 | This is the LCD panel used on Nokia N900 |
diff --git a/drivers/video/omap2/displays/panel-acx565akm.c b/drivers/video/omap2/displays/panel-acx565akm.c index 07fbb8a733bb..e77310653207 100644 --- a/drivers/video/omap2/displays/panel-acx565akm.c +++ b/drivers/video/omap2/displays/panel-acx565akm.c | |||
| @@ -587,6 +587,9 @@ static int acx_panel_power_on(struct omap_dss_device *dssdev) | |||
| 587 | 587 | ||
| 588 | dev_dbg(&dssdev->dev, "%s\n", __func__); | 588 | dev_dbg(&dssdev->dev, "%s\n", __func__); |
| 589 | 589 | ||
| 590 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||
| 591 | return 0; | ||
| 592 | |||
| 590 | mutex_lock(&md->mutex); | 593 | mutex_lock(&md->mutex); |
| 591 | 594 | ||
| 592 | r = omapdss_sdi_display_enable(dssdev); | 595 | r = omapdss_sdi_display_enable(dssdev); |
| @@ -644,6 +647,9 @@ static void acx_panel_power_off(struct omap_dss_device *dssdev) | |||
| 644 | 647 | ||
| 645 | dev_dbg(&dssdev->dev, "%s\n", __func__); | 648 | dev_dbg(&dssdev->dev, "%s\n", __func__); |
| 646 | 649 | ||
| 650 | if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) | ||
| 651 | return; | ||
| 652 | |||
| 647 | mutex_lock(&md->mutex); | 653 | mutex_lock(&md->mutex); |
| 648 | 654 | ||
| 649 | if (!md->enabled) { | 655 | if (!md->enabled) { |
diff --git a/drivers/video/omap2/displays/panel-generic.c b/drivers/video/omap2/displays/panel-generic.c index 300eff5de1b4..395a68de3990 100644 --- a/drivers/video/omap2/displays/panel-generic.c +++ b/drivers/video/omap2/displays/panel-generic.c | |||
| @@ -39,6 +39,9 @@ static int generic_panel_power_on(struct omap_dss_device *dssdev) | |||
| 39 | { | 39 | { |
| 40 | int r; | 40 | int r; |
| 41 | 41 | ||
| 42 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||
| 43 | return 0; | ||
| 44 | |||
| 42 | r = omapdss_dpi_display_enable(dssdev); | 45 | r = omapdss_dpi_display_enable(dssdev); |
| 43 | if (r) | 46 | if (r) |
| 44 | goto err0; | 47 | goto err0; |
| @@ -58,6 +61,9 @@ err0: | |||
| 58 | 61 | ||
| 59 | static void generic_panel_power_off(struct omap_dss_device *dssdev) | 62 | static void generic_panel_power_off(struct omap_dss_device *dssdev) |
| 60 | { | 63 | { |
| 64 | if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) | ||
| 65 | return; | ||
| 66 | |||
| 61 | if (dssdev->platform_disable) | 67 | if (dssdev->platform_disable) |
| 62 | dssdev->platform_disable(dssdev); | 68 | dssdev->platform_disable(dssdev); |
| 63 | 69 | ||
diff --git a/drivers/video/omap2/displays/panel-sharp-lq043t1dg01.c b/drivers/video/omap2/displays/panel-sharp-lq043t1dg01.c index 10267461991c..0c6896cea2d0 100644 --- a/drivers/video/omap2/displays/panel-sharp-lq043t1dg01.c +++ b/drivers/video/omap2/displays/panel-sharp-lq043t1dg01.c | |||
| @@ -43,6 +43,9 @@ static int sharp_lq_panel_power_on(struct omap_dss_device *dssdev) | |||
| 43 | { | 43 | { |
| 44 | int r; | 44 | int r; |
| 45 | 45 | ||
| 46 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||
| 47 | return 0; | ||
| 48 | |||
| 46 | r = omapdss_dpi_display_enable(dssdev); | 49 | r = omapdss_dpi_display_enable(dssdev); |
| 47 | if (r) | 50 | if (r) |
| 48 | goto err0; | 51 | goto err0; |
| @@ -65,6 +68,9 @@ err0: | |||
| 65 | 68 | ||
| 66 | static void sharp_lq_panel_power_off(struct omap_dss_device *dssdev) | 69 | static void sharp_lq_panel_power_off(struct omap_dss_device *dssdev) |
| 67 | { | 70 | { |
| 71 | if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) | ||
| 72 | return; | ||
| 73 | |||
| 68 | if (dssdev->platform_disable) | 74 | if (dssdev->platform_disable) |
| 69 | dssdev->platform_disable(dssdev); | 75 | dssdev->platform_disable(dssdev); |
| 70 | 76 | ||
diff --git a/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c index 7d9eb2b1f5af..9a138f650e05 100644 --- a/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c +++ b/drivers/video/omap2/displays/panel-sharp-ls037v7dw01.c | |||
| @@ -135,6 +135,9 @@ static int sharp_ls_power_on(struct omap_dss_device *dssdev) | |||
| 135 | { | 135 | { |
| 136 | int r = 0; | 136 | int r = 0; |
| 137 | 137 | ||
| 138 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||
| 139 | return 0; | ||
| 140 | |||
| 138 | r = omapdss_dpi_display_enable(dssdev); | 141 | r = omapdss_dpi_display_enable(dssdev); |
| 139 | if (r) | 142 | if (r) |
| 140 | goto err0; | 143 | goto err0; |
| @@ -157,6 +160,9 @@ err0: | |||
| 157 | 160 | ||
| 158 | static void sharp_ls_power_off(struct omap_dss_device *dssdev) | 161 | static void sharp_ls_power_off(struct omap_dss_device *dssdev) |
| 159 | { | 162 | { |
| 163 | if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) | ||
| 164 | return; | ||
| 165 | |||
| 160 | if (dssdev->platform_disable) | 166 | if (dssdev->platform_disable) |
| 161 | dssdev->platform_disable(dssdev); | 167 | dssdev->platform_disable(dssdev); |
| 162 | 168 | ||
diff --git a/drivers/video/omap2/displays/panel-toppoly-tdo35s.c b/drivers/video/omap2/displays/panel-toppoly-tdo35s.c index e320e67d06f3..526e906c8a6c 100644 --- a/drivers/video/omap2/displays/panel-toppoly-tdo35s.c +++ b/drivers/video/omap2/displays/panel-toppoly-tdo35s.c | |||
| @@ -46,6 +46,9 @@ static int toppoly_tdo_panel_power_on(struct omap_dss_device *dssdev) | |||
| 46 | { | 46 | { |
| 47 | int r; | 47 | int r; |
| 48 | 48 | ||
| 49 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||
| 50 | return 0; | ||
| 51 | |||
| 49 | r = omapdss_dpi_display_enable(dssdev); | 52 | r = omapdss_dpi_display_enable(dssdev); |
| 50 | if (r) | 53 | if (r) |
| 51 | goto err0; | 54 | goto err0; |
| @@ -65,6 +68,9 @@ err0: | |||
| 65 | 68 | ||
| 66 | static void toppoly_tdo_panel_power_off(struct omap_dss_device *dssdev) | 69 | static void toppoly_tdo_panel_power_off(struct omap_dss_device *dssdev) |
| 67 | { | 70 | { |
| 71 | if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) | ||
| 72 | return; | ||
| 73 | |||
| 68 | if (dssdev->platform_disable) | 74 | if (dssdev->platform_disable) |
| 69 | dssdev->platform_disable(dssdev); | 75 | dssdev->platform_disable(dssdev); |
| 70 | 76 | ||
diff --git a/drivers/video/omap2/displays/panel-tpo-td043mtea1.c b/drivers/video/omap2/displays/panel-tpo-td043mtea1.c index e866e76b13d0..dbe9d43b4850 100644 --- a/drivers/video/omap2/displays/panel-tpo-td043mtea1.c +++ b/drivers/video/omap2/displays/panel-tpo-td043mtea1.c | |||
| @@ -269,6 +269,9 @@ static int tpo_td043_power_on(struct omap_dss_device *dssdev) | |||
| 269 | int nreset_gpio = dssdev->reset_gpio; | 269 | int nreset_gpio = dssdev->reset_gpio; |
| 270 | int r; | 270 | int r; |
| 271 | 271 | ||
| 272 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) | ||
| 273 | return 0; | ||
| 274 | |||
| 272 | r = omapdss_dpi_display_enable(dssdev); | 275 | r = omapdss_dpi_display_enable(dssdev); |
| 273 | if (r) | 276 | if (r) |
| 274 | goto err0; | 277 | goto err0; |
| @@ -308,6 +311,9 @@ static void tpo_td043_power_off(struct omap_dss_device *dssdev) | |||
| 308 | struct tpo_td043_device *tpo_td043 = dev_get_drvdata(&dssdev->dev); | 311 | struct tpo_td043_device *tpo_td043 = dev_get_drvdata(&dssdev->dev); |
| 309 | int nreset_gpio = dssdev->reset_gpio; | 312 | int nreset_gpio = dssdev->reset_gpio; |
| 310 | 313 | ||
| 314 | if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) | ||
| 315 | return; | ||
| 316 | |||
| 311 | tpo_td043_write(tpo_td043->spi, 3, | 317 | tpo_td043_write(tpo_td043->spi, 3, |
| 312 | TPO_R03_VAL_STANDBY | TPO_R03_EN_PWM); | 318 | TPO_R03_VAL_STANDBY | TPO_R03_EN_PWM); |
| 313 | 319 | ||
diff --git a/drivers/video/omap2/dss/Makefile b/drivers/video/omap2/dss/Makefile index d71b5d9d71b1..7db17b5e570c 100644 --- a/drivers/video/omap2/dss/Makefile +++ b/drivers/video/omap2/dss/Makefile | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | obj-$(CONFIG_OMAP2_DSS) += omapdss.o | 1 | obj-$(CONFIG_OMAP2_DSS) += omapdss.o |
| 2 | omapdss-y := core.o dss.o dispc.o display.o manager.o overlay.o | 2 | omapdss-y := core.o dss.o dss_features.o dispc.o display.o manager.o overlay.o |
| 3 | omapdss-$(CONFIG_OMAP2_DSS_DPI) += dpi.o | 3 | omapdss-$(CONFIG_OMAP2_DSS_DPI) += dpi.o |
| 4 | omapdss-$(CONFIG_OMAP2_DSS_RFBI) += rfbi.o | 4 | omapdss-$(CONFIG_OMAP2_DSS_RFBI) += rfbi.o |
| 5 | omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o | 5 | omapdss-$(CONFIG_OMAP2_DSS_VENC) += venc.o |
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index b3a498f22d36..8e89f6049280 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c | |||
| @@ -37,6 +37,7 @@ | |||
| 37 | #include <plat/clock.h> | 37 | #include <plat/clock.h> |
| 38 | 38 | ||
| 39 | #include "dss.h" | 39 | #include "dss.h" |
| 40 | #include "dss_features.h" | ||
| 40 | 41 | ||
| 41 | static struct { | 42 | static struct { |
| 42 | struct platform_device *pdev; | 43 | struct platform_device *pdev; |
| @@ -502,6 +503,8 @@ static int omap_dss_probe(struct platform_device *pdev) | |||
| 502 | 503 | ||
| 503 | core.pdev = pdev; | 504 | core.pdev = pdev; |
| 504 | 505 | ||
| 506 | dss_features_init(); | ||
| 507 | |||
| 505 | dss_init_overlay_managers(pdev); | 508 | dss_init_overlay_managers(pdev); |
| 506 | dss_init_overlays(pdev); | 509 | dss_init_overlays(pdev); |
| 507 | 510 | ||
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index 5ecdc0004094..fa40fa59a9ac 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c | |||
| @@ -39,6 +39,7 @@ | |||
| 39 | #include <plat/display.h> | 39 | #include <plat/display.h> |
| 40 | 40 | ||
| 41 | #include "dss.h" | 41 | #include "dss.h" |
| 42 | #include "dss_features.h" | ||
| 42 | 43 | ||
| 43 | /* DISPC */ | 44 | /* DISPC */ |
| 44 | #define DISPC_BASE 0x48050400 | 45 | #define DISPC_BASE 0x48050400 |
| @@ -139,6 +140,22 @@ struct omap_dispc_isr_data { | |||
| 139 | u32 mask; | 140 | u32 mask; |
| 140 | }; | 141 | }; |
| 141 | 142 | ||
| 143 | struct dispc_h_coef { | ||
| 144 | s8 hc4; | ||
| 145 | s8 hc3; | ||
| 146 | u8 hc2; | ||
| 147 | s8 hc1; | ||
| 148 | s8 hc0; | ||
| 149 | }; | ||
| 150 | |||
| 151 | struct dispc_v_coef { | ||
| 152 | s8 vc22; | ||
| 153 | s8 vc2; | ||
| 154 | u8 vc1; | ||
| 155 | s8 vc0; | ||
| 156 | s8 vc00; | ||
| 157 | }; | ||
| 158 | |||
| 142 | #define REG_GET(idx, start, end) \ | 159 | #define REG_GET(idx, start, end) \ |
| 143 | FLD_GET(dispc_read_reg(idx), start, end) | 160 | FLD_GET(dispc_read_reg(idx), start, end) |
| 144 | 161 | ||
| @@ -564,106 +581,77 @@ static void _dispc_set_scale_coef(enum omap_plane plane, int hscaleup, | |||
| 564 | int vscaleup, int five_taps) | 581 | int vscaleup, int five_taps) |
| 565 | { | 582 | { |
| 566 | /* Coefficients for horizontal up-sampling */ | 583 | /* Coefficients for horizontal up-sampling */ |
| 567 | static const u32 coef_hup[8] = { | 584 | static const struct dispc_h_coef coef_hup[8] = { |
| 568 | 0x00800000, | 585 | { 0, 0, 128, 0, 0 }, |
| 569 | 0x0D7CF800, | 586 | { -1, 13, 124, -8, 0 }, |
| 570 | 0x1E70F5FF, | 587 | { -2, 30, 112, -11, -1 }, |
| 571 | 0x335FF5FE, | 588 | { -5, 51, 95, -11, -2 }, |
| 572 | 0xF74949F7, | 589 | { 0, -9, 73, 73, -9 }, |
| 573 | 0xF55F33FB, | 590 | { -2, -11, 95, 51, -5 }, |
| 574 | 0xF5701EFE, | 591 | { -1, -11, 112, 30, -2 }, |
| 575 | 0xF87C0DFF, | 592 | { 0, -8, 124, 13, -1 }, |
| 576 | }; | 593 | }; |
| 577 | 594 | ||
| 578 | /* Coefficients for horizontal down-sampling */ | 595 | /* Coefficients for vertical up-sampling */ |
| 579 | static const u32 coef_hdown[8] = { | 596 | static const struct dispc_v_coef coef_vup_3tap[8] = { |
| 580 | 0x24382400, | 597 | { 0, 0, 128, 0, 0 }, |
| 581 | 0x28371FFE, | 598 | { 0, 3, 123, 2, 0 }, |
| 582 | 0x2C361BFB, | 599 | { 0, 12, 111, 5, 0 }, |
| 583 | 0x303516F9, | 600 | { 0, 32, 89, 7, 0 }, |
| 584 | 0x11343311, | 601 | { 0, 0, 64, 64, 0 }, |
| 585 | 0x1635300C, | 602 | { 0, 7, 89, 32, 0 }, |
| 586 | 0x1B362C08, | 603 | { 0, 5, 111, 12, 0 }, |
| 587 | 0x1F372804, | 604 | { 0, 2, 123, 3, 0 }, |
| 588 | }; | 605 | }; |
| 589 | 606 | ||
| 590 | /* Coefficients for horizontal and vertical up-sampling */ | 607 | static const struct dispc_v_coef coef_vup_5tap[8] = { |
| 591 | static const u32 coef_hvup[2][8] = { | 608 | { 0, 0, 128, 0, 0 }, |
| 592 | { | 609 | { -1, 13, 124, -8, 0 }, |
| 593 | 0x00800000, | 610 | { -2, 30, 112, -11, -1 }, |
| 594 | 0x037B02FF, | 611 | { -5, 51, 95, -11, -2 }, |
| 595 | 0x0C6F05FE, | 612 | { 0, -9, 73, 73, -9 }, |
| 596 | 0x205907FB, | 613 | { -2, -11, 95, 51, -5 }, |
| 597 | 0x00404000, | 614 | { -1, -11, 112, 30, -2 }, |
| 598 | 0x075920FE, | 615 | { 0, -8, 124, 13, -1 }, |
| 599 | 0x056F0CFF, | ||
| 600 | 0x027B0300, | ||
| 601 | }, | ||
| 602 | { | ||
| 603 | 0x00800000, | ||
| 604 | 0x0D7CF8FF, | ||
| 605 | 0x1E70F5FE, | ||
| 606 | 0x335FF5FB, | ||
| 607 | 0xF7404000, | ||
| 608 | 0xF55F33FE, | ||
| 609 | 0xF5701EFF, | ||
| 610 | 0xF87C0D00, | ||
| 611 | }, | ||
| 612 | }; | 616 | }; |
| 613 | 617 | ||
| 614 | /* Coefficients for horizontal and vertical down-sampling */ | 618 | /* Coefficients for horizontal down-sampling */ |
| 615 | static const u32 coef_hvdown[2][8] = { | 619 | static const struct dispc_h_coef coef_hdown[8] = { |
| 616 | { | 620 | { 0, 36, 56, 36, 0 }, |
| 617 | 0x24382400, | 621 | { 4, 40, 55, 31, -2 }, |
| 618 | 0x28391F04, | 622 | { 8, 44, 54, 27, -5 }, |
| 619 | 0x2D381B08, | 623 | { 12, 48, 53, 22, -7 }, |
| 620 | 0x3237170C, | 624 | { -9, 17, 52, 51, 17 }, |
| 621 | 0x123737F7, | 625 | { -7, 22, 53, 48, 12 }, |
| 622 | 0x173732F9, | 626 | { -5, 27, 54, 44, 8 }, |
| 623 | 0x1B382DFB, | 627 | { -2, 31, 55, 40, 4 }, |
| 624 | 0x1F3928FE, | ||
| 625 | }, | ||
| 626 | { | ||
| 627 | 0x24382400, | ||
| 628 | 0x28371F04, | ||
| 629 | 0x2C361B08, | ||
| 630 | 0x3035160C, | ||
| 631 | 0x113433F7, | ||
| 632 | 0x163530F9, | ||
| 633 | 0x1B362CFB, | ||
| 634 | 0x1F3728FE, | ||
| 635 | }, | ||
| 636 | }; | 628 | }; |
| 637 | 629 | ||
| 638 | /* Coefficients for vertical up-sampling */ | 630 | /* Coefficients for vertical down-sampling */ |
| 639 | static const u32 coef_vup[8] = { | 631 | static const struct dispc_v_coef coef_vdown_3tap[8] = { |
| 640 | 0x00000000, | 632 | { 0, 36, 56, 36, 0 }, |
| 641 | 0x0000FF00, | 633 | { 0, 40, 57, 31, 0 }, |
| 642 | 0x0000FEFF, | 634 | { 0, 45, 56, 27, 0 }, |
| 643 | 0x0000FBFE, | 635 | { 0, 50, 55, 23, 0 }, |
| 644 | 0x000000F7, | 636 | { 0, 18, 55, 55, 0 }, |
| 645 | 0x0000FEFB, | 637 | { 0, 23, 55, 50, 0 }, |
| 646 | 0x0000FFFE, | 638 | { 0, 27, 56, 45, 0 }, |
| 647 | 0x000000FF, | 639 | { 0, 31, 57, 40, 0 }, |
| 648 | }; | 640 | }; |
| 649 | 641 | ||
| 650 | 642 | static const struct dispc_v_coef coef_vdown_5tap[8] = { | |
| 651 | /* Coefficients for vertical down-sampling */ | 643 | { 0, 36, 56, 36, 0 }, |
| 652 | static const u32 coef_vdown[8] = { | 644 | { 4, 40, 55, 31, -2 }, |
| 653 | 0x00000000, | 645 | { 8, 44, 54, 27, -5 }, |
| 654 | 0x000004FE, | 646 | { 12, 48, 53, 22, -7 }, |
| 655 | 0x000008FB, | 647 | { -9, 17, 52, 51, 17 }, |
| 656 | 0x00000CF9, | 648 | { -7, 22, 53, 48, 12 }, |
| 657 | 0x0000F711, | 649 | { -5, 27, 54, 44, 8 }, |
| 658 | 0x0000F90C, | 650 | { -2, 31, 55, 40, 4 }, |
| 659 | 0x0000FB08, | ||
| 660 | 0x0000FE04, | ||
| 661 | }; | 651 | }; |
| 662 | 652 | ||
| 663 | const u32 *h_coef; | 653 | const struct dispc_h_coef *h_coef; |
| 664 | const u32 *hv_coef; | 654 | const struct dispc_v_coef *v_coef; |
| 665 | const u32 *hv_coef_mod; | ||
| 666 | const u32 *v_coef; | ||
| 667 | int i; | 655 | int i; |
| 668 | 656 | ||
| 669 | if (hscaleup) | 657 | if (hscaleup) |
| @@ -671,47 +659,34 @@ static void _dispc_set_scale_coef(enum omap_plane plane, int hscaleup, | |||
| 671 | else | 659 | else |
| 672 | h_coef = coef_hdown; | 660 | h_coef = coef_hdown; |
| 673 | 661 | ||
| 674 | if (vscaleup) { | 662 | if (vscaleup) |
| 675 | hv_coef = coef_hvup[five_taps]; | 663 | v_coef = five_taps ? coef_vup_5tap : coef_vup_3tap; |
| 676 | v_coef = coef_vup; | 664 | else |
| 677 | 665 | v_coef = five_taps ? coef_vdown_5tap : coef_vdown_3tap; | |
| 678 | if (hscaleup) | ||
| 679 | hv_coef_mod = NULL; | ||
| 680 | else | ||
| 681 | hv_coef_mod = coef_hvdown[five_taps]; | ||
| 682 | } else { | ||
| 683 | hv_coef = coef_hvdown[five_taps]; | ||
| 684 | v_coef = coef_vdown; | ||
| 685 | |||
| 686 | if (hscaleup) | ||
| 687 | hv_coef_mod = coef_hvup[five_taps]; | ||
| 688 | else | ||
| 689 | hv_coef_mod = NULL; | ||
| 690 | } | ||
| 691 | 666 | ||
| 692 | for (i = 0; i < 8; i++) { | 667 | for (i = 0; i < 8; i++) { |
| 693 | u32 h, hv; | 668 | u32 h, hv; |
| 694 | 669 | ||
| 695 | h = h_coef[i]; | 670 | h = FLD_VAL(h_coef[i].hc0, 7, 0) |
| 696 | 671 | | FLD_VAL(h_coef[i].hc1, 15, 8) | |
| 697 | hv = hv_coef[i]; | 672 | | FLD_VAL(h_coef[i].hc2, 23, 16) |
| 698 | 673 | | FLD_VAL(h_coef[i].hc3, 31, 24); | |
| 699 | if (hv_coef_mod) { | 674 | hv = FLD_VAL(h_coef[i].hc4, 7, 0) |
| 700 | hv &= 0xffffff00; | 675 | | FLD_VAL(v_coef[i].vc0, 15, 8) |
| 701 | hv |= (hv_coef_mod[i] & 0xff); | 676 | | FLD_VAL(v_coef[i].vc1, 23, 16) |
| 702 | } | 677 | | FLD_VAL(v_coef[i].vc2, 31, 24); |
| 703 | 678 | ||
| 704 | _dispc_write_firh_reg(plane, i, h); | 679 | _dispc_write_firh_reg(plane, i, h); |
| 705 | _dispc_write_firhv_reg(plane, i, hv); | 680 | _dispc_write_firhv_reg(plane, i, hv); |
| 706 | } | 681 | } |
| 707 | 682 | ||
| 708 | if (!five_taps) | 683 | if (five_taps) { |
| 709 | return; | 684 | for (i = 0; i < 8; i++) { |
| 710 | 685 | u32 v; | |
| 711 | for (i = 0; i < 8; i++) { | 686 | v = FLD_VAL(v_coef[i].vc00, 7, 0) |
| 712 | u32 v; | 687 | | FLD_VAL(v_coef[i].vc22, 15, 8); |
| 713 | v = v_coef[i]; | 688 | _dispc_write_firv_reg(plane, i, v); |
| 714 | _dispc_write_firv_reg(plane, i, v); | 689 | } |
| 715 | } | 690 | } |
| 716 | } | 691 | } |
| 717 | 692 | ||
| @@ -800,12 +775,12 @@ static void _dispc_set_vid_size(enum omap_plane plane, int width, int height) | |||
| 800 | 775 | ||
| 801 | static void _dispc_setup_global_alpha(enum omap_plane plane, u8 global_alpha) | 776 | static void _dispc_setup_global_alpha(enum omap_plane plane, u8 global_alpha) |
| 802 | { | 777 | { |
| 803 | 778 | if (!dss_has_feature(FEAT_GLOBAL_ALPHA)) | |
| 804 | BUG_ON(plane == OMAP_DSS_VIDEO1); | ||
| 805 | |||
| 806 | if (cpu_is_omap24xx()) | ||
| 807 | return; | 779 | return; |
| 808 | 780 | ||
| 781 | BUG_ON(!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) && | ||
| 782 | plane == OMAP_DSS_VIDEO1); | ||
| 783 | |||
| 809 | if (plane == OMAP_DSS_GFX) | 784 | if (plane == OMAP_DSS_GFX) |
| 810 | REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, 7, 0); | 785 | REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, 7, 0); |
| 811 | else if (plane == OMAP_DSS_VIDEO2) | 786 | else if (plane == OMAP_DSS_VIDEO2) |
| @@ -975,17 +950,14 @@ static void dispc_read_plane_fifo_sizes(void) | |||
| 975 | DISPC_VID_FIFO_SIZE_STATUS(1) }; | 950 | DISPC_VID_FIFO_SIZE_STATUS(1) }; |
| 976 | u32 size; | 951 | u32 size; |
| 977 | int plane; | 952 | int plane; |
| 953 | u8 start, end; | ||
| 978 | 954 | ||
| 979 | enable_clocks(1); | 955 | enable_clocks(1); |
| 980 | 956 | ||
| 981 | for (plane = 0; plane < ARRAY_SIZE(dispc.fifo_size); ++plane) { | 957 | dss_feat_get_reg_field(FEAT_REG_FIFOSIZE, &start, &end); |
| 982 | if (cpu_is_omap24xx()) | ||
| 983 | size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 8, 0); | ||
| 984 | else if (cpu_is_omap34xx()) | ||
| 985 | size = FLD_GET(dispc_read_reg(fsz_reg[plane]), 10, 0); | ||
| 986 | else | ||
| 987 | BUG(); | ||
| 988 | 958 | ||
| 959 | for (plane = 0; plane < ARRAY_SIZE(dispc.fifo_size); ++plane) { | ||
| 960 | size = FLD_GET(dispc_read_reg(fsz_reg[plane]), start, end); | ||
| 989 | dispc.fifo_size[plane] = size; | 961 | dispc.fifo_size[plane] = size; |
| 990 | } | 962 | } |
| 991 | 963 | ||
| @@ -1002,6 +974,8 @@ void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high) | |||
| 1002 | const struct dispc_reg ftrs_reg[] = { DISPC_GFX_FIFO_THRESHOLD, | 974 | const struct dispc_reg ftrs_reg[] = { DISPC_GFX_FIFO_THRESHOLD, |
| 1003 | DISPC_VID_FIFO_THRESHOLD(0), | 975 | DISPC_VID_FIFO_THRESHOLD(0), |
| 1004 | DISPC_VID_FIFO_THRESHOLD(1) }; | 976 | DISPC_VID_FIFO_THRESHOLD(1) }; |
| 977 | u8 hi_start, hi_end, lo_start, lo_end; | ||
| 978 | |||
| 1005 | enable_clocks(1); | 979 | enable_clocks(1); |
| 1006 | 980 | ||
| 1007 | DSSDBG("fifo(%d) low/high old %u/%u, new %u/%u\n", | 981 | DSSDBG("fifo(%d) low/high old %u/%u, new %u/%u\n", |
| @@ -1010,12 +984,12 @@ void dispc_setup_plane_fifo(enum omap_plane plane, u32 low, u32 high) | |||
| 1010 | REG_GET(ftrs_reg[plane], 27, 16), | 984 | REG_GET(ftrs_reg[plane], 27, 16), |
| 1011 | low, high); | 985 | low, high); |
| 1012 | 986 | ||
| 1013 | if (cpu_is_omap24xx()) | 987 | dss_feat_get_reg_field(FEAT_REG_FIFOHIGHTHRESHOLD, &hi_start, &hi_end); |
| 1014 | dispc_write_reg(ftrs_reg[plane], | 988 | dss_feat_get_reg_field(FEAT_REG_FIFOLOWTHRESHOLD, &lo_start, &lo_end); |
| 1015 | FLD_VAL(high, 24, 16) | FLD_VAL(low, 8, 0)); | 989 | |
| 1016 | else | 990 | dispc_write_reg(ftrs_reg[plane], |
| 1017 | dispc_write_reg(ftrs_reg[plane], | 991 | FLD_VAL(high, hi_start, hi_end) | |
| 1018 | FLD_VAL(high, 27, 16) | FLD_VAL(low, 11, 0)); | 992 | FLD_VAL(low, lo_start, lo_end)); |
| 1019 | 993 | ||
| 1020 | enable_clocks(0); | 994 | enable_clocks(0); |
| 1021 | } | 995 | } |
| @@ -1035,13 +1009,16 @@ static void _dispc_set_fir(enum omap_plane plane, int hinc, int vinc) | |||
| 1035 | u32 val; | 1009 | u32 val; |
| 1036 | const struct dispc_reg fir_reg[] = { DISPC_VID_FIR(0), | 1010 | const struct dispc_reg fir_reg[] = { DISPC_VID_FIR(0), |
| 1037 | DISPC_VID_FIR(1) }; | 1011 | DISPC_VID_FIR(1) }; |
| 1012 | u8 hinc_start, hinc_end, vinc_start, vinc_end; | ||
| 1038 | 1013 | ||
| 1039 | BUG_ON(plane == OMAP_DSS_GFX); | 1014 | BUG_ON(plane == OMAP_DSS_GFX); |
| 1040 | 1015 | ||
| 1041 | if (cpu_is_omap24xx()) | 1016 | dss_feat_get_reg_field(FEAT_REG_FIRHINC, &hinc_start, &hinc_end); |
| 1042 | val = FLD_VAL(vinc, 27, 16) | FLD_VAL(hinc, 11, 0); | 1017 | dss_feat_get_reg_field(FEAT_REG_FIRVINC, &vinc_start, &vinc_end); |
| 1043 | else | 1018 | |
| 1044 | val = FLD_VAL(vinc, 28, 16) | FLD_VAL(hinc, 12, 0); | 1019 | val = FLD_VAL(vinc, vinc_start, vinc_end) | |
| 1020 | FLD_VAL(hinc, hinc_start, hinc_end); | ||
| 1021 | |||
| 1045 | dispc_write_reg(fir_reg[plane-1], val); | 1022 | dispc_write_reg(fir_reg[plane-1], val); |
| 1046 | } | 1023 | } |
| 1047 | 1024 | ||
| @@ -1567,6 +1544,8 @@ static int _dispc_setup_plane(enum omap_plane plane, | |||
| 1567 | case OMAP_DSS_COLOR_ARGB16: | 1544 | case OMAP_DSS_COLOR_ARGB16: |
| 1568 | case OMAP_DSS_COLOR_ARGB32: | 1545 | case OMAP_DSS_COLOR_ARGB32: |
| 1569 | case OMAP_DSS_COLOR_RGBA32: | 1546 | case OMAP_DSS_COLOR_RGBA32: |
| 1547 | if (!dss_has_feature(FEAT_GLOBAL_ALPHA)) | ||
| 1548 | return -EINVAL; | ||
| 1570 | case OMAP_DSS_COLOR_RGBX32: | 1549 | case OMAP_DSS_COLOR_RGBX32: |
| 1571 | if (cpu_is_omap24xx()) | 1550 | if (cpu_is_omap24xx()) |
| 1572 | return -EINVAL; | 1551 | return -EINVAL; |
| @@ -1607,9 +1586,10 @@ static int _dispc_setup_plane(enum omap_plane plane, | |||
| 1607 | case OMAP_DSS_COLOR_ARGB16: | 1586 | case OMAP_DSS_COLOR_ARGB16: |
| 1608 | case OMAP_DSS_COLOR_ARGB32: | 1587 | case OMAP_DSS_COLOR_ARGB32: |
| 1609 | case OMAP_DSS_COLOR_RGBA32: | 1588 | case OMAP_DSS_COLOR_RGBA32: |
| 1610 | if (cpu_is_omap24xx()) | 1589 | if (!dss_has_feature(FEAT_GLOBAL_ALPHA)) |
| 1611 | return -EINVAL; | 1590 | return -EINVAL; |
| 1612 | if (plane == OMAP_DSS_VIDEO1) | 1591 | if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) && |
| 1592 | plane == OMAP_DSS_VIDEO1) | ||
| 1613 | return -EINVAL; | 1593 | return -EINVAL; |
| 1614 | break; | 1594 | break; |
| 1615 | 1595 | ||
| @@ -2002,7 +1982,7 @@ void dispc_enable_trans_key(enum omap_channel ch, bool enable) | |||
| 2002 | } | 1982 | } |
| 2003 | void dispc_enable_alpha_blending(enum omap_channel ch, bool enable) | 1983 | void dispc_enable_alpha_blending(enum omap_channel ch, bool enable) |
| 2004 | { | 1984 | { |
| 2005 | if (cpu_is_omap24xx()) | 1985 | if (!dss_has_feature(FEAT_GLOBAL_ALPHA)) |
| 2006 | return; | 1986 | return; |
| 2007 | 1987 | ||
| 2008 | enable_clocks(1); | 1988 | enable_clocks(1); |
| @@ -2016,7 +1996,7 @@ bool dispc_alpha_blending_enabled(enum omap_channel ch) | |||
| 2016 | { | 1996 | { |
| 2017 | bool enabled; | 1997 | bool enabled; |
| 2018 | 1998 | ||
| 2019 | if (cpu_is_omap24xx()) | 1999 | if (!dss_has_feature(FEAT_GLOBAL_ALPHA)) |
| 2020 | return false; | 2000 | return false; |
| 2021 | 2001 | ||
| 2022 | enable_clocks(1); | 2002 | enable_clocks(1); |
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c index b3fa3a7db911..aa4f7a5fae29 100644 --- a/drivers/video/omap2/dss/dsi.c +++ b/drivers/video/omap2/dss/dsi.c | |||
| @@ -3274,7 +3274,6 @@ int dsi_init(struct platform_device *pdev) | |||
| 3274 | 3274 | ||
| 3275 | dsi.vdds_dsi_reg = dss_get_vdds_dsi(); | 3275 | dsi.vdds_dsi_reg = dss_get_vdds_dsi(); |
| 3276 | if (IS_ERR(dsi.vdds_dsi_reg)) { | 3276 | if (IS_ERR(dsi.vdds_dsi_reg)) { |
| 3277 | iounmap(dsi.base); | ||
| 3278 | DSSERR("can't get VDDS_DSI regulator\n"); | 3277 | DSSERR("can't get VDDS_DSI regulator\n"); |
| 3279 | r = PTR_ERR(dsi.vdds_dsi_reg); | 3278 | r = PTR_ERR(dsi.vdds_dsi_reg); |
| 3280 | goto err2; | 3279 | goto err2; |
diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c new file mode 100644 index 000000000000..867f68de125f --- /dev/null +++ b/drivers/video/omap2/dss/dss_features.c | |||
| @@ -0,0 +1,191 @@ | |||
| 1 | /* | ||
| 2 | * linux/drivers/video/omap2/dss/dss_features.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Texas Instruments | ||
| 5 | * Author: Archit Taneja <archit@ti.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it | ||
| 8 | * under the terms of the GNU General Public License version 2 as published by | ||
| 9 | * the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 14 | * more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License along with | ||
| 17 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 18 | */ | ||
| 19 | |||
| 20 | #include <linux/kernel.h> | ||
| 21 | #include <linux/types.h> | ||
| 22 | #include <linux/err.h> | ||
| 23 | #include <linux/slab.h> | ||
| 24 | |||
| 25 | #include <plat/display.h> | ||
| 26 | #include <plat/cpu.h> | ||
| 27 | |||
| 28 | #include "dss_features.h" | ||
| 29 | |||
| 30 | /* Defines a generic omap register field */ | ||
| 31 | struct dss_reg_field { | ||
| 32 | enum dss_feat_reg_field id; | ||
| 33 | u8 start, end; | ||
| 34 | }; | ||
| 35 | |||
| 36 | struct omap_dss_features { | ||
| 37 | const struct dss_reg_field *reg_fields; | ||
| 38 | const int num_reg_fields; | ||
| 39 | |||
| 40 | const u32 has_feature; | ||
| 41 | |||
| 42 | const int num_mgrs; | ||
| 43 | const int num_ovls; | ||
| 44 | const enum omap_display_type *supported_displays; | ||
| 45 | const enum omap_color_mode *supported_color_modes; | ||
| 46 | }; | ||
| 47 | |||
| 48 | /* This struct is assigned to one of the below during initialization */ | ||
| 49 | static struct omap_dss_features *omap_current_dss_features; | ||
| 50 | |||
| 51 | static const struct dss_reg_field omap2_dss_reg_fields[] = { | ||
| 52 | { FEAT_REG_FIRHINC, 11, 0 }, | ||
| 53 | { FEAT_REG_FIRVINC, 27, 16 }, | ||
| 54 | { FEAT_REG_FIFOLOWTHRESHOLD, 8, 0 }, | ||
| 55 | { FEAT_REG_FIFOHIGHTHRESHOLD, 24, 16 }, | ||
| 56 | { FEAT_REG_FIFOSIZE, 8, 0 }, | ||
| 57 | }; | ||
| 58 | |||
| 59 | static const struct dss_reg_field omap3_dss_reg_fields[] = { | ||
| 60 | { FEAT_REG_FIRHINC, 12, 0 }, | ||
| 61 | { FEAT_REG_FIRVINC, 28, 16 }, | ||
| 62 | { FEAT_REG_FIFOLOWTHRESHOLD, 11, 0 }, | ||
| 63 | { FEAT_REG_FIFOHIGHTHRESHOLD, 27, 16 }, | ||
| 64 | { FEAT_REG_FIFOSIZE, 10, 0 }, | ||
| 65 | }; | ||
| 66 | |||
| 67 | static const enum omap_display_type omap2_dss_supported_displays[] = { | ||
| 68 | /* OMAP_DSS_CHANNEL_LCD */ | ||
| 69 | OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI | | ||
| 70 | OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI, | ||
| 71 | |||
| 72 | /* OMAP_DSS_CHANNEL_DIGIT */ | ||
| 73 | OMAP_DISPLAY_TYPE_VENC, | ||
| 74 | }; | ||
| 75 | |||
| 76 | static const enum omap_display_type omap3_dss_supported_displays[] = { | ||
| 77 | /* OMAP_DSS_CHANNEL_LCD */ | ||
| 78 | OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI | | ||
| 79 | OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI, | ||
| 80 | |||
| 81 | /* OMAP_DSS_CHANNEL_DIGIT */ | ||
| 82 | OMAP_DISPLAY_TYPE_VENC, | ||
| 83 | }; | ||
| 84 | |||
| 85 | static const enum omap_color_mode omap2_dss_supported_color_modes[] = { | ||
| 86 | /* OMAP_DSS_GFX */ | ||
| 87 | OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | | ||
| 88 | OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | | ||
| 89 | OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 | | ||
| 90 | OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P, | ||
| 91 | |||
| 92 | /* OMAP_DSS_VIDEO1 */ | ||
| 93 | OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | | ||
| 94 | OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 | | ||
| 95 | OMAP_DSS_COLOR_UYVY, | ||
| 96 | |||
| 97 | /* OMAP_DSS_VIDEO2 */ | ||
| 98 | OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | | ||
| 99 | OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 | | ||
| 100 | OMAP_DSS_COLOR_UYVY, | ||
| 101 | }; | ||
| 102 | |||
| 103 | static const enum omap_color_mode omap3_dss_supported_color_modes[] = { | ||
| 104 | /* OMAP_DSS_GFX */ | ||
| 105 | OMAP_DSS_COLOR_CLUT1 | OMAP_DSS_COLOR_CLUT2 | | ||
| 106 | OMAP_DSS_COLOR_CLUT4 | OMAP_DSS_COLOR_CLUT8 | | ||
| 107 | OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | | ||
| 108 | OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | | ||
| 109 | OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_ARGB32 | | ||
| 110 | OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, | ||
| 111 | |||
| 112 | /* OMAP_DSS_VIDEO1 */ | ||
| 113 | OMAP_DSS_COLOR_RGB24U | OMAP_DSS_COLOR_RGB24P | | ||
| 114 | OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_RGB16 | | ||
| 115 | OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_UYVY, | ||
| 116 | |||
| 117 | /* OMAP_DSS_VIDEO2 */ | ||
| 118 | OMAP_DSS_COLOR_RGB12U | OMAP_DSS_COLOR_ARGB16 | | ||
| 119 | OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB24U | | ||
| 120 | OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_YUV2 | | ||
| 121 | OMAP_DSS_COLOR_UYVY | OMAP_DSS_COLOR_ARGB32 | | ||
| 122 | OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_RGBX32, | ||
| 123 | }; | ||
| 124 | |||
| 125 | /* OMAP2 DSS Features */ | ||
| 126 | static struct omap_dss_features omap2_dss_features = { | ||
| 127 | .reg_fields = omap2_dss_reg_fields, | ||
| 128 | .num_reg_fields = ARRAY_SIZE(omap2_dss_reg_fields), | ||
| 129 | |||
| 130 | .num_mgrs = 2, | ||
| 131 | .num_ovls = 3, | ||
| 132 | .supported_displays = omap2_dss_supported_displays, | ||
| 133 | .supported_color_modes = omap2_dss_supported_color_modes, | ||
| 134 | }; | ||
| 135 | |||
| 136 | /* OMAP3 DSS Features */ | ||
| 137 | static struct omap_dss_features omap3_dss_features = { | ||
| 138 | .reg_fields = omap3_dss_reg_fields, | ||
| 139 | .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields), | ||
| 140 | |||
| 141 | .has_feature = FEAT_GLOBAL_ALPHA, | ||
| 142 | |||
| 143 | .num_mgrs = 2, | ||
| 144 | .num_ovls = 3, | ||
| 145 | .supported_displays = omap3_dss_supported_displays, | ||
| 146 | .supported_color_modes = omap3_dss_supported_color_modes, | ||
| 147 | }; | ||
| 148 | |||
| 149 | /* Functions returning values related to a DSS feature */ | ||
| 150 | int dss_feat_get_num_mgrs(void) | ||
| 151 | { | ||
| 152 | return omap_current_dss_features->num_mgrs; | ||
| 153 | } | ||
| 154 | |||
| 155 | int dss_feat_get_num_ovls(void) | ||
| 156 | { | ||
| 157 | return omap_current_dss_features->num_ovls; | ||
| 158 | } | ||
| 159 | |||
| 160 | enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel) | ||
| 161 | { | ||
| 162 | return omap_current_dss_features->supported_displays[channel]; | ||
| 163 | } | ||
| 164 | |||
| 165 | enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane) | ||
| 166 | { | ||
| 167 | return omap_current_dss_features->supported_color_modes[plane]; | ||
| 168 | } | ||
| 169 | |||
| 170 | /* DSS has_feature check */ | ||
| 171 | bool dss_has_feature(enum dss_feat_id id) | ||
| 172 | { | ||
| 173 | return omap_current_dss_features->has_feature & id; | ||
| 174 | } | ||
| 175 | |||
| 176 | void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end) | ||
| 177 | { | ||
| 178 | if (id >= omap_current_dss_features->num_reg_fields) | ||
| 179 | BUG(); | ||
| 180 | |||
| 181 | *start = omap_current_dss_features->reg_fields[id].start; | ||
| 182 | *end = omap_current_dss_features->reg_fields[id].end; | ||
| 183 | } | ||
| 184 | |||
| 185 | void dss_features_init(void) | ||
| 186 | { | ||
| 187 | if (cpu_is_omap24xx()) | ||
| 188 | omap_current_dss_features = &omap2_dss_features; | ||
| 189 | else | ||
| 190 | omap_current_dss_features = &omap3_dss_features; | ||
| 191 | } | ||
diff --git a/drivers/video/omap2/dss/dss_features.h b/drivers/video/omap2/dss/dss_features.h new file mode 100644 index 000000000000..cb231eaa9b31 --- /dev/null +++ b/drivers/video/omap2/dss/dss_features.h | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | /* | ||
| 2 | * linux/drivers/video/omap2/dss/dss_features.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Texas Instruments | ||
| 5 | * Author: Archit Taneja <archit@ti.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify it | ||
| 8 | * under the terms of the GNU General Public License version 2 as published by | ||
| 9 | * the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, but WITHOUT | ||
| 12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| 13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 14 | * more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License along with | ||
| 17 | * this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 18 | */ | ||
| 19 | |||
| 20 | #ifndef __OMAP2_DSS_FEATURES_H | ||
| 21 | #define __OMAP2_DSS_FEATURES_H | ||
| 22 | |||
| 23 | #define MAX_DSS_MANAGERS 2 | ||
| 24 | #define MAX_DSS_OVERLAYS 3 | ||
| 25 | |||
| 26 | /* DSS has feature id */ | ||
| 27 | enum dss_feat_id { | ||
| 28 | FEAT_GLOBAL_ALPHA = 1 << 0, | ||
| 29 | FEAT_GLOBAL_ALPHA_VID1 = 1 << 1, | ||
| 30 | }; | ||
| 31 | |||
| 32 | /* DSS register field id */ | ||
| 33 | enum dss_feat_reg_field { | ||
| 34 | FEAT_REG_FIRHINC, | ||
| 35 | FEAT_REG_FIRVINC, | ||
| 36 | FEAT_REG_FIFOHIGHTHRESHOLD, | ||
| 37 | FEAT_REG_FIFOLOWTHRESHOLD, | ||
| 38 | FEAT_REG_FIFOSIZE, | ||
| 39 | }; | ||
| 40 | |||
| 41 | /* DSS Feature Functions */ | ||
| 42 | int dss_feat_get_num_mgrs(void); | ||
| 43 | int dss_feat_get_num_ovls(void); | ||
| 44 | enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel); | ||
| 45 | enum omap_color_mode dss_feat_get_supported_color_modes(enum omap_plane plane); | ||
| 46 | |||
| 47 | bool dss_has_feature(enum dss_feat_id id); | ||
| 48 | void dss_feat_get_reg_field(enum dss_feat_reg_field id, u8 *start, u8 *end); | ||
| 49 | void dss_features_init(void); | ||
| 50 | #endif | ||
diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c index 6a649ab5539e..545e9b9a4d92 100644 --- a/drivers/video/omap2/dss/manager.c +++ b/drivers/video/omap2/dss/manager.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <plat/cpu.h> | 33 | #include <plat/cpu.h> |
| 34 | 34 | ||
| 35 | #include "dss.h" | 35 | #include "dss.h" |
| 36 | #include "dss_features.h" | ||
| 36 | 37 | ||
| 37 | static int num_managers; | 38 | static int num_managers; |
| 38 | static struct list_head manager_list; | 39 | static struct list_head manager_list; |
| @@ -448,8 +449,8 @@ struct manager_cache_data { | |||
| 448 | 449 | ||
| 449 | static struct { | 450 | static struct { |
| 450 | spinlock_t lock; | 451 | spinlock_t lock; |
| 451 | struct overlay_cache_data overlay_cache[3]; | 452 | struct overlay_cache_data overlay_cache[MAX_DSS_OVERLAYS]; |
| 452 | struct manager_cache_data manager_cache[2]; | 453 | struct manager_cache_data manager_cache[MAX_DSS_MANAGERS]; |
| 453 | 454 | ||
| 454 | bool irq_enabled; | 455 | bool irq_enabled; |
| 455 | } dss_cache; | 456 | } dss_cache; |
| @@ -882,12 +883,12 @@ static int configure_dispc(void) | |||
| 882 | { | 883 | { |
| 883 | struct overlay_cache_data *oc; | 884 | struct overlay_cache_data *oc; |
| 884 | struct manager_cache_data *mc; | 885 | struct manager_cache_data *mc; |
| 885 | const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache); | 886 | const int num_ovls = dss_feat_get_num_ovls(); |
| 886 | const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache); | 887 | const int num_mgrs = dss_feat_get_num_mgrs(); |
| 887 | int i; | 888 | int i; |
| 888 | int r; | 889 | int r; |
| 889 | bool mgr_busy[2]; | 890 | bool mgr_busy[MAX_DSS_MANAGERS]; |
| 890 | bool mgr_go[2]; | 891 | bool mgr_go[MAX_DSS_MANAGERS]; |
| 891 | bool busy; | 892 | bool busy; |
| 892 | 893 | ||
| 893 | r = 0; | 894 | r = 0; |
| @@ -989,7 +990,7 @@ void dss_setup_partial_planes(struct omap_dss_device *dssdev, | |||
| 989 | { | 990 | { |
| 990 | struct overlay_cache_data *oc; | 991 | struct overlay_cache_data *oc; |
| 991 | struct manager_cache_data *mc; | 992 | struct manager_cache_data *mc; |
| 992 | const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache); | 993 | const int num_ovls = dss_feat_get_num_ovls(); |
| 993 | struct omap_overlay_manager *mgr; | 994 | struct omap_overlay_manager *mgr; |
| 994 | int i; | 995 | int i; |
| 995 | u16 x, y, w, h; | 996 | u16 x, y, w, h; |
| @@ -1121,8 +1122,8 @@ void dss_start_update(struct omap_dss_device *dssdev) | |||
| 1121 | { | 1122 | { |
| 1122 | struct manager_cache_data *mc; | 1123 | struct manager_cache_data *mc; |
| 1123 | struct overlay_cache_data *oc; | 1124 | struct overlay_cache_data *oc; |
| 1124 | const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache); | 1125 | const int num_ovls = dss_feat_get_num_ovls(); |
| 1125 | const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache); | 1126 | const int num_mgrs = dss_feat_get_num_mgrs(); |
| 1126 | struct omap_overlay_manager *mgr; | 1127 | struct omap_overlay_manager *mgr; |
| 1127 | int i; | 1128 | int i; |
| 1128 | 1129 | ||
| @@ -1151,10 +1152,10 @@ static void dss_apply_irq_handler(void *data, u32 mask) | |||
| 1151 | { | 1152 | { |
| 1152 | struct manager_cache_data *mc; | 1153 | struct manager_cache_data *mc; |
| 1153 | struct overlay_cache_data *oc; | 1154 | struct overlay_cache_data *oc; |
| 1154 | const int num_ovls = ARRAY_SIZE(dss_cache.overlay_cache); | 1155 | const int num_ovls = dss_feat_get_num_ovls(); |
| 1155 | const int num_mgrs = ARRAY_SIZE(dss_cache.manager_cache); | 1156 | const int num_mgrs = dss_feat_get_num_mgrs(); |
| 1156 | int i, r; | 1157 | int i, r; |
| 1157 | bool mgr_busy[2]; | 1158 | bool mgr_busy[MAX_DSS_MANAGERS]; |
| 1158 | 1159 | ||
| 1159 | mgr_busy[0] = dispc_go_busy(0); | 1160 | mgr_busy[0] = dispc_go_busy(0); |
| 1160 | mgr_busy[1] = dispc_go_busy(1); | 1161 | mgr_busy[1] = dispc_go_busy(1); |
| @@ -1461,7 +1462,7 @@ int dss_init_overlay_managers(struct platform_device *pdev) | |||
| 1461 | 1462 | ||
| 1462 | num_managers = 0; | 1463 | num_managers = 0; |
| 1463 | 1464 | ||
| 1464 | for (i = 0; i < 2; ++i) { | 1465 | for (i = 0; i < dss_feat_get_num_mgrs(); ++i) { |
| 1465 | struct omap_overlay_manager *mgr; | 1466 | struct omap_overlay_manager *mgr; |
| 1466 | mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); | 1467 | mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); |
| 1467 | 1468 | ||
| @@ -1471,14 +1472,10 @@ int dss_init_overlay_managers(struct platform_device *pdev) | |||
| 1471 | case 0: | 1472 | case 0: |
| 1472 | mgr->name = "lcd"; | 1473 | mgr->name = "lcd"; |
| 1473 | mgr->id = OMAP_DSS_CHANNEL_LCD; | 1474 | mgr->id = OMAP_DSS_CHANNEL_LCD; |
| 1474 | mgr->supported_displays = | ||
| 1475 | OMAP_DISPLAY_TYPE_DPI | OMAP_DISPLAY_TYPE_DBI | | ||
| 1476 | OMAP_DISPLAY_TYPE_SDI | OMAP_DISPLAY_TYPE_DSI; | ||
| 1477 | break; | 1475 | break; |
| 1478 | case 1: | 1476 | case 1: |
| 1479 | mgr->name = "tv"; | 1477 | mgr->name = "tv"; |
| 1480 | mgr->id = OMAP_DSS_CHANNEL_DIGIT; | 1478 | mgr->id = OMAP_DSS_CHANNEL_DIGIT; |
| 1481 | mgr->supported_displays = OMAP_DISPLAY_TYPE_VENC; | ||
| 1482 | break; | 1479 | break; |
| 1483 | } | 1480 | } |
| 1484 | 1481 | ||
| @@ -1494,6 +1491,8 @@ int dss_init_overlay_managers(struct platform_device *pdev) | |||
| 1494 | mgr->disable = &dss_mgr_disable; | 1491 | mgr->disable = &dss_mgr_disable; |
| 1495 | 1492 | ||
| 1496 | mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC; | 1493 | mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC; |
| 1494 | mgr->supported_displays = | ||
| 1495 | dss_feat_get_supported_displays(mgr->id); | ||
| 1497 | 1496 | ||
| 1498 | dss_overlay_setup_dispc_manager(mgr); | 1497 | dss_overlay_setup_dispc_manager(mgr); |
| 1499 | 1498 | ||
diff --git a/drivers/video/omap2/dss/overlay.c b/drivers/video/omap2/dss/overlay.c index 244dca81a399..75642c22cac7 100644 --- a/drivers/video/omap2/dss/overlay.c +++ b/drivers/video/omap2/dss/overlay.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <plat/cpu.h> | 35 | #include <plat/cpu.h> |
| 36 | 36 | ||
| 37 | #include "dss.h" | 37 | #include "dss.h" |
| 38 | #include "dss_features.h" | ||
| 38 | 39 | ||
| 39 | static int num_overlays; | 40 | static int num_overlays; |
| 40 | static struct list_head overlay_list; | 41 | static struct list_head overlay_list; |
| @@ -237,7 +238,8 @@ static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl, | |||
| 237 | /* Video1 plane does not support global alpha | 238 | /* Video1 plane does not support global alpha |
| 238 | * to always make it 255 completely opaque | 239 | * to always make it 255 completely opaque |
| 239 | */ | 240 | */ |
| 240 | if (ovl->id == OMAP_DSS_VIDEO1) | 241 | if (!dss_has_feature(FEAT_GLOBAL_ALPHA_VID1) && |
| 242 | ovl->id == OMAP_DSS_VIDEO1) | ||
| 241 | info.global_alpha = 255; | 243 | info.global_alpha = 255; |
| 242 | else | 244 | else |
| 243 | info.global_alpha = simple_strtoul(buf, NULL, 10); | 245 | info.global_alpha = simple_strtoul(buf, NULL, 10); |
| @@ -510,11 +512,11 @@ static void omap_dss_add_overlay(struct omap_overlay *overlay) | |||
| 510 | list_add_tail(&overlay->list, &overlay_list); | 512 | list_add_tail(&overlay->list, &overlay_list); |
| 511 | } | 513 | } |
| 512 | 514 | ||
| 513 | static struct omap_overlay *dispc_overlays[3]; | 515 | static struct omap_overlay *dispc_overlays[MAX_DSS_OVERLAYS]; |
| 514 | 516 | ||
| 515 | void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr) | 517 | void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr) |
| 516 | { | 518 | { |
| 517 | mgr->num_overlays = 3; | 519 | mgr->num_overlays = dss_feat_get_num_ovls(); |
| 518 | mgr->overlays = dispc_overlays; | 520 | mgr->overlays = dispc_overlays; |
| 519 | } | 521 | } |
| 520 | 522 | ||
| @@ -535,7 +537,7 @@ void dss_init_overlays(struct platform_device *pdev) | |||
| 535 | 537 | ||
| 536 | num_overlays = 0; | 538 | num_overlays = 0; |
| 537 | 539 | ||
| 538 | for (i = 0; i < 3; ++i) { | 540 | for (i = 0; i < dss_feat_get_num_ovls(); ++i) { |
| 539 | struct omap_overlay *ovl; | 541 | struct omap_overlay *ovl; |
| 540 | ovl = kzalloc(sizeof(*ovl), GFP_KERNEL); | 542 | ovl = kzalloc(sizeof(*ovl), GFP_KERNEL); |
| 541 | 543 | ||
| @@ -545,18 +547,12 @@ void dss_init_overlays(struct platform_device *pdev) | |||
| 545 | case 0: | 547 | case 0: |
| 546 | ovl->name = "gfx"; | 548 | ovl->name = "gfx"; |
| 547 | ovl->id = OMAP_DSS_GFX; | 549 | ovl->id = OMAP_DSS_GFX; |
| 548 | ovl->supported_modes = cpu_is_omap34xx() ? | ||
| 549 | OMAP_DSS_COLOR_GFX_OMAP3 : | ||
| 550 | OMAP_DSS_COLOR_GFX_OMAP2; | ||
| 551 | ovl->caps = OMAP_DSS_OVL_CAP_DISPC; | 550 | ovl->caps = OMAP_DSS_OVL_CAP_DISPC; |
| 552 | ovl->info.global_alpha = 255; | 551 | ovl->info.global_alpha = 255; |
| 553 | break; | 552 | break; |
| 554 | case 1: | 553 | case 1: |
| 555 | ovl->name = "vid1"; | 554 | ovl->name = "vid1"; |
| 556 | ovl->id = OMAP_DSS_VIDEO1; | 555 | ovl->id = OMAP_DSS_VIDEO1; |
| 557 | ovl->supported_modes = cpu_is_omap34xx() ? | ||
| 558 | OMAP_DSS_COLOR_VID1_OMAP3 : | ||
| 559 | OMAP_DSS_COLOR_VID_OMAP2; | ||
| 560 | ovl->caps = OMAP_DSS_OVL_CAP_SCALE | | 556 | ovl->caps = OMAP_DSS_OVL_CAP_SCALE | |
| 561 | OMAP_DSS_OVL_CAP_DISPC; | 557 | OMAP_DSS_OVL_CAP_DISPC; |
| 562 | ovl->info.global_alpha = 255; | 558 | ovl->info.global_alpha = 255; |
| @@ -564,9 +560,6 @@ void dss_init_overlays(struct platform_device *pdev) | |||
| 564 | case 2: | 560 | case 2: |
| 565 | ovl->name = "vid2"; | 561 | ovl->name = "vid2"; |
| 566 | ovl->id = OMAP_DSS_VIDEO2; | 562 | ovl->id = OMAP_DSS_VIDEO2; |
| 567 | ovl->supported_modes = cpu_is_omap34xx() ? | ||
| 568 | OMAP_DSS_COLOR_VID2_OMAP3 : | ||
| 569 | OMAP_DSS_COLOR_VID_OMAP2; | ||
| 570 | ovl->caps = OMAP_DSS_OVL_CAP_SCALE | | 563 | ovl->caps = OMAP_DSS_OVL_CAP_SCALE | |
| 571 | OMAP_DSS_OVL_CAP_DISPC; | 564 | OMAP_DSS_OVL_CAP_DISPC; |
| 572 | ovl->info.global_alpha = 255; | 565 | ovl->info.global_alpha = 255; |
| @@ -579,6 +572,9 @@ void dss_init_overlays(struct platform_device *pdev) | |||
| 579 | ovl->get_overlay_info = &dss_ovl_get_overlay_info; | 572 | ovl->get_overlay_info = &dss_ovl_get_overlay_info; |
| 580 | ovl->wait_for_go = &dss_ovl_wait_for_go; | 573 | ovl->wait_for_go = &dss_ovl_wait_for_go; |
| 581 | 574 | ||
| 575 | ovl->supported_modes = | ||
| 576 | dss_feat_get_supported_color_modes(ovl->id); | ||
| 577 | |||
| 582 | omap_dss_add_overlay(ovl); | 578 | omap_dss_add_overlay(ovl); |
| 583 | 579 | ||
| 584 | r = kobject_init_and_add(&ovl->kobj, &overlay_ktype, | 580 | r = kobject_init_and_add(&ovl->kobj, &overlay_ktype, |
| @@ -651,7 +647,7 @@ void dss_recheck_connections(struct omap_dss_device *dssdev, bool force) | |||
| 651 | } | 647 | } |
| 652 | 648 | ||
| 653 | if (mgr) { | 649 | if (mgr) { |
| 654 | for (i = 0; i < 3; i++) { | 650 | for (i = 0; i < dss_feat_get_num_ovls(); i++) { |
| 655 | struct omap_overlay *ovl; | 651 | struct omap_overlay *ovl; |
| 656 | ovl = omap_dss_get_overlay(i); | 652 | ovl = omap_dss_get_overlay(i); |
| 657 | if (!ovl->manager || force) { | 653 | if (!ovl->manager || force) { |
diff --git a/drivers/video/omap2/omapfb/Kconfig b/drivers/video/omap2/omapfb/Kconfig index 43496d6c377f..65149b22cf37 100644 --- a/drivers/video/omap2/omapfb/Kconfig +++ b/drivers/video/omap2/omapfb/Kconfig | |||
| @@ -3,7 +3,7 @@ menuconfig FB_OMAP2 | |||
| 3 | depends on FB && OMAP2_DSS | 3 | depends on FB && OMAP2_DSS |
| 4 | 4 | ||
| 5 | select OMAP2_VRAM | 5 | select OMAP2_VRAM |
| 6 | select OMAP2_VRFB | 6 | select OMAP2_VRFB if ARCH_OMAP2 || ARCH_OMAP3 |
| 7 | select FB_CFB_FILLRECT | 7 | select FB_CFB_FILLRECT |
| 8 | select FB_CFB_COPYAREA | 8 | select FB_CFB_COPYAREA |
| 9 | select FB_CFB_IMAGEBLIT | 9 | select FB_CFB_IMAGEBLIT |
diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c index 04034d410d6d..6a704f176c22 100644 --- a/drivers/video/omap2/omapfb/omapfb-main.c +++ b/drivers/video/omap2/omapfb/omapfb-main.c | |||
| @@ -714,10 +714,10 @@ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var) | |||
| 714 | var->pixclock = timings.pixel_clock != 0 ? | 714 | var->pixclock = timings.pixel_clock != 0 ? |
| 715 | KHZ2PICOS(timings.pixel_clock) : | 715 | KHZ2PICOS(timings.pixel_clock) : |
| 716 | 0; | 716 | 0; |
| 717 | var->left_margin = timings.hfp; | 717 | var->left_margin = timings.hbp; |
| 718 | var->right_margin = timings.hbp; | 718 | var->right_margin = timings.hfp; |
| 719 | var->upper_margin = timings.vfp; | 719 | var->upper_margin = timings.vbp; |
| 720 | var->lower_margin = timings.vbp; | 720 | var->lower_margin = timings.vfp; |
| 721 | var->hsync_len = timings.hsw; | 721 | var->hsync_len = timings.hsw; |
| 722 | var->vsync_len = timings.vsw; | 722 | var->vsync_len = timings.vsw; |
| 723 | } else { | 723 | } else { |
| @@ -2059,10 +2059,10 @@ static int omapfb_mode_to_timings(const char *mode_str, | |||
| 2059 | 2059 | ||
| 2060 | if (r != 0) { | 2060 | if (r != 0) { |
| 2061 | timings->pixel_clock = PICOS2KHZ(var.pixclock); | 2061 | timings->pixel_clock = PICOS2KHZ(var.pixclock); |
| 2062 | timings->hfp = var.left_margin; | 2062 | timings->hbp = var.left_margin; |
| 2063 | timings->hbp = var.right_margin; | 2063 | timings->hfp = var.right_margin; |
| 2064 | timings->vfp = var.upper_margin; | 2064 | timings->vbp = var.upper_margin; |
| 2065 | timings->vbp = var.lower_margin; | 2065 | timings->vfp = var.lower_margin; |
| 2066 | timings->hsw = var.hsync_len; | 2066 | timings->hsw = var.hsync_len; |
| 2067 | timings->vsw = var.vsync_len; | 2067 | timings->vsw = var.vsync_len; |
| 2068 | timings->x_res = var.xres; | 2068 | timings->x_res = var.xres; |
| @@ -2198,6 +2198,16 @@ static int omapfb_probe(struct platform_device *pdev) | |||
| 2198 | goto err0; | 2198 | goto err0; |
| 2199 | } | 2199 | } |
| 2200 | 2200 | ||
| 2201 | /* TODO : Replace cpu check with omap_has_vrfb once HAS_FEATURE | ||
| 2202 | * available for OMAP2 and OMAP3 | ||
| 2203 | */ | ||
| 2204 | if (def_vrfb && !cpu_is_omap24xx() && !cpu_is_omap34xx()) { | ||
| 2205 | def_vrfb = 0; | ||
| 2206 | dev_warn(&pdev->dev, "VRFB is not supported on this hardware, " | ||
| 2207 | "ignoring the module parameter vrfb=y\n"); | ||
| 2208 | } | ||
| 2209 | |||
| 2210 | |||
| 2201 | mutex_init(&fbdev->mtx); | 2211 | mutex_init(&fbdev->mtx); |
| 2202 | 2212 | ||
| 2203 | fbdev->dev = &pdev->dev; | 2213 | fbdev->dev = &pdev->dev; |
