98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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);
 | |
| void mpu3050_common_remove(struct device *dev);
 | |
| 
 | |
| /* PM ops */
 | |
| extern const struct dev_pm_ops mpu3050_dev_pm_ops;
 |