• Arnaud Ebalard's avatar
    drivers/rtc/rtc-isl12057.c: add alarm support to Intersil ISL12057 RTC driver · fd71493d
    Arnaud Ebalard authored
    This patch adds alarm support to Intersil ISL12057 driver.  This allows to
    configure the chip to generate an interrupt when the alarm matches current
    time value.  Alarm can be programmed up to one month in the future and is
    accurate to the second.
    
    The patch was developed to support two different configurations: systems
    w/ and w/o RTC chip IRQ line connected to the main CPU.
    
    The latter is the one found on current 3 kernel users of the chip for
    which support was initially developed (Netgear ReadyNAS 102, 104 and 2120
    NAS).  On those devices, the IRQ#2 pin of the chip is not connected to the
    SoC but to a PMIC.  This allows setting an alarm, powering off the device
    and have it wake up when the alarm rings.  To support that configuration
    the driver does the following:
    
     1. it has alarm_irq_enable() function returns -ENOTTY when no IRQ
        is passed to the driver.
     2. it marks the device as a wakeup source in all cases (whether an
        IRQ is passed to the driver or not) to have 'wakealarm' sysfs
        entry created.
     3. it marks the device has not supporting UIE mode when no IRQ is
        passed to the driver (see the commmit message of c9f5c7e7)
    
    This specific configuration was tested on a ReadyNAS 102 by setting an
    alarm, powering off the device and see it reboot as expected when the
    alarm rang.
    
    The former configuration was tested on a Netgear ReadyNAS 102 after some
    soldering of the IRQ#2 pin of the RTC chip to a MPP line of the SoC (the
    one used usually handles the reset button).  The test was performed using
    a modified .dts file reflecting this change (see below) and rtc-test.c
    program available in Documentation/rtc.txt.  This test program ran as
    expected, which validates alarm supports, including interrupt support.
    
    As a side note, the ISL12057 remains in the list of trivial devices, i.e.
    no specific DT binding being added by this patch: i2c core automatically
    handles extraction of IRQ line info from .dts file.  For instance, if one
    wants to reference the interrupt line for the alarm in its .dts file,
    adding interrupt and interrupt-parent properties works as expected:
    
              isl12057: isl12057@68 {
                      compatible =3D "isil,isl12057";
                      interrupt-parent =3D <&gpio0>;
                      interrupts =3D <6 IRQ_TYPE_EDGE_FALLING>;
                      reg =3D <0x68>;
              };
    
    FWIW, if someone is looking for a way to test alarm support on a system on
    which the chip IRQ line has the ability to boot the system (e.g.  ReadyNAS
    102, 104, etc):
    
        # echo 0 > /sys/class/rtc/rtc0/wakealarm
        # echo `date '+%s' -d '+ 1 minutes'` > /sys/class/rtc/rtc0/wakealarm
        # shutdown -h now
    
    With the commands above, after a minute, the system comes back to life.
    Signed-off-by: default avatarArnaud Ebalard <arno@natisbad.org>
    Cc: Mark Rutland <mark.rutland@arm.com>
    Cc: Alessandro Zummo <a.zummo@towertech.it>
    Cc: Peter Huewe <peter.huewe@infineon.com>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Cc: Thierry Reding <treding@nvidia.com>
    Cc: Mark Brown <broonie@kernel.org>
    Cc: Grant Likely <grant.likely@linaro.org>
    Cc: Uwe Kleine-König <uwe@kleine-koenig.org>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    fd71493d
rtc-isl12057.c 16.9 KB