Port-cats archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CATS todclock reorganization (Re: CVS commit: syssrc/sys/arch)



In article <200202101309.g1AD9jM10377%mirage.ceres.dti.ne.jp@localhost>
I wrote:

> Anyway, I think we should reorganize todclock attachment on cats port.
> My idea is:
 :

Now I've made a patch for this change.

One problem is footbridge's RTC, but currently it is not
implemented anyway so I just disable attachment for it.

> Comments?

---
Izumi Tsutsui
tsutsui%ceres.dti.ne.jp@localhost

Index: arch/arm/footbridge/footbridge.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/arm/footbridge/footbridge.c,v
retrieving revision 1.4
diff -u -r1.4 footbridge.c
--- arch/arm/footbridge/footbridge.c    2002/01/05 22:41:47     1.4
+++ arch/arm/footbridge/footbridge.c    2002/02/10 16:43:49
@@ -214,6 +214,7 @@
        fba.fba_pba.pba_bus = 0;
        config_found(self, &fba.fba_pba, footbridge_print);
 
+#if 0
        /* Attach a time-of-day clock device */
        fba.fba_tca.ta_name = "todclock";
        fba.fba_tca.ta_rtc_arg = NULL;
@@ -221,6 +222,7 @@
        fba.fba_tca.ta_rtc_read = NULL;
        fba.fba_tca.ta_flags = TODCLOCK_FLAG_FAKE;
        config_found(self, &fba.fba_tca, footbridge_print); 
+#endif
 
        /* Attach uart device */
        fba.fba_fca.fca_name = "fcom";
Index: arch/arm/footbridge/footbridgevar.h
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/arm/footbridge/footbridgevar.h,v
retrieving revision 1.2
diff -u -r1.2 footbridgevar.h
--- arch/arm/footbridge/footbridgevar.h 2002/02/10 12:26:00     1.2
+++ arch/arm/footbridge/footbridgevar.h 2002/02/10 16:43:49
@@ -37,7 +37,7 @@
 #include <machine/bus.h>
 #include <machine/rtc.h>
 #include <dev/pci/pcivar.h>
-#include <arm/footbridge/todclockvar.h>
+/*#include <arm/footbridge/todclockvar.h>*/
 
 /*
  * DC21285 softc structure.
@@ -77,7 +77,7 @@
                bus_space_handle_t fba_ioh;     /* Bus handle */
        } fba_fba;
        struct pcibus_attach_args fba_pba;      /* pci attach args */
