/drivers/staging/sbe-2t3e3/exar7250.c

https://bitbucket.org/slukk/jb-tsm-kernel-4.2 · C · 217 lines · 166 code · 27 blank · 24 comment · 6 complexity · 18a7324bf0e4964e0f99dffc6f411b08 MD5 · raw file

  1. /*
  2. * SBE 2T3E3 synchronous serial card driver for Linux
  3. *
  4. * Copyright (C) 2009-2010 Krzysztof Halasa <khc@pm.waw.pl>
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of version 2 of the GNU General Public License
  8. * as published by the Free Software Foundation.
  9. *
  10. * This code is based on a driver written by SBE Inc.
  11. */
  12. #include "2t3e3.h"
  13. #include "ctrl.h"
  14. void exar7250_init(struct channel *sc)
  15. {
  16. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE,
  17. SBE_2T3E3_FRAMER_VAL_T3_CBIT |
  18. SBE_2T3E3_FRAMER_VAL_INTERRUPT_ENABLE_RESET |
  19. SBE_2T3E3_FRAMER_VAL_TIMING_ASYNCH_TXINCLK);
  20. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_IO_CONTROL,
  21. SBE_2T3E3_FRAMER_VAL_DISABLE_TX_LOSS_OF_CLOCK |
  22. SBE_2T3E3_FRAMER_VAL_DISABLE_RX_LOSS_OF_CLOCK |
  23. SBE_2T3E3_FRAMER_VAL_AMI_LINE_CODE |
  24. SBE_2T3E3_FRAMER_VAL_RX_LINE_CLOCK_INVERT);
  25. exar7250_set_frame_type(sc, SBE_2T3E3_FRAME_TYPE_T3_CBIT);
  26. }
  27. void exar7250_set_frame_type(struct channel *sc, u32 type)
  28. {
  29. u32 val;
  30. switch (type) {
  31. case SBE_2T3E3_FRAME_TYPE_E3_G751:
  32. case SBE_2T3E3_FRAME_TYPE_E3_G832:
  33. case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
  34. case SBE_2T3E3_FRAME_TYPE_T3_M13:
  35. break;
  36. default:
  37. return;
  38. }
  39. exar7250_stop_intr(sc, type);
  40. val = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE);
  41. val &= ~(SBE_2T3E3_FRAMER_VAL_LOCAL_LOOPBACK_MODE |
  42. SBE_2T3E3_FRAMER_VAL_T3_E3_SELECT |
  43. SBE_2T3E3_FRAMER_VAL_FRAME_FORMAT_SELECT);
  44. switch (type) {
  45. case SBE_2T3E3_FRAME_TYPE_E3_G751:
  46. val |= SBE_2T3E3_FRAMER_VAL_E3_G751;
  47. break;
  48. case SBE_2T3E3_FRAME_TYPE_E3_G832:
  49. val |= SBE_2T3E3_FRAMER_VAL_E3_G832;
  50. break;
  51. case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
  52. val |= SBE_2T3E3_FRAMER_VAL_T3_CBIT;
  53. break;
  54. case SBE_2T3E3_FRAME_TYPE_T3_M13:
  55. val |= SBE_2T3E3_FRAMER_VAL_T3_M13;
  56. break;
  57. default:
  58. return;
  59. }
  60. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE, val);
  61. exar7250_start_intr(sc, type);
  62. }
  63. void exar7250_start_intr(struct channel *sc, u32 type)
  64. {
  65. u32 val;
  66. switch (type) {
  67. case SBE_2T3E3_FRAME_TYPE_E3_G751:
  68. case SBE_2T3E3_FRAME_TYPE_E3_G832:
  69. val = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_CONFIGURATION_STATUS_2);
  70. #if 0
  71. sc->s.LOS = val & SBE_2T3E3_FRAMER_VAL_E3_RX_LOS ? 1 : 0;
  72. #else
  73. cpld_LOS_update(sc);
  74. #endif
  75. sc->s.OOF = val & SBE_2T3E3_FRAMER_VAL_E3_RX_OOF ? 1 : 0;
  76. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_1);
  77. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_1,
  78. SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_ENABLE |
  79. SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_ENABLE);
  80. #if 0
  81. /*SBE_2T3E3_FRAMER_VAL_E3_RX_COFA_INTERRUPT_ENABLE |
  82. SBE_2T3E3_FRAMER_VAL_E3_RX_OOF_INTERRUPT_ENABLE |
  83. SBE_2T3E3_FRAMER_VAL_E3_RX_LOF_INTERRUPT_ENABLE |
  84. SBE_2T3E3_FRAMER_VAL_E3_RX_LOS_INTERRUPT_ENABLE |
  85. SBE_2T3E3_FRAMER_VAL_E3_RX_AIS_INTERRUPT_ENABLE);*/
  86. #endif
  87. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_2);
  88. #if 0
  89. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_2,
  90. SBE_2T3E3_FRAMER_VAL_E3_RX_FEBE_INTERRUPT_ENABLE |
  91. SBE_2T3E3_FRAMER_VAL_E3_RX_FERF_INTERRUPT_ENABLE |
  92. SBE_2T3E3_FRAMER_VAL_E3_RX_FRAMING_BYTE_ERROR_INTERRUPT_ENABLE);
  93. #endif
  94. break;
  95. case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
  96. case SBE_2T3E3_FRAME_TYPE_T3_M13:
  97. val = exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_CONFIGURATION_STATUS);
  98. #if 0
  99. sc->s.LOS = val & SBE_2T3E3_FRAMER_VAL_T3_RX_LOS ? 1 : 0;
  100. #else
  101. cpld_LOS_update(sc);
  102. #endif
  103. sc->s.OOF = val & SBE_2T3E3_FRAMER_VAL_T3_RX_OOF ? 1 : 0;
  104. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_STATUS);
  105. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_ENABLE,
  106. SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_ENABLE |
  107. SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_ENABLE);
  108. #if 0
  109. /* SBE_2T3E3_FRAMER_VAL_T3_RX_CP_BIT_ERROR_INTERRUPT_ENABLE |
  110. SBE_2T3E3_FRAMER_VAL_T3_RX_LOS_INTERRUPT_ENABLE |
  111. SBE_2T3E3_FRAMER_VAL_T3_RX_AIS_INTERRUPT_ENABLE |
  112. SBE_2T3E3_FRAMER_VAL_T3_RX_IDLE_INTERRUPT_ENABLE |
  113. SBE_2T3E3_FRAMER_VAL_T3_RX_FERF_INTERRUPT_ENABLE |
  114. SBE_2T3E3_FRAMER_VAL_T3_RX_AIC_INTERRUPT_ENABLE |
  115. SBE_2T3E3_FRAMER_VAL_T3_RX_OOF_INTERRUPT_ENABLE |
  116. SBE_2T3E3_FRAMER_VAL_T3_RX_P_BIT_INTERRUPT_ENABLE);*/
  117. #endif
  118. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS);
  119. #if 0
  120. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS,
  121. SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_REMOVE_INTERRUPT_ENABLE |
  122. SBE_2T3E3_FRAMER_VAL_T3_RX_FEAC_VALID_INTERRUPT_ENABLE);
  123. #endif
  124. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_CONTROL, 0);
  125. break;
  126. default:
  127. return;
  128. }
  129. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_STATUS);
  130. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_ENABLE,
  131. SBE_2T3E3_FRAMER_VAL_RX_INTERRUPT_ENABLE |
  132. SBE_2T3E3_FRAMER_VAL_TX_INTERRUPT_ENABLE);
  133. }
  134. void exar7250_stop_intr(struct channel *sc, u32 type)
  135. {
  136. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_ENABLE, 0);
  137. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_BLOCK_INTERRUPT_STATUS);
  138. switch (type) {
  139. case SBE_2T3E3_FRAME_TYPE_E3_G751:
  140. case SBE_2T3E3_FRAME_TYPE_E3_G832:
  141. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_1, 0);
  142. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_1);
  143. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_ENABLE_2, 0);
  144. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_INTERRUPT_STATUS_2);
  145. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_RX_LAPD_CONTROL, 0);
  146. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_RX_LAPD_CONTROL);
  147. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_E3_TX_LAPD_STATUS, 0);
  148. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_E3_TX_LAPD_STATUS);
  149. break;
  150. case SBE_2T3E3_FRAME_TYPE_T3_CBIT:
  151. case SBE_2T3E3_FRAME_TYPE_T3_M13:
  152. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_ENABLE, 0);
  153. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_INTERRUPT_STATUS);
  154. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS, 0);
  155. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_FEAC_INTERRUPT_ENABLE_STATUS);
  156. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_CONTROL, 0);
  157. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_RX_LAPD_CONTROL);
  158. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_TX_FEAC_CONFIGURATION_STATUS, 0);
  159. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_TX_FEAC_CONFIGURATION_STATUS);
  160. exar7250_write(sc, SBE_2T3E3_FRAMER_REG_T3_TX_LAPD_STATUS, 0);
  161. exar7250_read(sc, SBE_2T3E3_FRAMER_REG_T3_TX_LAPD_STATUS);
  162. break;
  163. }
  164. }
  165. void exar7250_unipolar_onoff(struct channel *sc, u32 mode)
  166. {
  167. switch (mode) {
  168. case SBE_2T3E3_OFF:
  169. exar7300_clear_bit(sc, SBE_2T3E3_FRAMER_REG_IO_CONTROL,
  170. SBE_2T3E3_FRAMER_VAL_UNIPOLAR);
  171. break;
  172. case SBE_2T3E3_ON:
  173. exar7300_set_bit(sc, SBE_2T3E3_FRAMER_REG_IO_CONTROL,
  174. SBE_2T3E3_FRAMER_VAL_UNIPOLAR);
  175. break;
  176. }
  177. }
  178. void exar7250_set_loopback(struct channel *sc, u32 mode)
  179. {
  180. switch (mode) {
  181. case SBE_2T3E3_FRAMER_VAL_LOOPBACK_OFF:
  182. exar7300_clear_bit(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE,
  183. SBE_2T3E3_FRAMER_VAL_LOCAL_LOOPBACK_MODE);
  184. break;
  185. case SBE_2T3E3_FRAMER_VAL_LOOPBACK_ON:
  186. exar7300_set_bit(sc, SBE_2T3E3_FRAMER_REG_OPERATING_MODE,
  187. SBE_2T3E3_FRAMER_VAL_LOCAL_LOOPBACK_MODE);
  188. break;
  189. }
  190. }