Hi Kristen,

The free function is in exit_dma_skipframe_release:
I use the wrong free size, now corrected. Please review. Thanks!

--
Index: linux-2.6.37/drivers/staging/mrstci/mrstisp/mrstisp_main.c
===================================================================
--- linux-2.6.37/drivers/staging/mrstci/mrstisp/mrstisp_main.c  (revision 105)
+++ linux-2.6.37/drivers/staging/mrstci/mrstisp/mrstisp_main.c  (working copy)
@@ -46,6 +46,12 @@
 static unsigned long jiffies_start;
 static int mipi_flag;
 
+/* DMA buffer pointer for skipped frames
+ * when input FIFO is empty */
+#define SKIPPED_FRAME_MAX_SIZE 0x00400000
+static void *addr_for_skipped_frame;
+static dma_addr_t dma_addr_for_skipped_frame;
+
 #define ISP_CLOCK_GATING
 #ifdef ISP_CLOCK_GATING
 
@@ -3014,6 +3020,11 @@
                                isp->next->i);
                } else {
                        isp->stopflag = 1;
+                       /* input FIFO is empty, this frame should be skipped
+                        * set DMA WR address to the skipped frame buf*/
+                       mrst_isp_update_marvinvfaddr(isp,
+                                       dma_addr_for_skipped_frame,
+                                       CI_ISP_CFG_UPDATE_FRAME_SYNC);
                        dprintk(0, "stop isp");
                }
 
@@ -3219,6 +3230,18 @@
 
        dprintk(1, "isp mb1 = %lx, mb1_size = %lx", isp->mb1, isp->mb1_size);
 
