#include <sys/param.h>
#include <sys/device.h>
#include <sys/malloc.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>
extern todr_chip_handle_t todr_handle;
int vrtc_match(struct device *, void *, void *);
void vrtc_attach(struct device *, struct device *, void *);
const struct cfattach vrtc_ca = {
sizeof(struct device), vrtc_match, vrtc_attach
};
struct cfdriver vrtc_cd = {
NULL, "vrtc", DV_DULL
};
int vrtc_gettime(todr_chip_handle_t, struct timeval *);
int vrtc_settime(todr_chip_handle_t, struct timeval *);
int
vrtc_match(struct device *parent, void *match, void *aux)
{
struct vbus_attach_args *va = aux;
if (strcmp(va->va_name, "rtc") == 0)
return (1);
return (0);
}
void
vrtc_attach(struct device *parent, struct device *self, void *aux)
{
todr_chip_handle_t handle;
printf("\n");
handle = malloc(sizeof(struct todr_chip_handle), M_DEVBUF,M_NOWAIT);
if (handle == NULL)
panic("couldn't allocate todr_handle");
handle->cookie = self;
handle->todr_gettime = vrtc_gettime;
handle->todr_settime = vrtc_settime;
handle->bus_cookie = NULL;
handle->todr_setwen = NULL;
handle->todr_quality = 0;
todr_handle = handle;
}
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);
}
int
vrtc_settime(todr_chip_handle_t handle, struct timeval *tv)
{
if (hv_tod_set(tv->tv_sec) != H_EOK)
return (1);
return (0);
}