Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ACPI / PMIC: AXP288: support virtual GPIO in ACPI table

The same virtual GPIO strategy is also used for the AXP288 PMIC in that
various control methods that are used to do power rail handling and
sensor reading/setting will touch GPIO fields defined under the PMIC
device. The GPIO fileds are only defined by the ACPI code while the
actual hardware doesn't really have a GPIO controller, but to make those
control method execution succeed, we have to install a GPIO handler for
the PMIC device handle. Since we do not need the virtual GPIO strategy,
we can simply do nothing in that handler.

Signed-off-by: Aaron Lu <aaron.lu@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>

authored by

Aaron Lu and committed by
Rafael J. Wysocki
491cb357 d8139f63

+26 -4
+26 -4
drivers/acpi/pmic/intel_pmic_xpower.c
··· 220 220 .thermal_table_count = ARRAY_SIZE(thermal_table), 221 221 }; 222 222 223 + static acpi_status intel_xpower_pmic_gpio_handler(u32 function, 224 + acpi_physical_address address, u32 bit_width, u64 *value, 225 + void *handler_context, void *region_context) 226 + { 227 + return AE_OK; 228 + } 223 229 224 230 static int intel_xpower_pmic_opregion_probe(struct platform_device *pdev) 225 231 { 226 - struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); 227 - return intel_pmic_install_opregion_handler(&pdev->dev, 228 - ACPI_HANDLE(pdev->dev.parent), axp20x->regmap, 229 - &intel_xpower_pmic_opregion_data); 232 + struct device *parent = pdev->dev.parent; 233 + struct axp20x_dev *axp20x = dev_get_drvdata(parent); 234 + acpi_status status; 235 + int result; 236 + 237 + status = acpi_install_address_space_handler(ACPI_HANDLE(parent), 238 + ACPI_ADR_SPACE_GPIO, intel_xpower_pmic_gpio_handler, 239 + NULL, NULL); 240 + if (ACPI_FAILURE(status)) 241 + return -ENODEV; 242 + 243 + result = intel_pmic_install_opregion_handler(&pdev->dev, 244 + ACPI_HANDLE(parent), axp20x->regmap, 245 + &intel_xpower_pmic_opregion_data); 246 + if (result) 247 + acpi_remove_address_space_handler(ACPI_HANDLE(parent), 248 + ACPI_ADR_SPACE_GPIO, 249 + intel_xpower_pmic_gpio_handler); 250 + 251 + return result; 230 252 } 231 253 232 254 static struct platform_driver intel_xpower_pmic_opregion_driver = {