power: supply: max17042_battery: Add support for ACPI enumeration
authorHans de Goede <hdegoede@redhat.com>
Mon, 14 Aug 2017 20:18:10 +0000 (22:18 +0200)
committerSebastian Reichel <sebastian.reichel@collabora.co.uk>
Mon, 28 Aug 2017 16:19:07 +0000 (18:19 +0200)
Some x86 devices enumerate a max17047 fuel-gauge through a MAX17047
ACPI firmware-node, add support for this.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
drivers/power/supply/max17042_battery.c

index aecaaa2b0586027036f467805358697e979b4538..b2ddb7eb69c6448f5a7cc18bcd28dedbd3556337 100644 (file)
@@ -22,6 +22,7 @@
  * This driver is based on max17040_battery.c
  */
 
+#include <linux/acpi.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/slab.h>
@@ -982,6 +983,8 @@ static int max17042_probe(struct i2c_client *client,
        struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
        const struct power_supply_desc *max17042_desc = &max17042_psy_desc;
        struct power_supply_config psy_cfg = {};
+       const struct acpi_device_id *acpi_id;
+       struct device *dev = &client->dev;
        struct max17042_chip *chip;
        int ret;
        int i;
@@ -995,7 +998,15 @@ static int max17042_probe(struct i2c_client *client,
                return -ENOMEM;
 
        chip->client = client;
-       chip->chip_type = id->driver_data;
+       if (id) {
+               chip->chip_type = id->driver_data;
+       } else {
+               acpi_id = acpi_match_device(dev->driver->acpi_match_table, dev);
+               if (!acpi_id)
+                       return -ENODEV;
+
+               chip->chip_type = acpi_id->driver_data;
+       }
        chip->regmap = devm_regmap_init_i2c(client, &max17042_regmap_config);
        if (IS_ERR(chip->regmap)) {
                dev_err(&client->dev, "Failed to initialize regmap\n");
@@ -1104,6 +1115,14 @@ static int max17042_resume(struct device *dev)
 static SIMPLE_DEV_PM_OPS(max17042_pm_ops, max17042_suspend,
                        max17042_resume);
 
+#ifdef CONFIG_ACPI
+static const struct acpi_device_id max17042_acpi_match[] = {
+       { "MAX17047", MAXIM_DEVICE_TYPE_MAX17047 },
+       { }
+};
+MODULE_DEVICE_TABLE(acpi, max17042_acpi_match);
+#endif
+
 #ifdef CONFIG_OF
 static const struct of_device_id max17042_dt_match[] = {
        { .compatible = "maxim,max17042" },
@@ -1125,6 +1144,7 @@ MODULE_DEVICE_TABLE(i2c, max17042_id);
 static struct i2c_driver max17042_i2c_driver = {
        .driver = {
                .name   = "max17042",
+               .acpi_match_table = ACPI_PTR(max17042_acpi_match),
                .of_match_table = of_match_ptr(max17042_dt_match),
                .pm     = &max17042_pm_ops,
        },