コード例 #1
0
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);
}
コード例 #2
0
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();
}
コード例 #3
0
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);
}
コード例 #4
0
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;
}
コード例 #5
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");

}