ARM: hwmod: RTC: Don't assume lock/unlock will be called with irq enabled
Subsystems (3)
PATCH 1/1 ARM: hwmod: RTC: Don't assume lock/unlock will be called with irq enabled
From: Dave Gerlach <[email protected]>
When the RTC lock and unlock functions were introduced it was likely assumed that they would always be called from irq enabled context, hence the use of local_irq_disable/enable. This is no longer true as the RTC+DDR path makes a late call during the suspend path after irqs have been disabled to enable the RTC hwmod which calls both unlock and lock, leading to IRQs being reenabled through the local_irq_enable call in omap_hwmod_rtc_lock call.
To avoid this change the local_irq_disable/enable to local_irq_save/restore to ensure that from whatever context this is called the proper IRQ configuration is maintained.
--- arch/arm/mach-omap2/omap_hwmod_reset.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
arch/arm/mach-omap2/omap_hwmod_reset.c +8 -4
@@ -92,11 +92,13 @@ static void omap_rtc_wait_not_busy(struct omap_hwmod *oh)*/ void omap_hwmod_rtc_unlock (struct omap_hwmod *oh) { -local_irq_disable (); +unsigned long flags; + +local_irq_save (flags);omap_rtc_wait_not_busy (oh);omap_hwmod_write (OMAP_RTC_KICK0_VALUE , oh,OMAP_RTC_KICK0_REG );omap_hwmod_write (OMAP_RTC_KICK1_VALUE , oh,OMAP_RTC_KICK1_REG ); -local_irq_enable (); +local_irq_restore (flags); }/**
@@ -110,9 +112,11 @@ void omap_hwmod_rtc_unlock(struct omap_hwmod *oh)*/ void omap_hwmod_rtc_lock (struct omap_hwmod *oh) { -local_irq_disable (); +unsigned long flags; + +local_irq_save (flags);omap_rtc_wait_not_busy (oh);omap_hwmod_write (0x0 , oh,OMAP_RTC_KICK0_REG );omap_hwmod_write (0x0 , oh,OMAP_RTC_KICK1_REG ); -local_irq_enable (); +local_irq_restore (flags); }
Signature · 1 line
1.9.1
Tony Lindgren
maintainerPATCH 1/1 ARM: hwmod: RTC: Don't assume lock/unlock will be called with irq enabled
Quoted 10 lines · Keerthy
From: Dave Gerlach <[email protected]>
When the RTC lock and unlock functions were introduced it was likely assumed that they would always be called from irq enabled context, hence the use of local_irq_disable/enable. This is no longer true as the RTC+DDR path makes a late call during the suspend path after irqs have been disabled to enable the RTC hwmod which calls both unlock and lock, leading to IRQs being reenabled through the
local_irq_enablecall inomap_hwmod_rtc_lockcall.
Quoted 3 lines
To avoid this change the local_irq_disable/enable to local_irq_save/restore to ensure that from whatever context this is called the proper IRQ configuration is maintained.
Thanks applying into omap-for-v4.19/soc.
Tony