Commit 4c42bef0 authored by Luke Ross's avatar Luke Ross Committed by Jonathan Cameron

iio:accel:da280: Linx 820 Windows tablet has a da280 mapped via ACPI

This adds an ACPI table to the driver and the ACPI ID of the sensor
on the tablet.
Signed-off-by: default avatarLuke Ross <luke@lukeross.name>
Signed-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent eed48a3b
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/acpi.h>
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/iio/sysfs.h> #include <linux/iio/sysfs.h>
#include <linux/byteorder/generic.h> #include <linux/byteorder/generic.h>
...@@ -25,7 +26,7 @@ ...@@ -25,7 +26,7 @@
#define DA280_MODE_ENABLE 0x1e #define DA280_MODE_ENABLE 0x1e
#define DA280_MODE_DISABLE 0x9e #define DA280_MODE_DISABLE 0x9e
enum { da226, da280 }; enum da280_chipset { da226, da280 };
/* /*
* a value of + or -4096 corresponds to + or - 1G * a value of + or -4096 corresponds to + or - 1G
...@@ -91,12 +92,24 @@ static const struct iio_info da280_info = { ...@@ -91,12 +92,24 @@ static const struct iio_info da280_info = {
.read_raw = da280_read_raw, .read_raw = da280_read_raw,
}; };
static enum da280_chipset da280_match_acpi_device(struct device *dev)
{
const struct acpi_device_id *id;
id = acpi_match_device(dev->driver->acpi_match_table, dev);
if (!id)
return -EINVAL;
return (enum da280_chipset) id->driver_data;
}
static int da280_probe(struct i2c_client *client, static int da280_probe(struct i2c_client *client,
const struct i2c_device_id *id) const struct i2c_device_id *id)
{ {
int ret; int ret;
struct iio_dev *indio_dev; struct iio_dev *indio_dev;
struct da280_data *data; struct da280_data *data;
enum da280_chipset chip;
ret = i2c_smbus_read_byte_data(client, DA280_REG_CHIP_ID); ret = i2c_smbus_read_byte_data(client, DA280_REG_CHIP_ID);
if (ret != DA280_CHIP_ID) if (ret != DA280_CHIP_ID)
...@@ -114,7 +127,14 @@ static int da280_probe(struct i2c_client *client, ...@@ -114,7 +127,14 @@ static int da280_probe(struct i2c_client *client,
indio_dev->info = &da280_info; indio_dev->info = &da280_info;
indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->channels = da280_channels; indio_dev->channels = da280_channels;
if (id->driver_data == da226) {
if (ACPI_HANDLE(&client->dev)) {
chip = da280_match_acpi_device(&client->dev);
} else {
chip = id->driver_data;
}
if (chip == da226) {
indio_dev->name = "da226"; indio_dev->name = "da226";
indio_dev->num_channels = 2; indio_dev->num_channels = 2;
} else { } else {
...@@ -158,6 +178,12 @@ static int da280_resume(struct device *dev) ...@@ -158,6 +178,12 @@ static int da280_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(da280_pm_ops, da280_suspend, da280_resume); static SIMPLE_DEV_PM_OPS(da280_pm_ops, da280_suspend, da280_resume);
static const struct acpi_device_id da280_acpi_match[] = {
{"MIRAACC", da280},
{},
};
MODULE_DEVICE_TABLE(acpi, da280_acpi_match);
static const struct i2c_device_id da280_i2c_id[] = { static const struct i2c_device_id da280_i2c_id[] = {
{ "da226", da226 }, { "da226", da226 },
{ "da280", da280 }, { "da280", da280 },
...@@ -168,6 +194,7 @@ MODULE_DEVICE_TABLE(i2c, da280_i2c_id); ...@@ -168,6 +194,7 @@ MODULE_DEVICE_TABLE(i2c, da280_i2c_id);
static struct i2c_driver da280_driver = { static struct i2c_driver da280_driver = {
.driver = { .driver = {
.name = "da280", .name = "da280",
.acpi_match_table = ACPI_PTR(da280_acpi_match),
.pm = &da280_pm_ops, .pm = &da280_pm_ops,
}, },
.probe = da280_probe, .probe = da280_probe,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment