1 /* rtc-da9063.c - Real time clock device driver for DA9063
2 * Copyright (C) 2013-14 Dialog Semiconductor Ltd.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/init.h>
18 #include <linux/platform_device.h>
19 #include <linux/interrupt.h>
20 #include <linux/rtc.h>
21 #include <linux/slab.h>
22 #include <linux/delay.h>
23 #include <linux/regmap.h>
24 #include <linux/mfd/da9063/registers.h>
25 #include <linux/mfd/da9063/core.h>
27 #define YEARS_TO_DA9063(year) ((year) - 100)
28 #define MONTHS_TO_DA9063(month) ((month) + 1)
29 #define YEARS_FROM_DA9063(year) ((year) + 100)
30 #define MONTHS_FROM_DA9063(month) ((month) - 1)
32 #define RTC_DATA_LEN (DA9063_REG_COUNT_Y - DA9063_REG_COUNT_S + 1)
41 struct rtc_device
*rtc_dev
;
43 struct rtc_time alarm_time
;
47 static void da9063_data_to_tm(u8
*data
, struct rtc_time
*tm
)
49 tm
->tm_sec
= data
[RTC_SEC
] & DA9063_COUNT_SEC_MASK
;
50 tm
->tm_min
= data
[RTC_MIN
] & DA9063_COUNT_MIN_MASK
;
51 tm
->tm_hour
= data
[RTC_HOUR
] & DA9063_COUNT_HOUR_MASK
;
52 tm
->tm_mday
= data
[RTC_DAY
] & DA9063_COUNT_DAY_MASK
;
53 tm
->tm_mon
= MONTHS_FROM_DA9063(data
[RTC_MONTH
] &
54 DA9063_COUNT_MONTH_MASK
);
55 tm
->tm_year
= YEARS_FROM_DA9063(data
[RTC_YEAR
] &
56 DA9063_COUNT_YEAR_MASK
);
59 static void da9063_tm_to_data(struct rtc_time
*tm
, u8
*data
)
61 data
[RTC_SEC
] &= ~DA9063_COUNT_SEC_MASK
;
62 data
[RTC_SEC
] |= tm
->tm_sec
& DA9063_COUNT_SEC_MASK
;
64 data
[RTC_MIN
] &= ~DA9063_COUNT_MIN_MASK
;
65 data
[RTC_MIN
] |= tm
->tm_min
& DA9063_COUNT_MIN_MASK
;
67 data
[RTC_HOUR
] &= ~DA9063_COUNT_HOUR_MASK
;
68 data
[RTC_HOUR
] |= tm
->tm_hour
& DA9063_COUNT_HOUR_MASK
;
70 data
[RTC_DAY
] &= ~DA9063_COUNT_DAY_MASK
;
71 data
[RTC_DAY
] |= tm
->tm_mday
& DA9063_COUNT_DAY_MASK
;
73 data
[RTC_MONTH
] &= ~DA9063_COUNT_MONTH_MASK
;
74 data
[RTC_MONTH
] |= MONTHS_TO_DA9063(tm
->tm_mon
) &
75 DA9063_COUNT_MONTH_MASK
;
77 data
[RTC_YEAR
] &= ~DA9063_COUNT_YEAR_MASK
;
78 data
[RTC_YEAR
] |= YEARS_TO_DA9063(tm
->tm_year
) &
79 DA9063_COUNT_YEAR_MASK
;
82 static int da9063_rtc_stop_alarm(struct device
*dev
)
84 struct da9063_rtc
*rtc
= dev_get_drvdata(dev
);
86 return regmap_update_bits(rtc
->hw
->regmap
, DA9063_REG_ALARM_Y
,
90 static int da9063_rtc_start_alarm(struct device
*dev
)
92 struct da9063_rtc
*rtc
= dev_get_drvdata(dev
);
94 return regmap_update_bits(rtc
->hw
->regmap
, DA9063_REG_ALARM_Y
,
95 DA9063_ALARM_ON
, DA9063_ALARM_ON
);
98 static int da9063_rtc_read_time(struct device
*dev
, struct rtc_time
*tm
)
100 struct da9063_rtc
*rtc
= dev_get_drvdata(dev
);
101 unsigned long tm_secs
;
102 unsigned long al_secs
;
103 u8 data
[RTC_DATA_LEN
];
106 ret
= regmap_bulk_read(rtc
->hw
->regmap
, DA9063_REG_COUNT_S
,
109 dev_err(dev
, "Failed to read RTC time data: %d\n", ret
);
113 if (!(data
[RTC_SEC
] & DA9063_RTC_READ
)) {
114 dev_dbg(dev
, "RTC not yet ready to be read by the host\n");
118 da9063_data_to_tm(data
, tm
);
120 rtc_tm_to_time(tm
, &tm_secs
);
121 rtc_tm_to_time(&rtc
->alarm_time
, &al_secs
);
123 /* handle the rtc synchronisation delay */
124 if (rtc
->rtc_sync
== true && al_secs
- tm_secs
== 1)
125 memcpy(tm
, &rtc
->alarm_time
, sizeof(struct rtc_time
));
127 rtc
->rtc_sync
= false;
129 return rtc_valid_tm(tm
);
132 static int da9063_rtc_set_time(struct device
*dev
, struct rtc_time
*tm
)
134 struct da9063_rtc
*rtc
= dev_get_drvdata(dev
);
135 u8 data
[RTC_DATA_LEN
];
138 da9063_tm_to_data(tm
, data
);
139 ret
= regmap_bulk_write(rtc
->hw
->regmap
, DA9063_REG_COUNT_S
,
142 dev_err(dev
, "Failed to set RTC time data: %d\n", ret
);
147 static int da9063_rtc_read_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
149 struct da9063_rtc
*rtc
= dev_get_drvdata(dev
);
150 u8 data
[RTC_DATA_LEN
];
154 ret
= regmap_bulk_read(rtc
->hw
->regmap
, DA9063_REG_ALARM_S
,
155 &data
[RTC_SEC
], RTC_DATA_LEN
);
159 da9063_data_to_tm(data
, &alrm
->time
);
161 alrm
->enabled
= !!(data
[RTC_YEAR
] & DA9063_ALARM_ON
);
163 ret
= regmap_read(rtc
->hw
->regmap
, DA9063_REG_EVENT_A
, &val
);
167 if (val
& (DA9063_E_ALARM
))
175 static int da9063_rtc_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
177 struct da9063_rtc
*rtc
= dev_get_drvdata(dev
);
178 u8 data
[RTC_DATA_LEN
];
181 da9063_tm_to_data(&alrm
->time
, data
);
183 ret
= da9063_rtc_stop_alarm(dev
);
185 dev_err(dev
, "Failed to stop alarm: %d\n", ret
);
189 ret
= regmap_bulk_write(rtc
->hw
->regmap
, DA9063_REG_ALARM_S
,
192 dev_err(dev
, "Failed to write alarm: %d\n", ret
);
196 rtc
->alarm_time
= alrm
->time
;
199 ret
= da9063_rtc_start_alarm(dev
);
201 dev_err(dev
, "Failed to start alarm: %d\n", ret
);
209 static int da9063_rtc_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
212 return da9063_rtc_start_alarm(dev
);
214 return da9063_rtc_stop_alarm(dev
);
217 static irqreturn_t
da9063_alarm_event(int irq
, void *data
)
219 struct da9063_rtc
*rtc
= data
;
221 regmap_update_bits(rtc
->hw
->regmap
, DA9063_REG_ALARM_Y
,
224 rtc
->rtc_sync
= true;
225 rtc_update_irq(rtc
->rtc_dev
, 1, RTC_IRQF
| RTC_AF
);
230 static const struct rtc_class_ops da9063_rtc_ops
= {
231 .read_time
= da9063_rtc_read_time
,
232 .set_time
= da9063_rtc_set_time
,
233 .read_alarm
= da9063_rtc_read_alarm
,
234 .set_alarm
= da9063_rtc_set_alarm
,
235 .alarm_irq_enable
= da9063_rtc_alarm_irq_enable
,
238 static int da9063_rtc_probe(struct platform_device
*pdev
)
240 struct da9063
*da9063
= dev_get_drvdata(pdev
->dev
.parent
);
241 struct da9063_rtc
*rtc
;
243 u8 data
[RTC_DATA_LEN
];
246 ret
= regmap_update_bits(da9063
->regmap
, DA9063_REG_CONTROL_E
,
247 DA9063_RTC_EN
, DA9063_RTC_EN
);
249 dev_err(&pdev
->dev
, "Failed to enable RTC\n");
253 ret
= regmap_update_bits(da9063
->regmap
, DA9063_REG_EN_32K
,
254 DA9063_CRYSTAL
, DA9063_CRYSTAL
);
256 dev_err(&pdev
->dev
, "Failed to run 32kHz oscillator\n");
260 ret
= regmap_update_bits(da9063
->regmap
, DA9063_REG_ALARM_S
,
261 DA9063_ALARM_STATUS_TICK
| DA9063_ALARM_STATUS_ALARM
,
264 dev_err(&pdev
->dev
, "Failed to access RTC alarm register\n");
268 ret
= regmap_update_bits(da9063
->regmap
, DA9063_REG_ALARM_S
,
269 DA9063_ALARM_STATUS_ALARM
,
270 DA9063_ALARM_STATUS_ALARM
);
272 dev_err(&pdev
->dev
, "Failed to access RTC alarm register\n");
276 ret
= regmap_update_bits(da9063
->regmap
, DA9063_REG_ALARM_Y
,
279 dev_err(&pdev
->dev
, "Failed to disable TICKs\n");
283 ret
= regmap_bulk_read(da9063
->regmap
, DA9063_REG_ALARM_S
,
286 dev_err(&pdev
->dev
, "Failed to read initial alarm data: %d\n",
291 rtc
= devm_kzalloc(&pdev
->dev
, sizeof(*rtc
), GFP_KERNEL
);
295 platform_set_drvdata(pdev
, rtc
);
297 irq_alarm
= platform_get_irq_byname(pdev
, "ALARM");
298 ret
= devm_request_threaded_irq(&pdev
->dev
, irq_alarm
, NULL
,
300 IRQF_TRIGGER_LOW
| IRQF_ONESHOT
,
303 dev_err(&pdev
->dev
, "Failed to request ALARM IRQ %d: %d\n",
309 rtc
->rtc_dev
= devm_rtc_device_register(&pdev
->dev
, DA9063_DRVNAME_RTC
,
310 &da9063_rtc_ops
, THIS_MODULE
);
311 if (IS_ERR(rtc
->rtc_dev
))
312 return PTR_ERR(rtc
->rtc_dev
);
314 da9063_data_to_tm(data
, &rtc
->alarm_time
);
315 rtc
->rtc_sync
= false;
320 static struct platform_driver da9063_rtc_driver
= {
321 .probe
= da9063_rtc_probe
,
323 .name
= DA9063_DRVNAME_RTC
,
324 .owner
= THIS_MODULE
,
328 module_platform_driver(da9063_rtc_driver
);
330 MODULE_AUTHOR("S Twiss <stwiss.opensource@diasemi.com>");
331 MODULE_DESCRIPTION("Real time clock device driver for Dialog DA9063");
332 MODULE_LICENSE("GPL v2");
333 MODULE_ALIAS("platform:" DA9063_DRVNAME_RTC
);