From patchwork Thu Oct 9 19:06:25 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Hovold X-Patchwork-Id: 5060721 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 89077C11AC for ; Thu, 9 Oct 2014 19:17:05 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B6E982024C for ; Thu, 9 Oct 2014 19:17:04 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DFCAC2022D for ; Thu, 9 Oct 2014 19:17:03 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1XcJA5-00076g-23; Thu, 09 Oct 2014 19:14:05 +0000 Received: from merlin.infradead.org ([2001:4978:20e::2]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1XcJ8z-0006ct-2x for linux-arm-kernel@bombadil.infradead.org; Thu, 09 Oct 2014 19:12:57 +0000 Received: from mail-la0-x230.google.com ([2a00:1450:4010:c03::230]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1XcJ8x-0007Xm-Es for linux-arm-kernel@lists.infradead.org; Thu, 09 Oct 2014 19:12:56 +0000 Received: by mail-la0-f48.google.com with SMTP id gi9so1841785lab.21 for ; Thu, 09 Oct 2014 12:12:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=co9IhSzmEhqr2Iy/kafeiqQncTxaop6QJJdPxSXJkoU=; b=s1AsTJGPDmuDAdYkiVyQKwxxjh9t818F6hya3wChJ3Z7kQu4eRokM+YleahOgro3NR Bki2h7UR3533GBXVS5nDzLTSXX3LSciJ5scXuOwqbqtdxxBvkD1wkKzVzYXv7v4FUYxo RkEnCzclaxd28Ek/Iu33F+jPAKyeuj9amyqdzFiLHTOwbevT1htOPtDvVTMXSidf25zU VNW1YzU3ON+Zlz50F5B56ba17PkVpIudarmZHVsCJtyzCHJfwSf8QqrQX0WLbbgh/n95 71e7yPQ9E/QBnqHFRukdRTGHBujUgMGeYcNWufokOSLqBTDLKvDEoNMzDDmA0OxwLN4V zimQ== X-Received: by 10.152.22.135 with SMTP id d7mr4713460laf.61.1412881949006; Thu, 09 Oct 2014 12:12:29 -0700 (PDT) Received: from xi.terra (s83-177-171-8.cust.tele2.se. [83.177.171.8]) by mx.google.com with ESMTPSA id j2sm1192520lbp.16.2014.10.09.12.12.25 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Oct 2014 12:12:27 -0700 (PDT) X-Google-Original-Sender: Received: from johan by xi.terra with local (Exim 4.84) (envelope-from ) id 1XcJ5o-0006hG-Cq; Thu, 09 Oct 2014 21:09:40 +0200 From: Johan Hovold To: Alessandro Zummo , Tony Lindgren , =?UTF-8?q?Beno=C3=AEt=20Cousson?= Subject: [PATCH 03/12] rtc: omap: fix class-device registration Date: Thu, 9 Oct 2014 21:06:25 +0200 Message-Id: <1412881594-25678-4-git-send-email-johan@kernel.org> X-Mailer: git-send-email 2.0.4 In-Reply-To: <1412881594-25678-1-git-send-email-johan@kernel.org> References: <1412881594-25678-1-git-send-email-johan@kernel.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20141009_151255_660850_96DAED59 X-CRM114-Status: GOOD ( 14.98 ) X-Spam-Score: -2.6 (--) Cc: devicetree@vger.kernel.org, rtc-linux@googlegroups.com, Colin Foe-Parker , Lokesh Vutla , j-keerthy@ti.com, nsekhar@ti.com, linux-kernel@vger.kernel.org, Felipe Balbi , Johan Hovold , t-kristo@ti.com, linux-arm-kernel@lists.infradead.org, AnilKumar Ch , Andrew Morton , linux-omap@vger.kernel.org, Guenter Roeck X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_NONE, T_DKIM_INVALID, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=no version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Make sure not to register the class device until after it has been configured and interrupt handlers registered at probe. Currently, the device is not fully configured (e.g. 24-hour mode) when the class device is registered, something which involves driver callbacks for example to read the current time. This reordering also prevents user space from enabling an alarm before an interrupt handler has been registered. Note that the interrupts are now registered using the platform-device rather than class-device name. Signed-off-by: Johan Hovold --- drivers/rtc/rtc-omap.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 828cb9983cc2..2eca141e784e 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c @@ -147,8 +147,9 @@ static void rtc_wait_not_busy(void) /* now we have ~15 usec to read/write various registers */ } -static irqreturn_t rtc_irq(int irq, void *rtc) +static irqreturn_t rtc_irq(int irq, void *dev_id) { + struct rtc_device *rtc = platform_get_drvdata(dev_id); unsigned long events = 0; u8 irq_data; @@ -164,7 +165,8 @@ static irqreturn_t rtc_irq(int irq, void *rtc) if (irq_data & OMAP_RTC_STATUS_1S_EVENT) events |= RTC_IRQF | RTC_UF; - rtc_update_irq(rtc, 1, events); + if (rtc) + rtc_update_irq(rtc, 1, events); return IRQ_HANDLED; } @@ -416,17 +418,6 @@ static int __init omap_rtc_probe(struct platform_device *pdev) rtc_writel(KICK1_VALUE, OMAP_RTC_KICK1_REG); } - device_init_wakeup(&pdev->dev, true); - - rtc = devm_rtc_device_register(&pdev->dev, pdev->name, - &omap_rtc_ops, THIS_MODULE); - if (IS_ERR(rtc)) { - pr_debug("%s: can't register RTC device, err %ld\n", - pdev->name, PTR_ERR(rtc)); - goto fail0; - } - platform_set_drvdata(pdev, rtc); - /* clear pending irqs, and set 1/second periodic, * which we'll use instead of update irqs */ @@ -450,14 +441,14 @@ static int __init omap_rtc_probe(struct platform_device *pdev) /* handle periodic and alarm irqs */ if (devm_request_irq(&pdev->dev, omap_rtc_timer, rtc_irq, 0, - dev_name(&rtc->dev), rtc)) { + dev_name(&pdev->dev), pdev)) { pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n", pdev->name, omap_rtc_timer); goto fail0; } if ((omap_rtc_timer != omap_rtc_alarm) && (devm_request_irq(&pdev->dev, omap_rtc_alarm, rtc_irq, 0, - dev_name(&rtc->dev), rtc))) { + dev_name(&pdev->dev), pdev))) { pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n", pdev->name, omap_rtc_alarm); goto fail0; @@ -492,6 +483,17 @@ static int __init omap_rtc_probe(struct platform_device *pdev) if (reg != new_ctrl) rtc_write(new_ctrl, OMAP_RTC_CTRL_REG); + device_init_wakeup(&pdev->dev, true); + + rtc = devm_rtc_device_register(&pdev->dev, pdev->name, + &omap_rtc_ops, THIS_MODULE); + if (IS_ERR(rtc)) { + pr_debug("%s: can't register RTC device, err %ld\n", + pdev->name, PTR_ERR(rtc)); + goto fail0; + } + platform_set_drvdata(pdev, rtc); + return 0; fail0: