rtc: max77663: Use alrm->enabled flag to enable rtc alarm irq
[linux-2.6.git] / drivers / rtc / rtc-max77663.c
1 /*
2  * drivers/rtc/rtc-max77663.c
3  * Max77663 RTC driver
4  *
5  * Copyright 2011 Maxim Integrated Products, Inc.
6  * Copyright (C) 2011 NVIDIA Corporation
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License as
10  * published by the Free Software Foundation; either version 2 of the
11  * License, or (at your option) any later version.
12  *
13  */
14 #include <linux/module.h>
15 #include <linux/platform_device.h>
16 #include <linux/slab.h>
17 #include <linux/delay.h>
18 #include <linux/i2c.h>
19 #include <linux/rtc.h>
20 #include <linux/mfd/max77663-core.h>
21
22 /* RTC Registers */
23 #define MAX77663_RTC_IRQ                0x00
24 #define MAX77663_RTC_IRQ_MASK           0x01
25 #define MAX77663_RTC_CTRL_MODE          0x02
26 #define MAX77663_RTC_CTRL               0x03
27 #define MAX77663_RTC_UPDATE0            0x04
28 #define MAX77663_RTC_UPDATE1            0x05
29 #define MAX77663_RTC_SEC                0x07
30 #define MAX77663_RTC_MIN                0x08
31 #define MAX77663_RTC_HOUR               0x09
32 #define MAX77663_RTC_WEEKDAY            0x0A
33 #define MAX77663_RTC_MONTH              0x0B
34 #define MAX77663_RTC_YEAR               0x0C
35 #define MAX77663_RTC_MONTHDAY           0x0D
36 #define MAX77663_RTC_ALARM_SEC1         0x0E
37 #define MAX77663_RTC_ALARM_MIN1         0x0F
38 #define MAX77663_RTC_ALARM_HOUR1        0x10
39 #define MAX77663_RTC_ALARM_WEEKDAY1     0x11
40 #define MAX77663_RTC_ALARM_MONTH1       0x12
41 #define MAX77663_RTC_ALARM_YEAR1        0x13
42 #define MAX77663_RTC_ALARM_MONTHDAY1    0x14
43
44 #define RTC_IRQ_60SEC_MASK              (1 << 0)
45 #define RTC_IRQ_ALARM1_MASK             (1 << 1)
46 #define RTC_IRQ_ALARM2_MASK             (1 << 2)
47 #define RTC_IRQ_SMPL_MASK               (1 << 3)
48 #define RTC_IRQ_1SEC_MASK               (1 << 4)
49 #define RTC_IRQ_MASK                    0x1F
50
51 #define BCD_MODE_MASK                   (1 << 0)
52 #define HR_MODE_MASK                    (1 << 1)
53
54 #define WB_UPDATE_MASK                  (1 << 0)
55 #define FLAG_AUTO_CLEAR_MASK            (1 << 1)
56 #define FREEZE_SEC_MASK                 (1 << 2)
57 #define RTC_WAKE_MASK                   (1 << 3)
58 #define RB_UPDATE_MASK                  (1 << 4)
59
60 #define WB_UPDATE_FLAG_MASK             (1 << 0)
61 #define RB_UPDATE_FLAG_MASK             (1 << 1)
62
63 #define SEC_MASK                        0x7F
64 #define MIN_MASK                        0x7F
65 #define HOUR_MASK                       0x3F
66 #define WEEKDAY_MASK                    0x7F
67 #define MONTH_MASK                      0x1F
68 #define YEAR_MASK                       0xFF
69 #define MONTHDAY_MASK                   0x3F
70
71 #define ALARM_EN_MASK                   0x80
72 #define ALARM_EN_SHIFT                  7
73
74 #define RTC_YEAR_BASE                   100
75 #define RTC_YEAR_MAX                    99
76
77 /* ON/OFF Registers */
78 #define MAX77663_REG_ONOFF_CFG2         0x42
79
80 #define ONOFF_WK_ALARM1_MASK            (1 << 2)
81
82 enum {
83         RTC_SEC,
84         RTC_MIN,
85         RTC_HOUR,
86         RTC_WEEKDAY,
87         RTC_MONTH,
88         RTC_YEAR,
89         RTC_MONTHDAY,
90         RTC_NR
91 };
92
93 struct max77663_rtc {
94         struct rtc_device *rtc;
95         struct device *dev;
96
97         struct mutex io_lock;
98         int irq;
99         u8 irq_mask;
100 };
101
102 static inline struct device *_to_parent(struct max77663_rtc *rtc)
103 {
104         return rtc->dev->parent;
105 }
106
107 static inline int max77663_rtc_update_buffer(struct max77663_rtc *rtc,
108                                              int write)
109 {
110         struct device *parent = _to_parent(rtc);
111         u8 val =  FLAG_AUTO_CLEAR_MASK | RTC_WAKE_MASK;
112         int ret;
113
114         if (write)
115                 val |= WB_UPDATE_MASK;
116         else
117                 val |= RB_UPDATE_MASK;
118
119         dev_dbg(rtc->dev, "rtc_update_buffer: write=%d, addr=0x%x, val=0x%x\n",
120                 write, MAX77663_RTC_UPDATE0, val);
121         ret = max77663_write(parent, MAX77663_RTC_UPDATE0, &val, 1, 1);
122         if (ret < 0) {
123                 dev_err(rtc->dev, "rtc_update_buffer: "
124                         "Failed to get rtc update0\n");
125                 return ret;
126         }
127
128         /*
129          * Must wait 14ms for buffer update.
130          * If the sleeping time is 10us - 20ms, usleep_range() is recommended.
131          * Please refer Documentation/timers/timers-howto.txt.
132          */
133         usleep_range(14000, 14000);
134
135         return 0;
136 }
137
138 static inline int max77663_rtc_write(struct max77663_rtc *rtc, u8 addr,
139                                      void *values, u32 len, int update_buffer)
140 {
141         struct device *parent = _to_parent(rtc);
142         int ret;
143
144         mutex_lock(&rtc->io_lock);
145
146         dev_dbg(rtc->dev, "rtc_write: addr=0x%x, values=0x%x, len=%u, "
147                 "update_buffer=%d\n",
148                 addr, *((u8 *)values), len, update_buffer);
149         ret = max77663_write(parent, addr, values, len, 1);
150         if (ret < 0)
151                 goto out;
152
153         if (update_buffer)
154                 ret = max77663_rtc_update_buffer(rtc, 1);
155
156 out:
157         mutex_unlock(&rtc->io_lock);
158         return ret;
159 }
160
161 static inline int max77663_rtc_read(struct max77663_rtc *rtc, u8 addr,
162                                     void *values, u32 len, int update_buffer)
163 {
164         struct device *parent = _to_parent(rtc);
165         int ret;
166
167         mutex_lock(&rtc->io_lock);
168
169         if (update_buffer) {
170                 ret = max77663_rtc_update_buffer(rtc, 0);
171                 if (ret < 0)
172                         goto out;
173         }
174
175         ret = max77663_read(parent, addr, values, len, 1);
176         dev_dbg(rtc->dev, "rtc_read: addr=0x%x, values=0x%x, len=%u, "
177                 "update_buffer=%d\n",
178                 addr, *((u8 *)values), len, update_buffer);
179
180 out:
181         mutex_unlock(&rtc->io_lock);
182         return ret;
183 }
184
185 static inline int max77663_rtc_reg_to_tm(struct max77663_rtc *rtc, u8 *buf,
186                                          struct rtc_time *tm)
187 {
188         int wday = buf[RTC_WEEKDAY] & WEEKDAY_MASK;
189
190         if (unlikely(!wday)) {
191                 dev_err(rtc->dev,
192                         "rtc_reg_to_tm: Invalid day of week, %d\n", wday);
193                 return -EINVAL;
194         }
195
196         tm->tm_sec = (int)(buf[RTC_SEC] & SEC_MASK);
197         tm->tm_min = (int)(buf[RTC_MIN] & MIN_MASK);
198         tm->tm_hour = (int)(buf[RTC_HOUR] & HOUR_MASK);
199         tm->tm_mday = (int)(buf[RTC_MONTHDAY] & MONTHDAY_MASK);
200         tm->tm_mon = (int)(buf[RTC_MONTH] & MONTH_MASK) - 1;
201         tm->tm_year = (int)(buf[RTC_YEAR] & YEAR_MASK) + RTC_YEAR_BASE;
202         tm->tm_wday = ffs(wday) - 1;
203
204         return 0;
205 }
206
207 static inline int max77663_rtc_tm_to_reg(struct max77663_rtc *rtc, u8 *buf,
208                                          struct rtc_time *tm, int alarm)
209 {
210         u8 alarm_mask = alarm ? ALARM_EN_MASK : 0;
211
212         if (unlikely((tm->tm_year < RTC_YEAR_BASE) ||
213                         (tm->tm_year > RTC_YEAR_BASE + RTC_YEAR_MAX))) {
214                 dev_err(rtc->dev,
215                         "rtc_tm_to_reg: Invalid year, %d\n", tm->tm_year);
216                 return -EINVAL;
217         }
218
219         buf[RTC_SEC] = tm->tm_sec | alarm_mask;
220         buf[RTC_MIN] = tm->tm_min | alarm_mask;
221         buf[RTC_HOUR] = tm->tm_hour | alarm_mask;
222         buf[RTC_MONTHDAY] = tm->tm_mday | alarm_mask;
223         buf[RTC_MONTH] = (tm->tm_mon + 1) | alarm_mask;
224         buf[RTC_YEAR] = (tm->tm_year - RTC_YEAR_BASE) | alarm_mask;
225
226         /* The wday is configured only when disabled alarm. */
227         if (!alarm)
228                 buf[RTC_WEEKDAY] = (1 << tm->tm_wday);
229         else
230                 buf[RTC_WEEKDAY] = 0;
231
232         return 0;
233 }
234
235 static inline int max77663_rtc_irq_mask(struct max77663_rtc *rtc, u8 irq)
236 {
237         struct device *parent = _to_parent(rtc);
238         u8 irq_mask = rtc->irq_mask | irq;
239         int ret = 0;
240
241         ret = max77663_write(parent, MAX77663_RTC_IRQ_MASK, &irq_mask, 1, 1);
242         if (ret < 0) {
243                 dev_err(rtc->dev, "rtc_irq_mask: Failed to set rtc irq mask\n");
244                 goto out;
245         }
246         rtc->irq_mask = irq_mask;
247
248 out:
249         return ret;
250 }
251
252 static inline int max77663_rtc_irq_unmask(struct max77663_rtc *rtc, u8 irq)
253 {
254         struct device *parent = _to_parent(rtc);
255         u8 irq_mask = rtc->irq_mask & ~irq;
256         int ret = 0;
257
258         ret = max77663_write(parent, MAX77663_RTC_IRQ_MASK, &irq_mask, 1, 1);
259         if (ret < 0) {
260                 dev_err(rtc->dev,
261                         "rtc_irq_unmask: Failed to set rtc irq mask\n");
262                 goto out;
263         }
264         rtc->irq_mask = irq_mask;
265
266 out:
267         return ret;
268 }
269
270 static inline int max77663_rtc_do_irq(struct max77663_rtc *rtc)
271 {
272         struct device *parent = _to_parent(rtc);
273         u8 irq_status;
274         int ret;
275
276         ret = max77663_rtc_update_buffer(rtc, 0);
277         if (ret < 0) {
278                 dev_err(rtc->dev, "rtc_irq: Failed to get rtc update buffer\n");
279                 return ret;
280         }
281
282         ret = max77663_read(parent, MAX77663_RTC_IRQ, &irq_status, 1, 1);
283         if (ret < 0) {
284                 dev_err(rtc->dev, "rtc_irq: Failed to get rtc irq status\n");
285                 return ret;
286         }
287
288         dev_dbg(rtc->dev, "rtc_do_irq: irq_mask=0x%02x, irq_status=0x%02x\n",
289                 rtc->irq_mask, irq_status);
290
291         if (!(rtc->irq_mask & RTC_IRQ_ALARM1_MASK) &&
292                         (irq_status & RTC_IRQ_ALARM1_MASK))
293                 rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_AF);
294
295         if (!(rtc->irq_mask & RTC_IRQ_1SEC_MASK) &&
296                         (irq_status & RTC_IRQ_1SEC_MASK))
297                 rtc_update_irq(rtc->rtc, 1, RTC_IRQF | RTC_UF);
298
299         return ret;
300 }
301
302 static irqreturn_t max77663_rtc_irq(int irq, void *data)
303 {
304         struct max77663_rtc *rtc = (struct max77663_rtc *)data;
305
306         max77663_rtc_do_irq(rtc);
307
308         return IRQ_HANDLED;
309 }
310
311 static int max77663_rtc_alarm_irq_enable(struct device *dev,
312                                          unsigned int enabled)
313 {
314         struct max77663_rtc *rtc = dev_get_drvdata(dev);
315         int ret = 0;
316
317         if (rtc->irq < 0)
318                 return -ENXIO;
319
320         mutex_lock(&rtc->io_lock);
321
322         /* Handle pending interrupt */
323         ret = max77663_rtc_do_irq(rtc);
324         if (ret < 0)
325                 goto out;
326
327         /* Config alarm interrupt */
328         if (enabled) {
329                 ret = max77663_rtc_irq_unmask(rtc, RTC_IRQ_ALARM1_MASK);
330                 if (ret < 0)
331                         goto out;
332         } else {
333                 ret = max77663_rtc_irq_mask(rtc, RTC_IRQ_ALARM1_MASK);
334                 if (ret < 0)
335                         goto out;
336         }
337 out:
338         mutex_unlock(&rtc->io_lock);
339         return ret;
340 }
341
342 static int max77663_rtc_read_time(struct device *dev, struct rtc_time *tm)
343 {
344         struct max77663_rtc *rtc = dev_get_drvdata(dev);
345         u8 buf[RTC_NR];
346         int ret;
347
348         ret = max77663_rtc_read(rtc, MAX77663_RTC_SEC, buf, sizeof(buf), 1);
349         if (ret < 0) {
350                 dev_err(rtc->dev, "rtc_read_time: Failed to read rtc time\n");
351                 return ret;
352         }
353
354         dev_dbg(rtc->dev, "rtc_read_time: "
355                 "buf: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
356                 buf[RTC_SEC], buf[RTC_MIN], buf[RTC_HOUR], buf[RTC_WEEKDAY],
357                 buf[RTC_MONTH], buf[RTC_YEAR], buf[RTC_MONTHDAY]);
358
359         ret = max77663_rtc_reg_to_tm(rtc, buf, tm);
360         if (ret < 0) {
361                 dev_err(rtc->dev, "rtc_read_time: "
362                         "Failed to convert register format into time format\n");
363                 return ret;
364         }
365
366         dev_dbg(rtc->dev, "rtc_read_time: "
367                 "tm: %d-%02d-%02d %02d:%02d:%02d, wday=%d\n",
368                 tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min,
369                 tm->tm_sec, tm->tm_wday);
370
371         return ret;
372 }
373
374 static int max77663_rtc_set_time(struct device *dev, struct rtc_time *tm)
375 {
376         struct max77663_rtc *rtc = dev_get_drvdata(dev);
377         u8 buf[RTC_NR];
378         int ret;
379
380         dev_dbg(rtc->dev, "rtc_set_time: "
381                 "tm: %d-%02d-%02d %02d:%02d:%02d, wday=%d\n",
382                 tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min,
383                 tm->tm_sec, tm->tm_wday);
384
385         ret = max77663_rtc_tm_to_reg(rtc, buf, tm, 0);
386         if (ret < 0) {
387                 dev_err(rtc->dev, "rtc_set_time: "
388                         "Failed to convert time format into register format\n");
389                 return ret;
390         }
391
392         dev_dbg(rtc->dev, "rtc_set_time: "
393                 "buf: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
394                 buf[RTC_SEC], buf[RTC_MIN], buf[RTC_HOUR], buf[RTC_WEEKDAY],
395                 buf[RTC_MONTH], buf[RTC_YEAR], buf[RTC_MONTHDAY]);
396
397         return max77663_rtc_write(rtc, MAX77663_RTC_SEC, buf, sizeof(buf), 1);
398 }
399
400 static int max77663_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
401 {
402         struct max77663_rtc *rtc = dev_get_drvdata(dev);
403         u8 buf[RTC_NR];
404         int ret;
405
406         ret = max77663_rtc_read(rtc, MAX77663_RTC_ALARM_SEC1, buf, sizeof(buf),
407                                 1);
408         if (ret < 0) {
409                 dev_err(rtc->dev,
410                         "rtc_read_alarm: Failed to read rtc alarm time\n");
411                 return ret;
412         }
413
414         dev_dbg(rtc->dev, "rtc_read_alarm: "
415                 "buf: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
416                 buf[RTC_SEC], buf[RTC_MIN], buf[RTC_HOUR], buf[RTC_WEEKDAY],
417                 buf[RTC_MONTH], buf[RTC_YEAR], buf[RTC_MONTHDAY]);
418
419         ret = max77663_rtc_reg_to_tm(rtc, buf, &alrm->time);
420         if (ret < 0) {
421                 dev_err(rtc->dev, "rtc_read_alarm: "
422                         "Failed to convert register format into time format\n");
423                 return ret;
424         }
425
426         dev_dbg(rtc->dev, "rtc_read_alarm: "
427                 "tm: %d-%02d-%02d %02d:%02d:%02d, wday=%d\n",
428                 alrm->time.tm_year, alrm->time.tm_mon, alrm->time.tm_mday,
429                 alrm->time.tm_hour, alrm->time.tm_min, alrm->time.tm_sec,
430                 alrm->time.tm_wday);
431
432         if (rtc->irq_mask & RTC_IRQ_ALARM1_MASK)
433                 alrm->enabled = 1;
434         else
435                 alrm->enabled = 0;
436
437         return 0;
438 }
439
440 static int max77663_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
441 {
442         struct max77663_rtc *rtc = dev_get_drvdata(dev);
443         u8 buf[RTC_NR];
444         int ret;
445
446         dev_dbg(rtc->dev, "rtc_set_alarm: "
447                 "tm: %d-%02d-%02d %02d:%02d:%02d, wday=%d [%s]\n",
448                 alrm->time.tm_year, alrm->time.tm_mon, alrm->time.tm_mday,
449                 alrm->time.tm_hour, alrm->time.tm_min, alrm->time.tm_sec,
450                 alrm->time.tm_wday, alrm->enabled?"enable":"disable");
451
452         ret = max77663_rtc_tm_to_reg(rtc, buf, &alrm->time, 1);
453         if (ret < 0) {
454                 dev_err(rtc->dev, "rtc_set_alarm: "
455                         "Failed to convert time format into register format\n");
456                 return ret;
457         }
458
459         dev_dbg(rtc->dev, "rtc_set_alarm: "
460                 "buf: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n",
461                 buf[RTC_SEC], buf[RTC_MIN], buf[RTC_HOUR], buf[RTC_WEEKDAY],
462                 buf[RTC_MONTH], buf[RTC_YEAR], buf[RTC_MONTHDAY]);
463
464         ret = max77663_rtc_write(rtc, MAX77663_RTC_ALARM_SEC1, buf, sizeof(buf),
465                                  1);
466         if (ret < 0) {
467                 dev_err(rtc->dev,
468                         "rtc_set_alarm: Failed to write rtc alarm time\n");
469                 return ret;
470         }
471
472         ret = max77663_rtc_alarm_irq_enable(dev, alrm->enabled);
473         if (ret < 0) {
474                 dev_err(rtc->dev,
475                         "rtc_set_alarm: Failed to enable rtc alarm\n");
476                 return ret;
477         }
478
479         return ret;
480 }
481
482 static const struct rtc_class_ops max77663_rtc_ops = {
483         .read_time = max77663_rtc_read_time,
484         .set_time = max77663_rtc_set_time,
485         .read_alarm = max77663_rtc_read_alarm,
486         .set_alarm = max77663_rtc_set_alarm,
487         .alarm_irq_enable = max77663_rtc_alarm_irq_enable,
488 };
489
490 static int max77663_rtc_preinit(struct max77663_rtc *rtc)
491 {
492         struct device *parent = _to_parent(rtc);
493         u8 val;
494         int ret;
495
496         /* Mask all interrupts */
497         rtc->irq_mask = 0xFF;
498         ret = max77663_rtc_write(rtc, MAX77663_RTC_IRQ_MASK, &rtc->irq_mask, 1,
499                                  0);
500         if (ret < 0) {
501                 dev_err(rtc->dev, "preinit: Failed to set rtc irq mask\n");
502                 return ret;
503         }
504
505         /* Configure Binary mode and 24hour mode */
506         val = HR_MODE_MASK;
507         ret = max77663_rtc_write(rtc, MAX77663_RTC_CTRL, &val, 1, 0);
508         if (ret < 0) {
509                 dev_err(rtc->dev, "preinit: Failed to set rtc control\n");
510                 return ret;
511         }
512
513         /* It should be disabled alarm wakeup to wakeup from sleep
514          * by EN1 input signal */
515         ret = max77663_set_bits(parent, MAX77663_REG_ONOFF_CFG2,
516                                 ONOFF_WK_ALARM1_MASK, 0, 0);
517         if (ret < 0) {
518                 dev_err(rtc->dev, "preinit: Failed to set onoff cfg2\n");
519                 return ret;
520         }
521
522         return 0;
523 }
524
525 static int max77663_rtc_probe(struct platform_device *pdev)
526 {
527         struct max77663_platform_data *parent_pdata =
528                                                 pdev->dev.parent->platform_data;
529         static struct max77663_rtc *rtc;
530         int ret = 0;
531
532         rtc = kzalloc(sizeof(struct max77663_rtc), GFP_KERNEL);
533         if (!rtc) {
534                 dev_err(&pdev->dev, "probe: kzalloc() failed\n");
535                 return -ENOMEM;
536         }
537
538         dev_set_drvdata(&pdev->dev, rtc);
539         rtc->dev = &pdev->dev;
540         mutex_init(&rtc->io_lock);
541
542         ret = max77663_rtc_preinit(rtc);
543         if (ret) {
544                 dev_err(&pdev->dev, "probe: Failed to rtc preinit\n");
545                 goto out_kfree;
546         }
547
548         rtc->rtc = rtc_device_register("max77663-rtc", &pdev->dev,
549                                        &max77663_rtc_ops, THIS_MODULE);
550         if (IS_ERR_OR_NULL(rtc->rtc)) {
551                 dev_err(&pdev->dev, "probe: Failed to register rtc\n");
552                 ret = PTR_ERR(rtc->rtc);
553                 goto out_kfree;
554         }
555
556         if (parent_pdata->irq_base < 0)
557                 goto out;
558
559         rtc->irq = parent_pdata->irq_base + MAX77663_IRQ_RTC;
560         ret = request_threaded_irq(rtc->irq, NULL, max77663_rtc_irq,
561                                    IRQF_ONESHOT, "max77663-rtc", rtc);
562         if (ret < 0) {
563                 dev_err(rtc->dev, "probe: Failed to request irq %d\n",
564                         rtc->irq);
565                 rtc->irq = -1;
566         } else {
567                 device_init_wakeup(rtc->dev, 1);
568                 enable_irq_wake(rtc->irq);
569         }
570
571         return 0;
572
573 out_kfree:
574         mutex_destroy(&rtc->io_lock);
575         kfree(rtc->rtc);
576 out:
577         return ret;
578 }
579
580 static int __devexit max77663_rtc_remove(struct platform_device *pdev)
581 {
582         struct max77663_rtc *rtc = dev_get_drvdata(&pdev->dev);
583
584         if (rtc->irq != -1)
585                 free_irq(rtc->irq, rtc);
586
587         rtc_device_unregister(rtc->rtc);
588         mutex_destroy(&rtc->io_lock);
589         kfree(rtc);
590
591         return 0;
592 }
593
594 static struct platform_driver max77663_rtc_driver = {
595         .probe = max77663_rtc_probe,
596         .remove = __devexit_p(max77663_rtc_remove),
597         .driver = {
598                    .name = "max77663-rtc",
599                    .owner = THIS_MODULE,
600         },
601 };
602
603 static int __init max77663_rtc_init(void)
604 {
605         return platform_driver_register(&max77663_rtc_driver);
606 }
607 module_init(max77663_rtc_init);
608
609 static void __exit max77663_rtc_exit(void)
610 {
611         platform_driver_unregister(&max77663_rtc_driver);
612 }
613 module_exit(max77663_rtc_exit);
614
615 MODULE_DESCRIPTION("max77663 RTC driver");
616 MODULE_LICENSE("GPL v2");
617 MODULE_VERSION("1.0");