2 * Real time clock driver for DA9055
4 * Copyright(c) 2012 Dialog Semiconductor Ltd.
6 * Author: Dajun Dajun Chen <dajun.chen@diasemi.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
15 #include <linux/module.h>
16 #include <linux/platform_device.h>
17 #include <linux/rtc.h>
19 #include <linux/mfd/da9055/core.h>
20 #include <linux/mfd/da9055/reg.h>
21 #include <linux/mfd/da9055/pdata.h>
24 struct rtc_device
*rtc
;
25 struct da9055
*da9055
;
29 static int da9055_rtc_enable_alarm(struct da9055_rtc
*rtc
, bool enable
)
33 ret
= da9055_reg_update(rtc
->da9055
, DA9055_REG_ALARM_Y
,
37 dev_err(rtc
->da9055
->dev
, "Failed to enable ALM: %d\n",
39 rtc
->alarm_enable
= 1;
41 ret
= da9055_reg_update(rtc
->da9055
, DA9055_REG_ALARM_Y
,
42 DA9055_RTC_ALM_EN
, 0);
44 dev_err(rtc
->da9055
->dev
,
45 "Failed to disable ALM: %d\n", ret
);
46 rtc
->alarm_enable
= 0;
51 static irqreturn_t
da9055_rtc_alm_irq(int irq
, void *data
)
53 struct da9055_rtc
*rtc
= data
;
55 da9055_rtc_enable_alarm(rtc
, 0);
56 rtc_update_irq(rtc
->rtc
, 1, RTC_IRQF
| RTC_AF
);
61 static int da9055_read_alarm(struct da9055
*da9055
, struct rtc_time
*rtc_tm
)
66 ret
= da9055_group_read(da9055
, DA9055_REG_ALARM_MI
, 5, v
);
68 dev_err(da9055
->dev
, "Failed to group read ALM: %d\n", ret
);
72 rtc_tm
->tm_year
= (v
[4] & DA9055_RTC_ALM_YEAR
) + 100;
73 rtc_tm
->tm_mon
= (v
[3] & DA9055_RTC_ALM_MONTH
) - 1;
74 rtc_tm
->tm_mday
= v
[2] & DA9055_RTC_ALM_DAY
;
75 rtc_tm
->tm_hour
= v
[1] & DA9055_RTC_ALM_HOUR
;
76 rtc_tm
->tm_min
= v
[0] & DA9055_RTC_ALM_MIN
;
78 return rtc_valid_tm(rtc_tm
);
81 static int da9055_set_alarm(struct da9055
*da9055
, struct rtc_time
*rtc_tm
)
86 rtc_tm
->tm_year
-= 100;
89 ret
= da9055_reg_update(da9055
, DA9055_REG_ALARM_MI
,
90 DA9055_RTC_ALM_MIN
, rtc_tm
->tm_min
);
92 dev_err(da9055
->dev
, "Failed to write ALRM MIN: %d\n", ret
);
96 v
[0] = rtc_tm
->tm_hour
;
97 v
[1] = rtc_tm
->tm_mday
;
99 ret
= da9055_group_write(da9055
, DA9055_REG_ALARM_H
, 2, v
);
103 ret
= da9055_reg_update(da9055
, DA9055_REG_ALARM_MO
,
104 DA9055_RTC_ALM_MONTH
, rtc_tm
->tm_mon
);
106 dev_err(da9055
->dev
, "Failed to write ALM Month:%d\n", ret
);
108 ret
= da9055_reg_update(da9055
, DA9055_REG_ALARM_Y
,
109 DA9055_RTC_ALM_YEAR
, rtc_tm
->tm_year
);
111 dev_err(da9055
->dev
, "Failed to write ALM Year:%d\n", ret
);
116 static int da9055_rtc_get_alarm_status(struct da9055
*da9055
)
120 ret
= da9055_reg_read(da9055
, DA9055_REG_ALARM_Y
);
122 dev_err(da9055
->dev
, "Failed to read ALM: %d\n", ret
);
125 ret
&= DA9055_RTC_ALM_EN
;
126 return (ret
> 0) ? 1 : 0;
129 static int da9055_rtc_read_time(struct device
*dev
, struct rtc_time
*rtc_tm
)
131 struct da9055_rtc
*rtc
= dev_get_drvdata(dev
);
135 ret
= da9055_reg_read(rtc
->da9055
, DA9055_REG_COUNT_S
);
140 * Registers are only valid when RTC_READ
141 * status bit is asserted
143 if (!(ret
& DA9055_RTC_READ
))
146 ret
= da9055_group_read(rtc
->da9055
, DA9055_REG_COUNT_S
, 6, v
);
148 dev_err(rtc
->da9055
->dev
, "Failed to read RTC time : %d\n",
153 rtc_tm
->tm_year
= (v
[5] & DA9055_RTC_YEAR
) + 100;
154 rtc_tm
->tm_mon
= (v
[4] & DA9055_RTC_MONTH
) - 1;
155 rtc_tm
->tm_mday
= v
[3] & DA9055_RTC_DAY
;
156 rtc_tm
->tm_hour
= v
[2] & DA9055_RTC_HOUR
;
157 rtc_tm
->tm_min
= v
[1] & DA9055_RTC_MIN
;
158 rtc_tm
->tm_sec
= v
[0] & DA9055_RTC_SEC
;
160 return rtc_valid_tm(rtc_tm
);
163 static int da9055_rtc_set_time(struct device
*dev
, struct rtc_time
*tm
)
165 struct da9055_rtc
*rtc
;
168 rtc
= dev_get_drvdata(dev
);
174 v
[4] = tm
->tm_mon
+ 1;
175 v
[5] = tm
->tm_year
- 100;
177 return da9055_group_write(rtc
->da9055
, DA9055_REG_COUNT_S
, 6, v
);
180 static int da9055_rtc_read_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
183 struct rtc_time
*tm
= &alrm
->time
;
184 struct da9055_rtc
*rtc
= dev_get_drvdata(dev
);
186 ret
= da9055_read_alarm(rtc
->da9055
, tm
);
191 alrm
->enabled
= da9055_rtc_get_alarm_status(rtc
->da9055
);
196 static int da9055_rtc_set_alarm(struct device
*dev
, struct rtc_wkalrm
*alrm
)
199 struct rtc_time
*tm
= &alrm
->time
;
200 struct da9055_rtc
*rtc
= dev_get_drvdata(dev
);
202 ret
= da9055_rtc_enable_alarm(rtc
, 0);
206 ret
= da9055_set_alarm(rtc
->da9055
, tm
);
210 ret
= da9055_rtc_enable_alarm(rtc
, 1);
215 static int da9055_rtc_alarm_irq_enable(struct device
*dev
, unsigned int enabled
)
217 struct da9055_rtc
*rtc
= dev_get_drvdata(dev
);
219 return da9055_rtc_enable_alarm(rtc
, enabled
);
222 static const struct rtc_class_ops da9055_rtc_ops
= {
223 .read_time
= da9055_rtc_read_time
,
224 .set_time
= da9055_rtc_set_time
,
225 .read_alarm
= da9055_rtc_read_alarm
,
226 .set_alarm
= da9055_rtc_set_alarm
,
227 .alarm_irq_enable
= da9055_rtc_alarm_irq_enable
,
230 static int da9055_rtc_device_init(struct da9055
*da9055
,
231 struct da9055_pdata
*pdata
)
235 /* Enable RTC and the internal Crystal */
236 ret
= da9055_reg_update(da9055
, DA9055_REG_CONTROL_B
,
237 DA9055_RTC_EN
, DA9055_RTC_EN
);
240 ret
= da9055_reg_update(da9055
, DA9055_REG_EN_32K
,
241 DA9055_CRYSTAL_EN
, DA9055_CRYSTAL_EN
);
245 /* Enable RTC in Power Down mode */
246 ret
= da9055_reg_update(da9055
, DA9055_REG_CONTROL_B
,
247 DA9055_RTC_MODE_PD
, DA9055_RTC_MODE_PD
);
251 /* Enable RTC in Reset mode */
252 if (pdata
&& pdata
->reset_enable
) {
253 ret
= da9055_reg_update(da9055
, DA9055_REG_CONTROL_B
,
255 DA9055_RTC_MODE_SD
<<
256 DA9055_RTC_MODE_SD_SHIFT
);
261 /* Disable the RTC TICK ALM */
262 ret
= da9055_reg_update(da9055
, DA9055_REG_ALARM_MO
,
263 DA9055_RTC_TICK_WAKE_MASK
, 0);
270 static int da9055_rtc_probe(struct platform_device
*pdev
)
272 struct da9055_rtc
*rtc
;
273 struct da9055_pdata
*pdata
= NULL
;
276 rtc
= devm_kzalloc(&pdev
->dev
, sizeof(struct da9055_rtc
), GFP_KERNEL
);
280 rtc
->da9055
= dev_get_drvdata(pdev
->dev
.parent
);
281 pdata
= dev_get_platdata(rtc
->da9055
->dev
);
282 platform_set_drvdata(pdev
, rtc
);
284 ret
= da9055_rtc_device_init(rtc
->da9055
, pdata
);
288 ret
= da9055_reg_read(rtc
->da9055
, DA9055_REG_ALARM_Y
);
292 if (ret
& DA9055_RTC_ALM_EN
)
293 rtc
->alarm_enable
= 1;
295 device_init_wakeup(&pdev
->dev
, 1);
297 rtc
->rtc
= devm_rtc_device_register(&pdev
->dev
, pdev
->name
,
298 &da9055_rtc_ops
, THIS_MODULE
);
299 if (IS_ERR(rtc
->rtc
)) {
300 ret
= PTR_ERR(rtc
->rtc
);
304 alm_irq
= platform_get_irq_byname(pdev
, "ALM");
308 ret
= devm_request_threaded_irq(&pdev
->dev
, alm_irq
, NULL
,
310 IRQF_TRIGGER_HIGH
| IRQF_ONESHOT
,
313 dev_err(rtc
->da9055
->dev
, "irq registration failed: %d\n", ret
);
321 /* Turn off the alarm if it should not be a wake source. */
322 static int da9055_rtc_suspend(struct device
*dev
)
324 struct platform_device
*pdev
= to_platform_device(dev
);
325 struct da9055_rtc
*rtc
= dev_get_drvdata(&pdev
->dev
);
328 if (!device_may_wakeup(&pdev
->dev
)) {
329 /* Disable the ALM IRQ */
330 ret
= da9055_rtc_enable_alarm(rtc
, 0);
332 dev_err(&pdev
->dev
, "Failed to disable RTC ALM\n");
338 /* Enable the alarm if it should be enabled (in case it was disabled to
339 * prevent use as a wake source).
341 static int da9055_rtc_resume(struct device
*dev
)
343 struct platform_device
*pdev
= to_platform_device(dev
);
344 struct da9055_rtc
*rtc
= dev_get_drvdata(&pdev
->dev
);
347 if (!device_may_wakeup(&pdev
->dev
)) {
348 if (rtc
->alarm_enable
) {
349 ret
= da9055_rtc_enable_alarm(rtc
, 1);
352 "Failed to restart RTC ALM\n");
359 /* Unconditionally disable the alarm */
360 static int da9055_rtc_freeze(struct device
*dev
)
362 struct platform_device
*pdev
= to_platform_device(dev
);
363 struct da9055_rtc
*rtc
= dev_get_drvdata(&pdev
->dev
);
366 ret
= da9055_rtc_enable_alarm(rtc
, 0);
368 dev_err(&pdev
->dev
, "Failed to freeze RTC ALMs\n");
374 #define da9055_rtc_suspend NULL
375 #define da9055_rtc_resume NULL
376 #define da9055_rtc_freeze NULL
379 static const struct dev_pm_ops da9055_rtc_pm_ops
= {
380 .suspend
= da9055_rtc_suspend
,
381 .resume
= da9055_rtc_resume
,
383 .freeze
= da9055_rtc_freeze
,
384 .thaw
= da9055_rtc_resume
,
385 .restore
= da9055_rtc_resume
,
387 .poweroff
= da9055_rtc_suspend
,
390 static struct platform_driver da9055_rtc_driver
= {
391 .probe
= da9055_rtc_probe
,
393 .name
= "da9055-rtc",
394 .pm
= &da9055_rtc_pm_ops
,
398 module_platform_driver(da9055_rtc_driver
);
400 MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
401 MODULE_DESCRIPTION("RTC driver for Dialog DA9055 PMIC");
402 MODULE_LICENSE("GPL");
403 MODULE_ALIAS("platform:da9055-rtc");