From patchwork Thu Sep 17 00:04:58 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: 33750 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-pz0-f155.google.com (mail-pz0-f155.google.com [209.85.222.155]) by ozlabs.org (Postfix) with ESMTP id 0A06BB7B6F for ; Thu, 17 Sep 2009 10:05:06 +1000 (EST) Received: by pzk27 with SMTP id 27so3322183pzk.13 for ; Wed, 16 Sep 2009 17:05:05 -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=Hcm6Titqciga+5mqjefba3CdjnqOWDQWaNytRjRbq9c=; b=w2KCZ6UGM5/PJKsTRTzHg1CgX/Kp+RQfo7a14m0usMv4jHEEhXwQpIl5esgPlVKkRX Mi1bxF4MLOJQoaIytze6cmQ60ySubDjnxc6NnqgVHXXi0wZV7KyEA+LaeQKb48yTj0Hm vOPgC/FJjy4AolEmw4PKIR64reujwoHdszYLA= 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=zur00DbizJb2MtjKo9I8n32v6/qZZMKJuSOQjp7kgGKPyCgT+BYSoNOTq3VE6I0P1Q Y1QP5JT8Q2ohVq3d6QKZKCiD4XPyRqytag+d183M+pqAAMWJVC4K2pMCnEEN40A2I1DZ +wtqHpVeTdW6Xc+vLY0WEbq4Hczuo+xfoFqYE= Received: by 10.114.242.14 with SMTP id p14mr840861wah.23.1253145904274; Wed, 16 Sep 2009 17:05:04 -0700 (PDT) Received: by 10.106.33.9 with SMTP id g9gr2870prg.0; Wed, 16 Sep 2009 17:05:04 -0700 (PDT) X-Sender: mgreer@mvista.com X-Apparently-To: rtc-linux@googlegroups.com Received: by 10.114.5.19 with SMTP id 19mr4667729wae.8.1253145902618; Wed, 16 Sep 2009 17:05:02 -0700 (PDT) Received: by 10.114.5.19 with SMTP id 19mr4667728wae.8.1253145902573; Wed, 16 Sep 2009 17:05:02 -0700 (PDT) Received: from gateway-1237.mvista.com (gateway-1237.mvista.com [63.81.120.158]) by gmr-mx.google.com with ESMTP id 19si2138369pzk.0.2009.09.16.17.05.02; Wed, 16 Sep 2009 17:05:02 -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 8A7E51B881; Wed, 16 Sep 2009 17:04:59 -0700 (PDT) Received: from mgreer by mag.az.mvista.com with local (Exim 4.69) (envelope-from ) id 1Mo4Uc-0001bT-E1; Wed, 16 Sep 2009 17:04:58 -0700 Date: Wed, 16 Sep 2009 17:04:58 -0700 From: "Mark A. Greer" To: rtc-linux@googlegroups.com Cc: David Brownell , linux-omap@vger.kernel.org, Davinci-linux-open-source@linux.davincidsp.com Subject: [rtc-linux] [PATCH v2] rtc: make rtc-omap driver ioremap its register space Message-ID: <20090917000458.GA6119@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 (e.g., TI's DA8xx/OMAP-L13x SoC's). Also allow the possibility for the timer and alarm interrupts to use the same IRQ. Signed-off-by: Mark A. Greer CC: David Brownell Acked-by: David Brownell Acked-by: Kevin Hilman Acked-by: Tony Lindgren --- Sorry for the cross-posting but this is relevant to the different lists. This patch was tested on a da830 and a da850. It was only compiled for an omap1 platform (don't have the hardware) but it should be low risk. Note that the platform_device data is already set up in arch/arm/mach-omap1/devices.c so it those platforms should "Just Work(tm)". drivers/rtc/Kconfig | 7 ++++--- drivers/rtc/rtc-omap.c | 47 ++++++++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 81adbdb..f06e885 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -539,10 +539,11 @@ comment "on-CPU RTC drivers" config RTC_DRV_OMAP tristate "TI OMAP1" - depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 + depends on ARCH_OMAP15XX || ARCH_OMAP16XX || ARCH_OMAP730 || ARCH_DAVINCI_DA8XX help - Say "yes" here to support the real time clock on TI OMAP1 chips. - This driver can also be built as a module called rtc-omap. + Say "yes" here to support the real time clock on TI OMAP1 and + DA8xx/OMAP-L13x chips. This driver can also be built as a + module called rtc-omap. config RTC_DRV_S3C tristate "Samsung S3C series SoC RTC" 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);