-       struct todclock_attach_args fba_tca;
+/*     struct todclock_attach_args fba_tca;*/
        struct fcom_attach_args {
                char *fca_name;
                bus_space_tag_t fca_iot;
Index: arch/arm/footbridge/isa/dsrtc.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/arm/footbridge/isa/dsrtc.c,v
retrieving revision 1.1
diff -u -r1.1 dsrtc.c
--- arch/arm/footbridge/isa/dsrtc.c     2002/02/10 12:26:01     1.1
+++ arch/arm/footbridge/isa/dsrtc.c     2002/02/10 16:43:49
@@ -42,160 +42,20 @@
 #include <sys/conf.h>
 #include <sys/device.h>
 
-#include <machine/rtc.h>
+#include <dev/clock_subr.h>
+#include <cats/cats/todclockvar.h>
 
-#include <arm/footbridge/todclockvar.h>
-#include <arm/footbridge/isa/ds1687reg.h>
-
 #include <dev/isa/isavar.h>
+#include <dev/ic/ds1687reg.h>
+#include <dev/ic/ds1687var.h>
 
-#define NRTC_PORTS     2
-
-struct dsrtc_softc {
-       struct device   sc_dev;
-       bus_space_tag_t sc_iot;
-       bus_space_handle_t sc_ioh;
-};
 
-void dsrtcattach __P((struct device *parent, struct device *self, void *aux));
 int dsrtcmatch __P((struct device *parent, struct cfdata *cf, void *aux));
-int ds1687_read __P((struct dsrtc_softc *sc, int addr));
-void ds1687_write __P((struct dsrtc_softc *sc, int addr, int data));
-int ds1687_ram_read __P((struct dsrtc_softc *sc, int addr));
-void ds1687_ram_write __P((struct dsrtc_softc *sc, int addr, int data));
-static void ds1687_bank_select __P((struct dsrtc_softc *, int));
-static int dsrtc_write __P((void *, rtc_t *));
-static int dsrtc_read __P((void *, rtc_t *));
-
-int
-ds1687_read(sc, addr)
-       struct dsrtc_softc *sc;
-       int addr;
-{
-
-       bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_ADDR_REG, addr);
-       return(bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_DATA_REG));
-}
-
-void
-ds1687_write(sc, addr, data)
-       struct dsrtc_softc *sc;
-       int addr;
-       int data;
-{
-
-       bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_ADDR_REG, addr);
-       bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_DATA_REG, data);
-}
-
-static void
-ds1687_bank_select(sc, bank)
-       struct dsrtc_softc *sc;
-       int bank;
-{
-       int data;
-
-       data = ds1687_read(sc, RTC_REG_A);
-       data &= ~RTC_REG_A_BANK_MASK;
-       if (bank)
-               data |= RTC_REG_A_BANK1;
-       ds1687_write(sc, RTC_REG_A, data);
-}
-
-#if 0
-/* Nothing uses these yet */
-int
-ds1687_ram_read(sc, addr)
-       struct dsrtc_softc *sc;
-       int addr;
-{
-       if (addr < RTC_PC_RAM_SIZE)
-               return(ds1687_read(sc, RTC_PC_RAM_START + addr));
-
-       addr -= RTC_PC_RAM_SIZE;
-       if (addr < RTC_BANK0_RAM_SIZE)
-               return(ds1687_read(sc, RTC_BANK0_RAM_START + addr));            
-
-       addr -= RTC_BANK0_RAM_SIZE;
-       if (addr < RTC_EXT_RAM_SIZE) {
-               int data;
-
-               ds1687_bank_select(sc, 1);
-               ds1687_write(sc, RTC_EXT_RAM_ADDRESS, addr);
-               data = ds1687_read(sc, RTC_EXT_RAM_DATA);
-               ds1687_bank_select(sc, 0);
-               return(data);
-       }
-       return(-1);
-}
-
-void
-ds1687_ram_write(sc, addr, val)
-       struct dsrtc_softc *sc;
-       int addr;
-       int val;
-{
-       if (addr < RTC_PC_RAM_SIZE)
-               return(ds1687_write(sc, RTC_PC_RAM_START + addr, val));
-
-       addr -= RTC_PC_RAM_SIZE;
-       if (addr < RTC_BANK0_RAM_SIZE)
-               return(ds1687_write(sc, RTC_BANK0_RAM_START + addr, val));
-
-       addr -= RTC_BANK0_RAM_SIZE;
-       if (addr < RTC_EXT_RAM_SIZE) {
-               ds1687_bank_select(sc, 1);
-               ds1687_write(sc, RTC_EXT_RAM_ADDRESS, addr);
-               ds1687_write(sc, RTC_EXT_RAM_DATA, val);
-               ds1687_bank_select(sc, 0);
-       }
-}
-#endif
-
-static int
-dsrtc_write(arg, rtc)
-       void *arg;
-       rtc_t *rtc;
-{
-       struct dsrtc_softc *sc = arg;
-
-       ds1687_write(sc, RTC_SECONDS, rtc->rtc_sec);
-       ds1687_write(sc, RTC_MINUTES, rtc->rtc_min);
-       ds1687_write(sc, RTC_HOURS, rtc->rtc_hour);
-       ds1687_write(sc, RTC_DAYOFMONTH, rtc->rtc_day);
-       ds1687_write(sc, RTC_MONTH, rtc->rtc_mon);
-       ds1687_write(sc, RTC_YEAR, rtc->rtc_year);
-       ds1687_bank_select(sc, 1);
-       ds1687_write(sc, RTC_CENTURY, rtc->rtc_cen);
-       ds1687_bank_select(sc, 0);
-       return(1);
-}
-
-static int
-dsrtc_read(arg, rtc)
-       void *arg;
-       rtc_t *rtc;
-{
-       struct dsrtc_softc *sc = arg;
-
-       rtc->rtc_micro = 0;
-       rtc->rtc_centi = 0;
-       rtc->rtc_sec   = ds1687_read(sc, RTC_SECONDS);
-       rtc->rtc_min   = ds1687_read(sc, RTC_MINUTES);
-       rtc->rtc_hour  = ds1687_read(sc, RTC_HOURS);
-       rtc->rtc_day   = ds1687_read(sc, RTC_DAYOFMONTH);
-       rtc->rtc_mon   = ds1687_read(sc, RTC_MONTH);
-       rtc->rtc_year  = ds1687_read(sc, RTC_YEAR);
-       ds1687_bank_select(sc, 1);
-       rtc->rtc_cen   = ds1687_read(sc, RTC_CENTURY); 
-       ds1687_bank_select(sc, 0);
-
-       return(1);
-}
+void dsrtcattach __P((struct device *parent, struct device *self, void *aux));
 
 /* device and attach structures */
 struct cfattach dsrtc_ca = {
-       sizeof(struct dsrtc_softc), dsrtcmatch, dsrtcattach
+       sizeof(struct ds1687_softc), dsrtcmatch, dsrtcattach
 };
 
 /*
@@ -238,9 +98,9 @@
        struct device *self;
        void *aux;
 {
-       struct dsrtc_softc *sc = (struct dsrtc_softc *)self;
+       struct ds1687_softc *sc = (struct ds1687_softc *)self;
        struct isa_attach_args *ia = aux;
-       struct todclock_attach_args ta;
+       todr_chip_handle_t handle;
        
        sc->sc_iot = ia->ia_iot;
        if (bus_space_map(sc->sc_iot, ia->ia_io[0].ir_addr,
@@ -249,19 +109,12 @@
                return;
        }
 
-       ds1687_write(sc, RTC_REG_A, RTC_REG_A_DV1);
-       ds1687_write(sc, RTC_REG_B, RTC_REG_B_BINARY | RTC_REG_B_24_HOUR);
+       if ((handle = ds1687_attach(sc)) == NULL)
+               panic("can't attach tod clock");
 
-       if (!(ds1687_read(sc, RTC_REG_D) & RTC_REG_D_VRT))
-               printf(": lithium cell is dead, RTC unreliable");
+       handle->bus_cookie = NULL;
        printf("\n");
 
-       ta.ta_name = "todclock";
-       ta.ta_rtc_arg = sc;
-       ta.ta_rtc_write = dsrtc_write; 
-       ta.ta_rtc_read = dsrtc_read;
-       ta.ta_flags = 0;
-       config_found(self, &ta, NULL);
+       todclock_config(handle);
 }
 
-/* End of dsrtc.c */
Index: arch/cats/conf/GENERIC
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/cats/conf/GENERIC,v
retrieving revision 1.17
diff -u -r1.17 GENERIC
--- arch/cats/conf/GENERIC      2002/01/27 13:23:13     1.17
+++ arch/cats/conf/GENERIC      2002/02/10 16:43:50
@@ -180,9 +180,6 @@
 # system clock via footbridge
 #clock*        at footbridge?
 
