* [PATCH v4 01/11] staging:iio:hmc5843: Use SCALE instead of magn_range
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:46 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 02/11] staging:iio:hmc5843: Rename _check_samp_freq to get_samp_freq_index Peter Meerwald
` (9 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
v3:
* rename _check_scale() to _get_scale_index()
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..c56db41 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_get_scale_index(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_get_scale_index(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] 23+ messages in thread
* Re: [PATCH v4 01/11] staging:iio:hmc5843: Use SCALE instead of magn_range
2013-10-16 22:19 ` [PATCH v4 01/11] staging:iio:hmc5843: Use SCALE instead of magn_range Peter Meerwald
@ 2013-10-17 22:46 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:46 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> v3:
> * rename _check_scale() to _get_scale_index()
> v2:
> * use SCALE instead of CALIBSCALE to control the range/gain
> of measurements
>
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Applied to the togreg branch of iio.git
Thanks
> ---
> 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..c56db41 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_get_scale_index(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_get_scale_index(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,
> };
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 02/11] staging:iio:hmc5843: Rename _check_samp_freq to get_samp_freq_index
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
2013-10-16 22:19 ` [PATCH v4 01/11] staging:iio:hmc5843: Use SCALE instead of magn_range Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:47 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 03/11] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
` (8 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
and drop/inline helper functions _check_int_plus_micros() and
_show_int_plus_micros()
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 47 ++++++++++--------------------
1 file changed, 16 insertions(+), 31 deletions(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index c56db41..749b0b6 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -309,15 +309,17 @@ static IIO_DEVICE_ATTR(meas_conf,
hmc5843_set_measurement_configuration,
0);
-static ssize_t hmc5843_show_int_plus_micros(char *buf,
- const int (*vals)[2], int n)
+static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
+ struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
size_t len = 0;
int i;
- for (i = 0; i < n; i++)
+ for (i = 0; i < HMC5843_RATE_NOT_USED; i++)
len += scnprintf(buf + len, PAGE_SIZE - len,
- "%d.%d ", vals[i][0], vals[i][1]);
+ "%d.%d ", data->variant->regval_to_samp_freq[i][0],
+ data->variant->regval_to_samp_freq[i][1]);
/* replace trailing space by newline */
buf[len - 1] = '\n';
@@ -325,28 +327,6 @@ static ssize_t hmc5843_show_int_plus_micros(char *buf,
return len;
}
-static int hmc5843_check_int_plus_micros(const int (*vals)[2], int n,
- int val, int val2)
-{
- int i;
-
- for (i = 0; i < n; i++) {
- if (val == vals[i][0] && val2 == vals[i][1])
- return i;
- }
-
- return -EINVAL;
-}
-
-static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- 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);
-}
-
static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hmc5843_show_samp_freq_avail);
static s32 hmc5843_set_rate(struct hmc5843_data *data, u8 rate)
@@ -357,12 +337,17 @@ static s32 hmc5843_set_rate(struct hmc5843_data *data, u8 rate)
reg_val);
}
-static int hmc5843_check_samp_freq(struct hmc5843_data *data,
+static int hmc5843_get_samp_freq_index(struct hmc5843_data *data,
int val, int val2)
{
- return hmc5843_check_int_plus_micros(
- data->variant->regval_to_samp_freq, HMC5843_RATE_NOT_USED,
- val, val2);
+ int i;
+
+ for (i = 0; i < HMC5843_RATE_NOT_USED; i++)
+ if (val == data->variant->regval_to_samp_freq[i][0] &&
+ val2 == data->variant->regval_to_samp_freq[i][1])
+ return i;
+
+ return -EINVAL;
}
static ssize_t hmc5843_show_scale_avail(struct device *dev,
@@ -430,7 +415,7 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
switch (mask) {
case IIO_CHAN_INFO_SAMP_FREQ:
- rate = hmc5843_check_samp_freq(data, val, val2);
+ rate = hmc5843_get_samp_freq_index(data, val, val2);
if (rate < 0)
return -EINVAL;
--
1.8.4
^ permalink raw reply related [flat|nested] 23+ messages in thread
* Re: [PATCH v4 02/11] staging:iio:hmc5843: Rename _check_samp_freq to get_samp_freq_index
2013-10-16 22:19 ` [PATCH v4 02/11] staging:iio:hmc5843: Rename _check_samp_freq to get_samp_freq_index Peter Meerwald
@ 2013-10-17 22:47 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:47 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> and drop/inline helper functions _check_int_plus_micros() and
> _show_int_plus_micros()
>
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Applied to the togreg branch of iio.git
Technically this is addressing two different things so should really
have been two patches.
> ---
> drivers/staging/iio/magnetometer/hmc5843.c | 47 ++++++++++--------------------
> 1 file changed, 16 insertions(+), 31 deletions(-)
>
> diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
> index c56db41..749b0b6 100644
> --- a/drivers/staging/iio/magnetometer/hmc5843.c
> +++ b/drivers/staging/iio/magnetometer/hmc5843.c
> @@ -309,15 +309,17 @@ static IIO_DEVICE_ATTR(meas_conf,
> hmc5843_set_measurement_configuration,
> 0);
>
> -static ssize_t hmc5843_show_int_plus_micros(char *buf,
> - const int (*vals)[2], int n)
> +static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
> + struct device_attribute *attr, char *buf)
> {
> + struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
> size_t len = 0;
> int i;
>
> - for (i = 0; i < n; i++)
> + for (i = 0; i < HMC5843_RATE_NOT_USED; i++)
> len += scnprintf(buf + len, PAGE_SIZE - len,
> - "%d.%d ", vals[i][0], vals[i][1]);
> + "%d.%d ", data->variant->regval_to_samp_freq[i][0],
> + data->variant->regval_to_samp_freq[i][1]);
>
> /* replace trailing space by newline */
> buf[len - 1] = '\n';
> @@ -325,28 +327,6 @@ static ssize_t hmc5843_show_int_plus_micros(char *buf,
> return len;
> }
>
> -static int hmc5843_check_int_plus_micros(const int (*vals)[2], int n,
> - int val, int val2)
> -{
> - int i;
> -
> - for (i = 0; i < n; i++) {
> - if (val == vals[i][0] && val2 == vals[i][1])
> - return i;
> - }
> -
> - return -EINVAL;
> -}
> -
> -static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
> - struct device_attribute *attr, char *buf)
> -{
> - 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);
> -}
> -
> static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hmc5843_show_samp_freq_avail);
>
> static s32 hmc5843_set_rate(struct hmc5843_data *data, u8 rate)
> @@ -357,12 +337,17 @@ static s32 hmc5843_set_rate(struct hmc5843_data *data, u8 rate)
> reg_val);
> }
>
> -static int hmc5843_check_samp_freq(struct hmc5843_data *data,
> +static int hmc5843_get_samp_freq_index(struct hmc5843_data *data,
> int val, int val2)
> {
> - return hmc5843_check_int_plus_micros(
> - data->variant->regval_to_samp_freq, HMC5843_RATE_NOT_USED,
> - val, val2);
> + int i;
> +
> + for (i = 0; i < HMC5843_RATE_NOT_USED; i++)
> + if (val == data->variant->regval_to_samp_freq[i][0] &&
> + val2 == data->variant->regval_to_samp_freq[i][1])
> + return i;
> +
> + return -EINVAL;
> }
>
> static ssize_t hmc5843_show_scale_avail(struct device *dev,
> @@ -430,7 +415,7 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
>
> switch (mask) {
> case IIO_CHAN_INFO_SAMP_FREQ:
> - rate = hmc5843_check_samp_freq(data, val, val2);
> + rate = hmc5843_get_samp_freq_index(data, val, val2);
> if (rate < 0)
> return -EINVAL;
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 03/11] staging:iio:hmc5843: Always read all channels values otherwise no updates
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
2013-10-16 22:19 ` [PATCH v4 01/11] staging:iio:hmc5843: Use SCALE instead of magn_range Peter Meerwald
2013-10-16 22:19 ` [PATCH v4 02/11] staging:iio:hmc5843: Rename _check_samp_freq to get_samp_freq_index Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:49 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 04/11] staging:iio:hmc5843: Add trigger handling Peter Meerwald
` (7 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
v2:
* use __be16 instead of s16
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 749b0b6..78b97b0 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;
+ __be16 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;
}
@@ -458,7 +468,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, \
@@ -466,19 +476,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] 23+ messages in thread
* Re: [PATCH v4 03/11] staging:iio:hmc5843: Always read all channels values otherwise no updates
2013-10-16 22:19 ` [PATCH v4 03/11] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
@ 2013-10-17 22:49 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:49 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> v2:
> * use __be16 instead of s16
>
> Split out data ready/wait for read measurement
> fix bug in case reading status register fails
>
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Applied to the togreg branch of iio.git
Thanks,
> ---
> 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 749b0b6..78b97b0 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;
> + __be16 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;
> }
>
> @@ -458,7 +468,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, \
> @@ -466,19 +476,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[] = {
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 04/11] staging:iio:hmc5843: Add trigger handling
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
` (2 preceding siblings ...)
2013-10-16 22:19 ` [PATCH v4 03/11] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:49 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 05/11] staging:iio:hmc5843: Remove ability to change operating mode Peter Meerwald
` (6 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
v3:
* use __be16 instead of s16
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 78b97b0..aeaea09 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;
+ __be16 buffer[8]; /* 3x 16-bit channels + padding + 64-bit timestamp */
};
/* The lower two bits contain the current conversion mode */
@@ -403,7 +407,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];
@@ -468,6 +472,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(__be16),
+ (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, \
@@ -476,13 +510,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 */
@@ -490,6 +526,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[] = {
@@ -539,12 +576,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)
@@ -562,20 +601,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] 23+ messages in thread
* Re: [PATCH v4 04/11] staging:iio:hmc5843: Add trigger handling
2013-10-16 22:19 ` [PATCH v4 04/11] staging:iio:hmc5843: Add trigger handling Peter Meerwald
@ 2013-10-17 22:49 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:49 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> v3:
> * use __be16 instead of s16
> 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>
Applied to the togreg branch of iio.git
Thanks,
> ---
> 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 78b97b0..aeaea09 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;
> + __be16 buffer[8]; /* 3x 16-bit channels + padding + 64-bit timestamp */
> };
>
> /* The lower two bits contain the current conversion mode */
> @@ -403,7 +407,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];
> @@ -468,6 +472,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(__be16),
> + (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, \
> @@ -476,13 +510,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 */
> @@ -490,6 +526,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[] = {
> @@ -539,12 +576,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)
> @@ -562,20 +601,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);
>
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 05/11] staging:iio:hmc5843: Remove ability to change operating mode
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
` (3 preceding siblings ...)
2013-10-16 22:19 ` [PATCH v4 04/11] staging:iio:hmc5843: Add trigger handling Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:50 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 06/11] staging:iio:hmc5843: Rename _configure() to _set_mode() Peter Meerwald
` (5 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 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 aeaea09..5204b9a 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
*
@@ -531,7 +464,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] 23+ messages in thread
* Re: [PATCH v4 05/11] staging:iio:hmc5843: Remove ability to change operating mode
2013-10-16 22:19 ` [PATCH v4 05/11] staging:iio:hmc5843: Remove ability to change operating mode Peter Meerwald
@ 2013-10-17 22:50 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:50 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> 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>
Applied to the togreg branch of iio.git
Thanks,
> ---
> 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 aeaea09..5204b9a 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
> *
> @@ -531,7 +464,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
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 06/11] staging:iio:hmc5843: Rename _configure() to _set_mode()
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
` (4 preceding siblings ...)
2013-10-16 22:19 ` [PATCH v4 05/11] staging:iio:hmc5843: Remove ability to change operating mode Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:50 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 07/11] staging:iio:hmc5843: Reorganize _set_meas_conf() Peter Meerwald
` (4 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 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 5204b9a..d7ace70 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)
@@ -495,7 +501,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);
}
@@ -562,7 +568,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;
}
@@ -570,9 +576,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)
@@ -580,9 +587,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] 23+ messages in thread
* Re: [PATCH v4 06/11] staging:iio:hmc5843: Rename _configure() to _set_mode()
2013-10-16 22:19 ` [PATCH v4 06/11] staging:iio:hmc5843: Rename _configure() to _set_mode() Peter Meerwald
@ 2013-10-17 22:50 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:50 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> and be consistent with other setter functions in that first argument
> is hmc5843_data
>
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Applied to the togreg branch of iio.git
Thanks,
> ---
> 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 5204b9a..d7ace70 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)
> @@ -495,7 +501,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);
> }
> @@ -562,7 +568,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;
> }
> @@ -570,9 +576,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)
> @@ -580,9 +587,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);
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 07/11] staging:iio:hmc5843: Reorganize _set_meas_conf()
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
` (5 preceding siblings ...)
2013-10-16 22:19 ` [PATCH v4 06/11] staging:iio:hmc5843: Rename _configure() to _set_mode() Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:51 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 08/11] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq() Peter Meerwald
` (3 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 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 d7ace70..bd13984 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] 23+ messages in thread
* Re: [PATCH v4 07/11] staging:iio:hmc5843: Reorganize _set_meas_conf()
2013-10-16 22:19 ` [PATCH v4 07/11] staging:iio:hmc5843: Reorganize _set_meas_conf() Peter Meerwald
@ 2013-10-17 22:51 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:51 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> move locking inside _set() function
>
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Applied to the togreg branch of iio.git
Thanks
> ---
> 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 d7ace70..bd13984 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,
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 08/11] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq()
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
` (6 preceding siblings ...)
2013-10-16 22:19 ` [PATCH v4 07/11] staging:iio:hmc5843: Reorganize _set_meas_conf() Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:52 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 09/11] staging:iio:hmc5843: Introduce _set_range_gain() Peter Meerwald
` (2 subsequent siblings)
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 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 bd13984..a91d302 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
@@ -264,7 +263,7 @@ static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
size_t len = 0;
int i;
- for (i = 0; i < HMC5843_RATE_NOT_USED; i++)
+ for (i = 0; i < HMC5843_RATES; 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]);
@@ -277,12 +276,18 @@ static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
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_get_samp_freq_index(struct hmc5843_data *data,
@@ -290,7 +295,7 @@ static int hmc5843_get_samp_freq_index(struct hmc5843_data *data,
{
int i;
- for (i = 0; i < HMC5843_RATE_NOT_USED; i++)
+ for (i = 0; i < HMC5843_RATES; i++)
if (val == data->variant->regval_to_samp_freq[i][0] &&
val2 == data->variant->regval_to_samp_freq[i][1])
return i;
@@ -367,13 +372,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_get_scale_index(data, val, val2);
if (range < 0)
@@ -495,7 +494,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] 23+ messages in thread
* Re: [PATCH v4 08/11] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq()
2013-10-16 22:19 ` [PATCH v4 08/11] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq() Peter Meerwald
@ 2013-10-17 22:52 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:52 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> move locking inside _set() function
>
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Applied to the togreg branch of iio.git
Thanks
> ---
> 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 bd13984..a91d302 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
> @@ -264,7 +263,7 @@ static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
> size_t len = 0;
> int i;
>
> - for (i = 0; i < HMC5843_RATE_NOT_USED; i++)
> + for (i = 0; i < HMC5843_RATES; 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]);
> @@ -277,12 +276,18 @@ static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
>
> 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_get_samp_freq_index(struct hmc5843_data *data,
> @@ -290,7 +295,7 @@ static int hmc5843_get_samp_freq_index(struct hmc5843_data *data,
> {
> int i;
>
> - for (i = 0; i < HMC5843_RATE_NOT_USED; i++)
> + for (i = 0; i < HMC5843_RATES; i++)
> if (val == data->variant->regval_to_samp_freq[i][0] &&
> val2 == data->variant->regval_to_samp_freq[i][1])
> return i;
> @@ -367,13 +372,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_get_scale_index(data, val, val2);
> if (range < 0)
> @@ -495,7 +494,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);
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 09/11] staging:iio:hmc5843: Introduce _set_range_gain()
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
` (7 preceding siblings ...)
2013-10-16 22:19 ` [PATCH v4 08/11] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq() Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:52 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 10/11] staging:iio:hmc5843: Check initialization and chip identifier Peter Meerwald
2013-10-16 22:19 ` [PATCH v4 11/11] staging:iio:hmc5843: Trivial cleanup Peter Meerwald
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 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 a91d302..c819b8e 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -303,6 +303,20 @@ static int hmc5843_get_samp_freq_index(struct hmc5843_data *data,
return -EINVAL;
}
+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)
{
@@ -364,7 +378,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:
@@ -378,15 +392,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;
}
@@ -495,9 +501,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] 23+ messages in thread
* Re: [PATCH v4 09/11] staging:iio:hmc5843: Introduce _set_range_gain()
2013-10-16 22:19 ` [PATCH v4 09/11] staging:iio:hmc5843: Introduce _set_range_gain() Peter Meerwald
@ 2013-10-17 22:52 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:52 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Applied.
> ---
> 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 a91d302..c819b8e 100644
> --- a/drivers/staging/iio/magnetometer/hmc5843.c
> +++ b/drivers/staging/iio/magnetometer/hmc5843.c
> @@ -303,6 +303,20 @@ static int hmc5843_get_samp_freq_index(struct hmc5843_data *data,
> return -EINVAL;
> }
>
> +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)
> {
> @@ -364,7 +378,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:
> @@ -378,15 +392,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;
> }
> @@ -495,9 +501,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 = {
>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 10/11] staging:iio:hmc5843: Check initialization and chip identifier
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
` (8 preceding siblings ...)
2013-10-16 22:19 ` [PATCH v4 09/11] staging:iio:hmc5843: Introduce _set_range_gain() Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:52 ` Jonathan Cameron
2013-10-16 22:19 ` [PATCH v4 11/11] staging:iio:hmc5843: Trivial cleanup Peter Meerwald
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 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 c819b8e..7e688dd 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,
@@ -497,12 +498,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 = {
@@ -541,7 +560,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] 23+ messages in thread
* [PATCH v4 11/11] staging:iio:hmc5843: Trivial cleanup
2013-10-16 22:19 [PATCH v4 00/11] hmc5843 cleanup Peter Meerwald
` (9 preceding siblings ...)
2013-10-16 22:19 ` [PATCH v4 10/11] staging:iio:hmc5843: Check initialization and chip identifier Peter Meerwald
@ 2013-10-16 22:19 ` Peter Meerwald
2013-10-17 22:53 ` Jonathan Cameron
10 siblings, 1 reply; 23+ messages in thread
From: Peter Meerwald @ 2013-10-16 22:19 UTC (permalink / raw)
To: linux-iio; +Cc: Peter Meerwald
Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
drivers/staging/iio/magnetometer/hmc5843.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 7e688dd..99421f9 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -587,7 +587,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] 23+ messages in thread
* Re: [PATCH v4 11/11] staging:iio:hmc5843: Trivial cleanup
2013-10-16 22:19 ` [PATCH v4 11/11] staging:iio:hmc5843: Trivial cleanup Peter Meerwald
@ 2013-10-17 22:53 ` Jonathan Cameron
0 siblings, 0 replies; 23+ messages in thread
From: Jonathan Cameron @ 2013-10-17 22:53 UTC (permalink / raw)
To: Peter Meerwald, linux-iio
On 10/16/13 23:19, Peter Meerwald wrote:
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Applied.
Thanks for your hardwork on this series!
Jonathan
> ---
> drivers/staging/iio/magnetometer/hmc5843.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
> index 7e688dd..99421f9 100644
> --- a/drivers/staging/iio/magnetometer/hmc5843.c
> +++ b/drivers/staging/iio/magnetometer/hmc5843.c
> @@ -587,7 +587,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;
>
^ permalink raw reply [flat|nested] 23+ messages in thread