static void rtc_reset_to_deftime(struct rtc_time *tm) { unsigned long flags; struct rtc_time defaulttm; tm->tm_year = RTC_DEFAULT_YEA - 1900; tm->tm_mon = RTC_DEFAULT_MTH - 1; tm->tm_mday = RTC_DEFAULT_DOM; tm->tm_wday = 1; tm->tm_hour = 0; tm->tm_min = 0; tm->tm_sec = 0; /* set default alarm time */ defaulttm.tm_year = RTC_DEFAULT_YEA - RTC_MIN_YEAR; defaulttm.tm_mon = RTC_DEFAULT_MTH; defaulttm.tm_mday = RTC_DEFAULT_DOM; defaulttm.tm_wday = 1; defaulttm.tm_hour = 0; defaulttm.tm_min = 0; defaulttm.tm_sec = 0; spin_lock_irqsave(&rtc_lock, flags); hal_rtc_set_alarm_time(&defaulttm); spin_unlock_irqrestore(&rtc_lock, flags); rtc_xerror("reset to default date %04d/%02d/%02d\n", RTC_DEFAULT_YEA, RTC_DEFAULT_MTH, RTC_DEFAULT_DOM); }
void hal_rtc_set_alarm(struct rtc_time *tm) { u16 irqen; hal_rtc_set_alarm_time(tm); irqen = rtc_read(RTC_IRQ_EN) | RTC_IRQ_EN_ONESHOT_AL; rtc_write(RTC_IRQ_EN, irqen); rtc_write_trigger(); }
void hal_rtc_clear_alarm(struct rtc_time *tm) { u16 irqsta, irqen, pdn2; irqen = rtc_read(RTC_IRQ_EN) & ~RTC_IRQ_EN_AL; pdn2 = rtc_read(RTC_PDN2) & ~RTC_PDN2_PWRON_ALARM; rtc_write(RTC_IRQ_EN, irqen); rtc_write(RTC_PDN2, pdn2); rtc_write_trigger(); irqsta = rtc_read(RTC_IRQ_STA); /* read clear */ hal_rtc_set_alarm_time(tm); }
static int rtc_ops_set_alarm(struct device *dev, struct rtc_wkalrm *alm) { unsigned long time, flags; struct rtc_time *tm = &alm->time; rtc_tm_to_time(tm, &time); if (time > (unsigned long)LONG_MAX) return -EINVAL; tm->tm_year -= RTC_MIN_YEAR_OFFSET; tm->tm_mon++; rtc_xinfo("set al time = %04d/%02d/%02d %02d:%02d:%02d (%d)\n", tm->tm_year + RTC_MIN_YEAR, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, alm->enabled); spin_lock_irqsave(&rtc_lock, flags); if (alm->enabled == 2) { /* enable power-on alarm */ rtc_save_pwron_time(true, tm, false); } else if (alm->enabled == 3) { /* enable power-on alarm with logo */ rtc_save_pwron_time(true, tm, true); } else if (alm->enabled == 4) { /* disable power-on alarm */ /* alm->enabled = 0; */ rtc_save_pwron_time(false, tm, false); } /* disable alarm and clear Power-On Alarm bit */ hal_rtc_clear_alarm(tm); if (alm->enabled) { hal_rtc_set_alarm_time(tm); } spin_unlock_irqrestore(&rtc_lock, flags); return 0; }
/* static void rtc_tasklet_handler(unsigned long data) */ static void rtc_handler(void) { bool pwron_alm = false, isLowPowerIrq = false, pwron_alarm = false; struct rtc_time nowtm; struct rtc_time tm; rtc_xinfo("rtc_tasklet_handler start\n"); spin_lock(&rtc_lock); isLowPowerIrq = hal_rtc_is_lp_irq(); if (isLowPowerIrq) { spin_unlock(&rtc_lock); return; } #if RTC_RELPWR_WHEN_XRST /* set AUTO bit because AUTO = 0 when PWREN = 1 and alarm occurs */ hal_rtc_reload_power(); #endif pwron_alarm = hal_rtc_check_pwron_alarm_rg(&nowtm, &tm); nowtm.tm_year += RTC_MIN_YEAR; tm.tm_year += RTC_MIN_YEAR; if (pwron_alarm) { unsigned long now_time, time; now_time = mktime(nowtm.tm_year, nowtm.tm_mon, nowtm.tm_mday, nowtm.tm_hour, nowtm.tm_min, nowtm.tm_sec); time = mktime(tm.tm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); if (now_time >= time - 1 && now_time <= time + 4) { /* power on */ #if defined(CONFIG_MTK_KERNEL_POWER_OFF_CHARGING) if (g_boot_mode == KERNEL_POWER_OFF_CHARGING_BOOT || g_boot_mode == LOW_POWER_OFF_CHARGING_BOOT) { time += 1; rtc_time_to_tm(time, &tm); tm.tm_year -= RTC_MIN_YEAR_OFFSET; tm.tm_mon += 1; /* tm.tm_sec += 1; */ hal_rtc_set_alarm_time(&tm); spin_unlock(&rtc_lock); arch_reset(0, "kpoc"); } else { hal_rtc_set_pwron_alarm(); pwron_alm = true; } #else hal_rtc_set_pwron_alarm(); pwron_alm = true; #endif } else if (now_time < time) { /* set power-on alarm */ if (tm.tm_sec == 0) { tm.tm_sec = 59; tm.tm_min -= 1; } else { tm.tm_sec -= 1; } hal_rtc_set_alarm_time(&tm); } } spin_unlock(&rtc_lock); if (rtc != NULL) rtc_update_irq(rtc, 1, RTC_IRQF | RTC_AF); if (rtc_show_alarm) rtc_xinfo("%s time is up\n", pwron_alm ? "power-on" : "alarm"); }