gdc: Sync the gdc dma buffer
authorkeke.li <keke.li@amlogic.com>
Wed, 26 Sep 2018 05:51:54 +0000 (13:51 +0800)
committerJianxin Pan <jianxin.pan@amlogic.com>
Fri, 28 Sep 2018 09:46:10 +0000 (02:46 -0700)
PD#173042: gdc: Sync the gdc dma buffer

Change-Id: Id4f70c2379ab82519e3b3eeb780f8db17b4deeaf
Signed-off-by: Keke Li <keke.li@amlogic.com>
drivers/amlogic/media/gdc/app/gdc_module.c

index 7e6fe1b..7e9ad5f 100644 (file)
@@ -249,6 +249,30 @@ static long meson_gdc_set_input_addr(uint32_t start_addr,
        return 0;
 }
 
+static void meson_gdc_dma_flush(struct device *dev,
+                                       dma_addr_t addr,
+                                       size_t size)
+{
+       if (dev == NULL) {
+               LOG(LOG_ERR, "Error input param");
+               return;
+       }
+
+       dma_sync_single_for_device(dev, addr, size, DMA_TO_DEVICE);
+}
+
+static void meson_gdc_cache_flush(struct device *dev,
+                                       dma_addr_t addr,
+                                       size_t size)
+{
+       if (dev == NULL) {
+               LOG(LOG_ERR, "Error input param");
+               return;
+       }
+
+       dma_sync_single_for_cpu(dev, addr, size, DMA_FROM_DEVICE);
+}
+
 static long meson_gdc_ioctl(struct file *file, unsigned int cmd,
                unsigned long arg)
 {
@@ -346,6 +370,10 @@ static long meson_gdc_ioctl(struct file *file, unsigned int cmd,
                gs->fh = fh;
 
                mutex_lock(&fh->gdev->d_mutext);
+               meson_gdc_dma_flush(&fh->gdev->pdev->dev,
+                                       fh->i_paddr, fh->i_len);
+               meson_gdc_dma_flush(&fh->gdev->pdev->dev,
+                                       fh->c_paddr, fh->c_len);
                ret = gdc_run(gs);
                if (ret < 0)
                        LOG(LOG_ERR, "gdc process failed ret = %ld\n", ret);
@@ -356,6 +384,8 @@ static long meson_gdc_ioctl(struct file *file, unsigned int cmd,
                        LOG(LOG_ERR, "gdc timeout\n");
 
                gdc_stop(gs);
+               meson_gdc_cache_flush(&fh->gdev->pdev->dev,
+                                       fh->o_paddr, fh->o_len);
                mutex_unlock(&fh->gdev->d_mutext);
        break;
        case GDC_REQUEST_BUFF: