rtc: ds1685: Fix bank switching to avoid endless loop
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 <tsbogend@alpha.franken.de> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com> Acked-by: Joshua Kinard <kumba@gentoo.org> Link: https://lore.kernel.org/r/20200910084124.138560-1-tsbogend@alpha.franken.de
This commit is contained in:
Родитель
d0a3b65052
Коммит
9f8010e71f
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче