aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2014-05-11 17:09:00 -0400
committerJonathan Cameron <jic23@kernel.org>2014-11-08 07:40:53 -0500
commit3bfa74f86006ff8cc1c3cf71f3bdaa885e952f39 (patch)
treeeaec27520fc74ab00585c1336ae4f91c77de0e60 /drivers/iio
parent995863cc8e3e2ab08a8ff18dc937c7a32a7479e0 (diff)
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>
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/accel/kxcjk-1013.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index 98909a9e284e..1720e9a547ff 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -108,6 +108,7 @@ struct kxcjk1013_data {
108 bool motion_trigger_on; 108 bool motion_trigger_on;
109 int64_t timestamp; 109 int64_t timestamp;
110 enum kx_chipset chipset; 110 enum kx_chipset chipset;
111 bool is_smo8500_device;
111}; 112};
112 113
113enum kxcjk1013_axis { 114enum kxcjk1013_axis {
@@ -1129,12 +1130,15 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
1129} 1130}
1130 1131
1131static const char *kxcjk1013_match_acpi_device(struct device *dev, 1132static const char *kxcjk1013_match_acpi_device(struct device *dev,
1132 enum kx_chipset *chipset) 1133 enum kx_chipset *chipset,
1134 bool *is_smo8500_device)
1133{ 1135{
1134 const struct acpi_device_id *id; 1136 const struct acpi_device_id *id;
1135 id = acpi_match_device(dev->driver->acpi_match_table, dev); 1137 id = acpi_match_device(dev->driver->acpi_match_table, dev);
1136 if (!id) 1138 if (!id)
1137 return NULL; 1139 return NULL;
1140 if (strcmp(id->id, "SMO8500") == 0)
1141 *is_smo8500_device = true;
1138 *chipset = (enum kx_chipset)id->driver_data; 1142 *chipset = (enum kx_chipset)id->driver_data;
1139 1143
1140 return dev_name(dev); 1144 return dev_name(dev);
@@ -1149,6 +1153,8 @@ static int kxcjk1013_gpio_probe(struct i2c_client *client,
1149 1153
1150 if (!client) 1154 if (!client)
1151 return -EINVAL; 1155 return -EINVAL;
1156 if (data->is_smo8500_device)
1157 return -ENOTSUPP;
1152 1158
1153 dev = &client->dev; 1159 dev = &client->dev;
1154 1160
@@ -1198,7 +1204,8 @@ static int kxcjk1013_probe(struct i2c_client *client,
1198 name = id->name; 1204 name = id->name;
1199 } else if (ACPI_HANDLE(&client->dev)) { 1205 } else if (ACPI_HANDLE(&client->dev)) {
1200 name = kxcjk1013_match_acpi_device(&client->dev, 1206 name = kxcjk1013_match_acpi_device(&client->dev,
1201 &data->chipset); 1207 &data->chipset,
1208 &data->is_smo8500_device);
1202 } else 1209 } else
1203 return -ENODEV; 1210 return -ENODEV;
1204 1211
@@ -1397,6 +1404,7 @@ static const struct acpi_device_id kx_acpi_match[] = {
1397 {"KXCJ1013", KXCJK1013}, 1404 {"KXCJ1013", KXCJK1013},
1398 {"KXCJ1008", KXCJ91008}, 1405 {"KXCJ1008", KXCJ91008},
1399 {"KXTJ1009", KXTJ21009}, 1406 {"KXTJ1009", KXTJ21009},
1407 {"SMO8500", KXCJ91008},
1400 { }, 1408 { },
1401}; 1409};
1402MODULE_DEVICE_TABLE(acpi, kx_acpi_match); 1410MODULE_DEVICE_TABLE(acpi, kx_acpi_match);
@@ -1405,6 +1413,7 @@ static const struct i2c_device_id kxcjk1013_id[] = {
1405 {"kxcjk1013", KXCJK1013}, 1413 {"kxcjk1013", KXCJK1013},
1406 {"kxcj91008", KXCJ91008}, 1414 {"kxcj91008", KXCJ91008},
1407 {"kxtj21009", KXTJ21009}, 1415 {"kxtj21009", KXTJ21009},
1416 {"SMO8500", KXCJ91008},
1408 {} 1417 {}
1409}; 1418};
1410 1419