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.
15 #include <linux/rtc.h>
19 #include <linux/mfd/da9063/registers.h>
20 #include <linux/mfd/da9063/core.h>
22 #define YEARS_TO_DA9063(year) ((year) - 100)
25 #define MONTHS_FROM_DA9063(month) ((month) - 1)
99 .rtc_alarm_len = RTC_DATA_LEN - 1,
160 { .compatible = "dlg,da9063-rtc", .data = &da9063_bb_regs },
161 { .compatible = "dlg,da9062-rtc", .data = &da9062_aa_regs },
167 struct da9063_compatible_rtc *rtc) in da9063_data_to_tm() argument
169 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_data_to_tm()
171 tm->tm_sec = data[RTC_SEC] & config->rtc_count_sec_mask; in da9063_data_to_tm()
172 tm->tm_min = data[RTC_MIN] & config->rtc_count_min_mask; in da9063_data_to_tm()
173 tm->tm_hour = data[RTC_HOUR] & config->rtc_count_hour_mask; in da9063_data_to_tm()
174 tm->tm_mday = data[RTC_DAY] & config->rtc_count_day_mask; in da9063_data_to_tm()
175 tm->tm_mon = MONTHS_FROM_DA9063(data[RTC_MONTH] & in da9063_data_to_tm()
176 config->rtc_count_month_mask); in da9063_data_to_tm()
177 tm->tm_year = YEARS_FROM_DA9063(data[RTC_YEAR] & in da9063_data_to_tm()
178 config->rtc_count_year_mask); in da9063_data_to_tm()
182 struct da9063_compatible_rtc *rtc) in da9063_tm_to_data() argument
184 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_tm_to_data()
186 data[RTC_SEC] = tm->tm_sec & config->rtc_count_sec_mask; in da9063_tm_to_data()
187 data[RTC_MIN] = tm->tm_min & config->rtc_count_min_mask; in da9063_tm_to_data()
188 data[RTC_HOUR] = tm->tm_hour & config->rtc_count_hour_mask; in da9063_tm_to_data()
189 data[RTC_DAY] = tm->tm_mday & config->rtc_count_day_mask; in da9063_tm_to_data()
190 data[RTC_MONTH] = MONTHS_TO_DA9063(tm->tm_mon) & in da9063_tm_to_data()
191 config->rtc_count_month_mask; in da9063_tm_to_data()
192 data[RTC_YEAR] = YEARS_TO_DA9063(tm->tm_year) & in da9063_tm_to_data()
193 config->rtc_count_year_mask; in da9063_tm_to_data()
198 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_stop_alarm() local
199 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_stop_alarm()
201 return regmap_update_bits(rtc->regmap, in da9063_rtc_stop_alarm()
202 config->rtc_alarm_year_reg, in da9063_rtc_stop_alarm()
203 config->rtc_alarm_on_mask, in da9063_rtc_stop_alarm()
209 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_start_alarm() local
210 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_start_alarm()
212 return regmap_update_bits(rtc->regmap, in da9063_rtc_start_alarm()
213 config->rtc_alarm_year_reg, in da9063_rtc_start_alarm()
214 config->rtc_alarm_on_mask, in da9063_rtc_start_alarm()
215 config->rtc_alarm_on_mask); in da9063_rtc_start_alarm()
220 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_read_time() local
221 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_read_time()
227 ret = regmap_bulk_read(rtc->regmap, in da9063_rtc_read_time()
228 config->rtc_count_secs_reg, in da9063_rtc_read_time()
231 dev_err(dev, "Failed to read RTC time data: %d\n", ret); in da9063_rtc_read_time()
235 if (!(data[RTC_SEC] & config->rtc_ready_to_read_mask)) { in da9063_rtc_read_time()
236 dev_dbg(dev, "RTC not yet ready to be read by the host\n"); in da9063_rtc_read_time()
237 return -EINVAL; in da9063_rtc_read_time()
240 da9063_data_to_tm(data, tm, rtc); in da9063_rtc_read_time()
243 al_secs = rtc_tm_to_time64(&rtc->alarm_time); in da9063_rtc_read_time()
245 /* handle the rtc synchronisation delay */ in da9063_rtc_read_time()
246 if (rtc->rtc_sync == true && al_secs - tm_secs == 1) in da9063_rtc_read_time()
247 memcpy(tm, &rtc->alarm_time, sizeof(struct rtc_time)); in da9063_rtc_read_time()
249 rtc->rtc_sync = false; in da9063_rtc_read_time()
256 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_set_time() local
257 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_set_time()
261 da9063_tm_to_data(tm, data, rtc); in da9063_rtc_set_time()
262 ret = regmap_bulk_write(rtc->regmap, in da9063_rtc_set_time()
263 config->rtc_count_secs_reg, in da9063_rtc_set_time()
266 dev_err(dev, "Failed to set RTC time data: %d\n", ret); in da9063_rtc_set_time()
273 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_read_alarm() local
274 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_read_alarm()
280 ret = regmap_bulk_read(rtc->regmap, in da9063_rtc_read_alarm()
281 config->rtc_alarm_secs_reg, in da9063_rtc_read_alarm()
282 &data[config->rtc_data_start], in da9063_rtc_read_alarm()
283 config->rtc_alarm_len); in da9063_rtc_read_alarm()
287 da9063_data_to_tm(data, &alrm->time, rtc); in da9063_rtc_read_alarm()
289 alrm->enabled = !!(data[RTC_YEAR] & config->rtc_alarm_on_mask); in da9063_rtc_read_alarm()
291 ret = regmap_read(rtc->regmap, in da9063_rtc_read_alarm()
292 config->rtc_event_reg, in da9063_rtc_read_alarm()
297 if (val & config->rtc_event_alarm_mask) in da9063_rtc_read_alarm()
298 alrm->pending = 1; in da9063_rtc_read_alarm()
300 alrm->pending = 0; in da9063_rtc_read_alarm()
307 struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev); in da9063_rtc_set_alarm() local
308 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_set_alarm()
312 da9063_tm_to_data(&alrm->time, data, rtc); in da9063_rtc_set_alarm()
320 ret = regmap_bulk_write(rtc->regmap, in da9063_rtc_set_alarm()
321 config->rtc_alarm_secs_reg, in da9063_rtc_set_alarm()
322 &data[config->rtc_data_start], in da9063_rtc_set_alarm()
323 config->rtc_alarm_len); in da9063_rtc_set_alarm()
329 da9063_data_to_tm(data, &rtc->alarm_time, rtc); in da9063_rtc_set_alarm()
331 if (alrm->enabled) { in da9063_rtc_set_alarm()
353 struct da9063_compatible_rtc *rtc = data; in da9063_alarm_event() local
354 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_alarm_event()
356 regmap_update_bits(rtc->regmap, in da9063_alarm_event()
357 config->rtc_alarm_year_reg, in da9063_alarm_event()
358 config->rtc_alarm_on_mask, in da9063_alarm_event()
361 rtc->rtc_sync = true; in da9063_alarm_event()
362 rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF); in da9063_alarm_event()
377 struct da9063_compatible_rtc *rtc; in da9063_rtc_probe() local
384 if (!pdev->dev.of_node) in da9063_rtc_probe()
385 return -ENXIO; in da9063_rtc_probe()
388 pdev->dev.of_node); in da9063_rtc_probe()
390 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in da9063_rtc_probe()
391 if (!rtc) in da9063_rtc_probe()
392 return -ENOMEM; in da9063_rtc_probe()
394 rtc->config = match->data; in da9063_rtc_probe()
395 if (of_device_is_compatible(pdev->dev.of_node, "dlg,da9063-rtc")) { in da9063_rtc_probe()
396 struct da9063 *chip = dev_get_drvdata(pdev->dev.parent); in da9063_rtc_probe()
398 if (chip->variant_code == PMIC_DA9063_AD) in da9063_rtc_probe()
399 rtc->config = &da9063_ad_regs; in da9063_rtc_probe()
402 rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL); in da9063_rtc_probe()
403 if (!rtc->regmap) { in da9063_rtc_probe()
404 dev_warn(&pdev->dev, "Parent regmap unavailable.\n"); in da9063_rtc_probe()
405 return -ENXIO; in da9063_rtc_probe()
408 config = rtc->config; in da9063_rtc_probe()
409 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
410 config->rtc_enable_reg, in da9063_rtc_probe()
411 config->rtc_enable_mask, in da9063_rtc_probe()
412 config->rtc_enable_mask); in da9063_rtc_probe()
414 dev_err(&pdev->dev, "Failed to enable RTC\n"); in da9063_rtc_probe()
418 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
419 config->rtc_enable_32k_crystal_reg, in da9063_rtc_probe()
420 config->rtc_crystal_mask, in da9063_rtc_probe()
421 config->rtc_crystal_mask); in da9063_rtc_probe()
423 dev_err(&pdev->dev, "Failed to run 32kHz oscillator\n"); in da9063_rtc_probe()
427 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
428 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
429 config->rtc_alarm_status_mask, in da9063_rtc_probe()
432 dev_err(&pdev->dev, "Failed to access RTC alarm register\n"); in da9063_rtc_probe()
436 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
437 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
441 dev_err(&pdev->dev, "Failed to access RTC alarm register\n"); in da9063_rtc_probe()
445 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
446 config->rtc_alarm_year_reg, in da9063_rtc_probe()
447 config->rtc_tick_on_mask, in da9063_rtc_probe()
450 dev_err(&pdev->dev, "Failed to disable TICKs\n"); in da9063_rtc_probe()
455 ret = regmap_bulk_read(rtc->regmap, in da9063_rtc_probe()
456 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
457 &data[config->rtc_data_start], in da9063_rtc_probe()
458 config->rtc_alarm_len); in da9063_rtc_probe()
460 dev_err(&pdev->dev, "Failed to read initial alarm data: %d\n", in da9063_rtc_probe()
465 platform_set_drvdata(pdev, rtc); in da9063_rtc_probe()
467 rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); in da9063_rtc_probe()
468 if (IS_ERR(rtc->rtc_dev)) in da9063_rtc_probe()
469 return PTR_ERR(rtc->rtc_dev); in da9063_rtc_probe()
471 rtc->rtc_dev->ops = &da9063_rtc_ops; in da9063_rtc_probe()
472 rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_2000; in da9063_rtc_probe()
473 rtc->rtc_dev->range_max = RTC_TIMESTAMP_END_2063; in da9063_rtc_probe()
475 da9063_data_to_tm(data, &rtc->alarm_time, rtc); in da9063_rtc_probe()
476 rtc->rtc_sync = false; in da9063_rtc_probe()
482 if (config->rtc_data_start != RTC_SEC) in da9063_rtc_probe()
483 rtc->rtc_dev->uie_unsupported = 1; in da9063_rtc_probe()
489 ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL, in da9063_rtc_probe()
492 "ALARM", rtc); in da9063_rtc_probe()
494 dev_err(&pdev->dev, "Failed to request ALARM IRQ %d: %d\n", in da9063_rtc_probe()
497 return rtc_register_device(rtc->rtc_dev); in da9063_rtc_probe()
511 MODULE_DESCRIPTION("Real time clock device driver for Dialog DA9063");