]>
Commit | Line | Data |
---|---|---|
535cfa4f GH |
1 | /* |
2 | * (C) Copyright 2008 | |
3 | * Gururaja Hebbar [email protected] | |
4 | * | |
5 | * reference linux-2.6.20.6/drivers/rtc/rtc-pl031.c | |
6 | * | |
1a459660 | 7 | * SPDX-License-Identifier: GPL-2.0+ |
535cfa4f GH |
8 | */ |
9 | ||
10 | #include <common.h> | |
11 | #include <command.h> | |
12 | #include <rtc.h> | |
13 | ||
14 | #if defined(CONFIG_CMD_DATE) | |
15 | ||
6d0f6bcf JCPV |
16 | #ifndef CONFIG_SYS_RTC_PL031_BASE |
17 | #error CONFIG_SYS_RTC_PL031_BASE is not defined! | |
535cfa4f GH |
18 | #endif |
19 | ||
20 | /* | |
21 | * Register definitions | |
22 | */ | |
23 | #define RTC_DR 0x00 /* Data read register */ | |
24 | #define RTC_MR 0x04 /* Match register */ | |
25 | #define RTC_LR 0x08 /* Data load register */ | |
26 | #define RTC_CR 0x0c /* Control register */ | |
27 | #define RTC_IMSC 0x10 /* Interrupt mask and set register */ | |
28 | #define RTC_RIS 0x14 /* Raw interrupt status register */ | |
29 | #define RTC_MIS 0x18 /* Masked interrupt status register */ | |
30 | #define RTC_ICR 0x1c /* Interrupt clear register */ | |
31 | ||
32 | #define RTC_CR_START (1 << 0) | |
33 | ||
34 | #define RTC_WRITE_REG(addr, val) \ | |
6d0f6bcf | 35 | (*(volatile unsigned int *)(CONFIG_SYS_RTC_PL031_BASE + (addr)) = (val)) |
535cfa4f | 36 | #define RTC_READ_REG(addr) \ |
6d0f6bcf | 37 | (*(volatile unsigned int *)(CONFIG_SYS_RTC_PL031_BASE + (addr))) |
535cfa4f GH |
38 | |
39 | static int pl031_initted = 0; | |
40 | ||
41 | /* Enable RTC Start in Control register*/ | |
42 | void rtc_init(void) | |
43 | { | |
44 | RTC_WRITE_REG(RTC_CR, RTC_CR_START); | |
45 | ||
46 | pl031_initted = 1; | |
47 | } | |
48 | ||
49 | /* | |
50 | * Reset the RTC. We set the date back to 1970-01-01. | |
51 | */ | |
52 | void rtc_reset(void) | |
53 | { | |
54 | RTC_WRITE_REG(RTC_LR, 0x00); | |
55 | if(!pl031_initted) | |
56 | rtc_init(); | |
57 | } | |
58 | ||
59 | /* | |
60 | * Set the RTC | |
61 | */ | |
d1e23194 | 62 | int rtc_set(struct rtc_time *tmp) |
535cfa4f GH |
63 | { |
64 | unsigned long tim; | |
65 | ||
66 | if(!pl031_initted) | |
67 | rtc_init(); | |
68 | ||
69 | if (tmp == NULL) { | |
70 | puts("Error setting the date/time\n"); | |
d1e23194 | 71 | return -1; |
535cfa4f GH |
72 | } |
73 | ||
74 | /* Calculate number of seconds this incoming time represents */ | |
71420983 | 75 | tim = rtc_mktime(tmp); |
535cfa4f GH |
76 | |
77 | RTC_WRITE_REG(RTC_LR, tim); | |
d1e23194 JCPV |
78 | |
79 | return -1; | |
535cfa4f GH |
80 | } |
81 | ||
82 | /* | |
83 | * Get the current time from the RTC | |
84 | */ | |
85 | int rtc_get(struct rtc_time *tmp) | |
86 | { | |
87 | ulong tim; | |
88 | ||
89 | if(!pl031_initted) | |
90 | rtc_init(); | |
91 | ||
92 | if (tmp == NULL) { | |
93 | puts("Error getting the date/time\n"); | |
94 | return -1; | |
95 | } | |
96 | ||
97 | tim = RTC_READ_REG(RTC_DR); | |
98 | ||
9f9276c3 | 99 | rtc_to_tm(tim, tmp); |
535cfa4f GH |
100 | |
101 | debug ( "Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", | |
102 | tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday, | |
103 | tmp->tm_hour, tmp->tm_min, tmp->tm_sec); | |
104 | ||
105 | return 0; | |
106 | } | |
107 | ||
108 | #endif |