diff options
author | Daniel Baluta <daniel.baluta@intel.com> | 2014-03-09 04:33:00 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2014-09-14 10:09:47 -0400 |
commit | c68613777517e538ace751e4e738e238eb216f86 (patch) | |
tree | fad4915dec08a03554e3ec257574c1a002464eed /drivers/iio | |
parent | 8ecbb3c3c712d9c859586886d621e3b6175da972 (diff) |
iio: accel: kxcjk-1013: add support for kxtj2-1009
This patch adds support for KXTJ2-1009 3-axis acceleromenter sensor.
KXTJ2-1009 uses the same register definitions as KXCJK-1013.
The specification for KXTJ2-1009 can be downloaded from:
http://www.kionix.com/sites/default/files/KXTJ2-1009%20Specifications%20Rev%204.pdf
Reviewed-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Daniel Baluta <daniel.baluta@intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio')
-rw-r--r-- | drivers/iio/accel/Kconfig | 3 | ||||
-rw-r--r-- | drivers/iio/accel/kxcjk-1013.c | 111 |
2 files changed, 92 insertions, 22 deletions
diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig index 01a2151677a9..f71efc8d3f3e 100644 --- a/drivers/iio/accel/Kconfig +++ b/drivers/iio/accel/Kconfig | |||
@@ -99,7 +99,8 @@ config KXCJK1013 | |||
99 | select IIO_TRIGGERED_BUFFER | 99 | select IIO_TRIGGERED_BUFFER |
100 | help | 100 | help |
101 | Say Y here if you want to build a driver for the Kionix KXCJK-1013 | 101 | Say Y here if you want to build a driver for the Kionix KXCJK-1013 |
102 | triaxial acceleration sensor. This driver also supports KXCJ9-1008. | 102 | triaxial acceleration sensor. This driver also supports KXCJ9-1008 |
103 | and KXTJ2-1009. | ||
103 | 104 | ||
104 | To compile this driver as a module, choose M here: the module will | 105 | To compile this driver as a module, choose M here: the module will |
105 | be called kxcjk-1013. | 106 | be called kxcjk-1013. |
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c index 736231d5f636..615fce236d59 100644 --- a/drivers/iio/accel/kxcjk-1013.c +++ b/drivers/iio/accel/kxcjk-1013.c | |||
@@ -85,6 +85,13 @@ | |||
85 | 85 | ||
86 | #define KXCJK1013_DEFAULT_WAKE_THRES 1 | 86 | #define KXCJK1013_DEFAULT_WAKE_THRES 1 |
87 | 87 | ||
88 | enum kx_chipset { | ||
89 | KXCJK1013, | ||
90 | KXCJ91008, | ||
91 | KXTJ21009, | ||
92 | KX_MAX_CHIPS /* this must be last */ | ||
93 | }; | ||
94 | |||
88 | struct kxcjk1013_data { | 95 | struct kxcjk1013_data { |
89 | struct i2c_client *client; | 96 | struct i2c_client *client; |
90 | struct iio_trigger *dready_trig; | 97 | struct iio_trigger *dready_trig; |
@@ -100,6 +107,7 @@ struct kxcjk1013_data { | |||
100 | int ev_enable_state; | 107 | int ev_enable_state; |
101 | bool motion_trigger_on; | 108 | bool motion_trigger_on; |
102 | int64_t timestamp; | 109 | int64_t timestamp; |
110 | enum kx_chipset chipset; | ||
103 | }; | 111 | }; |
104 | 112 | ||
105 | enum kxcjk1013_axis { | 113 | enum kxcjk1013_axis { |
@@ -133,10 +141,53 @@ static const struct { | |||
133 | static const struct { | 141 | static const struct { |
134 | int odr_bits; | 142 | int odr_bits; |
135 | int usec; | 143 | int usec; |
136 | } odr_start_up_times[] = { {0x08, 100000}, {0x09, 100000}, {0x0A, 100000}, | 144 | } odr_start_up_times[KX_MAX_CHIPS][12] = { |
137 | {0x0B, 100000}, { 0, 80000}, {0x01, 41000}, | 145 | /* KXCJK-1013 */ |
138 | {0x02, 21000}, {0x03, 11000}, {0x04, 6400}, | 146 | { |
139 | {0x05, 3900}, {0x06, 2700}, {0x07, 2100} }; | 147 | {0x08, 100000}, |
148 | {0x09, 100000}, | ||
149 | {0x0A, 100000}, | ||
150 | {0x0B, 100000}, | ||
151 | {0, 80000}, | ||
152 | {0x01, 41000}, | ||
153 | {0x02, 21000}, | ||
154 | {0x03, 11000}, | ||
155 | {0x04, 6400}, | ||
156 | {0x05, 3900}, | ||
157 | {0x06, 2700}, | ||
158 | {0x07, 2100}, | ||
159 | }, | ||
160 | /* KXCJ9-1008 */ | ||
161 | { | ||
162 | {0x08, 100000}, | ||
163 | {0x09, 100000}, | ||
164 | {0x0A, 100000}, | ||
165 | {0x0B, 100000}, | ||
166 | {0, 80000}, | ||
167 | {0x01, 41000}, | ||
168 | {0x02, 21000}, | ||
169 | {0x03, 11000}, | ||
170 | {0x04, 6400}, | ||
171 | {0x05, 3900}, | ||
172 | {0x06, 2700}, | ||
173 | {0x07, 2100}, | ||
174 | }, | ||
175 | /* KXCTJ2-1009 */ | ||
176 | { | ||
177 | {0x08, 1240000}, | ||
178 | {0x09, 621000}, | ||
179 | {0x0A, 309000}, | ||
180 | {0x0B, 151000}, | ||
181 | {0, 80000}, | ||
182 | {0x01, 41000}, | ||
183 | {0x02, 21000}, | ||
184 | {0x03, 11000}, | ||
185 | {0x04, 6000}, | ||
186 | {0x05, 4000}, | ||
187 | {0x06, 3000}, | ||
188 | {0x07, 2000}, | ||
189 | }, | ||
190 | }; | ||
140 | 191 | ||
141 | static const struct { | 192 | static const struct { |
142 | u16 scale; | 193 | u16 scale; |
@@ -310,10 +361,11 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data) | |||
310 | static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data) | 361 | static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data) |
311 | { | 362 | { |
312 | int i; | 363 | int i; |
364 | int idx = data->chipset; | ||
313 | 365 | ||
314 | for (i = 0; i < ARRAY_SIZE(odr_start_up_times); ++i) { | 366 | for (i = 0; i < ARRAY_SIZE(odr_start_up_times[idx]); ++i) { |
315 | if (odr_start_up_times[i].odr_bits == data->odr_bits) | 367 | if (odr_start_up_times[idx][i].odr_bits == data->odr_bits) |
316 | return odr_start_up_times[i].usec; | 368 | return odr_start_up_times[idx][i].usec; |
317 | } | 369 | } |
318 | 370 | ||
319 | return KXCJK1013_MAX_STARTUP_TIME_US; | 371 | return KXCJK1013_MAX_STARTUP_TIME_US; |
@@ -1074,10 +1126,21 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private) | |||
1074 | return IRQ_HANDLED; | 1126 | return IRQ_HANDLED; |
1075 | } | 1127 | } |
1076 | 1128 | ||
1077 | static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client, | 1129 | static const char *kxcjk1013_match_acpi_device(struct device *dev, |
1078 | struct kxcjk1013_data *data) | 1130 | enum kx_chipset *chipset) |
1079 | { | 1131 | { |
1080 | const struct acpi_device_id *id; | 1132 | const struct acpi_device_id *id; |
1133 | id = acpi_match_device(dev->driver->acpi_match_table, dev); | ||
1134 | if (!id) | ||
1135 | return NULL; | ||
1136 | *chipset = (enum kx_chipset)id->driver_data; | ||
1137 | |||
1138 | return dev_name(dev); | ||
1139 | } | ||
1140 | |||
1141 | static int kxcjk1013_gpio_probe(struct i2c_client *client, | ||
1142 | struct kxcjk1013_data *data) | ||
1143 | { | ||
1081 | struct device *dev; | 1144 | struct device *dev; |
1082 | struct gpio_desc *gpio; | 1145 | struct gpio_desc *gpio; |
1083 | int ret; | 1146 | int ret; |
@@ -1086,12 +1149,6 @@ static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client, | |||
1086 | return -EINVAL; | 1149 | return -EINVAL; |
1087 | 1150 | ||
1088 | dev = &client->dev; | 1151 | dev = &client->dev; |
1089 | if (!ACPI_HANDLE(dev)) | ||
1090 | return -ENODEV; | ||
1091 | |||
1092 | id = acpi_match_device(dev->driver->acpi_match_table, dev); | ||
1093 | if (!id) | ||
1094 | return -ENODEV; | ||
1095 | 1152 | ||
1096 | /* data ready gpio interrupt pin */ | 1153 | /* data ready gpio interrupt pin */ |
1097 | gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0); | 1154 | gpio = devm_gpiod_get_index(dev, "kxcjk1013_int", 0); |
@@ -1117,6 +1174,7 @@ static int kxcjk1013_probe(struct i2c_client *client, | |||
1117 | struct kxcjk1013_data *data; | 1174 | struct kxcjk1013_data *data; |
1118 | struct iio_dev *indio_dev; | 1175 | struct iio_dev *indio_dev; |
1119 | struct kxcjk_1013_platform_data *pdata; | 1176 | struct kxcjk_1013_platform_data *pdata; |
1177 | const char *name; | ||
1120 | int ret; | 1178 | int ret; |
1121 | 1179 | ||
1122 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); | 1180 | indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data)); |
@@ -1133,6 +1191,15 @@ static int kxcjk1013_probe(struct i2c_client *client, | |||
1133 | else | 1191 | else |
1134 | data->active_high_intr = true; /* default polarity */ | 1192 | data->active_high_intr = true; /* default polarity */ |
1135 | 1193 | ||
1194 | if (id) { | ||
1195 | data->chipset = (enum kx_chipset)(id->driver_data); | ||
1196 | name = id->name; | ||
1197 | } else if (ACPI_HANDLE(&client->dev)) { | ||
1198 | name = kxcjk1013_match_acpi_device(&client->dev, | ||
1199 | &data->chipset); | ||
1200 | } else | ||
1201 | return -ENODEV; | ||
1202 | |||
1136 | ret = kxcjk1013_chip_init(data); | 1203 | ret = kxcjk1013_chip_init(data); |
1137 | if (ret < 0) | 1204 | if (ret < 0) |
1138 | return ret; | 1205 | return ret; |
@@ -1142,12 +1209,12 @@ static int kxcjk1013_probe(struct i2c_client *client, | |||
1142 | indio_dev->dev.parent = &client->dev; | 1209 | indio_dev->dev.parent = &client->dev; |
1143 | indio_dev->channels = kxcjk1013_channels; | 1210 | indio_dev->channels = kxcjk1013_channels; |
1144 | indio_dev->num_channels = ARRAY_SIZE(kxcjk1013_channels); | 1211 | indio_dev->num_channels = ARRAY_SIZE(kxcjk1013_channels); |
1145 | indio_dev->name = KXCJK1013_DRV_NAME; | 1212 | indio_dev->name = name; |
1146 | indio_dev->modes = INDIO_DIRECT_MODE; | 1213 | indio_dev->modes = INDIO_DIRECT_MODE; |
1147 | indio_dev->info = &kxcjk1013_info; | 1214 | indio_dev->info = &kxcjk1013_info; |
1148 | 1215 | ||
1149 | if (client->irq < 0) | 1216 | if (client->irq < 0) |
1150 | client->irq = kxcjk1013_acpi_gpio_probe(client, data); | 1217 | client->irq = kxcjk1013_gpio_probe(client, data); |
1151 | 1218 | ||
1152 | if (client->irq >= 0) { | 1219 | if (client->irq >= 0) { |
1153 | ret = devm_request_threaded_irq(&client->dev, client->irq, | 1220 | ret = devm_request_threaded_irq(&client->dev, client->irq, |
@@ -1325,15 +1392,17 @@ static const struct dev_pm_ops kxcjk1013_pm_ops = { | |||
1325 | }; | 1392 | }; |
1326 | 1393 | ||
1327 | static const struct acpi_device_id kx_acpi_match[] = { | 1394 | static const struct acpi_device_id kx_acpi_match[] = { |
1328 | {"KXCJ1013", 0}, | 1395 | {"KXCJ1013", KXCJK1013}, |
1329 | {"KXCJ1008", 0}, | 1396 | {"KXCJ1008", KXCJ91008}, |
1397 | {"KXTJ1009", KXTJ21009}, | ||
1330 | { }, | 1398 | { }, |
1331 | }; | 1399 | }; |
1332 | MODULE_DEVICE_TABLE(acpi, kx_acpi_match); | 1400 | MODULE_DEVICE_TABLE(acpi, kx_acpi_match); |
1333 | 1401 | ||
1334 | static const struct i2c_device_id kxcjk1013_id[] = { | 1402 | static const struct i2c_device_id kxcjk1013_id[] = { |
1335 | {"kxcjk1013", 0}, | 1403 | {"kxcjk1013", KXCJK1013}, |
1336 | {"kxcj91008", 0}, | 1404 | {"kxcj91008", KXCJ91008}, |
1405 | {"kxtj21009", KXTJ21009}, | ||
1337 | {} | 1406 | {} |
1338 | }; | 1407 | }; |
1339 | 1408 | ||