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