media: rockchip: isp1: fix get zero data when start stream again

use the following sequence, we will get zero data.
1. open video device;
2. start stream;
3. stop stream;
4. start stream again, we will get zero data.

Change-Id: I7433f4891f66c2228e840116a5d4632298ab62c4
Signed-off-by: Hu Kejun <william.hu@rock-chips.com>
This commit is contained in:
Hu Kejun
2019-04-30 09:42:12 +08:00
committed by Tao Huang
parent cde51a9363
commit d8a50ba96c
3 changed files with 38 additions and 29 deletions

View File

@@ -1711,35 +1711,6 @@ static int rkisp1_set_fmt(struct rkisp1_stream *stream,
return 0;
}
static int rkisp1_dma_attach_device(struct rkisp1_device *rkisp1_dev)
{
struct iommu_domain *domain = rkisp1_dev->domain;
struct device *dev = rkisp1_dev->dev;
int ret;
ret = iommu_attach_device(domain, dev);
if (ret) {
dev_err(dev, "Failed to attach iommu device\n");
return ret;
}
if (!common_iommu_setup_dma_ops(dev, 0x10000000, SZ_2G, domain->ops)) {
dev_err(dev, "Failed to set dma_ops\n");
iommu_detach_device(domain, dev);
ret = -ENODEV;
}
return ret;
}
static void rkisp1_dma_detach_device(struct rkisp1_device *rkisp1_dev)
{
struct iommu_domain *domain = rkisp1_dev->domain;
struct device *dev = rkisp1_dev->dev;
iommu_detach_device(domain, dev);
}
int rkisp1_fh_open(struct file *filp)
{
struct rkisp1_stream *stream = video_drvdata(filp);
@@ -2132,6 +2103,35 @@ err:
return ret;
}
int rkisp1_dma_attach_device(struct rkisp1_device *rkisp1_dev)
{
struct iommu_domain *domain = rkisp1_dev->domain;
struct device *dev = rkisp1_dev->dev;
int ret;
ret = iommu_attach_device(domain, dev);
if (ret) {
dev_err(dev, "Failed to attach iommu device\n");
return ret;
}
if (!common_iommu_setup_dma_ops(dev, 0x10000000, SZ_2G, domain->ops)) {
dev_err(dev, "Failed to set dma_ops\n");
iommu_detach_device(domain, dev);
ret = -ENODEV;
}
return ret;
}
void rkisp1_dma_detach_device(struct rkisp1_device *rkisp1_dev)
{
struct iommu_domain *domain = rkisp1_dev->domain;
struct device *dev = rkisp1_dev->dev;
iommu_detach_device(domain, dev);
}
/**************** Interrupter Handler ****************/
void rkisp1_mi_isr(u32 mis_val, struct rkisp1_device *dev)

View File

@@ -216,4 +216,7 @@ void rkisp1_mipi_dmatx0_end(u32 status, struct rkisp1_device *dev);
int fcc_xysubs(u32 fcc, u32 *xsubs, u32 *ysubs);
int rkisp1_fh_open(struct file *filp);
int rkisp1_fop_release(struct file *file);
int rkisp1_dma_attach_device(struct rkisp1_device *rkisp1_dev);
void rkisp1_dma_detach_device(struct rkisp1_device *rkisp1_dev);
#endif /* _RKISP1_PATH_VIDEO_H */

View File

@@ -46,6 +46,7 @@
#include "common.h"
#include "regs.h"
#include "capture.h"
/*
* NOTE: MIPI controller and input MUX are also configured in this file,
@@ -694,6 +695,11 @@ static int rkisp1_isp_stop(struct rkisp1_device *dev)
writel(0, base + CIF_ISP_CSI0_MASK2);
writel(0, base + CIF_ISP_CSI0_MASK3);
}
if (!in_interrupt()) {
rkisp1_dma_detach_device(dev);
rkisp1_dma_attach_device(dev);
}
dev->isp_state = ISP_STOP;
if (dev->emd_vc <= CIF_ISP_ADD_DATA_VC_MAX) {