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