[PATCH 2.6] Add generic support for DS1377 RTC
Wolfgang Denk
wd at denx.de
Sun Oct 23 07:05:11 EST 2005
The following patch (against current Linux 2.6 tree) moves generic
DS1377 RTC support from the "radstone_ppc7d" platform specific file
to it's proper place ("drivers/i2c/chips/ds1337.c") and makes it thus
common and available for other boards too.
---
Add common ds1337_get_rtc_time() and ds1337_set_rtc_time() routines.
Derived from radstone platform specific code.
Fix BIN2BCD month conversion.
Signed-off-by: Marian Balakowicz <m8 at semihalf.com>
Signed-off-by: Wolfgang Denk <wd at denx.de>
---
commit 80387b45146a9e397c1fec1138f3eb3884c42ed8
tree 690680af98e271f64025a49c30b1bfcb5b5c465c
parent d85b5d8b85163f43dd2d7d62dbd3db630cbe2663
author Marian Balakowicz <m8 at semihalf.com> Tue, 18 Oct 2005 18:32:28 +0200
committer Marian Balakowicz <m8 at semihalf.com> Tue, 18 Oct 2005 18:32:28 +0200
arch/ppc/platforms/radstone_ppc7d.c | 48 ++++++++---------------------------
drivers/i2c/chips/ds1337.c | 44 +++++++++++++++++++++++++++++++-
2 files changed, 53 insertions(+), 39 deletions(-)
diff --git a/arch/ppc/platforms/radstone_ppc7d.c b/arch/ppc/platforms/radstone_ppc7d.c
--- a/arch/ppc/platforms/radstone_ppc7d.c
+++ b/arch/ppc/platforms/radstone_ppc7d.c
@@ -1,6 +1,11 @@
/*
* arch/ppc/platforms/radstone_ppc7d.c
*
+ * Copyright 2005 DENX Software Engineering
+ * ppc7d_get_rtc_time(), ppc7d_set_rtc_time() renamed
+ * to generic ds1337_get_rtc_time() and ds1337_set_rtc_time()
+ * and moved to ds1337.c
+ *
* Board setup routines for the Radstone PPC7D boards.
*
* Author: James Chapman <jchapman at katalix.com>
@@ -74,10 +79,10 @@ static int ppc7d_has_alma;
extern void gen550_progress(char *, unsigned short);
extern void gen550_init(int, struct uart_port *);
-/* FIXME - move to h file */
-extern int ds1337_do_command(int id, int cmd, void *arg);
-#define DS1337_GET_DATE 0
-#define DS1337_SET_DATE 1
+/* Real Time Clock support.
+ * PPC7D has a DS1337 accessed by I2C. */
+extern ulong ds1337_get_rtc_time(void);
+extern int ds1337_set_rtc_time(unsigned long nowtime);
/* residual data */
unsigned char __res[sizeof(bd_t)];
@@ -1249,37 +1254,6 @@ static void __init ppc7d_setup_arch(void
}
-/* Real Time Clock support.
- * PPC7D has a DS1337 accessed by I2C.
- */
-static ulong ppc7d_get_rtc_time(void)
-{
- struct rtc_time tm;
- int result;
-
- spin_lock(&rtc_lock);
- result = ds1337_do_command(0, DS1337_GET_DATE, &tm);
- spin_unlock(&rtc_lock);
-
- if (result == 0)
- result = mktime(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
-
- return result;
-}
-
-static int ppc7d_set_rtc_time(unsigned long nowtime)
-{
- struct rtc_time tm;
- int result;
-
- spin_lock(&rtc_lock);
- to_tm(nowtime, &tm);
- result = ds1337_do_command(0, DS1337_SET_DATE, &tm);
- spin_unlock(&rtc_lock);
-
- return result;
-}
-
/* This kernel command line parameter can be used to have the target
* wait for a JTAG debugger to attach. Of course, a JTAG debugger
* with hardware breakpoint support can have the target stop at any
@@ -1336,8 +1310,8 @@ static void ppc7d_init2(void)
outb(data8, PPC7D_CPLD_LEDS);
/* Hook up RTC. We couldn't do this earlier because we need the I2C subsystem */
- ppc_md.set_rtc_time = ppc7d_set_rtc_time;
- ppc_md.get_rtc_time = ppc7d_get_rtc_time;
+ ppc_md.set_rtc_time = ds1337_set_rtc_time;
+ ppc_md.get_rtc_time = ds1337_get_rtc_time;
pr_debug("%s: exit\n", __FUNCTION__);
}
diff --git a/drivers/i2c/chips/ds1337.c b/drivers/i2c/chips/ds1337.c
--- a/drivers/i2c/chips/ds1337.c
+++ b/drivers/i2c/chips/ds1337.c
@@ -1,6 +1,10 @@
/*
* linux/drivers/i2c/chips/ds1337.c
*
+ * Copyright 2005 DENX Software Engineering
+ * Added ds1337_get_rtc_time and ds1337_set_rtc_time routines.
+ * Based on radstone platform specific code.
+ *
* Copyright (C) 2005 James Chapman <jchapman at katalix.com>
*
* based on linux/drivers/acorn/char/pcf8583.c
@@ -21,6 +25,7 @@
#include <linux/rtc.h> /* get the user-level API */
#include <linux/bcd.h>
#include <linux/list.h>
+#include <asm/time.h>
/* Device registers */
#define DS1337_REG_HOUR 2
@@ -34,6 +39,8 @@
#define DS1337_GET_DATE 0
#define DS1337_SET_DATE 1
+extern spinlock_t rtc_lock;
+
/*
* Functions declaration
*/
@@ -164,9 +171,9 @@ static int ds1337_set_datetime(struct i2
buf[1] = BIN2BCD(dt->tm_sec);
buf[2] = BIN2BCD(dt->tm_min);
buf[3] = BIN2BCD(dt->tm_hour);
- buf[4] = BIN2BCD(dt->tm_wday) + 1;
+ buf[4] = BIN2BCD(dt->tm_wday + 1);
buf[5] = BIN2BCD(dt->tm_mday);
- buf[6] = BIN2BCD(dt->tm_mon) + 1;
+ buf[6] = BIN2BCD(dt->tm_mon + 1);
val = dt->tm_year;
if (val >= 100) {
val -= 100;
@@ -223,6 +230,37 @@ int ds1337_do_command(int bus, int cmd,
return -ENODEV;
}
+ulong ds1337_get_rtc_time(void)
+{
+ struct rtc_time tm;
+ int result;
+
+ spin_lock(&rtc_lock);
+ result = ds1337_do_command(0, DS1337_GET_DATE, &tm);
+ spin_unlock(&rtc_lock);
+
+ if (result == 0)
+ result = mktime(tm.tm_year + 1900, tm.tm_mon + 1,
+ tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
+
+ return result;
+}
+
+int ds1337_set_rtc_time(unsigned long nowtime)
+{
+ struct rtc_time tm;
+ int result;
+
+ spin_lock(&rtc_lock);
+ to_tm(nowtime, &tm);
+ tm.tm_year -= 1900;
+ tm.tm_mon -= 1;
+ result = ds1337_do_command(0, DS1337_SET_DATE, &tm);
+ spin_unlock(&rtc_lock);
+
+ return result;
+}
+
static int ds1337_attach_adapter(struct i2c_adapter *adapter)
{
return i2c_probe(adapter, &addr_data, ds1337_detect);
@@ -375,6 +413,8 @@ MODULE_DESCRIPTION("DS1337 RTC driver");
MODULE_LICENSE("GPL");
EXPORT_SYMBOL_GPL(ds1337_do_command);
+EXPORT_SYMBOL_GPL(ds1337_get_rtc_time);
+EXPORT_SYMBOL_GPL(ds1337_set_rtc_time);
module_init(ds1337_init);
module_exit(ds1337_exit);
!-------------------------------------------------------------flip-
More information about the Linuxppc-dev
mailing list