Module Name: src
Committed By: nisimura
Date: Tue Feb 7 09:06:05 UTC 2012
Modified Files:
src/distrib/utils/sysinst/arch/evbarm: Makefile md.c md.h
src/sys/arch/arm/s3c2xx0: files.s3c2440 s3c2440reg.h s3c24x0_clk.c
s3c2800_clk.c sscom.c sscom_s3c2440.c
Added Files:
src/sys/arch/arm/s3c2xx0: s3c2440_rtc.c
Log Message:
- add MBR editing menu to sysinst.
- fix typos in timecounter names.
- make sure to drain Tx FIFO to avoid clobbering
kernel boot messages.
- allow to have the 3rd UART.
- add missing time-of-day clock support.
Ok by releng.
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/distrib/utils/sysinst/arch/evbarm/Makefile
cvs rdiff -u -r1.25 -r1.26 src/distrib/utils/sysinst/arch/evbarm/md.c
cvs rdiff -u -r1.18 -r1.19 src/distrib/utils/sysinst/arch/evbarm/md.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/s3c2xx0/files.s3c2440 \
src/sys/arch/arm/s3c2xx0/s3c2440reg.h \
src/sys/arch/arm/s3c2xx0/sscom_s3c2440.c
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/s3c2xx0/s3c2440_rtc.c
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/s3c2xx0/s3c24x0_clk.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/s3c2xx0/s3c2800_clk.c
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/arm/s3c2xx0/sscom.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/utils/sysinst/arch/evbarm/Makefile
diff -u src/distrib/utils/sysinst/arch/evbarm/Makefile:1.5 src/distrib/utils/sysinst/arch/evbarm/Makefile:1.6
--- src/distrib/utils/sysinst/arch/evbarm/Makefile:1.5 Sat Feb 19 17:00:39 2005
+++ src/distrib/utils/sysinst/arch/evbarm/Makefile Tue Feb 7 09:06:04 2012
@@ -1,8 +1,10 @@
-# $NetBSD: Makefile,v 1.5 2005/02/19 17:00:39 dsl Exp $
+# $NetBSD: Makefile,v 1.6 2012/02/07 09:06:04 nisimura Exp $
#
# Makefile for evbarm
#
+MENUS_MD= menus.md.${SYSINSTLANG} menus.mbr
+MSG_MD= msg.md.${SYSINSTLANG} msg.mbr.${SYSINSTLANG}
MD_OPTIONS= AOUT2ELF
.include "../../Makefile.inc"
Index: src/distrib/utils/sysinst/arch/evbarm/md.c
diff -u src/distrib/utils/sysinst/arch/evbarm/md.c:1.25 src/distrib/utils/sysinst/arch/evbarm/md.c:1.26
--- src/distrib/utils/sysinst/arch/evbarm/md.c:1.25 Fri Nov 4 11:27:02 2011
+++ src/distrib/utils/sysinst/arch/evbarm/md.c Tue Feb 7 09:06:04 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: md.c,v 1.25 2011/11/04 11:27:02 martin Exp $ */
+/* $NetBSD: md.c,v 1.26 2012/02/07 09:06:04 nisimura Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -67,6 +67,15 @@ md_get_info(void)
int fd;
char dev_name[100];
+ if (no_mbr)
+ return 1;
+
+ if (read_mbr(diskdev, &mbr) < 0)
+ memset(&mbr.mbr, 0, sizeof(mbr.mbr)-2);
+
+ if (edit_mbr(&mbr) == 0)
+ return 0;
+
if (strncmp(diskdev, "wd", 2) == 0)
disktype = "ST506";
else
@@ -131,6 +140,17 @@ md_check_partitions(void)
int
md_pre_disklabel(void)
{
+ if (no_mbr)
+ return 0;
+
+ msg_display(MSG_dofdisk);
+
+ /* write edited MBR onto disk. */
+ if (write_mbr(diskdev, &mbr, 1) != 0) {
+ msg_display(MSG_wmbrfail);
+ process_menu(MENU_ok, NULL);
+ return 1;
+ }
return 0;
}
@@ -187,3 +207,15 @@ md_pre_mount()
{
return 0;
}
+
+int
+md_check_mbr(mbr_info_t *mbri)
+{
+ return 2;
+}
+
+int
+md_mbr_use_wholedisk(mbr_info_t *mbri)
+{
+ return mbr_use_wholedisk(mbri);
+}
Index: src/distrib/utils/sysinst/arch/evbarm/md.h
diff -u src/distrib/utils/sysinst/arch/evbarm/md.h:1.18 src/distrib/utils/sysinst/arch/evbarm/md.h:1.19
--- src/distrib/utils/sysinst/arch/evbarm/md.h:1.18 Fri Feb 3 00:35:35 2012
+++ src/distrib/utils/sysinst/arch/evbarm/md.h Tue Feb 7 09:06:04 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: md.h,v 1.18 2012/02/03 00:35:35 nisimura Exp $ */
+/* $NetBSD: md.h,v 1.19 2012/02/07 09:06:04 nisimura Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -35,11 +35,15 @@
/* md.h -- Machine specific definitions for evbarm */
+#include "mbr.h"
+
/* Constants and defines */
/* Megs required for a full X installation. */
#define XNEEDMB 60
+#define HAVE_UFS2_BOOT
+
/*
* Default filesets to fetch and install during installation
* or upgrade. The standard sets are:
Index: src/sys/arch/arm/s3c2xx0/files.s3c2440
diff -u src/sys/arch/arm/s3c2xx0/files.s3c2440:1.1 src/sys/arch/arm/s3c2xx0/files.s3c2440:1.2
--- src/sys/arch/arm/s3c2xx0/files.s3c2440:1.1 Mon Jan 30 03:28:33 2012
+++ src/sys/arch/arm/s3c2xx0/files.s3c2440 Tue Feb 7 09:06:04 2012
@@ -1,4 +1,4 @@
-# $NetBSD: files.s3c2440,v 1.1 2012/01/30 03:28:33 nisimura Exp $
+# $NetBSD: files.s3c2440,v 1.2 2012/02/07 09:06:04 nisimura Exp $
#
# Configuration info for Samsung S3C2440
#
@@ -49,3 +49,8 @@ file arch/arm/s3c2xx0/s3c2440_i2s.c ssi
device sstouch: wsmousedev, tpcalib
attach sstouch at ssio
file arch/arm/s3c2xx0/s3c2440_touch.c sstouch
+
+# RTC
+device ssrtc
+attach ssrtc at ssio
+file arch/arm/s3c2xx0/s3c2440_rtc.c ssrtc
Index: src/sys/arch/arm/s3c2xx0/s3c2440reg.h
diff -u src/sys/arch/arm/s3c2xx0/s3c2440reg.h:1.1 src/sys/arch/arm/s3c2xx0/s3c2440reg.h:1.2
--- src/sys/arch/arm/s3c2xx0/s3c2440reg.h:1.1 Mon Jan 30 03:28:33 2012
+++ src/sys/arch/arm/s3c2xx0/s3c2440reg.h Tue Feb 7 09:06:05 2012
@@ -102,6 +102,8 @@
#define S3C2440_IIS_BASE 0x55000000
#define S3C2440_GPIO_BASE 0x56000000
#define S3C2440_GPIO_SIZE 0xd0
+#define S3C2440_RTC_BASE 0x57000000
+#define S3C2440_RTC_SIZE 0x8B
#define S3C2440_ADC_BASE 0x58000000
#define S3C2440_ADC_SIZE 0x18
#define S3C2440_SPI0_BASE 0x59000000
@@ -228,6 +230,23 @@
#define EXTINTR_RISING 0x04
#define EXTINTR_BOTH 0x06
+/* RTC */
+#define RTC_RTCCON 0x40
+#define RTCCON_CLKRST (1<<3)
+#define RTCCON_CNTSEL (1<<2)
+#define RTCCON_CLKSEL (1<<1)
+#define RTCCON_RTCEN (1<<0)
+#define RTC_TICNT 0x44
+#define TICNT_INT 0x80
+#define TICNT_COUNT_MASK 0x7F
+#define RTC_BCDSEC 0x70
+#define RTC_BCDMIN 0x74
+#define RTC_BCDHOUR 0x78
+#define RTC_BCDDATE 0x7C
+#define RTC_BCDDAY 0x80
+#define RTC_BCDMON 0x84
+#define RTC_BCDYEAR 0x88
+
/* UART */
#undef UFCON_TXTRIGGER_0
#undef UFCON_TXTRIGGER_4
Index: src/sys/arch/arm/s3c2xx0/sscom_s3c2440.c
diff -u src/sys/arch/arm/s3c2xx0/sscom_s3c2440.c:1.1 src/sys/arch/arm/s3c2xx0/sscom_s3c2440.c:1.2
--- src/sys/arch/arm/s3c2xx0/sscom_s3c2440.c:1.1 Mon Jan 30 03:28:33 2012
+++ src/sys/arch/arm/s3c2xx0/sscom_s3c2440.c Tue Feb 7 09:06:05 2012
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sscom_s3c2440.c,v 1.1 2012/01/30 03:28:33 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sscom_s3c2440.c,v 1.2 2012/02/07 09:06:05 nisimura Exp $");
#include "opt_sscom.h"
#include "opt_ddb.h"
@@ -70,36 +70,24 @@ __KERNEL_RCSID(0, "$NetBSD: sscom_s3c244
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/ioctl.h>
-#include <sys/select.h>
-#include <sys/tty.h>
-#include <sys/proc.h>
-#include <sys/conf.h>
-#include <sys/file.h>
-#include <sys/uio.h>
-#include <sys/kernel.h>
-#include <sys/syslog.h>
-#include <sys/types.h>
#include <sys/device.h>
-#include <sys/malloc.h>
-#include <sys/timepps.h>
-#include <sys/vnode.h>
-#include <machine/intr.h>
#include <sys/bus.h>
+#include <machine/intr.h>
#include <arm/s3c2xx0/s3c2440reg.h>
#include <arm/s3c2xx0/s3c2440var.h>
#include <arm/s3c2xx0/sscom_var.h>
-#include <sys/termios.h>
-static int sscom_match(struct device *, struct cfdata *, void *);
-static void sscom_attach(struct device *, struct device *, void *);
+#include "locators.h"
+
+static int sscom_match(device_t, struct cfdata *, void *);
+static void sscom_attach(device_t, struct device *, void *);
CFATTACH_DECL_NEW(sscom, sizeof(struct sscom_softc), sscom_match,
sscom_attach, NULL, NULL);
-const struct sscom_uart_info s3c2440_uart_config[] = {
+const static struct sscom_uart_info s3c2440_uart_config[] = {
/* UART 0 */
{
0,
@@ -125,33 +113,38 @@ const struct sscom_uart_info s3c2440_uar
S3C2440_UART_BASE(2),
},
};
+static int found;
static int
-sscom_match(struct device *parent, struct cfdata *cf, void *aux)
+sscom_match(device_t parent, struct cfdata *cf, void *aux)
{
struct s3c2xx0_attach_args *sa = aux;
int unit = sa->sa_index;
- return unit == 0 || unit == 1;
+ if (unit == SSIOCF_INDEX_DEFAULT && found == 0)
+ return 1;
+ return (unit == 0 || unit == 1 || unit == 2);
}
static void
-sscom_attach(struct device *parent, struct device *self, void *aux)
+sscom_attach(device_t parent, struct device *self, void *aux)
{
struct sscom_softc *sc = device_private(self);
struct s3c2xx0_attach_args *sa = aux;
- int unit = sa->sa_index;
- bus_addr_t iobase = s3c2440_uart_config[unit].iobase;
+ int unit;
+ bus_addr_t iobase;
- printf( ": UART%d addr=%lx", sa->sa_index, iobase );
+ found = 1;
+ unit = (sa->sa_index == SSIOCF_INDEX_DEFAULT) ? 0 : sa->sa_index;
+ iobase = s3c2440_uart_config[unit].iobase;
sc->sc_dev = self;
sc->sc_iot = s3c2xx0_softc->sc_iot;
sc->sc_unit = unit;
sc->sc_frequency = s3c2xx0_softc->sc_pclk;
- sc->sc_rx_irqno = s3c2440_uart_config[sa->sa_index].rx_int;
- sc->sc_tx_irqno = s3c2440_uart_config[sa->sa_index].tx_int;
+ sc->sc_rx_irqno = s3c2440_uart_config[unit].rx_int;
+ sc->sc_tx_irqno = s3c2440_uart_config[unit].tx_int;
if (bus_space_map(sc->sc_iot, iobase, SSCOM_SIZE, 0, &sc->sc_ioh)) {
printf( ": failed to map registers\n" );
@@ -171,8 +164,6 @@ sscom_attach(struct device *parent, stru
sscom_attach_subr(sc);
}
-
-
int
s3c2440_sscom_cnattach(bus_space_tag_t iot, int unit, int rate,
int frequency, tcflag_t cflag)
Index: src/sys/arch/arm/s3c2xx0/s3c24x0_clk.c
diff -u src/sys/arch/arm/s3c2xx0/s3c24x0_clk.c:1.12 src/sys/arch/arm/s3c2xx0/s3c24x0_clk.c:1.13
--- src/sys/arch/arm/s3c2xx0/s3c24x0_clk.c:1.12 Mon Jan 30 03:28:33 2012
+++ src/sys/arch/arm/s3c2xx0/s3c24x0_clk.c Tue Feb 7 09:06:05 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: s3c24x0_clk.c,v 1.12 2012/01/30 03:28:33 nisimura Exp $ */
+/* $NetBSD: s3c24x0_clk.c,v 1.13 2012/02/07 09:06:05 nisimura Exp $ */
/*
* Copyright (c) 2003 Genetec corporation. All rights reserved.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: s3c24x0_clk.c,v 1.12 2012/01/30 03:28:33 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: s3c24x0_clk.c,v 1.13 2012/02/07 09:06:05 nisimura Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -70,7 +70,7 @@ static struct timecounter s3c24x0_timeco
0, /* no poll_pps */
0xfff, /* counter_mask */
0, /* frequency */
- "s3c234x0", /* name */
+ "s3c24x0", /* name */
100, /* quality */
NULL, /* prev */
NULL, /* next */
Index: src/sys/arch/arm/s3c2xx0/s3c2800_clk.c
diff -u src/sys/arch/arm/s3c2xx0/s3c2800_clk.c:1.16 src/sys/arch/arm/s3c2xx0/s3c2800_clk.c:1.17
--- src/sys/arch/arm/s3c2xx0/s3c2800_clk.c:1.16 Fri Jul 1 20:31:39 2011
+++ src/sys/arch/arm/s3c2xx0/s3c2800_clk.c Tue Feb 7 09:06:05 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: s3c2800_clk.c,v 1.16 2011/07/01 20:31:39 dyoung Exp $ */
+/* $NetBSD: s3c2800_clk.c,v 1.17 2012/02/07 09:06:05 nisimura Exp $ */
/*
* Copyright (c) 2002 Fujitsu Component Limited
@@ -34,7 +34,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: s3c2800_clk.c,v 1.16 2011/07/01 20:31:39 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: s3c2800_clk.c,v 1.17 2012/02/07 09:06:05 nisimura Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -73,8 +73,8 @@ static struct timecounter s3c2800_timeco
s3c2800_get_timecount, /* get_timecount */
0, /* no poll_pps */
0xffffffff, /* counter_mask */
- 0, /* frequency */
- "s3c23800", /* name */
+ 0, /* frequency */
+ "s3c2800", /* name */
100, /* quality */
NULL, /* prev */
NULL, /* next */
Index: src/sys/arch/arm/s3c2xx0/sscom.c
diff -u src/sys/arch/arm/s3c2xx0/sscom.c:1.36 src/sys/arch/arm/s3c2xx0/sscom.c:1.37
--- src/sys/arch/arm/s3c2xx0/sscom.c:1.36 Sat Feb 4 18:50:42 2012
+++ src/sys/arch/arm/s3c2xx0/sscom.c Tue Feb 7 09:06:05 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: sscom.c,v 1.36 2012/02/04 18:50:42 christos Exp $ */
+/* $NetBSD: sscom.c,v 1.37 2012/02/07 09:06:05 nisimura Exp $ */
/*
* Copyright (c) 2002, 2003 Fujitsu Component Limited
@@ -98,7 +98,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sscom.c,v 1.36 2012/02/04 18:50:42 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sscom.c,v 1.37 2012/02/07 09:06:05 nisimura Exp $");
#include "opt_sscom.h"
#include "opt_ddb.h"
@@ -430,13 +430,19 @@ sscom_attach_subr(struct sscom_softc *sc
#endif
if (unit == sscomconsunit) {
- sscomconsattached = 1;
+ int timo, stat;
+ sscomconsattached = 1;
sscomconstag = iot;
sscomconsioh = ioh;
+ /* wait for this transmission to complete */
+ timo = 1500000;
+ do {
+ stat = bus_space_read_1(iot, ioh, SSCOM_UTRSTAT);
+ } while ((stat & UTRSTAT_TXEMPTY) == 0 && --timo > 0);
+
/* Make sure the console is always "hardwired". */
- delay(1000); /* XXX: wait for output to finish */
SET(sc->sc_hwflags, SSCOM_HW_CONSOLE);
SET(sc->sc_swflags, TIOCFLAG_SOFTCAR);
Added files:
Index: src/sys/arch/arm/s3c2xx0/s3c2440_rtc.c
diff -u /dev/null src/sys/arch/arm/s3c2xx0/s3c2440_rtc.c:1.1
--- /dev/null Tue Feb 7 09:06:05 2012
+++ src/sys/arch/arm/s3c2xx0/s3c2440_rtc.c Tue Feb 7 09:06:04 2012
@@ -0,0 +1,173 @@
+/*--
+ * Copyright (c) 2012 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Paul Fleischer <[email protected]>
+ *
+ * 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.
+ *
+ * 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.
+ */
+#include <sys/cdefs.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/device.h>
+#include <sys/bus.h>
+#include <sys/time.h>
+
+#include <dev/clock_subr.h>
+
+#include <arm/s3c2xx0/s3c24x0var.h>
+#include <arm/s3c2xx0/s3c2440var.h>
+#include <arm/s3c2xx0/s3c2440reg.h>
+
+#ifdef SSRTC_DEBUG
+#define DPRINTF(s) do { printf s; } while (/*CONSTCOND*/0)
+#else
+#define DPRINTF(s) do {} while (/*CONSTCOND*/0)
+#endif
+
+/* As the RTC keeps track of Leap years, we need to use the right zero-year */
+#define SSRTC_YEAR_ZERO 2000
+
+struct ssrtc_softc {
+ device_t sc_dev;
+ bus_space_tag_t sc_iot;
+ bus_space_handle_t sc_ioh;
+ struct todr_chip_handle sc_todr;
+};
+
+static int ssrtc_match(device_t, cfdata_t, void *);
+static void ssrtc_attach(device_t, device_t, void *);
+
+CFATTACH_DECL_NEW(ssrtc, sizeof(struct ssrtc_softc),
+ ssrtc_match, ssrtc_attach, NULL, NULL);
+
+static int ssrtc_todr_gettime(struct todr_chip_handle *, struct timeval *);
+static int ssrtc_todr_settime(struct todr_chip_handle *, struct timeval *);
+
+static int
+ssrtc_match(device_t parent, cfdata_t cf, void *aux)
+{
+ return 1;
+}
+
+static void
+ssrtc_attach(device_t parent, device_t self, void *aux)
+{
+ struct ssrtc_softc *sc = device_private(self);
+ struct s3c2xx0_attach_args *sa = aux;
+
+ sc->sc_dev = self;
+ sc->sc_iot = sa->sa_iot;
+
+ if (bus_space_map(sc->sc_iot, S3C2440_RTC_BASE,
+ S3C2440_RTC_SIZE, 0, &sc->sc_ioh)) {
+ aprint_error(": failed to map registers");
+ return;
+ }
+ aprint_normal(": RTC \n");
+
+ sc->sc_todr.cookie = sc;
+ sc->sc_todr.todr_gettime = ssrtc_todr_gettime;
+ sc->sc_todr.todr_settime = ssrtc_todr_settime;
+ sc->sc_todr.todr_setwen = NULL;
+
+ todr_attach(&sc->sc_todr);
+}
+
+static int
+ssrtc_todr_gettime(struct todr_chip_handle *h, struct timeval *tv)
+{
+ struct ssrtc_softc *sc = h->cookie;
+ struct clock_ymdhms dt;
+ uint8_t reg;
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_BCDSEC);
+ DPRINTF(("BCDSEC: %02X\n", reg));
+ dt.dt_sec = FROMBCD(reg);
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_BCDMIN);
+ DPRINTF(("BCDMIN: %02X\n", reg));
+ dt.dt_min = FROMBCD(reg);
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_BCDHOUR);
+ DPRINTF(("BCDHOUR: %02X\n", reg));
+ dt.dt_hour = FROMBCD(reg);
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_BCDDATE);
+ DPRINTF(("BCDDATE: %02X\n", reg));
+ dt.dt_day = FROMBCD(reg);
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_BCDDAY);
+ DPRINTF(("BCDDAY: %02X\n", reg));
+ dt.dt_wday = FROMBCD(reg);
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_BCDMON);
+ DPRINTF(("BCDMON: %02X\n", reg));
+ dt.dt_mon = FROMBCD(reg);
+
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_BCDYEAR);
+ DPRINTF(("BCDYEAR: %02X\n", reg));
+ dt.dt_year = SSRTC_YEAR_ZERO + FROMBCD(reg);
+
+ DPRINTF(("Seconds: %d\n", dt.dt_sec));
+ DPRINTF(("Minutes: %d\n", dt.dt_min));
+ DPRINTF(("Hour: %d\n", dt.dt_hour));
+ DPRINTF(("Mon: %d\n", dt.dt_mon));
+ DPRINTF(("Date: %d\n", dt.dt_day));
+ DPRINTF(("Day: %d\n", dt.dt_wday));
+ DPRINTF(("Year: %d\n", dt.dt_year));
+
+ tv->tv_sec = clock_ymdhms_to_secs(&dt);
+ tv->tv_usec = 0;
+
+ return 0;
+}
+
+static int
+ssrtc_todr_settime(struct todr_chip_handle *h, struct timeval *tv)
+{
+ struct ssrtc_softc *sc = h->cookie;
+ struct clock_ymdhms dt;
+ uint8_t reg;
+
+ clock_secs_to_ymdhms(tv->tv_sec, &dt);
+
+ DPRINTF(("ssrtc_todr_settime"));
+
+ /* Set RTCEN */
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_RTCCON);
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_RTCCON, reg | RTCCON_RTCEN);
+
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_BCDSEC, TOBCD(dt.dt_sec));
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_BCDMIN, TOBCD(dt.dt_min));
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_BCDHOUR, TOBCD(dt.dt_hour));
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_BCDDATE, TOBCD(dt.dt_day));
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_BCDDAY, TOBCD(dt.dt_wday));
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_BCDMON, TOBCD(dt.dt_mon));
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_BCDYEAR, TOBCD(dt.dt_year-SSRTC_YEAR_ZERO));
+
+ /* Clear RTCEN */
+ reg = bus_space_read_1(sc->sc_iot, sc->sc_ioh, RTC_RTCCON);
+ bus_space_write_1(sc->sc_iot, sc->sc_ioh, RTC_RTCCON, reg & ~RTCCON_RTCEN);
+ return 0;
+}