]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
ENGR00280140 pxp/v4l2: restore the display content after video playback finishes
authorRobby Cai <R63905@freescale.com>
Sun, 22 Sep 2013 09:31:06 +0000 (17:31 +0800)
committerLothar Waßmann <LW@KARO-electronics.de>
Wed, 20 Aug 2014 08:06:32 +0000 (10:06 +0200)
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>
drivers/media/platform/mxc/output/mxc_pxp_v4l2.c

index 355b9251c070c0c5ccc972fb7c45ad37a2b271c4..d18043124b12cf3cc0b1d02c81153cca22daaced 100644 (file)
@@ -291,12 +291,6 @@ static int pxp_show_buf(struct pxps *pxp, bool toshow)
        struct fb_info *fbi = pxp->fbi;
        int ret;
 
-       ret = pxp_set_fbinfo(pxp);
-       if (ret) {
-               dev_err(&pxp->pdev->dev, "failed to call pxp_set_fbinfo\n");
-               return ret;
-       }
-
        console_lock();
        fbi->fix.smem_start = toshow ?
                        pxp->outb_phys : (unsigned long)pxp->fb.base;
@@ -793,12 +787,6 @@ static int pxp_buf_prepare(struct videobuf_queue *q,
                                        sizeof(struct pxp_layer_param));
                        } else if (pxp_conf->ol_param[0].combine_enable) {
                                /* Overlay */
-                               ret = pxp_set_fbinfo(pxp);
-                               if (ret) {
-                                       dev_err(&pxp->pdev->dev,
-                                               "call pxp_set_fbinfo failed");
-                                       goto fail;
-                               }
                                pxp_conf->ol_param[0].paddr =
                                                (dma_addr_t)pxp->fb.base;
                                pxp_conf->ol_param[0].width = pxp->fb.fmt.width;
@@ -1081,6 +1069,12 @@ out:
        if (ret)
                return ret;
 
+       ret = pxp_set_fbinfo(pxp);
+       if (ret) {
+               dev_err(&pxp->pdev->dev, "failed to call pxp_set_fbinfo\n");
+               return ret;
+       }
+
        videobuf_queue_dma_contig_init(&pxp->s0_vbq,
                                &pxp_vbq_ops,
                                &pxp->pdev->dev,
@@ -1219,12 +1213,6 @@ static int pxp_probe(struct platform_device *pdev)
                goto freevdev;
        }
 
-       err = pxp_set_fbinfo(pxp);
-       if (err) {
-               dev_err(&pdev->dev, "failed to call pxp_set_fbinfo\n");
-               goto freevdev;
-       }
-
        dev_info(&pdev->dev, "initialized\n");
 
 exit: