Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drivers: iio: accel: adxl312 and adxl314 support

ADXL312 and ADXL314 are small, thin, low power, 3-axis accelerometers
with high resolution (13-bit) measurement up to +/-12 g and +/- 200 g
respectively.

Implement support for ADXL312 and ADXL314 by extending the ADXL313
driver.

Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/ADXL312.pdf
Datasheet: https://www.analog.com/media/en/technical-documentation/data-sheets/ADXL314.pdf
Signed-off-by: George Mois <george.mois@analog.com>
Link: https://lore.kernel.org/r/20220905132018.364900-2-george.mois@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

George Mois and committed by
Jonathan Cameron
a7a1c60b abf90541

+282 -94
+33 -2
drivers/iio/accel/adxl313.h
··· 8 8 #ifndef _ADXL313_H_ 9 9 #define _ADXL313_H_ 10 10 11 + #include <linux/iio/iio.h> 12 + 11 13 /* ADXL313 register definitions */ 12 14 #define ADXL313_REG_DEVID0 0x00 13 15 #define ADXL313_REG_DEVID1 0x01 ··· 28 26 #define ADXL313_REG_FIFO_STATUS 0x39 29 27 30 28 #define ADXL313_DEVID0 0xAD 29 + #define ADXL313_DEVID0_ADXL312_314 0xE5 31 30 #define ADXL313_DEVID1 0x1D 32 31 #define ADXL313_PARTID 0xCB 33 32 #define ADXL313_SOFT_RESET 0x52 ··· 40 37 #define ADXL313_MEASUREMENT_MODE BIT(3) 41 38 42 39 #define ADXL313_RANGE_MSK GENMASK(1, 0) 43 - #define ADXL313_RANGE_4G 3 40 + #define ADXL313_RANGE_MAX 3 44 41 45 42 #define ADXL313_FULL_RES BIT(3) 46 43 #define ADXL313_SPI_3WIRE BIT(6) 47 44 #define ADXL313_I2C_DISABLE BIT(6) 48 45 46 + extern const struct regmap_access_table adxl312_readable_regs_table; 49 47 extern const struct regmap_access_table adxl313_readable_regs_table; 48 + extern const struct regmap_access_table adxl314_readable_regs_table; 50 49 50 + extern const struct regmap_access_table adxl312_writable_regs_table; 51 51 extern const struct regmap_access_table adxl313_writable_regs_table; 52 + extern const struct regmap_access_table adxl314_writable_regs_table; 53 + 54 + enum adxl313_device_type { 55 + ADXL312, 56 + ADXL313, 57 + ADXL314, 58 + }; 59 + 60 + struct adxl313_data { 61 + struct regmap *regmap; 62 + const struct adxl313_chip_info *chip_info; 63 + struct mutex lock; /* lock to protect transf_buf */ 64 + __le16 transf_buf __aligned(IIO_DMA_MINALIGN); 65 + }; 66 + 67 + struct adxl313_chip_info { 68 + const char *name; 69 + enum adxl313_device_type type; 70 + int scale_factor; 71 + bool variable_range; 72 + bool soft_reset; 73 + int (*check_id)(struct device *dev, struct adxl313_data *data); 74 + }; 75 + 76 + extern const struct adxl313_chip_info adxl31x_chip_info[]; 52 77 53 78 int adxl313_core_probe(struct device *dev, 54 79 struct regmap *regmap, 55 - const char *name, 80 + const struct adxl313_chip_info *chip_info, 56 81 int (*setup)(struct device *, struct regmap *)); 57 82 #endif /* _ADXL313_H_ */
+148 -56
drivers/iio/accel/adxl313_core.c
··· 8 8 */ 9 9 10 10 #include <linux/bitfield.h> 11 - #include <linux/iio/iio.h> 12 11 #include <linux/module.h> 13 12 #include <linux/regmap.h> 14 13 15 14 #include "adxl313.h" 15 + 16 + static const struct regmap_range adxl312_readable_reg_range[] = { 17 + regmap_reg_range(ADXL313_REG_DEVID0, ADXL313_REG_DEVID0), 18 + regmap_reg_range(ADXL313_REG_OFS_AXIS(0), ADXL313_REG_OFS_AXIS(2)), 19 + regmap_reg_range(ADXL313_REG_THRESH_ACT, ADXL313_REG_ACT_INACT_CTL), 20 + regmap_reg_range(ADXL313_REG_BW_RATE, ADXL313_REG_FIFO_STATUS), 21 + }; 16 22 17 23 static const struct regmap_range adxl313_readable_reg_range[] = { 18 24 regmap_reg_range(ADXL313_REG_DEVID0, ADXL313_REG_XID), ··· 28 22 regmap_reg_range(ADXL313_REG_BW_RATE, ADXL313_REG_FIFO_STATUS), 29 23 }; 30 24 25 + const struct regmap_access_table adxl312_readable_regs_table = { 26 + .yes_ranges = adxl312_readable_reg_range, 27 + .n_yes_ranges = ARRAY_SIZE(adxl312_readable_reg_range), 28 + }; 29 + EXPORT_SYMBOL_NS_GPL(adxl312_readable_regs_table, IIO_ADXL313); 30 + 31 31 const struct regmap_access_table adxl313_readable_regs_table = { 32 32 .yes_ranges = adxl313_readable_reg_range, 33 33 .n_yes_ranges = ARRAY_SIZE(adxl313_readable_reg_range), 34 34 }; 35 35 EXPORT_SYMBOL_NS_GPL(adxl313_readable_regs_table, IIO_ADXL313); 36 + 37 + const struct regmap_access_table adxl314_readable_regs_table = { 38 + .yes_ranges = adxl312_readable_reg_range, 39 + .n_yes_ranges = ARRAY_SIZE(adxl312_readable_reg_range), 40 + }; 41 + EXPORT_SYMBOL_NS_GPL(adxl314_readable_regs_table, IIO_ADXL313); 42 + 43 + static int adxl312_check_id(struct device *dev, 44 + struct adxl313_data *data) 45 + { 46 + unsigned int regval; 47 + int ret; 48 + 49 + ret = regmap_read(data->regmap, ADXL313_REG_DEVID0, &regval); 50 + if (ret) 51 + return ret; 52 + 53 + if (regval != ADXL313_DEVID0_ADXL312_314) 54 + dev_warn(dev, "Invalid manufacturer ID: %#02x\n", regval); 55 + 56 + return 0; 57 + } 58 + 59 + static int adxl313_check_id(struct device *dev, 60 + struct adxl313_data *data) 61 + { 62 + unsigned int regval; 63 + int ret; 64 + 65 + ret = regmap_read(data->regmap, ADXL313_REG_DEVID0, &regval); 66 + if (ret) 67 + return ret; 68 + 69 + if (regval != ADXL313_DEVID0) 70 + dev_warn(dev, "Invalid manufacturer ID: 0x%02x\n", regval); 71 + 72 + /* Check DEVID1 and PARTID */ 73 + if (regval == ADXL313_DEVID0) { 74 + ret = regmap_read(data->regmap, ADXL313_REG_DEVID1, &regval); 75 + if (ret) 76 + return ret; 77 + 78 + if (regval != ADXL313_DEVID1) 79 + dev_warn(dev, "Invalid mems ID: 0x%02x\n", regval); 80 + 81 + ret = regmap_read(data->regmap, ADXL313_REG_PARTID, &regval); 82 + if (ret) 83 + return ret; 84 + 85 + if (regval != ADXL313_PARTID) 86 + dev_warn(dev, "Invalid device ID: 0x%02x\n", regval); 87 + } 88 + 89 + return 0; 90 + } 91 + 92 + const struct adxl313_chip_info adxl31x_chip_info[] = { 93 + [ADXL312] = { 94 + .name = "adxl312", 95 + .type = ADXL312, 96 + .scale_factor = 28425072, 97 + .variable_range = true, 98 + .soft_reset = false, 99 + .check_id = &adxl312_check_id, 100 + }, 101 + [ADXL313] = { 102 + .name = "adxl313", 103 + .type = ADXL313, 104 + .scale_factor = 9576806, 105 + .variable_range = true, 106 + .soft_reset = true, 107 + .check_id = &adxl313_check_id, 108 + }, 109 + [ADXL314] = { 110 + .name = "adxl314", 111 + .type = ADXL314, 112 + .scale_factor = 478858719, 113 + .variable_range = false, 114 + .soft_reset = false, 115 + .check_id = &adxl312_check_id, 116 + }, 117 + }; 118 + EXPORT_SYMBOL_NS_GPL(adxl31x_chip_info, IIO_ADXL313); 119 + 120 + static const struct regmap_range adxl312_writable_reg_range[] = { 121 + regmap_reg_range(ADXL313_REG_OFS_AXIS(0), ADXL313_REG_OFS_AXIS(2)), 122 + regmap_reg_range(ADXL313_REG_THRESH_ACT, ADXL313_REG_ACT_INACT_CTL), 123 + regmap_reg_range(ADXL313_REG_BW_RATE, ADXL313_REG_INT_MAP), 124 + regmap_reg_range(ADXL313_REG_DATA_FORMAT, ADXL313_REG_DATA_FORMAT), 125 + regmap_reg_range(ADXL313_REG_FIFO_CTL, ADXL313_REG_FIFO_CTL), 126 + }; 36 127 37 128 static const struct regmap_range adxl313_writable_reg_range[] = { 38 129 regmap_reg_range(ADXL313_REG_SOFT_RESET, ADXL313_REG_SOFT_RESET), ··· 140 37 regmap_reg_range(ADXL313_REG_FIFO_CTL, ADXL313_REG_FIFO_CTL), 141 38 }; 142 39 40 + const struct regmap_access_table adxl312_writable_regs_table = { 41 + .yes_ranges = adxl312_writable_reg_range, 42 + .n_yes_ranges = ARRAY_SIZE(adxl312_writable_reg_range), 43 + }; 44 + EXPORT_SYMBOL_NS_GPL(adxl312_writable_regs_table, IIO_ADXL313); 45 + 143 46 const struct regmap_access_table adxl313_writable_regs_table = { 144 47 .yes_ranges = adxl313_writable_reg_range, 145 48 .n_yes_ranges = ARRAY_SIZE(adxl313_writable_reg_range), 146 49 }; 147 50 EXPORT_SYMBOL_NS_GPL(adxl313_writable_regs_table, IIO_ADXL313); 148 51 149 - struct adxl313_data { 150 - struct regmap *regmap; 151 - struct mutex lock; /* lock to protect transf_buf */ 152 - __le16 transf_buf __aligned(IIO_DMA_MINALIGN); 52 + const struct regmap_access_table adxl314_writable_regs_table = { 53 + .yes_ranges = adxl312_writable_reg_range, 54 + .n_yes_ranges = ARRAY_SIZE(adxl312_writable_reg_range), 153 55 }; 56 + EXPORT_SYMBOL_NS_GPL(adxl314_writable_regs_table, IIO_ADXL313); 154 57 155 58 static const int adxl313_odr_freqs[][2] = { 156 59 [0] = { 6, 250000 }, ··· 265 156 *val = sign_extend32(ret, chan->scan_type.realbits - 1); 266 157 return IIO_VAL_INT; 267 158 case IIO_CHAN_INFO_SCALE: 268 - /* 269 - * Scale for any g range is given in datasheet as 270 - * 1024 LSB/g = 0.0009765625 * 9.80665 = 0.009576806640625 m/s^2 271 - */ 272 159 *val = 0; 273 - *val2 = 9576806; 160 + 161 + *val2 = data->chip_info->scale_factor; 162 + 274 163 return IIO_VAL_INT_PLUS_NANO; 275 164 case IIO_CHAN_INFO_CALIBBIAS: 276 165 ret = regmap_read(data->regmap, ··· 277 170 return ret; 278 171 279 172 /* 280 - * 8-bit resolution at +/- 0.5g, that is 4x accel data scale 173 + * 8-bit resolution at minimum range, that is 4x accel data scale 281 174 * factor at full resolution 282 175 */ 283 176 *val = sign_extend32(regval, 7) * 4; ··· 305 198 switch (mask) { 306 199 case IIO_CHAN_INFO_CALIBBIAS: 307 200 /* 308 - * 8-bit resolution at +/- 0.5g, that is 4x accel data scale 201 + * 8-bit resolution at minimum range, that is 4x accel data scale 309 202 * factor at full resolution 310 203 */ 311 204 if (clamp_val(val, -128 * 4, 127 * 4) != val) ··· 330 223 static int adxl313_setup(struct device *dev, struct adxl313_data *data, 331 224 int (*setup)(struct device *, struct regmap *)) 332 225 { 333 - unsigned int regval; 334 226 int ret; 335 227 336 - /* Ensures the device is in a consistent state after start up */ 337 - ret = regmap_write(data->regmap, ADXL313_REG_SOFT_RESET, 338 - ADXL313_SOFT_RESET); 339 - if (ret) 340 - return ret; 228 + /* 229 + * If sw reset available, ensures the device is in a consistent 230 + * state after start up 231 + */ 232 + if (data->chip_info->soft_reset) { 233 + ret = regmap_write(data->regmap, ADXL313_REG_SOFT_RESET, 234 + ADXL313_SOFT_RESET); 235 + if (ret) 236 + return ret; 237 + } 341 238 342 239 if (setup) { 343 240 ret = setup(dev, data->regmap); ··· 349 238 return ret; 350 239 } 351 240 352 - ret = regmap_read(data->regmap, ADXL313_REG_DEVID0, &regval); 241 + ret = data->chip_info->check_id(dev, data); 353 242 if (ret) 354 243 return ret; 355 244 356 - if (regval != ADXL313_DEVID0) { 357 - dev_err(dev, "Invalid manufacturer ID: 0x%02x\n", regval); 358 - return -ENODEV; 245 + /* Sets the range to maximum, full resolution, if applicable */ 246 + if (data->chip_info->variable_range) { 247 + ret = regmap_update_bits(data->regmap, ADXL313_REG_DATA_FORMAT, 248 + ADXL313_RANGE_MSK, 249 + FIELD_PREP(ADXL313_RANGE_MSK, ADXL313_RANGE_MAX)); 250 + if (ret) 251 + return ret; 252 + 253 + /* Enables full resolution */ 254 + ret = regmap_update_bits(data->regmap, ADXL313_REG_DATA_FORMAT, 255 + ADXL313_FULL_RES, ADXL313_FULL_RES); 256 + if (ret) 257 + return ret; 359 258 } 360 - 361 - ret = regmap_read(data->regmap, ADXL313_REG_DEVID1, &regval); 362 - if (ret) 363 - return ret; 364 - 365 - if (regval != ADXL313_DEVID1) { 366 - dev_err(dev, "Invalid mems ID: 0x%02x\n", regval); 367 - return -ENODEV; 368 - } 369 - 370 - ret = regmap_read(data->regmap, ADXL313_REG_PARTID, &regval); 371 - if (ret) 372 - return ret; 373 - 374 - if (regval != ADXL313_PARTID) { 375 - dev_err(dev, "Invalid device ID: 0x%02x\n", regval); 376 - return -ENODEV; 377 - } 378 - 379 - /* Sets the range to +/- 4g */ 380 - ret = regmap_update_bits(data->regmap, ADXL313_REG_DATA_FORMAT, 381 - ADXL313_RANGE_MSK, 382 - FIELD_PREP(ADXL313_RANGE_MSK, ADXL313_RANGE_4G)); 383 - if (ret) 384 - return ret; 385 - 386 - /* Enables full resolution */ 387 - ret = regmap_update_bits(data->regmap, ADXL313_REG_DATA_FORMAT, 388 - ADXL313_FULL_RES, ADXL313_FULL_RES); 389 - if (ret) 390 - return ret; 391 259 392 260 /* Enables measurement mode */ 393 261 return regmap_update_bits(data->regmap, ADXL313_REG_POWER_CTL, ··· 378 288 * adxl313_core_probe() - probe and setup for adxl313 accelerometer 379 289 * @dev: Driver model representation of the device 380 290 * @regmap: Register map of the device 381 - * @name: Device name buffer reference 291 + * @chip_info: Structure containing device specific data 382 292 * @setup: Setup routine to be executed right before the standard device 383 293 * setup, can also be set to NULL if not required 384 294 * ··· 386 296 */ 387 297 int adxl313_core_probe(struct device *dev, 388 298 struct regmap *regmap, 389 - const char *name, 299 + const struct adxl313_chip_info *chip_info, 390 300 int (*setup)(struct device *, struct regmap *)) 391 301 { 392 302 struct adxl313_data *data; ··· 399 309 400 310 data = iio_priv(indio_dev); 401 311 data->regmap = regmap; 312 + data->chip_info = chip_info; 313 + 402 314 mutex_init(&data->lock); 403 315 404 - indio_dev->name = name; 316 + indio_dev->name = chip_info->name; 405 317 indio_dev->info = &adxl313_info; 406 318 indio_dev->modes = INDIO_DIRECT_MODE; 407 319 indio_dev->channels = adxl313_channels;
+52 -22
drivers/iio/accel/adxl313_i2c.c
··· 14 14 15 15 #include "adxl313.h" 16 16 17 - static const struct regmap_config adxl313_i2c_regmap_config = { 18 - .reg_bits = 8, 19 - .val_bits = 8, 20 - .rd_table = &adxl313_readable_regs_table, 21 - .wr_table = &adxl313_writable_regs_table, 22 - .max_register = 0x39, 17 + static const struct regmap_config adxl31x_i2c_regmap_config[] = { 18 + [ADXL312] = { 19 + .reg_bits = 8, 20 + .val_bits = 8, 21 + .rd_table = &adxl312_readable_regs_table, 22 + .wr_table = &adxl312_writable_regs_table, 23 + .max_register = 0x39, 24 + }, 25 + [ADXL313] = { 26 + .reg_bits = 8, 27 + .val_bits = 8, 28 + .rd_table = &adxl313_readable_regs_table, 29 + .wr_table = &adxl313_writable_regs_table, 30 + .max_register = 0x39, 31 + }, 32 + [ADXL314] = { 33 + .reg_bits = 8, 34 + .val_bits = 8, 35 + .rd_table = &adxl314_readable_regs_table, 36 + .wr_table = &adxl314_writable_regs_table, 37 + .max_register = 0x39, 38 + }, 23 39 }; 24 40 25 - static int adxl313_i2c_probe(struct i2c_client *client) 26 - { 27 - struct regmap *regmap; 28 - 29 - regmap = devm_regmap_init_i2c(client, &adxl313_i2c_regmap_config); 30 - if (IS_ERR(regmap)) { 31 - dev_err(&client->dev, "Error initializing i2c regmap: %ld\n", 32 - PTR_ERR(regmap)); 33 - return PTR_ERR(regmap); 34 - } 35 - 36 - return adxl313_core_probe(&client->dev, regmap, client->name, NULL); 37 - } 38 - 39 41 static const struct i2c_device_id adxl313_i2c_id[] = { 40 - { "adxl313" }, 42 + { .name = "adxl312", .driver_data = (kernel_ulong_t)&adxl31x_chip_info[ADXL312] }, 43 + { .name = "adxl313", .driver_data = (kernel_ulong_t)&adxl31x_chip_info[ADXL312] }, 44 + { .name = "adxl314", .driver_data = (kernel_ulong_t)&adxl31x_chip_info[ADXL312] }, 41 45 { } 42 46 }; 43 47 44 48 MODULE_DEVICE_TABLE(i2c, adxl313_i2c_id); 45 49 46 50 static const struct of_device_id adxl313_of_match[] = { 47 - { .compatible = "adi,adxl313" }, 51 + { .compatible = "adi,adxl312", .data = &adxl31x_chip_info[ADXL312] }, 52 + { .compatible = "adi,adxl313", .data = &adxl31x_chip_info[ADXL313] }, 53 + { .compatible = "adi,adxl314", .data = &adxl31x_chip_info[ADXL314] }, 48 54 { } 49 55 }; 50 56 51 57 MODULE_DEVICE_TABLE(of, adxl313_of_match); 58 + 59 + static int adxl313_i2c_probe(struct i2c_client *client) 60 + { 61 + const struct adxl313_chip_info *chip_data; 62 + struct regmap *regmap; 63 + 64 + /* 65 + * Retrieves device specific data as a pointer to a 66 + * adxl313_chip_info structure 67 + */ 68 + chip_data = device_get_match_data(&client->dev); 69 + if (!chip_data) 70 + chip_data = (const struct adxl313_chip_info *)i2c_match_id(adxl313_i2c_id, client)->driver_data; 71 + 72 + regmap = devm_regmap_init_i2c(client, 73 + &adxl31x_i2c_regmap_config[chip_data->type]); 74 + if (IS_ERR(regmap)) { 75 + dev_err(&client->dev, "Error initializing i2c regmap: %ld\n", 76 + PTR_ERR(regmap)); 77 + return PTR_ERR(regmap); 78 + } 79 + 80 + return adxl313_core_probe(&client->dev, regmap, chip_data, NULL); 81 + } 52 82 53 83 static struct i2c_driver adxl313_i2c_driver = { 54 84 .driver = {
+49 -14
drivers/iio/accel/adxl313_spi.c
··· 11 11 #include <linux/module.h> 12 12 #include <linux/regmap.h> 13 13 #include <linux/spi/spi.h> 14 + #include <linux/property.h> 14 15 15 16 #include "adxl313.h" 16 17 17 - static const struct regmap_config adxl313_spi_regmap_config = { 18 - .reg_bits = 8, 19 - .val_bits = 8, 20 - .rd_table = &adxl313_readable_regs_table, 21 - .wr_table = &adxl313_writable_regs_table, 22 - .max_register = 0x39, 23 - /* Setting bits 7 and 6 enables multiple-byte read */ 24 - .read_flag_mask = BIT(7) | BIT(6), 18 + static const struct regmap_config adxl31x_spi_regmap_config[] = { 19 + [ADXL312] = { 20 + .reg_bits = 8, 21 + .val_bits = 8, 22 + .rd_table = &adxl312_readable_regs_table, 23 + .wr_table = &adxl312_writable_regs_table, 24 + .max_register = 0x39, 25 + /* Setting bits 7 and 6 enables multiple-byte read */ 26 + .read_flag_mask = BIT(7) | BIT(6), 27 + }, 28 + [ADXL313] = { 29 + .reg_bits = 8, 30 + .val_bits = 8, 31 + .rd_table = &adxl313_readable_regs_table, 32 + .wr_table = &adxl313_writable_regs_table, 33 + .max_register = 0x39, 34 + /* Setting bits 7 and 6 enables multiple-byte read */ 35 + .read_flag_mask = BIT(7) | BIT(6), 36 + }, 37 + [ADXL314] = { 38 + .reg_bits = 8, 39 + .val_bits = 8, 40 + .rd_table = &adxl314_readable_regs_table, 41 + .wr_table = &adxl314_writable_regs_table, 42 + .max_register = 0x39, 43 + /* Setting bits 7 and 6 enables multiple-byte read */ 44 + .read_flag_mask = BIT(7) | BIT(6), 45 + }, 25 46 }; 26 47 27 48 static int adxl313_spi_setup(struct device *dev, struct regmap *regmap) ··· 63 42 64 43 static int adxl313_spi_probe(struct spi_device *spi) 65 44 { 66 - const struct spi_device_id *id = spi_get_device_id(spi); 45 + const struct adxl313_chip_info *chip_data; 67 46 struct regmap *regmap; 68 47 int ret; 69 48 ··· 72 51 if (ret) 73 52 return ret; 74 53 75 - regmap = devm_regmap_init_spi(spi, &adxl313_spi_regmap_config); 54 + /* 55 + * Retrieves device specific data as a pointer to a 56 + * adxl313_chip_info structure 57 + */ 58 + chip_data = device_get_match_data(&spi->dev); 59 + if (!chip_data) 60 + chip_data = (const struct adxl313_chip_info *)spi_get_device_id(spi)->driver_data; 61 + 62 + regmap = devm_regmap_init_spi(spi, 63 + &adxl31x_spi_regmap_config[chip_data->type]); 64 + 76 65 if (IS_ERR(regmap)) { 77 66 dev_err(&spi->dev, "Error initializing spi regmap: %ld\n", 78 67 PTR_ERR(regmap)); 79 68 return PTR_ERR(regmap); 80 69 } 81 70 82 - return adxl313_core_probe(&spi->dev, regmap, id->name, 83 - &adxl313_spi_setup); 71 + return adxl313_core_probe(&spi->dev, regmap, 72 + chip_data, &adxl313_spi_setup); 84 73 } 85 74 86 75 static const struct spi_device_id adxl313_spi_id[] = { 87 - { "adxl313" }, 76 + { .name = "adxl312", .driver_data = (kernel_ulong_t)&adxl31x_chip_info[ADXL312] }, 77 + { .name = "adxl313", .driver_data = (kernel_ulong_t)&adxl31x_chip_info[ADXL313] }, 78 + { .name = "adxl314", .driver_data = (kernel_ulong_t)&adxl31x_chip_info[ADXL314] }, 88 79 { } 89 80 }; 90 81 91 82 MODULE_DEVICE_TABLE(spi, adxl313_spi_id); 92 83 93 84 static const struct of_device_id adxl313_of_match[] = { 94 - { .compatible = "adi,adxl313" }, 85 + { .compatible = "adi,adxl312", .data = &adxl31x_chip_info[ADXL312] }, 86 + { .compatible = "adi,adxl313", .data = &adxl31x_chip_info[ADXL313] }, 87 + { .compatible = "adi,adxl314", .data = &adxl31x_chip_info[ADXL314] }, 95 88 { } 96 89 }; 97 90