tsens-v0_1.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  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. /* ----- SROT ------ */
  8. #define SROT_CTRL_OFF 0x0000
  9. /* ----- TM ------ */
  10. #define TM_INT_EN_OFF 0x0000
  11. #define TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF 0x0004
  12. #define TM_Sn_STATUS_OFF 0x0030
  13. #define TM_TRDY_OFF 0x005c
  14. /* eeprom layout data for 8916 */
  15. #define MSM8916_BASE0_MASK 0x0000007f
  16. #define MSM8916_BASE1_MASK 0xfe000000
  17. #define MSM8916_BASE0_SHIFT 0
  18. #define MSM8916_BASE1_SHIFT 25
  19. #define MSM8916_S0_P1_MASK 0x00000f80
  20. #define MSM8916_S1_P1_MASK 0x003e0000
  21. #define MSM8916_S2_P1_MASK 0xf8000000
  22. #define MSM8916_S3_P1_MASK 0x000003e0
  23. #define MSM8916_S4_P1_MASK 0x000f8000
  24. #define MSM8916_S0_P2_MASK 0x0001f000
  25. #define MSM8916_S1_P2_MASK 0x07c00000
  26. #define MSM8916_S2_P2_MASK 0x0000001f
  27. #define MSM8916_S3_P2_MASK 0x00007c00
  28. #define MSM8916_S4_P2_MASK 0x01f00000
  29. #define MSM8916_S0_P1_SHIFT 7
  30. #define MSM8916_S1_P1_SHIFT 17
  31. #define MSM8916_S2_P1_SHIFT 27
  32. #define MSM8916_S3_P1_SHIFT 5
  33. #define MSM8916_S4_P1_SHIFT 15
  34. #define MSM8916_S0_P2_SHIFT 12
  35. #define MSM8916_S1_P2_SHIFT 22
  36. #define MSM8916_S2_P2_SHIFT 0
  37. #define MSM8916_S3_P2_SHIFT 10
  38. #define MSM8916_S4_P2_SHIFT 20
  39. #define MSM8916_CAL_SEL_MASK 0xe0000000
  40. #define MSM8916_CAL_SEL_SHIFT 29
  41. /* eeprom layout data for 8939 */
  42. #define MSM8939_BASE0_MASK 0x000000ff
  43. #define MSM8939_BASE1_MASK 0xff000000
  44. #define MSM8939_BASE0_SHIFT 0
  45. #define MSM8939_BASE1_SHIFT 24
  46. #define MSM8939_S0_P1_MASK 0x000001f8
  47. #define MSM8939_S1_P1_MASK 0x001f8000
  48. #define MSM8939_S2_P1_MASK_0_4 0xf8000000
  49. #define MSM8939_S2_P1_MASK_5 0x00000001
  50. #define MSM8939_S3_P1_MASK 0x00001f80
  51. #define MSM8939_S4_P1_MASK 0x01f80000
  52. #define MSM8939_S5_P1_MASK 0x00003f00
  53. #define MSM8939_S6_P1_MASK 0x03f00000
  54. #define MSM8939_S7_P1_MASK 0x0000003f
  55. #define MSM8939_S8_P1_MASK 0x0003f000
  56. #define MSM8939_S9_P1_MASK 0x07e00000
  57. #define MSM8939_S0_P2_MASK 0x00007e00
  58. #define MSM8939_S1_P2_MASK 0x07e00000
  59. #define MSM8939_S2_P2_MASK 0x0000007e
  60. #define MSM8939_S3_P2_MASK 0x0007e000
  61. #define MSM8939_S4_P2_MASK 0x7e000000
  62. #define MSM8939_S5_P2_MASK 0x000fc000
  63. #define MSM8939_S6_P2_MASK 0xfc000000
  64. #define MSM8939_S7_P2_MASK 0x00000fc0
  65. #define MSM8939_S8_P2_MASK 0x00fc0000
  66. #define MSM8939_S9_P2_MASK_0_4 0xf8000000
  67. #define MSM8939_S9_P2_MASK_5 0x00002000
  68. #define MSM8939_S0_P1_SHIFT 3
  69. #define MSM8939_S1_P1_SHIFT 15
  70. #define MSM8939_S2_P1_SHIFT_0_4 27
  71. #define MSM8939_S2_P1_SHIFT_5 0
  72. #define MSM8939_S3_P1_SHIFT 7
  73. #define MSM8939_S4_P1_SHIFT 19
  74. #define MSM8939_S5_P1_SHIFT 8
  75. #define MSM8939_S6_P1_SHIFT 20
  76. #define MSM8939_S7_P1_SHIFT 0
  77. #define MSM8939_S8_P1_SHIFT 12
  78. #define MSM8939_S9_P1_SHIFT 21
  79. #define MSM8939_S0_P2_SHIFT 9
  80. #define MSM8939_S1_P2_SHIFT 21
  81. #define MSM8939_S2_P2_SHIFT 1
  82. #define MSM8939_S3_P2_SHIFT 13
  83. #define MSM8939_S4_P2_SHIFT 25
  84. #define MSM8939_S5_P2_SHIFT 14
  85. #define MSM8939_S6_P2_SHIFT 26
  86. #define MSM8939_S7_P2_SHIFT 6
  87. #define MSM8939_S8_P2_SHIFT 18
  88. #define MSM8939_S9_P2_SHIFT_0_4 27
  89. #define MSM8939_S9_P2_SHIFT_5 13
  90. #define MSM8939_CAL_SEL_MASK 0x7
  91. #define MSM8939_CAL_SEL_SHIFT 0
  92. /* eeprom layout data for 8974 */
  93. #define BASE1_MASK 0xff
  94. #define S0_P1_MASK 0x3f00
  95. #define S1_P1_MASK 0xfc000
  96. #define S2_P1_MASK 0x3f00000
  97. #define S3_P1_MASK 0xfc000000
  98. #define S4_P1_MASK 0x3f
  99. #define S5_P1_MASK 0xfc0
  100. #define S6_P1_MASK 0x3f000
  101. #define S7_P1_MASK 0xfc0000
  102. #define S8_P1_MASK 0x3f000000
  103. #define S8_P1_MASK_BKP 0x3f
  104. #define S9_P1_MASK 0x3f
  105. #define S9_P1_MASK_BKP 0xfc0
  106. #define S10_P1_MASK 0xfc0
  107. #define S10_P1_MASK_BKP 0x3f000
  108. #define CAL_SEL_0_1 0xc0000000
  109. #define CAL_SEL_2 0x40000000
  110. #define CAL_SEL_SHIFT 30
  111. #define CAL_SEL_SHIFT_2 28
  112. #define S0_P1_SHIFT 8
  113. #define S1_P1_SHIFT 14
  114. #define S2_P1_SHIFT 20
  115. #define S3_P1_SHIFT 26
  116. #define S5_P1_SHIFT 6
  117. #define S6_P1_SHIFT 12
  118. #define S7_P1_SHIFT 18
  119. #define S8_P1_SHIFT 24
  120. #define S9_P1_BKP_SHIFT 6
  121. #define S10_P1_SHIFT 6
  122. #define S10_P1_BKP_SHIFT 12
  123. #define BASE2_SHIFT 12
  124. #define BASE2_BKP_SHIFT 18
  125. #define S0_P2_SHIFT 20
  126. #define S0_P2_BKP_SHIFT 26
  127. #define S1_P2_SHIFT 26
  128. #define S2_P2_BKP_SHIFT 6
  129. #define S3_P2_SHIFT 6
  130. #define S3_P2_BKP_SHIFT 12
  131. #define S4_P2_SHIFT 12
  132. #define S4_P2_BKP_SHIFT 18
  133. #define S5_P2_SHIFT 18
  134. #define S5_P2_BKP_SHIFT 24
  135. #define S6_P2_SHIFT 24
  136. #define S7_P2_BKP_SHIFT 6
  137. #define S8_P2_SHIFT 6
  138. #define S8_P2_BKP_SHIFT 12
  139. #define S9_P2_SHIFT 12
  140. #define S9_P2_BKP_SHIFT 18
  141. #define S10_P2_SHIFT 18
  142. #define S10_P2_BKP_SHIFT 24
  143. #define BASE2_MASK 0xff000
  144. #define BASE2_BKP_MASK 0xfc0000
  145. #define S0_P2_MASK 0x3f00000
  146. #define S0_P2_BKP_MASK 0xfc000000
  147. #define S1_P2_MASK 0xfc000000
  148. #define S1_P2_BKP_MASK 0x3f
  149. #define S2_P2_MASK 0x3f
  150. #define S2_P2_BKP_MASK 0xfc0
  151. #define S3_P2_MASK 0xfc0
  152. #define S3_P2_BKP_MASK 0x3f000
  153. #define S4_P2_MASK 0x3f000
  154. #define S4_P2_BKP_MASK 0xfc0000
  155. #define S5_P2_MASK 0xfc0000
  156. #define S5_P2_BKP_MASK 0x3f000000
  157. #define S6_P2_MASK 0x3f000000
  158. #define S6_P2_BKP_MASK 0x3f
  159. #define S7_P2_MASK 0x3f
  160. #define S7_P2_BKP_MASK 0xfc0
  161. #define S8_P2_MASK 0xfc0
  162. #define S8_P2_BKP_MASK 0x3f000
  163. #define S9_P2_MASK 0x3f000
  164. #define S9_P2_BKP_MASK 0xfc0000
  165. #define S10_P2_MASK 0xfc0000
  166. #define S10_P2_BKP_MASK 0x3f000000
  167. #define BKP_SEL 0x3
  168. #define BKP_REDUN_SEL 0xe0000000
  169. #define BKP_REDUN_SHIFT 29
  170. #define BIT_APPEND 0x3
  171. /* eeprom layout data for mdm9607 */
  172. #define MDM9607_BASE0_MASK 0x000000ff
  173. #define MDM9607_BASE1_MASK 0x000ff000
  174. #define MDM9607_BASE0_SHIFT 0
  175. #define MDM9607_BASE1_SHIFT 12
  176. #define MDM9607_S0_P1_MASK 0x00003f00
  177. #define MDM9607_S1_P1_MASK 0x03f00000
  178. #define MDM9607_S2_P1_MASK 0x0000003f
  179. #define MDM9607_S3_P1_MASK 0x0003f000
  180. #define MDM9607_S4_P1_MASK 0x0000003f
  181. #define MDM9607_S0_P2_MASK 0x000fc000
  182. #define MDM9607_S1_P2_MASK 0xfc000000
  183. #define MDM9607_S2_P2_MASK 0x00000fc0
  184. #define MDM9607_S3_P2_MASK 0x00fc0000
  185. #define MDM9607_S4_P2_MASK 0x00000fc0
  186. #define MDM9607_S0_P1_SHIFT 8
  187. #define MDM9607_S1_P1_SHIFT 20
  188. #define MDM9607_S2_P1_SHIFT 0
  189. #define MDM9607_S3_P1_SHIFT 12
  190. #define MDM9607_S4_P1_SHIFT 0
  191. #define MDM9607_S0_P2_SHIFT 14
  192. #define MDM9607_S1_P2_SHIFT 26
  193. #define MDM9607_S2_P2_SHIFT 6
  194. #define MDM9607_S3_P2_SHIFT 18
  195. #define MDM9607_S4_P2_SHIFT 6
  196. #define MDM9607_CAL_SEL_MASK 0x00700000
  197. #define MDM9607_CAL_SEL_SHIFT 20
  198. static int calibrate_8916(struct tsens_priv *priv)
  199. {
  200. int base0 = 0, base1 = 0, i;
  201. u32 p1[5], p2[5];
  202. int mode = 0;
  203. u32 *qfprom_cdata, *qfprom_csel;
  204. qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib");
  205. if (IS_ERR(qfprom_cdata))
  206. return PTR_ERR(qfprom_cdata);
  207. qfprom_csel = (u32 *)qfprom_read(priv->dev, "calib_sel");
  208. if (IS_ERR(qfprom_csel)) {
  209. kfree(qfprom_cdata);
  210. return PTR_ERR(qfprom_csel);
  211. }
  212. mode = (qfprom_csel[0] & MSM8916_CAL_SEL_MASK) >> MSM8916_CAL_SEL_SHIFT;
  213. dev_dbg(priv->dev, "calibration mode is %d\n", mode);
  214. switch (mode) {
  215. case TWO_PT_CALIB:
  216. base1 = (qfprom_cdata[1] & MSM8916_BASE1_MASK) >> MSM8916_BASE1_SHIFT;
  217. p2[0] = (qfprom_cdata[0] & MSM8916_S0_P2_MASK) >> MSM8916_S0_P2_SHIFT;
  218. p2[1] = (qfprom_cdata[0] & MSM8916_S1_P2_MASK) >> MSM8916_S1_P2_SHIFT;
  219. p2[2] = (qfprom_cdata[1] & MSM8916_S2_P2_MASK) >> MSM8916_S2_P2_SHIFT;
  220. p2[3] = (qfprom_cdata[1] & MSM8916_S3_P2_MASK) >> MSM8916_S3_P2_SHIFT;
  221. p2[4] = (qfprom_cdata[1] & MSM8916_S4_P2_MASK) >> MSM8916_S4_P2_SHIFT;
  222. for (i = 0; i < priv->num_sensors; i++)
  223. p2[i] = ((base1 + p2[i]) << 3);
  224. fallthrough;
  225. case ONE_PT_CALIB2:
  226. base0 = (qfprom_cdata[0] & MSM8916_BASE0_MASK);
  227. p1[0] = (qfprom_cdata[0] & MSM8916_S0_P1_MASK) >> MSM8916_S0_P1_SHIFT;
  228. p1[1] = (qfprom_cdata[0] & MSM8916_S1_P1_MASK) >> MSM8916_S1_P1_SHIFT;
  229. p1[2] = (qfprom_cdata[0] & MSM8916_S2_P1_MASK) >> MSM8916_S2_P1_SHIFT;
  230. p1[3] = (qfprom_cdata[1] & MSM8916_S3_P1_MASK) >> MSM8916_S3_P1_SHIFT;
  231. p1[4] = (qfprom_cdata[1] & MSM8916_S4_P1_MASK) >> MSM8916_S4_P1_SHIFT;
  232. for (i = 0; i < priv->num_sensors; i++)
  233. p1[i] = (((base0) + p1[i]) << 3);
  234. break;
  235. default:
  236. for (i = 0; i < priv->num_sensors; i++) {
  237. p1[i] = 500;
  238. p2[i] = 780;
  239. }
  240. break;
  241. }
  242. compute_intercept_slope(priv, p1, p2, mode);
  243. kfree(qfprom_cdata);
  244. kfree(qfprom_csel);
  245. return 0;
  246. }
  247. static int calibrate_8939(struct tsens_priv *priv)
  248. {
  249. int base0 = 0, base1 = 0, i;
  250. u32 p1[10], p2[10];
  251. int mode = 0;
  252. u32 *qfprom_cdata;
  253. u32 cdata[4];
  254. qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib");
  255. if (IS_ERR(qfprom_cdata))
  256. return PTR_ERR(qfprom_cdata);
  257. /* Mapping between qfprom nvmem and calibration data */
  258. cdata[0] = qfprom_cdata[12];
  259. cdata[1] = qfprom_cdata[13];
  260. cdata[2] = qfprom_cdata[0];
  261. cdata[3] = qfprom_cdata[1];
  262. mode = (cdata[0] & MSM8939_CAL_SEL_MASK) >> MSM8939_CAL_SEL_SHIFT;
  263. dev_dbg(priv->dev, "calibration mode is %d\n", mode);
  264. switch (mode) {
  265. case TWO_PT_CALIB:
  266. base1 = (cdata[3] & MSM8939_BASE1_MASK) >> MSM8939_BASE1_SHIFT;
  267. p2[0] = (cdata[0] & MSM8939_S0_P2_MASK) >> MSM8939_S0_P2_SHIFT;
  268. p2[1] = (cdata[0] & MSM8939_S1_P2_MASK) >> MSM8939_S1_P2_SHIFT;
  269. p2[2] = (cdata[1] & MSM8939_S2_P2_MASK) >> MSM8939_S2_P2_SHIFT;
  270. p2[3] = (cdata[1] & MSM8939_S3_P2_MASK) >> MSM8939_S3_P2_SHIFT;
  271. p2[4] = (cdata[1] & MSM8939_S4_P2_MASK) >> MSM8939_S4_P2_SHIFT;
  272. p2[5] = (cdata[2] & MSM8939_S5_P2_MASK) >> MSM8939_S5_P2_SHIFT;
  273. p2[6] = (cdata[2] & MSM8939_S6_P2_MASK) >> MSM8939_S6_P2_SHIFT;
  274. p2[7] = (cdata[3] & MSM8939_S7_P2_MASK) >> MSM8939_S7_P2_SHIFT;
  275. p2[8] = (cdata[3] & MSM8939_S8_P2_MASK) >> MSM8939_S8_P2_SHIFT;
  276. for (i = 0; i < priv->num_sensors; i++)
  277. p2[i] = (base1 + p2[i]) << 2;
  278. fallthrough;
  279. case ONE_PT_CALIB2:
  280. base0 = (cdata[2] & MSM8939_BASE0_MASK) >> MSM8939_BASE0_SHIFT;
  281. p1[0] = (cdata[0] & MSM8939_S0_P1_MASK) >> MSM8939_S0_P1_SHIFT;
  282. p1[1] = (cdata[0] & MSM8939_S1_P1_MASK) >> MSM8939_S1_P1_SHIFT;
  283. p1[2] = (cdata[0] & MSM8939_S2_P1_MASK_0_4) >> MSM8939_S2_P1_SHIFT_0_4;
  284. p1[2] |= ((cdata[1] & MSM8939_S2_P1_MASK_5) >> MSM8939_S2_P1_SHIFT_5) << 5;
  285. p1[3] = (cdata[1] & MSM8939_S3_P1_MASK) >> MSM8939_S3_P1_SHIFT;
  286. p1[4] = (cdata[1] & MSM8939_S4_P1_MASK) >> MSM8939_S4_P1_SHIFT;
  287. p1[5] = (cdata[2] & MSM8939_S5_P1_MASK) >> MSM8939_S5_P1_SHIFT;
  288. p1[6] = (cdata[2] & MSM8939_S6_P1_MASK) >> MSM8939_S6_P1_SHIFT;
  289. p1[7] = (cdata[3] & MSM8939_S7_P1_MASK) >> MSM8939_S7_P1_SHIFT;
  290. p1[8] = (cdata[3] & MSM8939_S8_P1_MASK) >> MSM8939_S8_P1_SHIFT;
  291. for (i = 0; i < priv->num_sensors; i++)
  292. p1[i] = ((base0) + p1[i]) << 2;
  293. break;
  294. default:
  295. for (i = 0; i < priv->num_sensors; i++) {
  296. p1[i] = 500;
  297. p2[i] = 780;
  298. }
  299. break;
  300. }
  301. compute_intercept_slope(priv, p1, p2, mode);
  302. kfree(qfprom_cdata);
  303. return 0;
  304. }
  305. static int calibrate_8974(struct tsens_priv *priv)
  306. {
  307. int base1 = 0, base2 = 0, i;
  308. u32 p1[11], p2[11];
  309. int mode = 0;
  310. u32 *calib, *bkp;
  311. u32 calib_redun_sel;
  312. calib = (u32 *)qfprom_read(priv->dev, "calib");
  313. if (IS_ERR(calib))
  314. return PTR_ERR(calib);
  315. bkp = (u32 *)qfprom_read(priv->dev, "calib_backup");
  316. if (IS_ERR(bkp)) {
  317. kfree(calib);
  318. return PTR_ERR(bkp);
  319. }
  320. calib_redun_sel = bkp[1] & BKP_REDUN_SEL;
  321. calib_redun_sel >>= BKP_REDUN_SHIFT;
  322. if (calib_redun_sel == BKP_SEL) {
  323. mode = (calib[4] & CAL_SEL_0_1) >> CAL_SEL_SHIFT;
  324. mode |= (calib[5] & CAL_SEL_2) >> CAL_SEL_SHIFT_2;
  325. switch (mode) {
  326. case TWO_PT_CALIB:
  327. base2 = (bkp[2] & BASE2_BKP_MASK) >> BASE2_BKP_SHIFT;
  328. p2[0] = (bkp[2] & S0_P2_BKP_MASK) >> S0_P2_BKP_SHIFT;
  329. p2[1] = (bkp[3] & S1_P2_BKP_MASK);
  330. p2[2] = (bkp[3] & S2_P2_BKP_MASK) >> S2_P2_BKP_SHIFT;
  331. p2[3] = (bkp[3] & S3_P2_BKP_MASK) >> S3_P2_BKP_SHIFT;
  332. p2[4] = (bkp[3] & S4_P2_BKP_MASK) >> S4_P2_BKP_SHIFT;
  333. p2[5] = (calib[4] & S5_P2_BKP_MASK) >> S5_P2_BKP_SHIFT;
  334. p2[6] = (calib[5] & S6_P2_BKP_MASK);
  335. p2[7] = (calib[5] & S7_P2_BKP_MASK) >> S7_P2_BKP_SHIFT;
  336. p2[8] = (calib[5] & S8_P2_BKP_MASK) >> S8_P2_BKP_SHIFT;
  337. p2[9] = (calib[5] & S9_P2_BKP_MASK) >> S9_P2_BKP_SHIFT;
  338. p2[10] = (calib[5] & S10_P2_BKP_MASK) >> S10_P2_BKP_SHIFT;
  339. fallthrough;
  340. case ONE_PT_CALIB:
  341. case ONE_PT_CALIB2:
  342. base1 = bkp[0] & BASE1_MASK;
  343. p1[0] = (bkp[0] & S0_P1_MASK) >> S0_P1_SHIFT;
  344. p1[1] = (bkp[0] & S1_P1_MASK) >> S1_P1_SHIFT;
  345. p1[2] = (bkp[0] & S2_P1_MASK) >> S2_P1_SHIFT;
  346. p1[3] = (bkp[0] & S3_P1_MASK) >> S3_P1_SHIFT;
  347. p1[4] = (bkp[1] & S4_P1_MASK);
  348. p1[5] = (bkp[1] & S5_P1_MASK) >> S5_P1_SHIFT;
  349. p1[6] = (bkp[1] & S6_P1_MASK) >> S6_P1_SHIFT;
  350. p1[7] = (bkp[1] & S7_P1_MASK) >> S7_P1_SHIFT;
  351. p1[8] = (bkp[2] & S8_P1_MASK_BKP) >> S8_P1_SHIFT;
  352. p1[9] = (bkp[2] & S9_P1_MASK_BKP) >> S9_P1_BKP_SHIFT;
  353. p1[10] = (bkp[2] & S10_P1_MASK_BKP) >> S10_P1_BKP_SHIFT;
  354. break;
  355. }
  356. } else {
  357. mode = (calib[1] & CAL_SEL_0_1) >> CAL_SEL_SHIFT;
  358. mode |= (calib[3] & CAL_SEL_2) >> CAL_SEL_SHIFT_2;
  359. switch (mode) {
  360. case TWO_PT_CALIB:
  361. base2 = (calib[2] & BASE2_MASK) >> BASE2_SHIFT;
  362. p2[0] = (calib[2] & S0_P2_MASK) >> S0_P2_SHIFT;
  363. p2[1] = (calib[2] & S1_P2_MASK) >> S1_P2_SHIFT;
  364. p2[2] = (calib[3] & S2_P2_MASK);
  365. p2[3] = (calib[3] & S3_P2_MASK) >> S3_P2_SHIFT;
  366. p2[4] = (calib[3] & S4_P2_MASK) >> S4_P2_SHIFT;
  367. p2[5] = (calib[3] & S5_P2_MASK) >> S5_P2_SHIFT;
  368. p2[6] = (calib[3] & S6_P2_MASK) >> S6_P2_SHIFT;
  369. p2[7] = (calib[4] & S7_P2_MASK);
  370. p2[8] = (calib[4] & S8_P2_MASK) >> S8_P2_SHIFT;
  371. p2[9] = (calib[4] & S9_P2_MASK) >> S9_P2_SHIFT;
  372. p2[10] = (calib[4] & S10_P2_MASK) >> S10_P2_SHIFT;
  373. fallthrough;
  374. case ONE_PT_CALIB:
  375. case ONE_PT_CALIB2:
  376. base1 = calib[0] & BASE1_MASK;
  377. p1[0] = (calib[0] & S0_P1_MASK) >> S0_P1_SHIFT;
  378. p1[1] = (calib[0] & S1_P1_MASK) >> S1_P1_SHIFT;
  379. p1[2] = (calib[0] & S2_P1_MASK) >> S2_P1_SHIFT;
  380. p1[3] = (calib[0] & S3_P1_MASK) >> S3_P1_SHIFT;
  381. p1[4] = (calib[1] & S4_P1_MASK);
  382. p1[5] = (calib[1] & S5_P1_MASK) >> S5_P1_SHIFT;
  383. p1[6] = (calib[1] & S6_P1_MASK) >> S6_P1_SHIFT;
  384. p1[7] = (calib[1] & S7_P1_MASK) >> S7_P1_SHIFT;
  385. p1[8] = (calib[1] & S8_P1_MASK) >> S8_P1_SHIFT;
  386. p1[9] = (calib[2] & S9_P1_MASK);
  387. p1[10] = (calib[2] & S10_P1_MASK) >> S10_P1_SHIFT;
  388. break;
  389. }
  390. }
  391. switch (mode) {
  392. case ONE_PT_CALIB:
  393. for (i = 0; i < priv->num_sensors; i++)
  394. p1[i] += (base1 << 2) | BIT_APPEND;
  395. break;
  396. case TWO_PT_CALIB:
  397. for (i = 0; i < priv->num_sensors; i++) {
  398. p2[i] += base2;
  399. p2[i] <<= 2;
  400. p2[i] |= BIT_APPEND;
  401. }
  402. fallthrough;
  403. case ONE_PT_CALIB2:
  404. for (i = 0; i < priv->num_sensors; i++) {
  405. p1[i] += base1;
  406. p1[i] <<= 2;
  407. p1[i] |= BIT_APPEND;
  408. }
  409. break;
  410. default:
  411. for (i = 0; i < priv->num_sensors; i++)
  412. p2[i] = 780;
  413. p1[0] = 502;
  414. p1[1] = 509;
  415. p1[2] = 503;
  416. p1[3] = 509;
  417. p1[4] = 505;
  418. p1[5] = 509;
  419. p1[6] = 507;
  420. p1[7] = 510;
  421. p1[8] = 508;
  422. p1[9] = 509;
  423. p1[10] = 508;
  424. break;
  425. }
  426. compute_intercept_slope(priv, p1, p2, mode);
  427. kfree(calib);
  428. kfree(bkp);
  429. return 0;
  430. }
  431. static int calibrate_9607(struct tsens_priv *priv)
  432. {
  433. int base, i;
  434. u32 p1[5], p2[5];
  435. int mode = 0;
  436. u32 *qfprom_cdata;
  437. qfprom_cdata = (u32 *)qfprom_read(priv->dev, "calib");
  438. if (IS_ERR(qfprom_cdata))
  439. return PTR_ERR(qfprom_cdata);
  440. mode = (qfprom_cdata[2] & MDM9607_CAL_SEL_MASK) >> MDM9607_CAL_SEL_SHIFT;
  441. dev_dbg(priv->dev, "calibration mode is %d\n", mode);
  442. switch (mode) {
  443. case TWO_PT_CALIB:
  444. base = (qfprom_cdata[2] & MDM9607_BASE1_MASK) >> MDM9607_BASE1_SHIFT;
  445. p2[0] = (qfprom_cdata[0] & MDM9607_S0_P2_MASK) >> MDM9607_S0_P2_SHIFT;
  446. p2[1] = (qfprom_cdata[0] & MDM9607_S1_P2_MASK) >> MDM9607_S1_P2_SHIFT;
  447. p2[2] = (qfprom_cdata[1] & MDM9607_S2_P2_MASK) >> MDM9607_S2_P2_SHIFT;
  448. p2[3] = (qfprom_cdata[1] & MDM9607_S3_P2_MASK) >> MDM9607_S3_P2_SHIFT;
  449. p2[4] = (qfprom_cdata[2] & MDM9607_S4_P2_MASK) >> MDM9607_S4_P2_SHIFT;
  450. for (i = 0; i < priv->num_sensors; i++)
  451. p2[i] = ((base + p2[i]) << 2);
  452. fallthrough;
  453. case ONE_PT_CALIB2:
  454. base = (qfprom_cdata[0] & MDM9607_BASE0_MASK);
  455. p1[0] = (qfprom_cdata[0] & MDM9607_S0_P1_MASK) >> MDM9607_S0_P1_SHIFT;
  456. p1[1] = (qfprom_cdata[0] & MDM9607_S1_P1_MASK) >> MDM9607_S1_P1_SHIFT;
  457. p1[2] = (qfprom_cdata[1] & MDM9607_S2_P1_MASK) >> MDM9607_S2_P1_SHIFT;
  458. p1[3] = (qfprom_cdata[1] & MDM9607_S3_P1_MASK) >> MDM9607_S3_P1_SHIFT;
  459. p1[4] = (qfprom_cdata[2] & MDM9607_S4_P1_MASK) >> MDM9607_S4_P1_SHIFT;
  460. for (i = 0; i < priv->num_sensors; i++)
  461. p1[i] = ((base + p1[i]) << 2);
  462. break;
  463. default:
  464. for (i = 0; i < priv->num_sensors; i++) {
  465. p1[i] = 500;
  466. p2[i] = 780;
  467. }
  468. break;
  469. }
  470. compute_intercept_slope(priv, p1, p2, mode);
  471. kfree(qfprom_cdata);
  472. return 0;
  473. }
  474. static int __init init_8939(struct tsens_priv *priv) {
  475. priv->sensor[0].slope = 2911;
  476. priv->sensor[1].slope = 2789;
  477. priv->sensor[2].slope = 2906;
  478. priv->sensor[3].slope = 2763;
  479. priv->sensor[4].slope = 2922;
  480. priv->sensor[5].slope = 2867;
  481. priv->sensor[6].slope = 2833;
  482. priv->sensor[7].slope = 2838;
  483. priv->sensor[8].slope = 2840;
  484. /* priv->sensor[9].slope = 2852; */
  485. return init_common(priv);
  486. }
  487. /* v0.1: 8916, 8939, 8974, 9607 */
  488. static struct tsens_features tsens_v0_1_feat = {
  489. .ver_major = VER_0_1,
  490. .crit_int = 0,
  491. .adc = 1,
  492. .srot_split = 1,
  493. .max_sensors = 11,
  494. };
  495. static const struct reg_field tsens_v0_1_regfields[MAX_REGFIELDS] = {
  496. /* ----- SROT ------ */
  497. /* No VERSION information */
  498. /* CTRL_OFFSET */
  499. [TSENS_EN] = REG_FIELD(SROT_CTRL_OFF, 0, 0),
  500. [TSENS_SW_RST] = REG_FIELD(SROT_CTRL_OFF, 1, 1),
  501. /* ----- TM ------ */
  502. /* INTERRUPT ENABLE */
  503. [INT_EN] = REG_FIELD(TM_INT_EN_OFF, 0, 0),
  504. /* UPPER/LOWER TEMPERATURE THRESHOLDS */
  505. REG_FIELD_FOR_EACH_SENSOR11(LOW_THRESH, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 0, 9),
  506. REG_FIELD_FOR_EACH_SENSOR11(UP_THRESH, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 10, 19),
  507. /* UPPER/LOWER INTERRUPTS [CLEAR/STATUS] */
  508. REG_FIELD_FOR_EACH_SENSOR11(LOW_INT_CLEAR, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 20, 20),
  509. REG_FIELD_FOR_EACH_SENSOR11(UP_INT_CLEAR, TM_Sn_UPPER_LOWER_STATUS_CTRL_OFF, 21, 21),
  510. /* NO CRITICAL INTERRUPT SUPPORT on v0.1 */
  511. /* Sn_STATUS */
  512. REG_FIELD_FOR_EACH_SENSOR11(LAST_TEMP, TM_Sn_STATUS_OFF, 0, 9),
  513. /* No VALID field on v0.1 */
  514. /* xxx_STATUS bits: 1 == threshold violated */
  515. REG_FIELD_FOR_EACH_SENSOR11(MIN_STATUS, TM_Sn_STATUS_OFF, 10, 10),
  516. REG_FIELD_FOR_EACH_SENSOR11(LOWER_STATUS, TM_Sn_STATUS_OFF, 11, 11),
  517. REG_FIELD_FOR_EACH_SENSOR11(UPPER_STATUS, TM_Sn_STATUS_OFF, 12, 12),
  518. /* No CRITICAL field on v0.1 */
  519. REG_FIELD_FOR_EACH_SENSOR11(MAX_STATUS, TM_Sn_STATUS_OFF, 13, 13),
  520. /* TRDY: 1=ready, 0=in progress */
  521. [TRDY] = REG_FIELD(TM_TRDY_OFF, 0, 0),
  522. };
  523. static const struct tsens_ops ops_8916 = {
  524. .init = init_common,
  525. .calibrate = calibrate_8916,
  526. .get_temp = get_temp_common,
  527. };
  528. struct tsens_plat_data data_8916 = {
  529. .num_sensors = 5,
  530. .ops = &ops_8916,
  531. .hw_ids = (unsigned int []){0, 1, 2, 4, 5 },
  532. .feat = &tsens_v0_1_feat,
  533. .fields = tsens_v0_1_regfields,
  534. };
  535. static const struct tsens_ops ops_8939 = {
  536. .init = init_8939,
  537. .calibrate = calibrate_8939,
  538. .get_temp = get_temp_common,
  539. };
  540. struct tsens_plat_data data_8939 = {
  541. .num_sensors = 9,
  542. .ops = &ops_8939,
  543. .hw_ids = (unsigned int []){ 0, 1, 2, 3, 5, 6, 7, 8, 9, /* 10 */ },
  544. .feat = &tsens_v0_1_feat,
  545. .fields = tsens_v0_1_regfields,
  546. };
  547. static const struct tsens_ops ops_8974 = {
  548. .init = init_common,
  549. .calibrate = calibrate_8974,
  550. .get_temp = get_temp_common,
  551. };
  552. struct tsens_plat_data data_8974 = {
  553. .num_sensors = 11,
  554. .ops = &ops_8974,
  555. .feat = &tsens_v0_1_feat,
  556. .fields = tsens_v0_1_regfields,
  557. };
  558. static const struct tsens_ops ops_9607 = {
  559. .init = init_common,
  560. .calibrate = calibrate_9607,
  561. .get_temp = get_temp_common,
  562. };
  563. struct tsens_plat_data data_9607 = {
  564. .num_sensors = 5,
  565. .ops = &ops_9607,
  566. .hw_ids = (unsigned int []){ 0, 1, 2, 3, 4 },
  567. .feat = &tsens_v0_1_feat,
  568. .fields = tsens_v0_1_regfields,
  569. };