2 * BMI160 - Bosch IMU (accel, gyro plus external magnetometer)
4 * Copyright (c) 2016, Intel Corporation.
6 * This file is subject to the terms and conditions of version 2 of
7 * the GNU General Public License. See the file COPYING in the main
8 * directory of this archive for more details.
10 * IIO core driver for BMI160, with support for I2C/SPI busses
12 * TODO: magnetometer, interrupts, hardware FIFO
14 #include <linux/module.h>
15 #include <linux/regmap.h>
16 #include <linux/acpi.h>
17 #include <linux/delay.h>
19 #include <linux/iio/iio.h>
20 #include <linux/iio/triggered_buffer.h>
21 #include <linux/iio/trigger_consumer.h>
22 #include <linux/iio/buffer.h>
23 #include <linux/iio/sysfs.h>
27 #define BMI160_REG_CHIP_ID 0x00
28 #define BMI160_CHIP_ID_VAL 0xD1
30 #define BMI160_REG_PMU_STATUS 0x03
32 /* X axis data low byte address, the rest can be obtained using axis offset */
33 #define BMI160_REG_DATA_MAGN_XOUT_L 0x04
34 #define BMI160_REG_DATA_GYRO_XOUT_L 0x0C
35 #define BMI160_REG_DATA_ACCEL_XOUT_L 0x12
37 #define BMI160_REG_ACCEL_CONFIG 0x40
38 #define BMI160_ACCEL_CONFIG_ODR_MASK GENMASK(3, 0)
39 #define BMI160_ACCEL_CONFIG_BWP_MASK GENMASK(6, 4)
41 #define BMI160_REG_ACCEL_RANGE 0x41
42 #define BMI160_ACCEL_RANGE_2G 0x03
43 #define BMI160_ACCEL_RANGE_4G 0x05
44 #define BMI160_ACCEL_RANGE_8G 0x08
45 #define BMI160_ACCEL_RANGE_16G 0x0C
47 #define BMI160_REG_GYRO_CONFIG 0x42
48 #define BMI160_GYRO_CONFIG_ODR_MASK GENMASK(3, 0)
49 #define BMI160_GYRO_CONFIG_BWP_MASK GENMASK(5, 4)
51 #define BMI160_REG_GYRO_RANGE 0x43
52 #define BMI160_GYRO_RANGE_2000DPS 0x00
53 #define BMI160_GYRO_RANGE_1000DPS 0x01
54 #define BMI160_GYRO_RANGE_500DPS 0x02
55 #define BMI160_GYRO_RANGE_250DPS 0x03
56 #define BMI160_GYRO_RANGE_125DPS 0x04
58 #define BMI160_REG_CMD 0x7E
59 #define BMI160_CMD_ACCEL_PM_SUSPEND 0x10
60 #define BMI160_CMD_ACCEL_PM_NORMAL 0x11
61 #define BMI160_CMD_ACCEL_PM_LOW_POWER 0x12
62 #define BMI160_CMD_GYRO_PM_SUSPEND 0x14
63 #define BMI160_CMD_GYRO_PM_NORMAL 0x15
64 #define BMI160_CMD_GYRO_PM_FAST_STARTUP 0x17
65 #define BMI160_CMD_SOFTRESET 0xB6
67 #define BMI160_REG_DUMMY 0x7F
69 #define BMI160_ACCEL_PMU_MIN_USLEEP 3200
70 #define BMI160_ACCEL_PMU_MAX_USLEEP 3800
71 #define BMI160_GYRO_PMU_MIN_USLEEP 55000
72 #define BMI160_GYRO_PMU_MAX_USLEEP 80000
73 #define BMI160_SOFTRESET_USLEEP 1000
75 #define BMI160_CHANNEL(_type, _axis, _index) { \
78 .channel2 = IIO_MOD_##_axis, \
79 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
80 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
81 BIT(IIO_CHAN_INFO_SAMP_FREQ), \
82 .scan_index = _index, \
87 .endianness = IIO_LE, \
91 /* scan indexes follow DATA register order */
92 enum bmi160_scan_axis
{
93 BMI160_SCAN_EXT_MAGN_X
= 0,
94 BMI160_SCAN_EXT_MAGN_Y
,
95 BMI160_SCAN_EXT_MAGN_Z
,
103 BMI160_SCAN_TIMESTAMP
,
106 enum bmi160_sensor_type
{
110 BMI160_NUM_SENSORS
/* must be last */
114 struct regmap
*regmap
;
117 const struct regmap_config bmi160_regmap_config
= {
121 EXPORT_SYMBOL(bmi160_regmap_config
);
124 u8 data
; /* LSB byte register for X-axis */
133 static struct bmi160_regs bmi160_regs
[] = {
135 .data
= BMI160_REG_DATA_ACCEL_XOUT_L
,
136 .config
= BMI160_REG_ACCEL_CONFIG
,
137 .config_odr_mask
= BMI160_ACCEL_CONFIG_ODR_MASK
,
138 .config_bwp_mask
= BMI160_ACCEL_CONFIG_BWP_MASK
,
139 .range
= BMI160_REG_ACCEL_RANGE
,
140 .pmu_cmd_normal
= BMI160_CMD_ACCEL_PM_NORMAL
,
141 .pmu_cmd_suspend
= BMI160_CMD_ACCEL_PM_SUSPEND
,
144 .data
= BMI160_REG_DATA_GYRO_XOUT_L
,
145 .config
= BMI160_REG_GYRO_CONFIG
,
146 .config_odr_mask
= BMI160_GYRO_CONFIG_ODR_MASK
,
147 .config_bwp_mask
= BMI160_GYRO_CONFIG_BWP_MASK
,
148 .range
= BMI160_REG_GYRO_RANGE
,
149 .pmu_cmd_normal
= BMI160_CMD_GYRO_PM_NORMAL
,
150 .pmu_cmd_suspend
= BMI160_CMD_GYRO_PM_SUSPEND
,
154 struct bmi160_pmu_time
{
159 static struct bmi160_pmu_time bmi160_pmu_time
[] = {
161 .min
= BMI160_ACCEL_PMU_MIN_USLEEP
,
162 .max
= BMI160_ACCEL_PMU_MAX_USLEEP
165 .min
= BMI160_GYRO_PMU_MIN_USLEEP
,
166 .max
= BMI160_GYRO_PMU_MIN_USLEEP
,
170 struct bmi160_scale
{
181 static const struct bmi160_scale bmi160_accel_scale
[] = {
182 { BMI160_ACCEL_RANGE_2G
, 598},
183 { BMI160_ACCEL_RANGE_4G
, 1197},
184 { BMI160_ACCEL_RANGE_8G
, 2394},
185 { BMI160_ACCEL_RANGE_16G
, 4788},
188 static const struct bmi160_scale bmi160_gyro_scale
[] = {
189 { BMI160_GYRO_RANGE_2000DPS
, 1065},
190 { BMI160_GYRO_RANGE_1000DPS
, 532},
191 { BMI160_GYRO_RANGE_500DPS
, 266},
192 { BMI160_GYRO_RANGE_250DPS
, 133},
193 { BMI160_GYRO_RANGE_125DPS
, 66},
196 struct bmi160_scale_item
{
197 const struct bmi160_scale
*tbl
;
201 static const struct bmi160_scale_item bmi160_scale_table
[] = {
203 .tbl
= bmi160_accel_scale
,
204 .num
= ARRAY_SIZE(bmi160_accel_scale
),
207 .tbl
= bmi160_gyro_scale
,
208 .num
= ARRAY_SIZE(bmi160_gyro_scale
),
212 static const struct bmi160_odr bmi160_accel_odr
[] = {
227 static const struct bmi160_odr bmi160_gyro_odr
[] = {
238 struct bmi160_odr_item
{
239 const struct bmi160_odr
*tbl
;
243 static const struct bmi160_odr_item bmi160_odr_table
[] = {
245 .tbl
= bmi160_accel_odr
,
246 .num
= ARRAY_SIZE(bmi160_accel_odr
),
249 .tbl
= bmi160_gyro_odr
,
250 .num
= ARRAY_SIZE(bmi160_gyro_odr
),
254 static const struct iio_chan_spec bmi160_channels
[] = {
255 BMI160_CHANNEL(IIO_ACCEL
, X
, BMI160_SCAN_ACCEL_X
),
256 BMI160_CHANNEL(IIO_ACCEL
, Y
, BMI160_SCAN_ACCEL_Y
),
257 BMI160_CHANNEL(IIO_ACCEL
, Z
, BMI160_SCAN_ACCEL_Z
),
258 BMI160_CHANNEL(IIO_ANGL_VEL
, X
, BMI160_SCAN_GYRO_X
),
259 BMI160_CHANNEL(IIO_ANGL_VEL
, Y
, BMI160_SCAN_GYRO_Y
),
260 BMI160_CHANNEL(IIO_ANGL_VEL
, Z
, BMI160_SCAN_GYRO_Z
),
261 IIO_CHAN_SOFT_TIMESTAMP(BMI160_SCAN_TIMESTAMP
),
264 static enum bmi160_sensor_type
bmi160_to_sensor(enum iio_chan_type iio_type
)
277 int bmi160_set_mode(struct bmi160_data
*data
, enum bmi160_sensor_type t
,
284 cmd
= bmi160_regs
[t
].pmu_cmd_normal
;
286 cmd
= bmi160_regs
[t
].pmu_cmd_suspend
;
288 ret
= regmap_write(data
->regmap
, BMI160_REG_CMD
, cmd
);
292 usleep_range(bmi160_pmu_time
[t
].min
, bmi160_pmu_time
[t
].max
);
298 int bmi160_set_scale(struct bmi160_data
*data
, enum bmi160_sensor_type t
,
303 for (i
= 0; i
< bmi160_scale_table
[t
].num
; i
++)
304 if (bmi160_scale_table
[t
].tbl
[i
].uscale
== uscale
)
307 if (i
== bmi160_scale_table
[t
].num
)
310 return regmap_write(data
->regmap
, bmi160_regs
[t
].range
,
311 bmi160_scale_table
[t
].tbl
[i
].bits
);
315 int bmi160_get_scale(struct bmi160_data
*data
, enum bmi160_sensor_type t
,
320 ret
= regmap_read(data
->regmap
, bmi160_regs
[t
].range
, &val
);
324 for (i
= 0; i
< bmi160_scale_table
[t
].num
; i
++)
325 if (bmi160_scale_table
[t
].tbl
[i
].bits
== val
) {
326 *uscale
= bmi160_scale_table
[t
].tbl
[i
].uscale
;
333 static int bmi160_get_data(struct bmi160_data
*data
, int chan_type
,
339 enum bmi160_sensor_type t
= bmi160_to_sensor(chan_type
);
341 reg
= bmi160_regs
[t
].data
+ (axis
- IIO_MOD_X
) * sizeof(__le16
);
343 ret
= regmap_bulk_read(data
->regmap
, reg
, &sample
, sizeof(__le16
));
347 *val
= sign_extend32(le16_to_cpu(sample
), 15);
353 int bmi160_set_odr(struct bmi160_data
*data
, enum bmi160_sensor_type t
,
358 for (i
= 0; i
< bmi160_odr_table
[t
].num
; i
++)
359 if (bmi160_odr_table
[t
].tbl
[i
].odr
== odr
&&
360 bmi160_odr_table
[t
].tbl
[i
].uodr
== uodr
)
363 if (i
>= bmi160_odr_table
[t
].num
)
366 return regmap_update_bits(data
->regmap
,
367 bmi160_regs
[t
].config
,
368 bmi160_regs
[t
].config_odr_mask
,
369 bmi160_odr_table
[t
].tbl
[i
].bits
);
372 static int bmi160_get_odr(struct bmi160_data
*data
, enum bmi160_sensor_type t
,
377 ret
= regmap_read(data
->regmap
, bmi160_regs
[t
].config
, &val
);
381 val
&= bmi160_regs
[t
].config_odr_mask
;
383 for (i
= 0; i
< bmi160_odr_table
[t
].num
; i
++)
384 if (val
== bmi160_odr_table
[t
].tbl
[i
].bits
)
387 if (i
>= bmi160_odr_table
[t
].num
)
390 *odr
= bmi160_odr_table
[t
].tbl
[i
].odr
;
391 *uodr
= bmi160_odr_table
[t
].tbl
[i
].uodr
;
396 static irqreturn_t
bmi160_trigger_handler(int irq
, void *p
)
398 struct iio_poll_func
*pf
= p
;
399 struct iio_dev
*indio_dev
= pf
->indio_dev
;
400 struct bmi160_data
*data
= iio_priv(indio_dev
);
402 /* 3 sens x 3 axis x __le16 + 3 x __le16 pad + 4 x __le16 tstamp */
403 int i
, ret
, j
= 0, base
= BMI160_REG_DATA_MAGN_XOUT_L
;
406 for_each_set_bit(i
, indio_dev
->active_scan_mask
,
407 indio_dev
->masklength
) {
408 ret
= regmap_bulk_read(data
->regmap
, base
+ i
* sizeof(__le16
),
409 &sample
, sizeof(__le16
));
415 iio_push_to_buffers_with_timestamp(indio_dev
, buf
,
416 iio_get_time_ns(indio_dev
));
418 iio_trigger_notify_done(indio_dev
->trig
);
422 static int bmi160_read_raw(struct iio_dev
*indio_dev
,
423 struct iio_chan_spec
const *chan
,
424 int *val
, int *val2
, long mask
)
427 struct bmi160_data
*data
= iio_priv(indio_dev
);
430 case IIO_CHAN_INFO_RAW
:
431 ret
= bmi160_get_data(data
, chan
->type
, chan
->channel2
, val
);
435 case IIO_CHAN_INFO_SCALE
:
437 ret
= bmi160_get_scale(data
,
438 bmi160_to_sensor(chan
->type
), val2
);
439 return ret
< 0 ? ret
: IIO_VAL_INT_PLUS_MICRO
;
440 case IIO_CHAN_INFO_SAMP_FREQ
:
441 ret
= bmi160_get_odr(data
, bmi160_to_sensor(chan
->type
),
443 return ret
< 0 ? ret
: IIO_VAL_INT_PLUS_MICRO
;
451 static int bmi160_write_raw(struct iio_dev
*indio_dev
,
452 struct iio_chan_spec
const *chan
,
453 int val
, int val2
, long mask
)
455 struct bmi160_data
*data
= iio_priv(indio_dev
);
458 case IIO_CHAN_INFO_SCALE
:
459 return bmi160_set_scale(data
,
460 bmi160_to_sensor(chan
->type
), val2
);
462 case IIO_CHAN_INFO_SAMP_FREQ
:
463 return bmi160_set_odr(data
, bmi160_to_sensor(chan
->type
),
473 IIO_CONST_ATTR(in_accel_sampling_frequency_available
,
474 "0.78125 1.5625 3.125 6.25 12.5 25 50 100 200 400 800 1600");
476 IIO_CONST_ATTR(in_anglvel_sampling_frequency_available
,
477 "25 50 100 200 400 800 1600 3200");
479 IIO_CONST_ATTR(in_accel_scale_available
,
480 "0.000598 0.001197 0.002394 0.004788");
482 IIO_CONST_ATTR(in_anglvel_scale_available
,
483 "0.001065 0.000532 0.000266 0.000133 0.000066");
485 static struct attribute
*bmi160_attrs
[] = {
486 &iio_const_attr_in_accel_sampling_frequency_available
.dev_attr
.attr
,
487 &iio_const_attr_in_anglvel_sampling_frequency_available
.dev_attr
.attr
,
488 &iio_const_attr_in_accel_scale_available
.dev_attr
.attr
,
489 &iio_const_attr_in_anglvel_scale_available
.dev_attr
.attr
,
493 static const struct attribute_group bmi160_attrs_group
= {
494 .attrs
= bmi160_attrs
,
497 static const struct iio_info bmi160_info
= {
498 .driver_module
= THIS_MODULE
,
499 .read_raw
= bmi160_read_raw
,
500 .write_raw
= bmi160_write_raw
,
501 .attrs
= &bmi160_attrs_group
,
504 static const char *bmi160_match_acpi_device(struct device
*dev
)
506 const struct acpi_device_id
*id
;
508 id
= acpi_match_device(dev
->driver
->acpi_match_table
, dev
);
512 return dev_name(dev
);
515 static int bmi160_chip_init(struct bmi160_data
*data
, bool use_spi
)
519 struct device
*dev
= regmap_get_device(data
->regmap
);
521 ret
= regmap_write(data
->regmap
, BMI160_REG_CMD
, BMI160_CMD_SOFTRESET
);
525 usleep_range(BMI160_SOFTRESET_USLEEP
, BMI160_SOFTRESET_USLEEP
+ 1);
528 * CS rising edge is needed before starting SPI, so do a dummy read
529 * See Section 3.2.1, page 86 of the datasheet
532 ret
= regmap_read(data
->regmap
, BMI160_REG_DUMMY
, &val
);
537 ret
= regmap_read(data
->regmap
, BMI160_REG_CHIP_ID
, &val
);
539 dev_err(dev
, "Error reading chip id\n");
542 if (val
!= BMI160_CHIP_ID_VAL
) {
543 dev_err(dev
, "Wrong chip id, got %x expected %x\n",
544 val
, BMI160_CHIP_ID_VAL
);
548 ret
= bmi160_set_mode(data
, BMI160_ACCEL
, true);
552 ret
= bmi160_set_mode(data
, BMI160_GYRO
, true);
559 static void bmi160_chip_uninit(struct bmi160_data
*data
)
561 bmi160_set_mode(data
, BMI160_GYRO
, false);
562 bmi160_set_mode(data
, BMI160_ACCEL
, false);
565 int bmi160_core_probe(struct device
*dev
, struct regmap
*regmap
,
566 const char *name
, bool use_spi
)
568 struct iio_dev
*indio_dev
;
569 struct bmi160_data
*data
;
572 indio_dev
= devm_iio_device_alloc(dev
, sizeof(*data
));
576 data
= iio_priv(indio_dev
);
577 dev_set_drvdata(dev
, indio_dev
);
578 data
->regmap
= regmap
;
580 ret
= bmi160_chip_init(data
, use_spi
);
584 if (!name
&& ACPI_HANDLE(dev
))
585 name
= bmi160_match_acpi_device(dev
);
587 indio_dev
->dev
.parent
= dev
;
588 indio_dev
->channels
= bmi160_channels
;
589 indio_dev
->num_channels
= ARRAY_SIZE(bmi160_channels
);
590 indio_dev
->name
= name
;
591 indio_dev
->modes
= INDIO_DIRECT_MODE
;
592 indio_dev
->info
= &bmi160_info
;
594 ret
= iio_triggered_buffer_setup(indio_dev
, NULL
,
595 bmi160_trigger_handler
, NULL
);
599 ret
= iio_device_register(indio_dev
);
605 iio_triggered_buffer_cleanup(indio_dev
);
607 bmi160_chip_uninit(data
);
610 EXPORT_SYMBOL_GPL(bmi160_core_probe
);
612 void bmi160_core_remove(struct device
*dev
)
614 struct iio_dev
*indio_dev
= dev_get_drvdata(dev
);
615 struct bmi160_data
*data
= iio_priv(indio_dev
);
617 iio_device_unregister(indio_dev
);
618 iio_triggered_buffer_cleanup(indio_dev
);
619 bmi160_chip_uninit(data
);
621 EXPORT_SYMBOL_GPL(bmi160_core_remove
);
623 MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com");
624 MODULE_DESCRIPTION("Bosch BMI160 driver");
625 MODULE_LICENSE("GPL v2");