summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorDanny Nold <dannynold@freescale.com>2011-02-11 09:30:49 -0600
committerDanny Nold <dannynold@freescale.com>2011-02-11 10:08:57 -0600
commit22c49feb9d0c793a3f0c8d0c74758933a37264d7 (patch)
treedf7437f136d96db6fafda545aeba21014b64d4e0 /drivers
parent1f6985676373b30328b0fc0f43de8dc7949ccfdc (diff)
ENGR00139076 - EPDC fb: Pan display may drop key updates
Instead of dropping updates with a different panning offset than the current framebuffer panning offset, we just process those updates using the current framebuffer panning offset. This ensures that all requested update regions are processed from the latest buffer. Signed-off-by: Danny Nold <dannynold@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/mxc/mxc_epdc_fb.c32
1 files changed, 2 insertions, 30 deletions
diff --git a/drivers/video/mxc/mxc_epdc_fb.c b/drivers/video/mxc/mxc_epdc_fb.c
index 94f2100b355c..ce8a13effd3c 100644
--- a/drivers/video/mxc/mxc_epdc_fb.c
+++ b/drivers/video/mxc/mxc_epdc_fb.c
@@ -95,7 +95,6 @@ struct update_data_list {
/* Represents other LUTs that we collide with */
struct update_marker_data *upd_marker_data;
u32 update_order; /* Numeric ordering value for update */
- u32 fb_offset; /* FB offset associated with update */
dma_addr_t phys_addr_copybuf; /* Phys address of copied update data */
void *virt_addr_copybuf; /* Used for PxP SW workaround */
};
@@ -1446,7 +1445,7 @@ static void copy_before_process(struct mxc_epdc_fb_data *fb_data,
} else {
src_upd_region = &upd_data_list->upd_data.update_region;
src_stride = fb_data->epdc_fb_var.xres_virtual * bpp/8;
- src_ptr = fb_data->info.screen_base + upd_data_list->fb_offset
+ src_ptr = fb_data->info.screen_base + fb_data->fb_offset
+ src_upd_region->top * src_stride;
}
@@ -1664,7 +1663,7 @@ static int epdc_process_update(struct update_data_list *upd_data_list,
+ pxp_input_offs;
else {
sg_dma_address(&fb_data->sg[0]) =
- fb_data->info.fix.smem_start + upd_data_list->fb_offset
+ fb_data->info.fix.smem_start + fb_data->fb_offset
+ pxp_input_offs;
sg_set_page(&fb_data->sg[0],
virt_to_page(fb_data->info.screen_base),
@@ -1768,7 +1767,6 @@ static bool epdc_submit_merge(struct update_data_list *upd_data_list,
brect->left > (arect->left + arect->width) ||
arect->top > (brect->top + brect->height) ||
brect->top > (arect->top + arect->height) ||
- (upd_data_list->fb_offset != update_to_merge->fb_offset) ||
(b->update_marker != 0 && a->update_marker != 0))
return false;
@@ -1830,17 +1828,6 @@ static void epdc_submit_work_func(struct work_struct *work)
dev_dbg(fb_data->dev, "A collision update is ready to go!\n");
- /* If update uses an out-of-date pan offset, we delete it */
- if (next_update->fb_offset != fb_data->fb_offset) {
- dev_dbg(fb_data->dev,
- "Dropping update (old pan offset)\n");
- list_del_init(&next_update->list);
- /* Add to free buffer list */
- list_add_tail(&next_update->list,
- &fb_data->upd_buf_free_list->list);
- continue;
- }
-
/*
* We have a collision cleared, so select it for resubmission.
* If an update is already selected, attempt to merge.
@@ -1878,20 +1865,6 @@ static void epdc_submit_work_func(struct work_struct *work)
dev_dbg(fb_data->dev, "Found a pending update!\n");
- /*
- * Delete update if it is based on
- * an out-of-date pan offset.
- */
- if (next_update->fb_offset != fb_data->fb_offset) {
- dev_dbg(fb_data->dev,
- "Dropping update (old pan offset)\n");
- list_del_init(&next_update->list);
- /* Add to free buffer list */
- list_add_tail(&next_update->list,
- &fb_data->upd_buf_free_list->list);
- continue;
- }
-
if (!upd_data_list) {
upd_data_list = next_update;
list_del_init(&next_update->list);
@@ -2104,7 +2077,6 @@ int mxc_epdc_fb_send_update(struct mxcfb_update_data *upd_data,
memcpy(&upd_data_list->upd_data.update_region, &upd_data->update_region,
sizeof(struct mxcfb_rect));
- upd_data_list->fb_offset = fb_data->fb_offset;
/* If marker specified, associate it with a completion */
if (upd_data->update_marker != 0) {
/* Find available update marker and set it up */