diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 8ee8030b5f9a..4fc1119bbbef 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -8431,6 +8431,16 @@ static void rkcif_attach_sync_mode(struct rkcif_device *cifdev) sync_config->mode = RKCIF_SOFT_SYNC; sync_config->is_attach = true; dev_info(hw->dev, "group used soft sync mode\n"); + } else if (sync_config->ext_master.count > 1 && + sync_config->slave.count == 0 && + sync_config->soft_sync.count == 0) { + sync_config->mode = RKCIF_EXT_MASTER; + sync_config->is_attach = true; + } else if (sync_config->slave.count > 1 && + sync_config->ext_master.count == 0 && + sync_config->soft_sync.count == 0) { + sync_config->mode = RKCIF_EXT_SLAVE; + sync_config->is_attach = true; } mutex_unlock(&hw->dev_lock); } @@ -13978,12 +13988,21 @@ static int rkcif_check_group_sync_state(struct rkcif_device *cif_dev) next_stream = &sync_config->int_master.cif_dev[0]->stream[0]; } else if (sync_config->mode == RKCIF_SOFT_SYNC) { next_stream = &sync_config->soft_sync.cif_dev[i]->stream[0]; + } else if (sync_config->mode == RKCIF_EXT_MASTER) { + next_stream = &sync_config->ext_master.cif_dev[i]->stream[0]; + } else if (sync_config->mode == RKCIF_EXT_SLAVE) { + next_stream = &sync_config->slave.cif_dev[i]->stream[0]; } else { v4l2_err(&cif_dev->v4l2_dev, "ERROR: invalid group sync mode\n"); ret = -EINVAL; break; } + if (next_stream == NULL) { + v4l2_err(&cif_dev->v4l2_dev, + "ERROR: invalid stream in group sync mode\n"); + break; + } if (detect_stream == next_stream) continue; fs_interval = abs(detect_stream->readout.fs_timestamp - next_stream->readout.fs_timestamp); @@ -14053,6 +14072,10 @@ static void rkcif_deal_sof(struct rkcif_device *cif_dev) tmp_dev = sync_config->slave.cif_dev[i]; else tmp_dev = sync_config->int_master.cif_dev[0]; + } else if (sync_config->mode == RKCIF_EXT_MASTER) { + tmp_dev = sync_config->ext_master.cif_dev[i]; + } else if (sync_config->mode == RKCIF_EXT_SLAVE) { + tmp_dev = sync_config->slave.cif_dev[i]; } else { v4l2_err(&cif_dev->v4l2_dev, "ERROR: invalid group sync mode\n"); diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c index 9a127897d9e6..b700cdded444 100644 --- a/drivers/media/platform/rockchip/cif/dev.c +++ b/drivers/media/platform/rockchip/cif/dev.c @@ -1516,7 +1516,9 @@ void rkcif_set_sensor_streamon_in_sync_mode(struct rkcif_device *cif_dev) if (sync_config->mode == RKCIF_MASTER_MASTER || sync_config->mode == RKCIF_MASTER_SLAVE || - sync_config->mode == RKCIF_SOFT_SYNC) { + sync_config->mode == RKCIF_SOFT_SYNC || + sync_config->mode == RKCIF_EXT_MASTER || + sync_config->mode == RKCIF_EXT_SLAVE) { for (i = 0; i < sync_config->slave.count; i++) { dev = sync_config->slave.cif_dev[i]; is_streaming = sync_config->slave.is_streaming[i];