1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * STMicroelectronics st_lsm6dsx sensor driver
5 * Copyright 2016 STMicroelectronics Inc.
7 * Lorenzo Bianconi <lorenzo.bianconi@st.com>
8 * Denis Ciocca <denis.ciocca@st.com>
14 #include <linux/device.h>
15 #include <linux/iio/iio.h>
16 #include <linux/regulator/consumer.h>
18 #define ST_LSM6DS3_DEV_NAME "lsm6ds3"
19 #define ST_LSM6DS3H_DEV_NAME "lsm6ds3h"
20 #define ST_LSM6DSL_DEV_NAME "lsm6dsl"
21 #define ST_LSM6DSM_DEV_NAME "lsm6dsm"
22 #define ST_ISM330DLC_DEV_NAME "ism330dlc"
23 #define ST_LSM6DSO_DEV_NAME "lsm6dso"
24 #define ST_ASM330LHH_DEV_NAME "asm330lhh"
25 #define ST_LSM6DSOX_DEV_NAME "lsm6dsox"
26 #define ST_LSM6DSR_DEV_NAME "lsm6dsr"
27 #define ST_LSM6DS3TRC_DEV_NAME "lsm6ds3tr-c"
28 #define ST_ISM330DHCX_DEV_NAME "ism330dhcx"
29 #define ST_LSM9DS1_DEV_NAME "lsm9ds1-imu"
30 #define ST_LSM6DS0_DEV_NAME "lsm6ds0"
31 #define ST_LSM6DSRX_DEV_NAME "lsm6dsrx"
32 #define ST_LSM6DST_DEV_NAME "lsm6dst"
33 #define ST_LSM6DSOP_DEV_NAME "lsm6dsop"
34 #define ST_ASM330LHHX_DEV_NAME "asm330lhhx"
35 #define ST_LSM6DSTX_DEV_NAME "lsm6dstx"
36 #define ST_LSM6DSV_DEV_NAME "lsm6dsv"
37 #define ST_LSM6DSV16X_DEV_NAME "lsm6dsv16x"
38 #define ST_LSM6DSO16IS_DEV_NAME "lsm6dso16is"
39 #define ST_ISM330IS_DEV_NAME "ism330is"
40 #define ST_ASM330LHB_DEV_NAME "asm330lhb"
41 #define ST_ASM330LHHXG1_DEV_NAME "asm330lhhxg1"
43 enum st_lsm6dsx_hw_id
{
71 #define ST_LSM6DSX_BUFF_SIZE 512
72 #define ST_LSM6DSX_CHAN_SIZE 2
73 #define ST_LSM6DSX_SAMPLE_SIZE 6
74 #define ST_LSM6DSX_TAG_SIZE 1
75 #define ST_LSM6DSX_TAGGED_SAMPLE_SIZE (ST_LSM6DSX_SAMPLE_SIZE + \
77 #define ST_LSM6DSX_MAX_WORD_LEN ((32 / ST_LSM6DSX_SAMPLE_SIZE) * \
78 ST_LSM6DSX_SAMPLE_SIZE)
79 #define ST_LSM6DSX_MAX_TAGGED_WORD_LEN ((32 / ST_LSM6DSX_TAGGED_SAMPLE_SIZE) \
80 * ST_LSM6DSX_TAGGED_SAMPLE_SIZE)
81 #define ST_LSM6DSX_SHIFT_VAL(val, mask) (((val) << __ffs(mask)) & (mask))
83 #define ST_LSM6DSX_CHANNEL_ACC(chan_type, addr, mod, scan_idx) \
89 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
90 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
91 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
92 .scan_index = scan_idx, \
97 .endianness = IIO_LE, \
99 .event_spec = &st_lsm6dsx_event, \
100 .ext_info = st_lsm6dsx_ext_info, \
101 .num_event_specs = 1, \
104 #define ST_LSM6DSX_CHANNEL(chan_type, addr, mod, scan_idx) \
110 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
111 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
112 .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ), \
113 .scan_index = scan_idx, \
118 .endianness = IIO_LE, \
120 .ext_info = st_lsm6dsx_ext_info, \
123 struct st_lsm6dsx_reg
{
128 struct st_lsm6dsx_sensor
;
129 struct st_lsm6dsx_hw
;
131 struct st_lsm6dsx_odr
{
136 #define ST_LSM6DSX_ODR_LIST_SIZE 8
137 struct st_lsm6dsx_odr_table_entry
{
138 struct st_lsm6dsx_reg reg
;
140 struct st_lsm6dsx_odr odr_avl
[ST_LSM6DSX_ODR_LIST_SIZE
];
144 struct st_lsm6dsx_samples_to_discard
{
148 } val
[ST_LSM6DSX_ODR_LIST_SIZE
];
151 struct st_lsm6dsx_fs
{
156 #define ST_LSM6DSX_FS_LIST_SIZE 4
157 struct st_lsm6dsx_fs_table_entry
{
158 struct st_lsm6dsx_reg reg
;
160 struct st_lsm6dsx_fs fs_avl
[ST_LSM6DSX_FS_LIST_SIZE
];
165 * struct st_lsm6dsx_fifo_ops - ST IMU FIFO settings
166 * @update_fifo: Update FIFO configuration callback.
167 * @read_fifo: Read FIFO callback.
168 * @fifo_th: FIFO threshold register info (addr + mask).
169 * @fifo_diff: FIFO diff status register info (addr + mask).
170 * @max_size: Sensor max fifo length in FIFO words.
171 * @th_wl: FIFO threshold word length.
173 struct st_lsm6dsx_fifo_ops
{
174 int (*update_fifo
)(struct st_lsm6dsx_sensor
*sensor
, bool enable
);
175 int (*read_fifo
)(struct st_lsm6dsx_hw
*hw
);
189 * struct st_lsm6dsx_hw_ts_settings - ST IMU hw timer settings
190 * @timer_en: Hw timer enable register info (addr + mask).
191 * @hr_timer: Hw timer resolution register info (addr + mask).
192 * @fifo_en: Hw timer FIFO enable register info (addr + mask).
193 * @decimator: Hw timer FIFO decimator register info (addr + mask).
194 * @freq_fine: Difference in % of ODR with respect to the typical.
196 struct st_lsm6dsx_hw_ts_settings
{
197 struct st_lsm6dsx_reg timer_en
;
198 struct st_lsm6dsx_reg hr_timer
;
199 struct st_lsm6dsx_reg fifo_en
;
200 struct st_lsm6dsx_reg decimator
;
205 * struct st_lsm6dsx_shub_settings - ST IMU hw i2c controller settings
206 * @page_mux: register page mux info (addr + mask).
207 * @master_en: master config register info (addr + mask).
208 * @pullup_en: i2c controller pull-up register info (addr + mask).
209 * @aux_sens: aux sensor register info (addr + mask).
210 * @wr_once: write_once register info (addr + mask).
211 * @emb_func: embedded function register info (addr + mask).
212 * @num_ext_dev: max number of slave devices.
213 * @shub_out: sensor hub first output register info.
214 * @slv0_addr: slave0 address in secondary page.
215 * @dw_slv0_addr: slave0 write register address in secondary page.
216 * @batch_en: Enable/disable FIFO batching.
217 * @pause: controller pause value.
219 struct st_lsm6dsx_shub_settings
{
220 struct st_lsm6dsx_reg page_mux
;
231 struct st_lsm6dsx_reg aux_sens
;
232 struct st_lsm6dsx_reg wr_once
;
233 struct st_lsm6dsx_reg emb_func
;
245 struct st_lsm6dsx_event_settings
{
246 struct st_lsm6dsx_reg enable_reg
;
247 struct st_lsm6dsx_reg wakeup_reg
;
249 u8 wakeup_src_status_mask
;
250 u8 wakeup_src_z_mask
;
251 u8 wakeup_src_y_mask
;
252 u8 wakeup_src_x_mask
;
255 enum st_lsm6dsx_ext_sensor_id
{
260 * struct st_lsm6dsx_ext_dev_settings - i2c controller slave settings
261 * @i2c_addr: I2c slave address list.
262 * @wai: Wai address info.
263 * @id: external sensor id.
264 * @odr_table: Output data rate of the sensor [Hz].
265 * @fs_table: Configured sensor sensitivity table depending on full scale.
266 * @temp_comp: Temperature compensation register info (addr + mask).
267 * @pwr_table: Power on register info (addr + mask).
268 * @off_canc: Offset cancellation register info (addr + mask).
269 * @bdu: Block data update register info (addr + mask).
270 * @out: Output register info.
272 struct st_lsm6dsx_ext_dev_settings
{
278 enum st_lsm6dsx_ext_sensor_id id
;
279 struct st_lsm6dsx_odr_table_entry odr_table
;
280 struct st_lsm6dsx_fs_table_entry fs_table
;
281 struct st_lsm6dsx_reg temp_comp
;
283 struct st_lsm6dsx_reg reg
;
287 struct st_lsm6dsx_reg off_canc
;
288 struct st_lsm6dsx_reg bdu
;
296 * struct st_lsm6dsx_settings - ST IMU sensor settings
297 * @reset: register address for reset.
298 * @boot: register address for boot.
299 * @bdu: register address for Block Data Update.
300 * @id: List of hw id/device name supported by the driver configuration.
301 * @channels: IIO channels supported by the device.
302 * @irq_config: interrupts related registers.
303 * @drdy_mask: register info for data-ready mask (addr + mask).
304 * @odr_table: Hw sensors odr table (Hz + val).
305 * @samples_to_discard: Number of samples to discard for filters settling time.
306 * @fs_table: Hw sensors gain table (gain + val).
307 * @decimator: List of decimator register info (addr + mask).
308 * @batch: List of FIFO batching register info (addr + mask).
309 * @fifo_ops: Sensor hw FIFO parameters.
310 * @ts_settings: Hw timer related settings.
311 * @shub_settings: i2c controller related settings.
313 struct st_lsm6dsx_settings
{
314 struct st_lsm6dsx_reg reset
;
315 struct st_lsm6dsx_reg boot
;
316 struct st_lsm6dsx_reg bdu
;
318 enum st_lsm6dsx_hw_id hw_id
;
321 } id
[ST_LSM6DSX_MAX_ID
];
323 const struct iio_chan_spec
*chan
;
327 struct st_lsm6dsx_reg irq1
;
328 struct st_lsm6dsx_reg irq2
;
329 struct st_lsm6dsx_reg irq1_func
;
330 struct st_lsm6dsx_reg irq2_func
;
331 struct st_lsm6dsx_reg lir
;
332 struct st_lsm6dsx_reg clear_on_read
;
333 struct st_lsm6dsx_reg hla
;
334 struct st_lsm6dsx_reg od
;
336 struct st_lsm6dsx_reg drdy_mask
;
337 struct st_lsm6dsx_odr_table_entry odr_table
[2];
338 struct st_lsm6dsx_samples_to_discard samples_to_discard
[2];
339 struct st_lsm6dsx_fs_table_entry fs_table
[2];
340 struct st_lsm6dsx_reg decimator
[ST_LSM6DSX_MAX_ID
];
341 struct st_lsm6dsx_reg batch
[ST_LSM6DSX_MAX_ID
];
342 struct st_lsm6dsx_fifo_ops fifo_ops
;
343 struct st_lsm6dsx_hw_ts_settings ts_settings
;
344 struct st_lsm6dsx_shub_settings shub_settings
;
345 struct st_lsm6dsx_event_settings event_settings
;
348 enum st_lsm6dsx_sensor_id
{
357 enum st_lsm6dsx_fifo_mode
{
358 ST_LSM6DSX_FIFO_BYPASS
= 0x0,
359 ST_LSM6DSX_FIFO_CONT
= 0x6,
363 * struct st_lsm6dsx_sensor - ST IMU sensor instance
364 * @name: Sensor name.
365 * @id: Sensor identifier.
366 * @hw: Pointer to instance of struct st_lsm6dsx_hw.
367 * @gain: Configured sensor sensitivity.
368 * @odr: Output data rate of the sensor [Hz].
369 * @samples_to_discard: Number of samples to discard for filters settling time.
370 * @watermark: Sensor watermark level.
371 * @decimator: Sensor decimation factor.
372 * @sip: Number of samples in a given pattern.
373 * @ts_ref: Sensor timestamp reference for hw one.
374 * @ext_info: Sensor settings if it is connected to i2c controller
376 struct st_lsm6dsx_sensor
{
378 enum st_lsm6dsx_sensor_id id
;
379 struct st_lsm6dsx_hw
*hw
;
384 u16 samples_to_discard
;
391 const struct st_lsm6dsx_ext_dev_settings
*settings
;
398 * struct st_lsm6dsx_hw - ST IMU MEMS hw instance
399 * @dev: Pointer to instance of struct device (I2C or SPI).
400 * @regmap: Register map of the device.
401 * @irq: Device interrupt line (I2C or SPI).
402 * @fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
403 * @conf_lock: Mutex to prevent concurrent FIFO configuration update.
404 * @page_lock: Mutex to prevent concurrent memory page configuration.
405 * @suspend_mask: Suspended sensor bitmask.
406 * @enable_mask: Enabled sensor bitmask.
407 * @fifo_mask: Enabled hw FIFO bitmask.
408 * @ts_gain: Hw timestamp rate after internal calibration.
409 * @ts_sip: Total number of timestamp samples in a given pattern.
410 * @sip: Total number of samples (acc/gyro/ts) in a given pattern.
411 * @buff: Device read buffer.
412 * @irq_routing: pointer to interrupt routing configuration.
413 * @event_threshold: wakeup event threshold.
414 * @enable_event: enabled event bitmask.
415 * @iio_devs: Pointers to acc/gyro iio_dev instances.
416 * @settings: Pointer to the specific sensor settings in use.
417 * @orientation: sensor chip orientation relative to main hardware.
418 * @scan: Temporary buffers used to align data before iio_push_to_buffers()
420 struct st_lsm6dsx_hw
{
422 struct regmap
*regmap
;
425 struct mutex fifo_lock
;
426 struct mutex conf_lock
;
427 struct mutex page_lock
;
436 const struct st_lsm6dsx_reg
*irq_routing
;
442 struct iio_dev
*iio_devs
[ST_LSM6DSX_ID_MAX
];
444 const struct st_lsm6dsx_settings
*settings
;
446 struct iio_mount_matrix orientation
;
447 /* Ensure natural alignment of buffer elements */
451 } scan
[ST_LSM6DSX_ID_MAX
];
454 static __maybe_unused
const struct iio_event_spec st_lsm6dsx_event
= {
455 .type
= IIO_EV_TYPE_THRESH
,
456 .dir
= IIO_EV_DIR_EITHER
,
457 .mask_separate
= BIT(IIO_EV_INFO_VALUE
) |
458 BIT(IIO_EV_INFO_ENABLE
)
461 static __maybe_unused
const unsigned long st_lsm6dsx_available_scan_masks
[] = {
465 extern const struct dev_pm_ops st_lsm6dsx_pm_ops
;
467 int st_lsm6dsx_probe(struct device
*dev
, int irq
, int hw_id
,
468 struct regmap
*regmap
);
469 int st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_sensor
*sensor
,
471 int st_lsm6dsx_fifo_setup(struct st_lsm6dsx_hw
*hw
);
472 int st_lsm6dsx_set_watermark(struct iio_dev
*iio_dev
, unsigned int val
);
473 int st_lsm6dsx_update_watermark(struct st_lsm6dsx_sensor
*sensor
,
475 int st_lsm6dsx_update_fifo(struct st_lsm6dsx_sensor
*sensor
, bool enable
);
476 int st_lsm6dsx_flush_fifo(struct st_lsm6dsx_hw
*hw
);
477 int st_lsm6dsx_resume_fifo(struct st_lsm6dsx_hw
*hw
);
478 int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw
*hw
);
479 int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw
*hw
);
480 int st_lsm6dsx_check_odr(struct st_lsm6dsx_sensor
*sensor
, u32 odr
, u8
*val
);
481 int st_lsm6dsx_shub_probe(struct st_lsm6dsx_hw
*hw
, const char *name
);
482 int st_lsm6dsx_shub_set_enable(struct st_lsm6dsx_sensor
*sensor
, bool enable
);
483 int st_lsm6dsx_shub_read_output(struct st_lsm6dsx_hw
*hw
, u8
*data
, int len
);
484 int st_lsm6dsx_set_page(struct st_lsm6dsx_hw
*hw
, bool enable
);
487 st_lsm6dsx_update_bits_locked(struct st_lsm6dsx_hw
*hw
, unsigned int addr
,
488 unsigned int mask
, unsigned int val
)
492 mutex_lock(&hw
->page_lock
);
493 err
= regmap_update_bits(hw
->regmap
, addr
, mask
, val
);
494 mutex_unlock(&hw
->page_lock
);
500 st_lsm6dsx_read_locked(struct st_lsm6dsx_hw
*hw
, unsigned int addr
,
501 void *val
, unsigned int len
)
505 mutex_lock(&hw
->page_lock
);
506 err
= regmap_bulk_read(hw
->regmap
, addr
, val
, len
);
507 mutex_unlock(&hw
->page_lock
);
513 st_lsm6dsx_write_locked(struct st_lsm6dsx_hw
*hw
, unsigned int addr
,
518 mutex_lock(&hw
->page_lock
);
519 err
= regmap_write(hw
->regmap
, addr
, val
);
520 mutex_unlock(&hw
->page_lock
);
525 static inline const struct iio_mount_matrix
*
526 st_lsm6dsx_get_mount_matrix(const struct iio_dev
*iio_dev
,
527 const struct iio_chan_spec
*chan
)
529 struct st_lsm6dsx_sensor
*sensor
= iio_priv(iio_dev
);
530 struct st_lsm6dsx_hw
*hw
= sensor
->hw
;
532 return &hw
->orientation
;
536 st_lsm6dsx_device_set_enable(struct st_lsm6dsx_sensor
*sensor
, bool enable
)
538 if (sensor
->id
== ST_LSM6DSX_ID_EXT0
||
539 sensor
->id
== ST_LSM6DSX_ID_EXT1
||
540 sensor
->id
== ST_LSM6DSX_ID_EXT2
)
541 return st_lsm6dsx_shub_set_enable(sensor
, enable
);
543 return st_lsm6dsx_sensor_set_enable(sensor
, enable
);
547 struct iio_chan_spec_ext_info __maybe_unused st_lsm6dsx_ext_info
[] = {
548 IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL
, st_lsm6dsx_get_mount_matrix
),
552 #endif /* ST_LSM6DSX_H */