Module Name: src Committed By: nonaka Date: Tue Apr 6 15:29:19 UTC 2010
Modified Files: src/sys/arch/landisk/dev: rs5c313_landisk.c src/sys/dev/ic: rs5c313.c rs5c313reg.h rs5c313var.h Log Message: Added support RICOH 5C316. To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/landisk/dev/rs5c313_landisk.c cvs rdiff -u -r1.8 -r1.9 src/sys/dev/ic/rs5c313.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/ic/rs5c313reg.h \ src/sys/dev/ic/rs5c313var.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/landisk/dev/rs5c313_landisk.c diff -u src/sys/arch/landisk/dev/rs5c313_landisk.c:1.4 src/sys/arch/landisk/dev/rs5c313_landisk.c:1.5 --- src/sys/arch/landisk/dev/rs5c313_landisk.c:1.4 Sun May 4 19:43:05 2008 +++ src/sys/arch/landisk/dev/rs5c313_landisk.c Tue Apr 6 15:29:19 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: rs5c313_landisk.c,v 1.4 2008/05/04 19:43:05 martin Exp $ */ +/* $NetBSD: rs5c313_landisk.c,v 1.5 2010/04/06 15:29:19 nonaka Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rs5c313_landisk.c,v 1.4 2008/05/04 19:43:05 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rs5c313_landisk.c,v 1.5 2010/04/06 15:29:19 nonaka Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -91,6 +91,7 @@ struct rs5c313_softc *sc = device_private(self); sc->sc_dev = self; + sc->sc_model = MODEL_5C313; sc->sc_ops = &rs5c313_landisk_ops; rs5c313_attach(sc); } Index: src/sys/dev/ic/rs5c313.c diff -u src/sys/dev/ic/rs5c313.c:1.8 src/sys/dev/ic/rs5c313.c:1.9 --- src/sys/dev/ic/rs5c313.c:1.8 Sun May 4 19:43:06 2008 +++ src/sys/dev/ic/rs5c313.c Tue Apr 6 15:29:19 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: rs5c313.c,v 1.8 2008/05/04 19:43:06 martin Exp $ */ +/* $NetBSD: rs5c313.c,v 1.9 2010/04/06 15:29:19 nonaka Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rs5c313.c,v 1.8 2008/05/04 19:43:06 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rs5c313.c,v 1.9 2010/04/06 15:29:19 nonaka Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -61,9 +61,28 @@ rs5c313_attach(struct rs5c313_softc *sc) { device_t self = sc->sc_dev; + const char *model; + + switch (sc->sc_model) { + case MODEL_5C313: + model = "5C313"; + sc->sc_ctrl[0] = CTRL_24H; + sc->sc_ctrl[1] = CTRL2_NTEST; + break; + + case MODEL_5C316: + model = "5C316"; + sc->sc_ctrl[0] = 0; + sc->sc_ctrl[1] = CTRL2_24H|CTRL2_NTEST; + break; + + default: + aprint_error("unknown model (%d)\n", sc->sc_model); + return; + } aprint_naive("\n"); - aprint_normal(": real time clock\n"); + aprint_normal(": RICOH %s real time clock\n", model); sc->sc_todr.cookie = sc; sc->sc_todr.todr_gettime_ymdhms = rs5c313_todr_gettime_ymdhms; @@ -99,7 +118,7 @@ aprint_error_dev(self, "time not valid\n"); rs5c313_write_reg(sc, RS5C313_TINT, 0); - rs5c313_write_reg(sc, RS5C313_CTRL, (CTRL_BASE | CTRL_ADJ)); + rs5c313_write_reg(sc, RS5C313_CTRL, (sc->sc_ctrl[0] | CTRL_ADJ)); for (retry = 1000; retry > 0; --retry) { if (rs5c313_read_reg(sc, RS5C313_CTRL) & CTRL_BSY) @@ -107,13 +126,13 @@ else break; } - if (retry == 0) { status = EIO; goto done; } - rs5c313_write_reg(sc, RS5C313_CTRL, CTRL_BASE); + rs5c313_write_reg(sc, RS5C313_CTRL, sc->sc_ctrl[0]); + rs5c313_write_reg(sc, RS5C313_CTRL2, sc->sc_ctrl[1]); done: rtc_ce(sc, 0); @@ -141,14 +160,13 @@ for (retry = 10; retry > 0; --retry) { rtc_ce(sc, 1); - rs5c313_write_reg(sc, RS5C313_CTRL, CTRL_BASE); + rs5c313_write_reg(sc, RS5C313_CTRL, sc->sc_ctrl[0]); if ((rs5c313_read_reg(sc, RS5C313_CTRL) & CTRL_BSY) == 0) break; rtc_ce(sc, 0); delay(1); } - if (retry == 0) { splx(s); return EIO; @@ -173,7 +191,6 @@ rtc_ce(sc, 0); splx(s); - dt->dt_year = (dt->dt_year % 100) + 1900; if (dt->dt_year < POSIX_BASE_YEAR) { dt->dt_year += 100; @@ -197,7 +214,7 @@ for (retry = 10; retry > 0; --retry) { rtc_ce(sc, 1); - rs5c313_write_reg(sc, RS5C313_CTRL, CTRL_BASE); + rs5c313_write_reg(sc, RS5C313_CTRL, sc->sc_ctrl[0]); if ((rs5c313_read_reg(sc, RS5C313_CTRL) & CTRL_BSY) == 0) break; Index: src/sys/dev/ic/rs5c313reg.h diff -u src/sys/dev/ic/rs5c313reg.h:1.2 src/sys/dev/ic/rs5c313reg.h:1.3 --- src/sys/dev/ic/rs5c313reg.h:1.2 Sun May 4 19:43:06 2008 +++ src/sys/dev/ic/rs5c313reg.h Tue Apr 6 15:29:19 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: rs5c313reg.h,v 1.2 2008/05/04 19:43:06 martin Exp $ */ +/* $NetBSD: rs5c313reg.h,v 1.3 2010/04/06 15:29:19 nonaka Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -30,24 +30,40 @@ #define _DEV_IC_RS5C313REG_H_ /* - * RICOH RS5C313 Real Time Clock + * RICOH RS5C3[12]x Real Time Clock */ -#define RS5C313_SEC1 0 -#define RS5C313_SEC10 1 -#define RS5C313_MIN1 2 -#define RS5C313_MIN10 3 -#define RS5C313_HOUR1 4 -#define RS5C313_HOUR10 5 -#define RS5C313_WDAY 6 -#define RS5C313_TINT 7 -#define RS5C313_DAY1 8 -#define RS5C313_DAY10 9 -#define RS5C313_MON1 10 -#define RS5C313_MON10 11 -#define RS5C313_YEAR1 12 -#define RS5C313_YEAR10 13 -#define RS5C313_CTRL 14 -#define RS5C313_TEST 15 + /* 5c313/5c314 don't have bank1 */ +#define RS5C313_SEC1 0 /* bank0 */ +#define RS5C313_SEC10 1 /* bank0 */ +#define RS5C313_MIN1 2 /* bank0 */ +#define RS5C313_MIN10 3 /* bank0 */ +#define RS5C313_HOUR1 4 /* bank0 */ +#define RS5C313_HOUR10 5 /* bank0 */ +#define RS5C313_WDAY 6 /* bank0 */ +#define RS5C313_TINT 7 /* bank0/1 (5c313/5c314/5c316/5c317) */ +#define RS5C313_SCRATCH 7 /* bank0/1 (5c321) */ +#define RS5C313_DAY1 8 /* bank0 */ +#define RS5C313_DAY10 9 /* bank0 */ +#define RS5C313_MON1 10 /* bank0 */ +#define RS5C313_MON10 11 /* bank0 */ +#define RS5C313_YEAR1 12 /* bank0 */ +#define RS5C313_YEAR10 13 /* bank0 */ +#define RS5C313_CTRL 14 /* bank0/1 */ +#define RS5C313_CTRL2 15 /* bank0/1 */ + +/* Alarm register (5c316/5c317) */ +#define RS5C313_AWOD1 0 /* bank1 */ +#define RS5C313_AWOD2 1 /* bank1 */ +#define RS5C313_AMIN1 2 /* bank1 */ +#define RS5C313_AMIN10 3 /* bank1 */ +#define RS5C313_AHOUR1 4 /* bank1 */ +#define RS5C313_AHOUR10 5 /* bank1 */ + +/* Timer register (5c317) */ +#define RS5C313_TMR 9 /* bank1 */ + +/* 32kHz control register (5c317/5c321) */ +#define RS5C313_32KHZ 10 /* bank1 */ /* TINT register */ #define TINT_CT0 0x01 @@ -60,9 +76,14 @@ #define CTRL_ADJ 0x01 /* write */ #define CTRL_XSTP 0x02 /* read */ #define CTRL_WTEN 0x02 /* write */ -#define CTRL_24H 0x04 /* read/write */ +#define CTRL_24H 0x04 /* read/write (5c313/5c314) */ +#define CTRL_ALFG 0x04 /* read/write (5c316/5c317) */ #define CTRL_CTFG 0x08 /* read/write */ -#define CTRL_BASE CTRL_24H +/* CTRL2 register */ +#define CTRL2_NTEST 0x01 +#define CTRL2_BANK 0x02 /* (5c316/5c317/5c321) */ +#define CTRL2_TMR 0x04 /* (5c317) */ +#define CTRL2_24H 0x08 /* (5c316/5c317/5c321) */ #endif /* _DEV_IC_RS5C313REG_H_ */ Index: src/sys/dev/ic/rs5c313var.h diff -u src/sys/dev/ic/rs5c313var.h:1.2 src/sys/dev/ic/rs5c313var.h:1.3 --- src/sys/dev/ic/rs5c313var.h:1.2 Thu Mar 27 02:15:29 2008 +++ src/sys/dev/ic/rs5c313var.h Tue Apr 6 15:29:19 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: rs5c313var.h,v 1.2 2008/03/27 02:15:29 uwe Exp $ */ +/* $NetBSD: rs5c313var.h,v 1.3 2010/04/06 15:29:19 nonaka Exp $ */ /* * Copyright (c) 2006 Valeriy E. Ushakov @@ -43,6 +43,14 @@ struct rs5c313_ops *sc_ops; int sc_valid; /* oscillation halt sensing on init */ + + enum { + MODEL_5C313 = 0, + MODEL_5C316, + MODEL_NUM + } sc_model; + + int sc_ctrl[2]; /* ctrl registers */ }; struct rs5c313_ops {