rjw | 1f88458 | 2022-01-06 17:20:42 +0800 | [diff] [blame^] | 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 | */ |
| 11 | enum 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 | */ |
| 21 | enum 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 | |
| 34 | enum 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 | */ |
| 68 | struct 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 */ |
| 90 | int mpu3050_common_probe(struct device *dev, |
| 91 | struct regmap *map, |
| 92 | int irq, |
| 93 | const char *name); |
| 94 | int mpu3050_common_remove(struct device *dev); |
| 95 | |
| 96 | /* PM ops */ |
| 97 | extern const struct dev_pm_ops mpu3050_dev_pm_ops; |