Commit 7c94caca authored by Stephen Boyd's avatar Stephen Boyd Committed by Thomas Gleixner
Browse files

alarmtimer: Use wakeup source from alarmtimer platform device



Use the wakeup source that can be associated with the 'alarmtimer'
platform device instead of registering another one by hand.

Signed-off-by: default avatarStephen Boyd <swboyd@chromium.org>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarDouglas Anderson <dianders@chromium.org>
Link: https://lore.kernel.org/r/20200124055849.154411-3-swboyd@chromium.org
parent c79108bd
Loading
Loading
Loading
Loading
+5 −10
Original line number Diff line number Diff line
@@ -58,8 +58,6 @@ static DEFINE_SPINLOCK(freezer_delta_lock);
#endif

#ifdef CONFIG_RTC_CLASS
static struct wakeup_source *ws;

/* rtc timer and device for setting alarm wakeups at suspend */
static struct rtc_timer		rtctimer;
static struct rtc_device	*rtcdev;
@@ -88,7 +86,6 @@ static int alarmtimer_rtc_add_device(struct device *dev,
{
	unsigned long flags;
	struct rtc_device *rtc = to_rtc_device(dev);
	struct wakeup_source *__ws;
	struct platform_device *pdev;
	int ret = 0;

@@ -100,12 +97,13 @@ static int alarmtimer_rtc_add_device(struct device *dev,
	if (!device_may_wakeup(rtc->dev.parent))
		return -1;

	__ws = wakeup_source_register(dev, "alarmtimer");
	pdev = platform_device_register_data(dev, "alarmtimer",
					     PLATFORM_DEVID_AUTO, NULL, 0);
	if (!IS_ERR(pdev))
		device_init_wakeup(&pdev->dev, true);

	spin_lock_irqsave(&rtcdev_lock, flags);
	if (__ws && !IS_ERR(pdev) && !rtcdev) {
	if (!IS_ERR(pdev) && !rtcdev) {
		if (!try_module_get(rtc->owner)) {
			ret = -1;
			goto unlock;
@@ -114,8 +112,6 @@ static int alarmtimer_rtc_add_device(struct device *dev,
		rtcdev = rtc;
		/* hold a reference so it doesn't go away */
		get_device(dev);
		ws = __ws;
		__ws = NULL;
		pdev = NULL;
	} else {
		ret = -1;
@@ -124,7 +120,6 @@ unlock:
	spin_unlock_irqrestore(&rtcdev_lock, flags);

	platform_device_unregister(pdev);
	wakeup_source_unregister(__ws);

	return ret;
}
@@ -291,7 +286,7 @@ static int alarmtimer_suspend(struct device *dev)
		return 0;

	if (ktime_to_ns(min) < 2 * NSEC_PER_SEC) {
		__pm_wakeup_event(ws, 2 * MSEC_PER_SEC);
		pm_wakeup_event(dev, 2 * MSEC_PER_SEC);
		return -EBUSY;
	}

@@ -306,7 +301,7 @@ static int alarmtimer_suspend(struct device *dev)
	/* Set alarm, if in the past reject suspend briefly to handle */
	ret = rtc_timer_start(rtc, &rtctimer, now, 0);
	if (ret < 0)
		__pm_wakeup_event(ws, MSEC_PER_SEC);
		pm_wakeup_event(dev, MSEC_PER_SEC);
	return ret;
}