diff options
author | Robby Cai <R63905@freescale.com> | 2013-09-22 05:31:06 -0400 |
---|---|---|
committer | Nitin Garg <nitin.garg@freescale.com> | 2014-04-16 09:05:41 -0400 |
commit | 5178812ac48091da266340bdd625b9d1ed31e262 (patch) | |
tree | aec7ef1134dea35b301d7db9ea5a7b190196f0ae /drivers/media | |
parent | 58f295848e6077e84f54c8c3c397b9c3ae19f401 (diff) |
ENGR00280140 pxp/v4l2: restore the display content after video playback finishes
After finish video playback, the last frame remains on the display.
It's because the UI display start address (smem_start) has been changed when
do video playback but not changed back again after the playback finishes.
From the function call point of view,
pxp_set_fbinfo() // pxp->fb.base tracks right addr for UI framebuffer
pxp_show_buf(toshow) // smem_start changed to v4l2 display addr
pxp_set_fbinfo() // pxp->fb.base changed to v4l2 display addr
pxp_show_buf(not toshow) // smem_start still equal to v4l2 display addr
// for pan_display
This patch fixes it by calling pxp_set_fbinfo once in open function.
Signed-off-by: Robby Cai <R63905@freescale.com>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/platform/mxc/output/mxc_pxp_v4l2.c | 24 |
1 files changed, 6 insertions, 18 deletions
diff --git a/drivers/media/platform/mxc/output/mxc_pxp_v4l2.c b/drivers/media/platform/mxc/output/mxc_pxp_v4l2.c index 355b9251c070..d18043124b12 100644 --- a/drivers/media/platform/mxc/output/mxc_pxp_v4l2.c +++ b/drivers/media/platform/mxc/output/mxc_pxp_v4l2.c | |||
@@ -291,12 +291,6 @@ static int pxp_show_buf(struct pxps *pxp, bool toshow) | |||
291 | struct fb_info *fbi = pxp->fbi; | 291 | struct fb_info *fbi = pxp->fbi; |
292 | int ret; | 292 | int ret; |
293 | 293 | ||
294 | ret = pxp_set_fbinfo(pxp); | ||
295 | if (ret) { | ||
296 | dev_err(&pxp->pdev->dev, "failed to call pxp_set_fbinfo\n"); | ||
297 | return ret; | ||
298 | } | ||
299 | |||
300 | console_lock(); | 294 | console_lock(); |
301 | fbi->fix.smem_start = toshow ? | 295 | fbi->fix.smem_start = toshow ? |
302 | pxp->outb_phys : (unsigned long)pxp->fb.base; | 296 | pxp->outb_phys : (unsigned long)pxp->fb.base; |
@@ -793,12 +787,6 @@ static int pxp_buf_prepare(struct videobuf_queue *q, | |||
793 | sizeof(struct pxp_layer_param)); | 787 | sizeof(struct pxp_layer_param)); |
794 | } else if (pxp_conf->ol_param[0].combine_enable) { | 788 | } else if (pxp_conf->ol_param[0].combine_enable) { |
795 | /* Overlay */ | 789 | /* Overlay */ |
796 | ret = pxp_set_fbinfo(pxp); | ||
797 | if (ret) { | ||
798 | dev_err(&pxp->pdev->dev, | ||
799 | "call pxp_set_fbinfo failed"); | ||
800 | goto fail; | ||
801 | } | ||
802 | pxp_conf->ol_param[0].paddr = | 790 | pxp_conf->ol_param[0].paddr = |
803 | (dma_addr_t)pxp->fb.base; | 791 | (dma_addr_t)pxp->fb.base; |
804 | pxp_conf->ol_param[0].width = pxp->fb.fmt.width; | 792 | pxp_conf->ol_param[0].width = pxp->fb.fmt.width; |
@@ -1081,6 +1069,12 @@ out: | |||
1081 | if (ret) | 1069 | if (ret) |
1082 | return ret; | 1070 | return ret; |
1083 | 1071 | ||
1072 | ret = pxp_set_fbinfo(pxp); | ||
1073 | if (ret) { | ||
1074 | dev_err(&pxp->pdev->dev, "failed to call pxp_set_fbinfo\n"); | ||
1075 | return ret; | ||
1076 | } | ||
1077 | |||
1084 | videobuf_queue_dma_contig_init(&pxp->s0_vbq, | 1078 | videobuf_queue_dma_contig_init(&pxp->s0_vbq, |
1085 | &pxp_vbq_ops, | 1079 | &pxp_vbq_ops, |
1086 | &pxp->pdev->dev, | 1080 | &pxp->pdev->dev, |
@@ -1219,12 +1213,6 @@ static int pxp_probe(struct platform_device *pdev) | |||
1219 | goto freevdev; | 1213 | goto freevdev; |
1220 | } | 1214 | } |
1221 | 1215 | ||
1222 | err = pxp_set_fbinfo(pxp); | ||
1223 | if (err) { | ||
1224 | dev_err(&pdev->dev, "failed to call pxp_set_fbinfo\n"); | ||
1225 | goto freevdev; | ||
1226 | } | ||
1227 | |||
1228 | dev_info(&pdev->dev, "initialized\n"); | 1216 | dev_info(&pdev->dev, "initialized\n"); |
1229 | 1217 | ||
1230 | exit: | 1218 | exit: |