From patchwork Fri Feb 20 16:44:41 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hartley Sweeten X-Patchwork-Id: 23493 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from yw-out-2122.google.com (yw-out-2122.google.com [74.125.46.25]) by ozlabs.org (Postfix) with ESMTP id D6575DDDA9 for ; Sat, 21 Feb 2009 03:44:59 +1100 (EST) Received: by yw-out-2122.google.com with SMTP id 4so1021999ywc.11 for ; Fri, 20 Feb 2009 08:44:58 -0800 (PST) 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-spf:authentication-results:received :received:received:x-mimeole:content-class:mime-version:content-type :content-transfer-encoding:subject:date:message-id:in-reply-to :x-ms-has-attach:x-ms-tnef-correlator:thread-topic:thread-index :references:from:to:cc:x-originalarrivaltime:reply-to:sender :precedence:x-google-loop:mailing-list:list-id:list-post:list-help :list-unsubscribe:x-beenthere-env:x-beenthere; bh=BDXNcsx69BDm4NUs1iW5oHfL2ThksjfHCqmdB3WoCbo=; b=De0HoXFG3H8Lg93Sn3XX6xFWqJDkaQL58e9FHsqkGtWtY2NKR8OHBD0SxDRWIHLtdE YU5kLETLpyVu5xDS1B+G4uU6zdw6/3CgDUklN2h5eo+RNCZjptI/15tKvcRb9OqCxayN LeVkgTVWGLOsbcyicRb7BjaDxivg2cQ/YbSno= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlegroups.com; s=beta; h=x-sender:x-apparently-to:received-spf:authentication-results :x-mimeole:content-class:mime-version:content-type :content-transfer-encoding:subject:date:message-id:in-reply-to :x-ms-has-attach:x-ms-tnef-correlator:thread-topic:thread-index :references:from:to:cc:x-originalarrivaltime:reply-to:sender :precedence:x-google-loop:mailing-list:list-id:list-post:list-help :list-unsubscribe:x-beenthere-env:x-beenthere; b=TNk7WrmhWpMnzEtweZ59konyWZlvb4OHDL3R3Uh2pjM022feH4Ld1T7WN9ohfCVyg7 hESlpbuuksVk7cSFDjjQ6AD45kV4lqJ/E3N3vuNDOFq3RKbXPojyqknd5nyGw/0xtTvF NN2/MZhnZ539CZXvtU/w/uVVaXq2lHIwqpsms= Received: by 10.150.137.14 with SMTP id k14mr561104ybd.23.1235148295247; Fri, 20 Feb 2009 08:44:55 -0800 (PST) Received: by 10.176.92.38 with SMTP id p38gr1921yqb.0; Fri, 20 Feb 2009 08:44:55 -0800 (PST) X-Sender: hartleys@visionengravers.com X-Apparently-To: rtc-linux@googlegroups.com Received: by 10.229.91.66 with SMTP id l2mr798340qcm.16.1235148292418; Fri, 20 Feb 2009 08:44:52 -0800 (PST) Received: from psmtp.com (exprod6ob113.obsmtp.com [64.18.1.30]) by mx.google.com with SMTP id 14si360776gxk.3.2009.02.20.08.44.51; Fri, 20 Feb 2009 08:44:52 -0800 (PST) Received-SPF: neutral (google.com: 64.18.1.30 is neither permitted nor denied by best guess record for domain of hartleys@visionengravers.com) client-ip=64.18.1.30; Authentication-Results: mx.google.com; spf=neutral (google.com: 64.18.1.30 is neither permitted nor denied by best guess record for domain of hartleys@visionengravers.com) smtp.mail=hartleys@visionengravers.com Received: from source ([63.240.6.3]) (using TLSv1) by exprod6ob113.postini.com ([64.18.5.12]) with SMTP ID DSNKSZ7eA1AWr7ggcaRxpRGjgRcZaN6CTWkK@postini.com; Fri, 20 Feb 2009 08:44:51 PST Received: from D01SMTP04.Mi8.com ([172.16.1.243]) by Outbound01.Mi8.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 20 Feb 2009 11:44:51 -0500 Received: from mi8nycmail19.Mi8.com ([172.16.7.219]) by D01SMTP04.Mi8.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 20 Feb 2009 11:44:51 -0500 X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message Mime-Version: 1.0 Subject: [rtc-linux] Re: [PATCH] ep93xx-rtc: use ioremap'ed addresses Date: Fri, 20 Feb 2009 11:44:41 -0500 Message-ID: In-Reply-To: <20090220120529.09ab182a@i1501.lan.towertech.it> X-MS-Has-Attach: X-MS-TNEF-Correlator: Thread-Topic: [rtc-linux] RE: [PATCH] ep93xx-rtc: use ioremap'ed addresses Thread-Index: AcmTSylijZyacXvjQJadaX1uq0yV+AALvaGw References: <20090220120529.09ab182a@i1501.lan.towertech.it> From: "hartleys" To: "Alessandro Zummo" , Cc: "arm kernel" X-OriginalArrivalTime: 20 Feb 2009 16:44:51.0158 (UTC) FILETIME=[8CA35F60:01C9937A] 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 On Friday, February 20, 2009 4:05 AM, Alessandro Zummo wrote: >> I had shortened the ep93xx_rtc_platform_driver variable name to >> ep93xx_rtcdrv in order to keep the platform_driver_probe() line length >> short. If I change the variable name back, or just change it to >> ep93xx_rtc_driver, the Section mismatch warning then doesn't show up >> when the __devexit_p() is used. > > there's some magic on the structure name . anyway if you use > platform_driver_probe you shuld be using __init/__exit/__exit_p Thanks for the clarification. I figured out the magic issue with the name after re-reading the warning message. Following is the updated patch using __init/__exit/__exit_p. This patch updates the rtc-ep93xx.c driver to use ioremap'ed addresses. This removes the dependency on and properly reports the memory addresses used by the driver in /proc/iomem. In addition, ep93xx_rtc_init() is updated to use platform_driver_probe() instead of platform_driver_register(). Signed-off-by: H Hartley Sweeten --- *preload = comp & 0xffff; @@ -37,7 +40,8 @@ static int ep93xx_get_swcomp(struct device *dev, unsigned short *preload, static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) { - unsigned long time = __raw_readl(EP93XX_RTC_DATA); + void __iomem *mmio_base = dev->platform_data; + unsigned long time = __raw_readl(mmio_base + EP93XX_RTC_DATA); rtc_time_to_tm(time, tm); return 0; @@ -45,7 +49,9 @@ static int ep93xx_rtc_read_time(struct device *dev, struct rtc_time *tm) static int ep93xx_rtc_set_mmss(struct device *dev, unsigned long secs) { - __raw_writel(secs + 1, EP93XX_RTC_LOAD); + void __iomem *mmio_base = dev->platform_data; + + __raw_writel(secs + 1, mmio_base + EP93XX_RTC_LOAD); return 0; } @@ -90,13 +96,34 @@ static ssize_t ep93xx_sysfs_show_comp_delete(struct device *dev, static DEVICE_ATTR(comp_delete, S_IRUGO, ep93xx_sysfs_show_comp_delete, NULL); -static int __devinit ep93xx_rtc_probe(struct platform_device *dev) +static int __init ep93xx_rtc_probe(struct platform_device *dev) { - struct rtc_device *rtc = rtc_device_register("ep93xx", - &dev->dev, &ep93xx_rtc_ops, THIS_MODULE); + struct resource *res; + void __iomem *mmio_base; + struct rtc_device *rtc; + int err; + + res = platform_get_resource(dev, IORESOURCE_MEM, 0); + if (res == NULL) + return -ENXIO; + + res = request_mem_region(res->start, resource_size(res), dev->name); + if (res == NULL) + return -EBUSY; + + mmio_base = ioremap(res->start, resource_size(res)); + if (mmio_base == NULL) { + err = -ENXIO; + goto fail; + } + dev->dev.platform_data = mmio_base; + + rtc = rtc_device_register(dev->name, + &dev->dev, &ep93xx_rtc_ops, THIS_MODULE); if (IS_ERR(rtc)) { - return PTR_ERR(rtc); + err = PTR_ERR(rtc); + goto fail; } platform_set_drvdata(dev, rtc); @@ -105,14 +132,29 @@ static int __devinit ep93xx_rtc_probe(struct platform_device *dev) device_create_file(&dev->dev, &dev_attr_comp_delete); return 0; + +fail: + if (mmio_base) { + iounmap(mmio_base); + dev->dev.platform_data = NULL; + } + release_mem_region(res->start, resource_size(res)); + return err; } -static int __devexit ep93xx_rtc_remove(struct platform_device *dev) +static int __exit ep93xx_rtc_remove(struct platform_device *dev) { struct rtc_device *rtc = platform_get_drvdata(dev); + void __iomem *mmio_base = dev->dev.platform_data; + struct resource *res; + + rtc_device_unregister(rtc); + + iounmap(mmio_base); + dev->dev.platform_data = NULL; - if (rtc) - rtc_device_unregister(rtc); + res = platform_get_resource(dev, IORESOURCE_MEM, 0); + release_mem_region(res->start, resource_size(res)); platform_set_drvdata(dev, NULL); @@ -122,23 +164,22 @@ static int __devexit ep93xx_rtc_remove(struct platform_device *dev) /* work with hotplug and coldplug */ MODULE_ALIAS("platform:ep93xx-rtc"); -static struct platform_driver ep93xx_rtc_platform_driver = { +static struct platform_driver ep93xx_rtc_driver = { .driver = { .name = "ep93xx-rtc", .owner = THIS_MODULE, }, - .probe = ep93xx_rtc_probe, - .remove = __devexit_p(ep93xx_rtc_remove), + .remove = __exit_p(ep93xx_rtc_remove), }; static int __init ep93xx_rtc_init(void) { - return platform_driver_register(&ep93xx_rtc_platform_driver); + return platform_driver_probe(&ep93xx_rtc_driver, ep93xx_rtc_probe); } static void __exit ep93xx_rtc_exit(void) { - platform_driver_unregister(&ep93xx_rtc_platform_driver); + platform_driver_unregister(&ep93xx_rtc_driver); } MODULE_AUTHOR("Alessandro Zummo "); --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to "rtc-linux". Membership options at http://groups.google.com/group/rtc-linux . Please read http://groups.google.com/group/rtc-linux/web/checklist before submitting a driver. -~----------~----~----~----~------~----~------~--~--- diff --git a/arch/arm/mach-ep93xx/core.c b/arch/arm/mach-ep93xx/core.c index 6d9152d..90254d8 100644 --- a/arch/arm/mach-ep93xx/core.c +++ b/arch/arm/mach-ep93xx/core.c @@ -449,11 +449,19 @@ static struct amba_device uart3_device = { .periphid = 0x00041010, }; +static struct resource ep93xx_rtc_resource[] = { + { + .start = EP93XX_RTC_PHYS_BASE, + .end = EP93XX_RTC_PHYS_BASE + 0x10c - 1, + .flags = IORESOURCE_MEM, + }, +}; static struct platform_device ep93xx_rtc_device = { - .name = "ep93xx-rtc", - .id = -1, - .num_resources = 0, + .name = "ep93xx-rtc", + .id = -1, + .num_resources = ARRAY_SIZE(ep93xx_rtc_resource), + .resource = ep93xx_rtc_resource, }; diff --git a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h index 22d6c9a..68e6b23 100644 --- a/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h +++ b/arch/arm/mach-ep93xx/include/mach/ep93xx-regs.h @@ -146,6 +146,7 @@ #define EP93XX_PWM_BASE (EP93XX_APB_VIRT_BASE + 0x00110000) #define EP93XX_RTC_BASE (EP93XX_APB_VIRT_BASE + 0x00120000) +#define EP93XX_RTC_PHYS_BASE (EP93XX_APB_PHYS_BASE + 0x00120000) #define EP93XX_SYSCON_BASE (EP93XX_APB_VIRT_BASE + 0x00130000) #define EP93XX_SYSCON_REG(x) (EP93XX_SYSCON_BASE + (x)) diff --git a/drivers/rtc/rtc-ep93xx.c b/drivers/rtc/rtc-ep93xx.c index f7a3283..5ebee3b 100644 --- a/drivers/rtc/rtc-ep93xx.c +++ b/drivers/rtc/rtc-ep93xx.c @@ -12,19 +12,22 @@ #include #include #include -#include +#include -#define EP93XX_RTC_REG(x) (EP93XX_RTC_BASE + (x)) -#define EP93XX_RTC_DATA EP93XX_RTC_REG(0x0000) -#define EP93XX_RTC_LOAD EP93XX_RTC_REG(0x000C) -#define EP93XX_RTC_SWCOMP EP93XX_RTC_REG(0x0108) +#define EP93XX_RTC_DATA 0x000 +#define EP93XX_RTC_MATCH 0x004 +#define EP93XX_RTC_STATUS 0x008 +#define EP93XX_RTC_LOAD 0x00C +#define EP93XX_RTC_CONTROL 0x010 +#define EP93XX_RTC_SWCOMP 0x108 #define DRV_VERSION "0.2" static int ep93xx_get_swcomp(struct device *dev, unsigned short *preload, unsigned short *delete) { - unsigned short comp = __raw_readl(EP93XX_RTC_SWCOMP); + void __iomem *mmio_base = dev->platform_data; + unsigned long comp = __raw_readl(mmio_base + EP93XX_RTC_SWCOMP); if (preload)