iio: accel: bmc150: Add support for dual-accelerometers with a DUAL250E HID
authorHans de Goede <hdegoede@redhat.com>
Sun, 23 May 2021 17:00:58 +0000 (19:00 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Wed, 9 Jun 2021 19:51:51 +0000 (20:51 +0100)
The Lenovo Yoga 300-11IBR has a ACPI fwnode with a HID of DUAL250E
which contains I2C and IRQ resources for 2 accelerometers, 1 in the
display and one in the base of the device. Add support for this.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20210523170103.176958-5-hdegoede@redhat.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/accel/bmc150-accel-i2c.c

index f7cb40f..41b4c9e 100644 (file)
@@ -24,6 +24,7 @@
 #ifdef CONFIG_ACPI
 static const struct acpi_device_id bmc150_acpi_dual_accel_ids[] = {
        {"BOSC0200"},
+       {"DUAL250E"},
        { }
 };
 
@@ -36,21 +37,24 @@ static void bmc150_acpi_dual_accel_probe(struct i2c_client *client)
 {
        struct acpi_device *adev = ACPI_COMPANION(&client->dev);
        struct i2c_client *second_dev;
+       char dev_name[16];
        struct i2c_board_info board_info = {
                .type = "bmc150_accel",
-               /*
-                * The 2nd accel sits in the base of 2-in-1s. Note this name is
-                * static, as there should never be more then 1 BOSC0200 ACPI
-                * node with 2 accelerometers in it.
-                */
-               .dev_name = "BOSC0200:base",
+               .dev_name = dev_name,
                .fwnode = client->dev.fwnode,
-               .irq = -ENOENT,
        };
 
        if (acpi_match_device_ids(adev, bmc150_acpi_dual_accel_ids))
                return;
 
+       /*
+        * The 2nd accel sits in the base of 2-in-1s. The suffix is static, as
+        * there should never be more then 1 ACPI node with 2 accelerometers.
+        */
+       snprintf(dev_name, sizeof(dev_name), "%s:base", acpi_device_hid(adev));
+
+       board_info.irq = acpi_dev_gpio_irq_get(adev, 1);
+
        second_dev = i2c_acpi_new_device(&client->dev, 1, &board_info);
        if (!IS_ERR(second_dev))
                bmc150_set_second_device(client, second_dev);
@@ -118,6 +122,7 @@ static const struct acpi_device_id bmc150_accel_acpi_match[] = {
        {"BMA222E",     bma222e},
        {"BMA0280",     bma280},
        {"BOSC0200"},
+       {"DUAL250E"},
        { },
 };
 MODULE_DEVICE_TABLE(acpi, bmc150_accel_acpi_match);