diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-10-30 17:15:31 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-10-30 17:15:31 +0100 |
commit | c2101d01826480755f2bd9f3dd5e36757be61e23 (patch) | |
tree | 3f1d29969a98cc78b84335dc185e2806cd025282 /drivers/acpi/pmic/intel_pmic_xpower.c | |
parent | Merge tag 'pm-4.20-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ra... (diff) | |
parent | ACPI / PMIC: xpower: Add depends on IOSF_MBI to Kconfig entry (diff) | |
download | linux-c2101d01826480755f2bd9f3dd5e36757be61e23.tar.xz linux-c2101d01826480755f2bd9f3dd5e36757be61e23.zip |
Merge tag 'acpi-4.20-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
Pull more ACPI updates from Rafael Wysocki:
"Rework the handling of the P-unit semaphore on Intel Baytrail and
Cherrytrail systems to avoid race conditions and excessive overhead
related to it (Hans de Goede)"
* tag 'acpi-4.20-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
ACPI / PMIC: xpower: Add depends on IOSF_MBI to Kconfig entry
i2c: designware: Cleanup bus lock handling
ACPI / PMIC: xpower: Block P-Unit I2C access during read-modify-write
x86: baytrail/cherrytrail: Rework and move P-Unit PMIC bus semaphore code
Diffstat (limited to 'drivers/acpi/pmic/intel_pmic_xpower.c')
-rw-r--r-- | drivers/acpi/pmic/intel_pmic_xpower.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/drivers/acpi/pmic/intel_pmic_xpower.c b/drivers/acpi/pmic/intel_pmic_xpower.c index aadc86db804c..2579675b7082 100644 --- a/drivers/acpi/pmic/intel_pmic_xpower.c +++ b/drivers/acpi/pmic/intel_pmic_xpower.c @@ -8,8 +8,9 @@ #include <linux/acpi.h> #include <linux/init.h> #include <linux/mfd/axp20x.h> -#include <linux/platform_device.h> #include <linux/regmap.h> +#include <linux/platform_device.h> +#include <asm/iosf_mbi.h> #include "intel_pmic.h" #define XPOWER_GPADC_LOW 0x5b @@ -172,15 +173,21 @@ static int intel_xpower_pmic_get_power(struct regmap *regmap, int reg, static int intel_xpower_pmic_update_power(struct regmap *regmap, int reg, int bit, bool on) { - int data; + int data, ret; /* GPIO1 LDO regulator needs special handling */ if (reg == XPOWER_GPI1_CTRL) return regmap_update_bits(regmap, reg, GPI1_LDO_MASK, on ? GPI1_LDO_ON : GPI1_LDO_OFF); - if (regmap_read(regmap, reg, &data)) - return -EIO; + ret = iosf_mbi_block_punit_i2c_access(); + if (ret) + return ret; + + if (regmap_read(regmap, reg, &data)) { + ret = -EIO; + goto out; + } if (on) data |= BIT(bit); @@ -188,9 +195,11 @@ static int intel_xpower_pmic_update_power(struct regmap *regmap, int reg, data &= ~BIT(bit); if (regmap_write(regmap, reg, data)) - return -EIO; + ret = -EIO; +out: + iosf_mbi_unblock_punit_i2c_access(); - return 0; + return ret; } /** |