prtc.c revision 1.3
1/*	$OpenBSD: prtc.c,v 1.3 2014/05/10 12:36:22 kettenis Exp $	*/
2
3/*
4 * Copyright (c) 2008 Mark Kettenis
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19/*
20 * Driver to get the time-of-day from the PROM for machines that don't
21 * have a hardware real-time clock, like the Enterprise 10000,
22 * Fire 12K and Fire 15K.
23 */
24
25#include <sys/param.h>
26#include <sys/device.h>
27#include <sys/malloc.h>
28#include <sys/systm.h>
29
30#include <machine/autoconf.h>
31#include <machine/openfirm.h>
32#include <machine/sparc64.h>
33
34#include <dev/clock_subr.h>
35
36extern todr_chip_handle_t todr_handle;
37
38int	prtc_match(struct device *, void *, void *);
39void	prtc_attach(struct device *, struct device *, void *);
40
41struct cfattach prtc_ca = {
42	sizeof(struct device), prtc_match, prtc_attach
43};
44
45struct cfdriver prtc_cd = {
46	NULL, "prtc", DV_DULL
47};
48
49int	prtc_gettime(todr_chip_handle_t, struct timeval *);
50int	prtc_settime(todr_chip_handle_t, struct timeval *);
51
52int
53prtc_match(struct device *parent, void *match, void *aux)
54{
55	struct mainbus_attach_args *ma = aux;
56
57	if (strcmp(ma->ma_name, "prtc") == 0)
58		return (1);
59
60	return (0);
61}
62
63void
64prtc_attach(struct device *parent, struct device *self, void *aux)
65{
66	todr_chip_handle_t handle;
67
68	printf("\n");
69
70	handle = malloc(sizeof(struct todr_chip_handle), M_DEVBUF, M_NOWAIT);
71	if (handle == NULL)
72		panic("couldn't allocate todr_handle");
73
74	handle->cookie = self;
75	handle->todr_gettime = prtc_gettime;
76	handle->todr_settime = prtc_settime;
77
78	handle->bus_cookie = NULL;
79	handle->todr_setwen = NULL;
80	todr_handle = handle;
81}
82
83int
84prtc_gettime(todr_chip_handle_t handle, struct timeval *tv)
85{
86	u_int32_t tod = 0;
87	char buf[32];
88
89	if (OF_getprop(findroot(), "name", buf, sizeof(buf)) > 0 &&
90	    strcmp(buf, "SUNW,SPARC-Enterprise") == 0) {
91		tv->tv_sec = prom_opl_get_tod();
92		tv->tv_usec = 0;
93		return (0);
94	}
95
96	snprintf(buf, sizeof(buf), "h# %08lx unix-gettod", (long)&tod);
97	OF_interpret(buf, 0);
98
99	tv->tv_sec = tod;
100	tv->tv_usec = 0;
101	return (0);
102}
103
104int
105prtc_settime(todr_chip_handle_t handle, struct timeval *tv)
106{
107	return (0);
108}
109