Lines Matching +full:reset +full:- +full:time +full:- +full:sec
1 // SPDX-License-Identifier: GPL-2.0-only
8 * Real time clock driver for the Dallas 1511 chip, which also
149 * set wdog enable and wdog 'steering' bit to issue a reset in ds1511_wdog_set()
170 * set the rtc chip's idea of the time.
172 * and some call with year = year - 1900. thanks.
176 u8 mon, day, dow, hrs, min, sec, yrs, cen; in ds1511_rtc_set_time() local
182 if (rtc_tm->tm_year < 1900) in ds1511_rtc_set_time()
183 rtc_tm->tm_year += 1900; in ds1511_rtc_set_time()
185 if (rtc_tm->tm_year < 1970) in ds1511_rtc_set_time()
186 return -EINVAL; in ds1511_rtc_set_time()
188 yrs = rtc_tm->tm_year % 100; in ds1511_rtc_set_time()
189 cen = rtc_tm->tm_year / 100; in ds1511_rtc_set_time()
190 mon = rtc_tm->tm_mon + 1; /* tm_mon starts at zero */ in ds1511_rtc_set_time()
191 day = rtc_tm->tm_mday; in ds1511_rtc_set_time()
192 dow = rtc_tm->tm_wday & 0x7; /* automatic BCD */ in ds1511_rtc_set_time()
193 hrs = rtc_tm->tm_hour; in ds1511_rtc_set_time()
194 min = rtc_tm->tm_min; in ds1511_rtc_set_time()
195 sec = rtc_tm->tm_sec; in ds1511_rtc_set_time()
198 return -EINVAL; in ds1511_rtc_set_time()
200 if (day > rtc_month_days(rtc_tm->tm_mon, rtc_tm->tm_year)) in ds1511_rtc_set_time()
201 return -EINVAL; in ds1511_rtc_set_time()
203 if ((hrs >= 24) || (min >= 60) || (sec >= 60)) in ds1511_rtc_set_time()
204 return -EINVAL; in ds1511_rtc_set_time()
209 sec = bin2bcd(sec) & 0x7f; in ds1511_rtc_set_time()
225 rtc_write(sec, RTC_SEC); in ds1511_rtc_set_time()
241 rtc_tm->tm_sec = rtc_read(RTC_SEC) & 0x7f; in ds1511_rtc_read_time()
242 rtc_tm->tm_min = rtc_read(RTC_MIN) & 0x7f; in ds1511_rtc_read_time()
243 rtc_tm->tm_hour = rtc_read(RTC_HOUR) & 0x3f; in ds1511_rtc_read_time()
244 rtc_tm->tm_mday = rtc_read(RTC_DOM) & 0x3f; in ds1511_rtc_read_time()
245 rtc_tm->tm_wday = rtc_read(RTC_DOW) & 0x7; in ds1511_rtc_read_time()
246 rtc_tm->tm_mon = rtc_read(RTC_MON) & 0x1f; in ds1511_rtc_read_time()
247 rtc_tm->tm_year = rtc_read(RTC_YEAR) & 0x7f; in ds1511_rtc_read_time()
253 rtc_tm->tm_sec = bcd2bin(rtc_tm->tm_sec); in ds1511_rtc_read_time()
254 rtc_tm->tm_min = bcd2bin(rtc_tm->tm_min); in ds1511_rtc_read_time()
255 rtc_tm->tm_hour = bcd2bin(rtc_tm->tm_hour); in ds1511_rtc_read_time()
256 rtc_tm->tm_mday = bcd2bin(rtc_tm->tm_mday); in ds1511_rtc_read_time()
257 rtc_tm->tm_wday = bcd2bin(rtc_tm->tm_wday); in ds1511_rtc_read_time()
258 rtc_tm->tm_mon = bcd2bin(rtc_tm->tm_mon); in ds1511_rtc_read_time()
259 rtc_tm->tm_year = bcd2bin(rtc_tm->tm_year); in ds1511_rtc_read_time()
266 century += rtc_tm->tm_year; in ds1511_rtc_read_time()
267 rtc_tm->tm_year = century - 1900; in ds1511_rtc_read_time()
269 rtc_tm->tm_mon--; in ds1511_rtc_read_time()
287 spin_lock_irqsave(&pdata->lock, flags); in ds1511_rtc_update_alarm()
288 rtc_write(pdata->alrm_mday < 0 || (pdata->irqen & RTC_UF) ? in ds1511_rtc_update_alarm()
289 0x80 : bin2bcd(pdata->alrm_mday) & 0x3f, in ds1511_rtc_update_alarm()
291 rtc_write(pdata->alrm_hour < 0 || (pdata->irqen & RTC_UF) ? in ds1511_rtc_update_alarm()
292 0x80 : bin2bcd(pdata->alrm_hour) & 0x3f, in ds1511_rtc_update_alarm()
294 rtc_write(pdata->alrm_min < 0 || (pdata->irqen & RTC_UF) ? in ds1511_rtc_update_alarm()
295 0x80 : bin2bcd(pdata->alrm_min) & 0x7f, in ds1511_rtc_update_alarm()
297 rtc_write(pdata->alrm_sec < 0 || (pdata->irqen & RTC_UF) ? in ds1511_rtc_update_alarm()
298 0x80 : bin2bcd(pdata->alrm_sec) & 0x7f, in ds1511_rtc_update_alarm()
300 rtc_write(rtc_read(RTC_CMD) | (pdata->irqen ? RTC_TIE : 0), RTC_CMD); in ds1511_rtc_update_alarm()
302 spin_unlock_irqrestore(&pdata->lock, flags); in ds1511_rtc_update_alarm()
310 if (pdata->irq <= 0) in ds1511_rtc_set_alarm()
311 return -EINVAL; in ds1511_rtc_set_alarm()
313 pdata->alrm_mday = alrm->time.tm_mday; in ds1511_rtc_set_alarm()
314 pdata->alrm_hour = alrm->time.tm_hour; in ds1511_rtc_set_alarm()
315 pdata->alrm_min = alrm->time.tm_min; in ds1511_rtc_set_alarm()
316 pdata->alrm_sec = alrm->time.tm_sec; in ds1511_rtc_set_alarm()
317 if (alrm->enabled) in ds1511_rtc_set_alarm()
318 pdata->irqen |= RTC_AF; in ds1511_rtc_set_alarm()
329 if (pdata->irq <= 0) in ds1511_rtc_read_alarm()
330 return -EINVAL; in ds1511_rtc_read_alarm()
332 alrm->time.tm_mday = pdata->alrm_mday < 0 ? 0 : pdata->alrm_mday; in ds1511_rtc_read_alarm()
333 alrm->time.tm_hour = pdata->alrm_hour < 0 ? 0 : pdata->alrm_hour; in ds1511_rtc_read_alarm()
334 alrm->time.tm_min = pdata->alrm_min < 0 ? 0 : pdata->alrm_min; in ds1511_rtc_read_alarm()
335 alrm->time.tm_sec = pdata->alrm_sec < 0 ? 0 : pdata->alrm_sec; in ds1511_rtc_read_alarm()
336 alrm->enabled = (pdata->irqen & RTC_AF) ? 1 : 0; in ds1511_rtc_read_alarm()
347 spin_lock(&pdata->lock); in ds1511_interrupt()
357 rtc_update_irq(pdata->rtc, 1, events); in ds1511_interrupt()
359 spin_unlock(&pdata->lock); in ds1511_interrupt()
367 if (pdata->irq <= 0) in ds1511_rtc_alarm_irq_enable()
368 return -EINVAL; in ds1511_rtc_alarm_irq_enable()
370 pdata->irqen |= RTC_AF; in ds1511_rtc_alarm_irq_enable()
372 pdata->irqen &= ~RTC_AF; in ds1511_rtc_alarm_irq_enable()
420 .priv = &pdev->dev, in ds1511_rtc_probe()
423 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); in ds1511_rtc_probe()
425 return -ENOMEM; in ds1511_rtc_probe()
430 pdata->ioaddr = ds1511_base; in ds1511_rtc_probe()
431 pdata->irq = platform_get_irq(pdev, 0); in ds1511_rtc_probe()
449 * check for a dying bat-tree in ds1511_rtc_probe()
452 dev_warn(&pdev->dev, "voltage-low detected.\n"); in ds1511_rtc_probe()
454 spin_lock_init(&pdata->lock); in ds1511_rtc_probe()
457 pdata->rtc = devm_rtc_allocate_device(&pdev->dev); in ds1511_rtc_probe()
458 if (IS_ERR(pdata->rtc)) in ds1511_rtc_probe()
459 return PTR_ERR(pdata->rtc); in ds1511_rtc_probe()
461 pdata->rtc->ops = &ds1511_rtc_ops; in ds1511_rtc_probe()
463 ret = devm_rtc_register_device(pdata->rtc); in ds1511_rtc_probe()
467 devm_rtc_nvmem_register(pdata->rtc, &ds1511_nvmem_cfg); in ds1511_rtc_probe()
473 if (pdata->irq > 0) { in ds1511_rtc_probe()
475 if (devm_request_irq(&pdev->dev, pdata->irq, ds1511_interrupt, in ds1511_rtc_probe()
476 IRQF_SHARED, pdev->name, pdev) < 0) { in ds1511_rtc_probe()
478 dev_warn(&pdev->dev, "interrupt not available.\n"); in ds1511_rtc_probe()
479 pdata->irq = 0; in ds1511_rtc_probe()