Merge tag 'microblaze-3.19-rc1' of git://git.monstr.eu/linux-2.6-microblaze
[cascardo/linux.git] / drivers / rtc / rtc-max77686.c
1 /*
2  * RTC driver for Maxim MAX77686
3  *
4  * Copyright (C) 2012 Samsung Electronics Co.Ltd
5  *
6  *  based on rtc-max8997.c
7  *
8  *  This program is free software; you can redistribute  it and/or modify it
9  *  under  the terms of  the GNU General  Public License as published by the
10  *  Free Software Foundation;  either version 2 of the  License, or (at your
11  *  option) any later version.
12  *
13  */
14
15 #include <linux/slab.h>
16 #include <linux/rtc.h>
17 #include <linux/delay.h>
18 #include <linux/mutex.h>
19 #include <linux/module.h>
20 #include <linux/platform_device.h>
21 #include <linux/mfd/max77686-private.h>
22 #include <linux/irqdomain.h>
23 #include <linux/regmap.h>
24
25 /* RTC Control Register */
26 #define BCD_EN_SHIFT                    0
27 #define BCD_EN_MASK                     (1 << BCD_EN_SHIFT)
28 #define MODEL24_SHIFT                   1
29 #define MODEL24_MASK                    (1 << MODEL24_SHIFT)
30 /* RTC Update Register1 */
31 #define RTC_UDR_SHIFT                   0
32 #define RTC_UDR_MASK                    (1 << RTC_UDR_SHIFT)
33 #define RTC_RBUDR_SHIFT                 4
34 #define RTC_RBUDR_MASK                  (1 << RTC_RBUDR_SHIFT)
35 /* RTC Hour register */
36 #define HOUR_PM_SHIFT                   6
37 #define HOUR_PM_MASK                    (1 << HOUR_PM_SHIFT)
38 /* RTC Alarm Enable */
39 #define ALARM_ENABLE_SHIFT              7
40 #define ALARM_ENABLE_MASK               (1 << ALARM_ENABLE_SHIFT)
41
42 #define MAX77686_RTC_UPDATE_DELAY       16
43
44 enum {
45         RTC_SEC = 0,
46         RTC_MIN,
47         RTC_HOUR,
48         RTC_WEEKDAY,
49         RTC_MONTH,
50         RTC_YEAR,
51         RTC_DATE,
52         RTC_NR_TIME
53 };
54
55 struct max77686_rtc_info {
56         struct device           *dev;
57         struct max77686_dev     *max77686;
58         struct i2c_client       *rtc;
59         struct rtc_device       *rtc_dev;
60         struct mutex            lock;
61
62         struct regmap           *regmap;
63
64         int virq;
65         int rtc_24hr_mode;
66 };
67
68 enum MAX77686_RTC_OP {
69         MAX77686_RTC_WRITE,
70         MAX77686_RTC_READ,
71 };
72
73 static void max77686_rtc_data_to_tm(u8 *data, struct rtc_time *tm,
74                                    int rtc_24hr_mode)
75 {
76         tm->tm_sec = data[RTC_SEC] & 0x7f;
77         tm->tm_min = data[RTC_MIN] & 0x7f;
78         if (rtc_24hr_mode)
79                 tm->tm_hour = data[RTC_HOUR] & 0x1f;
80         else {
81                 tm->tm_hour = data[RTC_HOUR] & 0x0f;
82                 if (data[RTC_HOUR] & HOUR_PM_MASK)
83                         tm->tm_hour += 12;
84         }
85
86         /* Only a single bit is set in data[], so fls() would be equivalent */
87         tm->tm_wday = ffs(data[RTC_WEEKDAY] & 0x7f) - 1;
88         tm->tm_mday = data[RTC_DATE] & 0x1f;
89         tm->tm_mon = (data[RTC_MONTH] & 0x0f) - 1;
90         tm->tm_year = (data[RTC_YEAR] & 0x7f) + 100;
91         tm->tm_yday = 0;
92         tm->tm_isdst = 0;
93 }
94
95 static int max77686_rtc_tm_to_data(struct rtc_time *tm, u8 *data)
96 {
97         data[RTC_SEC] = tm->tm_sec;
98         data[RTC_MIN] = tm->tm_min;
99         data[RTC_HOUR] = tm->tm_hour;
100         data[RTC_WEEKDAY] = 1 << tm->tm_wday;
101         data[RTC_DATE] = tm->tm_mday;
102         data[RTC_MONTH] = tm->tm_mon + 1;
103         data[RTC_YEAR] = tm->tm_year > 100 ? (tm->tm_year - 100) : 0;
104
105         if (tm->tm_year < 100) {
106                 pr_warn("%s: MAX77686 RTC cannot handle the year %d."
107                         "Assume it's 2000.\n", __func__, 1900 + tm->tm_year);
108                 return -EINVAL;
109         }
110         return 0;
111 }
112
113 static int max77686_rtc_update(struct max77686_rtc_info *info,
114         enum MAX77686_RTC_OP op)
115 {
116         int ret;
117         unsigned int data;
118
119         if (op == MAX77686_RTC_WRITE)
120                 data = 1 << RTC_UDR_SHIFT;
121         else
122                 data = 1 << RTC_RBUDR_SHIFT;
123
124         ret = regmap_update_bits(info->max77686->rtc_regmap,
125                                  MAX77686_RTC_UPDATE0, data, data);
126         if (ret < 0)
127                 dev_err(info->dev, "%s: fail to write update reg(ret=%d, data=0x%x)\n",
128                                 __func__, ret, data);
129         else {
130                 /* Minimum 16ms delay required before RTC update. */
131                 msleep(MAX77686_RTC_UPDATE_DELAY);
132         }
133
134         return ret;
135 }
136
137 static int max77686_rtc_read_time(struct device *dev, struct rtc_time *tm)
138 {
139         struct max77686_rtc_info *info = dev_get_drvdata(dev);
140         u8 data[RTC_NR_TIME];
141         int ret;
142
143         mutex_lock(&info->lock);
144
145         ret = max77686_rtc_update(info, MAX77686_RTC_READ);
146         if (ret < 0)
147                 goto out;
148
149         ret = regmap_bulk_read(info->max77686->rtc_regmap,
150                                 MAX77686_RTC_SEC, data, RTC_NR_TIME);
151         if (ret < 0) {
152                 dev_err(info->dev, "%s: fail to read time reg(%d)\n", __func__, ret);
153                 goto out;
154         }
155
156         max77686_rtc_data_to_tm(data, tm, info->rtc_24hr_mode);
157
158         ret = rtc_valid_tm(tm);
159
160 out:
161         mutex_unlock(&info->lock);
162         return ret;
163 }
164
165 static int max77686_rtc_set_time(struct device *dev, struct rtc_time *tm)
166 {
167         struct max77686_rtc_info *info = dev_get_drvdata(dev);
168         u8 data[RTC_NR_TIME];
169         int ret;
170
171         ret = max77686_rtc_tm_to_data(tm, data);
172         if (ret < 0)
173                 return ret;
174
175         mutex_lock(&info->lock);
176
177         ret = regmap_bulk_write(info->max77686->rtc_regmap,
178                                  MAX77686_RTC_SEC, data, RTC_NR_TIME);
179         if (ret < 0) {
180                 dev_err(info->dev, "%s: fail to write time reg(%d)\n", __func__,
181                                 ret);
182                 goto out;
183         }
184
185         ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
186
187 out:
188         mutex_unlock(&info->lock);
189         return ret;
190 }
191
192 static int max77686_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
193 {
194         struct max77686_rtc_info *info = dev_get_drvdata(dev);
195         u8 data[RTC_NR_TIME];
196         unsigned int val;
197         int i, ret;
198
199         mutex_lock(&info->lock);
200
201         ret = max77686_rtc_update(info, MAX77686_RTC_READ);
202         if (ret < 0)
203                 goto out;
204
205         ret = regmap_bulk_read(info->max77686->rtc_regmap,
206                                  MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
207         if (ret < 0) {
208                 dev_err(info->dev, "%s:%d fail to read alarm reg(%d)\n",
209                                 __func__, __LINE__, ret);
210                 goto out;
211         }
212
213         max77686_rtc_data_to_tm(data, &alrm->time, info->rtc_24hr_mode);
214
215         alrm->enabled = 0;
216         for (i = 0; i < RTC_NR_TIME; i++) {
217                 if (data[i] & ALARM_ENABLE_MASK) {
218                         alrm->enabled = 1;
219                         break;
220                 }
221         }
222
223         alrm->pending = 0;
224         ret = regmap_read(info->max77686->regmap, MAX77686_REG_STATUS2, &val);
225         if (ret < 0) {
226                 dev_err(info->dev, "%s:%d fail to read status2 reg(%d)\n",
227                                 __func__, __LINE__, ret);
228                 goto out;
229         }
230
231         if (val & (1 << 4)) /* RTCA1 */
232                 alrm->pending = 1;
233
234 out:
235         mutex_unlock(&info->lock);
236         return 0;
237 }
238
239 static int max77686_rtc_stop_alarm(struct max77686_rtc_info *info)
240 {
241         u8 data[RTC_NR_TIME];
242         int ret, i;
243         struct rtc_time tm;
244
245         if (!mutex_is_locked(&info->lock))
246                 dev_warn(info->dev, "%s: should have mutex locked\n", __func__);
247
248         ret = max77686_rtc_update(info, MAX77686_RTC_READ);
249         if (ret < 0)
250                 goto out;
251
252         ret = regmap_bulk_read(info->max77686->rtc_regmap,
253                                  MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
254         if (ret < 0) {
255                 dev_err(info->dev, "%s: fail to read alarm reg(%d)\n",
256                                 __func__, ret);
257                 goto out;
258         }
259
260         max77686_rtc_data_to_tm(data, &tm, info->rtc_24hr_mode);
261
262         for (i = 0; i < RTC_NR_TIME; i++)
263                 data[i] &= ~ALARM_ENABLE_MASK;
264
265         ret = regmap_bulk_write(info->max77686->rtc_regmap,
266                                  MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
267         if (ret < 0) {
268                 dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
269                                 __func__, ret);
270                 goto out;
271         }
272
273         ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
274 out:
275         return ret;
276 }
277
278 static int max77686_rtc_start_alarm(struct max77686_rtc_info *info)
279 {
280         u8 data[RTC_NR_TIME];
281         int ret;
282         struct rtc_time tm;
283
284         if (!mutex_is_locked(&info->lock))
285                 dev_warn(info->dev, "%s: should have mutex locked\n", __func__);
286
287         ret = max77686_rtc_update(info, MAX77686_RTC_READ);
288         if (ret < 0)
289                 goto out;
290
291         ret = regmap_bulk_read(info->max77686->rtc_regmap,
292                                  MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
293         if (ret < 0) {
294                 dev_err(info->dev, "%s: fail to read alarm reg(%d)\n",
295                                 __func__, ret);
296                 goto out;
297         }
298
299         max77686_rtc_data_to_tm(data, &tm, info->rtc_24hr_mode);
300
301         data[RTC_SEC] |= (1 << ALARM_ENABLE_SHIFT);
302         data[RTC_MIN] |= (1 << ALARM_ENABLE_SHIFT);
303         data[RTC_HOUR] |= (1 << ALARM_ENABLE_SHIFT);
304         data[RTC_WEEKDAY] &= ~ALARM_ENABLE_MASK;
305         if (data[RTC_MONTH] & 0xf)
306                 data[RTC_MONTH] |= (1 << ALARM_ENABLE_SHIFT);
307         if (data[RTC_YEAR] & 0x7f)
308                 data[RTC_YEAR] |= (1 << ALARM_ENABLE_SHIFT);
309         if (data[RTC_DATE] & 0x1f)
310                 data[RTC_DATE] |= (1 << ALARM_ENABLE_SHIFT);
311
312         ret = regmap_bulk_write(info->max77686->rtc_regmap,
313                                  MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
314         if (ret < 0) {
315                 dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
316                                 __func__, ret);
317                 goto out;
318         }
319
320         ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
321 out:
322         return ret;
323 }
324
325 static int max77686_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
326 {
327         struct max77686_rtc_info *info = dev_get_drvdata(dev);
328         u8 data[RTC_NR_TIME];
329         int ret;
330
331         ret = max77686_rtc_tm_to_data(&alrm->time, data);
332         if (ret < 0)
333                 return ret;
334
335         mutex_lock(&info->lock);
336
337         ret = max77686_rtc_stop_alarm(info);
338         if (ret < 0)
339                 goto out;
340
341         ret = regmap_bulk_write(info->max77686->rtc_regmap,
342                                  MAX77686_ALARM1_SEC, data, RTC_NR_TIME);
343
344         if (ret < 0) {
345                 dev_err(info->dev, "%s: fail to write alarm reg(%d)\n",
346                                 __func__, ret);
347                 goto out;
348         }
349
350         ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
351         if (ret < 0)
352                 goto out;
353
354         if (alrm->enabled)
355                 ret = max77686_rtc_start_alarm(info);
356 out:
357         mutex_unlock(&info->lock);
358         return ret;
359 }
360
361 static int max77686_rtc_alarm_irq_enable(struct device *dev,
362                                         unsigned int enabled)
363 {
364         struct max77686_rtc_info *info = dev_get_drvdata(dev);
365         int ret;
366
367         mutex_lock(&info->lock);
368         if (enabled)
369                 ret = max77686_rtc_start_alarm(info);
370         else
371                 ret = max77686_rtc_stop_alarm(info);
372         mutex_unlock(&info->lock);
373
374         return ret;
375 }
376
377 static irqreturn_t max77686_rtc_alarm_irq(int irq, void *data)
378 {
379         struct max77686_rtc_info *info = data;
380
381         dev_info(info->dev, "%s:irq(%d)\n", __func__, irq);
382
383         rtc_update_irq(info->rtc_dev, 1, RTC_IRQF | RTC_AF);
384
385         return IRQ_HANDLED;
386 }
387
388 static const struct rtc_class_ops max77686_rtc_ops = {
389         .read_time = max77686_rtc_read_time,
390         .set_time = max77686_rtc_set_time,
391         .read_alarm = max77686_rtc_read_alarm,
392         .set_alarm = max77686_rtc_set_alarm,
393         .alarm_irq_enable = max77686_rtc_alarm_irq_enable,
394 };
395
396 static int max77686_rtc_init_reg(struct max77686_rtc_info *info)
397 {
398         u8 data[2];
399         int ret;
400
401         /* Set RTC control register : Binary mode, 24hour mdoe */
402         data[0] = (1 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
403         data[1] = (0 << BCD_EN_SHIFT) | (1 << MODEL24_SHIFT);
404
405         info->rtc_24hr_mode = 1;
406
407         ret = regmap_bulk_write(info->max77686->rtc_regmap, MAX77686_RTC_CONTROLM, data, 2);
408         if (ret < 0) {
409                 dev_err(info->dev, "%s: fail to write controlm reg(%d)\n",
410                                 __func__, ret);
411                 return ret;
412         }
413
414         ret = max77686_rtc_update(info, MAX77686_RTC_WRITE);
415         return ret;
416 }
417
418 static int max77686_rtc_probe(struct platform_device *pdev)
419 {
420         struct max77686_dev *max77686 = dev_get_drvdata(pdev->dev.parent);
421         struct max77686_rtc_info *info;
422         int ret;
423
424         dev_info(&pdev->dev, "%s\n", __func__);
425
426         info = devm_kzalloc(&pdev->dev, sizeof(struct max77686_rtc_info),
427                                 GFP_KERNEL);
428         if (!info)
429                 return -ENOMEM;
430
431         mutex_init(&info->lock);
432         info->dev = &pdev->dev;
433         info->max77686 = max77686;
434         info->rtc = max77686->rtc;
435
436         platform_set_drvdata(pdev, info);
437
438         ret = max77686_rtc_init_reg(info);
439
440         if (ret < 0) {
441                 dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret);
442                 goto err_rtc;
443         }
444
445         device_init_wakeup(&pdev->dev, 1);
446
447         info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max77686-rtc",
448                                         &max77686_rtc_ops, THIS_MODULE);
449
450         if (IS_ERR(info->rtc_dev)) {
451                 ret = PTR_ERR(info->rtc_dev);
452                 dev_err(&pdev->dev, "Failed to register RTC device: %d\n", ret);
453                 if (ret == 0)
454                         ret = -EINVAL;
455                 goto err_rtc;
456         }
457
458         if (!max77686->rtc_irq_data) {
459                 ret = -EINVAL;
460                 dev_err(&pdev->dev, "%s: no RTC regmap IRQ chip\n", __func__);
461                 goto err_rtc;
462         }
463
464         info->virq = regmap_irq_get_virq(max77686->rtc_irq_data,
465                                          MAX77686_RTCIRQ_RTCA1);
466         if (!info->virq) {
467                 ret = -ENXIO;
468                 goto err_rtc;
469         }
470
471         ret = devm_request_threaded_irq(&pdev->dev, info->virq, NULL,
472                                 max77686_rtc_alarm_irq, 0, "rtc-alarm1", info);
473         if (ret < 0)
474                 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
475                         info->virq, ret);
476
477 err_rtc:
478         return ret;
479 }
480
481 #ifdef CONFIG_PM_SLEEP
482 static int max77686_rtc_suspend(struct device *dev)
483 {
484         if (device_may_wakeup(dev)) {
485                 struct max77686_rtc_info *info = dev_get_drvdata(dev);
486
487                 return enable_irq_wake(info->virq);
488         }
489
490         return 0;
491 }
492
493 static int max77686_rtc_resume(struct device *dev)
494 {
495         if (device_may_wakeup(dev)) {
496                 struct max77686_rtc_info *info = dev_get_drvdata(dev);
497
498                 return disable_irq_wake(info->virq);
499         }
500
501         return 0;
502 }
503 #endif
504
505 static SIMPLE_DEV_PM_OPS(max77686_rtc_pm_ops,
506                          max77686_rtc_suspend, max77686_rtc_resume);
507
508 static const struct platform_device_id rtc_id[] = {
509         { "max77686-rtc", 0 },
510         {},
511 };
512
513 static struct platform_driver max77686_rtc_driver = {
514         .driver         = {
515                 .name   = "max77686-rtc",
516                 .pm     = &max77686_rtc_pm_ops,
517         },
518         .probe          = max77686_rtc_probe,
519         .id_table       = rtc_id,
520 };
521
522 module_platform_driver(max77686_rtc_driver);
523
524 MODULE_DESCRIPTION("Maxim MAX77686 RTC driver");
525 MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>");
526 MODULE_LICENSE("GPL");