From patchwork Wed Sep 9 17:38:48 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Mark A. Greer" X-Patchwork-Id: 33216 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-px0-f161.google.com (mail-px0-f161.google.com [209.85.216.161]) by bilbo.ozlabs.org (Postfix) with ESMTP id 2D60EB7043 for ; Thu, 10 Sep 2009 03:38:55 +1000 (EST) Received: by pxi33 with SMTP id 33so4171735pxi.11 for ; Wed, 09 Sep 2009 10:38:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=beta; h=domainkey-signature:received:received:x-sender:x-apparently-to :received:received:received:received-spf:received:received:date:from :to:cc:subject:message-id:mime-version:content-type:user-agent :reply-to:sender:precedence:x-google-loop:mailing-list:list-id :list-post:list-help:list-unsubscribe:x-beenthere-env:x-beenthere; bh=ggH7/kWZ1O9frtOxu88RyRol9NEd0A0X+8H1COGjXF4=; b=RvgDwzAahuso3mHbeIU0NjM4DJDJyvD5r05SMrC1ebID6uZQKmERzbZoslDIsKNSSE TfhWr+Lz3+wpdQyxwBxvbmcEOA1OfzHeZuM2n639rnpqcGC8fKeKzeIjNdu1T39zV/em fyG0s6Eel/6dysUA+2IINXIeuXy6P9j9afDyM= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlegroups.com; s=beta; h=x-sender:x-apparently-to:received-spf:authentication-results:date :from:to:cc:subject:message-id:mime-version:content-type:user-agent :reply-to:sender:precedence:x-google-loop:mailing-list:list-id :list-post:list-help:list-unsubscribe:x-beenthere-env:x-beenthere; b=vgahprGeoHL93R7jlRq3+6BDPoczelSI9Kt6TRMabMB0Bqc/Tg9u+Mjn2y9/jmTu5G xzZs37i6ZuFvuAeJTmuykVYwo8v6rsmEufuOTHqkjEI8bCRzlhZjvDRlaQKXbTSmCiv0 3/+NQmFeEfrR/Eb4jzCKamz+G9cUQfmSdpln8= Received: by 10.142.9.36 with SMTP id 36mr35353wfi.33.1252517932387; Wed, 09 Sep 2009 10:38:52 -0700 (PDT) Received: by 10.107.100.3 with SMTP id c3gr2842prm.0; Wed, 09 Sep 2009 10:38:52 -0700 (PDT) X-Sender: mgreer@mvista.com X-Apparently-To: rtc-linux@googlegroups.com Received: by 10.114.5.19 with SMTP id 19mr222863wae.8.1252517931215; Wed, 09 Sep 2009 10:38:51 -0700 (PDT) Received: by 10.114.5.19 with SMTP id 19mr222862wae.8.1252517931054; Wed, 09 Sep 2009 10:38:51 -0700 (PDT) Received: from gateway-1237.mvista.com (gateway-1237.mvista.com [63.81.120.158]) by gmr-mx.google.com with ESMTP id 19si526494pzk.4.2009.09.09.10.38.50; Wed, 09 Sep 2009 10:38:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of mgreer@mvista.com designates 63.81.120.158 as permitted sender) client-ip=63.81.120.158; Authentication-Results: gmr-mx.google.com; spf=pass (google.com: best guess record for domain of mgreer@mvista.com designates 63.81.120.158 as permitted sender) smtp.mail=mgreer@mvista.com Received: from mag.az.mvista.com (mag.az.mvista.com [10.50.1.99]) by hermes.mvista.com (Postfix) with ESMTP id A49D21B83B; Wed, 9 Sep 2009 10:38:48 -0700 (PDT) Received: from mgreer by mag.az.mvista.com with local (Exim 4.69) (envelope-from ) id 1MlR84-0008GE-HC; Wed, 09 Sep 2009 10:38:48 -0700 Date: Wed, 9 Sep 2009 10:38:48 -0700 From: "Mark A. Greer" To: rtc-linux@googlegroups.com Cc: David Brownell Subject: [rtc-linux] [PATCH] rtc: make rtc-omap driver ioremap its register space Message-ID: <20090909173848.GA31713@mag.az.mvista.com> Mime-Version: 1.0 User-Agent: Mutt/1.5.17+20080114 (2008-01-14) Reply-To: rtc-linux@googlegroups.com Sender: rtc-linux@googlegroups.com Precedence: bulk X-Google-Loop: groups Mailing-List: list rtc-linux@googlegroups.com; contact rtc-linux+owner@googlegroups.com List-Id: List-Post: List-Help: List-Unsubscribe: , X-BeenThere-Env: rtc-linux@googlegroups.com X-BeenThere: rtc-linux@googlegroups.com From: Mark A. Greer The rtc-omap driver currently assumes that the rtc's registers are at a fixed address and already mapped into virtual memory space. Remove those assumptions so the same driver can be used for similar devices that reside at different physical addresses. Also allow the possibility for the timer and alarm interrupts to use the same IRQ. Signed-off-by: Mark A. Greer --- drivers/rtc/rtc-omap.c | 47 ++++++++++++++++++++++++++--------------------- 1 files changed, 26 insertions(+), 21 deletions(-) diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index bd1ce8e..aa418d5 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c @@ -87,9 +87,10 @@ #define OMAP_RTC_INTERRUPTS_IT_ALARM (1<<3) #define OMAP_RTC_INTERRUPTS_IT_TIMER (1<<2) +static void __iomem *rtc_base; -#define rtc_read(addr) omap_readb(OMAP_RTC_BASE + (addr)) -#define rtc_write(val, addr) omap_writeb(val, OMAP_RTC_BASE + (addr)) +#define rtc_read(addr) __raw_readb(rtc_base + (addr)) +#define rtc_write(val, addr) __raw_writeb(val, rtc_base + (addr)) /* we rely on the rtc framework to handle locking (rtc->ops_lock), @@ -330,32 +331,31 @@ static int __init omap_rtc_probe(struct platform_device *pdev) return -ENOENT; } - /* NOTE: using static mapping for RTC registers */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - if (res && res->start != OMAP_RTC_BASE) { - pr_debug("%s: RTC registers at %08x, expected %08x\n", - pdev->name, (unsigned) res->start, OMAP_RTC_BASE); + if (!res) { + pr_debug("%s: RTC resource data missing\n", pdev->name); return -ENOENT; } - if (res) - mem = request_mem_region(res->start, - res->end - res->start + 1, - pdev->name); - else - mem = NULL; + mem = request_mem_region(res->start, resource_size(res), pdev->name); if (!mem) { pr_debug("%s: RTC registers at %08x are not free\n", - pdev->name, OMAP_RTC_BASE); + pdev->name, res->start); return -EBUSY; } + rtc_base = ioremap(res->start, resource_size(res)); + if (!rtc_base) { + pr_debug("%s: RTC registers can't be mapped\n", pdev->name); + goto fail; + } + rtc = rtc_device_register(pdev->name, &pdev->dev, &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 fail; + goto fail0; } platform_set_drvdata(pdev, rtc); dev_set_drvdata(&rtc->dev, mem); @@ -380,13 +380,14 @@ static int __init omap_rtc_probe(struct platform_device *pdev) dev_name(&rtc->dev), rtc)) { pr_debug("%s: RTC timer interrupt IRQ%d already claimed\n", pdev->name, omap_rtc_timer); - goto fail0; + goto fail1; } - if (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED, - dev_name(&rtc->dev), rtc)) { + if ((omap_rtc_timer != omap_rtc_alarm) && + (request_irq(omap_rtc_alarm, rtc_irq, IRQF_DISABLED, + dev_name(&rtc->dev), rtc))) { pr_debug("%s: RTC alarm interrupt IRQ%d already claimed\n", pdev->name, omap_rtc_alarm); - goto fail1; + goto fail2; } /* On boards with split power, RTC_ON_NOFF won't reset the RTC */ @@ -419,10 +420,12 @@ static int __init omap_rtc_probe(struct platform_device *pdev) return 0; -fail1: +fail2: free_irq(omap_rtc_timer, NULL); -fail0: +fail1: rtc_device_unregister(rtc); +fail0: + iounmap(rtc_base); fail: release_resource(mem); return -EIO; @@ -438,7 +441,9 @@ static int __exit omap_rtc_remove(struct platform_device *pdev) rtc_write(0, OMAP_RTC_INTERRUPTS_REG); free_irq(omap_rtc_timer, rtc); - free_irq(omap_rtc_alarm, rtc); + + if (omap_rtc_timer != omap_rtc_alarm) + free_irq(omap_rtc_alarm, rtc); release_resource(dev_get_drvdata(&rtc->dev)); rtc_device_unregister(rtc);