@@ -511,32 +511,23 @@ static int gmin_detect_pmic(struct v4l2_subdev *subdev)
511
511
return pmic_i2c_addr ;
512
512
}
513
513
514
- static struct gmin_subdev * gmin_subdev_add (struct v4l2_subdev * subdev )
514
+ static int gmin_subdev_add (struct gmin_subdev * gs )
515
515
{
516
- struct i2c_client * client = v4l2_get_subdevdata (subdev );
516
+ struct i2c_client * client = v4l2_get_subdevdata (gs -> subdev );
517
517
struct device * dev = & client -> dev ;
518
518
struct acpi_device * adev ;
519
- struct gmin_subdev * gs ;
520
519
acpi_handle handle ;
521
- int i , ret , clock_num = -1 ;
520
+ int ret , clock_num = -1 ;
522
521
523
522
handle = ACPI_HANDLE (dev );
524
523
adev = ACPI_COMPANION (dev );
525
524
526
525
dev_info (& client -> dev , "%s: ACPI detected it on bus ID=%s, HID=%s\n" ,
527
526
__func__ , acpi_device_bid (adev ), acpi_device_hid (adev ));
528
527
529
- for (i = 0 ; i < MAX_SUBDEVS && gmin_subdevs [i ].subdev ; i ++ )
530
- ;
531
- if (i >= MAX_SUBDEVS )
532
- return NULL ;
533
-
534
- gs = & gmin_subdevs [i ];
535
- gs -> subdev = subdev ;
536
-
537
528
/*WA:CHT requires XTAL clock as PLL is not stable.*/
538
- gmin_subdevs [ i ]. clock_src = gmin_get_var_int (dev , false, "ClkSrc" ,
539
- VLV2_CLK_PLL_19P2MHZ );
529
+ gs -> clock_src = gmin_get_var_int (dev , false, "ClkSrc" ,
530
+ VLV2_CLK_PLL_19P2MHZ );
540
531
541
532
gs -> csi_port = gmin_get_var_int (dev , false, "CsiPort" , 0 );
542
533
gs -> csi_lanes = gmin_get_var_int (dev , false, "CsiLanes" , 1 );
@@ -596,8 +587,7 @@ static struct gmin_subdev *gmin_subdev_add(struct v4l2_subdev *subdev)
596
587
acpi_device_can_poweroff (adev )) {
597
588
dev_info (dev ,
598
589
"gmin: power management provided via device PM\n" );
599
-
600
- return gs ;
590
+ return 0 ;
601
591
}
602
592
603
593
/*
@@ -630,7 +620,7 @@ static struct gmin_subdev *gmin_subdev_add(struct v4l2_subdev *subdev)
630
620
631
621
if (clock_num < 0 || clock_num > MAX_CLK_COUNT ) {
632
622
dev_err (dev , "Invalid clock number\n" );
633
- return NULL ;
623
+ return - EINVAL ;
634
624
}
635
625
636
626
snprintf (gmin_pmc_clk_name , sizeof (gmin_pmc_clk_name ),
@@ -639,13 +629,8 @@ static struct gmin_subdev *gmin_subdev_add(struct v4l2_subdev *subdev)
639
629
gs -> pmc_clk = devm_clk_get (dev , gmin_pmc_clk_name );
640
630
if (IS_ERR (gs -> pmc_clk )) {
641
631
ret = PTR_ERR (gs -> pmc_clk );
642
-
643
- dev_err (dev ,
644
- "Failed to get clk from %s : %d\n" ,
645
- gmin_pmc_clk_name ,
646
- ret );
647
-
648
- return NULL ;
632
+ dev_err (dev , "Failed to get clk from %s: %d\n" , gmin_pmc_clk_name , ret );
633
+ return ret ;
649
634
}
650
635
dev_info (dev , "Will use CLK%d (%s)\n" , clock_num , gmin_pmc_clk_name );
651
636
@@ -705,7 +690,7 @@ static struct gmin_subdev *gmin_subdev_add(struct v4l2_subdev *subdev)
705
690
break ;
706
691
}
707
692
708
- return gs ;
693
+ return 0 ;
709
694
}
710
695
711
696
static struct gmin_subdev * find_gmin_subdev (struct v4l2_subdev * subdev )
@@ -718,6 +703,16 @@ static struct gmin_subdev *find_gmin_subdev(struct v4l2_subdev *subdev)
718
703
return NULL ;
719
704
}
720
705
706
+ static struct gmin_subdev * find_free_gmin_subdev_slot (void )
707
+ {
708
+ unsigned int i ;
709
+
710
+ for (i = 0 ; i < MAX_SUBDEVS ; i ++ )
711
+ if (gmin_subdevs [i ].subdev == NULL )
712
+ return & gmin_subdevs [i ];
713
+ return NULL ;
714
+ }
715
+
721
716
static int axp_regulator_set (struct device * dev , struct gmin_subdev * gs ,
722
717
int sel_reg , u8 setting ,
723
718
int ctrl_reg , int shift , bool on )
@@ -1050,14 +1045,16 @@ struct camera_sensor_platform_data *gmin_camera_platform_data(
1050
1045
enum atomisp_input_format csi_format ,
1051
1046
enum atomisp_bayer_order csi_bayer )
1052
1047
{
1053
- struct gmin_subdev * gs ;
1054
1048
u8 pmic_i2c_addr = gmin_detect_pmic (subdev );
1049
+ struct gmin_subdev * gs ;
1055
1050
1056
- gs = gmin_subdev_add (subdev );
1051
+ gs = find_free_gmin_subdev_slot ();
1052
+ gs -> subdev = subdev ;
1057
1053
gs -> csi_fmt = csi_format ;
1058
1054
gs -> csi_bayer = csi_bayer ;
1059
1055
gs -> pwm_i2c_addr = pmic_i2c_addr ;
1060
1056
1057
+ gmin_subdev_add (gs );
1061
1058
if (gs -> pmc_clk )
1062
1059
return & pmic_gmin_plat ;
1063
1060
else
0 commit comments