1
2
3
4
5
6
7
8
9
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/bcd.h>
14#include <linux/slab.h>
15#include <linux/rtc.h>
16#include <linux/workqueue.h>
17
18#include <linux/spi/spi.h>
19#include <linux/spi/ds1305.h>
20
21
22
23
24
25
26#define DS1305_WRITE 0x80
27
28
29
30
31
32
33
34#define DS1305_RTC_LEN 7
35
36#define DS1305_SEC 0x00
37#define DS1305_MIN 0x01
38#define DS1305_HOUR 0x02
39# define DS1305_HR_12 0x40
40# define DS1305_HR_PM 0x20
41#define DS1305_WDAY 0x03
42#define DS1305_MDAY 0x04
43#define DS1305_MON 0x05
44#define DS1305_YEAR 0x06
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59#define DS1305_ALM_LEN 4
60#define DS1305_ALM_DISABLE 0x80
61
62#define DS1305_ALM0(r) (0x07 + (r))
63#define DS1305_ALM1(r) (0x0b + (r))
64
65
66
67#define DS1305_CONTROL_LEN 3
68
69#define DS1305_CONTROL 0x0f
70# define DS1305_nEOSC 0x80
71# define DS1305_WP 0x40
72# define DS1305_INTCN 0x04
73# define DS1306_1HZ 0x04
74# define DS1305_AEI1 0x02
75# define DS1305_AEI0 0x01
76#define DS1305_STATUS 0x10
77
78#define DS1305_TRICKLE 0x11
79
80
81
82#define DS1305_NVRAM_LEN 96
83
84#define DS1305_NVRAM 0x20
85
86
87struct ds1305 {
88 struct spi_device *spi;
89 struct rtc_device *rtc;
90
91 struct work_struct work;
92
93 unsigned long flags;
94#define FLAG_EXITING 0
95
96 bool hr12;
97 u8 ctrl[DS1305_CONTROL_LEN];
98};
99
100
101
102
103
104
105
106
107
108static unsigned bcd2hour(u8 bcd)
109{
110 if (bcd & DS1305_HR_12) {
111 unsigned hour = 0;
112
113 bcd &= ~DS1305_HR_12;
114 if (bcd & DS1305_HR_PM) {
115 hour = 12;
116 bcd &= ~DS1305_HR_PM;
117 }
118 hour += bcd2bin(bcd);
119 return hour - 1;
120 }
121 return bcd2bin(bcd);
122}
123
124static u8 hour2bcd(bool hr12, int hour)
125{
126 if (hr12) {
127 hour++;
128 if (hour <= 12)
129 return DS1305_HR_12 | bin2bcd(hour);
130 hour -= 12;
131 return DS1305_HR_12 | DS1305_HR_PM | bin2bcd(hour);
132 }
133 return bin2bcd(hour);
134}
135
136
137
138
139
140
141
142static int ds1305_alarm_irq_enable(struct device *dev, unsigned int enabled)
143{
144 struct ds1305 *ds1305 = dev_get_drvdata(dev);
145 u8 buf[2];
146 long err = -EINVAL;
147
148 buf[0] = DS1305_WRITE | DS1305_CONTROL;
149 buf[1] = ds1305->ctrl[0];
150
151 if (enabled) {
152 if (ds1305->ctrl[0] & DS1305_AEI0)
153 goto done;
154 buf[1] |= DS1305_AEI0;
155 } else {
156 if (!(buf[1] & DS1305_AEI0))
157 goto done;
158 buf[1] &= ~DS1305_AEI0;
159 }
160 err = spi_write_then_read(ds1305->spi, buf, sizeof buf, NULL, 0);
161 if (err >= 0)
162 ds1305->ctrl[0] = buf[1];
163done:
164 return err;
165
166}
167
168
169
170
171
172
173static int ds1305_get_time(struct device *dev, struct rtc_time *time)
174{
175 struct ds1305 *ds1305 = dev_get_drvdata(dev);
176 u8 addr = DS1305_SEC;
177 u8 buf[DS1305_RTC_LEN];
178 int status;
179
180
181
182
183 status = spi_write_then_read(ds1305->spi, &addr, sizeof addr,
184 buf, sizeof buf);
185 if (status < 0)
186 return status;
187
188 dev_vdbg(dev, "%s: %02x %02x %02x, %02x %02x %02x %02x\n",
189 "read", buf[0], buf[1], buf[2], buf[3],
190 buf[4], buf[5], buf[6]);
191
192
193 time->tm_sec = bcd2bin(buf[DS1305_SEC]);
194 time->tm_min = bcd2bin(buf[DS1305_MIN]);
195 time->tm_hour = bcd2hour(buf[DS1305_HOUR]);
196 time->tm_wday = buf[DS1305_WDAY] - 1;
197 time->tm_mday = bcd2bin(buf[DS1305_MDAY]);
198 time->tm_mon = bcd2bin(buf[DS1305_MON]) - 1;
199 time->tm_year = bcd2bin(buf[DS1305_YEAR]) + 100;
200
201 dev_vdbg(dev, "%s secs=%d, mins=%d, "
202 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
203 "read", time->tm_sec, time->tm_min,
204 time->tm_hour, time->tm_mday,
205 time->tm_mon, time->tm_year, time->tm_wday);
206
207
208 return rtc_valid_tm(time);
209}
210
211static int ds1305_set_time(struct device *dev, struct rtc_time *time)
212{
213 struct ds1305 *ds1305 = dev_get_drvdata(dev);
214 u8 buf[1 + DS1305_RTC_LEN];
215 u8 *bp = buf;
216
217 dev_vdbg(dev, "%s secs=%d, mins=%d, "
218 "hours=%d, mday=%d, mon=%d, year=%d, wday=%d\n",
219 "write", time->tm_sec, time->tm_min,
220 time->tm_hour, time->tm_mday,
221 time->tm_mon, time->tm_year, time->tm_wday);
222
223
224 *bp++ = DS1305_WRITE | DS1305_SEC;
225
226 *bp++ = bin2bcd(time->tm_sec);
227 *bp++ = bin2bcd(time->tm_min);
228 *bp++ = hour2bcd(ds1305->hr12, time->tm_hour);
229 *bp++ = (time->tm_wday < 7) ? (time->tm_wday + 1) : 1;
230 *bp++ = bin2bcd(time->tm_mday);
231 *bp++ = bin2bcd(time->tm_mon + 1);
232 *bp++ = bin2bcd(time->tm_year - 100);
233
234 dev_dbg(dev, "%s: %02x %02x %02x, %02x %02x %02x %02x\n",
235 "write", buf[1], buf[2], buf[3],
236 buf[4], buf[5], buf[6], buf[7]);
237
238
239 return spi_write_then_read(ds1305->spi, buf, sizeof buf,
240 NULL, 0);
241}
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274static int ds1305_get_alarm(struct device *dev, struct rtc_wkalrm *alm)
275{
276 struct ds1305 *ds1305 = dev_get_drvdata(dev);
277 struct spi_device *spi = ds1305->spi;
278 u8 addr;
279 int status;
280 u8 buf[DS1305_ALM_LEN];
281
282
283
284
285
286
287 addr = DS1305_CONTROL;
288 status = spi_write_then_read(spi, &addr, sizeof addr,
289 ds1305->ctrl, sizeof ds1305->ctrl);
290 if (status < 0)
291 return status;
292
293 alm->enabled = !!(ds1305->ctrl[0] & DS1305_AEI0);
294 alm->pending = !!(ds1305->ctrl[1] & DS1305_AEI0);
295
296
297 addr = DS1305_ALM0(DS1305_SEC);
298 status = spi_write_then_read(spi, &addr, sizeof addr,
299 buf, sizeof buf);
300 if (status < 0)
301 return status;
302
303 dev_vdbg(dev, "%s: %02x %02x %02x %02x\n",
304 "alm0 read", buf[DS1305_SEC], buf[DS1305_MIN],
305 buf[DS1305_HOUR], buf[DS1305_WDAY]);
306
307 if ((DS1305_ALM_DISABLE & buf[DS1305_SEC])
308 || (DS1305_ALM_DISABLE & buf[DS1305_MIN])
309 || (DS1305_ALM_DISABLE & buf[DS1305_HOUR]))
310 return -EIO;
311
312
313
314
315
316 alm->time.tm_sec = bcd2bin(buf[DS1305_SEC]);
317 alm->time.tm_min = bcd2bin(buf[DS1305_MIN]);
318 alm->time.tm_hour = bcd2hour(buf[DS1305_HOUR]);
319 alm->time.tm_mday = -1;
320 alm->time.tm_mon = -1;
321 alm->time.tm_year = -1;
322
323 alm->time.tm_wday = -1;
324 alm->time.tm_mday = -1;
325 alm->time.tm_isdst = -1;
326
327 return 0;
328}
329
330
331
332
333static int ds1305_set_alarm(struct device *dev, struct rtc_wkalrm *alm)
334{
335 struct ds1305 *ds1305 = dev_get_drvdata(dev);
336 struct spi_device *spi = ds1305->spi;
337 unsigned long now, later;
338 struct rtc_time tm;
339 int status;
340 u8 buf[1 + DS1305_ALM_LEN];
341
342
343 status = rtc_tm_to_time(&alm->time, &later);
344 if (status < 0)
345 return status;
346
347
348 status = ds1305_get_time(dev, &tm);
349 if (status < 0)
350 return status;
351 status = rtc_tm_to_time(&tm, &now);
352 if (status < 0)
353 return status;
354
355
356 if (later <= now)
357 return -EINVAL;
358 if ((later - now) > 24 * 60 * 60)
359 return -EDOM;
360
361
362 if (ds1305->ctrl[0] & DS1305_AEI0) {
363 ds1305->ctrl[0] &= ~DS1305_AEI0;
364
365 buf[0] = DS1305_WRITE | DS1305_CONTROL;
366 buf[1] = ds1305->ctrl[0];
367 status = spi_write_then_read(ds1305->spi, buf, 2, NULL, 0);
368 if (status < 0)
369 return status;
370 }
371
372
373 buf[0] = DS1305_WRITE | DS1305_ALM0(DS1305_SEC);
374 buf[1 + DS1305_SEC] = bin2bcd(alm->time.tm_sec);
375 buf[1 + DS1305_MIN] = bin2bcd(alm->time.tm_min);
376 buf[1 + DS1305_HOUR] = hour2bcd(ds1305->hr12, alm->time.tm_hour);
377 buf[1 + DS1305_WDAY] = DS1305_ALM_DISABLE;
378
379 dev_dbg(dev, "%s: %02x %02x %02x %02x\n",
380 "alm0 write", buf[1 + DS1305_SEC], buf[1 + DS1305_MIN],
381 buf[1 + DS1305_HOUR], buf[1 + DS1305_WDAY]);
382
383 status = spi_write_then_read(spi, buf, sizeof buf, NULL, 0);
384 if (status < 0)
385 return status;
386
387
388 if (alm->enabled) {
389 ds1305->ctrl[0] |= DS1305_AEI0;
390
391 buf[0] = DS1305_WRITE | DS1305_CONTROL;
392 buf[1] = ds1305->ctrl[0];
393 status = spi_write_then_read(ds1305->spi, buf, 2, NULL, 0);
394 }
395
396 return status;
397}
398
399#ifdef CONFIG_PROC_FS
400
401static int ds1305_proc(struct device *dev, struct seq_file *seq)
402{
403 struct ds1305 *ds1305 = dev_get_drvdata(dev);
404 char *diodes = "no";
405 char *resistors = "";
406
407
408 if ((ds1305->ctrl[2] & 0xf0) == DS1305_TRICKLE_MAGIC) {
409 switch (ds1305->ctrl[2] & 0x0c) {
410 case DS1305_TRICKLE_DS2:
411 diodes = "2 diodes, ";
412 break;
413 case DS1305_TRICKLE_DS1:
414 diodes = "1 diode, ";
415 break;
416 default:
417 goto done;
418 }
419 switch (ds1305->ctrl[2] & 0x03) {
420 case DS1305_TRICKLE_2K:
421 resistors = "2k Ohm";
422 break;
423 case DS1305_TRICKLE_4K:
424 resistors = "4k Ohm";
425 break;
426 case DS1305_TRICKLE_8K:
427 resistors = "8k Ohm";
428 break;
429 default:
430 diodes = "no";
431 break;
432 }
433 }
434
435done:
436 return seq_printf(seq,
437 "trickle_charge\t: %s%s\n",
438 diodes, resistors);
439}
440
441#else
442#define ds1305_proc NULL
443#endif
444
445static const struct rtc_class_ops ds1305_ops = {
446 .read_time = ds1305_get_time,
447 .set_time = ds1305_set_time,
448 .read_alarm = ds1305_get_alarm,
449 .set_alarm = ds1305_set_alarm,
450 .proc = ds1305_proc,
451 .alarm_irq_enable = ds1305_alarm_irq_enable,
452};
453
454static void ds1305_work(struct work_struct *work)
455{
456 struct ds1305 *ds1305 = container_of(work, struct ds1305, work);
457 struct mutex *lock = &ds1305->rtc->ops_lock;
458 struct spi_device *spi = ds1305->spi;
459 u8 buf[3];
460 int status;
461
462
463 mutex_lock(lock);
464
465
466
467
468
469 ds1305->ctrl[0] &= ~(DS1305_AEI1 | DS1305_AEI0);
470 ds1305->ctrl[1] = 0;
471
472 buf[0] = DS1305_WRITE | DS1305_CONTROL;
473 buf[1] = ds1305->ctrl[0];
474 buf[2] = 0;
475
476 status = spi_write_then_read(spi, buf, sizeof buf,
477 NULL, 0);
478 if (status < 0)
479 dev_dbg(&spi->dev, "clear irq --> %d\n", status);
480
481 mutex_unlock(lock);
482
483 if (!test_bit(FLAG_EXITING, &ds1305->flags))
484 enable_irq(spi->irq);
485
486 rtc_update_irq(ds1305->rtc, 1, RTC_AF | RTC_IRQF);
487}
488
489
490
491
492
493
494static irqreturn_t ds1305_irq(int irq, void *p)
495{
496 struct ds1305 *ds1305 = p;
497
498 disable_irq(irq);
499 schedule_work(&ds1305->work);
500 return IRQ_HANDLED;
501}
502
503
504
505
506
507
508
509static void msg_init(struct spi_message *m, struct spi_transfer *x,
510 u8 *addr, size_t count, char *tx, char *rx)
511{
512 spi_message_init(m);
513 memset(x, 0, 2 * sizeof(*x));
514
515 x->tx_buf = addr;
516 x->len = 1;
517 spi_message_add_tail(x, m);
518
519 x++;
520
521 x->tx_buf = tx;
522 x->rx_buf = rx;
523 x->len = count;
524 spi_message_add_tail(x, m);
525}
526
527static ssize_t
528ds1305_nvram_read(struct file *filp, struct kobject *kobj,
529 struct bin_attribute *attr,
530 char *buf, loff_t off, size_t count)
531{
532 struct spi_device *spi;
533 u8 addr;
534 struct spi_message m;
535 struct spi_transfer x[2];
536 int status;
537
538 spi = container_of(kobj, struct spi_device, dev.kobj);
539
540 if (unlikely(off >= DS1305_NVRAM_LEN))
541 return 0;
542 if (count >= DS1305_NVRAM_LEN)
543 count = DS1305_NVRAM_LEN;
544 if ((off + count) > DS1305_NVRAM_LEN)
545 count = DS1305_NVRAM_LEN - off;
546 if (unlikely(!count))
547 return count;
548
549 addr = DS1305_NVRAM + off;
550 msg_init(&m, x, &addr, count, NULL, buf);
551
552 status = spi_sync(spi, &m);
553 if (status < 0)
554 dev_err(&spi->dev, "nvram %s error %d\n", "read", status);
555 return (status < 0) ? status : count;
556}
557
558static ssize_t
559ds1305_nvram_write(struct file *filp, struct kobject *kobj,
560 struct bin_attribute *attr,
561 char *buf, loff_t off, size_t count)
562{
563 struct spi_device *spi;
564 u8 addr;
565 struct spi_message m;
566 struct spi_transfer x[2];
567 int status;
568
569 spi = container_of(kobj, struct spi_device, dev.kobj);
570
571 if (unlikely(off >= DS1305_NVRAM_LEN))
572 return -EFBIG;
573 if (count >= DS1305_NVRAM_LEN)
574 count = DS1305_NVRAM_LEN;
575 if ((off + count) > DS1305_NVRAM_LEN)
576 count = DS1305_NVRAM_LEN - off;
577 if (unlikely(!count))
578 return count;
579
580 addr = (DS1305_WRITE | DS1305_NVRAM) + off;
581 msg_init(&m, x, &addr, count, buf, NULL);
582
583 status = spi_sync(spi, &m);
584 if (status < 0)
585 dev_err(&spi->dev, "nvram %s error %d\n", "write", status);
586 return (status < 0) ? status : count;
587}
588
589static struct bin_attribute nvram = {
590 .attr.name = "nvram",
591 .attr.mode = S_IRUGO | S_IWUSR,
592 .read = ds1305_nvram_read,
593 .write = ds1305_nvram_write,
594 .size = DS1305_NVRAM_LEN,
595};
596
597
598
599
600
601
602
603static int __devinit ds1305_probe(struct spi_device *spi)
604{
605 struct ds1305 *ds1305;
606 int status;
607 u8 addr, value;
608 struct ds1305_platform_data *pdata = spi->dev.platform_data;
609 bool write_ctrl = false;
610
611
612
613
614
615 if ((spi->bits_per_word && spi->bits_per_word != 8)
616 || (spi->max_speed_hz > 2000000)
617 || !(spi->mode & SPI_CPHA))
618 return -EINVAL;
619
620
621 ds1305 = kzalloc(sizeof *ds1305, GFP_KERNEL);
622 if (!ds1305)
623 return -ENOMEM;
624 ds1305->spi = spi;
625 spi_set_drvdata(spi, ds1305);
626
627
628 addr = DS1305_CONTROL;
629 status = spi_write_then_read(spi, &addr, sizeof addr,
630 ds1305->ctrl, sizeof ds1305->ctrl);
631 if (status < 0) {
632 dev_dbg(&spi->dev, "can't %s, %d\n",
633 "read", status);
634 goto fail0;
635 }
636
637 dev_dbg(&spi->dev, "ctrl %s: %02x %02x %02x\n",
638 "read", ds1305->ctrl[0],
639 ds1305->ctrl[1], ds1305->ctrl[2]);
640
641
642
643
644
645
646 if ((ds1305->ctrl[0] & 0x38) != 0 || (ds1305->ctrl[1] & 0xfc) != 0) {
647 dev_dbg(&spi->dev, "RTC chip is not present\n");
648 status = -ENODEV;
649 goto fail0;
650 }
651 if (ds1305->ctrl[2] == 0)
652 dev_dbg(&spi->dev, "chip may not be present\n");
653
654
655
656
657 if (ds1305->ctrl[0] & DS1305_WP) {
658 u8 buf[2];
659
660 ds1305->ctrl[0] &= ~DS1305_WP;
661
662 buf[0] = DS1305_WRITE | DS1305_CONTROL;
663 buf[1] = ds1305->ctrl[0];
664 status = spi_write_then_read(spi, buf, sizeof buf, NULL, 0);
665
666 dev_dbg(&spi->dev, "clear WP --> %d\n", status);
667 if (status < 0)
668 goto fail0;
669 }
670
671
672
673
674 if (ds1305->ctrl[0] & DS1305_nEOSC) {
675 ds1305->ctrl[0] &= ~DS1305_nEOSC;
676 write_ctrl = true;
677 dev_warn(&spi->dev, "SET TIME!\n");
678 }
679
680
681 if (ds1305->ctrl[1]) {
682 ds1305->ctrl[1] = 0;
683 write_ctrl = true;
684 }
685
686
687 if (pdata) {
688
689 if (((ds1305->ctrl[2] & 0xf0) != DS1305_TRICKLE_MAGIC)) {
690 ds1305->ctrl[2] = DS1305_TRICKLE_MAGIC
691 | pdata->trickle;
692 write_ctrl = true;
693 }
694
695
696 if (pdata->is_ds1306) {
697 if (pdata->en_1hz) {
698 if (!(ds1305->ctrl[0] & DS1306_1HZ)) {
699 ds1305->ctrl[0] |= DS1306_1HZ;
700 write_ctrl = true;
701 }
702 } else {
703 if (ds1305->ctrl[0] & DS1306_1HZ) {
704 ds1305->ctrl[0] &= ~DS1306_1HZ;
705 write_ctrl = true;
706 }
707 }
708 }
709 }
710
711 if (write_ctrl) {
712 u8 buf[4];
713
714 buf[0] = DS1305_WRITE | DS1305_CONTROL;
715 buf[1] = ds1305->ctrl[0];
716 buf[2] = ds1305->ctrl[1];
717 buf[3] = ds1305->ctrl[2];
718 status = spi_write_then_read(spi, buf, sizeof buf, NULL, 0);
719 if (status < 0) {
720 dev_dbg(&spi->dev, "can't %s, %d\n",
721 "write", status);
722 goto fail0;
723 }
724
725 dev_dbg(&spi->dev, "ctrl %s: %02x %02x %02x\n",
726 "write", ds1305->ctrl[0],
727 ds1305->ctrl[1], ds1305->ctrl[2]);
728 }
729
730
731 addr = DS1305_HOUR;
732 status = spi_write_then_read(spi, &addr, sizeof addr,
733 &value, sizeof value);
734 if (status < 0) {
735 dev_dbg(&spi->dev, "read HOUR --> %d\n", status);
736 goto fail0;
737 }
738
739 ds1305->hr12 = (DS1305_HR_12 & value) != 0;
740 if (ds1305->hr12)
741 dev_dbg(&spi->dev, "AM/PM\n");
742
743
744 ds1305->rtc = rtc_device_register("ds1305", &spi->dev,
745 &ds1305_ops, THIS_MODULE);
746 if (IS_ERR(ds1305->rtc)) {
747 status = PTR_ERR(ds1305->rtc);
748 dev_dbg(&spi->dev, "register rtc --> %d\n", status);
749 goto fail0;
750 }
751
752
753
754
755
756
757
758 if (spi->irq) {
759 INIT_WORK(&ds1305->work, ds1305_work);
760 status = request_irq(spi->irq, ds1305_irq,
761 0, dev_name(&ds1305->rtc->dev), ds1305);
762 if (status < 0) {
763 dev_dbg(&spi->dev, "request_irq %d --> %d\n",
764 spi->irq, status);
765 goto fail1;
766 }
767
768 device_set_wakeup_capable(&spi->dev, 1);
769 }
770
771
772 status = sysfs_create_bin_file(&spi->dev.kobj, &nvram);
773 if (status < 0) {
774 dev_dbg(&spi->dev, "register nvram --> %d\n", status);
775 goto fail2;
776 }
777
778 return 0;
779
780fail2:
781 free_irq(spi->irq, ds1305);
782fail1:
783 rtc_device_unregister(ds1305->rtc);
784fail0:
785 kfree(ds1305);
786 return status;
787}
788
789static int __devexit ds1305_remove(struct spi_device *spi)
790{
791 struct ds1305 *ds1305 = spi_get_drvdata(spi);
792
793 sysfs_remove_bin_file(&spi->dev.kobj, &nvram);
794
795
796 if (spi->irq) {
797 set_bit(FLAG_EXITING, &ds1305->flags);
798 free_irq(spi->irq, ds1305);
799 cancel_work_sync(&ds1305->work);
800 }
801
802 rtc_device_unregister(ds1305->rtc);
803 spi_set_drvdata(spi, NULL);
804 kfree(ds1305);
805 return 0;
806}
807
808static struct spi_driver ds1305_driver = {
809 .driver.name = "rtc-ds1305",
810 .driver.owner = THIS_MODULE,
811 .probe = ds1305_probe,
812 .remove = __devexit_p(ds1305_remove),
813
814};
815
816static int __init ds1305_init(void)
817{
818 return spi_register_driver(&ds1305_driver);
819}
820module_init(ds1305_init);
821
822static void __exit ds1305_exit(void)
823{
824 spi_unregister_driver(&ds1305_driver);
825}
826module_exit(ds1305_exit);
827
828MODULE_DESCRIPTION("RTC driver for DS1305 and DS1306 chips");
829MODULE_LICENSE("GPL");
830MODULE_ALIAS("spi:rtc-ds1305");
831