aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-max77663.c
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-22 10:38:37 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-22 10:38:37 -0500
commitfcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch)
treea57612d1888735a2ec7972891b68c1ac5ec8faea /drivers/rtc/rtc-max77663.c
parent8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff)
Added missing tegra files.HEADmaster
Diffstat (limited to 'drivers/rtc/rtc-max77663.c')
-rw-r--r--drivers/rtc/rtc-max77663.c617
1 files changed, 617 insertions, 0 deletions
diff --git a/drivers/rtc/rtc-max77663.c b/drivers/rtc/rtc-max77663.c
new file mode 100644
index 00000000000..874a2df86dc
--- /dev/null
+++ b/drivers/rtc/rtc-max77663.c
@@ -0,0 +1,617 @@
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
82enum {
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
93struct 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
102static inline struct device *_to_parent(struct max77663_rtc *rtc)
103{
104 return rtc->dev->parent;
105}
106
107static 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
138static 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
156out:
157 mutex_unlock(&rtc->io_lock);
158 return ret;
159}
160
161static 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
180out:
181 mutex_unlock(&rtc->io_lock);
182 return ret;
183}
184
185static 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
207static 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
235static 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
248out:
249 return ret;
250}
251
252static 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
266out:
267 return ret;
268}
269
270static 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
302static 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
311static 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 }
337out:
338 mutex_unlock(&rtc->io_lock);
339 return ret;
340}
341
342static 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
374static 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
400static 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
440static 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
482static 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
490static 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
525static 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
573out_kfree:
574 mutex_destroy(&rtc->io_lock);
575 kfree(rtc->rtc);
576out:
577 return ret;
578}
579
580static 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
594static 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
603static int __init max77663_rtc_init(void)
604{
605 return platform_driver_register(&max77663_rtc_driver);
606}
607module_init(max77663_rtc_init);
608
609static void __exit max77663_rtc_exit(void)
610{
611 platform_driver_unregister(&max77663_rtc_driver);
612}
613module_exit(max77663_rtc_exit);
614
615MODULE_DESCRIPTION("max77663 RTC driver");
616MODULE_LICENSE("GPL v2");
617MODULE_VERSION("1.0");