| 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
 |