All of lore.kernel.org
 help / color / mirror / Atom feed
* [RESEND PATCH v3] drivers: thermal: tsens: add timeout to get_temp_tsens_valid
@ 2021-10-07 17:28 Ansuel Smith
  2021-10-07 20:08 ` Bjorn Andersson
  2021-10-18 11:45 ` [thermal: thermal/next] thermal/drivers/tsens: Add " thermal-bot for Ansuel Smith
  0 siblings, 2 replies; 3+ messages in thread
From: Ansuel Smith @ 2021-10-07 17:28 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Amit Kucheria, Thara Gopinath,
	Zhang Rui, Daniel Lezcano, linux-arm-msm, linux-pm, linux-kernel
  Cc: Ansuel Smith

The function can loop and lock the system if for whatever reason the bit
for the target sensor is NEVER valid. This is the case if a sensor is
disabled by the factory and the valid bit is never reported as actually
valid. Add a timeout check and exit if a timeout occurs. As this is
a very rare condition, handle the timeout only if the first read fails.
While at it also rework the function to improve readability and convert
to poll_timeout generic macro.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
 drivers/thermal/qcom/tsens.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
index b1162e566a70..99a8d9f3e03c 100644
--- a/drivers/thermal/qcom/tsens.c
+++ b/drivers/thermal/qcom/tsens.c
@@ -603,22 +603,21 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
 	int ret;
 
 	/* VER_0 doesn't have VALID bit */
-	if (tsens_version(priv) >= VER_0_1) {
-		ret = regmap_field_read(priv->rf[valid_idx], &valid);
-		if (ret)
-			return ret;
-		while (!valid) {
-			/* Valid bit is 0 for 6 AHB clock cycles.
-			 * At 19.2MHz, 1 AHB clock is ~60ns.
-			 * We should enter this loop very, very rarely.
-			 */
-			ndelay(400);
-			ret = regmap_field_read(priv->rf[valid_idx], &valid);
-			if (ret)
-				return ret;
-		}
-	}
+	if (tsens_version(priv) == VER_0)
+		goto get_temp;
+
+	/* Valid bit is 0 for 6 AHB clock cycles.
+	 * At 19.2MHz, 1 AHB clock is ~60ns.
+	 * We should enter this loop very, very rarely.
+	 * Wait 1 us since it's the min of poll_timeout macro.
+	 * Old value was 400 ns.
+	 */
+	ret = regmap_field_read_poll_timeout(priv->rf[valid_idx], valid,
+					     valid, 1, 20 * USEC_PER_MSEC);
+	if (ret)
+		return ret;
 
+get_temp:
 	/* Valid bit is set, OK to read the temperature */
 	*temp = tsens_hw_to_mC(s, temp_idx);
 
-- 
2.32.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [RESEND PATCH v3] drivers: thermal: tsens: add timeout to get_temp_tsens_valid
  2021-10-07 17:28 [RESEND PATCH v3] drivers: thermal: tsens: add timeout to get_temp_tsens_valid Ansuel Smith
@ 2021-10-07 20:08 ` Bjorn Andersson
  2021-10-18 11:45 ` [thermal: thermal/next] thermal/drivers/tsens: Add " thermal-bot for Ansuel Smith
  1 sibling, 0 replies; 3+ messages in thread
From: Bjorn Andersson @ 2021-10-07 20:08 UTC (permalink / raw)
  To: Ansuel Smith
  Cc: Andy Gross, Amit Kucheria, Thara Gopinath, Zhang Rui,
	Daniel Lezcano, linux-arm-msm, linux-pm, linux-kernel

On Thu 07 Oct 10:28 PDT 2021, Ansuel Smith wrote:

> The function can loop and lock the system if for whatever reason the bit
> for the target sensor is NEVER valid. This is the case if a sensor is
> disabled by the factory and the valid bit is never reported as actually
> valid. Add a timeout check and exit if a timeout occurs. As this is
> a very rare condition, handle the timeout only if the first read fails.
> While at it also rework the function to improve readability and convert
> to poll_timeout generic macro.
> 

Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>

Regards,
Bjorn

> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> ---
>  drivers/thermal/qcom/tsens.c | 29 ++++++++++++++---------------
>  1 file changed, 14 insertions(+), 15 deletions(-)
> 
> diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
> index b1162e566a70..99a8d9f3e03c 100644
> --- a/drivers/thermal/qcom/tsens.c
> +++ b/drivers/thermal/qcom/tsens.c
> @@ -603,22 +603,21 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
>  	int ret;
>  
>  	/* VER_0 doesn't have VALID bit */
> -	if (tsens_version(priv) >= VER_0_1) {
> -		ret = regmap_field_read(priv->rf[valid_idx], &valid);
> -		if (ret)
> -			return ret;
> -		while (!valid) {
> -			/* Valid bit is 0 for 6 AHB clock cycles.
> -			 * At 19.2MHz, 1 AHB clock is ~60ns.
> -			 * We should enter this loop very, very rarely.
> -			 */
> -			ndelay(400);
> -			ret = regmap_field_read(priv->rf[valid_idx], &valid);
> -			if (ret)
> -				return ret;
> -		}
> -	}
> +	if (tsens_version(priv) == VER_0)
> +		goto get_temp;
> +
> +	/* Valid bit is 0 for 6 AHB clock cycles.
> +	 * At 19.2MHz, 1 AHB clock is ~60ns.
> +	 * We should enter this loop very, very rarely.
> +	 * Wait 1 us since it's the min of poll_timeout macro.
> +	 * Old value was 400 ns.
> +	 */
> +	ret = regmap_field_read_poll_timeout(priv->rf[valid_idx], valid,
> +					     valid, 1, 20 * USEC_PER_MSEC);
> +	if (ret)
> +		return ret;
>  
> +get_temp:
>  	/* Valid bit is set, OK to read the temperature */
>  	*temp = tsens_hw_to_mC(s, temp_idx);
>  
> -- 
> 2.32.0
> 

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [thermal: thermal/next] thermal/drivers/tsens: Add timeout to get_temp_tsens_valid
  2021-10-07 17:28 [RESEND PATCH v3] drivers: thermal: tsens: add timeout to get_temp_tsens_valid Ansuel Smith
  2021-10-07 20:08 ` Bjorn Andersson
@ 2021-10-18 11:45 ` thermal-bot for Ansuel Smith
  1 sibling, 0 replies; 3+ messages in thread
From: thermal-bot for Ansuel Smith @ 2021-10-18 11:45 UTC (permalink / raw)
  To: linux-pm; +Cc: Ansuel Smith, Bjorn Andersson, Daniel Lezcano, rui.zhang, amitk

The following commit has been merged into the thermal/next branch of thermal:

Commit-ID:     d012f9189fda0f3a1b303780ba0bbc7298d0d349
Gitweb:        https://git.kernel.org/pub/scm/linux/kernel/git/thermal/linux.git//d012f9189fda0f3a1b303780ba0bbc7298d0d349
Author:        Ansuel Smith <ansuelsmth@gmail.com>
AuthorDate:    Thu, 07 Oct 2021 19:28:59 +02:00
Committer:     Daniel Lezcano <daniel.lezcano@linaro.org>
CommitterDate: Sat, 16 Oct 2021 20:24:43 +02:00

thermal/drivers/tsens: Add timeout to get_temp_tsens_valid

The function can loop and lock the system if for whatever reason the bit
for the target sensor is NEVER valid. This is the case if a sensor is
disabled by the factory and the valid bit is never reported as actually
valid. Add a timeout check and exit if a timeout occurs. As this is
a very rare condition, handle the timeout only if the first read fails.
While at it also rework the function to improve readability and convert
to poll_timeout generic macro.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20211007172859.583-1-ansuelsmth@gmail.com
Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
---
 drivers/thermal/qcom/tsens.c | 29 ++++++++++++++---------------
 1 file changed, 14 insertions(+), 15 deletions(-)

diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
index b1162e5..99a8d9f 100644
--- a/drivers/thermal/qcom/tsens.c
+++ b/drivers/thermal/qcom/tsens.c
@@ -603,22 +603,21 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
 	int ret;
 
 	/* VER_0 doesn't have VALID bit */
-	if (tsens_version(priv) >= VER_0_1) {
-		ret = regmap_field_read(priv->rf[valid_idx], &valid);
-		if (ret)
-			return ret;
-		while (!valid) {
-			/* Valid bit is 0 for 6 AHB clock cycles.
-			 * At 19.2MHz, 1 AHB clock is ~60ns.
-			 * We should enter this loop very, very rarely.
-			 */
-			ndelay(400);
-			ret = regmap_field_read(priv->rf[valid_idx], &valid);
-			if (ret)
-				return ret;
-		}
-	}
+	if (tsens_version(priv) == VER_0)
+		goto get_temp;
+
+	/* Valid bit is 0 for 6 AHB clock cycles.
+	 * At 19.2MHz, 1 AHB clock is ~60ns.
+	 * We should enter this loop very, very rarely.
+	 * Wait 1 us since it's the min of poll_timeout macro.
+	 * Old value was 400 ns.
+	 */
+	ret = regmap_field_read_poll_timeout(priv->rf[valid_idx], valid,
+					     valid, 1, 20 * USEC_PER_MSEC);
+	if (ret)
+		return ret;
 
+get_temp:
 	/* Valid bit is set, OK to read the temperature */
 	*temp = tsens_hw_to_mC(s, temp_idx);
 

^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-10-18 11:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-10-07 17:28 [RESEND PATCH v3] drivers: thermal: tsens: add timeout to get_temp_tsens_valid Ansuel Smith
2021-10-07 20:08 ` Bjorn Andersson
2021-10-18 11:45 ` [thermal: thermal/next] thermal/drivers/tsens: Add " thermal-bot for Ansuel Smith

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.