From patchwork Mon Jun 3 01:13:00 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "dbasehore ." X-Patchwork-Id: 248150 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-ob0-x238.google.com (mail-ob0-x238.google.com [IPv6:2607:f8b0:4003:c01::238]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 6073C2C009D for ; Mon, 3 Jun 2013 11:13:20 +1000 (EST) Received: by mail-ob0-f184.google.com with SMTP id wc20sf1167074obb.11 for ; Sun, 02 Jun 2013 18:13:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=mime-version:x-beenthere:from:to:cc:subject:date:message-id :x-mailer:in-reply-to:references:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:x-google-group-id:list-post:list-help:list-archive:sender :list-subscribe:list-unsubscribe:content-type; bh=MJucPVPpufxkqVZKs880oJTS4/7wqXRvT+lqM+KJE1U=; b=NGz7Z0VtaF5/WFQo6vCmsRsAFoEF1Hbm+57rVPthQD+inXmhcpYKQXKU1m2dzvTRm5 fXPgknNO0iGyumHuMa1rqAxxKcGX9tue4BGRqXIdgPu+6Fp0p75xqNXbUkgnDPfQht/b SYnsYkz2was3oKSxQA4QELQIGO+ZHRQYuRv5H7YefXJdSQsuOnRaa+ucbvHTY+YkBSb3 gzQn3tR0KJ2EQS5GrTmIJcjgijqaAEnDWqAlaqj63LFUKYA77ShEUGGGUDxxkeJjN7l7 0ackMCnwxKZzq25VAWyoSk9mpMnbfSyWIdE505VzBFrVZR2fAIL6mSo/grP45RAVnYAz CIeg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=mime-version:x-beenthere:from:to:cc:subject:date:message-id :x-mailer:in-reply-to:references:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:x-google-group-id:list-post:list-help:list-archive:sender :list-subscribe:list-unsubscribe:content-type; bh=MJucPVPpufxkqVZKs880oJTS4/7wqXRvT+lqM+KJE1U=; b=cze8YHYu/Ej7j/oDmci1iXKyVIk+FjJSi1Tf1yft0d/iH7CeKkK/6AIuiWe2PHHmcQ 2xvO+3qyoLuMPX60FaaMepTCW1Mi5CUxGA4cBfPMZ1s0PgIn0DM7aFvp223Zka8nXX4A NZMJelkrsttuBAm1zdYDdWaPJLRdkszEAu6l8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-beenthere:from:to:cc:subject:date:message-id :x-mailer:in-reply-to:references:x-gm-message-state :x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:x-google-group-id:list-post :list-help:list-archive:sender:list-subscribe:list-unsubscribe :content-type; bh=MJucPVPpufxkqVZKs880oJTS4/7wqXRvT+lqM+KJE1U=; b=bSbO/lpkHF37xpOxGwC0EuU+DS6wMheMokyxLdHamBXGmtXlfEBo5EcgfqFATJVSX4 8qsO3XhfXtpNLLw/HcKBjZp75F3J4YU+1uCRAhaACgndFcI0J6Vq3QGBrU5+Wf4RKMMr iZ39wok0ZoP96INcUdgKr4TDe8skdgF6QDH63VC78lkPnvzjHb2sjH1ROLFj+ROJs766 Yp0LCQGUfKmyUfQi2yxswrMifpWdUNxA9sOEDallTTqCi/xzQnoTBslh1zSVerO6GqUx rJBv0T/QtbgXHuixhs4WU/7Ou+uYqKL96Ry9qNXLbW4I2xB6J16pgmZj4ga4eoxK8Rbv I1JA== X-Received: by 10.49.1.197 with SMTP id 5mr1461186qeo.24.1370221997455; Sun, 02 Jun 2013 18:13:17 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: rtc-linux@googlegroups.com Received: by 10.49.103.132 with SMTP id fw4ls1816293qeb.17.gmail; Sun, 02 Jun 2013 18:13:16 -0700 (PDT) X-Received: by 10.58.207.199 with SMTP id ly7mr6786282vec.21.1370221996784; Sun, 02 Jun 2013 18:13:16 -0700 (PDT) Received: from mail-vb0-x24a.google.com (mail-vb0-x24a.google.com [2607:f8b0:400c:c02::24a]) by gmr-mx.google.com with ESMTPS id zg9si5599444vdb.1.2013.06.02.18.13.16 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Sun, 02 Jun 2013 18:13:16 -0700 (PDT) Received-SPF: pass (google.com: domain of dbasehore@google.com designates 2607:f8b0:400c:c02::24a as permitted sender) client-ip=2607:f8b0:400c:c02::24a; Received: by mail-vb0-f74.google.com with SMTP id w15so324370vbf.3 for ; Sun, 02 Jun 2013 18:13:16 -0700 (PDT) X-Received: by 10.236.117.51 with SMTP id i39mr12191011yhh.9.1370221996606; Sun, 02 Jun 2013 18:13:16 -0700 (PDT) Received: from corp2gmr1-1.hot.corp.google.com (corp2gmr1-1.hot.corp.google.com [172.24.189.92]) by gmr-mx.google.com with ESMTPS id o68si2577yhn.7.2013.06.02.18.13.16 for (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Sun, 02 Jun 2013 18:13:16 -0700 (PDT) Received: from ketosis.mtv.corp.google.com (ketosis.mtv.corp.google.com [172.22.73.143]) by corp2gmr1-1.hot.corp.google.com (Postfix) with ESMTP id 721B931C1D8; Sun, 2 Jun 2013 18:13:16 -0700 (PDT) Received: by ketosis.mtv.corp.google.com (Postfix, from userid 171518) id 1155080A20; Sun, 2 Jun 2013 18:13:15 -0700 (PDT) From: Derek Basehore To: Andrew Morton Cc: linux-kernel , rtc-linux@googlegroups.com, Alessandro Zummo , rostedt@goodmis.org, gregkh@linuxfoundation.org, Derek Basehore Subject: [rtc-linux] [PATCH] rtc: cmos: Workaround bios clearing rtc control Date: Sun, 2 Jun 2013 18:13:00 -0700 Message-Id: <1370221980-16122-1-git-send-email-dbasehore@chromium.org> X-Mailer: git-send-email 1.8.2.1 In-Reply-To: <20130529122707.997236928e9f87dc6ba2eaa7@linux-foundation.org> References: <20130529122707.997236928e9f87dc6ba2eaa7@linux-foundation.org> X-Gm-Message-State: ALoCoQk4PpFHPE3el0F7jZfjbfpos7liFpUKORSdnJbd/W8eEs5w4+UfrQ1Hj9lJt0LT65o34hzOC8skZtLkVmk6ecBY/PzuLf1LLY7wpNgwyEkhFnrtLJuy3URdWp3vcHUZl+FXaejpmcJnARyVoY+zdGfHGL6iR5ER3QGbHoghV2pEpuSreSA6GKwoQfkNMD5Jdau/1dT699s/sGHq9wz18SuQVViXYQ== X-Original-Sender: dbasehore@chromium.org X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of dbasehore@google.com designates 2607:f8b0:400c:c02::24a as permitted sender) smtp.mail=dbasehore@google.com Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: Sender: rtc-linux@googlegroups.com List-Subscribe: , List-Unsubscribe: , The bios may clear the rtc control register when resuming the system. Since the cmos interrupt handler may now be run before the rtc_cmos is resumed, this can cause the interrupt handler to ignore an alarm since the alarm bit is not set in the rtc control register. To work around this, check if the rtc_cmos is suspended and use the stored value for the rtc control register. Signed-off-by: Derek Basehore Reviewed-by: Sameer Nanda --- drivers/rtc/rtc-cmos.c | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index ee0bc69..22803fe 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -556,17 +556,24 @@ static irqreturn_t cmos_interrupt(int irq, void *p) rtc_control = CMOS_READ(RTC_CONTROL); if (is_hpet_enabled()) irqstat = (unsigned long)irq & 0xF0; - irqstat &= (rtc_control & RTC_IRQMASK) | RTC_IRQF; + + /* If we were suspended, RTC_CONTROL may not be accurate since the + * bios may have cleared it. + */ + if (!cmos_rtc.suspend_ctrl) + irqstat &= (rtc_control & RTC_IRQMASK) | RTC_IRQF; + else + irqstat &= (cmos_rtc.suspend_ctrl & RTC_IRQMASK) | RTC_IRQF; /* All Linux RTC alarms should be treated as if they were oneshot. * Similar code may be needed in system wakeup paths, in case the * alarm woke the system. */ if (irqstat & RTC_AIE) { + cmos_rtc.suspend_ctrl &= ~RTC_AIE; rtc_control &= ~RTC_AIE; CMOS_WRITE(rtc_control, RTC_CONTROL); hpet_mask_rtc_irq_bit(RTC_AIE); - CMOS_READ(RTC_INTR_FLAGS); } spin_unlock(&rtc_lock); @@ -839,21 +846,23 @@ static inline int cmos_poweroff(struct device *dev) static int cmos_resume(struct device *dev) { struct cmos_rtc *cmos = dev_get_drvdata(dev); - unsigned char tmp = cmos->suspend_ctrl; + unsigned char tmp; + if (cmos->enabled_wake) { + if (cmos->wake_off) + cmos->wake_off(dev); + else + disable_irq_wake(cmos->irq); + cmos->enabled_wake = 0; + } + + spin_lock_irq(&rtc_lock); + tmp = cmos->suspend_ctrl; + cmos->suspend_ctrl = 0; /* re-enable any irqs previously active */ if (tmp & RTC_IRQMASK) { unsigned char mask; - if (cmos->enabled_wake) { - if (cmos->wake_off) - cmos->wake_off(dev); - else - disable_irq_wake(cmos->irq); - cmos->enabled_wake = 0; - } - - spin_lock_irq(&rtc_lock); if (device_may_wakeup(dev)) { hpet_rtc_timer_init(); } @@ -874,8 +883,8 @@ static int cmos_resume(struct device *dev) tmp &= ~RTC_AIE; hpet_mask_rtc_irq_bit(RTC_AIE); } while (mask & RTC_AIE); - spin_unlock_irq(&rtc_lock); } + spin_unlock_irq(&rtc_lock); dev_dbg(dev, "resume, ctrl %02x\n", tmp);