123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /*
- * (C) Copyright 2008
- * Gururaja Hebbar gururajakr@sanyo.co.in
- *
- * reference linux-2.6.20.6/drivers/rtc/rtc-pl031.c
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
- #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
|