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