1535cfa4fSGururaja Hebbar K R /* 2535cfa4fSGururaja Hebbar K R * (C) Copyright 2008 3535cfa4fSGururaja Hebbar K R * Gururaja Hebbar gururajakr@sanyo.co.in 4535cfa4fSGururaja Hebbar K R * 5535cfa4fSGururaja Hebbar K R * reference linux-2.6.20.6/drivers/rtc/rtc-pl031.c 6535cfa4fSGururaja Hebbar K R * 7535cfa4fSGururaja Hebbar K R * See file CREDITS for list of people who contributed to this 8535cfa4fSGururaja Hebbar K R * project. 9535cfa4fSGururaja Hebbar K R * 10535cfa4fSGururaja Hebbar K R * This program is free software; you can redistribute it and/or 11535cfa4fSGururaja Hebbar K R * modify it under the terms of the GNU General Public License as 12535cfa4fSGururaja Hebbar K R * published by the Free Software Foundation; either version 2 of 13535cfa4fSGururaja Hebbar K R * the License, or (at your option) any later version. 14535cfa4fSGururaja Hebbar K R * 15535cfa4fSGururaja Hebbar K R * This program is distributed in the hope that it will be useful, 16535cfa4fSGururaja Hebbar K R * but WITHOUT ANY WARRANTY; without even the implied warranty of 17535cfa4fSGururaja Hebbar K R * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18535cfa4fSGururaja Hebbar K R * GNU General Public License for more details. 19535cfa4fSGururaja Hebbar K R * 20535cfa4fSGururaja Hebbar K R * You should have received a copy of the GNU General Public License 21535cfa4fSGururaja Hebbar K R * along with this program; if not, write to the Free Software 22535cfa4fSGururaja Hebbar K R * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 23535cfa4fSGururaja Hebbar K R * MA 02111-1307 USA 24535cfa4fSGururaja Hebbar K R */ 25535cfa4fSGururaja Hebbar K R 26535cfa4fSGururaja Hebbar K R #include <common.h> 27535cfa4fSGururaja Hebbar K R #include <command.h> 28535cfa4fSGururaja Hebbar K R #include <rtc.h> 29535cfa4fSGururaja Hebbar K R 30535cfa4fSGururaja Hebbar K R #if defined(CONFIG_CMD_DATE) 31535cfa4fSGururaja Hebbar K R 32535cfa4fSGururaja Hebbar K R #ifndef CFG_RTC_PL031_BASE 33535cfa4fSGururaja Hebbar K R #error CFG_RTC_PL031_BASE is not defined! 34535cfa4fSGururaja Hebbar K R #endif 35535cfa4fSGururaja Hebbar K R 36535cfa4fSGururaja Hebbar K R /* 37535cfa4fSGururaja Hebbar K R * Register definitions 38535cfa4fSGururaja Hebbar K R */ 39535cfa4fSGururaja Hebbar K R #define RTC_DR 0x00 /* Data read register */ 40535cfa4fSGururaja Hebbar K R #define RTC_MR 0x04 /* Match register */ 41535cfa4fSGururaja Hebbar K R #define RTC_LR 0x08 /* Data load register */ 42535cfa4fSGururaja Hebbar K R #define RTC_CR 0x0c /* Control register */ 43535cfa4fSGururaja Hebbar K R #define RTC_IMSC 0x10 /* Interrupt mask and set register */ 44535cfa4fSGururaja Hebbar K R #define RTC_RIS 0x14 /* Raw interrupt status register */ 45535cfa4fSGururaja Hebbar K R #define RTC_MIS 0x18 /* Masked interrupt status register */ 46535cfa4fSGururaja Hebbar K R #define RTC_ICR 0x1c /* Interrupt clear register */ 47535cfa4fSGururaja Hebbar K R 48535cfa4fSGururaja Hebbar K R #define RTC_CR_START (1 << 0) 49535cfa4fSGururaja Hebbar K R 50535cfa4fSGururaja Hebbar K R #define RTC_WRITE_REG(addr, val) \ 51535cfa4fSGururaja Hebbar K R (*(volatile unsigned int *)(CFG_RTC_PL031_BASE + (addr)) = (val)) 52535cfa4fSGururaja Hebbar K R #define RTC_READ_REG(addr) \ 53535cfa4fSGururaja Hebbar K R (*(volatile unsigned int *)(CFG_RTC_PL031_BASE + (addr))) 54535cfa4fSGururaja Hebbar K R 55535cfa4fSGururaja Hebbar K R static int pl031_initted = 0; 56535cfa4fSGururaja Hebbar K R 57535cfa4fSGururaja Hebbar K R /* Enable RTC Start in Control register*/ 58535cfa4fSGururaja Hebbar K R void rtc_init(void) 59535cfa4fSGururaja Hebbar K R { 60535cfa4fSGururaja Hebbar K R RTC_WRITE_REG(RTC_CR, RTC_CR_START); 61535cfa4fSGururaja Hebbar K R 62535cfa4fSGururaja Hebbar K R pl031_initted = 1; 63535cfa4fSGururaja Hebbar K R } 64535cfa4fSGururaja Hebbar K R 65535cfa4fSGururaja Hebbar K R /* 66535cfa4fSGururaja Hebbar K R * Reset the RTC. We set the date back to 1970-01-01. 67535cfa4fSGururaja Hebbar K R */ 68535cfa4fSGururaja Hebbar K R void rtc_reset(void) 69535cfa4fSGururaja Hebbar K R { 70535cfa4fSGururaja Hebbar K R RTC_WRITE_REG(RTC_LR, 0x00); 71535cfa4fSGururaja Hebbar K R if(!pl031_initted) 72535cfa4fSGururaja Hebbar K R rtc_init(); 73535cfa4fSGururaja Hebbar K R } 74535cfa4fSGururaja Hebbar K R 75535cfa4fSGururaja Hebbar K R /* 76535cfa4fSGururaja Hebbar K R * Set the RTC 77535cfa4fSGururaja Hebbar K R */ 78*d1e23194SJean-Christophe PLAGNIOL-VILLARD int rtc_set(struct rtc_time *tmp) 79535cfa4fSGururaja Hebbar K R { 80535cfa4fSGururaja Hebbar K R unsigned long tim; 81535cfa4fSGururaja Hebbar K R 82535cfa4fSGururaja Hebbar K R if(!pl031_initted) 83535cfa4fSGururaja Hebbar K R rtc_init(); 84535cfa4fSGururaja Hebbar K R 85535cfa4fSGururaja Hebbar K R if (tmp == NULL) { 86535cfa4fSGururaja Hebbar K R puts("Error setting the date/time\n"); 87*d1e23194SJean-Christophe PLAGNIOL-VILLARD return -1; 88535cfa4fSGururaja Hebbar K R } 89535cfa4fSGururaja Hebbar K R 90535cfa4fSGururaja Hebbar K R /* Calculate number of seconds this incoming time represents */ 91535cfa4fSGururaja Hebbar K R tim = mktime(tmp->tm_year, tmp->tm_mon, tmp->tm_mday, 92535cfa4fSGururaja Hebbar K R tmp->tm_hour, tmp->tm_min, tmp->tm_sec); 93535cfa4fSGururaja Hebbar K R 94535cfa4fSGururaja Hebbar K R RTC_WRITE_REG(RTC_LR, tim); 95*d1e23194SJean-Christophe PLAGNIOL-VILLARD 96*d1e23194SJean-Christophe PLAGNIOL-VILLARD return -1; 97535cfa4fSGururaja Hebbar K R } 98535cfa4fSGururaja Hebbar K R 99535cfa4fSGururaja Hebbar K R /* 100535cfa4fSGururaja Hebbar K R * Get the current time from the RTC 101535cfa4fSGururaja Hebbar K R */ 102535cfa4fSGururaja Hebbar K R int rtc_get(struct rtc_time *tmp) 103535cfa4fSGururaja Hebbar K R { 104535cfa4fSGururaja Hebbar K R ulong tim; 105535cfa4fSGururaja Hebbar K R 106535cfa4fSGururaja Hebbar K R if(!pl031_initted) 107535cfa4fSGururaja Hebbar K R rtc_init(); 108535cfa4fSGururaja Hebbar K R 109535cfa4fSGururaja Hebbar K R if (tmp == NULL) { 110535cfa4fSGururaja Hebbar K R puts("Error getting the date/time\n"); 111535cfa4fSGururaja Hebbar K R return -1; 112535cfa4fSGururaja Hebbar K R } 113535cfa4fSGururaja Hebbar K R 114535cfa4fSGururaja Hebbar K R tim = RTC_READ_REG(RTC_DR); 115535cfa4fSGururaja Hebbar K R 116535cfa4fSGururaja Hebbar K R to_tm (tim, tmp); 117535cfa4fSGururaja Hebbar K R 118535cfa4fSGururaja Hebbar K R debug ( "Get DATE: %4d-%02d-%02d (wday=%d) TIME: %2d:%02d:%02d\n", 119535cfa4fSGururaja Hebbar K R tmp->tm_year, tmp->tm_mon, tmp->tm_mday, tmp->tm_wday, 120535cfa4fSGururaja Hebbar K R tmp->tm_hour, tmp->tm_min, tmp->tm_sec); 121535cfa4fSGururaja Hebbar K R 122535cfa4fSGururaja Hebbar K R return 0; 123535cfa4fSGururaja Hebbar K R } 124535cfa4fSGururaja Hebbar K R 125535cfa4fSGururaja Hebbar K R #endif 126