media: rockchip: ispp: first frame handle for multi dev

Change-Id: Ie4bc4c8b8a7486fca6bd6b55ca395eb774997120
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2021-08-10 08:56:18 +08:00
committed by Tao Huang
parent 10bf39031d
commit bd01d85285
5 changed files with 54 additions and 31 deletions

View File

@@ -56,5 +56,8 @@ struct rkispp_device {
bool stream_sync;
void (*irq_hdl)(u32 mis, struct rkispp_device *dev);
u32 first_frame_dma;
bool is_first;
};
#endif

View File

@@ -329,7 +329,6 @@ static int rkispp_hw_probe(struct platform_device *pdev)
hw_dev->is_dma_sg_ops = false;
hw_dev->is_shutdown = false;
hw_dev->is_first = true;
hw_dev->first_frame_dma = -1;
hw_dev->is_mmu = is_iommu_enable(dev);
ret = of_reserved_mem_device_init(dev);
if (ret) {

View File

@@ -53,7 +53,6 @@ struct rkispp_hw_dev {
atomic_t refcnt;
const struct vb2_mem_ops *mem_ops;
struct rkisp_ispp_reg *reg_buf;
u32 first_frame_dma;
bool is_mmu;
bool is_idle;
bool is_single;

View File

@@ -273,6 +273,8 @@ static int rkispp_sd_s_stream(struct v4l2_subdev *sd, int on)
"s_stream on:%d\n", on);
if (on) {
dev->is_first = true;
dev->first_frame_dma = -1;
ispp_sdev->state = ISPP_START;
ispp_sdev->frm_sync_seq = -1;
ispp_sdev->frame_timestamp = 0;
@@ -457,28 +459,28 @@ static long rkispp_compat_ioctl32(struct v4l2_subdev *sd,
switch (cmd) {
case RKISPP_CMD_GET_FECBUF_INFO:
ret = rkispp_ioctl(sd, cmd, &fecbuf);
if (!ret)
ret = copy_to_user(up, &fecbuf, sizeof(fecbuf));
if (!ret && copy_to_user(up, &fecbuf, sizeof(fecbuf)))
ret = -EFAULT;
break;
case RKISPP_CMD_SET_FECBUF_SIZE:
ret = copy_from_user(&fecsize, up, sizeof(fecsize));
if (!ret)
ret = rkispp_ioctl(sd, cmd, &fecsize);
if (copy_from_user(&fecsize, up, sizeof(fecsize)))
return -EFAULT;
ret = rkispp_ioctl(sd, cmd, &fecsize);
break;
case RKISPP_CMD_TRIGGER_YNRRUN:
ret = copy_from_user(&tnr_inf, up, sizeof(tnr_inf));
if (!ret)
ret = rkispp_ioctl(sd, cmd, &tnr_inf);
if (copy_from_user(&tnr_inf, up, sizeof(tnr_inf)))
return -EFAULT;
ret = rkispp_ioctl(sd, cmd, &tnr_inf);
break;
case RKISPP_CMD_GET_TNRBUF_FD:
ret = rkispp_ioctl(sd, cmd, &idxfd);
if (!ret)
ret = copy_to_user(up, &idxfd, sizeof(idxfd));
if (!ret && copy_to_user(up, &idxfd, sizeof(idxfd)))
ret = -EFAULT;
break;
case RKISPP_CMD_TRIGGER_MODE:
ret = copy_from_user(&t_mode, up, sizeof(t_mode));
if (!ret)
ret = rkispp_ioctl(sd, cmd, &t_mode);
if (copy_from_user(&t_mode, up, sizeof(t_mode)))
return -EFAULT;
ret = rkispp_ioctl(sd, cmd, &t_mode);
break;
default:
ret = -ENOIOCTLCMD;

View File

@@ -2383,13 +2383,6 @@ static void restart_module(struct rkispp_device *dev)
rkispp_set_bits(dev, RKISPP_TNR_CTRL, 0, SW_TNR_1ST_FRM);
monitor->tnr.is_err = false;
}
if (monitor->restart_module & MONITOR_NR && monitor->nr.is_err) {
rkispp_write(dev, RKISPP_NR_ADDR_BASE_Y,
readl(base + RKISPP_NR_ADDR_BASE_Y_SHD));
rkispp_write(dev, RKISPP_NR_ADDR_BASE_UV,
readl(base + RKISPP_NR_ADDR_BASE_UV_SHD));
monitor->nr.is_err = false;
}
rkispp_soft_reset(dev->hw_dev);
rkispp_update_regs(dev, RKISPP_CTRL_QUICK, RKISPP_FEC_CROP);
writel(ALL_FORCE_UPD, base + RKISPP_CTRL_UPDATE);
@@ -2404,6 +2397,32 @@ static void restart_module(struct rkispp_device *dev)
complete(&monitor->tnr.cmpl);
}
if (monitor->restart_module & MONITOR_NR) {
if (monitor->nr.is_err) {
struct rkispp_stream_vdev *vdev = &dev->stream_vdev;
struct v4l2_subdev *sd = dev->ispp_sdev.remote_sd;
struct rkispp_buffer *inbuf;
if (vdev->nr.cur_rd) {
if (vdev->nr.cur_rd->is_isp) {
v4l2_subdev_call(sd, video, s_rx_buffer,
vdev->nr.cur_rd, NULL);
} else if (!vdev->nr.cur_rd->priv) {
list_add_tail(&vdev->nr.cur_rd->list,
&vdev->tnr.list_wr);
} else {
inbuf = vdev->nr.cur_rd->priv;
vb2_buffer_done(&inbuf->vb.vb2_buf, VB2_BUF_STATE_DONE);
}
vdev->nr.cur_rd = NULL;
}
rkispp_set_bits(dev, RKISPP_TNR_CTRL, 0, SW_TNR_1ST_FRM);
vdev->nr.is_end = true;
monitor->nr.is_err = false;
monitor->is_restart = false;
monitor->restart_module = 0;
rkispp_event_handle(dev, CMD_QUEUE_DMABUF, NULL);
goto end;
}
val |= NR_SHP_ST;
monitor->monitoring_module |= MONITOR_NR;
if (!completion_done(&monitor->nr.cmpl))
@@ -2801,9 +2820,10 @@ static void nr_work_event(struct rkispp_device *dev,
dbuf = vdev->nr.cur_rd->dbuf[GROUP_BUF_PIC];
dummy = dbuf_to_dummy(dbuf, &vdev->tnr.buf.iir, size);
val = dummy->dma_addr;
if (dev->hw_dev->is_first && dev->hw_dev->first_frame_dma != -1) {
val = dev->hw_dev->first_frame_dma;
dev->hw_dev->first_frame_dma = -1;
if (dev->is_first && dev->first_frame_dma != -1) {
val = dev->first_frame_dma;
dev->first_frame_dma = -1;
dev->is_first = false;
}
rkispp_write(dev, RKISPP_NR_ADDR_BASE_Y, val);
val += vdev->nr.uv_offset;
@@ -3002,10 +3022,11 @@ static void tnr_work_event(struct rkispp_device *dev,
if (!buf_rd && !buf_wr && is_isr) {
vdev->tnr.is_end = true;
if (dev->hw_dev->is_first && vdev->tnr.nxt_rd) {
if (dev->is_first && vdev->tnr.nxt_rd) {
struct rkispp_isp_buf_pool *tbuf = get_pool_buf(dev, vdev->tnr.nxt_rd);
dev->hw_dev->first_frame_dma = tbuf->dma[GROUP_BUF_PIC];
dev->first_frame_dma = tbuf->dma[GROUP_BUF_PIC];
rkispp_set_bits(dev, RKISPP_TNR_CTRL, 0, SW_TNR_1ST_FRM);
}
if (vdev->tnr.cur_rd) {
@@ -3088,8 +3109,7 @@ static void tnr_work_event(struct rkispp_device *dev,
vdev->tnr.cur_rd = vdev->tnr.nxt_rd;
vdev->tnr.nxt_rd = buf_rd;
/* first buf for 3to1 using twice */
if (!is_3to1 ||
(rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM))
if (!is_3to1 || dev->is_first)
vdev->tnr.cur_rd = vdev->tnr.nxt_rd;
} else if (vdev->tnr.is_end && !list_empty(list)) {
/* tnr read buf from list
@@ -3148,7 +3168,7 @@ static void tnr_work_event(struct rkispp_device *dev,
val = buf->dma[GROUP_BUF_GAIN];
rkispp_write(dev, RKISPP_TNR_GAIN_NXT_Y_BASE, val);
if (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM)
if (dev->is_first)
vdev->tnr.cur_rd = NULL;
}
}
@@ -3454,7 +3474,7 @@ void rkispp_isr(u32 mis_val, struct rkispp_device *dev)
(dev->isp_mode & ISP_ISPP_QUICK))
++dev->ispp_sdev.frm_sync_seq;
if (mis_val & TNR_INT && !dev->hw_dev->is_first)
if (mis_val & TNR_INT)
if (rkispp_read(dev, RKISPP_TNR_CTRL) & SW_TNR_1ST_FRM)
rkispp_clear_bits(dev, RKISPP_TNR_CTRL, SW_TNR_1ST_FRM);