staging:iio:hmc5843: Few adjustments and support for hmc5983
Subsystems (3)
v4 cover staging:iio:hmc5843: Few adjustments and support for hmc5983
This patch series modifies the hmc5843 driver to support the hmc5983 i2c and spi interfaces.
v2:
* Reverted the changed order of iio unregister and setting hmc mode to sleep
v3:
* Fixed bug introduced in the first patch
* Readded few comment lines which have gone missing in the hmc5843.c -> hmc5843_core.c move
v4:
* Changes suggested by Lars in https://lkml.org/lkml/2014/7/14/968
* The i2c and spi drivers are now user-selectable with the core driver being selected automatically
* The regmap_config structs in both _spi and _i2c files are now static
* The iio_dev allocation is now done in the common function
* pm ops are now defined in the header file and the same definition is shared between both interface-specific drivers
* regmap tables in hmc5843.h are not longer static (this fixed bunch of variable not used warnings)
Rebased v4 on top of staging-next
Josef Gajdusek (5):
staging:iio:hmc5843: Added regmap support staging:iio:hmc5843: Split hmc5843.c to multiple files staging:iio:hmc5843: register <-> value arrays now can have different
lengths
staging:iio:hmc5843: Add support for i2c hmc5983 staging:iio:hmc5843: Add support for spi hmc5983
drivers/staging/iio/magnetometer/Kconfig | 30 +- drivers/staging/iio/magnetometer/Makefile | 4 +- drivers/staging/iio/magnetometer/hmc5843.c | 652 ------------------------ drivers/staging/iio/magnetometer/hmc5843.h | 86 ++++ drivers/staging/iio/magnetometer/hmc5843_core.c | 638 +++++++++++++++++++++++ drivers/staging/iio/magnetometer/hmc5843_i2c.c | 74 +++ drivers/staging/iio/magnetometer/hmc5843_spi.c | 73 +++ 7 files changed, 900 insertions(+), 657 deletions(-) delete mode 100644 drivers/staging/iio/magnetometer/hmc5843.c create mode 100644 drivers/staging/iio/magnetometer/hmc5843.h create mode 100644 drivers/staging/iio/magnetometer/hmc5843_core.c create mode 100644 drivers/staging/iio/magnetometer/hmc5843_i2c.c create mode 100644 drivers/staging/iio/magnetometer/hmc5843_spi.c
Signature · 1 line
1.8.5.5
PATCH v4 1/5 staging:iio:hmc5843: Added regmap support
This patch changes hmc5843.c to use regmap. This provides transparent caching to the code as well as abstraction necessary to add support for SPI-based hmc5983.
--- drivers/staging/iio/magnetometer/Kconfig | 1 + drivers/staging/iio/magnetometer/hmc5843.c | 140 +++++++++++++++++++---------- 2 files changed, 96 insertions(+), 45 deletions(-)
drivers/staging/iio/magnetometer/Kconfig +1 -0
@@ -8,6 +8,7 @@ config SENSORS_HMC5843 depends on I2C select IIO_BUFFER select IIO_TRIGGERED_BUFFER + select REGMAP_I2C help Say Y here to add support for the Honeywell HMC5843, HMC5883 and HMC5883L 3-Axis Magnetometer (digital compass).
drivers/staging/iio/magnetometer/hmc5843.c +95 -45
263 lines not on this page · raw message
Signature · 1 line
1.8.5.5
Re: [PATCH v4 (staging-next) 1/5] staging:iio:hmc5843: Added regmap support
Quoted 5 lines · Josef Gajdusek
This patch changes
hmc5843.cto use regmap. This provides transparent caching to the code as well as abstraction necessary to add support for SPI-based hmc5983.Signed-off-by Josef Gajdusek <[email protected]>
Applied to the togreg branch of iio.git. Will be initially pushed out as testing for the autobuilders to mess with it.
Thanks,
Quoted 302 lines
--- drivers/staging/iio/magnetometer/Kconfig | 1 + drivers/staging/iio/magnetometer/hmc5843.c | 140 +++++++++++++++++++---------- 2 files changed, 96 insertions(+), 45 deletions(-)drivers/staging/iio/magnetometer/Kconfig +1
-0@@ -8,6 +8,7 @@ config SENSORS_HMC5843 depends on I2C select IIO_BUFFER select IIO_TRIGGERED_BUFFER + select REGMAP_I2C help Say Y here to add support for the Honeywell HMC5843, HMC5883 and HMC5883L 3-Axis Magnetometer (digital compass).drivers/staging/iio/magnetometer/hmc5843.c +95
-45@@ -21,6 +21,7 @@#include <linux/module.h> #include <linux/i2c.h> +#include <linux/regmap.h> #include <linux/iio/iio.h> #include <linux/iio/sysfs.h> #include <linux/iio/trigger_consumer.h> @@ -34,6 +35,7 @@#define HMC5843_DATA_OUT_MSB_REGS 0x03#define HMC5843_STATUS_REG 0x09#define HMC5843_ID_REG 0x0a +#define HMC5843_ID_END 0x0cenum hmc5843_ids {HMC5843_ID ,@@ -49,6 +51,7 @@ enum hmc5843_ids {#define HMC5843_RANGE_GAIN_OFFSET 0x05#define HMC5843_RANGE_GAIN_DEFAULT 0x01#define HMC5843_RANGE_GAINS 8 +#define HMC5843_RANGE_GAIN_MASK 0xe0/* Device status */ #define HMC5843_DATA_READY 0x01@@ -68,6 +71,7 @@ enum hmc5843_ids {#define HMC5843_RATE_OFFSET 0x02#define HMC5843_RATE_DEFAULT 0x04#define HMC5843_RATES 7 +#define HMC5843_RATE_MASK 0x1c/* Device measurement configuration */ #define HMC5843_MEAS_CONF_NORMAL 0x00@@ -121,10 +125,7 @@ struct hmc5843_chip_info {struct hmc5843_data {struct i2c_client *client;struct mutex lock; -u8 rate; -u8 meas_conf; -u8 operating_mode; -u8 range; +struct regmap *regmap;const struct hmc5843_chip_info *variant;__be16 buffer[8 ];/* 3x 16-bit channels + padding + 64-bit timestamp */ };@@ -135,10 +136,8 @@ static s32 hmc5843_set_mode(struct hmc5843_data *data, u8 operating_mode)int ret;mutex_lock (&data->lock); - ret =i2c_smbus_write_byte_data (data->client,HMC5843_MODE_REG , - operating_mode &HMC5843_MODE_MASK ); -if (ret >=0 ) - data->operating_mode = operating_mode; + ret =regmap_update_bits (data->regmap,HMC5843_MODE_REG , +HMC5843_MODE_MASK , operating_mode);mutex_unlock (&data->lock);return ret;@@ -146,15 +145,15 @@ static s32 hmc5843_set_mode(struct hmc5843_data *data, u8 operating_mode)static int hmc5843_wait_measurement (struct hmc5843_data *data) { -s32 result;int tries =150 ; +int val; +int ret;while (tries-- >0 ) { - result =i2c_smbus_read_byte_data (data->client, -HMC5843_STATUS_REG ); -if (result <0 ) -return result; -if (result &HMC5843_DATA_READY ) + ret =regmap_read (data->regmap,HMC5843_STATUS_REG , &val); +if (ret <0 ) +return ret; +if (val &HMC5843_DATA_READY )break ;msleep (20 ); }@@ -171,20 +170,20 @@ static int hmc5843_wait_measurement(struct hmc5843_data *data)static int hmc5843_read_measurement (struct hmc5843_data *data,int idx,int *val) { -s32 result;__be16 values[3 ]; +int ret;mutex_lock (&data->lock); - result =hmc5843_wait_measurement (data); -if (result <0 ) { + ret =hmc5843_wait_measurement (data); +if (ret <0 ) {mutex_unlock (&data->lock); -return result; +return ret; } - result =i2c_smbus_read_i2c_block_data (data->client, -HMC5843_DATA_OUT_MSB_REGS ,sizeof (values), (u8 *) values); + ret =regmap_bulk_read (data->regmap,HMC5843_DATA_OUT_MSB_REGS , + values,sizeof (values));mutex_unlock (&data->lock); -if (result <0 ) -return -EINVAL ; +if (ret <0 ) +return ret; *val =sign_extend32 (be16_to_cpu (values[idx]),15 );return IIO_VAL_INT ;@@ -208,16 +207,13 @@ static int hmc5843_read_measurement(struct hmc5843_data *data,* and BN. * */ -static s32 hmc5843_set_meas_conf (struct hmc5843_data *data,u8 meas_conf) +static int hmc5843_set_meas_conf (struct hmc5843_data *data,u8 meas_conf) {int ret;mutex_lock (&data->lock); - ret =i2c_smbus_write_byte_data (data->client,HMC5843_CONFIG_REG_A , - (meas_conf &HMC5843_MEAS_CONF_MASK ) | - (data->rate <<HMC5843_RATE_OFFSET )); -if (ret >=0 ) - data->meas_conf = meas_conf; + ret =regmap_update_bits (data->regmap,HMC5843_CONFIG_REG_A , +HMC5843_MEAS_CONF_MASK , meas_conf);mutex_unlock (&data->lock);return ret;@@ -228,7 +224,15 @@ static ssize_t hmc5843_show_measurement_configuration(struct device *dev, char *buf) {struct hmc5843_data *data =iio_priv (dev_to_iio_dev (dev)); -return sprintf (buf,"%d\n" , data->meas_conf); +int val; +int ret; + + ret =regmap_read (data->regmap,HMC5843_CONFIG_REG_A , &val); +if (ret) +return ret; + val &=HMC5843_MEAS_CONF_MASK ; + +return sprintf (buf,"%d\n" , val); } static ssize_t hmc5843_set_measurement_configuration(struct device *dev,@@ -282,10 +286,8 @@ static int hmc5843_set_samp_freq(struct hmc5843_data *data, u8 rate)int ret;mutex_lock (&data->lock); - ret =i2c_smbus_write_byte_data (data->client,HMC5843_CONFIG_REG_A , - data->meas_conf | (rate <<HMC5843_RATE_OFFSET )); -if (ret >=0 ) - data->rate = rate; + ret =regmap_update_bits (data->regmap,HMC5843_CONFIG_REG_A , +HMC5843_RATE_MASK , rate <<HMC5843_RATE_OFFSET );mutex_unlock (&data->lock);return ret;@@ -309,10 +311,9 @@ static int hmc5843_set_range_gain(struct hmc5843_data *data, u8 range)int ret;mutex_lock (&data->lock); - ret =i2c_smbus_write_byte_data (data->client,HMC5843_CONFIG_REG_B , - range <<HMC5843_RANGE_GAIN_OFFSET ); -if (ret >=0 ) - data->range = range; + ret =regmap_update_bits (data->regmap,HMC5843_CONFIG_REG_B , +HMC5843_RANGE_GAIN_MASK , + range <<HMC5843_RANGE_GAIN_OFFSET );mutex_unlock (&data->lock);return ret;@@ -358,17 +359,27 @@ static int hmc5843_read_raw(struct iio_dev *indio_dev, int *val, int *val2, long mask) { struct hmc5843_data *data = iio_priv(indio_dev); +int rval; +int ret;switch (mask) {case IIO_CHAN_INFO_RAW :return hmc5843_read_measurement (data, chan->scan_index, val);case IIO_CHAN_INFO_SCALE : + ret =regmap_read (data->regmap,HMC5843_CONFIG_REG_B , &rval); +if (ret <0 ) +return ret; + rval >>=HMC5843_RANGE_GAIN_OFFSET ; *val =0 ; - *val2 = data->variant->regval_to_nanoscale[data->range]; + *val2 = data->variant->regval_to_nanoscale[rval];return IIO_VAL_INT_PLUS_NANO ;case IIO_CHAN_INFO_SAMP_FREQ : - *val = data->variant->regval_to_samp_freq[data->rate][0 ]; - *val2 = data->variant->regval_to_samp_freq[data->rate][1 ]; + ret =regmap_read (data->regmap,HMC5843_CONFIG_REG_A , &rval); +if (ret <0 ) +return ret; + rval >>=HMC5843_RATE_OFFSET ; + *val = data->variant->regval_to_samp_freq[rval][0 ]; + *val2 = data->variant->regval_to_samp_freq[rval][1 ];return IIO_VAL_INT_PLUS_MICRO ; }return -EINVAL ;@@ -426,9 +437,9 @@ static irqreturn_t hmc5843_trigger_handler(int irq, void *p) goto done; } - ret =i2c_smbus_read_i2c_block_data (data->client, -HMC5843_DATA_OUT_MSB_REGS ,3 *sizeof (__be16), - (u8 *) data->buffer); + ret =regmap_bulk_read (data->regmap,HMC5843_DATA_OUT_MSB_REGS , + data->buffer,3 *sizeof (__be16)); +mutex_unlock (&data->lock);if (ret <0 ) goto done;@@ -508,8 +519,8 @@ static int hmc5843_init(struct hmc5843_data *data)int ret;u8 id[3 ]; - ret =i2c_smbus_read_i2c_block_data (data->client,HMC5843_ID_REG , -sizeof (id), id); + ret =regmap_bulk_read (data->regmap,HMC5843_ID_REG , + id,ARRAY_SIZE (id));if (ret <0 )return ret;if (id[0 ] !='H' || id[1 ] !='4' || id[2 ] !='3' ) {@@ -539,6 +550,44 @@ static const struct iio_info hmc5843_info = {static const unsigned long hmc5843_scan_masks[] = {0x7 ,0 }; +static const struct regmap_range hmc5843_readable_ranges[] = { +regmap_reg_range (0 ,HMC5843_ID_END ), +}; + +static struct regmap_access_table hmc5843_readable_table = { + .yes_ranges = hmc5843_readable_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_readable_ranges), +}; + +static const struct regmap_range hmc5843_writable_ranges[] = { +regmap_reg_range (0 ,HMC5843_MODE_REG ), +}; + +static struct regmap_access_table hmc5843_writable_table = { + .yes_ranges = hmc5843_writable_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_writable_ranges), +}; + +static const struct regmap_range hmc5843_volatile_ranges[] = { +regmap_reg_range (HMC5843_DATA_OUT_MSB_REGS ,HMC5843_STATUS_REG ), +}; + +static struct regmap_access_table hmc5843_volatile_table = { + .yes_ranges = hmc5843_volatile_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_volatile_ranges), +}; + +static struct regmap_config hmc5843_regmap_config = { + .reg_bits =8 , + .val_bits =8 , + + .rd_table = &hmc5843_readable_table, + .wr_table = &hmc5843_writable_table, + .volatile_table = &hmc5843_volatile_table, + + .cache_type =REGCACHE_RBTREE , +}; +static int hmc5843_probe (struct i2c_client *client,const struct i2c_device_id *id) {@@ -554,6 +603,7 @@ static int hmc5843_probe(struct i2c_client *client, data =iio_priv (indio_dev); data->client = client; data->variant = &hmc5843_chip_info_tbl[id->driver_data]; + data->regmap =devm_regmap_init_i2c (client, &hmc5843_regmap_config);mutex_init (&data->lock);i2c_set_clientdata (client, indio_dev);
PATCH v4 2/5 staging:iio:hmc5843: Split hmc5843.c to multiple files
In reply to Josef GajdusekThis patch splits hmc5843.c to multiple files - the interface-agnostic hmc5843_core.c, i2c specific hmc5843_i2c.c and header file hmc5843.h. This is another step to add support of SPI-enabled hmc5983.
---
drivers/staging/iio/magnetometer/Kconfig | 14 +-
drivers/staging/iio/magnetometer/Makefile | 3 +-
drivers/staging/iio/magnetometer/hmc5843.h | 85 ++++++++++++
.../iio/magnetometer/{hmc5843.c => hmc5843_core.c} | 154 +++++----------------
drivers/staging/iio/magnetometer/hmc5843_i2c.c | 75 ++++++++++
5 files changed, 203 insertions(+), 128 deletions(-)
create mode 100644 drivers/staging/iio/magnetometer/hmc5843.h
rename drivers/staging/iio/magnetometer/{hmc5843.c => hmc5843_core.c} (79%)
create mode 100644 drivers/staging/iio/magnetometer/hmc5843_i2c.cdrivers/staging/iio/magnetometer/Kconfig +10 -4
@@ -4,16 +4,22 @@ menu "Magnetometer sensors" config SENSORS_HMC5843 - tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer" - depends on I2C + tristate select IIO_BUFFER select IIO_TRIGGERED_BUFFER + +config SENSORS_HMC5843_I2C + tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer (I2C)" + depends on I2C + select SENSORS_HMC5843 select REGMAP_I2C help Say Y here to add support for the Honeywell HMC5843, HMC5883 and HMC5883L 3-Axis Magnetometer (digital compass). - To compile this driver as a module, choose M here: the module - will be called hmc5843. + This driver can also be compiled as a set of modules. + If so, these modules will be created: + - hmc5843_core (core functions) + - hmc5843_i2c (support for HMC5843, HMC5883 and HMC5883L) endmenu
drivers/staging/iio/magnetometer/Makefile +2 -1
@@ -2,4 +2,5 @@ # Makefile for industrial I/O Magnetometer sensors # -obj-$(CONFIG_SENSORS_HMC5843) += hmc5843.o +obj-$(CONFIG_SENSORS_HMC5843) += hmc5843_core.o +obj-$(CONFIG_SENSORS_HMC5843_I2C) += hmc5843_i2c.o
drivers/staging/iio/magnetometer/hmc5843.h new file +85 -0
85 lines not on this page · raw message
drivers/staging/iio/magnetometer/hmc5843_core.c renamed from drivers/staging/iio/magnetometer/hmc5843.c +31 -123
226 lines not on this page · raw message
drivers/staging/iio/magnetometer/hmc5843_i2c.c new file +75 -0
75 lines not on this page · raw message
Signature · 1 line
1.8.5.5
Jonathan Cameron
maintainerRe: [PATCH v4 (staging-next) 2/5] staging:iio:hmc5843: Split hmc5843.c to multiple files
Quoted 5 lines · Josef Gajdusek
This patch splits
hmc5843.cto multiple files - the interface-agnostichmc5843_core.c, i2c specifichmc5843_i2c.cand header filehmc5843.h. This is another step to add support of SPI-enabled hmc5983.Signed-off-by Josef Gajdusek <[email protected]>
Unfortunately taking the tables non static just causes sparse to complain:
drivers/staging/iio/magnetometer/hmc5843.h:62:28: warning: symbol 'hmc5843_readable_table' was not declared. Should it be static? drivers/staging/iio/magnetometer/hmc5843.h:71:28: warning: symbol 'hmc5843_writable_table' was not declared. Should it be static? drivers/staging/iio/magnetometer/hmc5843.h:80:28: warning: symbol 'hmc5843_volatile_table' was not declared. Should it be static?
CC [M] drivers/staging/iio/magnetometer/hmc5843_core.o
CHECK drivers/staging/iio/magnetometer/hmc5843_i2c.cdrivers/staging/iio/magnetometer/hmc5843.h:62:28: warning: symbol 'hmc5843_readable_table' was not declared. Should it be static? drivers/staging/iio/magnetometer/hmc5843.h:71:28: warning: symbol 'hmc5843_writable_table' was not declared. Should it be static? drivers/staging/iio/magnetometer/hmc5843.h:80:28: warning: symbol 'hmc5843_volatile_table' was not declared. Should it be static?
CC [M] drivers/staging/iio/magnetometer/hmc5843_i2c.o
I think you'll probably just have to duplicate them (which is irritating, but there we are).
Jonathan
Quoted 468 lines
--- drivers/staging/iio/magnetometer/Kconfig | 14 +- drivers/staging/iio/magnetometer/Makefile | 3 +- drivers/staging/iio/magnetometer/hmc5843.h | 85 ++++++++++++ .../iio/magnetometer/{hmc5843.c => hmc5843_core.c} | 154 +++++---------------- drivers/staging/iio/magnetometer/hmc5843_i2c.c | 75 ++++++++++ 5 files changed, 203 insertions(+), 128 deletions(-)create mode 100644
drivers/staging/iio/magnetometer/hmc5843.hrenamedrivers/staging/iio/magnetometer/{hmc5843.c=>hmc5843_core.c} (79%) create mode 100644drivers/staging/iio/magnetometer/hmc5843_i2c.cdrivers/staging/iio/magnetometer/Kconfig +10
-4@@ -4,16 +4,22 @@ menu "Magnetometer sensors" config SENSORS_HMC5843 - tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer" - depends on I2C + tristate select IIO_BUFFER select IIO_TRIGGERED_BUFFER + +config SENSORS_HMC5843_I2C + tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer (I2C)" + depends on I2C + select SENSORS_HMC5843 select REGMAP_I2C help Say Y here to add support for the Honeywell HMC5843, HMC5883 and HMC5883L 3-Axis Magnetometer (digital compass). - To compile this driver as a module, choose M here: the module - will be called hmc5843. + This driver can also be compiled as a set of modules. + If so, these modules will be created: + - hmc5843_core (core functions) + - hmc5843_i2c (support for HMC5843, HMC5883 and HMC5883L) endmenudrivers/staging/iio/magnetometer/Makefile +2
-1@@ -2,4 +2,5 @@ # Makefile for industrial I/O Magnetometer sensors # -obj-$(CONFIG_SENSORS_HMC5843) += hmc5843.o +obj-$(CONFIG_SENSORS_HMC5843) += hmc5843_core.o +obj-$(CONFIG_SENSORS_HMC5843_I2C) += hmc5843_i2c.odrivers/staging/iio/magnetometer/hmc5843.h new file +85
-0@@ -0,0 +1,85 @@ +/* +* Header file for hmc5843 driver +* +* Split from hmc5843.c +* Copyright (C) Josef Gajdusek <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* */ + + +#ifndef HMC5843_CORE_H +#define HMC5843_CORE_H + +#include <linux/regmap.h> +#include <linux/iio/iio.h> + +#define HMC5843_CONFIG_REG_A 0x00 +#define HMC5843_CONFIG_REG_B 0x01 +#define HMC5843_MODE_REG 0x02 +#define HMC5843_DATA_OUT_MSB_REGS 0x03 +#define HMC5843_STATUS_REG 0x09 +#define HMC5843_ID_REG 0x0a +#define HMC5843_ID_END 0x0c + +enum hmc5843_ids { +HMC5843_ID , +HMC5883_ID , +HMC5883L_ID , +}; + +struct hmc5843_data { +struct device *dev; +struct mutex lock; +struct regmap *regmap; +const struct hmc5843_chip_info *variant; +__be16 buffer[8 ];/* 3x 16-bit channels + padding + 64-bit timestamp */ +}; + +int hmc5843_common_probe (struct device *dev,struct regmap *regmap, +enum hmc5843_ids id); +int hmc5843_common_remove (struct device *dev); + +int hmc5843_common_suspend (struct device *dev); +int hmc5843_common_resume (struct device *dev); + +#ifdef CONFIG_PM_SLEEP +static SIMPLE_DEV_PM_OPS(hmc5843_pm_ops, + hmc5843_common_suspend, + hmc5843_common_resume); +#define HMC5843_PM_OPS (&hmc5843_pm_ops) +#else +#define HMC5843_PM_OPS NULL +#endif + +static const struct regmap_range hmc5843_readable_ranges[] = { +regmap_reg_range (0 ,HMC5843_ID_END ), +}; + +struct regmap_access_table hmc5843_readable_table = { + .yes_ranges = hmc5843_readable_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_readable_ranges), +}; + +static const struct regmap_range hmc5843_writable_ranges[] = { +regmap_reg_range (0 ,HMC5843_MODE_REG ), +}; + +struct regmap_access_table hmc5843_writable_table = { + .yes_ranges = hmc5843_writable_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_writable_ranges), +}; + +static const struct regmap_range hmc5843_volatile_ranges[] = { +regmap_reg_range (HMC5843_DATA_OUT_MSB_REGS ,HMC5843_STATUS_REG ), +}; + +struct regmap_access_table hmc5843_volatile_table = { + .yes_ranges = hmc5843_volatile_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_volatile_ranges), +}; + +#endif /* HMC5843_CORE_H */ drivers/staging/iio/magnetometer/hmc5843_core.c renamed from drivers/staging/iio/magnetometer/hmc5843.c +31
-123@@ -4,6 +4,8 @@ Support for HMC5883 and HMC5883L by Peter Meerwald <[email protected]>. + Split to multiple files by Josef Gajdusek <[email protected]> - 2014 + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or@@ -20,7 +22,6 @@*/ #include <linux/module.h> -#include <linux/i2c.h> #include <linux/regmap.h> #include <linux/iio/iio.h> #include <linux/iio/sysfs.h> @@ -29,19 +30,7 @@#include <linux/iio/triggered_buffer.h> #include <linux/delay.h> -#define HMC5843_CONFIG_REG_A 0x00 -#define HMC5843_CONFIG_REG_B 0x01 -#define HMC5843_MODE_REG 0x02 -#define HMC5843_DATA_OUT_MSB_REGS 0x03 -#define HMC5843_STATUS_REG 0x09 -#define HMC5843_ID_REG 0x0a -#define HMC5843_ID_END 0x0c - -enum hmc5843_ids { -HMC5843_ID , -HMC5883_ID , -HMC5883L_ID , -}; +#include "hmc5843.h" /* * Range gain settings in (+-)Ga @@ -121,15 +110,6 @@ struct hmc5843_chip_info {const int *regval_to_nanoscale; }; -/* Each client has this additional data */ -struct hmc5843_data { -struct i2c_client *client; -struct mutex lock; -struct regmap *regmap; -const struct hmc5843_chip_info *variant; -__be16 buffer[8 ];/* 3x 16-bit channels + padding + 64-bit timestamp */ -}; -/* The lower two bits contain the current conversion mode */ static s32 hmc5843_set_mode (struct hmc5843_data *data,u8 operating_mode) {@@ -159,7 +139,7 @@ static int hmc5843_wait_measurement(struct hmc5843_data *data) }if (tries <0 ) { -dev_err (&data->client->dev,"data not ready\n" ); +dev_err (data->dev,"data not ready\n" );return -EIO ; }@@ -524,7 +504,7 @@ static int hmc5843_init(struct hmc5843_data *data)if (ret <0 )return ret;if (id[0 ] !='H' || id[1 ] !='4' || id[2 ] !='3' ) { -dev_err (&data->client->dev,"no HMC5843/5883/5883L sensor\n" ); +dev_err (data->dev,"no HMC5843/5883/5883L sensor\n" );return -ENODEV ; }@@ -550,66 +530,43 @@ static const struct iio_info hmc5843_info = {static const unsigned long hmc5843_scan_masks[] = {0x7 ,0 }; -static const struct regmap_range hmc5843_readable_ranges[] = { -regmap_reg_range (0 ,HMC5843_ID_END ), -}; - -static struct regmap_access_table hmc5843_readable_table = { - .yes_ranges = hmc5843_readable_ranges, - .n_yes_ranges =ARRAY_SIZE (hmc5843_readable_ranges), -}; -static const struct regmap_range hmc5843_writable_ranges[] = { -regmap_reg_range (0 ,HMC5843_MODE_REG ), -}; - -static struct regmap_access_table hmc5843_writable_table = { - .yes_ranges = hmc5843_writable_ranges, - .n_yes_ranges =ARRAY_SIZE (hmc5843_writable_ranges), -}; - -static const struct regmap_range hmc5843_volatile_ranges[] = { -regmap_reg_range (HMC5843_DATA_OUT_MSB_REGS ,HMC5843_STATUS_REG ), -}; - -static struct regmap_access_table hmc5843_volatile_table = { - .yes_ranges = hmc5843_volatile_ranges, - .n_yes_ranges =ARRAY_SIZE (hmc5843_volatile_ranges), -}; - -static struct regmap_config hmc5843_regmap_config = { - .reg_bits =8 , - .val_bits =8 , - - .rd_table = &hmc5843_readable_table, - .wr_table = &hmc5843_writable_table, - .volatile_table = &hmc5843_volatile_table, +int hmc5843_common_suspend (struct device *dev) +{ +return hmc5843_set_mode (iio_priv (dev_get_drvdata (dev)), +HMC5843_MODE_CONVERSION_CONTINUOUS ); +} +EXPORT_SYMBOL (hmc5843_common_suspend); - .cache_type =REGCACHE_RBTREE , -}; +int hmc5843_common_resume (struct device *dev) +{ +return hmc5843_set_mode (iio_priv (dev_get_drvdata (dev)), +HMC5843_MODE_SLEEP ); +} +EXPORT_SYMBOL (hmc5843_common_resume); -static int hmc5843_probe (struct i2c_client *client, -const struct i2c_device_id *id) +int hmc5843_common_probe (struct device *dev,struct regmap *regmap, +enum hmc5843_ids id) {struct hmc5843_data *data;struct iio_dev *indio_dev;int ret; - indio_dev =devm_iio_device_alloc (&client->dev,sizeof (*data)); + indio_dev =devm_iio_device_alloc (dev,sizeof (*data));if (indio_dev ==NULL )return -ENOMEM ; +dev_set_drvdata (dev, indio_dev); +/* default settings at probe */ data =iio_priv (indio_dev); - data->client = client; - data->variant = &hmc5843_chip_info_tbl[id->driver_data]; - data->regmap =devm_regmap_init_i2c (client, &hmc5843_regmap_config); + data->dev = dev; + data->regmap = regmap; + data->variant = &hmc5843_chip_info_tbl[id];mutex_init (&data->lock); -i2c_set_clientdata (client, indio_dev); + indio_dev->dev.parent = dev; indio_dev->info = &hmc5843_info; - indio_dev->name = id->name; - indio_dev->dev.parent = &client->dev; indio_dev->modes =INDIO_DIRECT_MODE ; indio_dev->channels = data->variant->channels; indio_dev->num_channels =4 ;@@ -634,10 +591,11 @@ buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev);return ret; } +EXPORT_SYMBOL (hmc5843_common_probe); -static int hmc5843_remove (struct i2c_client *client) +int hmc5843_common_remove (struct device *dev) { -struct iio_dev *indio_dev =i2c_get_clientdata (client); +struct iio_dev *indio_dev =dev_get_drvdata (dev);iio_device_unregister (indio_dev);iio_triggered_buffer_cleanup (indio_dev);@@ -647,58 +605,8 @@ static int hmc5843_remove(struct i2c_client *client)return 0 ; } - -#ifdef CONFIG_PM_SLEEP -static int hmc5843_suspend (struct device *dev) -{ -struct hmc5843_data *data =iio_priv (i2c_get_clientdata ( -to_i2c_client (dev))); - -return hmc5843_set_mode (data,HMC5843_MODE_SLEEP ); -} - -static int hmc5843_resume (struct device *dev) -{ -struct hmc5843_data *data =iio_priv (i2c_get_clientdata ( -to_i2c_client (dev))); - -return hmc5843_set_mode (data,HMC5843_MODE_CONVERSION_CONTINUOUS ); -} - -static SIMPLE_DEV_PM_OPS(hmc5843_pm_ops, hmc5843_suspend, hmc5843_resume); -#define HMC5843_PM_OPS (&hmc5843_pm_ops) -#else -#define HMC5843_PM_OPS NULL -#endif - -static const struct i2c_device_id hmc5843_id[] = { - {"hmc5843" ,HMC5843_ID }, - {"hmc5883" ,HMC5883_ID }, - {"hmc5883l" ,HMC5883L_ID }, - { } -}; -MODULE_DEVICE_TABLE (i2c, hmc5843_id); - -static const struct of_device_id hmc5843_of_match[] = { - { .compatible ="honeywell,hmc5843" , .data = (void *)HMC5843_ID }, - { .compatible ="honeywell,hmc5883" , .data = (void *)HMC5883_ID }, - { .compatible ="honeywell,hmc5883l" , .data = (void *)HMC5883L_ID }, - {} -}; -MODULE_DEVICE_TABLE (of, hmc5843_of_match); - -static struct i2c_driver hmc5843_driver = { - .driver = { - .name ="hmc5843" , - .pm =HMC5843_PM_OPS , - .of_match_table = hmc5843_of_match, - }, - .id_table = hmc5843_id, - .probe = hmc5843_probe, - .remove = hmc5843_remove, -}; -module_i2c_driver (hmc5843_driver); +EXPORT_SYMBOL (hmc5843_common_remove);MODULE_AUTHOR ("Shubhrajyoti Datta <[email protected]>" ); -MODULE_DESCRIPTION ("HMC5843/5883/5883L driver" ); +MODULE_DESCRIPTION ("HMC5843/5883/5883L core driver" );MODULE_LICENSE ("GPL" );drivers/staging/iio/magnetometer/hmc5843_i2c.c new file +75
-0@@ -0,0 +1,75 @@ +/* +* i2c driver for hmc5843/5843/5883/5883l +* +* Split from hmc5843.c +* Copyright (C) Josef Gajdusek <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* */ + +#include <linux/module.h> +#include <linux/i2c.h> +#include <linux/regmap.h> +#include <linux/iio/iio.h> +#include <linux/iio/triggered_buffer.h> + +#include "hmc5843.h" + +static struct regmap_config hmc5843_i2c_regmap_config = { + .reg_bits =8 , + .val_bits =8 , + + .rd_table = &hmc5843_readable_table, + .wr_table = &hmc5843_writable_table, + .volatile_table = &hmc5843_volatile_table, + + .cache_type =REGCACHE_RBTREE , +}; + +static int hmc5843_i2c_probe (struct i2c_client *client, +const struct i2c_device_id *id) +{ +return hmc5843_common_probe (&client->dev, +devm_regmap_init_i2c (client, &hmc5843_i2c_regmap_config), + id->driver_data); +} + +static int hmc5843_i2c_remove (struct i2c_client *client) +{ +return hmc5843_common_remove (&client->dev); +} + +static const struct i2c_device_id hmc5843_id[] = { + {"hmc5843" ,HMC5843_ID }, + {"hmc5883" ,HMC5883_ID }, + {"hmc5883l" ,HMC5883L_ID }, + { } +}; +MODULE_DEVICE_TABLE (i2c, hmc5843_id); + +static const struct of_device_id hmc5843_of_match[] = { + { .compatible ="honeywell,hmc5843" , .data = (void *)HMC5843_ID }, + { .compatible ="honeywell,hmc5883" , .data = (void *)HMC5883_ID }, + { .compatible ="honeywell,hmc5883l" , .data = (void *)HMC5883L_ID }, + {} +}; +MODULE_DEVICE_TABLE (of, hmc5843_of_match); + +static struct i2c_driver hmc5843_driver = { + .driver = { + .name ="hmc5843" , + .pm =HMC5843_PM_OPS , + .of_match_table = hmc5843_of_match, + }, + .id_table = hmc5843_id, + .probe = hmc5843_i2c_probe, + .remove = hmc5843_i2c_remove, +}; +module_i2c_driver (hmc5843_driver); + +MODULE_AUTHOR ("Josef Gajdusek <[email protected]>" ); +MODULE_DESCRIPTION ("HMC5843/5883/5883L i2c driver" ); +MODULE_LICENSE ("GPL" );
Jonathan Cameron
maintainerRe: [PATCH v4 (staging-next) 2/5] staging:iio:hmc5843: Split hmc5843.c to multiple files
Quoted 18 lines · Jonathan Cameron
Quoted 5 lines · Josef Gajdusek
This patch splits
hmc5843.cto multiple files - the interface-agnostichmc5843_core.c, i2c specifichmc5843_i2c.cand header filehmc5843.h. This is another step to add support of SPI-enabled hmc5983.Signed-off-by Josef Gajdusek <[email protected]>Unfortunately taking the tables non static just causes sparse to complain:
drivers/staging/iio/magnetometer/hmc5843.h:62:28: warning: symbol 'hmc5843_readable_table' was not declared. Should it be static?drivers/staging/iio/magnetometer/hmc5843.h:71:28: warning: symbol 'hmc5843_writable_table' was not declared. Should it be static?drivers/staging/iio/magnetometer/hmc5843.h:80:28: warning: symbol 'hmc5843_volatile_table' was not declared. Should it be static?
CC [M]drivers/staging/iio/magnetometer/hmc5843_core.o
CHECKdrivers/staging/iio/magnetometer/hmc5843_i2c.cdrivers/staging/iio/magnetometer/hmc5843.h:62:28: warning: symbol 'hmc5843_readable_table' was not declared. Should it be static?drivers/staging/iio/magnetometer/hmc5843.h:71:28: warning: symbol 'hmc5843_writable_table' was not declared. Should it be static?drivers/staging/iio/magnetometer/hmc5843.h:80:28: warning: symbol 'hmc5843_volatile_table' was not declared. Should it be static?
CC [M]drivers/staging/iio/magnetometer/hmc5843_i2c.o
Quoted 3 lines
I think you'll probably just have to duplicate them (which is irritating, but there we are).
Jonathan
p.s. For now I've backed out patch 1 as well so that we can keep this as a clean series rather than splitting it through time!
Quoted 473 lines
Quoted 458 lines
--- drivers/staging/iio/magnetometer/Kconfig | 14 +- drivers/staging/iio/magnetometer/Makefile | 3 +- drivers/staging/iio/magnetometer/hmc5843.h | 85 ++++++++++++ .../iio/magnetometer/{hmc5843.c => hmc5843_core.c} | 154 +++++---------------- drivers/staging/iio/magnetometer/hmc5843_i2c.c | 75 ++++++++++ 5 files changed, 203 insertions(+), 128 deletions(-)create mode 100644
drivers/staging/iio/magnetometer/hmc5843.hrenamedrivers/staging/iio/magnetometer/{hmc5843.c=>hmc5843_core.c} (79%) create mode 100644drivers/staging/iio/magnetometer/hmc5843_i2c.cdrivers/staging/iio/magnetometer/Kconfig +10
-4@@ -4,16 +4,22 @@ menu "Magnetometer sensors" config SENSORS_HMC5843 - tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer" - depends on I2C + tristate select IIO_BUFFER select IIO_TRIGGERED_BUFFER + +config SENSORS_HMC5843_I2C + tristate "Honeywell HMC5843/5883/5883L 3-Axis Magnetometer (I2C)" + depends on I2C + select SENSORS_HMC5843 select REGMAP_I2C help Say Y here to add support for the Honeywell HMC5843, HMC5883 and HMC5883L 3-Axis Magnetometer (digital compass). - To compile this driver as a module, choose M here: the module - will be called hmc5843. + This driver can also be compiled as a set of modules. + If so, these modules will be created: + - hmc5843_core (core functions) + - hmc5843_i2c (support for HMC5843, HMC5883 and HMC5883L) endmenudrivers/staging/iio/magnetometer/Makefile +2
-1@@ -2,4 +2,5 @@ # Makefile for industrial I/O Magnetometer sensors # -obj-$(CONFIG_SENSORS_HMC5843) += hmc5843.o +obj-$(CONFIG_SENSORS_HMC5843) += hmc5843_core.o +obj-$(CONFIG_SENSORS_HMC5843_I2C) += hmc5843_i2c.odrivers/staging/iio/magnetometer/hmc5843.h new file +85
-0@@ -0,0 +1,85 @@ +/* +* Header file for hmc5843 driver +* +* Split from hmc5843.c +* Copyright (C) Josef Gajdusek <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* */ + + +#ifndef HMC5843_CORE_H +#define HMC5843_CORE_H + +#include <linux/regmap.h> +#include <linux/iio/iio.h> + +#define HMC5843_CONFIG_REG_A 0x00 +#define HMC5843_CONFIG_REG_B 0x01 +#define HMC5843_MODE_REG 0x02 +#define HMC5843_DATA_OUT_MSB_REGS 0x03 +#define HMC5843_STATUS_REG 0x09 +#define HMC5843_ID_REG 0x0a +#define HMC5843_ID_END 0x0c + +enum hmc5843_ids { +HMC5843_ID , +HMC5883_ID , +HMC5883L_ID , +}; + +struct hmc5843_data { +struct device *dev; +struct mutex lock; +struct regmap *regmap; +const struct hmc5843_chip_info *variant; +__be16 buffer[8 ];/* 3x 16-bit channels + padding + 64-bit timestamp */ +}; + +int hmc5843_common_probe (struct device *dev,struct regmap *regmap, +enum hmc5843_ids id); +int hmc5843_common_remove (struct device *dev); + +int hmc5843_common_suspend (struct device *dev); +int hmc5843_common_resume (struct device *dev); + +#ifdef CONFIG_PM_SLEEP +static SIMPLE_DEV_PM_OPS(hmc5843_pm_ops, + hmc5843_common_suspend, + hmc5843_common_resume); +#define HMC5843_PM_OPS (&hmc5843_pm_ops) +#else +#define HMC5843_PM_OPS NULL +#endif + +static const struct regmap_range hmc5843_readable_ranges[] = { +regmap_reg_range (0 ,HMC5843_ID_END ), +}; + +struct regmap_access_table hmc5843_readable_table = { + .yes_ranges = hmc5843_readable_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_readable_ranges), +}; + +static const struct regmap_range hmc5843_writable_ranges[] = { +regmap_reg_range (0 ,HMC5843_MODE_REG ), +}; + +struct regmap_access_table hmc5843_writable_table = { + .yes_ranges = hmc5843_writable_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_writable_ranges), +}; + +static const struct regmap_range hmc5843_volatile_ranges[] = { +regmap_reg_range (HMC5843_DATA_OUT_MSB_REGS ,HMC5843_STATUS_REG ), +}; + +struct regmap_access_table hmc5843_volatile_table = { + .yes_ranges = hmc5843_volatile_ranges, + .n_yes_ranges =ARRAY_SIZE (hmc5843_volatile_ranges), +}; + +#endif /* HMC5843_CORE_H */ drivers/staging/iio/magnetometer/hmc5843_core.c renamed from drivers/staging/iio/magnetometer/hmc5843.c +31
-123@@ -4,6 +4,8 @@ Support for HMC5883 and HMC5883L by Peter Meerwald <[email protected]>. + Split to multiple files by Josef Gajdusek <[email protected]> - 2014 + This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or@@ -20,7 +22,6 @@*/ #include <linux/module.h> -#include <linux/i2c.h> #include <linux/regmap.h> #include <linux/iio/iio.h> #include <linux/iio/sysfs.h> @@ -29,19 +30,7 @@#include <linux/iio/triggered_buffer.h> #include <linux/delay.h> -#define HMC5843_CONFIG_REG_A 0x00 -#define HMC5843_CONFIG_REG_B 0x01 -#define HMC5843_MODE_REG 0x02 -#define HMC5843_DATA_OUT_MSB_REGS 0x03 -#define HMC5843_STATUS_REG 0x09 -#define HMC5843_ID_REG 0x0a -#define HMC5843_ID_END 0x0c - -enum hmc5843_ids { -HMC5843_ID , -HMC5883_ID , -HMC5883L_ID , -}; +#include "hmc5843.h" /* * Range gain settings in (+-)Ga @@ -121,15 +110,6 @@ struct hmc5843_chip_info {const int *regval_to_nanoscale; }; -/* Each client has this additional data */ -struct hmc5843_data { -struct i2c_client *client; -struct mutex lock; -struct regmap *regmap; -const struct hmc5843_chip_info *variant; -__be16 buffer[8 ];/* 3x 16-bit channels + padding + 64-bit timestamp */ -}; -/* The lower two bits contain the current conversion mode */ static s32 hmc5843_set_mode (struct hmc5843_data *data,u8 operating_mode) {@@ -159,7 +139,7 @@ static int hmc5843_wait_measurement(struct hmc5843_data *data) }if (tries <0 ) { -dev_err (&data->client->dev,"data not ready\n" ); +dev_err (data->dev,"data not ready\n" );return -EIO ; }@@ -524,7 +504,7 @@ static int hmc5843_init(struct hmc5843_data *data)if (ret <0 )return ret;if (id[0 ] !='H' || id[1 ] !='4' || id[2 ] !='3' ) { -dev_err (&data->client->dev,"no HMC5843/5883/5883L sensor\n" ); +dev_err (data->dev,"no HMC5843/5883/5883L sensor\n" );return -ENODEV ; }@@ -550,66 +530,43 @@ static const struct iio_info hmc5843_info = {static const unsigned long hmc5843_scan_masks[] = {0x7 ,0 }; -static const struct regmap_range hmc5843_readable_ranges[] = { -regmap_reg_range (0 ,HMC5843_ID_END ), -}; - -static struct regmap_access_table hmc5843_readable_table = { - .yes_ranges = hmc5843_readable_ranges, - .n_yes_ranges =ARRAY_SIZE (hmc5843_readable_ranges), -}; -static const struct regmap_range hmc5843_writable_ranges[] = { -regmap_reg_range (0 ,HMC5843_MODE_REG ), -}; - -static struct regmap_access_table hmc5843_writable_table = { - .yes_ranges = hmc5843_writable_ranges, - .n_yes_ranges =ARRAY_SIZE (hmc5843_writable_ranges), -}; - -static const struct regmap_range hmc5843_volatile_ranges[] = { -regmap_reg_range (HMC5843_DATA_OUT_MSB_REGS ,HMC5843_STATUS_REG ), -}; - -static struct regmap_access_table hmc5843_volatile_table = { - .yes_ranges = hmc5843_volatile_ranges, - .n_yes_ranges =ARRAY_SIZE (hmc5843_volatile_ranges), -}; - -static struct regmap_config hmc5843_regmap_config = { - .reg_bits =8 , - .val_bits =8 , - - .rd_table = &hmc5843_readable_table, - .wr_table = &hmc5843_writable_table, - .volatile_table = &hmc5843_volatile_table, +int hmc5843_common_suspend (struct device *dev) +{ +return hmc5843_set_mode (iio_priv (dev_get_drvdata (dev)), +HMC5843_MODE_CONVERSION_CONTINUOUS ); +} +EXPORT_SYMBOL (hmc5843_common_suspend); - .cache_type =REGCACHE_RBTREE , -}; +int hmc5843_common_resume (struct device *dev) +{ +return hmc5843_set_mode (iio_priv (dev_get_drvdata (dev)), +HMC5843_MODE_SLEEP ); +} +EXPORT_SYMBOL (hmc5843_common_resume); -static int hmc5843_probe (struct i2c_client *client, -const struct i2c_device_id *id) +int hmc5843_common_probe (struct device *dev,struct regmap *regmap, +enum hmc5843_ids id) {struct hmc5843_data *data;struct iio_dev *indio_dev;int ret; - indio_dev =devm_iio_device_alloc (&client->dev,sizeof (*data)); + indio_dev =devm_iio_device_alloc (dev,sizeof (*data));if (indio_dev ==NULL )return -ENOMEM ; +dev_set_drvdata (dev, indio_dev); +/* default settings at probe */ data =iio_priv (indio_dev); - data->client = client; - data->variant = &hmc5843_chip_info_tbl[id->driver_data]; - data->regmap =devm_regmap_init_i2c (client, &hmc5843_regmap_config); + data->dev = dev; + data->regmap = regmap; + data->variant = &hmc5843_chip_info_tbl[id];mutex_init (&data->lock); -i2c_set_clientdata (client, indio_dev); + indio_dev->dev.parent = dev; indio_dev->info = &hmc5843_info; - indio_dev->name = id->name; - indio_dev->dev.parent = &client->dev; indio_dev->modes =INDIO_DIRECT_MODE ; indio_dev->channels = data->variant->channels; indio_dev->num_channels =4 ;@@ -634,10 +591,11 @@ buffer_cleanup:iio_triggered_buffer_cleanup (indio_dev);return ret; } +EXPORT_SYMBOL (hmc5843_common_probe); -static int hmc5843_remove (struct i2c_client *client) +int hmc5843_common_remove (struct device *dev) { -struct iio_dev *indio_dev =i2c_get_clientdata (client); +struct iio_dev *indio_dev =dev_get_drvdata (dev);iio_device_unregister (indio_dev);iio_triggered_buffer_cleanup (indio_dev);@@ -647,58 +605,8 @@ static int hmc5843_remove(struct i2c_client *client)return 0 ; } - -#ifdef CONFIG_PM_SLEEP -static int hmc5843_suspend (struct device *dev) -{ -struct hmc5843_data *data =iio_priv (i2c_get_clientdata ( -to_i2c_client (dev))); - -return hmc5843_set_mode (data,HMC5843_MODE_SLEEP ); -} - -static int hmc5843_resume (struct device *dev) -{ -struct hmc5843_data *data =iio_priv (i2c_get_clientdata ( -to_i2c_client (dev))); - -return hmc5843_set_mode (data,HMC5843_MODE_CONVERSION_CONTINUOUS ); -} - -static SIMPLE_DEV_PM_OPS(hmc5843_pm_ops, hmc5843_suspend, hmc5843_resume); -#define HMC5843_PM_OPS (&hmc5843_pm_ops) -#else -#define HMC5843_PM_OPS NULL -#endif - -static const struct i2c_device_id hmc5843_id[] = { - {"hmc5843" ,HMC5843_ID }, - {"hmc5883" ,HMC5883_ID }, - {"hmc5883l" ,HMC5883L_ID }, - { } -}; -MODULE_DEVICE_TABLE (i2c, hmc5843_id); - -static const struct of_device_id hmc5843_of_match[] = { - { .compatible ="honeywell,hmc5843" , .data = (void *)HMC5843_ID }, - { .compatible ="honeywell,hmc5883" , .data = (void *)HMC5883_ID }, - { .compatible ="honeywell,hmc5883l" , .data = (void *)HMC5883L_ID }, - {} -}; -MODULE_DEVICE_TABLE (of, hmc5843_of_match); - -static struct i2c_driver hmc5843_driver = { - .driver = { - .name ="hmc5843" , - .pm =HMC5843_PM_OPS , - .of_match_table = hmc5843_of_match, - }, - .id_table = hmc5843_id, - .probe = hmc5843_probe, - .remove = hmc5843_remove, -}; -module_i2c_driver (hmc5843_driver); +EXPORT_SYMBOL (hmc5843_common_remove);MODULE_AUTHOR ("Shubhrajyoti Datta <[email protected]>" ); -MODULE_DESCRIPTION ("HMC5843/5883/5883L driver" ); +MODULE_DESCRIPTION ("HMC5843/5883/5883L core driver" );MODULE_LICENSE ("GPL" );drivers/staging/iio/magnetometer/hmc5843_i2c.c new file +65
-0@@ -0,0 +1,75 @@ +/* +* i2c driver for hmc5843/5843/5883/5883l +* +* Split from hmc5843.c +* Copyright (C) Josef Gajdusek <[email protected]> +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* */ + +#include <linux/module.h> +#include <linux/i2c.h> +#include <linux/regmap.h> +#include <linux/iio/iio.h> +#include <linux/iio/triggered_buffer.h> + +#include "hmc5843.h" + +static struct regmap_config hmc5843_i2c_regmap_config = { + .reg_bits =8 , + .val_bits =8 , + + .rd_table = &hmc5843_readable_table, + .wr_table = &hmc5843_writable_table, + .volatile_table = &hmc5843_volatile_table, + + .cache_type =REGCACHE_RBTREE , +}; + +static int hmc5843_i2c_probe (struct i2c_client *client, +const struct i2c_device_id *id) +{ +return hmc5843_common_probe (&client->dev, +devm_regmap_init_i2c (client, &hmc5843_i2c_regmap_config), + id->driver_data); +} + +static int hmc5843_i2c_remove (struct i2c_client *client) +{ +return hmc5843_common_remove (&client->dev); +} + +static const struct i2c_device_id hmc5843_id[] = { + {"hmc5843" ,HMC5843_ID }, + {"hmc5883" ,HMC5883_ID }, + {"hmc5883l" ,HMC5883L_ID }, + { } +}; +MODULE_DEVICE_TABLE (i2c, hmc5843_id); + +static const struct of_device_id hmc5843_of_match[] = { + { .compatible ="honeywell,hmc5843" , .data = (void *)HMC5843_ID }, + { .compatible ="honeywell,hmc5883" , .data = (void *)HMC5883_ID }, + { .compatible ="honeywell,hmc5883l" , .data = (void *)HMC5883L_ID }, + {} +}; +MODULE_DEVICE_TABLE (of, hmc5843_of_match); + +static struct i2c_driver hmc5843_driver = { + .driver = { + .name ="hmc5843" , + .pm =HMC5843_PM_OPS , + .of_match_table = hmc5843_of_match,drivers/staging/iio/magnetometer/hmc5843_i2c.c line 75
Quoted 10 lines
drivers/staging/iio/magnetometer/hmc5843_i2c.c new file +10
-0+ }, + .id_table = hmc5843_id, + .probe = hmc5843_i2c_probe, + .remove = hmc5843_i2c_remove, +}; +module_i2c_driver (hmc5843_driver); + +MODULE_AUTHOR ("Josef Gajdusek <[email protected]>" ); +MODULE_DESCRIPTION ("HMC5843/5883/5883L i2c driver" ); +MODULE_LICENSE ("GPL" );--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
PATCH v4 3/5 staging:iio:hmc5843: register <-> value arrays now can have different lengths
In reply to Josef GajdusekChanged structure of struct hmc5843_chip_info to include length of translation arrays. Code previously using #defined constant has been changed accordingly. This allows to integrate devices which do have different amounts of available rates/scales.
--- drivers/staging/iio/magnetometer/hmc5843_core.c | 34 +++++++++++++++++-------- 1 file changed, 23 insertions(+), 11 deletions(-)
drivers/staging/iio/magnetometer/hmc5843_core.c +23 -11
@@ -39,7 +39,6 @@*/ #define HMC5843_RANGE_GAIN_OFFSET 0x05#define HMC5843_RANGE_GAIN_DEFAULT 0x01 -#define HMC5843_RANGE_GAINS 8#define HMC5843_RANGE_GAIN_MASK 0xe0/* Device status */
@@ -59,7 +58,6 @@*/ #define HMC5843_RATE_OFFSET 0x02#define HMC5843_RATE_DEFAULT 0x04 -#define HMC5843_RATES 7#define HMC5843_RATE_MASK 0x1c/* Device measurement configuration */
@@ -69,15 +67,15 @@#define HMC5843_MEAS_CONF_MASK 0x03/* Scaling factors: 10000000/Gain */ -static const int hmc5843_regval_to_nanoscale[HMC5843_RANGE_GAINS ] = { +static const int hmc5843_regval_to_nanoscale[] = {6173 ,7692 ,10309 ,12821 ,18868 ,21739 ,25641 ,35714 }; -static const int hmc5883_regval_to_nanoscale[HMC5843_RANGE_GAINS ] = { +static const int hmc5883_regval_to_nanoscale[] = {7812 ,9766 ,13021 ,16287 ,24096 ,27701 ,32573 ,45662 }; -static const int hmc5883l_regval_to_nanoscale[HMC5843_RANGE_GAINS ] = { +static const int hmc5883l_regval_to_nanoscale[] = {7299 ,9174 ,12195 ,15152 ,22727 ,25641 ,30303 ,43478 };
@@ -94,11 +92,11 @@ static const int hmc5883l_regval_to_nanoscale[HMC5843_RANGE_GAINS] = {* 6 | 50 | 75 * 7 | Not used | Not used */ -static const int hmc5843_regval_to_samp_freq[7 ][2 ] = { +static const int hmc5843_regval_to_samp_freq[][2 ] = { {0 ,500000 }, {1 ,0 }, {2 ,0 }, {5 ,0 }, {10 ,0 }, {20 ,0 }, {50 ,0 } }; -static const int hmc5883_regval_to_samp_freq[7 ][2 ] = { +static const int hmc5883_regval_to_samp_freq[][2 ] = { {0 ,750000 }, {1 ,500000 }, {3 ,0 }, {7 ,500000 }, {15 ,0 }, {30 ,0 }, {75 ,0 } };
@@ -107,7 +105,9 @@ static const int hmc5883_regval_to_samp_freq[7][2] = {struct hmc5843_chip_info {const struct iio_chan_spec *channels;const int (*regval_to_samp_freq)[2 ]; +const int n_regval_to_samp_freq;const int *regval_to_nanoscale; +const int n_regval_to_nanoscale; };/* The lower two bits contain the current conversion mode */
@@ -248,7 +248,7 @@ static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,size_t len =0 ;int i; -for (i =0 ; i <HMC5843_RATES ; i++) +for (i =0 ; i < data->variant->n_regval_to_samp_freq; i++) len +=scnprintf (buf + len,PAGE_SIZE - len,"%d.%d " , data->variant->regval_to_samp_freq[i][0 ], data->variant->regval_to_samp_freq[i][1 ]);
@@ -278,7 +278,7 @@ static int hmc5843_get_samp_freq_index(struct hmc5843_data *data, {int i; -for (i =0 ; i <HMC5843_RATES ; i++) +for (i =0 ; i < data->variant->n_regval_to_samp_freq; i++)if (val == data->variant->regval_to_samp_freq[i][0 ] && val2 == data->variant->regval_to_samp_freq[i][1 ])return i;
@@ -307,7 +307,7 @@ static ssize_t hmc5843_show_scale_avail(struct device *dev,size_t len =0 ;int i; -for (i =0 ; i <HMC5843_RANGE_GAINS ; i++) +for (i =0 ; i < data->variant->n_regval_to_nanoscale; i++) len +=scnprintf (buf + len,PAGE_SIZE - len,"0.%09d " , data->variant->regval_to_nanoscale[i]);
@@ -327,7 +327,7 @@ static int hmc5843_get_scale_index(struct hmc5843_data *data, int val, int val2)if (val !=0 )return -EINVAL ; -for (i =0 ; i <HMC5843_RANGE_GAINS ; i++) +for (i =0 ; i < data->variant->n_regval_to_nanoscale; i++)if (val2 == data->variant->regval_to_nanoscale[i])return i;
@@ -480,17 +480,29 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = { [HMC5843_ID ] = { .channels = hmc5843_channels, .regval_to_samp_freq = hmc5843_regval_to_samp_freq, + .n_regval_to_samp_freq = +ARRAY_SIZE (hmc5843_regval_to_samp_freq), .regval_to_nanoscale = hmc5843_regval_to_nanoscale, + .n_regval_to_nanoscale = +ARRAY_SIZE (hmc5843_regval_to_nanoscale), }, [HMC5883_ID ] = { .channels = hmc5883_channels, .regval_to_samp_freq = hmc5883_regval_to_samp_freq, + .n_regval_to_samp_freq = +ARRAY_SIZE (hmc5883_regval_to_samp_freq), .regval_to_nanoscale = hmc5883_regval_to_nanoscale, + .n_regval_to_nanoscale = +ARRAY_SIZE (hmc5883_regval_to_nanoscale), }, [HMC5883L_ID ] = { .channels = hmc5883_channels, .regval_to_samp_freq = hmc5883_regval_to_samp_freq, + .n_regval_to_samp_freq = +ARRAY_SIZE (hmc5883_regval_to_samp_freq), .regval_to_nanoscale = hmc5883l_regval_to_nanoscale, + .n_regval_to_nanoscale = +ARRAY_SIZE (hmc5883l_regval_to_nanoscale), }, };
Signature · 1 line
1.8.5.5
PATCH v4 4/5 staging:iio:hmc5843: Add support for i2c hmc5983
In reply to Josef GajdusekThis patch adds support for the hmc5983 i2c interface.
This chip is almost identical to the hmc5883. The difference being added temperature compensation, additional available sample rate (220Hz) and an SPI interface.
--- drivers/staging/iio/magnetometer/Kconfig | 2 +- drivers/staging/iio/magnetometer/hmc5843.h | 1 + drivers/staging/iio/magnetometer/hmc5843_core.c | 20 +++++++++++++++++--- drivers/staging/iio/magnetometer/hmc5843_i2c.c | 6 ++++-- 4 files changed, 23 insertions(+), 6 deletions(-)
drivers/staging/iio/magnetometer/Kconfig +1 -1
@@ -20,6 +20,6 @@ config SENSORS_HMC5843_I2C This driver can also be compiled as a set of modules. If so, these modules will be created: - hmc5843_core (core functions) - - hmc5843_i2c (support for HMC5843, HMC5883 and HMC5883L) + - hmc5843_i2c (support for HMC5843, HMC5883, HMC5883L and HMC5983) endmenu
drivers/staging/iio/magnetometer/hmc5843.h +1 -0
@@ -29,6 +29,7 @@ enum hmc5843_ids {HMC5843_ID ,HMC5883_ID ,HMC5883L_ID , + HMC5983_ID, }; struct hmc5843_data {
drivers/staging/iio/magnetometer/hmc5843_core.c +17 -3
@@ -101,6 +101,11 @@ static const int hmc5883_regval_to_samp_freq[][2] = { {75, 0} }; +static const int hmc5983_regval_to_samp_freq[][2 ] = { + {0 ,750000 }, {1 ,500000 }, {3 ,0 }, {7 ,500000 }, {15 ,0 }, {30 ,0 }, + {75 ,0 }, {220 ,0 } +}; +/* Describe chip variants */ struct hmc5843_chip_info {const struct iio_chan_spec *channels;
@@ -457,7 +462,7 @@ static const struct iio_chan_spec hmc5843_channels[] = { IIO_CHAN_SOFT_TIMESTAMP(3), }; -/* Beware: Y and Z are exchanged on HMC5883 */ +/* Beware: Y and Z are exchanged on HMC5883 and 5983 */ static const struct iio_chan_spec hmc5883_channels[] = {HMC5843_CHANNEL (X ,0 ),HMC5843_CHANNEL (Z ,1 ),
@@ -504,6 +509,15 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = { .n_regval_to_nanoscale = ARRAY_SIZE(hmc5883l_regval_to_nanoscale), }, + [HMC5983_ID] = { + .channels = hmc5883_channels, + .regval_to_samp_freq = hmc5983_regval_to_samp_freq, + .n_regval_to_samp_freq = + ARRAY_SIZE(hmc5983_regval_to_samp_freq), + .regval_to_nanoscale = hmc5883l_regval_to_nanoscale, + .n_regval_to_nanoscale = + ARRAY_SIZE(hmc5883l_regval_to_nanoscale), + } };static int hmc5843_init (struct hmc5843_data *data)
@@ -516,7 +530,7 @@ static int hmc5843_init(struct hmc5843_data *data)if (ret <0 )return ret;if (id[0 ] !='H' || id[1 ] !='4' || id[2 ] !='3' ) { -dev_err (data->dev,"no HMC5843/5883/5883L sensor\n" ); +dev_err (data->dev,"no HMC5843/5883/5883L/5983 sensor\n" );return -ENODEV ; }
@@ -620,5 +634,5 @@ int hmc5843_common_remove(struct device *dev)EXPORT_SYMBOL (hmc5843_common_remove);MODULE_AUTHOR ("Shubhrajyoti Datta <[email protected]>" ); -MODULE_DESCRIPTION ("HMC5843/5883/5883L core driver" ); +MODULE_DESCRIPTION ("HMC5843/5883/5883L/5983 core driver" );MODULE_LICENSE ("GPL" );
drivers/staging/iio/magnetometer/hmc5843_i2c.c +4 -2
@@ -1,5 +1,5 @@/* -* i2c driver for hmc5843/5843/5883/5883l +* i2c driver for hmc5843/5843/5883/5883l/5983 * * Split from hmc5843.c * Copyright (C) Josef Gajdusek <[email protected]>
@@ -46,6 +46,7 @@ static const struct i2c_device_id hmc5843_id[] = { { "hmc5843", HMC5843_ID }, { "hmc5883", HMC5883_ID }, { "hmc5883l", HMC5883L_ID }, + { "hmc5983", HMC5983_ID }, { } };MODULE_DEVICE_TABLE (i2c, hmc5843_id);
@@ -54,6 +55,7 @@ static const struct of_device_id hmc5843_of_match[] = { { .compatible = "honeywell,hmc5843", .data = (void *)HMC5843_ID }, { .compatible = "honeywell,hmc5883", .data = (void *)HMC5883_ID }, { .compatible = "honeywell,hmc5883l", .data = (void *)HMC5883L_ID }, + { .compatible = "honeywell,hmc5983", .data = (void *)HMC5983_ID }, {} };MODULE_DEVICE_TABLE (of, hmc5843_of_match);
@@ -71,5 +73,5 @@ static struct i2c_driver hmc5843_driver = {module_i2c_driver (hmc5843_driver);MODULE_AUTHOR ("Josef Gajdusek <[email protected]>" ); -MODULE_DESCRIPTION ("HMC5843/5883/5883L i2c driver" ); +MODULE_DESCRIPTION ("HMC5843/5883/5883L/5983 i2c driver" );MODULE_LICENSE ("GPL" );
Signature · 1 line
1.8.5.5
PATCH v4 5/5 staging:iio:hmc5843: Add support for spi hmc5983
In reply to Josef GajdusekThis patch adds support for the hmc5983 spi interface.
This chip is almost identical to the hmc5883. The difference being added temperature compensation, additional available sample rate (220Hz) and an SPI interface.
--- drivers/staging/iio/magnetometer/Kconfig | 15 ++++++ drivers/staging/iio/magnetometer/Makefile | 1 + drivers/staging/iio/magnetometer/hmc5843_spi.c | 73 ++++++++++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 drivers/staging/iio/magnetometer/hmc5843_spi.c
drivers/staging/iio/magnetometer/Kconfig +15 -0
@@ -22,4 +22,19 @@ config SENSORS_HMC5843_I2C - hmc5843_core (core functions) - hmc5843_i2c (support for HMC5843, HMC5883, HMC5883L and HMC5983) +config SENSORS_HMC5843_SPI + tristate "Honeywell HMC5983 3-Axis Magnetometer (SPI)" + depends on SPI_MASTER + select SENSORS_HMC5843 + select REGMAP_SPI + help + Say Y here to add support for the Honeywell HMC5983 3-Axis Magnetometer + (digital compass). + + This driver can also be compiled as a set of modules. + If so, these modules will be created: + - hmc5843_core (core functions) + - hmc5843_spi (support for HMC5983) + + endmenu
drivers/staging/iio/magnetometer/Makefile +1 -0
@@ -4,3 +4,4 @@ obj-$(CONFIG_SENSORS_HMC5843) += hmc5843_core.o obj-$(CONFIG_SENSORS_HMC5843_I2C) += hmc5843_i2c.o +obj-$(CONFIG_SENSORS_HMC5843_SPI) += hmc5843_spi.o
drivers/staging/iio/magnetometer/hmc5843_spi.c new file +73 -0
73 lines not on this page · raw message
Signature · 1 line
1.8.5.5