tsens-8974.c 6.9 KB

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