iio:kxcjk-1013: Add support for SMO8500 device
The Onda v975w tablet contains an accelerometer that's advertised over ACPI as SMO8500. This device is however a KXCJ9 accelerometer as can be seen in the Windows driver's INF file, and from the etching on the chipset ("KXCJ9 41566 0414"). This patch also removes the attempt to get the IRQ for the "data ready" signal, as it does not seem to be supported by this device on this platform. Signed-off-by: Bastien Nocera <hadess@hadess.net> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
This commit is contained in:
parent
995863cc8e
commit
3bfa74f860
1 changed files with 11 additions and 2 deletions
|
@ -108,6 +108,7 @@ struct kxcjk1013_data {
|
||||||
bool motion_trigger_on;
|
bool motion_trigger_on;
|
||||||
int64_t timestamp;
|
int64_t timestamp;
|
||||||
enum kx_chipset chipset;
|
enum kx_chipset chipset;
|
||||||
|
bool is_smo8500_device;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum kxcjk1013_axis {
|
enum kxcjk1013_axis {
|
||||||
|
@ -1129,12 +1130,15 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *kxcjk1013_match_acpi_device(struct device *dev,
|
static const char *kxcjk1013_match_acpi_device(struct device *dev,
|
||||||
enum kx_chipset *chipset)
|
enum kx_chipset *chipset,
|
||||||
|
bool *is_smo8500_device)
|
||||||
{
|
{
|
||||||
const struct acpi_device_id *id;
|
const struct acpi_device_id *id;
|
||||||
id = acpi_match_device(dev->driver->acpi_match_table, dev);
|
id = acpi_match_device(dev->driver->acpi_match_table, dev);
|
||||||
if (!id)
|
if (!id)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
if (strcmp(id->id, "SMO8500") == 0)
|
||||||
|
*is_smo8500_device = true;
|
||||||
*chipset = (enum kx_chipset)id->driver_data;
|
*chipset = (enum kx_chipset)id->driver_data;
|
||||||
|
|
||||||
return dev_name(dev);
|
return dev_name(dev);
|
||||||
|
@ -1149,6 +1153,8 @@ static int kxcjk1013_gpio_probe(struct i2c_client *client,
|
||||||
|
|
||||||
if (!client)
|
if (!client)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
if (data->is_smo8500_device)
|
||||||
|
return -ENOTSUPP;
|
||||||
|
|
||||||
dev = &client->dev;
|
dev = &client->dev;
|
||||||
|
|
||||||
|
@ -1198,7 +1204,8 @@ static int kxcjk1013_probe(struct i2c_client *client,
|
||||||
name = id->name;
|
name = id->name;
|
||||||
} else if (ACPI_HANDLE(&client->dev)) {
|
} else if (ACPI_HANDLE(&client->dev)) {
|
||||||
name = kxcjk1013_match_acpi_device(&client->dev,
|
name = kxcjk1013_match_acpi_device(&client->dev,
|
||||||
&data->chipset);
|
&data->chipset,
|
||||||
|
&data->is_smo8500_device);
|
||||||
} else
|
} else
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
@ -1397,6 +1404,7 @@ static const struct acpi_device_id kx_acpi_match[] = {
|
||||||
{"KXCJ1013", KXCJK1013},
|
{"KXCJ1013", KXCJK1013},
|
||||||
{"KXCJ1008", KXCJ91008},
|
{"KXCJ1008", KXCJ91008},
|
||||||
{"KXTJ1009", KXTJ21009},
|
{"KXTJ1009", KXTJ21009},
|
||||||
|
{"SMO8500", KXCJ91008},
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(acpi, kx_acpi_match);
|
MODULE_DEVICE_TABLE(acpi, kx_acpi_match);
|
||||||
|
@ -1405,6 +1413,7 @@ static const struct i2c_device_id kxcjk1013_id[] = {
|
||||||
{"kxcjk1013", KXCJK1013},
|
{"kxcjk1013", KXCJK1013},
|
||||||
{"kxcj91008", KXCJ91008},
|
{"kxcj91008", KXCJ91008},
|
||||||
{"kxtj21009", KXTJ21009},
|
{"kxtj21009", KXTJ21009},
|
||||||
|
{"SMO8500", KXCJ91008},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue