From patchwork Wed Jul 25 06:12:03 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mohammed Afzal X-Patchwork-Id: 173110 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-gg0-f184.google.com (mail-gg0-f184.google.com [209.85.161.184]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 47A212C0083 for ; Wed, 25 Jul 2012 16:12:47 +1000 (EST) Received: by mail-gg0-f184.google.com with SMTP id o6sf339916ggm.11 for ; Tue, 24 Jul 2012 23:12:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=beta; h=x-beenthere:received-spf:from:to:cc:subject:date:message-id :x-mailer:in-reply-to:references:mime-version:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:x-google-group-id:list-post:list-help:list-archive:sender :list-subscribe:list-unsubscribe:content-type; bh=aTlvwjXW2tre3xA56n+kAKEsRLCejbjyN68PBzIlcwE=; b=ugqsrR3OOVn1K1Ww28aifeZYWWWxyYG5epEOKYG65WSesSZxFrObpC4xxtVfFopwvS klVsDfEEUMHyf7hwmWtgRFVeLgldq64O7HQRcc93cEPsjluYgIY36QMpgKqxCnjehlPD gZHXdVxQv/GXY3GaI2mw4I1KbIgfdw0Vtezhs= Received: by 10.182.76.233 with SMTP id n9mr267349obw.0.1343196766565; Tue, 24 Jul 2012 23:12:46 -0700 (PDT) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.231.62.200 with SMTP id y8ls185179ibh.5.gmail; Tue, 24 Jul 2012 23:12:45 -0700 (PDT) Received: by 10.43.59.7 with SMTP id wm7mr5284739icb.26.1343196765954; Tue, 24 Jul 2012 23:12:45 -0700 (PDT) Received: by 10.43.59.7 with SMTP id wm7mr5284738icb.26.1343196765942; Tue, 24 Jul 2012 23:12:45 -0700 (PDT) Received: from arroyo.ext.ti.com (arroyo.ext.ti.com. [192.94.94.40]) by gmr-mx.google.com with ESMTPS id v3si206188igw.1.2012.07.24.23.12.45 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 24 Jul 2012 23:12:45 -0700 (PDT) Received-SPF: neutral (google.com: 192.94.94.40 is neither permitted nor denied by best guess record for domain of ubnuser@udx0156546) client-ip=192.94.94.40; Received: from dbdp20.itg.ti.com ([172.24.170.38]) by arroyo.ext.ti.com (8.13.7/8.13.7) with ESMTP id q6P6C6iv007177; Wed, 25 Jul 2012 01:12:12 -0500 Received: from DBDE71.ent.ti.com (localhost [127.0.0.1]) by dbdp20.itg.ti.com (8.13.8/8.13.8) with ESMTP id q6P6C45j005915; Wed, 25 Jul 2012 11:42:04 +0530 (IST) Received: from dbdp32.itg.ti.com (172.24.170.251) by DBDE71.ent.ti.com (172.24.170.149) with Microsoft SMTP Server id 14.1.323.3; Wed, 25 Jul 2012 11:42:04 +0530 Received: from udx0156546 (smtpvbd.itg.ti.com [172.24.170.250]) by dbdp32.itg.ti.com (8.13.8/8.13.8) with ESMTP id q6P6C4mw019478; Wed, 25 Jul 2012 11:42:04 +0530 Received: from ubnuser by udx0156546 with local (Exim 4.72) (envelope-from ) id 1StupH-0003cY-OA; Wed, 25 Jul 2012 11:42:03 +0530 From: Afzal Mohammed To: , , , , , , , , , , , , , CC: Afzal Mohammed Subject: [rtc-linux] [PATCH v2 1/6] rtc: omap: kicker mechanism support Date: Wed, 25 Jul 2012 11:42:03 +0530 Message-ID: X-Mailer: git-send-email 1.7.1 In-Reply-To: References: MIME-Version: 1.0 X-Original-Sender: afzal@ti.com X-Original-Authentication-Results: gmr-mx.google.com; spf=neutral (google.com: 192.94.94.40 is neither permitted nor denied by best guess record for domain of ubnuser@udx0156546) smtp.mail=ubnuser@udx0156546 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: Sender: rtc-linux@googlegroups.com List-Subscribe: , List-Unsubscribe: , OMAP RTC IP can have kicker feature. This prevents spurious writes to register. To write to registers kicker lock has to be released. Procedure to do it as follows, 1. write to kick0 register, 0x83e70b13 2. write to kick1 register, 0x95a4f1e0 Writing value other than 0x83e70b13 to kick0 enables write locking, more details about kicker mechanism can be found in section 20.3.3.5.3 of AM335X TRM @www.ti.com/am335x Here id table information is added and is used to distinguish those that require kicker handling and the ones that doesn't need it. There are more features in the newer IP's compared to legacy ones other than kicker, which driver currently doesn't handle, supporting additional features would be easier with the addition of id table. Older IP (of OMAP1) doesn't have revision register as per TRM, so revision register can't be relied always to find features, hence id table is being used. Signed-off-by: Afzal Mohammed --- v2: Use device name da830-rtc instead of am1808-rtc Newly added register name made similar to that existing in the driver Better commit message description drivers/rtc/rtc-omap.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 files changed, 38 insertions(+), 1 deletions(-) diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c index 0b614e3..8afbc2e 100644 --- a/drivers/rtc/rtc-omap.c +++ b/drivers/rtc/rtc-omap.c @@ -38,6 +38,8 @@ * the SoC). See the BOARD-SPECIFIC CUSTOMIZATION comment. */ +#define DRIVER_NAME "omap_rtc" + #define OMAP_RTC_BASE 0xfffb4800 /* RTC registers */ @@ -64,6 +66,9 @@ #define OMAP_RTC_COMP_MSB_REG 0x50 #define OMAP_RTC_OSC_REG 0x54 +#define OMAP_RTC_KICK0_REG 0x6c +#define OMAP_RTC_KICK1_REG 0x70 + /* OMAP_RTC_CTRL_REG bit fields: */ #define OMAP_RTC_CTRL_SPLIT (1<<7) #define OMAP_RTC_CTRL_DISABLE (1<<6) @@ -88,11 +93,19 @@ #define OMAP_RTC_INTERRUPTS_IT_ALARM (1<<3) #define OMAP_RTC_INTERRUPTS_IT_TIMER (1<<2) +/* OMAP_RTC_KICKER values */ +#define KICK0_VALUE (0x83e70b13) +#define KICK1_VALUE (0x95a4f1e0) + +#define OMAP_RTC_HAS_KICKER 0x1 + static void __iomem *rtc_base; #define rtc_read(addr) __raw_readb(rtc_base + (addr)) #define rtc_write(val, addr) __raw_writeb(val, rtc_base + (addr)) +#define rtc_writel(val, addr) writel(val, rtc_base + (addr)) + /* we rely on the rtc framework to handle locking (rtc->ops_lock), * so the only other requirement is that register accesses which @@ -285,11 +298,22 @@ static struct rtc_class_ops omap_rtc_ops = { static int omap_rtc_alarm; static int omap_rtc_timer; +static struct platform_device_id omap_rtc_devtype[] = { + { + .name = DRIVER_NAME, + }, { + .name = "da830-rtc", + .driver_data = OMAP_RTC_HAS_KICKER, + } +}; +MODULE_DEVICE_TABLE(platform, omap_rtc_devtype); + static int __init omap_rtc_probe(struct platform_device *pdev) { struct resource *res, *mem; struct rtc_device *rtc; u8 reg, new_ctrl; + const struct platform_device_id *id_entry; omap_rtc_timer = platform_get_irq(pdev, 0); if (omap_rtc_timer <= 0) { @@ -322,6 +346,12 @@ static int __init omap_rtc_probe(struct platform_device *pdev) goto fail; } + id_entry = platform_get_device_id(pdev); + if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER)) { + rtc_writel(KICK0_VALUE, OMAP_RTC_KICK0_REG); + rtc_writel(KICK1_VALUE, OMAP_RTC_KICK1_REG); + } + rtc = rtc_device_register(pdev->name, &pdev->dev, &omap_rtc_ops, THIS_MODULE); if (IS_ERR(rtc)) { @@ -398,6 +428,8 @@ fail2: fail1: rtc_device_unregister(rtc); fail0: + if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER)) + rtc_writel(0, OMAP_RTC_KICK0_REG); iounmap(rtc_base); fail: release_mem_region(mem->start, resource_size(mem)); @@ -408,6 +440,8 @@ static int __exit omap_rtc_remove(struct platform_device *pdev) { struct rtc_device *rtc = platform_get_drvdata(pdev); struct resource *mem = dev_get_drvdata(&rtc->dev); + const struct platform_device_id *id_entry = + platform_get_device_id(pdev); device_init_wakeup(&pdev->dev, 0); @@ -420,6 +454,8 @@ static int __exit omap_rtc_remove(struct platform_device *pdev) free_irq(omap_rtc_alarm, rtc); rtc_device_unregister(rtc); + if (id_entry && (id_entry->driver_data & OMAP_RTC_HAS_KICKER)) + rtc_writel(0, OMAP_RTC_KICK0_REG); iounmap(rtc_base); release_mem_region(mem->start, resource_size(mem)); return 0; @@ -471,9 +507,10 @@ static struct platform_driver omap_rtc_driver = { .resume = omap_rtc_resume, .shutdown = omap_rtc_shutdown, .driver = { - .name = "omap_rtc", + .name = DRIVER_NAME, .owner = THIS_MODULE, }, + .id_table = omap_rtc_devtype, }; static int __init rtc_init(void)