+       /* allocate memory space for the skipped frames */
+       addr_for_skipped_frame = dma_alloc_coherent(&pdev->dev,
+                       SKIPPED_FRAME_MAX_SIZE,
+                       &dma_addr_for_skipped_frame,
+                       GFP_KERNEL);
+
+       if (!addr_for_skipped_frame) {
+               printk(KERN_WARNING "failed to allocate dma memory for skipped 
frame");
+               ret = -ENXIO;
+               goto exit_iounmap;
+       }
+
        ret = dma_declare_coherent_memory(&pdev->dev, start,
                                          /* start, len - 640 * 480 * 2, */
                                          start, len,
@@ -3230,7 +3253,7 @@
        if (!ret) {
                dprintk(0, "failed to declare dma memory");
                ret = -ENXIO;
-               goto exit_iounmap;
+               goto exit_dma_skipframe_release;
        }
 
        /* init device struct */
@@ -3298,6 +3321,9 @@
        video_unregister_device(isp->vdev);
 exit_dma_release:
        dma_release_declared_memory(&pdev->dev);
+exit_dma_skipframe_release:
+       dma_free_coherent(&pdev->dev, SKIPPED_FRAME_MAX_SIZE,
+               addr_for_skipped_frame, dma_addr_for_skipped_frame);
 exit_iounmap:
        iounmap(isp->regs);
 exit_release_regions:
        Signed-off-by: Yong He <yong.m...@intel.com>

-- Yong
Phone (+86) 21-61166334
Lab (+86) 21-61167881

> -----Original Message-----
> From: Kristen Carlson Accardi [mailto:kris...@linux.intel.com] 
> Sent: Tuesday, June 21, 2011 2:21 AM
> To: He, Yong M
> Cc: MeeGo-kernel@lists.meego.com; Arjan van de Ven
> Subject: Re: [PATCH] MRST Tablet camera driver ver-0.951, fix 8917
> 
> On Mon, 20 Jun 2011 16:46:48 +0800
> "He, Yong M" <yong.m...@intel.com> wrote:
> 
> > 
> > Hi,
> > 
> > Please help to review the patch
> > 
> > From: Yong He <yong.m...@intel.com>
> > Subject: [PATCH] MRST Tablet camera driver ver-0.951, fix 8917
> > 
> > Bug_8917 -[MM-camera]: a cropped line appears on both camera previewing.
> > solution is to add a empty frame buffer space. If the in-queue is empty, 
> > all dropped frames goes to this empty buffer.
> > 
> > Signed-off-by: He, Yong <yong.m...@intel.com>
> > ---
> > Index: linux-2.6.37/drivers/staging/mrstci/mrstisp/mrstisp_main.c
> > ===================================================================
> > --- linux-2.6.37/drivers/staging/mrstci/mrstisp/mrstisp_main.c   (revision 
> > 106)
> > +++ linux-2.6.37/drivers/staging/mrstci/mrstisp/mrstisp_main.c          
> > (working copy)
> > @@ -46,6 +46,12 @@
> > static unsigned long jiffies_start;
> > static int mipi_flag;
> > +/* DMA buffer pointer for skipped frames
> > + * when input FIFO is empty */
> > +#define SKIPPED_FRAME_MAX_SIZE 0x00400000
> > +static void *addr_for_skipped_frame;
> > +static dma_addr_t dma_addr_for_skipped_frame;
> > +
> > #define ISP_CLOCK_GATING
> > #ifdef ISP_CLOCK_GATING
> > @@ -3014,6 +3020,11 @@
> >                                    isp->next->i);
> >                 } else {
> >                           isp->stopflag = 1;
> > +                          /* input FIFO is empty, this frame should be 
> > skipped
> > +                          * set DMA WR address to the skipped frame buf*/
> > +                          mrst_isp_update_marvinvfaddr(isp,
> > +                                            dma_addr_for_skipped_frame,
> > +                                            CI_ISP_CFG_UPDATE_FRAME_SYNC);
> >                           dprintk(0, "stop isp");
> >                 }
> > @@ -3219,6 +3230,18 @@
> >         dprintk(1, "isp mb1 = %lx, mb1_size = %lx", isp->mb1, 
> > isp->mb1_size);
> > +       /* allocate memory space for the skipped frames */
> > +       addr_for_skipped_frame = dma_alloc_coherent(&pdev->dev,
> > +                          SKIPPED_FRAME_MAX_SIZE,
> > +                          &dma_addr_for_skipped_frame,
> > +                          GFP_KERNEL);
> > +
> > +       if (!addr_for_skipped_frame) {
> > +                printk(KERN_WARNING "failed to allocate dma memory for 
> > skipped frame");
> > +                ret = -ENXIO;
> > +                goto exit_iounmap;
> > +       }
> > +
> 
> I did not see a corresponding dma_free_coherent in your remove
> function.
> 
> >        ret = dma_declare_coherent_memory(&pdev->dev, start,
> >                                               /* start, len - 640 * 480 * 
> > 2, */
> >                                               start, len,
> > @@ -3230,7 +3253,7 @@
> >        if (!ret) {
> >                 dprintk(0, "failed to declare dma memory");
> >                 ret = -ENXIO;
> > -                 goto exit_iounmap;
> > +                goto exit_dma_skipframe_release;
> >        }
> >         /* init device struct */
> > @@ -3298,6 +3321,9 @@
> >        video_unregister_device(isp->vdev);
> > exit_dma_release:
> >        dma_release_declared_memory(&pdev->dev);
> > +exit_dma_skipframe_release:
> > +       dma_free_coherent(&pdev->dev, isp->mb1_size,
> > +                addr_for_skipped_frame, dma_addr_for_skipped_frame);
> > exit_iounmap:
> >        iounmap(isp->regs);
> > exit_release_regions:
> >          Signed-off-by: Yong He <yong.m...@intel.com>
> 
> Why is this down here?


Attachment: linux-2.6.37-camera-ov5640-ov9740-version-0.95_to_0.951.patch
Description: linux-2.6.37-camera-ov5640-ov9740-version-0.95_to_0.951.patch

_______________________________________________
MeeGo-kernel mailing list
MeeGo-kernel@lists.meego.com
http://lists.meego.com/listinfo/meego-kernel

Reply via email to