tsens-8974.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2015, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/platform_device.h>
  6. #include "tsens.h"
  7. /* eeprom layout data for 8974 */
  8. #define BASE1_MASK 0xff
  9. #define S0_P1_MASK 0x3f00
  10. #define S1_P1_MASK 0xfc000
  11. #define S2_P1_MASK 0x3f00000
  12. #define S3_P1_MASK 0xfc000000
  13. #define S4_P1_MASK 0x3f
  14. #define S5_P1_MASK 0xfc0
  15. #define S6_P1_MASK 0x3f000
  16. #define S7_P1_MASK 0xfc0000
  17. #define S8_P1_MASK 0x3f000000
  18. #define S8_P1_MASK_BKP 0x3f
  19. #define S9_P1_MASK 0x3f
  20. #define S9_P1_MASK_BKP 0xfc0
  21. #define S10_P1_MASK 0xfc0
  22. #define S10_P1_MASK_BKP 0x3f000
  23. #define CAL_SEL_0_1 0xc0000000
  24. #define CAL_SEL_2 0x40000000
  25. #define CAL_SEL_SHIFT 30
  26. #define CAL_SEL_SHIFT_2 28
  27. #define S0_P1_SHIFT 8
  28. #define S1_P1_SHIFT 14
  29. #define S2_P1_SHIFT 20
  30. #define S3_P1_SHIFT 26
  31. #define S5_P1_SHIFT 6
  32. #define S6_P1_SHIFT 12
  33. #define S7_P1_SHIFT 18
  34. #define S8_P1_SHIFT 24
  35. #define S9_P1_BKP_SHIFT 6
  36. #define S10_P1_SHIFT 6
  37. #define S10_P1_BKP_SHIFT 12
  38. #define BASE2_SHIFT 12
  39. #define BASE2_BKP_SHIFT 18
  40. #define S0_P2_SHIFT 20
  41. #define S0_P2_BKP_SHIFT 26
  42. #define S1_P2_SHIFT 26
  43. #define S2_P2_BKP_SHIFT 6
  44. #define S3_P2_SHIFT 6
  45. #define S3_P2_BKP_SHIFT 12
  46. #define S4_P2_SHIFT 12
  47. #define S4_P2_BKP_SHIFT 18
  48. #define S5_P2_SHIFT 18
  49. #define S5_P2_BKP_SHIFT 24
  50. #define S6_P2_SHIFT 24
  51. #define S7_P2_BKP_SHIFT 6
  52. #define S8_P2_SHIFT 6
  53. #define S8_P2_BKP_SHIFT 12
  54. #define S9_P2_SHIFT 12
  55. #define S9_P2_BKP_SHIFT 18
  56. #define S10_P2_SHIFT 18
  57. #define S10_P2_BKP_SHIFT 24
  58. #define BASE2_MASK 0xff000
  59. #define BASE2_BKP_MASK 0xfc0000
  60. #define S0_P2_MASK 0x3f00000
  61. #define S0_P2_BKP_MASK 0xfc000000
  62. #define S1_P2_MASK 0xfc000000
  63. #define S1_P2_BKP_MASK 0x3f
  64. #define S2_P2_MASK 0x3f
  65. #define S2_P2_BKP_MASK 0xfc0
  66. #define S3_P2_MASK 0xfc0
  67. #define S3_P2_BKP_MASK 0x3f000
  68. #define S4_P2_MASK 0x3f000
  69. #define S4_P2_BKP_MASK 0xfc0000
  70. #define S5_P2_MASK 0xfc0000
  71. #define S5_P2_BKP_MASK 0x3f000000
  72. #define S6_P2_MASK 0x3f000000
  73. #define S6_P2_BKP_MASK 0x3f
  74. #define S7_P2_MASK 0x3f
  75. #define S7_P2_BKP_MASK 0xfc0
  76. #define S8_P2_MASK 0xfc0
  77. #define S8_P2_BKP_MASK 0x3f000
  78. #define S9_P2_MASK 0x3f000
  79. #define S9_P2_BKP_MASK 0xfc0000
  80. #define S10_P2_MASK 0xfc0000
  81. #define S10_P2_BKP_MASK 0x3f000000
  82. #define BKP_SEL 0x3
  83. #define BKP_REDUN_SEL 0xe0000000
  84. #define BKP_REDUN_SHIFT 29
  85. #define BIT_APPEND 0x3
  86. static int calibrate_8974(struct tsens_device *tmdev)
  87. {
  88. int base1 = 0, base2 = 0, i;
  89. u32 p1[11], p2[11];
  90. int mode = 0;
  91. u32 *calib, *bkp;
  92. u32 calib_redun_sel;
  93. calib = (u32 *)qfprom_read(tmdev->dev, "calib");
  94. if (IS_ERR(calib))
  95. return PTR_ERR(calib);
  96. bkp = (u32 *)qfprom_read(tmdev->dev, "calib_backup");
  97. if (IS_ERR(bkp))
  98. return PTR_ERR(bkp);
  99. calib_redun_sel = bkp[1] & BKP_REDUN_SEL;
  100. calib_redun_sel >>= BKP_REDUN_SHIFT;
  101. if (calib_redun_sel == BKP_SEL) {
  102. mode = (calib[4] & CAL_SEL_0_1) >> CAL_SEL_SHIFT;
  103. mode |= (calib[5] & CAL_SEL_2) >> CAL_SEL_SHIFT_2;
  104. switch (mode) {
  105. case TWO_PT_CALIB:
  106. base2 = (bkp[2] & BASE2_BKP_MASK) >> BASE2_BKP_SHIFT;
  107. p2[0] = (bkp[2] & S0_P2_BKP_MASK) >> S0_P2_BKP_SHIFT;
  108. p2[1] = (bkp[3] & S1_P2_BKP_MASK);
  109. p2[2] = (bkp[3] & S2_P2_BKP_MASK) >> S2_P2_BKP_SHIFT;
  110. p2[3] = (bkp[3] & S3_P2_BKP_MASK) >> S3_P2_BKP_SHIFT;
  111. p2[4] = (bkp[3] & S4_P2_BKP_MASK) >> S4_P2_BKP_SHIFT;
  112. p2[5] = (calib[4] & S5_P2_BKP_MASK) >> S5_P2_BKP_SHIFT;
  113. p2[6] = (calib[5] & S6_P2_BKP_MASK);
  114. p2[7] = (calib[5] & S7_P2_BKP_MASK) >> S7_P2_BKP_SHIFT;
  115. p2[8] = (calib[5] & S8_P2_BKP_MASK) >> S8_P2_BKP_SHIFT;
  116. p2[9] = (calib[5] & S9_P2_BKP_MASK) >> S9_P2_BKP_SHIFT;
  117. p2[10] = (calib[5] & S10_P2_BKP_MASK) >> S10_P2_BKP_SHIFT;
  118. /* Fall through */
  119. case ONE_PT_CALIB:
  120. case ONE_PT_CALIB2:
  121. base1 = bkp[0] & BASE1_MASK;
  122. p1[0] = (bkp[0] & S0_P1_MASK) >> S0_P1_SHIFT;
  123. p1[1] = (bkp[0] & S1_P1_MASK) >> S1_P1_SHIFT;
  124. p1[2] = (bkp[0] & S2_P1_MASK) >> S2_P1_SHIFT;
  125. p1[3] = (bkp[0] & S3_P1_MASK) >> S3_P1_SHIFT;
  126. p1[4] = (bkp[1] & S4_P1_MASK);
  127. p1[5] = (bkp[1] & S5_P1_MASK) >> S5_P1_SHIFT;
  128. p1[6] = (bkp[1] & S6_P1_MASK) >> S6_P1_SHIFT;
  129. p1[7] = (bkp[1] & S7_P1_MASK) >> S7_P1_SHIFT;
  130. p1[8] = (bkp[2] & S8_P1_MASK_BKP) >> S8_P1_SHIFT;
  131. p1[9] = (bkp[2] & S9_P1_MASK_BKP) >> S9_P1_BKP_SHIFT;
  132. p1[10] = (bkp[2] & S10_P1_MASK_BKP) >> S10_P1_BKP_SHIFT;
  133. break;
  134. }
  135. } else {
  136. mode = (calib[1] & CAL_SEL_0_1) >> CAL_SEL_SHIFT;
  137. mode |= (calib[3] & CAL_SEL_2) >> CAL_SEL_SHIFT_2;
  138. switch (mode) {
  139. case TWO_PT_CALIB:
  140. base2 = (calib[2] & BASE2_MASK) >> BASE2_SHIFT;
  141. p2[0] = (calib[2] & S0_P2_MASK) >> S0_P2_SHIFT;
  142. p2[1] = (calib[2] & S1_P2_MASK) >> S1_P2_SHIFT;
  143. p2[2] = (calib[3] & S2_P2_MASK);
  144. p2[3] = (calib[3] & S3_P2_MASK) >> S3_P2_SHIFT;
  145. p2[4] = (calib[3] & S4_P2_MASK) >> S4_P2_SHIFT;
  146. p2[5] = (calib[3] & S5_P2_MASK) >> S5_P2_SHIFT;
  147. p2[6] = (calib[3] & S6_P2_MASK) >> S6_P2_SHIFT;
  148. p2[7] = (calib[4] & S7_P2_MASK);
  149. p2[8] = (calib[4] & S8_P2_MASK) >> S8_P2_SHIFT;
  150. p2[9] = (calib[4] & S9_P2_MASK) >> S9_P2_SHIFT;
  151. p2[10] = (calib[4] & S10_P2_MASK) >> S10_P2_SHIFT;
  152. /* Fall through */
  153. case ONE_PT_CALIB:
  154. case ONE_PT_CALIB2:
  155. base1 = calib[0] & BASE1_MASK;
  156. p1[0] = (calib[0] & S0_P1_MASK) >> S0_P1_SHIFT;
  157. p1[1] = (calib[0] & S1_P1_MASK) >> S1_P1_SHIFT;
  158. p1[2] = (calib[0] & S2_P1_MASK) >> S2_P1_SHIFT;
  159. p1[3] = (calib[0] & S3_P1_MASK) >> S3_P1_SHIFT;
  160. p1[4] = (calib[1] & S4_P1_MASK);
  161. p1[5] = (calib[1] & S5_P1_MASK) >> S5_P1_SHIFT;
  162. p1[6] = (calib[1] & S6_P1_MASK) >> S6_P1_SHIFT;
  163. p1[7] = (calib[1] & S7_P1_MASK) >> S7_P1_SHIFT;
  164. p1[8] = (calib[1] & S8_P1_MASK) >> S8_P1_SHIFT;
  165. p1[9] = (calib[2] & S9_P1_MASK);
  166. p1[10] = (calib[2] & S10_P1_MASK) >> S10_P1_SHIFT;
  167. break;
  168. }
  169. }
  170. switch (mode) {
  171. case ONE_PT_CALIB:
  172. for (i = 0; i < tmdev->num_sensors; i++)
  173. p1[i] += (base1 << 2) | BIT_APPEND;
  174. break;
  175. case TWO_PT_CALIB:
  176. for (i = 0; i < tmdev->num_sensors; i++) {
  177. p2[i] += base2;
  178. p2[i] <<= 2;
  179. p2[i] |= BIT_APPEND;
  180. }
  181. /* Fall through */
  182. case ONE_PT_CALIB2:
  183. for (i = 0; i < tmdev->num_sensors; i++) {
  184. p1[i] += base1;
  185. p1[i] <<= 2;
  186. p1[i] |= BIT_APPEND;
  187. }
  188. break;
  189. default:
  190. for (i = 0; i < tmdev->num_sensors; i++)
  191. p2[i] = 780;
  192. p1[0] = 502;
  193. p1[1] = 509;
  194. p1[2] = 503;
  195. p1[3] = 509;
  196. p1[4] = 505;
  197. p1[5] = 509;
  198. p1[6] = 507;
  199. p1[7] = 510;
  200. p1[8] = 508;
  201. p1[9] = 509;
  202. p1[10] = 508;
  203. break;
  204. }
  205. compute_intercept_slope(tmdev, p1, p2, mode);
  206. return 0;
  207. }
  208. static const struct tsens_ops ops_8974 = {
  209. .init = init_common,
  210. .calibrate = calibrate_8974,
  211. .get_temp = get_temp_common,
  212. };
  213. const struct tsens_data data_8974 = {
  214. .num_sensors = 11,
  215. .ops = &ops_8974,
  216. .reg_offsets = { [SROT_CTRL_OFFSET] = 0x0 },
  217. };