Skip to content

Commit

Permalink
media: atomisp_gmin_platform: Add DMI quirk to not turn AXP ELDO2 reg…
Browse files Browse the repository at this point in the history
…ulator off on some boards

The TrekStor SurfTab duo W1 10.1 has a hw bug where turning eldo2 back on
after having turned it off causes the CPLM3218 ambient-light-sensor on
the front camera sensor's I2C bus to crash, hanging the bus.

Add a DMI quirk table for systems on which to leave eldo2 on.

Note an alternative fix is to turn off the CPLM3218 ambient-light-sensor
as long as the camera sensor is being used, this is what Windows seems
to do as a workaround (based on analyzing the DSDT). But that is not
easy to do cleanly under Linux.

Link: https://lore.kernel.org/linux-media/20220116215204.307649-10-hdegoede@redhat.com
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
  • Loading branch information
jwrdegoede authored and mchehab committed Feb 8, 2022
1 parent f88fba1 commit 2c39a01
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions drivers/staging/media/atomisp/pci/atomisp_gmin_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,21 @@ static int axp_regulator_set(struct device *dev, struct gmin_subdev *gs,
return 0;
}

/*
* Some boards contain a hw-bug where turning eldo2 back on after having turned
* it off causes the CPLM3218 ambient-light-sensor on the image-sensor's I2C bus
* to crash, hanging the bus. Do not turn eldo2 off on these systems.
*/
static const struct dmi_system_id axp_leave_eldo2_on_ids[] = {
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "TrekStor"),
DMI_MATCH(DMI_PRODUCT_NAME, "SurfTab duo W1 10.1 (VT4)"),
},
},
{ }
};

static int axp_v1p8_on(struct device *dev, struct gmin_subdev *gs)
{
int ret;
Expand Down Expand Up @@ -790,6 +805,9 @@ static int axp_v1p8_off(struct device *dev, struct gmin_subdev *gs)
if (ret)
return ret;

if (dmi_check_system(axp_leave_eldo2_on_ids))
return 0;

ret = axp_regulator_set(dev, gs, gs->eldo2_sel_reg, gs->eldo2_1p8v,
ELDO_CTRL_REG, gs->eldo2_ctrl_shift, false);
return ret;
Expand Down

0 comments on commit 2c39a01

Please sign in to comment.