cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

st_lsm6dsx.h (14453B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * STMicroelectronics st_lsm6dsx sensor driver
      4 *
      5 * Copyright 2016 STMicroelectronics Inc.
      6 *
      7 * Lorenzo Bianconi <lorenzo.bianconi@st.com>
      8 * Denis Ciocca <denis.ciocca@st.com>
      9 */
     10
     11#ifndef ST_LSM6DSX_H
     12#define ST_LSM6DSX_H
     13
     14#include <linux/device.h>
     15#include <linux/iio/iio.h>
     16#include <linux/regulator/consumer.h>
     17
     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
     36enum st_lsm6dsx_hw_id {
     37	ST_LSM6DS3_ID,
     38	ST_LSM6DS3H_ID,
     39	ST_LSM6DSL_ID,
     40	ST_LSM6DSM_ID,
     41	ST_ISM330DLC_ID,
     42	ST_LSM6DSO_ID,
     43	ST_ASM330LHH_ID,
     44	ST_LSM6DSOX_ID,
     45	ST_LSM6DSR_ID,
     46	ST_LSM6DS3TRC_ID,
     47	ST_ISM330DHCX_ID,
     48	ST_LSM9DS1_ID,
     49	ST_LSM6DS0_ID,
     50	ST_LSM6DSRX_ID,
     51	ST_LSM6DST_ID,
     52	ST_LSM6DSOP_ID,
     53	ST_ASM330LHHX_ID,
     54	ST_LSM6DSX_MAX_ID,
     55};
     56
     57#define ST_LSM6DSX_BUFF_SIZE		512
     58#define ST_LSM6DSX_CHAN_SIZE		2
     59#define ST_LSM6DSX_SAMPLE_SIZE		6
     60#define ST_LSM6DSX_TAG_SIZE		1
     61#define ST_LSM6DSX_TAGGED_SAMPLE_SIZE	(ST_LSM6DSX_SAMPLE_SIZE + \
     62					 ST_LSM6DSX_TAG_SIZE)
     63#define ST_LSM6DSX_MAX_WORD_LEN		((32 / ST_LSM6DSX_SAMPLE_SIZE) * \
     64					 ST_LSM6DSX_SAMPLE_SIZE)
     65#define ST_LSM6DSX_MAX_TAGGED_WORD_LEN	((32 / ST_LSM6DSX_TAGGED_SAMPLE_SIZE) \
     66					 * ST_LSM6DSX_TAGGED_SAMPLE_SIZE)
     67#define ST_LSM6DSX_SHIFT_VAL(val, mask)	(((val) << __ffs(mask)) & (mask))
     68
     69#define ST_LSM6DSX_CHANNEL_ACC(chan_type, addr, mod, scan_idx)		\
     70{									\
     71	.type = chan_type,						\
     72	.address = addr,						\
     73	.modified = 1,							\
     74	.channel2 = mod,						\
     75	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
     76	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),		\
     77	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),	\
     78	.scan_index = scan_idx,						\
     79	.scan_type = {							\
     80		.sign = 's',						\
     81		.realbits = 16,						\
     82		.storagebits = 16,					\
     83		.endianness = IIO_LE,					\
     84	},								\
     85	.event_spec = &st_lsm6dsx_event,				\
     86	.ext_info = st_lsm6dsx_accel_ext_info,				\
     87	.num_event_specs = 1,						\
     88}
     89
     90#define ST_LSM6DSX_CHANNEL(chan_type, addr, mod, scan_idx)		\
     91{									\
     92	.type = chan_type,						\
     93	.address = addr,						\
     94	.modified = 1,							\
     95	.channel2 = mod,						\
     96	.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),			\
     97	.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),		\
     98	.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),	\
     99	.scan_index = scan_idx,						\
    100	.scan_type = {							\
    101		.sign = 's',						\
    102		.realbits = 16,						\
    103		.storagebits = 16,					\
    104		.endianness = IIO_LE,					\
    105	},								\
    106}
    107
    108struct st_lsm6dsx_reg {
    109	u8 addr;
    110	u8 mask;
    111};
    112
    113struct st_lsm6dsx_sensor;
    114struct st_lsm6dsx_hw;
    115
    116struct st_lsm6dsx_odr {
    117	u32 milli_hz;
    118	u8 val;
    119};
    120
    121#define ST_LSM6DSX_ODR_LIST_SIZE	8
    122struct st_lsm6dsx_odr_table_entry {
    123	struct st_lsm6dsx_reg reg;
    124
    125	struct st_lsm6dsx_odr odr_avl[ST_LSM6DSX_ODR_LIST_SIZE];
    126	int odr_len;
    127};
    128
    129struct st_lsm6dsx_fs {
    130	u32 gain;
    131	u8 val;
    132};
    133
    134#define ST_LSM6DSX_FS_LIST_SIZE		4
    135struct st_lsm6dsx_fs_table_entry {
    136	struct st_lsm6dsx_reg reg;
    137
    138	struct st_lsm6dsx_fs fs_avl[ST_LSM6DSX_FS_LIST_SIZE];
    139	int fs_len;
    140};
    141
    142/**
    143 * struct st_lsm6dsx_fifo_ops - ST IMU FIFO settings
    144 * @update_fifo: Update FIFO configuration callback.
    145 * @read_fifo: Read FIFO callback.
    146 * @fifo_th: FIFO threshold register info (addr + mask).
    147 * @fifo_diff: FIFO diff status register info (addr + mask).
    148 * @max_size: Sensor max fifo length in FIFO words.
    149 * @th_wl: FIFO threshold word length.
    150 */
    151struct st_lsm6dsx_fifo_ops {
    152	int (*update_fifo)(struct st_lsm6dsx_sensor *sensor, bool enable);
    153	int (*read_fifo)(struct st_lsm6dsx_hw *hw);
    154	struct {
    155		u8 addr;
    156		u16 mask;
    157	} fifo_th;
    158	struct {
    159		u8 addr;
    160		u16 mask;
    161	} fifo_diff;
    162	u16 max_size;
    163	u8 th_wl;
    164};
    165
    166/**
    167 * struct st_lsm6dsx_hw_ts_settings - ST IMU hw timer settings
    168 * @timer_en: Hw timer enable register info (addr + mask).
    169 * @hr_timer: Hw timer resolution register info (addr + mask).
    170 * @fifo_en: Hw timer FIFO enable register info (addr + mask).
    171 * @decimator: Hw timer FIFO decimator register info (addr + mask).
    172 * @freq_fine: Difference in % of ODR with respect to the typical.
    173 */
    174struct st_lsm6dsx_hw_ts_settings {
    175	struct st_lsm6dsx_reg timer_en;
    176	struct st_lsm6dsx_reg hr_timer;
    177	struct st_lsm6dsx_reg fifo_en;
    178	struct st_lsm6dsx_reg decimator;
    179	u8 freq_fine;
    180};
    181
    182/**
    183 * struct st_lsm6dsx_shub_settings - ST IMU hw i2c controller settings
    184 * @page_mux: register page mux info (addr + mask).
    185 * @master_en: master config register info (addr + mask).
    186 * @pullup_en: i2c controller pull-up register info (addr + mask).
    187 * @aux_sens: aux sensor register info (addr + mask).
    188 * @wr_once: write_once register info (addr + mask).
    189 * @emb_func:  embedded function register info (addr + mask).
    190 * @num_ext_dev: max number of slave devices.
    191 * @shub_out: sensor hub first output register info.
    192 * @slv0_addr: slave0 address in secondary page.
    193 * @dw_slv0_addr: slave0 write register address in secondary page.
    194 * @batch_en: Enable/disable FIFO batching.
    195 * @pause: controller pause value.
    196 */
    197struct st_lsm6dsx_shub_settings {
    198	struct st_lsm6dsx_reg page_mux;
    199	struct {
    200		bool sec_page;
    201		u8 addr;
    202		u8 mask;
    203	} master_en;
    204	struct {
    205		bool sec_page;
    206		u8 addr;
    207		u8 mask;
    208	} pullup_en;
    209	struct st_lsm6dsx_reg aux_sens;
    210	struct st_lsm6dsx_reg wr_once;
    211	struct st_lsm6dsx_reg emb_func;
    212	u8 num_ext_dev;
    213	struct {
    214		bool sec_page;
    215		u8 addr;
    216	} shub_out;
    217	u8 slv0_addr;
    218	u8 dw_slv0_addr;
    219	u8 batch_en;
    220	u8 pause;
    221};
    222
    223struct st_lsm6dsx_event_settings {
    224	struct st_lsm6dsx_reg enable_reg;
    225	struct st_lsm6dsx_reg wakeup_reg;
    226	u8 wakeup_src_reg;
    227	u8 wakeup_src_status_mask;
    228	u8 wakeup_src_z_mask;
    229	u8 wakeup_src_y_mask;
    230	u8 wakeup_src_x_mask;
    231};
    232
    233enum st_lsm6dsx_ext_sensor_id {
    234	ST_LSM6DSX_ID_MAGN,
    235};
    236
    237/**
    238 * struct st_lsm6dsx_ext_dev_settings - i2c controller slave settings
    239 * @i2c_addr: I2c slave address list.
    240 * @wai: Wai address info.
    241 * @id: external sensor id.
    242 * @odr_table: Output data rate of the sensor [Hz].
    243 * @fs_table: Configured sensor sensitivity table depending on full scale.
    244 * @temp_comp: Temperature compensation register info (addr + mask).
    245 * @pwr_table: Power on register info (addr + mask).
    246 * @off_canc: Offset cancellation register info (addr + mask).
    247 * @bdu: Block data update register info (addr + mask).
    248 * @out: Output register info.
    249 */
    250struct st_lsm6dsx_ext_dev_settings {
    251	u8 i2c_addr[2];
    252	struct {
    253		u8 addr;
    254		u8 val;
    255	} wai;
    256	enum st_lsm6dsx_ext_sensor_id id;
    257	struct st_lsm6dsx_odr_table_entry odr_table;
    258	struct st_lsm6dsx_fs_table_entry fs_table;
    259	struct st_lsm6dsx_reg temp_comp;
    260	struct {
    261		struct st_lsm6dsx_reg reg;
    262		u8 off_val;
    263		u8 on_val;
    264	} pwr_table;
    265	struct st_lsm6dsx_reg off_canc;
    266	struct st_lsm6dsx_reg bdu;
    267	struct {
    268		u8 addr;
    269		u8 len;
    270	} out;
    271};
    272
    273/**
    274 * struct st_lsm6dsx_settings - ST IMU sensor settings
    275 * @reset: register address for reset.
    276 * @boot: register address for boot.
    277 * @bdu: register address for Block Data Update.
    278 * @id: List of hw id/device name supported by the driver configuration.
    279 * @channels: IIO channels supported by the device.
    280 * @irq_config: interrupts related registers.
    281 * @drdy_mask: register info for data-ready mask (addr + mask).
    282 * @odr_table: Hw sensors odr table (Hz + val).
    283 * @fs_table: Hw sensors gain table (gain + val).
    284 * @decimator: List of decimator register info (addr + mask).
    285 * @batch: List of FIFO batching register info (addr + mask).
    286 * @fifo_ops: Sensor hw FIFO parameters.
    287 * @ts_settings: Hw timer related settings.
    288 * @shub_settings: i2c controller related settings.
    289 */
    290struct st_lsm6dsx_settings {
    291	struct st_lsm6dsx_reg reset;
    292	struct st_lsm6dsx_reg boot;
    293	struct st_lsm6dsx_reg bdu;
    294	struct {
    295		enum st_lsm6dsx_hw_id hw_id;
    296		const char *name;
    297		u8 wai;
    298	} id[ST_LSM6DSX_MAX_ID];
    299	struct {
    300		const struct iio_chan_spec *chan;
    301		int len;
    302	} channels[2];
    303	struct {
    304		struct st_lsm6dsx_reg irq1;
    305		struct st_lsm6dsx_reg irq2;
    306		struct st_lsm6dsx_reg irq1_func;
    307		struct st_lsm6dsx_reg irq2_func;
    308		struct st_lsm6dsx_reg lir;
    309		struct st_lsm6dsx_reg clear_on_read;
    310		struct st_lsm6dsx_reg hla;
    311		struct st_lsm6dsx_reg od;
    312	} irq_config;
    313	struct st_lsm6dsx_reg drdy_mask;
    314	struct st_lsm6dsx_odr_table_entry odr_table[2];
    315	struct st_lsm6dsx_fs_table_entry fs_table[2];
    316	struct st_lsm6dsx_reg decimator[ST_LSM6DSX_MAX_ID];
    317	struct st_lsm6dsx_reg batch[ST_LSM6DSX_MAX_ID];
    318	struct st_lsm6dsx_fifo_ops fifo_ops;
    319	struct st_lsm6dsx_hw_ts_settings ts_settings;
    320	struct st_lsm6dsx_shub_settings shub_settings;
    321	struct st_lsm6dsx_event_settings event_settings;
    322};
    323
    324enum st_lsm6dsx_sensor_id {
    325	ST_LSM6DSX_ID_GYRO,
    326	ST_LSM6DSX_ID_ACC,
    327	ST_LSM6DSX_ID_EXT0,
    328	ST_LSM6DSX_ID_EXT1,
    329	ST_LSM6DSX_ID_EXT2,
    330	ST_LSM6DSX_ID_MAX,
    331};
    332
    333enum st_lsm6dsx_fifo_mode {
    334	ST_LSM6DSX_FIFO_BYPASS = 0x0,
    335	ST_LSM6DSX_FIFO_CONT = 0x6,
    336};
    337
    338/**
    339 * struct st_lsm6dsx_sensor - ST IMU sensor instance
    340 * @name: Sensor name.
    341 * @id: Sensor identifier.
    342 * @hw: Pointer to instance of struct st_lsm6dsx_hw.
    343 * @gain: Configured sensor sensitivity.
    344 * @odr: Output data rate of the sensor [Hz].
    345 * @watermark: Sensor watermark level.
    346 * @decimator: Sensor decimation factor.
    347 * @sip: Number of samples in a given pattern.
    348 * @ts_ref: Sensor timestamp reference for hw one.
    349 * @ext_info: Sensor settings if it is connected to i2c controller
    350 */
    351struct st_lsm6dsx_sensor {
    352	char name[32];
    353	enum st_lsm6dsx_sensor_id id;
    354	struct st_lsm6dsx_hw *hw;
    355
    356	u32 gain;
    357	u32 odr;
    358
    359	u16 watermark;
    360	u8 decimator;
    361	u8 sip;
    362	s64 ts_ref;
    363
    364	struct {
    365		const struct st_lsm6dsx_ext_dev_settings *settings;
    366		u32 slv_odr;
    367		u8 addr;
    368	} ext_info;
    369};
    370
    371/**
    372 * struct st_lsm6dsx_hw - ST IMU MEMS hw instance
    373 * @dev: Pointer to instance of struct device (I2C or SPI).
    374 * @regmap: Register map of the device.
    375 * @regulators: VDD/VDDIO voltage regulators.
    376 * @irq: Device interrupt line (I2C or SPI).
    377 * @fifo_lock: Mutex to prevent concurrent access to the hw FIFO.
    378 * @conf_lock: Mutex to prevent concurrent FIFO configuration update.
    379 * @page_lock: Mutex to prevent concurrent memory page configuration.
    380 * @suspend_mask: Suspended sensor bitmask.
    381 * @enable_mask: Enabled sensor bitmask.
    382 * @fifo_mask: Enabled hw FIFO bitmask.
    383 * @ts_gain: Hw timestamp rate after internal calibration.
    384 * @ts_sip: Total number of timestamp samples in a given pattern.
    385 * @sip: Total number of samples (acc/gyro/ts) in a given pattern.
    386 * @buff: Device read buffer.
    387 * @irq_routing: pointer to interrupt routing configuration.
    388 * @event_threshold: wakeup event threshold.
    389 * @enable_event: enabled event bitmask.
    390 * @iio_devs: Pointers to acc/gyro iio_dev instances.
    391 * @settings: Pointer to the specific sensor settings in use.
    392 * @orientation: sensor chip orientation relative to main hardware.
    393 * @scan: Temporary buffers used to align data before iio_push_to_buffers()
    394 */
    395struct st_lsm6dsx_hw {
    396	struct device *dev;
    397	struct regmap *regmap;
    398	struct regulator_bulk_data regulators[2];
    399	int irq;
    400
    401	struct mutex fifo_lock;
    402	struct mutex conf_lock;
    403	struct mutex page_lock;
    404
    405	u8 suspend_mask;
    406	u8 enable_mask;
    407	u8 fifo_mask;
    408	s64 ts_gain;
    409	u8 ts_sip;
    410	u8 sip;
    411
    412	const struct st_lsm6dsx_reg *irq_routing;
    413	u8 event_threshold;
    414	u8 enable_event;
    415
    416	u8 *buff;
    417
    418	struct iio_dev *iio_devs[ST_LSM6DSX_ID_MAX];
    419
    420	const struct st_lsm6dsx_settings *settings;
    421
    422	struct iio_mount_matrix orientation;
    423	/* Ensure natural alignment of buffer elements */
    424	struct {
    425		__le16 channels[3];
    426		s64 ts __aligned(8);
    427	} scan[3];
    428};
    429
    430static __maybe_unused const struct iio_event_spec st_lsm6dsx_event = {
    431	.type = IIO_EV_TYPE_THRESH,
    432	.dir = IIO_EV_DIR_EITHER,
    433	.mask_separate = BIT(IIO_EV_INFO_VALUE) |
    434			 BIT(IIO_EV_INFO_ENABLE)
    435};
    436
    437static __maybe_unused const unsigned long st_lsm6dsx_available_scan_masks[] = {
    438	0x7, 0x0,
    439};
    440
    441extern const struct dev_pm_ops st_lsm6dsx_pm_ops;
    442
    443int st_lsm6dsx_probe(struct device *dev, int irq, int hw_id,
    444		     struct regmap *regmap);
    445int st_lsm6dsx_sensor_set_enable(struct st_lsm6dsx_sensor *sensor,
    446				 bool enable);
    447int st_lsm6dsx_fifo_setup(struct st_lsm6dsx_hw *hw);
    448int st_lsm6dsx_set_watermark(struct iio_dev *iio_dev, unsigned int val);
    449int st_lsm6dsx_update_watermark(struct st_lsm6dsx_sensor *sensor,
    450				u16 watermark);
    451int st_lsm6dsx_update_fifo(struct st_lsm6dsx_sensor *sensor, bool enable);
    452int st_lsm6dsx_flush_fifo(struct st_lsm6dsx_hw *hw);
    453int st_lsm6dsx_resume_fifo(struct st_lsm6dsx_hw *hw);
    454int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw);
    455int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *hw);
    456int st_lsm6dsx_check_odr(struct st_lsm6dsx_sensor *sensor, u32 odr, u8 *val);
    457int st_lsm6dsx_shub_probe(struct st_lsm6dsx_hw *hw, const char *name);
    458int st_lsm6dsx_shub_set_enable(struct st_lsm6dsx_sensor *sensor, bool enable);
    459int st_lsm6dsx_set_page(struct st_lsm6dsx_hw *hw, bool enable);
    460
    461static inline int
    462st_lsm6dsx_update_bits_locked(struct st_lsm6dsx_hw *hw, unsigned int addr,
    463			      unsigned int mask, unsigned int val)
    464{
    465	int err;
    466
    467	mutex_lock(&hw->page_lock);
    468	err = regmap_update_bits(hw->regmap, addr, mask, val);
    469	mutex_unlock(&hw->page_lock);
    470
    471	return err;
    472}
    473
    474static inline int
    475st_lsm6dsx_read_locked(struct st_lsm6dsx_hw *hw, unsigned int addr,
    476		       void *val, unsigned int len)
    477{
    478	int err;
    479
    480	mutex_lock(&hw->page_lock);
    481	err = regmap_bulk_read(hw->regmap, addr, val, len);
    482	mutex_unlock(&hw->page_lock);
    483
    484	return err;
    485}
    486
    487static inline int
    488st_lsm6dsx_write_locked(struct st_lsm6dsx_hw *hw, unsigned int addr,
    489			unsigned int val)
    490{
    491	int err;
    492
    493	mutex_lock(&hw->page_lock);
    494	err = regmap_write(hw->regmap, addr, val);
    495	mutex_unlock(&hw->page_lock);
    496
    497	return err;
    498}
    499
    500static inline const struct iio_mount_matrix *
    501st_lsm6dsx_get_mount_matrix(const struct iio_dev *iio_dev,
    502			    const struct iio_chan_spec *chan)
    503{
    504	struct st_lsm6dsx_sensor *sensor = iio_priv(iio_dev);
    505	struct st_lsm6dsx_hw *hw = sensor->hw;
    506
    507	return &hw->orientation;
    508}
    509
    510static const
    511struct iio_chan_spec_ext_info __maybe_unused st_lsm6dsx_accel_ext_info[] = {
    512	IIO_MOUNT_MATRIX(IIO_SHARED_BY_ALL, st_lsm6dsx_get_mount_matrix),
    513	{ }
    514};
    515
    516#endif /* ST_LSM6DSX_H */