lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 262/917] thermal/drivers/tsens: Add timeout to get_temp_tsens_valid
    Date
    From: Ansuel Smith <ansuelsmth@gmail.com>

    [ Upstream commit d012f9189fda0f3a1b303780ba0bbc7298d0d349 ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.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 b1162e566a707..99a8d9f3e03ca 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.33.0


    \
     
     \ /
      Last update: 2021-11-16 02:00    [W:2.130 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site