static void uboot_rtc_set_alarm_sec(unsigned long secs) { int i=0; unsigned long read_secs; sprd_rtc_set_alarm_sec(secs); msleep(150); do { if(i!=0){ sprd_rtc_set_alarm_sec(secs); msleep(150); } read_secs = sprd_rtc_get_alarm_sec(); msleep(1); i++; }while(read_secs != secs && i < 100); }
static int sprd_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { unsigned long secs; unsigned temp; sci_adi_raw_write(ANA_RTC_INT_CLR, RTC_ALARM_BIT); if(alrm->enabled){ rtc_tm_to_time(&alrm->time, &secs); if(secs < secs_start_year_to_1970) return -1; temp = sci_adi_read(ANA_RTC_INT_EN); temp |= RTC_ALARM_BIT; sci_adi_raw_write(ANA_RTC_INT_EN, temp); secs = secs - secs_start_year_to_1970; wake_lock(&rtc_wake_lock); sprd_rtc_set_alarm_sec(secs); sci_adi_raw_write(ANA_RTC_SPG_UPD, SPRD_RTC_UNLOCK); wake_unlock(&rtc_wake_lock); }else{ sci_adi_clr(ANA_RTC_INT_EN, RTC_ALARM_BIT); sci_adi_raw_write(ANA_RTC_SPG_UPD, SPRD_RTC_LOCK); msleep(150); } return 0; }
static int sprd_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { unsigned long secs; unsigned temp; unsigned long read_secs; int i = 0,n; rtc_tm_to_time(&alrm->time, &secs); sci_adi_raw_write(ANA_RTC_INT_CLR, RTC_ALARM_BIT); // printk("sprd_rtc_set_alarm enable : %d, : %lu, secs : %lu\n", alrm->enabled, secs_start_year_to_1970, secs); // printk("sprd_rtc_set_alarm - day [%d] hour [%d] min [%d] sec [%d]\n", alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min, alrm->time.tm_sec); if(alrm->enabled){ if(secs < secs_start_year_to_1970) return -1; temp = sci_adi_read(ANA_RTC_INT_EN); temp |= RTC_ALARM_BIT; sci_adi_raw_write(ANA_RTC_INT_EN, temp); secs = secs - secs_start_year_to_1970; wake_lock(&rtc_wake_lock); n = 2; while(sprd_rtc_set_alarm_sec(secs)!=0&&(n--)>0); do { if(i!=0){ n = 2; while(sprd_rtc_set_alarm_sec(secs)!=0&&(n--)>0); } read_secs = sprd_rtc_get_alarm_sec(); msleep(1); i++; }while(read_secs != secs && i < SPRD_RTC_SET_MAX); //sci_adi_raw_write(ANA_RTC_SPG_UPD, SPRD_RTC_UNLOCK); wake_unlock(&rtc_wake_lock); }else{ sci_adi_clr(ANA_RTC_INT_EN, RTC_ALARM_BIT); //sci_adi_raw_write(ANA_RTC_SPG_UPD, SPRD_RTC_LOCK); msleep(150); } return 0; }
int sprd_clean_rtc(void) { int err; ANA_REG_AND(ANA_RTC_INT_EN, ~(RTC_INT_ALL_MSK)); // disable all interrupt ANA_REG_OR(ANA_APB_CLK_EN, AGEN_RTC_EN | AGEN_RTC_RTC_EN); //enable rtc device CLEAR_RTC_INT(RTC_INT_ALL_MSK); sprd_rtc_set_sec(0); sprd_rtc_set_alarm_sec(0); printf("now time sec %lu\n", sprd_rtc_get_sec()); printf("now alarm sec %lu\n", sprd_rtc_get_alarm_sec()); return 0; }