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

mpu3050.h (2806B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#include <linux/iio/iio.h>
      3#include <linux/mutex.h>
      4#include <linux/regmap.h>
      5#include <linux/regulator/consumer.h>
      6#include <linux/i2c.h>
      7
      8/**
      9 * enum mpu3050_fullscale - indicates the full range of the sensor in deg/sec
     10 */
     11enum mpu3050_fullscale {
     12	FS_250_DPS = 0,
     13	FS_500_DPS,
     14	FS_1000_DPS,
     15	FS_2000_DPS,
     16};
     17
     18/**
     19 * enum mpu3050_lpf - indicates the low pass filter width
     20 */
     21enum mpu3050_lpf {
     22	/* This implicity sets sample frequency to 8 kHz */
     23	LPF_256_HZ_NOLPF = 0,
     24	/* All others sets the sample frequency to 1 kHz */
     25	LPF_188_HZ,
     26	LPF_98_HZ,
     27	LPF_42_HZ,
     28	LPF_20_HZ,
     29	LPF_10_HZ,
     30	LPF_5_HZ,
     31	LPF_2100_HZ_NOLPF,
     32};
     33
     34enum mpu3050_axis {
     35	AXIS_X = 0,
     36	AXIS_Y,
     37	AXIS_Z,
     38	AXIS_MAX,
     39};
     40
     41/**
     42 * struct mpu3050 - instance state container for the device
     43 * @dev: parent device for this instance
     44 * @orientation: mounting matrix, flipped axis etc
     45 * @map: regmap to reach the registers
     46 * @lock: serialization lock to marshal all requests
     47 * @irq: the IRQ used for this device
     48 * @regs: the regulators to power this device
     49 * @fullscale: the current fullscale setting for the device
     50 * @lpf: digital low pass filter setting for the device
     51 * @divisor: base frequency divider: divides 8 or 1 kHz
     52 * @calibration: the three signed 16-bit calibration settings that
     53 * get written into the offset registers for each axis to compensate
     54 * for DC offsets
     55 * @trig: trigger for the MPU-3050 interrupt, if present
     56 * @hw_irq_trigger: hardware interrupt trigger is in use
     57 * @irq_actl: interrupt is active low
     58 * @irq_latch: latched IRQ, this means that it is a level IRQ
     59 * @irq_opendrain: the interrupt line shall be configured open drain
     60 * @pending_fifo_footer: tells us if there is a pending footer in the FIFO
     61 * that we have to read out first when handling the FIFO
     62 * @hw_timestamp: latest hardware timestamp from the trigger IRQ, when in
     63 * use
     64 * @i2cmux: an I2C mux reflecting the fact that this sensor is a hub with
     65 * a pass-through I2C interface coming out of it: this device needs to be
     66 * powered up in order to reach devices on the other side of this mux
     67 */
     68struct mpu3050 {
     69	struct device *dev;
     70	struct iio_mount_matrix orientation;
     71	struct regmap *map;
     72	struct mutex lock;
     73	int irq;
     74	struct regulator_bulk_data regs[2];
     75	enum mpu3050_fullscale fullscale;
     76	enum mpu3050_lpf lpf;
     77	u8 divisor;
     78	s16 calibration[3];
     79	struct iio_trigger *trig;
     80	bool hw_irq_trigger;
     81	bool irq_actl;
     82	bool irq_latch;
     83	bool irq_opendrain;
     84	bool pending_fifo_footer;
     85	s64 hw_timestamp;
     86	struct i2c_mux_core *i2cmux;
     87};
     88
     89/* Probe called from different transports */
     90int mpu3050_common_probe(struct device *dev,
     91			 struct regmap *map,
     92			 int irq,
     93			 const char *name);
     94void mpu3050_common_remove(struct device *dev);
     95
     96/* PM ops */
     97extern const struct dev_pm_ops mpu3050_dev_pm_ops;