Linux Audio

Check our new training course

Loading...
v5.9
  1// SPDX-License-Identifier: GPL-2.0+
  2/*
  3 * Real time clock device driver for DA9063
  4 * Copyright (C) 2013-2015  Dialog Semiconductor Ltd.
  5 */
  6
  7#include <linux/delay.h>
  8#include <linux/init.h>
  9#include <linux/interrupt.h>
 10#include <linux/kernel.h>
 11#include <linux/module.h>
 12#include <linux/of.h>
 13#include <linux/platform_device.h>
 14#include <linux/regmap.h>
 15#include <linux/rtc.h>
 16#include <linux/slab.h>
 17
 18#include <linux/mfd/da9062/registers.h>
 19#include <linux/mfd/da9063/registers.h>
 20#include <linux/mfd/da9063/core.h>
 21
 22#define YEARS_TO_DA9063(year)		((year) - 100)
 23#define MONTHS_TO_DA9063(month)		((month) + 1)
 24#define YEARS_FROM_DA9063(year)		((year) + 100)
 25#define MONTHS_FROM_DA9063(month)	((month) - 1)
 26
 27enum {
 28	RTC_SEC	= 0,
 29	RTC_MIN	= 1,
 30	RTC_HOUR = 2,
 31	RTC_DAY	= 3,
 32	RTC_MONTH = 4,
 33	RTC_YEAR = 5,
 34	RTC_DATA_LEN
 35};
 36
 37struct da9063_compatible_rtc_regmap {
 38	/* REGS */
 39	int rtc_enable_reg;
 40	int rtc_enable_32k_crystal_reg;
 41	int rtc_alarm_secs_reg;
 42	int rtc_alarm_year_reg;
 43	int rtc_count_secs_reg;
 44	int rtc_count_year_reg;
 45	int rtc_event_reg;
 46	/* MASKS */
 47	int rtc_enable_mask;
 48	int rtc_crystal_mask;
 49	int rtc_event_alarm_mask;
 50	int rtc_alarm_on_mask;
 51	int rtc_alarm_status_mask;
 52	int rtc_tick_on_mask;
 53	int rtc_ready_to_read_mask;
 54	int rtc_count_sec_mask;
 55	int rtc_count_min_mask;
 56	int rtc_count_hour_mask;
 57	int rtc_count_day_mask;
 58	int rtc_count_month_mask;
 59	int rtc_count_year_mask;
 60	/* ALARM CONFIG */
 61	int rtc_data_start;
 62	int rtc_alarm_len;
 63};
 64
 65struct da9063_compatible_rtc {
 66	struct rtc_device *rtc_dev;
 67	struct rtc_time alarm_time;
 68	struct regmap *regmap;
 69	const struct da9063_compatible_rtc_regmap *config;
 70	bool rtc_sync;
 71};
 72
 73static const struct da9063_compatible_rtc_regmap da9063_ad_regs = {
 74	/* REGS */
 75	.rtc_enable_reg             = DA9063_REG_CONTROL_E,
 76	.rtc_alarm_secs_reg         = DA9063_AD_REG_ALARM_MI,
 77	.rtc_alarm_year_reg         = DA9063_AD_REG_ALARM_Y,
 78	.rtc_count_secs_reg         = DA9063_REG_COUNT_S,
 79	.rtc_count_year_reg         = DA9063_REG_COUNT_Y,
 80	.rtc_event_reg              = DA9063_REG_EVENT_A,
 81	/* MASKS */
 82	.rtc_enable_mask            = DA9063_RTC_EN,
 83	.rtc_crystal_mask           = DA9063_CRYSTAL,
 84	.rtc_enable_32k_crystal_reg = DA9063_REG_EN_32K,
 85	.rtc_event_alarm_mask       = DA9063_E_ALARM,
 86	.rtc_alarm_on_mask          = DA9063_ALARM_ON,
 87	.rtc_alarm_status_mask      = DA9063_ALARM_STATUS_ALARM |
 88				      DA9063_ALARM_STATUS_TICK,
 89	.rtc_tick_on_mask           = DA9063_TICK_ON,
 90	.rtc_ready_to_read_mask     = DA9063_RTC_READ,
 91	.rtc_count_sec_mask         = DA9063_COUNT_SEC_MASK,
 92	.rtc_count_min_mask         = DA9063_COUNT_MIN_MASK,
 93	.rtc_count_hour_mask        = DA9063_COUNT_HOUR_MASK,
 94	.rtc_count_day_mask         = DA9063_COUNT_DAY_MASK,
 95	.rtc_count_month_mask       = DA9063_COUNT_MONTH_MASK,
 96	.rtc_count_year_mask        = DA9063_COUNT_YEAR_MASK,
 97	/* ALARM CONFIG */
 98	.rtc_data_start             = RTC_MIN,
 99	.rtc_alarm_len              = RTC_DATA_LEN - 1,
100};
101
102static const struct da9063_compatible_rtc_regmap da9063_bb_regs = {
103	/* REGS */
104	.rtc_enable_reg             = DA9063_REG_CONTROL_E,
105	.rtc_alarm_secs_reg         = DA9063_BB_REG_ALARM_S,
106	.rtc_alarm_year_reg         = DA9063_BB_REG_ALARM_Y,
107	.rtc_count_secs_reg         = DA9063_REG_COUNT_S,
108	.rtc_count_year_reg         = DA9063_REG_COUNT_Y,
109	.rtc_event_reg              = DA9063_REG_EVENT_A,
110	/* MASKS */
111	.rtc_enable_mask            = DA9063_RTC_EN,
112	.rtc_crystal_mask           = DA9063_CRYSTAL,
113	.rtc_enable_32k_crystal_reg = DA9063_REG_EN_32K,
114	.rtc_event_alarm_mask       = DA9063_E_ALARM,
115	.rtc_alarm_on_mask          = DA9063_ALARM_ON,
116	.rtc_alarm_status_mask      = DA9063_ALARM_STATUS_ALARM |
117				      DA9063_ALARM_STATUS_TICK,
118	.rtc_tick_on_mask           = DA9063_TICK_ON,
119	.rtc_ready_to_read_mask     = DA9063_RTC_READ,
120	.rtc_count_sec_mask         = DA9063_COUNT_SEC_MASK,
121	.rtc_count_min_mask         = DA9063_COUNT_MIN_MASK,
122	.rtc_count_hour_mask        = DA9063_COUNT_HOUR_MASK,
123	.rtc_count_day_mask         = DA9063_COUNT_DAY_MASK,
124	.rtc_count_month_mask       = DA9063_COUNT_MONTH_MASK,
125	.rtc_count_year_mask        = DA9063_COUNT_YEAR_MASK,
126	/* ALARM CONFIG */
127	.rtc_data_start             = RTC_SEC,
128	.rtc_alarm_len              = RTC_DATA_LEN,
129};
130
131static const struct da9063_compatible_rtc_regmap da9062_aa_regs = {
132	/* REGS */
133	.rtc_enable_reg             = DA9062AA_CONTROL_E,
134	.rtc_alarm_secs_reg         = DA9062AA_ALARM_S,
135	.rtc_alarm_year_reg         = DA9062AA_ALARM_Y,
136	.rtc_count_secs_reg         = DA9062AA_COUNT_S,
137	.rtc_count_year_reg         = DA9062AA_COUNT_Y,
138	.rtc_event_reg              = DA9062AA_EVENT_A,
139	/* MASKS */
140	.rtc_enable_mask            = DA9062AA_RTC_EN_MASK,
141	.rtc_crystal_mask           = DA9062AA_CRYSTAL_MASK,
142	.rtc_enable_32k_crystal_reg = DA9062AA_EN_32K,
143	.rtc_event_alarm_mask       = DA9062AA_M_ALARM_MASK,
144	.rtc_alarm_on_mask          = DA9062AA_ALARM_ON_MASK,
145	.rtc_alarm_status_mask      = (0x02 << 6),
146	.rtc_tick_on_mask           = DA9062AA_TICK_ON_MASK,
147	.rtc_ready_to_read_mask     = DA9062AA_RTC_READ_MASK,
148	.rtc_count_sec_mask         = DA9062AA_COUNT_SEC_MASK,
149	.rtc_count_min_mask         = DA9062AA_COUNT_MIN_MASK,
150	.rtc_count_hour_mask        = DA9062AA_COUNT_HOUR_MASK,
151	.rtc_count_day_mask         = DA9062AA_COUNT_DAY_MASK,
152	.rtc_count_month_mask       = DA9062AA_COUNT_MONTH_MASK,
153	.rtc_count_year_mask        = DA9062AA_COUNT_YEAR_MASK,
154	/* ALARM CONFIG */
155	.rtc_data_start             = RTC_SEC,
156	.rtc_alarm_len              = RTC_DATA_LEN,
157};
158
159static const struct of_device_id da9063_compatible_reg_id_table[] = {
160	{ .compatible = "dlg,da9063-rtc", .data = &da9063_bb_regs },
161	{ .compatible = "dlg,da9062-rtc", .data = &da9062_aa_regs },
162	{ },
163};
164MODULE_DEVICE_TABLE(of, da9063_compatible_reg_id_table);
165
166static void da9063_data_to_tm(u8 *data, struct rtc_time *tm,
167			      struct da9063_compatible_rtc *rtc)
168{
169	const struct da9063_compatible_rtc_regmap *config = rtc->config;
170
171	tm->tm_sec  = data[RTC_SEC]  & config->rtc_count_sec_mask;
172	tm->tm_min  = data[RTC_MIN]  & config->rtc_count_min_mask;
173	tm->tm_hour = data[RTC_HOUR] & config->rtc_count_hour_mask;
174	tm->tm_mday = data[RTC_DAY]  & config->rtc_count_day_mask;
175	tm->tm_mon  = MONTHS_FROM_DA9063(data[RTC_MONTH] &
176					 config->rtc_count_month_mask);
177	tm->tm_year = YEARS_FROM_DA9063(data[RTC_YEAR] &
178					config->rtc_count_year_mask);
179}
180
181static void da9063_tm_to_data(struct rtc_time *tm, u8 *data,
182			      struct da9063_compatible_rtc *rtc)
183{
184	const struct da9063_compatible_rtc_regmap *config = rtc->config;
185
186	data[RTC_SEC]   = tm->tm_sec & config->rtc_count_sec_mask;
187	data[RTC_MIN]   = tm->tm_min & config->rtc_count_min_mask;
188	data[RTC_HOUR]  = tm->tm_hour & config->rtc_count_hour_mask;
189	data[RTC_DAY]   = tm->tm_mday & config->rtc_count_day_mask;
190	data[RTC_MONTH] = MONTHS_TO_DA9063(tm->tm_mon) &
191				config->rtc_count_month_mask;
192	data[RTC_YEAR]  = YEARS_TO_DA9063(tm->tm_year) &
193				config->rtc_count_year_mask;
194}
195
196static int da9063_rtc_stop_alarm(struct device *dev)
197{
198	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
199	const struct da9063_compatible_rtc_regmap *config = rtc->config;
200
201	return regmap_update_bits(rtc->regmap,
202				  config->rtc_alarm_year_reg,
203				  config->rtc_alarm_on_mask,
204				  0);
205}
206
207static int da9063_rtc_start_alarm(struct device *dev)
208{
209	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
210	const struct da9063_compatible_rtc_regmap *config = rtc->config;
211
212	return regmap_update_bits(rtc->regmap,
213				  config->rtc_alarm_year_reg,
214				  config->rtc_alarm_on_mask,
215				  config->rtc_alarm_on_mask);
216}
217
218static int da9063_rtc_read_time(struct device *dev, struct rtc_time *tm)
219{
220	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
221	const struct da9063_compatible_rtc_regmap *config = rtc->config;
222	unsigned long tm_secs;
223	unsigned long al_secs;
224	u8 data[RTC_DATA_LEN];
225	int ret;
226
227	ret = regmap_bulk_read(rtc->regmap,
228			       config->rtc_count_secs_reg,
229			       data, RTC_DATA_LEN);
230	if (ret < 0) {
231		dev_err(dev, "Failed to read RTC time data: %d\n", ret);
232		return ret;
233	}
234
235	if (!(data[RTC_SEC] & config->rtc_ready_to_read_mask)) {
236		dev_dbg(dev, "RTC not yet ready to be read by the host\n");
237		return -EINVAL;
238	}
239
240	da9063_data_to_tm(data, tm, rtc);
241
242	tm_secs = rtc_tm_to_time64(tm);
243	al_secs = rtc_tm_to_time64(&rtc->alarm_time);
244
245	/* handle the rtc synchronisation delay */
246	if (rtc->rtc_sync == true && al_secs - tm_secs == 1)
247		memcpy(tm, &rtc->alarm_time, sizeof(struct rtc_time));
248	else
249		rtc->rtc_sync = false;
250
251	return 0;
252}
253
254static int da9063_rtc_set_time(struct device *dev, struct rtc_time *tm)
255{
256	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
257	const struct da9063_compatible_rtc_regmap *config = rtc->config;
258	u8 data[RTC_DATA_LEN];
259	int ret;
260
261	da9063_tm_to_data(tm, data, rtc);
262	ret = regmap_bulk_write(rtc->regmap,
263				config->rtc_count_secs_reg,
264				data, RTC_DATA_LEN);
265	if (ret < 0)
266		dev_err(dev, "Failed to set RTC time data: %d\n", ret);
267
268	return ret;
269}
270
271static int da9063_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
272{
273	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
274	const struct da9063_compatible_rtc_regmap *config = rtc->config;
275	u8 data[RTC_DATA_LEN];
276	int ret;
277	unsigned int val;
278
279	data[RTC_SEC] = 0;
280	ret = regmap_bulk_read(rtc->regmap,
281			       config->rtc_alarm_secs_reg,
282			       &data[config->rtc_data_start],
283			       config->rtc_alarm_len);
284	if (ret < 0)
285		return ret;
286
287	da9063_data_to_tm(data, &alrm->time, rtc);
288
289	alrm->enabled = !!(data[RTC_YEAR] & config->rtc_alarm_on_mask);
290
291	ret = regmap_read(rtc->regmap,
292			  config->rtc_event_reg,
293			  &val);
294	if (ret < 0)
295		return ret;
296
297	if (val & config->rtc_event_alarm_mask)
298		alrm->pending = 1;
299	else
300		alrm->pending = 0;
301
302	return 0;
303}
304
305static int da9063_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
306{
307	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
308	const struct da9063_compatible_rtc_regmap *config = rtc->config;
309	u8 data[RTC_DATA_LEN];
310	int ret;
311
312	da9063_tm_to_data(&alrm->time, data, rtc);
313
314	ret = da9063_rtc_stop_alarm(dev);
315	if (ret < 0) {
316		dev_err(dev, "Failed to stop alarm: %d\n", ret);
317		return ret;
318	}
319
320	ret = regmap_bulk_write(rtc->regmap,
321				config->rtc_alarm_secs_reg,
322				&data[config->rtc_data_start],
323				config->rtc_alarm_len);
324	if (ret < 0) {
325		dev_err(dev, "Failed to write alarm: %d\n", ret);
326		return ret;
327	}
328
329	da9063_data_to_tm(data, &rtc->alarm_time, rtc);
330
331	if (alrm->enabled) {
332		ret = da9063_rtc_start_alarm(dev);
333		if (ret < 0) {
334			dev_err(dev, "Failed to start alarm: %d\n", ret);
335			return ret;
336		}
337	}
338
339	return ret;
340}
341
342static int da9063_rtc_alarm_irq_enable(struct device *dev,
343				       unsigned int enabled)
344{
345	if (enabled)
346		return da9063_rtc_start_alarm(dev);
347	else
348		return da9063_rtc_stop_alarm(dev);
349}
350
351static irqreturn_t da9063_alarm_event(int irq, void *data)
352{
353	struct da9063_compatible_rtc *rtc = data;
354	const struct da9063_compatible_rtc_regmap *config = rtc->config;
355
356	regmap_update_bits(rtc->regmap,
357			   config->rtc_alarm_year_reg,
358			   config->rtc_alarm_on_mask,
359			   0);
360
361	rtc->rtc_sync = true;
362	rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF);
363
364	return IRQ_HANDLED;
365}
366
367static const struct rtc_class_ops da9063_rtc_ops = {
368	.read_time = da9063_rtc_read_time,
369	.set_time = da9063_rtc_set_time,
370	.read_alarm = da9063_rtc_read_alarm,
371	.set_alarm = da9063_rtc_set_alarm,
372	.alarm_irq_enable = da9063_rtc_alarm_irq_enable,
373};
374
375static int da9063_rtc_probe(struct platform_device *pdev)
376{
377	struct da9063_compatible_rtc *rtc;
378	const struct da9063_compatible_rtc_regmap *config;
379	const struct of_device_id *match;
380	int irq_alarm;
381	u8 data[RTC_DATA_LEN];
382	int ret;
383
384	if (!pdev->dev.of_node)
385		return -ENXIO;
386
387	match = of_match_node(da9063_compatible_reg_id_table,
388			      pdev->dev.of_node);
389
390	rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
391	if (!rtc)
392		return -ENOMEM;
393
394	rtc->config = match->data;
395	if (of_device_is_compatible(pdev->dev.of_node, "dlg,da9063-rtc")) {
396		struct da9063 *chip = dev_get_drvdata(pdev->dev.parent);
397
398		if (chip->variant_code == PMIC_DA9063_AD)
399			rtc->config = &da9063_ad_regs;
400	}
401
402	rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL);
403	if (!rtc->regmap) {
404		dev_warn(&pdev->dev, "Parent regmap unavailable.\n");
405		return -ENXIO;
406	}
407
408	config = rtc->config;
409	ret = regmap_update_bits(rtc->regmap,
410				 config->rtc_enable_reg,
411				 config->rtc_enable_mask,
412				 config->rtc_enable_mask);
413	if (ret < 0) {
414		dev_err(&pdev->dev, "Failed to enable RTC\n");
415		return ret;
416	}
417
418	ret = regmap_update_bits(rtc->regmap,
419				 config->rtc_enable_32k_crystal_reg,
420				 config->rtc_crystal_mask,
421				 config->rtc_crystal_mask);
422	if (ret < 0) {
423		dev_err(&pdev->dev, "Failed to run 32kHz oscillator\n");
424		return ret;
425	}
426
427	ret = regmap_update_bits(rtc->regmap,
428				 config->rtc_alarm_secs_reg,
429				 config->rtc_alarm_status_mask,
430				 0);
431	if (ret < 0) {
432		dev_err(&pdev->dev, "Failed to access RTC alarm register\n");
433		return ret;
434	}
435
436	ret = regmap_update_bits(rtc->regmap,
437				 config->rtc_alarm_secs_reg,
438				 DA9063_ALARM_STATUS_ALARM,
439				 DA9063_ALARM_STATUS_ALARM);
440	if (ret < 0) {
441		dev_err(&pdev->dev, "Failed to access RTC alarm register\n");
442		return ret;
443	}
444
445	ret = regmap_update_bits(rtc->regmap,
446				 config->rtc_alarm_year_reg,
447				 config->rtc_tick_on_mask,
448				 0);
449	if (ret < 0) {
450		dev_err(&pdev->dev, "Failed to disable TICKs\n");
451		return ret;
452	}
453
454	data[RTC_SEC] = 0;
455	ret = regmap_bulk_read(rtc->regmap,
456			       config->rtc_alarm_secs_reg,
457			       &data[config->rtc_data_start],
458			       config->rtc_alarm_len);
459	if (ret < 0) {
460		dev_err(&pdev->dev, "Failed to read initial alarm data: %d\n",
461			ret);
462		return ret;
463	}
464
465	platform_set_drvdata(pdev, rtc);
466
467	rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev);
468	if (IS_ERR(rtc->rtc_dev))
469		return PTR_ERR(rtc->rtc_dev);
470
471	rtc->rtc_dev->ops = &da9063_rtc_ops;
472	rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_2000;
473	rtc->rtc_dev->range_max = RTC_TIMESTAMP_END_2063;
474
475	da9063_data_to_tm(data, &rtc->alarm_time, rtc);
476	rtc->rtc_sync = false;
477
478	/*
479	 * TODO: some models have alarms on a minute boundary but still support
480	 * real hardware interrupts. Add this once the core supports it.
481	 */
482	if (config->rtc_data_start != RTC_SEC)
483		rtc->rtc_dev->uie_unsupported = 1;
484
485	irq_alarm = platform_get_irq_byname(pdev, "ALARM");
486	if (irq_alarm < 0)
487		return irq_alarm;
488
489	ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL,
490					da9063_alarm_event,
491					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
492					"ALARM", rtc);
493	if (ret)
494		dev_err(&pdev->dev, "Failed to request ALARM IRQ %d: %d\n",
495			irq_alarm, ret);
496
497	return rtc_register_device(rtc->rtc_dev);
498}
499
500static struct platform_driver da9063_rtc_driver = {
501	.probe		= da9063_rtc_probe,
502	.driver		= {
503		.name	= DA9063_DRVNAME_RTC,
504		.of_match_table = da9063_compatible_reg_id_table,
505	},
506};
507
508module_platform_driver(da9063_rtc_driver);
509
510MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
511MODULE_DESCRIPTION("Real time clock device driver for Dialog DA9063");
512MODULE_LICENSE("GPL");
513MODULE_ALIAS("platform:" DA9063_DRVNAME_RTC);
v5.4
  1// SPDX-License-Identifier: GPL-2.0+
  2/*
  3 * Real time clock device driver for DA9063
  4 * Copyright (C) 2013-2015  Dialog Semiconductor Ltd.
  5 */
  6
  7#include <linux/delay.h>
  8#include <linux/init.h>
  9#include <linux/interrupt.h>
 10#include <linux/kernel.h>
 11#include <linux/module.h>
 12#include <linux/of.h>
 13#include <linux/platform_device.h>
 14#include <linux/regmap.h>
 15#include <linux/rtc.h>
 16#include <linux/slab.h>
 17
 18#include <linux/mfd/da9062/registers.h>
 19#include <linux/mfd/da9063/registers.h>
 20#include <linux/mfd/da9063/core.h>
 21
 22#define YEARS_TO_DA9063(year)		((year) - 100)
 23#define MONTHS_TO_DA9063(month)		((month) + 1)
 24#define YEARS_FROM_DA9063(year)		((year) + 100)
 25#define MONTHS_FROM_DA9063(month)	((month) - 1)
 26
 27enum {
 28	RTC_SEC	= 0,
 29	RTC_MIN	= 1,
 30	RTC_HOUR = 2,
 31	RTC_DAY	= 3,
 32	RTC_MONTH = 4,
 33	RTC_YEAR = 5,
 34	RTC_DATA_LEN
 35};
 36
 37struct da9063_compatible_rtc_regmap {
 38	/* REGS */
 39	int rtc_enable_reg;
 40	int rtc_enable_32k_crystal_reg;
 41	int rtc_alarm_secs_reg;
 42	int rtc_alarm_year_reg;
 43	int rtc_count_secs_reg;
 44	int rtc_count_year_reg;
 45	int rtc_event_reg;
 46	/* MASKS */
 47	int rtc_enable_mask;
 48	int rtc_crystal_mask;
 49	int rtc_event_alarm_mask;
 50	int rtc_alarm_on_mask;
 51	int rtc_alarm_status_mask;
 52	int rtc_tick_on_mask;
 53	int rtc_ready_to_read_mask;
 54	int rtc_count_sec_mask;
 55	int rtc_count_min_mask;
 56	int rtc_count_hour_mask;
 57	int rtc_count_day_mask;
 58	int rtc_count_month_mask;
 59	int rtc_count_year_mask;
 60	/* ALARM CONFIG */
 61	int rtc_data_start;
 62	int rtc_alarm_len;
 63};
 64
 65struct da9063_compatible_rtc {
 66	struct rtc_device *rtc_dev;
 67	struct rtc_time alarm_time;
 68	struct regmap *regmap;
 69	const struct da9063_compatible_rtc_regmap *config;
 70	bool rtc_sync;
 71};
 72
 73static const struct da9063_compatible_rtc_regmap da9063_ad_regs = {
 74	/* REGS */
 75	.rtc_enable_reg             = DA9063_REG_CONTROL_E,
 76	.rtc_alarm_secs_reg         = DA9063_AD_REG_ALARM_MI,
 77	.rtc_alarm_year_reg         = DA9063_AD_REG_ALARM_Y,
 78	.rtc_count_secs_reg         = DA9063_REG_COUNT_S,
 79	.rtc_count_year_reg         = DA9063_REG_COUNT_Y,
 80	.rtc_event_reg              = DA9063_REG_EVENT_A,
 81	/* MASKS */
 82	.rtc_enable_mask            = DA9063_RTC_EN,
 83	.rtc_crystal_mask           = DA9063_CRYSTAL,
 84	.rtc_enable_32k_crystal_reg = DA9063_REG_EN_32K,
 85	.rtc_event_alarm_mask       = DA9063_E_ALARM,
 86	.rtc_alarm_on_mask          = DA9063_ALARM_ON,
 87	.rtc_alarm_status_mask      = DA9063_ALARM_STATUS_ALARM |
 88				      DA9063_ALARM_STATUS_TICK,
 89	.rtc_tick_on_mask           = DA9063_TICK_ON,
 90	.rtc_ready_to_read_mask     = DA9063_RTC_READ,
 91	.rtc_count_sec_mask         = DA9063_COUNT_SEC_MASK,
 92	.rtc_count_min_mask         = DA9063_COUNT_MIN_MASK,
 93	.rtc_count_hour_mask        = DA9063_COUNT_HOUR_MASK,
 94	.rtc_count_day_mask         = DA9063_COUNT_DAY_MASK,
 95	.rtc_count_month_mask       = DA9063_COUNT_MONTH_MASK,
 96	.rtc_count_year_mask        = DA9063_COUNT_YEAR_MASK,
 97	/* ALARM CONFIG */
 98	.rtc_data_start             = RTC_MIN,
 99	.rtc_alarm_len              = RTC_DATA_LEN - 1,
100};
101
102static const struct da9063_compatible_rtc_regmap da9063_bb_regs = {
103	/* REGS */
104	.rtc_enable_reg             = DA9063_REG_CONTROL_E,
105	.rtc_alarm_secs_reg         = DA9063_BB_REG_ALARM_S,
106	.rtc_alarm_year_reg         = DA9063_BB_REG_ALARM_Y,
107	.rtc_count_secs_reg         = DA9063_REG_COUNT_S,
108	.rtc_count_year_reg         = DA9063_REG_COUNT_Y,
109	.rtc_event_reg              = DA9063_REG_EVENT_A,
110	/* MASKS */
111	.rtc_enable_mask            = DA9063_RTC_EN,
112	.rtc_crystal_mask           = DA9063_CRYSTAL,
113	.rtc_enable_32k_crystal_reg = DA9063_REG_EN_32K,
114	.rtc_event_alarm_mask       = DA9063_E_ALARM,
115	.rtc_alarm_on_mask          = DA9063_ALARM_ON,
116	.rtc_alarm_status_mask      = DA9063_ALARM_STATUS_ALARM |
117				      DA9063_ALARM_STATUS_TICK,
118	.rtc_tick_on_mask           = DA9063_TICK_ON,
119	.rtc_ready_to_read_mask     = DA9063_RTC_READ,
120	.rtc_count_sec_mask         = DA9063_COUNT_SEC_MASK,
121	.rtc_count_min_mask         = DA9063_COUNT_MIN_MASK,
122	.rtc_count_hour_mask        = DA9063_COUNT_HOUR_MASK,
123	.rtc_count_day_mask         = DA9063_COUNT_DAY_MASK,
124	.rtc_count_month_mask       = DA9063_COUNT_MONTH_MASK,
125	.rtc_count_year_mask        = DA9063_COUNT_YEAR_MASK,
126	/* ALARM CONFIG */
127	.rtc_data_start             = RTC_SEC,
128	.rtc_alarm_len              = RTC_DATA_LEN,
129};
130
131static const struct da9063_compatible_rtc_regmap da9062_aa_regs = {
132	/* REGS */
133	.rtc_enable_reg             = DA9062AA_CONTROL_E,
134	.rtc_alarm_secs_reg         = DA9062AA_ALARM_S,
135	.rtc_alarm_year_reg         = DA9062AA_ALARM_Y,
136	.rtc_count_secs_reg         = DA9062AA_COUNT_S,
137	.rtc_count_year_reg         = DA9062AA_COUNT_Y,
138	.rtc_event_reg              = DA9062AA_EVENT_A,
139	/* MASKS */
140	.rtc_enable_mask            = DA9062AA_RTC_EN_MASK,
141	.rtc_crystal_mask           = DA9062AA_CRYSTAL_MASK,
142	.rtc_enable_32k_crystal_reg = DA9062AA_EN_32K,
143	.rtc_event_alarm_mask       = DA9062AA_M_ALARM_MASK,
144	.rtc_alarm_on_mask          = DA9062AA_ALARM_ON_MASK,
145	.rtc_alarm_status_mask      = (0x02 << 6),
146	.rtc_tick_on_mask           = DA9062AA_TICK_ON_MASK,
147	.rtc_ready_to_read_mask     = DA9062AA_RTC_READ_MASK,
148	.rtc_count_sec_mask         = DA9062AA_COUNT_SEC_MASK,
149	.rtc_count_min_mask         = DA9062AA_COUNT_MIN_MASK,
150	.rtc_count_hour_mask        = DA9062AA_COUNT_HOUR_MASK,
151	.rtc_count_day_mask         = DA9062AA_COUNT_DAY_MASK,
152	.rtc_count_month_mask       = DA9062AA_COUNT_MONTH_MASK,
153	.rtc_count_year_mask        = DA9062AA_COUNT_YEAR_MASK,
154	/* ALARM CONFIG */
155	.rtc_data_start             = RTC_SEC,
156	.rtc_alarm_len              = RTC_DATA_LEN,
157};
158
159static const struct of_device_id da9063_compatible_reg_id_table[] = {
160	{ .compatible = "dlg,da9063-rtc", .data = &da9063_bb_regs },
161	{ .compatible = "dlg,da9062-rtc", .data = &da9062_aa_regs },
162	{ },
163};
164MODULE_DEVICE_TABLE(of, da9063_compatible_reg_id_table);
165
166static void da9063_data_to_tm(u8 *data, struct rtc_time *tm,
167			      struct da9063_compatible_rtc *rtc)
168{
169	const struct da9063_compatible_rtc_regmap *config = rtc->config;
170
171	tm->tm_sec  = data[RTC_SEC]  & config->rtc_count_sec_mask;
172	tm->tm_min  = data[RTC_MIN]  & config->rtc_count_min_mask;
173	tm->tm_hour = data[RTC_HOUR] & config->rtc_count_hour_mask;
174	tm->tm_mday = data[RTC_DAY]  & config->rtc_count_day_mask;
175	tm->tm_mon  = MONTHS_FROM_DA9063(data[RTC_MONTH] &
176					 config->rtc_count_month_mask);
177	tm->tm_year = YEARS_FROM_DA9063(data[RTC_YEAR] &
178					config->rtc_count_year_mask);
179}
180
181static void da9063_tm_to_data(struct rtc_time *tm, u8 *data,
182			      struct da9063_compatible_rtc *rtc)
183{
184	const struct da9063_compatible_rtc_regmap *config = rtc->config;
185
186	data[RTC_SEC]   = tm->tm_sec & config->rtc_count_sec_mask;
187	data[RTC_MIN]   = tm->tm_min & config->rtc_count_min_mask;
188	data[RTC_HOUR]  = tm->tm_hour & config->rtc_count_hour_mask;
189	data[RTC_DAY]   = tm->tm_mday & config->rtc_count_day_mask;
190	data[RTC_MONTH] = MONTHS_TO_DA9063(tm->tm_mon) &
191				config->rtc_count_month_mask;
192	data[RTC_YEAR]  = YEARS_TO_DA9063(tm->tm_year) &
193				config->rtc_count_year_mask;
194}
195
196static int da9063_rtc_stop_alarm(struct device *dev)
197{
198	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
199	const struct da9063_compatible_rtc_regmap *config = rtc->config;
200
201	return regmap_update_bits(rtc->regmap,
202				  config->rtc_alarm_year_reg,
203				  config->rtc_alarm_on_mask,
204				  0);
205}
206
207static int da9063_rtc_start_alarm(struct device *dev)
208{
209	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
210	const struct da9063_compatible_rtc_regmap *config = rtc->config;
211
212	return regmap_update_bits(rtc->regmap,
213				  config->rtc_alarm_year_reg,
214				  config->rtc_alarm_on_mask,
215				  config->rtc_alarm_on_mask);
216}
217
218static int da9063_rtc_read_time(struct device *dev, struct rtc_time *tm)
219{
220	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
221	const struct da9063_compatible_rtc_regmap *config = rtc->config;
222	unsigned long tm_secs;
223	unsigned long al_secs;
224	u8 data[RTC_DATA_LEN];
225	int ret;
226
227	ret = regmap_bulk_read(rtc->regmap,
228			       config->rtc_count_secs_reg,
229			       data, RTC_DATA_LEN);
230	if (ret < 0) {
231		dev_err(dev, "Failed to read RTC time data: %d\n", ret);
232		return ret;
233	}
234
235	if (!(data[RTC_SEC] & config->rtc_ready_to_read_mask)) {
236		dev_dbg(dev, "RTC not yet ready to be read by the host\n");
237		return -EINVAL;
238	}
239
240	da9063_data_to_tm(data, tm, rtc);
241
242	tm_secs = rtc_tm_to_time64(tm);
243	al_secs = rtc_tm_to_time64(&rtc->alarm_time);
244
245	/* handle the rtc synchronisation delay */
246	if (rtc->rtc_sync == true && al_secs - tm_secs == 1)
247		memcpy(tm, &rtc->alarm_time, sizeof(struct rtc_time));
248	else
249		rtc->rtc_sync = false;
250
251	return 0;
252}
253
254static int da9063_rtc_set_time(struct device *dev, struct rtc_time *tm)
255{
256	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
257	const struct da9063_compatible_rtc_regmap *config = rtc->config;
258	u8 data[RTC_DATA_LEN];
259	int ret;
260
261	da9063_tm_to_data(tm, data, rtc);
262	ret = regmap_bulk_write(rtc->regmap,
263				config->rtc_count_secs_reg,
264				data, RTC_DATA_LEN);
265	if (ret < 0)
266		dev_err(dev, "Failed to set RTC time data: %d\n", ret);
267
268	return ret;
269}
270
271static int da9063_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
272{
273	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
274	const struct da9063_compatible_rtc_regmap *config = rtc->config;
275	u8 data[RTC_DATA_LEN];
276	int ret;
277	unsigned int val;
278
279	data[RTC_SEC] = 0;
280	ret = regmap_bulk_read(rtc->regmap,
281			       config->rtc_alarm_secs_reg,
282			       &data[config->rtc_data_start],
283			       config->rtc_alarm_len);
284	if (ret < 0)
285		return ret;
286
287	da9063_data_to_tm(data, &alrm->time, rtc);
288
289	alrm->enabled = !!(data[RTC_YEAR] & config->rtc_alarm_on_mask);
290
291	ret = regmap_read(rtc->regmap,
292			  config->rtc_event_reg,
293			  &val);
294	if (ret < 0)
295		return ret;
296
297	if (val & config->rtc_event_alarm_mask)
298		alrm->pending = 1;
299	else
300		alrm->pending = 0;
301
302	return 0;
303}
304
305static int da9063_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
306{
307	struct da9063_compatible_rtc *rtc = dev_get_drvdata(dev);
308	const struct da9063_compatible_rtc_regmap *config = rtc->config;
309	u8 data[RTC_DATA_LEN];
310	int ret;
311
312	da9063_tm_to_data(&alrm->time, data, rtc);
313
314	ret = da9063_rtc_stop_alarm(dev);
315	if (ret < 0) {
316		dev_err(dev, "Failed to stop alarm: %d\n", ret);
317		return ret;
318	}
319
320	ret = regmap_bulk_write(rtc->regmap,
321				config->rtc_alarm_secs_reg,
322				&data[config->rtc_data_start],
323				config->rtc_alarm_len);
324	if (ret < 0) {
325		dev_err(dev, "Failed to write alarm: %d\n", ret);
326		return ret;
327	}
328
329	da9063_data_to_tm(data, &rtc->alarm_time, rtc);
330
331	if (alrm->enabled) {
332		ret = da9063_rtc_start_alarm(dev);
333		if (ret < 0) {
334			dev_err(dev, "Failed to start alarm: %d\n", ret);
335			return ret;
336		}
337	}
338
339	return ret;
340}
341
342static int da9063_rtc_alarm_irq_enable(struct device *dev,
343				       unsigned int enabled)
344{
345	if (enabled)
346		return da9063_rtc_start_alarm(dev);
347	else
348		return da9063_rtc_stop_alarm(dev);
349}
350
351static irqreturn_t da9063_alarm_event(int irq, void *data)
352{
353	struct da9063_compatible_rtc *rtc = data;
354	const struct da9063_compatible_rtc_regmap *config = rtc->config;
355
356	regmap_update_bits(rtc->regmap,
357			   config->rtc_alarm_year_reg,
358			   config->rtc_alarm_on_mask,
359			   0);
360
361	rtc->rtc_sync = true;
362	rtc_update_irq(rtc->rtc_dev, 1, RTC_IRQF | RTC_AF);
363
364	return IRQ_HANDLED;
365}
366
367static const struct rtc_class_ops da9063_rtc_ops = {
368	.read_time = da9063_rtc_read_time,
369	.set_time = da9063_rtc_set_time,
370	.read_alarm = da9063_rtc_read_alarm,
371	.set_alarm = da9063_rtc_set_alarm,
372	.alarm_irq_enable = da9063_rtc_alarm_irq_enable,
373};
374
375static int da9063_rtc_probe(struct platform_device *pdev)
376{
377	struct da9063_compatible_rtc *rtc;
378	const struct da9063_compatible_rtc_regmap *config;
379	const struct of_device_id *match;
380	int irq_alarm;
381	u8 data[RTC_DATA_LEN];
382	int ret;
383
384	if (!pdev->dev.of_node)
385		return -ENXIO;
386
387	match = of_match_node(da9063_compatible_reg_id_table,
388			      pdev->dev.of_node);
389
390	rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL);
391	if (!rtc)
392		return -ENOMEM;
393
394	rtc->config = match->data;
395	if (of_device_is_compatible(pdev->dev.of_node, "dlg,da9063-rtc")) {
396		struct da9063 *chip = dev_get_drvdata(pdev->dev.parent);
397
398		if (chip->variant_code == PMIC_DA9063_AD)
399			rtc->config = &da9063_ad_regs;
400	}
401
402	rtc->regmap = dev_get_regmap(pdev->dev.parent, NULL);
403	if (!rtc->regmap) {
404		dev_warn(&pdev->dev, "Parent regmap unavailable.\n");
405		return -ENXIO;
406	}
407
408	config = rtc->config;
409	ret = regmap_update_bits(rtc->regmap,
410				 config->rtc_enable_reg,
411				 config->rtc_enable_mask,
412				 config->rtc_enable_mask);
413	if (ret < 0) {
414		dev_err(&pdev->dev, "Failed to enable RTC\n");
415		return ret;
416	}
417
418	ret = regmap_update_bits(rtc->regmap,
419				 config->rtc_enable_32k_crystal_reg,
420				 config->rtc_crystal_mask,
421				 config->rtc_crystal_mask);
422	if (ret < 0) {
423		dev_err(&pdev->dev, "Failed to run 32kHz oscillator\n");
424		return ret;
425	}
426
427	ret = regmap_update_bits(rtc->regmap,
428				 config->rtc_alarm_secs_reg,
429				 config->rtc_alarm_status_mask,
430				 0);
431	if (ret < 0) {
432		dev_err(&pdev->dev, "Failed to access RTC alarm register\n");
433		return ret;
434	}
435
436	ret = regmap_update_bits(rtc->regmap,
437				 config->rtc_alarm_secs_reg,
438				 DA9063_ALARM_STATUS_ALARM,
439				 DA9063_ALARM_STATUS_ALARM);
440	if (ret < 0) {
441		dev_err(&pdev->dev, "Failed to access RTC alarm register\n");
442		return ret;
443	}
444
445	ret = regmap_update_bits(rtc->regmap,
446				 config->rtc_alarm_year_reg,
447				 config->rtc_tick_on_mask,
448				 0);
449	if (ret < 0) {
450		dev_err(&pdev->dev, "Failed to disable TICKs\n");
451		return ret;
452	}
453
454	data[RTC_SEC] = 0;
455	ret = regmap_bulk_read(rtc->regmap,
456			       config->rtc_alarm_secs_reg,
457			       &data[config->rtc_data_start],
458			       config->rtc_alarm_len);
459	if (ret < 0) {
460		dev_err(&pdev->dev, "Failed to read initial alarm data: %d\n",
461			ret);
462		return ret;
463	}
464
465	platform_set_drvdata(pdev, rtc);
466
467	rtc->rtc_dev = devm_rtc_allocate_device(&pdev->dev);
468	if (IS_ERR(rtc->rtc_dev))
469		return PTR_ERR(rtc->rtc_dev);
470
471	rtc->rtc_dev->ops = &da9063_rtc_ops;
472	rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_2000;
473	rtc->rtc_dev->range_max = RTC_TIMESTAMP_END_2063;
474
475	da9063_data_to_tm(data, &rtc->alarm_time, rtc);
476	rtc->rtc_sync = false;
477
478	/*
479	 * TODO: some models have alarms on a minute boundary but still support
480	 * real hardware interrupts. Add this once the core supports it.
481	 */
482	if (config->rtc_data_start != RTC_SEC)
483		rtc->rtc_dev->uie_unsupported = 1;
484
485	irq_alarm = platform_get_irq_byname(pdev, "ALARM");
 
 
 
486	ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL,
487					da9063_alarm_event,
488					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
489					"ALARM", rtc);
490	if (ret)
491		dev_err(&pdev->dev, "Failed to request ALARM IRQ %d: %d\n",
492			irq_alarm, ret);
493
494	return rtc_register_device(rtc->rtc_dev);
495}
496
497static struct platform_driver da9063_rtc_driver = {
498	.probe		= da9063_rtc_probe,
499	.driver		= {
500		.name	= DA9063_DRVNAME_RTC,
501		.of_match_table = da9063_compatible_reg_id_table,
502	},
503};
504
505module_platform_driver(da9063_rtc_driver);
506
507MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
508MODULE_DESCRIPTION("Real time clock device driver for Dialog DA9063");
509MODULE_LICENSE("GPL");
510MODULE_ALIAS("platform:" DA9063_DRVNAME_RTC);