forked from Minki/linux
watchdog: sprd: check busy bit before new loading rather than after that
As the specification described, users must check busy bit before start
a new loading operation to make sure that the previous loading is done
and the device is ready to accept a new one.
[ chunyan: Massaged changelog ]
Fixes: 4776034670
("watchdog: Add Spreadtrum watchdog driver")
Signed-off-by: Lingling Xu <ling_ling.xu@unisoc.com>
Signed-off-by: Chunyan Zhang <chunyan.zhang@unisoc.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20201029023933.24548-3-zhang.lyra@gmail.com
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@linux-watchdog.org>
This commit is contained in:
parent
f61a59acb4
commit
3e07d24093
@ -108,18 +108,6 @@ static int sprd_wdt_load_value(struct sprd_wdt *wdt, u32 timeout,
|
||||
u32 tmr_step = timeout * SPRD_WDT_CNT_STEP;
|
||||
u32 prtmr_step = pretimeout * SPRD_WDT_CNT_STEP;
|
||||
|
||||
sprd_wdt_unlock(wdt->base);
|
||||
writel_relaxed((tmr_step >> SPRD_WDT_CNT_HIGH_SHIFT) &
|
||||
SPRD_WDT_LOW_VALUE_MASK, wdt->base + SPRD_WDT_LOAD_HIGH);
|
||||
writel_relaxed((tmr_step & SPRD_WDT_LOW_VALUE_MASK),
|
||||
wdt->base + SPRD_WDT_LOAD_LOW);
|
||||
writel_relaxed((prtmr_step >> SPRD_WDT_CNT_HIGH_SHIFT) &
|
||||
SPRD_WDT_LOW_VALUE_MASK,
|
||||
wdt->base + SPRD_WDT_IRQ_LOAD_HIGH);
|
||||
writel_relaxed(prtmr_step & SPRD_WDT_LOW_VALUE_MASK,
|
||||
wdt->base + SPRD_WDT_IRQ_LOAD_LOW);
|
||||
sprd_wdt_lock(wdt->base);
|
||||
|
||||
/*
|
||||
* Waiting the load value operation done,
|
||||
* it needs two or three RTC clock cycles.
|
||||
@ -134,6 +122,19 @@ static int sprd_wdt_load_value(struct sprd_wdt *wdt, u32 timeout,
|
||||
|
||||
if (delay_cnt >= SPRD_WDT_LOAD_TIMEOUT)
|
||||
return -EBUSY;
|
||||
|
||||
sprd_wdt_unlock(wdt->base);
|
||||
writel_relaxed((tmr_step >> SPRD_WDT_CNT_HIGH_SHIFT) &
|
||||
SPRD_WDT_LOW_VALUE_MASK, wdt->base + SPRD_WDT_LOAD_HIGH);
|
||||
writel_relaxed((tmr_step & SPRD_WDT_LOW_VALUE_MASK),
|
||||
wdt->base + SPRD_WDT_LOAD_LOW);
|
||||
writel_relaxed((prtmr_step >> SPRD_WDT_CNT_HIGH_SHIFT) &
|
||||
SPRD_WDT_LOW_VALUE_MASK,
|
||||
wdt->base + SPRD_WDT_IRQ_LOAD_HIGH);
|
||||
writel_relaxed(prtmr_step & SPRD_WDT_LOW_VALUE_MASK,
|
||||
wdt->base + SPRD_WDT_IRQ_LOAD_LOW);
|
||||
sprd_wdt_lock(wdt->base);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user