-# time-of-day device via footbridge or RTC
-todclock0      at todservice?
-
 # PCI bus support
 # PCI bus via footbridge
 pci0   at footbridge?                  # PCI bus
Index: arch/cats/conf/files.cats
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/cats/conf/files.cats,v
retrieving revision 1.19
diff -u -r1.19 files.cats
--- arch/cats/conf/files.cats   2002/02/10 12:26:03     1.19
+++ arch/cats/conf/files.cats   2002/02/10 16:43:50
@@ -31,9 +31,8 @@
 #
 # time of day clock
 #
-device todclock
-attach todclock at todservice
-file   arch/arm/footbridge/todclock.c                  todclock        
needs-count
+file   dev/clock_subr.c
+file   arch/cats/cats/todclock.c
 
 # ISA DMA glue
 file   arch/arm/footbridge/isa/isadma_machdep.c        isadma
@@ -85,9 +84,12 @@
 attach sysbeep at pcppi with sysbeep_isa
 file   arch/arm/footbridge/isa/sysbeep_isa.c           sysbeep_isa
 
-device dsrtc: todservice
+define ds1687
+file   dev/ic/ds1687.c                                 ds1687
+device dsrtc: ds1687
 attach dsrtc at isa
 file   arch/arm/footbridge/isa/dsrtc.c                 dsrtc
+
 # Machine-independent I2O drivers.
 include "dev/i2o/files.i2o"
 
