2 * Copyright 2001 MontaVista Software Inc.
3 * Author: MontaVista Software, Inc.
6 * arch/mips/jmr3927/common/rtc_ds1742.c
7 * Based on arch/mips/ddb5xxx/common/rtc_ds1386.c
8 * low-level RTC hookups for s for Dallas 1742 chip.
10 * Copyright (C) 2000-2001 Toshiba Corporation
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by the
14 * Free Software Foundation; either version 2 of the License, or (at your
15 * option) any later version.
17 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
18 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
20 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
24 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 * You should have received a copy of the GNU General Public License along
29 * with this program; if not, write to the Free Software Foundation, Inc.,
30 * 675 Mass Ave, Cambridge, MA 02139, USA.
35 * This file exports a function, rtc_ds1386_init(), which expects an
36 * uncached base address as the argument. It will set the two function
37 * pointers expected by the MIPS generic timer code.
40 #include <linux/bcd.h>
41 #include <linux/types.h>
42 #include <linux/time.h>
43 #include <linux/rtc.h>
46 #include <asm/addrspace.h>
48 #include <asm/jmr3927/ds1742rtc.h>
49 #include <asm/debug.h>
53 static unsigned long rtc_base
;
56 rtc_ds1742_get_time(void)
58 unsigned int year
, month
, day
, hour
, minute
, second
;
61 CMOS_WRITE(RTC_READ
, RTC_CONTROL
);
62 second
= BCD2BIN(CMOS_READ(RTC_SECONDS
) & RTC_SECONDS_MASK
);
63 minute
= BCD2BIN(CMOS_READ(RTC_MINUTES
));
64 hour
= BCD2BIN(CMOS_READ(RTC_HOURS
));
65 day
= BCD2BIN(CMOS_READ(RTC_DATE
));
66 month
= BCD2BIN(CMOS_READ(RTC_MONTH
));
67 year
= BCD2BIN(CMOS_READ(RTC_YEAR
));
68 century
= BCD2BIN(CMOS_READ(RTC_CENTURY
) & RTC_CENTURY_MASK
);
69 CMOS_WRITE(0, RTC_CONTROL
);
71 year
+= century
* 100;
73 return mktime(year
, month
, day
, hour
, minute
, second
);
75 extern void to_tm(unsigned long tim
, struct rtc_time
* tm
);
78 rtc_ds1742_set_time(unsigned long t
)
81 u8 year
, month
, day
, hour
, minute
, second
;
82 u8 cmos_year
, cmos_month
, cmos_day
, cmos_hour
, cmos_minute
, cmos_second
;
85 CMOS_WRITE(RTC_READ
, RTC_CONTROL
);
86 cmos_second
= (u8
)(CMOS_READ(RTC_SECONDS
) & RTC_SECONDS_MASK
);
87 cmos_minute
= (u8
)CMOS_READ(RTC_MINUTES
);
88 cmos_hour
= (u8
)CMOS_READ(RTC_HOURS
);
89 cmos_day
= (u8
)CMOS_READ(RTC_DATE
);
90 cmos_month
= (u8
)CMOS_READ(RTC_MONTH
);
91 cmos_year
= (u8
)CMOS_READ(RTC_YEAR
);
92 cmos_century
= CMOS_READ(RTC_CENTURY
) & RTC_CENTURY_MASK
;
94 CMOS_WRITE(RTC_WRITE
, RTC_CONTROL
);
99 /* check each field one by one */
100 year
= BIN2BCD(tm
.tm_year
- EPOCH
);
101 if (year
!= cmos_year
) {
102 CMOS_WRITE(year
,RTC_YEAR
);
105 month
= BIN2BCD(tm
.tm_mon
);
106 if (month
!= (cmos_month
& 0x1f)) {
107 CMOS_WRITE((month
& 0x1f) | (cmos_month
& ~0x1f),RTC_MONTH
);
110 day
= BIN2BCD(tm
.tm_mday
);
111 if (day
!= cmos_day
) {
113 CMOS_WRITE(day
, RTC_DATE
);
116 if (cmos_hour
& 0x40) {
119 if (tm
.tm_hour
> 12) {
120 hour
|= 0x20 | (BIN2BCD(hour
-12) & 0x1f);
122 hour
|= BIN2BCD(tm
.tm_hour
);
126 hour
= BIN2BCD(tm
.tm_hour
) & 0x3f;
128 if (hour
!= cmos_hour
) CMOS_WRITE(hour
, RTC_HOURS
);
130 minute
= BIN2BCD(tm
.tm_min
);
131 if (minute
!= cmos_minute
) {
132 CMOS_WRITE(minute
, RTC_MINUTES
);
135 second
= BIN2BCD(tm
.tm_sec
);
136 if (second
!= cmos_second
) {
137 CMOS_WRITE(second
& RTC_SECONDS_MASK
,RTC_SECONDS
);
140 /* RTC_CENTURY and RTC_CONTROL share same address... */
141 CMOS_WRITE(cmos_century
, RTC_CONTROL
);
147 rtc_ds1742_init(unsigned long base
)
151 /* remember the base */
153 db_assert((rtc_base
& 0xe0000000) == KSEG1
);
155 /* set the function pointers */
156 rtc_get_time
= rtc_ds1742_get_time
;
157 rtc_set_time
= rtc_ds1742_set_time
;
159 /* clear oscillator stop bit */
160 CMOS_WRITE(RTC_READ
, RTC_CONTROL
);
161 cmos_second
= (u8
)(CMOS_READ(RTC_SECONDS
) & RTC_SECONDS_MASK
);
162 CMOS_WRITE(RTC_WRITE
, RTC_CONTROL
);
163 CMOS_WRITE(cmos_second
, RTC_SECONDS
); /* clear msb */
164 CMOS_WRITE(0, RTC_CONTROL
);