All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Martin Kaiser <martin@kaiser.cx>
Cc: Alessandro Zummo <a.zummo@towertech.it>,
	Shawn Guo <shawnguo@kernel.org>,
	Pengutronix Kernel Team <kernel@pengutronix.de>,
	Fabio Estevam <festevam@gmail.com>,
	linux-rtc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] rtc: imxdi: add wakeup support
Date: Sat, 1 May 2021 12:05:51 +0200	[thread overview]
Message-ID: <YI0n/7M3Ke4DAwG2@piout.net> (raw)
In-Reply-To: <20210430093210.7034-1-martin@kaiser.cx>

Hello,

On 30/04/2021 11:32:10+0200, Martin Kaiser wrote:
> The DryIce-based RTC supports alarms that trigger an interrupt.
> 
> Add an option to configure this interrupt as a wakeup source that wakes
> the system up from standby mode.
> 
> Signed-off-by: Martin Kaiser <martin@kaiser.cx>
> ---
> 
> simple test
> 
>    [root@board ]# echo enabled > /sys/class/rtc/rtc0/device/power/wakeup
>    [root@board ]# rtcwake -s 3 -m mem
>    wakeup from "mem" at Fri Apr 30 09:23:52 2021
>    ...
>    [root@board ]#
> 
>  drivers/rtc/rtc-imxdi.c | 39 ++++++++++++++++++++++++++++++++++-----
>  1 file changed, 34 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-imxdi.c b/drivers/rtc/rtc-imxdi.c
> index c1806f4d68e7..63957be25759 100644
> --- a/drivers/rtc/rtc-imxdi.c
> +++ b/drivers/rtc/rtc-imxdi.c
> @@ -98,6 +98,7 @@
>   * @pdev: pointer to platform dev
>   * @rtc: pointer to rtc struct
>   * @ioaddr: IO registers pointer
> + * @norm_irq: irq number of the "normal" irq
>   * @clk: input reference clock
>   * @dsr: copy of the DSR register
>   * @irq_lock: interrupt enable register (DIER) lock
> @@ -109,6 +110,7 @@ struct imxdi_dev {
>  	struct platform_device *pdev;
>  	struct rtc_device *rtc;
>  	void __iomem *ioaddr;
> +	int norm_irq;
>  	struct clk *clk;
>  	u32 dsr;
>  	spinlock_t irq_lock;
> @@ -741,7 +743,7 @@ static void dryice_work(struct work_struct *work)
>  static int __init dryice_rtc_probe(struct platform_device *pdev)
>  {
>  	struct imxdi_dev *imxdi;
> -	int norm_irq, sec_irq;
> +	int sec_irq;
>  	int rc;
>  
>  	imxdi = devm_kzalloc(&pdev->dev, sizeof(*imxdi), GFP_KERNEL);
> @@ -756,9 +758,9 @@ static int __init dryice_rtc_probe(struct platform_device *pdev)
>  
>  	spin_lock_init(&imxdi->irq_lock);
>  
> -	norm_irq = platform_get_irq(pdev, 0);
> -	if (norm_irq < 0)
> -		return norm_irq;
> +	imxdi->norm_irq = platform_get_irq(pdev, 0);
> +	if (imxdi->norm_irq < 0)
> +		return imxdi->norm_irq;
>  
>  	/* the 2nd irq is the security violation irq
>  	 * make this optional, don't break the device tree ABI
> @@ -795,7 +797,7 @@ static int __init dryice_rtc_probe(struct platform_device *pdev)
>  	if (rc != 0)
>  		goto err;
>  
> -	rc = devm_request_irq(&pdev->dev, norm_irq, dryice_irq,
> +	rc = devm_request_irq(&pdev->dev, imxdi->norm_irq, dryice_irq,
>  			      IRQF_SHARED, pdev->name, imxdi);
>  	if (rc) {
>  		dev_warn(&pdev->dev, "interrupt not available.\n");
> @@ -811,6 +813,8 @@ static int __init dryice_rtc_probe(struct platform_device *pdev)
>  
>  	platform_set_drvdata(pdev, imxdi);
>  
> +	device_set_wakeup_capable(&pdev->dev, true);

Maybe it makes sense to simply use device_init_wakeup here.

> +
>  	imxdi->rtc->ops = &dryice_rtc_ops;
>  	imxdi->rtc->range_max = U32_MAX;
>  
> @@ -830,6 +834,8 @@ static int __exit dryice_rtc_remove(struct platform_device *pdev)
>  {
>  	struct imxdi_dev *imxdi = platform_get_drvdata(pdev);
>  
> +	device_set_wakeup_capable(&pdev->dev, false);
> +
>  	flush_work(&imxdi->work);
>  
>  	/* mask all interrupts */
> @@ -847,10 +853,33 @@ static const struct of_device_id dryice_dt_ids[] = {
>  
>  MODULE_DEVICE_TABLE(of, dryice_dt_ids);
>  
> +#ifdef CONFIG_PM_SLEEP
> +static int dryice_suspend(struct device *dev)
> +{
> +	struct imxdi_dev *imxdi = dev_get_drvdata(dev);
> +
> +	if (device_may_wakeup(dev))
> +		enable_irq_wake(imxdi->norm_irq);
> +	return 0;
> +}
> +
> +static int dryice_resume(struct device *dev)
> +{
> +	struct imxdi_dev *imxdi = dev_get_drvdata(dev);
> +
> +	if (device_may_wakeup(dev))
> +		disable_irq_wake(imxdi->norm_irq);
> +	return 0;
> +}
> +#endif
> +
> +static SIMPLE_DEV_PM_OPS(dryice_pm, dryice_suspend, dryice_resume);
> +

I'm wondering, can't you use dev_pm_set_wake_irq to avoid having to
keep the changes to a minimum?

>  static struct platform_driver dryice_rtc_driver = {
>  	.driver = {
>  		   .name = "imxdi_rtc",
>  		   .of_match_table = dryice_dt_ids,
> +		   .pm = &dryice_pm,
>  		   },
>  	.remove = __exit_p(dryice_rtc_remove),
>  };
> -- 
> 2.20.1
> 

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

  reply	other threads:[~2021-05-01 10:06 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-04-30  9:32 [PATCH] rtc: imxdi: add wakeup support Martin Kaiser
2021-05-01 10:05 ` Alexandre Belloni [this message]
2021-05-04 10:08   ` Martin Kaiser
2021-05-04 12:12     ` Alexandre Belloni
2021-05-05 16:25       ` Martin Kaiser
2021-05-05 16:30 ` [PATCH v2] " Martin Kaiser
2021-05-05 17:34   ` Alexandre Belloni
2021-05-11 16:12 ` [PATCH v3] " Martin Kaiser
2021-05-24 22:43   ` Alexandre Belloni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YI0n/7M3Ke4DAwG2@piout.net \
    --to=alexandre.belloni@bootlin.com \
    --cc=a.zummo@towertech.it \
    --cc=festevam@gmail.com \
    --cc=kernel@pengutronix.de \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rtc@vger.kernel.org \
    --cc=martin@kaiser.cx \
    --cc=shawnguo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.