64#include "opt_platform.h"
70#include <sys/kernel.h>
71#include <sys/module.h>
77#include <dev/ofw/openfirm.h>
78#include <dev/ofw/ofw_bus.h>
79#include <dev/ofw/ofw_bus_subr.h>
85#define S390_DEVNAME "s35390a_rtc"
86#define S390_DEVCODE 0x6
92#define S390_ADDR (S390_DEVCODE << 4)
95#define S390_STATUS1 (0 << 1)
96#define S390_STATUS2 (1 << 1)
97#define S390_REALTIME1 (2 << 1)
98#define S390_REALTIME2 (3 << 1)
99#define S390_INT1_1 (4 << 1)
100#define S390_INT1_2 (5 << 1)
101#define S390_CLOCKADJ (6 << 1)
102#define S390_FREE (7 << 1)
105#define S390_ST1_POC (1 << 7)
106#define S390_ST1_BLD (1 << 6)
107#define S390_ST1_24H (1 << 1)
108#define S390_ST1_RESET (1 << 0)
111#define S390_ST2_TEST (1 << 7)
114#define S390_RT1_NBYTES 7
115#define S390_RT1_YEAR 0
116#define S390_RT1_MONTH 1
117#define S390_RT1_DAY 2
118#define S390_RT1_WDAY 3
119#define S390_RT1_HOUR 4
120#define S390_RT1_MINUTE 5
121#define S390_RT1_SECOND 6
177 for (i = 0; i <
len; ++i)
198 for (i = 0; i <
len; ++i)
209 if (!ofw_bus_status_okay(
dev))
212 if (!ofw_bus_is_compatible(
dev,
"sii,s35390a"))
217 device_printf(
dev,
"slave address mismatch. "
218 "(%02x != %02x)\n", iicbus_get_addr(
dev),
223 device_set_desc(
dev,
"Seiko Instruments S-35390A RTC");
225 return (BUS_PROBE_DEFAULT);
240 device_printf(
dev,
"%s: cannot read status1 register\n",
249 "%s: cannot initialize\n", __func__);
257 device_printf(
dev,
"%s: cannot read status2 register\n",
262 reg &= ~S390_ST2_TEST;
266 "%s: cannot disable the test mode\n", __func__);
271 clock_register(
dev, 1000000);
279 sc = device_get_softc(
dev);
292 clock_unregister(
dev);
300 struct bcd_clocktime bct;
305 device_printf(
dev,
"%s: cannot read realtime1 register\n",
322 clock_dbgprint_bcd(
dev, CLOCK_DBG_READ, &bct);
323 return (clock_bcd_to_ts(&bct, ts,
false));
330 struct bcd_clocktime bct;
332 clock_ts_to_bcd(ts, &bct,
false);
333 clock_dbgprint_bcd(
dev, CLOCK_DBG_WRITE, &bct);
int iicbus_transfer_excl(device_t dev, struct iic_msg *msgs, uint32_t nmsgs, int how)
static int s390rtc_gettime(device_t dev, struct timespec *ts)
MODULE_VERSION(s35390a, 1)
static int s390rtc_detach(device_t dev)
static int s390rtc_settime(device_t dev, struct timespec *ts)
static int s390rtc_attach(device_t dev)
static device_method_t s390rtc_methods[]
static driver_t s390rtc_driver
static int s390rtc_probe(device_t dev)
static const uint8_t nibbletab[]
static uint8_t bitreverse(uint8_t x)
static int s390rtc_write(device_t dev, uint8_t reg, uint8_t *buf, size_t len)
MODULE_DEPEND(s35390a, iicbus, 1, 1, 1)
DRIVER_MODULE(s35390a, iicbus, s390rtc_driver, s390rtc_devclass, NULL, NULL)
static int s390rtc_read(device_t dev, uint8_t reg, uint8_t *buf, size_t len)
static devclass_t s390rtc_devclass
static void s390rtc_start(void *arg)