aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-isl12057.c
diff options
context:
space:
mode:
authorArnaud Ebalard <arno@natisbad.org>2015-02-13 17:40:35 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-02-14 00:21:42 -0500
commit298ff0122ab19d253d3a8fea45a7227491beaf98 (patch)
tree9113b0b6e2076b97e6bd72025237571fc2a0c584 /drivers/rtc/rtc-isl12057.c
parentfd71493d67977a49e293c96f213006ec9e30c4c9 (diff)
rtc: rtc-isl12057: add isil,irq2-can-wakeup-machine property for in-tree users
Current in-tree users of ISL12057 RTC chip (NETGEAR ReadyNAS 102, 104 and 2120) do not have the IRQ#2 pin of the chip (associated w/ the Alarm1 mechanism) connected to their SoC, but to a PMIC (TPS65251 FWIW). This specific hardware configuration allows the NAS to wake up when the alarms rings. Recently introduced alarm support for ISL12057 relies on the provision of an "interrupts" property in system .dts file, which previous three users will never get. For that reason, alarm support on those devices is not function. To support this use case, this patch adds a new DT property for ISL12057 (isil,irq2-can-wakeup-machine) to indicate that the chip is capable of waking up the device using its IRQ#2 pin (even though it does not have its IRQ#2 pin connected directly to the SoC). 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 w/: # echo `date '+%s' -d '+ 1 minutes'` > /sys/class/rtc/rtc0/wakealarm # shutdown -h now As a side note, the ISL12057 remains in the list of trivial devices, because the property is not per se required by the device to work but can help handle system w/ specific requirements. In exchange, the new feature is described in details in a specific documentation file. Signed-off-by: Arnaud 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: Arnd Bergmann <arnd@arndb.de> Cc: Darshana Padmadas <darshanapadmadas@gmail.com> Cc: Rob Herring <rob.herring@calxeda.com> Cc: Pawel Moll <pawel.moll@arm.com> Cc: Stephen Warren <swarren@wwwdotorg.org> Cc: Ian Campbell <ijc+devicetree@hellion.org.uk> Cc: Grant Likely <grant.likely@linaro.org> Cc: Rob Landley <rob@landley.net> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Guenter Roeck <linux@roeck-us.net> Cc: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Cc: Kumar Gala <galak@codeaurora.org> Cc: Uwe Kleine-König <uwe@kleine-koenig.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc/rtc-isl12057.c')
-rw-r--r--drivers/rtc/rtc-isl12057.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/drivers/rtc/rtc-isl12057.c b/drivers/rtc/rtc-isl12057.c
index 3ec73ad7f2d8..bd76c5e35fa5 100644
--- a/drivers/rtc/rtc-isl12057.c
+++ b/drivers/rtc/rtc-isl12057.c
@@ -457,6 +457,40 @@ static int isl12057_check_rtc_status(struct device *dev, struct regmap *regmap)
457 return 0; 457 return 0;
458} 458}
459 459
460#ifdef CONFIG_OF
461/*
462 * One would expect the device to be marked as a wakeup source only
463 * when an IRQ pin of the RTC is routed to an interrupt line of the
464 * CPU. In practice, such an IRQ pin can be connected to a PMIC and
465 * this allows the device to be powered up when RTC alarm rings. This
466 * is for instance the case on ReadyNAS 102, 104 and 2120. On those
467 * devices with no IRQ driectly connected to the SoC, the RTC chip
468 * can be forced as a wakeup source by stating that explicitly in
469 * the device's .dts file using the "isil,irq2-can-wakeup-machine"
470 * boolean property. This will guarantee 'wakealarm' sysfs entry is
471 * available on the device.
472 *
473 * The function below returns 1, i.e. the capability of the chip to
474 * wakeup the device, based on IRQ availability or if the boolean
475 * property has been set in the .dts file. Otherwise, it returns 0.
476 */
477
478static bool isl12057_can_wakeup_machine(struct device *dev)
479{
480 struct isl12057_rtc_data *data = dev_get_drvdata(dev);
481
482 return (data->irq || of_property_read_bool(dev->of_node,
483 "isil,irq2-can-wakeup-machine"));
484}
485#else
486static bool isl12057_can_wakeup_machine(struct device *dev)
487{
488 struct isl12057_rtc_data *data = dev_get_drvdata(dev);
489
490 return !!data->irq;
491}
492#endif
493
460static int isl12057_rtc_alarm_irq_enable(struct device *dev, 494static int isl12057_rtc_alarm_irq_enable(struct device *dev,
461 unsigned int enable) 495 unsigned int enable)
462{ 496{
@@ -555,7 +589,8 @@ static int isl12057_probe(struct i2c_client *client,
555 client->irq, ret); 589 client->irq, ret);
556 } 590 }
557 591
558 device_init_wakeup(dev, !!data->irq); 592 if (isl12057_can_wakeup_machine(dev))
593 device_init_wakeup(dev, true);
559 594
560 data->rtc = devm_rtc_device_register(dev, DRV_NAME, &rtc_ops, 595 data->rtc = devm_rtc_device_register(dev, DRV_NAME, &rtc_ops,
561 THIS_MODULE); 596 THIS_MODULE);
@@ -576,9 +611,7 @@ err:
576 611
577static int isl12057_remove(struct i2c_client *client) 612static int isl12057_remove(struct i2c_client *client)
578{ 613{
579 struct isl12057_rtc_data *rtc_data = dev_get_drvdata(&client->dev); 614 if (isl12057_can_wakeup_machine(&client->dev))
580
581 if (rtc_data->irq)
582 device_init_wakeup(&client->dev, false); 615 device_init_wakeup(&client->dev, false);
583 616
584 return 0; 617 return 0;
@@ -589,7 +622,7 @@ static int isl12057_rtc_suspend(struct device *dev)
589{ 622{
590 struct isl12057_rtc_data *rtc_data = dev_get_drvdata(dev); 623 struct isl12057_rtc_data *rtc_data = dev_get_drvdata(dev);
591 624
592 if (device_may_wakeup(dev)) 625 if (rtc_data->irq && device_may_wakeup(dev))
593 return enable_irq_wake(rtc_data->irq); 626 return enable_irq_wake(rtc_data->irq);
594 627
595 return 0; 628 return 0;
@@ -599,7 +632,7 @@ static int isl12057_rtc_resume(struct device *dev)
599{ 632{
600 struct isl12057_rtc_data *rtc_data = dev_get_drvdata(dev); 633 struct isl12057_rtc_data *rtc_data = dev_get_drvdata(dev);
601 634
602 if (device_may_wakeup(dev)) 635 if (rtc_data->irq && device_may_wakeup(dev))
603 return disable_irq_wake(rtc_data->irq); 636 return disable_irq_wake(rtc_data->irq);
604 637
605 return 0; 638 return 0;