diff options
author | Eva Rachel Retuya <eraretuya@gmail.com> | 2017-03-04 09:31:25 +0100 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2017-03-04 17:45:08 +0100 |
commit | 5170512cf6a17373b3a8bb63187a6e90ddf7c1ca (patch) | |
tree | 23477c75026e73231dda78d0dd9bca20739d39a8 /drivers/iio | |
parent | iio: accel: adxl345: Use I2C regmap instead of direct I2C access (diff) | |
download | linux-5170512cf6a17373b3a8bb63187a6e90ddf7c1ca.tar.xz linux-5170512cf6a17373b3a8bb63187a6e90ddf7c1ca.zip |
iio: accel: adxl345: Split driver into core and I2C
Move I2C-specific code into its own file and rely on regmap to access
registers. The core code provides access to x, y, z and scale readings.
Signed-off-by: Eva Rachel Retuya <eraretuya@gmail.com>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio')
-rw-r--r-- | drivers/iio/accel/Kconfig | 13 | ||||
-rw-r--r-- | drivers/iio/accel/Makefile | 3 | ||||
-rw-r--r-- | drivers/iio/accel/adxl345.h | 18 | ||||
-rw-r--r-- | drivers/iio/accel/adxl345_core.c (renamed from drivers/iio/accel/adxl345.c) | 57 | ||||
-rw-r--r-- | drivers/iio/accel/adxl345_i2c.c | 73 |
5 files changed, 113 insertions, 51 deletions
diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig index 26b86149f20b..a725227aa7ca 100644 --- a/drivers/iio/accel/Kconfig +++ b/drivers/iio/accel/Kconfig @@ -6,16 +6,21 @@ menu "Accelerometers" config ADXL345 - tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver" - depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m) + tristate + +config ADXL345_I2C + tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer I2C Driver" + depends on INPUT_ADXL34X=n depends on I2C + select ADXL345 select REGMAP_I2C help Say Y here if you want to build support for the Analog Devices ADXL345 3-axis digital accelerometer. - To compile this driver as a module, choose M here: the - module will be called adxl345. + To compile this driver as a module, choose M here: the module + will be called adxl345_i2c and you will also get adxl345_core + for the core module. config BMA180 tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver" diff --git a/drivers/iio/accel/Makefile b/drivers/iio/accel/Makefile index 618488de1161..3f4a6d62d84c 100644 --- a/drivers/iio/accel/Makefile +++ b/drivers/iio/accel/Makefile @@ -3,7 +3,8 @@ # # When adding new entries keep the list in alphabetical order -obj-$(CONFIG_ADXL345) += adxl345.o +obj-$(CONFIG_ADXL345) += adxl345_core.o +obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o obj-$(CONFIG_BMA180) += bma180.o obj-$(CONFIG_BMA220) += bma220_spi.o obj-$(CONFIG_BMC150_ACCEL) += bmc150-accel-core.o diff --git a/drivers/iio/accel/adxl345.h b/drivers/iio/accel/adxl345.h new file mode 100644 index 000000000000..c1ddf3927c47 --- /dev/null +++ b/drivers/iio/accel/adxl345.h @@ -0,0 +1,18 @@ +/* + * ADXL345 3-Axis Digital Accelerometer + * + * Copyright (c) 2017 Eva Rachel Retuya <eraretuya@gmail.com> + * + * This file is subject to the terms and conditions of version 2 of + * the GNU General Public License. See the file COPYING in the main + * directory of this archive for more details. + */ + +#ifndef _ADXL345_H_ +#define _ADXL345_H_ + +int adxl345_core_probe(struct device *dev, struct regmap *regmap, + const char *name); +int adxl345_core_remove(struct device *dev); + +#endif /* _ADXL345_H_ */ diff --git a/drivers/iio/accel/adxl345.c b/drivers/iio/accel/adxl345_core.c index 87fdd9f45958..9ccb5828db98 100644 --- a/drivers/iio/accel/adxl345.c +++ b/drivers/iio/accel/adxl345_core.c @@ -1,23 +1,20 @@ /* - * ADXL345 3-Axis Digital Accelerometer + * ADXL345 3-Axis Digital Accelerometer IIO core driver * * Copyright (c) 2017 Eva Rachel Retuya <eraretuya@gmail.com> * * This file is subject to the terms and conditions of version 2 of * the GNU General Public License. See the file COPYING in the main * directory of this archive for more details. - * - * IIO driver for ADXL345 - * 7-bit I2C slave address: 0x1D (ALT ADDRESS pin tied to VDDIO) or - * 0x53 (ALT ADDRESS pin grounded) */ -#include <linux/i2c.h> #include <linux/module.h> #include <linux/regmap.h> #include <linux/iio/iio.h> +#include "adxl345.h" + #define ADXL345_REG_DEVID 0x00 #define ADXL345_REG_POWER_CTL 0x2D #define ADXL345_REG_DATA_FORMAT 0x31 @@ -50,11 +47,6 @@ struct adxl345_data { u8 data_range; }; -static const struct regmap_config adxl345_regmap_config = { - .reg_bits = 8, - .val_bits = 8, -}; - #define ADXL345_CHANNEL(reg, axis) { \ .type = IIO_ACCEL, \ .modified = 1, \ @@ -107,25 +99,14 @@ static const struct iio_info adxl345_info = { .read_raw = adxl345_read_raw, }; -static int adxl345_probe(struct i2c_client *client, - const struct i2c_device_id *id) +int adxl345_core_probe(struct device *dev, struct regmap *regmap, + const char *name) { struct adxl345_data *data; struct iio_dev *indio_dev; - struct regmap *regmap; - struct device *dev; u32 regval; int ret; - regmap = devm_regmap_init_i2c(client, &adxl345_regmap_config); - if (IS_ERR(regmap)) { - dev_err(&client->dev, "Error initializing regmap: %ld\n", - PTR_ERR(regmap)); - return PTR_ERR(regmap); - } - - dev = regmap_get_device(regmap); - ret = regmap_read(regmap, ADXL345_REG_DEVID, ®val); if (ret < 0) { dev_err(dev, "Error reading device ID: %d\n", ret); @@ -156,7 +137,7 @@ static int adxl345_probe(struct i2c_client *client, } indio_dev->dev.parent = dev; - indio_dev->name = id->name; + indio_dev->name = name; indio_dev->info = &adxl345_info; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = adxl345_channels; @@ -179,10 +160,11 @@ static int adxl345_probe(struct i2c_client *client, return ret; } +EXPORT_SYMBOL_GPL(adxl345_core_probe); -static int adxl345_remove(struct i2c_client *client) +int adxl345_core_remove(struct device *dev) { - struct iio_dev *indio_dev = i2c_get_clientdata(client); + struct iio_dev *indio_dev = dev_get_drvdata(dev); struct adxl345_data *data = iio_priv(indio_dev); iio_device_unregister(indio_dev); @@ -190,25 +172,8 @@ static int adxl345_remove(struct i2c_client *client) return regmap_write(data->regmap, ADXL345_REG_POWER_CTL, ADXL345_POWER_CTL_STANDBY); } - -static const struct i2c_device_id adxl345_i2c_id[] = { - { "adxl345", 0 }, - { } -}; - -MODULE_DEVICE_TABLE(i2c, adxl345_i2c_id); - -static struct i2c_driver adxl345_driver = { - .driver = { - .name = "adxl345", - }, - .probe = adxl345_probe, - .remove = adxl345_remove, - .id_table = adxl345_i2c_id, -}; - -module_i2c_driver(adxl345_driver); +EXPORT_SYMBOL_GPL(adxl345_core_remove); MODULE_AUTHOR("Eva Rachel Retuya <eraretuya@gmail.com>"); -MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer driver"); +MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer core driver"); MODULE_LICENSE("GPL v2"); diff --git a/drivers/iio/accel/adxl345_i2c.c b/drivers/iio/accel/adxl345_i2c.c new file mode 100644 index 000000000000..05e1ec49700c --- /dev/null +++ b/drivers/iio/accel/adxl345_i2c.c @@ -0,0 +1,73 @@ +/* + * ADXL345 3-Axis Digital Accelerometer I2C driver + * + * Copyright (c) 2017 Eva Rachel Retuya <eraretuya@gmail.com> + * + * This file is subject to the terms and conditions of version 2 of + * the GNU General Public License. See the file COPYING in the main + * directory of this archive for more details. + * + * 7-bit I2C slave address: 0x1D (ALT ADDRESS pin tied to VDDIO) or + * 0x53 (ALT ADDRESS pin grounded) + */ + +#include <linux/i2c.h> +#include <linux/module.h> +#include <linux/regmap.h> + +#include "adxl345.h" + +static const struct regmap_config adxl345_i2c_regmap_config = { + .reg_bits = 8, + .val_bits = 8, +}; + +static int adxl345_i2c_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct regmap *regmap; + + regmap = devm_regmap_init_i2c(client, &adxl345_i2c_regmap_config); + if (IS_ERR(regmap)) { + dev_err(&client->dev, "Error initializing i2c regmap: %ld\n", + PTR_ERR(regmap)); + return PTR_ERR(regmap); + } + + return adxl345_core_probe(&client->dev, regmap, id ? id->name : NULL); +} + +static int adxl345_i2c_remove(struct i2c_client *client) +{ + return adxl345_core_remove(&client->dev); +} + +static const struct i2c_device_id adxl345_i2c_id[] = { + { "adxl345", 0 }, + { } +}; + +MODULE_DEVICE_TABLE(i2c, adxl345_i2c_id); + +static const struct of_device_id adxl345_of_match[] = { + { .compatible = "adi,adxl345" }, + { }, +}; + +MODULE_DEVICE_TABLE(of, adxl345_of_match); + +static struct i2c_driver adxl345_i2c_driver = { + .driver = { + .name = "adxl345_i2c", + .of_match_table = adxl345_of_match, + }, + .probe = adxl345_i2c_probe, + .remove = adxl345_i2c_remove, + .id_table = adxl345_i2c_id, +}; + +module_i2c_driver(adxl345_i2c_driver); + +MODULE_AUTHOR("Eva Rachel Retuya <eraretuya@gmail.com>"); +MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer I2C driver"); +MODULE_LICENSE("GPL v2"); |