1465c811fSDan Robertson /* SPDX-License-Identifier: GPL-2.0-only */ 2465c811fSDan Robertson /* 3465c811fSDan Robertson * Register constants and other forward declarations needed by the bma400 4465c811fSDan Robertson * sources. 5465c811fSDan Robertson * 6465c811fSDan Robertson * Copyright 2019 Dan Robertson <dan@dlrobertson.com> 7465c811fSDan Robertson */ 8465c811fSDan Robertson 9465c811fSDan Robertson #ifndef _BMA400_H_ 10465c811fSDan Robertson #define _BMA400_H_ 11465c811fSDan Robertson 12465c811fSDan Robertson #include <linux/bits.h> 13465c811fSDan Robertson #include <linux/regmap.h> 14465c811fSDan Robertson 15465c811fSDan Robertson /* 16465c811fSDan Robertson * Read-Only Registers 17465c811fSDan Robertson */ 18465c811fSDan Robertson 19465c811fSDan Robertson /* Status and ID registers */ 20465c811fSDan Robertson #define BMA400_CHIP_ID_REG 0x00 21465c811fSDan Robertson #define BMA400_ERR_REG 0x02 22465c811fSDan Robertson #define BMA400_STATUS_REG 0x03 23465c811fSDan Robertson 24465c811fSDan Robertson /* Acceleration registers */ 25465c811fSDan Robertson #define BMA400_X_AXIS_LSB_REG 0x04 26465c811fSDan Robertson #define BMA400_X_AXIS_MSB_REG 0x05 27465c811fSDan Robertson #define BMA400_Y_AXIS_LSB_REG 0x06 28465c811fSDan Robertson #define BMA400_Y_AXIS_MSB_REG 0x07 29465c811fSDan Robertson #define BMA400_Z_AXIS_LSB_REG 0x08 30465c811fSDan Robertson #define BMA400_Z_AXIS_MSB_REG 0x09 31465c811fSDan Robertson 32465c811fSDan Robertson /* Sensor time registers */ 33465c811fSDan Robertson #define BMA400_SENSOR_TIME0 0x0a 34465c811fSDan Robertson #define BMA400_SENSOR_TIME1 0x0b 35465c811fSDan Robertson #define BMA400_SENSOR_TIME2 0x0c 36465c811fSDan Robertson 37465c811fSDan Robertson /* Event and interrupt registers */ 38465c811fSDan Robertson #define BMA400_EVENT_REG 0x0d 39465c811fSDan Robertson #define BMA400_INT_STAT0_REG 0x0e 40465c811fSDan Robertson #define BMA400_INT_STAT1_REG 0x0f 41465c811fSDan Robertson #define BMA400_INT_STAT2_REG 0x10 42465c811fSDan Robertson 43465c811fSDan Robertson /* Temperature register */ 44465c811fSDan Robertson #define BMA400_TEMP_DATA_REG 0x11 45465c811fSDan Robertson 46465c811fSDan Robertson /* FIFO length and data registers */ 47465c811fSDan Robertson #define BMA400_FIFO_LENGTH0_REG 0x12 48465c811fSDan Robertson #define BMA400_FIFO_LENGTH1_REG 0x13 49465c811fSDan Robertson #define BMA400_FIFO_DATA_REG 0x14 50465c811fSDan Robertson 51465c811fSDan Robertson /* Step count registers */ 52465c811fSDan Robertson #define BMA400_STEP_CNT0_REG 0x15 53465c811fSDan Robertson #define BMA400_STEP_CNT1_REG 0x16 54465c811fSDan Robertson #define BMA400_STEP_CNT3_REG 0x17 55465c811fSDan Robertson #define BMA400_STEP_STAT_REG 0x18 56465c811fSDan Robertson 57465c811fSDan Robertson /* 58465c811fSDan Robertson * Read-write configuration registers 59465c811fSDan Robertson */ 60465c811fSDan Robertson #define BMA400_ACC_CONFIG0_REG 0x19 61465c811fSDan Robertson #define BMA400_ACC_CONFIG1_REG 0x1a 62465c811fSDan Robertson #define BMA400_ACC_CONFIG2_REG 0x1b 63465c811fSDan Robertson #define BMA400_CMD_REG 0x7e 64465c811fSDan Robertson 65*ffe0ab6aSJagath Jog J /* Interrupt registers */ 66*ffe0ab6aSJagath Jog J #define BMA400_INT_CONFIG0_REG 0x1f 67*ffe0ab6aSJagath Jog J #define BMA400_INT_CONFIG1_REG 0x20 68*ffe0ab6aSJagath Jog J #define BMA400_INT1_MAP_REG 0x21 69*ffe0ab6aSJagath Jog J #define BMA400_INT_IO_CTRL_REG 0x24 70*ffe0ab6aSJagath Jog J #define BMA400_INT_DRDY_MSK BIT(7) 71*ffe0ab6aSJagath Jog J 72465c811fSDan Robertson /* Chip ID of BMA 400 devices found in the chip ID register. */ 73465c811fSDan Robertson #define BMA400_ID_REG_VAL 0x90 74465c811fSDan Robertson 75465c811fSDan Robertson #define BMA400_LP_OSR_SHIFT 5 76465c811fSDan Robertson #define BMA400_NP_OSR_SHIFT 4 77465c811fSDan Robertson #define BMA400_SCALE_SHIFT 6 78465c811fSDan Robertson 79465c811fSDan Robertson #define BMA400_TWO_BITS_MASK GENMASK(1, 0) 80465c811fSDan Robertson #define BMA400_LP_OSR_MASK GENMASK(6, 5) 81465c811fSDan Robertson #define BMA400_NP_OSR_MASK GENMASK(5, 4) 82465c811fSDan Robertson #define BMA400_ACC_ODR_MASK GENMASK(3, 0) 83465c811fSDan Robertson #define BMA400_ACC_SCALE_MASK GENMASK(7, 6) 84465c811fSDan Robertson 85465c811fSDan Robertson #define BMA400_ACC_ODR_MIN_RAW 0x05 86465c811fSDan Robertson #define BMA400_ACC_ODR_LP_RAW 0x06 87465c811fSDan Robertson #define BMA400_ACC_ODR_MAX_RAW 0x0b 88465c811fSDan Robertson 89465c811fSDan Robertson #define BMA400_ACC_ODR_MAX_HZ 800 90465c811fSDan Robertson #define BMA400_ACC_ODR_MIN_WHOLE_HZ 25 91465c811fSDan Robertson #define BMA400_ACC_ODR_MIN_HZ 12 92465c811fSDan Robertson 93747c7cf1SJagath Jog J /* 94747c7cf1SJagath Jog J * BMA400_SCALE_MIN macro value represents m/s^2 for 1 LSB before 95747c7cf1SJagath Jog J * converting to micro values for +-2g range. 96747c7cf1SJagath Jog J * 97747c7cf1SJagath Jog J * For +-2g - 1 LSB = 0.976562 milli g = 0.009576 m/s^2 98747c7cf1SJagath Jog J * For +-4g - 1 LSB = 1.953125 milli g = 0.019153 m/s^2 99747c7cf1SJagath Jog J * For +-16g - 1 LSB = 7.8125 milli g = 0.076614 m/s^2 100747c7cf1SJagath Jog J * 101747c7cf1SJagath Jog J * The raw value which is used to select the different ranges is determined 102747c7cf1SJagath Jog J * by the first bit set position from the scale value, so BMA400_SCALE_MIN 103747c7cf1SJagath Jog J * should be odd. 104747c7cf1SJagath Jog J * 105747c7cf1SJagath Jog J * Scale values for +-2g, +-4g, +-8g and +-16g are populated into bma400_scales 106747c7cf1SJagath Jog J * array by left shifting BMA400_SCALE_MIN. 107747c7cf1SJagath Jog J * e.g.: 108747c7cf1SJagath Jog J * To select +-2g = 9577 << 0 = raw value to write is 0. 109747c7cf1SJagath Jog J * To select +-8g = 9577 << 2 = raw value to write is 2. 110747c7cf1SJagath Jog J * To select +-16g = 9577 << 3 = raw value to write is 3. 111747c7cf1SJagath Jog J */ 112747c7cf1SJagath Jog J #define BMA400_SCALE_MIN 9577 113747c7cf1SJagath Jog J #define BMA400_SCALE_MAX 76617 114465c811fSDan Robertson 1153cf7ded1SDan Robertson #define BMA400_NUM_REGULATORS 2 1163cf7ded1SDan Robertson #define BMA400_VDD_REGULATOR 0 1173cf7ded1SDan Robertson #define BMA400_VDDIO_REGULATOR 1 1183cf7ded1SDan Robertson 119465c811fSDan Robertson extern const struct regmap_config bma400_regmap_config; 120465c811fSDan Robertson 121*ffe0ab6aSJagath Jog J int bma400_probe(struct device *dev, struct regmap *regmap, int irq, 122*ffe0ab6aSJagath Jog J const char *name); 123465c811fSDan Robertson 124465c811fSDan Robertson #endif 125