aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorDaniel Baluta <daniel.baluta@intel.com>2014-03-09 04:33:00 -0400
committerJonathan Cameron <jic23@kernel.org>2014-09-14 10:09:47 -0400
commitc68613777517e538ace751e4e738e238eb216f86 (patch)
treefad4915dec08a03554e3ec257574c1a002464eed /drivers/iio
parent8ecbb3c3c712d9c859586886d621e3b6175da972 (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/Kconfig3
-rw-r--r--drivers/iio/accel/kxcjk-1013.c111
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
88enum kx_chipset {
89 KXCJK1013,
90 KXCJ91008,
91 KXTJ21009,
92 KX_MAX_CHIPS /* this must be last */
93};
94
88struct kxcjk1013_data { 95struct 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
105enum kxcjk1013_axis { 113enum kxcjk1013_axis {
@@ -133,10 +141,53 @@ static const struct {
133static const struct { 141static 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
141static const struct { 192static const struct {
142 u16 scale; 193 u16 scale;
@@ -310,10 +361,11 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data)
310static int kxcjk1013_get_startup_times(struct kxcjk1013_data *data) 361static 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
1077static int kxcjk1013_acpi_gpio_probe(struct i2c_client *client, 1129static 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
1141static 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
1327static const struct acpi_device_id kx_acpi_match[] = { 1394static 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};
1332MODULE_DEVICE_TABLE(acpi, kx_acpi_match); 1400MODULE_DEVICE_TABLE(acpi, kx_acpi_match);
1333 1401
1334static const struct i2c_device_id kxcjk1013_id[] = { 1402static 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