From patchwork Thu Nov 13 13:13:35 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Barry Song <21cnbao@gmail.com> X-Patchwork-Id: 410410 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-pa0-x240.google.com (mail-pa0-x240.google.com [IPv6:2607:f8b0:400e:c03::240]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 011D31400B6 for ; Fri, 14 Nov 2014 00:15:56 +1100 (AEDT) Received: by mail-pa0-f64.google.com with SMTP id ey11sf95422pad.19 for ; Thu, 13 Nov 2014 05:15:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=mime-version:from:to:cc:subject:date:message-id:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:list-post:list-help:list-archive:sender:list-subscribe :list-unsubscribe:content-type; bh=eVhIzVJc2xDSsogKU17Hk31sEl7VAxDtF6tMeJedHwM=; b=de+dsv2ORGI5woTG2O9t7kGpYPASP3EBCYjL06HC3s0XyHOjx/dcuwK53gL28QMOeV 0HOrEGwReBj2pzVJe3t7LXCvYULxQmxCLK8nSjtO9KovfMSVDBv5fWxyqp3/cf7e9sw4 GrDp/tLDapTX2Rqfy4F15rDOIrEuzqyfSRTCnLwVSkPb6S1OCenO429e84aUv1hhujgd qkWGrFmFysjGY1KJkXhwYweI9D3FzehSQY1h+hJ5w5WRw1jU9qoCPLKtSBeF8ZNw228e 5Fwk+3v3bkMuHTHA2cdoPJ3BM/nPNpLJ1pYNdTg+DIe30QkcterqqSUQn3DVzxyvWNnE HHtA== X-Received: by 10.140.44.66 with SMTP id f60mr364qga.27.1415884553529; Thu, 13 Nov 2014 05:15:53 -0800 (PST) MIME-Version: 1.0 X-BeenThere: rtc-linux@googlegroups.com Received: by 10.140.82.175 with SMTP id h44ls3370971qgd.60.gmail; Thu, 13 Nov 2014 05:15:53 -0800 (PST) X-Received: by 10.236.231.113 with SMTP id k107mr45379172yhq.57.1415884553306; Thu, 13 Nov 2014 05:15:53 -0800 (PST) Received: from mail-pd0-x22e.google.com (mail-pd0-x22e.google.com. [2607:f8b0:400e:c02::22e]) by gmr-mx.google.com with ESMTPS id ux1si3317647pab.2.2014.11.13.05.15.53 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 13 Nov 2014 05:15:53 -0800 (PST) Received-SPF: pass (google.com: domain of 21cnbao@gmail.com designates 2607:f8b0:400e:c02::22e as permitted sender) client-ip=2607:f8b0:400e:c02::22e; Received: by mail-pd0-f174.google.com with SMTP id p10so14467925pdj.19 for ; Thu, 13 Nov 2014 05:15:53 -0800 (PST) X-Received: by 10.68.108.36 with SMTP id hh4mr2663832pbb.108.1415884552679; Thu, 13 Nov 2014 05:15:52 -0800 (PST) Received: from localhost.localdomain ([220.248.82.68]) by mx.google.com with ESMTPSA id fl15sm24851041pdb.92.2014.11.13.05.15.46 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 13 Nov 2014 05:15:52 -0800 (PST) From: Barry Song <21cnbao@gmail.com> To: akpm@linux-foundation.org, rtc-linux@googlegroups.com, a.zummo@towertech.it Cc: workgroup.linux@csr.com, Barry Song Subject: [rtc-linux] [PATCH] drivers/rtc/rtc-sirfsoc.c: replace local_irq_disable by spin_lock_irq for SMP safety Date: Thu, 13 Nov 2014 21:13:35 +0800 Message-Id: <1415884415-6759-1-git-send-email-21cnbao@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Original-Sender: 21cnbao@gmail.com X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of 21cnbao@gmail.com designates 2607:f8b0:400e:c02::22e as permitted sender) smtp.mail=21cnbao@gmail.com; dkim=pass header.i=@gmail.com; dmarc=pass (p=NONE dis=NONE) header.from=gmail.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: , List-Unsubscribe: , From: Barry Song Signed-off-by: Barry Song --- drivers/rtc/rtc-sirfsoc.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/drivers/rtc/rtc-sirfsoc.c b/drivers/rtc/rtc-sirfsoc.c index f088f81..1a5b619 100644 --- a/drivers/rtc/rtc-sirfsoc.c +++ b/drivers/rtc/rtc-sirfsoc.c @@ -47,6 +47,7 @@ struct sirfsoc_rtc_drv { unsigned irq_wake; /* Overflow for every 8 years extra time */ u32 overflow_rtc; + spinlock_t lock; #ifdef CONFIG_PM u32 saved_counter; u32 saved_overflow_rtc; @@ -61,7 +62,7 @@ static int sirfsoc_rtc_read_alarm(struct device *dev, rtcdrv = dev_get_drvdata(dev); - local_irq_disable(); + spin_lock_irq(&rtcdrv->lock); rtc_count = sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_CN); @@ -84,7 +85,8 @@ static int sirfsoc_rtc_read_alarm(struct device *dev, if (sirfsoc_rtc_iobrg_readl( rtcdrv->rtc_base + RTC_STATUS) & SIRFSOC_RTC_AL0E) alrm->enabled = 1; - local_irq_enable(); + + spin_unlock_irq(&rtcdrv->lock); return 0; } @@ -99,7 +101,7 @@ static int sirfsoc_rtc_set_alarm(struct device *dev, if (alrm->enabled) { rtc_tm_to_time(&(alrm->time), &rtc_alarm); - local_irq_disable(); + spin_lock_irq(&rtcdrv->lock); rtc_status_reg = sirfsoc_rtc_iobrg_readl( rtcdrv->rtc_base + RTC_STATUS); @@ -123,14 +125,15 @@ static int sirfsoc_rtc_set_alarm(struct device *dev, rtc_status_reg |= SIRFSOC_RTC_AL0E; sirfsoc_rtc_iobrg_writel( rtc_status_reg, rtcdrv->rtc_base + RTC_STATUS); - local_irq_enable(); + + spin_unlock_irq(&rtcdrv->lock); } else { /* * if this function was called with enabled=0 * then it could mean that the application is * trying to cancel an ongoing alarm */ - local_irq_disable(); + spin_lock_irq(&rtcdrv->lock); rtc_status_reg = sirfsoc_rtc_iobrg_readl( rtcdrv->rtc_base + RTC_STATUS); @@ -146,7 +149,7 @@ static int sirfsoc_rtc_set_alarm(struct device *dev, rtcdrv->rtc_base + RTC_STATUS); } - local_irq_enable(); + spin_unlock_irq(&rtcdrv->lock); } return 0; @@ -217,7 +220,7 @@ static int sirfsoc_rtc_alarm_irq_enable(struct device *dev, rtcdrv = dev_get_drvdata(dev); - local_irq_disable(); + spin_lock_irq(&rtcdrv->lock); rtc_status_reg = sirfsoc_rtc_iobrg_readl( rtcdrv->rtc_base + RTC_STATUS); @@ -227,7 +230,8 @@ static int sirfsoc_rtc_alarm_irq_enable(struct device *dev, rtc_status_reg &= ~SIRFSOC_RTC_AL0E; sirfsoc_rtc_iobrg_writel(rtc_status_reg, rtcdrv->rtc_base + RTC_STATUS); - local_irq_enable(); + + spin_unlock_irq(&rtcdrv->lock); return 0; @@ -248,6 +252,8 @@ static irqreturn_t sirfsoc_rtc_irq_handler(int irq, void *pdata) unsigned long rtc_status_reg = 0x0; unsigned long events = 0x0; + spin_lock(&rtcdrv->lock); + rtc_status_reg = sirfsoc_rtc_iobrg_readl(rtcdrv->rtc_base + RTC_STATUS); /* this bit will be set ONLY if an alarm was active * and it expired NOW @@ -265,6 +271,9 @@ static irqreturn_t sirfsoc_rtc_irq_handler(int irq, void *pdata) rtc_status_reg &= ~(SIRFSOC_RTC_AL0E); } sirfsoc_rtc_iobrg_writel(rtc_status_reg, rtcdrv->rtc_base + RTC_STATUS); + + spin_unlock(&rtcdrv->lock); + /* this should wake up any apps polling/waiting on the read * after setting the alarm */ @@ -292,6 +301,8 @@ static int sirfsoc_rtc_probe(struct platform_device *pdev) if (rtcdrv == NULL) return -ENOMEM; + spin_lock_init(&rtcdrv->lock); + err = of_property_read_u32(np, "reg", &rtcdrv->rtc_base); if (err) { dev_err(&pdev->dev, "unable to find base address of rtc node in dtb\n");