ds1603.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Dallas Semiconductors 1603 RTC driver
  4. *
  5. * Brian Murphy <brian@murphy.dk>
  6. *
  7. */
  8. #include <linux/kernel.h>
  9. #include <asm/lasat/lasat.h>
  10. #include <linux/delay.h>
  11. #include <asm/lasat/ds1603.h>
  12. #include <asm/time.h>
  13. #include "ds1603.h"
  14. #define READ_TIME_CMD 0x81
  15. #define SET_TIME_CMD 0x80
  16. #define TRIMMER_SET_CMD 0xC0
  17. #define TRIMMER_VALUE_MASK 0x38
  18. #define TRIMMER_SHIFT 3
  19. struct ds_defs *ds1603;
  20. /* HW specific register functions */
  21. static void rtc_reg_write(unsigned long val)
  22. {
  23. *ds1603->reg = val;
  24. }
  25. static unsigned long rtc_reg_read(void)
  26. {
  27. unsigned long tmp = *ds1603->reg;
  28. return tmp;
  29. }
  30. static unsigned long rtc_datareg_read(void)
  31. {
  32. unsigned long tmp = *ds1603->data_reg;
  33. return tmp;
  34. }
  35. static void rtc_nrst_high(void)
  36. {
  37. rtc_reg_write(rtc_reg_read() | ds1603->rst);
  38. }
  39. static void rtc_nrst_low(void)
  40. {
  41. rtc_reg_write(rtc_reg_read() & ~ds1603->rst);
  42. }
  43. static void rtc_cycle_clock(unsigned long data)
  44. {
  45. data |= ds1603->clk;
  46. rtc_reg_write(data);
  47. lasat_ndelay(250);
  48. if (ds1603->data_reversed)
  49. data &= ~ds1603->data;
  50. else
  51. data |= ds1603->data;
  52. data &= ~ds1603->clk;
  53. rtc_reg_write(data);
  54. lasat_ndelay(250 + ds1603->huge_delay);
  55. }
  56. static void rtc_write_databit(unsigned int bit)
  57. {
  58. unsigned long data = rtc_reg_read();
  59. if (ds1603->data_reversed)
  60. bit = !bit;
  61. if (bit)
  62. data |= ds1603->data;
  63. else
  64. data &= ~ds1603->data;
  65. rtc_reg_write(data);
  66. lasat_ndelay(50 + ds1603->huge_delay);
  67. rtc_cycle_clock(data);
  68. }
  69. static unsigned int rtc_read_databit(void)
  70. {
  71. unsigned int data;
  72. data = (rtc_datareg_read() & (1 << ds1603->data_read_shift))
  73. >> ds1603->data_read_shift;
  74. rtc_cycle_clock(rtc_reg_read());
  75. return data;
  76. }
  77. static void rtc_write_byte(unsigned int byte)
  78. {
  79. int i;
  80. for (i = 0; i <= 7; i++) {
  81. rtc_write_databit(byte & 1L);
  82. byte >>= 1;
  83. }
  84. }
  85. static void rtc_write_word(unsigned long word)
  86. {
  87. int i;
  88. for (i = 0; i <= 31; i++) {
  89. rtc_write_databit(word & 1L);
  90. word >>= 1;
  91. }
  92. }
  93. static unsigned long rtc_read_word(void)
  94. {
  95. int i;
  96. unsigned long word = 0;
  97. unsigned long shift = 0;
  98. for (i = 0; i <= 31; i++) {
  99. word |= rtc_read_databit() << shift;
  100. shift++;
  101. }
  102. return word;
  103. }
  104. static void rtc_init_op(void)
  105. {
  106. rtc_nrst_high();
  107. rtc_reg_write(rtc_reg_read() & ~ds1603->clk);
  108. lasat_ndelay(50);
  109. }
  110. static void rtc_end_op(void)
  111. {
  112. rtc_nrst_low();
  113. lasat_ndelay(1000);
  114. }
  115. void read_persistent_clock64(struct timespec64 *ts)
  116. {
  117. unsigned long word;
  118. unsigned long flags;
  119. spin_lock_irqsave(&rtc_lock, flags);
  120. rtc_init_op();
  121. rtc_write_byte(READ_TIME_CMD);
  122. word = rtc_read_word();
  123. rtc_end_op();
  124. spin_unlock_irqrestore(&rtc_lock, flags);
  125. ts->tv_sec = word;
  126. ts->tv_nsec = 0;
  127. }
  128. int update_persistent_clock64(struct timespec64 now)
  129. {
  130. time64_t time = now.tv_sec;
  131. unsigned long flags;
  132. spin_lock_irqsave(&rtc_lock, flags);
  133. rtc_init_op();
  134. rtc_write_byte(SET_TIME_CMD);
  135. /*
  136. * Due to the hardware limitation, we cast to 'unsigned long' type,
  137. * so it will overflow in year 2106 on 32-bit machine.
  138. */
  139. rtc_write_word((unsigned long)time);
  140. rtc_end_op();
  141. spin_unlock_irqrestore(&rtc_lock, flags);
  142. return 0;
  143. }
  144. void ds1603_set_trimmer(unsigned int trimval)
  145. {
  146. rtc_init_op();
  147. rtc_write_byte(((trimval << TRIMMER_SHIFT) & TRIMMER_VALUE_MASK)
  148. | (TRIMMER_SET_CMD));
  149. rtc_end_op();
  150. }
  151. void ds1603_disable(void)
  152. {
  153. ds1603_set_trimmer(TRIMMER_DISABLE_RTC);
  154. }
  155. void ds1603_enable(void)
  156. {
  157. ds1603_set_trimmer(TRIMMER_DEFAULT);
  158. }