* [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support
@ 2017-02-20 9:25 Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 1/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access Eva Rachel Retuya
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Eva Rachel Retuya @ 2017-02-20 9:25 UTC (permalink / raw)
To: jic23, linux-iio
Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
Eva Rachel Retuya
This patchset modifies the adxl345 to use regmap. In doing so, we can
easily introduce SPI support and let regmap handle the rest.
Recap of basic features: read_raw for x, y and z axes, scale. After
applying this series, driver now supports the SPI protocol and enumeration
of device via ACPI.
Changes from v1:
[PATCH 1/4]
* Move other deletions from patch 2 in here -- make it clear what got deleted
and/or modified that is hard to see previously
* Introduce the driver header file "adxl345.h" here instead of doing it in the
next patch
* Completely omit traces of i2c_client and let this file (adxl345.c) mirror the
core file on the next patch.
* Improve debugging print about invalid device ID in probe.
[PATCH 2/4]
* Update Kconfig to Jonathan's preferred style
* Improve similarity index from 78% to 100% (rename detection)
[PATCH 4/4]
* Correct acpi_device_id: ADX0345 -> ADS0345
Eva Rachel Retuya (4):
iio: accel: adxl345: Use I2C regmap instead of direct I2C access
iio: accel: adxl345: Split driver into core and I2C
iio: accel: adxl345: Add SPI support
iio: accel: adxl345: Add ACPI support
drivers/iio/accel/Kconfig | 18 +++-
drivers/iio/accel/Makefile | 4 +-
drivers/iio/accel/adxl345.c | 194 ---------------------------------------
drivers/iio/accel/adxl345.h | 18 ++++
drivers/iio/accel/adxl345_core.c | 182 ++++++++++++++++++++++++++++++++++++
drivers/iio/accel/adxl345_i2c.c | 79 ++++++++++++++++
drivers/iio/accel/adxl345_spi.c | 84 +++++++++++++++++
7 files changed, 381 insertions(+), 198 deletions(-)
delete mode 100644 drivers/iio/accel/adxl345.c
create mode 100644 drivers/iio/accel/adxl345.h
create mode 100644 drivers/iio/accel/adxl345_core.c
create mode 100644 drivers/iio/accel/adxl345_i2c.c
create mode 100644 drivers/iio/accel/adxl345_spi.c
--
2.7.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access
2017-02-20 9:25 [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
@ 2017-02-20 9:25 ` Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 2/4] iio: accel: adxl345: Split driver into core and I2C Eva Rachel Retuya
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Eva Rachel Retuya @ 2017-02-20 9:25 UTC (permalink / raw)
To: jic23, linux-iio
Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
Eva Rachel Retuya
Convert the driver to use regmap instead of I2C-specific functions.
Also, introduce the header file "adxl345.h" and export the probe and
remove functions. This is done in preparation for splitting this driver
into core and I2C-specific code as well as introduction of SPI driver.
Signed-off-by: Eva Rachel Retuya <eraretuya@gmail.com>
---
Changes from v1:
* Move other deletions from patch 2 in here -- make it clear what got deleted
and/or modified that is hard to see previously
* Introduce the driver header file "adxl345.h" here instead of doing it in the
next patch
* Completely omit traces of i2c_client and let this file (adxl345.c) mirror the
core file on the next patch.
* Improve debugging print about invalid device ID in probe.
drivers/iio/accel/Kconfig | 1 +
drivers/iio/accel/adxl345.c | 88 ++++++++++++++++++++-------------------------
drivers/iio/accel/adxl345.h | 18 ++++++++++
3 files changed, 57 insertions(+), 50 deletions(-)
create mode 100644 drivers/iio/accel/adxl345.h
diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
index 2308bac..26b8614 100644
--- a/drivers/iio/accel/Kconfig
+++ b/drivers/iio/accel/Kconfig
@@ -9,6 +9,7 @@ config ADXL345
tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver"
depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m)
depends on I2C
+ select REGMAP_I2C
help
Say Y here if you want to build support for the Analog Devices
ADXL345 3-axis digital accelerometer.
diff --git a/drivers/iio/accel/adxl345.c b/drivers/iio/accel/adxl345.c
index c34991f..a3bd711 100644
--- a/drivers/iio/accel/adxl345.c
+++ b/drivers/iio/accel/adxl345.c
@@ -7,16 +7,17 @@
* 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)
+ * IIO core driver for ADXL345
*/
#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
@@ -45,7 +46,7 @@
static const int adxl345_uscale = 38300;
struct adxl345_data {
- struct i2c_client *client;
+ struct regmap *regmap;
u8 data_range;
};
@@ -70,6 +71,7 @@ static int adxl345_read_raw(struct iio_dev *indio_dev,
{
struct adxl345_data *data = iio_priv(indio_dev);
int ret;
+ __le16 regval;
switch (mask) {
case IIO_CHAN_INFO_RAW:
@@ -78,11 +80,12 @@ static int adxl345_read_raw(struct iio_dev *indio_dev,
* ADXL345_REG_DATA(X0/Y0/Z0) contain the least significant byte
* and ADXL345_REG_DATA(X0/Y0/Z0) + 1 the most significant byte
*/
- ret = i2c_smbus_read_word_data(data->client, chan->address);
+ ret = regmap_bulk_read(data->regmap, chan->address, ®val,
+ sizeof(regval));
if (ret < 0)
return ret;
- *val = sign_extend32(ret, 12);
+ *val = sign_extend32(le16_to_cpu(regval), 12);
return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
*val = 0;
@@ -99,96 +102,81 @@ 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_common_probe(struct device *dev, struct regmap *regmap,
+ const char *name)
{
struct adxl345_data *data;
struct iio_dev *indio_dev;
int ret;
+ u32 regval;
- ret = i2c_smbus_read_byte_data(client, ADXL345_REG_DEVID);
+ ret = regmap_read(regmap, ADXL345_REG_DEVID, ®val);
if (ret < 0) {
- dev_err(&client->dev, "Error reading device ID: %d\n", ret);
+ dev_err(dev, "Error reading device ID: %d\n", ret);
return ret;
}
- if (ret != ADXL345_DEVID) {
- dev_err(&client->dev, "Invalid device ID: %d\n", ret);
+ if (regval != ADXL345_DEVID) {
+ dev_err(dev, "Invalid device ID: %x, expected %x\n",
+ regval, ADXL345_DEVID);
return -ENODEV;
}
- indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*data));
if (!indio_dev)
return -ENOMEM;
data = iio_priv(indio_dev);
- i2c_set_clientdata(client, indio_dev);
- data->client = client;
+ dev_set_drvdata(dev, indio_dev);
+ data->regmap = regmap;
/* Enable full-resolution mode */
data->data_range = ADXL345_DATA_FORMAT_FULL_RES;
- ret = i2c_smbus_write_byte_data(data->client, ADXL345_REG_DATA_FORMAT,
- data->data_range);
+ ret = regmap_write(data->regmap, ADXL345_REG_DATA_FORMAT,
+ data->data_range);
if (ret < 0) {
- dev_err(&client->dev, "Failed to set data range: %d\n", ret);
+ dev_err(dev, "Failed to set data range: %d\n", ret);
return ret;
}
- indio_dev->dev.parent = &client->dev;
- indio_dev->name = id->name;
+ indio_dev->dev.parent = dev;
+ indio_dev->name = name;
indio_dev->info = &adxl345_info;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->channels = adxl345_channels;
indio_dev->num_channels = ARRAY_SIZE(adxl345_channels);
/* Enable measurement mode */
- ret = i2c_smbus_write_byte_data(data->client, ADXL345_REG_POWER_CTL,
- ADXL345_POWER_CTL_MEASURE);
+ ret = regmap_write(data->regmap, ADXL345_REG_POWER_CTL,
+ ADXL345_POWER_CTL_MEASURE);
if (ret < 0) {
- dev_err(&client->dev, "Failed to enable measurement mode: %d\n",
- ret);
+ dev_err(dev, "Failed to enable measurement mode: %d\n", ret);
return ret;
}
ret = iio_device_register(indio_dev);
if (ret < 0) {
- dev_err(&client->dev, "iio_device_register failed: %d\n", ret);
- i2c_smbus_write_byte_data(data->client, ADXL345_REG_POWER_CTL,
- ADXL345_POWER_CTL_STANDBY);
+ dev_err(dev, "iio_device_register failed: %d\n", ret);
+ regmap_write(data->regmap, ADXL345_REG_POWER_CTL,
+ ADXL345_POWER_CTL_STANDBY);
}
return ret;
}
+EXPORT_SYMBOL_GPL(adxl345_common_probe);
-static int adxl345_remove(struct i2c_client *client)
+int adxl345_common_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 i2c_smbus_write_byte_data(data->client, ADXL345_REG_POWER_CTL,
- ADXL345_POWER_CTL_STANDBY);
+ 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_common_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.h b/drivers/iio/accel/adxl345.h
new file mode 100644
index 0000000..fca3e25
--- /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_common_probe(struct device *dev, struct regmap *regmap,
+ const char *name);
+int adxl345_common_remove(struct device *dev);
+
+#endif /* _ADXL345_H_ */
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/4] iio: accel: adxl345: Split driver into core and I2C
2017-02-20 9:25 [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 1/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access Eva Rachel Retuya
@ 2017-02-20 9:25 ` Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 3/4] iio: accel: adxl345: Add SPI support Eva Rachel Retuya
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Eva Rachel Retuya @ 2017-02-20 9:25 UTC (permalink / raw)
To: jic23, linux-iio
Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
Eva Rachel Retuya
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>
---
Changes from v1:
* Update Kconfig to Jonathan's preferred style
* Improve similarity index from 78% to 100% (rename detection)
drivers/iio/accel/Kconfig | 13 +++--
drivers/iio/accel/Makefile | 3 +-
drivers/iio/accel/{adxl345.c => adxl345_core.c} | 0
drivers/iio/accel/adxl345_i2c.c | 70 +++++++++++++++++++++++++
4 files changed, 81 insertions(+), 5 deletions(-)
rename drivers/iio/accel/{adxl345.c => adxl345_core.c} (100%)
create mode 100644 drivers/iio/accel/adxl345_i2c.c
diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
index 26b8614..ffb0a63 100644
--- a/drivers/iio/accel/Kconfig
+++ b/drivers/iio/accel/Kconfig
@@ -8,14 +8,19 @@ menu "Accelerometers"
config ADXL345
tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver"
depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m)
- depends on I2C
- select REGMAP_I2C
+ select REGMAP
+ select ADXL345_I2C if 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 core
+ module will be called adxl345_core and you will also get
+ adxl345_i2c for I2C.
+
+config ADXL345_I2C
+ tristate
+ select REGMAP_I2C
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.c b/drivers/iio/accel/adxl345_core.c
similarity index 100%
rename from drivers/iio/accel/adxl345.c
rename to drivers/iio/accel/adxl345_core.c
diff --git a/drivers/iio/accel/adxl345_i2c.c b/drivers/iio/accel/adxl345_i2c.c
new file mode 100644
index 0000000..b114eb0
--- /dev/null
+++ b/drivers/iio/accel/adxl345_i2c.c
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ *
+ * I2C 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 "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;
+ const char *name = NULL;
+
+ regmap = devm_regmap_init_i2c(client, &adxl345_i2c_regmap_config);
+ if (IS_ERR(regmap)) {
+ dev_err(&client->dev, "Error initializing i2c regmap: %d\n",
+ (int)PTR_ERR(regmap));
+ return PTR_ERR(regmap);
+ }
+
+ if (id)
+ name = id->name;
+
+ return adxl345_common_probe(&client->dev, regmap, name);
+}
+
+static int adxl345_i2c_remove(struct i2c_client *client)
+{
+ return adxl345_common_remove(&client->dev);
+}
+
+static const struct i2c_device_id adxl345_i2c_id[] = {
+ { "adxl345", 0 },
+ { }
+};
+
+MODULE_DEVICE_TABLE(i2c, adxl345_i2c_id);
+
+static struct i2c_driver adxl345_i2c_driver = {
+ .driver = {
+ .name = "adxl345_i2c",
+ },
+ .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");
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 3/4] iio: accel: adxl345: Add SPI support
2017-02-20 9:25 [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 1/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 2/4] iio: accel: adxl345: Split driver into core and I2C Eva Rachel Retuya
@ 2017-02-20 9:25 ` Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 4/4] iio: accel: adxl345: Add ACPI support Eva Rachel Retuya
2017-02-21 15:03 ` [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
4 siblings, 0 replies; 6+ messages in thread
From: Eva Rachel Retuya @ 2017-02-20 9:25 UTC (permalink / raw)
To: jic23, linux-iio
Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
Eva Rachel Retuya
Add SPI driver that initializes SPI regmap for the adxl345 core driver.
The driver supports the same functionality as I2C namely the x, y, z and
scale readings.
Signed-off-by: Eva Rachel Retuya <eraretuya@gmail.com>
---
drivers/iio/accel/Kconfig | 8 ++++-
drivers/iio/accel/Makefile | 1 +
drivers/iio/accel/adxl345_spi.c | 75 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 83 insertions(+), 1 deletion(-)
create mode 100644 drivers/iio/accel/adxl345_spi.c
diff --git a/drivers/iio/accel/Kconfig b/drivers/iio/accel/Kconfig
index ffb0a63..454aeff 100644
--- a/drivers/iio/accel/Kconfig
+++ b/drivers/iio/accel/Kconfig
@@ -8,20 +8,26 @@ menu "Accelerometers"
config ADXL345
tristate "Analog Devices ADXL345 3-Axis Digital Accelerometer Driver"
depends on !(INPUT_ADXL34X=y || INPUT_ADXL34X=m)
+ depends on (I2C || SPI)
select REGMAP
select ADXL345_I2C if I2C
+ select ADXL345_SPI if SPI
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 core
module will be called adxl345_core and you will also get
- adxl345_i2c for I2C.
+ adxl345_i2c for I2C and/or adxl345_spi for SPI.
config ADXL345_I2C
tristate
select REGMAP_I2C
+config ADXL345_SPI
+ tristate
+ select REGMAP_SPI
+
config BMA180
tristate "Bosch BMA180/BMA250 3-Axis Accelerometer Driver"
depends on I2C
diff --git a/drivers/iio/accel/Makefile b/drivers/iio/accel/Makefile
index 3f4a6d6..31fba19 100644
--- a/drivers/iio/accel/Makefile
+++ b/drivers/iio/accel/Makefile
@@ -5,6 +5,7 @@
# When adding new entries keep the list in alphabetical order
obj-$(CONFIG_ADXL345) += adxl345_core.o
obj-$(CONFIG_ADXL345_I2C) += adxl345_i2c.o
+obj-$(CONFIG_ADXL345_SPI) += adxl345_spi.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_spi.c b/drivers/iio/accel/adxl345_spi.c
new file mode 100644
index 0000000..5fcd1fa
--- /dev/null
+++ b/drivers/iio/accel/adxl345_spi.c
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ *
+ * SPI driver for ADXL345
+ */
+
+#include <linux/module.h>
+#include <linux/regmap.h>
+#include <linux/spi/spi.h>
+
+#include "adxl345.h"
+
+#define ADXL345_MAX_SPI_FREQ_HZ 5000000
+
+static const struct regmap_config adxl345_spi_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ /* Setting bits 7 and 6 enables multiple-byte read */
+ .read_flag_mask = BIT(7) | BIT(6),
+};
+
+static int adxl345_spi_probe(struct spi_device *spi)
+{
+ struct regmap *regmap;
+ const struct spi_device_id *id = spi_get_device_id(spi);
+
+ /* Bail out if max_speed_hz exceeds 5 MHz */
+ if (spi->max_speed_hz > ADXL345_MAX_SPI_FREQ_HZ) {
+ dev_err(&spi->dev, "SPI CLK, %d Hz exceeds 5 MHz\n",
+ spi->max_speed_hz);
+ return -EINVAL;
+ }
+
+ regmap = devm_regmap_init_spi(spi, &adxl345_spi_regmap_config);
+ if (IS_ERR(regmap)) {
+ dev_err(&spi->dev, "Error initializing spi regmap: %d\n",
+ (int)PTR_ERR(regmap));
+ return PTR_ERR(regmap);
+ }
+
+ return adxl345_common_probe(&spi->dev, regmap, id->name);
+}
+
+static int adxl345_spi_remove(struct spi_device *spi)
+{
+ return adxl345_common_remove(&spi->dev);
+}
+
+static const struct spi_device_id adxl345_spi_id[] = {
+ { "adxl345", 0 },
+ { }
+};
+
+MODULE_DEVICE_TABLE(spi, adxl345_spi_id);
+
+static struct spi_driver adxl345_spi_driver = {
+ .driver = {
+ .name = "adxl345_spi",
+ },
+ .probe = adxl345_spi_probe,
+ .remove = adxl345_spi_remove,
+ .id_table = adxl345_spi_id,
+};
+
+module_spi_driver(adxl345_spi_driver);
+
+MODULE_AUTHOR("Eva Rachel Retuya <eraretuya@gmail.com>");
+MODULE_DESCRIPTION("ADXL345 3-Axis Digital Accelerometer SPI driver");
+MODULE_LICENSE("GPL v2");
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 4/4] iio: accel: adxl345: Add ACPI support
2017-02-20 9:25 [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
` (2 preceding siblings ...)
2017-02-20 9:25 ` [PATCH v2 3/4] iio: accel: adxl345: Add SPI support Eva Rachel Retuya
@ 2017-02-20 9:25 ` Eva Rachel Retuya
2017-02-21 15:03 ` [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
4 siblings, 0 replies; 6+ messages in thread
From: Eva Rachel Retuya @ 2017-02-20 9:25 UTC (permalink / raw)
To: jic23, linux-iio
Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
daniel.baluta, amsfield22, florian.vaussard, linux-kernel,
Eva Rachel Retuya
Allow probing the adxl345 on both I2C and SPI protocols using ACPI.
Signed-off-by: Eva Rachel Retuya <eraretuya@gmail.com>
---
Change from v1:
* Correct acpi_device_id: ADX0345 -> ADS0345
drivers/iio/accel/adxl345_i2c.c | 9 +++++++++
drivers/iio/accel/adxl345_spi.c | 9 +++++++++
2 files changed, 18 insertions(+)
diff --git a/drivers/iio/accel/adxl345_i2c.c b/drivers/iio/accel/adxl345_i2c.c
index b114eb0..03b6df9 100644
--- a/drivers/iio/accel/adxl345_i2c.c
+++ b/drivers/iio/accel/adxl345_i2c.c
@@ -12,6 +12,7 @@
* 0x53 (ALT ADDRESS pin grounded)
*/
+#include <linux/acpi.h>
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/regmap.h>
@@ -54,9 +55,17 @@ static const struct i2c_device_id adxl345_i2c_id[] = {
MODULE_DEVICE_TABLE(i2c, adxl345_i2c_id);
+static const struct acpi_device_id adxl345_acpi_id[] = {
+ { "ADS0345", 0 },
+ { }
+};
+
+MODULE_DEVICE_TABLE(acpi, adxl345_acpi_id);
+
static struct i2c_driver adxl345_i2c_driver = {
.driver = {
.name = "adxl345_i2c",
+ .acpi_match_table = ACPI_PTR(adxl345_acpi_id),
},
.probe = adxl345_i2c_probe,
.remove = adxl345_i2c_remove,
diff --git a/drivers/iio/accel/adxl345_spi.c b/drivers/iio/accel/adxl345_spi.c
index 5fcd1fa..a3c5d49 100644
--- a/drivers/iio/accel/adxl345_spi.c
+++ b/drivers/iio/accel/adxl345_spi.c
@@ -10,6 +10,7 @@
* SPI driver for ADXL345
*/
+#include <linux/acpi.h>
#include <linux/module.h>
#include <linux/regmap.h>
#include <linux/spi/spi.h>
@@ -59,9 +60,17 @@ static const struct spi_device_id adxl345_spi_id[] = {
MODULE_DEVICE_TABLE(spi, adxl345_spi_id);
+static const struct acpi_device_id adxl345_acpi_id[] = {
+ { "ADS0345", 0 },
+ { }
+};
+
+MODULE_DEVICE_TABLE(acpi, adxl345_acpi_id);
+
static struct spi_driver adxl345_spi_driver = {
.driver = {
.name = "adxl345_spi",
+ .acpi_match_table = ACPI_PTR(adxl345_acpi_id),
},
.probe = adxl345_spi_probe,
.remove = adxl345_spi_remove,
--
2.7.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support
2017-02-20 9:25 [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
` (3 preceding siblings ...)
2017-02-20 9:25 ` [PATCH v2 4/4] iio: accel: adxl345: Add ACPI support Eva Rachel Retuya
@ 2017-02-21 15:03 ` Eva Rachel Retuya
4 siblings, 0 replies; 6+ messages in thread
From: Eva Rachel Retuya @ 2017-02-21 15:03 UTC (permalink / raw)
To: jic23, linux-iio
Cc: knaack.h, lars, pmeerw, dmitry.torokhov, michael.hennerich,
daniel.baluta, amsfield22, florian.vaussard, linux-kernel
On Mon, Feb 20, 2017 at 05:25:39PM +0800, Eva Rachel Retuya wrote:
> This patchset modifies the adxl345 to use regmap. In doing so, we can
> easily introduce SPI support and let regmap handle the rest.
>
> Recap of basic features: read_raw for x, y and z axes, scale. After
> applying this series, driver now supports the SPI protocol and enumeration
> of device via ACPI.
>
Hello all,
Kindly disregard this. Will submit a v3 because I have to drop ACPI and
switch to DT method of enumeration.
Thanks,
Eva
> Changes from v1:
> [PATCH 1/4]
> * Move other deletions from patch 2 in here -- make it clear what got deleted
> and/or modified that is hard to see previously
> * Introduce the driver header file "adxl345.h" here instead of doing it in the
> next patch
> * Completely omit traces of i2c_client and let this file (adxl345.c) mirror the
> core file on the next patch.
> * Improve debugging print about invalid device ID in probe.
> [PATCH 2/4]
> * Update Kconfig to Jonathan's preferred style
> * Improve similarity index from 78% to 100% (rename detection)
> [PATCH 4/4]
> * Correct acpi_device_id: ADX0345 -> ADS0345
>
> Eva Rachel Retuya (4):
> iio: accel: adxl345: Use I2C regmap instead of direct I2C access
> iio: accel: adxl345: Split driver into core and I2C
> iio: accel: adxl345: Add SPI support
> iio: accel: adxl345: Add ACPI support
>
> drivers/iio/accel/Kconfig | 18 +++-
> drivers/iio/accel/Makefile | 4 +-
> drivers/iio/accel/adxl345.c | 194 ---------------------------------------
> drivers/iio/accel/adxl345.h | 18 ++++
> drivers/iio/accel/adxl345_core.c | 182 ++++++++++++++++++++++++++++++++++++
> drivers/iio/accel/adxl345_i2c.c | 79 ++++++++++++++++
> drivers/iio/accel/adxl345_spi.c | 84 +++++++++++++++++
> 7 files changed, 381 insertions(+), 198 deletions(-)
> delete mode 100644 drivers/iio/accel/adxl345.c
> create mode 100644 drivers/iio/accel/adxl345.h
> create mode 100644 drivers/iio/accel/adxl345_core.c
> create mode 100644 drivers/iio/accel/adxl345_i2c.c
> create mode 100644 drivers/iio/accel/adxl345_spi.c
>
> --
> 2.7.4
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-02-21 15:03 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-02-20 9:25 [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 1/4] iio: accel: adxl345: Use I2C regmap instead of direct I2C access Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 2/4] iio: accel: adxl345: Split driver into core and I2C Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 3/4] iio: accel: adxl345: Add SPI support Eva Rachel Retuya
2017-02-20 9:25 ` [PATCH v2 4/4] iio: accel: adxl345: Add ACPI support Eva Rachel Retuya
2017-02-21 15:03 ` [PATCH v2 0/4] iio: accel: adxl345: Split driver into core and I2C then add SPI support Eva Rachel Retuya
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.