Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * bma180.c - IIO driver for Bosch BMA180 triaxial acceleration sensor
4 *
5 * Copyright 2013 Oleksandr Kravchenko <x0199363@ti.com>
6 *
7 * Support for BMA250 (c) Peter Meerwald <pmeerw@pmeerw.net>
8 *
9 * SPI is not supported by driver
10 * BMA023/BMA150/SMB380: 7-bit I2C slave address 0x38
11 * BMA180: 7-bit I2C slave address 0x40 or 0x41
12 * BMA250: 7-bit I2C slave address 0x18 or 0x19
13 */
14
15#include <linux/module.h>
16#include <linux/mod_devicetable.h>
17#include <linux/i2c.h>
18#include <linux/interrupt.h>
19#include <linux/delay.h>
20#include <linux/bitops.h>
21#include <linux/regulator/consumer.h>
22#include <linux/slab.h>
23#include <linux/string.h>
24#include <linux/types.h>
25#include <linux/iio/iio.h>
26#include <linux/iio/sysfs.h>
27#include <linux/iio/buffer.h>
28#include <linux/iio/trigger.h>
29#include <linux/iio/trigger_consumer.h>
30#include <linux/iio/triggered_buffer.h>
31
32enum chip_ids {
33 BMA023,
34 BMA150,
35 BMA180,
36 BMA250,
37};
38
39struct bma180_data;
40
41struct bma180_part_info {
42 u8 chip_id;
43 const struct iio_chan_spec *channels;
44 unsigned int num_channels;
45 const int *scale_table;
46 unsigned int num_scales;
47 const int *bw_table;
48 unsigned int num_bw;
49 int temp_offset;
50
51 u8 int_reset_reg, int_reset_mask;
52 u8 sleep_reg, sleep_mask;
53 u8 bw_reg, bw_mask, bw_offset;
54 u8 scale_reg, scale_mask;
55 u8 power_reg, power_mask, lowpower_val;
56 u8 int_enable_reg, int_enable_mask;
57 u8 softreset_reg, softreset_val;
58
59 int (*chip_config)(struct bma180_data *data);
60 void (*chip_disable)(struct bma180_data *data);
61};
62
63/* Register set */
64#define BMA023_CTRL_REG0 0x0a
65#define BMA023_CTRL_REG1 0x0b
66#define BMA023_CTRL_REG2 0x14
67#define BMA023_CTRL_REG3 0x15
68
69#define BMA023_RANGE_MASK GENMASK(4, 3) /* Range of accel values */
70#define BMA023_BW_MASK GENMASK(2, 0) /* Accel bandwidth */
71#define BMA023_SLEEP BIT(0)
72#define BMA023_INT_RESET_MASK BIT(6)
73#define BMA023_NEW_DATA_INT BIT(5) /* Intr every new accel data is ready */
74#define BMA023_RESET_VAL BIT(1)
75
76#define BMA180_CHIP_ID 0x00 /* Need to distinguish BMA180 from other */
77#define BMA180_ACC_X_LSB 0x02 /* First of 6 registers of accel data */
78#define BMA180_TEMP 0x08
79#define BMA180_CTRL_REG0 0x0d
80#define BMA180_RESET 0x10
81#define BMA180_BW_TCS 0x20
82#define BMA180_CTRL_REG3 0x21
83#define BMA180_TCO_Z 0x30
84#define BMA180_OFFSET_LSB1 0x35
85
86/* BMA180_CTRL_REG0 bits */
87#define BMA180_DIS_WAKE_UP BIT(0) /* Disable wake up mode */
88#define BMA180_SLEEP BIT(1) /* 1 - chip will sleep */
89#define BMA180_EE_W BIT(4) /* Unlock writing to addr from 0x20 */
90#define BMA180_RESET_INT BIT(6) /* Reset pending interrupts */
91
92/* BMA180_CTRL_REG3 bits */
93#define BMA180_NEW_DATA_INT BIT(1) /* Intr every new accel data is ready */
94
95/* BMA180_OFFSET_LSB1 skipping mode bit */
96#define BMA180_SMP_SKIP BIT(0)
97
98/* Bit masks for registers bit fields */
99#define BMA180_RANGE 0x0e /* Range of measured accel values */
100#define BMA180_BW 0xf0 /* Accel bandwidth */
101#define BMA180_MODE_CONFIG 0x03 /* Config operation modes */
102
103/* We have to write this value in reset register to do soft reset */
104#define BMA180_RESET_VAL 0xb6
105
106#define BMA023_ID_REG_VAL 0x02
107#define BMA180_ID_REG_VAL 0x03
108#define BMA250_ID_REG_VAL 0x03
109
110/* Chip power modes */
111#define BMA180_LOW_POWER 0x03
112
113#define BMA250_RANGE_REG 0x0f
114#define BMA250_BW_REG 0x10
115#define BMA250_POWER_REG 0x11
116#define BMA250_RESET_REG 0x14
117#define BMA250_INT_ENABLE_REG 0x17
118#define BMA250_INT_MAP_REG 0x1a
119#define BMA250_INT_RESET_REG 0x21
120
121#define BMA250_RANGE_MASK GENMASK(3, 0) /* Range of accel values */
122#define BMA250_BW_MASK GENMASK(4, 0) /* Accel bandwidth */
123#define BMA250_BW_OFFSET 8
124#define BMA250_SUSPEND_MASK BIT(7) /* chip will sleep */
125#define BMA250_LOWPOWER_MASK BIT(6)
126#define BMA250_DATA_INTEN_MASK BIT(4)
127#define BMA250_INT1_DATA_MASK BIT(0)
128#define BMA250_INT_RESET_MASK BIT(7) /* Reset pending interrupts */
129
130struct bma180_data {
131 struct regulator *vdd_supply;
132 struct regulator *vddio_supply;
133 struct i2c_client *client;
134 struct iio_trigger *trig;
135 const struct bma180_part_info *part_info;
136 struct iio_mount_matrix orientation;
137 struct mutex mutex;
138 bool sleep_state;
139 int scale;
140 int bw;
141 bool pmode;
142};
143
144enum bma180_chan {
145 AXIS_X,
146 AXIS_Y,
147 AXIS_Z,
148 TEMP
149};
150
151static int bma023_bw_table[] = { 25, 50, 100, 190, 375, 750, 1500 }; /* Hz */
152static int bma023_scale_table[] = { 2452, 4903, 9709, };
153
154static int bma180_bw_table[] = { 10, 20, 40, 75, 150, 300 }; /* Hz */
155static int bma180_scale_table[] = { 1275, 1863, 2452, 3727, 4903, 9709, 19417 };
156
157static int bma250_bw_table[] = { 8, 16, 31, 63, 125, 250, 500, 1000 }; /* Hz */
158static int bma250_scale_table[] = { 0, 0, 0, 38344, 0, 76590, 0, 0, 153180, 0,
159 0, 0, 306458 };
160
161static int bma180_get_data_reg(struct bma180_data *data, enum bma180_chan chan)
162{
163 int ret;
164
165 if (data->sleep_state)
166 return -EBUSY;
167
168 switch (chan) {
169 case TEMP:
170 ret = i2c_smbus_read_byte_data(data->client, BMA180_TEMP);
171 if (ret < 0)
172 dev_err(&data->client->dev, "failed to read temp register\n");
173 break;
174 default:
175 ret = i2c_smbus_read_word_data(data->client,
176 BMA180_ACC_X_LSB + chan * 2);
177 if (ret < 0)
178 dev_err(&data->client->dev,
179 "failed to read accel_%c register\n",
180 'x' + chan);
181 }
182
183 return ret;
184}
185
186static int bma180_set_bits(struct bma180_data *data, u8 reg, u8 mask, u8 val)
187{
188 int ret = i2c_smbus_read_byte_data(data->client, reg);
189 u8 reg_val = (ret & ~mask) | (val << (ffs(mask) - 1));
190
191 if (ret < 0)
192 return ret;
193
194 return i2c_smbus_write_byte_data(data->client, reg, reg_val);
195}
196
197static int bma180_reset_intr(struct bma180_data *data)
198{
199 int ret = bma180_set_bits(data, data->part_info->int_reset_reg,
200 data->part_info->int_reset_mask, 1);
201
202 if (ret)
203 dev_err(&data->client->dev, "failed to reset interrupt\n");
204
205 return ret;
206}
207
208static int bma180_set_new_data_intr_state(struct bma180_data *data, bool state)
209{
210 int ret = bma180_set_bits(data, data->part_info->int_enable_reg,
211 data->part_info->int_enable_mask, state);
212 if (ret)
213 goto err;
214 ret = bma180_reset_intr(data);
215 if (ret)
216 goto err;
217
218 return 0;
219
220err:
221 dev_err(&data->client->dev,
222 "failed to set new data interrupt state %d\n", state);
223 return ret;
224}
225
226static int bma180_set_sleep_state(struct bma180_data *data, bool state)
227{
228 int ret = bma180_set_bits(data, data->part_info->sleep_reg,
229 data->part_info->sleep_mask, state);
230
231 if (ret) {
232 dev_err(&data->client->dev,
233 "failed to set sleep state %d\n", state);
234 return ret;
235 }
236 data->sleep_state = state;
237
238 return 0;
239}
240
241static int bma180_set_ee_writing_state(struct bma180_data *data, bool state)
242{
243 int ret = bma180_set_bits(data, BMA180_CTRL_REG0, BMA180_EE_W, state);
244
245 if (ret)
246 dev_err(&data->client->dev,
247 "failed to set ee writing state %d\n", state);
248
249 return ret;
250}
251
252static int bma180_set_bw(struct bma180_data *data, int val)
253{
254 int ret, i;
255
256 if (data->sleep_state)
257 return -EBUSY;
258
259 for (i = 0; i < data->part_info->num_bw; ++i) {
260 if (data->part_info->bw_table[i] == val) {
261 ret = bma180_set_bits(data, data->part_info->bw_reg,
262 data->part_info->bw_mask,
263 i + data->part_info->bw_offset);
264 if (ret) {
265 dev_err(&data->client->dev,
266 "failed to set bandwidth\n");
267 return ret;
268 }
269 data->bw = val;
270 return 0;
271 }
272 }
273
274 return -EINVAL;
275}
276
277static int bma180_set_scale(struct bma180_data *data, int val)
278{
279 int ret, i;
280
281 if (data->sleep_state)
282 return -EBUSY;
283
284 for (i = 0; i < data->part_info->num_scales; ++i)
285 if (data->part_info->scale_table[i] == val) {
286 ret = bma180_set_bits(data, data->part_info->scale_reg,
287 data->part_info->scale_mask, i);
288 if (ret) {
289 dev_err(&data->client->dev,
290 "failed to set scale\n");
291 return ret;
292 }
293 data->scale = val;
294 return 0;
295 }
296
297 return -EINVAL;
298}
299
300static int bma180_set_pmode(struct bma180_data *data, bool mode)
301{
302 u8 reg_val = mode ? data->part_info->lowpower_val : 0;
303 int ret = bma180_set_bits(data, data->part_info->power_reg,
304 data->part_info->power_mask, reg_val);
305
306 if (ret) {
307 dev_err(&data->client->dev, "failed to set power mode\n");
308 return ret;
309 }
310 data->pmode = mode;
311
312 return 0;
313}
314
315static int bma180_soft_reset(struct bma180_data *data)
316{
317 int ret = i2c_smbus_write_byte_data(data->client,
318 data->part_info->softreset_reg,
319 data->part_info->softreset_val);
320
321 if (ret)
322 dev_err(&data->client->dev, "failed to reset the chip\n");
323
324 return ret;
325}
326
327static int bma180_chip_init(struct bma180_data *data)
328{
329 /* Try to read chip_id register. It must return 0x03. */
330 int ret = i2c_smbus_read_byte_data(data->client, BMA180_CHIP_ID);
331
332 if (ret < 0)
333 return ret;
334 if (ret != data->part_info->chip_id) {
335 dev_err(&data->client->dev, "wrong chip ID %d expected %d\n",
336 ret, data->part_info->chip_id);
337 return -ENODEV;
338 }
339
340 ret = bma180_soft_reset(data);
341 if (ret)
342 return ret;
343 /*
344 * No serial transaction should occur within minimum 10 us
345 * after soft_reset command
346 */
347 msleep(20);
348
349 return bma180_set_new_data_intr_state(data, false);
350}
351
352static int bma023_chip_config(struct bma180_data *data)
353{
354 int ret = bma180_chip_init(data);
355
356 if (ret)
357 goto err;
358
359 ret = bma180_set_bw(data, 50); /* 50 Hz */
360 if (ret)
361 goto err;
362 ret = bma180_set_scale(data, 2452); /* 2 G */
363 if (ret)
364 goto err;
365
366 return 0;
367
368err:
369 dev_err(&data->client->dev, "failed to config the chip\n");
370 return ret;
371}
372
373static int bma180_chip_config(struct bma180_data *data)
374{
375 int ret = bma180_chip_init(data);
376
377 if (ret)
378 goto err;
379 ret = bma180_set_pmode(data, false);
380 if (ret)
381 goto err;
382 ret = bma180_set_bits(data, BMA180_CTRL_REG0, BMA180_DIS_WAKE_UP, 1);
383 if (ret)
384 goto err;
385 ret = bma180_set_ee_writing_state(data, true);
386 if (ret)
387 goto err;
388 ret = bma180_set_bits(data, BMA180_OFFSET_LSB1, BMA180_SMP_SKIP, 1);
389 if (ret)
390 goto err;
391 ret = bma180_set_bw(data, 20); /* 20 Hz */
392 if (ret)
393 goto err;
394 ret = bma180_set_scale(data, 2452); /* 2 G */
395 if (ret)
396 goto err;
397
398 return 0;
399
400err:
401 dev_err(&data->client->dev, "failed to config the chip\n");
402 return ret;
403}
404
405static int bma250_chip_config(struct bma180_data *data)
406{
407 int ret = bma180_chip_init(data);
408
409 if (ret)
410 goto err;
411 ret = bma180_set_pmode(data, false);
412 if (ret)
413 goto err;
414 ret = bma180_set_bw(data, 16); /* 16 Hz */
415 if (ret)
416 goto err;
417 ret = bma180_set_scale(data, 38344); /* 2 G */
418 if (ret)
419 goto err;
420 /*
421 * This enables dataready interrupt on the INT1 pin
422 * FIXME: support using the INT2 pin
423 */
424 ret = bma180_set_bits(data, BMA250_INT_MAP_REG, BMA250_INT1_DATA_MASK, 1);
425 if (ret)
426 goto err;
427
428 return 0;
429
430err:
431 dev_err(&data->client->dev, "failed to config the chip\n");
432 return ret;
433}
434
435static void bma023_chip_disable(struct bma180_data *data)
436{
437 if (bma180_set_sleep_state(data, true))
438 goto err;
439
440 return;
441
442err:
443 dev_err(&data->client->dev, "failed to disable the chip\n");
444}
445
446static void bma180_chip_disable(struct bma180_data *data)
447{
448 if (bma180_set_new_data_intr_state(data, false))
449 goto err;
450 if (bma180_set_ee_writing_state(data, false))
451 goto err;
452 if (bma180_set_sleep_state(data, true))
453 goto err;
454
455 return;
456
457err:
458 dev_err(&data->client->dev, "failed to disable the chip\n");
459}
460
461static void bma250_chip_disable(struct bma180_data *data)
462{
463 if (bma180_set_new_data_intr_state(data, false))
464 goto err;
465 if (bma180_set_sleep_state(data, true))
466 goto err;
467
468 return;
469
470err:
471 dev_err(&data->client->dev, "failed to disable the chip\n");
472}
473
474static ssize_t bma180_show_avail(char *buf, const int *vals, unsigned int n,
475 bool micros)
476{
477 size_t len = 0;
478 int i;
479
480 for (i = 0; i < n; i++) {
481 if (!vals[i])
482 continue;
483 len += scnprintf(buf + len, PAGE_SIZE - len,
484 micros ? "0.%06d " : "%d ", vals[i]);
485 }
486 buf[len - 1] = '\n';
487
488 return len;
489}
490
491static ssize_t bma180_show_filter_freq_avail(struct device *dev,
492 struct device_attribute *attr, char *buf)
493{
494 struct bma180_data *data = iio_priv(dev_to_iio_dev(dev));
495
496 return bma180_show_avail(buf, data->part_info->bw_table,
497 data->part_info->num_bw, false);
498}
499
500static ssize_t bma180_show_scale_avail(struct device *dev,
501 struct device_attribute *attr, char *buf)
502{
503 struct bma180_data *data = iio_priv(dev_to_iio_dev(dev));
504
505 return bma180_show_avail(buf, data->part_info->scale_table,
506 data->part_info->num_scales, true);
507}
508
509static IIO_DEVICE_ATTR(in_accel_filter_low_pass_3db_frequency_available,
510 S_IRUGO, bma180_show_filter_freq_avail, NULL, 0);
511
512static IIO_DEVICE_ATTR(in_accel_scale_available,
513 S_IRUGO, bma180_show_scale_avail, NULL, 0);
514
515static struct attribute *bma180_attributes[] = {
516 &iio_dev_attr_in_accel_filter_low_pass_3db_frequency_available.
517 dev_attr.attr,
518 &iio_dev_attr_in_accel_scale_available.dev_attr.attr,
519 NULL,
520};
521
522static const struct attribute_group bma180_attrs_group = {
523 .attrs = bma180_attributes,
524};
525
526static int bma180_read_raw(struct iio_dev *indio_dev,
527 struct iio_chan_spec const *chan, int *val, int *val2,
528 long mask)
529{
530 struct bma180_data *data = iio_priv(indio_dev);
531 int ret;
532
533 switch (mask) {
534 case IIO_CHAN_INFO_RAW:
535 if (!iio_device_claim_direct(indio_dev))
536 return -EBUSY;
537
538 mutex_lock(&data->mutex);
539 ret = bma180_get_data_reg(data, chan->scan_index);
540 mutex_unlock(&data->mutex);
541 iio_device_release_direct(indio_dev);
542 if (ret < 0)
543 return ret;
544 if (chan->scan_type.sign == 's') {
545 *val = sign_extend32(ret >> chan->scan_type.shift,
546 chan->scan_type.realbits - 1);
547 } else {
548 *val = ret;
549 }
550 return IIO_VAL_INT;
551 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
552 *val = data->bw;
553 return IIO_VAL_INT;
554 case IIO_CHAN_INFO_SCALE:
555 switch (chan->type) {
556 case IIO_ACCEL:
557 *val = 0;
558 *val2 = data->scale;
559 return IIO_VAL_INT_PLUS_MICRO;
560 case IIO_TEMP:
561 *val = 500;
562 return IIO_VAL_INT;
563 default:
564 return -EINVAL;
565 }
566 case IIO_CHAN_INFO_OFFSET:
567 *val = data->part_info->temp_offset;
568 return IIO_VAL_INT;
569 default:
570 return -EINVAL;
571 }
572}
573
574static int bma180_write_raw(struct iio_dev *indio_dev,
575 struct iio_chan_spec const *chan, int val, int val2, long mask)
576{
577 struct bma180_data *data = iio_priv(indio_dev);
578 int ret;
579
580 switch (mask) {
581 case IIO_CHAN_INFO_SCALE:
582 if (val)
583 return -EINVAL;
584 mutex_lock(&data->mutex);
585 ret = bma180_set_scale(data, val2);
586 mutex_unlock(&data->mutex);
587 return ret;
588 case IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY:
589 if (val2)
590 return -EINVAL;
591 mutex_lock(&data->mutex);
592 ret = bma180_set_bw(data, val);
593 mutex_unlock(&data->mutex);
594 return ret;
595 default:
596 return -EINVAL;
597 }
598}
599
600static const struct iio_info bma180_info = {
601 .attrs = &bma180_attrs_group,
602 .read_raw = bma180_read_raw,
603 .write_raw = bma180_write_raw,
604};
605
606static const char * const bma180_power_modes[] = { "low_noise", "low_power" };
607
608static int bma180_get_power_mode(struct iio_dev *indio_dev,
609 const struct iio_chan_spec *chan)
610{
611 struct bma180_data *data = iio_priv(indio_dev);
612
613 return data->pmode;
614}
615
616static int bma180_set_power_mode(struct iio_dev *indio_dev,
617 const struct iio_chan_spec *chan, unsigned int mode)
618{
619 struct bma180_data *data = iio_priv(indio_dev);
620 int ret;
621
622 mutex_lock(&data->mutex);
623 ret = bma180_set_pmode(data, mode);
624 mutex_unlock(&data->mutex);
625
626 return ret;
627}
628
629static const struct iio_mount_matrix *
630bma180_accel_get_mount_matrix(const struct iio_dev *indio_dev,
631 const struct iio_chan_spec *chan)
632{
633 struct bma180_data *data = iio_priv(indio_dev);
634
635 return &data->orientation;
636}
637
638static const struct iio_enum bma180_power_mode_enum = {
639 .items = bma180_power_modes,
640 .num_items = ARRAY_SIZE(bma180_power_modes),
641 .get = bma180_get_power_mode,
642 .set = bma180_set_power_mode,
643};
644
645static const struct iio_chan_spec_ext_info bma023_ext_info[] = {
646 IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, bma180_accel_get_mount_matrix),
647 { }
648};
649
650static const struct iio_chan_spec_ext_info bma180_ext_info[] = {
651 IIO_ENUM("power_mode", IIO_SHARED_BY_TYPE, &bma180_power_mode_enum),
652 IIO_ENUM_AVAILABLE("power_mode", IIO_SHARED_BY_TYPE, &bma180_power_mode_enum),
653 IIO_MOUNT_MATRIX(IIO_SHARED_BY_DIR, bma180_accel_get_mount_matrix),
654 { }
655};
656
657#define BMA023_ACC_CHANNEL(_axis, _bits) { \
658 .type = IIO_ACCEL, \
659 .modified = 1, \
660 .channel2 = IIO_MOD_##_axis, \
661 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
662 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
663 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
664 .scan_index = AXIS_##_axis, \
665 .scan_type = { \
666 .sign = 's', \
667 .realbits = _bits, \
668 .storagebits = 16, \
669 .shift = 16 - _bits, \
670 }, \
671 .ext_info = bma023_ext_info, \
672}
673
674#define BMA150_TEMP_CHANNEL { \
675 .type = IIO_TEMP, \
676 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
677 BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET), \
678 .scan_index = TEMP, \
679 .scan_type = { \
680 .sign = 'u', \
681 .realbits = 8, \
682 .storagebits = 16, \
683 }, \
684}
685
686#define BMA180_ACC_CHANNEL(_axis, _bits) { \
687 .type = IIO_ACCEL, \
688 .modified = 1, \
689 .channel2 = IIO_MOD_##_axis, \
690 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
691 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
692 BIT(IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY), \
693 .scan_index = AXIS_##_axis, \
694 .scan_type = { \
695 .sign = 's', \
696 .realbits = _bits, \
697 .storagebits = 16, \
698 .shift = 16 - _bits, \
699 }, \
700 .ext_info = bma180_ext_info, \
701}
702
703#define BMA180_TEMP_CHANNEL { \
704 .type = IIO_TEMP, \
705 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \
706 BIT(IIO_CHAN_INFO_SCALE) | BIT(IIO_CHAN_INFO_OFFSET), \
707 .scan_index = TEMP, \
708 .scan_type = { \
709 .sign = 's', \
710 .realbits = 8, \
711 .storagebits = 16, \
712 }, \
713}
714
715static const struct iio_chan_spec bma023_channels[] = {
716 BMA023_ACC_CHANNEL(X, 10),
717 BMA023_ACC_CHANNEL(Y, 10),
718 BMA023_ACC_CHANNEL(Z, 10),
719 IIO_CHAN_SOFT_TIMESTAMP(4),
720};
721
722static const struct iio_chan_spec bma150_channels[] = {
723 BMA023_ACC_CHANNEL(X, 10),
724 BMA023_ACC_CHANNEL(Y, 10),
725 BMA023_ACC_CHANNEL(Z, 10),
726 BMA150_TEMP_CHANNEL,
727 IIO_CHAN_SOFT_TIMESTAMP(4),
728};
729
730static const struct iio_chan_spec bma180_channels[] = {
731 BMA180_ACC_CHANNEL(X, 14),
732 BMA180_ACC_CHANNEL(Y, 14),
733 BMA180_ACC_CHANNEL(Z, 14),
734 BMA180_TEMP_CHANNEL,
735 IIO_CHAN_SOFT_TIMESTAMP(4),
736};
737
738static const struct iio_chan_spec bma250_channels[] = {
739 BMA180_ACC_CHANNEL(X, 10),
740 BMA180_ACC_CHANNEL(Y, 10),
741 BMA180_ACC_CHANNEL(Z, 10),
742 BMA180_TEMP_CHANNEL,
743 IIO_CHAN_SOFT_TIMESTAMP(4),
744};
745
746static const struct bma180_part_info bma180_part_info[] = {
747 [BMA023] = {
748 .chip_id = BMA023_ID_REG_VAL,
749 .channels = bma023_channels,
750 .num_channels = ARRAY_SIZE(bma023_channels),
751 .scale_table = bma023_scale_table,
752 .num_scales = ARRAY_SIZE(bma023_scale_table),
753 .bw_table = bma023_bw_table,
754 .num_bw = ARRAY_SIZE(bma023_bw_table),
755 /* No temperature channel */
756 .temp_offset = 0,
757 .int_reset_reg = BMA023_CTRL_REG0,
758 .int_reset_mask = BMA023_INT_RESET_MASK,
759 .sleep_reg = BMA023_CTRL_REG0,
760 .sleep_mask = BMA023_SLEEP,
761 .bw_reg = BMA023_CTRL_REG2,
762 .bw_mask = BMA023_BW_MASK,
763 .scale_reg = BMA023_CTRL_REG2,
764 .scale_mask = BMA023_RANGE_MASK,
765 /* No power mode on bma023 */
766 .power_reg = 0,
767 .power_mask = 0,
768 .lowpower_val = 0,
769 .int_enable_reg = BMA023_CTRL_REG3,
770 .int_enable_mask = BMA023_NEW_DATA_INT,
771 .softreset_reg = BMA023_CTRL_REG0,
772 .softreset_val = BMA023_RESET_VAL,
773 .chip_config = bma023_chip_config,
774 .chip_disable = bma023_chip_disable,
775 },
776 [BMA150] = {
777 .chip_id = BMA023_ID_REG_VAL,
778 .channels = bma150_channels,
779 .num_channels = ARRAY_SIZE(bma150_channels),
780 .scale_table = bma023_scale_table,
781 .num_scales = ARRAY_SIZE(bma023_scale_table),
782 .bw_table = bma023_bw_table,
783 .num_bw = ARRAY_SIZE(bma023_bw_table),
784 .temp_offset = -60, /* 0 LSB @ -30 degree C */
785 .int_reset_reg = BMA023_CTRL_REG0,
786 .int_reset_mask = BMA023_INT_RESET_MASK,
787 .sleep_reg = BMA023_CTRL_REG0,
788 .sleep_mask = BMA023_SLEEP,
789 .bw_reg = BMA023_CTRL_REG2,
790 .bw_mask = BMA023_BW_MASK,
791 .scale_reg = BMA023_CTRL_REG2,
792 .scale_mask = BMA023_RANGE_MASK,
793 /* No power mode on bma150 */
794 .power_reg = 0,
795 .power_mask = 0,
796 .lowpower_val = 0,
797 .int_enable_reg = BMA023_CTRL_REG3,
798 .int_enable_mask = BMA023_NEW_DATA_INT,
799 .softreset_reg = BMA023_CTRL_REG0,
800 .softreset_val = BMA023_RESET_VAL,
801 .chip_config = bma023_chip_config,
802 .chip_disable = bma023_chip_disable,
803 },
804 [BMA180] = {
805 .chip_id = BMA180_ID_REG_VAL,
806 .channels = bma180_channels,
807 .num_channels = ARRAY_SIZE(bma180_channels),
808 .scale_table = bma180_scale_table,
809 .num_scales = ARRAY_SIZE(bma180_scale_table),
810 .bw_table = bma180_bw_table,
811 .num_bw = ARRAY_SIZE(bma180_bw_table),
812 .temp_offset = 48, /* 0 LSB @ 24 degree C */
813 .int_reset_reg = BMA180_CTRL_REG0,
814 .int_reset_mask = BMA180_RESET_INT,
815 .sleep_reg = BMA180_CTRL_REG0,
816 .sleep_mask = BMA180_SLEEP,
817 .bw_reg = BMA180_BW_TCS,
818 .bw_mask = BMA180_BW,
819 .scale_reg = BMA180_OFFSET_LSB1,
820 .scale_mask = BMA180_RANGE,
821 .power_reg = BMA180_TCO_Z,
822 .power_mask = BMA180_MODE_CONFIG,
823 .lowpower_val = BMA180_LOW_POWER,
824 .int_enable_reg = BMA180_CTRL_REG3,
825 .int_enable_mask = BMA180_NEW_DATA_INT,
826 .softreset_reg = BMA180_RESET,
827 .softreset_val = BMA180_RESET_VAL,
828 .chip_config = bma180_chip_config,
829 .chip_disable = bma180_chip_disable,
830 },
831 [BMA250] = {
832 .chip_id = BMA250_ID_REG_VAL,
833 .channels = bma250_channels,
834 .num_channels = ARRAY_SIZE(bma250_channels),
835 .scale_table = bma250_scale_table,
836 .num_scales = ARRAY_SIZE(bma250_scale_table),
837 .bw_table = bma250_bw_table,
838 .num_bw = ARRAY_SIZE(bma250_bw_table),
839 .temp_offset = 48, /* 0 LSB @ 24 degree C */
840 .int_reset_reg = BMA250_INT_RESET_REG,
841 .int_reset_mask = BMA250_INT_RESET_MASK,
842 .sleep_reg = BMA250_POWER_REG,
843 .sleep_mask = BMA250_SUSPEND_MASK,
844 .bw_reg = BMA250_BW_REG,
845 .bw_mask = BMA250_BW_MASK,
846 .bw_offset = BMA250_BW_OFFSET,
847 .scale_reg = BMA250_RANGE_REG,
848 .scale_mask = BMA250_RANGE_MASK,
849 .power_reg = BMA250_POWER_REG,
850 .power_mask = BMA250_LOWPOWER_MASK,
851 .lowpower_val = 1,
852 .int_enable_reg = BMA250_INT_ENABLE_REG,
853 .int_enable_mask = BMA250_DATA_INTEN_MASK,
854 .softreset_reg = BMA250_RESET_REG,
855 .softreset_val = BMA180_RESET_VAL,
856 .chip_config = bma250_chip_config,
857 .chip_disable = bma250_chip_disable,
858 },
859};
860
861static irqreturn_t bma180_trigger_handler(int irq, void *p)
862{
863 struct iio_poll_func *pf = p;
864 struct iio_dev *indio_dev = pf->indio_dev;
865 struct bma180_data *data = iio_priv(indio_dev);
866 s64 time_ns = iio_get_time_ns(indio_dev);
867 int bit, ret, i = 0;
868 struct {
869 s16 chan[4];
870 aligned_s64 timestamp;
871 } scan = { };
872
873 mutex_lock(&data->mutex);
874
875 iio_for_each_active_channel(indio_dev, bit) {
876 ret = bma180_get_data_reg(data, bit);
877 if (ret < 0) {
878 mutex_unlock(&data->mutex);
879 goto err;
880 }
881 scan.chan[i++] = ret;
882 }
883
884 mutex_unlock(&data->mutex);
885
886 iio_push_to_buffers_with_ts(indio_dev, &scan, sizeof(scan), time_ns);
887err:
888 iio_trigger_notify_done(indio_dev->trig);
889
890 return IRQ_HANDLED;
891}
892
893static int bma180_data_rdy_trigger_set_state(struct iio_trigger *trig,
894 bool state)
895{
896 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
897 struct bma180_data *data = iio_priv(indio_dev);
898
899 return bma180_set_new_data_intr_state(data, state);
900}
901
902static void bma180_trig_reen(struct iio_trigger *trig)
903{
904 struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
905 struct bma180_data *data = iio_priv(indio_dev);
906 int ret;
907
908 ret = bma180_reset_intr(data);
909 if (ret)
910 dev_err(&data->client->dev, "failed to reset interrupt\n");
911}
912
913static const struct iio_trigger_ops bma180_trigger_ops = {
914 .set_trigger_state = bma180_data_rdy_trigger_set_state,
915 .reenable = bma180_trig_reen,
916};
917
918static int bma180_probe(struct i2c_client *client)
919{
920 const struct i2c_device_id *id = i2c_client_get_device_id(client);
921 struct device *dev = &client->dev;
922 struct bma180_data *data;
923 struct iio_dev *indio_dev;
924 int ret;
925
926 indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
927 if (!indio_dev)
928 return -ENOMEM;
929
930 data = iio_priv(indio_dev);
931 i2c_set_clientdata(client, indio_dev);
932 data->client = client;
933 data->part_info = i2c_get_match_data(client);
934
935 ret = iio_read_mount_matrix(dev, &data->orientation);
936 if (ret)
937 return ret;
938
939 data->vdd_supply = devm_regulator_get(dev, "vdd");
940 if (IS_ERR(data->vdd_supply))
941 return dev_err_probe(dev, PTR_ERR(data->vdd_supply),
942 "Failed to get vdd regulator\n");
943
944 data->vddio_supply = devm_regulator_get(dev, "vddio");
945 if (IS_ERR(data->vddio_supply))
946 return dev_err_probe(dev, PTR_ERR(data->vddio_supply),
947 "Failed to get vddio regulator\n");
948
949 /* Typical voltage 2.4V these are min and max */
950 ret = regulator_set_voltage(data->vdd_supply, 1620000, 3600000);
951 if (ret)
952 return ret;
953 ret = regulator_set_voltage(data->vddio_supply, 1200000, 3600000);
954 if (ret)
955 return ret;
956 ret = regulator_enable(data->vdd_supply);
957 if (ret) {
958 dev_err(dev, "Failed to enable vdd regulator: %d\n", ret);
959 return ret;
960 }
961 ret = regulator_enable(data->vddio_supply);
962 if (ret) {
963 dev_err(dev, "Failed to enable vddio regulator: %d\n", ret);
964 goto err_disable_vdd;
965 }
966 /* Wait to make sure we started up properly (3 ms at least) */
967 usleep_range(3000, 5000);
968
969 ret = data->part_info->chip_config(data);
970 if (ret < 0)
971 goto err_chip_disable;
972
973 mutex_init(&data->mutex);
974 indio_dev->channels = data->part_info->channels;
975 indio_dev->num_channels = data->part_info->num_channels;
976 indio_dev->name = id->name;
977 indio_dev->modes = INDIO_DIRECT_MODE;
978 indio_dev->info = &bma180_info;
979
980 if (client->irq > 0) {
981 data->trig = iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name,
982 iio_device_id(indio_dev));
983 if (!data->trig) {
984 ret = -ENOMEM;
985 goto err_chip_disable;
986 }
987
988 ret = devm_request_irq(dev, client->irq,
989 iio_trigger_generic_data_rdy_poll, IRQF_TRIGGER_RISING,
990 "bma180_event", data->trig);
991 if (ret) {
992 dev_err(dev, "unable to request IRQ\n");
993 goto err_trigger_free;
994 }
995
996 data->trig->ops = &bma180_trigger_ops;
997 iio_trigger_set_drvdata(data->trig, indio_dev);
998
999 ret = iio_trigger_register(data->trig);
1000 if (ret)
1001 goto err_trigger_free;
1002
1003 indio_dev->trig = iio_trigger_get(data->trig);
1004 }
1005
1006 ret = iio_triggered_buffer_setup(indio_dev, NULL,
1007 bma180_trigger_handler, NULL);
1008 if (ret < 0) {
1009 dev_err(dev, "unable to setup iio triggered buffer\n");
1010 goto err_trigger_unregister;
1011 }
1012
1013 ret = iio_device_register(indio_dev);
1014 if (ret < 0) {
1015 dev_err(dev, "unable to register iio device\n");
1016 goto err_buffer_cleanup;
1017 }
1018
1019 return 0;
1020
1021err_buffer_cleanup:
1022 iio_triggered_buffer_cleanup(indio_dev);
1023err_trigger_unregister:
1024 if (data->trig)
1025 iio_trigger_unregister(data->trig);
1026err_trigger_free:
1027 iio_trigger_free(data->trig);
1028err_chip_disable:
1029 data->part_info->chip_disable(data);
1030 regulator_disable(data->vddio_supply);
1031err_disable_vdd:
1032 regulator_disable(data->vdd_supply);
1033
1034 return ret;
1035}
1036
1037static void bma180_remove(struct i2c_client *client)
1038{
1039 struct iio_dev *indio_dev = i2c_get_clientdata(client);
1040 struct bma180_data *data = iio_priv(indio_dev);
1041
1042 iio_device_unregister(indio_dev);
1043 iio_triggered_buffer_cleanup(indio_dev);
1044 if (data->trig) {
1045 iio_trigger_unregister(data->trig);
1046 iio_trigger_free(data->trig);
1047 }
1048
1049 mutex_lock(&data->mutex);
1050 data->part_info->chip_disable(data);
1051 mutex_unlock(&data->mutex);
1052 regulator_disable(data->vddio_supply);
1053 regulator_disable(data->vdd_supply);
1054}
1055
1056static int bma180_suspend(struct device *dev)
1057{
1058 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1059 struct bma180_data *data = iio_priv(indio_dev);
1060 int ret;
1061
1062 mutex_lock(&data->mutex);
1063 ret = bma180_set_sleep_state(data, true);
1064 mutex_unlock(&data->mutex);
1065
1066 return ret;
1067}
1068
1069static int bma180_resume(struct device *dev)
1070{
1071 struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
1072 struct bma180_data *data = iio_priv(indio_dev);
1073 int ret;
1074
1075 mutex_lock(&data->mutex);
1076 ret = bma180_set_sleep_state(data, false);
1077 mutex_unlock(&data->mutex);
1078
1079 return ret;
1080}
1081
1082static DEFINE_SIMPLE_DEV_PM_OPS(bma180_pm_ops, bma180_suspend, bma180_resume);
1083
1084static const struct i2c_device_id bma180_ids[] = {
1085 { "bma023", (kernel_ulong_t)&bma180_part_info[BMA023] },
1086 { "bma150", (kernel_ulong_t)&bma180_part_info[BMA150] },
1087 { "bma180", (kernel_ulong_t)&bma180_part_info[BMA180] },
1088 { "bma250", (kernel_ulong_t)&bma180_part_info[BMA250] },
1089 { "smb380", (kernel_ulong_t)&bma180_part_info[BMA150] },
1090 { }
1091};
1092
1093MODULE_DEVICE_TABLE(i2c, bma180_ids);
1094
1095static const struct of_device_id bma180_of_match[] = {
1096 {
1097 .compatible = "bosch,bma023",
1098 .data = &bma180_part_info[BMA023]
1099 },
1100 {
1101 .compatible = "bosch,bma150",
1102 .data = &bma180_part_info[BMA150]
1103 },
1104 {
1105 .compatible = "bosch,bma180",
1106 .data = &bma180_part_info[BMA180]
1107 },
1108 {
1109 .compatible = "bosch,bma250",
1110 .data = &bma180_part_info[BMA250]
1111 },
1112 {
1113 .compatible = "bosch,smb380",
1114 .data = &bma180_part_info[BMA150]
1115 },
1116 { }
1117};
1118MODULE_DEVICE_TABLE(of, bma180_of_match);
1119
1120static struct i2c_driver bma180_driver = {
1121 .driver = {
1122 .name = "bma180",
1123 .pm = pm_sleep_ptr(&bma180_pm_ops),
1124 .of_match_table = bma180_of_match,
1125 },
1126 .probe = bma180_probe,
1127 .remove = bma180_remove,
1128 .id_table = bma180_ids,
1129};
1130
1131module_i2c_driver(bma180_driver);
1132
1133MODULE_AUTHOR("Kravchenko Oleksandr <x0199363@ti.com>");
1134MODULE_AUTHOR("Texas Instruments, Inc.");
1135MODULE_DESCRIPTION("Bosch BMA023/BMA1x0/BMA250 triaxial acceleration sensor");
1136MODULE_LICENSE("GPL");