Lines Matching +full:static +full:- +full:config
1 // SPDX-License-Identifier: GPL-2.0+
4 * Copyright (C) 2013-2015 Dialog Semiconductor Ltd.
23 #define YEARS_TO_DA9063(year) ((year) - 100)
26 #define MONTHS_FROM_DA9063(month) ((month) - 1)
61 /* ALARM CONFIG */
70 const struct da9063_compatible_rtc_regmap *config; member
74 static const struct da9063_compatible_rtc_regmap da9063_ad_regs = {
98 /* ALARM CONFIG */
100 .rtc_alarm_len = RTC_DATA_LEN - 1,
103 static const struct da9063_compatible_rtc_regmap da9063_bb_regs = {
127 /* ALARM CONFIG */
132 static const struct da9063_compatible_rtc_regmap da9062_aa_regs = {
155 /* ALARM CONFIG */
160 static const struct of_device_id da9063_compatible_reg_id_table[] = {
161 { .compatible = "dlg,da9063-rtc", .data = &da9063_bb_regs },
162 { .compatible = "dlg,da9062-rtc", .data = &da9062_aa_regs },
167 static void da9063_data_to_tm(u8 *data, struct rtc_time *tm, in da9063_data_to_tm()
170 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_data_to_tm() local
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()
182 static void da9063_tm_to_data(struct rtc_time *tm, u8 *data, in da9063_tm_to_data()
185 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_tm_to_data() local
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()
197 static int da9063_rtc_stop_alarm(struct device *dev) in da9063_rtc_stop_alarm()
200 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_stop_alarm() local
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()
208 static int da9063_rtc_start_alarm(struct device *dev) in da9063_rtc_start_alarm()
211 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_start_alarm() local
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()
219 static int da9063_rtc_read_time(struct device *dev, struct rtc_time *tm) in da9063_rtc_read_time()
222 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_read_time() local
228 ret = regmap_bulk_read(rtc->regmap, in da9063_rtc_read_time()
229 config->rtc_count_secs_reg, in da9063_rtc_read_time()
236 if (!(data[RTC_SEC] & config->rtc_ready_to_read_mask)) { in da9063_rtc_read_time()
238 return -EINVAL; in da9063_rtc_read_time()
244 al_secs = rtc_tm_to_time64(&rtc->alarm_time); 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()
255 static int da9063_rtc_set_time(struct device *dev, struct rtc_time *tm) in da9063_rtc_set_time()
258 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_set_time() local
263 ret = regmap_bulk_write(rtc->regmap, in da9063_rtc_set_time()
264 config->rtc_count_secs_reg, in da9063_rtc_set_time()
272 static int da9063_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm) in da9063_rtc_read_alarm()
275 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_read_alarm() local
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()
306 static int da9063_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm) in da9063_rtc_set_alarm()
309 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_rtc_set_alarm() local
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()
343 static int da9063_rtc_alarm_irq_enable(struct device *dev, in da9063_rtc_alarm_irq_enable()
352 static irqreturn_t da9063_alarm_event(int irq, void *data) in da9063_alarm_event()
355 const struct da9063_compatible_rtc_regmap *config = rtc->config; in da9063_alarm_event() local
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()
368 static const struct rtc_class_ops da9063_rtc_ops = {
376 static int da9063_rtc_probe(struct platform_device *pdev) in da9063_rtc_probe()
379 const struct da9063_compatible_rtc_regmap *config; in da9063_rtc_probe() local
384 if (!pdev->dev.of_node) in da9063_rtc_probe()
385 return -ENXIO; in da9063_rtc_probe()
387 rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); in da9063_rtc_probe()
389 return -ENOMEM; in da9063_rtc_probe()
391 rtc->config = device_get_match_data(&pdev->dev); in da9063_rtc_probe()
392 if (of_device_is_compatible(pdev->dev.of_node, "dlg,da9063-rtc")) { in da9063_rtc_probe()
393 struct da9063 *chip = dev_get_drvdata(pdev->dev.parent); in da9063_rtc_probe()
395 if (chip->variant_code == PMIC_DA9063_AD) in da9063_rtc_probe()
396 rtc->config = &da9063_ad_regs; in da9063_rtc_probe()
399 rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL); in da9063_rtc_probe()
400 if (!rtc->regmap) { in da9063_rtc_probe()
401 dev_warn(&pdev->dev, "Parent regmap unavailable.\n"); in da9063_rtc_probe()
402 return -ENXIO; in da9063_rtc_probe()
405 config = rtc->config; in da9063_rtc_probe()
406 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
407 config->rtc_enable_reg, in da9063_rtc_probe()
408 config->rtc_enable_mask, in da9063_rtc_probe()
409 config->rtc_enable_mask); in da9063_rtc_probe()
411 return dev_err_probe(&pdev->dev, ret, "Failed to enable RTC\n"); in da9063_rtc_probe()
413 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
414 config->rtc_enable_32k_crystal_reg, in da9063_rtc_probe()
415 config->rtc_crystal_mask, in da9063_rtc_probe()
416 config->rtc_crystal_mask); in da9063_rtc_probe()
418 return dev_err_probe(&pdev->dev, ret, in da9063_rtc_probe()
421 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
422 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
423 config->rtc_alarm_status_mask, in da9063_rtc_probe()
426 return dev_err_probe(&pdev->dev, ret, in da9063_rtc_probe()
429 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
430 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
434 return dev_err_probe(&pdev->dev, ret, in da9063_rtc_probe()
437 ret = regmap_update_bits(rtc->regmap, in da9063_rtc_probe()
438 config->rtc_alarm_year_reg, in da9063_rtc_probe()
439 config->rtc_tick_on_mask, in da9063_rtc_probe()
442 return dev_err_probe(&pdev->dev, ret, in da9063_rtc_probe()
446 ret = regmap_bulk_read(rtc->regmap, in da9063_rtc_probe()
447 config->rtc_alarm_secs_reg, in da9063_rtc_probe()
448 &data[config->rtc_data_start], in da9063_rtc_probe()
449 config->rtc_alarm_len); in da9063_rtc_probe()
451 return dev_err_probe(&pdev->dev, ret, in da9063_rtc_probe()
456 rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev); in da9063_rtc_probe()
457 if (IS_ERR(rtc->rtc_dev)) in da9063_rtc_probe()
458 return PTR_ERR(rtc->rtc_dev); in da9063_rtc_probe()
460 rtc->rtc_dev->ops = &da9063_rtc_ops; in da9063_rtc_probe()
461 rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_2000; in da9063_rtc_probe()
462 rtc->rtc_dev->range_max = RTC_TIMESTAMP_END_2063; in da9063_rtc_probe()
464 da9063_data_to_tm(data, &rtc->alarm_time, rtc); in da9063_rtc_probe()
465 rtc->rtc_sync = false; in da9063_rtc_probe()
467 if (config->rtc_data_start != RTC_SEC) { in da9063_rtc_probe()
468 set_bit(RTC_FEATURE_ALARM_RES_MINUTE, rtc->rtc_dev->features); in da9063_rtc_probe()
473 clear_bit(RTC_FEATURE_UPDATE_INTERRUPT, rtc->rtc_dev->features); in da9063_rtc_probe()
478 ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL, in da9063_rtc_probe()
483 dev_err(&pdev->dev, in da9063_rtc_probe()
487 ret = dev_pm_set_wake_irq(&pdev->dev, irq_alarm); in da9063_rtc_probe()
489 dev_warn(&pdev->dev, in da9063_rtc_probe()
493 device_init_wakeup(&pdev->dev, true); in da9063_rtc_probe()
494 } else if (irq_alarm != -ENXIO) { in da9063_rtc_probe()
497 clear_bit(RTC_FEATURE_ALARM, rtc->rtc_dev->features); in da9063_rtc_probe()
500 return devm_rtc_register_device(rtc->rtc_dev); in da9063_rtc_probe()
503 static struct platform_driver da9063_rtc_driver = {