* [PATCH v2 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers
@ 2021-09-07 21:25 Ansuel Smith
2021-09-07 21:25 ` [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith
2021-09-17 9:08 ` [PATCH v2 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Daniel Lezcano
0 siblings, 2 replies; 6+ messages in thread
From: Ansuel Smith @ 2021-09-07 21:25 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, Matthias Kaehlcke
Some device can have some thermal sensor disabled from the factory. The
current 2 irq handler functions check all the sensor by default and the
check if the sensor was actually registered is wrong. The tzd is
actually never set if the registration fail hence the IS_ERR check is
wrong.
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
---
drivers/thermal/qcom/tsens.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
index 4c7ebd1d3f9c..b1162e566a70 100644
--- a/drivers/thermal/qcom/tsens.c
+++ b/drivers/thermal/qcom/tsens.c
@@ -417,7 +417,7 @@ static irqreturn_t tsens_critical_irq_thread(int irq, void *data)
const struct tsens_sensor *s = &priv->sensor[i];
u32 hw_id = s->hw_id;
- if (IS_ERR(s->tzd))
+ if (!s->tzd)
continue;
if (!tsens_threshold_violated(priv, hw_id, &d))
continue;
@@ -467,7 +467,7 @@ static irqreturn_t tsens_irq_thread(int irq, void *data)
const struct tsens_sensor *s = &priv->sensor[i];
u32 hw_id = s->hw_id;
- if (IS_ERR(s->tzd))
+ if (!s->tzd)
continue;
if (!tsens_threshold_violated(priv, hw_id, &d))
continue;
--
2.32.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid
2021-09-07 21:25 [PATCH v2 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Ansuel Smith
@ 2021-09-07 21:25 ` Ansuel Smith
2021-09-07 21:57 ` Matthias Kaehlcke
2021-09-17 9:08 ` Daniel Lezcano
2021-09-17 9:08 ` [PATCH v2 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Daniel Lezcano
1 sibling, 2 replies; 6+ messages in thread
From: Ansuel Smith @ 2021-09-07 21:25 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.
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
drivers/thermal/qcom/tsens.c | 40 +++++++++++++++++++++++-------------
1 file changed, 26 insertions(+), 14 deletions(-)
diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
index b1162e566a70..1ff244176beb 100644
--- a/drivers/thermal/qcom/tsens.c
+++ b/drivers/thermal/qcom/tsens.c
@@ -599,26 +599,38 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
int hw_id = s->hw_id;
u32 temp_idx = LAST_TEMP_0 + hw_id;
u32 valid_idx = VALID_0 + hw_id;
+ unsigned long timeout;
u32 valid;
int ret;
/* VER_0 doesn't have VALID bit */
- if (tsens_version(priv) >= VER_0_1) {
+ if (tsens_version(priv) == VER_0)
+ goto get_temp;
+
+ ret = regmap_field_read(priv->rf[valid_idx], &valid);
+ if (ret || valid)
+ goto check_valid;
+
+ timeout = jiffies + msecs_to_jiffies(20);
+ do {
+ /* 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;
- 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 (ret || valid)
+ goto check_valid;
+ } while (time_before(jiffies, timeout));
+
+ return -ETIMEDOUT;
+
+check_valid:
+ /* Check ret of valid bit read */
+ 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] 6+ messages in thread
* Re: [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid
2021-09-07 21:25 ` [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith
@ 2021-09-07 21:57 ` Matthias Kaehlcke
2021-09-17 9:08 ` Daniel Lezcano
1 sibling, 0 replies; 6+ messages in thread
From: Matthias Kaehlcke @ 2021-09-07 21:57 UTC (permalink / raw)
To: Ansuel Smith
Cc: Andy Gross, Bjorn Andersson, Amit Kucheria, Thara Gopinath,
Zhang Rui, Daniel Lezcano, linux-arm-msm, linux-pm, linux-kernel
On Tue, Sep 07, 2021 at 11:25:43PM +0200, 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.
>
> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> ---
> drivers/thermal/qcom/tsens.c | 40 +++++++++++++++++++++++-------------
> 1 file changed, 26 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
> index b1162e566a70..1ff244176beb 100644
> --- a/drivers/thermal/qcom/tsens.c
> +++ b/drivers/thermal/qcom/tsens.c
> @@ -599,26 +599,38 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
> int hw_id = s->hw_id;
> u32 temp_idx = LAST_TEMP_0 + hw_id;
> u32 valid_idx = VALID_0 + hw_id;
> + unsigned long timeout;
> u32 valid;
> int ret;
>
> /* VER_0 doesn't have VALID bit */
> - if (tsens_version(priv) >= VER_0_1) {
> + if (tsens_version(priv) == VER_0)
> + goto get_temp;
> +
> + ret = regmap_field_read(priv->rf[valid_idx], &valid);
> + if (ret || valid)
> + goto check_valid;
> +
> + timeout = jiffies + msecs_to_jiffies(20);
> + do {
> + /* 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;
> - 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 (ret || valid)
> + goto check_valid;
> + } while (time_before(jiffies, timeout));
> +
> + return -ETIMEDOUT;
> +
> +check_valid:
> + /* Check ret of valid bit read */
> + if (ret)
> + return ret;
>
> +get_temp:
> /* Valid bit is set, OK to read the temperature */
> *temp = tsens_hw_to_mC(s, temp_idx);
I still think that something like this would be clearer than the
multiple jumps to 'check_valid':
ret = regmap_field_read(priv->rf[valid_idx], &valid);
if (ret)
return ret;
timeout = jiffies + msecs_to_jiffies(20);
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 (time_after(jiffies, timeout))
return -ETIMEDOUT;
};
That said, I'm just a random dude, so my opinion isn't really important,
as long as the maintainers are happy with the change :)
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid
2021-09-07 21:25 ` [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith
2021-09-07 21:57 ` Matthias Kaehlcke
@ 2021-09-17 9:08 ` Daniel Lezcano
2021-09-17 11:06 ` Ansuel Smith
1 sibling, 1 reply; 6+ messages in thread
From: Daniel Lezcano @ 2021-09-17 9:08 UTC (permalink / raw)
To: Ansuel Smith, Andy Gross, Bjorn Andersson, Amit Kucheria,
Thara Gopinath, Zhang Rui, linux-arm-msm, linux-pm, linux-kernel
On 07/09/2021 23:25, 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.
>
> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> ---
> drivers/thermal/qcom/tsens.c | 40 +++++++++++++++++++++++-------------
> 1 file changed, 26 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
> index b1162e566a70..1ff244176beb 100644
> --- a/drivers/thermal/qcom/tsens.c
> +++ b/drivers/thermal/qcom/tsens.c
> @@ -599,26 +599,38 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
> int hw_id = s->hw_id;
> u32 temp_idx = LAST_TEMP_0 + hw_id;
> u32 valid_idx = VALID_0 + hw_id;
> + unsigned long timeout;
> u32 valid;
> int ret;
>
> /* VER_0 doesn't have VALID bit */
> - if (tsens_version(priv) >= VER_0_1) {
> + if (tsens_version(priv) == VER_0)
> + goto get_temp;
> +
> + ret = regmap_field_read(priv->rf[valid_idx], &valid);
> + if (ret || valid)
> + goto check_valid;
> +
> + timeout = jiffies + msecs_to_jiffies(20);
Why not use regmap_field_read_poll_timeout() ?
> + do {
> + /* 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;
> - 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 (ret || valid)
> + goto check_valid;
> + } while (time_before(jiffies, timeout));
> +
> + return -ETIMEDOUT;
> +
> +check_valid:
> + /* Check ret of valid bit read */
> + if (ret)
> + return ret;
>
> +get_temp:
> /* Valid bit is set, OK to read the temperature */
> *temp = tsens_hw_to_mC(s, temp_idx);
>
>
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers
2021-09-07 21:25 [PATCH v2 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Ansuel Smith
2021-09-07 21:25 ` [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith
@ 2021-09-17 9:08 ` Daniel Lezcano
1 sibling, 0 replies; 6+ messages in thread
From: Daniel Lezcano @ 2021-09-17 9:08 UTC (permalink / raw)
To: Ansuel Smith, Andy Gross, Bjorn Andersson, Amit Kucheria,
Thara Gopinath, Zhang Rui, linux-arm-msm, linux-pm, linux-kernel
Cc: Matthias Kaehlcke
Applied, thanks
On 07/09/2021 23:25, Ansuel Smith wrote:
> Some device can have some thermal sensor disabled from the factory. The
> current 2 irq handler functions check all the sensor by default and the
> check if the sensor was actually registered is wrong. The tzd is
> actually never set if the registration fail hence the IS_ERR check is
> wrong.
>
> Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> Reviewed-by: Matthias Kaehlcke <mka@chromium.org>
> ---
> drivers/thermal/qcom/tsens.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
> index 4c7ebd1d3f9c..b1162e566a70 100644
> --- a/drivers/thermal/qcom/tsens.c
> +++ b/drivers/thermal/qcom/tsens.c
> @@ -417,7 +417,7 @@ static irqreturn_t tsens_critical_irq_thread(int irq, void *data)
> const struct tsens_sensor *s = &priv->sensor[i];
> u32 hw_id = s->hw_id;
>
> - if (IS_ERR(s->tzd))
> + if (!s->tzd)
> continue;
> if (!tsens_threshold_violated(priv, hw_id, &d))
> continue;
> @@ -467,7 +467,7 @@ static irqreturn_t tsens_irq_thread(int irq, void *data)
> const struct tsens_sensor *s = &priv->sensor[i];
> u32 hw_id = s->hw_id;
>
> - if (IS_ERR(s->tzd))
> + if (!s->tzd)
> continue;
> if (!tsens_threshold_violated(priv, hw_id, &d))
> continue;
>
--
<http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
<http://twitter.com/#!/linaroorg> Twitter |
<http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid
2021-09-17 9:08 ` Daniel Lezcano
@ 2021-09-17 11:06 ` Ansuel Smith
0 siblings, 0 replies; 6+ messages in thread
From: Ansuel Smith @ 2021-09-17 11:06 UTC (permalink / raw)
To: Daniel Lezcano
Cc: Andy Gross, Bjorn Andersson, Amit Kucheria, Thara Gopinath,
Zhang Rui, linux-arm-msm, linux-pm, linux-kernel
On Fri, Sep 17, 2021 at 11:08:15AM +0200, Daniel Lezcano wrote:
> On 07/09/2021 23:25, 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.
> >
> > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
> > ---
> > drivers/thermal/qcom/tsens.c | 40 +++++++++++++++++++++++-------------
> > 1 file changed, 26 insertions(+), 14 deletions(-)
> >
> > diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c
> > index b1162e566a70..1ff244176beb 100644
> > --- a/drivers/thermal/qcom/tsens.c
> > +++ b/drivers/thermal/qcom/tsens.c
> > @@ -599,26 +599,38 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp)
> > int hw_id = s->hw_id;
> > u32 temp_idx = LAST_TEMP_0 + hw_id;
> > u32 valid_idx = VALID_0 + hw_id;
> > + unsigned long timeout;
> > u32 valid;
> > int ret;
> >
> > /* VER_0 doesn't have VALID bit */
> > - if (tsens_version(priv) >= VER_0_1) {
> > + if (tsens_version(priv) == VER_0)
> > + goto get_temp;
> > +
> > + ret = regmap_field_read(priv->rf[valid_idx], &valid);
> > + if (ret || valid)
> > + goto check_valid;
> > +
> > + timeout = jiffies + msecs_to_jiffies(20);
>
> Why not use regmap_field_read_poll_timeout() ?
>
Ok will convert this to pool_timeout and send v3.
Thx for the review.
> > + do {
> > + /* 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;
> > - 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 (ret || valid)
> > + goto check_valid;
> > + } while (time_before(jiffies, timeout));
> > +
> > + return -ETIMEDOUT;
> > +
> > +check_valid:
> > + /* Check ret of valid bit read */
> > + if (ret)
> > + return ret;
> >
> > +get_temp:
> > /* Valid bit is set, OK to read the temperature */
> > *temp = tsens_hw_to_mC(s, temp_idx);
> >
> >
>
>
> --
> <http://www.linaro.org/> Linaro.org │ Open source software for ARM SoCs
>
> Follow Linaro: <http://www.facebook.com/pages/Linaro> Facebook |
> <http://twitter.com/#!/linaroorg> Twitter |
> <http://www.linaro.org/linaro-blog/> Blog
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-09-17 11:06 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-07 21:25 [PATCH v2 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Ansuel Smith
2021-09-07 21:25 ` [PATCH v2 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith
2021-09-07 21:57 ` Matthias Kaehlcke
2021-09-17 9:08 ` Daniel Lezcano
2021-09-17 11:06 ` Ansuel Smith
2021-09-17 9:08 ` [PATCH v2 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Daniel Lezcano
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.