Commit 45e2852b authored by Brian Masney's avatar Brian Masney Committed by Jonathan Cameron

staging: iio: isl29028: fix incorrect sleep time when taking initial proximity reading

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: default avatarBrian Masney <masneyb@onstation.org>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 55bf851b
...@@ -63,6 +63,9 @@ ...@@ -63,6 +63,9 @@
#define ISL29028_POWER_OFF_DELAY_MS 2000 #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 { enum isl29028_als_ir_mode {
ISL29028_MODE_NONE = 0, ISL29028_MODE_NONE = 0,
ISL29028_MODE_ALS, ISL29028_MODE_ALS,
...@@ -78,22 +81,29 @@ struct isl29028_chip { ...@@ -78,22 +81,29 @@ struct isl29028_chip {
enum isl29028_als_ir_mode als_ir_mode; enum isl29028_als_ir_mode als_ir_mode;
}; };
static int isl29028_set_proxim_sampling(struct isl29028_chip *chip, static int isl29028_find_prox_sleep_time_index(int sampling)
unsigned 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); unsigned int period = DIV_ROUND_UP(1000, sampling);
int sel, ret; int i;
for (sel = 0; sel < ARRAY_SIZE(prox_period); ++sel) { for (i = 0; i < ARRAY_SIZE(isl29028_prox_sleep_time); ++i) {
if (period >= prox_period[sel]) if (period >= isl29028_prox_sleep_time[i])
break; 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, ret = regmap_update_bits(chip->regmap, ISL29028_REG_CONFIGURE,
ISL29028_CONF_PROX_SLP_MASK, ISL29028_CONF_PROX_SLP_MASK,
sel << ISL29028_CONF_PROX_SLP_SH); sleep_index << ISL29028_CONF_PROX_SLP_SH);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "%s(): Error %d setting the proximity sampling\n", 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, ...@@ -108,7 +118,7 @@ static int isl29028_set_proxim_sampling(struct isl29028_chip *chip,
static int isl29028_enable_proximity(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); ret = isl29028_set_proxim_sampling(chip, chip->prox_sampling);
if (ret < 0) if (ret < 0)
...@@ -121,7 +131,8 @@ static int isl29028_enable_proximity(struct isl29028_chip *chip) ...@@ -121,7 +131,8 @@ static int isl29028_enable_proximity(struct isl29028_chip *chip)
return ret; return ret;
/* Wait for conversion to be complete for first sample */ /* 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; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment