Lines Matching +full:ctrl +full:- +full:module
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Driver for the Epson RTC module RX-8010 SJ
13 #include <linux/module.h>
76 rtc_lock(rx8010->rtc); in rx8010_irq_1_handler()
78 err = regmap_read(rx8010->regs, RX8010_FLAG, &flagreg); in rx8010_irq_1_handler()
80 rtc_unlock(rx8010->rtc); in rx8010_irq_1_handler()
85 dev_warn(&client->dev, "Frequency stop detected\n"); in rx8010_irq_1_handler()
89 rtc_update_irq(rx8010->rtc, 1, RTC_PF | RTC_IRQF); in rx8010_irq_1_handler()
94 rtc_update_irq(rx8010->rtc, 1, RTC_AF | RTC_IRQF); in rx8010_irq_1_handler()
99 rtc_update_irq(rx8010->rtc, 1, RTC_UF | RTC_IRQF); in rx8010_irq_1_handler()
102 err = regmap_write(rx8010->regs, RX8010_FLAG, flagreg); in rx8010_irq_1_handler()
103 rtc_unlock(rx8010->rtc); in rx8010_irq_1_handler()
110 u8 date[RX8010_YEAR - RX8010_SEC + 1]; in rx8010_get_time()
113 err = regmap_read(rx8010->regs, RX8010_FLAG, &flagreg); in rx8010_get_time()
119 return -EINVAL; in rx8010_get_time()
122 err = regmap_bulk_read(rx8010->regs, RX8010_SEC, date, sizeof(date)); in rx8010_get_time()
126 dt->tm_sec = bcd2bin(date[RX8010_SEC - RX8010_SEC] & 0x7f); in rx8010_get_time()
127 dt->tm_min = bcd2bin(date[RX8010_MIN - RX8010_SEC] & 0x7f); in rx8010_get_time()
128 dt->tm_hour = bcd2bin(date[RX8010_HOUR - RX8010_SEC] & 0x3f); in rx8010_get_time()
129 dt->tm_mday = bcd2bin(date[RX8010_MDAY - RX8010_SEC] & 0x3f); in rx8010_get_time()
130 dt->tm_mon = bcd2bin(date[RX8010_MONTH - RX8010_SEC] & 0x1f) - 1; in rx8010_get_time()
131 dt->tm_year = bcd2bin(date[RX8010_YEAR - RX8010_SEC]) + 100; in rx8010_get_time()
132 dt->tm_wday = ffs(date[RX8010_WDAY - RX8010_SEC] & 0x7f); in rx8010_get_time()
140 u8 date[RX8010_YEAR - RX8010_SEC + 1]; in rx8010_set_time()
144 err = regmap_set_bits(rx8010->regs, RX8010_CTRL, RX8010_CTRL_STOP); in rx8010_set_time()
148 date[RX8010_SEC - RX8010_SEC] = bin2bcd(dt->tm_sec); in rx8010_set_time()
149 date[RX8010_MIN - RX8010_SEC] = bin2bcd(dt->tm_min); in rx8010_set_time()
150 date[RX8010_HOUR - RX8010_SEC] = bin2bcd(dt->tm_hour); in rx8010_set_time()
151 date[RX8010_MDAY - RX8010_SEC] = bin2bcd(dt->tm_mday); in rx8010_set_time()
152 date[RX8010_MONTH - RX8010_SEC] = bin2bcd(dt->tm_mon + 1); in rx8010_set_time()
153 date[RX8010_YEAR - RX8010_SEC] = bin2bcd(dt->tm_year - 100); in rx8010_set_time()
154 date[RX8010_WDAY - RX8010_SEC] = bin2bcd(1 << dt->tm_wday); in rx8010_set_time()
156 err = regmap_bulk_write(rx8010->regs, RX8010_SEC, date, sizeof(date)); in rx8010_set_time()
161 err = regmap_clear_bits(rx8010->regs, RX8010_CTRL, RX8010_CTRL_STOP); in rx8010_set_time()
165 err = regmap_clear_bits(rx8010->regs, RX8010_FLAG, RX8010_FLAG_VLF); in rx8010_set_time()
175 u8 ctrl[2]; in rx8010_init() local
179 err = regmap_write(rx8010->regs, RX8010_RESV17, 0xD8); in rx8010_init()
183 err = regmap_write(rx8010->regs, RX8010_RESV30, 0x00); in rx8010_init()
187 err = regmap_write(rx8010->regs, RX8010_RESV31, 0x08); in rx8010_init()
191 err = regmap_write(rx8010->regs, RX8010_IRQ, 0x00); in rx8010_init()
195 err = regmap_bulk_read(rx8010->regs, RX8010_FLAG, ctrl, 2); in rx8010_init()
199 if (ctrl[0] & RX8010_FLAG_VLF) in rx8010_init()
202 if (ctrl[0] & RX8010_FLAG_AF) { in rx8010_init()
207 if (ctrl[0] & RX8010_FLAG_TF) in rx8010_init()
210 if (ctrl[0] & RX8010_FLAG_UF) in rx8010_init()
214 ctrl[0] &= ~(RX8010_FLAG_AF | RX8010_FLAG_TF | RX8010_FLAG_UF); in rx8010_init()
215 err = regmap_write(rx8010->regs, RX8010_FLAG, ctrl[0]); in rx8010_init()
220 rx8010->ctrlreg = (ctrl[1] & ~RX8010_CTRL_TEST); in rx8010_init()
231 err = regmap_bulk_read(rx8010->regs, RX8010_ALMIN, alarmvals, 3); in rx8010_read_alarm()
235 err = regmap_read(rx8010->regs, RX8010_FLAG, &flagreg); in rx8010_read_alarm()
239 t->time.tm_sec = 0; in rx8010_read_alarm()
240 t->time.tm_min = bcd2bin(alarmvals[0] & 0x7f); in rx8010_read_alarm()
241 t->time.tm_hour = bcd2bin(alarmvals[1] & 0x3f); in rx8010_read_alarm()
244 t->time.tm_mday = bcd2bin(alarmvals[2] & 0x7f); in rx8010_read_alarm()
246 t->enabled = !!(rx8010->ctrlreg & RX8010_CTRL_AIE); in rx8010_read_alarm()
247 t->pending = (flagreg & RX8010_FLAG_AF) && t->enabled; in rx8010_read_alarm()
258 if (rx8010->ctrlreg & (RX8010_CTRL_AIE | RX8010_CTRL_UIE)) { in rx8010_set_alarm()
259 rx8010->ctrlreg &= ~(RX8010_CTRL_AIE | RX8010_CTRL_UIE); in rx8010_set_alarm()
260 err = regmap_write(rx8010->regs, RX8010_CTRL, rx8010->ctrlreg); in rx8010_set_alarm()
265 err = regmap_clear_bits(rx8010->regs, RX8010_FLAG, RX8010_FLAG_AF); in rx8010_set_alarm()
269 alarmvals[0] = bin2bcd(t->time.tm_min); in rx8010_set_alarm()
270 alarmvals[1] = bin2bcd(t->time.tm_hour); in rx8010_set_alarm()
271 alarmvals[2] = bin2bcd(t->time.tm_mday); in rx8010_set_alarm()
273 err = regmap_bulk_write(rx8010->regs, RX8010_ALMIN, alarmvals, 2); in rx8010_set_alarm()
277 err = regmap_clear_bits(rx8010->regs, RX8010_EXT, RX8010_EXT_WADA); in rx8010_set_alarm()
284 err = regmap_write(rx8010->regs, RX8010_ALWDAY, alarmvals[2]); in rx8010_set_alarm()
288 if (t->enabled) { in rx8010_set_alarm()
289 if (rx8010->rtc->uie_rtctimer.enabled) in rx8010_set_alarm()
290 rx8010->ctrlreg |= RX8010_CTRL_UIE; in rx8010_set_alarm()
291 if (rx8010->rtc->aie_timer.enabled) in rx8010_set_alarm()
292 rx8010->ctrlreg |= in rx8010_set_alarm()
295 err = regmap_write(rx8010->regs, RX8010_CTRL, rx8010->ctrlreg); in rx8010_set_alarm()
308 u8 ctrl; in rx8010_alarm_irq_enable() local
310 ctrl = rx8010->ctrlreg; in rx8010_alarm_irq_enable()
313 if (rx8010->rtc->uie_rtctimer.enabled) in rx8010_alarm_irq_enable()
314 ctrl |= RX8010_CTRL_UIE; in rx8010_alarm_irq_enable()
315 if (rx8010->rtc->aie_timer.enabled) in rx8010_alarm_irq_enable()
316 ctrl |= (RX8010_CTRL_AIE | RX8010_CTRL_UIE); in rx8010_alarm_irq_enable()
318 if (!rx8010->rtc->uie_rtctimer.enabled) in rx8010_alarm_irq_enable()
319 ctrl &= ~RX8010_CTRL_UIE; in rx8010_alarm_irq_enable()
320 if (!rx8010->rtc->aie_timer.enabled) in rx8010_alarm_irq_enable()
321 ctrl &= ~RX8010_CTRL_AIE; in rx8010_alarm_irq_enable()
324 err = regmap_clear_bits(rx8010->regs, RX8010_FLAG, RX8010_FLAG_AF); in rx8010_alarm_irq_enable()
328 if (ctrl != rx8010->ctrlreg) { in rx8010_alarm_irq_enable()
329 rx8010->ctrlreg = ctrl; in rx8010_alarm_irq_enable()
330 err = regmap_write(rx8010->regs, RX8010_CTRL, rx8010->ctrlreg); in rx8010_alarm_irq_enable()
345 err = regmap_read(rx8010->regs, RX8010_FLAG, &flagreg); in rx8010_ioctl()
353 return -ENOIOCTLCMD; in rx8010_ioctl()
367 .name = "rx8010-rtc",
374 struct device *dev = &client->dev; in rx8010_probe()
380 return -ENOMEM; in rx8010_probe()
384 rx8010->regs = devm_regmap_init_i2c(client, &rx8010_regmap_config); in rx8010_probe()
385 if (IS_ERR(rx8010->regs)) in rx8010_probe()
386 return PTR_ERR(rx8010->regs); in rx8010_probe()
392 rx8010->rtc = devm_rtc_allocate_device(dev); in rx8010_probe()
393 if (IS_ERR(rx8010->rtc)) in rx8010_probe()
394 return PTR_ERR(rx8010->rtc); in rx8010_probe()
396 if (client->irq > 0) { in rx8010_probe()
399 if (dev_fwnode(&client->dev)) in rx8010_probe()
402 err = devm_request_threaded_irq(dev, client->irq, NULL, in rx8010_probe()
411 clear_bit(RTC_FEATURE_ALARM, rx8010->rtc->features); in rx8010_probe()
414 rx8010->rtc->ops = &rx8010_rtc_ops; in rx8010_probe()
415 rx8010->rtc->max_user_freq = 1; in rx8010_probe()
416 rx8010->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000; in rx8010_probe()
417 rx8010->rtc->range_max = RTC_TIMESTAMP_END_2099; in rx8010_probe()
419 return devm_rtc_register_device(rx8010->rtc); in rx8010_probe()
424 .name = "rtc-rx8010",