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)) + pdata->yy_offset; 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()
86 tm->tm_wday = bcd2bin(val & 0x07); in m48t59_rtc_read_time()
87 tm->tm_hour = bcd2bin(M48T59_READ(M48T59_HOUR) & 0x3F); in m48t59_rtc_read_time()
88 tm->tm_min = bcd2bin(M48T59_READ(M48T59_MIN) & 0x7F); in m48t59_rtc_read_time()
89 tm->tm_sec = bcd2bin(M48T59_READ(M48T59_SEC) & 0x7F); in m48t59_rtc_read_time()
93 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_read_time()
105 int year = tm->tm_year - pdata->yy_offset; in m48t59_rtc_set_time() local
107 dev_dbg(dev, "RTC set time %04d-%02d-%02d %02d/%02d/%02d\n", in m48t59_rtc_set_time()
108 year + 1900, tm->tm_mon, tm->tm_mday, in m48t59_rtc_set_time()
109 tm->tm_hour, tm->tm_min, tm->tm_sec); in m48t59_rtc_set_time()
111 if (year < 0) in m48t59_rtc_set_time()
112 return -EINVAL; in m48t59_rtc_set_time()
114 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_set_time()
118 M48T59_WRITE((bin2bcd(tm->tm_sec) & 0x7F), M48T59_SEC); in m48t59_rtc_set_time()
119 M48T59_WRITE((bin2bcd(tm->tm_min) & 0x7F), M48T59_MIN); in m48t59_rtc_set_time()
120 M48T59_WRITE((bin2bcd(tm->tm_hour) & 0x3F), M48T59_HOUR); in m48t59_rtc_set_time()
121 M48T59_WRITE((bin2bcd(tm->tm_mday) & 0x3F), M48T59_MDAY); in m48t59_rtc_set_time()
122 /* tm_mon is 0-11 */ in m48t59_rtc_set_time()
123 M48T59_WRITE((bin2bcd(tm->tm_mon + 1) & 0x1F), M48T59_MONTH); in m48t59_rtc_set_time()
124 M48T59_WRITE(bin2bcd(year % 100), M48T59_YEAR); in m48t59_rtc_set_time()
126 if (pdata->type == M48T59RTC_TYPE_M48T59 && (year >= 100)) in m48t59_rtc_set_time()
128 val |= (bin2bcd(tm->tm_wday) & 0x07); in m48t59_rtc_set_time()
133 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_set_time()
144 struct rtc_time *tm = &alrm->time; in m48t59_rtc_readalarm()
149 if (m48t59->irq == NO_IRQ) in m48t59_rtc_readalarm()
150 return -EIO; in m48t59_rtc_readalarm()
152 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_readalarm()
156 tm->tm_year = bcd2bin(M48T59_READ(M48T59_YEAR)) + pdata->yy_offset; in m48t59_rtc_readalarm()
157 /* tm_mon is 0-11 */ in m48t59_rtc_readalarm()
158 tm->tm_mon = bcd2bin(M48T59_READ(M48T59_MONTH)) - 1; in m48t59_rtc_readalarm()
162 tm->tm_year += 100; /* one century */ in m48t59_rtc_readalarm()
164 tm->tm_mday = bcd2bin(M48T59_READ(M48T59_ALARM_DATE)); in m48t59_rtc_readalarm()
165 tm->tm_hour = bcd2bin(M48T59_READ(M48T59_ALARM_HOUR)); in m48t59_rtc_readalarm()
166 tm->tm_min = bcd2bin(M48T59_READ(M48T59_ALARM_MIN)); in m48t59_rtc_readalarm()
167 tm->tm_sec = bcd2bin(M48T59_READ(M48T59_ALARM_SEC)); in m48t59_rtc_readalarm()
171 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_readalarm()
184 struct rtc_time *tm = &alrm->time; in m48t59_rtc_setalarm()
187 int year = tm->tm_year - pdata->yy_offset; in m48t59_rtc_setalarm() local
190 if (m48t59->irq == NO_IRQ) in m48t59_rtc_setalarm()
191 return -EIO; in m48t59_rtc_setalarm()
193 if (year < 0) in m48t59_rtc_setalarm()
194 return -EINVAL; in m48t59_rtc_setalarm()
199 mday = tm->tm_mday; in m48t59_rtc_setalarm()
204 hour = tm->tm_hour; in m48t59_rtc_setalarm()
207 min = tm->tm_min; in m48t59_rtc_setalarm()
210 sec = tm->tm_sec; in m48t59_rtc_setalarm()
213 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_setalarm()
224 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_setalarm()
226 dev_dbg(dev, "RTC set alarm time %04d-%02d-%02d %02d/%02d/%02d\n", in m48t59_rtc_setalarm()
227 year + 1900, tm->tm_mon, tm->tm_mday, in m48t59_rtc_setalarm()
228 tm->tm_hour, tm->tm_min, tm->tm_sec); in m48t59_rtc_setalarm()
233 * Handle commands from user-space
241 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_alarm_irq_enable()
246 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_alarm_irq_enable()
258 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_rtc_proc()
260 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_rtc_proc()
277 spin_lock(&m48t59->lock); in m48t59_rtc_interrupt()
279 spin_unlock(&m48t59->lock); in m48t59_rtc_interrupt()
282 rtc_update_irq(m48t59->rtc, 1, (RTC_AF | RTC_IRQF)); in m48t59_rtc_interrupt()
302 struct device *dev = &pdev->dev; in m48t59_nvram_read()
303 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_nvram_read()
309 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_nvram_read()
314 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_nvram_read()
323 struct device *dev = &pdev->dev; in m48t59_nvram_write()
324 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_nvram_write()
330 spin_lock_irqsave(&m48t59->lock, flags); in m48t59_nvram_write()
335 spin_unlock_irqrestore(&m48t59->lock, flags); in m48t59_nvram_write()
342 struct m48t59_plat_data *pdata = dev_get_platdata(&pdev->dev); in m48t59_rtc_probe()
345 int ret = -ENOMEM; in m48t59_rtc_probe()
347 .name = "m48t59-", in m48t59_rtc_probe()
355 /* This chip could be memory-mapped or I/O-mapped */ in m48t59_rtc_probe()
360 return -EINVAL; in m48t59_rtc_probe()
363 if (res->flags & IORESOURCE_IO) { in m48t59_rtc_probe()
364 /* If we are I/O-mapped, the platform should provide in m48t59_rtc_probe()
367 if (!pdata || !pdata->write_byte || !pdata->read_byte) in m48t59_rtc_probe()
368 return -EINVAL; in m48t59_rtc_probe()
369 } else if (res->flags & IORESOURCE_MEM) { in m48t59_rtc_probe()
370 /* we are memory-mapped */ in m48t59_rtc_probe()
372 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), in m48t59_rtc_probe()
375 return -ENOMEM; in m48t59_rtc_probe()
377 pdev->dev.platform_data = pdata; in m48t59_rtc_probe()
379 if (!pdata->type) in m48t59_rtc_probe()
380 pdata->type = M48T59RTC_TYPE_M48T59; in m48t59_rtc_probe()
383 if (!pdata->write_byte) in m48t59_rtc_probe()
384 pdata->write_byte = m48t59_mem_writeb; in m48t59_rtc_probe()
385 if (!pdata->read_byte) in m48t59_rtc_probe()
386 pdata->read_byte = m48t59_mem_readb; in m48t59_rtc_probe()
389 m48t59 = devm_kzalloc(&pdev->dev, sizeof(*m48t59), GFP_KERNEL); in m48t59_rtc_probe()
391 return -ENOMEM; in m48t59_rtc_probe()
393 m48t59->ioaddr = pdata->ioaddr; in m48t59_rtc_probe()
395 if (!m48t59->ioaddr) { in m48t59_rtc_probe()
397 m48t59->ioaddr = devm_ioremap(&pdev->dev, res->start, in m48t59_rtc_probe()
399 if (!m48t59->ioaddr) in m48t59_rtc_probe()
406 m48t59->irq = platform_get_irq_optional(pdev, 0); in m48t59_rtc_probe()
407 if (m48t59->irq <= 0) in m48t59_rtc_probe()
408 m48t59->irq = NO_IRQ; in m48t59_rtc_probe()
410 if (m48t59->irq != NO_IRQ) { in m48t59_rtc_probe()
411 ret = devm_request_irq(&pdev->dev, m48t59->irq, in m48t59_rtc_probe()
413 "rtc-m48t59", &pdev->dev); in m48t59_rtc_probe()
418 m48t59->rtc = devm_rtc_allocate_device(&pdev->dev); in m48t59_rtc_probe()
419 if (IS_ERR(m48t59->rtc)) in m48t59_rtc_probe()
420 return PTR_ERR(m48t59->rtc); in m48t59_rtc_probe()
422 switch (pdata->type) { in m48t59_rtc_probe()
424 pdata->offset = 0x1ff0; in m48t59_rtc_probe()
427 clear_bit(RTC_FEATURE_ALARM, m48t59->rtc->features); in m48t59_rtc_probe()
428 pdata->offset = 0x7f0; in m48t59_rtc_probe()
431 clear_bit(RTC_FEATURE_ALARM, m48t59->rtc->features); in m48t59_rtc_probe()
432 pdata->offset = 0x1ff0; in m48t59_rtc_probe()
435 dev_err(&pdev->dev, "Unknown RTC type\n"); in m48t59_rtc_probe()
436 return -ENODEV; in m48t59_rtc_probe()
439 spin_lock_init(&m48t59->lock); in m48t59_rtc_probe()
442 m48t59->rtc->ops = &m48t59_rtc_ops; in m48t59_rtc_probe()
443 m48t59->rtc->range_min = RTC_TIMESTAMP_BEGIN_1900; in m48t59_rtc_probe()
444 m48t59->rtc->range_max = RTC_TIMESTAMP_END_2099; in m48t59_rtc_probe()
446 nvmem_cfg.size = pdata->offset; in m48t59_rtc_probe()
447 ret = devm_rtc_nvmem_register(m48t59->rtc, &nvmem_cfg); in m48t59_rtc_probe()
451 ret = devm_rtc_register_device(m48t59->rtc); in m48t59_rtc_probe()
459 MODULE_ALIAS("platform:rtc-m48t59");
463 .name = "rtc-m48t59",