Re: [PATCH v6 3/4] iio: accel: adxl345: Split driver into core and I2C

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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, &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 <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");
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux