1636d4463SLucas Stankus /* SPDX-License-Identifier: GPL-2.0-only */ 2636d4463SLucas Stankus /* 3636d4463SLucas Stankus * ADXL313 3-Axis Digital Accelerometer 4636d4463SLucas Stankus * 5636d4463SLucas Stankus * Copyright (c) 2021 Lucas Stankus <lucas.p.stankus@gmail.com> 6636d4463SLucas Stankus */ 7636d4463SLucas Stankus 8636d4463SLucas Stankus #ifndef _ADXL313_H_ 9636d4463SLucas Stankus #define _ADXL313_H_ 10636d4463SLucas Stankus 11*a7a1c60bSGeorge Mois #include <linux/iio/iio.h> 12*a7a1c60bSGeorge Mois 13636d4463SLucas Stankus /* ADXL313 register definitions */ 14636d4463SLucas Stankus #define ADXL313_REG_DEVID0 0x00 15636d4463SLucas Stankus #define ADXL313_REG_DEVID1 0x01 16636d4463SLucas Stankus #define ADXL313_REG_PARTID 0x02 17636d4463SLucas Stankus #define ADXL313_REG_XID 0x04 18636d4463SLucas Stankus #define ADXL313_REG_SOFT_RESET 0x18 19636d4463SLucas Stankus #define ADXL313_REG_OFS_AXIS(index) (0x1E + (index)) 20636d4463SLucas Stankus #define ADXL313_REG_THRESH_ACT 0x24 21636d4463SLucas Stankus #define ADXL313_REG_ACT_INACT_CTL 0x27 22636d4463SLucas Stankus #define ADXL313_REG_BW_RATE 0x2C 23636d4463SLucas Stankus #define ADXL313_REG_POWER_CTL 0x2D 24636d4463SLucas Stankus #define ADXL313_REG_INT_MAP 0x2F 25636d4463SLucas Stankus #define ADXL313_REG_DATA_FORMAT 0x31 26636d4463SLucas Stankus #define ADXL313_REG_DATA_AXIS(index) (0x32 + ((index) * 2)) 27636d4463SLucas Stankus #define ADXL313_REG_FIFO_CTL 0x38 28636d4463SLucas Stankus #define ADXL313_REG_FIFO_STATUS 0x39 29636d4463SLucas Stankus 30636d4463SLucas Stankus #define ADXL313_DEVID0 0xAD 31*a7a1c60bSGeorge Mois #define ADXL313_DEVID0_ADXL312_314 0xE5 32636d4463SLucas Stankus #define ADXL313_DEVID1 0x1D 33636d4463SLucas Stankus #define ADXL313_PARTID 0xCB 34636d4463SLucas Stankus #define ADXL313_SOFT_RESET 0x52 35636d4463SLucas Stankus 36636d4463SLucas Stankus #define ADXL313_RATE_MSK GENMASK(3, 0) 37636d4463SLucas Stankus #define ADXL313_RATE_BASE 6 38636d4463SLucas Stankus 39636d4463SLucas Stankus #define ADXL313_POWER_CTL_MSK GENMASK(3, 2) 40636d4463SLucas Stankus #define ADXL313_MEASUREMENT_MODE BIT(3) 41636d4463SLucas Stankus 42636d4463SLucas Stankus #define ADXL313_RANGE_MSK GENMASK(1, 0) 43*a7a1c60bSGeorge Mois #define ADXL313_RANGE_MAX 3 44636d4463SLucas Stankus 45636d4463SLucas Stankus #define ADXL313_FULL_RES BIT(3) 46636d4463SLucas Stankus #define ADXL313_SPI_3WIRE BIT(6) 47636d4463SLucas Stankus #define ADXL313_I2C_DISABLE BIT(6) 48636d4463SLucas Stankus 49*a7a1c60bSGeorge Mois extern const struct regmap_access_table adxl312_readable_regs_table; 50636d4463SLucas Stankus extern const struct regmap_access_table adxl313_readable_regs_table; 51*a7a1c60bSGeorge Mois extern const struct regmap_access_table adxl314_readable_regs_table; 52636d4463SLucas Stankus 53*a7a1c60bSGeorge Mois extern const struct regmap_access_table adxl312_writable_regs_table; 54636d4463SLucas Stankus extern const struct regmap_access_table adxl313_writable_regs_table; 55*a7a1c60bSGeorge Mois extern const struct regmap_access_table adxl314_writable_regs_table; 56*a7a1c60bSGeorge Mois 57*a7a1c60bSGeorge Mois enum adxl313_device_type { 58*a7a1c60bSGeorge Mois ADXL312, 59*a7a1c60bSGeorge Mois ADXL313, 60*a7a1c60bSGeorge Mois ADXL314, 61*a7a1c60bSGeorge Mois }; 62*a7a1c60bSGeorge Mois 63*a7a1c60bSGeorge Mois struct adxl313_data { 64*a7a1c60bSGeorge Mois struct regmap *regmap; 65*a7a1c60bSGeorge Mois const struct adxl313_chip_info *chip_info; 66*a7a1c60bSGeorge Mois struct mutex lock; /* lock to protect transf_buf */ 67*a7a1c60bSGeorge Mois __le16 transf_buf __aligned(IIO_DMA_MINALIGN); 68*a7a1c60bSGeorge Mois }; 69*a7a1c60bSGeorge Mois 70*a7a1c60bSGeorge Mois struct adxl313_chip_info { 71*a7a1c60bSGeorge Mois const char *name; 72*a7a1c60bSGeorge Mois enum adxl313_device_type type; 73*a7a1c60bSGeorge Mois int scale_factor; 74*a7a1c60bSGeorge Mois bool variable_range; 75*a7a1c60bSGeorge Mois bool soft_reset; 76*a7a1c60bSGeorge Mois int (*check_id)(struct device *dev, struct adxl313_data *data); 77*a7a1c60bSGeorge Mois }; 78*a7a1c60bSGeorge Mois 79*a7a1c60bSGeorge Mois extern const struct adxl313_chip_info adxl31x_chip_info[]; 80636d4463SLucas Stankus 81636d4463SLucas Stankus int adxl313_core_probe(struct device *dev, 82636d4463SLucas Stankus struct regmap *regmap, 83*a7a1c60bSGeorge Mois const struct adxl313_chip_info *chip_info, 84636d4463SLucas Stankus int (*setup)(struct device *, struct regmap *)); 85636d4463SLucas Stankus #endif /* _ADXL313_H_ */ 86