1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _BMC150_ACCEL_H_ 3 #define _BMC150_ACCEL_H_ 4 5 #include <linux/atomic.h> 6 #include <linux/iio/iio.h> 7 #include <linux/mutex.h> 8 #include <linux/regulator/consumer.h> 9 #include <linux/workqueue.h> 10 11 struct regmap; 12 struct i2c_client; 13 struct bmc150_accel_chip_info; 14 struct bmc150_accel_interrupt_info; 15 16 /* 17 * We can often guess better than "UNKNOWN" based on the device IDs 18 * but unfortunately this information is not always accurate. There are some 19 * devices where ACPI firmware specifies an ID like "BMA250E" when the device 20 * actually has a BMA222E. The driver attempts to detect those by reading the 21 * chip ID from the registers but this information is not always enough either. 22 * 23 * Therefore, this enum should be only used when the chip ID detection is not 24 * enough and we can be reasonably sure that the device IDs are reliable 25 * in practice (e.g. for device tree platforms). 26 */ 27 enum bmc150_type { 28 BOSCH_UNKNOWN, 29 BOSCH_BMC156, 30 }; 31 32 struct bmc150_accel_interrupt { 33 const struct bmc150_accel_interrupt_info *info; 34 atomic_t users; 35 }; 36 37 struct bmc150_accel_trigger { 38 struct bmc150_accel_data *data; 39 struct iio_trigger *indio_trig; 40 int (*setup)(struct bmc150_accel_trigger *t, bool state); 41 int intr; 42 bool enabled; 43 }; 44 45 enum bmc150_accel_interrupt_id { 46 BMC150_ACCEL_INT_DATA_READY, 47 BMC150_ACCEL_INT_ANY_MOTION, 48 BMC150_ACCEL_INT_WATERMARK, 49 BMC150_ACCEL_INTERRUPTS, 50 }; 51 52 enum bmc150_accel_trigger_id { 53 BMC150_ACCEL_TRIGGER_DATA_READY, 54 BMC150_ACCEL_TRIGGER_ANY_MOTION, 55 BMC150_ACCEL_TRIGGERS, 56 }; 57 58 struct bmc150_accel_data { 59 struct regmap *regmap; 60 struct regulator_bulk_data regulators[2]; 61 struct bmc150_accel_interrupt interrupts[BMC150_ACCEL_INTERRUPTS]; 62 struct bmc150_accel_trigger triggers[BMC150_ACCEL_TRIGGERS]; 63 struct mutex mutex; 64 u8 fifo_mode, watermark; 65 s16 buffer[8]; 66 /* 67 * Ensure there is sufficient space and correct alignment for 68 * the timestamp if enabled 69 */ 70 struct { 71 __le16 channels[3]; 72 s64 ts __aligned(8); 73 } scan; 74 u8 bw_bits; 75 u32 slope_dur; 76 u32 slope_thres; 77 u32 range; 78 int ev_enable_state; 79 int64_t timestamp, old_timestamp; /* Only used in hw fifo mode. */ 80 const struct bmc150_accel_chip_info *chip_info; 81 enum bmc150_type type; 82 struct i2c_client *second_device; 83 void (*resume_callback)(struct device *dev); 84 struct delayed_work resume_work; 85 struct iio_mount_matrix orientation; 86 }; 87 88 int bmc150_accel_core_probe(struct device *dev, struct regmap *regmap, int irq, 89 enum bmc150_type type, const char *name, 90 bool block_supported); 91 void bmc150_accel_core_remove(struct device *dev); 92 extern const struct dev_pm_ops bmc150_accel_pm_ops; 93 extern const struct regmap_config bmc150_regmap_conf; 94 95 #endif /* _BMC150_ACCEL_H_ */ 96