static int da9052_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { int ret; struct rtc_time *tm = &alrm->time; struct da9052_rtc *rtc = dev_get_drvdata(dev); ret = da9052_rtc_enable_alarm(rtc, 0); if (ret < 0) return ret; ret = da9052_set_alarm(rtc, tm); if (ret < 0) return ret; ret = da9052_rtc_enable_alarm(rtc, 1); return ret; }
static irqreturn_t da9052_rtc_irq(int irq, void *data) { struct da9052_rtc *rtc = data; int ret; ret = da9052_reg_read(rtc->da9052, DA9052_ALARM_MI_REG); if (ret < 0) { rtc_err(rtc->da9052, "Read error: %d\n", ret); return IRQ_NONE; } if (ret & DA9052_ALARMMI_ALARMTYPE) { da9052_rtc_enable_alarm(rtc->da9052, 0); rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF); } else rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_PF); return IRQ_HANDLED; }
static int da9052_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled) { struct da9052_rtc *rtc = dev_get_drvdata(dev); return da9052_rtc_enable_alarm(rtc->da9052, enabled); }