@@ -197,7 +197,7 @@ static int v4l2_flash_s_ctrl(struct v4l2_ctrl *c)
197
197
{
198
198
struct v4l2_flash * v4l2_flash = v4l2_ctrl_to_v4l2_flash (c );
199
199
struct led_classdev_flash * fled_cdev = v4l2_flash -> fled_cdev ;
200
- struct led_classdev * led_cdev = & fled_cdev -> led_cdev ;
200
+ struct led_classdev * led_cdev = fled_cdev ? & fled_cdev -> led_cdev : NULL ;
201
201
struct v4l2_ctrl * * ctrls = v4l2_flash -> ctrls ;
202
202
bool external_strobe ;
203
203
int ret = 0 ;
@@ -299,10 +299,26 @@ static void __fill_ctrl_init_data(struct v4l2_flash *v4l2_flash,
299
299
struct v4l2_flash_ctrl_data * ctrl_init_data )
300
300
{
301
301
struct led_classdev_flash * fled_cdev = v4l2_flash -> fled_cdev ;
302
- struct led_classdev * led_cdev = & fled_cdev -> led_cdev ;
302
+ struct led_classdev * led_cdev = fled_cdev ? & fled_cdev -> led_cdev : NULL ;
303
303
struct v4l2_ctrl_config * ctrl_cfg ;
304
304
u32 mask ;
305
305
306
+ /* Init INDICATOR_INTENSITY ctrl data */
307
+ if (v4l2_flash -> iled_cdev ) {
308
+ ctrl_init_data [INDICATOR_INTENSITY ].cid =
309
+ V4L2_CID_FLASH_INDICATOR_INTENSITY ;
310
+ ctrl_cfg = & ctrl_init_data [INDICATOR_INTENSITY ].config ;
311
+ __lfs_to_v4l2_ctrl_config (& flash_cfg -> intensity ,
312
+ ctrl_cfg );
313
+ ctrl_cfg -> id = V4L2_CID_FLASH_INDICATOR_INTENSITY ;
314
+ ctrl_cfg -> min = 0 ;
315
+ ctrl_cfg -> flags = V4L2_CTRL_FLAG_VOLATILE |
316
+ V4L2_CTRL_FLAG_EXECUTE_ON_WRITE ;
317
+ }
318
+
319
+ if (!led_cdev || WARN_ON (!(led_cdev -> flags & LED_DEV_CAP_FLASH )))
320
+ return ;
321
+
306
322
/* Init FLASH_FAULT ctrl data */
307
323
if (flash_cfg -> flash_faults ) {
308
324
ctrl_init_data [FLASH_FAULT ].cid = V4L2_CID_FLASH_FAULT ;
@@ -330,27 +346,11 @@ static void __fill_ctrl_init_data(struct v4l2_flash *v4l2_flash,
330
346
/* Init TORCH_INTENSITY ctrl data */
331
347
ctrl_init_data [TORCH_INTENSITY ].cid = V4L2_CID_FLASH_TORCH_INTENSITY ;
332
348
ctrl_cfg = & ctrl_init_data [TORCH_INTENSITY ].config ;
333
- __lfs_to_v4l2_ctrl_config (& flash_cfg -> torch_intensity , ctrl_cfg );
349
+ __lfs_to_v4l2_ctrl_config (& flash_cfg -> intensity , ctrl_cfg );
334
350
ctrl_cfg -> id = V4L2_CID_FLASH_TORCH_INTENSITY ;
335
351
ctrl_cfg -> flags = V4L2_CTRL_FLAG_VOLATILE |
336
352
V4L2_CTRL_FLAG_EXECUTE_ON_WRITE ;
337
353
338
- /* Init INDICATOR_INTENSITY ctrl data */
339
- if (v4l2_flash -> iled_cdev ) {
340
- ctrl_init_data [INDICATOR_INTENSITY ].cid =
341
- V4L2_CID_FLASH_INDICATOR_INTENSITY ;
342
- ctrl_cfg = & ctrl_init_data [INDICATOR_INTENSITY ].config ;
343
- __lfs_to_v4l2_ctrl_config (& flash_cfg -> indicator_intensity ,
344
- ctrl_cfg );
345
- ctrl_cfg -> id = V4L2_CID_FLASH_INDICATOR_INTENSITY ;
346
- ctrl_cfg -> min = 0 ;
347
- ctrl_cfg -> flags = V4L2_CTRL_FLAG_VOLATILE |
348
- V4L2_CTRL_FLAG_EXECUTE_ON_WRITE ;
349
- }
350
-
351
- if (!(led_cdev -> flags & LED_DEV_CAP_FLASH ))
352
- return ;
353
-
354
354
/* Init FLASH_STROBE ctrl data */
355
355
ctrl_init_data [FLASH_STROBE ].cid = V4L2_CID_FLASH_STROBE ;
356
356
ctrl_cfg = & ctrl_init_data [FLASH_STROBE ].config ;
@@ -485,7 +485,9 @@ static int __sync_device_with_v4l2_controls(struct v4l2_flash *v4l2_flash)
485
485
struct v4l2_ctrl * * ctrls = v4l2_flash -> ctrls ;
486
486
int ret = 0 ;
487
487
488
- v4l2_flash_set_led_brightness (v4l2_flash , ctrls [TORCH_INTENSITY ]);
488
+ if (ctrls [TORCH_INTENSITY ])
489
+ v4l2_flash_set_led_brightness (v4l2_flash ,
490
+ ctrls [TORCH_INTENSITY ]);
489
491
490
492
if (ctrls [INDICATOR_INTENSITY ])
491
493
v4l2_flash_set_led_brightness (v4l2_flash ,
@@ -527,19 +529,21 @@ static int v4l2_flash_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
527
529
{
528
530
struct v4l2_flash * v4l2_flash = v4l2_subdev_to_v4l2_flash (sd );
529
531
struct led_classdev_flash * fled_cdev = v4l2_flash -> fled_cdev ;
530
- struct led_classdev * led_cdev = & fled_cdev -> led_cdev ;
532
+ struct led_classdev * led_cdev = fled_cdev ? & fled_cdev -> led_cdev : NULL ;
531
533
struct led_classdev * led_cdev_ind = v4l2_flash -> iled_cdev ;
532
534
int ret = 0 ;
533
535
534
536
if (!v4l2_fh_is_singular (& fh -> vfh ))
535
537
return 0 ;
536
538
537
- mutex_lock (& led_cdev -> led_access );
539
+ if (led_cdev ) {
540
+ mutex_lock (& led_cdev -> led_access );
538
541
539
- led_sysfs_disable (led_cdev );
540
- led_trigger_remove (led_cdev );
542
+ led_sysfs_disable (led_cdev );
543
+ led_trigger_remove (led_cdev );
541
544
542
- mutex_unlock (& led_cdev -> led_access );
545
+ mutex_unlock (& led_cdev -> led_access );
546
+ }
543
547
544
548
if (led_cdev_ind ) {
545
549
mutex_lock (& led_cdev_ind -> led_access );
@@ -556,9 +560,11 @@ static int v4l2_flash_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
556
560
557
561
return 0 ;
558
562
out_sync_device :
559
- mutex_lock (& led_cdev -> led_access );
560
- led_sysfs_enable (led_cdev );
561
- mutex_unlock (& led_cdev -> led_access );
563
+ if (led_cdev ) {
564
+ mutex_lock (& led_cdev -> led_access );
565
+ led_sysfs_enable (led_cdev );
566
+ mutex_unlock (& led_cdev -> led_access );
567
+ }
562
568
563
569
if (led_cdev_ind ) {
564
570
mutex_lock (& led_cdev_ind -> led_access );
@@ -573,21 +579,24 @@ static int v4l2_flash_close(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
573
579
{
574
580
struct v4l2_flash * v4l2_flash = v4l2_subdev_to_v4l2_flash (sd );
575
581
struct led_classdev_flash * fled_cdev = v4l2_flash -> fled_cdev ;
576
- struct led_classdev * led_cdev = & fled_cdev -> led_cdev ;
582
+ struct led_classdev * led_cdev = fled_cdev ? & fled_cdev -> led_cdev : NULL ;
577
583
struct led_classdev * led_cdev_ind = v4l2_flash -> iled_cdev ;
578
584
int ret = 0 ;
579
585
580
586
if (!v4l2_fh_is_singular (& fh -> vfh ))
581
587
return 0 ;
582
588
583
- mutex_lock (& led_cdev -> led_access );
589
+ if (led_cdev ) {
590
+ mutex_lock (& led_cdev -> led_access );
584
591
585
- if (v4l2_flash -> ctrls [STROBE_SOURCE ])
586
- ret = v4l2_ctrl_s_ctrl (v4l2_flash -> ctrls [STROBE_SOURCE ],
592
+ if (v4l2_flash -> ctrls [STROBE_SOURCE ])
593
+ ret = v4l2_ctrl_s_ctrl (
594
+ v4l2_flash -> ctrls [STROBE_SOURCE ],
587
595
V4L2_FLASH_STROBE_SOURCE_SOFTWARE );
588
- led_sysfs_enable (led_cdev );
596
+ led_sysfs_enable (led_cdev );
589
597
590
- mutex_unlock (& led_cdev -> led_access );
598
+ mutex_unlock (& led_cdev -> led_access );
599
+ }
591
600
592
601
if (led_cdev_ind ) {
593
602
mutex_lock (& led_cdev_ind -> led_access );
@@ -605,25 +614,19 @@ static const struct v4l2_subdev_internal_ops v4l2_flash_subdev_internal_ops = {
605
614
606
615
static const struct v4l2_subdev_ops v4l2_flash_subdev_ops ;
607
616
608
- struct v4l2_flash * v4l2_flash_init (
617
+ static struct v4l2_flash * __v4l2_flash_init (
609
618
struct device * dev , struct fwnode_handle * fwn ,
610
- struct led_classdev_flash * fled_cdev ,
611
- struct led_classdev * iled_cdev ,
612
- const struct v4l2_flash_ops * ops ,
613
- struct v4l2_flash_config * config )
619
+ struct led_classdev_flash * fled_cdev , struct led_classdev * iled_cdev ,
620
+ const struct v4l2_flash_ops * ops , struct v4l2_flash_config * config )
614
621
{
615
622
struct v4l2_flash * v4l2_flash ;
616
- struct led_classdev * led_cdev ;
617
623
struct v4l2_subdev * sd ;
618
624
int ret ;
619
625
620
- if (!fled_cdev || ! config )
626
+ if (!config )
621
627
return ERR_PTR (- EINVAL );
622
628
623
- led_cdev = & fled_cdev -> led_cdev ;
624
-
625
- v4l2_flash = devm_kzalloc (led_cdev -> dev , sizeof (* v4l2_flash ),
626
- GFP_KERNEL );
629
+ v4l2_flash = devm_kzalloc (dev , sizeof (* v4l2_flash ), GFP_KERNEL );
627
630
if (!v4l2_flash )
628
631
return ERR_PTR (- ENOMEM );
629
632
@@ -632,7 +635,7 @@ struct v4l2_flash *v4l2_flash_init(
632
635
v4l2_flash -> iled_cdev = iled_cdev ;
633
636
v4l2_flash -> ops = ops ;
634
637
sd -> dev = dev ;
635
- sd -> fwnode = fwn ? fwn : dev_fwnode (led_cdev -> dev );
638
+ sd -> fwnode = fwn ? fwn : dev_fwnode (dev );
636
639
v4l2_subdev_init (sd , & v4l2_flash_subdev_ops );
637
640
sd -> internal_ops = & v4l2_flash_subdev_internal_ops ;
638
641
sd -> flags |= V4L2_SUBDEV_FL_HAS_DEVNODE ;
@@ -664,8 +667,26 @@ struct v4l2_flash *v4l2_flash_init(
664
667
665
668
return ERR_PTR (ret );
666
669
}
670
+
671
+ struct v4l2_flash * v4l2_flash_init (
672
+ struct device * dev , struct fwnode_handle * fwn ,
673
+ struct led_classdev_flash * fled_cdev ,
674
+ const struct v4l2_flash_ops * ops ,
675
+ struct v4l2_flash_config * config )
676
+ {
677
+ return __v4l2_flash_init (dev , fwn , fled_cdev , NULL , ops , config );
678
+ }
667
679
EXPORT_SYMBOL_GPL (v4l2_flash_init );
668
680
681
+ struct v4l2_flash * v4l2_flash_indicator_init (
682
+ struct device * dev , struct fwnode_handle * fwn ,
683
+ struct led_classdev * iled_cdev ,
684
+ struct v4l2_flash_config * config )
685
+ {
686
+ return __v4l2_flash_init (dev , fwn , NULL , iled_cdev , NULL , config );
687
+ }
688
+ EXPORT_SYMBOL_GPL (v4l2_flash_indicator_init );
689
+
669
690
void v4l2_flash_release (struct v4l2_flash * v4l2_flash )
670
691
{
671
692
struct v4l2_subdev * sd ;
0 commit comments