Lines Matching +full:start +full:- +full:year

1 // SPDX-License-Identifier: GPL-2.0-only
22 #define NO_IRQ (-1)
25 #define M48T59_READ(reg) (pdata->read_byte(dev, pdata->offset + reg))
27 (pdata->write_byte(dev, pdata->offset + reg, val))
42 * This is the generic access method when the chip is memory-mapped
49 writeb(val, m48t59->ioaddr+ofs); in m48t59_mem_writeb()
57 return readb(m48t59->ioaddr+ofs); in m48t59_mem_readb()
70 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_read_time()
74 tm->tm_year = bcd2bin(M48T59_READ(M48T59_YEAR)); in m48t59_rtc_read_time()
75 /* tm_mon is 0-11 */ in m48t59_rtc_read_time()
76 tm->tm_mon = bcd2bin(M48T59_READ(M48T59_MONTH)) - 1; in m48t59_rtc_read_time()
77 tm->tm_mday = bcd2bin(M48T59_READ(M48T59_MDAY)); in m48t59_rtc_read_time()
80 if ((pdata->type == M48T59RTC_TYPE_M48T59) && in m48t59_rtc_read_time()
83 tm->tm_year += 100; /* one century */ in m48t59_rtc_read_time()
87 tm->tm_year += 68; in m48t59_rtc_read_time()
90 tm->tm_wday = bcd2bin(val & 0x07); in m48t59_rtc_read_time()
91 tm->tm_hour = bcd2bin(M48T59_READ(M48T59_HOUR) & 0x3F); in m48t59_rtc_read_time()
92 tm->tm_min = bcd2bin(M48T59_READ(M48T59_MIN) & 0x7F); in m48t59_rtc_read_time()
93 tm->tm_sec = bcd2bin(M48T59_READ(M48T59_SEC) & 0x7F); in m48t59_rtc_read_time()
97 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_read_time()
109 int year = tm->tm_year; in m48t59_rtc_set_time() local
113 year -= 68; in m48t59_rtc_set_time()
116 dev_dbg(dev, "RTC set time %04d-%02d-%02d %02d/%02d/%02d\n", in m48t59_rtc_set_time()
117 year + 1900, tm->tm_mon, tm->tm_mday, in m48t59_rtc_set_time()
118 tm->tm_hour, tm->tm_min, tm->tm_sec); in m48t59_rtc_set_time()
120 if (year < 0) in m48t59_rtc_set_time()
121 return -EINVAL; in m48t59_rtc_set_time()
123 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_set_time()
127 M48T59_WRITE((bin2bcd(tm->tm_sec) & 0x7F), M48T59_SEC); in m48t59_rtc_set_time()
128 M48T59_WRITE((bin2bcd(tm->tm_min) & 0x7F), M48T59_MIN); in m48t59_rtc_set_time()
129 M48T59_WRITE((bin2bcd(tm->tm_hour) & 0x3F), M48T59_HOUR); in m48t59_rtc_set_time()
130 M48T59_WRITE((bin2bcd(tm->tm_mday) & 0x3F), M48T59_MDAY); in m48t59_rtc_set_time()
131 /* tm_mon is 0-11 */ in m48t59_rtc_set_time()
132 M48T59_WRITE((bin2bcd(tm->tm_mon + 1) & 0x1F), M48T59_MONTH); in m48t59_rtc_set_time()
133 M48T59_WRITE(bin2bcd(year % 100), M48T59_YEAR); in m48t59_rtc_set_time()
135 if (pdata->type == M48T59RTC_TYPE_M48T59 && (year / 100)) in m48t59_rtc_set_time()
137 val |= (bin2bcd(tm->tm_wday) & 0x07); in m48t59_rtc_set_time()
142 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_set_time()
153 struct rtc_time *tm = &alrm->time; in m48t59_rtc_readalarm()
158 if (m48t59->irq == NO_IRQ) in m48t59_rtc_readalarm()
159 return -EIO; in m48t59_rtc_readalarm()
161 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_readalarm()
165 tm->tm_year = bcd2bin(M48T59_READ(M48T59_YEAR)); in m48t59_rtc_readalarm()
168 tm->tm_year += 68; in m48t59_rtc_readalarm()
170 /* tm_mon is 0-11 */ in m48t59_rtc_readalarm()
171 tm->tm_mon = bcd2bin(M48T59_READ(M48T59_MONTH)) - 1; in m48t59_rtc_readalarm()
175 tm->tm_year += 100; /* one century */ in m48t59_rtc_readalarm()
177 tm->tm_mday = bcd2bin(M48T59_READ(M48T59_ALARM_DATE)); in m48t59_rtc_readalarm()
178 tm->tm_hour = bcd2bin(M48T59_READ(M48T59_ALARM_HOUR)); in m48t59_rtc_readalarm()
179 tm->tm_min = bcd2bin(M48T59_READ(M48T59_ALARM_MIN)); in m48t59_rtc_readalarm()
180 tm->tm_sec = bcd2bin(M48T59_READ(M48T59_ALARM_SEC)); in m48t59_rtc_readalarm()
184 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_readalarm()
197 struct rtc_time *tm = &alrm->time; in m48t59_rtc_setalarm()
200 int year = tm->tm_year; in m48t59_rtc_setalarm() local
204 year -= 68; in m48t59_rtc_setalarm()
208 if (m48t59->irq == NO_IRQ) in m48t59_rtc_setalarm()
209 return -EIO; in m48t59_rtc_setalarm()
211 if (year < 0) in m48t59_rtc_setalarm()
212 return -EINVAL; in m48t59_rtc_setalarm()
217 mday = tm->tm_mday; in m48t59_rtc_setalarm()
222 hour = tm->tm_hour; in m48t59_rtc_setalarm()
225 min = tm->tm_min; in m48t59_rtc_setalarm()
228 sec = tm->tm_sec; in m48t59_rtc_setalarm()
231 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_setalarm()
242 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_setalarm()
244 dev_dbg(dev, "RTC set alarm time %04d-%02d-%02d %02d/%02d/%02d\n", in m48t59_rtc_setalarm()
245 year + 1900, tm->tm_mon, tm->tm_mday, in m48t59_rtc_setalarm()
246 tm->tm_hour, tm->tm_min, tm->tm_sec); in m48t59_rtc_setalarm()
251 * Handle commands from user-space
259 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_alarm_irq_enable()
264 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_alarm_irq_enable()
276 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_proc()
278 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_proc()
295 spin_lock(&m48t59->lock); in m48t59_rtc_interrupt()
297 spin_unlock(&m48t59->lock); in m48t59_rtc_interrupt()
300 rtc_update_irq(m48t59->rtc, 1, (RTC_AF | RTC_IRQF)); in m48t59_rtc_interrupt()
325 struct device *dev = &pdev->dev; in m48t59_nvram_read()
326 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_nvram_read()
332 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_nvram_read()
337 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_nvram_read()
346 struct device *dev = &pdev->dev; in m48t59_nvram_write()
347 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_nvram_write()
353 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_nvram_write()
358 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_nvram_write()
365 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_rtc_probe()
368 int ret = -ENOMEM; in m48t59_rtc_probe()
371 .name = "m48t59-", in m48t59_rtc_probe()
379 /* This chip could be memory-mapped or I/O-mapped */ in m48t59_rtc_probe()
384 return -EINVAL; in m48t59_rtc_probe()
387 if (res->flags & IORESOURCE_IO) { in m48t59_rtc_probe()
388 /* If we are I/O-mapped, the platform should provide in m48t59_rtc_probe()
391 if (!pdata || !pdata->write_byte || !pdata->read_byte) in m48t59_rtc_probe()
392 return -EINVAL; in m48t59_rtc_probe()
393 } else if (res->flags & IORESOURCE_MEM) { in m48t59_rtc_probe()
394 /* we are memory-mapped */ in m48t59_rtc_probe()
396 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), in m48t59_rtc_probe()
399 return -ENOMEM; in m48t59_rtc_probe()
401 pdev->dev.platform_data = pdata; in m48t59_rtc_probe()
403 if (!pdata->type) in m48t59_rtc_probe()
404 pdata->type = M48T59RTC_TYPE_M48T59; in m48t59_rtc_probe()
407 if (!pdata->write_byte) in m48t59_rtc_probe()
408 pdata->write_byte = m48t59_mem_writeb; in m48t59_rtc_probe()
409 if (!pdata->read_byte) in m48t59_rtc_probe()
410 pdata->read_byte = m48t59_mem_readb; in m48t59_rtc_probe()
413 m48t59 = devm_kzalloc(&pdev->dev, sizeof(*m48t59), GFP_KERNEL); in m48t59_rtc_probe()
415 return -ENOMEM; in m48t59_rtc_probe()
417 m48t59->ioaddr = pdata->ioaddr; in m48t59_rtc_probe()
419 if (!m48t59->ioaddr) { in m48t59_rtc_probe()
421 m48t59->ioaddr = devm_ioremap(&pdev->dev, res->start, in m48t59_rtc_probe()
423 if (!m48t59->ioaddr) in m48t59_rtc_probe()
430 m48t59->irq = platform_get_irq(pdev, 0); in m48t59_rtc_probe()
431 if (m48t59->irq <= 0) in m48t59_rtc_probe()
432 m48t59->irq = NO_IRQ; in m48t59_rtc_probe()
434 if (m48t59->irq != NO_IRQ) { in m48t59_rtc_probe()
435 ret = devm_request_irq(&pdev->dev, m48t59->irq, in m48t59_rtc_probe()
437 "rtc-m48t59", &pdev->dev); in m48t59_rtc_probe()
441 switch (pdata->type) { in m48t59_rtc_probe()
444 pdata->offset = 0x1ff0; in m48t59_rtc_probe()
448 pdata->offset = 0x7f0; in m48t59_rtc_probe()
452 pdata->offset = 0x1ff0; in m48t59_rtc_probe()
455 dev_err(&pdev->dev, "Unknown RTC type\n"); in m48t59_rtc_probe()
456 return -ENODEV; in m48t59_rtc_probe()
459 spin_lock_init(&m48t59->lock); in m48t59_rtc_probe()
462 m48t59->rtc = devm_rtc_allocate_device(&pdev->dev); in m48t59_rtc_probe()
463 if (IS_ERR(m48t59->rtc)) in m48t59_rtc_probe()
464 return PTR_ERR(m48t59->rtc); in m48t59_rtc_probe()
466 m48t59->rtc->nvram_old_abi = true; in m48t59_rtc_probe()
467 m48t59->rtc->ops = ops; in m48t59_rtc_probe()
469 nvmem_cfg.size = pdata->offset; in m48t59_rtc_probe()
470 ret = rtc_nvmem_register(m48t59->rtc, &nvmem_cfg); in m48t59_rtc_probe()
474 ret = rtc_register_device(m48t59->rtc); in m48t59_rtc_probe()
482 MODULE_ALIAS("platform:rtc-m48t59");
486 .name = "rtc-m48t59",