From patchwork Mon Mar 1 10:53:44 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Uwe_Kleine-K=C3=B6nig?= X-Patchwork-Id: 46536 Return-Path: <3y5yLSwAACT8sud-mjovyhpphmfhspvqt.dpn@groups.bounces.google.com> X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-gx0-f192.google.com (mail-gx0-f192.google.com [209.85.217.192]) by ozlabs.org (Postfix) with ESMTP id 68DEFB7067 for ; Mon, 1 Mar 2010 21:54:04 +1100 (EST) Received: by mail-gx0-f192.google.com with SMTP id 8sf4896933gxk.12 for ; Mon, 01 Mar 2010 02:54:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=beta; h=domainkey-signature:received:x-beenthere:received:received:received :received:received-spf:received:received:from:to:cc:subject:date :message-id:x-mailer:in-reply-to:references:mime-version:to :x-sa-exim-connect-ip:x-sa-exim-mail-from:x-sa-exim-scanned :x-ptx-original-recipient:x-original-authentication-results :x-original-sender:reply-to:precedence:mailing-list:list-id :list-post:list-help:list-archive:x-thread-url:x-message-url:sender :list-subscribe:list-unsubscribe:content-type :content-transfer-encoding; bh=ub6PbOHMUWhzT8Rt6ugExgv7GMxaIuy96VRtwrjiCzA=; b=HJfKRgDVKi11yW+HCRffsYy2F14VzxGTaeJahebBHzbETpX2SH9XyeB9aVAeA/3Vfs /wT7M+gqpO4grkabrItl8ctqTietFM9AjvFEfyXaAyIeVbZ2oV1ziAhLDE5knJN+gzP4 T9hnP6CBY1RkqBfS+HhmpjQYOb4phkdpQP5FI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlegroups.com; s=beta; h=x-beenthere:received-spf:from:to:cc:subject:date:message-id :x-mailer:in-reply-to:references:mime-version:x-sa-exim-connect-ip :x-sa-exim-mail-from:x-sa-exim-scanned:x-ptx-original-recipient :x-original-authentication-results:x-original-sender:reply-to :precedence:mailing-list:list-id:list-post:list-help:list-archive :x-thread-url:x-message-url:sender:list-subscribe:list-unsubscribe :content-type:content-transfer-encoding; b=lEspUm4G0TXQK68+3O7AYSaBa4c8wqYTN/3Qy7w8sDzMf0HdjC5ey3cQut2TcTly2z wLk1w2mG5UK3MyjUDjF4zjF/VgAqiqwKHL7bXsCORP7KkWJx36aHPkBp9tAKhYjwg5sw kTYydd69DIlLZX7MSzistAqizwcLrCrtqJjNI= Received: by 10.91.28.7 with SMTP id f7mr556878agj.36.1267440843828; Mon, 01 Mar 2010 02:54:03 -0800 (PST) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.87.42.37 with SMTP id u37ls765315fgj.1.p; Mon, 01 Mar 2010 02:54:03 -0800 (PST) Received: by 10.87.40.29 with SMTP id s29mr143644fgj.14.1267440842976; Mon, 01 Mar 2010 02:54:02 -0800 (PST) Received: by 10.87.40.29 with SMTP id s29mr143643fgj.14.1267440842955; Mon, 01 Mar 2010 02:54:02 -0800 (PST) Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [92.198.50.35]) by gmr-mx.google.com with ESMTP id 12si398746fxm.12.2010.03.01.02.54.02; Mon, 01 Mar 2010 02:54:02 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of ukl@pengutronix.de designates 92.198.50.35 as permitted sender) client-ip=92.198.50.35; Received: from octopus.hi.pengutronix.de ([2001:6f8:1178:2:215:17ff:fe12:23b0]) by metis.ext.pengutronix.de with esmtp (Exim 4.69) (envelope-from ) id 1Nm3G6-0005Gg-EW; Mon, 01 Mar 2010 11:53:54 +0100 Received: from ukl by octopus.hi.pengutronix.de with local (Exim 4.69) (envelope-from ) id 1Nm3G6-0004gm-AQ; Mon, 01 Mar 2010 11:53:54 +0100 From: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= To: linux-kernel@vger.kernel.org, rtc-linux@googlegroups.com Cc: Alessandro Zummo , Paul Gortmaker , Andrew Morton , Valentin Longchamp , Sascha Hauer Subject: [rtc-linux] [PATCH 5/6] rtc/mc13783: protect rtc {, un}registration by mc13783 lock Date: Mon, 1 Mar 2010 11:53:44 +0100 Message-Id: <1267440825-14694-5-git-send-email-u.kleine-koenig@pengutronix.de> X-Mailer: git-send-email 1.7.0 In-Reply-To: <1267440825-14694-1-git-send-email-u.kleine-koenig@pengutronix.de> References: <1267440825-14694-1-git-send-email-u.kleine-koenig@pengutronix.de> MIME-Version: 1.0 To: rtc-linux@googlegroups.com X-SA-Exim-Connect-IP: 2001:6f8:1178:2:215:17ff:fe12:23b0 X-SA-Exim-Mail-From: ukl@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: rtc-linux@googlegroups.com X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of ukl@pengutronix.de designates 92.198.50.35 as permitted sender) smtp.mail=ukl@pengutronix.de X-Original-Sender: u.kleine-koenig@pengutronix.de Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: List-Post: , List-Help: , List-Archive: X-Thread-Url: http://groups.google.com/group/rtc-linux/t/27422cec32a1b315 X-Message-Url: http://groups.google.com/group/rtc-linux/msg/8f7bae2993feb185 Sender: rtc-linux@googlegroups.com List-Subscribe: , List-Unsubscribe: , This is to protect from interrupt handlers using an unregistered rtc device. To assert that the reset irq is considered now before the rtc is registered the corresponding status is checked before. Signed-off-by: Uwe Kleine-König --- Hello, this depends on patch 4/6 which added mc13783_irq_status. Best regards Uwe drivers/rtc/rtc-mc13783.c | 25 ++++++++++++++----------- 1 files changed, 14 insertions(+), 11 deletions(-) diff --git a/drivers/rtc/rtc-mc13783.c b/drivers/rtc/rtc-mc13783.c index 0a978a0..6a36201 100644 --- a/drivers/rtc/rtc-mc13783.c +++ b/drivers/rtc/rtc-mc13783.c @@ -169,6 +169,7 @@ static int __devinit mc13783_rtc_probe(struct platform_device *pdev) { int ret; struct mc13783_rtc *priv; + int rtcrst_pending; priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) @@ -177,8 +178,6 @@ static int __devinit mc13783_rtc_probe(struct platform_device *pdev) priv->mc13783 = dev_get_drvdata(pdev->dev.parent); platform_set_drvdata(pdev, priv); - priv->valid = 1; - mc13783_lock(priv->mc13783); ret = mc13783_irq_request(priv->mc13783, MC13783_IRQ_RTCRST, @@ -186,33 +185,37 @@ static int __devinit mc13783_rtc_probe(struct platform_device *pdev) if (ret) goto err_reset_irq_request; + ret = mc13783_irq_status(priv->mc13783, MC13783_IRQ_RTCRST, + NULL, &rtcrst_pending); + if (ret) + goto err_reset_irq_status; + + priv->valid = !rtcrst_pending; + ret = mc13783_irq_request_nounmask(priv->mc13783, MC13783_IRQ_1HZ, mc13783_rtc_update_handler, DRIVER_NAME, priv); if (ret) goto err_update_irq_request; - mc13783_unlock(priv->mc13783); - priv->rtc = rtc_device_register(pdev->name, &pdev->dev, &mc13783_rtc_ops, THIS_MODULE); - if (IS_ERR(priv->rtc)) { ret = PTR_ERR(priv->rtc); - mc13783_lock(priv->mc13783); - mc13783_irq_free(priv->mc13783, MC13783_IRQ_1HZ, priv); err_update_irq_request: +err_reset_irq_status: + mc13783_irq_free(priv->mc13783, MC13783_IRQ_RTCRST, priv); err_reset_irq_request: - mc13783_unlock(priv->mc13783); - platform_set_drvdata(pdev, NULL); kfree(priv); } + mc13783_unlock(priv->mc13783); + return ret; } @@ -220,10 +223,10 @@ static int __devexit mc13783_rtc_remove(struct platform_device *pdev) { struct mc13783_rtc *priv = platform_get_drvdata(pdev); - rtc_device_unregister(priv->rtc); - mc13783_lock(priv->mc13783); + rtc_device_unregister(priv->rtc); + mc13783_irq_free(priv->mc13783, MC13783_IRQ_1HZ, priv); mc13783_irq_free(priv->mc13783, MC13783_IRQ_RTCRST, priv);