mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 19:29:37 +00:00
watchdog: sprd: check busy bit before new loading rather than after that
[ Upstream commit3e07d24093
] 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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
4c8cffffc9
commit
4e091ff107
1 changed files with 13 additions and 12 deletions
|
@ -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 a new issue