aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Lu <aaron.lu@intel.com>2014-11-24 04:32:33 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2014-11-26 17:32:06 -0500
commit491cb357decca2b3eeaac5a8498ad23e7dd073b7 (patch)
tree7dfd51d322c6836ccd0d3332e3e2351e4fbc5360
parentd8139f6311129b4fdc370cbfc03424afea83693b (diff)
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>
-rw-r--r--drivers/acpi/pmic/intel_pmic_xpower.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/drivers/acpi/pmic/intel_pmic_xpower.c b/drivers/acpi/pmic/intel_pmic_xpower.c
index f8853e5eb838..6a082d4de12c 100644
--- a/drivers/acpi/pmic/intel_pmic_xpower.c
+++ b/drivers/acpi/pmic/intel_pmic_xpower.c
@@ -220,13 +220,35 @@ static struct intel_pmic_opregion_data intel_xpower_pmic_opregion_data = {
220 .thermal_table_count = ARRAY_SIZE(thermal_table), 220 .thermal_table_count = ARRAY_SIZE(thermal_table),
221}; 221};
222 222
223static 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
224static int intel_xpower_pmic_opregion_probe(struct platform_device *pdev) 230static int intel_xpower_pmic_opregion_probe(struct platform_device *pdev)
225{ 231{
226 struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); 232 struct device *parent = pdev->dev.parent;
227 return intel_pmic_install_opregion_handler(&pdev->dev, 233 struct axp20x_dev *axp20x = dev_get_drvdata(parent);
228 ACPI_HANDLE(pdev->dev.parent), axp20x->regmap, 234 acpi_status status;
229 &intel_xpower_pmic_opregion_data); 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
232static struct platform_driver intel_xpower_pmic_opregion_driver = { 254static struct platform_driver intel_xpower_pmic_opregion_driver = {