4040#include <media/v4l2-ioctl.h>
4141#include <media/v4l2-subdev.h>
4242#include <media/videobuf2-dma-contig.h>
43+ #include <linux/dma-iommu.h>
4344#include "dev.h"
4445#include "regs.h"
4546
@@ -759,7 +760,7 @@ static int mp_config_mi(struct rkisp1_stream *stream)
759760 mi_set_cb_size (stream , stream -> out_fmt .plane_fmt [1 ].sizeimage );
760761 mi_set_cr_size (stream , stream -> out_fmt .plane_fmt [2 ].sizeimage );
761762
762- mp_frame_end_int_enable ( base );
763+ mi_frame_end_int_enable ( stream );
763764 if (stream -> out_isp_fmt .uv_swap )
764765 mp_set_uv_swap (base );
765766
@@ -800,7 +801,7 @@ static int sp_config_mi(struct rkisp1_stream *stream)
800801 sp_set_y_height (base , stream -> out_fmt .height );
801802 sp_set_y_line_length (base , stream -> u .sp .y_stride );
802803
803- sp_frame_end_int_enable ( base );
804+ mi_frame_end_int_enable ( stream );
804805 if (output_isp_fmt -> uv_swap )
805806 sp_set_uv_swap (base );
806807
@@ -876,21 +877,17 @@ static void update_mi(struct rkisp1_stream *stream)
876877
877878static void mp_stop_mi (struct rkisp1_stream * stream )
878879{
879- void __iomem * base = stream -> ispdev -> base_addr ;
880-
881- if (stream -> state != RKISP1_STATE_STREAMING )
880+ if (!stream -> streaming )
882881 return ;
883- stream -> ops -> clr_frame_end_int ( base );
882+ mi_frame_end_int_clear ( stream );
884883 stream -> ops -> disable_mi (stream );
885884}
886885
887886static void sp_stop_mi (struct rkisp1_stream * stream )
888887{
889- void __iomem * base = stream -> ispdev -> base_addr ;
890-
891- if (stream -> state != RKISP1_STATE_STREAMING )
888+ if (!stream -> streaming )
892889 return ;
893- stream -> ops -> clr_frame_end_int ( base );
890+ mi_frame_end_int_clear ( stream );
894891 stream -> ops -> disable_mi (stream );
895892}
896893
@@ -900,8 +897,6 @@ static struct streams_ops rkisp1_mp_streams_ops = {
900897 .disable_mi = mp_disable_mi ,
901898 .stop_mi = mp_stop_mi ,
902899 .set_data_path = mp_set_data_path ,
903- .clr_frame_end_int = mp_clr_frame_end_int ,
904- .is_frame_end_int_masked = mp_is_frame_end_int_masked ,
905900 .is_stream_stopped = mp_is_stream_stopped ,
906901};
907902
@@ -911,8 +906,6 @@ static struct streams_ops rkisp1_sp_streams_ops = {
911906 .disable_mi = sp_disable_mi ,
912907 .stop_mi = sp_stop_mi ,
913908 .set_data_path = sp_set_data_path ,
914- .clr_frame_end_int = sp_clr_frame_end_int ,
915- .is_frame_end_int_masked = sp_is_frame_end_int_masked ,
916909 .is_stream_stopped = sp_is_stream_stopped ,
917910};
918911
@@ -980,13 +973,13 @@ static void rkisp1_stream_stop(struct rkisp1_stream *stream)
980973
981974 stream -> stopping = true;
982975 ret = wait_event_timeout (stream -> done ,
983- stream -> state != RKISP1_STATE_STREAMING ,
976+ ! stream -> streaming ,
984977 msecs_to_jiffies (1000 ));
985978 if (!ret ) {
986979 v4l2_warn (v4l2_dev , "waiting on event return error %d\n" , ret );
987980 stream -> ops -> stop_mi (stream );
988981 stream -> stopping = false;
989- stream -> state = RKISP1_STATE_READY ;
982+ stream -> streaming = false ;
990983 }
991984 disable_dcrop (stream , true);
992985 disable_rsz (stream , true);
@@ -1022,11 +1015,11 @@ static int rkisp1_start(struct rkisp1_stream *stream)
10221015 * also required because the sencond FE maybe corrupt especially
10231016 * when run at 120fps.
10241017 */
1025- if (other -> state != RKISP1_STATE_STREAMING ) {
1018+ if (! other -> streaming ) {
10261019 force_cfg_update (base );
10271020 mi_frame_end (stream );
10281021 }
1029- stream -> state = RKISP1_STATE_STREAMING ;
1022+ stream -> streaming = true ;
10301023
10311024 return 0 ;
10321025}
@@ -1100,7 +1093,7 @@ static void rkisp1_buf_queue(struct vb2_buffer *vb)
11001093 spin_lock_irqsave (& stream -> vbq_lock , lock_flags );
11011094
11021095 /* XXX: replace dummy to speed up */
1103- if (stream -> state == RKISP1_STATE_STREAMING &&
1096+ if (stream -> streaming &&
11041097 stream -> next_buf == NULL &&
11051098 atomic_read (& stream -> ispdev -> isp_sdev .frm_sync_seq ) == 0 ) {
11061099 stream -> next_buf = ispbuf ;
@@ -1193,7 +1186,7 @@ static int rkisp1_stream_start(struct rkisp1_stream *stream)
11931186 bool async = false;
11941187 int ret ;
11951188
1196- if (other -> state == RKISP1_STATE_STREAMING )
1189+ if (other -> streaming )
11971190 async = true;
11981191
11991192 ret = rkisp1_config_rsz (stream , async );
@@ -1224,7 +1217,7 @@ rkisp1_start_streaming(struct vb2_queue *queue, unsigned int count)
12241217 struct v4l2_device * v4l2_dev = & dev -> v4l2_dev ;
12251218 int ret ;
12261219
1227- if (WARN_ON (stream -> state != RKISP1_STATE_READY ))
1220+ if (WARN_ON (stream -> streaming ))
12281221 return - EBUSY ;
12291222
12301223 ret = rkisp1_create_dummy_buf (stream );
@@ -1331,7 +1324,7 @@ static void rkisp1_set_fmt(struct rkisp1_stream *stream,
13311324 if (!pixm -> quantization )
13321325 pixm -> quantization = V4L2_QUANTIZATION_FULL_RANGE ;
13331326 /* can not change quantization when stream-on */
1334- if (other_stream -> state == RKISP1_STATE_STREAMING )
1327+ if (other_stream -> streaming )
13351328 pixm -> quantization = other_stream -> out_fmt .quantization ;
13361329
13371330 /* calculate size */
@@ -1387,6 +1380,64 @@ static void rkisp1_set_fmt(struct rkisp1_stream *stream,
13871380 }
13881381}
13891382
1383+ static int rkisp1_dma_attach_device (struct rkisp1_device * rkisp1_dev )
1384+ {
1385+ struct iommu_domain * domain = rkisp1_dev -> domain ;
1386+ struct device * dev = rkisp1_dev -> dev ;
1387+ int ret ;
1388+
1389+ ret = iommu_attach_device (domain , dev );
1390+ if (ret ) {
1391+ dev_err (dev , "Failed to attach iommu device\n" );
1392+ return ret ;
1393+ }
1394+
1395+ if (!common_iommu_setup_dma_ops (dev , 0x10000000 , SZ_2G , domain -> ops )) {
1396+ dev_err (dev , "Failed to set dma_ops\n" );
1397+ iommu_detach_device (domain , dev );
1398+ ret = - ENODEV ;
1399+ }
1400+
1401+ return ret ;
1402+ }
1403+
1404+ static void rkisp1_dma_detach_device (struct rkisp1_device * rkisp1_dev )
1405+ {
1406+ struct iommu_domain * domain = rkisp1_dev -> domain ;
1407+ struct device * dev = rkisp1_dev -> dev ;
1408+
1409+ iommu_detach_device (domain , dev );
1410+ }
1411+
1412+ static int rkisp1_fh_open (struct file * filp )
1413+ {
1414+ struct rkisp1_stream * stream = video_drvdata (filp );
1415+ struct rkisp1_device * dev = stream -> ispdev ;
1416+ int ret ;
1417+
1418+ ret = v4l2_fh_open (filp );
1419+ if (!ret ) {
1420+ if (atomic_inc_return (& dev -> open_cnt ) == 1 )
1421+ rkisp1_dma_attach_device (dev );
1422+ }
1423+
1424+ return ret ;
1425+ }
1426+
1427+ static int rkisp1_fop_release (struct file * file )
1428+ {
1429+ struct rkisp1_stream * stream = video_drvdata (file );
1430+ struct rkisp1_device * dev = stream -> ispdev ;
1431+ int ret ;
1432+
1433+ ret = vb2_fop_release (file );
1434+
1435+ if (atomic_dec_return (& dev -> open_cnt ) == 0 )
1436+ rkisp1_dma_detach_device (dev );
1437+
1438+ return ret ;
1439+ }
1440+
13901441/************************* v4l2_file_operations***************************/
13911442void rkisp1_stream_init (struct rkisp1_device * dev , u32 id )
13921443{
@@ -1408,7 +1459,7 @@ void rkisp1_stream_init(struct rkisp1_device *dev, u32 id)
14081459 stream -> config = & rkisp1_mp_stream_config ;
14091460 }
14101461
1411- stream -> state = RKISP1_STATE_READY ;
1462+ stream -> streaming = false ;
14121463
14131464 memset (& pixm , 0 , sizeof (pixm ));
14141465 pixm .pixelformat = V4L2_PIX_FMT_YUYV ;
@@ -1423,8 +1474,8 @@ void rkisp1_stream_init(struct rkisp1_device *dev, u32 id)
14231474}
14241475
14251476static const struct v4l2_file_operations rkisp1_fops = {
1426- .open = v4l2_fh_open ,
1427- .release = vb2_fop_release ,
1477+ .open = rkisp1_fh_open ,
1478+ .release = rkisp1_fop_release ,
14281479 .unlocked_ioctl = video_ioctl2 ,
14291480 .poll = vb2_fop_poll ,
14301481 .mmap = vb2_fop_mmap ,
@@ -1705,33 +1756,36 @@ int rkisp1_register_stream_vdevs(struct rkisp1_device *dev)
17051756
17061757/**************** Interrupter Handler ****************/
17071758
1708- void rkisp1_mi_isr (struct rkisp1_stream * stream )
1759+ void rkisp1_mi_isr (u32 mis_val , struct rkisp1_device * dev )
17091760{
1710- struct rkisp1_device * dev = stream -> ispdev ;
1711- void __iomem * base = stream -> ispdev -> base_addr ;
1712- u32 val ;
1713-
1714- stream -> ops -> clr_frame_end_int (base );
1715- if (stream -> ops -> is_frame_end_int_masked (base )) {
1716- val = mi_get_masked_int_status (base );
1717- v4l2_err (& dev -> v4l2_dev , "icr err: 0x%x\n" , val );
1718- }
1761+ int i ;
17191762
1720- if (stream -> stopping ) {
1721- /* Make sure stream is actually stopped, whose state
1722- * can be read from the shadow register, before wake_up()
1723- * thread which would immediately free all frame buffers.
1724- * stop_mi() takes effect at the next frame end
1725- * that sync the configurations to shadow regs.
1726- */
1727- if (stream -> ops -> is_stream_stopped (dev -> base_addr )) {
1728- stream -> stopping = false;
1729- stream -> state = RKISP1_STATE_READY ;
1730- wake_up (& stream -> done );
1763+ for (i = 0 ; i < ARRAY_SIZE (dev -> stream ); ++ i ) {
1764+ struct rkisp1_stream * stream = & dev -> stream [i ];
1765+
1766+ if (!(mis_val & CIF_MI_FRAME (stream )))
1767+ continue ;
1768+
1769+ mi_frame_end_int_clear (stream );
1770+
1771+ if (stream -> stopping ) {
1772+ /*
1773+ * Make sure stream is actually stopped, whose state
1774+ * can be read from the shadow register, before
1775+ * wake_up() thread which would immediately free all
1776+ * frame buffers. stop_mi() takes effect at the next
1777+ * frame end that sync the configurations to shadow
1778+ * regs.
1779+ */
1780+ if (stream -> ops -> is_stream_stopped (dev -> base_addr )) {
1781+ stream -> stopping = false;
1782+ stream -> streaming = false;
1783+ wake_up (& stream -> done );
1784+ } else {
1785+ stream -> ops -> stop_mi (stream );
1786+ }
17311787 } else {
1732- stream -> ops -> stop_mi (stream );
1788+ mi_frame_end (stream );
17331789 }
1734- } else {
1735- mi_frame_end (stream );
17361790 }
17371791}
0 commit comments