struct device *dev,
struct ge2d_dmabuf_req_s *ge2d_req_buf)
{
- struct aml_dma_buf *dma_buf;
void *buf;
+ struct aml_dma_buf *dma_buf;
unsigned int size;
int index;
buffer->gd_buffer[index].alloc = 1;
mutex_unlock(&(buffer->lock));
ge2d_req_buf->index = index;
+ dma_buf = (struct aml_dma_buf *)buf;
+ if (dma_buf->dma_dir == DMA_FROM_DEVICE)
+ dma_sync_single_for_cpu(dma_buf->dev,
+ dma_buf->dma_addr,
+ dma_buf->size, DMA_FROM_DEVICE);
return 0;
}
return;
}
if (buf->size > 0)
- dma_sync_single_for_device(buf->dev, buf->dma_addr,
+ dma_sync_single_for_cpu(buf->dev, buf->dma_addr,
buf->size, DMA_FROM_DEVICE);
dma_buf_put(dmabuf);
}
struct device *dev,
struct gdc_dmabuf_req_s *gdc_req_buf)
{
- struct aml_dma_buf *dma_buf;
void *buf;
+ struct aml_dma_buf *dma_buf;
unsigned int size;
int index;
buffer->gd_buffer[index].alloc = 1;
mutex_unlock(&(buffer->lock));
gdc_req_buf->index = index;
+ dma_buf = (struct aml_dma_buf *)buf;
+ if (dma_buf->dma_dir == DMA_FROM_DEVICE)
+ dma_sync_single_for_cpu(dma_buf->dev,
+ dma_buf->dma_addr,
+ dma_buf->size, DMA_FROM_DEVICE);
return 0;
}
return;
}
if (buf->size > 0)
- dma_sync_single_for_device(buf->dev, buf->dma_addr,
+ dma_sync_single_for_cpu(buf->dev, buf->dma_addr,
buf->size, DMA_FROM_DEVICE);
dma_buf_put(dmabuf);
}
{} };
MODULE_DEVICE_TABLE(of, gdc_dt_match);
+static void meson_gdc_cache_flush(struct device *dev,
+ dma_addr_t addr,
+ size_t size);
//////
static int meson_gdc_open(struct inode *inode, struct file *file)
fh->gdev = gdc_dev;
- gdc_log(LOG_CRIT, "Success open\n");
+ gdc_log(LOG_INFO, "Success open\n");
return rc;
}
fh = NULL;
if (ret == 0)
- gdc_log(LOG_CRIT, "Success release\n");
+ gdc_log(LOG_INFO, "Success release\n");
else
gdc_log(LOG_ERR, "Error release\n");
fh->o_paddr = page_to_phys(cma_pages);
fh->o_kaddr = phys_to_virt(fh->o_paddr);
fh->o_len = len;
+ meson_gdc_cache_flush(&fh->gdev->pdev->dev,
+ fh->o_paddr, fh->o_len);
break;
case CONFIG_BUFF_TYPE:
if (fh->c_paddr != 0 && fh->c_kaddr != NULL)