xref: /rk3399_rockchip-uboot/drivers/rtc/pl031.c (revision 535cfa4f3de86cf48d6c0af1daf33aebdca089f9)
1*535cfa4fSGururaja Hebbar K R /*
2*535cfa4fSGururaja Hebbar K R  * (C) Copyright 2008
3*535cfa4fSGururaja Hebbar K R  * Gururaja Hebbar gururajakr@sanyo.co.in
4*535cfa4fSGururaja Hebbar K R  *
5*535cfa4fSGururaja Hebbar K R  * reference linux-2.6.20.6/drivers/rtc/rtc-pl031.c
6*535cfa4fSGururaja Hebbar K R  *
7*535cfa4fSGururaja Hebbar K R  * See file CREDITS for list of people who contributed to this
8*535cfa4fSGururaja Hebbar K R  * project.
9*535cfa4fSGururaja Hebbar K R  *
10*535cfa4fSGururaja Hebbar K R  * This program is free software; you can redistribute it and/or
11*535cfa4fSGururaja Hebbar K R  * modify it under the terms of the GNU General Public License as
12*535cfa4fSGururaja Hebbar K R  * published by the Free Software Foundation; either version 2 of
13*535cfa4fSGururaja Hebbar K R  * the License, or (at your option) any later version.
14*535cfa4fSGururaja Hebbar K R  *
15*535cfa4fSGururaja Hebbar K R  * This program is distributed in the hope that it will be useful,
16*535cfa4fSGururaja Hebbar K R  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*535cfa4fSGururaja Hebbar K R  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*535cfa4fSGururaja Hebbar K R  * GNU General Public License for more details.
19*535cfa4fSGururaja Hebbar K R  *
20*535cfa4fSGururaja Hebbar K R  * You should have received a copy of the GNU General Public License
21*535cfa4fSGururaja Hebbar K R  * along with this program; if not, write to the Free Software
22*535cfa4fSGururaja Hebbar K R  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23*535cfa4fSGururaja Hebbar K R  * MA 02111-1307 USA
24*535cfa4fSGururaja Hebbar K R  */
25*535cfa4fSGururaja Hebbar K R 
26*535cfa4fSGururaja Hebbar K R #include <common.h>
27*535cfa4fSGururaja Hebbar K R #include <command.h>
28*535cfa4fSGururaja Hebbar K R #include <rtc.h>
29*535cfa4fSGururaja Hebbar K R 
30*535cfa4fSGururaja Hebbar K R #if defined(CONFIG_CMD_DATE)
31*535cfa4fSGururaja Hebbar K R 
32*535cfa4fSGururaja Hebbar K R #ifndef CFG_RTC_PL031_BASE
33*535cfa4fSGururaja Hebbar K R #error CFG_RTC_PL031_BASE is not defined!
34*535cfa4fSGururaja Hebbar K R #endif
35*535cfa4fSGururaja Hebbar K R 
36*535cfa4fSGururaja Hebbar K R /*
37*535cfa4fSGururaja Hebbar K R  * Register definitions
38*535cfa4fSGururaja Hebbar K R  */
39*535cfa4fSGururaja Hebbar K R #define	RTC_DR		0x00	/* Data read register */
40*535cfa4fSGururaja Hebbar K R #define	RTC_MR		0x04	/* Match register */
41*535cfa4fSGururaja Hebbar K R #define	RTC_LR		0x08	/* Data load register */
42*535cfa4fSGururaja Hebbar K R #define	RTC_CR		0x0c	/* Control register */
43*535cfa4fSGururaja Hebbar K R #define	RTC_IMSC	0x10	/* Interrupt mask and set register */
44*535cfa4fSGururaja Hebbar K R #define	RTC_RIS		0x14	/* Raw interrupt status register */
45*535cfa4fSGururaja Hebbar K R #define	RTC_MIS		0x18	/* Masked interrupt status register */
46*535cfa4fSGururaja Hebbar K R #define	RTC_ICR		0x1c	/* Interrupt clear register */
47*535cfa4fSGururaja Hebbar K R 
48*535cfa4fSGururaja Hebbar K R #define RTC_CR_START	(1 << 0)
49*535cfa4fSGururaja Hebbar K R 
50*535cfa4fSGururaja Hebbar K R #define	RTC_WRITE_REG(addr, val) \
51*535cfa4fSGururaja Hebbar K R 			(*(volatile unsigned int *)(CFG_RTC_PL031_BASE + (addr)) = (val))
52*535cfa4fSGururaja Hebbar K R #define	RTC_READ_REG(addr)	\
53*535cfa4fSGururaja Hebbar K R 			(*(volatile unsigned int *)(CFG_RTC_PL031_BASE + (addr)))
54*535cfa4fSGururaja Hebbar K R 
55*535cfa4fSGururaja Hebbar K R static int pl031_initted = 0;
56*535cfa4fSGururaja Hebbar K R 
57*535cfa4fSGururaja Hebbar K R /* Enable RTC Start in Control register*/
58*535cfa4fSGururaja Hebbar K R void rtc_init(void)
59*535cfa4fSGururaja Hebbar K R {
60*535cfa4fSGururaja Hebbar K R 	RTC_WRITE_REG(RTC_CR, RTC_CR_START);
61*535cfa4fSGururaja Hebbar K R 
62*535cfa4fSGururaja Hebbar K R 	pl031_initted = 1;
63*535cfa4fSGururaja Hebbar K R }
64*535cfa4fSGururaja Hebbar K R 
65*535cfa4fSGururaja Hebbar K R /*
66*535cfa4fSGururaja Hebbar K R  * Reset the RTC. We set the date back to 1970-01-01.
67*535cfa4fSGururaja Hebbar K R  */
68*535cfa4fSGururaja Hebbar K R void rtc_reset(void)
69*535cfa4fSGururaja Hebbar K R {
70*535cfa4fSGururaja Hebbar K R 	RTC_WRITE_REG(RTC_LR, 0x00);
71*535cfa4fSGururaja Hebbar K R 	if(!pl031_initted)
72*535cfa4fSGururaja Hebbar K R 		rtc_init();
73*535cfa4fSGururaja Hebbar K R }
74*535cfa4fSGururaja Hebbar K R 
75*535cfa4fSGururaja Hebbar K R /*
76*535cfa4fSGururaja Hebbar K R  * Set the RTC
77*535cfa4fSGururaja Hebbar K R */
78*535cfa4fSGururaja Hebbar K R void rtc_set(struct rtc_time *tmp)
79*535cfa4fSGururaja Hebbar K R {
80*535cfa4fSGururaja Hebbar K R 	unsigned long tim;
81*535cfa4fSGururaja Hebbar K R 
82*535cfa4fSGururaja Hebbar K R 	if(!pl031_initted)
83*535cfa4fSGururaja Hebbar K R 		rtc_init();
84*535cfa4fSGururaja Hebbar K R 
85*535cfa4fSGururaja Hebbar K R 	if (tmp == NULL) {
86*535cfa4fSGururaja Hebbar K R 		puts("Error setting the date/time\n");
87*535cfa4fSGururaja Hebbar K R 		return;
88*535cfa4fSGururaja Hebbar K R 	}
89*535cfa4fSGururaja Hebbar K R 
90*535cfa4fSGururaja Hebbar K R 	/* Calculate number of seconds this incoming time represents */
91*535cfa4fSGururaja Hebbar K R 	tim = mktime(tmp->tm_year, tmp->tm_mon, tmp->tm_mday,
92*535cfa4fSGururaja Hebbar K R 	                tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
93*535cfa4fSGururaja Hebbar K R 
94*535cfa4fSGururaja Hebbar K R 	RTC_WRITE_REG(RTC_LR, tim);
95*535cfa4fSGururaja Hebbar K R }
96*535cfa4fSGururaja Hebbar K R 
97*535cfa4fSGururaja Hebbar K R /*
98*535cfa4fSGururaja Hebbar K R  * Get the current time from the RTC
99*535cfa4fSGururaja Hebbar K R  */
100*535cfa4fSGururaja Hebbar K R int rtc_get(struct rtc_time *tmp)
101*535cfa4fSGururaja Hebbar K R {
102*535cfa4fSGururaja Hebbar K R 	ulong tim;
103*535cfa4fSGururaja Hebbar K R 
104*535cfa4fSGururaja Hebbar K R 	if(!pl031_initted)
105*535cfa4fSGururaja Hebbar K R 		rtc_init();
106*535cfa4fSGururaja Hebbar K R 
107*535cfa4fSGururaja Hebbar K R 	if (tmp == NULL) {
108*535cfa4fSGururaja Hebbar K R 		puts("Error getting the date/time\n");
109*535cfa4fSGururaja Hebbar K R 		return -1;
110*535cfa4fSGururaja Hebbar K R 	}
111*535cfa4fSGururaja Hebbar K R 
112*535cfa4fSGururaja Hebbar K R 	tim = RTC_READ_REG(RTC_DR);
113*535cfa4fSGururaja Hebbar K R 
114*535cfa4fSGururaja Hebbar K R 	to_tm (tim, tmp);
115*535cfa4fSGururaja Hebbar K R 
116*535cfa4fSGururaja Hebbar K R 	debug ( "Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
117*535cfa4fSGururaja Hebbar K R 		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
118*535cfa4fSGururaja Hebbar K R 		tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
119*535cfa4fSGururaja Hebbar K R 
120*535cfa4fSGururaja Hebbar K R 	return 0;
121*535cfa4fSGururaja Hebbar K R }
122*535cfa4fSGururaja Hebbar K R 
123*535cfa4fSGururaja Hebbar K R #endif
124