1 /* $NetBSD: ofrtc.c,v 1.21 2009/05/12 13:17:37 cegger Exp $ */
4 * Copyright (C) 1996 Wolfgang Solfrank.
5 * Copyright (C) 1996 TooLs GmbH.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by TooLs GmbH.
19 * 4. The name of TooLs GmbH may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25 * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
28 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
30 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
31 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 * Digital Equipment Corporation. All rights reserved.
37 * This software is furnished under license and may be used and
38 * copied only in accordance with the following terms and conditions.
39 * Subject to these conditions, you may download, copy, install,
40 * use, modify and distribute this software in source and/or binary
41 * form. No title or ownership is transferred hereby.
43 * 1) Any source code used, modified or distributed must reproduce
44 * and retain this copyright notice and list of conditions as
45 * they appear in the source file.
47 * 2) No right is granted to use any trade name, trademark, or logo of
48 * Digital Equipment Corporation. Neither the "Digital Equipment
49 * Corporation" name nor any trademark or logo of Digital Equipment
50 * Corporation may be used to endorse or promote products derived
51 * from this software without the prior written permission of
52 * Digital Equipment Corporation.
54 * 3) This software is provided "AS-IS" and any express or implied
55 * warranties, including but not limited to, any implied warranties
56 * of merchantability, fitness for a particular purpose, or
57 * non-infringement are disclaimed. In no event shall DIGITAL be
58 * liable for any damages whatsoever, and in particular, DIGITAL
59 * shall not be liable for special, indirect, consequential, or
60 * incidental damages or damages for lost profits, loss of
61 * revenue or loss of use, whether such damages arise in contract,
62 * negligence, tort, under statute, in equity, at law or otherwise,
63 * even if advised of the possibility of such damage.
66 #include <sys/cdefs.h>
67 __KERNEL_RCSID(0, "$NetBSD: ofrtc.c,v 1.21 2009/05/12 13:17:37 cegger Exp $");
69 #include <sys/param.h>
70 #include <sys/systm.h>
71 #include <sys/device.h>
73 #include <sys/event.h>
75 #include <dev/clock_subr.h>
76 #include <dev/ofw/openfirm.h>
89 struct todr_chip_handle sc_todr
;
92 static int ofrtc_match(device_t
, cfdata_t
, void *);
93 static void ofrtc_attach(device_t
, device_t
, void *);
94 static int ofrtc_gettod(todr_chip_handle_t
, struct clock_ymdhms
*);
95 static int ofrtc_settod(todr_chip_handle_t
, struct clock_ymdhms
*);
97 CFATTACH_DECL(ofrtc
, sizeof(struct ofrtc_softc
),
98 ofrtc_match
, ofrtc_attach
, NULL
, NULL
);
101 ofrtc_match(device_t parent
, cfdata_t match
, void *aux
)
103 struct ofbus_attach_args
*oba
= aux
;
107 if (strcmp(oba
->oba_busname
, "ofw"))
109 if ((l
= OF_getprop(oba
->oba_phandle
, "device_type", type
,
110 sizeof type
- 1)) < 0 ||
114 /* ensure null termination */
116 return !strcmp(type
, "rtc");
120 ofrtc_attach(device_t parent
, device_t self
, void *aux
)
122 struct ofrtc_softc
*of
= device_private(self
);
123 struct ofbus_attach_args
*oba
= aux
;
128 of
->sc_phandle
= oba
->oba_phandle
;
130 if ((l
= OF_getprop(of
->sc_phandle
, "name", name
,
131 sizeof name
- 1)) < 0)
132 panic("Device without name?");
133 if (l
>= sizeof name
)
137 if (!of
->sc_ihandle
) {
138 if ((l
= OF_package_to_path(of
->sc_phandle
, path
,
139 sizeof path
- 1)) < 0 ||
141 aprint_error(": cannot determine package path\n");
146 if (!(of
->sc_ihandle
= OF_open(path
))) {
147 aprint_error(": cannot open path\n");
152 of
->sc_todr
.todr_gettime_ymdhms
= ofrtc_gettod
;
153 of
->sc_todr
.todr_settime_ymdhms
= ofrtc_settod
;
154 of
->sc_todr
.cookie
= of
;
155 todr_attach(&of
->sc_todr
);
156 printf(": %s\n", name
);
160 ofrtc_gettod(todr_chip_handle_t tch
, struct clock_ymdhms
*dt
)
162 struct ofrtc_softc
*of
= tch
->cookie
;
166 * We mostly ignore the suggested time and go for the RTC clock time
167 * stored in the CMOS RAM. If the time can't be obtained from the
168 * CMOS, or if the time obtained from the CMOS is 5 or more years
169 * less than the suggested time, we used the suggested time. (In
170 * the latter case, it's likely that the CMOS battery has died.)
173 if (OF_call_method("get-time", of
->sc_ihandle
, 0, 6,
174 date
, date
+ 1, date
+ 2, date
+ 3, date
+ 4, date
+ 5)) {
178 dt
->dt_sec
= date
[OFRTC_SEC
];
179 dt
->dt_min
= date
[OFRTC_MIN
];
180 dt
->dt_hour
= date
[OFRTC_HR
];
181 dt
->dt_day
= date
[OFRTC_DOM
];
182 dt
->dt_mon
= date
[OFRTC_MON
];
183 dt
->dt_year
= date
[OFRTC_YR
];
189 ofrtc_settod(todr_chip_handle_t tch
, struct clock_ymdhms
*dt
)
191 struct ofrtc_softc
*of
= tch
->cookie
;
192 int sec
, minute
, hr
, dom
, mon
, yr
;
201 if (OF_call_method("set-time", of
->sc_ihandle
, 6, 0,
202 sec
, minute
, hr
, dom
, mon
, yr
))