--- v1
+++ v2
@@ -1,211 +1,172 @@
-Writeback pipeline has similar registers compared to graphics and video pipes
-for setting base addresses, color conversion, row inc, pix inc etc. Rename these
-functions from dispc_ovl_* to dispc_plane_*. The actual registers are kept as
-DISPC_OVL_* only to prevent too much change.
+Add position and replication as overlay caps, and pass overlay caps as an
+argument to the corresponding functions. Adding position and replication to
+overlay caps seems a bit unnecessary, but it allows us to use the
+corresponding functions for writeback too.
-All functions which are common to overlays and writeback are to be named as
-dispc_plane_*, functions which are specific to overlays are to be named as
-dispc_ovl_*, and writeback as dispc_wb_*.
+These caps will be set for all overlays, but not for writeback. This is done
+so writeback can reuse dispc_ovl_setup() to the maximum.
Signed-off-by: Archit Taneja <archit@ti.com>
---
- drivers/video/omap2/dss/dispc.c | 67 ++++++++++++++++++++-------------------
- 1 file changed, 35 insertions(+), 32 deletions(-)
+ drivers/video/omap2/dss/dispc.c | 20 ++++++++++++-----
+ drivers/video/omap2/dss/dss_features.c | 38 +++++++++++++++++++++-----------
+ include/video/omapdss.h | 2 ++
+ 3 files changed, 42 insertions(+), 18 deletions(-)
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
-index 44e86ad..9ecdd44 100644
+index 955db56..0ff1c07 100644
--- a/drivers/video/omap2/dss/dispc.c
+++ b/drivers/video/omap2/dss/dispc.c
-@@ -683,34 +683,35 @@ static void _dispc_setup_color_conv_coef(void)
- }
-
-
--static void dispc_ovl_set_ba0(enum omap_plane plane, u32 paddr)
-+static void dispc_plane_set_ba0(enum omap_plane plane, u32 paddr)
- {
- dispc_write_reg(DISPC_OVL_BA0(plane), paddr);
- }
-
--static void dispc_ovl_set_ba1(enum omap_plane plane, u32 paddr)
-+static void dispc_plane_set_ba1(enum omap_plane plane, u32 paddr)
- {
- dispc_write_reg(DISPC_OVL_BA1(plane), paddr);
- }
-
--static void dispc_ovl_set_ba0_uv(enum omap_plane plane, u32 paddr)
-+static void dispc_plane_set_ba0_uv(enum omap_plane plane, u32 paddr)
- {
- dispc_write_reg(DISPC_OVL_BA0_UV(plane), paddr);
- }
-
--static void dispc_ovl_set_ba1_uv(enum omap_plane plane, u32 paddr)
-+static void dispc_plane_set_ba1_uv(enum omap_plane plane, u32 paddr)
- {
+@@ -698,9 +698,15 @@ static void dispc_ovl_set_ba1_uv(enum omap_plane plane, u32 paddr)
dispc_write_reg(DISPC_OVL_BA1_UV(plane), paddr);
}
-static void dispc_ovl_set_pos(enum omap_plane plane, int x, int y)
-+static void dispc_plane_set_pos(enum omap_plane plane, int x, int y)
++static void dispc_ovl_set_pos(enum omap_plane plane,
++ enum omap_overlay_caps caps, int x, int y)
{
- u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0);
+- u32 val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0);
++ u32 val;
++
++ if ((caps & OMAP_DSS_OVL_CAP_POS) = 0)
++ return;
++
++ val = FLD_VAL(y, 26, 16) | FLD_VAL(x, 10, 0);
dispc_write_reg(DISPC_OVL_POSITION(plane), val);
}
-
--static void dispc_ovl_set_pic_size(enum omap_plane plane, int width, int height)
-+static void dispc_plane_set_pic_size(enum omap_plane plane, int width,
-+ int height)
- {
- u32 val = FLD_VAL(height - 1, 26, 16) | FLD_VAL(width - 1, 10, 0);
-
-@@ -720,7 +721,8 @@ static void dispc_ovl_set_pic_size(enum omap_plane plane, int width, int height)
- dispc_write_reg(DISPC_OVL_PICTURE_SIZE(plane), val);
- }
-
--static void dispc_ovl_set_vid_size(enum omap_plane plane, int width, int height)
-+static void dispc_plane_set_vid_size(enum omap_plane plane, int width,
-+ int height)
- {
- u32 val;
-
-@@ -731,7 +733,7 @@ static void dispc_ovl_set_vid_size(enum omap_plane plane, int width, int height)
- dispc_write_reg(DISPC_OVL_SIZE(plane), val);
- }
-
--static void dispc_ovl_set_zorder(enum omap_plane plane, u8 zorder)
-+static void dispc_plane_set_zorder(enum omap_plane plane, u8 zorder)
- {
- struct omap_overlay *ovl = omap_dss_get_overlay(plane);
-
-@@ -752,7 +754,7 @@ static void dispc_ovl_enable_zorder_planes(void)
- REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(i), 1, 25, 25);
- }
-
--static void dispc_ovl_set_pre_mult_alpha(enum omap_plane plane, bool enable)
-+static void dispc_plane_set_pre_mult_alpha(enum omap_plane plane, bool enable)
- {
- struct omap_overlay *ovl = omap_dss_get_overlay(plane);
-
-@@ -762,7 +764,8 @@ static void dispc_ovl_set_pre_mult_alpha(enum omap_plane plane, bool enable)
- REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable ? 1 : 0, 28, 28);
- }
-
--static void dispc_ovl_setup_global_alpha(enum omap_plane plane, u8 global_alpha)
-+static void dispc_plane_setup_global_alpha(enum omap_plane plane,
-+ u8 global_alpha)
- {
- static const unsigned shifts[] = { 0, 8, 16, 24, };
- int shift;
-@@ -775,17 +778,17 @@ static void dispc_ovl_setup_global_alpha(enum omap_plane plane, u8 global_alpha)
- REG_FLD_MOD(DISPC_GLOBAL_ALPHA, global_alpha, shift + 7, shift);
- }
-
--static void dispc_ovl_set_pix_inc(enum omap_plane plane, s32 inc)
-+static void dispc_plane_set_pix_inc(enum omap_plane plane, s32 inc)
- {
- dispc_write_reg(DISPC_OVL_PIXEL_INC(plane), inc);
- }
-
--static void dispc_ovl_set_row_inc(enum omap_plane plane, s32 inc)
-+static void dispc_plane_set_row_inc(enum omap_plane plane, s32 inc)
- {
- dispc_write_reg(DISPC_OVL_ROW_INC(plane), inc);
- }
-
--static void dispc_ovl_set_color_mode(enum omap_plane plane,
-+static void dispc_plane_set_color_mode(enum omap_plane plane,
- enum omap_color_mode color_mode)
- {
- u32 m = 0;
-@@ -1045,7 +1048,7 @@ static void dispc_mgr_set_cpr_coef(enum omap_channel channel,
- dispc_write_reg(DISPC_CPR_COEF_B(channel), coef_b);
- }
-
--static void dispc_ovl_set_vid_color_conv(enum omap_plane plane, bool enable)
-+static void dispc_plane_set_vid_color_conv(enum omap_plane plane, bool enable)
- {
- u32 val;
-
-@@ -1056,7 +1059,7 @@ static void dispc_ovl_set_vid_color_conv(enum omap_plane plane, bool enable)
+@@ -1051,11 +1057,15 @@ static void dispc_ovl_set_vid_color_conv(enum omap_plane plane, bool enable)
dispc_write_reg(DISPC_OVL_ATTRIBUTES(plane), val);
}
-static void dispc_ovl_enable_replication(enum omap_plane plane, bool enable)
-+static void dispc_plane_enable_replication(enum omap_plane plane, bool enable)
++static void dispc_ovl_enable_replication(enum omap_plane plane,
++ enum omap_overlay_caps caps, bool enable)
{
static const unsigned shifts[] = { 5, 10, 10, 10 };
int shift;
-@@ -1530,7 +1533,7 @@ static void dispc_plane_set_scaling(enum omap_plane plane,
- rotation);
+
++ if ((caps & OMAP_DSS_OVL_CAP_REPLICATION) = 0)
++ return;
++
+ shift = shifts[plane];
+ REG_FLD_MOD(DISPC_OVL_ATTRIBUTES(plane), enable, shift, shift);
}
-
--static void dispc_ovl_set_rotation_attrs(enum omap_plane plane, u8 rotation,
-+static void dispc_plane_set_rotation_attrs(enum omap_plane plane, u8 rotation,
- bool mirroring, enum omap_color_mode color_mode)
- {
- bool row_repeat = false;
-@@ -2369,45 +2372,45 @@ int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi,
- DSSDBG("offset0 %u, offset1 %u, row_inc %d, pix_inc %d\n",
- offset0, offset1, row_inc, pix_inc);
-
-- dispc_ovl_set_color_mode(plane, oi->color_mode);
-+ dispc_plane_set_color_mode(plane, oi->color_mode);
-
- dispc_plane_configure_burst_type(plane, oi->rotation_type);
-
-- dispc_ovl_set_ba0(plane, oi->paddr + offset0);
-- dispc_ovl_set_ba1(plane, oi->paddr + offset1);
-+ dispc_plane_set_ba0(plane, oi->paddr + offset0);
-+ dispc_plane_set_ba1(plane, oi->paddr + offset1);
-
- if (OMAP_DSS_COLOR_NV12 = oi->color_mode) {
-- dispc_ovl_set_ba0_uv(plane, oi->p_uv_addr + offset0);
-- dispc_ovl_set_ba1_uv(plane, oi->p_uv_addr + offset1);
-+ dispc_plane_set_ba0_uv(plane, oi->p_uv_addr + offset0);
-+ dispc_plane_set_ba1_uv(plane, oi->p_uv_addr + offset1);
- }
-
-
-- dispc_ovl_set_row_inc(plane, row_inc);
-- dispc_ovl_set_pix_inc(plane, pix_inc);
-+ dispc_plane_set_row_inc(plane, row_inc);
-+ dispc_plane_set_pix_inc(plane, pix_inc);
-
+@@ -2383,7 +2393,7 @@ int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi,
DSSDBG("%d,%d %dx%d -> %dx%d\n", oi->pos_x, oi->pos_y, in_width,
in_height, out_width, out_height);
- dispc_ovl_set_pos(plane, oi->pos_x, pos_y);
-+ dispc_plane_set_pos(plane, oi->pos_x, pos_y);
++ dispc_ovl_set_pos(plane, caps, oi->pos_x, pos_y);
-- dispc_ovl_set_pic_size(plane, in_width, in_height);
-+ dispc_plane_set_pic_size(plane, in_width, in_height);
+ dispc_ovl_set_input_size(plane, in_width, in_height);
- if (ovl->caps & OMAP_DSS_OVL_CAP_SCALE) {
- dispc_plane_set_scaling(plane, in_width, in_height, out_width,
- out_height, ilace, five_taps, fieldmode,
- oi->color_mode, oi->rotation);
-- dispc_ovl_set_vid_size(plane, out_width, out_height);
-- dispc_ovl_set_vid_color_conv(plane, cconv);
-+ dispc_plane_set_vid_size(plane, out_width, out_height);
-+ dispc_plane_set_vid_color_conv(plane, cconv);
- }
-
-- dispc_ovl_set_rotation_attrs(plane, oi->rotation, oi->mirror,
-+ dispc_plane_set_rotation_attrs(plane, oi->rotation, oi->mirror,
- oi->color_mode);
-
-- dispc_ovl_set_zorder(plane, oi->zorder);
-- dispc_ovl_set_pre_mult_alpha(plane, oi->pre_mult_alpha);
-- dispc_ovl_setup_global_alpha(plane, oi->global_alpha);
-+ dispc_plane_set_zorder(plane, oi->zorder);
-+ dispc_plane_set_pre_mult_alpha(plane, oi->pre_mult_alpha);
-+ dispc_plane_setup_global_alpha(plane, oi->global_alpha);
+@@ -2403,7 +2413,7 @@ int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi,
+ dispc_ovl_set_pre_mult_alpha(plane, caps, oi->pre_mult_alpha);
+ dispc_ovl_setup_global_alpha(plane, caps, oi->global_alpha);
- dispc_ovl_enable_replication(plane, replication);
-+ dispc_plane_enable_replication(plane, replication);
++ dispc_ovl_enable_replication(plane, caps, replication);
return 0;
}
+diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c
+index 63d109f..8b6c79f 100644
+--- a/drivers/video/omap2/dss/dss_features.c
++++ b/drivers/video/omap2/dss/dss_features.c
+@@ -269,54 +269,66 @@ static const enum omap_color_mode omap4_dss_supported_color_modes[] = {
+
+ static const enum omap_overlay_caps omap2_dss_overlay_caps[] = {
+ /* OMAP_DSS_GFX */
+- 0,
++ OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO1 */
+- OMAP_DSS_OVL_CAP_SCALE,
++ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
++ OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO2 */
+- OMAP_DSS_OVL_CAP_SCALE,
++ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
++ OMAP_DSS_OVL_CAP_REPLICATION,
+ };
+
+ static const enum omap_overlay_caps omap3430_dss_overlay_caps[] = {
+ /* OMAP_DSS_GFX */
+- OMAP_DSS_OVL_CAP_GLOBAL_ALPHA,
++ OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_POS |
++ OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO1 */
+- OMAP_DSS_OVL_CAP_SCALE,
++ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
++ OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO2 */
+- OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA,
++ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
++ OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
+ };
+
+ static const enum omap_overlay_caps omap3630_dss_overlay_caps[] = {
+ /* OMAP_DSS_GFX */
+- OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA,
++ OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |
++ OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO1 */
+- OMAP_DSS_OVL_CAP_SCALE,
++ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_POS |
++ OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO2 */
+ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
+- OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA,
++ OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_POS |
++ OMAP_DSS_OVL_CAP_REPLICATION,
+ };
+
+ static const enum omap_overlay_caps omap4_dss_overlay_caps[] = {
+ /* OMAP_DSS_GFX */
+ OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |
+- OMAP_DSS_OVL_CAP_ZORDER,
++ OMAP_DSS_OVL_CAP_ZORDER | OMAP_DSS_OVL_CAP_POS |
++ OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO1 */
+ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
+- OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER,
++ OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
++ OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO2 */
+ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
+- OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER,
++ OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
++ OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
+
+ /* OMAP_DSS_VIDEO3 */
+ OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
+- OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER,
++ OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER |
++ OMAP_DSS_OVL_CAP_POS | OMAP_DSS_OVL_CAP_REPLICATION,
+ };
+
+ static const char * const omap2_dss_clk_source_names[] = {
+diff --git a/include/video/omapdss.h b/include/video/omapdss.h
+index e65e2e9..46097bd 100644
+--- a/include/video/omapdss.h
++++ b/include/video/omapdss.h
+@@ -187,6 +187,8 @@ enum omap_overlay_caps {
+ OMAP_DSS_OVL_CAP_GLOBAL_ALPHA = 1 << 1,
+ OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA = 1 << 2,
+ OMAP_DSS_OVL_CAP_ZORDER = 1 << 3,
++ OMAP_DSS_OVL_CAP_POS = 1 << 4,
++ OMAP_DSS_OVL_CAP_REPLICATION = 1 << 5,
+ };
+
+ enum omap_overlay_manager_caps {
--
1.7.9.5