#include <sys/param.h>
#include <sys/device.h>
#include <sys/kmem.h>
#include <sys/systm.h>
#include <machine/autoconf.h>
#include <machine/hypervisor.h>
#include <machine/openfirm.h>
#include <dev/clock_subr.h>
#include <sparc64/dev/vbusvar.h>
static int vrtc_match(device_t, cfdata_t, void *);
static void vrtc_attach(device_t, device_t, void *);
struct vrtc_softc {
device_t sc_dev;
struct todr_chip_handle sc_todr;
};
CFATTACH_DECL_NEW(vrtc, sizeof(struct vrtc_softc),
vrtc_match, vrtc_attach, NULL, NULL);
static int vrtc_gettime(todr_chip_handle_t, struct timeval *);
static int vrtc_settime(todr_chip_handle_t, struct timeval *);
static int
vrtc_match(device_t parent, cfdata_t match, void *aux)
{
struct vbus_attach_args *va = aux;
if (strcmp(va->va_name, "rtc") == 0)
return (1);
return (0);
}
static void
vrtc_attach(device_t parent, device_t self, void *aux)
{
struct vrtc_softc *sc = device_private(self);
printf("\n");
sc->sc_dev = self;
sc->sc_todr.todr_gettime = vrtc_gettime;
sc->sc_todr.todr_settime = vrtc_settime;
todr_attach(&sc->sc_todr);
}
static int
vrtc_gettime(todr_chip_handle_t handle, struct timeval *tv)
{
u_int64_t tod;
if (hv_tod_get(&tod) != H_EOK)
return (1);
tv->tv_sec = tod;
tv->tv_usec = 0;
return (0);
}
static int
vrtc_settime(todr_chip_handle_t handle, struct timeval *tv)
{
if (hv_tod_set(tv->tv_sec) != H_EOK)
return (1);
return (0);
}