Skip to content

Commit

Permalink
staging:iio:hmc5843: Implement timeout in read function
Browse files Browse the repository at this point in the history
avoid polling data ready bit forever; msleep() may be too long
for high sampling frequencies but the driver interface does not
support buffering

Signed-off-by: Peter Meerwald <pmeerw@pmeerw.net>
Cc: Shubhrajyoti Datta <shubhrajyoti@ti.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
  • Loading branch information
Peter Meerwald authored and Jonathan Cameron committed Aug 4, 2013
1 parent a34778f commit 4dedf31
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions drivers/staging/iio/magnetometer/hmc5843.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <linux/types.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/delay.h>

#define HMC5843_CONFIG_REG_A 0x00
#define HMC5843_CONFIG_REG_B 0x01
Expand Down Expand Up @@ -210,11 +211,22 @@ static int hmc5843_read_measurement(struct iio_dev *indio_dev,
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);
result = i2c_smbus_read_byte_data(client, HMC5843_STATUS_REG);
while (!(result & HMC5843_DATA_READY))
result = i2c_smbus_read_byte_data(client, HMC5843_STATUS_REG);
while (tries-- > 0) {
result = i2c_smbus_read_byte_data(client,
HMC5843_STATUS_REG);
if (result & HMC5843_DATA_READY)
break;
msleep(20);
}

if (tries < 0) {
dev_err(&client->dev, "data not ready\n");
mutex_unlock(&data->lock);
return -EIO;
}

result = i2c_smbus_read_word_data(client, address);
mutex_unlock(&data->lock);
Expand Down

0 comments on commit 4dedf31

Please sign in to comment.