ACPI / PMIC: xpower: Do pinswitch magic when reading GPADC
[platform/kernel/linux-rpi.git] / drivers / acpi / pmic / intel_pmic_xpower.c
index 3b7d5be..6c99d3f 100644 (file)
@@ -27,6 +27,9 @@
 #define GPI1_LDO_ON            (3 << 0)
 #define GPI1_LDO_OFF           (4 << 0)
 
+#define AXP288_ADC_TS_PIN_GPADC        0xf2
+#define AXP288_ADC_TS_PIN_ON   0xf3
+
 static struct pmic_table power_table[] = {
        {
                .address = 0x00,
@@ -209,11 +212,23 @@ static int intel_xpower_pmic_update_power(struct regmap *regmap, int reg,
 static int intel_xpower_pmic_get_raw_temp(struct regmap *regmap, int reg)
 {
        u8 buf[2];
+       int ret;
 
-       if (regmap_bulk_read(regmap, AXP288_GP_ADC_H, buf, 2))
-               return -EIO;
+       ret = regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL,
+                          AXP288_ADC_TS_PIN_GPADC);
+       if (ret)
+               return ret;
+
+       /* After switching to the GPADC pin give things some time to settle */
+       usleep_range(6000, 10000);
+
+       ret = regmap_bulk_read(regmap, AXP288_GP_ADC_H, buf, 2);
+       if (ret == 0)
+               ret = (buf[0] << 4) + ((buf[1] >> 4) & 0x0f);
+
+       regmap_write(regmap, AXP288_ADC_TS_PIN_CTRL, AXP288_ADC_TS_PIN_ON);
 
-       return (buf[0] << 4) + ((buf[1] >> 4) & 0x0F);
+       return ret;
 }
 
 static struct intel_pmic_opregion_data intel_xpower_pmic_opregion_data = {