| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | 
							- // SPDX-License-Identifier: GPL-2.0+
 
- /*
 
-  * (C) Copyright 2008
 
-  * Gururaja Hebbar gururajakr@sanyo.co.in
 
-  *
 
-  * reference linux-2.6.20.6/drivers/rtc/rtc-pl031.c
 
-  */
 
- #include <common.h>
 
- #include <command.h>
 
- #include <rtc.h>
 
- #if defined(CONFIG_CMD_DATE)
 
- #ifndef CONFIG_SYS_RTC_PL031_BASE
 
- #error CONFIG_SYS_RTC_PL031_BASE is not defined!
 
- #endif
 
- /*
 
-  * Register definitions
 
-  */
 
- #define	RTC_DR		0x00	/* Data read register */
 
- #define	RTC_MR		0x04	/* Match register */
 
- #define	RTC_LR		0x08	/* Data load register */
 
- #define	RTC_CR		0x0c	/* Control register */
 
- #define	RTC_IMSC	0x10	/* Interrupt mask and set register */
 
- #define	RTC_RIS		0x14	/* Raw interrupt status register */
 
- #define	RTC_MIS		0x18	/* Masked interrupt status register */
 
- #define	RTC_ICR		0x1c	/* Interrupt clear register */
 
- #define RTC_CR_START	(1 << 0)
 
- #define	RTC_WRITE_REG(addr, val) \
 
- 			(*(volatile unsigned int *)(CONFIG_SYS_RTC_PL031_BASE + (addr)) = (val))
 
- #define	RTC_READ_REG(addr)	\
 
- 			(*(volatile unsigned int *)(CONFIG_SYS_RTC_PL031_BASE + (addr)))
 
- static int pl031_initted = 0;
 
- /* Enable RTC Start in Control register*/
 
- void rtc_init(void)
 
- {
 
- 	RTC_WRITE_REG(RTC_CR, RTC_CR_START);
 
- 	pl031_initted = 1;
 
- }
 
- /*
 
-  * Reset the RTC. We set the date back to 1970-01-01.
 
-  */
 
- void rtc_reset(void)
 
- {
 
- 	RTC_WRITE_REG(RTC_LR, 0x00);
 
- 	if(!pl031_initted)
 
- 		rtc_init();
 
- }
 
- /*
 
-  * Set the RTC
 
- */
 
- int rtc_set(struct rtc_time *tmp)
 
- {
 
- 	unsigned long tim;
 
- 	if(!pl031_initted)
 
- 		rtc_init();
 
- 	if (tmp == NULL) {
 
- 		puts("Error setting the date/time\n");
 
- 		return -1;
 
- 	}
 
- 	/* Calculate number of seconds this incoming time represents */
 
- 	tim = rtc_mktime(tmp);
 
- 	RTC_WRITE_REG(RTC_LR, tim);
 
- 	return -1;
 
- }
 
- /*
 
-  * Get the current time from the RTC
 
-  */
 
- int rtc_get(struct rtc_time *tmp)
 
- {
 
- 	ulong tim;
 
- 	if(!pl031_initted)
 
- 		rtc_init();
 
- 	if (tmp == NULL) {
 
- 		puts("Error getting the date/time\n");
 
- 		return -1;
 
- 	}
 
- 	tim = RTC_READ_REG(RTC_DR);
 
- 	rtc_to_tm(tim, tmp);
 
- 	debug ( "Get DATE: %4d-%02d-%02d (wday=%d)  TIME: %2d:%02d:%02d\n",
 
- 		tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday,
 
- 		tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
 
- 	return 0;
 
- }
 
- #endif
 
 
  |