On 09/02/17 01:54, Brian Masney wrote: > When proximity is enabled in isl29028_enable_proximity(), the function > msleep() is called with the sampling frequency, which is not correct. > This patch changes the code to sleep the specified amount of time listed > in the datasheet instead. > > Signed-off-by: Brian Masney <masneyb@xxxxxxxxxxxxx> Seems sensible. Applied to the togreg branch of iio.git and pushed out as testing for the autobuilders to play with it. Thanks, Jonathan > --- > drivers/staging/iio/light/isl29028.c | 31 +++++++++++++++++++++---------- > 1 file changed, 21 insertions(+), 10 deletions(-) > > diff --git a/drivers/staging/iio/light/isl29028.c b/drivers/staging/iio/light/isl29028.c > index 8dc24c94..177dced 100644 > --- a/drivers/staging/iio/light/isl29028.c > +++ b/drivers/staging/iio/light/isl29028.c > @@ -63,6 +63,9 @@ > > #define ISL29028_POWER_OFF_DELAY_MS 2000 > > +static const unsigned int isl29028_prox_sleep_time[] = {800, 400, 200, 100, 75, > + 50, 12, 0}; > + > enum isl29028_als_ir_mode { > ISL29028_MODE_NONE = 0, > ISL29028_MODE_ALS, > @@ -78,22 +81,29 @@ struct isl29028_chip { > enum isl29028_als_ir_mode als_ir_mode; > }; > > -static int isl29028_set_proxim_sampling(struct isl29028_chip *chip, > - unsigned int sampling) > +static int isl29028_find_prox_sleep_time_index(int sampling) > { > - struct device *dev = regmap_get_device(chip->regmap); > - static unsigned int prox_period[] = {800, 400, 200, 100, 75, 50, 12, 0}; > unsigned int period = DIV_ROUND_UP(1000, sampling); > - int sel, ret; > + int i; > > - for (sel = 0; sel < ARRAY_SIZE(prox_period); ++sel) { > - if (period >= prox_period[sel]) > + for (i = 0; i < ARRAY_SIZE(isl29028_prox_sleep_time); ++i) { > + if (period >= isl29028_prox_sleep_time[i]) > break; > } > > + return i; > +} > + > +static int isl29028_set_proxim_sampling(struct isl29028_chip *chip, > + unsigned int sampling) > +{ > + struct device *dev = regmap_get_device(chip->regmap); > + int sleep_index, ret; > + > + sleep_index = isl29028_find_prox_sleep_time_index(sampling); > ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE, > ISL29028_CONF_PROX_SLP_MASK, > - sel << ISL29028_CONF_PROX_SLP_SH); > + sleep_index << ISL29028_CONF_PROX_SLP_SH); > > if (ret < 0) { > dev_err(dev, "%s(): Error %d setting the proximity sampling\n", > @@ -108,7 +118,7 @@ static int isl29028_set_proxim_sampling(struct isl29028_chip *chip, > > static int isl29028_enable_proximity(struct isl29028_chip *chip) > { > - int ret; > + int sleep_index, ret; > > ret = isl29028_set_proxim_sampling(chip, chip->prox_sampling); > if (ret < 0) > @@ -121,7 +131,8 @@ static int isl29028_enable_proximity(struct isl29028_chip *chip) > return ret; > > /* Wait for conversion to be complete for first sample */ > - msleep(DIV_ROUND_UP(1000, chip->prox_sampling)); > + sleep_index = isl29028_find_prox_sleep_time_index(chip->prox_sampling); > + msleep(isl29028_prox_sleep_time[sleep_index]); > > return 0; > } > _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel