Skip to content

Commit c30f4cb

Browse files
andy-shevmchehab
authored andcommitted
media: atomisp: Refactor PMIC detection to a separate function
Refactor PMIC detection to a separate function. In the future we may move this code somewhere else where it's more suitable. Signed-off-by: Andy Shevchenko <[email protected]> Signed-off-by: Mauro Carvalho Chehab <[email protected]>
1 parent e4fb745 commit c30f4cb

File tree

1 file changed

+36
-23
lines changed

1 file changed

+36
-23
lines changed

drivers/staging/media/atomisp/pci/atomisp_gmin_platform.c

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,38 @@ static int atomisp_get_acpi_power(struct device *dev, acpi_handle handle)
478478
return clock_num;
479479
}
480480

481-
static struct i2c_client *power;
481+
static u8 gmin_get_pmic_id_and_addr(struct device *dev)
482+
{
483+
struct i2c_client *power;
484+
static u8 pmic_i2c_addr;
485+
486+
if (pmic_id)
487+
return pmic_i2c_addr;
488+
489+
if (gmin_i2c_dev_exists(dev, PMIC_ACPI_TI, &power))
490+
pmic_id = PMIC_TI;
491+
else if (gmin_i2c_dev_exists(dev, PMIC_ACPI_AXP, &power))
492+
pmic_id = PMIC_AXP;
493+
else if (gmin_i2c_dev_exists(dev, PMIC_ACPI_CRYSTALCOVE, &power))
494+
pmic_id = PMIC_CRYSTALCOVE;
495+
else
496+
pmic_id = PMIC_REGULATOR;
497+
498+
pmic_i2c_addr = power ? power->addr : 0;
499+
return pmic_i2c_addr;
500+
}
501+
502+
static int gmin_detect_pmic(struct v4l2_subdev *subdev)
503+
{
504+
struct i2c_client *client = v4l2_get_subdevdata(subdev);
505+
struct device *dev = &client->dev;
506+
u8 pmic_i2c_addr;
507+
508+
pmic_i2c_addr = gmin_get_pmic_id_and_addr(dev);
509+
dev_info(dev, "gmin: power management provided via %s (i2c addr 0x%02x)\n",
510+
pmic_name[pmic_id], pmic_i2c_addr);
511+
return pmic_i2c_addr;
512+
}
482513

483514
static struct gmin_subdev *gmin_subdev_add(struct v4l2_subdev *subdev)
484515
{
@@ -580,27 +611,6 @@ static struct gmin_subdev *gmin_subdev_add(struct v4l2_subdev *subdev)
580611
* in order to set clocks and do power management.
581612
*/
582613

583-
if (!pmic_id) {
584-
if (gmin_i2c_dev_exists(dev, PMIC_ACPI_TI, &power))
585-
pmic_id = PMIC_TI;
586-
else if (gmin_i2c_dev_exists(dev, PMIC_ACPI_AXP, &power))
587-
pmic_id = PMIC_AXP;
588-
else if (gmin_i2c_dev_exists(dev, PMIC_ACPI_CRYSTALCOVE, &power))
589-
pmic_id = PMIC_CRYSTALCOVE;
590-
else
591-
pmic_id = PMIC_REGULATOR;
592-
}
593-
594-
if (power) {
595-
gs->pwm_i2c_addr = power->addr;
596-
dev_info(dev,
597-
"gmin: power management provided via %s (i2c addr 0x%02x)\n",
598-
pmic_name[pmic_id], power->addr);
599-
} else {
600-
dev_info(dev, "gmin: power management provided via %s\n",
601-
pmic_name[pmic_id]);
602-
}
603-
604614
/*
605615
* According with :
606616
* https://github.com/projectceladon/hardware-intel-kernelflinger/blob/master/doc/fastboot.md
@@ -1053,10 +1063,13 @@ struct camera_sensor_platform_data *gmin_camera_platform_data(
10531063
enum atomisp_input_format csi_format,
10541064
enum atomisp_bayer_order csi_bayer)
10551065
{
1056-
struct gmin_subdev *gs = gmin_subdev_add(subdev);
1066+
struct gmin_subdev *gs;
1067+
u8 pmic_i2c_addr = gmin_detect_pmic(subdev);
10571068

1069+
gs = gmin_subdev_add(subdev);
10581070
gs->csi_fmt = csi_format;
10591071
gs->csi_bayer = csi_bayer;
1072+
gs->pwm_i2c_addr = pmic_i2c_addr;
10601073

10611074
if (gs->pmc_clk)
10621075
return &pmic_gmin_plat;

0 commit comments

Comments
 (0)