On 07/27/13 16:31, Peter Meerwald wrote: > 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@xxxxxxxxxx> > Cc: Shubhrajyoti Datta <shubhrajyoti@xxxxxx> Applied to the togreg branch of iio.git. Thanks > --- > drivers/staging/iio/magnetometer/hmc5843.c | 18 +++++++++++++++--- > 1 file changed, 15 insertions(+), 3 deletions(-) > > diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c > index c281342..79117ad 100644 > --- a/drivers/staging/iio/magnetometer/hmc5843.c > +++ b/drivers/staging/iio/magnetometer/hmc5843.c > @@ -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 > @@ -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); > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html