mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
media: rockchip: isp: aiisp for isp39
Change-Id: Ibcbcfd1865fb8a20f1fe190e09b8bd91133c4b98 Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
@@ -286,7 +286,10 @@ struct rkisp_device {
|
||||
|
||||
struct mutex buf_lock;
|
||||
spinlock_t cmsk_lock;
|
||||
spinlock_t aiisp_lock;
|
||||
struct rkisp_cmsk_cfg cmsk_cfg;
|
||||
struct rkisp_aiisp_cfg aiisp_cfg;
|
||||
|
||||
bool is_cmsk_upd;
|
||||
bool is_hw_link;
|
||||
bool is_bigmode;
|
||||
@@ -298,6 +301,8 @@ struct rkisp_device {
|
||||
bool is_suspend;
|
||||
bool suspend_sync;
|
||||
bool is_suspend_one_frame;
|
||||
bool is_aiisp_en;
|
||||
bool is_aiisp_upd;
|
||||
|
||||
struct rkisp_vicap_input vicap_in;
|
||||
|
||||
|
||||
@@ -3245,12 +3245,25 @@ isp_bay3d_enable(struct rkisp_isp_params_vdev *params_vdev, bool en)
|
||||
value = priv_val->buf_3dnr_iir.dma_addr;
|
||||
isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_WR_BASE);
|
||||
isp3_param_write(params_vdev, value, ISP3X_MI_BAY3D_IIR_RD_BASE);
|
||||
isp3_param_write(params_vdev, value, ISP39_AIISP_RD_BASE);
|
||||
if (priv_val->buf_gain.mem_priv) {
|
||||
value = priv_val->buf_gain.size;
|
||||
isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_SIZE);
|
||||
isp3_param_write(params_vdev, value, ISP32_MI_RAW0_RD_SIZE);
|
||||
value = priv_val->buf_gain.dma_addr;
|
||||
isp3_param_write(params_vdev, value, ISP3X_MI_GAIN_WR_BASE);
|
||||
isp3_param_write(params_vdev, value, ISP3X_MI_RAW0_RD_BASE);
|
||||
|
||||
value = isp3_param_read_cache(params_vdev, ISP3X_GAIN_CTRL);
|
||||
value |= ISP3X_GAIN_2DDR_MODE(1) | ISP3X_GAIN_2DDR_EN;
|
||||
isp3_param_write(params_vdev, value, ISP3X_GAIN_CTRL);
|
||||
}
|
||||
|
||||
bay3d_ctrl |= ISP39_MODULE_EN;
|
||||
isp3_param_write(params_vdev, bay3d_ctrl, ISP3X_BAY3D_CTRL);
|
||||
|
||||
value = ISP3X_BAY3D_IIR_WR_AUTO_UPD | ISP3X_BAY3D_IIRSELF_UPD |
|
||||
ISP3X_BAY3D_RDSELF_UPD;
|
||||
ISP3X_BAY3D_RDSELF_UPD | ISP3X_GAIN_WR_AUTO_UPD | ISP3X_GAINSELF_UPD;
|
||||
isp3_param_set_bits(params_vdev, MI_WR_CTRL2, value);
|
||||
|
||||
isp3_param_set_bits(params_vdev, ISP3X_ISP_CTRL1, ISP3X_RAW3D_FST_FRAME);
|
||||
@@ -4077,7 +4090,24 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev,
|
||||
ret = rkisp_alloc_buffer(dev, &priv_val->buf_3dnr_iir);
|
||||
if (ret) {
|
||||
dev_err(dev->dev, "alloc bay3d iir buf fail:%d\n", ret);
|
||||
goto err_3dnr;
|
||||
goto err_3dnr_iir;
|
||||
}
|
||||
}
|
||||
|
||||
val = ALIGN(w * h / 4, 16);
|
||||
is_alloc = iirsparse_en ? true : false;
|
||||
if (priv_val->buf_gain.mem_priv) {
|
||||
if (val > priv_val->buf_gain.size)
|
||||
rkisp_free_buffer(dev, &priv_val->buf_gain);
|
||||
else
|
||||
is_alloc = false;
|
||||
}
|
||||
if (is_alloc) {
|
||||
priv_val->buf_gain.size = val;
|
||||
ret = rkisp_alloc_buffer(dev, &priv_val->buf_gain);
|
||||
if (ret) {
|
||||
dev_err(dev->dev, "alloc gain buf fail:%d\n", ret);
|
||||
goto free_3dnr_iir;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4099,7 +4129,7 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev,
|
||||
ret = rkisp_alloc_buffer(dev, &priv_val->buf_3dnr_cur);
|
||||
if (ret) {
|
||||
dev_err(dev->dev, "alloc yuvme cur buf fail:%d\n", ret);
|
||||
goto free_3dnr;
|
||||
goto free_gain;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4111,13 +4141,17 @@ rkisp_alloc_internal_buf(struct rkisp_isp_params_vdev *params_vdev,
|
||||
if (ret) {
|
||||
dev->hw_dev->is_frm_buf = false;
|
||||
dev_err(dev->dev, "alloc frm buf fail:%d\n", ret);
|
||||
goto free_3dnr;
|
||||
goto free_3dnr_cur;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
free_3dnr:
|
||||
free_3dnr_cur:
|
||||
rkisp_free_buffer(dev, &priv_val->buf_3dnr_cur);
|
||||
free_gain:
|
||||
rkisp_free_buffer(dev, &priv_val->buf_gain);
|
||||
free_3dnr_iir:
|
||||
rkisp_free_buffer(dev, &priv_val->buf_3dnr_iir);
|
||||
err_3dnr:
|
||||
err_3dnr_iir:
|
||||
i = ISP39_3DLUT_BUF_NUM;
|
||||
err_3dlut:
|
||||
for (i -= 1; i >= 0; i--)
|
||||
@@ -4528,8 +4562,8 @@ rkisp_params_info2ddr_cfg_v39(struct rkisp_isp_params_vdev *params_vdev, void *a
|
||||
u32 reg, ctrl, mask, size, val, wsize = 0, vsize = 0;
|
||||
int i, ret;
|
||||
|
||||
if (cfg->owner == RKISP_INFO2DRR_OWNER_GAIN) {
|
||||
dev_err(dev->dev, "%s no support gain for lite\n", __func__);
|
||||
if (dev->is_aiisp_en) {
|
||||
dev_err(dev->dev, "%s no support for aiisp enable\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
priv_val = params_vdev->priv_val;
|
||||
@@ -4637,6 +4671,26 @@ err:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void
|
||||
rkisp_params_get_bay3d_buffd_v39(struct rkisp_isp_params_vdev *params_vdev,
|
||||
struct rkisp_bay3dbuf_info *bay3dbuf)
|
||||
{
|
||||
struct rkisp_isp_params_val_v39 *priv_val = params_vdev->priv_val;
|
||||
struct rkisp_dummy_buffer *buf;
|
||||
|
||||
buf = &priv_val->buf_3dnr_iir;
|
||||
if (rkisp_buf_get_fd(params_vdev->dev, buf, true) < 0)
|
||||
return;
|
||||
bay3dbuf->iir_fd = buf->dma_fd;
|
||||
bay3dbuf->iir_size = buf->size;
|
||||
|
||||
buf = &priv_val->buf_gain;
|
||||
if (rkisp_buf_get_fd(params_vdev->dev, buf, true) < 0)
|
||||
return;
|
||||
bay3dbuf->u.v39.gain_fd = buf->dma_fd;
|
||||
bay3dbuf->u.v39.gain_size = buf->size;
|
||||
}
|
||||
|
||||
static void
|
||||
rkisp_params_stream_stop_v39(struct rkisp_isp_params_vdev *params_vdev)
|
||||
{
|
||||
@@ -4646,6 +4700,7 @@ rkisp_params_stream_stop_v39(struct rkisp_isp_params_vdev *params_vdev)
|
||||
|
||||
priv_val = (struct rkisp_isp_params_val_v39 *)params_vdev->priv_val;
|
||||
rkisp_free_buffer(ispdev, &priv_val->buf_frm);
|
||||
rkisp_free_buffer(ispdev, &priv_val->buf_gain);
|
||||
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_iir);
|
||||
rkisp_free_buffer(ispdev, &priv_val->buf_3dnr_cur);
|
||||
for (i = 0; i < ISP39_3DLUT_BUF_NUM; i++)
|
||||
@@ -4858,6 +4913,7 @@ static struct rkisp_isp_params_ops rkisp_isp_params_ops_tbl = {
|
||||
.fop_release = rkisp_params_fop_release_v39,
|
||||
.check_bigmode = rkisp_params_check_bigmode_v39,
|
||||
.info2ddr_cfg = rkisp_params_info2ddr_cfg_v39,
|
||||
.get_bay3d_buffd = rkisp_params_get_bay3d_buffd_v39,
|
||||
};
|
||||
|
||||
int rkisp_init_params_vdev_v39(struct rkisp_isp_params_vdev *params_vdev)
|
||||
|
||||
@@ -142,6 +142,7 @@ struct rkisp_isp_params_val_v39 {
|
||||
u32 buf_info_cnt;
|
||||
int buf_info_idx;
|
||||
|
||||
struct rkisp_dummy_buffer buf_gain;
|
||||
struct rkisp_dummy_buffer buf_3dnr_iir;
|
||||
struct rkisp_dummy_buffer buf_3dnr_cur;
|
||||
|
||||
|
||||
@@ -186,6 +186,8 @@
|
||||
#define ISP32_ISP_DEBUG4 (ISP3X_ISP_BASE + 0x00254)
|
||||
#define ISP32_YNR_LUMA_RCTRL (ISP3X_ISP_BASE + 0x00290)
|
||||
#define ISP32_YNR_LUMA_RDATA (ISP3X_ISP_BASE + 0x00294)
|
||||
#define ISP39_SLICE_ST_CTRL (ISP3X_ISP_BASE + 0x002a4)
|
||||
#define ISP39_AIISP_LINE_CNT (ISP3X_ISP_BASE + 0x002a8)
|
||||
|
||||
#define ISP3X_FLASH_BASE 0x00000660
|
||||
#define ISP3X_FLASH_CMD (ISP3X_FLASH_BASE + 0x00000)
|
||||
@@ -673,6 +675,7 @@
|
||||
#define ISP3X_MI_DBR_WR_LENGTH (ISP3X_MI_BASE + 0x00568)
|
||||
#define ISP3X_MI_DBR_WR_BASE_SHD (ISP3X_MI_BASE + 0x0056C)
|
||||
#define ISP3X_MI_DBR_RD_BASE (ISP3X_MI_BASE + 0x00570)
|
||||
#define ISP39_AIISP_RD_BASE (ISP3X_MI_BASE + 0x00570)
|
||||
#define ISP3X_MI_DBR_RD_LENGTH (ISP3X_MI_BASE + 0x00574)
|
||||
#define ISP3X_MI_DBR_RD_BASE_SHD (ISP3X_MI_BASE + 0x00578)
|
||||
#define ISP3X_MI_3A_WR_BASE (ISP3X_MI_BASE + 0x0057C)
|
||||
@@ -2455,6 +2458,7 @@
|
||||
#define ISP3X_LSC_LUT_ERR BIT(16)
|
||||
#define ISP3X_FLASH_CAP BIT(17)
|
||||
#define ISP3X_EXP_END BIT(18)
|
||||
#define ISP39_AIISP_LINECNT_DONE BIT(18)
|
||||
#define ISP3X_HDR_DONE BIT(20)
|
||||
#define ISP3X_DHAZ_DONE BIT(21)
|
||||
#define ISP3X_GIAN_ERR BIT(22)
|
||||
@@ -2488,6 +2492,14 @@
|
||||
#define ISP32_YNR_LUMA_RDBK_OFFS(a) (((a) & 0x3fff) << 16)
|
||||
#define ISP32_YNR_LUMA_RDBK_RDY BIT(31)
|
||||
|
||||
#define ISP39_SLICE_ST BIT(0)
|
||||
#define ISP39_SLICE_EN BIT(1)
|
||||
#define ISP39_OUT_LINE(a) (((a) >> 16) & 0x3fff)
|
||||
#define ISP39_SLICE_DONE BIT(31)
|
||||
|
||||
#define ISP39_AIISP_RD_LINECNT(x) ((x) >> 16)
|
||||
#define ISP39_AIISP_WR_LINECNT(x) ((x) & 0xffff)
|
||||
|
||||
/* DUAL CROP */
|
||||
#define ISP3X_DUAL_CROP_FBC_MODE BIT(8)
|
||||
|
||||
@@ -2580,6 +2592,10 @@
|
||||
#define ISP3X_DBR_ST_MODE BIT(30)
|
||||
#define ISP3X_DBR_ST BIT(31)
|
||||
|
||||
/* MI_RD_CTRL2 */
|
||||
#define ISP39_AIISP_ST BIT(8)
|
||||
#define ISP39_AIISP_EN BIT(9)
|
||||
|
||||
/* WR_OUTPUT_FORMAT */
|
||||
#define ISP32_MI_OUTPUT_MASK GENMASK(10, 8)
|
||||
#define ISP32_MI_OUTPUT_YUV400 0
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
*/
|
||||
|
||||
static void rkisp_config_cmsk(struct rkisp_device *dev);
|
||||
static void rkisp_config_aiisp(struct rkisp_device *dev);
|
||||
|
||||
static inline struct rkisp_device *sd_to_isp_dev(struct v4l2_subdev *sd)
|
||||
{
|
||||
@@ -639,6 +640,7 @@ void rkisp_trigger_read_back(struct rkisp_device *dev, u8 dma2frm, u32 mode, boo
|
||||
dev->isp_sdev.quantization);
|
||||
rkisp_params_cfg(params_vdev, cur_frame_id);
|
||||
rkisp_config_cmsk(dev);
|
||||
rkisp_config_aiisp(dev);
|
||||
rkisp_stream_frame_start(dev, 0);
|
||||
}
|
||||
|
||||
@@ -1795,6 +1797,7 @@ static int rkisp_config_isp(struct rkisp_device *dev)
|
||||
}
|
||||
|
||||
rkisp_config_cmsk(dev);
|
||||
rkisp_config_aiisp(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3438,13 +3441,10 @@ rkisp_isp_queue_event_sof(struct rkisp_isp_subdev *isp)
|
||||
}
|
||||
|
||||
static int rkisp_isp_sd_subs_evt(struct v4l2_subdev *sd, struct v4l2_fh *fh,
|
||||
struct v4l2_event_subscription *sub)
|
||||
struct v4l2_event_subscription *sub)
|
||||
{
|
||||
if (sub->type != V4L2_EVENT_FRAME_SYNC)
|
||||
return -EINVAL;
|
||||
|
||||
/* Line number. For now only zero accepted. */
|
||||
if (sub->id != 0)
|
||||
if (sub->type != V4L2_EVENT_FRAME_SYNC &&
|
||||
sub->type != RKISP_V4L2_EVENT_AIISP_LINECNT)
|
||||
return -EINVAL;
|
||||
|
||||
return v4l2_event_subscribe(fh, sub, ISP_V4L2_EVENT_ELEMS, NULL);
|
||||
@@ -3553,6 +3553,139 @@ static int rkisp_set_work_mode_by_vicap(struct rkisp_device *isp_dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rkisp_queue_event_aiisp(struct rkisp_device *dev, u32 irq)
|
||||
{
|
||||
struct v4l2_event ev = { 0 };
|
||||
struct rkisp_aiisp_ev_info *ev_info;
|
||||
u32 h = dev->isp_sdev.out_crop.height;
|
||||
u32 val, wr_line, rd_line;
|
||||
|
||||
if (dev->isp_ver != ISP_V39)
|
||||
return;
|
||||
if (sizeof(*ev_info) > sizeof(ev.u)) {
|
||||
v4l2_err(&dev->v4l2_dev, "aiisp_ev_info too large\n");
|
||||
return;
|
||||
}
|
||||
ev_info = (struct rkisp_aiisp_ev_info *)ev.u.data;
|
||||
|
||||
val = rkisp_read(dev, ISP39_AIISP_LINE_CNT, false);
|
||||
if (irq & ISP3X_OUT_FRM_QUARTER) {
|
||||
rd_line = ISP39_AIISP_RD_LINECNT(val);
|
||||
ev.id = RKISP_AIISP_RD_LINECNT_ID;
|
||||
ev_info->height = !rd_line ? h : rd_line;
|
||||
|
||||
if (dev->aiisp_cfg.rd_mode) {
|
||||
rd_line += dev->aiisp_cfg.rd_linecnt;
|
||||
if (rd_line > h)
|
||||
rd_line = h - 1;
|
||||
rkisp_write(dev, ISP32_ISP_IRQ_CFG0, rd_line, true);
|
||||
}
|
||||
} else {
|
||||
wr_line = ISP39_AIISP_WR_LINECNT(val);
|
||||
ev.id = RKISP_AIISP_WR_LINECNT_ID;
|
||||
ev_info->height = !wr_line ? h : wr_line;
|
||||
|
||||
if (dev->aiisp_cfg.wr_mode) {
|
||||
wr_line += dev->aiisp_cfg.wr_linecnt;
|
||||
if (wr_line > h)
|
||||
wr_line = h - 1;
|
||||
rkisp_write(dev, ISP32_ISP_IRQ_CFG1, wr_line << 16, true);
|
||||
}
|
||||
}
|
||||
rkisp_dmarx_get_frame(dev, &ev_info->sequence, NULL, NULL, true);
|
||||
ev.type = RKISP_V4L2_EVENT_AIISP_LINECNT;
|
||||
v4l2_event_queue(dev->isp_sdev.sd.devnode, &ev);
|
||||
v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
|
||||
"%s seq:%d ev.id:%d height:%d\n", __func__,
|
||||
ev_info->sequence, ev.id, ev_info->height);
|
||||
}
|
||||
|
||||
static void rkisp_config_aiisp(struct rkisp_device *dev)
|
||||
{
|
||||
unsigned long lock_flags = 0;
|
||||
u32 wr_line, rd_line, irq, irq_mask, en, en_mask;
|
||||
|
||||
spin_lock_irqsave(&dev->aiisp_lock, lock_flags);
|
||||
if (!dev->is_aiisp_upd)
|
||||
goto unlock;
|
||||
dev->is_aiisp_upd = false;
|
||||
if (dev->is_aiisp_en) {
|
||||
en = ISP39_AIISP_EN;
|
||||
irq = ISP39_AIISP_LINECNT_DONE;
|
||||
if (dev->aiisp_cfg.rd_linecnt)
|
||||
irq |= ISP3X_OUT_FRM_QUARTER;
|
||||
} else {
|
||||
irq = 0;
|
||||
en = 0;
|
||||
}
|
||||
irq_mask = ISP39_AIISP_LINECNT_DONE | ISP3X_OUT_FRM_QUARTER;
|
||||
en_mask = ISP39_AIISP_EN;
|
||||
|
||||
rd_line = dev->aiisp_cfg.rd_linecnt;
|
||||
wr_line = dev->aiisp_cfg.wr_linecnt << 16;
|
||||
|
||||
rkisp_write(dev, ISP32_ISP_IRQ_CFG0, rd_line, false);
|
||||
rkisp_write(dev, ISP32_ISP_IRQ_CFG1, wr_line, false);
|
||||
rkisp_write(dev, ISP39_SLICE_ST_CTRL, 0, false);
|
||||
rkisp_set_bits(dev, CIF_ISP_IMSC, irq_mask, irq, false);
|
||||
rkisp_set_bits(dev, ISP3X_MI_RD_CTRL2, en_mask, en, false);
|
||||
unlock:
|
||||
spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags);
|
||||
}
|
||||
|
||||
static int rkisp_set_aiisp_linecnt(struct rkisp_device *dev,
|
||||
struct rkisp_aiisp_cfg *cfg)
|
||||
{
|
||||
unsigned long lock_flags = 0;
|
||||
bool en = false;
|
||||
|
||||
if (dev->isp_ver != ISP_V39)
|
||||
return -EINVAL;
|
||||
spin_lock_irqsave(&dev->aiisp_lock, lock_flags);
|
||||
if (cfg->wr_linecnt)
|
||||
en = true;
|
||||
if (en != dev->is_aiisp_en) {
|
||||
dev->is_aiisp_en = en;
|
||||
dev->is_aiisp_upd = true;
|
||||
}
|
||||
memcpy(&dev->aiisp_cfg, cfg, sizeof(*cfg));
|
||||
spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rkisp_get_aiisp_linecnt(struct rkisp_device *dev,
|
||||
struct rkisp_aiisp_cfg *cfg)
|
||||
{
|
||||
unsigned long lock_flags = 0;
|
||||
|
||||
if (dev->isp_ver != ISP_V39)
|
||||
return -EINVAL;
|
||||
|
||||
spin_lock_irqsave(&dev->aiisp_lock, lock_flags);
|
||||
memcpy(cfg, &dev->aiisp_cfg, sizeof(*cfg));
|
||||
spin_unlock_irqrestore(&dev->aiisp_lock, lock_flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rkisp_aiisp_rd_start(struct rkisp_device *dev)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
if (!dev->is_aiisp_en)
|
||||
return;
|
||||
val = rkisp_read(dev, ISP39_AIISP_LINE_CNT, true);
|
||||
if (!ISP39_AIISP_RD_LINECNT(val)) {
|
||||
if (dev->aiisp_cfg.rd_linecnt)
|
||||
rkisp_write(dev, ISP39_SLICE_ST_CTRL, ISP39_SLICE_EN, true);
|
||||
rkisp_set_bits(dev, ISP3X_MI_RD_CTRL2, 0, ISP39_AIISP_ST, true);
|
||||
} else {
|
||||
val = ISP39_SLICE_EN | ISP39_SLICE_ST;
|
||||
rkisp_write(dev, ISP39_SLICE_ST_CTRL, val, true);
|
||||
}
|
||||
v4l2_dbg(2, rkisp_debug, &dev->v4l2_dev,
|
||||
"%s 0x%x:0x%x\n", __func__, ISP39_AIISP_LINE_CNT, val);
|
||||
}
|
||||
|
||||
static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
|
||||
{
|
||||
struct rkisp_device *isp_dev = sd_to_isp_dev(sd);
|
||||
@@ -3567,7 +3700,8 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
|
||||
|
||||
if (!arg &&
|
||||
(cmd != RKISP_CMD_FREE_SHARED_BUF &&
|
||||
cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM))
|
||||
cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM &&
|
||||
cmd != RKISP_CMD_AIISP_RD_START))
|
||||
return -EINVAL;
|
||||
|
||||
switch (cmd) {
|
||||
@@ -3696,6 +3830,15 @@ static long rkisp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
|
||||
case RKISP_CMD_GET_BAY3D_BUFFD:
|
||||
rkisp_params_get_bay3d_buffd(&isp_dev->params_vdev, arg);
|
||||
break;
|
||||
case RKISP_CMD_SET_AIISP_LINECNT:
|
||||
ret = rkisp_set_aiisp_linecnt(isp_dev, arg);
|
||||
break;
|
||||
case RKISP_CMD_GET_AIISP_LINECNT:
|
||||
ret = rkisp_get_aiisp_linecnt(isp_dev, arg);
|
||||
break;
|
||||
case RKISP_CMD_AIISP_RD_START:
|
||||
rkisp_aiisp_rd_start(isp_dev);
|
||||
break;
|
||||
default:
|
||||
ret = -ENOIOCTLCMD;
|
||||
}
|
||||
@@ -3715,7 +3858,8 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
|
||||
|
||||
if (!up &&
|
||||
cmd != RKISP_CMD_FREE_SHARED_BUF &&
|
||||
cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM)
|
||||
cmd != RKISP_CMD_MULTI_DEV_FORCE_ENUM &&
|
||||
cmd != RKISP_CMD_AIISP_RD_START)
|
||||
return -EINVAL;
|
||||
|
||||
switch (cmd) {
|
||||
@@ -3733,6 +3877,7 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
|
||||
if (!IS_ENABLED(CONFIG_VIDEO_ROCKCHIP_THUNDER_BOOT_ISP))
|
||||
return -ENOIOCTLCMD;
|
||||
case RKISP_CMD_MULTI_DEV_FORCE_ENUM:
|
||||
case RKISP_CMD_AIISP_RD_START:
|
||||
break;
|
||||
case RKISP_CMD_GET_LDCHBUF_INFO:
|
||||
size = sizeof(struct rkisp_ldchbuf_info);
|
||||
@@ -3775,6 +3920,14 @@ static long rkisp_compat_ioctl32(struct v4l2_subdev *sd,
|
||||
size = sizeof(struct rkisp_bay3dbuf_info);
|
||||
cp_t_us = true;
|
||||
break;
|
||||
case RKISP_CMD_SET_AIISP_LINECNT:
|
||||
size = sizeof(struct rkisp_aiisp_cfg);
|
||||
cp_f_us = true;
|
||||
break;
|
||||
case RKISP_CMD_GET_AIISP_LINECNT:
|
||||
size = sizeof(struct rkisp_aiisp_cfg);
|
||||
cp_t_us = true;
|
||||
break;
|
||||
default:
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
@@ -3869,6 +4022,7 @@ int rkisp_register_isp_subdev(struct rkisp_device *isp_dev,
|
||||
mutex_init(&isp_dev->buf_lock);
|
||||
spin_lock_init(&isp_dev->cmsk_lock);
|
||||
spin_lock_init(&isp_dev->rdbk_lock);
|
||||
spin_lock_init(&isp_dev->aiisp_lock);
|
||||
ret = kfifo_alloc(&isp_dev->rdbk_kfifo,
|
||||
16 * sizeof(struct isp2x_csi_trigger), GFP_KERNEL);
|
||||
if (ret < 0) {
|
||||
@@ -4273,6 +4427,11 @@ vs_skip:
|
||||
isp_mis_tmp);
|
||||
}
|
||||
|
||||
if (isp_mis & ISP39_AIISP_LINECNT_DONE && dev->isp_ver == ISP_V39) {
|
||||
writel(ISP39_AIISP_LINECNT_DONE, base + CIF_ISP_ICR);
|
||||
rkisp_queue_event_aiisp(dev, isp_mis);
|
||||
}
|
||||
|
||||
if ((isp_mis & (CIF_ISP_DATA_LOSS | CIF_ISP_PIC_SIZE_ERROR))) {
|
||||
if ((isp_mis & CIF_ISP_PIC_SIZE_ERROR)) {
|
||||
/* Clear pic_size_error */
|
||||
@@ -4389,8 +4548,10 @@ vs_skip:
|
||||
if ((isp_mis & CIF_ISP_FRAME) && dev->stats_vdev.rdbk_mode)
|
||||
rkisp_stats_rdbk_enable(&dev->stats_vdev, false);
|
||||
|
||||
if (!IS_HDR_RDBK(dev->hdr.op_mode))
|
||||
if (!IS_HDR_RDBK(dev->hdr.op_mode)) {
|
||||
rkisp_config_aiisp(dev);
|
||||
rkisp_config_cmsk(dev);
|
||||
}
|
||||
}
|
||||
|
||||
if (isp_mis & CIF_ISP_FRAME) {
|
||||
@@ -4423,6 +4584,7 @@ vs_skip:
|
||||
|
||||
if (isp_mis & ISP3X_OUT_FRM_QUARTER) {
|
||||
writel(ISP3X_OUT_FRM_QUARTER, base + CIF_ISP_ICR);
|
||||
rkisp_queue_event_aiisp(dev, isp_mis);
|
||||
rkisp_dvbm_event(dev, ISP3X_OUT_FRM_QUARTER);
|
||||
}
|
||||
if (isp_mis & ISP3X_OUT_FRM_HALF) {
|
||||
|
||||
@@ -62,6 +62,15 @@
|
||||
#define RKISP_CMD_GET_BAY3D_BUFFD \
|
||||
_IOR('V', BASE_VIDIOC_PRIVATE + 15, struct rkisp_bay3dbuf_info)
|
||||
|
||||
#define RKISP_CMD_SET_AIISP_LINECNT \
|
||||
_IOW('V', BASE_VIDIOC_PRIVATE + 16, struct rkisp_aiisp_cfg)
|
||||
|
||||
#define RKISP_CMD_GET_AIISP_LINECNT \
|
||||
_IOR('V', BASE_VIDIOC_PRIVATE + 17, struct rkisp_aiisp_cfg)
|
||||
|
||||
#define RKISP_CMD_AIISP_RD_START \
|
||||
_IO('V', BASE_VIDIOC_PRIVATE + 18)
|
||||
|
||||
/****************ISP VIDEO IOCTL******************************/
|
||||
|
||||
#define RKISP_CMD_GET_CSI_MEMORY_MODE \
|
||||
@@ -108,8 +117,11 @@
|
||||
|
||||
#define RKISP_CMD_SET_EXPANDER \
|
||||
_IOW('V', BASE_VIDIOC_PRIVATE + 114, struct rkmodule_hdr_cfg)
|
||||
/*************************************************************/
|
||||
|
||||
/**********************EVENT_PRIVATE***************************/
|
||||
#define RKISP_V4L2_EVENT_AIISP_LINECNT (V4L2_EVENT_PRIVATE_START + 1)
|
||||
|
||||
/*************************************************************/
|
||||
#define ISP2X_ID_DPCC (0)
|
||||
#define ISP2X_ID_BLS (1)
|
||||
#define ISP2X_ID_SDG (2)
|
||||
@@ -325,6 +337,27 @@ struct isp2x_mesh_head {
|
||||
__u32 data_oft;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define RKISP_AIISP_WR_LINECNT_ID 0
|
||||
#define RKISP_AIISP_RD_LINECNT_ID 1
|
||||
struct rkisp_aiisp_ev_info {
|
||||
int sequence;
|
||||
int height;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* struct rkisp_aiisp_cfg
|
||||
* wr_mode: 0: only one RKISP_AIISP_WR_LINECNT_ID event, else event per wr_linecnt
|
||||
* rd_mode: 0: only one RKISP_AIISP_RD_LINECNT_ID event, else event per rd_linecnt
|
||||
* wr_linecnt: aiisp write irq line, 0 isn't RKISP_AIISP_WR_LINECNT_ID event, and aiisp no enable
|
||||
* rd_linecnt: aiisp read irq line, 0 isn't RKISP_AIISP_RD_LINECNT_ID event
|
||||
*/
|
||||
struct rkisp_aiisp_cfg {
|
||||
char wr_mode;
|
||||
char rd_mode;
|
||||
|
||||
int wr_linecnt;
|
||||
int rd_linecnt;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct rkisp_bay3dbuf_info {
|
||||
int iir_fd;
|
||||
int iir_size;
|
||||
@@ -339,6 +372,10 @@ struct rkisp_bay3dbuf_info {
|
||||
int ds_fd;
|
||||
int ds_size;
|
||||
} v32;
|
||||
struct {
|
||||
int gain_fd;
|
||||
int gain_size;
|
||||
} v39;
|
||||
} u;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user