Re: [PATCH v6 3/4] iio: accel: adxl345: Split driver into core and I2C
From: Jonathan Cameron
Date: Sat Mar 04 2017 - 12:16:35 EST
On 04/03/17 08:31, Eva Rachel Retuya wrote:
> 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@xxxxxxxxx>
> Reviewed-by: Andy Shevchenko <andy.shevchenko@xxxxxxxxx>
Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders
to play with it.
Thanks,
Jonathan
> ---
> Changes from v5:
> * Simplify configuration dependency to "depends on INPUT_ADXL34X=n"
> * Rename functions from *_common_* to *_core_*
> * Modify header comment: place indication at the beginning
> * Remove explicit casting to int in handling devm_regmap_init_i2c() error,
> use %ld instead
> * Remove temporary variable 'name'
>
> drivers/iio/accel/Kconfig | 13 +++--
> drivers/iio/accel/Makefile | 3 +-
> drivers/iio/accel/adxl345.h | 18 ++++++
> drivers/iio/accel/{adxl345.c => adxl345_core.c} | 57 ++++---------------
> drivers/iio/accel/adxl345_i2c.c | 73 +++++++++++++++++++++++++
> 5 files changed, 113 insertions(+), 51 deletions(-)
> create mode 100644 drivers/iio/accel/adxl345.h
> rename drivers/iio/accel/{adxl345.c => adxl345_core.c} (77%)
> create mode 100644 drivers/iio/accel/adxl345_i2c.c
>
> diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
> index 26b8614..a725227 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 618488d..3f4a6d6 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 0000000..c1ddf39
> --- /dev/null
> +++ b/drivers/iio/accel/adxl345.h
> @@ -0,0 +1,18 @@
> +/*
> + * ADXL345 3-Axis Digital Accelerometer
> + *
> + * Copyright (c) 2017 Eva Rachel Retuya <eraretuya@xxxxxxxxx>
> + *
> + * 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
> similarity index 77%
> rename from drivers/iio/accel/adxl345.c
> rename to drivers/iio/accel/adxl345_core.c
> index 87fdd9f..9ccb582 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@xxxxxxxxx>
> *
> * 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@xxxxxxxxx>");
> -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 0000000..05e1ec4
> --- /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@xxxxxxxxx>
> + *
> + * 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@xxxxxxxxx>");
> +MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer I2C driver");
> +MODULE_LICENSE("GPL v2");
>