Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1577254 > unrolled thread

[PATCH 2/7] staging: iio: isl29028: fix incorrect sleep time when taking initial proximity reading

Started byBrian Masney <masneyb@onstation.org>
First post2017-02-09 03:00 +0100
Last post2017-02-11 10:50 +0100
Articles 2 — 2 participants

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 2/7] staging: iio: isl29028: fix incorrect sleep time when taking initial proximity reading Brian Masney <masneyb@onstation.org> - 2017-02-09 03:00 +0100
    Re: [PATCH 2/7] staging: iio: isl29028: fix incorrect sleep time when  taking initial proximity reading Jonathan Cameron <jic23@kernel.org> - 2017-02-11 10:50 +0100

#1577254 — [PATCH 2/7] staging: iio: isl29028: fix incorrect sleep time when taking initial proximity reading

FromBrian Masney <masneyb@onstation.org>
Date2017-02-09 03:00 +0100
Subject[PATCH 2/7] staging: iio: isl29028: fix incorrect sleep time when taking initial proximity reading
Message-ID<t8MbD-81G-1@gated-at.bofh.it>
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@onstation.org>
---
 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;
 }
-- 
2.9.3

[toc] | [next] | [standalone]


#1578971 — Re: [PATCH 2/7] staging: iio: isl29028: fix incorrect sleep time when taking initial proximity reading

FromJonathan Cameron <jic23@kernel.org>
Date2017-02-11 10:50 +0100
SubjectRe: [PATCH 2/7] staging: iio: isl29028: fix incorrect sleep time when taking initial proximity reading
Message-ID<t9Ctz-7ty-17@gated-at.bofh.it>
In reply to#1577254
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@onstation.org>
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;
>  }
> 

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web