xref: /netbsd-src/sys/arch/sparc64/dev/vrtc.c (revision fc256c4a39aa30e04e0a83bb1e40829857c1d023)
1*fc256c4aSthorpej /*	$NetBSD: vrtc.c,v 1.3 2021/01/04 14:48:52 thorpej Exp $	*/
282352513Spalle /*	$OpenBSD: vrtc.c,v 1.1 2008/03/08 19:19:43 kettenis Exp $	*/
382352513Spalle /*
482352513Spalle  * Copyright (c) 2008 Mark Kettenis
582352513Spalle  *
682352513Spalle  * Permission to use, copy, modify, and distribute this software for any
782352513Spalle  * purpose with or without fee is hereby granted, provided that the above
882352513Spalle  * copyright notice and this permission notice appear in all copies.
982352513Spalle  *
1082352513Spalle  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1182352513Spalle  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1282352513Spalle  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1382352513Spalle  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1482352513Spalle  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1582352513Spalle  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1682352513Spalle  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1782352513Spalle  */
1882352513Spalle 
1982352513Spalle #include <sys/param.h>
2082352513Spalle #include <sys/device.h>
21*fc256c4aSthorpej #include <sys/kmem.h>
2282352513Spalle #include <sys/systm.h>
2382352513Spalle 
2482352513Spalle #include <machine/autoconf.h>
2582352513Spalle #include <machine/hypervisor.h>
2682352513Spalle #include <machine/openfirm.h>
2782352513Spalle 
2882352513Spalle #include <dev/clock_subr.h>
2982352513Spalle #include <sparc64/dev/vbusvar.h>
3082352513Spalle 
3182352513Spalle extern todr_chip_handle_t todr_handle;
3282352513Spalle 
3382352513Spalle int	vrtc_match(device_t, cfdata_t, void *);
3482352513Spalle void	vrtc_attach(device_t, device_t, void *);
3582352513Spalle 
3682352513Spalle CFATTACH_DECL_NEW(vrtc, sizeof(device_t),
3782352513Spalle     vrtc_match, vrtc_attach, NULL, NULL);
3882352513Spalle 
3982352513Spalle int	vrtc_gettime(todr_chip_handle_t, struct timeval *);
4082352513Spalle int	vrtc_settime(todr_chip_handle_t, struct timeval *);
4182352513Spalle 
4282352513Spalle int
vrtc_match(device_t parent,cfdata_t match,void * aux)4382352513Spalle vrtc_match(device_t parent, cfdata_t match, void *aux)
4482352513Spalle {
4582352513Spalle 	struct vbus_attach_args *va = aux;
4682352513Spalle 
4782352513Spalle 	if (strcmp(va->va_name, "rtc") == 0)
4882352513Spalle 		return (1);
4982352513Spalle 
5082352513Spalle 	return (0);
5182352513Spalle }
5282352513Spalle 
5382352513Spalle void
vrtc_attach(device_t parent,device_t self,void * aux)5482352513Spalle vrtc_attach(device_t parent, device_t self, void *aux)
5582352513Spalle {
5682352513Spalle 	todr_chip_handle_t handle;
5782352513Spalle 
5882352513Spalle 	printf("\n");
5982352513Spalle 
60*fc256c4aSthorpej 	handle = kmem_alloc(sizeof(struct todr_chip_handle), KM_SLEEP);
6182352513Spalle 	handle->cookie = self;
6282352513Spalle 	handle->todr_gettime = vrtc_gettime;
6382352513Spalle 	handle->todr_settime = vrtc_settime;
6482352513Spalle 
6582352513Spalle 	handle->bus_cookie = NULL;
6682352513Spalle 	handle->todr_setwen = NULL;
6782352513Spalle 
6882352513Spalle 	todr_attach(handle);
6982352513Spalle }
7082352513Spalle 
7182352513Spalle int
vrtc_gettime(todr_chip_handle_t handle,struct timeval * tv)7282352513Spalle vrtc_gettime(todr_chip_handle_t handle, struct timeval *tv)
7382352513Spalle {
7482352513Spalle 	u_int64_t tod;
7582352513Spalle 
7682352513Spalle 	if (hv_tod_get(&tod) != H_EOK)
7782352513Spalle 		return (1);
7882352513Spalle 
7982352513Spalle 	tv->tv_sec = tod;
8082352513Spalle 	tv->tv_usec = 0;
8182352513Spalle 	return (0);
8282352513Spalle }
8382352513Spalle 
8482352513Spalle int
vrtc_settime(todr_chip_handle_t handle,struct timeval * tv)8582352513Spalle vrtc_settime(todr_chip_handle_t handle, struct timeval *tv)
8682352513Spalle {
8782352513Spalle 	if (hv_tod_set(tv->tv_sec) != H_EOK)
8882352513Spalle 		return (1);
8982352513Spalle 
9082352513Spalle 	return (0);
9182352513Spalle }
92