forked from analogdevicesinc/linux
-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <[email protected]> Reviewed-by: Andy Shevchenko <[email protected]> Signed-off-by: Jonathan Cameron <[email protected]>
- Loading branch information
Showing
5 changed files
with
113 additions
and
51 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
/* | ||
* ADXL345 3-Axis Digital Accelerometer | ||
* | ||
* Copyright (c) 2017 Eva Rachel Retuya <[email protected]> | ||
* | ||
* 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_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,23 +1,20 @@ | ||
/* | ||
* ADXL345 3-Axis Digital Accelerometer | ||
* ADXL345 3-Axis Digital Accelerometer IIO core driver | ||
* | ||
* Copyright (c) 2017 Eva Rachel Retuya <[email protected]> | ||
* | ||
* 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,36 +160,20 @@ 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); | ||
|
||
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 <[email protected]>"); | ||
MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer driver"); | ||
MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer core driver"); | ||
MODULE_LICENSE("GPL v2"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/* | ||
* ADXL345 3-Axis Digital Accelerometer I2C driver | ||
* | ||
* Copyright (c) 2017 Eva Rachel Retuya <[email protected]> | ||
* | ||
* 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 <[email protected]>"); | ||
MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer I2C driver"); | ||
MODULE_LICENSE("GPL v2"); |