Lines Matching +full:da9063 +full:- +full:rtc
1 // SPDX-License-Identifier: GPL-2.0+
3 * Real time clock device driver for DA9063
4 * Copyright (C) 2013-2015 Dialog Semiconductor Ltd.
16 #include <linux/rtc.h>
20 #include <linux/mfd/da9063/registers.h>
21 #include <linux/mfd/da9063/core.h>
23 #define YEARS_TO_DA9063(year) ((year) - 100)
26 #define MONTHS_FROM_DA9063(month) ((month) - 1)
100 .rtc_alarm_len = RTC_DATA_LEN - 1,
161 { .compatible = "dlg,da9063-rtc", .data = &da9063_bb_regs },
162 { .compatible = "dlg,da9062-rtc", .data = &da9062_aa_regs },
168 struct da9063_compatible_rtc *rtc) in da9063_data_to_tm() argument
170 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_data_to_tm()
172 tm->tm_sec = data[RTC_SEC] & config->rtc_count_sec_mask; in da9063_data_to_tm()
173 tm->tm_min = data[RTC_MIN] & config->rtc_count_min_mask; in da9063_data_to_tm()
174 tm->tm_hour = data[RTC_HOUR] & config->rtc_count_hour_mask; in da9063_data_to_tm()
175 tm->tm_mday = data[RTC_DAY] & config->rtc_count_day_mask; in da9063_data_to_tm()
176 tm->tm_mon = MONTHS_FROM_DA9063(data[RTC_MONTH] & in da9063_data_to_tm()
177 config->rtc_count_month_mask); in da9063_data_to_tm()
178 tm->tm_year = YEARS_FROM_DA9063(data[RTC_YEAR] & in da9063_data_to_tm()
179 config->rtc_count_year_mask); in da9063_data_to_tm()
183 struct da9063_compatible_rtc *rtc) in da9063_tm_to_data() argument
185 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_tm_to_data()
187 data[RTC_SEC] = tm->tm_sec & config->rtc_count_sec_mask; in da9063_tm_to_data()
188 data[RTC_MIN] = tm->tm_min & config->rtc_count_min_mask; in da9063_tm_to_data()
189 data[RTC_HOUR] = tm->tm_hour & config->rtc_count_hour_mask; in da9063_tm_to_data()
190 data[RTC_DAY] = tm->tm_mday & config->rtc_count_day_mask; in da9063_tm_to_data()
191 data[RTC_MONTH] = MONTHS_TO_DA9063(tm->tm_mon) & in da9063_tm_to_data()
192 config->rtc_count_month_mask; in da9063_tm_to_data()
193 data[RTC_YEAR] = YEARS_TO_DA9063(tm->tm_year) & in da9063_tm_to_data()
194 config->rtc_count_year_mask; in da9063_tm_to_data()
199 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_stop_alarm() local
200 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_stop_alarm()
202 return regmap_update_bits(rtc->regmap, in da9063_rtc_stop_alarm()
203 config->rtc_alarm_year_reg, in da9063_rtc_stop_alarm()
204 config->rtc_alarm_on_mask, in da9063_rtc_stop_alarm()
210 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_start_alarm() local
211 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_start_alarm()
213 return regmap_update_bits(rtc->regmap, in da9063_rtc_start_alarm()
214 config->rtc_alarm_year_reg, in da9063_rtc_start_alarm()
215 config->rtc_alarm_on_mask, in da9063_rtc_start_alarm()
216 config->rtc_alarm_on_mask); in da9063_rtc_start_alarm()
221 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_read_time() local
222 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_read_time()
228 ret = regmap_bulk_read(rtc->regmap, in da9063_rtc_read_time()
229 config->rtc_count_secs_reg, in da9063_rtc_read_time()
232 dev_err(dev, "Failed to read RTC time data: %d\n", ret); in da9063_rtc_read_time()
236 if (!(data[RTC_SEC] & config->rtc_ready_to_read_mask)) { in da9063_rtc_read_time()
237 dev_dbg(dev, "RTC not yet ready to be read by the host\n"); in da9063_rtc_read_time()
238 return -EINVAL; in da9063_rtc_read_time()
241 da9063_data_to_tm(data, tm, rtc); in da9063_rtc_read_time()
244 al_secs = rtc_tm_to_time64(&rtc->alarm_time); in da9063_rtc_read_time()
246 /* handle the rtc synchronisation delay */ in da9063_rtc_read_time()
247 if (rtc->rtc_sync && al_secs - tm_secs == 1) in da9063_rtc_read_time()
248 memcpy(tm, &rtc->alarm_time, sizeof(struct rtc_time)); in da9063_rtc_read_time()
250 rtc->rtc_sync = false; in da9063_rtc_read_time()
257 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_set_time() local
258 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_set_time()
262 da9063_tm_to_data(tm, data, rtc); in da9063_rtc_set_time()
263 ret = regmap_bulk_write(rtc->regmap, in da9063_rtc_set_time()
264 config->rtc_count_secs_reg, in da9063_rtc_set_time()
267 dev_err(dev, "Failed to set RTC time data: %d\n", ret); in da9063_rtc_set_time()
274 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_read_alarm() local
275 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_read_alarm()
281 ret = regmap_bulk_read(rtc->regmap, in da9063_rtc_read_alarm()
282 config->rtc_alarm_secs_reg, in da9063_rtc_read_alarm()
283 &data[config->rtc_data_start], in da9063_rtc_read_alarm()
284 config->rtc_alarm_len); in da9063_rtc_read_alarm()
288 da9063_data_to_tm(data, &alrm->time, rtc); in da9063_rtc_read_alarm()
290 alrm->enabled = !!(data[RTC_YEAR] & config->rtc_alarm_on_mask); in da9063_rtc_read_alarm()
292 ret = regmap_read(rtc->regmap, in da9063_rtc_read_alarm()
293 config->rtc_event_reg, in da9063_rtc_read_alarm()
298 if (val & config->rtc_event_alarm_mask) in da9063_rtc_read_alarm()
299 alrm->pending = 1; in da9063_rtc_read_alarm()
301 alrm->pending = 0; in da9063_rtc_read_alarm()
308 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_set_alarm() local
309 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_set_alarm()
313 da9063_tm_to_data(&alrm->time, data, rtc); in da9063_rtc_set_alarm()
321 ret = regmap_bulk_write(rtc->regmap, in da9063_rtc_set_alarm()
322 config->rtc_alarm_secs_reg, in da9063_rtc_set_alarm()
323 &data[config->rtc_data_start], in da9063_rtc_set_alarm()
324 config->rtc_alarm_len); in da9063_rtc_set_alarm()
330 da9063_data_to_tm(data, &rtc->alarm_time, rtc); in da9063_rtc_set_alarm()
332 if (alrm->enabled) { in da9063_rtc_set_alarm()
354 struct da9063_compatible_rtc *rtc = data; in da9063_alarm_event() local
355 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_alarm_event()
357 regmap_update_bits(rtc->regmap, in da9063_alarm_event()
358 config->rtc_alarm_year_reg, in da9063_alarm_event()
359 config->rtc_alarm_on_mask, in da9063_alarm_event()
362 rtc->rtc_sync = true; in da9063_alarm_event()
363 rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF); in da9063_alarm_event()
378 struct da9063_compatible_rtc *rtc; in da9063_rtc_probe() local
385 if (!pdev->dev.of_node) in da9063_rtc_probe()
386 return -ENXIO; in da9063_rtc_probe()
389 pdev->dev.of_node); in da9063_rtc_probe()
391 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in da9063_rtc_probe()
392 if (!rtc) in da9063_rtc_probe()
393 return -ENOMEM; in da9063_rtc_probe()
395 rtc->config = match->data; in da9063_rtc_probe()
396 if (of_device_is_compatible(pdev->dev.of_node, "dlg,da9063-rtc")) { in da9063_rtc_probe()
397 struct da9063 *chip = dev_get_drvdata(pdev->dev.parent); in da9063_rtc_probe()
399 if (chip->variant_code == PMIC_DA9063_AD) in da9063_rtc_probe()
400 rtc->config = &da9063_ad_regs; in da9063_rtc_probe()
403 rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL); in da9063_rtc_probe()
404 if (!rtc->regmap) { in da9063_rtc_probe()
405 dev_warn(&pdev->dev, "Parent regmap unavailable.\n"); in da9063_rtc_probe()
406 return -ENXIO; in da9063_rtc_probe()
409 config = rtc->config; in da9063_rtc_probe()
410 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
411 config->rtc_enable_reg, in da9063_rtc_probe()
412 config->rtc_enable_mask, in da9063_rtc_probe()
413 config->rtc_enable_mask); in da9063_rtc_probe()
415 dev_err(&pdev->dev, "Failed to enable RTC\n"); in da9063_rtc_probe()
419 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
420 config->rtc_enable_32k_crystal_reg, in da9063_rtc_probe()
421 config->rtc_crystal_mask, in da9063_rtc_probe()
422 config->rtc_crystal_mask); in da9063_rtc_probe()
424 dev_err(&pdev->dev, "Failed to run 32kHz oscillator\n"); in da9063_rtc_probe()
428 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
429 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
430 config->rtc_alarm_status_mask, in da9063_rtc_probe()
433 dev_err(&pdev->dev, "Failed to access RTC alarm register\n"); in da9063_rtc_probe()
437 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
438 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
442 dev_err(&pdev->dev, "Failed to access RTC alarm register\n"); in da9063_rtc_probe()
446 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
447 config->rtc_alarm_year_reg, in da9063_rtc_probe()
448 config->rtc_tick_on_mask, in da9063_rtc_probe()
451 dev_err(&pdev->dev, "Failed to disable TICKs\n"); in da9063_rtc_probe()
456 ret = regmap_bulk_read(rtc->regmap, in da9063_rtc_probe()
457 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
458 &data[config->rtc_data_start], in da9063_rtc_probe()
459 config->rtc_alarm_len); in da9063_rtc_probe()
461 dev_err(&pdev->dev, "Failed to read initial alarm data: %d\n", in da9063_rtc_probe()
466 platform_set_drvdata(pdev, rtc); in da9063_rtc_probe()
468 rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); in da9063_rtc_probe()
469 if (IS_ERR(rtc->rtc_dev)) in da9063_rtc_probe()
470 return PTR_ERR(rtc->rtc_dev); in da9063_rtc_probe()
472 rtc->rtc_dev->ops = &da9063_rtc_ops; in da9063_rtc_probe()
473 rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_2000; in da9063_rtc_probe()
474 rtc->rtc_dev->range_max = RTC_TIMESTAMP_END_2063; in da9063_rtc_probe()
476 da9063_data_to_tm(data, &rtc->alarm_time, rtc); in da9063_rtc_probe()
477 rtc->rtc_sync = false; in da9063_rtc_probe()
479 if (config->rtc_data_start != RTC_SEC) { in da9063_rtc_probe()
480 set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->rtc_dev->features); in da9063_rtc_probe()
485 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->rtc_dev->features); in da9063_rtc_probe()
492 ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL, in da9063_rtc_probe()
495 "ALARM", rtc); in da9063_rtc_probe()
497 dev_err(&pdev->dev, "Failed to request ALARM IRQ %d: %d\n", in da9063_rtc_probe()
500 ret = dev_pm_set_wake_irq(&pdev->dev, irq_alarm); in da9063_rtc_probe()
502 dev_warn(&pdev->dev, in da9063_rtc_probe()
506 device_init_wakeup(&pdev->dev, true); in da9063_rtc_probe()
508 return devm_rtc_register_device(rtc->rtc_dev); in da9063_rtc_probe()
522 MODULE_DESCRIPTION("Real time clock device driver for Dialog DA9063");