26
26
27
27
static int mi_frame_end (struct rkisp_stream * stream );
28
28
static int mi_frame_start (struct rkisp_stream * stream , u32 mis );
29
+ static int rkisp_create_dummy_buf (struct rkisp_stream * stream );
29
30
30
31
static const struct capture_fmt bp_fmts [] = {
31
32
{
@@ -781,6 +782,7 @@ static void update_mi(struct rkisp_stream *stream)
781
782
stream -> next_buf = NULL ;
782
783
}
783
784
} else if (dummy_buf -> mem_priv ) {
785
+ /* wrap buf ENC */
784
786
val = dummy_buf -> dma_addr ;
785
787
reg = stream -> config -> mi .y_base_ad_init ;
786
788
rkisp_write (dev , reg , val , false);
@@ -791,6 +793,22 @@ static void update_mi(struct rkisp_stream *stream)
791
793
reg = stream -> config -> mi .cr_base_ad_init ;
792
794
rkisp_write (dev , reg , val , false);
793
795
}
796
+ } else if (stream -> is_using_resmem ) {
797
+ /* resmem for fast stream NV12 output */
798
+ dma_addr_t max_addr = dev -> resmem_addr + dev -> resmem_size ;
799
+ u32 bytesperline = stream -> out_fmt .plane_fmt [0 ].bytesperline ;
800
+ u32 buf_size = bytesperline * ALIGN (stream -> out_fmt .height , 16 ) * 3 / 2 ;
801
+
802
+ reg = stream -> config -> mi .y_base_ad_init ;
803
+ val = dev -> resmem_addr_curr ;
804
+ rkisp_write (dev , reg , val , false);
805
+
806
+ reg = stream -> config -> mi .cb_base_ad_init ;
807
+ val += bytesperline * stream -> out_fmt .height ;
808
+ rkisp_write (dev , reg , val , false);
809
+
810
+ if (dev -> resmem_addr_curr + buf_size * 2 <= max_addr )
811
+ dev -> resmem_addr_curr += buf_size ;
794
812
} else if (!stream -> is_pause ) {
795
813
stream -> is_pause = true;
796
814
stream -> ops -> disable_mi (stream );
@@ -933,6 +951,29 @@ static int luma_frame_end(struct rkisp_stream *stream)
933
951
return 0 ;
934
952
}
935
953
954
+ static int mp_set_wrap (struct rkisp_stream * stream , int line )
955
+ {
956
+ struct rkisp_device * dev = stream -> ispdev ;
957
+ int ret = 0 ;
958
+
959
+ dev -> cap_dev .wrap_line = line ;
960
+ if (stream -> is_pre_on &&
961
+ stream -> streaming &&
962
+ !stream -> dummy_buf .mem_priv ) {
963
+ ret = rkisp_create_dummy_buf (stream );
964
+ if (ret )
965
+ return ret ;
966
+ stream -> ops -> config_mi (stream );
967
+ if (stream -> is_pause ) {
968
+ stream -> ops -> enable_mi (stream );
969
+ if (!ISP3X_ISP_OUT_LINE (rkisp_read (dev , ISP3X_ISP_DEBUG2 , true)))
970
+ stream_self_update (stream );
971
+ stream -> is_pause = false;
972
+ }
973
+ }
974
+ return ret ;
975
+ }
976
+
936
977
static struct streams_ops rkisp_mp_streams_ops = {
937
978
.config_mi = mp_config_mi ,
938
979
.enable_mi = mp_enable_mi ,
@@ -942,6 +983,7 @@ static struct streams_ops rkisp_mp_streams_ops = {
942
983
.update_mi = update_mi ,
943
984
.frame_end = mi_frame_end ,
944
985
.frame_start = mi_frame_start ,
986
+ .set_wrap = mp_set_wrap ,
945
987
};
946
988
947
989
static struct streams_ops rkisp_sp_streams_ops = {
@@ -1258,7 +1300,7 @@ static int rkisp_create_dummy_buf(struct rkisp_stream *stream)
1258
1300
buf -> size = dev -> isp_sdev .in_crop .width * dev -> cap_dev .wrap_line * 2 ;
1259
1301
if (stream -> out_isp_fmt .output_format == ISP32_MI_OUTPUT_YUV420 )
1260
1302
buf -> size = buf -> size - buf -> size / 4 ;
1261
-
1303
+ buf -> size = stream -> out_fmt . plane_fmt [ 0 ]. sizeimage ;
1262
1304
buf -> is_need_dbuf = true;
1263
1305
ret = rkisp_alloc_buffer (stream -> ispdev , buf );
1264
1306
if (ret == 0 ) {
@@ -1354,6 +1396,11 @@ static void rkisp_stop_streaming(struct vb2_queue *queue)
1354
1396
1355
1397
end :
1356
1398
mutex_unlock (& dev -> hw_dev -> dev_lock );
1399
+
1400
+ if (stream -> is_pre_on ) {
1401
+ stream -> is_pre_on = false;
1402
+ v4l2_pipeline_pm_put (& stream -> vnode .vdev .entity );
1403
+ }
1357
1404
}
1358
1405
1359
1406
static int rkisp_stream_start (struct rkisp_stream * stream )
@@ -1406,7 +1453,10 @@ rkisp_start_streaming(struct vb2_queue *queue, unsigned int count)
1406
1453
1407
1454
if (WARN_ON (stream -> streaming )) {
1408
1455
mutex_unlock (& dev -> hw_dev -> dev_lock );
1409
- return - EBUSY ;
1456
+ if (stream -> is_pre_on )
1457
+ return 0 ;
1458
+ else
1459
+ return - EBUSY ;
1410
1460
}
1411
1461
1412
1462
memset (& stream -> dbg , 0 , sizeof (stream -> dbg ));
0 commit comments