• Michael Hamel's avatar
    rtc-x1205: Fix alarm set · 471d47e3
    Michael Hamel authored
    I have discovered that the current version of rtc-x1205.c does not work
    correctly when asked to set the alarm time by the RTC_WKALM_SET ioctl()
    call.  This happens because the alarm registers do not behave like the
    current-time registers.  They are non-volatile.  Two things go wrong:
    
    - the X1205 requires a 10 msec delay after any attempt to write to the
      non-volatile registers.  The x1205_set_datetime() routine does the write
      as 8 single-byte writes without any delay.  Only the first write
      succeeds.  The second is NAKed because the chip is busy.
    
    - the X1205 resets the RWEL bit after any write to the non-volatile
      registers.  This would lock out any further writes after the first even
      with a 10msec delay.
    
    I fix this by doing a single 8-byte write and then waiting 10msec for the
    chip to be ready.  A side effect of this change is that it will speed up
    x1205_rtc_set_time() which uses the same code.
    
    I have also implemented the 'enable' bit in the rtc_wkalm structure, which
    the existing driver does not attempt to do.  I have modified both
    x1205_rtc_set_alarm() to set the AL0E bit, and x1205_rtc_read_alarm() to
    return it.
    
    I have tested this patch on a LinkSys NSLU2 under OpenWRT, but on no other
    hardware.  On the NSLU2 the X1205 correctly asserts its IRQ pin when the
    alarm time matches the current time.
    
    [akpm@linux-foundation.org: clean up over-parenthesisation]
    Signed-off-by: default avatarMichael Hamel <mhamel@adi.co.nz>
    Signed-off-by: default avatarAlessandro Zummo <a.zummo@towertech.it>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    471d47e3
rtc-x1205.c 15.9 KB