Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #4
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;
}
Пример #6
0
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;
}
Пример #7
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;
}