All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging
@ 2013-09-03  1:05 Peter Meerwald
  2013-09-03  1:05 ` [PATCH 01/18] staging:iio:hmc5843: Fix measurement conversion Peter Meerwald
                   ` (17 more replies)
  0 siblings, 18 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio

some more cleanup and reorganization

patch 1 fixes a conversion bug introduced recently, sorry
patch 5 makes use of SAMP_FREQ chan_info
patch 8 adds helper functions to show/check int.micro pairs -- maybe 
  useful elsewhere?
patch 9 makes use of CALIBSCALE to adjust gain
patch 10 forces read of all channel data, no matter how much is actually
  needed
patch 11 add trigger handling
patch 13 drops the operating_mode attribute
patch 18 adds init checks

 drivers/staging/iio/magnetometer/hmc5843.c |  632 +++++++++++++---------------
 1 file changed, 297 insertions(+), 335 deletions(-)

-- 
1.7.9.5


^ permalink raw reply	[flat|nested] 25+ messages in thread

* [PATCH 01/18] staging:iio:hmc5843: Fix measurement conversion
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-05 19:18   ` Lars-Peter Clausen
  2013-09-03  1:05 ` [PATCH 02/18] staging:iio:hmc5843: Use devm_iio_device_alloc Peter Meerwald
                   ` (16 subsequent siblings)
  17 siblings, 1 reply; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

recently broken, cd6fe06588423ff4cca85c85c4402027b04dccf1

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 d2748c3..c3f3f53 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -229,7 +229,7 @@ static int hmc5843_read_measurement(struct iio_dev *indio_dev,
 	if (result < 0)
 		return -EINVAL;
 
-	*val = result;
+	*val = sign_extend32(result, 15);
 	return IIO_VAL_INT;
 }
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 02/18] staging:iio:hmc5843: Use devm_iio_device_alloc
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
  2013-09-03  1:05 ` [PATCH 01/18] staging:iio:hmc5843: Fix measurement conversion Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-11 22:02   ` Jonathan Cameron
  2013-09-03  1:05 ` [PATCH 03/18] staging:iio:hmc5843: Add pointer to i2c client to data struct Peter Meerwald
                   ` (15 subsequent siblings)
  17 siblings, 1 reply; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |   24 +++++++-----------------
 1 file changed, 7 insertions(+), 17 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index c3f3f53..3e72121 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -643,11 +643,9 @@ static int hmc5843_probe(struct i2c_client *client,
 	struct iio_dev *indio_dev;
 	int err = 0;
 
-	indio_dev = iio_device_alloc(sizeof(*data));
-	if (indio_dev == NULL) {
-		err = -ENOMEM;
-		goto exit;
-	}
+	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
+	if (indio_dev == NULL)
+		return -ENOMEM;
 
 	/* default settings at probe */
 	data = iio_priv(indio_dev);
@@ -665,24 +663,16 @@ static int hmc5843_probe(struct i2c_client *client,
 
 	err = iio_device_register(indio_dev);
 	if (err)
-		goto exit_free2;
+		return err;
 
 	return 0;
-
-exit_free2:
-	iio_device_free(indio_dev);
-exit:
-	return err;
 }
 
 static int hmc5843_remove(struct i2c_client *client)
 {
-	struct iio_dev *indio_dev = i2c_get_clientdata(client);
-
-	iio_device_unregister(indio_dev);
+	iio_device_unregister(i2c_get_clientdata(client));
 	 /*  sleep mode to save power */
 	hmc5843_configure(client, HMC5843_MODE_SLEEP);
-	iio_device_free(indio_dev);
 
 	return 0;
 }
@@ -691,14 +681,14 @@ static int hmc5843_remove(struct i2c_client *client)
 static int hmc5843_suspend(struct device *dev)
 {
 	hmc5843_configure(to_i2c_client(dev), HMC5843_MODE_SLEEP);
+
 	return 0;
 }
 
 static int hmc5843_resume(struct device *dev)
 {
 	struct i2c_client *client = to_i2c_client(dev);
-	struct iio_dev *indio_dev = i2c_get_clientdata(client);
-	struct hmc5843_data *data = iio_priv(indio_dev);
+	struct hmc5843_data *data = iio_priv(i2c_get_clientdata(client));
 
 	hmc5843_configure(client, data->operating_mode);
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 03/18] staging:iio:hmc5843: Add pointer to i2c client to data struct
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
  2013-09-03  1:05 ` [PATCH 01/18] staging:iio:hmc5843: Fix measurement conversion Peter Meerwald
  2013-09-03  1:05 ` [PATCH 02/18] staging:iio:hmc5843: Use devm_iio_device_alloc Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-11 22:07   ` Jonathan Cameron
  2013-09-03  1:05 ` [PATCH 04/18] staging:iio:hmc5843: Rewrite init function Peter Meerwald
                   ` (14 subsequent siblings)
  17 siblings, 1 reply; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

