112ed2786SPuranjay Mohan // SPDX-License-Identifier: GPL-2.0-only 212ed2786SPuranjay Mohan /* 312ed2786SPuranjay Mohan * ADXL355 3-Axis Digital Accelerometer I2C driver 412ed2786SPuranjay Mohan * 512ed2786SPuranjay Mohan * Copyright (c) 2021 Puranjay Mohan <puranjay12@gmail.com> 612ed2786SPuranjay Mohan */ 712ed2786SPuranjay Mohan 812ed2786SPuranjay Mohan #include <linux/i2c.h> 912ed2786SPuranjay Mohan #include <linux/module.h> 1012ed2786SPuranjay Mohan #include <linux/mod_devicetable.h> 1112ed2786SPuranjay Mohan #include <linux/regmap.h> 1212ed2786SPuranjay Mohan 1312ed2786SPuranjay Mohan #include "adxl355.h" 1412ed2786SPuranjay Mohan 1512ed2786SPuranjay Mohan static const struct regmap_config adxl355_i2c_regmap_config = { 1612ed2786SPuranjay Mohan .reg_bits = 8, 1712ed2786SPuranjay Mohan .val_bits = 8, 1812ed2786SPuranjay Mohan .max_register = 0x2F, 1912ed2786SPuranjay Mohan .rd_table = &adxl355_readable_regs_tbl, 2012ed2786SPuranjay Mohan .wr_table = &adxl355_writeable_regs_tbl, 2112ed2786SPuranjay Mohan }; 2212ed2786SPuranjay Mohan 2312ed2786SPuranjay Mohan static int adxl355_i2c_probe(struct i2c_client *client) 2412ed2786SPuranjay Mohan { 2512ed2786SPuranjay Mohan struct regmap *regmap; 26*d3532d69SRamona Bolboaca const struct adxl355_chip_info *chip_data; 27*d3532d69SRamona Bolboaca const struct i2c_device_id *adxl355; 28*d3532d69SRamona Bolboaca 29*d3532d69SRamona Bolboaca chip_data = device_get_match_data(&client->dev); 30*d3532d69SRamona Bolboaca if (!chip_data) { 31*d3532d69SRamona Bolboaca adxl355 = to_i2c_driver(client->dev.driver)->id_table; 32*d3532d69SRamona Bolboaca if (!adxl355) 33*d3532d69SRamona Bolboaca return -EINVAL; 34*d3532d69SRamona Bolboaca 35*d3532d69SRamona Bolboaca chip_data = (void *)i2c_match_id(adxl355, client)->driver_data; 36*d3532d69SRamona Bolboaca 37*d3532d69SRamona Bolboaca if (!chip_data) 38*d3532d69SRamona Bolboaca return -EINVAL; 39*d3532d69SRamona Bolboaca } 4012ed2786SPuranjay Mohan 4112ed2786SPuranjay Mohan regmap = devm_regmap_init_i2c(client, &adxl355_i2c_regmap_config); 4212ed2786SPuranjay Mohan if (IS_ERR(regmap)) { 4312ed2786SPuranjay Mohan dev_err(&client->dev, "Error initializing i2c regmap: %ld\n", 4412ed2786SPuranjay Mohan PTR_ERR(regmap)); 4512ed2786SPuranjay Mohan 4612ed2786SPuranjay Mohan return PTR_ERR(regmap); 4712ed2786SPuranjay Mohan } 4812ed2786SPuranjay Mohan 49*d3532d69SRamona Bolboaca return adxl355_core_probe(&client->dev, regmap, chip_data); 5012ed2786SPuranjay Mohan } 5112ed2786SPuranjay Mohan 5212ed2786SPuranjay Mohan static const struct i2c_device_id adxl355_i2c_id[] = { 53*d3532d69SRamona Bolboaca { "adxl355", (kernel_ulong_t)&adxl35x_chip_info[ADXL355] }, 54*d3532d69SRamona Bolboaca { "adxl359", (kernel_ulong_t)&adxl35x_chip_info[ADXL359] }, 5512ed2786SPuranjay Mohan { } 5612ed2786SPuranjay Mohan }; 5712ed2786SPuranjay Mohan MODULE_DEVICE_TABLE(i2c, adxl355_i2c_id); 5812ed2786SPuranjay Mohan 5912ed2786SPuranjay Mohan static const struct of_device_id adxl355_of_match[] = { 60*d3532d69SRamona Bolboaca { .compatible = "adi,adxl355", .data = &adxl35x_chip_info[ADXL355] }, 61*d3532d69SRamona Bolboaca { .compatible = "adi,adxl359", .data = &adxl35x_chip_info[ADXL359] }, 6212ed2786SPuranjay Mohan { } 6312ed2786SPuranjay Mohan }; 6412ed2786SPuranjay Mohan MODULE_DEVICE_TABLE(of, adxl355_of_match); 6512ed2786SPuranjay Mohan 6612ed2786SPuranjay Mohan static struct i2c_driver adxl355_i2c_driver = { 6712ed2786SPuranjay Mohan .driver = { 6812ed2786SPuranjay Mohan .name = "adxl355_i2c", 6912ed2786SPuranjay Mohan .of_match_table = adxl355_of_match, 7012ed2786SPuranjay Mohan }, 7112ed2786SPuranjay Mohan .probe_new = adxl355_i2c_probe, 7212ed2786SPuranjay Mohan .id_table = adxl355_i2c_id, 7312ed2786SPuranjay Mohan }; 7412ed2786SPuranjay Mohan module_i2c_driver(adxl355_i2c_driver); 7512ed2786SPuranjay Mohan 7612ed2786SPuranjay Mohan MODULE_AUTHOR("Puranjay Mohan <puranjay12@gmail.com>"); 7712ed2786SPuranjay Mohan MODULE_DESCRIPTION("ADXL355 3-Axis Digital Accelerometer I2C driver"); 7812ed2786SPuranjay Mohan MODULE_LICENSE("GPL v2"); 79fe2fe330SJonathan Cameron MODULE_IMPORT_NS(IIO_ADXL355); 80