2019-09-29 10:02:40

by Axel Lin

[permalink] [raw]
Subject: [PATCH] regulator: ti-abb: Fix timeout in ti_abb_wait_txdone/ti_abb_clear_all_txdone

ti_abb_wait_txdone() may return -ETIMEDOUT when ti_abb_check_txdone()
returns true in the latest iteration of the while loop because the timeout
value is abb->settling_time + 1. Similarly, ti_abb_clear_all_txdone() may
return -ETIMEDOUT when ti_abb_check_txdone() returns false in the latest
iteration of the while loop. Fix it.

Signed-off-by: Axel Lin <[email protected]>
---
drivers/regulator/ti-abb-regulator.c | 26 ++++++++------------------
1 file changed, 8 insertions(+), 18 deletions(-)

diff --git a/drivers/regulator/ti-abb-regulator.c b/drivers/regulator/ti-abb-regulator.c
index cced1ffb896c..89b9314d64c9 100644
--- a/drivers/regulator/ti-abb-regulator.c
+++ b/drivers/regulator/ti-abb-regulator.c
@@ -173,19 +173,14 @@ static int ti_abb_wait_txdone(struct device *dev, struct ti_abb *abb)
while (timeout++ <= abb->settling_time) {
status = ti_abb_check_txdone(abb);
if (status)
- break;
+ return 0;

udelay(1);
}

- if (timeout > abb->settling_time) {
- dev_warn_ratelimited(dev,
- "%s:TRANXDONE timeout(%duS) int=0x%08x\n",
- __func__, timeout, readl(abb->int_base));
- return -ETIMEDOUT;
- }
-
- return 0;
+ dev_warn_ratelimited(dev, "%s:TRANXDONE timeout(%duS) int=0x%08x\n",
+ __func__, timeout, readl(abb->int_base));
+ return -ETIMEDOUT;
}

/**
@@ -205,19 +200,14 @@ static int ti_abb_clear_all_txdone(struct device *dev, const struct ti_abb *abb)

status = ti_abb_check_txdone(abb);
if (!status)
- break;
+ return 0;

udelay(1);
}

- if (timeout > abb->settling_time) {
- dev_warn_ratelimited(dev,
- "%s:TRANXDONE timeout(%duS) int=0x%08x\n",
- __func__, timeout, readl(abb->int_base));
- return -ETIMEDOUT;
- }
-
- return 0;
+ dev_warn_ratelimited(dev, "%s:TRANXDONE timeout(%duS) int=0x%08x\n",
+ __func__, timeout, readl(abb->int_base));
+ return -ETIMEDOUT;
}

/**
--
2.20.1


2019-09-30 11:45:32

by Nishanth Menon

[permalink] [raw]
Subject: Re: [PATCH] regulator: ti-abb: Fix timeout in ti_abb_wait_txdone/ti_abb_clear_all_txdone

On 17:58-20190929, Axel Lin wrote:
> ti_abb_wait_txdone() may return -ETIMEDOUT when ti_abb_check_txdone()
> returns true in the latest iteration of the while loop because the timeout
> value is abb->settling_time + 1. Similarly, ti_abb_clear_all_txdone() may
> return -ETIMEDOUT when ti_abb_check_txdone() returns false in the latest
> iteration of the while loop. Fix it.
>
> Signed-off-by: Axel Lin <[email protected]>

Acked-by: Nishanth Menon <[email protected]>

Mark, if you could pick it up, will be great.

--
Regards,
Nishanth Menon