1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /* SPDX-License-Identifier: GPL-2.0 */
- #include <linux/iio/iio.h>
- #include <linux/mutex.h>
- #include <linux/regmap.h>
- #include <linux/regulator/consumer.h>
- #include <linux/i2c.h>
- /**
- * enum mpu3050_fullscale - indicates the full range of the sensor in deg/sec
- */
- enum mpu3050_fullscale {
- FS_250_DPS = 0,
- FS_500_DPS,
- FS_1000_DPS,
- FS_2000_DPS,
- };
- /**
- * enum mpu3050_lpf - indicates the low pass filter width
- */
- enum mpu3050_lpf {
- /* This implicity sets sample frequency to 8 kHz */
- LPF_256_HZ_NOLPF = 0,
- /* All others sets the sample frequency to 1 kHz */
- LPF_188_HZ,
- LPF_98_HZ,
- LPF_42_HZ,
- LPF_20_HZ,
- LPF_10_HZ,
- LPF_5_HZ,
- LPF_2100_HZ_NOLPF,
- };
- enum mpu3050_axis {
- AXIS_X = 0,
- AXIS_Y,
- AXIS_Z,
- AXIS_MAX,
- };
- /**
- * struct mpu3050 - instance state container for the device
- * @dev: parent device for this instance
- * @orientation: mounting matrix, flipped axis etc
- * @map: regmap to reach the registers
- * @lock: serialization lock to marshal all requests
- * @irq: the IRQ used for this device
- * @regs: the regulators to power this device
- * @fullscale: the current fullscale setting for the device
- * @lpf: digital low pass filter setting for the device
- * @divisor: base frequency divider: divides 8 or 1 kHz
- * @calibration: the three signed 16-bit calibration settings that
- * get written into the offset registers for each axis to compensate
- * for DC offsets
- * @trig: trigger for the MPU-3050 interrupt, if present
- * @hw_irq_trigger: hardware interrupt trigger is in use
- * @irq_actl: interrupt is active low
- * @irq_latch: latched IRQ, this means that it is a level IRQ
- * @irq_opendrain: the interrupt line shall be configured open drain
- * @pending_fifo_footer: tells us if there is a pending footer in the FIFO
- * that we have to read out first when handling the FIFO
- * @hw_timestamp: latest hardware timestamp from the trigger IRQ, when in
- * use
- * @i2cmux: an I2C mux reflecting the fact that this sensor is a hub with
- * a pass-through I2C interface coming out of it: this device needs to be
- * powered up in order to reach devices on the other side of this mux
- */
- struct mpu3050 {
- struct device *dev;
- struct iio_mount_matrix orientation;
- struct regmap *map;
- struct mutex lock;
- int irq;
- struct regulator_bulk_data regs[2];
- enum mpu3050_fullscale fullscale;
- enum mpu3050_lpf lpf;
- u8 divisor;
- s16 calibration[3];
- struct iio_trigger *trig;
- bool hw_irq_trigger;
- bool irq_actl;
- bool irq_latch;
- bool irq_opendrain;
- bool pending_fifo_footer;
- s64 hw_timestamp;
- struct i2c_mux_core *i2cmux;
- };
- /* Probe called from different transports */
- int mpu3050_common_probe(struct device *dev,
- struct regmap *map,
- int irq,
- const char *name);
- int mpu3050_common_remove(struct device *dev);
- /* PM ops */
- extern const struct dev_pm_ops mpu3050_dev_pm_ops;
|