hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/media/platform/rockchip/cif/capture.c
....@@ -847,11 +847,13 @@
847847 }
848848
849849 const struct
850
-cif_input_fmt *get_input_fmt(struct v4l2_subdev *sd, struct v4l2_rect *rect,
850
+cif_input_fmt *rkcif_get_input_fmt(struct rkcif_device *dev, struct v4l2_rect *rect,
851851 u32 pad_id, struct csi_channel_info *csi_info)
852852 {
853853 struct v4l2_subdev_format fmt;
854
+ struct v4l2_subdev *sd = dev->terminal_sensor.sd;
854855 struct rkmodule_channel_info ch_info = {0};
856
+ struct rkmodule_capture_info capture_info;
855857 int ret;
856858 u32 i;
857859
....@@ -909,7 +911,26 @@
909911 rect->top = 0;
910912 rect->width = fmt.format.width;
911913 rect->height = fmt.format.height;
912
-
914
+ ret = v4l2_subdev_call(sd,
915
+ core, ioctl,
916
+ RKMODULE_GET_CAPTURE_MODE,
917
+ &capture_info);
918
+ if (!ret) {
919
+ if (capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE &&
920
+ dev->hw_dev->is_rk3588s2) {
921
+ for (i = 0; i < capture_info.multi_dev.dev_num; i++) {
922
+ if (capture_info.multi_dev.dev_idx[i] == 0)
923
+ capture_info.multi_dev.dev_idx[i] = 2;
924
+ else if (capture_info.multi_dev.dev_idx[i] == 2)
925
+ capture_info.multi_dev.dev_idx[i] = 4;
926
+ else if (capture_info.multi_dev.dev_idx[i] == 3)
927
+ capture_info.multi_dev.dev_idx[i] = 5;
928
+ }
929
+ }
930
+ csi_info->capture_info = capture_info;
931
+ } else {
932
+ csi_info->capture_info.mode = RKMODULE_CAPTURE_MODE_NONE;
933
+ }
913934 for (i = 0; i < ARRAY_SIZE(in_fmts); i++)
914935 if (fmt.format.code == in_fmts[i].mbus_code &&
915936 fmt.format.field == in_fmts[i].field)
....@@ -1594,7 +1615,7 @@
15941615 struct rkisp_rx_buf *dbufs;
15951616 struct rkcif_device *dev = stream->cifdev;
15961617
1597
- if (dev->sditf[0] && dev->sditf[0]->num_sensors != 0) {
1618
+ if (dev->sditf[0] && dev->sditf[0]->sd.entity.num_links) {
15981619 if (dev->sditf[0]->is_combine_mode)
15991620 pad = media_entity_remote_pad(&dev->sditf[0]->pads[1]);
16001621 else
....@@ -1670,6 +1691,20 @@
16701691 stream->skip_info.skip_en = false;
16711692 }
16721693
1694
+static void rkcif_rdbk_with_tools(struct rkcif_stream *stream,
1695
+ struct rkcif_rx_buffer *active_buf)
1696
+{
1697
+ unsigned long flags;
1698
+
1699
+ spin_lock_irqsave(&stream->tools_vdev->vbq_lock, flags);
1700
+ if (stream->tools_vdev->state == RKCIF_STATE_STREAMING) {
1701
+ list_add_tail(&active_buf->list, &stream->tools_vdev->buf_done_head);
1702
+ if (!work_busy(&stream->tools_vdev->work))
1703
+ schedule_work(&stream->tools_vdev->work);
1704
+ }
1705
+ spin_unlock_irqrestore(&stream->tools_vdev->vbq_lock, flags);
1706
+}
1707
+
16731708 static void rkcif_rdbk_frame_end_toisp(struct rkcif_stream *stream,
16741709 struct rkcif_rx_buffer *buffer)
16751710 {
....@@ -1734,6 +1769,12 @@
17341769 rkcif_s_rx_buffer(dev, &dev->rdbk_rx_buf[RDBK_L]->dbufs);
17351770 rkcif_s_rx_buffer(dev, &dev->rdbk_rx_buf[RDBK_M]->dbufs);
17361771 rkcif_s_rx_buffer(dev, &dev->rdbk_rx_buf[RDBK_S]->dbufs);
1772
+ rkcif_rdbk_with_tools(&dev->stream[RDBK_L], dev->rdbk_rx_buf[RDBK_L]);
1773
+ rkcif_rdbk_with_tools(&dev->stream[RDBK_M], dev->rdbk_rx_buf[RDBK_M]);
1774
+ rkcif_rdbk_with_tools(&dev->stream[RDBK_S], dev->rdbk_rx_buf[RDBK_S]);
1775
+ atomic_dec(&dev->stream[RDBK_L].buf_cnt);
1776
+ atomic_dec(&dev->stream[RDBK_M].buf_cnt);
1777
+ atomic_dec(&dev->stream[RDBK_S].buf_cnt);
17371778 dev->rdbk_rx_buf[RDBK_L] = NULL;
17381779 dev->rdbk_rx_buf[RDBK_M] = NULL;
17391780 dev->rdbk_rx_buf[RDBK_S] = NULL;
....@@ -1772,6 +1813,10 @@
17721813 dev->rdbk_rx_buf[RDBK_M]->dbufs.sequence = dev->rdbk_rx_buf[RDBK_L]->dbufs.sequence;
17731814 rkcif_s_rx_buffer(dev, &dev->rdbk_rx_buf[RDBK_L]->dbufs);
17741815 rkcif_s_rx_buffer(dev, &dev->rdbk_rx_buf[RDBK_M]->dbufs);
1816
+ rkcif_rdbk_with_tools(&dev->stream[RDBK_L], dev->rdbk_rx_buf[RDBK_L]);
1817
+ rkcif_rdbk_with_tools(&dev->stream[RDBK_M], dev->rdbk_rx_buf[RDBK_M]);
1818
+ atomic_dec(&dev->stream[RDBK_L].buf_cnt);
1819
+ atomic_dec(&dev->stream[RDBK_M].buf_cnt);
17751820 dev->rdbk_rx_buf[RDBK_L] = NULL;
17761821 dev->rdbk_rx_buf[RDBK_M] = NULL;
17771822 }
....@@ -1783,14 +1828,51 @@
17831828 spin_unlock_irqrestore(&dev->hdr_lock, flags);
17841829 }
17851830
1831
+static void rkcif_write_buff_addr_multi_dev_combine(struct rkcif_stream *stream,
1832
+ u32 frm_addr_y, u32 frm_addr_uv,
1833
+ u32 buff_addr_y, u32 buff_addr_cbcr,
1834
+ bool is_dummy_buf)
1835
+{
1836
+ struct rkcif_device *dev = stream->cifdev;
1837
+ struct rkmodule_capture_info *capture_info = &dev->channels[stream->id].capture_info;
1838
+ u32 addr_y, addr_cbcr;
1839
+ int addr_offset = 0;
1840
+ int i = 0;
1841
+ int tmp_host_index = dev->csi_host_idx;
1842
+
1843
+ for (i = 0; i < capture_info->multi_dev.dev_num; i++) {
1844
+ if (is_dummy_buf) {
1845
+ addr_y = buff_addr_y;
1846
+ } else {
1847
+ addr_offset = dev->channels[stream->id].left_virtual_width;
1848
+ addr_y = buff_addr_y + addr_offset * i;
1849
+ }
1850
+ dev->csi_host_idx = capture_info->multi_dev.dev_idx[i];
1851
+ rkcif_write_register(dev, frm_addr_y, addr_y);
1852
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW &&
1853
+ frm_addr_uv && buff_addr_cbcr) {
1854
+ if (is_dummy_buf) {
1855
+ addr_cbcr = buff_addr_cbcr;
1856
+ } else {
1857
+ addr_offset = dev->channels[stream->id].left_virtual_width;
1858
+ addr_cbcr = buff_addr_cbcr + addr_offset * i;
1859
+ }
1860
+ rkcif_write_register(dev, frm_addr_uv, addr_cbcr);
1861
+ }
1862
+ }
1863
+ dev->csi_host_idx = tmp_host_index;
1864
+}
1865
+
17861866 static void rkcif_assign_new_buffer_init_toisp(struct rkcif_stream *stream,
17871867 int channel_id)
17881868 {
17891869 struct rkcif_device *dev = stream->cifdev;
17901870 struct rkcif_rx_buffer *rx_buf;
17911871 struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
1872
+ struct rkmodule_capture_info *capture_info = &dev->channels[channel_id].capture_info;
17921873 u32 frm0_addr_y;
17931874 u32 frm1_addr_y;
1875
+ u32 buff_addr_y;
17941876 unsigned long flags;
17951877
17961878 if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY ||
....@@ -1817,9 +1899,15 @@
18171899 }
18181900 }
18191901
1820
- if (stream->curr_buf_toisp)
1821
- rkcif_write_register(dev, frm0_addr_y,
1822
- stream->curr_buf_toisp->dummy.dma_addr);
1902
+ if (stream->curr_buf_toisp) {
1903
+ buff_addr_y = stream->curr_buf_toisp->dummy.dma_addr;
1904
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
1905
+ rkcif_write_buff_addr_multi_dev_combine(stream, frm0_addr_y, 0,
1906
+ buff_addr_y, 0, false);
1907
+ } else {
1908
+ rkcif_write_register(dev, frm0_addr_y, buff_addr_y);
1909
+ }
1910
+ }
18231911
18241912 if (!stream->next_buf_toisp) {
18251913 if (!list_empty(&stream->rx_buf_head)) {
....@@ -1836,9 +1924,15 @@
18361924 }
18371925 }
18381926
1839
- if (stream->next_buf_toisp)
1840
- rkcif_write_register(dev, frm1_addr_y,
1841
- stream->next_buf_toisp->dummy.dma_addr);
1927
+ if (stream->next_buf_toisp) {
1928
+ buff_addr_y = stream->next_buf_toisp->dummy.dma_addr;
1929
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
1930
+ rkcif_write_buff_addr_multi_dev_combine(stream, frm1_addr_y, 0,
1931
+ buff_addr_y, 0, false);
1932
+ } else {
1933
+ rkcif_write_register(dev, frm1_addr_y, buff_addr_y);
1934
+ }
1935
+ }
18421936
18431937 spin_unlock_irqrestore(&stream->vbq_lock, flags);
18441938 stream->buf_owner = RKCIF_DMAEN_BY_ISP;
....@@ -1849,10 +1943,11 @@
18491943 {
18501944 struct rkcif_device *dev = stream->cifdev;
18511945 struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
1946
+ struct rkmodule_capture_info *capture_info = &dev->channels[channel_id].capture_info;
18521947 struct rkcif_rx_buffer *buffer = NULL;
18531948 struct rkcif_rx_buffer *active_buf = NULL;
18541949 struct sditf_priv *priv = dev->sditf[0];
1855
- u32 frm_addr_y;
1950
+ u32 frm_addr_y, buff_addr_y;
18561951 unsigned long flags;
18571952
18581953 if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY ||
....@@ -1889,14 +1984,18 @@
18891984 active_buf->dbufs.timestamp = stream->readout.fs_timestamp;
18901985 active_buf->fe_timestamp = ktime_get_ns();
18911986 stream->last_frame_idx = stream->frame_idx;
1892
- if (dev->hdr.hdr_mode == NO_HDR)
1987
+ if (dev->hdr.hdr_mode == NO_HDR) {
18931988 rkcif_s_rx_buffer(dev, &active_buf->dbufs);
1894
- else
1989
+ if (dev->is_support_tools && stream->tools_vdev)
1990
+ rkcif_rdbk_with_tools(stream, active_buf);
1991
+ atomic_dec(&stream->buf_cnt);
1992
+ } else {
18951993 rkcif_rdbk_frame_end_toisp(stream, active_buf);
1896
- stream->buf_num_toisp--;
1994
+ }
18971995 } else {
1898
- rkcif_s_rx_buffer(dev, &stream->next_buf_toisp->dbufs);
1899
- stream->buf_num_toisp--;
1996
+ rkcif_s_rx_buffer(dev, &active_buf->dbufs);
1997
+ if (dev->is_support_tools && stream->tools_vdev)
1998
+ rkcif_rdbk_with_tools(stream, active_buf);
19001999 }
19012000 } else if (stream->frame_phase == CIF_CSI_FRAME1_READY) {
19022001 if (stream->curr_buf_toisp == stream->next_buf_toisp)
....@@ -1918,14 +2017,18 @@
19182017 active_buf->dbufs.timestamp = stream->readout.fs_timestamp;
19192018 active_buf->fe_timestamp = ktime_get_ns();
19202019 stream->last_frame_idx = stream->frame_idx;
1921
- if (dev->hdr.hdr_mode == NO_HDR)
2020
+ if (dev->hdr.hdr_mode == NO_HDR) {
19222021 rkcif_s_rx_buffer(dev, &active_buf->dbufs);
1923
- else
2022
+ if (dev->is_support_tools && stream->tools_vdev)
2023
+ rkcif_rdbk_with_tools(stream, active_buf);
2024
+ atomic_dec(&stream->buf_cnt);
2025
+ } else {
19242026 rkcif_rdbk_frame_end_toisp(stream, active_buf);
1925
- stream->buf_num_toisp--;
2027
+ }
19262028 } else {
1927
- rkcif_s_rx_buffer(dev, &stream->curr_buf_toisp->dbufs);
1928
- stream->buf_num_toisp--;
2029
+ rkcif_s_rx_buffer(dev, &active_buf->dbufs);
2030
+ if (dev->is_support_tools && stream->tools_vdev)
2031
+ rkcif_rdbk_with_tools(stream, active_buf);
19292032 }
19302033 }
19312034 if (stream->lack_buf_cnt)
....@@ -1967,10 +2070,14 @@
19672070 active_buf->dbufs.timestamp = stream->readout.fs_timestamp;
19682071 active_buf->fe_timestamp = ktime_get_ns();
19692072 stream->last_frame_idx = stream->frame_idx;
1970
- if (dev->hdr.hdr_mode == NO_HDR)
2073
+ if (dev->hdr.hdr_mode == NO_HDR) {
19712074 rkcif_s_rx_buffer(dev, &active_buf->dbufs);
1972
- else
2075
+ if (dev->is_support_tools && stream->tools_vdev)
2076
+ rkcif_rdbk_with_tools(stream, active_buf);
2077
+ atomic_dec(&stream->buf_cnt);
2078
+ } else {
19732079 rkcif_rdbk_frame_end_toisp(stream, active_buf);
2080
+ }
19742081 } else {
19752082 if (stream->cifdev->rdbk_debug && dev->hw_dev->dummy_buf.vaddr)
19762083 v4l2_info(&stream->cifdev->v4l2_dev,
....@@ -1978,13 +2085,20 @@
19782085 stream->id,
19792086 stream->frame_idx - 1);
19802087 }
2088
+ if (dev->is_support_tools && stream->tools_vdev && stream->curr_buf_toisp)
2089
+ rkcif_rdbk_with_tools(stream, stream->curr_buf_toisp);
19812090 }
19822091
19832092 out_get_buf:
19842093 stream->frame_phase_cache = stream->frame_phase;
19852094 if (buffer) {
1986
- rkcif_write_register(dev, frm_addr_y,
1987
- buffer->dummy.dma_addr);
2095
+ buff_addr_y = buffer->dummy.dma_addr;
2096
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2097
+ rkcif_write_buff_addr_multi_dev_combine(stream, frm_addr_y, 0,
2098
+ buff_addr_y, 0, false);
2099
+ } else {
2100
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
2101
+ }
19882102 if (dev->rdbk_debug > 1 &&
19892103 stream->frame_idx < 15)
19902104 v4l2_info(&dev->v4l2_dev,
....@@ -1994,8 +2108,13 @@
19942108 frm_addr_y, (u32)buffer->dummy.dma_addr);
19952109 } else if (dev->hw_dev->dummy_buf.vaddr && priv &&
19962110 priv->mode.rdbk_mode == RKISP_VICAP_RDBK_AUTO) {
1997
- rkcif_write_register(dev, frm_addr_y,
1998
- dev->hw_dev->dummy_buf.dma_addr);
2111
+ buff_addr_y = dev->hw_dev->dummy_buf.dma_addr;
2112
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2113
+ rkcif_write_buff_addr_multi_dev_combine(stream, frm_addr_y, 0,
2114
+ buff_addr_y, 0, true);
2115
+ } else {
2116
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
2117
+ }
19992118 }
20002119 spin_unlock_irqrestore(&stream->vbq_lock, flags);
20012120 return 0;
....@@ -2018,8 +2137,9 @@
20182137 struct rkcif_device *dev = stream->cifdev;
20192138 struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
20202139 struct rkcif_rx_buffer *buffer = NULL;
2140
+ struct rkmodule_capture_info *capture_info = &dev->channels[stream->id].capture_info;
20212141 struct rkcif_rx_buffer *active_buf = NULL;
2022
- u32 frm_addr_y;
2142
+ u32 frm_addr_y, buff_addr_y;
20232143 u32 vblank = 0;
20242144 u32 vblank_ns = 0;
20252145 u64 cur_time = 0;
....@@ -2082,8 +2202,15 @@
20822202 if (buffer) {
20832203 list_del(&buffer->list);
20842204 stream->curr_buf_toisp = buffer;
2085
- rkcif_write_register(dev, frm_addr_y,
2086
- stream->curr_buf_toisp->dummy.dma_addr);
2205
+ buff_addr_y = stream->curr_buf_toisp->dummy.dma_addr;
2206
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2207
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2208
+ frm_addr_y, 0,
2209
+ buff_addr_y, 0,
2210
+ false);
2211
+ } else {
2212
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
2213
+ }
20872214 if (dev->rdbk_debug > 1 &&
20882215 stream->frame_idx < 15)
20892216 v4l2_info(&dev->v4l2_dev,
....@@ -2091,7 +2218,6 @@
20912218 stream->id,
20922219 stream->frame_idx - 1, frm_addr_y,
20932220 (u32)stream->curr_buf_toisp->dummy.dma_addr);
2094
- stream->buf_num_toisp--;
20952221 }
20962222 } else if (frame_phase == CIF_CSI_FRAME1_READY) {
20972223 active_buf = stream->next_buf_toisp;
....@@ -2100,8 +2226,15 @@
21002226 if (buffer) {
21012227 list_del(&buffer->list);
21022228 stream->next_buf_toisp = buffer;
2103
- rkcif_write_register(dev, frm_addr_y,
2104
- stream->next_buf_toisp->dummy.dma_addr);
2229
+ buff_addr_y = stream->next_buf_toisp->dummy.dma_addr;
2230
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2231
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2232
+ frm_addr_y, 0,
2233
+ buff_addr_y, 0,
2234
+ false);
2235
+ } else {
2236
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
2237
+ }
21052238 if (dev->rdbk_debug > 1 &&
21062239 stream->frame_idx < 15)
21072240 v4l2_info(&dev->v4l2_dev,
....@@ -2109,7 +2242,6 @@
21092242 stream->id,
21102243 stream->frame_idx - 1, frm_addr_y,
21112244 (u32)stream->next_buf_toisp->dummy.dma_addr);
2112
- stream->buf_num_toisp--;
21132245 }
21142246 }
21152247 if (stream->lack_buf_cnt)
....@@ -2150,8 +2282,13 @@
21502282 stream->next_buf_toisp = stream->curr_buf_toisp;
21512283 else
21522284 stream->curr_buf_toisp = stream->next_buf_toisp;
2153
- rkcif_write_register(dev, frm_addr_y,
2154
- stream->curr_buf_toisp->dummy.dma_addr);
2285
+ buff_addr_y = stream->curr_buf_toisp->dummy.dma_addr;
2286
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2287
+ rkcif_write_buff_addr_multi_dev_combine(stream, frm_addr_y, 0,
2288
+ buff_addr_y, 0, false);
2289
+ } else {
2290
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
2291
+ }
21552292 }
21562293 }
21572294
....@@ -2162,6 +2299,7 @@
21622299 struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
21632300 u32 frm0_addr_y, frm0_addr_uv;
21642301 u32 frm1_addr_y, frm1_addr_uv;
2302
+ u32 buff_addr_y, buff_addr_cbcr;
21652303 unsigned long flags;
21662304 struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
21672305 struct csi_channel_info *channel = &dev->channels[channel_id];
....@@ -2187,21 +2325,45 @@
21872325 stream->curr_buf = list_first_entry(&stream->buf_head,
21882326 struct rkcif_buffer,
21892327 queue);
2328
+ v4l2_dbg(4, rkcif_debug, &dev->v4l2_dev, "%s %d, stream[%d] buf idx %d\n",
2329
+ __func__, __LINE__, stream->id, stream->curr_buf->vb.vb2_buf.index);
21902330 list_del(&stream->curr_buf->queue);
21912331 }
21922332 }
21932333
21942334 if (stream->curr_buf) {
2195
- rkcif_write_register(dev, frm0_addr_y,
2196
- stream->curr_buf->buff_addr[RKCIF_PLANE_Y]);
2197
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2198
- rkcif_write_register(dev, frm0_addr_uv,
2199
- stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
2335
+ buff_addr_y = stream->curr_buf->buff_addr[RKCIF_PLANE_Y];
2336
+ buff_addr_cbcr = stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR];
2337
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2338
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2339
+ frm0_addr_y,
2340
+ frm0_addr_uv,
2341
+ buff_addr_y,
2342
+ buff_addr_cbcr,
2343
+ false);
2344
+ } else {
2345
+ rkcif_write_register(dev, frm0_addr_y,
2346
+ stream->curr_buf->buff_addr[RKCIF_PLANE_Y]);
2347
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2348
+ rkcif_write_register(dev, frm0_addr_uv,
2349
+ stream->curr_buf->buff_addr[RKCIF_PLANE_CBCR]);
2350
+ }
22002351 } else {
22012352 if (dummy_buf->vaddr) {
2202
- rkcif_write_register(dev, frm0_addr_y, dummy_buf->dma_addr);
2203
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2204
- rkcif_write_register(dev, frm0_addr_uv, dummy_buf->dma_addr);
2353
+ buff_addr_y = dummy_buf->dma_addr;
2354
+ buff_addr_cbcr = dummy_buf->dma_addr;
2355
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2356
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2357
+ frm0_addr_y,
2358
+ frm0_addr_uv,
2359
+ buff_addr_y,
2360
+ buff_addr_cbcr,
2361
+ true);
2362
+ } else {
2363
+ rkcif_write_register(dev, frm0_addr_y, buff_addr_y);
2364
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2365
+ rkcif_write_register(dev, frm0_addr_uv, buff_addr_cbcr);
2366
+ }
22052367 } else {
22062368 if (stream->lack_buf_cnt < 2)
22072369 stream->lack_buf_cnt++;
....@@ -2211,43 +2373,69 @@
22112373 if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
22122374 stream->next_buf = stream->curr_buf;
22132375 if (stream->next_buf) {
2214
- rkcif_write_register(dev, frm1_addr_y,
2215
- stream->next_buf->buff_addr[RKCIF_PLANE_Y] + (channel->virtual_width / 2));
2216
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2217
- rkcif_write_register(dev, frm1_addr_uv,
2218
- stream->next_buf->buff_addr[RKCIF_PLANE_CBCR] + (channel->virtual_width / 2));
2376
+ buff_addr_y = stream->next_buf->buff_addr[RKCIF_PLANE_Y];
2377
+ buff_addr_cbcr = stream->next_buf->buff_addr[RKCIF_PLANE_CBCR];
2378
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2379
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2380
+ frm1_addr_y,
2381
+ frm1_addr_uv,
2382
+ buff_addr_y,
2383
+ buff_addr_cbcr,
2384
+ false);
2385
+ } else {
2386
+ rkcif_write_register(dev, frm1_addr_y,
2387
+ buff_addr_y + (channel->virtual_width / 2));
2388
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2389
+ rkcif_write_register(dev, frm1_addr_uv,
2390
+ buff_addr_cbcr + (channel->virtual_width / 2));
2391
+ }
22192392 }
22202393 } else {
22212394 if (!stream->next_buf) {
22222395 if (!list_empty(&stream->buf_head)) {
22232396 stream->next_buf = list_first_entry(&stream->buf_head,
22242397 struct rkcif_buffer, queue);
2398
+ v4l2_dbg(4, rkcif_debug, &dev->v4l2_dev, "%s %d, stream[%d] buf idx %d\n",
2399
+ __func__, __LINE__, stream->id, stream->next_buf->vb.vb2_buf.index);
22252400 list_del(&stream->next_buf->queue);
22262401 }
22272402 }
22282403
2229
- if (stream->next_buf) {
2230
- rkcif_write_register(dev, frm1_addr_y,
2231
- stream->next_buf->buff_addr[RKCIF_PLANE_Y]);
2232
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2233
- rkcif_write_register(dev, frm1_addr_uv,
2234
- stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
2235
- } else {
2236
- if (dummy_buf->vaddr) {
2404
+ if (!stream->next_buf && dummy_buf->vaddr) {
2405
+ buff_addr_y = dummy_buf->dma_addr;
2406
+ buff_addr_cbcr = dummy_buf->dma_addr;
2407
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2408
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2409
+ frm1_addr_y,
2410
+ frm1_addr_uv,
2411
+ buff_addr_y,
2412
+ buff_addr_cbcr,
2413
+ true);
2414
+ } else {
22372415 rkcif_write_register(dev, frm1_addr_y, dummy_buf->dma_addr);
22382416 if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
22392417 rkcif_write_register(dev, frm1_addr_uv, dummy_buf->dma_addr);
2418
+ }
2419
+
2420
+ } else if (!stream->next_buf && stream->curr_buf) {
2421
+ stream->next_buf = stream->curr_buf;
2422
+ if (stream->lack_buf_cnt < 2)
2423
+ stream->lack_buf_cnt++;
2424
+ }
2425
+ if (stream->next_buf) {
2426
+ buff_addr_y = stream->next_buf->buff_addr[RKCIF_PLANE_Y];
2427
+ buff_addr_cbcr = stream->next_buf->buff_addr[RKCIF_PLANE_CBCR];
2428
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2429
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2430
+ frm1_addr_y,
2431
+ frm1_addr_uv,
2432
+ buff_addr_y,
2433
+ buff_addr_cbcr,
2434
+ false);
22402435 } else {
2241
- if (stream->curr_buf) {
2242
- stream->next_buf = stream->curr_buf;
2243
- rkcif_write_register(dev, frm1_addr_y,
2244
- stream->next_buf->buff_addr[RKCIF_PLANE_Y]);
2245
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2246
- rkcif_write_register(dev, frm1_addr_uv,
2247
- stream->next_buf->buff_addr[RKCIF_PLANE_CBCR]);
2248
- }
2249
- if (stream->lack_buf_cnt < 2)
2250
- stream->lack_buf_cnt++;
2436
+ rkcif_write_register(dev, frm1_addr_y, buff_addr_y);
2437
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2438
+ rkcif_write_register(dev, frm1_addr_uv, buff_addr_cbcr);
22512439 }
22522440 }
22532441 }
....@@ -2295,6 +2483,7 @@
22952483 struct rkisp_rx_buf *dbufs = NULL;
22962484 struct dma_buf *dbuf = NULL;
22972485 int ret = 0;
2486
+ u32 buff_addr_y, buff_addr_cbcr;
22982487 unsigned long flags;
22992488
23002489 if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY ||
....@@ -2315,16 +2504,15 @@
23152504 get_dvp_reg_index_of_frm1_uv_addr(channel_id);
23162505 }
23172506
2318
- if (dev->hdr.hdr_mode != NO_HDR && stream->id != 0 && (!dev->rdbk_buf[RDBK_L])) {
2319
- v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev, "%s %d\n", __func__, __LINE__);
2320
- return -EINVAL;
2321
- }
2322
-
23232507 if (stream->to_stop_dma) {
23242508 if (stream->dma_en & RKCIF_DMAEN_BY_ISP) {
23252509 v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev, "%s %d\n", __func__, __LINE__);
23262510 goto stop_dma;
23272511 } else {
2512
+ if (stream->frame_phase == CIF_CSI_FRAME0_READY)
2513
+ stream->curr_buf = NULL;
2514
+ else
2515
+ stream->next_buf = NULL;
23282516 v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev, "%s %d\n", __func__, __LINE__);
23292517 return -EINVAL;
23302518 }
....@@ -2347,8 +2535,8 @@
23472535 list_del(&stream->curr_buf->queue);
23482536 buffer = stream->curr_buf;
23492537 v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev,
2350
- "stream[%d] update curr_buf 0x%x\n",
2351
- stream->id, buffer->buff_addr[0]);
2538
+ "stream[%d] update curr_buf 0x%x, buf idx %d\n",
2539
+ stream->id, buffer->buff_addr[0], stream->curr_buf->vb.vb2_buf.index);
23522540 }
23532541 } else if (stream->frame_phase == CIF_CSI_FRAME1_READY) {
23542542 if (!stream->next_buf)
....@@ -2368,8 +2556,8 @@
23682556 list_del(&stream->next_buf->queue);
23692557 buffer = stream->next_buf;
23702558 v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev,
2371
- "stream[%d] update next_buf 0x%x\n",
2372
- stream->id, buffer->buff_addr[0]);
2559
+ "stream[%d] update next_buf 0x%x, buf idx %d\n",
2560
+ stream->id, buffer->buff_addr[0], stream->next_buf->vb.vb2_buf.index);
23732561 }
23742562 }
23752563 }
....@@ -2407,19 +2595,37 @@
24072595 stream->frame_phase_cache = stream->frame_phase;
24082596
24092597 if (buffer) {
2598
+ buff_addr_y = buffer->buff_addr[RKCIF_PLANE_Y];
2599
+ buff_addr_cbcr = buffer->buff_addr[RKCIF_PLANE_CBCR];
24102600 if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED &&
24112601 stream->frame_phase == CIF_CSI_FRAME1_READY) {
2412
- rkcif_write_register(dev, frm_addr_y,
2413
- buffer->buff_addr[RKCIF_PLANE_Y] + (channel->virtual_width / 2));
2414
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2415
- rkcif_write_register(dev, frm_addr_uv,
2416
- buffer->buff_addr[RKCIF_PLANE_CBCR] + (channel->virtual_width / 2));
2602
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2603
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2604
+ frm_addr_y,
2605
+ frm_addr_uv,
2606
+ buff_addr_y,
2607
+ buff_addr_cbcr,
2608
+ false);
2609
+ } else {
2610
+ rkcif_write_register(dev, frm_addr_y,
2611
+ buff_addr_y + (channel->virtual_width / 2));
2612
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2613
+ rkcif_write_register(dev, frm_addr_uv,
2614
+ buff_addr_cbcr + (channel->virtual_width / 2));
2615
+ }
24172616 } else {
2418
- rkcif_write_register(dev, frm_addr_y,
2419
- buffer->buff_addr[RKCIF_PLANE_Y]);
2420
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2421
- rkcif_write_register(dev, frm_addr_uv,
2422
- buffer->buff_addr[RKCIF_PLANE_CBCR]);
2617
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2618
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2619
+ frm_addr_y,
2620
+ frm_addr_uv,
2621
+ buff_addr_y,
2622
+ buff_addr_cbcr,
2623
+ false);
2624
+ } else {
2625
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
2626
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2627
+ rkcif_write_register(dev, frm_addr_uv, buff_addr_cbcr);
2628
+ }
24232629 }
24242630 if (stream->dma_en & RKCIF_DMAEN_BY_ISP) {
24252631 if (stream->buf_replace_cnt < 2)
....@@ -2439,12 +2645,16 @@
24392645 }
24402646 if (dbufs)
24412647 rkcif_s_rx_buffer(dev, dbufs);
2442
- stream->buf_num_toisp--;
24432648 }
24442649 } else {
24452650 if (stream->dma_en & RKCIF_DMAEN_BY_ISP) {
2446
- rkcif_write_register(dev, frm_addr_y,
2447
- stream->curr_buf_toisp->dummy.dma_addr);
2651
+ buff_addr_y = stream->curr_buf_toisp->dummy.dma_addr;
2652
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE)
2653
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2654
+ frm_addr_y, 0,
2655
+ buff_addr_y, 0, false);
2656
+ else
2657
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
24482658 if (stream->frame_phase == CIF_CSI_FRAME0_READY &&
24492659 stream->next_buf)
24502660 dbuf = stream->next_buf->dbuf;
....@@ -2460,7 +2670,6 @@
24602670 dbufs = &stream->curr_buf_toisp->dbufs;
24612671 }
24622672 rkcif_s_rx_buffer(dev, dbufs);
2463
- stream->buf_num_toisp--;
24642673 if (stream->curr_buf && stream->frame_phase == CIF_CSI_FRAME0_READY) {
24652674 stream->curr_buf = NULL;
24662675 if (stream->buf_replace_cnt)
....@@ -2471,11 +2680,24 @@
24712680 stream->buf_replace_cnt--;
24722681 }
24732682 } else if (dummy_buf->vaddr) {
2474
- rkcif_write_register(dev, frm_addr_y, dummy_buf->dma_addr);
2475
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2476
- rkcif_write_register(dev, frm_addr_uv, dummy_buf->dma_addr);
2683
+
2684
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2685
+ buff_addr_y = dummy_buf->dma_addr;
2686
+ buff_addr_cbcr = dummy_buf->dma_addr;
2687
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2688
+ frm_addr_y,
2689
+ frm_addr_uv,
2690
+ buff_addr_y,
2691
+ buff_addr_cbcr,
2692
+ true);
2693
+ } else {
2694
+ rkcif_write_register(dev, frm_addr_y, dummy_buf->dma_addr);
2695
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2696
+ rkcif_write_register(dev, frm_addr_uv, dummy_buf->dma_addr);
2697
+ }
24772698 dev->err_state |= (RKCIF_ERR_ID0_NOT_BUF << stream->id);
24782699 dev->irq_stats.not_active_buf_cnt[stream->id]++;
2700
+
24792701 } else {
24802702 ret = -EINVAL;
24812703 stream->curr_buf = NULL;
....@@ -2489,8 +2711,13 @@
24892711 stop_dma:
24902712 if (stream->buf_replace_cnt) {
24912713 spin_lock_irqsave(&stream->vbq_lock, flags);
2492
- rkcif_write_register(dev, frm_addr_y,
2493
- stream->curr_buf_toisp->dummy.dma_addr);
2714
+ buff_addr_y = stream->curr_buf_toisp->dummy.dma_addr;
2715
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE)
2716
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2717
+ frm_addr_y, 0,
2718
+ buff_addr_y, 0, false);
2719
+ else
2720
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
24942721 if (stream->frame_phase == CIF_CSI_FRAME0_READY &&
24952722 stream->next_buf)
24962723 dbuf = stream->next_buf->dbuf;
....@@ -2507,15 +2734,12 @@
25072734 }
25082735 if (dbufs)
25092736 rkcif_s_rx_buffer(dev, dbufs);
2510
- stream->buf_num_toisp--;
25112737
25122738 if (stream->frame_phase == CIF_CSI_FRAME0_READY &&
25132739 stream->curr_buf) {
2514
- list_add_tail(&stream->curr_buf->queue, &stream->buf_head);
25152740 stream->curr_buf = NULL;
25162741 } else if (stream->frame_phase == CIF_CSI_FRAME1_READY &&
25172742 stream->next_buf) {
2518
- list_add_tail(&stream->next_buf->queue, &stream->buf_head);
25192743 stream->next_buf = NULL;
25202744 }
25212745 stream->buf_replace_cnt--;
....@@ -2587,8 +2811,10 @@
25872811 struct rkcif_device *dev = stream->cifdev;
25882812 struct rkcif_dummy_buffer *dummy_buf = &dev->hw_dev->dummy_buf;
25892813 struct v4l2_mbus_config *mbus_cfg = &dev->active_sensor->mbus;
2814
+ struct rkmodule_capture_info *capture_info = &dev->channels[stream->id].capture_info;
25902815 struct rkcif_buffer *buffer = NULL;
25912816 u32 frm_addr_y, frm_addr_uv;
2817
+ u32 buff_addr_y, buff_addr_cbcr;
25922818 int channel_id = stream->id;
25932819 int ret = 0;
25942820 unsigned long flags;
....@@ -2619,16 +2845,35 @@
26192845 }
26202846 spin_unlock_irqrestore(&stream->vbq_lock, flags);
26212847 if (buffer) {
2622
- rkcif_write_register(dev, frm_addr_y,
2623
- buffer->buff_addr[RKCIF_PLANE_Y]);
2624
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2625
- rkcif_write_register(dev, frm_addr_uv,
2626
- buffer->buff_addr[RKCIF_PLANE_CBCR]);
2848
+ buff_addr_y = buffer->buff_addr[RKCIF_PLANE_Y];
2849
+ buff_addr_cbcr = buffer->buff_addr[RKCIF_PLANE_CBCR];
2850
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2851
+ rkcif_write_buff_addr_multi_dev_combine(stream, frm_addr_y,
2852
+ frm_addr_uv,
2853
+ buff_addr_y,
2854
+ buff_addr_cbcr,
2855
+ false);
2856
+ } else {
2857
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
2858
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2859
+ rkcif_write_register(dev, frm_addr_uv, buff_addr_cbcr);
2860
+ }
26272861 } else {
26282862 if (dummy_buf->vaddr) {
2629
- rkcif_write_register(dev, frm_addr_y, dummy_buf->dma_addr);
2630
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2631
- rkcif_write_register(dev, frm_addr_uv, dummy_buf->dma_addr);
2863
+ buff_addr_y = dummy_buf->dma_addr;
2864
+ buff_addr_cbcr = dummy_buf->dma_addr;
2865
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
2866
+ rkcif_write_buff_addr_multi_dev_combine(stream,
2867
+ frm_addr_y,
2868
+ frm_addr_uv,
2869
+ buff_addr_y,
2870
+ buff_addr_cbcr,
2871
+ true);
2872
+ } else {
2873
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
2874
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
2875
+ rkcif_write_register(dev, frm_addr_uv, buff_addr_cbcr);
2876
+ }
26322877 } else {
26332878 if (dev->chip_id < CHIP_RK3588_CIF)
26342879 ret = -EINVAL;
....@@ -3163,6 +3408,7 @@
31633408 struct csi_channel_info *channel)
31643409 {
31653410 struct rkcif_device *dev = stream->cifdev;
3411
+ struct sditf_priv *priv = dev->sditf[0];
31663412 const struct cif_output_fmt *fmt;
31673413 u32 fourcc;
31683414 int vc = dev->channels[stream->id].vc;
....@@ -3187,7 +3433,7 @@
31873433 channel->crop_st_x = stream->crop[CROP_SRC_ACT].left;
31883434
31893435 channel->crop_st_y = stream->crop[CROP_SRC_ACT].top;
3190
- if (dev->sditf_cnt > 1 && dev->sditf_cnt <= RKCIF_MAX_SDITF)
3436
+ if (priv && priv->is_combine_mode && dev->sditf_cnt <= RKCIF_MAX_SDITF)
31913437 channel->crop_st_y *= dev->sditf_cnt;
31923438 channel->width = stream->crop[CROP_SRC_ACT].width;
31933439 channel->height = stream->crop[CROP_SRC_ACT].height;
....@@ -3197,7 +3443,7 @@
31973443 channel->crop_en = 0;
31983444 }
31993445
3200
- if (dev->sditf_cnt > 1 && dev->sditf_cnt <= RKCIF_MAX_SDITF)
3446
+ if (priv && priv->is_combine_mode && dev->sditf_cnt <= RKCIF_MAX_SDITF)
32013447 channel->height *= dev->sditf_cnt;
32023448
32033449 fmt = rkcif_find_output_fmt(stream, stream->pixm.pixelformat);
....@@ -3207,6 +3453,8 @@
32073453 return -EINVAL;
32083454 }
32093455
3456
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE)
3457
+ channel->width /= channel->capture_info.multi_dev.dev_num;
32103458 /*
32113459 * for mipi or lvds, when enable compact, the virtual width of raw10/raw12
32123460 * needs aligned with :ALIGN(bits_per_pixel * width / 8, 8), if enable 16bit mode
....@@ -3216,9 +3464,19 @@
32163464 if (fmt->fmt_type == CIF_FMT_TYPE_RAW && stream->is_compact &&
32173465 fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB888 &&
32183466 fmt->csi_fmt_val != CSI_WRDDR_TYPE_RGB565) {
3219
- channel->virtual_width = ALIGN(channel->width * fmt->raw_bpp / 8, 256);
3467
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
3468
+ channel->virtual_width = ALIGN(channel->width * 2 * fmt->raw_bpp / 8, 256);
3469
+ channel->left_virtual_width = channel->width * fmt->raw_bpp / 8;
3470
+ } else {
3471
+ channel->virtual_width = ALIGN(channel->width * fmt->raw_bpp / 8, 256);
3472
+ }
32203473 } else {
3221
- channel->virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
3474
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
3475
+ channel->virtual_width = ALIGN(channel->width * 2 * fmt->bpp[0] / 8, 8);
3476
+ channel->left_virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
3477
+ } else {
3478
+ channel->virtual_width = ALIGN(channel->width * fmt->bpp[0] / 8, 8);
3479
+ }
32223480 }
32233481
32243482 if (channel->fmt_val == CSI_WRDDR_TYPE_RGB888 || channel->fmt_val == CSI_WRDDR_TYPE_RGB565)
....@@ -3237,6 +3495,8 @@
32373495 channel->width *= 2;
32383496 }
32393497 channel->virtual_width *= 2;
3498
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE)
3499
+ channel->left_virtual_width *= 2;
32403500 }
32413501 if (stream->cif_fmt_in->field == V4L2_FIELD_INTERLACED) {
32423502 channel->virtual_width *= 2;
....@@ -3585,15 +3845,18 @@
35853845
35863846 /*config reg for rk3588*/
35873847 static int rkcif_csi_channel_set_v1(struct rkcif_stream *stream,
3588
- struct csi_channel_info *channel,
3589
- enum v4l2_mbus_type mbus_type, unsigned int mode)
3848
+ struct csi_channel_info *channel,
3849
+ enum v4l2_mbus_type mbus_type, unsigned int mode,
3850
+ int index)
35903851 {
35913852 unsigned int val = 0x0;
35923853 struct rkcif_device *dev = stream->cifdev;
35933854 struct rkcif_stream *detect_stream = &dev->stream[0];
35943855 struct sditf_priv *priv = dev->sditf[0];
3856
+ struct rkmodule_capture_info *capture_info = &channel->capture_info;
35953857 unsigned int wait_line = 0x3fff;
35963858 unsigned int dma_en = 0;
3859
+ int offset = 0;
35973860
35983861 if (channel->id >= 4)
35993862 return -EINVAL;
....@@ -3609,21 +3872,28 @@
36093872 CSI_DMA_END_INTSTAT(channel->id) |
36103873 CSI_LINE_INTSTAT_V1(channel->id)));
36113874
3612
- rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
3613
- CSI_START_INTEN(channel->id));
3875
+ if (!(capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE &&
3876
+ index < capture_info->multi_dev.dev_num - 1)) {
36143877
3615
- if (priv && priv->mode.rdbk_mode && detect_stream->is_line_wake_up) {
36163878 rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
3617
- CSI_LINE_INTEN_RK3588(channel->id));
3618
- wait_line = dev->wait_line;
3619
- }
3620
- rkcif_write_register(dev, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1,
3621
- wait_line << 16 | wait_line);
3622
- rkcif_write_register(dev, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3,
3623
- wait_line << 16 | wait_line);
3879
+ CSI_START_INTEN(channel->id));
36243880
3625
- rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
3626
- CSI_DMA_END_INTEN(channel->id));
3881
+ if (priv && priv->mode.rdbk_mode && detect_stream->is_line_wake_up) {
3882
+ rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
3883
+ CSI_LINE_INTEN_RK3588(channel->id));
3884
+ wait_line = dev->wait_line;
3885
+ }
3886
+ rkcif_write_register(dev, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID0_1,
3887
+ wait_line << 16 | wait_line);
3888
+ rkcif_write_register(dev, CIF_REG_MIPI_LVDS_LINE_INT_NUM_ID2_3,
3889
+ wait_line << 16 | wait_line);
3890
+
3891
+ rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
3892
+ CSI_DMA_END_INTEN(channel->id));
3893
+
3894
+ rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
3895
+ CSI_ALL_ERROR_INTEN_V1);
3896
+ }
36273897 if (stream->cifdev->id_use_cnt == 0) {
36283898 val = CIF_MIPI_LVDS_SW_PRESS_VALUE_RK3588(0x3) |
36293899 CIF_MIPI_LVDS_SW_PRESS_ENABLE |
....@@ -3637,24 +3907,25 @@
36373907 else
36383908 val |= CIF_MIPI_LVDS_SW_SEL_LVDS_RV1106;
36393909 rkcif_write_register(dev, CIF_REG_MIPI_LVDS_CTRL, val);
3640
-
3641
- rkcif_write_register_or(dev, CIF_REG_MIPI_LVDS_INTEN,
3642
- CSI_ALL_ERROR_INTEN_V1);
36433910 }
36443911 #if IS_ENABLED(CONFIG_CPU_RV1106)
36453912 if (channel->id == 1)
36463913 rv1106_sdmmc_get_lock();
36473914 #endif
3915
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE &&
3916
+ priv && priv->mode.rdbk_mode == RKISP_VICAP_ONLINE &&
3917
+ (dev->hdr.hdr_mode == NO_HDR ||
3918
+ (dev->hdr.hdr_mode == HDR_X2 && stream->id == 1) ||
3919
+ (dev->hdr.hdr_mode == HDR_X3 && stream->id == 2)))
3920
+ offset = channel->capture_info.multi_dev.pixel_offset;
3921
+
36483922 rkcif_write_register(dev, get_reg_index_of_id_ctrl1(channel->id),
3649
- channel->width | (channel->height << 16));
3923
+ (channel->width + offset) | (channel->height << 16));
36503924
36513925 #if IS_ENABLED(CONFIG_CPU_RV1106)
36523926 if (channel->id == 1)
36533927 rv1106_sdmmc_put_lock();
36543928 #endif
3655
-
3656
- rkcif_write_register(dev, get_reg_index_of_frm0_y_vlw(channel->id),
3657
- channel->virtual_width);
36583929
36593930 if (channel->crop_en)
36603931 rkcif_write_register(dev, get_reg_index_of_id_crop_start(channel->id),
....@@ -3673,6 +3944,17 @@
36733944 rkcif_assign_new_buffer_pingpong_rockit(stream,
36743945 RKCIF_YUV_ADDR_STATE_INIT,
36753946 channel->id);
3947
+
3948
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE &&
3949
+ index == (capture_info->multi_dev.dev_num - 1) &&
3950
+ priv && priv->mode.rdbk_mode != RKISP_VICAP_ONLINE)
3951
+ rkcif_write_register(dev, get_reg_index_of_id_crop_start(channel->id),
3952
+ channel->crop_st_y << 16 |
3953
+ (channel->crop_st_x + capture_info->multi_dev.pixel_offset));
3954
+
3955
+ rkcif_write_register(dev, get_reg_index_of_frm0_y_vlw(channel->id),
3956
+ channel->virtual_width);
3957
+
36763958 if (stream->lack_buf_cnt == 2)
36773959 stream->dma_en = 0;
36783960
....@@ -3735,7 +4017,24 @@
37354017 }
37364018 if (dev->chip_id >= CHIP_RV1106_CIF)
37374019 rkcif_modify_frame_skip_config(stream);
3738
- stream->cifdev->id_use_cnt++;
4020
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
4021
+ if (index == (capture_info->multi_dev.dev_num - 1))
4022
+ stream->cifdev->id_use_cnt++;
4023
+ } else {
4024
+ stream->cifdev->id_use_cnt++;
4025
+ }
4026
+ if (!(capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE &&
4027
+ index < capture_info->multi_dev.dev_num - 1)) {
4028
+ if (mode == RKCIF_STREAM_MODE_CAPTURE)
4029
+ rkcif_assign_new_buffer_pingpong(stream,
4030
+ RKCIF_YUV_ADDR_STATE_INIT,
4031
+ channel->id);
4032
+ else if (mode == RKCIF_STREAM_MODE_TOISP ||
4033
+ mode == RKCIF_STREAM_MODE_TOISP_RDBK)
4034
+ rkcif_assign_new_buffer_pingpong_toisp(stream,
4035
+ RKCIF_YUV_ADDR_STATE_INIT,
4036
+ channel->id);
4037
+ }
37394038 return 0;
37404039 }
37414040
....@@ -3747,6 +4046,7 @@
37474046 enum v4l2_mbus_type mbus_type = active_sensor->mbus.type;
37484047 struct csi_channel_info *channel;
37494048 u32 ret = 0;
4049
+ int i;
37504050
37514051 if (stream->state < RKCIF_STATE_STREAMING) {
37524052 stream->frame_idx = 0;
....@@ -3785,10 +4085,18 @@
37854085 } else if (mode == RKCIF_STREAM_MODE_ROCKIT) {
37864086 stream->dma_en |= RKCIF_DMAEN_BY_ROCKIT;
37874087 }
3788
- if (stream->cifdev->chip_id < CHIP_RK3588_CIF)
4088
+ if (stream->cifdev->chip_id < CHIP_RK3588_CIF) {
37894089 rkcif_csi_channel_set(stream, channel, mbus_type);
3790
- else
3791
- rkcif_csi_channel_set_v1(stream, channel, mbus_type, mode);
4090
+ } else {
4091
+ if (channel->capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
4092
+ for (i = 0; i < channel->capture_info.multi_dev.dev_num; i++) {
4093
+ dev->csi_host_idx = channel->capture_info.multi_dev.dev_idx[i];
4094
+ rkcif_csi_channel_set_v1(stream, channel, mbus_type, mode, i);
4095
+ }
4096
+ } else {
4097
+ rkcif_csi_channel_set_v1(stream, channel, mbus_type, mode, 0);
4098
+ }
4099
+ }
37924100 } else {
37934101 if (stream->cifdev->chip_id >= CHIP_RK3588_CIF) {
37944102 if (mode == RKCIF_STREAM_MODE_CAPTURE) {
....@@ -3828,7 +4136,9 @@
38284136 struct v4l2_mbus_config *mbus_cfg = &cif_dev->active_sensor->mbus;
38294137 u32 val;
38304138 int id;
4139
+ int i = 0;
38314140
4141
+ stream->cifdev->id_use_cnt--;
38324142 if (mbus_cfg->type == V4L2_MBUS_CSI2_DPHY ||
38334143 mbus_cfg->type == V4L2_MBUS_CSI2_CPHY ||
38344144 mbus_cfg->type == V4L2_MBUS_CCP2) {
....@@ -3840,7 +4150,14 @@
38404150 else
38414151 val &= ~LVDS_ENABLE_CAPTURE;
38424152
3843
- rkcif_write_register(cif_dev, get_reg_index_of_id_ctrl0(id), val);
4153
+ if (cif_dev->channels[id].capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
4154
+ for (i = 0; i < cif_dev->channels[id].capture_info.multi_dev.dev_num; i++) {
4155
+ cif_dev->csi_host_idx = cif_dev->channels[id].capture_info.multi_dev.dev_idx[i];
4156
+ rkcif_write_register(cif_dev, get_reg_index_of_id_ctrl0(id), val);
4157
+ }
4158
+ } else {
4159
+ rkcif_write_register(cif_dev, get_reg_index_of_id_ctrl0(id), val);
4160
+ }
38444161
38454162 rkcif_write_register_or(cif_dev, CIF_REG_MIPI_LVDS_INTSTAT,
38464163 CSI_START_INTSTAT(id) |
....@@ -3859,8 +4176,16 @@
38594176 if (stream->cifdev->id_use_cnt == 0) {
38604177 rkcif_write_register_and(cif_dev, CIF_REG_MIPI_LVDS_INTEN,
38614178 ~CSI_ALL_ERROR_INTEN_V1);
3862
- rkcif_write_register_and(cif_dev, CIF_REG_MIPI_LVDS_CTRL,
3863
- ~CSI_ENABLE_CAPTURE);
4179
+ if (cif_dev->channels[id].capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
4180
+ for (i = 0; i < cif_dev->channels[id].capture_info.multi_dev.dev_num; i++) {
4181
+ cif_dev->csi_host_idx = cif_dev->channels[id].capture_info.multi_dev.dev_idx[i];
4182
+ rkcif_write_register_and(cif_dev, CIF_REG_MIPI_LVDS_CTRL,
4183
+ ~CSI_ENABLE_CAPTURE);
4184
+ }
4185
+ } else {
4186
+ rkcif_write_register_and(cif_dev, CIF_REG_MIPI_LVDS_CTRL,
4187
+ ~CSI_ENABLE_CAPTURE);
4188
+ }
38644189 }
38654190 }
38664191
....@@ -3876,7 +4201,6 @@
38764201 rkcif_config_dvp_pin(cif_dev, false);
38774202 }
38784203 }
3879
- stream->cifdev->id_use_cnt--;
38804204 stream->state = RKCIF_STATE_READY;
38814205 stream->dma_en = 0;
38824206 }
....@@ -3955,7 +4279,7 @@
39554279 plane_fmt = &pixm->plane_fmt[i];
39564280 sizes[i] = plane_fmt->sizeimage / height * h;
39574281 }
3958
-
4282
+ stream->total_buf_num = *num_buffers;
39594283 v4l2_dbg(1, rkcif_debug, &dev->v4l2_dev, "%s count %d, size %d, extended(%d, %d)\n",
39604284 v4l2_type_names[queue->type], *num_buffers, sizes[0],
39614285 is_extended, extend_line->is_extended);
....@@ -3973,6 +4297,8 @@
39734297 u32 frm_addr_y = 0, frm_addr_uv = 0;
39744298 u32 frm0_addr_y = 0, frm0_addr_uv = 0;
39754299 u32 frm1_addr_y = 0, frm1_addr_uv = 0;
4300
+ u32 buff_addr_y = 0, buff_addr_cbcr = 0;
4301
+ struct rkmodule_capture_info *capture_info = &dev->channels[channel_id].capture_info;
39764302 unsigned long flags;
39774303 int frame_phase = 0;
39784304 bool is_dual_update_buf = false;
....@@ -4039,22 +4365,51 @@
40394365 }
40404366 if (buffer) {
40414367 if (is_dual_update_buf) {
4042
- rkcif_write_register(dev, frm0_addr_y,
4043
- buffer->buff_addr[RKCIF_PLANE_Y]);
4044
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
4045
- rkcif_write_register(dev, frm0_addr_uv,
4046
- buffer->buff_addr[RKCIF_PLANE_CBCR]);
4047
- rkcif_write_register(dev, frm1_addr_y,
4048
- buffer->buff_addr[RKCIF_PLANE_Y]);
4049
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
4050
- rkcif_write_register(dev, frm1_addr_uv,
4051
- buffer->buff_addr[RKCIF_PLANE_CBCR]);
4368
+ buff_addr_y = buffer->buff_addr[RKCIF_PLANE_Y];
4369
+ buff_addr_cbcr = buffer->buff_addr[RKCIF_PLANE_CBCR];
4370
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
4371
+ rkcif_write_buff_addr_multi_dev_combine(stream,
4372
+ frm0_addr_y,
4373
+ frm0_addr_uv,
4374
+ buff_addr_y,
4375
+ buff_addr_cbcr,
4376
+ false);
4377
+ rkcif_write_buff_addr_multi_dev_combine(stream,
4378
+ frm1_addr_y,
4379
+ frm1_addr_uv,
4380
+ buff_addr_y,
4381
+ buff_addr_cbcr,
4382
+ false);
4383
+ } else {
4384
+ rkcif_write_register(dev, frm0_addr_y, buff_addr_y);
4385
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
4386
+ rkcif_write_register(dev,
4387
+ frm0_addr_uv,
4388
+ buff_addr_cbcr);
4389
+ rkcif_write_register(dev, frm1_addr_y, buff_addr_y);
4390
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
4391
+ rkcif_write_register(dev,
4392
+ frm1_addr_uv,
4393
+ buff_addr_cbcr);
4394
+ }
40524395 } else {
4053
- rkcif_write_register(dev, frm_addr_y,
4054
- buffer->buff_addr[RKCIF_PLANE_Y]);
4055
- if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
4056
- rkcif_write_register(dev, frm_addr_uv,
4057
- buffer->buff_addr[RKCIF_PLANE_CBCR]);
4396
+
4397
+ buff_addr_y = buffer->buff_addr[RKCIF_PLANE_Y];
4398
+ buff_addr_cbcr = buffer->buff_addr[RKCIF_PLANE_CBCR];
4399
+ if (capture_info->mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
4400
+ rkcif_write_buff_addr_multi_dev_combine(stream,
4401
+ frm_addr_y,
4402
+ frm_addr_uv,
4403
+ buff_addr_y,
4404
+ buff_addr_cbcr,
4405
+ false);
4406
+ } else {
4407
+ rkcif_write_register(dev, frm_addr_y, buff_addr_y);
4408
+ if (stream->cif_fmt_out->fmt_type != CIF_FMT_TYPE_RAW)
4409
+ rkcif_write_register(dev,
4410
+ frm_addr_uv,
4411
+ buff_addr_cbcr);
4412
+ }
40584413 }
40594414 }
40604415 } else {
....@@ -4065,11 +4420,17 @@
40654420 if (stream->frame_phase_cache == CIF_CSI_FRAME0_READY) {
40664421 stream->curr_buf = list_first_entry(&stream->buf_head,
40674422 struct rkcif_buffer, queue);
4423
+ v4l2_dbg(3, rkcif_debug, &dev->v4l2_dev,
4424
+ "%s %d, stream[%d] buf idx %d\n",
4425
+ __func__, __LINE__, stream->id, stream->curr_buf->vb.vb2_buf.index);
40684426 if (stream->curr_buf)
40694427 list_del(&stream->curr_buf->queue);
40704428 } else if (stream->frame_phase_cache == CIF_CSI_FRAME1_READY) {
40714429 stream->next_buf = list_first_entry(&stream->buf_head,
40724430 struct rkcif_buffer, queue);
4431
+ v4l2_dbg(4, rkcif_debug, &dev->v4l2_dev,
4432
+ "%s %d, stream[%d] buf idx %d\n",
4433
+ __func__, __LINE__, stream->id, stream->next_buf->vb.vb2_buf.index);
40734434 if (stream->next_buf)
40744435 list_del(&stream->next_buf->queue);
40754436 }
....@@ -4098,6 +4459,7 @@
40984459 }
40994460 if (stream->lack_buf_cnt)
41004461 stream->lack_buf_cnt--;
4462
+
41014463 } else {
41024464 v4l2_info(&dev->v4l2_dev, "%s %d, state %d, curr_buf %p, next_buf %p\n",
41034465 __func__, __LINE__, stream->state, stream->curr_buf, stream->next_buf);
....@@ -4200,6 +4562,7 @@
42004562 v4l2_dbg(3, rkcif_debug, &stream->cifdev->v4l2_dev,
42014563 "stream[%d] buf queue, index: %d, dma_addr 0x%x\n",
42024564 stream->id, vb->index, cifbuf->buff_addr[0]);
4565
+ atomic_inc(&stream->buf_cnt);
42034566 }
42044567
42054568 void rkcif_free_rx_buf(struct rkcif_stream *stream, int buf_num)
....@@ -4229,6 +4592,8 @@
42294592 rkcif_free_buffer(dev, &buf->dummy);
42304593 else
42314594 list_add_tail(&buf->list_free, &priv->buf_free_list);
4595
+ atomic_dec(&stream->buf_cnt);
4596
+ stream->total_buf_num--;
42324597 }
42334598
42344599 if (dev->is_thunderboot) {
....@@ -4322,7 +4687,6 @@
43224687 if (priv && priv->mode.rdbk_mode == RKISP_VICAP_ONLINE && i == 0) {
43234688 buf->dbufs.is_first = true;
43244689 rkcif_s_rx_buffer(dev, &buf->dbufs);
4325
- stream->buf_num_toisp--;
43264690 }
43274691 i++;
43284692 if (!dev->is_thunderboot && i >= buf_num) {
....@@ -4338,7 +4702,8 @@
43384702 (u64)dummy->dma_addr, pixm->plane_fmt[0].sizeimage);
43394703 }
43404704 if (priv->buf_num) {
4341
- stream->buf_num_toisp = priv->buf_num;
4705
+ stream->total_buf_num = priv->buf_num;
4706
+ atomic_set(&stream->buf_cnt, priv->buf_num);
43424707 return 0;
43434708 } else {
43444709 return -EINVAL;
....@@ -4352,6 +4717,7 @@
43524717 struct rkcif_dummy_buffer *dummy_buf = &hw->dummy_buf;
43534718 struct rkcif_device *tmp_dev = NULL;
43544719 struct v4l2_subdev_frame_interval_enum fie;
4720
+ struct v4l2_subdev_format fmt;
43554721 u32 max_size = 0;
43564722 u32 size = 0;
43574723 int ret = 0;
....@@ -4386,6 +4752,21 @@
43864752 continue;
43874753 }
43884754 }
4755
+
4756
+ if (max_size == 0 && dev->terminal_sensor.sd) {
4757
+ fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
4758
+ ret = v4l2_subdev_call(dev->terminal_sensor.sd,
4759
+ pad, get_fmt, NULL, &fmt);
4760
+ if (!ret) {
4761
+ if (fmt.format.code == MEDIA_BUS_FMT_RGB888_1X24)
4762
+ size = fmt.format.width * fmt.format.height * 3;
4763
+ else
4764
+ size = fmt.format.width * fmt.format.height * 2;
4765
+ if (size > max_size)
4766
+ max_size = size;
4767
+ }
4768
+ }
4769
+
43894770 dummy_buf->size = max_size;
43904771
43914772 dummy_buf->is_need_vaddr = true;
....@@ -4621,14 +5002,16 @@
46215002 } else if (mode == RKCIF_STREAM_MODE_CAPTURE && stream->dma_en & RKCIF_DMAEN_BY_VICAP) {
46225003 //only stop dma
46235004 stream->to_stop_dma = RKCIF_DMAEN_BY_VICAP;
5005
+ stream->is_wait_dma_stop = true;
46245006 wait_event_timeout(stream->wq_stopped,
4625
- stream->to_stop_dma != RKCIF_DMAEN_BY_VICAP,
5007
+ !stream->is_wait_dma_stop,
46265008 msecs_to_jiffies(1000));
46275009 } else if (mode == RKCIF_STREAM_MODE_TOISP && stream->dma_en & RKCIF_DMAEN_BY_VICAP) {
46285010 //only stop dma
46295011 stream->to_stop_dma = RKCIF_DMAEN_BY_ISP;
5012
+ stream->is_wait_dma_stop = true;
46305013 wait_event_timeout(stream->wq_stopped,
4631
- stream->to_stop_dma != RKCIF_DMAEN_BY_ISP,
5014
+ !stream->is_wait_dma_stop,
46325015 msecs_to_jiffies(1000));
46335016 }
46345017 if ((mode & RKCIF_STREAM_MODE_CAPTURE) == RKCIF_STREAM_MODE_CAPTURE) {
....@@ -4664,6 +5047,8 @@
46645047 vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR);
46655048 }
46665049 }
5050
+ stream->total_buf_num = 0;
5051
+ atomic_set(&stream->buf_cnt, 0);
46675052 stream->lack_buf_cnt = 0;
46685053 stream->dma_en &= ~RKCIF_DMAEN_BY_VICAP;
46695054 }
....@@ -4704,10 +5089,12 @@
47045089 dev->wait_line = 0;
47055090 stream->is_line_wake_up = false;
47065091 }
4707
- tasklet_disable(&stream->vb_done_tasklet);
5092
+ if (can_reset && hw_dev->dummy_buf.vaddr)
5093
+ rkcif_destroy_dummy_buf(stream);
47085094 }
4709
- if (can_reset && hw_dev->dummy_buf.vaddr)
4710
- rkcif_destroy_dummy_buf(stream);
5095
+ if (mode == RKCIF_STREAM_MODE_CAPTURE)
5096
+ tasklet_disable(&stream->vb_done_tasklet);
5097
+
47115098 stream->cur_stream_mode &= ~mode;
47125099 INIT_LIST_HEAD(&stream->vb_done_list);
47135100 v4l2_info(&dev->v4l2_dev, "stream[%d] stopping finished, dma_en 0x%x\n", stream->id, stream->dma_en);
....@@ -4981,6 +5368,7 @@
49815368 stream->crop_mask |= CROP_SRC_SENSOR_MASK;
49825369 dev->terminal_sensor.selection = input_sel;
49835370 } else {
5371
+ stream->crop_mask &= ~CROP_SRC_SENSOR_MASK;
49845372 dev->terminal_sensor.selection.r = dev->terminal_sensor.raw_rect;
49855373 }
49865374 }
....@@ -5001,8 +5389,10 @@
50015389 stream->crop[CROP_SRC_ACT].top = stream->crop[CROP_SRC_USR].top +
50025390 stream->crop[CROP_SRC_SENSOR].top;
50035391 }
5004
- } else {
5392
+ } else if (stream->crop_mask & CROP_SRC_SENSOR_MASK) {
50055393 stream->crop[CROP_SRC_ACT] = stream->crop[CROP_SRC_SENSOR];
5394
+ } else {
5395
+ stream->crop[CROP_SRC_ACT] = dev->terminal_sensor.raw_rect;
50065396 }
50075397 }
50085398
....@@ -5018,9 +5408,9 @@
50185408 struct v4l2_rect input, *crop;
50195409
50205410 if (dev->terminal_sensor.sd) {
5021
- stream->cif_fmt_in = get_input_fmt(dev->terminal_sensor.sd,
5022
- &input, stream->id,
5023
- &dev->channels[stream->id]);
5411
+ stream->cif_fmt_in = rkcif_get_input_fmt(dev,
5412
+ &input, stream->id,
5413
+ &dev->channels[stream->id]);
50245414 if (!stream->cif_fmt_in) {
50255415 v4l2_err(v4l2_dev, "Input fmt is invalid\n");
50265416 return -EINVAL;
....@@ -5562,6 +5952,7 @@
55625952 {
55635953 struct rkcif_hw *hw = cifdev->hw_dev;
55645954 struct rkcif_device *dev;
5955
+ struct sditf_priv *priv;
55655956 int i = 0, j = 0;
55665957 int ret = 0;
55675958 int count = 0;
....@@ -5610,12 +6001,12 @@
56106001 else
56116002 sync_cfg.group = 0;
56126003 }
6004
+ cifdev->sync_cfg = sync_cfg;
56136005 if (sync_cfg.type == NO_SYNC_MODE ||
56146006 hw->sync_config[sync_cfg.group].is_attach) {
56156007 mutex_unlock(&hw->dev_lock);
56166008 return;
56176009 }
5618
- cifdev->sync_cfg = sync_cfg;
56196010
56206011 sync_config = &hw->sync_config[sync_cfg.group];
56216012 memset(sync_config, 0, sizeof(struct rkcif_multi_sync_config));
....@@ -5639,26 +6030,31 @@
56396030 else
56406031 sync_cfg.group = 0;
56416032 } else {
5642
- for (j = 0; j < dev->sditf_cnt; j++) {
5643
- ret |= v4l2_subdev_call(dev->sditf[j]->sensor_sd,
5644
- core, ioctl,
5645
- RKMODULE_GET_SYNC_MODE,
5646
- &sync_type);
5647
- if (!ret && sync_type)
5648
- break;
6033
+ priv = dev->sditf[0];
6034
+ if (priv && priv->is_combine_mode && dev->sditf_cnt <= RKCIF_MAX_SDITF) {
6035
+ for (j = 0; j < dev->sditf_cnt; j++) {
6036
+ ret |= v4l2_subdev_call(dev->sditf[j]->sensor_sd,
6037
+ core, ioctl,
6038
+ RKMODULE_GET_SYNC_MODE,
6039
+ &sync_type);
6040
+ if (!ret && sync_type) {
6041
+ priv = dev->sditf[j];
6042
+ break;
6043
+ }
6044
+ }
6045
+ if (!ret)
6046
+ sync_cfg.type = sync_type;
6047
+ else
6048
+ sync_cfg.type = NO_SYNC_MODE;
6049
+ ret = v4l2_subdev_call(priv->sensor_sd,
6050
+ core, ioctl,
6051
+ RKMODULE_GET_GROUP_ID,
6052
+ &sync_group);
6053
+ if (!ret && sync_group < RKCIF_MAX_GROUP)
6054
+ sync_cfg.group = sync_group;
6055
+ else
6056
+ sync_cfg.group = 0;
56496057 }
5650
- if (!ret)
5651
- sync_cfg.type = sync_type;
5652
- else
5653
- sync_cfg.type = NO_SYNC_MODE;
5654
- ret = v4l2_subdev_call(dev->sditf[j]->sensor_sd,
5655
- core, ioctl,
5656
- RKMODULE_GET_GROUP_ID,
5657
- &sync_group);
5658
- if (!ret && sync_group < RKCIF_MAX_GROUP)
5659
- sync_cfg.group = sync_group;
5660
- else
5661
- sync_cfg.group = 0;
56626058 }
56636059 if (sync_cfg.group == cifdev->sync_cfg.group) {
56646060 if (sync_cfg.type == EXTERNAL_MASTER_MODE) {
....@@ -5681,6 +6077,11 @@
56816077 sync_config->sync_mask |= BIT(dev->csi_host_idx);
56826078 }
56836079 dev->sync_cfg = sync_cfg;
6080
+ } else {
6081
+ ret = v4l2_subdev_call(dev->terminal_sensor.sd,
6082
+ core, ioctl,
6083
+ RKMODULE_GET_SYNC_MODE,
6084
+ &sync_type);
56846085 }
56856086 }
56866087 if (sync_config->int_master.count == 1) {
....@@ -5714,15 +6115,18 @@
57146115 struct rkcif_hw *hw_dev = dev->hw_dev;
57156116 struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
57166117 struct rkcif_sensor_info *sensor_info = dev->active_sensor;
5717
- struct rkcif_sensor_info *terminal_sensor = &dev->terminal_sensor;
6118
+ struct rkcif_sensor_info *terminal_sensor = NULL;
57186119 struct rkmodule_hdr_cfg hdr_cfg;
6120
+ struct rkcif_csi_info csi_info = {0};
57196121 int rkmodule_stream_seq = RKMODULE_START_STREAM_DEFAULT;
57206122 int ret;
6123
+ int i = 0;
57216124
57226125 v4l2_info(&dev->v4l2_dev, "stream[%d] start streaming\n", stream->id);
57236126
57246127 rkcif_attach_sync_mode(dev);
57256128 mutex_lock(&dev->stream_lock);
6129
+
57266130 if ((stream->cur_stream_mode & RKCIF_STREAM_MODE_CAPTURE) == mode) {
57276131 ret = -EBUSY;
57286132 v4l2_err(v4l2_dev, "stream in busy state\n");
....@@ -5735,7 +6139,7 @@
57356139 else
57366140 stream->is_line_inten = false;
57376141
5738
- if (dev->active_sensor) {
6142
+ if (!dev->active_sensor) {
57396143 ret = rkcif_update_sensor_info(stream);
57406144 if (ret < 0) {
57416145 v4l2_err(v4l2_dev,
....@@ -5744,7 +6148,7 @@
57446148 goto out;
57456149 }
57466150 }
5747
-
6151
+ terminal_sensor = &dev->terminal_sensor;
57486152 if (terminal_sensor->sd) {
57496153 ret = v4l2_subdev_call(terminal_sensor->sd,
57506154 core, ioctl,
....@@ -5775,6 +6179,39 @@
57756179 goto destroy_buf;
57766180
57776181 mutex_lock(&hw_dev->dev_lock);
6182
+ if (atomic_read(&dev->pipe.stream_cnt) == 0 &&
6183
+ dev->active_sensor &&
6184
+ (dev->active_sensor->mbus.type == V4L2_MBUS_CSI2_DPHY ||
6185
+ dev->active_sensor->mbus.type == V4L2_MBUS_CSI2_CPHY ||
6186
+ dev->active_sensor->mbus.type == V4L2_MBUS_CCP2)) {
6187
+ if (dev->channels[0].capture_info.mode == RKMODULE_MULTI_DEV_COMBINE_ONE) {
6188
+ csi_info.csi_num = dev->channels[0].capture_info.multi_dev.dev_num;
6189
+ if (csi_info.csi_num > RKCIF_MAX_CSI_NUM) {
6190
+ v4l2_err(v4l2_dev,
6191
+ "csi num %d, max %d\n",
6192
+ csi_info.csi_num, RKCIF_MAX_CSI_NUM);
6193
+ goto out;
6194
+ }
6195
+ for (i = 0; i < csi_info.csi_num; i++) {
6196
+ csi_info.csi_idx[i] = dev->channels[0].capture_info.multi_dev.dev_idx[i];
6197
+ if (dev->hw_dev->is_rk3588s2)
6198
+ v4l2_info(v4l2_dev, "rk3588s2 combine mode attach to mipi%d\n",
6199
+ csi_info.csi_idx[i]);
6200
+ }
6201
+ } else {
6202
+ csi_info.csi_num = 1;
6203
+ dev->csi_host_idx = dev->csi_host_idx_def;
6204
+ csi_info.csi_idx[0] = dev->csi_host_idx;
6205
+ }
6206
+ ret = v4l2_subdev_call(dev->active_sensor->sd,
6207
+ core, ioctl,
6208
+ RKCIF_CMD_SET_CSI_IDX,
6209
+ &csi_info);
6210
+ if (ret)
6211
+ v4l2_err(&dev->v4l2_dev, "set csi idx %d fail\n", dev->csi_host_idx);
6212
+
6213
+ }
6214
+
57786215 if (((dev->active_sensor && dev->active_sensor->mbus.type == V4L2_MBUS_BT656) ||
57796216 dev->is_use_dummybuf) &&
57806217 (!dev->hw_dev->dummy_buf.vaddr) &&
....@@ -5788,8 +6225,10 @@
57886225 }
57896226 mutex_unlock(&hw_dev->dev_lock);
57906227
5791
- if (stream->cur_stream_mode == RKCIF_STREAM_MODE_NONE) {
6228
+ if (mode == RKCIF_STREAM_MODE_CAPTURE)
57926229 tasklet_enable(&stream->vb_done_tasklet);
6230
+
6231
+ if (stream->cur_stream_mode == RKCIF_STREAM_MODE_NONE) {
57936232 ret = dev->pipe.open(&dev->pipe, &node->vdev.entity, true);
57946233 if (ret < 0) {
57956234 v4l2_err(v4l2_dev, "open cif pipeline failed %d\n",
....@@ -5807,7 +6246,7 @@
58076246 rkmodule_stream_seq == RKMODULE_START_STREAM_FRONT) {
58086247 ret = dev->pipe.set_stream(&dev->pipe, true);
58096248 if (ret < 0)
5810
- goto runtime_put;
6249
+ goto destroy_buf;
58116250 }
58126251 }
58136252 if (dev->chip_id >= CHIP_RK1808_CIF) {
....@@ -5823,7 +6262,7 @@
58236262 }
58246263
58256264 if (ret < 0)
5826
- goto runtime_put;
6265
+ goto destroy_buf;
58276266
58286267 if (stream->cur_stream_mode == RKCIF_STREAM_MODE_NONE) {
58296268 ret = media_pipeline_start(&node->vdev.entity, &dev->pipe.pipe);
....@@ -5869,15 +6308,19 @@
58696308 rkcif_stream_stop(stream);
58706309 pipe_stream_off:
58716310 dev->pipe.set_stream(&dev->pipe, false);
5872
-runtime_put:
5873
- pm_runtime_put_sync(dev->dev);
6311
+
58746312 destroy_buf:
5875
- if (stream->next_buf)
5876
- vb2_buffer_done(&stream->next_buf->vb.vb2_buf,
5877
- VB2_BUF_STATE_QUEUED);
6313
+ if (mode == RKCIF_STREAM_MODE_CAPTURE)
6314
+ tasklet_disable(&stream->vb_done_tasklet);
58786315 if (stream->curr_buf)
5879
- vb2_buffer_done(&stream->curr_buf->vb.vb2_buf,
5880
- VB2_BUF_STATE_QUEUED);
6316
+ list_add_tail(&stream->curr_buf->queue, &stream->buf_head);
6317
+ if (stream->next_buf &&
6318
+ stream->next_buf != stream->curr_buf)
6319
+ list_add_tail(&stream->next_buf->queue, &stream->buf_head);
6320
+
6321
+ stream->curr_buf = NULL;
6322
+ stream->next_buf = NULL;
6323
+ atomic_set(&stream->buf_cnt, 0);
58816324 while (!list_empty(&stream->buf_head)) {
58826325 struct rkcif_buffer *buf;
58836326
....@@ -5942,6 +6385,7 @@
59426385 bool try)
59436386 {
59446387 struct rkcif_device *dev = stream->cifdev;
6388
+ struct sditf_priv *priv = dev->sditf[0];
59456389 const struct cif_output_fmt *fmt;
59466390 const struct cif_input_fmt *cif_fmt_in = NULL;
59476391 struct v4l2_rect input_rect;
....@@ -5949,6 +6393,7 @@
59496393 u32 xsubs = 1, ysubs = 1, i;
59506394 struct rkmodule_hdr_cfg hdr_cfg;
59516395 struct rkcif_extend_info *extend_line = &stream->extend_line;
6396
+ struct csi_channel_info *channel_info = &dev->channels[stream->id];
59526397 int ret;
59536398
59546399 for (i = 0; i < RKCIF_MAX_PLANE; i++)
....@@ -5962,9 +6407,9 @@
59626407 input_rect.height = RKCIF_DEFAULT_HEIGHT;
59636408
59646409 if (dev->terminal_sensor.sd) {
5965
- cif_fmt_in = get_input_fmt(dev->terminal_sensor.sd,
5966
- &input_rect, stream->id,
5967
- &dev->channels[stream->id]);
6410
+ cif_fmt_in = rkcif_get_input_fmt(dev,
6411
+ &input_rect, stream->id,
6412
+ channel_info);
59686413 stream->cif_fmt_in = cif_fmt_in;
59696414 } else {
59706415 v4l2_err(&stream->cifdev->v4l2_dev,
....@@ -6006,8 +6451,9 @@
60066451
60076452 planes = fmt->cplanes ? fmt->cplanes : fmt->mplanes;
60086453
6009
- if (cif_fmt_in && (cif_fmt_in->mbus_code == MEDIA_BUS_FMT_SPD_2X8 ||
6010
- cif_fmt_in->mbus_code == MEDIA_BUS_FMT_EBD_1X8))
6454
+ if (cif_fmt_in &&
6455
+ (cif_fmt_in->mbus_code == MEDIA_BUS_FMT_SPD_2X8 ||
6456
+ cif_fmt_in->mbus_code == MEDIA_BUS_FMT_EBD_1X8))
60116457 stream->crop_enable = false;
60126458
60136459 for (i = 0; i < planes; i++) {
....@@ -6032,7 +6478,7 @@
60326478 }
60336479 }
60346480
6035
- if (dev->sditf_cnt > 1 && dev->sditf_cnt <= RKCIF_MAX_SDITF)
6481
+ if (priv && priv->is_combine_mode && dev->sditf_cnt <= RKCIF_MAX_SDITF)
60366482 height *= dev->sditf_cnt;
60376483
60386484 extend_line->pixm.height = height + RKMODULE_EXTEND_LINE;
....@@ -6042,8 +6488,9 @@
60426488 * to optimize reading and writing of ddr, aliged with 256.
60436489 */
60446490 if (fmt->fmt_type == CIF_FMT_TYPE_RAW &&
6045
- (stream->cif_fmt_in->mbus_code == MEDIA_BUS_FMT_EBD_1X8 ||
6046
- stream->cif_fmt_in->mbus_code == MEDIA_BUS_FMT_SPD_2X8)) {
6491
+ cif_fmt_in &&
6492
+ (cif_fmt_in->mbus_code == MEDIA_BUS_FMT_EBD_1X8 ||
6493
+ cif_fmt_in->mbus_code == MEDIA_BUS_FMT_SPD_2X8)) {
60476494 stream->is_compact = false;
60486495 }
60496496
....@@ -6157,6 +6604,7 @@
61576604
61586605 stream->is_high_align = false;
61596606 stream->is_finish_stop_dma = false;
6607
+ stream->is_wait_dma_stop = false;
61606608
61616609 if (dev->chip_id == CHIP_RV1126_CIF ||
61626610 dev->chip_id == CHIP_RV1126_CIF_LITE)
....@@ -6184,6 +6632,7 @@
61846632 stream->buf_owner = 0;
61856633 stream->buf_replace_cnt = 0;
61866634 stream->is_stop_capture = false;
6635
+ atomic_set(&stream->buf_cnt, 0);
61876636 }
61886637
61896638 static int rkcif_fh_open(struct file *filp)
....@@ -6329,9 +6778,9 @@
63296778 input_rect.height = RKCIF_DEFAULT_HEIGHT;
63306779
63316780 if (dev->terminal_sensor.sd)
6332
- get_input_fmt(dev->terminal_sensor.sd,
6333
- &input_rect, stream->id,
6334
- &csi_info);
6781
+ rkcif_get_input_fmt(dev,
6782
+ &input_rect, stream->id,
6783
+ &csi_info);
63356784
63366785 if (dev->hw_dev->adapt_to_usbcamerahal) {
63376786 fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
....@@ -6410,7 +6859,7 @@
64106859 return -EINVAL;
64116860
64126861 if (dev->terminal_sensor.sd) {
6413
- cif_fmt_in = get_input_fmt(dev->terminal_sensor.sd,
6862
+ cif_fmt_in = rkcif_get_input_fmt(dev,
64146863 &input_rect, stream->id,
64156864 &dev->channels[stream->id]);
64166865 stream->cif_fmt_in = cif_fmt_in;
....@@ -6796,8 +7245,8 @@
67967245 break;
67977246 case RKCIF_CMD_SET_CSI_MEMORY_MODE:
67987247 if (dev->terminal_sensor.sd) {
6799
- in_fmt = get_input_fmt(dev->terminal_sensor.sd,
6800
- &rect, 0, &csi_info);
7248
+ in_fmt = rkcif_get_input_fmt(dev,
7249
+ &rect, 0, &csi_info);
68017250 if (in_fmt == NULL) {
68027251 v4l2_err(&dev->v4l2_dev, "can't get sensor input format\n");
68037252 return -EINVAL;
....@@ -6876,6 +7325,7 @@
68767325 v4l2_dbg(2, rkcif_debug, &stream->cifdev->v4l2_dev,
68777326 "stream[%d] vb done, index: %d, sequence %d\n", stream->id,
68787327 vb_done->vb2_buf.index, vb_done->sequence);
7328
+ atomic_dec(&stream->buf_cnt);
68797329 }
68807330
68817331 static void rkcif_tasklet_handle(unsigned long data)
....@@ -8147,7 +8597,11 @@
81478597
81488598 if (active_buf) {
81498599 vb_done = &active_buf->vb;
8150
- vb_done->vb2_buf.timestamp = stream->readout.fs_timestamp;
8600
+ if (cif_dev->chip_id < CHIP_RK3588_CIF &&
8601
+ cif_dev->active_sensor->mbus.type == V4L2_MBUS_BT656)
8602
+ vb_done->vb2_buf.timestamp = stream->readout.fe_timestamp;
8603
+ else
8604
+ vb_done->vb2_buf.timestamp = stream->readout.fs_timestamp;
81518605 vb_done->sequence = stream->frame_idx - 1;
81528606 active_buf->fe_timestamp = ktime_get_ns();
81538607 if (stream->is_line_wake_up) {
....@@ -8308,8 +8762,10 @@
83088762 spin_lock_irqsave(&priv->cif_dev->buffree_lock, flags);
83098763 for (i = 0; i < priv->buf_num; i++) {
83108764 rx_buf = &stream->rx_buf[i];
8311
- if (rx_buf && (!rx_buf->dummy.is_free) && rx_buf != buf)
8765
+ if (rx_buf && (!rx_buf->dummy.is_free) && rx_buf != buf) {
83128766 list_add_tail(&rx_buf->list_free, &priv->buf_free_list);
8767
+ stream->total_buf_num--;
8768
+ }
83138769 }
83148770 spin_unlock_irqrestore(&priv->cif_dev->buffree_lock, flags);
83158771 schedule_work(&priv->buffree_work.work);
....@@ -8379,11 +8835,13 @@
83798835 active_buf->dbufs.timestamp = stream->readout.fs_timestamp;
83808836 active_buf->fe_timestamp = ktime_get_ns();
83818837 stream->last_frame_idx = stream->frame_idx;
8382
- if (stream->cifdev->hdr.hdr_mode == NO_HDR)
8838
+ if (stream->cifdev->hdr.hdr_mode == NO_HDR) {
83838839 rkcif_s_rx_buffer(stream->cifdev, &active_buf->dbufs);
8384
- else
8840
+ if (stream->cifdev->is_support_tools && stream->tools_vdev)
8841
+ rkcif_rdbk_with_tools(stream, active_buf);
8842
+ } else {
83858843 rkcif_rdbk_frame_end_toisp(stream, active_buf);
8386
- stream->buf_num_toisp--;
8844
+ }
83878845 }
83888846 }
83898847 }
....@@ -8455,8 +8913,8 @@
84558913
84568914 if (!stream->is_line_wake_up) {
84578915 ret = rkcif_assign_new_buffer_pingpong(stream,
8458
- RKCIF_YUV_ADDR_STATE_UPDATE,
8459
- mipi_id);
8916
+ RKCIF_YUV_ADDR_STATE_UPDATE,
8917
+ mipi_id);
84608918 if (ret && cif_dev->chip_id < CHIP_RK3588_CIF)
84618919 return;
84628920 } else {
....@@ -8464,6 +8922,10 @@
84648922 if (ret && cif_dev->chip_id < CHIP_RK3588_CIF)
84658923 return;
84668924 }
8925
+ if (cif_dev->chip_id < CHIP_RK3588_CIF &&
8926
+ cif_dev->active_sensor->mbus.type == V4L2_MBUS_BT656 &&
8927
+ stream->id != 0)
8928
+ stream->frame_idx++;
84678929 if (!stream->is_line_wake_up && stream->dma_en & RKCIF_DMAEN_BY_VICAP)
84688930 rkcif_buf_done_prepare(stream, active_buf, mipi_id, 0);
84698931
....@@ -8590,6 +9052,7 @@
85909052 struct rkcif_sensor_info *terminal_sensor = &cif_dev->terminal_sensor;
85919053 struct rkcif_resume_info *resume_info = &cif_dev->reset_work.resume_info;
85929054 struct rkcif_timer *timer = &cif_dev->reset_watchdog_timer;
9055
+ struct sditf_priv *priv = cif_dev->sditf[0];
85939056 int i, j, ret = 0;
85949057 u32 on, sof_cnt;
85959058 int capture_mode = 0;
....@@ -8658,10 +9121,12 @@
86589121 __func__, on ? "on" : "off", p->subdevs[i]->name);
86599122 }
86609123
8661
- for (i = 0; i < cif_dev->sditf_cnt; i++) {
8662
- if (cif_dev->sditf[i] && cif_dev->sditf[i]->sensor_sd)
8663
- ret = v4l2_subdev_call(cif_dev->sditf[i]->sensor_sd, core, ioctl,
8664
- RKMODULE_SET_QUICK_STREAM, &on);
9124
+ if (priv && priv->is_combine_mode && cif_dev->sditf_cnt <= RKCIF_MAX_SDITF) {
9125
+ for (i = 0; i < cif_dev->sditf_cnt; i++) {
9126
+ if (cif_dev->sditf[i] && cif_dev->sditf[i]->sensor_sd)
9127
+ ret = v4l2_subdev_call(cif_dev->sditf[i]->sensor_sd, core, ioctl,
9128
+ RKMODULE_SET_QUICK_STREAM, &on);
9129
+ }
86659130 }
86669131
86679132 rockchip_clear_system_status(SYS_STATUS_CIF0);
....@@ -8756,10 +9221,12 @@
87569221 p->subdevs[i]->name);
87579222 }
87589223
8759
- for (i = 0; i < cif_dev->sditf_cnt; i++) {
8760
- if (cif_dev->sditf[i] && cif_dev->sditf[i]->sensor_sd)
8761
- v4l2_subdev_call(cif_dev->sditf[i]->sensor_sd, core, ioctl,
8762
- RKMODULE_SET_QUICK_STREAM, &on);
9224
+ if (priv && priv->is_combine_mode && cif_dev->sditf_cnt <= RKCIF_MAX_SDITF) {
9225
+ for (i = 0; i < cif_dev->sditf_cnt; i++) {
9226
+ if (cif_dev->sditf[i] && cif_dev->sditf[i]->sensor_sd)
9227
+ v4l2_subdev_call(cif_dev->sditf[i]->sensor_sd, core, ioctl,
9228
+ RKMODULE_SET_QUICK_STREAM, &on);
9229
+ }
87639230 }
87649231
87659232 if (cif_dev->chip_id < CHIP_RK3588_CIF)
....@@ -9437,6 +9904,11 @@
94379904 rkcif_write_register(cif_dev, CIF_REG_DVP_CTRL, val);
94389905 }
94399906 stream->to_stop_dma = 0;
9907
+ v4l2_dbg(4, rkcif_debug, &cif_dev->v4l2_dev,
9908
+ "stream[%d] replace_cnt %d, y_addr 0x%x, 0x%x\n",
9909
+ stream->id, stream->buf_replace_cnt,
9910
+ rkcif_read_register(cif_dev, get_reg_index_of_frm0_y_addr(stream->id)),
9911
+ rkcif_read_register(cif_dev, get_reg_index_of_frm1_y_addr(stream->id)));
94409912 return 0;
94419913 }
94429914
....@@ -9616,15 +10088,16 @@
961610088
961710089 sync_config = &hw->sync_config[cif_dev->sync_cfg.group];
961810090 sync_config->sync_code |= BIT(cif_dev->csi_host_idx);
9619
- if (sync_config->sync_code != sync_config->sync_mask)
9620
- return -EINVAL;
9621
-
962210091 v4l2_dbg(3, rkcif_debug, &cif_dev->v4l2_dev,
9623
- "sync code 0x%x, mask 0x%x, update 0x%x, cache 0x%x\n",
10092
+ "sync code 0x%x, mask 0x%x, update 0x%x, cache 0x%x, timestamp %llu\n",
962410093 sync_config->sync_code,
962510094 sync_config->sync_mask,
962610095 sync_config->update_code,
9627
- sync_config->update_cache);
10096
+ sync_config->update_cache,
10097
+ detect_stream->readout.fs_timestamp);
10098
+
10099
+ if (sync_config->sync_code != sync_config->sync_mask)
10100
+ return -EINVAL;
962810101
962910102 for (i = 0; i < sync_config->dev_cnt; i++) {
963010103 if (sync_config->mode == RKCIF_MASTER_MASTER) {
....@@ -9973,7 +10446,12 @@
997310446 stream->frame_idx - 1,
997410447 stream->frame_phase,
997510448 ktime_get_ns());
9976
-
10449
+ if (stream->is_finish_stop_dma && stream->is_wait_dma_stop) {
10450
+ stream->is_wait_dma_stop = false;
10451
+ wake_up(&stream->wq_stopped);
10452
+ stream->is_finish_stop_dma = false;
10453
+ continue;
10454
+ }
997710455 if (stream->crop_dyn_en)
997810456 rkcif_dynamic_crop(stream);
997910457
....@@ -9982,11 +10460,20 @@
998210460 is_update = true;
998310461 else
998410462 is_update = rkcif_check_buffer_prepare(stream);
10463
+ v4l2_dbg(4, rkcif_debug, &cif_dev->v4l2_dev,
10464
+ "dma capture by vicap, is_updata %d, group mode %d, dma_en %d\n",
10465
+ is_update, cif_dev->sync_cfg.type, stream->dma_en);
998510466 if (is_update)
998610467 rkcif_update_stream(cif_dev, stream, mipi_id);
998710468 } else if (stream->dma_en & RKCIF_DMAEN_BY_ISP) {
10469
+ v4l2_dbg(4, rkcif_debug, &cif_dev->v4l2_dev,
10470
+ "dma capture by isp, dma_en 0x%x\n",
10471
+ stream->dma_en);
998810472 rkcif_update_stream_toisp(cif_dev, stream, mipi_id);
998910473 } else if (stream->dma_en & RKCIF_DMAEN_BY_ROCKIT) {
10474
+ v4l2_dbg(4, rkcif_debug, &cif_dev->v4l2_dev,
10475
+ "dma capture by rockit, dma_en 0x%x\n",
10476
+ stream->dma_en);
999010477 rkcif_update_stream_rockit(cif_dev, stream, mipi_id);
999110478 }
999210479
....@@ -10003,11 +10490,10 @@
1000310490 }
1000410491
1000510492 spin_lock_irqsave(&stream->vbq_lock, flags);
10006
- if (stream->is_finish_stop_dma) {
10007
- wake_up(&stream->wq_stopped);
10008
- stream->is_finish_stop_dma = false;
10009
- }
1001010493 if (!(stream->dma_en & RKCIF_DMAEN_BY_ISP) && stream->lack_buf_cnt == 2) {
10494
+ v4l2_dbg(4, rkcif_debug, &cif_dev->v4l2_dev,
10495
+ "stream[%d] to stop dma, lack_buf_cnt %d\n",
10496
+ stream->id, stream->lack_buf_cnt);
1001110497 stream->to_stop_dma = RKCIF_DMAEN_BY_VICAP;
1001210498 rkcif_stop_dma_capture(stream);
1001310499 }