diff options
-rw-r--r-- | drivers/video/omap2/dss/dispc.c | 35 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dispc.h | 1 |
2 files changed, 36 insertions, 0 deletions
diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index ced91ce214b4..ee2b915805df 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c @@ -1011,6 +1011,39 @@ static void dispc_read_plane_fifo_sizes(void) } } +static void dispc_transfer_fifo(enum omap_plane src_plane, + enum omap_plane dest_plane) +{ + u8 top_fifo_start, top_fifo_end, bot_fifo_start, bot_fifo_end; + + /* + * calculate start and end bits corresponding to the source plane + * in DISPC_GLOBAL_BUFFER + */ + top_fifo_end = src_plane * 6; + top_fifo_start = top_fifo_end + 2; + bot_fifo_end = top_fifo_start + 1; + bot_fifo_start = bot_fifo_end + 2; + + REG_FLD_MOD(DISPC_GLOBAL_BUFFER, src_plane, top_fifo_start, + top_fifo_end); + REG_FLD_MOD(DISPC_GLOBAL_BUFFER, src_plane, bot_fifo_start, + bot_fifo_end); + + dispc.fifo_size[dest_plane] += dispc.fifo_size[src_plane]; + dispc.fifo_size[src_plane] = 0; +} + +static void dispc_transfer_wb_fifo_to_gfx(void) +{ + const int num_wbs = dss_feat_get_num_wbs(); + + if (!num_wbs) + return; + + dispc_transfer_fifo(OMAP_DSS_WB, OMAP_DSS_GFX); +} + static u32 dispc_ovl_get_fifo_size(enum omap_plane plane) { return dispc.fifo_size[plane]; @@ -3664,6 +3697,8 @@ static void _omap_dispc_initial_config(void) dispc_read_plane_fifo_sizes(); + dispc_transfer_wb_fifo_to_gfx(); + dispc_configure_burst_sizes(); dispc_ovl_enable_zorder_planes(); diff --git a/drivers/video/omap2/dss/dispc.h b/drivers/video/omap2/dss/dispc.h index 30832c7868fc..d870b5f00480 100644 --- a/drivers/video/omap2/dss/dispc.h +++ b/drivers/video/omap2/dss/dispc.h @@ -35,6 +35,7 @@ #define DISPC_GLOBAL_ALPHA 0x0074 #define DISPC_CONTROL2 0x0238 #define DISPC_CONFIG2 0x0620 +#define DISPC_GLOBAL_BUFFER 0x0800 #define DISPC_DIVISOR 0x0804 /* DISPC overlay registers */ |