--- /dev/null   Sun Feb 10 02:16:46 2002
+++ dev/ic/ds1687.c     Mon Feb 11 01:32:21 2002
@@ -0,0 +1,249 @@
+/*     $NetBSD$        */
+
+/*
+ * Copyright (c) 1998 Mark Brinicombe.
+ * Copyright (c) 1998 Causality Limited.
+ * All rights reserved.
+ *
+ * Written by Mark Brinicombe, Causality Limited
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by Mark Brinicombe
+ *     for the NetBSD Project.
+ * 4. The name of the company nor the name of the author may be used to
+ *    endorse or promote products derived from this software without specific
+ *    prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CAUASLITY LIMITED ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/errno.h>
+#include <sys/malloc.h>
+
+#include <machine/bus.h>
+
+#include <dev/clock_subr.h>
+#include <dev/ic/ds1687reg.h>
+#include <dev/ic/ds1687var.h>
+
+static int ds1687_gettime(todr_chip_handle_t, struct timeval *);
+static int ds1687_settime(todr_chip_handle_t, struct timeval *);
+static int ds1687_getcal(todr_chip_handle_t, int *);
+static int ds1687_setcal(todr_chip_handle_t, int);
+static int ds1687_read(struct ds1687_softc *sc, int addr);
+static void ds1687_write(struct ds1687_softc *sc, int addr, int data);
+static void ds1687_bank_select(struct ds1687_softc *, int);
+#if 0
+int ds1687_ram_read(struct ds1687_softc *sc, int addr);
+void ds1687_ram_write(struct ds1687_softc *sc, int addr, int data);
+#endif
+
+todr_chip_handle_t
+ds1687_attach(sc)
+       struct ds1687_softc *sc;
+{
+       todr_chip_handle_t handle;
+
+       ds1687_write(sc, RTC_REG_A, RTC_REG_A_DV1);
+       ds1687_write(sc, RTC_REG_B, RTC_REG_B_BINARY | RTC_REG_B_24_HOUR);
+
+       if ((ds1687_read(sc, RTC_REG_D) & RTC_REG_D_VRT) == 0)
+               printf(": lithium cell is dead, RTC unriliable");
+
+       handle = malloc(sizeof(struct todr_chip_handle), M_DEVBUF, M_NOWAIT);
+
+       handle->cookie = sc;
+       handle->todr_gettime = ds1687_gettime;
+       handle->todr_settime = ds1687_settime;
+       handle->todr_getcal  = ds1687_getcal;
+       handle->todr_setcal  = ds1687_setcal;
+       handle->todr_setwen  = NULL;
+
+       return handle;
+}
+
+static int
+ds1687_gettime(handle, tv)
+       todr_chip_handle_t handle;
+       struct timeval *tv;
+{
+       struct ds1687_softc *sc = (struct ds1687_softc *)handle->cookie;
+       struct clock_ymdhms dt;
+       int century, year;
+
+       dt.dt_sec  = ds1687_read(sc, RTC_SECONDS);
+       dt.dt_min  = ds1687_read(sc, RTC_MINUTES);
+       dt.dt_hour = ds1687_read(sc, RTC_HOURS);
+       dt.dt_day  = ds1687_read(sc, RTC_DAYOFMONTH);
+       dt.dt_mon  = ds1687_read(sc, RTC_MONTH);
+       year       = ds1687_read(sc, RTC_YEAR);
+       ds1687_bank_select(sc, 1);
+       century    = ds1687_read(sc, RTC_CENTURY); 
+       ds1687_bank_select(sc, 0);
+       dt.dt_year = century * 100 + year;
+
+       /* simple sanity checks */
+       if (dt.dt_year < POSIX_BASE_YEAR || dt.dt_mon > 12 || dt.dt_day > 31 ||
+           dt.dt_hour >= 24 || dt.dt_min >= 60 || dt.dt_sec >= 60)
+               return 1;
+
+       tv->tv_sec = clock_ymdhms_to_secs(&dt);
+       tv->tv_usec = 0;
+       return 0;
+}
+
+static int
+ds1687_settime(handle, tv)
+       todr_chip_handle_t handle;
+       struct timeval *tv;
+{
+       struct ds1687_softc *sc = (struct ds1687_softc *)handle->cookie;
+       struct clock_ymdhms dt;
+       int century, year;
+
+       /* Note: we ignore `tv_usec' */
+       clock_secs_to_ymdhms(tv->tv_sec, &dt);
+       century = dt.dt_year / 100;
+       year    = dt.dt_year % 100;
+
+       ds1687_write(sc, RTC_SECONDS, dt.dt_sec);
+       ds1687_write(sc, RTC_MINUTES, dt.dt_min);
+       ds1687_write(sc, RTC_HOURS, dt.dt_hour);
+       ds1687_write(sc, RTC_DAYOFMONTH, dt.dt_day);
+       ds1687_write(sc, RTC_MONTH, dt.dt_mon);
+       ds1687_write(sc, RTC_YEAR, year);
+       ds1687_bank_select(sc, 1);
+       ds1687_write(sc, RTC_CENTURY, century);
+       ds1687_bank_select(sc, 0);
+
+       return 0;
+}
+
+static int
+ds1687_getcal(handle, vp)
+       todr_chip_handle_t handle;
+       int *vp;
+{
+
+       return EOPNOTSUPP;
+}
+
+static int
+ds1687_setcal(handle, v)
+       todr_chip_handle_t handle;
+       int v;
+{
+
+       return EOPNOTSUPP;
+}
+
+static int
+ds1687_read(sc, addr)
+       struct ds1687_softc *sc;
+       int addr;
+{
+
+       bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_ADDR_REG, addr);
+       return bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_DATA_REG);
+}
+
+static void
+ds1687_write(sc, addr, data)
+       struct ds1687_softc *sc;
+       int addr;
+       int data;
+{
+
+       bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_ADDR_REG, addr);
+       bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_DATA_REG, data);
+}
+
+static void
+ds1687_bank_select(sc, bank)
+       struct ds1687_softc *sc;
+       int bank;
+{
+       int data;
+
+       data = ds1687_read(sc, RTC_REG_A);
+       data &= ~RTC_REG_A_BANK_MASK;
+       if (bank)
+               data |= RTC_REG_A_BANK1;
+       ds1687_write(sc, RTC_REG_A, data);
+}
+
+#if 0
+/* Nothing uses these yet */
+static int
+ds1687_ram_read(sc, addr)
+       struct ds1687_softc *sc;
+       int addr;
+{
+       if (addr < RTC_PC_RAM_SIZE)
+               return ds1687_read(sc, RTC_PC_RAM_START + addr);
+
+       addr -= RTC_PC_RAM_SIZE;
+       if (addr < RTC_BANK0_RAM_SIZE)
+               return ds1687_read(sc, RTC_BANK0_RAM_START + addr);
+
+       addr -= RTC_BANK0_RAM_SIZE;
+       if (addr < RTC_EXT_RAM_SIZE) {
+               int data;
+
+               ds1687_bank_select(sc, 1);
+               ds1687_write(sc, RTC_EXT_RAM_ADDRESS, addr);
+               data = ds1687_read(sc, RTC_EXT_RAM_DATA);
+               ds1687_bank_select(sc, 0);
+               return data ;
+       }
+       return -1;
+}
+
+static void
+ds1687_ram_write(sc, addr, val)
+       struct ds1687_softc *sc;
+       int addr;
+       int val;
+{
+       if (addr < RTC_PC_RAM_SIZE)
+               return ds1687_write(sc, RTC_PC_RAM_START + addr, val);
+
+       addr -= RTC_PC_RAM_SIZE;
+       if (addr < RTC_BANK0_RAM_SIZE)
+               return ds1687_write(sc, RTC_BANK0_RAM_START + addr, val);
+
+       addr -= RTC_BANK0_RAM_SIZE;
+       if (addr < RTC_EXT_RAM_SIZE) {
+               ds1687_bank_select(sc, 1);
+               ds1687_write(sc, RTC_EXT_RAM_ADDRESS, addr);
+               ds1687_write(sc, RTC_EXT_RAM_DATA, val);
+               ds1687_bank_select(sc, 0);
+       }
+}
+#endif
+
--- /dev/null   Sun Feb 10 02:16:46 2002
+++ dev/ic/ds1687reg.h  Sun Feb 10 22:53:20 2002
@@ -0,0 +1,130 @@
+/*     $NetBSD: ds1687reg.h,v 1.1 1998/10/05 01:20:57 mark Exp $       */
+
+/*
+ * Copyright (c) 1998 Mark Brinicombe.
+ * Copyright (c) 1998 Causality Limited.
+ * All rights reserved.
+ *
+ * Written by Mark Brinicombe, Causality Limited
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by Mark Brinicombe
+ *     for the NetBSD Project.
+ * 4. The name of the company nor the name of the author may be used to
+ *    endorse or promote products derived from this software without specific
+ *    prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CAUASLITY LIMITED ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#define NRTC_PORTS             2
+
+#define RTC_ADDR               0x72
+#define RTC_ADDR_REG           0x00
+#define RTC_DATA_REG           0x01
+
+#define        RTC_SECONDS             0x00
+#define        RTC_SECONDS_ALARM       0x01
+#define RTC_MINUTES            0x02
+#define RTC_MINUTES_ALARM      0x03
+#define        RTC_HOURS               0x04
+#define        RTC_HOURS_ALARM         0x05
+#define        RTC_DAYOFWEEK           0x06
+#define        RTC_DAYOFMONTH          0x07
+#define        RTC_MONTH               0x08
+#define RTC_YEAR               0x09
+
+#define RTC_REG_A              0x0a
+#define  RTC_REG_A_UIP         0x80    /* Update In Progress */
+#define  RTC_REG_A_DV2         0x40    /* Countdown CHain */
+#define  RTC_REG_A_DV1         0x20    /* Oscillator Enable */
+#define  RTC_REG_A_DV0         0x10    /* Bank Select */
+#define  RTC_REG_A_BANK_MASK   RTC_REG_A_DV0
+#define  RTC_REG_A_BANK1       RTC_REG_A_DV0
+#define  RTC_REG_A_BANK0       0x00
+#define  RTC_REG_A_RS_MASK     0x0f    /* Rate select mask */
+#define  RTC_REG_A_RS_NONE     0x00
+#define  RTC_REG_A_RS_256HZ_1  0x01
+#define  RTC_REG_A_RS_128HZ_1  0x02
+#define  RTC_REG_A_RS_8192HZ   0x03
+#define  RTC_REG_A_RS_4096HZ   0x04
+#define  RTC_REG_A_RS_2048HZ   0x05
+#define  RTC_REG_A_RS_1024HZ   0x06
+#define  RTC_REG_A_RS_512HZ    0x07
+#define  RTC_REG_A_RS_256HZ    0x08
+#define  RTC_REG_A_RS_128HZ    0x09
+#define  RTC_REG_A_RS_64HZ     0x0A
+#define  RTC_REG_A_RS_32HZ     0x0B
+#define  RTC_REG_A_RS_16HZ     0x0C
+#define  RTC_REG_A_RS_8HZ      0x0D
+#define  RTC_REG_A_RS_4HZ      0x0E
+#define  RTC_REG_A_RS_2HZ      0x0F
+
+#define RTC_REG_B              0x0b
+#define  RTC_REG_B_SET         0x80    /* Inhibit update */
+#define  RTC_REG_B_PIE         0x40    /* Periodic Interrupt Enable */
+#define  RTC_REG_B_AIE         0x20    /* Alarm Interrupt Enable */
+#define  RTC_REG_B_UIE         0x10    /* Updated Ended Interrupt Enable */
+#define  RTC_REG_B_SQWE                0x08    /* Square Wave Enable */
+#define  RTC_REG_B_DM          0x04    /* Data Mode */
+#define  RTC_REG_B_BINARY      RTC_REG_B_DM
+#define  RTC_REG_B_BCD         0
+#define  RTC_REG_B_24_12       0x02    /* Hour format */
+#define  RTC_REG_B_24_HOUR     RTC_REG_B_24_12
+#define  RTC_REG_B_12_HOUR     0
+#define  RTC_REG_B_DSE         0x01    /* Daylight Savings Enable */
+
+#define RTC_REG_C              0x0c
+#define  RTC_REG_C_IRQF                0x80    /* Interrupt Request Flag */
+#define  RTC_REG_C_PF          0x40    /* Periodic Interrupt Flag */
+#define  RTC_REG_C_AF          0x20    /* Alarm Interrupt Flag */
+#define  RTC_REG_C_UF          0x10    /* Update Ended Flags */
+
+#define RTC_REG_D              0x0d
+#define  RTC_REG_D_VRT         0x80    /* Valid RAM and Time */
+
+#define RTC_PC_RAM_START       0x0e
+#define RTC_PC_RAM_SIZE                50
+
+#define RTC_BANK0_RAM_START    0x40
+#define RTC_BANK0_RAM_SIZE     0x40
+
+#define RTC_MODEL              0x40
+#define RTC_SERIAL_1           0x41
+#define RTC_SERIAL_2           0x42
+#define RTC_SERIAL_3           0x43
+#define RTC_SERIAL_4           0x44
+#define RTC_SERIAL_5           0x45
+#define RTC_SERIAL_6           0x46
+#define RTC_CRC                        0x47
+#define RTC_CENTURY            0x48
+#define RTC_DATE_ALARM         0x49
+#define RTC_REG_4A             0x4a
+#define  RTC_REG_4A_VRT2       0x80
+#define  RTC_REG_4A_INCR       0x40
+#define  RTC_REG_4A_PAB                0x08
+#define  RTC_REG_4A_RF         0x04
+#define RTC_REG_4B             0x4b
+#define RTC_EXT_RAM_ADDRESS    0x50
+#define RTC_EXT_RAM_DATA       0x53
+#define RTC_EXT_RAM_START      0x00
+#define RTC_EXT_RAM_SIZE       0x80
--- /dev/null   Sun Feb 10 02:16:46 2002
+++ dev/ic/ds1687var.h  Mon Feb 11 01:28:57 2002
@@ -0,0 +1,9 @@
+/*     $NetBSD$        */
+
+struct ds1687_softc {
+       struct device sc_dev;
+       bus_space_tag_t sc_iot;
+       bus_space_handle_t sc_ioh;
+};
+
+todr_chip_handle_t ds1687_attach(struct ds1687_softc *);
--- /dev/null   Sun Feb 10 02:16:46 2002
+++ arch/cats/cats/todclock.c   Sun Feb 10 21:05:48 2002
@@ -0,0 +1,132 @@
+/*      $NetBSD$       */
+
+/*
+ * Copyright (c) 1992, 1993
+ *      The Regents of the University of California.  All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Lawrence Berkeley Laboratory.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *      @(#)clock.c     8.1 (Berkeley) 6/11/93
+ */
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+
+#include <dev/clock_subr.h>
+
+#include <cats/cats/todclockvar.h>
+
+static todr_chip_handle_t todr_handle;
+
+/*
+ * Common parts of todclock autoconfiguration.
+ */
+void
+todclock_config(handle)
+       todr_chip_handle_t handle;
+{
+
+       if (todr_handle)
+               panic("todclock_config: too many todclocks configured");
+
+       todr_handle = handle;
+}
+
+/*
+ * Set up the system's time, given a `reasonable' time value.
+ */
+void
+inittodr(base)
+        time_t base;
+{
+       int badbase = 0, waszero = (base == 0);
+
+       if (base < 5 * SECYR) {
+               /*
+                * If base is 0, assume filesystem time is just unknown
+                * in stead of preposterous. Don't bark.
+                */
+               if (base != 0)
+                       printf("WARNING: preposterous time in file system\n");
+               /* not going to use it anyway, if the chip is readable */
+               /* 1991/07/01   12:00:00 */
+               base = 21*SECYR + 186*SECDAY + SECDAY/2;
+               badbase = 1;
+       }
+
+       if (todr_gettime(todr_handle, (struct timeval *)&time) != 0 ||
+           time.tv_sec == 0) {
+               printf("WARNING: bad date in battery clock");
+               /*
+                * Believe the time in the file system for lack of
+                * anything better, resetting the clock.
+                */
+               time.tv_sec = base;
+               if (!badbase)
+                       resettodr();
+       } else {
+               int deltat = time.tv_sec - base;
+
+               if (deltat < 0)
+                       deltat = -deltat;
+               if (waszero || deltat < 2 * SECDAY)
+                       return;
+               printf("WARNING: clock %s %d days",
+                   time.tv_sec < base ? "lost" : "gained", deltat / SECDAY);
+       }
+       printf(" -- CHECK AND RESET THE DATE!\n");
+}
+
+/*
+ * Reset the clock based on the current time.
+ * Used when the current clock is preposterous, when the time is changed,
+ * and when rebooting.  Do nothing if the time is not yet known, e.g.,
+ * when crashing during autoconfig.
+ */
+void
+resettodr()
+{
+
+       if (time.tv_sec == 0)
+               return;
+
+       if (todr_settime(todr_handle, (struct timeval *)&time) != 0)
+               printf("resettodr: cannot set time in time-of-day clock\n");
+}
--- /dev/null   Sun Feb 10 02:16:46 2002
+++ arch/cats/cats/todclockvar.h        Sun Feb 10 21:04:23 2002
@@ -0,0 +1,39 @@
+/*     $NetBSD$        */
+
+/*-
+ * Copyright (c) 1996 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jason R. Thorpe.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *        This product includes software developed by the NetBSD
+ *        Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+void todclock_config(todr_chip_handle_t);



Home | Main Index | Thread Index | Old Index