1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * ADXL313 3-Axis Digital Accelerometer 4 * 5 * Copyright (c) 2021 Lucas Stankus <lucas.p.stankus@gmail.com> 6 */ 7 8#ifndef _ADXL313_H_ 9#define _ADXL313_H_ 10 11#include <linux/iio/iio.h> 12 13/* ADXL313 register definitions */ 14#define ADXL313_REG_DEVID0 0x00 15#define ADXL313_REG_DEVID1 0x01 16#define ADXL313_REG_PARTID 0x02 17#define ADXL313_REG_XID 0x04 18#define ADXL313_REG_SOFT_RESET 0x18 19#define ADXL313_REG_OFS_AXIS(index) (0x1E + (index)) 20#define ADXL313_REG_THRESH_ACT 0x24 21#define ADXL313_REG_ACT_INACT_CTL 0x27 22#define ADXL313_REG_BW_RATE 0x2C 23#define ADXL313_REG_POWER_CTL 0x2D 24#define ADXL313_REG_INT_MAP 0x2F 25#define ADXL313_REG_DATA_FORMAT 0x31 26#define ADXL313_REG_DATA_AXIS(index) (0x32 + ((index) * 2)) 27#define ADXL313_REG_FIFO_CTL 0x38 28#define ADXL313_REG_FIFO_STATUS 0x39 29 30#define ADXL313_DEVID0 0xAD 31#define ADXL313_DEVID0_ADXL312_314 0xE5 32#define ADXL313_DEVID1 0x1D 33#define ADXL313_PARTID 0xCB 34#define ADXL313_SOFT_RESET 0x52 35 36#define ADXL313_RATE_MSK GENMASK(3, 0) 37#define ADXL313_RATE_BASE 6 38 39#define ADXL313_POWER_CTL_MSK GENMASK(3, 2) 40#define ADXL313_MEASUREMENT_MODE BIT(3) 41 42#define ADXL313_RANGE_MSK GENMASK(1, 0) 43#define ADXL313_RANGE_MAX 3 44 45#define ADXL313_FULL_RES BIT(3) 46#define ADXL313_SPI_3WIRE BIT(6) 47#define ADXL313_I2C_DISABLE BIT(6) 48 49extern const struct regmap_access_table adxl312_readable_regs_table; 50extern const struct regmap_access_table adxl313_readable_regs_table; 51extern const struct regmap_access_table adxl314_readable_regs_table; 52 53extern const struct regmap_access_table adxl312_writable_regs_table; 54extern const struct regmap_access_table adxl313_writable_regs_table; 55extern const struct regmap_access_table adxl314_writable_regs_table; 56 57enum adxl313_device_type { 58 ADXL312, 59 ADXL313, 60 ADXL314, 61}; 62 63struct adxl313_data { 64 struct regmap *regmap; 65 const struct adxl313_chip_info *chip_info; 66 struct mutex lock; /* lock to protect transf_buf */ 67 __le16 transf_buf __aligned(IIO_DMA_MINALIGN); 68}; 69 70struct adxl313_chip_info { 71 const char *name; 72 enum adxl313_device_type type; 73 int scale_factor; 74 bool variable_range; 75 bool soft_reset; 76 int (*check_id)(struct device *dev, struct adxl313_data *data); 77}; 78 79extern const struct adxl313_chip_info adxl31x_chip_info[]; 80 81int adxl313_core_probe(struct device *dev, 82 struct regmap *regmap, 83 const struct adxl313_chip_info *chip_info, 84 int (*setup)(struct device *, struct regmap *)); 85#endif /* _ADXL313_H_ */ 86