xref: /openbmc/linux/drivers/iio/accel/bmc150-accel.h (revision addab6fe)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
255637c38SMarkus Pargmann #ifndef _BMC150_ACCEL_H_
355637c38SMarkus Pargmann #define _BMC150_ACCEL_H_
455637c38SMarkus Pargmann 
5ba8bd0b3SHans de Goede #include <linux/atomic.h>
6ba8bd0b3SHans de Goede #include <linux/iio/iio.h>
7ba8bd0b3SHans de Goede #include <linux/mutex.h>
8ba8bd0b3SHans de Goede #include <linux/regulator/consumer.h>
9*addab6feSHans de Goede #include <linux/workqueue.h>
10ba8bd0b3SHans de Goede 
1155637c38SMarkus Pargmann struct regmap;
12ba8bd0b3SHans de Goede struct i2c_client;
13ba8bd0b3SHans de Goede struct bmc150_accel_chip_info;
14ba8bd0b3SHans de Goede struct bmc150_accel_interrupt_info;
15ba8bd0b3SHans de Goede 
16ba8bd0b3SHans de Goede struct bmc150_accel_interrupt {
17ba8bd0b3SHans de Goede 	const struct bmc150_accel_interrupt_info *info;
18ba8bd0b3SHans de Goede 	atomic_t users;
19ba8bd0b3SHans de Goede };
20ba8bd0b3SHans de Goede 
21ba8bd0b3SHans de Goede struct bmc150_accel_trigger {
22ba8bd0b3SHans de Goede 	struct bmc150_accel_data *data;
23ba8bd0b3SHans de Goede 	struct iio_trigger *indio_trig;
24ba8bd0b3SHans de Goede 	int (*setup)(struct bmc150_accel_trigger *t, bool state);
25ba8bd0b3SHans de Goede 	int intr;
26ba8bd0b3SHans de Goede 	bool enabled;
27ba8bd0b3SHans de Goede };
28ba8bd0b3SHans de Goede 
29ba8bd0b3SHans de Goede enum bmc150_accel_interrupt_id {
30ba8bd0b3SHans de Goede 	BMC150_ACCEL_INT_DATA_READY,
31ba8bd0b3SHans de Goede 	BMC150_ACCEL_INT_ANY_MOTION,
32ba8bd0b3SHans de Goede 	BMC150_ACCEL_INT_WATERMARK,
33ba8bd0b3SHans de Goede 	BMC150_ACCEL_INTERRUPTS,
34ba8bd0b3SHans de Goede };
35ba8bd0b3SHans de Goede 
36ba8bd0b3SHans de Goede enum bmc150_accel_trigger_id {
37ba8bd0b3SHans de Goede 	BMC150_ACCEL_TRIGGER_DATA_READY,
38ba8bd0b3SHans de Goede 	BMC150_ACCEL_TRIGGER_ANY_MOTION,
39ba8bd0b3SHans de Goede 	BMC150_ACCEL_TRIGGERS,
40ba8bd0b3SHans de Goede };
41ba8bd0b3SHans de Goede 
42ba8bd0b3SHans de Goede struct bmc150_accel_data {
43ba8bd0b3SHans de Goede 	struct regmap *regmap;
44ba8bd0b3SHans de Goede 	struct regulator_bulk_data regulators[2];
45ba8bd0b3SHans de Goede 	struct bmc150_accel_interrupt interrupts[BMC150_ACCEL_INTERRUPTS];
46ba8bd0b3SHans de Goede 	struct bmc150_accel_trigger triggers[BMC150_ACCEL_TRIGGERS];
47ba8bd0b3SHans de Goede 	struct mutex mutex;
48ba8bd0b3SHans de Goede 	u8 fifo_mode, watermark;
49ba8bd0b3SHans de Goede 	s16 buffer[8];
50ba8bd0b3SHans de Goede 	/*
51ba8bd0b3SHans de Goede 	 * Ensure there is sufficient space and correct alignment for
52ba8bd0b3SHans de Goede 	 * the timestamp if enabled
53ba8bd0b3SHans de Goede 	 */
54ba8bd0b3SHans de Goede 	struct {
55ba8bd0b3SHans de Goede 		__le16 channels[3];
56ba8bd0b3SHans de Goede 		s64 ts __aligned(8);
57ba8bd0b3SHans de Goede 	} scan;
58ba8bd0b3SHans de Goede 	u8 bw_bits;
59ba8bd0b3SHans de Goede 	u32 slope_dur;
60ba8bd0b3SHans de Goede 	u32 slope_thres;
61ba8bd0b3SHans de Goede 	u32 range;
62ba8bd0b3SHans de Goede 	int ev_enable_state;
63ba8bd0b3SHans de Goede 	int64_t timestamp, old_timestamp; /* Only used in hw fifo mode. */
64ba8bd0b3SHans de Goede 	const struct bmc150_accel_chip_info *chip_info;
65ba8bd0b3SHans de Goede 	struct i2c_client *second_device;
66*addab6feSHans de Goede 	void (*resume_callback)(struct device *dev);
67*addab6feSHans de Goede 	struct delayed_work resume_work;
68ba8bd0b3SHans de Goede 	struct iio_mount_matrix orientation;
69ba8bd0b3SHans de Goede };
7055637c38SMarkus Pargmann 
7155637c38SMarkus Pargmann enum {
7255637c38SMarkus Pargmann 	bmc150,
7355637c38SMarkus Pargmann 	bmi055,
7455637c38SMarkus Pargmann 	bma255,
7555637c38SMarkus Pargmann 	bma250e,
76a1a210bfSLinus Walleij 	bma222,
7755637c38SMarkus Pargmann 	bma222e,
7855637c38SMarkus Pargmann 	bma280,
7955637c38SMarkus Pargmann };
8055637c38SMarkus Pargmann 
8155637c38SMarkus Pargmann int bmc150_accel_core_probe(struct device *dev, struct regmap *regmap, int irq,
8255637c38SMarkus Pargmann 			    const char *name, bool block_supported);
8355637c38SMarkus Pargmann int bmc150_accel_core_remove(struct device *dev);
8455637c38SMarkus Pargmann extern const struct dev_pm_ops bmc150_accel_pm_ops;
85486294f1SIrina Tirdea extern const struct regmap_config bmc150_regmap_conf;
8655637c38SMarkus Pargmann 
8755637c38SMarkus Pargmann #endif  /* _BMC150_ACCEL_H_ */
88