* [PATCH 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers @ 2021-09-05 17:47 Ansuel Smith 2021-09-05 17:47 ` [PATCH 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith 2021-09-07 20:38 ` [PATCH 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Matthias Kaehlcke 0 siblings, 2 replies; 5+ messages in thread From: Ansuel Smith @ 2021-09-05 17:47 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 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> --- 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] 5+ messages in thread
* [PATCH 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid 2021-09-05 17:47 [PATCH 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Ansuel Smith @ 2021-09-05 17:47 ` Ansuel Smith 2021-09-07 20:55 ` Matthias Kaehlcke 2021-09-07 20:38 ` [PATCH 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Matthias Kaehlcke 1 sibling, 1 reply; 5+ messages in thread From: Ansuel Smith @ 2021-09-05 17:47 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. Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> --- drivers/thermal/qcom/tsens.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c index b1162e566a70..38afde1a599f 100644 --- a/drivers/thermal/qcom/tsens.c +++ b/drivers/thermal/qcom/tsens.c @@ -599,6 +599,7 @@ 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; @@ -607,13 +608,21 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp) 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 (!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 (valid || ret) + break; + } while (!(ret = time_after_eq(jiffies, timeout))); + if (ret) return ret; } -- 2.32.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid 2021-09-05 17:47 ` [PATCH 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith @ 2021-09-07 20:55 ` Matthias Kaehlcke 2021-09-07 21:24 ` Ansuel Smith 0 siblings, 1 reply; 5+ messages in thread From: Matthias Kaehlcke @ 2021-09-07 20:55 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 Sun, Sep 05, 2021 at 07:47:08PM +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. > > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> > --- > drivers/thermal/qcom/tsens.c | 23 ++++++++++++++++------- > 1 file changed, 16 insertions(+), 7 deletions(-) > > diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c > index b1162e566a70..38afde1a599f 100644 > --- a/drivers/thermal/qcom/tsens.c > +++ b/drivers/thermal/qcom/tsens.c > @@ -599,6 +599,7 @@ 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; > > @@ -607,13 +608,21 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp) > 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 (!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 (valid || ret) > + break; > + } while (!(ret = time_after_eq(jiffies, timeout))); > + > if (ret) > return ret; With the overloading of 'ret' the return logic is getting a bit more convoluted. Also the function should probably return -ETIMEDOUT or some other meaningful error if the bit is never valid. How about keeping the 'while (!valid)' condition, and adding if (time_after_eq(jiffies, timeout)) return -ETIMEDOUT; inside the loop? ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid 2021-09-07 20:55 ` Matthias Kaehlcke @ 2021-09-07 21:24 ` Ansuel Smith 0 siblings, 0 replies; 5+ messages in thread From: Ansuel Smith @ 2021-09-07 21:24 UTC (permalink / raw) To: Matthias Kaehlcke 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 01:55:03PM -0700, Matthias Kaehlcke wrote: > On Sun, Sep 05, 2021 at 07:47:08PM +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. > > > > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> > > --- > > drivers/thermal/qcom/tsens.c | 23 ++++++++++++++++------- > > 1 file changed, 16 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/thermal/qcom/tsens.c b/drivers/thermal/qcom/tsens.c > > index b1162e566a70..38afde1a599f 100644 > > --- a/drivers/thermal/qcom/tsens.c > > +++ b/drivers/thermal/qcom/tsens.c > > @@ -599,6 +599,7 @@ 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; > > > > @@ -607,13 +608,21 @@ int get_temp_tsens_valid(const struct tsens_sensor *s, int *temp) > > 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 (!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 (valid || ret) > > + break; > > + } while (!(ret = time_after_eq(jiffies, timeout))); > > + > > if (ret) > > return ret; > > With the overloading of 'ret' the return logic is getting a bit more > convoluted. Also the function should probably return -ETIMEDOUT or > some other meaningful error if the bit is never valid. > > How about keeping the 'while (!valid)' condition, and adding > > if (time_after_eq(jiffies, timeout)) > return -ETIMEDOUT; > > inside the loop? > I tried to refactor the code using some tag. Hope it's better that way and thanks for the review. Sending v2. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers 2021-09-05 17:47 [PATCH 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Ansuel Smith 2021-09-05 17:47 ` [PATCH 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith @ 2021-09-07 20:38 ` Matthias Kaehlcke 1 sibling, 0 replies; 5+ messages in thread From: Matthias Kaehlcke @ 2021-09-07 20:38 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 Sun, Sep 05, 2021 at 07:47:07PM +0200, 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. Indeed, tsens_register() doesn't assign ->tzd when the registration of the sensor fails. > Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> Reviewed-by: Matthias Kaehlcke <mka@chromium.org> ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-09-07 21:24 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-09-05 17:47 [PATCH 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Ansuel Smith 2021-09-05 17:47 ` [PATCH 2/2] drivers: thermal: tsens: add timeout to get_tem_tsens_valid Ansuel Smith 2021-09-07 20:55 ` Matthias Kaehlcke 2021-09-07 21:24 ` Ansuel Smith 2021-09-07 20:38 ` [PATCH 1/2] drivers: thermal: tsens: fix wrong check for tzd in irq handlers Matthias Kaehlcke
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).