iio: accel: bmc150: Add support for dual-accelerometers with a DUAL250E HID
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>
This commit is contained in:
parent
42d1c1dc0f
commit
3aac11a7c2
|
@ -24,6 +24,7 @@
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
static const struct acpi_device_id bmc150_acpi_dual_accel_ids[] = {
|
static const struct acpi_device_id bmc150_acpi_dual_accel_ids[] = {
|
||||||
{"BOSC0200"},
|
{"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 acpi_device *adev = ACPI_COMPANION(&client->dev);
|
||||||
struct i2c_client *second_dev;
|
struct i2c_client *second_dev;
|
||||||
|
char dev_name[16];
|
||||||
struct i2c_board_info board_info = {
|
struct i2c_board_info board_info = {
|
||||||
.type = "bmc150_accel",
|
.type = "bmc150_accel",
|
||||||
/*
|
.dev_name = dev_name,
|
||||||
* 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",
|
|
||||||
.fwnode = client->dev.fwnode,
|
.fwnode = client->dev.fwnode,
|
||||||
.irq = -ENOENT,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if (acpi_match_device_ids(adev, bmc150_acpi_dual_accel_ids))
|
if (acpi_match_device_ids(adev, bmc150_acpi_dual_accel_ids))
|
||||||
return;
|
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);
|
second_dev = i2c_acpi_new_device(&client->dev, 1, &board_info);
|
||||||
if (!IS_ERR(second_dev))
|
if (!IS_ERR(second_dev))
|
||||||
bmc150_set_second_device(client, 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},
|
{"BMA222E", bma222e},
|
||||||
{"BMA0280", bma280},
|
{"BMA0280", bma280},
|
||||||
{"BOSC0200"},
|
{"BOSC0200"},
|
||||||
|
{"DUAL250E"},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(acpi, bmc150_accel_acpi_match);
|
MODULE_DEVICE_TABLE(acpi, bmc150_accel_acpi_match);
|
||||||
|
|
Loading…
Reference in New Issue