* [PATCH v3 01/10] staging:iio:hmc5843: Use SCALE instead of magn_range
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-15 22:14 ` Jonathan Cameron
2013-10-14 21:34 ` [PATCH v3 02/10] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
` (8 subsequent siblings)
9 siblings, 1 reply; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
v2:
* use SCALE instead of CALIBSCALE to control the range/gain
of measurements
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 160 +++++++++++------------------
1 file changed, 59 insertions(+), 101 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index b29622c..e577740 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -49,7 +49,7 @@ enum hmc5843_ids {
*/
#define HMC5843_RANGE_GAIN_OFFSET 0x05
#define HMC5843_RANGE_GAIN_DEFAULT 0x01
-#define HMC5843_RANGE_GAIN_MAX 0x07
+#define HMC5843_RANGE_GAINS 8
/* Device status */
#define HMC5843_DATA_READY 0x01
@@ -79,65 +79,19 @@ enum hmc5843_ids {
#define HMC5843_MEAS_CONF_MASK 0x03
/* Scaling factors: 10000000/Gain */
-static const int hmc5843_regval_to_nanoscale[] = {
+static const int hmc5843_regval_to_nanoscale[HMC5843_RANGE_GAINS] = {
6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714
};
-static const int hmc5883_regval_to_nanoscale[] = {
+static const int hmc5883_regval_to_nanoscale[HMC5843_RANGE_GAINS] = {
7812, 9766, 13021, 16287, 24096, 27701, 32573, 45662
};
-static const int hmc5883l_regval_to_nanoscale[] = {
+static const int hmc5883l_regval_to_nanoscale[HMC5843_RANGE_GAINS] = {
7299, 9174, 12195, 15152, 22727, 25641, 30303, 43478
};
/*
- * From the HMC5843 datasheet:
- * Value | Sensor input field range (Ga) | Gain (counts/milli-Gauss)
- * 0 | (+-)0.7 | 1620
- * 1 | (+-)1.0 | 1300
- * 2 | (+-)1.5 | 970
- * 3 | (+-)2.0 | 780
- * 4 | (+-)3.2 | 530
- * 5 | (+-)3.8 | 460
- * 6 | (+-)4.5 | 390
- * 7 | (+-)6.5 | 280
- *
- * From the HMC5883 datasheet:
- * Value | Recommended sensor field range (Ga) | Gain (counts/Gauss)
- * 0 | (+-)0.9 | 1280
- * 1 | (+-)1.2 | 1024
- * 2 | (+-)1.9 | 768
- * 3 | (+-)2.5 | 614
- * 4 | (+-)4.0 | 415
- * 5 | (+-)4.6 | 361
- * 6 | (+-)5.5 | 307
- * 7 | (+-)7.9 | 219
- *
- * From the HMC5883L datasheet:
- * Value | Recommended sensor field range (Ga) | Gain (LSB/Gauss)
- * 0 | (+-)0.88 | 1370
- * 1 | (+-)1.3 | 1090
- * 2 | (+-)1.9 | 820
- * 3 | (+-)2.5 | 660
- * 4 | (+-)4.0 | 440
- * 5 | (+-)4.7 | 390
- * 6 | (+-)5.6 | 330
- * 7 | (+-)8.1 | 230
- */
-static const int hmc5843_regval_to_input_field_mga[] = {
- 700, 1000, 1500, 2000, 3200, 3800, 4500, 6500
-};
-
-static const int hmc5883_regval_to_input_field_mga[] = {
- 900, 1200, 1900, 2500, 4000, 4600, 5500, 7900
-};
-
-static const int hmc5883l_regval_to_input_field_mga[] = {
- 880, 1300, 1900, 2500, 4000, 4700, 5600, 8100
-};
-
-/*
* From the datasheet:
* Value | HMC5843 | HMC5883/HMC5883L
* | Data output rate (Hz) | Data output rate (Hz)
@@ -163,7 +117,6 @@ 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 *regval_to_input_field_mga;
const int *regval_to_nanoscale;
};
@@ -412,58 +365,41 @@ static int hmc5843_check_samp_freq(struct hmc5843_data *data,
val, val2);
}
-static ssize_t hmc5843_show_range_gain(struct device *dev,
- struct device_attribute *attr,
- char *buf)
+static ssize_t hmc5843_show_scale_avail(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- u8 range;
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct hmc5843_data *data = iio_priv(indio_dev);
+ struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
+
+ size_t len = 0;
+ int i;
- range = data->range;
- return sprintf(buf, "%d\n", data->variant->regval_to_input_field_mga[range]);
+ for (i = 0; i < HMC5843_RANGE_GAINS; i++)
+ len += scnprintf(buf + len, PAGE_SIZE - len,
+ "0.%09d ", data->variant->regval_to_nanoscale[i]);
+
+ /* replace trailing space by newline */
+ buf[len - 1] = '\n';
+
+ return len;
}
-static ssize_t hmc5843_set_range_gain(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t count)
-{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
- struct hmc5843_data *data = iio_priv(indio_dev);
- unsigned long range = 0;
- int error;
+static IIO_DEVICE_ATTR(scale_available, S_IRUGO,
+ hmc5843_show_scale_avail, NULL, 0);
- mutex_lock(&data->lock);
- error = kstrtoul(buf, 10, &range);
- if (error) {
- count = error;
- goto exit;
- }
- dev_dbg(dev, "set range to %lu\n", range);
+static int hmc5843_check_scale(struct hmc5843_data *data, int val, int val2)
+{
+ int i;
- if (range > HMC5843_RANGE_GAIN_MAX) {
- count = -EINVAL;
- goto exit;
- }
+ if (val != 0)
+ return -EINVAL;
- data->range = range;
- range = range << HMC5843_RANGE_GAIN_OFFSET;
- if (i2c_smbus_write_byte_data(data->client, this_attr->address, range))
- count = -EINVAL;
+ for (i = 0; i < HMC5843_RANGE_GAINS; i++)
+ if (val2 == data->variant->regval_to_nanoscale[i])
+ return i;
-exit:
- mutex_unlock(&data->lock);
- return count;
+ return -EINVAL;
}
-static IIO_DEVICE_ATTR(in_magn_range,
- S_IWUSR | S_IRUGO,
- hmc5843_show_range_gain,
- hmc5843_set_range_gain,
- HMC5843_CONFIG_REG_B);
-
static int hmc5843_read_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
int *val, int *val2, long mask)
@@ -490,7 +426,7 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
int val, int val2, long mask)
{
struct hmc5843_data *data = iio_priv(indio_dev);
- int ret, rate;
+ int ret, rate, range;
switch (mask) {
case IIO_CHAN_INFO_SAMP_FREQ:
@@ -505,6 +441,33 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
mutex_unlock(&data->lock);
return ret;
+ case IIO_CHAN_INFO_SCALE:
+ range = hmc5843_check_scale(data, val, val2);
+ if (range < 0)
+ return -EINVAL;
+
+ range <<= HMC5843_RANGE_GAIN_OFFSET;
+ mutex_lock(&data->lock);
+ ret = i2c_smbus_write_byte_data(data->client,
+ HMC5843_CONFIG_REG_B, range);
+ if (ret >= 0)
+ data->range = range;
+ mutex_unlock(&data->lock);
+
+ return ret;
+ default:
+ return -EINVAL;
+ }
+}
+
+static int hmc5843_write_raw_get_fmt(struct iio_dev *indio_dev,
+ struct iio_chan_spec const *chan, long mask)
+{
+ switch (mask) {
+ case IIO_CHAN_INFO_SAMP_FREQ:
+ return IIO_VAL_INT_PLUS_MICRO;
+ case IIO_CHAN_INFO_SCALE:
+ return IIO_VAL_INT_PLUS_NANO;
default:
return -EINVAL;
}
@@ -536,7 +499,7 @@ static const struct iio_chan_spec hmc5883_channels[] = {
static struct attribute *hmc5843_attributes[] = {
&iio_dev_attr_meas_conf.dev_attr.attr,
&iio_dev_attr_operating_mode.dev_attr.attr,
- &iio_dev_attr_in_magn_range.dev_attr.attr,
+ &iio_dev_attr_scale_available.dev_attr.attr,
&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
NULL
};
@@ -549,22 +512,16 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = {
[HMC5843_ID] = {
.channels = hmc5843_channels,
.regval_to_samp_freq = hmc5843_regval_to_samp_freq,
- .regval_to_input_field_mga =
- hmc5843_regval_to_input_field_mga,
.regval_to_nanoscale = hmc5843_regval_to_nanoscale,
},
[HMC5883_ID] = {
.channels = hmc5883_channels,
.regval_to_samp_freq = hmc5883_regval_to_samp_freq,
- .regval_to_input_field_mga =
- hmc5883_regval_to_input_field_mga,
.regval_to_nanoscale = hmc5883_regval_to_nanoscale,
},
[HMC5883L_ID] = {
.channels = hmc5883_channels,
.regval_to_samp_freq = hmc5883_regval_to_samp_freq,
- .regval_to_input_field_mga =
- hmc5883l_regval_to_input_field_mga,
.regval_to_nanoscale = hmc5883l_regval_to_nanoscale,
},
};
@@ -582,6 +539,7 @@ static const struct iio_info hmc5843_info = {
.attrs = &hmc5843_group,
.read_raw = &hmc5843_read_raw,
.write_raw = &hmc5843_write_raw,
+ .write_raw_get_fmt = &hmc5843_write_raw_get_fmt,
.driver_module = THIS_MODULE,
};
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v3 01/10] staging:iio:hmc5843: Use SCALE instead of magn_range
2013-10-14 21:34 ` [PATCH v3 01/10] staging:iio:hmc5843: Use SCALE instead of magn_range Peter Meerwald
@ 2013-10-15 22:14 ` Jonathan Cameron
0 siblings, 0 replies; 13+ messages in thread
From: Jonathan Cameron @ 2013-10-15 22:14 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/14/13 22:34, Peter Meerwald wrote:
> v2:
> * use SCALE instead of CALIBSCALE to control the range/gain
> of measurements
>
Only a couple of tiny little comments. The function *_check_scale
does rather more than checking the scale is valid. Perhaps
the name could reflect that?
Also, would it make more sense to move the shift into that function
rather than having it directly afterwards? (I don't really mind
about this though!)
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Looking very nice.
...
hmc5843_get_scale_index?
or with the shift already applied
hmc5843_get_scale_regval
> +static int hmc5843_check_scale(struct hmc5843_data *data, int val, int val2)
> +{
> + int i;
>
> - if (range > HMC5843_RANGE_GAIN_MAX) {
> - count = -EINVAL;
> - goto exit;
> - }
> + if (val != 0)
> + return -EINVAL;
>
> - data->range = range;
> - range = range << HMC5843_RANGE_GAIN_OFFSET;
> - if (i2c_smbus_write_byte_data(data->client, this_attr->address, range))
> - count = -EINVAL;
> + for (i = 0; i < HMC5843_RANGE_GAINS; i++)
> + if (val2 == data->variant->regval_to_nanoscale[i])
> + return i;
>
> -exit:
> - mutex_unlock(&data->lock);
> - return count;
> + return -EINVAL;
> }
...
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v3 02/10] staging:iio:hmc5843: Always read all channels values otherwise no updates
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 01/10] staging:iio:hmc5843: Use SCALE instead of magn_range Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-15 5:39 ` Lars-Peter Clausen
2013-10-14 21:34 ` [PATCH v3 03/10] staging:iio:hmc5843: Add trigger handling Peter Meerwald
` (7 subsequent siblings)
9 siblings, 1 reply; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
Split out data ready/wait for read measurement
fix bug in case reading status register fails
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 53 ++++++++++++++++++------------
1 file changed, 32 insertions(+), 21 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index e577740..a17c88d 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -28,12 +28,7 @@
#define HMC5843_CONFIG_REG_A 0x00
#define HMC5843_CONFIG_REG_B 0x01
#define HMC5843_MODE_REG 0x02
-#define HMC5843_DATA_OUT_X_MSB_REG 0x03
-#define HMC5843_DATA_OUT_Y_MSB_REG 0x05
-#define HMC5843_DATA_OUT_Z_MSB_REG 0x07
-/* Beware: Y and Z are exchanged on HMC5883 */
-#define HMC5883_DATA_OUT_Z_MSB_REG 0x05
-#define HMC5883_DATA_OUT_Y_MSB_REG 0x07
+#define HMC5843_DATA_OUT_MSB_REGS 0x03
#define HMC5843_STATUS_REG 0x09
enum hmc5843_ids {
@@ -140,17 +135,16 @@ static s32 hmc5843_configure(struct i2c_client *client,
operating_mode & HMC5843_MODE_MASK);
}
-/* Return the measurement value from the specified channel */
-static int hmc5843_read_measurement(struct hmc5843_data *data,
- int address, int *val)
+static int hmc5843_wait_measurement(struct hmc5843_data *data)
{
s32 result;
int tries = 150;
- mutex_lock(&data->lock);
while (tries-- > 0) {
result = i2c_smbus_read_byte_data(data->client,
HMC5843_STATUS_REG);
+ if (result < 0)
+ return result;
if (result & HMC5843_DATA_READY)
break;
msleep(20);
@@ -158,16 +152,32 @@ static int hmc5843_read_measurement(struct hmc5843_data *data,
if (tries < 0) {
dev_err(&data->client->dev, "data not ready\n");
- mutex_unlock(&data->lock);
return -EIO;
}
- result = i2c_smbus_read_word_swapped(data->client, address);
+ return 0;
+}
+
+/* Return the measurement value from the specified channel */
+static int hmc5843_read_measurement(struct hmc5843_data *data,
+ int idx, int *val)
+{
+ s32 result;
+ s16 values[3];
+
+ mutex_lock(&data->lock);
+ result = hmc5843_wait_measurement(data);
+ if (result < 0) {
+ mutex_unlock(&data->lock);
+ return result;
+ }
+ result = i2c_smbus_read_i2c_block_data(data->client,
+ HMC5843_DATA_OUT_MSB_REGS, sizeof(values), (u8 *) values);
mutex_unlock(&data->lock);
if (result < 0)
return -EINVAL;
- *val = sign_extend32(result, 15);
+ *val = sign_extend32(be16_to_cpu(values[idx]), 15);
return IIO_VAL_INT;
}
@@ -473,7 +483,7 @@ static int hmc5843_write_raw_get_fmt(struct iio_dev *indio_dev,
}
}
-#define HMC5843_CHANNEL(axis, addr) \
+#define HMC5843_CHANNEL(axis, idx) \
{ \
.type = IIO_MAGN, \
.modified = 1, \
@@ -481,19 +491,20 @@ static int hmc5843_write_raw_get_fmt(struct iio_dev *indio_dev,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
BIT(IIO_CHAN_INFO_SAMP_FREQ), \
- .address = addr \
+ .address = idx \
}
static const struct iio_chan_spec hmc5843_channels[] = {
- HMC5843_CHANNEL(X, HMC5843_DATA_OUT_X_MSB_REG),
- HMC5843_CHANNEL(Y, HMC5843_DATA_OUT_Y_MSB_REG),
- HMC5843_CHANNEL(Z, HMC5843_DATA_OUT_Z_MSB_REG),
+ HMC5843_CHANNEL(X, 0),
+ HMC5843_CHANNEL(Y, 1),
+ HMC5843_CHANNEL(Z, 2),
};
+/* Beware: Y and Z are exchanged on HMC5883 */
static const struct iio_chan_spec hmc5883_channels[] = {
- HMC5843_CHANNEL(X, HMC5843_DATA_OUT_X_MSB_REG),
- HMC5843_CHANNEL(Y, HMC5883_DATA_OUT_Y_MSB_REG),
- HMC5843_CHANNEL(Z, HMC5883_DATA_OUT_Z_MSB_REG),
+ HMC5843_CHANNEL(X, 0),
+ HMC5843_CHANNEL(Z, 1),
+ HMC5843_CHANNEL(Y, 2),
};
static struct attribute *hmc5843_attributes[] = {
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v3 02/10] staging:iio:hmc5843: Always read all channels values otherwise no updates
2013-10-14 21:34 ` [PATCH v3 02/10] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
@ 2013-10-15 5:39 ` Lars-Peter Clausen
0 siblings, 0 replies; 13+ messages in thread
From: Lars-Peter Clausen @ 2013-10-15 5:39 UTC (permalink / raw)
To: Peter Meerwald; +Cc: linux-iio
On 10/14/2013 11:34 PM, Peter Meerwald wrote:
> +/* Return the measurement value from the specified channel */
> +static int hmc5843_read_measurement(struct hmc5843_data *data,
> + int idx, int *val)
> +{
> + s32 result;
> + s16 values[3];
I'm currently trying to make iio pass `make C=2 CF=-D__CHECK_ENDIAN__`.
This should be __be16
> +
> + mutex_lock(&data->lock);
> + result = hmc5843_wait_measurement(data);
> + if (result < 0) {
> + mutex_unlock(&data->lock);
> + return result;
> + }
> + result = i2c_smbus_read_i2c_block_data(data->client,
> + HMC5843_DATA_OUT_MSB_REGS, sizeof(values), (u8 *) values);
> mutex_unlock(&data->lock);
> if (result < 0)
> return -EINVAL;
>
> - *val = sign_extend32(result, 15);
> + *val = sign_extend32(be16_to_cpu(values[idx]), 15);
> return IIO_VAL_INT;
> }
>
[...]
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v3 03/10] staging:iio:hmc5843: Add trigger handling
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 01/10] staging:iio:hmc5843: Use SCALE instead of magn_range Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 02/10] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 04/10] staging:iio:hmc5843: Remove ability to change operating mode Peter Meerwald
` (6 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
v2 (thanks to Jonathan Cameron):
* drop dynamic buffer allocation, buffer is in hmc5842_data
* grab timestamp near data acquisition
* restrict available scan masks (only read all axis)
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 69 ++++++++++++++++++++++++++----
1 file changed, 61 insertions(+), 8 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index a17c88d..b6380fa 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -23,6 +23,9 @@
#include <linux/i2c.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
+#include <linux/iio/trigger_consumer.h>
+#include <linux/iio/buffer.h>
+#include <linux/iio/triggered_buffer.h>
#include <linux/delay.h>
#define HMC5843_CONFIG_REG_A 0x00
@@ -124,6 +127,7 @@ struct hmc5843_data {
u8 operating_mode;
u8 range;
const struct hmc5843_chip_info *variant;
+ s16 buffer[8]; /* 3x 16-bit channels + padding + 64-bit timestamp */
};
/* The lower two bits contain the current conversion mode */
@@ -418,7 +422,7 @@ static int hmc5843_read_raw(struct iio_dev *indio_dev,
switch (mask) {
case IIO_CHAN_INFO_RAW:
- return hmc5843_read_measurement(data, chan->address, val);
+ return hmc5843_read_measurement(data, chan->scan_index, val);
case IIO_CHAN_INFO_SCALE:
*val = 0;
*val2 = data->variant->regval_to_nanoscale[data->range];
@@ -483,6 +487,36 @@ static int hmc5843_write_raw_get_fmt(struct iio_dev *indio_dev,
}
}
+static irqreturn_t hmc5843_trigger_handler(int irq, void *p)
+{
+ struct iio_poll_func *pf = p;
+ struct iio_dev *indio_dev = pf->indio_dev;
+ struct hmc5843_data *data = iio_priv(indio_dev);
+ int ret;
+
+ mutex_lock(&data->lock);
+ ret = hmc5843_wait_measurement(data);
+ if (ret < 0) {
+ mutex_unlock(&data->lock);
+ goto done;
+ }
+
+ ret = i2c_smbus_read_i2c_block_data(data->client,
+ HMC5843_DATA_OUT_MSB_REGS, 3 * sizeof(s16),
+ (u8 *) data->buffer);
+ mutex_unlock(&data->lock);
+ if (ret < 0)
+ goto done;
+
+ iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
+ iio_get_time_ns());
+
+done:
+ iio_trigger_notify_done(indio_dev->trig);
+
+ return IRQ_HANDLED;
+}
+
#define HMC5843_CHANNEL(axis, idx) \
{ \
.type = IIO_MAGN, \
@@ -491,13 +525,15 @@ static int hmc5843_write_raw_get_fmt(struct iio_dev *indio_dev,
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \
BIT(IIO_CHAN_INFO_SAMP_FREQ), \
- .address = idx \
+ .scan_index = idx, \
+ .scan_type = IIO_ST('s', 16, 16, IIO_BE), \
}
static const struct iio_chan_spec hmc5843_channels[] = {
HMC5843_CHANNEL(X, 0),
HMC5843_CHANNEL(Y, 1),
HMC5843_CHANNEL(Z, 2),
+ IIO_CHAN_SOFT_TIMESTAMP(3),
};
/* Beware: Y and Z are exchanged on HMC5883 */
@@ -505,6 +541,7 @@ static const struct iio_chan_spec hmc5883_channels[] = {
HMC5843_CHANNEL(X, 0),
HMC5843_CHANNEL(Z, 1),
HMC5843_CHANNEL(Y, 2),
+ IIO_CHAN_SOFT_TIMESTAMP(3),
};
static struct attribute *hmc5843_attributes[] = {
@@ -554,12 +591,14 @@ static const struct iio_info hmc5843_info = {
.driver_module = THIS_MODULE,
};
+static const unsigned long hmc5843_scan_masks[] = {0x7, 0};
+
static int hmc5843_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
struct hmc5843_data *data;
struct iio_dev *indio_dev;
- int err = 0;
+ int ret;
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
if (indio_dev == NULL)
@@ -577,20 +616,34 @@ static int hmc5843_probe(struct i2c_client *client,
indio_dev->dev.parent = &client->dev;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->channels = data->variant->channels;
- indio_dev->num_channels = 3;
+ indio_dev->num_channels = 4;
+ indio_dev->available_scan_masks = hmc5843_scan_masks;
hmc5843_init(data);
- err = iio_device_register(indio_dev);
- if (err)
- return err;
+ ret = iio_triggered_buffer_setup(indio_dev, NULL,
+ hmc5843_trigger_handler, NULL);
+ if (ret < 0)
+ return ret;
+
+ ret = iio_device_register(indio_dev);
+ if (ret < 0)
+ goto buffer_cleanup;
return 0;
+
+buffer_cleanup:
+ iio_triggered_buffer_cleanup(indio_dev);
+ return ret;
}
static int hmc5843_remove(struct i2c_client *client)
{
- iio_device_unregister(i2c_get_clientdata(client));
+ struct iio_dev *indio_dev = i2c_get_clientdata(client);
+
+ iio_device_unregister(indio_dev);
+ iio_triggered_buffer_cleanup(indio_dev);
+
/* sleep mode to save power */
hmc5843_configure(client, HMC5843_MODE_SLEEP);
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 04/10] staging:iio:hmc5843: Remove ability to change operating mode
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
` (2 preceding siblings ...)
2013-10-14 21:34 ` [PATCH v3 03/10] staging:iio:hmc5843: Add trigger handling Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 05/10] staging:iio:hmc5843: Rename _configure() to _set_mode() Peter Meerwald
` (5 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
only continuous mode is supported for now; the driver could/should
be switched to single conversion mode
operating mode should be determined by the way IIO accesses the device
and not exposed explicitly
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 68 ------------------------------
1 file changed, 68 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index b6380fa..91b5ddf 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -186,73 +186,6 @@ static int hmc5843_read_measurement(struct hmc5843_data *data,
}
/*
- * From the datasheet:
- * 0 - Continuous-Conversion Mode: In continuous-conversion mode, the
- * device continuously performs conversions and places the result in
- * the data register.
- *
- * 1 - Single-Conversion Mode : Device performs a single measurement,
- * sets RDY high and returns to sleep mode.
- *
- * 2 - Idle Mode : Device is placed in idle mode.
- *
- * 3 - Sleep Mode : Device is placed in sleep mode.
- *
- */
-static ssize_t hmc5843_show_operating_mode(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct hmc5843_data *data = iio_priv(indio_dev);
- return sprintf(buf, "%d\n", data->operating_mode);
-}
-
-static ssize_t hmc5843_set_operating_mode(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t count)
-{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct i2c_client *client = to_i2c_client(indio_dev->dev.parent);
- struct hmc5843_data *data = iio_priv(indio_dev);
- struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
- unsigned long operating_mode = 0;
- s32 status;
- int error;
-
- mutex_lock(&data->lock);
- error = kstrtoul(buf, 10, &operating_mode);
- if (error) {
- count = error;
- goto exit;
- }
- dev_dbg(dev, "set conversion mode to %lu\n", operating_mode);
- if (operating_mode > HMC5843_MODE_SLEEP) {
- count = -EINVAL;
- goto exit;
- }
-
- status = i2c_smbus_write_byte_data(client, this_attr->address,
- operating_mode);
- if (status) {
- count = -EINVAL;
- goto exit;
- }
- data->operating_mode = operating_mode;
-
-exit:
- mutex_unlock(&data->lock);
- return count;
-}
-
-static IIO_DEVICE_ATTR(operating_mode,
- S_IWUSR | S_IRUGO,
- hmc5843_show_operating_mode,
- hmc5843_set_operating_mode,
- HMC5843_MODE_REG);
-
-/*
* API for setting the measurement configuration to
* Normal, Positive bias and Negative bias
*
@@ -546,7 +479,6 @@ static const struct iio_chan_spec hmc5883_channels[] = {
static struct attribute *hmc5843_attributes[] = {
&iio_dev_attr_meas_conf.dev_attr.attr,
- &iio_dev_attr_operating_mode.dev_attr.attr,
&iio_dev_attr_scale_available.dev_attr.attr,
&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
NULL
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 05/10] staging:iio:hmc5843: Rename _configure() to _set_mode()
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
` (3 preceding siblings ...)
2013-10-14 21:34 ` [PATCH v3 04/10] staging:iio:hmc5843: Remove ability to change operating mode Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 06/10] staging:iio:hmc5843: Reorganize _set_meas_conf() Peter Meerwald
` (4 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
and be consistent with other setter functions in that first argument
is hmc5843_data
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 27 ++++++++++++++++-----------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 91b5ddf..2bae26c 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -131,12 +131,18 @@ struct hmc5843_data {
};
/* The lower two bits contain the current conversion mode */
-static s32 hmc5843_configure(struct i2c_client *client,
- u8 operating_mode)
+static s32 hmc5843_set_mode(struct hmc5843_data *data, u8 operating_mode)
{
- return i2c_smbus_write_byte_data(client,
- HMC5843_MODE_REG,
+ 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;
+ mutex_unlock(&data->lock);
+
+ return ret;
}
static int hmc5843_wait_measurement(struct hmc5843_data *data)
@@ -510,7 +516,7 @@ static void hmc5843_init(struct hmc5843_data *data)
{
hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL);
hmc5843_set_rate(data, HMC5843_RATE_DEFAULT);
- hmc5843_configure(data->client, HMC5843_MODE_CONVERSION_CONTINUOUS);
+ hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS);
i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_B,
HMC5843_RANGE_GAIN_DEFAULT);
}
@@ -577,7 +583,7 @@ static int hmc5843_remove(struct i2c_client *client)
iio_triggered_buffer_cleanup(indio_dev);
/* sleep mode to save power */
- hmc5843_configure(client, HMC5843_MODE_SLEEP);
+ hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP);
return 0;
}
@@ -585,9 +591,10 @@ static int hmc5843_remove(struct i2c_client *client)
#ifdef CONFIG_PM_SLEEP
static int hmc5843_suspend(struct device *dev)
{
- hmc5843_configure(to_i2c_client(dev), HMC5843_MODE_SLEEP);
+ struct hmc5843_data *data = iio_priv(i2c_get_clientdata(
+ to_i2c_client(dev)));
- return 0;
+ return hmc5843_set_mode(data, HMC5843_MODE_SLEEP);
}
static int hmc5843_resume(struct device *dev)
@@ -595,9 +602,7 @@ static int hmc5843_resume(struct device *dev)
struct hmc5843_data *data = iio_priv(i2c_get_clientdata(
to_i2c_client(dev)));
- hmc5843_configure(data->client, data->operating_mode);
-
- return 0;
+ return hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS);
}
static SIMPLE_DEV_PM_OPS(hmc5843_pm_ops, hmc5843_suspend, hmc5843_resume);
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 06/10] staging:iio:hmc5843: Reorganize _set_meas_conf()
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
` (4 preceding siblings ...)
2013-10-14 21:34 ` [PATCH v3 05/10] staging:iio:hmc5843: Rename _configure() to _set_mode() Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 07/10] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq() Peter Meerwald
` (3 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
move locking inside _set() function
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 45 +++++++++++++-----------------
1 file changed, 20 insertions(+), 25 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 2bae26c..fb57386 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -73,7 +73,6 @@ enum hmc5843_ids {
#define HMC5843_MEAS_CONF_NORMAL 0x00
#define HMC5843_MEAS_CONF_POSITIVE_BIAS 0x01
#define HMC5843_MEAS_CONF_NEGATIVE_BIAS 0x02
-#define HMC5843_MEAS_CONF_NOT_USED 0x03
#define HMC5843_MEAS_CONF_MASK 0x03
/* Scaling factors: 10000000/Gain */
@@ -211,19 +210,24 @@ static int hmc5843_read_measurement(struct hmc5843_data *data,
*/
static s32 hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf)
{
- u8 reg_val;
- reg_val = (meas_conf & HMC5843_MEAS_CONF_MASK) |
- (data->rate << HMC5843_RATE_OFFSET);
- return i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_A,
- reg_val);
+ 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;
+ mutex_unlock(&data->lock);
+
+ return ret;
}
static ssize_t hmc5843_show_measurement_configuration(struct device *dev,
struct device_attribute *attr,
char *buf)
{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct hmc5843_data *data = iio_priv(indio_dev);
+ struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
return sprintf(buf, "%d\n", data->meas_conf);
}
@@ -232,28 +236,19 @@ static ssize_t hmc5843_set_measurement_configuration(struct device *dev,
const char *buf,
size_t count)
{
- struct iio_dev *indio_dev = dev_to_iio_dev(dev);
- struct hmc5843_data *data = iio_priv(indio_dev);
+ struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
unsigned long meas_conf = 0;
- int error;
+ int ret;
- error = kstrtoul(buf, 10, &meas_conf);
- if (error)
- return error;
- if (meas_conf >= HMC5843_MEAS_CONF_NOT_USED)
+ ret = kstrtoul(buf, 10, &meas_conf);
+ if (ret)
+ return ret;
+ if (meas_conf >= HMC5843_MEAS_CONF_MASK)
return -EINVAL;
- mutex_lock(&data->lock);
- dev_dbg(dev, "set measurement configuration to %lu\n", meas_conf);
- if (hmc5843_set_meas_conf(data, meas_conf)) {
- count = -EINVAL;
- goto exit;
- }
- data->meas_conf = meas_conf;
+ ret = hmc5843_set_meas_conf(data, meas_conf);
-exit:
- mutex_unlock(&data->lock);
- return count;
+ return (ret < 0) ? ret : count;
}
static IIO_DEVICE_ATTR(meas_conf,
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 07/10] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq()
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
` (5 preceding siblings ...)
2013-10-14 21:34 ` [PATCH v3 06/10] staging:iio:hmc5843: Reorganize _set_meas_conf() Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 08/10] staging:iio:hmc5843: Introduce _set_range_gain() Peter Meerwald
` (2 subsequent siblings)
9 siblings, 0 replies; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
move locking inside _set() function
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 31 +++++++++++++++---------------
1 file changed, 15 insertions(+), 16 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index fb57386..8729762 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -66,8 +66,7 @@ enum hmc5843_ids {
*/
#define HMC5843_RATE_OFFSET 0x02
#define HMC5843_RATE_DEFAULT 0x04
-#define HMC5843_RATE_BITMASK 0x1C
-#define HMC5843_RATE_NOT_USED 0x07
+#define HMC5843_RATES 7
/* Device measurement configuration */
#define HMC5843_MEAS_CONF_NORMAL 0x00
@@ -292,24 +291,30 @@ static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
return hmc5843_show_int_plus_micros(buf,
- data->variant->regval_to_samp_freq, HMC5843_RATE_NOT_USED);
+ data->variant->regval_to_samp_freq, HMC5843_RATES);
}
static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hmc5843_show_samp_freq_avail);
-static s32 hmc5843_set_rate(struct hmc5843_data *data, u8 rate)
+static int hmc5843_set_samp_freq(struct hmc5843_data *data, u8 rate)
{
- u8 reg_val = data->meas_conf | (rate << HMC5843_RATE_OFFSET);
+ 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;
+ mutex_unlock(&data->lock);
- return i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_A,
- reg_val);
+ return ret;
}
static int hmc5843_check_samp_freq(struct hmc5843_data *data,
int val, int val2)
{
return hmc5843_check_int_plus_micros(
- data->variant->regval_to_samp_freq, HMC5843_RATE_NOT_USED,
+ data->variant->regval_to_samp_freq, HMC5843_RATES,
val, val2);
}
@@ -382,13 +387,7 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
if (rate < 0)
return -EINVAL;
- mutex_lock(&data->lock);
- ret = hmc5843_set_rate(data, rate);
- if (ret >= 0)
- data->rate = rate;
- mutex_unlock(&data->lock);
-
- return ret;
+ return hmc5843_set_samp_freq(data, rate);
case IIO_CHAN_INFO_SCALE:
range = hmc5843_check_scale(data, val, val2);
if (range < 0)
@@ -510,7 +509,7 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = {
static void hmc5843_init(struct hmc5843_data *data)
{
hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL);
- hmc5843_set_rate(data, HMC5843_RATE_DEFAULT);
+ hmc5843_set_samp_freq(data, HMC5843_RATE_DEFAULT);
hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS);
i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_B,
HMC5843_RANGE_GAIN_DEFAULT);
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 08/10] staging:iio:hmc5843: Introduce _set_range_gain()
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
` (6 preceding siblings ...)
2013-10-14 21:34 ` [PATCH v3 07/10] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq() Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 09/10] staging:iio:hmc5843: Check initialization and chip identifier Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 10/10] staging:iio:hmc5843: Trivial cleanups Peter Meerwald
9 siblings, 0 replies; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 8729762..d7ce7ee 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -318,6 +318,20 @@ static int hmc5843_check_samp_freq(struct hmc5843_data *data,
val, val2);
}
+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;
+ mutex_unlock(&data->lock);
+
+ return ret;
+}
+
static ssize_t hmc5843_show_scale_avail(struct device *dev,
struct device_attribute *attr, char *buf)
{
@@ -379,7 +393,7 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
int val, int val2, long mask)
{
struct hmc5843_data *data = iio_priv(indio_dev);
- int ret, rate, range;
+ int rate, range;
switch (mask) {
case IIO_CHAN_INFO_SAMP_FREQ:
@@ -393,15 +407,7 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
if (range < 0)
return -EINVAL;
- range <<= HMC5843_RANGE_GAIN_OFFSET;
- mutex_lock(&data->lock);
- ret = i2c_smbus_write_byte_data(data->client,
- HMC5843_CONFIG_REG_B, range);
- if (ret >= 0)
- data->range = range;
- mutex_unlock(&data->lock);
-
- return ret;
+ return hmc5843_set_range_gain(data, range);
default:
return -EINVAL;
}
@@ -510,9 +516,8 @@ static void hmc5843_init(struct hmc5843_data *data)
{
hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL);
hmc5843_set_samp_freq(data, HMC5843_RATE_DEFAULT);
+ hmc5843_set_range_gain(data, HMC5843_RANGE_GAIN_DEFAULT);
hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS);
- i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_B,
- HMC5843_RANGE_GAIN_DEFAULT);
}
static const struct iio_info hmc5843_info = {
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 09/10] staging:iio:hmc5843: Check initialization and chip identifier
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
` (7 preceding siblings ...)
2013-10-14 21:34 ` [PATCH v3 08/10] staging:iio:hmc5843: Introduce _set_range_gain() Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
2013-10-14 21:34 ` [PATCH v3 10/10] staging:iio:hmc5843: Trivial cleanups Peter Meerwald
9 siblings, 0 replies; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 33 ++++++++++++++++++++++++------
1 file changed, 27 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index d7ce7ee..74a456b 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -33,6 +33,7 @@
#define HMC5843_MODE_REG 0x02
#define HMC5843_DATA_OUT_MSB_REGS 0x03
#define HMC5843_STATUS_REG 0x09
+#define HMC5843_ID_REG 0x0a
enum hmc5843_ids {
HMC5843_ID,
@@ -512,12 +513,30 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = {
},
};
-static void hmc5843_init(struct hmc5843_data *data)
+static int hmc5843_init(struct hmc5843_data *data)
{
- hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL);
- hmc5843_set_samp_freq(data, HMC5843_RATE_DEFAULT);
- hmc5843_set_range_gain(data, HMC5843_RANGE_GAIN_DEFAULT);
- hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS);
+ int ret;
+ u8 id[3];
+
+ ret = i2c_smbus_read_i2c_block_data(data->client, HMC5843_ID_REG,
+ sizeof(id), id);
+ 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");
+ return -ENODEV;
+ }
+
+ ret = hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL);
+ if (ret < 0)
+ return ret;
+ ret = hmc5843_set_samp_freq(data, HMC5843_RATE_DEFAULT);
+ if (ret < 0)
+ return ret;
+ ret = hmc5843_set_range_gain(data, HMC5843_RANGE_GAIN_DEFAULT);
+ if (ret < 0)
+ return ret;
+ return hmc5843_set_mode(data, HMC5843_MODE_CONVERSION_CONTINUOUS);
}
static const struct iio_info hmc5843_info = {
@@ -556,7 +575,9 @@ static int hmc5843_probe(struct i2c_client *client,
indio_dev->num_channels = 4;
indio_dev->available_scan_masks = hmc5843_scan_masks;
- hmc5843_init(data);
+ ret = hmc5843_init(data);
+ if (ret < 0)
+ return ret;
ret = iio_triggered_buffer_setup(indio_dev, NULL,
hmc5843_trigger_handler, NULL);
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v3 10/10] staging:iio:hmc5843: Trivial cleanups
2013-10-14 21:34 [PATCH v3 00/10] hmc5843 cleanup Peter Meerwald
` (8 preceding siblings ...)
2013-10-14 21:34 ` [PATCH v3 09/10] staging:iio:hmc5843: Check initialization and chip identifier Peter Meerwald
@ 2013-10-14 21:34 ` Peter Meerwald
9 siblings, 0 replies; 13+ messages in thread
From: Peter Meerwald @ 2013-10-14 21:34 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 74a456b..2c8103fb 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -278,10 +278,9 @@ static int hmc5843_check_int_plus_micros(const int (*vals)[2], int n,
{
int i;
- for (i = 0; i < n; i++) {
+ for (i = 0; i < n; i++)
if (val == vals[i][0] && val2 == vals[i][1])
return i;
- }
return -EINVAL;
}
@@ -602,7 +601,7 @@ static int hmc5843_remove(struct i2c_client *client)
iio_device_unregister(indio_dev);
iio_triggered_buffer_cleanup(indio_dev);
- /* sleep mode to save power */
+ /* sleep mode to save power */
hmc5843_set_mode(iio_priv(indio_dev), HMC5843_MODE_SLEEP);
return 0;
--
1.8.4
^ permalink raw reply related [flat|nested] 13+ messages in thread