--- v1
+++ v2
@@ -1,301 +1,25 @@
-Since writeback has many overlay like properties, and most of it's registers are
-similar to that of overlays, it's possible to reuse most of the overlay related
-DISPC code for writeback when considering it as a plane. Writeback was added as
-a plane in the omap_plane field as OMAP_DSS_WB.
-
-Add the writeback register offsets in dispc.h, add minimal WB plane related info
-needed in dss_features. Add a function which returns the number of writeback
-pipelines an OMAP version has.
+When converting YUYV444 content to YUV422 or NV12 formats through writeback
+pipeline, the scaler needs to downscale the chroma plane. Ensure that chroma
+is downscaled when the pipeline is writeback.
Signed-off-by: Archit Taneja <archit@ti.com>
---
- drivers/video/omap2/dss/dispc.h | 33 ++++++++++++++++++++++++++++++++
- drivers/video/omap2/dss/dss_features.c | 19 ++++++++++++++++++
- drivers/video/omap2/dss/dss_features.h | 1 +
- 3 files changed, 53 insertions(+)
+ drivers/video/omap2/dss/dispc.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
-diff --git a/drivers/video/omap2/dss/dispc.h b/drivers/video/omap2/dss/dispc.h
-index 84cc472..2b008f7 100644
---- a/drivers/video/omap2/dss/dispc.h
-+++ b/drivers/video/omap2/dss/dispc.h
-@@ -373,6 +373,7 @@ static inline u16 DISPC_BA0_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x0000;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0008;
- default:
- BUG();
-@@ -388,6 +389,7 @@ static inline u16 DISPC_BA1_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x0004;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x000C;
- default:
- BUG();
-@@ -407,6 +409,8 @@ static inline u16 DISPC_BA0_UV_OFFSET(enum omap_plane plane)
- return 0x04BC;
- case OMAP_DSS_VIDEO3:
- return 0x0310;
-+ case OMAP_DSS_WB:
-+ return 0x0118;
- default:
- BUG();
- return 0;
-@@ -425,6 +429,8 @@ static inline u16 DISPC_BA1_UV_OFFSET(enum omap_plane plane)
- return 0x04C0;
- case OMAP_DSS_VIDEO3:
- return 0x0314;
-+ case OMAP_DSS_WB:
-+ return 0x011C;
- default:
- BUG();
- return 0;
-@@ -454,6 +460,7 @@ static inline u16 DISPC_SIZE_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x000C;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x00A8;
- default:
- BUG();
-@@ -470,6 +477,7 @@ static inline u16 DISPC_ATTR_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x0010;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0070;
- default:
- BUG();
-@@ -489,6 +497,8 @@ static inline u16 DISPC_ATTR2_OFFSET(enum omap_plane plane)
- return 0x04DC;
- case OMAP_DSS_VIDEO3:
- return 0x032C;
-+ case OMAP_DSS_WB:
-+ return 0x0310;
- default:
- BUG();
- return 0;
-@@ -504,6 +514,7 @@ static inline u16 DISPC_FIFO_THRESH_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x0014;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x008C;
- default:
- BUG();
-@@ -537,6 +548,7 @@ static inline u16 DISPC_ROW_INC_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x001C;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x00A4;
- default:
- BUG();
-@@ -553,6 +565,7 @@ static inline u16 DISPC_PIX_INC_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x0020;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0098;
- default:
- BUG();
-@@ -602,6 +615,7 @@ static inline u16 DISPC_FIR_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x0024;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0090;
- default:
- BUG();
-@@ -621,6 +635,8 @@ static inline u16 DISPC_FIR2_OFFSET(enum omap_plane plane)
- return 0x055C;
- case OMAP_DSS_VIDEO3:
- return 0x0424;
-+ case OMAP_DSS_WB:
-+ return 0x290;
- default:
- BUG();
- return 0;
-@@ -637,6 +653,7 @@ static inline u16 DISPC_PIC_SIZE_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x0028;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0094;
- default:
- BUG();
-@@ -655,6 +672,7 @@ static inline u16 DISPC_ACCU0_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x002C;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0000;
- default:
- BUG();
-@@ -674,6 +692,8 @@ static inline u16 DISPC_ACCU2_0_OFFSET(enum omap_plane plane)
- return 0x0560;
- case OMAP_DSS_VIDEO3:
- return 0x0428;
-+ case OMAP_DSS_WB:
-+ return 0x0294;
- default:
- BUG();
- return 0;
-@@ -690,6 +710,7 @@ static inline u16 DISPC_ACCU1_OFFSET(enum omap_plane plane)
- case OMAP_DSS_VIDEO2:
- return 0x0030;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0004;
- default:
- BUG();
-@@ -709,6 +730,8 @@ static inline u16 DISPC_ACCU2_1_OFFSET(enum omap_plane plane)
- return 0x0564;
- case OMAP_DSS_VIDEO3:
- return 0x042C;
-+ case OMAP_DSS_WB:
-+ return 0x0298;
- default:
- BUG();
- return 0;
-@@ -726,6 +749,7 @@ static inline u16 DISPC_FIR_COEF_H_OFFSET(enum omap_plane plane, u16 i)
- case OMAP_DSS_VIDEO2:
- return 0x0034 + i * 0x8;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0010 + i * 0x8;
- default:
- BUG();
-@@ -746,6 +770,8 @@ static inline u16 DISPC_FIR_COEF_H2_OFFSET(enum omap_plane plane, u16 i)
- return 0x0568 + i * 0x8;
- case OMAP_DSS_VIDEO3:
- return 0x0430 + i * 0x8;
-+ case OMAP_DSS_WB:
-+ return 0x02A0 + i * 0x8;
- default:
- BUG();
- return 0;
-@@ -763,6 +789,7 @@ static inline u16 DISPC_FIR_COEF_HV_OFFSET(enum omap_plane plane, u16 i)
- case OMAP_DSS_VIDEO2:
- return 0x0038 + i * 0x8;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0014 + i * 0x8;
- default:
- BUG();
-@@ -783,6 +810,8 @@ static inline u16 DISPC_FIR_COEF_HV2_OFFSET(enum omap_plane plane, u16 i)
- return 0x056C + i * 0x8;
- case OMAP_DSS_VIDEO3:
- return 0x0434 + i * 0x8;
-+ case OMAP_DSS_WB:
-+ return 0x02A4 + i * 0x8;
- default:
- BUG();
- return 0;
-@@ -799,6 +828,7 @@ static inline u16 DISPC_CONV_COEF_OFFSET(enum omap_plane plane, u16 i)
- case OMAP_DSS_VIDEO1:
- case OMAP_DSS_VIDEO2:
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0074 + i * 0x4;
- default:
- BUG();
-@@ -818,6 +848,7 @@ static inline u16 DISPC_FIR_COEF_V_OFFSET(enum omap_plane plane, u16 i)
- case OMAP_DSS_VIDEO2:
- return 0x00B4 + i * 0x4;
- case OMAP_DSS_VIDEO3:
-+ case OMAP_DSS_WB:
- return 0x0050 + i * 0x4;
- default:
- BUG();
-@@ -838,6 +869,8 @@ static inline u16 DISPC_FIR_COEF_V2_OFFSET(enum omap_plane plane, u16 i)
- return 0x05A8 + i * 0x4;
- case OMAP_DSS_VIDEO3:
- return 0x0470 + i * 0x4;
-+ case OMAP_DSS_WB:
-+ return 0x02E0 + i * 0x4;
- default:
- BUG();
- return 0;
-diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c
-index 8b6c79f..5968fd8 100644
---- a/drivers/video/omap2/dss/dss_features.c
-+++ b/drivers/video/omap2/dss/dss_features.c
-@@ -46,6 +46,7 @@ struct omap_dss_features {
+diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
+index 04fdd33..4f36e83 100644
+--- a/drivers/video/omap2/dss/dispc.c
++++ b/drivers/video/omap2/dss/dispc.c
+@@ -1460,7 +1460,7 @@ static void dispc_ovl_set_scaling_uv(enum omap_plane plane,
+ {
+ int scale_x = out_width != orig_width;
+ int scale_y = out_height != orig_height;
+- bool chroma_upscale = true;
++ bool chroma_upscale = plane != OMAP_DSS_WB ? true : false;
- const int num_mgrs;
- const int num_ovls;
-+ const int num_wbs;
- const enum omap_display_type *supported_displays;
- const enum omap_dss_output_id *supported_outputs;
- const enum omap_color_mode *supported_color_modes;
-@@ -265,6 +266,16 @@ static const enum omap_color_mode omap4_dss_supported_color_modes[] = {
- OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
- OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
- OMAP_DSS_COLOR_RGBX32,
-+
-+ /* OMAP_DSS_WB */
-+ OMAP_DSS_COLOR_RGB16 | OMAP_DSS_COLOR_RGB12U |
-+ OMAP_DSS_COLOR_YUV2 | OMAP_DSS_COLOR_ARGB16_1555 |
-+ OMAP_DSS_COLOR_RGBA32 | OMAP_DSS_COLOR_NV12 |
-+ OMAP_DSS_COLOR_RGBA16 | OMAP_DSS_COLOR_RGB24U |
-+ OMAP_DSS_COLOR_RGB24P | OMAP_DSS_COLOR_UYVY |
-+ OMAP_DSS_COLOR_ARGB16 | OMAP_DSS_COLOR_XRGB16_1555 |
-+ OMAP_DSS_COLOR_ARGB32 | OMAP_DSS_COLOR_RGBX16 |
-+ OMAP_DSS_COLOR_RGBX32,
- };
-
- static const enum omap_overlay_caps omap2_dss_overlay_caps[] = {
-@@ -576,6 +587,7 @@ static const struct omap_dss_features omap4430_es1_0_dss_features = {
-
- .num_mgrs = 3,
- .num_ovls = 4,
-+ .num_wbs = 1,
- .supported_displays = omap4_dss_supported_displays,
- .supported_outputs = omap4_dss_supported_outputs,
- .supported_color_modes = omap4_dss_supported_color_modes,
-@@ -597,6 +609,7 @@ static const struct omap_dss_features omap4430_es2_0_1_2_dss_features = {
-
- .num_mgrs = 3,
- .num_ovls = 4,
-+ .num_wbs = 1,
- .supported_displays = omap4_dss_supported_displays,
- .supported_outputs = omap4_dss_supported_outputs,
- .supported_color_modes = omap4_dss_supported_color_modes,
-@@ -618,6 +631,7 @@ static const struct omap_dss_features omap4_dss_features = {
-
- .num_mgrs = 3,
- .num_ovls = 4,
-+ .num_wbs = 1,
- .supported_displays = omap4_dss_supported_displays,
- .supported_outputs = omap4_dss_supported_outputs,
- .supported_color_modes = omap4_dss_supported_color_modes,
-@@ -674,6 +688,11 @@ int dss_feat_get_num_ovls(void)
- return omap_current_dss_features->num_ovls;
- }
-
-+int dss_feat_get_num_wbs(void)
-+{
-+ return omap_current_dss_features->num_wbs;
-+}
-+
- unsigned long dss_feat_get_param_min(enum dss_range_param param)
- {
- return omap_current_dss_features->dss_params[param].min;
-diff --git a/drivers/video/omap2/dss/dss_features.h b/drivers/video/omap2/dss/dss_features.h
-index fb8ed59..66fd9f7 100644
---- a/drivers/video/omap2/dss/dss_features.h
-+++ b/drivers/video/omap2/dss/dss_features.h
-@@ -102,6 +102,7 @@ enum dss_range_param {
- /* DSS Feature Functions */
- int dss_feat_get_num_mgrs(void);
- int dss_feat_get_num_ovls(void);
-+int dss_feat_get_num_wbs(void);
- unsigned long dss_feat_get_param_min(enum dss_range_param param);
- unsigned long dss_feat_get_param_max(enum dss_range_param param);
- enum omap_display_type dss_feat_get_supported_displays(enum omap_channel channel);
+ if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE))
+ return;
--
1.7.9.5