media: rockchip: vicap support ext_master/ext_slave sync mode

Change-Id: I3c6905f075155f2c9248d4e3c41a7bf56069da67
Signed-off-by: Zefa Chen <zefa.chen@rock-chips.com>
This commit is contained in:
Zefa Chen
2025-04-30 16:56:54 +08:00
committed by Tao Huang
parent b19eb7a962
commit 574be18603
2 changed files with 26 additions and 1 deletions

View File

@@ -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");

View File

@@ -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];