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;
98

source code of linux/drivers/iio/gyro/mpu3050.h