• Nicolas Ferre's avatar
    drivers/rtc/rtc-at91rm9200.c: use a variable for storing IMR · 0ef1594c
    Nicolas Ferre authored
    On some revisions of AT91 SoCs, the RTC IMR register is not working.
    Instead of elaborating a workaround for that specific SoC or IP version,
    we simply use a software variable to store the Interrupt Mask Register
    and modify it for each enabling/disabling of an interrupt.  The overhead
    of this is negligible anyway.
    
    The interrupt mask register (IMR) for the RTC is broken on the AT91SAM9x5
    sub-family of SoCs (good overview of the members here:
    http://www.eewiki.net/display/linuxonarm/AT91SAM9x5 ).  The "user visible
    effect" is the RTC doesn't work.
    
    That sub-family is less than two years old and only has devicetree (DT)
    support and came online circa lk 3.7 .  The dust is yet to settle on the
    DT stuff at least for AT91 SoCs (translation: lots of stuff is still
    broken, so much that it is hard to know where to start).
    
    The fix in the patch is pretty simple: just shadow the silicon IMR
    register with a variable in the driver.  Some older SoCs (pre-DT) use the
    the rtc-at91rm9200 driver (e.g.  obviously the AT91RM9200) and they should
    not be impacted by the change.  There shouldn't be a large volume of
    interrupts associated with a RTC.
    Signed-off-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
    Reported-by: default avatarDouglas Gilbert <dgilbert@interlog.com>
    Cc: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
    Cc: Ludovic Desroches <ludovic.desroches@atmel.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    0ef1594c
rtc-at91rm9200.h 3.12 KB