From patchwork Sat Nov 22 17:10:17 2008 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Daniel Ribeiro X-Patchwork-Id: 10231 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from mail-gx0-f56.google.com (mail-gx0-f56.google.com [209.85.217.56]) by ozlabs.org (Postfix) with ESMTP id C99DFDDE1F for ; Sun, 23 Nov 2008 04:10:34 +1100 (EST) Received: by gxk16 with SMTP id 16so1642700gxk.1 for ; Sat, 22 Nov 2008 09:10:32 -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 :dkim-signature:domainkey-signature:received:received:subject:from :to:cc:in-reply-to:references:mime-version:content-type:date :message-id:x-mailer:reply-to:sender:precedence:x-google-loop :mailing-list:list-id:list-post:list-help:list-unsubscribe :x-beenthere-env:x-beenthere; bh=S/sNX3L3BpL6lkEchTvuvw04UOb6/eMBFproZLWaT+g=; b=J/1QOsjp2zjOWAM9VPG2A9uUL6RYGQP0djQMI+CNYkXy6Px09QTm7QJUcycr3DOPlj g6WGZpjtlRHRErEsB67jTMHlBSOT/0/MpZe0lnnUbs3Ri6z1Nc9U4s41kSQMfE5QVK/s ywyVc3/w85uFcAQk5InETzPcC6tHzlZLHnrvI= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlegroups.com; s=beta; h=x-sender:x-apparently-to:received-spf:authentication-results :dkim-signature:domainkey-signature:subject:from:to:cc:in-reply-to :references:mime-version:content-type:date:message-id:x-mailer :reply-to:sender:precedence:x-google-loop:mailing-list:list-id :list-post:list-help:list-unsubscribe:x-beenthere-env:x-beenthere; b=5tKSqboI2lXedmHtrB/MT/OA7i3kBGnVeAN3qQwU8jY0IKxLJoFUAnZfGp9+HI9gjU ZaxtMatoGJJk9d75/AoVKLylfwWMdVemOBywJCrn0oVIPQ/FcxNTyliJsS0F4SeNaD+N bDfUv5gyKO9HaBhCMHjjwj4UWuP/FnsiXPPXs= Received: by 10.90.26.9 with SMTP id 9mr120923agz.8.1227373829105; Sat, 22 Nov 2008 09:10:29 -0800 (PST) Received: by 10.230.24.145 with SMTP id v17gr1672vbb.0; Sat, 22 Nov 2008 09:10:28 -0800 (PST) X-Sender: drwyrm@gmail.com X-Apparently-To: rtc-linux@googlegroups.com Received: by 10.90.100.17 with SMTP id x17mr569537agb.5.1227373827962; Sat, 22 Nov 2008 09:10:27 -0800 (PST) Received: from qw-out-2122.google.com (qw-out-2122.google.com [74.125.92.26]) by mx.google.com with ESMTP id 22si2495691yxr.1.2008.11.22.09.10.26; Sat, 22 Nov 2008 09:10:26 -0800 (PST) Received-SPF: pass (google.com: domain of drwyrm@gmail.com designates 74.125.92.26 as permitted sender) client-ip=74.125.92.26; Authentication-Results: mx.google.com; spf=pass (google.com: domain of drwyrm@gmail.com designates 74.125.92.26 as permitted sender) smtp.mail=drwyrm@gmail.com; dkim=pass (test mode) header.i=@gmail.com Received: by qw-out-2122.google.com with SMTP id 9so296184qwb.7 for ; Sat, 22 Nov 2008 09:10:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:subject:from:to:cc :in-reply-to:references:content-type:date:message-id:mime-version :x-mailer; bh=YBuS/+TVrrXTu7iMb6I4+mt5cLt8kPc36hJTQIp1H/c=; b=SSfk0LzGXh3AO/8M17UiwVItJDX2sP8Wg9TBLqCHgt8x7fGcNnU5zm0EFKDu2oDWe7 TN7n3LKQXk0CRwc8ymOccyBE+sLbnL5xrW+VAI/B3pq+43qTeD3U+E8aVNlwfNTDuiC8 N88vBJ9bmK6wlJco6DJzkJ5UQdfygfHQIHG2s= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=subject:from:to:cc:in-reply-to:references:content-type:date :message-id:mime-version:x-mailer; b=RfFrtozKVEDlVpcGZd4DYuueHN3Dz16I8WGNbETA4/asRiPRbZhkVbqNEjn9yDKQdg A0VdZPhEPQbOXYpN5QjUGvRBt2nfiJ5BQnjXMY/ggCNI3BRLlXcopmYmiYkOpbHY1UeU VPmGseAqgcgzLg9bagaMg0tVKwn97BwLLY/8s= Received: by 10.214.114.14 with SMTP id m14mr1259575qac.145.1227373826788; Sat, 22 Nov 2008 09:10:26 -0800 (PST) Received: from ?192.168.1.3? (20158129042.user.veloxzone.com.br [201.58.129.42]) by mx.google.com with ESMTPS id 4sm2933762yxq.9.2008.11.22.09.10.23 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 22 Nov 2008 09:10:25 -0800 (PST) Subject: [rtc-linux] Re: [patch 12/14] PCAP2 RTC driver From: Daniel Ribeiro To: Alessandro Zummo Cc: rtc-linux@googlegroups.com, stefan@datenfreihafen.org, eric.y.miao@gmail.com, linux-arm-kernel@lists.arm.linux.org.uk, guiming zhuo , ao2@openezx.org In-Reply-To: <20081122031938.56e345c4@i1501.lan.towertech.it> References: <20081121160403.073751031@dodger.lab.datenfreihafen.org> <20081121160523.623809888@dodger.lab.datenfreihafen.org> <20081121171442.3e185c8a@i1501.lan.towertech.it> <20081121234953.GA28067@dodger.lab.datenfreihafen.org> <20081122031938.56e345c4@i1501.lan.towertech.it> Mime-Version: 1.0 Date: Sat, 22 Nov 2008 15:10:17 -0200 Message-Id: <1227373817.19591.63.camel@brutus> X-Mailer: Evolution 2.22.3.1 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 Em Sáb, 2008-11-22 às 03:19 +0100, Alessandro Zummo escreveu: > it's almost ok. Still a few comments below. > > Do you want me to carry this via -mm or will be going in via arm? > Anyway, we'll need your Signed-off-by I think its better to go via arm as it depends on the pcap driver which is still on review. > are you sure you need all of those > (string sched version ? ) > why a struct timeval? also in the following routines: > you can omit set_time if you implement set_mmss. the latest rtc subsystem > will handle it. see http://patchwork.ozlabs.org/patch/9977/ > irq enabling should be implemented via > alarm_irq_enable and update_irq_enable . you can then omit > ioctl, the rtc subsystem will handle it. > > see http://patchwork.ozlabs.org/patch/10039/ for details > just return PTR_ERR(rtc) here. > Above comments are integrated on the attached patch. (sorry, i dont trust my mail client to inline patches) diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 165a818..7b0ebb9 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -683,4 +683,11 @@ config RTC_DRV_STARFIRE If you say Y here you will get support for the RTC found on Starfire systems. +config RTC_DRV_PCAP + tristate "PCAP RTC" + depends on EZX_PCAP + help + If you say Y here you will get support for the RTC found on + the PCAP2 ASIC used on some Motorola phones. + endif # RTC_CLASS diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index 6e79c91..ae0daef 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -48,6 +48,7 @@ obj-$(CONFIG_RTC_DRV_STARFIRE) += rtc-starfire.o obj-$(CONFIG_RTC_DRV_MAX6900) += rtc-max6900.o obj-$(CONFIG_RTC_DRV_MAX6902) += rtc-max6902.o obj-$(CONFIG_RTC_DRV_OMAP) += rtc-omap.o +obj-$(CONFIG_RTC_DRV_PCAP) += rtc-pcap.o obj-$(CONFIG_RTC_DRV_PCF8563) += rtc-pcf8563.o obj-$(CONFIG_RTC_DRV_PCF8583) += rtc-pcf8583.o obj-$(CONFIG_RTC_DRV_PL030) += rtc-pl030.o diff --git a/drivers/rtc/rtc-pcap.c b/drivers/rtc/rtc-pcap.c new file mode 100644 index 0000000..37cbcee --- /dev/null +++ b/drivers/rtc/rtc-pcap.c @@ -0,0 +1,189 @@ +/* + * pcap rtc code for Motorola EZX phones + * + * Copyright (c) 2008 guiming zhuo + * Copyright (c) 2008 Daniel Ribeiro + * + * Based on Motorola's rtc.c Copyright (c) 2003-2005 Motorola + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + */ + +#include +#include +#include +#include +#include +#include + +static void pcap_rtc_irq(u32 events, void *data) +{ + unsigned long rtc_events = 0; + struct rtc_device *rtc = data; + + if (events & PCAP_IRQ_1HZ) + rtc_events |= RTC_IRQF | RTC_UF; + if (events & PCAP_IRQ_TODA) + rtc_events |= RTC_IRQF | RTC_AF; + + rtc_update_irq(rtc, 1, rtc_events); + return; +} + +static int pcap_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) +{ + struct rtc_time *tm = &alrm->time; + unsigned long secs; + u32 value; + + ezx_pcap_read(PCAP_REG_RTC_TODA, &value); + value &= PCAP_RTC_TOD_MASK; + secs = value; + + ezx_pcap_read(PCAP_REG_RTC_DAYA, &value); + value &= PCAP_RTC_DAY_MASK; + secs += value * SEC_PER_DAY; + + rtc_time_to_tm(secs, tm); + + return 0; +} + +static int pcap_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) +{ + struct rtc_time *tm = &alrm->time; + unsigned long secs; + u32 value; + + rtc_tm_to_time(tm, &secs); + + ezx_pcap_read(PCAP_REG_RTC_TODA, &value); + value &= ~PCAP_RTC_TOD_MASK; + value |= secs % SEC_PER_DAY; + ezx_pcap_write(PCAP_REG_RTC_TODA, value); + + ezx_pcap_read(PCAP_REG_RTC_DAYA, &value); + value &= ~PCAP_RTC_DAY_MASK; + value |= secs / SEC_PER_DAY; + ezx_pcap_write(PCAP_REG_RTC_DAYA, value); + + return 0; +} + +static int pcap_rtc_read_time(struct device *dev, struct rtc_time *tm) +{ + unsigned long secs; + u32 value; + + ezx_pcap_read(PCAP_REG_RTC_TOD, &value); + value &= PCAP_RTC_TOD_MASK; + secs = value; + + ezx_pcap_read(PCAP_REG_RTC_DAY, &value); + value &= PCAP_RTC_DAY_MASK; + secs += value * SEC_PER_DAY; + + rtc_time_to_tm(secs, tm); + + return rtc_valid_tm(tm); +} + +static int pcap_rtc_set_mmss(struct device *dev, unsigned long secs) +{ + u32 value; + + ezx_pcap_read(PCAP_REG_RTC_TOD, &value); + value &= ~PCAP_RTC_TOD_MASK; + value |= secs % SEC_PER_DAY; + ezx_pcap_write(PCAP_REG_RTC_TOD, value); + + ezx_pcap_read(PCAP_REG_RTC_DAY, &value); + value &= ~PCAP_RTC_DAY_MASK; + value |= secs / SEC_PER_DAY; + ezx_pcap_write(PCAP_REG_RTC_DAY, value); + + return 0; +} + +static int pcap_rtc_alarm_irq_enable(struct device *dev, unsigned int en) +{ + if (en) + ezx_pcap_unmask_event(PCAP_IRQ_TODA); + else + ezx_pcap_mask_event(PCAP_IRQ_TODA); + + return 0; +} + +static int pcap_rtc_update_irq_enable(struct device *dev, unsigned int en) +{ + if (en) + ezx_pcap_unmask_event(PCAP_IRQ_1HZ); + else + ezx_pcap_mask_event(PCAP_IRQ_1HZ); + + return 0; +} + +static const struct rtc_class_ops pcap_rtc_ops = { + .read_time = pcap_rtc_read_time, + .read_alarm = pcap_rtc_read_alarm, + .set_alarm = pcap_rtc_set_alarm, + .set_mmss = pcap_rtc_set_mmss, + .alarm_irq_enable = pcap_rtc_alarm_irq_enable, + .update_irq_enable = pcap_rtc_update_irq_enable, +}; + +static int __init pcap_rtc_probe(struct platform_device *plat_dev) +{ + struct rtc_device *rtc; + + rtc = rtc_device_register("pcap", &plat_dev->dev, + &pcap_rtc_ops, THIS_MODULE); + if (IS_ERR(rtc)) + return PTR_ERR(rtc); + + platform_set_drvdata(plat_dev, rtc); + + ezx_pcap_register_event(PCAP_IRQ_1HZ, pcap_rtc_irq, rtc, "RTC Timer"); + ezx_pcap_register_event(PCAP_IRQ_TODA, pcap_rtc_irq, rtc, "RTC Alarm"); + + return 0; +} + +static int __exit pcap_rtc_remove(struct platform_device *plat_dev) +{ + struct rtc_device *rtc = platform_get_drvdata(plat_dev); + + ezx_pcap_unregister_event(PCAP_IRQ_1HZ | PCAP_IRQ_TODA); + rtc_device_unregister(rtc); + return 0; +} + +static struct platform_driver pcap_rtc_driver = { + .remove = __exit_p(pcap_rtc_remove), + .driver = { + .name = "rtc-pcap", + .owner = THIS_MODULE, + }, +}; + +static int __init rtc_pcap_init(void) +{ + return platform_driver_probe(&pcap_rtc_driver, pcap_rtc_probe); +} + +static void __exit rtc_pcap_exit(void) +{ + platform_driver_unregister(&pcap_rtc_driver); +} + +module_init(rtc_pcap_init); +module_exit(rtc_pcap_exit); + +MODULE_DESCRIPTION("Motorola pcap rtc driver"); +MODULE_AUTHOR("guiming zhuo "); +MODULE_LICENSE("GPL");