1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#include <config.h>
23#include <common.h>
24#include <rtc.h>
25#include <asm/io.h>
26
27struct ftrtc010 {
28 unsigned int sec;
29 unsigned int min;
30 unsigned int hour;
31 unsigned int day;
32 unsigned int alarm_sec;
33 unsigned int alarm_min;
34 unsigned int alarm_hour;
35 unsigned int record;
36 unsigned int cr;
37 unsigned int wsec;
38 unsigned int wmin;
39 unsigned int whour;
40 unsigned int wday;
41 unsigned int intr;
42 unsigned int div;
43 unsigned int rev;
44};
45
46
47
48
49#define FTRTC010_CR_ENABLE (1 << 0)
50#define FTRTC010_CR_INTERRUPT_SEC (1 << 1)
51#define FTRTC010_CR_INTERRUPT_MIN (1 << 2)
52#define FTRTC010_CR_INTERRUPT_HR (1 << 3)
53#define FTRTC010_CR_INTERRUPT_DAY (1 << 4)
54
55static struct ftrtc010 *rtc = (struct ftrtc010 *)CONFIG_FTRTC010_BASE;
56
57static void ftrtc010_enable(void)
58{
59 writel(FTRTC010_CR_ENABLE, &rtc->cr);
60}
61
62
63
64
65static unsigned long ftrtc010_time(void)
66{
67 unsigned long day;
68 unsigned long hour;
69 unsigned long minute;
70 unsigned long second;
71 unsigned long second2;
72
73 do {
74 second = readl(&rtc->sec);
75 day = readl(&rtc->day);
76 hour = readl(&rtc->hour);
77 minute = readl(&rtc->min);
78 second2 = readl(&rtc->sec);
79 } while (second != second2);
80
81 return day * 24 * 60 * 60 + hour * 60 * 60 + minute * 60 + second;
82}
83
84
85
86
87
88int rtc_get(struct rtc_time *tmp)
89{
90 unsigned long now;
91
92 debug("%s(): record register: %x\n",
93 __func__, readl(&rtc->record));
94
95#ifdef CONFIG_FTRTC010_PCLK
96 now = (ftrtc010_time() + readl(&rtc->record)) / RTC_DIV_COUNT;
97#else
98 now = ftrtc010_time() + readl(&rtc->record);
99#endif
100
101 to_tm(now, tmp);
102
103 return 0;
104}
105
106
107
108
109int rtc_set(struct rtc_time *tmp)
110{
111 unsigned long new;
112 unsigned long now;
113
114 debug("%s(): DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n",
115 __func__,
116 tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
117 tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
118
119 new = mktime(tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_hour,
120 tmp->tm_min, tmp->tm_sec);
121
122 now = ftrtc010_time();
123
124 debug("%s(): write %lx to record register\n", __func__, new - now);
125
126 writel(new - now, &rtc->record);
127
128 return 0;
129}
130
131void rtc_reset(void)
132{
133 debug("%s()\n", __func__);
134 ftrtc010_enable();
135}
136