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()
320 struct device *dev = &pdev->dev; in m48t59_nvram_read()
321 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_nvram_read()
327 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_nvram_read()
332 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_nvram_read()
341 struct device *dev = &pdev->dev; in m48t59_nvram_write()
342 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_nvram_write()
348 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_nvram_write()
353 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_nvram_write()
360 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_rtc_probe()
363 int ret = -ENOMEM; in m48t59_rtc_probe()
365 .name = "m48t59-", in m48t59_rtc_probe()
373 /* This chip could be memory-mapped or I/O-mapped */ in m48t59_rtc_probe()
378 return -EINVAL; in m48t59_rtc_probe()
381 if (res->flags & IORESOURCE_IO) { in m48t59_rtc_probe()
382 /* If we are I/O-mapped, the platform should provide in m48t59_rtc_probe()
385 if (!pdata || !pdata->write_byte || !pdata->read_byte) in m48t59_rtc_probe()
386 return -EINVAL; in m48t59_rtc_probe()
387 } else if (res->flags & IORESOURCE_MEM) { in m48t59_rtc_probe()
388 /* we are memory-mapped */ in m48t59_rtc_probe()
390 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), in m48t59_rtc_probe()
393 return -ENOMEM; in m48t59_rtc_probe()
395 pdev->dev.platform_data = pdata; in m48t59_rtc_probe()
397 if (!pdata->type) in m48t59_rtc_probe()
398 pdata->type = M48T59RTC_TYPE_M48T59; in m48t59_rtc_probe()
401 if (!pdata->write_byte) in m48t59_rtc_probe()
402 pdata->write_byte = m48t59_mem_writeb; in m48t59_rtc_probe()
403 if (!pdata->read_byte) in m48t59_rtc_probe()
404 pdata->read_byte = m48t59_mem_readb; in m48t59_rtc_probe()
407 m48t59 = devm_kzalloc(&pdev->dev, sizeof(*m48t59), GFP_KERNEL); in m48t59_rtc_probe()
409 return -ENOMEM; in m48t59_rtc_probe()
411 m48t59->ioaddr = pdata->ioaddr; in m48t59_rtc_probe()
413 if (!m48t59->ioaddr) { in m48t59_rtc_probe()
415 m48t59->ioaddr = devm_ioremap(&pdev->dev, res->start, in m48t59_rtc_probe()
417 if (!m48t59->ioaddr) in m48t59_rtc_probe()
424 m48t59->irq = platform_get_irq_optional(pdev, 0); in m48t59_rtc_probe()
425 if (m48t59->irq <= 0) in m48t59_rtc_probe()
426 m48t59->irq = NO_IRQ; in m48t59_rtc_probe()
428 if (m48t59->irq != NO_IRQ) { in m48t59_rtc_probe()
429 ret = devm_request_irq(&pdev->dev, m48t59->irq, in m48t59_rtc_probe()
431 "rtc-m48t59", &pdev->dev); in m48t59_rtc_probe()
436 m48t59->rtc = devm_rtc_allocate_device(&pdev->dev); in m48t59_rtc_probe()
437 if (IS_ERR(m48t59->rtc)) in m48t59_rtc_probe()
438 return PTR_ERR(m48t59->rtc); in m48t59_rtc_probe()
440 switch (pdata->type) { in m48t59_rtc_probe()
442 pdata->offset = 0x1ff0; in m48t59_rtc_probe()
445 clear_bit(RTC_FEATURE_ALARM, m48t59->rtc->features); in m48t59_rtc_probe()
446 pdata->offset = 0x7f0; in m48t59_rtc_probe()
449 clear_bit(RTC_FEATURE_ALARM, m48t59->rtc->features); in m48t59_rtc_probe()
450 pdata->offset = 0x1ff0; in m48t59_rtc_probe()
453 dev_err(&pdev->dev, "Unknown RTC type\n"); in m48t59_rtc_probe()
454 return -ENODEV; in m48t59_rtc_probe()
457 spin_lock_init(&m48t59->lock); in m48t59_rtc_probe()
460 m48t59->rtc->ops = &m48t59_rtc_ops; in m48t59_rtc_probe()
462 nvmem_cfg.size = pdata->offset; in m48t59_rtc_probe()
463 ret = devm_rtc_nvmem_register(m48t59->rtc, &nvmem_cfg); in m48t59_rtc_probe()
467 ret = devm_rtc_register_device(m48t59->rtc); in m48t59_rtc_probe()
475 MODULE_ALIAS("platform:rtc-m48t59");
479 .name = "rtc-m48t59",