Skip to content

Commit

Permalink
rtc: ds1685: Fix bank switching to avoid endless loop
Browse files Browse the repository at this point in the history
ds1685_rtc_begin_data_access() tried to access an extended register before
enabling access to it by switching to bank 1. Depending on content in NVRAM
this could lead to an endless loop. While at it fix also switch back to
bank 0 in ds1685_rtc_end_data_access().

Signed-off-by: Thomas Bogendoerfer <[email protected]>
Signed-off-by: Alexandre Belloni <[email protected]>
Acked-by: Joshua Kinard <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
  • Loading branch information
tsbogend authored and alexandrebelloni committed Sep 15, 2020
1 parent d0a3b65 commit 9f8010e
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions drivers/rtc/rtc-ds1685.c
Original file line number Diff line number Diff line change
Expand Up @@ -193,12 +193,12 @@ ds1685_rtc_begin_data_access(struct ds1685_priv *rtc)
rtc->write(rtc, RTC_CTRL_B,
(rtc->read(rtc, RTC_CTRL_B) | RTC_CTRL_B_SET));

/* Switch to Bank 1 */
ds1685_rtc_switch_to_bank1(rtc);

/* Read Ext Ctrl 4A and check the INCR bit to avoid a lockout. */
while (rtc->read(rtc, RTC_EXT_CTRL_4A) & RTC_CTRL_4A_INCR)
cpu_relax();

/* Switch to Bank 1 */
ds1685_rtc_switch_to_bank1(rtc);
}

/**
Expand All @@ -213,7 +213,7 @@ static inline void
ds1685_rtc_end_data_access(struct ds1685_priv *rtc)
{
/* Switch back to Bank 0 */
ds1685_rtc_switch_to_bank1(rtc);
ds1685_rtc_switch_to_bank0(rtc);

/* Clear the SET bit in Ctrl B */
rtc->write(rtc, RTC_CTRL_B,
Expand Down

0 comments on commit 9f8010e

Please sign in to comment.