xref: /openbmc/linux/drivers/rtc/rtc-s5m.c (revision 77d84ff8)
1 /*
2  * Copyright (c) 2013 Samsung Electronics Co., Ltd
3  *	http://www.samsung.com
4  *
5  *  Copyright (C) 2013 Google, Inc
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License as published by
9  *  the Free Software Foundation; either version 2 of the License, or
10  *  (at your option) any later version.
11  *
12  *  This program is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *  GNU General Public License for more details.
16  */
17 
18 #include <linux/module.h>
19 #include <linux/i2c.h>
20 #include <linux/slab.h>
21 #include <linux/bcd.h>
22 #include <linux/bitops.h>
23 #include <linux/regmap.h>
24 #include <linux/rtc.h>
25 #include <linux/delay.h>
26 #include <linux/platform_device.h>
27 #include <linux/mfd/samsung/core.h>
28 #include <linux/mfd/samsung/irq.h>
29 #include <linux/mfd/samsung/rtc.h>
30 
31 /*
32  * Maximum number of retries for checking changes in UDR field
33  * of SEC_RTC_UDR_CON register (to limit possible endless loop).
34  *
35  * After writing to RTC registers (setting time or alarm) read the UDR field
36  * in SEC_RTC_UDR_CON register. UDR is auto-cleared when data have
37  * been transferred.
38  */
39 #define UDR_READ_RETRY_CNT	5
40 
41 struct s5m_rtc_info {
42 	struct device *dev;
43 	struct sec_pmic_dev *s5m87xx;
44 	struct regmap *regmap;
45 	struct rtc_device *rtc_dev;
46 	int irq;
47 	int device_type;
48 	int rtc_24hr_mode;
49 	bool wtsr_smpl;
50 };
51 
52 static void s5m8767_data_to_tm(u8 *data, struct rtc_time *tm,
53 			       int rtc_24hr_mode)
54 {
55 	tm->tm_sec = data[RTC_SEC] & 0x7f;
56 	tm->tm_min = data[RTC_MIN] & 0x7f;
57 	if (rtc_24hr_mode) {
58 		tm->tm_hour = data[RTC_HOUR] & 0x1f;
59 	} else {
60 		tm->tm_hour = data[RTC_HOUR] & 0x0f;
61 		if (data[RTC_HOUR] & HOUR_PM_MASK)
62 			tm->tm_hour += 12;
63 	}
64 
65 	tm->tm_wday = ffs(data[RTC_WEEKDAY] & 0x7f);
66 	tm->tm_mday = data[RTC_DATE] & 0x1f;
67 	tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1;
68 	tm->tm_year = (data[RTC_YEAR1] & 0x7f) + 100;
69 	tm->tm_yday = 0;
70 	tm->tm_isdst = 0;
71 }
72 
73 static int s5m8767_tm_to_data(struct rtc_time *tm, u8 *data)
74 {
75 	data[RTC_SEC] = tm->tm_sec;
76 	data[RTC_MIN] = tm->tm_min;
77 
78 	if (tm->tm_hour >= 12)
79 		data[RTC_HOUR] = tm->tm_hour | HOUR_PM_MASK;
80 	else
81 		data[RTC_HOUR] = tm->tm_hour & ~HOUR_PM_MASK;
82 
83 	data[RTC_WEEKDAY] = 1 << tm->tm_wday;
84 	data[RTC_DATE] = tm->tm_mday;
85 	data[RTC_MONTH] = tm->tm_mon + 1;
86 	data[RTC_YEAR1] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0;
87 
88 	if (tm->tm_year < 100) {
89 		pr_err("s5m8767 RTC cannot handle the year %d.\n",
90 		       1900 + tm->tm_year);
91 		return -EINVAL;
92 	} else {
93 		return 0;
94 	}
95 }
96 
97 /*
98  * Read RTC_UDR_CON register and wait till UDR field is cleared.
99  * This indicates that time/alarm update ended.
100  */
101 static inline int s5m8767_wait_for_udr_update(struct s5m_rtc_info *info)
102 {
103 	int ret, retry = UDR_READ_RETRY_CNT;
104 	unsigned int data;
105 
106 	do {
107 		ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data);
108 	} while (--retry && (data & RTC_UDR_MASK) && !ret);
109 
110 	if (!retry)
111 		dev_err(info->dev, "waiting for UDR update, reached max number of retries\n");
112 
113 	return ret;
114 }
115 
116 static inline int s5m8767_rtc_set_time_reg(struct s5m_rtc_info *info)
117 {
118 	int ret;
119 	unsigned int data;
120 
121 	ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data);
122 	if (ret < 0) {
123 		dev_err(info->dev, "failed to read update reg(%d)\n", ret);
124 		return ret;
125 	}
126 
127 	data |= RTC_TIME_EN_MASK;
128 	data |= RTC_UDR_MASK;
129 
130 	ret = regmap_write(info->regmap, SEC_RTC_UDR_CON, data);
131 	if (ret < 0) {
132 		dev_err(info->dev, "failed to write update reg(%d)\n", ret);
133 		return ret;
134 	}
135 
136 	ret = s5m8767_wait_for_udr_update(info);
137 
138 	return ret;
139 }
140 
141 static inline int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
142 {
143 	int ret;
144 	unsigned int data;
145 
146 	ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &data);
147 	if (ret < 0) {
148 		dev_err(info->dev, "%s: fail to read update reg(%d)\n",
149 			__func__, ret);
150 		return ret;
151 	}
152 
153 	data &= ~RTC_TIME_EN_MASK;
154 	data |= RTC_UDR_MASK;
155 
156 	ret = regmap_write(info->regmap, SEC_RTC_UDR_CON, data);
157 	if (ret < 0) {
158 		dev_err(info->dev, "%s: fail to write update reg(%d)\n",
159 			__func__, ret);
160 		return ret;
161 	}
162 
163 	ret = s5m8767_wait_for_udr_update(info);
164 
165 	return ret;
166 }
167 
168 static void s5m8763_data_to_tm(u8 *data, struct rtc_time *tm)
169 {
170 	tm->tm_sec = bcd2bin(data[RTC_SEC]);
171 	tm->tm_min = bcd2bin(data[RTC_MIN]);
172 
173 	if (data[RTC_HOUR] & HOUR_12) {
174 		tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x1f);
175 		if (data[RTC_HOUR] & HOUR_PM)
176 			tm->tm_hour += 12;
177 	} else {
178 		tm->tm_hour = bcd2bin(data[RTC_HOUR] & 0x3f);
179 	}
180 
181 	tm->tm_wday = data[RTC_WEEKDAY] & 0x07;
182 	tm->tm_mday = bcd2bin(data[RTC_DATE]);
183 	tm->tm_mon = bcd2bin(data[RTC_MONTH]);
184 	tm->tm_year = bcd2bin(data[RTC_YEAR1]) + bcd2bin(data[RTC_YEAR2]) * 100;
185 	tm->tm_year -= 1900;
186 }
187 
188 static void s5m8763_tm_to_data(struct rtc_time *tm, u8 *data)
189 {
190 	data[RTC_SEC] = bin2bcd(tm->tm_sec);
191 	data[RTC_MIN] = bin2bcd(tm->tm_min);
192 	data[RTC_HOUR] = bin2bcd(tm->tm_hour);
193 	data[RTC_WEEKDAY] = tm->tm_wday;
194 	data[RTC_DATE] = bin2bcd(tm->tm_mday);
195 	data[RTC_MONTH] = bin2bcd(tm->tm_mon);
196 	data[RTC_YEAR1] = bin2bcd(tm->tm_year % 100);
197 	data[RTC_YEAR2] = bin2bcd((tm->tm_year + 1900) / 100);
198 }
199 
200 static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
201 {
202 	struct s5m_rtc_info *info = dev_get_drvdata(dev);
203 	u8 data[8];
204 	int ret;
205 
206 	ret = regmap_bulk_read(info->regmap, SEC_RTC_SEC, data, 8);
207 	if (ret < 0)
208 		return ret;
209 
210 	switch (info->device_type) {
211 	case S5M8763X:
212 		s5m8763_data_to_tm(data, tm);
213 		break;
214 
215 	case S5M8767X:
216 		s5m8767_data_to_tm(data, tm, info->rtc_24hr_mode);
217 		break;
218 
219 	default:
220 		return -EINVAL;
221 	}
222 
223 	dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
224 		1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
225 		tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
226 
227 	return rtc_valid_tm(tm);
228 }
229 
230 static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
231 {
232 	struct s5m_rtc_info *info = dev_get_drvdata(dev);
233 	u8 data[8];
234 	int ret = 0;
235 
236 	switch (info->device_type) {
237 	case S5M8763X:
238 		s5m8763_tm_to_data(tm, data);
239 		break;
240 	case S5M8767X:
241 		ret = s5m8767_tm_to_data(tm, data);
242 		break;
243 	default:
244 		return -EINVAL;
245 	}
246 
247 	if (ret < 0)
248 		return ret;
249 
250 	dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
251 		1900 + tm->tm_year, 1 + tm->tm_mon, tm->tm_mday,
252 		tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_wday);
253 
254 	ret = regmap_raw_write(info->regmap, SEC_RTC_SEC, data, 8);
255 	if (ret < 0)
256 		return ret;
257 
258 	ret = s5m8767_rtc_set_time_reg(info);
259 
260 	return ret;
261 }
262 
263 static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
264 {
265 	struct s5m_rtc_info *info = dev_get_drvdata(dev);
266 	u8 data[8];
267 	unsigned int val;
268 	int ret, i;
269 
270 	ret = regmap_bulk_read(info->regmap, SEC_ALARM0_SEC, data, 8);
271 	if (ret < 0)
272 		return ret;
273 
274 	switch (info->device_type) {
275 	case S5M8763X:
276 		s5m8763_data_to_tm(data, &alrm->time);
277 		ret = regmap_read(info->regmap, SEC_ALARM0_CONF, &val);
278 		if (ret < 0)
279 			return ret;
280 
281 		alrm->enabled = !!val;
282 
283 		ret = regmap_read(info->regmap, SEC_RTC_STATUS, &val);
284 		if (ret < 0)
285 			return ret;
286 
287 		break;
288 
289 	case S5M8767X:
290 		s5m8767_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
291 		dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
292 			1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon,
293 			alrm->time.tm_mday, alrm->time.tm_hour,
294 			alrm->time.tm_min, alrm->time.tm_sec,
295 			alrm->time.tm_wday);
296 
297 		alrm->enabled = 0;
298 		for (i = 0; i < 7; i++) {
299 			if (data[i] & ALARM_ENABLE_MASK) {
300 				alrm->enabled = 1;
301 				break;
302 			}
303 		}
304 
305 		alrm->pending = 0;
306 		ret = regmap_read(info->regmap, SEC_RTC_STATUS, &val);
307 		if (ret < 0)
308 			return ret;
309 		break;
310 
311 	default:
312 		return -EINVAL;
313 	}
314 
315 	if (val & ALARM0_STATUS)
316 		alrm->pending = 1;
317 	else
318 		alrm->pending = 0;
319 
320 	return 0;
321 }
322 
323 static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
324 {
325 	u8 data[8];
326 	int ret, i;
327 	struct rtc_time tm;
328 
329 	ret = regmap_bulk_read(info->regmap, SEC_ALARM0_SEC, data, 8);
330 	if (ret < 0)
331 		return ret;
332 
333 	s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode);
334 	dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
335 		1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday,
336 		tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday);
337 
338 	switch (info->device_type) {
339 	case S5M8763X:
340 		ret = regmap_write(info->regmap, SEC_ALARM0_CONF, 0);
341 		break;
342 
343 	case S5M8767X:
344 		for (i = 0; i < 7; i++)
345 			data[i] &= ~ALARM_ENABLE_MASK;
346 
347 		ret = regmap_raw_write(info->regmap, SEC_ALARM0_SEC, data, 8);
348 		if (ret < 0)
349 			return ret;
350 
351 		ret = s5m8767_rtc_set_alarm_reg(info);
352 
353 		break;
354 
355 	default:
356 		return -EINVAL;
357 	}
358 
359 	return ret;
360 }
361 
362 static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
363 {
364 	int ret;
365 	u8 data[8];
366 	u8 alarm0_conf;
367 	struct rtc_time tm;
368 
369 	ret = regmap_bulk_read(info->regmap, SEC_ALARM0_SEC, data, 8);
370 	if (ret < 0)
371 		return ret;
372 
373 	s5m8767_data_to_tm(data, &tm, info->rtc_24hr_mode);
374 	dev_dbg(info->dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
375 		1900 + tm.tm_year, 1 + tm.tm_mon, tm.tm_mday,
376 		tm.tm_hour, tm.tm_min, tm.tm_sec, tm.tm_wday);
377 
378 	switch (info->device_type) {
379 	case S5M8763X:
380 		alarm0_conf = 0x77;
381 		ret = regmap_write(info->regmap, SEC_ALARM0_CONF, alarm0_conf);
382 		break;
383 
384 	case S5M8767X:
385 		data[RTC_SEC] |= ALARM_ENABLE_MASK;
386 		data[RTC_MIN] |= ALARM_ENABLE_MASK;
387 		data[RTC_HOUR] |= ALARM_ENABLE_MASK;
388 		data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK;
389 		if (data[RTC_DATE] & 0x1f)
390 			data[RTC_DATE] |= ALARM_ENABLE_MASK;
391 		if (data[RTC_MONTH] & 0xf)
392 			data[RTC_MONTH] |= ALARM_ENABLE_MASK;
393 		if (data[RTC_YEAR1] & 0x7f)
394 			data[RTC_YEAR1] |= ALARM_ENABLE_MASK;
395 
396 		ret = regmap_raw_write(info->regmap, SEC_ALARM0_SEC, data, 8);
397 		if (ret < 0)
398 			return ret;
399 		ret = s5m8767_rtc_set_alarm_reg(info);
400 
401 		break;
402 
403 	default:
404 		return -EINVAL;
405 	}
406 
407 	return ret;
408 }
409 
410 static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
411 {
412 	struct s5m_rtc_info *info = dev_get_drvdata(dev);
413 	u8 data[8];
414 	int ret;
415 
416 	switch (info->device_type) {
417 	case S5M8763X:
418 		s5m8763_tm_to_data(&alrm->time, data);
419 		break;
420 
421 	case S5M8767X:
422 		s5m8767_tm_to_data(&alrm->time, data);
423 		break;
424 
425 	default:
426 		return -EINVAL;
427 	}
428 
429 	dev_dbg(dev, "%s: %d/%d/%d %d:%d:%d(%d)\n", __func__,
430 		1900 + alrm->time.tm_year, 1 + alrm->time.tm_mon,
431 		alrm->time.tm_mday, alrm->time.tm_hour, alrm->time.tm_min,
432 		alrm->time.tm_sec, alrm->time.tm_wday);
433 
434 	ret = s5m_rtc_stop_alarm(info);
435 	if (ret < 0)
436 		return ret;
437 
438 	ret = regmap_raw_write(info->regmap, SEC_ALARM0_SEC, data, 8);
439 	if (ret < 0)
440 		return ret;
441 
442 	ret = s5m8767_rtc_set_alarm_reg(info);
443 	if (ret < 0)
444 		return ret;
445 
446 	if (alrm->enabled)
447 		ret = s5m_rtc_start_alarm(info);
448 
449 	return ret;
450 }
451 
452 static int s5m_rtc_alarm_irq_enable(struct device *dev,
453 				    unsigned int enabled)
454 {
455 	struct s5m_rtc_info *info = dev_get_drvdata(dev);
456 
457 	if (enabled)
458 		return s5m_rtc_start_alarm(info);
459 	else
460 		return s5m_rtc_stop_alarm(info);
461 }
462 
463 static irqreturn_t s5m_rtc_alarm_irq(int irq, void *data)
464 {
465 	struct s5m_rtc_info *info = data;
466 
467 	rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF);
468 
469 	return IRQ_HANDLED;
470 }
471 
472 static const struct rtc_class_ops s5m_rtc_ops = {
473 	.read_time = s5m_rtc_read_time,
474 	.set_time = s5m_rtc_set_time,
475 	.read_alarm = s5m_rtc_read_alarm,
476 	.set_alarm = s5m_rtc_set_alarm,
477 	.alarm_irq_enable = s5m_rtc_alarm_irq_enable,
478 };
479 
480 static void s5m_rtc_enable_wtsr(struct s5m_rtc_info *info, bool enable)
481 {
482 	int ret;
483 	ret = regmap_update_bits(info->regmap, SEC_WTSR_SMPL_CNTL,
484 				 WTSR_ENABLE_MASK,
485 				 enable ? WTSR_ENABLE_MASK : 0);
486 	if (ret < 0)
487 		dev_err(info->dev, "%s: fail to update WTSR reg(%d)\n",
488 			__func__, ret);
489 }
490 
491 static void s5m_rtc_enable_smpl(struct s5m_rtc_info *info, bool enable)
492 {
493 	int ret;
494 	ret = regmap_update_bits(info->regmap, SEC_WTSR_SMPL_CNTL,
495 				 SMPL_ENABLE_MASK,
496 				 enable ? SMPL_ENABLE_MASK : 0);
497 	if (ret < 0)
498 		dev_err(info->dev, "%s: fail to update SMPL reg(%d)\n",
499 			__func__, ret);
500 }
501 
502 static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
503 {
504 	u8 data[2];
505 	unsigned int tp_read;
506 	int ret;
507 	struct rtc_time tm;
508 
509 	ret = regmap_read(info->regmap, SEC_RTC_UDR_CON, &tp_read);
510 	if (ret < 0) {
511 		dev_err(info->dev, "%s: fail to read control reg(%d)\n",
512 			__func__, ret);
513 		return ret;
514 	}
515 
516 	/* Set RTC control register : Binary mode, 24hour mode */
517 	data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
518 	data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
519 
520 	info->rtc_24hr_mode = 1;
521 	ret = regmap_raw_write(info->regmap, SEC_ALARM0_CONF, data, 2);
522 	if (ret < 0) {
523 		dev_err(info->dev, "%s: fail to write controlm reg(%d)\n",
524 			__func__, ret);
525 		return ret;
526 	}
527 
528 	/* In first boot time, Set rtc time to 1/1/2012 00:00:00(SUN) */
529 	if ((tp_read & RTC_TCON_MASK) == 0) {
530 		dev_dbg(info->dev, "rtc init\n");
531 		tm.tm_sec = 0;
532 		tm.tm_min = 0;
533 		tm.tm_hour = 0;
534 		tm.tm_wday = 0;
535 		tm.tm_mday = 1;
536 		tm.tm_mon = 0;
537 		tm.tm_year = 112;
538 		tm.tm_yday = 0;
539 		tm.tm_isdst = 0;
540 		ret = s5m_rtc_set_time(info->dev, &tm);
541 	}
542 
543 	ret = regmap_update_bits(info->regmap, SEC_RTC_UDR_CON,
544 				 RTC_TCON_MASK, tp_read | RTC_TCON_MASK);
545 	if (ret < 0)
546 		dev_err(info->dev, "%s: fail to update TCON reg(%d)\n",
547 			__func__, ret);
548 
549 	return ret;
550 }
551 
552 static int s5m_rtc_probe(struct platform_device *pdev)
553 {
554 	struct sec_pmic_dev *s5m87xx = dev_get_drvdata(pdev->dev.parent);
555 	struct sec_platform_data *pdata = s5m87xx->pdata;
556 	struct s5m_rtc_info *info;
557 	int ret;
558 
559 	if (!pdata) {
560 		dev_err(pdev->dev.parent, "Platform data not supplied\n");
561 		return -ENODEV;
562 	}
563 
564 	info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
565 	if (!info)
566 		return -ENOMEM;
567 
568 	info->dev = &pdev->dev;
569 	info->s5m87xx = s5m87xx;
570 	info->regmap = s5m87xx->regmap_rtc;
571 	info->device_type = s5m87xx->device_type;
572 	info->wtsr_smpl = s5m87xx->wtsr_smpl;
573 
574 	switch (pdata->device_type) {
575 	case S5M8763X:
576 		info->irq = regmap_irq_get_virq(s5m87xx->irq_data,
577 				S5M8763_IRQ_ALARM0);
578 		break;
579 
580 	case S5M8767X:
581 		info->irq = regmap_irq_get_virq(s5m87xx->irq_data,
582 				S5M8767_IRQ_RTCA1);
583 		break;
584 
585 	default:
586 		ret = -EINVAL;
587 		dev_err(&pdev->dev, "Unsupported device type: %d\n", ret);
588 		return ret;
589 	}
590 
591 	platform_set_drvdata(pdev, info);
592 
593 	ret = s5m8767_rtc_init_reg(info);
594 
595 	if (info->wtsr_smpl) {
596 		s5m_rtc_enable_wtsr(info, true);
597 		s5m_rtc_enable_smpl(info, true);
598 	}
599 
600 	device_init_wakeup(&pdev->dev, 1);
601 
602 	info->rtc_dev = devm_rtc_device_register(&pdev->dev, "s5m-rtc",
603 						 &s5m_rtc_ops, THIS_MODULE);
604 
605 	if (IS_ERR(info->rtc_dev))
606 		return PTR_ERR(info->rtc_dev);
607 
608 	ret = devm_request_threaded_irq(&pdev->dev, info->irq, NULL,
609 					s5m_rtc_alarm_irq, 0, "rtc-alarm0",
610 					info);
611 	if (ret < 0)
612 		dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
613 			info->irq, ret);
614 
615 	return ret;
616 }
617 
618 static void s5m_rtc_shutdown(struct platform_device *pdev)
619 {
620 	struct s5m_rtc_info *info = platform_get_drvdata(pdev);
621 	int i;
622 	unsigned int val = 0;
623 	if (info->wtsr_smpl) {
624 		for (i = 0; i < 3; i++) {
625 			s5m_rtc_enable_wtsr(info, false);
626 			regmap_read(info->regmap, SEC_WTSR_SMPL_CNTL, &val);
627 			pr_debug("%s: WTSR_SMPL reg(0x%02x)\n", __func__, val);
628 			if (val & WTSR_ENABLE_MASK)
629 				pr_emerg("%s: fail to disable WTSR\n",
630 					 __func__);
631 			else {
632 				pr_info("%s: success to disable WTSR\n",
633 					__func__);
634 				break;
635 			}
636 		}
637 	}
638 	/* Disable SMPL when power off */
639 	s5m_rtc_enable_smpl(info, false);
640 }
641 
642 static int s5m_rtc_resume(struct device *dev)
643 {
644 	struct s5m_rtc_info *info = dev_get_drvdata(dev);
645 	int ret = 0;
646 
647 	if (device_may_wakeup(dev))
648 		ret = disable_irq_wake(info->irq);
649 
650 	return ret;
651 }
652 
653 static int s5m_rtc_suspend(struct device *dev)
654 {
655 	struct s5m_rtc_info *info = dev_get_drvdata(dev);
656 	int ret = 0;
657 
658 	if (device_may_wakeup(dev))
659 		ret = enable_irq_wake(info->irq);
660 
661 	return ret;
662 }
663 
664 static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume);
665 
666 static const struct platform_device_id s5m_rtc_id[] = {
667 	{ "s5m-rtc", 0 },
668 };
669 
670 static struct platform_driver s5m_rtc_driver = {
671 	.driver		= {
672 		.name	= "s5m-rtc",
673 		.owner	= THIS_MODULE,
674 		.pm	= &s5m_rtc_pm_ops,
675 	},
676 	.probe		= s5m_rtc_probe,
677 	.shutdown	= s5m_rtc_shutdown,
678 	.id_table	= s5m_rtc_id,
679 };
680 
681 module_platform_driver(s5m_rtc_driver);
682 
683 /* Module information */
684 MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
685 MODULE_DESCRIPTION("Samsung S5M RTC driver");
686 MODULE_LICENSE("GPL");
687 MODULE_ALIAS("platform:s5m-rtc");
688