static int tegra_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alarm) { struct tegra_rtc_info *info = dev_get_drvdata(dev); unsigned long sec; if (alarm->enabled) rtc_tm_to_time(&alarm->time, &sec); else sec = 0; tegra_rtc_wait_while_busy(dev); writel(sec, info->rtc_base + TEGRA_RTC_REG_SECONDS_ALARM0); dev_vdbg(dev, "alarm read back as %d\n", readl(info->rtc_base + TEGRA_RTC_REG_SECONDS_ALARM0)); /* if successfully written and alarm is enabled ... */ if (sec) { tegra_rtc_alarm_irq_enable(dev, 1); dev_vdbg(dev, "alarm set as %lu. %d/%d/%d %d:%02u:%02u\n", sec, alarm->time.tm_mon+1, alarm->time.tm_mday, alarm->time.tm_year+1900, alarm->time.tm_hour, alarm->time.tm_min, alarm->time.tm_sec); } else { /* disable alarm if 0 or write error. */ dev_vdbg(dev, "alarm disabled\n"); tegra_rtc_alarm_irq_enable(dev, 0); } return 0; }
void tegra_rtc_set_trigger(unsigned long cycles) { unsigned long msec; /* Convert to msec */ msec = cycles / 1000; if (msec) msec = 0x80000000 | (0x0fffffff & msec); tegra_rtc_wait_while_busy(); writel(msec, rtc_base + TEGRA_RTC_REG_MSEC_CDN_ALARM0); tegra_rtc_wait_while_busy(); if (msec) tegra_rtc_alarm_irq_enable(1); else tegra_rtc_alarm_irq_enable(0); }
static int tegra_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *t) { int ret; unsigned long sec; if (t->enabled) rtc_tm_to_time(&t->time, &sec); else sec = 0; ret = tegra_rtc_write_not_busy(dev, RTC_TEGRA_REG_SECONDS_ALARM0, sec); dev_vdbg( dev, "alarm read back as %d\n", tegra_rtc_read(RTC_TEGRA_REG_SECONDS_ALARM0) ); /* if successfully written and alarm is enabled ... */ if (ret == 0 && sec) { tegra_rtc_alarm_irq_enable(dev, 1); dev_vdbg(dev, "alarm set as %lu. %d/%d/%d %d:%02u:%02u\n", sec, t->time.tm_mon+1, t->time.tm_mday, t->time.tm_year+1900, t->time.tm_hour, t->time.tm_min, t->time.tm_sec ); } else { /* disable alarm if 0 or write error. */ dev_vdbg(dev, "alarm disabled\n"); tegra_rtc_alarm_irq_enable(dev, 0); } return ret; }
static void tegra_rtc_shutdown(struct platform_device *pdev) { dev_vdbg(&pdev->dev, "disabling interrupts.\n"); tegra_rtc_alarm_irq_enable(&pdev->dev, 0); }