static int tps80031_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { struct tps80031_rtc *rtc = dev_get_drvdata(dev); unsigned long seconds; u8 buff[6]; int err; struct rtc_time tm; if (rtc->irq == -1) return -EIO; rtc_tm_to_time(&alrm->time, &seconds); tps80031_rtc_read_time(dev, &tm); rtc_tm_to_time(&tm, &rtc->epoch_start); if (WARN_ON(alrm->enabled && (seconds < rtc->epoch_start))) { dev_err(dev->parent, "can't set alarm to requested time\n"); return -EINVAL; } buff[0] = alrm->time.tm_sec; buff[1] = alrm->time.tm_min; buff[2] = alrm->time.tm_hour; buff[3] = alrm->time.tm_mday; buff[4] = alrm->time.tm_mon + 1; buff[5] = alrm->time.tm_year % RTC_YEAR_OFFSET; convert_decimal_to_bcd(buff, sizeof(buff)); err = tps80031_write_regs(dev, RTC_ALARM, sizeof(buff), buff); if (err) dev_err(dev->parent, "unable to program alarm\n"); return err; }
static int tps80031_rtc_set_time(struct device *dev, struct rtc_time *tm) { u8 buff[7]; int err; buff[0] = tm->tm_sec; buff[1] = tm->tm_min; buff[2] = tm->tm_hour; buff[3] = tm->tm_mday; buff[4] = tm->tm_mon + 1; buff[5] = tm->tm_year % RTC_YEAR_OFFSET; buff[6] = tm->tm_wday; convert_decimal_to_bcd(buff, sizeof(buff)); err = tps80031_rtc_stop(dev); if (err < 0) return err; err = tps80031_write_regs(dev, RTC_SECONDS_REG, sizeof(buff), buff); if (err < 0) { dev_err(dev->parent, "failed to program new time\n"); return err; } err = tps80031_rtc_start(dev); return err; }
static int tps6591x_rtc_set_time(struct device *dev, struct rtc_time *tm) { u8 buff[7]; int err; buff[0] = tm->tm_sec; buff[1] = tm->tm_min; buff[2] = tm->tm_hour; buff[3] = tm->tm_mday; buff[4] = tm->tm_mon; buff[5] = tm->tm_year; buff[6] = tm->tm_wday; buff[4] = tm->tm_mon+1; print_time(dev, tm); convert_decimal_to_bcd(buff, sizeof(buff)); err = tps6591x_rtc_stop(dev); if (err < 0) { dev_err(dev->parent, "\n failed to clear RTC_ENABLE\n"); return err; } err = tps6591x_write_regs(dev, RTC_SECONDS_REG, sizeof(buff), buff); if (err < 0) { dev_err(dev->parent, "\n failed to program new time\n"); return err; } err = tps6591x_rtc_start(dev); if (err < 0) { dev_err(dev->parent, "\n failed to set RTC_ENABLE\n"); return err; } return 0; }
static int tps6591x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { struct tps6591x_rtc *rtc = dev_get_drvdata(dev); unsigned long seconds; u8 buff[6]; int err; struct rtc_time tm; if (rtc->shutdown_ongoing) { printk(KERN_WARNING "tps6591x_rtc_set_alarm: Device shutdown on-going, skip alarm setting.\n"); return -ESHUTDOWN; } if (rtc->irq == -1) return -EIO; err = tps6591x_rtc_valid_tm(&alrm->time); if (err < 0) { dev_err(dev->parent, "\n Invalid alarm time\n"); return err; } dev_info(dev->parent, "\n setting alarm to requested time::\n"); print_time(dev->parent, &alrm->time); rtc_tm_to_time(&alrm->time, &seconds); tps6591x_rtc_read_time(dev, &tm); rtc_tm_to_time(&tm, &rtc->epoch_start); if (WARN_ON(alrm->enabled && (seconds < rtc->epoch_start))) { dev_err(dev->parent, "\n can't set alarm to requested time\n"); return -EINVAL; } err = tps6591x_rtc_alarm_irq_enable(dev, alrm->enabled); if(err) { dev_err(dev->parent, "\n can't set alarm irq\n"); return err; } buff[0] = alrm->time.tm_sec; buff[1] = alrm->time.tm_min; buff[2] = alrm->time.tm_hour; buff[3] = alrm->time.tm_mday; buff[4] = alrm->time.tm_mon + 1; buff[5] = alrm->time.tm_year % RTC_YEAR_OFFSET; convert_decimal_to_bcd(buff, sizeof(buff)); err = tps6591x_write_regs(dev, RTC_ALARM, sizeof(buff), buff); if (err) dev_err(dev->parent, "\n unable to program alarm\n"); return err; }
static int tps6591x_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { struct tps6591x_rtc *rtc = dev_get_drvdata(dev); unsigned long seconds; u8 buff[6]; int err; struct rtc_time tm; if (rtc->irq == -1) return -EIO; dev_info(dev->parent, "\n setting alarm to requested time::\n"); print_time(dev->parent, &alrm->time); rtc_tm_to_time(&alrm->time, &seconds); tps6591x_rtc_read_time(dev, &tm); rtc_tm_to_time(&tm, &rtc->epoch_start); if (WARN_ON(alrm->enabled && (seconds < rtc->epoch_start))) { dev_err(dev->parent, "\n can't set alarm to requested time\n"); return -EINVAL; } if (alrm->enabled && !rtc->irq_en) { rtc->irq_en = true; } else if (!alrm->enabled && rtc->irq_en) { rtc->irq_en = false; } buff[0] = alrm->time.tm_sec; buff[1] = alrm->time.tm_min; buff[2] = alrm->time.tm_hour; buff[3] = alrm->time.tm_mday; buff[4] = alrm->time.tm_mon+1; buff[5] = alrm->time.tm_year; convert_decimal_to_bcd(buff, sizeof(buff)); err = tps6591x_write_regs(dev, RTC_ALARM, sizeof(buff), buff); if (err) dev_err(dev->parent, "\n unable to program alarm\n"); return err; }
static int ricoh583_rtc_set_time(struct device *dev, struct rtc_time *tm) { u8 buff[7]; int err; print_time(dev, tm); buff[0] = tm->tm_sec; buff[1] = tm->tm_min; buff[2] = tm->tm_hour; buff[3] = tm->tm_wday; buff[4] = tm->tm_mday; buff[5] = tm->tm_mon + 1; buff[6] = tm->tm_year - rtc_year_offset; convert_decimal_to_bcd(buff, sizeof(buff)); err = ricoh583_write_regs(dev, rtc_seconds_reg, sizeof(buff), buff); if (err < 0) { dev_err(dev->parent, "\n failed to program new time\n"); return err; } return 0; }
static int ricoh583_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) { struct ricoh583_rtc *rtc = dev_get_drvdata(dev); unsigned long seconds; u8 buff[5]; int err; struct rtc_time tm; if (rtc->irq == -1) return -EIO; rtc_tm_to_time(&alrm->time, &seconds); ricoh583_rtc_read_time(dev, &tm); rtc_tm_to_time(&tm, &rtc->epoch_start); /* work around: As YAL does not provide the seconds register, program minute register to next minute, in cases when alarm is requested within a minute from the current time. */ if (seconds - rtc->epoch_start < 60) alrm->time.tm_min += 1; dev_info(dev->parent, "\n setting alarm to requested time::\n"); print_time(dev->parent, &alrm->time); if (WARN_ON(alrm->enabled && (seconds < rtc->epoch_start))) { dev_err(dev->parent, "\n can't set alarm to requested time\n"); return -EINVAL; } if (alrm->enabled){ rtc->irq_en = true; buff[0] = alrm->time.tm_min; buff[1] = alrm->time.tm_hour; buff[2] = alrm->time.tm_mday; buff[3] = alrm->time.tm_mon + 1; buff[4] = alrm->time.tm_year - rtc_year_offset; convert_decimal_to_bcd(buff, sizeof(buff)); err = ricoh583_write_regs(dev, rtc_alarm_y, sizeof(buff), buff); if (err) { dev_err(dev->parent, "\n unable to set alarm\n"); return -EBUSY; } buff[0] = 0x20; /* to enable alarm_y */ }else{ rtc->irq_en = false; memset(buff, 0, sizeof(buff)); err = ricoh583_write_regs(dev, rtc_alarm_y, sizeof(buff), buff); if (err) { dev_err(dev->parent, "\n unable to set alarm\n"); return -EBUSY; } buff[0] = 0x00; /* to disable alarm_y */ } buff[1] = 0x20; /* to enable 24-hour format */ err = ricoh583_write_regs(dev, rtc_ctrl1, 2, buff); if (err) { dev_err(dev, "failed programming rtc ctrl regs\n"); return -EBUSY; } return err; }