From patchwork Tue Jan 13 09:15:04 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthias Fuchs X-Patchwork-Id: 18194 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from wf-out-1516.google.com (wf-out-1516.google.com [209.85.200.162]) by ozlabs.org (Postfix) with ESMTP id CED29DE151 for ; Tue, 13 Jan 2009 20:15:15 +1100 (EST) Received: by wf-out-1516.google.com with SMTP id r34so2929308wfc.41 for ; Tue, 13 Jan 2009 01:15:14 -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:received:from:to:subject:date:user-agent:cc :organization:mime-version:content-type:message-id:x-virus-scanned :x-virus-status:reply-to:sender:precedence:x-google-loop :mailing-list:list-id:list-post:list-help:list-unsubscribe :x-beenthere-env:x-beenthere; bh=fXcWV/by+iWhZkwduMafcdy5XSajn/130ZVjNaM6iDw=; b=y+AQ087yKrd6c9vEvkts4Z4YZw8rzMI8lc5pD7qIgkc/1Dew3BzXgC9ccAipFeMaKZ bTxIyz08iwuIFaj9ild43VldZ/g7TpoGC68wdYFyZ2oiXQd20Ggg4LyDz56DzpThuGtB z+V6LkGAtSUy2APijoqe7h1Z+3dXQNxk14bVc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlegroups.com; s=beta; h=x-sender:x-apparently-to:received-spf:authentication-results:from :to:subject:date:user-agent:cc:organization:mime-version :content-type:message-id:x-virus-scanned:x-virus-status:reply-to :sender:precedence:x-google-loop:mailing-list:list-id:list-post :list-help:list-unsubscribe:x-beenthere-env:x-beenthere; b=UI2VfzXJzSpE3K/2HLQ4W5byv42sNwUE5Ch6nPb95g1mprV22rG1Ikjv9+Xq/hGMDl VMRsrFLIDt65WFcXXNNstadGlC6F8omEuieMCEiweS83I4U9BuZvQj30BGBFzHjha0PP mmyfsMyOCN8GMJFThEnO0spPLhI/RYy5Zdl/k= Received: by 10.142.135.13 with SMTP id i13mr1785154wfd.26.1231838111580; Tue, 13 Jan 2009 01:15:11 -0800 (PST) Received: by 10.230.111.65 with SMTP id r1gr1793vbp.0; Tue, 13 Jan 2009 01:15:11 -0800 (PST) X-Sender: matthias.fuchs@esd-electronics.com X-Apparently-To: rtc-linux@googlegroups.com Received: by 10.150.157.17 with SMTP id f17mr3651316ybe.2.1231838110757; Tue, 13 Jan 2009 01:15:10 -0800 (PST) Received: from mail-in-03.arcor-online.net (mail-in-03.arcor-online.net [151.189.21.43]) by mx.google.com with ESMTP id 7si15359626yxg.2.2009.01.13.01.15.10; Tue, 13 Jan 2009 01:15:10 -0800 (PST) Received-SPF: neutral (google.com: 151.189.21.43 is neither permitted nor denied by best guess record for domain of matthias.fuchs@esd-electronics.com) client-ip=151.189.21.43; Authentication-Results: mx.google.com; spf=neutral (google.com: 151.189.21.43 is neither permitted nor denied by best guess record for domain of matthias.fuchs@esd-electronics.com) smtp.mail=matthias.fuchs@esd-electronics.com Received: from mail-in-12-z2.arcor-online.net (mail-in-12-z2.arcor-online.net [151.189.8.29]) by mail-in-03.arcor-online.net (Postfix) with ESMTP id 606792CB9B2; Tue, 13 Jan 2009 10:15:09 +0100 (CET) Received: from mail-in-12.arcor-online.net (mail-in-12.arcor-online.net [151.189.21.52]) by mail-in-12-z2.arcor-online.net (Postfix) with ESMTP id 467CD279455; Tue, 13 Jan 2009 10:15:09 +0100 (CET) Received: from bunny.home (dslb-088-070-094-033.pools.arcor-ip.net [88.70.94.33]) by mail-in-12.arcor-online.net (Postfix) with ESMTP id 0F5178C468; Tue, 13 Jan 2009 10:15:09 +0100 (CET) Received: from fox.localnet (fox.home [192.168.2.13]) by bunny.home (Postfix) with ESMTPS id 9849A251078C; Tue, 13 Jan 2009 10:14:49 +0100 (CET) From: Matthias Fuchs To: rtc-linux@googlegroups.com Subject: [rtc-linux] [PATCH V2] rtc: Add EPSON RX8025 support to DS1307 RTC driver Date: Tue, 13 Jan 2009 10:15:04 +0100 User-Agent: KMail/1.10.3 (Linux/2.6.27-9-generic; KDE/4.1.3; i686; ; ) Cc: Alessandro Zummo Organization: esd gmbh Mime-Version: 1.0 Message-Id: <200901131015.05651.matthias.fuchs@esd-electronics.com> X-Virus-Scanned: ClamAV 0.94.1/8857/Tue Jan 13 08:35:27 2009 on mail-in-12.arcor-online.net X-Virus-Status: Clean 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 This patch adds support for the EPSON RX8025 RTC. The date/time registers of this chip are compatible to the DS1307. Signed-off-by: Matthias Fuchs --- drivers/rtc/Kconfig | 7 ++-- drivers/rtc/rtc-ds1307.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 4ad831d..2b2d461 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -129,13 +129,14 @@ comment "I2C RTC drivers" if I2C config RTC_DRV_DS1307 - tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00" + tristate "Dallas/Maxim DS1307/37/38/39/40, ST M41T00, EPSON RX-8025" help If you say yes here you get support for various compatible RTC chips (often with battery backup) connected with I2C. This driver should handle DS1307, DS1337, DS1338, DS1339, DS1340, ST M41T00, - and probably other chips. In some cases the RTC must already - have been initialized (by manufacturing or a bootloader). + EPSON RX-8025 and probably other chips. In some cases the RTC + must already have been initialized (by manufacturing or a + bootloader). The first seven registers on these chips hold an RTC, and other registers may add features such as NVRAM, a trickle charger for diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 7e5155e..ad70e26 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -3,6 +3,7 @@ * * Copyright (C) 2005 James Chapman (ds1337 core) * Copyright (C) 2006 David Brownell + * Copyright (C) 2009 Matthias Fuchs (rx8025 support) * * 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 @@ -31,6 +32,7 @@ enum ds_type { ds_1339, ds_1340, m41t00, + rx_8025, // rs5c372 too? different address... }; @@ -83,6 +85,12 @@ enum ds_type { #define DS1339_REG_ALARM1_SECS 0x07 #define DS1339_REG_TRICKLE 0x10 +#define RX8025_REG_CTRL1 0x0e +# define RX8025_BIT_2412 0x20 +#define RX8025_REG_CTRL2 0x0f +# define RX8025_BIT_PON 0x10 +# define RX8025_BIT_VDET 0x40 +# define RX8025_BIT_XST 0x20 struct ds1307 { @@ -117,6 +125,8 @@ static const struct chip_desc chips[] = { [ds_1340] = { }, [m41t00] = { +}, +[rx_8025] = { }, }; static const struct i2c_device_id ds1307_id[] = { @@ -126,6 +136,7 @@ static const struct i2c_device_id ds1307_id[] = { { "ds1339", ds_1339 }, { "ds1340", ds_1340 }, { "m41t00", m41t00 }, + { "rx8025", rx_8025 }, { } }; MODULE_DEVICE_TABLE(i2c, ds1307_id); @@ -589,6 +600,72 @@ static int __devinit ds1307_probe(struct i2c_client *client, dev_warn(&client->dev, "SET TIME!\n"); } break; + + case rx_8025: + tmp = i2c_smbus_read_i2c_block_data(ds1307->client, + RX8025_REG_CTRL1 << 4 | 0x08, 2, buf); + if (tmp != 2) { + pr_debug("read error %d\n", tmp); + err = -EIO; + goto exit_free; + } + + /* oscillator off? turn it on, so clock can tick. */ + if (!(ds1307->regs[1] & RX8025_BIT_XST)) { + ds1307->regs[1] |= RX8025_BIT_XST; + i2c_smbus_write_byte_data(client, + RX8025_REG_CTRL2 << 4 | 0x08, + ds1307->regs[1]); + dev_warn(&client->dev, + "oscillator stop detected - SET TIME!\n"); + } + + if (ds1307->regs[1] & RX8025_BIT_PON) { + ds1307->regs[1] &= ~RX8025_BIT_PON; + i2c_smbus_write_byte_data(client, + RX8025_REG_CTRL2 << 4 | 0x08, + ds1307->regs[1]); + dev_warn(&client->dev, "power-on detected\n"); + } + + if (ds1307->regs[1] & RX8025_BIT_VDET) { + ds1307->regs[1] &= ~RX8025_BIT_VDET; + i2c_smbus_write_byte_data(client, + RX8025_REG_CTRL2 << 4 | 0x08, + ds1307->regs[1]); + dev_warn(&client->dev, "voltage drop detected\n"); + } + + /* make sure we are running in 24hour mode */ + if (!(ds1307->regs[0] & RX8025_BIT_2412)) { + u8 hour; + + /* switch to 24 hour mode */ + i2c_smbus_write_byte_data(client, + RX8025_REG_CTRL1 << 4 | 0x08, + ds1307->regs[0] | + RX8025_BIT_2412); + + tmp = i2c_smbus_read_i2c_block_data(ds1307->client, + RX8025_REG_CTRL1 << 4 | 0x08, 2, buf); + if (tmp != 2) { + pr_debug("read error %d\n", tmp); + err = -EIO; + goto exit_free; + } + + /* correct hour */ + hour = bcd2bin(ds1307->regs[DS1307_REG_HOUR]); + if (hour == 12) + hour = 0; + if (ds1307->regs[DS1307_REG_HOUR] & DS1307_BIT_PM) + hour += 12; + + i2c_smbus_write_byte_data(client, + DS1307_REG_HOUR << 4 | 0x08, + hour); + } + break; default: break; } @@ -649,6 +726,7 @@ read_rtc: dev_warn(&client->dev, "SET TIME!\n"); } break; + case rx_8025: case ds_1337: case ds_1339: break; @@ -662,6 +740,8 @@ read_rtc: * systems that will run through year 2100. */ break; + case rx_8025: + break; default: if (!(tmp & DS1307_BIT_12HR)) break;