From a70a70dc1e7263bc0b9f60e52b83db7adad11f4a Mon Sep 17 00:00:00 2001 From: Sach Lin Date: Thu, 31 Mar 2022 15:11:38 +0800 Subject: [PATCH] media: rockchip: vicap: sditf sub sensor add quick stream and get sync mode. Signed-off-by: Sach Lin Change-Id: I558a1f4048b8be2d9aef45ac0d857231bce3764f --- drivers/media/platform/rockchip/cif/capture.c | 21 ++++-- drivers/media/platform/rockchip/cif/dev.c | 68 ++++++++++++++----- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index fdf8f1334649..7ae206b44ea1 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -4190,7 +4190,7 @@ static int rkcif_stream_start(struct rkcif_stream *stream, unsigned int mode) static void rkcif_attach_sync_mode(struct rkcif_hw *hw) { struct rkcif_device *dev; - int i = 0; + int i = 0, j = 0; int ret = 0; int sync_type = 0; int count = 0; @@ -4201,10 +4201,21 @@ static void rkcif_attach_sync_mode(struct rkcif_hw *hw) memset(&hw->sync_config, 0, sizeof(struct rkcif_multi_sync_config)); for (i = 0; i < hw->dev_num; i++) { dev = hw->cif_dev[i]; - ret = v4l2_subdev_call(dev->terminal_sensor.sd, - core, ioctl, - RKMODULE_GET_SYNC_MODE, - &sync_type); + if (dev->sditf_cnt == 1) { + ret = v4l2_subdev_call(dev->terminal_sensor.sd, + core, ioctl, + RKMODULE_GET_SYNC_MODE, + &sync_type); + } else { + for (j = 0; j < dev->sditf_cnt; j++) { + ret |= v4l2_subdev_call(dev->sditf[j]->sensor_sd, + core, ioctl, + RKMODULE_GET_SYNC_MODE, + &sync_type); + if (sync_type) + break; + } + } if (!ret) { if (sync_type == EXTERNAL_MASTER_MODE) { count = hw->sync_config.ext_master.count; diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c index 1c7b50a3ef17..11e75348fc4d 100644 --- a/drivers/media/platform/rockchip/cif/dev.c +++ b/drivers/media/platform/rockchip/cif/dev.c @@ -885,7 +885,7 @@ static void rkcif_set_sensor_streamon_in_sync_mode(struct rkcif_device *cif_dev) { struct rkcif_hw *hw = cif_dev->hw_dev; struct rkcif_device *dev = NULL; - int i = 0; + int i = 0, j = 0; int on = 1; int ret = 0; bool is_streaming = false; @@ -904,11 +904,23 @@ static void rkcif_set_sensor_streamon_in_sync_mode(struct rkcif_device *cif_dev) dev = hw->sync_config.slave.cif_dev[i]; is_streaming = hw->sync_config.slave.is_streaming[i]; if (!is_streaming) { - ret = v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, - RKMODULE_SET_QUICK_STREAM, &on); - if (ret) - dev_info(dev->dev, - "set RKMODULE_SET_QUICK_STREAM failed\n"); + if (dev->sditf_cnt == 1) { + ret = v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, + RKMODULE_SET_QUICK_STREAM, &on); + if (ret) + dev_info(dev->dev, + "set RKMODULE_SET_QUICK_STREAM failed\n"); + } else { + for (j = 0; j < dev->sditf_cnt; j++) + ret |= v4l2_subdev_call(dev->sditf[j]->sensor_sd, + core, + ioctl, + RKMODULE_SET_QUICK_STREAM, + &on); + if (ret) + dev_info(dev->dev, + "set RKMODULE_SET_QUICK_STREAM failed\n"); + } hw->sync_config.slave.is_streaming[i] = true; } v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev, @@ -919,11 +931,23 @@ static void rkcif_set_sensor_streamon_in_sync_mode(struct rkcif_device *cif_dev) dev = hw->sync_config.ext_master.cif_dev[i]; is_streaming = hw->sync_config.ext_master.is_streaming[i]; if (!is_streaming) { - ret = v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, - RKMODULE_SET_QUICK_STREAM, &on); - if (!ret) - dev_info(dev->dev, - "set RKMODULE_SET_QUICK_STREAM failed\n"); + if (dev->sditf_cnt == 1) { + ret = v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, + RKMODULE_SET_QUICK_STREAM, &on); + if (ret) + dev_info(dev->dev, + "set RKMODULE_SET_QUICK_STREAM failed\n"); + } else { + for (j = 0; j < dev->sditf_cnt; j++) + ret |= v4l2_subdev_call(dev->sditf[j]->sensor_sd, + core, + ioctl, + RKMODULE_SET_QUICK_STREAM, + &on); + if (ret) + dev_info(dev->dev, + "set RKMODULE_SET_QUICK_STREAM failed\n"); + } hw->sync_config.ext_master.is_streaming[i] = true; } v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev, @@ -933,11 +957,23 @@ static void rkcif_set_sensor_streamon_in_sync_mode(struct rkcif_device *cif_dev) dev = hw->sync_config.int_master.cif_dev[i]; is_streaming = hw->sync_config.int_master.is_streaming[i]; if (!is_streaming) { - ret = v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, - RKMODULE_SET_QUICK_STREAM, &on); - if (!ret) - dev_info(hw->dev, - "set RKMODULE_SET_QUICK_STREAM failed\n"); + if (dev->sditf_cnt == 1) { + ret = v4l2_subdev_call(dev->terminal_sensor.sd, core, ioctl, + RKMODULE_SET_QUICK_STREAM, &on); + if (ret) + dev_info(hw->dev, + "set RKMODULE_SET_QUICK_STREAM failed\n"); + } else { + for (j = 0; j < dev->sditf_cnt; j++) + ret |= v4l2_subdev_call(dev->sditf[j]->sensor_sd, + core, + ioctl, + RKMODULE_SET_QUICK_STREAM, + &on); + if (ret) + dev_info(dev->dev, + "set RKMODULE_SET_QUICK_STREAM failed\n"); + } hw->sync_config.int_master.is_streaming[i] = true; } v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev,