diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 86d3596ade2b..4340a5b21d59 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -1308,7 +1308,7 @@ static int rkcif_assign_new_buffer_oneframe(struct rkcif_stream *stream, enum rkcif_yuvaddr_state stat) { struct rkcif_device *dev = stream->cifdev; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf; struct rkcif_buffer *buffer = NULL; u32 frm_addr_y = CIF_REG_DVP_FRM0_ADDR_Y; u32 frm_addr_uv = CIF_REG_DVP_FRM0_ADDR_UV; @@ -1757,7 +1757,7 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream, goto out_get_buf; if (stream->lack_buf_cnt < 2) stream->lack_buf_cnt++; - if (dev->dummy_buf.vaddr) { + if (dev->hw_dev->dummy_buf.vaddr) { if (stream->frame_phase == CIF_CSI_FRAME0_READY) { active_buf = stream->curr_buf_toisp; stream->curr_buf_toisp = NULL; @@ -1793,7 +1793,7 @@ static int rkcif_assign_new_buffer_update_toisp(struct rkcif_stream *stream, else rkcif_rdbk_frame_end_toisp(stream, active_buf); } else { - if (stream->cifdev->rdbk_debug && dev->dummy_buf.vaddr) + if (stream->cifdev->rdbk_debug && dev->hw_dev->dummy_buf.vaddr) v4l2_info(&stream->cifdev->v4l2_dev, "stream[%d] loss frame %d\n", stream->id, @@ -1813,10 +1813,10 @@ out_get_buf: stream->id, stream->frame_idx - 1, frm_addr_y, (u32)buffer->dummy.dma_addr); - } else if (dev->dummy_buf.vaddr && priv && + } else if (dev->hw_dev->dummy_buf.vaddr && priv && priv->mode.rdbk_mode == RKISP_VICAP_RDBK_AUTO) { rkcif_write_register(dev, frm_addr_y, - dev->dummy_buf.dma_addr); + dev->hw_dev->dummy_buf.dma_addr); } spin_unlock_irqrestore(&stream->vbq_lock, flags); return 0; @@ -1954,7 +1954,7 @@ void rkcif_assign_check_buffer_update_toisp(struct rkcif_stream *stream) stream->last_frame_idx = stream->frame_idx; rkcif_s_rx_buffer(dev, &active_buf->dbufs); } - if (dev->dummy_buf.vaddr) + if (dev->hw_dev->dummy_buf.vaddr) return; if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY || mbus_cfg->type == V4L2_MBUS_CSI2_CPHY || @@ -1984,7 +1984,7 @@ static void rkcif_assign_new_buffer_init(struct rkcif_stream *stream, u32 frm0_addr_y, frm0_addr_uv; u32 frm1_addr_y, frm1_addr_uv; unsigned long flags; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf; struct csi_channel_info *channel = &dev->channels[channel_id]; if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY || @@ -2108,7 +2108,7 @@ static int rkcif_assign_new_buffer_update(struct rkcif_stream *stream, int channel_id) { struct rkcif_device *dev = stream->cifdev; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf; struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus; struct rkcif_buffer *buffer = NULL; u32 frm_addr_y, frm_addr_uv; @@ -2348,7 +2348,7 @@ stop_dma: static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream) { struct rkcif_device *dev = stream->cifdev; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf; int ret = 0; unsigned long flags; @@ -2406,7 +2406,7 @@ static int rkcif_get_new_buffer_wake_up_mode(struct rkcif_stream *stream) static int rkcif_update_new_buffer_wake_up_mode(struct rkcif_stream *stream) { struct rkcif_device *dev = stream->cifdev; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf; struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus; struct rkcif_buffer *buffer = NULL; u32 frm_addr_y, frm_addr_uv; @@ -2549,7 +2549,7 @@ static void rkcif_assign_dummy_buffer(struct rkcif_stream *stream) { struct rkcif_device *dev = stream->cifdev; struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf; unsigned long flags; spin_lock_irqsave(&stream->vbq_lock, flags); @@ -3512,7 +3512,7 @@ static void rkcif_check_buffer_update_pingpong(struct rkcif_stream *stream, struct rkcif_device *dev = stream->cifdev; struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus; struct rkcif_buffer *buffer = NULL; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf; u32 frm_addr_y, frm_addr_uv; unsigned long flags; int frame_phase = 0; @@ -3849,35 +3849,42 @@ int rkcif_init_rx_buf(struct rkcif_stream *stream, int buf_num) static int rkcif_create_dummy_buf(struct rkcif_stream *stream) { - u32 fourcc; struct rkcif_device *dev = stream->cifdev; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_hw *hw = dev->hw_dev; + struct rkcif_dummy_buffer *dummy_buf = &hw->dummy_buf; + struct rkcif_device *tmp_dev = NULL; + struct rkcif_stream *tmp_stream = NULL; + struct v4l2_rect rect; + struct csi_channel_info csi_info; + const struct cif_input_fmt *input_fmt; + u32 max_size = 0; + u32 size = 0; int ret = 0; - u32 height = 0; + int i, j; - if (stream->crop_enable) - height = stream->crop[CROP_SRC_ACT].height; - else - height = stream->pixm.height; - - if (dev->sditf_cnt > 1 && dev->sditf_cnt <= RKCIF_MAX_SDITF) - height *= dev->sditf_cnt; - - /* get a maximum plane size */ - dummy_buf->size = max3(stream->pixm.plane_fmt[0].bytesperline * - height, - stream->pixm.plane_fmt[1].sizeimage, - stream->pixm.plane_fmt[2].sizeimage); - /* - * rk cif don't support output yuyv fmt data - * if user request yuyv fmt, the input mode must be RAW8 - * and the width is double Because the real input fmt is - * yuyv - */ - fourcc = stream->cif_fmt_out->fourcc; - if (fourcc == V4L2_PIX_FMT_YUYV || fourcc == V4L2_PIX_FMT_YVYU || - fourcc == V4L2_PIX_FMT_UYVY || fourcc == V4L2_PIX_FMT_VYUY) - dummy_buf->size *= 2; + for (i = 0; i < hw->dev_num; i++) { + tmp_dev = hw->cif_dev[i]; + for (j = 0; j < tmp_dev->num_channels; j++) { + tmp_stream = &tmp_dev->stream[j]; + if (tmp_stream) { + if (!tmp_dev->terminal_sensor.sd) + rkcif_update_sensor_info(tmp_stream); + if (tmp_dev->terminal_sensor.sd) { + input_fmt = get_input_fmt(tmp_dev->terminal_sensor.sd, + &rect, i, &csi_info); + if (input_fmt && input_fmt->mbus_code == MEDIA_BUS_FMT_RGB888_1X24) + size = rect.width * rect.height * 3; + else + size = rect.width * rect.height * 2; + if (size > max_size) + max_size = size; + } else { + continue; + } + } + } + } + dummy_buf->size = max_size; dummy_buf->is_need_vaddr = true; dummy_buf->is_need_dbuf = true; @@ -3897,7 +3904,7 @@ static int rkcif_create_dummy_buf(struct rkcif_stream *stream) static void rkcif_destroy_dummy_buf(struct rkcif_stream *stream) { struct rkcif_device *dev = stream->cifdev; - struct rkcif_dummy_buffer *dummy_buf = &dev->dummy_buf; + struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf; if (dummy_buf->vaddr) rkcif_free_buffer(dev, dummy_buf); @@ -4175,7 +4182,7 @@ void rkcif_do_stop_stream(struct rkcif_stream *stream, stream->is_line_wake_up = false; } } - if (!atomic_read(&dev->pipe.stream_cnt) && dev->dummy_buf.vaddr) + if (can_reset && hw_dev->dummy_buf.vaddr) rkcif_destroy_dummy_buf(stream); stream->cur_stream_mode &= ~mode; v4l2_info(&dev->v4l2_dev, "stream[%d] stopping finished, dma_en 0x%x\n", stream->id, stream->dma_en); @@ -5149,7 +5156,7 @@ int rkcif_do_start_stream(struct rkcif_stream *stream, unsigned int mode) if (((dev->active_sensor && dev->active_sensor->mbus.type == V4L2_MBUS_BT656) || dev->is_use_dummybuf) && - (!dev->dummy_buf.vaddr) && + (!dev->hw_dev->dummy_buf.vaddr) && mode == RKCIF_STREAM_MODE_CAPTURE) { ret = rkcif_create_dummy_buf(stream); if (ret < 0) { @@ -6277,7 +6284,7 @@ int rkcif_register_stream_vdevs(struct rkcif_device *dev, if (ret < 0) goto err; } - + dev->num_channels = stream_num; return 0; err: for (j = 0; j < i; j++) { diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h index bf2cfe1f75c5..f4a686fb5759 100644 --- a/drivers/media/platform/rockchip/cif/dev.h +++ b/drivers/media/platform/rockchip/cif/dev.h @@ -189,21 +189,6 @@ struct rkcif_buffer { struct dma_buf *dbuf; }; -struct rkcif_dummy_buffer { - struct list_head list; - struct dma_buf *dbuf; - dma_addr_t dma_addr; - struct page **pages; - void *mem_priv; - void *vaddr; - u32 size; - int dma_fd; - bool is_need_vaddr; - bool is_need_dbuf; - bool is_need_dmafd; - bool is_free; -}; - struct rkcif_tools_buffer { struct vb2_v4l2_buffer *vb; struct list_head list; @@ -816,7 +801,6 @@ struct rkcif_device { unsigned int wait_line; unsigned int wait_line_bak; unsigned int wait_line_cache; - struct rkcif_dummy_buffer dummy_buf; struct completion cmpl_ntf; struct csi2_dphy_hw *dphy_hw; phys_addr_t resmem_pa; diff --git a/drivers/media/platform/rockchip/cif/hw.c b/drivers/media/platform/rockchip/cif/hw.c index 9ae0b188b19e..612fcb22d76c 100644 --- a/drivers/media/platform/rockchip/cif/hw.c +++ b/drivers/media/platform/rockchip/cif/hw.c @@ -27,7 +27,6 @@ #include #include #include -#include "dev.h" #include "common.h" static const struct cif_reg px30_cif_regs[] = { diff --git a/drivers/media/platform/rockchip/cif/hw.h b/drivers/media/platform/rockchip/cif/hw.h index 93f45502561a..73c05e789a40 100644 --- a/drivers/media/platform/rockchip/cif/hw.h +++ b/drivers/media/platform/rockchip/cif/hw.h @@ -18,6 +18,7 @@ #include #include "regs.h" #include "version.h" +#include "dev.h" #define RKCIF_DEV_MAX 7 #define RKCIF_HW_DRIVER_NAME "rkcifhw" @@ -70,6 +71,21 @@ struct rkcif_multi_sync_config { bool is_attach; }; +struct rkcif_dummy_buffer { + struct list_head list; + struct dma_buf *dbuf; + dma_addr_t dma_addr; + struct page **pages; + void *mem_priv; + void *vaddr; + u32 size; + int dma_fd; + bool is_need_vaddr; + bool is_need_dbuf; + bool is_need_dmafd; + bool is_free; +}; + /* * add new chip id in tail in time order * by increasing to distinguish cif version @@ -116,20 +132,20 @@ struct rkcif_hw { int chip_id; const struct cif_reg *cif_regs; const struct vb2_mem_ops *mem_ops; - bool iommu_en; - bool can_be_reset; - bool is_dma_sg_ops; - bool is_dma_contig; struct rkcif_device *cif_dev[RKCIF_DEV_MAX]; int dev_num; - atomic_t power_cnt; const struct rkcif_hw_match_data *match_data; struct mutex dev_lock; struct rkcif_multi_sync_config sync_config; spinlock_t group_lock; - bool adapt_to_usbcamerahal; struct notifier_block reset_notifier; /* reset for mipi csi crc err */ + struct rkcif_dummy_buffer dummy_buf; + bool iommu_en; + bool can_be_reset; + bool is_dma_sg_ops; + bool is_dma_contig; + bool adapt_to_usbcamerahal; }; void rkcif_hw_soft_reset(struct rkcif_hw *cif_hw, bool is_rst_iommu); diff --git a/drivers/media/platform/rockchip/cif/procfs.c b/drivers/media/platform/rockchip/cif/procfs.c index 377834818cfd..7c1b2c2c4973 100644 --- a/drivers/media/platform/rockchip/cif/procfs.c +++ b/drivers/media/platform/rockchip/cif/procfs.c @@ -8,7 +8,6 @@ #include #include -#include "hw.h" #include "dev.h" #include "procfs.h"