and use it to simplify code

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |   60 +++++++++++-----------------
 1 file changed, 24 insertions(+), 36 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 3e72121..7aa767a 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -182,6 +182,7 @@ struct hmc5843_chip_info {
 
 /* Each client has this additional data */
 struct hmc5843_data {
+	struct i2c_client *client;
 	struct mutex lock;
 	u8 rate;
 	u8 meas_conf;
@@ -200,18 +201,15 @@ static s32 hmc5843_configure(struct i2c_client *client,
 }
 
 /* Return the measurement value from the specified channel */
-static int hmc5843_read_measurement(struct iio_dev *indio_dev,
-				    int address,
-				    int *val)
+static int hmc5843_read_measurement(struct hmc5843_data *data,
+				    int address, int *val)
 {
-	struct i2c_client *client = to_i2c_client(indio_dev->dev.parent);
-	struct hmc5843_data *data = iio_priv(indio_dev);
 	s32 result;
 	int tries = 150;
 
 	mutex_lock(&data->lock);
 	while (tries-- > 0) {
-		result = i2c_smbus_read_byte_data(client,
+		result = i2c_smbus_read_byte_data(data->client,
 			HMC5843_STATUS_REG);
 		if (result & HMC5843_DATA_READY)
 			break;
@@ -219,12 +217,12 @@ static int hmc5843_read_measurement(struct iio_dev *indio_dev,
 	}
 
 	if (tries < 0) {
-		dev_err(&client->dev, "data not ready\n");
+		dev_err(&data->client->dev, "data not ready\n");
 		mutex_unlock(&data->lock);
 		return -EIO;
 	}
 
-	result = i2c_smbus_read_word_swapped(client, address);
+	result = i2c_smbus_read_word_swapped(data->client, address);
 	mutex_unlock(&data->lock);
 	if (result < 0)
 		return -EINVAL;
@@ -318,15 +316,13 @@ static IIO_DEVICE_ATTR(operating_mode,
  *     and BN.
  *
  */
-static s32 hmc5843_set_meas_conf(struct i2c_client *client,
-				      u8 meas_conf)
+static s32 hmc5843_set_meas_conf(struct hmc5843_data *data, u8 meas_conf)
 {
-	struct iio_dev *indio_dev = i2c_get_clientdata(client);
-	struct hmc5843_data *data = iio_priv(indio_dev);
 	u8 reg_val;
 	reg_val = (meas_conf & HMC5843_MEAS_CONF_MASK) |
 		(data->rate << HMC5843_RATE_OFFSET);
-	return i2c_smbus_write_byte_data(client, HMC5843_CONFIG_REG_A, reg_val);
+	return i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_A,
+		reg_val);
 }
 
 static ssize_t hmc5843_show_measurement_configuration(struct device *dev,
@@ -344,7 +340,6 @@ static ssize_t hmc5843_set_measurement_configuration(struct device *dev,
 						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);
 	unsigned long meas_conf = 0;
 	int error;
@@ -357,7 +352,7 @@ static ssize_t hmc5843_set_measurement_configuration(struct device *dev,
 
 	mutex_lock(&data->lock);
 	dev_dbg(dev, "set measurement configuration to %lu\n", meas_conf);
-	if (hmc5843_set_meas_conf(client, meas_conf)) {
+	if (hmc5843_set_meas_conf(data, meas_conf)) {
 		count = -EINVAL;
 		goto exit;
 	}
@@ -396,21 +391,19 @@ static ssize_t hmc5843_show_sampling_frequencies_available(struct device *dev,
 
 static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hmc5843_show_sampling_frequencies_available);
 
-static s32 hmc5843_set_rate(struct i2c_client *client,
-				u8 rate)
+static s32 hmc5843_set_rate(struct hmc5843_data *data, u8 rate)
 {
-	struct iio_dev *indio_dev = i2c_get_clientdata(client);
-	struct hmc5843_data *data = iio_priv(indio_dev);
 	u8 reg_val;
 
 	if (rate >= HMC5843_RATE_NOT_USED) {
-		dev_err(&client->dev,
+		dev_err(&data->client->dev,
 			"data output rate is not supported\n");
 		return -EINVAL;
 	}
 
 	reg_val = data->meas_conf | (rate << HMC5843_RATE_OFFSET);
-	return i2c_smbus_write_byte_data(client, HMC5843_CONFIG_REG_A, reg_val);
+	return i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_A,
+		reg_val);
 }
 
 static int hmc5843_check_sampling_frequency(struct hmc5843_data *data,
@@ -433,20 +426,19 @@ static ssize_t hmc5843_set_sampling_frequency(struct device *dev,
 {
 
 	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);
 	int rate;
 
 	rate = hmc5843_check_sampling_frequency(data, buf);
 	if (rate < 0) {
-		dev_err(&client->dev,
+		dev_err(&data->client->dev,
 			"sampling frequency is not supported\n");
 		return rate;
 	}
 
 	mutex_lock(&data->lock);
 	dev_dbg(dev, "set rate to %d\n", rate);
-	if (hmc5843_set_rate(client, rate)) {
+	if (hmc5843_set_rate(data->client, rate)) {
 		count = -EINVAL;
 		goto exit;
 	}
@@ -461,12 +453,11 @@ static ssize_t hmc5843_show_sampling_frequency(struct device *dev,
 			struct device_attribute *attr, char *buf)
 {
 	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-	struct i2c_client *client = to_i2c_client(indio_dev->dev.parent);
 	struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
 	struct hmc5843_data *data = iio_priv(indio_dev);
 	s32 rate;
 
-	rate = i2c_smbus_read_byte_data(client, this_attr->address);
+	rate = i2c_smbus_read_byte_data(data->client, this_attr->address);
 	if (rate < 0)
 		return rate;
 	rate = (rate & HMC5843_RATE_BITMASK) >> HMC5843_RATE_OFFSET;
@@ -497,7 +488,6 @@ static ssize_t hmc5843_set_range_gain(struct device *dev,
 			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 iio_dev_attr *this_attr = to_iio_dev_attr(attr);
 	struct hmc5843_data *data = iio_priv(indio_dev);
 	unsigned long range = 0;
@@ -518,7 +508,7 @@ static ssize_t hmc5843_set_range_gain(struct device *dev,
 
 	data->range = range;
 	range = range << HMC5843_RANGE_GAIN_OFFSET;
-	if (i2c_smbus_write_byte_data(client, this_attr->address, range))
+	if (i2c_smbus_write_byte_data(data->client, this_attr->address, range))
 		count = -EINVAL;
 
 exit:
@@ -541,9 +531,7 @@ static int hmc5843_read_raw(struct iio_dev *indio_dev,
 
 	switch (mask) {
 	case IIO_CHAN_INFO_RAW:
-		return hmc5843_read_measurement(indio_dev,
-						chan->address,
-						val);
+		return hmc5843_read_measurement(data, chan->address, val);
 	case IIO_CHAN_INFO_SCALE:
 		*val = 0;
 		*val2 = data->variant->regval_to_nanoscale[data->range];
@@ -621,8 +609,8 @@ static void hmc5843_init_client(struct i2c_client *client,
 	data->variant = &hmc5843_chip_info_tbl[id->driver_data];
 	indio_dev->channels = data->variant->channels;
 	indio_dev->num_channels = 3;
-	hmc5843_set_meas_conf(client, data->meas_conf);
-	hmc5843_set_rate(client, data->rate);
+	hmc5843_set_meas_conf(data, data->meas_conf);
+	hmc5843_set_rate(data, data->rate);
 	hmc5843_configure(client, data->operating_mode);
 	i2c_smbus_write_byte_data(client, HMC5843_CONFIG_REG_B, data->range);
 	mutex_init(&data->lock);
@@ -649,6 +637,7 @@ static int hmc5843_probe(struct i2c_client *client,
 
 	/* default settings at probe */
 	data = iio_priv(indio_dev);
+	data->client = client;
 	data->meas_conf = HMC5843_MEAS_CONF_NORMAL;
 	data->range = HMC5843_RANGE_GAIN_DEFAULT;
 	data->operating_mode = HMC5843_MODE_CONVERSION_CONTINUOUS;
@@ -687,10 +676,9 @@ static int hmc5843_suspend(struct device *dev)
 
 static int hmc5843_resume(struct device *dev)
 {
-	struct i2c_client *client = to_i2c_client(dev);
-	struct hmc5843_data *data = iio_priv(i2c_get_clientdata(client));
+	struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
 
-	hmc5843_configure(client, data->operating_mode);
+	hmc5843_configure(data->client, data->operating_mode);
 
 	return 0;
 }
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 04/18] staging:iio:hmc5843: Rewrite init function
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (2 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 03/18] staging:iio:hmc5843: Add pointer to i2c client to data struct Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 05/18] staging:iio:hmc5843: Use INFO_SAMP_FREQ Peter Meerwald
                   ` (13 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |   34 +++++++++++-----------------
 1 file changed, 13 insertions(+), 21 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 7aa767a..5327e5f 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -78,6 +78,7 @@ enum hmc5843_ids {
  * HMC5883: Typical data output rate
  */
 #define HMC5843_RATE_OFFSET			0x02
+#define HMC5843_RATE_DEFAULT			0x04
 #define HMC5843_RATE_BITMASK			0x1C
 #define HMC5843_RATE_NOT_USED			0x07
 
@@ -599,23 +600,13 @@ static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = {
 	},
 };
 
-/* Called when we have found a new HMC58X3 */
-static void hmc5843_init_client(struct i2c_client *client,
-				const struct i2c_device_id *id)
+static void hmc5843_init(struct hmc5843_data *data)
 {
-	struct iio_dev *indio_dev = i2c_get_clientdata(client);
-	struct hmc5843_data *data = iio_priv(indio_dev);
-
-	data->variant = &hmc5843_chip_info_tbl[id->driver_data];
-	indio_dev->channels = data->variant->channels;
-	indio_dev->num_channels = 3;
-	hmc5843_set_meas_conf(data, data->meas_conf);
-	hmc5843_set_rate(data, data->rate);
-	hmc5843_configure(client, data->operating_mode);
-	i2c_smbus_write_byte_data(client, HMC5843_CONFIG_REG_B, data->range);
-	mutex_init(&data->lock);
-
-	pr_info("%s initialized\n", id->name);
+	hmc5843_set_meas_conf(data, HMC5843_MEAS_CONF_NORMAL);
+	hmc5843_set_rate(data, HMC5843_RATE_DEFAULT);
+	hmc5843_configure(data->client, 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 = {
@@ -638,17 +629,18 @@ static int hmc5843_probe(struct i2c_client *client,
 	/* default settings at probe */
 	data = iio_priv(indio_dev);
 	data->client = client;
-	data->meas_conf = HMC5843_MEAS_CONF_NORMAL;
-	data->range = HMC5843_RANGE_GAIN_DEFAULT;
-	data->operating_mode = HMC5843_MODE_CONVERSION_CONTINUOUS;
+	data->variant = &hmc5843_chip_info_tbl[id->driver_data];
+	mutex_init(&data->lock);
 
 	i2c_set_clientdata(client, indio_dev);
-	hmc5843_init_client(client, id);
-
 	indio_dev->info = &hmc5843_info;
 	indio_dev->name = id->name;
 	indio_dev->dev.parent = &client->dev;
 	indio_dev->modes = INDIO_DIRECT_MODE;
+	indio_dev->channels = data->variant->channels;
+	indio_dev->num_channels = 3;
+
+	hmc5843_init(data);
 
 	err = iio_device_register(indio_dev);
 	if (err)
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 05/18] staging:iio:hmc5843: Use INFO_SAMP_FREQ
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (3 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 04/18] staging:iio:hmc5843: Rewrite init function Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 06/18] staging:iio:hmc5843: Remove unused LSB register #defines Peter Meerwald
                   ` (12 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |  135 +++++++++++-----------------
 1 file changed, 54 insertions(+), 81 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 5327e5f..d8a5c01 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -165,18 +165,19 @@ static const int hmc5883l_regval_to_input_field_mga[] = {
  * 6		| 50			| 75
  * 7		| Not used		| Not used
  */
-static const char * const hmc5843_regval_to_sample_freq[] = {
-	"0.5", "1", "2", "5", "10", "20", "50",
+static const int hmc5843_regval_to_samp_freq[7][2] = {
+	{0, 500000}, {1, 0}, {2, 0}, {5, 0}, {10, 0}, {20, 0}, {50, 0}
 };
 
-static const char * const hmc5883_regval_to_sample_freq[] = {
-	"0.75", "1.5", "3", "7.5", "15", "30", "75",
+static const int hmc5883_regval_to_samp_freq[7][2] = {
+	{0, 750000}, {1, 500000}, {3, 0}, {7, 500000}, {15, 0}, {30, 0},
+	{75, 0}
 };
 
 /* Describe chip variants */
 struct hmc5843_chip_info {
 	const struct iio_chan_spec *channels;
-	const char * const *regval_to_sample_freq;
+	const int (*regval_to_samp_freq)[2];
 	const int *regval_to_input_field_mga;
 	const int *regval_to_nanoscale;
 };
@@ -370,17 +371,17 @@ static IIO_DEVICE_ATTR(meas_conf,
 			hmc5843_set_measurement_configuration,
 			0);
 
-static ssize_t hmc5843_show_sampling_frequencies_available(struct device *dev,
-						struct device_attribute *attr,
-						char *buf)
+static ssize_t hmc5843_show_samp_freq_avail(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));
 	ssize_t total_n = 0;
 	int i;
 
 	for (i = 0; i < HMC5843_RATE_NOT_USED; i++) {
-		ssize_t n = sprintf(buf, "%s ", data->variant->regval_to_sample_freq[i]);
+		ssize_t n = sprintf(buf, "%d.%d ",
+			data->variant->regval_to_samp_freq[i][0],
+			data->variant->regval_to_samp_freq[i][1]);
 		buf += n;
 		total_n += n;
 	}
@@ -390,87 +391,30 @@ static ssize_t hmc5843_show_sampling_frequencies_available(struct device *dev,
 	return total_n;
 }
 
-static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hmc5843_show_sampling_frequencies_available);
+static IIO_DEV_ATTR_SAMP_FREQ_AVAIL(hmc5843_show_samp_freq_avail);
 
 static s32 hmc5843_set_rate(struct hmc5843_data *data, u8 rate)
 {
-	u8 reg_val;
+	u8 reg_val = data->meas_conf | (rate << HMC5843_RATE_OFFSET);
 
-	if (rate >= HMC5843_RATE_NOT_USED) {
-		dev_err(&data->client->dev,
-			"data output rate is not supported\n");
-		return -EINVAL;
-	}
-
-	reg_val = data->meas_conf | (rate << HMC5843_RATE_OFFSET);
 	return i2c_smbus_write_byte_data(data->client, HMC5843_CONFIG_REG_A,
 		reg_val);
 }
 
-static int hmc5843_check_sampling_frequency(struct hmc5843_data *data,
-						const char *buf)
+static int hmc5843_check_samp_freq(struct hmc5843_data *data,
+	int val, int val2)
 {
-	const char * const *samp_freq = data->variant->regval_to_sample_freq;
 	int i;
 
 	for (i = 0; i < HMC5843_RATE_NOT_USED; i++) {
-		if (sysfs_streq(buf, samp_freq[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_set_sampling_frequency(struct device *dev,
-					struct device_attribute *attr,
-					const char *buf, size_t count)
-{
-
-	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-	struct hmc5843_data *data = iio_priv(indio_dev);
-	int rate;
-
-	rate = hmc5843_check_sampling_frequency(data, buf);
-	if (rate < 0) {
-		dev_err(&data->client->dev,
-			"sampling frequency is not supported\n");
-		return rate;
-	}
-
-	mutex_lock(&data->lock);
-	dev_dbg(dev, "set rate to %d\n", rate);
-	if (hmc5843_set_rate(data->client, rate)) {
-		count = -EINVAL;
-		goto exit;
-	}
-	data->rate = rate;
-
-exit:
-	mutex_unlock(&data->lock);
-	return count;
-}
-
-static ssize_t hmc5843_show_sampling_frequency(struct device *dev,
-			struct device_attribute *attr, char *buf)
-{
-	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);
-	s32 rate;
-
-	rate = i2c_smbus_read_byte_data(data->client, this_attr->address);
-	if (rate < 0)
-		return rate;
-	rate = (rate & HMC5843_RATE_BITMASK) >> HMC5843_RATE_OFFSET;
-	return sprintf(buf, "%s\n", data->variant->regval_to_sample_freq[rate]);
-}
-
-static IIO_DEVICE_ATTR(sampling_frequency,
-			S_IWUSR | S_IRUGO,
-			hmc5843_show_sampling_frequency,
-			hmc5843_set_sampling_frequency,
-			HMC5843_CONFIG_REG_A);
-
 static ssize_t hmc5843_show_range_gain(struct device *dev,
 				struct device_attribute *attr,
 				char *buf)
@@ -525,8 +469,7 @@ static IIO_DEVICE_ATTR(in_magn_range,
 
 static int hmc5843_read_raw(struct iio_dev *indio_dev,
 			    struct iio_chan_spec const *chan,
-			    int *val, int *val2,
-			    long mask)
+			    int *val, int *val2, long mask)
 {
 	struct hmc5843_data *data = iio_priv(indio_dev);
 
@@ -537,17 +480,47 @@ static int hmc5843_read_raw(struct iio_dev *indio_dev,
 		*val = 0;
 		*val2 = data->variant->regval_to_nanoscale[data->range];
 		return IIO_VAL_INT_PLUS_NANO;
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		*val = data->variant->regval_to_samp_freq[data->rate][0];
+		*val2 = data->variant->regval_to_samp_freq[data->rate][1];
+		return IIO_VAL_INT_PLUS_MICRO;
 	}
 	return -EINVAL;
 }
 
+static int hmc5843_write_raw(struct iio_dev *indio_dev,
+			     struct iio_chan_spec const *chan,
+			     int val, int val2, long mask)
+{
+	struct hmc5843_data *data = iio_priv(indio_dev);
+	int ret, rate;
+
+	switch (mask) {
+	case IIO_CHAN_INFO_SAMP_FREQ:
+		rate = hmc5843_check_samp_freq(data, val, val2);
+		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;
+	default:
+		return -EINVAL;
+	}
+}
+
 #define HMC5843_CHANNEL(axis, addr)					\
 	{								\
 		.type = IIO_MAGN,					\
 		.modified = 1,						\
 		.channel2 = IIO_MOD_##axis,				\
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
-		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),	\
+		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
+			BIT(IIO_CHAN_INFO_SAMP_FREQ),			\
 		.address = addr						\
 	}
 
@@ -566,7 +539,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_sampling_frequency.dev_attr.attr,
 	&iio_dev_attr_in_magn_range.dev_attr.attr,
 	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
 	NULL
@@ -579,21 +551,21 @@ static const struct attribute_group hmc5843_group = {
 static const struct hmc5843_chip_info hmc5843_chip_info_tbl[] = {
 	[HMC5843_ID] = {
 		.channels = hmc5843_channels,
-		.regval_to_sample_freq = hmc5843_regval_to_sample_freq,
+		.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_sample_freq = hmc5883_regval_to_sample_freq,
+		.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_sample_freq = hmc5883_regval_to_sample_freq,
+		.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,
@@ -612,6 +584,7 @@ static void hmc5843_init(struct hmc5843_data *data)
 static const struct iio_info hmc5843_info = {
 	.attrs = &hmc5843_group,
 	.read_raw = &hmc5843_read_raw,
+	.write_raw = &hmc5843_write_raw,
 	.driver_module = THIS_MODULE,
 };
 
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 06/18] staging:iio:hmc5843: Remove unused LSB register #defines
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (4 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 05/18] staging:iio:hmc5843: Use INFO_SAMP_FREQ Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 07/18] staging:iio:hmc5843: Tighten comments Peter Meerwald
                   ` (11 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |    7 -------
 1 file changed, 7 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index d8a5c01..ddfc5a5 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -29,16 +29,11 @@
 #define HMC5843_CONFIG_REG_B			0x01
 #define HMC5843_MODE_REG			0x02
 #define HMC5843_DATA_OUT_X_MSB_REG		0x03
-#define HMC5843_DATA_OUT_X_LSB_REG		0x04
 #define HMC5843_DATA_OUT_Y_MSB_REG		0x05
-#define HMC5843_DATA_OUT_Y_LSB_REG		0x06
 #define HMC5843_DATA_OUT_Z_MSB_REG		0x07
-#define HMC5843_DATA_OUT_Z_LSB_REG		0x08
 /* Beware: Y and Z are exchanged on HMC5883 */
 #define HMC5883_DATA_OUT_Z_MSB_REG		0x05
-#define HMC5883_DATA_OUT_Z_LSB_REG		0x06
 #define HMC5883_DATA_OUT_Y_MSB_REG		0x07
-#define HMC5883_DATA_OUT_Y_LSB_REG		0x08
 #define HMC5843_STATUS_REG			0x09
 
 enum hmc5843_ids {
@@ -61,8 +56,6 @@ enum hmc5843_ids {
  */
 #define HMC5843_DATA_READY			0x01
 #define HMC5843_DATA_OUTPUT_LOCK		0x02
-/* Does not exist on HMC5883, not used */
-#define HMC5843_VOLTAGE_REGULATOR_ENABLED	0x04
 
 /*
  * Mode register configuration
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 07/18] staging:iio:hmc5843: Tighten comments
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (5 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 06/18] staging:iio:hmc5843: Remove unused LSB register #defines Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 08/18] staging:iio:hmc5843: Introduce helper functions to show/check list of int pairs Peter Meerwald
                   ` (10 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |   16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index ddfc5a5..63a8956 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -51,15 +51,11 @@ enum hmc5843_ids {
 #define HMC5843_RANGE_GAIN_DEFAULT		0x01
 #define HMC5843_RANGE_GAIN_MAX			0x07
 
-/*
- * Device status
- */
+/* Device status */
 #define HMC5843_DATA_READY			0x01
 #define HMC5843_DATA_OUTPUT_LOCK		0x02
 
-/*
- * Mode register configuration
- */
+/* Mode register configuration */
 #define HMC5843_MODE_CONVERSION_CONTINUOUS	0x00
 #define HMC5843_MODE_CONVERSION_SINGLE		0x01
 #define HMC5843_MODE_IDLE			0x02
@@ -75,18 +71,14 @@ enum hmc5843_ids {
 #define HMC5843_RATE_BITMASK			0x1C
 #define HMC5843_RATE_NOT_USED			0x07
 
-/*
- * Device measurement configuration
- */
+/* Device measurement configuration */
 #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
- */
+/* Scaling factors: 10000000/Gain */
 static const int hmc5843_regval_to_nanoscale[] = {
 	6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714
 };
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 08/18] staging:iio:hmc5843: Introduce helper functions to show/check list of int pairs
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (6 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 07/18] staging:iio:hmc5843: Tighten comments Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 09/18] staging:iio:hmc5843: Use CALIBSCALE instead of magn_range Peter Meerwald
                   ` (9 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |   53 +++++++++++++++++-----------
 1 file changed, 33 insertions(+), 20 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 63a8956..bff03d5 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -356,24 +356,43 @@ static IIO_DEVICE_ATTR(meas_conf,
 			hmc5843_set_measurement_configuration,
 			0);
 
-static ssize_t hmc5843_show_samp_freq_avail(struct device *dev,
-				struct device_attribute *attr, char *buf)
+static ssize_t hmc5843_show_int_plus_micros(char *buf,
+	const int (*vals)[2], int n)
 {
-	struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
-	ssize_t total_n = 0;
+	ssize_t total_out = 0;
 	int i;
 
-	for (i = 0; i < HMC5843_RATE_NOT_USED; i++) {
-		ssize_t n = sprintf(buf, "%d.%d ",
-			data->variant->regval_to_samp_freq[i][0],
-			data->variant->regval_to_samp_freq[i][1]);
-		buf += n;
-		total_n += n;
+	for (i = 0; i < n; i++) {
+		ssize_t out = sprintf(buf, "%d.%d ", vals[i][0], vals[i][1]);
+		buf += out;
+		total_out += out;
 	}
 	/* replace trailing space by newline */
 	buf[-1] = '\n';
 
-	return total_n;
+	return total_out;
+}
+
+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);
@@ -389,15 +408,9 @@ static s32 hmc5843_set_rate(struct hmc5843_data *data, u8 rate)
 static int hmc5843_check_samp_freq(struct hmc5843_data *data,
 	int val, int 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;
+	return hmc5843_check_int_plus_micros(
+		data->variant->regval_to_samp_freq, HMC5843_RATE_NOT_USED,
+		val, val2);
 }
 
 static ssize_t hmc5843_show_range_gain(struct device *dev,
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 09/18] staging:iio:hmc5843: Use CALIBSCALE instead of magn_range
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (7 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 08/18] staging:iio:hmc5843: Introduce helper functions to show/check list of int pairs Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-12 21:07   ` Jonathan Cameron
  2013-09-03  1:05 ` [PATCH 10/18] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
                   ` (8 subsequent siblings)
  17 siblings, 1 reply; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |  108 ++++++++++++----------------
 1 file changed, 47 insertions(+), 61 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index bff03d5..faaaafc 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -125,16 +125,19 @@ static const int hmc5883l_regval_to_nanoscale[] = {
  * 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 hmc5843_regval_to_range_ga[8][2] = {
+	{0, 700000}, {1, 0}, {1, 500000}, {2, 0}, {3, 200000},
+	{3, 800000}, {4, 500000}, {6, 500000}
 };
 
-static const int hmc5883_regval_to_input_field_mga[] = {
-	900, 1200, 1900, 2500, 4000, 4600, 5500, 7900
+static const int hmc5883_regval_to_range_ga[8][2] = {
+	{0, 900000}, {1, 200000}, {1, 900000}, {2, 500000}, {4, 0},
+	{4, 600000}, {5, 500000}, {7, 900000}
 };
 
-static const int hmc5883l_regval_to_input_field_mga[] = {
-	880, 1300, 1900, 2500, 4000, 4700, 5600, 8100
+static const int hmc5883l_regval_to_range_ga[8][2] = {
+	{0, 880000}, {1, 300000}, {1, 900000}, {2, 500000}, {4, 0},
+	{4, 700000}, {5, 600000}, {8, 100000}
 };
 
 /*
@@ -163,7 +166,7 @@ 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_range_ga)[2];
 	const int *regval_to_nanoscale;
 };
 
@@ -413,58 +416,25 @@ 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_calibscale_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));
 
-	range = data->range;
-	return sprintf(buf, "%d\n", data->variant->regval_to_input_field_mga[range]);
+	return hmc5843_show_int_plus_micros(buf,
+		data->variant->regval_to_range_ga, HMC5843_RANGE_GAIN_MAX+1);
 }
 
-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;
-
-	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 IIO_DEVICE_ATTR(calibscale_available, S_IRUGO,
+	hmc5843_show_calibscale_avail, NULL, 0);
 
-	if (range > HMC5843_RANGE_GAIN_MAX) {
-		count = -EINVAL;
-		goto exit;
-	}
-
-	data->range = range;
-	range = range << HMC5843_RANGE_GAIN_OFFSET;
-	if (i2c_smbus_write_byte_data(data->client, this_attr->address, range))
-		count = -EINVAL;
-
-exit:
-	mutex_unlock(&data->lock);
-	return count;
+static int hmc5843_check_range(struct hmc5843_data *data,
+	int val, int val2)
+{
+	return hmc5843_check_int_plus_micros(data->variant->regval_to_range_ga,
+		HMC5843_RANGE_GAIN_MAX+1, val, val2);
 }
 
-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)
@@ -482,6 +452,10 @@ static int hmc5843_read_raw(struct iio_dev *indio_dev,
 		*val = data->variant->regval_to_samp_freq[data->rate][0];
 		*val2 = data->variant->regval_to_samp_freq[data->rate][1];
 		return IIO_VAL_INT_PLUS_MICRO;
+	case IIO_CHAN_INFO_CALIBSCALE:
+		*val = data->variant->regval_to_range_ga[data->range][0];
+		*val2 = data->variant->regval_to_range_ga[data->range][1];
+		return IIO_VAL_INT_PLUS_MICRO;
 	}
 	return -EINVAL;
 }
@@ -491,7 +465,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:
@@ -506,6 +480,20 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
 		mutex_unlock(&data->lock);
 
 		return ret;
+	case IIO_CHAN_INFO_CALIBSCALE:
+		range = hmc5843_check_range(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;
 	}
@@ -518,7 +506,8 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
 		.channel2 = IIO_MOD_##axis,				\
 		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
 		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
-			BIT(IIO_CHAN_INFO_SAMP_FREQ),			\
+			BIT(IIO_CHAN_INFO_SAMP_FREQ) |			\
+			BIT(IIO_CHAN_INFO_CALIBSCALE),			\
 		.address = addr						\
 	}
 
@@ -537,7 +526,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_calibscale_available.dev_attr.attr,
 	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
 	NULL
 };
@@ -550,22 +539,19 @@ 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_range_ga = hmc5843_regval_to_range_ga,
 		.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_range_ga = hmc5883_regval_to_range_ga,
 		.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_range_ga = hmc5883l_regval_to_range_ga,
 		.regval_to_nanoscale = hmc5883l_regval_to_nanoscale,
 	},
 };
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 10/18] staging:iio:hmc5843: Always read all channels values otherwise no updates
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (8 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 09/18] staging:iio:hmc5843: Use CALIBSCALE instead of magn_range Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 11/18] staging:iio:hmc5843: Add trigger handling Peter Meerwald
                   ` (7 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 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 faaaafc..8a152c7 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 {
@@ -190,17 +185,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);
@@ -208,16 +202,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;
 }
 
@@ -499,7 +509,7 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
 	}
 }
 
-#define HMC5843_CHANNEL(axis, addr)					\
+#define HMC5843_CHANNEL(axis, idx)					\
 	{								\
 		.type = IIO_MAGN,					\
 		.modified = 1,						\
@@ -508,19 +518,20 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
 		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
 			BIT(IIO_CHAN_INFO_SAMP_FREQ) |			\
 			BIT(IIO_CHAN_INFO_CALIBSCALE),			\
-		.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.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 11/18] staging:iio:hmc5843: Add trigger handling
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (9 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 10/18] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-12 22:01   ` Jonathan Cameron
  2013-09-03  1:05 ` [PATCH 12/18] staging:iio:hmc5843: Fix format of MODULE_AUTHOR's email Peter Meerwald
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 UTC (permalink / raw)
  To: linux-iio; +Cc: Peter Meerwald

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
---
 drivers/staging/iio/magnetometer/hmc5843.c |   84 +++++++++++++++++++++++++---
 1 file changed, 76 insertions(+), 8 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 8a152c7..131ab8d 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
@@ -73,6 +76,9 @@ enum hmc5843_ids {
 #define HMC5843_MEAS_CONF_NOT_USED		0x03
 #define HMC5843_MEAS_CONF_MASK			0x03
 
+/* 3 16-bit channels + padding + timestamp = 16 bytes */
+#define HMC5843_BUFFER_SIZE 16
+
 /* Scaling factors: 10000000/Gain */
 static const int hmc5843_regval_to_nanoscale[] = {
 	6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714
@@ -174,6 +180,7 @@ struct hmc5843_data {
 	u8 operating_mode;
 	u8 range;
 	const struct hmc5843_chip_info *variant;
+	u16 *buffer;
 };
 
 /* The lower two bits contain the current conversion mode */
@@ -453,7 +460,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];
@@ -509,6 +516,47 @@ static int hmc5843_write_raw(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);
+	s64 time_ns = iio_get_time_ns();
+	int len = 0;
+	int i, j = 0;
+	s16 values[3];
+	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, sizeof(values), (u8 *) values);
+	mutex_unlock(&data->lock);
+	if (ret < 0)
+		goto done;
+
+	for_each_set_bit(i, indio_dev->active_scan_mask,
+		indio_dev->masklength) {
+		data->buffer[j++] = sign_extend32(be16_to_cpu(values[i]), 15);
+		len += 2;
+	}
+
+	if (indio_dev->scan_timestamp)
+		*(s64 *)((u8 *)data->buffer + ALIGN(len, sizeof(s64)))
+			= time_ns;
+	iio_push_to_buffers(indio_dev, (u8 *)data->buffer);
+
+done:
+	iio_trigger_notify_done(indio_dev->trig);
+
+	return IRQ_HANDLED;
+}
+
 #define HMC5843_CHANNEL(axis, idx)					\
 	{								\
 		.type = IIO_MAGN,					\
@@ -518,13 +566,15 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
 		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
 			BIT(IIO_CHAN_INFO_SAMP_FREQ) |			\
 			BIT(IIO_CHAN_INFO_CALIBSCALE),			\
-		.address = idx						\
+		.scan_index = idx,					\
+		.scan_type = IIO_ST('s', 16, 16, 0),			\
 	}
 
 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 */
@@ -532,6 +582,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[] = {
@@ -588,7 +639,7 @@ static int hmc5843_probe(struct i2c_client *client,
 {
 	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)
@@ -598,6 +649,10 @@ static int hmc5843_probe(struct i2c_client *client,
 	data = iio_priv(indio_dev);
 	data->client = client;
 	data->variant = &hmc5843_chip_info_tbl[id->driver_data];
+	data->buffer = devm_kzalloc(&client->dev, HMC5843_BUFFER_SIZE,
+		GFP_KERNEL);
+	if (data->buffer == NULL)
+		return -ENOMEM;
 	mutex_init(&data->lock);
 
 	i2c_set_clientdata(client, indio_dev);
@@ -606,20 +661,33 @@ 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;
 
 	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.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 12/18] staging:iio:hmc5843: Fix format of MODULE_AUTHOR's email
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (10 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 11/18] staging:iio:hmc5843: Add trigger handling Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 13/18] staging:iio:hmc5843: Remove ability to change operating mode Peter Meerwald
                   ` (5 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 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 131ab8d..efd7d171 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -736,6 +736,6 @@ static struct i2c_driver hmc5843_driver = {
 };
 module_i2c_driver(hmc5843_driver);
 
-MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com");
+MODULE_AUTHOR("Shubhrajyoti Datta <shubhrajyoti@ti.com>");
 MODULE_DESCRIPTION("HMC5843/5883/5883L driver");
 MODULE_LICENSE("GPL");
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 13/18] staging:iio:hmc5843: Remove ability to change operating mode
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (11 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 12/18] staging:iio:hmc5843: Fix format of MODULE_AUTHOR's email Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 14/18] staging:iio:hmc5843: Rename _configure() to _set_mode() Peter Meerwald
                   ` (4 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 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 efd7d171..7934960 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -239,73 +239,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
  *
@@ -587,7 +520,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_calibscale_available.dev_attr.attr,
 	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
 	NULL
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 14/18] staging:iio:hmc5843: Rename _configure() to _set_mode()
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (12 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 13/18] staging:iio:hmc5843: Remove ability to change operating mode Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 15/18] staging:iio:hmc5843: Reorganize _set_meas_conf() Peter Meerwald
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 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 |   30 +++++++++++++++-------------
 1 file changed, 16 insertions(+), 14 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 7934960..a88473b 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -184,12 +184,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)
@@ -554,7 +560,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);
 }
@@ -621,7 +627,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;
 }
@@ -629,18 +635,14 @@ 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);
-
-	return 0;
+	return hmc5843_set_mode(iio_priv(dev_to_iio_dev(dev)),
+		HMC5843_MODE_SLEEP);
 }
 
 static int hmc5843_resume(struct device *dev)
 {
-	struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
-
-	hmc5843_configure(data->client, data->operating_mode);
-
-	return 0;
+	return hmc5843_set_mode(iio_priv(dev_to_iio_dev(dev)),
+		HMC5843_MODE_CONVERSION_CONTINUOUS);
 }
 
 static SIMPLE_DEV_PM_OPS(hmc5843_pm_ops, hmc5843_suspend, hmc5843_resume);
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 15/18] staging:iio:hmc5843: Reorganize _set_meas_conf()
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (13 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 14/18] staging:iio:hmc5843: Rename _configure() to _set_mode() Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 16/18] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq() Peter Meerwald
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 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 |   42 +++++++++++++---------------
 1 file changed, 19 insertions(+), 23 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index a88473b..00e2225 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -264,19 +264,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);
 }
 
@@ -285,28 +290,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;
+	ret = kstrtoul(buf, 10, &meas_conf);
+	if (ret)
+		return ret;
 	if (meas_conf >= HMC5843_MEAS_CONF_NOT_USED)
 		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.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 16/18] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq()
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (14 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 15/18] staging:iio:hmc5843: Reorganize _set_meas_conf() Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 17/18] staging:iio:hmc5843: Introduce _set_range_gain() Peter Meerwald
  2013-09-03  1:05 ` [PATCH 18/18] staging:iio:hmc5843: Check initialization and chip identifier Peter Meerwald
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 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 |   24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index 00e2225..f37794d 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -352,12 +352,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_check_samp_freq(struct hmc5843_data *data,
@@ -425,13 +431,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_CALIBSCALE:
 		range = hmc5843_check_range(data, val, val2);
 		if (range < 0)
@@ -555,7 +555,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.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 17/18] staging:iio:hmc5843: Introduce _set_range_gain()
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (15 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 16/18] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq() Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  2013-09-03  1:05 ` [PATCH 18/18] staging:iio:hmc5843: Check initialization and chip identifier Peter Meerwald
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 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, 19 insertions(+), 14 deletions(-)

diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
index f37794d..81783ae 100644
--- a/drivers/staging/iio/magnetometer/hmc5843.c
+++ b/drivers/staging/iio/magnetometer/hmc5843.c
@@ -374,6 +374,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_calibscale_avail(struct device *dev,
 				struct device_attribute *attr, char *buf)
 {
@@ -386,7 +400,7 @@ static ssize_t hmc5843_show_calibscale_avail(struct device *dev,
 static IIO_DEVICE_ATTR(calibscale_available, S_IRUGO,
 	hmc5843_show_calibscale_avail, NULL, 0);
 
-static int hmc5843_check_range(struct hmc5843_data *data,
+static int hmc5843_check_range_gain(struct hmc5843_data *data,
 	int val, int val2)
 {
 	return hmc5843_check_int_plus_micros(data->variant->regval_to_range_ga,
@@ -423,7 +437,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:
@@ -433,19 +447,11 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
 
 		return hmc5843_set_samp_freq(data, rate);
 	case IIO_CHAN_INFO_CALIBSCALE:
-		range = hmc5843_check_range(data, val, val2);
+		range = hmc5843_check_range_gain(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;
+		return hmc5843_set_range_gain(data, range);
 	default:
 		return -EINVAL;
 	}
@@ -556,9 +562,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.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* [PATCH 18/18] staging:iio:hmc5843: Check initialization and chip identifier
  2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
                   ` (16 preceding siblings ...)
  2013-09-03  1:05 ` [PATCH 17/18] staging:iio:hmc5843: Introduce _set_range_gain() Peter Meerwald
@ 2013-09-03  1:05 ` Peter Meerwald
  17 siblings, 0 replies; 25+ messages in thread
From: Peter Meerwald @ 2013-09-03  1:05 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 81783ae..915eadd 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,
@@ -558,12 +559,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 = {
@@ -602,7 +621,9 @@ static int hmc5843_probe(struct i2c_client *client,
 	indio_dev->channels = data->variant->channels;
 	indio_dev->num_channels = 4;
 
-	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.7.9.5


^ permalink raw reply related	[flat|nested] 25+ messages in thread

* Re: [PATCH 01/18] staging:iio:hmc5843: Fix measurement conversion
  2013-09-03  1:05 ` [PATCH 01/18] staging:iio:hmc5843: Fix measurement conversion Peter Meerwald
@ 2013-09-05 19:18   ` Lars-Peter Clausen
  2013-09-11 21:57     ` Jonathan Cameron
  0 siblings, 1 reply; 25+ messages in thread
From: Lars-Peter Clausen @ 2013-09-05 19:18 UTC (permalink / raw)
  To: Peter Meerwald; +Cc: linux-iio

On 09/03/2013 03:05 AM, Peter Meerwald wrote:
> recently broken, cd6fe06588423ff4cca85c85c4402027b04dccf1

When referring to a commit usually the commit title is also mentioned after the 
commit id. E.g. 12345678 ("abc foobar")

>
> 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 d2748c3..c3f3f53 100644
> --- a/drivers/staging/iio/magnetometer/hmc5843.c
> +++ b/drivers/staging/iio/magnetometer/hmc5843.c
> @@ -229,7 +229,7 @@ static int hmc5843_read_measurement(struct iio_dev *indio_dev,
>   	if (result < 0)
>   		return -EINVAL;
>
> -	*val = result;
> +	*val = sign_extend32(result, 15);
>   	return IIO_VAL_INT;
>   }
>
>


^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 01/18] staging:iio:hmc5843: Fix measurement conversion
  2013-09-05 19:18   ` Lars-Peter Clausen
@ 2013-09-11 21:57     ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2013-09-11 21:57 UTC (permalink / raw)
  To: Lars-Peter Clausen; +Cc: Peter Meerwald, linux-iio

On 09/05/13 20:18, Lars-Peter Clausen wrote:
> On 09/03/2013 03:05 AM, Peter Meerwald wrote:
>> recently broken, cd6fe06588423ff4cca85c85c4402027b04dccf1
> 
> When referring to a commit usually the commit title is also mentioned after the commit id. E.g. 12345678 ("abc foobar")

Patch description edited and applied to the fixes-togreg branch of iio.git

Thanks

Jonathan
> 
>>
>> 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 d2748c3..c3f3f53 100644
>> --- a/drivers/staging/iio/magnetometer/hmc5843.c
>> +++ b/drivers/staging/iio/magnetometer/hmc5843.c
>> @@ -229,7 +229,7 @@ static int hmc5843_read_measurement(struct iio_dev *indio_dev,
>>       if (result < 0)
>>           return -EINVAL;
>>
>> -    *val = result;
>> +    *val = sign_extend32(result, 15);
>>       return IIO_VAL_INT;
>>   }
>>
>>
> 
> -- 
> To unsubscribe from this list: send the line "unsubscribe linux-iio" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 02/18] staging:iio:hmc5843: Use devm_iio_device_alloc
  2013-09-03  1:05 ` [PATCH 02/18] staging:iio:hmc5843: Use devm_iio_device_alloc Peter Meerwald
@ 2013-09-11 22:02   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2013-09-11 22:02 UTC (permalink / raw)
  To: Peter Meerwald; +Cc: linux-iio

On 09/03/13 02:05, Peter Meerwald wrote:
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Hmm.. THere are a few bits in here that are definitely things you fixed whilst you
were here.  Ideally they would have been in a separate patch, but I'll take this
as it is this time.

Applied to the togreg branch of iio.git.

Thanks,

Jonathan
> ---
>  drivers/staging/iio/magnetometer/hmc5843.c |   24 +++++++-----------------
>  1 file changed, 7 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
> index c3f3f53..3e72121 100644
> --- a/drivers/staging/iio/magnetometer/hmc5843.c
> +++ b/drivers/staging/iio/magnetometer/hmc5843.c
> @@ -643,11 +643,9 @@ static int hmc5843_probe(struct i2c_client *client,
>  	struct iio_dev *indio_dev;
>  	int err = 0;
>  
> -	indio_dev = iio_device_alloc(sizeof(*data));
> -	if (indio_dev == NULL) {
> -		err = -ENOMEM;
> -		goto exit;
> -	}
> +	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
> +	if (indio_dev == NULL)
> +		return -ENOMEM;
>  
>  	/* default settings at probe */
>  	data = iio_priv(indio_dev);
> @@ -665,24 +663,16 @@ static int hmc5843_probe(struct i2c_client *client,
>  
>  	err = iio_device_register(indio_dev);
>  	if (err)
> -		goto exit_free2;
> +		return err;
>  
>  	return 0;
> -
> -exit_free2:
> -	iio_device_free(indio_dev);
> -exit:
> -	return err;
>  }
>  
>  static int hmc5843_remove(struct i2c_client *client)
>  {
> -	struct iio_dev *indio_dev = i2c_get_clientdata(client);
> -
> -	iio_device_unregister(indio_dev);
> +	iio_device_unregister(i2c_get_clientdata(client));
>  	 /*  sleep mode to save power */
>  	hmc5843_configure(client, HMC5843_MODE_SLEEP);
> -	iio_device_free(indio_dev);
>  
>  	return 0;
>  }
> @@ -691,14 +681,14 @@ static int hmc5843_remove(struct i2c_client *client)
>  static int hmc5843_suspend(struct device *dev)
>  {
>  	hmc5843_configure(to_i2c_client(dev), HMC5843_MODE_SLEEP);
> +
>  	return 0;
>  }
>  
>  static int hmc5843_resume(struct device *dev)
>  {
>  	struct i2c_client *client = to_i2c_client(dev);
> -	struct iio_dev *indio_dev = i2c_get_clientdata(client);
> -	struct hmc5843_data *data = iio_priv(indio_dev);
> +	struct hmc5843_data *data = iio_priv(i2c_get_clientdata(client));
>  
>  	hmc5843_configure(client, data->operating_mode);
>  
> 

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 03/18] staging:iio:hmc5843: Add pointer to i2c client to data struct
  2013-09-03  1:05 ` [PATCH 03/18] staging:iio:hmc5843: Add pointer to i2c client to data struct Peter Meerwald
@ 2013-09-11 22:07   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2013-09-11 22:07 UTC (permalink / raw)
  To: Peter Meerwald; +Cc: linux-iio


>  static int hmc5843_resume(struct device *dev)
>  {
> -	struct i2c_client *client = to_i2c_client(dev);
> -	struct hmc5843_data *data = iio_priv(i2c_get_clientdata(client));
> +	struct hmc5843_data *data = iio_priv(dev_to_iio_dev(dev));
This one has me a little confused.  The dev parameter should I think be the i2c dev here?
If so then dev_to_iio_dev will give th wrong one.
>  
> -	hmc5843_configure(client, data->operating_mode);
> +	hmc5843_configure(data->client, data->operating_mode);
>  
>  	return 0;
>  }
> 

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 09/18] staging:iio:hmc5843: Use CALIBSCALE instead of magn_range
  2013-09-03  1:05 ` [PATCH 09/18] staging:iio:hmc5843: Use CALIBSCALE instead of magn_range Peter Meerwald
@ 2013-09-12 21:07   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2013-09-12 21:07 UTC (permalink / raw)
  To: Peter Meerwald; +Cc: linux-iio

On 09/03/13 02:05, Peter Meerwald wrote:
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
> ---
Hi Peter,

This one has me a little confused.  To be a correct use of calibscale it should have no
effect on the calculation to convert the raw reading into Gauss.

Can you confirm this is true here?  I can't immediately work out whether that is true
from the datasheet.

>  drivers/staging/iio/magnetometer/hmc5843.c |  108 ++++++++++++----------------
>  1 file changed, 47 insertions(+), 61 deletions(-)
> 
> diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
> index bff03d5..faaaafc 100644
> --- a/drivers/staging/iio/magnetometer/hmc5843.c
> +++ b/drivers/staging/iio/magnetometer/hmc5843.c
> @@ -125,16 +125,19 @@ static const int hmc5883l_regval_to_nanoscale[] = {
>   * 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 hmc5843_regval_to_range_ga[8][2] = {
> +	{0, 700000}, {1, 0}, {1, 500000}, {2, 0}, {3, 200000},
> +	{3, 800000}, {4, 500000}, {6, 500000}
>  };
>  
> -static const int hmc5883_regval_to_input_field_mga[] = {
> -	900, 1200, 1900, 2500, 4000, 4600, 5500, 7900
> +static const int hmc5883_regval_to_range_ga[8][2] = {
> +	{0, 900000}, {1, 200000}, {1, 900000}, {2, 500000}, {4, 0},
> +	{4, 600000}, {5, 500000}, {7, 900000}
>  };
>  
> -static const int hmc5883l_regval_to_input_field_mga[] = {
> -	880, 1300, 1900, 2500, 4000, 4700, 5600, 8100
> +static const int hmc5883l_regval_to_range_ga[8][2] = {
> +	{0, 880000}, {1, 300000}, {1, 900000}, {2, 500000}, {4, 0},
> +	{4, 700000}, {5, 600000}, {8, 100000}
>  };
>  
>  /*
> @@ -163,7 +166,7 @@ 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_range_ga)[2];
>  	const int *regval_to_nanoscale;
>  };
>  
> @@ -413,58 +416,25 @@ 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_calibscale_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));
>  
> -	range = data->range;
> -	return sprintf(buf, "%d\n", data->variant->regval_to_input_field_mga[range]);
> +	return hmc5843_show_int_plus_micros(buf,
> +		data->variant->regval_to_range_ga, HMC5843_RANGE_GAIN_MAX+1);
>  }
>  
> -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;
> -
> -	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 IIO_DEVICE_ATTR(calibscale_available, S_IRUGO,
> +	hmc5843_show_calibscale_avail, NULL, 0);
>  
> -	if (range > HMC5843_RANGE_GAIN_MAX) {
> -		count = -EINVAL;
> -		goto exit;
> -	}
> -
> -	data->range = range;
> -	range = range << HMC5843_RANGE_GAIN_OFFSET;
> -	if (i2c_smbus_write_byte_data(data->client, this_attr->address, range))
> -		count = -EINVAL;
> -
> -exit:
> -	mutex_unlock(&data->lock);
> -	return count;
> +static int hmc5843_check_range(struct hmc5843_data *data,
> +	int val, int val2)
> +{
> +	return hmc5843_check_int_plus_micros(data->variant->regval_to_range_ga,
> +		HMC5843_RANGE_GAIN_MAX+1, val, val2);
>  }
>  
> -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)
> @@ -482,6 +452,10 @@ static int hmc5843_read_raw(struct iio_dev *indio_dev,
>  		*val = data->variant->regval_to_samp_freq[data->rate][0];
>  		*val2 = data->variant->regval_to_samp_freq[data->rate][1];
>  		return IIO_VAL_INT_PLUS_MICRO;
> +	case IIO_CHAN_INFO_CALIBSCALE:
> +		*val = data->variant->regval_to_range_ga[data->range][0];
> +		*val2 = data->variant->regval_to_range_ga[data->range][1];
> +		return IIO_VAL_INT_PLUS_MICRO;
>  	}
>  	return -EINVAL;
>  }
> @@ -491,7 +465,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:
> @@ -506,6 +480,20 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
>  		mutex_unlock(&data->lock);
>  
>  		return ret;
> +	case IIO_CHAN_INFO_CALIBSCALE:
> +		range = hmc5843_check_range(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;
>  	}
> @@ -518,7 +506,8 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
>  		.channel2 = IIO_MOD_##axis,				\
>  		.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),		\
>  		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
> -			BIT(IIO_CHAN_INFO_SAMP_FREQ),			\
> +			BIT(IIO_CHAN_INFO_SAMP_FREQ) |			\
> +			BIT(IIO_CHAN_INFO_CALIBSCALE),			\
>  		.address = addr						\
>  	}
>  
> @@ -537,7 +526,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_calibscale_available.dev_attr.attr,
>  	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
>  	NULL
>  };
> @@ -550,22 +539,19 @@ 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_range_ga = hmc5843_regval_to_range_ga,
>  		.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_range_ga = hmc5883_regval_to_range_ga,
>  		.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_range_ga = hmc5883l_regval_to_range_ga,
>  		.regval_to_nanoscale = hmc5883l_regval_to_nanoscale,
>  	},
>  };
> 

^ permalink raw reply	[flat|nested] 25+ messages in thread

* Re: [PATCH 11/18] staging:iio:hmc5843: Add trigger handling
  2013-09-03  1:05 ` [PATCH 11/18] staging:iio:hmc5843: Add trigger handling Peter Meerwald
@ 2013-09-12 22:01   ` Jonathan Cameron
  0 siblings, 0 replies; 25+ messages in thread
From: Jonathan Cameron @ 2013-09-12 22:01 UTC (permalink / raw)
  To: Peter Meerwald; +Cc: linux-iio

On 09/03/13 02:05, Peter Meerwald wrote:
> Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>

Couple of bits inline.  Basically, if you rely a little more on the core
handling of splitting out desired buffer elements then you can simplify
things somewhat.

> ---
>  drivers/staging/iio/magnetometer/hmc5843.c |   84 +++++++++++++++++++++++++---
>  1 file changed, 76 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c
> index 8a152c7..131ab8d 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
> @@ -73,6 +76,9 @@ enum hmc5843_ids {
>  #define HMC5843_MEAS_CONF_NOT_USED		0x03
>  #define HMC5843_MEAS_CONF_MASK			0x03
>
> +/* 3 16-bit channels + padding + timestamp = 16 bytes */
> +#define HMC5843_BUFFER_SIZE 16
> +
>  /* Scaling factors: 10000000/Gain */
>  static const int hmc5843_regval_to_nanoscale[] = {
>  	6173, 7692, 10309, 12821, 18868, 21739, 25641, 35714
> @@ -174,6 +180,7 @@ struct hmc5843_data {
>  	u8 operating_mode;
>  	u8 range;
>  	const struct hmc5843_chip_info *variant;
If the channel demux is handled by the core, then just have
u16 buffer[8]; here.
> +	u16 *buffer;
>  };
>
>  /* The lower two bits contain the current conversion mode */
> @@ -453,7 +460,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];
> @@ -509,6 +516,47 @@ static int hmc5843_write_raw(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);
> +	s64 time_ns = iio_get_time_ns();
Is this the right place to grab te timestamp?  Would immediately after
hmc5843_wait_measurement be closer to the actual capture time?
> +	int len = 0;
> +	int i, j = 0;
> +	s16 values[3];
> +	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, sizeof(values), (u8 *) values);
> +	mutex_unlock(&data->lock);
> +	if (ret < 0)
> +		goto done;
> +
> +	for_each_set_bit(i, indio_dev->active_scan_mask,
> +		indio_dev->masklength) {
> +		data->buffer[j++] = sign_extend32(be16_to_cpu(values[i]), 15);
> +		len += 2;
> +	}
This would be neater done by letting the demux code in the core handle it.
Hence just specify that the only possible scan mask is all channels (0x7)
as the only element in available_scan_masks, then always push the lot
onwards. Also as I read it you are extending to 32 bits. Why? You then
copy it into a 16 bit value neatly squashing it back to where you started
I think? Also, without this and with the core handling demux, you can
read directly into data->buffer and drop the copy.

static const int hmc5843_masks[] = { 0x3, 0};
indio_dev->available_scan_masks = hmc5843_masks;
(before registering the iio device) then

ret = i2c_smbus_read_i2c_block_data(data->client,
    HMC5843_DATA_OUT_MSB_REGS, 6, (u8 *) data->buffer);
in relevant place.


> +
> +	if (indio_dev->scan_timestamp)
> +		*(s64 *)((u8 *)data->buffer + ALIGN(len, sizeof(s64)))
> +			= time_ns;
> +	iio_push_to_buffers(indio_dev, (u8 *)data->buffer);
> +
> +done:
> +	iio_trigger_notify_done(indio_dev->trig);
> +
> +	return IRQ_HANDLED;
> +}
> +
>  #define HMC5843_CHANNEL(axis, idx)					\
>  	{								\
>  		.type = IIO_MAGN,					\
> @@ -518,13 +566,15 @@ static int hmc5843_write_raw(struct iio_dev *indio_dev,
>  		.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |	\
>  			BIT(IIO_CHAN_INFO_SAMP_FREQ) |			\
>  			BIT(IIO_CHAN_INFO_CALIBSCALE),			\
> -		.address = idx						\
> +		.scan_index = idx,					\
> +		.scan_type = IIO_ST('s', 16, 16, 0),			\
>  	}
>
>  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 */
> @@ -532,6 +582,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[] = {
> @@ -588,7 +639,7 @@ static int hmc5843_probe(struct i2c_client *client,
>  {
>  	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)
> @@ -598,6 +649,10 @@ static int hmc5843_probe(struct i2c_client *client,
>  	data = iio_priv(indio_dev);
>  	data->client = client;
>  	data->variant = &hmc5843_chip_info_tbl[id->driver_data];
> +	data->buffer = devm_kzalloc(&client->dev, HMC5843_BUFFER_SIZE,
> +		GFP_KERNEL);
As suggested above, just allocate this directly as part of the buffer.
With i2c there are no buffer alignment requirements, but if you do have the
then there are ways to ensure you are cacheline aligned
(drivers/iio/adc/ad7266.c for example).  This is only needed for SPI (and is
why there are lots of allocations like the one you have here still kicking
about).
> +	if (data->buffer == NULL)
> +		return -ENOMEM;
>  	mutex_init(&data->lock);
>
>  	i2c_set_clientdata(client, indio_dev);
> @@ -606,20 +661,33 @@ 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;
>
>  	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] 25+ messages in thread

end of thread, other threads:[~2013-09-12 21:01 UTC | newest]

Thread overview: 25+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-09-03  1:05 [PATCH 00/18] Cleanup hmc5843 magnetometer driver in staging Peter Meerwald
2013-09-03  1:05 ` [PATCH 01/18] staging:iio:hmc5843: Fix measurement conversion Peter Meerwald
2013-09-05 19:18   ` Lars-Peter Clausen
2013-09-11 21:57     ` Jonathan Cameron
2013-09-03  1:05 ` [PATCH 02/18] staging:iio:hmc5843: Use devm_iio_device_alloc Peter Meerwald
2013-09-11 22:02   ` Jonathan Cameron
2013-09-03  1:05 ` [PATCH 03/18] staging:iio:hmc5843: Add pointer to i2c client to data struct Peter Meerwald
2013-09-11 22:07   ` Jonathan Cameron
2013-09-03  1:05 ` [PATCH 04/18] staging:iio:hmc5843: Rewrite init function Peter Meerwald
2013-09-03  1:05 ` [PATCH 05/18] staging:iio:hmc5843: Use INFO_SAMP_FREQ Peter Meerwald
2013-09-03  1:05 ` [PATCH 06/18] staging:iio:hmc5843: Remove unused LSB register #defines Peter Meerwald
2013-09-03  1:05 ` [PATCH 07/18] staging:iio:hmc5843: Tighten comments Peter Meerwald
2013-09-03  1:05 ` [PATCH 08/18] staging:iio:hmc5843: Introduce helper functions to show/check list of int pairs Peter Meerwald
2013-09-03  1:05 ` [PATCH 09/18] staging:iio:hmc5843: Use CALIBSCALE instead of magn_range Peter Meerwald
2013-09-12 21:07   ` Jonathan Cameron
2013-09-03  1:05 ` [PATCH 10/18] staging:iio:hmc5843: Always read all channels values otherwise no updates Peter Meerwald
2013-09-03  1:05 ` [PATCH 11/18] staging:iio:hmc5843: Add trigger handling Peter Meerwald
2013-09-12 22:01   ` Jonathan Cameron
2013-09-03  1:05 ` [PATCH 12/18] staging:iio:hmc5843: Fix format of MODULE_AUTHOR's email Peter Meerwald
2013-09-03  1:05 ` [PATCH 13/18] staging:iio:hmc5843: Remove ability to change operating mode Peter Meerwald
2013-09-03  1:05 ` [PATCH 14/18] staging:iio:hmc5843: Rename _configure() to _set_mode() Peter Meerwald
2013-09-03  1:05 ` [PATCH 15/18] staging:iio:hmc5843: Reorganize _set_meas_conf() Peter Meerwald
2013-09-03  1:05 ` [PATCH 16/18] staging:iio:hmc5843: Rename _set_rate() to _set_samp_freq() Peter Meerwald
2013-09-03  1:05 ` [PATCH 17/18] staging:iio:hmc5843: Introduce _set_range_gain() Peter Meerwald
2013-09-03  1:05 ` [PATCH 18/18] staging:iio:hmc5843: Check initialization and chip identifier Peter Meerwald

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.