@@ -100,7 +100,8 @@ static int sun6i_video_queue_setup(struct vb2_queue *queue,
100
100
unsigned int sizes [],
101
101
struct device * alloc_devs [])
102
102
{
103
- struct sun6i_video * video = vb2_get_drv_priv (queue );
103
+ struct sun6i_csi_device * csi_dev = vb2_get_drv_priv (queue );
104
+ struct sun6i_video * video = & csi_dev -> video ;
104
105
unsigned int size = video -> format .fmt .pix .sizeimage ;
105
106
106
107
if (* planes_count )
@@ -114,8 +115,8 @@ static int sun6i_video_queue_setup(struct vb2_queue *queue,
114
115
115
116
static int sun6i_video_buffer_prepare (struct vb2_buffer * buffer )
116
117
{
117
- struct sun6i_video * video = vb2_get_drv_priv (buffer -> vb2_queue );
118
- struct sun6i_csi_device * csi_dev = video -> csi_dev ;
118
+ struct sun6i_csi_device * csi_dev = vb2_get_drv_priv (buffer -> vb2_queue );
119
+ struct sun6i_video * video = & csi_dev -> video ;
119
120
struct v4l2_device * v4l2_dev = & csi_dev -> v4l2 .v4l2_dev ;
120
121
struct vb2_v4l2_buffer * v4l2_buffer = to_vb2_v4l2_buffer (buffer );
121
122
struct sun6i_csi_buffer * csi_buffer =
@@ -138,7 +139,8 @@ static int sun6i_video_buffer_prepare(struct vb2_buffer *buffer)
138
139
139
140
static void sun6i_video_buffer_queue (struct vb2_buffer * buffer )
140
141
{
141
- struct sun6i_video * video = vb2_get_drv_priv (buffer -> vb2_queue );
142
+ struct sun6i_csi_device * csi_dev = vb2_get_drv_priv (buffer -> vb2_queue );
143
+ struct sun6i_video * video = & csi_dev -> video ;
142
144
struct vb2_v4l2_buffer * v4l2_buffer = to_vb2_v4l2_buffer (buffer );
143
145
struct sun6i_csi_buffer * csi_buffer =
144
146
container_of (v4l2_buffer , struct sun6i_csi_buffer , v4l2_buffer );
@@ -153,7 +155,8 @@ static void sun6i_video_buffer_queue(struct vb2_buffer *buffer)
153
155
static int sun6i_video_start_streaming (struct vb2_queue * queue ,
154
156
unsigned int count )
155
157
{
156
- struct sun6i_video * video = vb2_get_drv_priv (queue );
158
+ struct sun6i_csi_device * csi_dev = vb2_get_drv_priv (queue );
159
+ struct sun6i_video * video = & csi_dev -> video ;
157
160
struct video_device * video_dev = & video -> video_dev ;
158
161
struct sun6i_csi_buffer * buf ;
159
162
struct sun6i_csi_buffer * next_buf ;
@@ -185,7 +188,7 @@ static int sun6i_video_start_streaming(struct vb2_queue *queue,
185
188
config .width = video -> format .fmt .pix .width ;
186
189
config .height = video -> format .fmt .pix .height ;
187
190
188
- ret = sun6i_csi_update_config (video -> csi_dev , & config );
191
+ ret = sun6i_csi_update_config (csi_dev , & config );
189
192
if (ret < 0 )
190
193
goto error_media_pipeline ;
191
194
@@ -194,9 +197,9 @@ static int sun6i_video_start_streaming(struct vb2_queue *queue,
194
197
buf = list_first_entry (& video -> dma_queue ,
195
198
struct sun6i_csi_buffer , list );
196
199
buf -> queued_to_csi = true;
197
- sun6i_csi_update_buf_addr (video -> csi_dev , buf -> dma_addr );
200
+ sun6i_csi_update_buf_addr (csi_dev , buf -> dma_addr );
198
201
199
- sun6i_csi_set_stream (video -> csi_dev , true);
202
+ sun6i_csi_set_stream (csi_dev , true);
200
203
201
204
/*
202
205
* CSI will lookup the next dma buffer for next frame before the
@@ -217,7 +220,7 @@ static int sun6i_video_start_streaming(struct vb2_queue *queue,
217
220
*/
218
221
next_buf = list_next_entry (buf , list );
219
222
next_buf -> queued_to_csi = true;
220
- sun6i_csi_update_buf_addr (video -> csi_dev , next_buf -> dma_addr );
223
+ sun6i_csi_update_buf_addr (csi_dev , next_buf -> dma_addr );
221
224
222
225
spin_unlock_irqrestore (& video -> dma_queue_lock , flags );
223
226
@@ -228,7 +231,7 @@ static int sun6i_video_start_streaming(struct vb2_queue *queue,
228
231
return 0 ;
229
232
230
233
error_stream :
231
- sun6i_csi_set_stream (video -> csi_dev , false);
234
+ sun6i_csi_set_stream (csi_dev , false);
232
235
233
236
error_media_pipeline :
234
237
video_device_pipeline_stop (video_dev );
@@ -246,7 +249,8 @@ static int sun6i_video_start_streaming(struct vb2_queue *queue,
246
249
247
250
static void sun6i_video_stop_streaming (struct vb2_queue * queue )
248
251
{
249
- struct sun6i_video * video = vb2_get_drv_priv (queue );
252
+ struct sun6i_csi_device * csi_dev = vb2_get_drv_priv (queue );
253
+ struct sun6i_video * video = & csi_dev -> video ;
250
254
struct v4l2_subdev * subdev ;
251
255
unsigned long flags ;
252
256
struct sun6i_csi_buffer * buf ;
@@ -255,7 +259,7 @@ static void sun6i_video_stop_streaming(struct vb2_queue *queue)
255
259
if (subdev )
256
260
v4l2_subdev_call (subdev , video , s_stream , 0 );
257
261
258
- sun6i_csi_set_stream (video -> csi_dev , false);
262
+ sun6i_csi_set_stream (csi_dev , false);
259
263
260
264
video_device_pipeline_stop (& video -> video_dev );
261
265
@@ -267,8 +271,9 @@ static void sun6i_video_stop_streaming(struct vb2_queue *queue)
267
271
spin_unlock_irqrestore (& video -> dma_queue_lock , flags );
268
272
}
269
273
270
- void sun6i_video_frame_done (struct sun6i_video * video )
274
+ void sun6i_video_frame_done (struct sun6i_csi_device * csi_dev )
271
275
{
276
+ struct sun6i_video * video = & csi_dev -> video ;
272
277
struct sun6i_csi_buffer * buf ;
273
278
struct sun6i_csi_buffer * next_buf ;
274
279
struct vb2_v4l2_buffer * v4l2_buffer ;
@@ -278,7 +283,7 @@ void sun6i_video_frame_done(struct sun6i_video *video)
278
283
buf = list_first_entry (& video -> dma_queue ,
279
284
struct sun6i_csi_buffer , list );
280
285
if (list_is_last (& buf -> list , & video -> dma_queue )) {
281
- dev_dbg (video -> csi_dev -> dev , "Frame dropped!\n" );
286
+ dev_dbg (csi_dev -> dev , "Frame dropped!\n" );
282
287
goto complete ;
283
288
}
284
289
@@ -290,8 +295,8 @@ void sun6i_video_frame_done(struct sun6i_video *video)
290
295
*/
291
296
if (!next_buf -> queued_to_csi ) {
292
297
next_buf -> queued_to_csi = true;
293
- sun6i_csi_update_buf_addr (video -> csi_dev , next_buf -> dma_addr );
294
- dev_dbg (video -> csi_dev -> dev , "Frame dropped!\n" );
298
+ sun6i_csi_update_buf_addr (csi_dev , next_buf -> dma_addr );
299
+ dev_dbg (csi_dev -> dev , "Frame dropped!\n" );
295
300
goto complete ;
296
301
}
297
302
@@ -305,9 +310,9 @@ void sun6i_video_frame_done(struct sun6i_video *video)
305
310
if (!list_is_last (& next_buf -> list , & video -> dma_queue )) {
306
311
next_buf = list_next_entry (next_buf , list );
307
312
next_buf -> queued_to_csi = true;
308
- sun6i_csi_update_buf_addr (video -> csi_dev , next_buf -> dma_addr );
313
+ sun6i_csi_update_buf_addr (csi_dev , next_buf -> dma_addr );
309
314
} else {
310
- dev_dbg (video -> csi_dev -> dev , "Next frame will be dropped!\n" );
315
+ dev_dbg (csi_dev -> dev , "Next frame will be dropped!\n" );
311
316
}
312
317
313
318
complete :
@@ -330,9 +335,8 @@ static const struct vb2_ops sun6i_video_queue_ops = {
330
335
static int sun6i_video_querycap (struct file * file , void * private ,
331
336
struct v4l2_capability * capability )
332
337
{
333
- struct sun6i_video * video = video_drvdata (file );
334
- struct sun6i_csi_device * csi_dev = video -> csi_dev ;
335
- struct video_device * video_dev = & video -> video_dev ;
338
+ struct sun6i_csi_device * csi_dev = video_drvdata (file );
339
+ struct video_device * video_dev = & csi_dev -> video .video_dev ;
336
340
337
341
strscpy (capability -> driver , SUN6I_CSI_NAME , sizeof (capability -> driver ));
338
342
strscpy (capability -> card , video_dev -> name , sizeof (capability -> card ));
@@ -358,7 +362,8 @@ static int sun6i_video_enum_fmt(struct file *file, void *private,
358
362
static int sun6i_video_g_fmt (struct file * file , void * private ,
359
363
struct v4l2_format * format )
360
364
{
361
- struct sun6i_video * video = video_drvdata (file );
365
+ struct sun6i_csi_device * csi_dev = video_drvdata (file );
366
+ struct sun6i_video * video = & csi_dev -> video ;
362
367
363
368
* format = video -> format ;
364
369
@@ -413,7 +418,8 @@ static int sun6i_video_format_set(struct sun6i_video *video,
413
418
static int sun6i_video_s_fmt (struct file * file , void * private ,
414
419
struct v4l2_format * format )
415
420
{
416
- struct sun6i_video * video = video_drvdata (file );
421
+ struct sun6i_csi_device * csi_dev = video_drvdata (file );
422
+ struct sun6i_video * video = & csi_dev -> video ;
417
423
418
424
if (vb2_is_busy (& video -> queue ))
419
425
return - EBUSY ;
@@ -424,7 +430,8 @@ static int sun6i_video_s_fmt(struct file *file, void *private,
424
430
static int sun6i_video_try_fmt (struct file * file , void * private ,
425
431
struct v4l2_format * format )
426
432
{
427
- struct sun6i_video * video = video_drvdata (file );
433
+ struct sun6i_csi_device * csi_dev = video_drvdata (file );
434
+ struct sun6i_video * video = & csi_dev -> video ;
428
435
429
436
return sun6i_video_format_try (video , format );
430
437
}
@@ -489,7 +496,8 @@ static const struct v4l2_ioctl_ops sun6i_video_ioctl_ops = {
489
496
490
497
static int sun6i_video_open (struct file * file )
491
498
{
492
- struct sun6i_video * video = video_drvdata (file );
499
+ struct sun6i_csi_device * csi_dev = video_drvdata (file );
500
+ struct sun6i_video * video = & csi_dev -> video ;
493
501
int ret = 0 ;
494
502
495
503
if (mutex_lock_interruptible (& video -> lock ))
@@ -505,7 +513,7 @@ static int sun6i_video_open(struct file *file)
505
513
506
514
/* Power on at first open. */
507
515
if (v4l2_fh_is_singular_file (file )) {
508
- ret = sun6i_csi_set_power (video -> csi_dev , true);
516
+ ret = sun6i_csi_set_power (csi_dev , true);
509
517
if (ret < 0 )
510
518
goto error_v4l2_fh ;
511
519
}
@@ -525,7 +533,8 @@ static int sun6i_video_open(struct file *file)
525
533
526
534
static int sun6i_video_close (struct file * file )
527
535
{
528
- struct sun6i_video * video = video_drvdata (file );
536
+ struct sun6i_csi_device * csi_dev = video_drvdata (file );
537
+ struct sun6i_video * video = & csi_dev -> video ;
529
538
bool last_close ;
530
539
531
540
mutex_lock (& video -> lock );
@@ -537,7 +546,7 @@ static int sun6i_video_close(struct file *file)
537
546
538
547
/* Power off at last close. */
539
548
if (last_close )
540
- sun6i_csi_set_power (video -> csi_dev , false);
549
+ sun6i_csi_set_power (csi_dev , false);
541
550
542
551
mutex_unlock (& video -> lock );
543
552
@@ -574,26 +583,27 @@ static int sun6i_video_link_validate(struct media_link *link)
574
583
{
575
584
struct video_device * vdev = container_of (link -> sink -> entity ,
576
585
struct video_device , entity );
577
- struct sun6i_video * video = video_get_drvdata (vdev );
586
+ struct sun6i_csi_device * csi_dev = video_get_drvdata (vdev );
587
+ struct sun6i_video * video = & csi_dev -> video ;
578
588
struct v4l2_subdev_format source_fmt ;
579
589
int ret ;
580
590
581
591
video -> mbus_code = 0 ;
582
592
583
593
if (!media_pad_remote_pad_first (link -> sink -> entity -> pads )) {
584
- dev_info (video -> csi_dev -> dev ,
585
- "video node %s pad not connected\n" , vdev -> name );
594
+ dev_info (csi_dev -> dev , "video node %s pad not connected\n" ,
595
+ vdev -> name );
586
596
return - ENOLINK ;
587
597
}
588
598
589
599
ret = sun6i_video_link_validate_get_format (link -> source , & source_fmt );
590
600
if (ret < 0 )
591
601
return ret ;
592
602
593
- if (!sun6i_csi_is_format_supported (video -> csi_dev ,
603
+ if (!sun6i_csi_is_format_supported (csi_dev ,
594
604
video -> format .fmt .pix .pixelformat ,
595
605
source_fmt .format .code )) {
596
- dev_err (video -> csi_dev -> dev ,
606
+ dev_err (csi_dev -> dev ,
597
607
"Unsupported pixformat: 0x%x with mbus code: 0x%x!\n" ,
598
608
video -> format .fmt .pix .pixelformat ,
599
609
source_fmt .format .code );
@@ -602,7 +612,7 @@ static int sun6i_video_link_validate(struct media_link *link)
602
612
603
613
if (source_fmt .format .width != video -> format .fmt .pix .width ||
604
614
source_fmt .format .height != video -> format .fmt .pix .height ) {
605
- dev_err (video -> csi_dev -> dev ,
615
+ dev_err (csi_dev -> dev ,
606
616
"Wrong width or height %ux%u (%ux%u expected)\n" ,
607
617
video -> format .fmt .pix .width , video -> format .fmt .pix .height ,
608
618
source_fmt .format .width , source_fmt .format .height );
@@ -620,9 +630,9 @@ static const struct media_entity_operations sun6i_video_media_ops = {
620
630
621
631
/* Video */
622
632
623
- int sun6i_video_setup (struct sun6i_video * video ,
624
- struct sun6i_csi_device * csi_dev )
633
+ int sun6i_video_setup (struct sun6i_csi_device * csi_dev )
625
634
{
635
+ struct sun6i_video * video = & csi_dev -> video ;
626
636
struct v4l2_device * v4l2_dev = & csi_dev -> v4l2 .v4l2_dev ;
627
637
struct video_device * video_dev = & video -> video_dev ;
628
638
struct vb2_queue * queue = & video -> queue ;
@@ -631,8 +641,6 @@ int sun6i_video_setup(struct sun6i_video *video,
631
641
struct v4l2_pix_format * pix_format = & format .fmt .pix ;
632
642
int ret ;
633
643
634
- video -> csi_dev = csi_dev ;
635
-
636
644
/* Media Entity */
637
645
638
646
video_dev -> entity .ops = & sun6i_video_media_ops ;
@@ -664,7 +672,7 @@ int sun6i_video_setup(struct sun6i_video *video,
664
672
queue -> timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC ;
665
673
queue -> lock = & video -> lock ;
666
674
queue -> dev = csi_dev -> dev ;
667
- queue -> drv_priv = video ;
675
+ queue -> drv_priv = csi_dev ;
668
676
669
677
/* Make sure non-dropped frame. */
670
678
queue -> min_buffers_needed = 3 ;
@@ -697,7 +705,7 @@ int sun6i_video_setup(struct sun6i_video *video,
697
705
video_dev -> queue = queue ;
698
706
video_dev -> lock = & video -> lock ;
699
707
700
- video_set_drvdata (video_dev , video );
708
+ video_set_drvdata (video_dev , csi_dev );
701
709
702
710
ret = video_register_device (video_dev , VFL_TYPE_VIDEO , -1 );
703
711
if (ret < 0 ) {
@@ -716,8 +724,9 @@ int sun6i_video_setup(struct sun6i_video *video,
716
724
return ret ;
717
725
}
718
726
719
- void sun6i_video_cleanup (struct sun6i_video * video )
727
+ void sun6i_video_cleanup (struct sun6i_csi_device * csi_dev )
720
728
{
729
+ struct sun6i_video * video = & csi_dev -> video ;
721
730
struct video_device * video_dev = & video -> video_dev ;
722
731
723
732
vb2_video_unregister_device (video_dev );
0 commit comments