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 <eraret...@gmail.com>
> Reviewed-by: Andy Shevchenko <andy.shevche...@gmail.com>
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 <eraret...@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
> 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 <eraret...@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, &regval);
>       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 <eraret...@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 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 <eraret...@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 <eraret...@gmail.com>");
> +MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer I2C driver");
> +MODULE_LICENSE("GPL v2");
> 

Reply via email to