1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Register constants and other forward declarations needed by the bma400 4 * sources. 5 * 6 * Copyright 2019 Dan Robertson <dan@dlrobertson.com> 7 */ 8 9 #ifndef _BMA400_H_ 10 #define _BMA400_H_ 11 12 #include <linux/bits.h> 13 #include <linux/regmap.h> 14 15 /* 16 * Read-Only Registers 17 */ 18 19 /* Status and ID registers */ 20 #define BMA400_CHIP_ID_REG 0x00 21 #define BMA400_ERR_REG 0x02 22 #define BMA400_STATUS_REG 0x03 23 24 /* Acceleration registers */ 25 #define BMA400_X_AXIS_LSB_REG 0x04 26 #define BMA400_X_AXIS_MSB_REG 0x05 27 #define BMA400_Y_AXIS_LSB_REG 0x06 28 #define BMA400_Y_AXIS_MSB_REG 0x07 29 #define BMA400_Z_AXIS_LSB_REG 0x08 30 #define BMA400_Z_AXIS_MSB_REG 0x09 31 32 /* Sensor time registers */ 33 #define BMA400_SENSOR_TIME0 0x0a 34 #define BMA400_SENSOR_TIME1 0x0b 35 #define BMA400_SENSOR_TIME2 0x0c 36 37 /* Event and interrupt registers */ 38 #define BMA400_EVENT_REG 0x0d 39 #define BMA400_INT_STAT0_REG 0x0e 40 #define BMA400_INT_STAT1_REG 0x0f 41 #define BMA400_INT_STAT2_REG 0x10 42 #define BMA400_INT12_MAP_REG 0x23 43 44 /* Temperature register */ 45 #define BMA400_TEMP_DATA_REG 0x11 46 47 /* FIFO length and data registers */ 48 #define BMA400_FIFO_LENGTH0_REG 0x12 49 #define BMA400_FIFO_LENGTH1_REG 0x13 50 #define BMA400_FIFO_DATA_REG 0x14 51 52 /* Step count registers */ 53 #define BMA400_STEP_CNT0_REG 0x15 54 #define BMA400_STEP_CNT1_REG 0x16 55 #define BMA400_STEP_CNT3_REG 0x17 56 #define BMA400_STEP_STAT_REG 0x18 57 #define BMA400_STEP_INT_MSK BIT(0) 58 #define BMA400_STEP_RAW_LEN 0x03 59 #define BMA400_STEP_STAT_MASK GENMASK(9, 8) 60 61 /* 62 * Read-write configuration registers 63 */ 64 #define BMA400_ACC_CONFIG0_REG 0x19 65 #define BMA400_ACC_CONFIG1_REG 0x1a 66 #define BMA400_ACC_CONFIG2_REG 0x1b 67 #define BMA400_CMD_REG 0x7e 68 69 /* Interrupt registers */ 70 #define BMA400_INT_CONFIG0_REG 0x1f 71 #define BMA400_INT_CONFIG1_REG 0x20 72 #define BMA400_INT1_MAP_REG 0x21 73 #define BMA400_INT_IO_CTRL_REG 0x24 74 #define BMA400_INT_DRDY_MSK BIT(7) 75 76 /* Chip ID of BMA 400 devices found in the chip ID register. */ 77 #define BMA400_ID_REG_VAL 0x90 78 79 #define BMA400_LP_OSR_SHIFT 5 80 #define BMA400_NP_OSR_SHIFT 4 81 #define BMA400_SCALE_SHIFT 6 82 83 #define BMA400_TWO_BITS_MASK GENMASK(1, 0) 84 #define BMA400_LP_OSR_MASK GENMASK(6, 5) 85 #define BMA400_NP_OSR_MASK GENMASK(5, 4) 86 #define BMA400_ACC_ODR_MASK GENMASK(3, 0) 87 #define BMA400_ACC_SCALE_MASK GENMASK(7, 6) 88 89 #define BMA400_ACC_ODR_MIN_RAW 0x05 90 #define BMA400_ACC_ODR_LP_RAW 0x06 91 #define BMA400_ACC_ODR_MAX_RAW 0x0b 92 93 #define BMA400_ACC_ODR_MAX_HZ 800 94 #define BMA400_ACC_ODR_MIN_WHOLE_HZ 25 95 #define BMA400_ACC_ODR_MIN_HZ 12 96 97 /* Generic interrupts register */ 98 #define BMA400_GEN1INT_CONFIG0 0x3f 99 #define BMA400_GEN2INT_CONFIG0 0x4A 100 #define BMA400_GEN_CONFIG1_OFF 0x01 101 #define BMA400_GEN_CONFIG2_OFF 0x02 102 #define BMA400_GEN_CONFIG3_OFF 0x03 103 #define BMA400_GEN_CONFIG31_OFF 0x04 104 #define BMA400_INT_GEN1_MSK BIT(2) 105 #define BMA400_INT_GEN2_MSK BIT(3) 106 #define BMA400_GEN_HYST_MSK GENMASK(1, 0) 107 108 /* 109 * BMA400_SCALE_MIN macro value represents m/s^2 for 1 LSB before 110 * converting to micro values for +-2g range. 111 * 112 * For +-2g - 1 LSB = 0.976562 milli g = 0.009576 m/s^2 113 * For +-4g - 1 LSB = 1.953125 milli g = 0.019153 m/s^2 114 * For +-16g - 1 LSB = 7.8125 milli g = 0.076614 m/s^2 115 * 116 * The raw value which is used to select the different ranges is determined 117 * by the first bit set position from the scale value, so BMA400_SCALE_MIN 118 * should be odd. 119 * 120 * Scale values for +-2g, +-4g, +-8g and +-16g are populated into bma400_scales 121 * array by left shifting BMA400_SCALE_MIN. 122 * e.g.: 123 * To select +-2g = 9577 << 0 = raw value to write is 0. 124 * To select +-8g = 9577 << 2 = raw value to write is 2. 125 * To select +-16g = 9577 << 3 = raw value to write is 3. 126 */ 127 #define BMA400_SCALE_MIN 9577 128 #define BMA400_SCALE_MAX 76617 129 130 #define BMA400_NUM_REGULATORS 2 131 #define BMA400_VDD_REGULATOR 0 132 #define BMA400_VDDIO_REGULATOR 1 133 134 extern const struct regmap_config bma400_regmap_config; 135 136 int bma400_probe(struct device *dev, struct regmap *regmap, int irq, 137 const char *name); 138 139 #endif 140