| From 857782b98f0b6236e3482e784c7db9a6692c00e0 Mon Sep 17 00:00:00 2001 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Sun, 15 Sep 2019 20:53:42 +0200 |
| Subject: [PATCH] iio: adc: axp288: Override TS pin bias current for some |
| models |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| commit 972917419a0ba25afbf69d5d8c9fa644d676f887 upstream. |
| |
| Since commit 9bcf15f75cac ("iio: adc: axp288: Fix TS-pin handling") we |
| preserve the bias current set by the firmware at boot. This fixes issues |
| we were seeing on various models, but it seems our old hardcoded 80ųA bias |
| current was working around a firmware bug on at least one model laptop. |
| |
| In order to both have our cake and eat it, this commit adds a dmi based |
| list of models where we need to override the firmware set bias current and |
| adds the one model we now know needs this to it: The Lenovo Ideapad 100S |
| (11 inch version). |
| |
| Fixes: 9bcf15f75cac ("iio: adc: axp288: Fix TS-pin handling") |
| BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=203829 |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/iio/adc/axp288_adc.c b/drivers/iio/adc/axp288_adc.c |
| index 31d51bcc5f2c..85d08e68b34f 100644 |
| --- a/drivers/iio/adc/axp288_adc.c |
| +++ b/drivers/iio/adc/axp288_adc.c |
| @@ -7,6 +7,7 @@ |
| * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| */ |
| |
| +#include <linux/dmi.h> |
| #include <linux/module.h> |
| #include <linux/kernel.h> |
| #include <linux/device.h> |
| @@ -25,6 +26,11 @@ |
| #define AXP288_ADC_EN_MASK 0xF0 |
| #define AXP288_ADC_TS_ENABLE 0x01 |
| |
| +#define AXP288_ADC_TS_BIAS_MASK GENMASK(5, 4) |
| +#define AXP288_ADC_TS_BIAS_20UA (0 << 4) |
| +#define AXP288_ADC_TS_BIAS_40UA (1 << 4) |
| +#define AXP288_ADC_TS_BIAS_60UA (2 << 4) |
| +#define AXP288_ADC_TS_BIAS_80UA (3 << 4) |
| #define AXP288_ADC_TS_CURRENT_ON_OFF_MASK GENMASK(1, 0) |
| #define AXP288_ADC_TS_CURRENT_OFF (0 << 0) |
| #define AXP288_ADC_TS_CURRENT_ON_WHEN_CHARGING (1 << 0) |
| @@ -177,10 +183,36 @@ static int axp288_adc_read_raw(struct iio_dev *indio_dev, |
| return ret; |
| } |
| |
| +/* |
| + * We rely on the machine's firmware to correctly setup the TS pin bias current |
| + * at boot. This lists systems with broken fw where we need to set it ourselves. |
| + */ |
| +static const struct dmi_system_id axp288_adc_ts_bias_override[] = { |
| + { |
| + /* Lenovo Ideapad 100S (11 inch) */ |
| + .matches = { |
| + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), |
| + DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo ideapad 100S-11IBY"), |
| + }, |
| + .driver_data = (void *)(uintptr_t)AXP288_ADC_TS_BIAS_80UA, |
| + }, |
| + {} |
| +}; |
| + |
| static int axp288_adc_initialize(struct axp288_adc_info *info) |
| { |
| + const struct dmi_system_id *bias_override; |
| int ret, adc_enable_val; |
| |
| + bias_override = dmi_first_match(axp288_adc_ts_bias_override); |
| + if (bias_override) { |
| + ret = regmap_update_bits(info->regmap, AXP288_ADC_TS_PIN_CTRL, |
| + AXP288_ADC_TS_BIAS_MASK, |
| + (uintptr_t)bias_override->driver_data); |
| + if (ret) |
| + return ret; |
| + } |
| + |
| /* |
| * Determine if the TS pin is enabled and set the TS current-source |
| * accordingly. |
| -- |
| 2.7.4 |
| |