diff mbox series

[2/2] rtc: fsl-ftm-alarm: fix freeze(s2idle) doesnot wake

Message ID 20200529061035.18912-2-ran.wang_1@nxp.com
State Superseded
Headers show
Series [1/2] dt-bindings: rtc: add wakeup-source for FlexTimer | expand

Commit Message

Ran Wang May 29, 2020, 6:10 a.m. UTC
Use dev_pm_set_wake_irq() instead of flag IRQF_NO_SUSPEND to enable
wakeup system feature for both freeze(s2idle) and mem(deep).

Use property 'wakeup-source' to control this feature.

Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
---
 drivers/rtc/rtc-fsl-ftm-alarm.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

Comments

Alexandre Belloni May 29, 2020, 8:23 a.m. UTC | #1
On 29/05/2020 14:10:35+0800, Ran Wang wrote:
> Use dev_pm_set_wake_irq() instead of flag IRQF_NO_SUSPEND to enable
> wakeup system feature for both freeze(s2idle) and mem(deep).
> 
> Use property 'wakeup-source' to control this feature.
> 
> Signed-off-by: Ran Wang <ran.wang_1@nxp.com>
> ---
>  drivers/rtc/rtc-fsl-ftm-alarm.c | 12 ++++++++++--
>  1 file changed, 10 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-fsl-ftm-alarm.c b/drivers/rtc/rtc-fsl-ftm-alarm.c
> index 756af62..c6945d84 100644
> --- a/drivers/rtc/rtc-fsl-ftm-alarm.c
> +++ b/drivers/rtc/rtc-fsl-ftm-alarm.c
> @@ -21,6 +21,7 @@
>  #include <linux/rtc.h>
>  #include <linux/time.h>
>  #include <linux/acpi.h>
> +#include <linux/pm_wakeirq.h>
>  
>  #define FTM_SC_CLK(c)		((c) << FTM_SC_CLK_MASK_SHIFT)
>  
> @@ -41,6 +42,7 @@ struct ftm_rtc {
>  	struct rtc_device *rtc_dev;
>  	void __iomem *base;
>  	bool big_endian;
> +	bool wakeup;
>  	u32 alarm_freq;
>  };
>  
> @@ -267,6 +269,9 @@ static int ftm_rtc_probe(struct platform_device *pdev)
>  		return PTR_ERR(rtc->base);
>  	}
>  
> +	rtc->wakeup =
> +		device_property_read_bool(&pdev->dev, "wakeup-source");
> +
>  	irq = platform_get_irq(pdev, 0);
>  	if (irq < 0) {
>  		dev_err(&pdev->dev, "can't get irq number\n");
> @@ -274,7 +279,7 @@ static int ftm_rtc_probe(struct platform_device *pdev)
>  	}
>  
>  	ret = devm_request_irq(&pdev->dev, irq, ftm_rtc_alarm_interrupt,
> -			       IRQF_NO_SUSPEND, dev_name(&pdev->dev), rtc);
> +			       0, dev_name(&pdev->dev), rtc);
>  	if (ret < 0) {
>  		dev_err(&pdev->dev, "failed to request irq\n");
>  		return ret;
> @@ -286,7 +291,10 @@ static int ftm_rtc_probe(struct platform_device *pdev)
>  	rtc->alarm_freq = (u32)FIXED_FREQ_CLK / (u32)MAX_FREQ_DIV;
>  	rtc->rtc_dev->ops = &ftm_rtc_ops;
>  
> -	device_init_wakeup(&pdev->dev, true);
> +	device_init_wakeup(&pdev->dev, rtc->wakeup);

As long as you have an irq, you should be able to wakeup, do you really
need the wakeup-source property?

Usually, wakeup-source is used when the RTC interrupt line is not
connected directly to the SoC but is still able to wake it up.

In your case, is it to cover the  case of the flex timers that can't
wake the CPU? If so, then please be more explicit in your commit
message.

> +	ret = dev_pm_set_wake_irq(&pdev->dev, irq);
> +	if (ret)
> +		dev_err(&pdev->dev, "irq wake enable failed.\n");
>  
>  	ret = rtc_register_device(rtc->rtc_dev);
>  	if (ret) {
> -- 
> 2.7.4
>
diff mbox series

Patch

diff --git a/drivers/rtc/rtc-fsl-ftm-alarm.c b/drivers/rtc/rtc-fsl-ftm-alarm.c
index 756af62..c6945d84 100644
--- a/drivers/rtc/rtc-fsl-ftm-alarm.c
+++ b/drivers/rtc/rtc-fsl-ftm-alarm.c
@@ -21,6 +21,7 @@ 
 #include <linux/rtc.h>
 #include <linux/time.h>
 #include <linux/acpi.h>
+#include <linux/pm_wakeirq.h>
 
 #define FTM_SC_CLK(c)		((c) << FTM_SC_CLK_MASK_SHIFT)
 
@@ -41,6 +42,7 @@  struct ftm_rtc {
 	struct rtc_device *rtc_dev;
 	void __iomem *base;
 	bool big_endian;
+	bool wakeup;
 	u32 alarm_freq;
 };
 
@@ -267,6 +269,9 @@  static int ftm_rtc_probe(struct platform_device *pdev)
 		return PTR_ERR(rtc->base);
 	}
 
+	rtc->wakeup =
+		device_property_read_bool(&pdev->dev, "wakeup-source");
+
 	irq = platform_get_irq(pdev, 0);
 	if (irq < 0) {
 		dev_err(&pdev->dev, "can't get irq number\n");
@@ -274,7 +279,7 @@  static int ftm_rtc_probe(struct platform_device *pdev)
 	}
 
 	ret = devm_request_irq(&pdev->dev, irq, ftm_rtc_alarm_interrupt,
-			       IRQF_NO_SUSPEND, dev_name(&pdev->dev), rtc);
+			       0, dev_name(&pdev->dev), rtc);
 	if (ret < 0) {
 		dev_err(&pdev->dev, "failed to request irq\n");
 		return ret;
@@ -286,7 +291,10 @@  static int ftm_rtc_probe(struct platform_device *pdev)
 	rtc->alarm_freq = (u32)FIXED_FREQ_CLK / (u32)MAX_FREQ_DIV;
 	rtc->rtc_dev->ops = &ftm_rtc_ops;
 
-	device_init_wakeup(&pdev->dev, true);
+	device_init_wakeup(&pdev->dev, rtc->wakeup);
+	ret = dev_pm_set_wake_irq(&pdev->dev, irq);
+	if (ret)
+		dev_err(&pdev->dev, "irq wake enable failed.\n");
 
 	ret = rtc_register_device(rtc->rtc_dev);
 	if (ret) {