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