dps310.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  1. // SPDX-License-Identifier: GPL-2.0+
  2. // Copyright IBM Corp 2019
  3. /*
  4. * The DPS310 is a barometric pressure and temperature sensor.
  5. * Currently only reading a single temperature is supported by
  6. * this driver.
  7. *
  8. * https://www.infineon.com/dgdl/?fileId=5546d462576f34750157750826c42242
  9. *
  10. * Temperature calculation:
  11. * c0 * 0.5 + c1 * T_raw / kT °C
  12. *
  13. * TODO:
  14. * - Optionally support the FIFO
  15. */
  16. #include <linux/i2c.h>
  17. #include <linux/limits.h>
  18. #include <linux/math64.h>
  19. #include <linux/module.h>
  20. #include <linux/regmap.h>
  21. #include <linux/iio/iio.h>
  22. #include <linux/iio/sysfs.h>
  23. #define DPS310_DEV_NAME "dps310"
  24. #define DPS310_PRS_B0 0x00
  25. #define DPS310_PRS_B1 0x01
  26. #define DPS310_PRS_B2 0x02
  27. #define DPS310_TMP_B0 0x03
  28. #define DPS310_TMP_B1 0x04
  29. #define DPS310_TMP_B2 0x05
  30. #define DPS310_PRS_CFG 0x06
  31. #define DPS310_PRS_RATE_BITS GENMASK(6, 4)
  32. #define DPS310_PRS_PRC_BITS GENMASK(3, 0)
  33. #define DPS310_TMP_CFG 0x07
  34. #define DPS310_TMP_RATE_BITS GENMASK(6, 4)
  35. #define DPS310_TMP_PRC_BITS GENMASK(3, 0)
  36. #define DPS310_TMP_EXT BIT(7)
  37. #define DPS310_MEAS_CFG 0x08
  38. #define DPS310_MEAS_CTRL_BITS GENMASK(2, 0)
  39. #define DPS310_PRS_EN BIT(0)
  40. #define DPS310_TEMP_EN BIT(1)
  41. #define DPS310_BACKGROUND BIT(2)
  42. #define DPS310_PRS_RDY BIT(4)
  43. #define DPS310_TMP_RDY BIT(5)
  44. #define DPS310_SENSOR_RDY BIT(6)
  45. #define DPS310_COEF_RDY BIT(7)
  46. #define DPS310_CFG_REG 0x09
  47. #define DPS310_INT_HL BIT(7)
  48. #define DPS310_TMP_SHIFT_EN BIT(3)
  49. #define DPS310_PRS_SHIFT_EN BIT(4)
  50. #define DPS310_FIFO_EN BIT(5)
  51. #define DPS310_SPI_EN BIT(6)
  52. #define DPS310_RESET 0x0c
  53. #define DPS310_RESET_MAGIC 0x09
  54. #define DPS310_COEF_BASE 0x10
  55. /* Make sure sleep time is <= 30ms for usleep_range */
  56. #define DPS310_POLL_SLEEP_US(t) min(30000, (t) / 8)
  57. /* Silently handle error in rate value here */
  58. #define DPS310_POLL_TIMEOUT_US(rc) ((rc) <= 0 ? 1000000 : 1000000 / (rc))
  59. #define DPS310_PRS_BASE DPS310_PRS_B0
  60. #define DPS310_TMP_BASE DPS310_TMP_B0
  61. /*
  62. * These values (defined in the spec) indicate how to scale the raw register
  63. * values for each level of precision available.
  64. */
  65. static const int scale_factors[] = {
  66. 524288,
  67. 1572864,
  68. 3670016,
  69. 7864320,
  70. 253952,
  71. 516096,
  72. 1040384,
  73. 2088960,
  74. };
  75. struct dps310_data {
  76. struct i2c_client *client;
  77. struct regmap *regmap;
  78. struct mutex lock; /* Lock for sequential HW access functions */
  79. s32 c0, c1;
  80. s32 c00, c10, c20, c30, c01, c11, c21;
  81. s32 pressure_raw;
  82. s32 temp_raw;
  83. bool timeout_recovery_failed;
  84. };
  85. static const struct iio_chan_spec dps310_channels[] = {
  86. {
  87. .type = IIO_TEMP,
  88. .info_mask_separate = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO) |
  89. BIT(IIO_CHAN_INFO_SAMP_FREQ) |
  90. BIT(IIO_CHAN_INFO_PROCESSED),
  91. },
  92. {
  93. .type = IIO_PRESSURE,
  94. .info_mask_separate = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO) |
  95. BIT(IIO_CHAN_INFO_SAMP_FREQ) |
  96. BIT(IIO_CHAN_INFO_PROCESSED),
  97. },
  98. };
  99. /* To be called after checking the COEF_RDY bit in MEAS_CFG */
  100. static int dps310_get_coefs(struct dps310_data *data)
  101. {
  102. int rc;
  103. u8 coef[18];
  104. u32 c0, c1;
  105. u32 c00, c10, c20, c30, c01, c11, c21;
  106. /* Read all sensor calibration coefficients from the COEF registers. */
  107. rc = regmap_bulk_read(data->regmap, DPS310_COEF_BASE, coef,
  108. sizeof(coef));
  109. if (rc < 0)
  110. return rc;
  111. /*
  112. * Calculate temperature calibration coefficients c0 and c1. The
  113. * numbers are 12-bit 2's complement numbers.
  114. */
  115. c0 = (coef[0] << 4) | (coef[1] >> 4);
  116. data->c0 = sign_extend32(c0, 11);
  117. c1 = ((coef[1] & GENMASK(3, 0)) << 8) | coef[2];
  118. data->c1 = sign_extend32(c1, 11);
  119. /*
  120. * Calculate pressure calibration coefficients. c00 and c10 are 20 bit
  121. * 2's complement numbers, while the rest are 16 bit 2's complement
  122. * numbers.
  123. */
  124. c00 = (coef[3] << 12) | (coef[4] << 4) | (coef[5] >> 4);
  125. data->c00 = sign_extend32(c00, 19);
  126. c10 = ((coef[5] & GENMASK(3, 0)) << 16) | (coef[6] << 8) | coef[7];
  127. data->c10 = sign_extend32(c10, 19);
  128. c01 = (coef[8] << 8) | coef[9];
  129. data->c01 = sign_extend32(c01, 15);
  130. c11 = (coef[10] << 8) | coef[11];
  131. data->c11 = sign_extend32(c11, 15);
  132. c20 = (coef[12] << 8) | coef[13];
  133. data->c20 = sign_extend32(c20, 15);
  134. c21 = (coef[14] << 8) | coef[15];
  135. data->c21 = sign_extend32(c21, 15);
  136. c30 = (coef[16] << 8) | coef[17];
  137. data->c30 = sign_extend32(c30, 15);
  138. return 0;
  139. }
  140. /*
  141. * Some versions of the chip will read temperatures in the ~60C range when
  142. * it's actually ~20C. This is the manufacturer recommended workaround
  143. * to correct the issue. The registers used below are undocumented.
  144. */
  145. static int dps310_temp_workaround(struct dps310_data *data)
  146. {
  147. int rc;
  148. int reg;
  149. rc = regmap_read(data->regmap, 0x32, &reg);
  150. if (rc < 0)
  151. return rc;
  152. /*
  153. * If bit 1 is set then the device is okay, and the workaround does not
  154. * need to be applied
  155. */
  156. if (reg & BIT(1))
  157. return 0;
  158. rc = regmap_write(data->regmap, 0x0e, 0xA5);
  159. if (rc)
  160. return rc;
  161. rc = regmap_write(data->regmap, 0x0f, 0x96);
  162. if (rc)
  163. return rc;
  164. rc = regmap_write(data->regmap, 0x62, 0x02);
  165. if (rc)
  166. return rc;
  167. rc = regmap_write(data->regmap, 0x0e, 0x00);
  168. if (rc)
  169. return rc;
  170. return regmap_write(data->regmap, 0x0f, 0x00);
  171. }
  172. static int dps310_startup(struct dps310_data *data)
  173. {
  174. int rc;
  175. int ready;
  176. /*
  177. * Set up pressure sensor in single sample, one measurement per second
  178. * mode
  179. */
  180. rc = regmap_write(data->regmap, DPS310_PRS_CFG, 0);
  181. if (rc)
  182. return rc;
  183. /*
  184. * Set up external (MEMS) temperature sensor in single sample, one
  185. * measurement per second mode
  186. */
  187. rc = regmap_write(data->regmap, DPS310_TMP_CFG, DPS310_TMP_EXT);
  188. if (rc)
  189. return rc;
  190. /* Temp and pressure shifts are disabled when PRC <= 8 */
  191. rc = regmap_write_bits(data->regmap, DPS310_CFG_REG,
  192. DPS310_PRS_SHIFT_EN | DPS310_TMP_SHIFT_EN, 0);
  193. if (rc)
  194. return rc;
  195. /* MEAS_CFG doesn't update correctly unless first written with 0 */
  196. rc = regmap_write_bits(data->regmap, DPS310_MEAS_CFG,
  197. DPS310_MEAS_CTRL_BITS, 0);
  198. if (rc)
  199. return rc;
  200. /* Turn on temperature and pressure measurement in the background */
  201. rc = regmap_write_bits(data->regmap, DPS310_MEAS_CFG,
  202. DPS310_MEAS_CTRL_BITS, DPS310_PRS_EN |
  203. DPS310_TEMP_EN | DPS310_BACKGROUND);
  204. if (rc)
  205. return rc;
  206. /*
  207. * Calibration coefficients required for reporting temperature.
  208. * They are available 40ms after the device has started
  209. */
  210. rc = regmap_read_poll_timeout(data->regmap, DPS310_MEAS_CFG, ready,
  211. ready & DPS310_COEF_RDY, 10000, 40000);
  212. if (rc)
  213. return rc;
  214. rc = dps310_get_coefs(data);
  215. if (rc)
  216. return rc;
  217. return dps310_temp_workaround(data);
  218. }
  219. static int dps310_get_pres_precision(struct dps310_data *data, int *val)
  220. {
  221. int reg_val, rc;
  222. rc = regmap_read(data->regmap, DPS310_PRS_CFG, &reg_val);
  223. if (rc < 0)
  224. return rc;
  225. *val = BIT(reg_val & GENMASK(2, 0));
  226. return 0;
  227. }
  228. static int dps310_get_temp_precision(struct dps310_data *data, int *val)
  229. {
  230. int reg_val, rc;
  231. rc = regmap_read(data->regmap, DPS310_TMP_CFG, &reg_val);
  232. if (rc < 0)
  233. return rc;
  234. /*
  235. * Scale factor is bottom 4 bits of the register, but 1111 is
  236. * reserved so just grab bottom three
  237. */
  238. *val = BIT(reg_val & GENMASK(2, 0));
  239. return 0;
  240. }
  241. /* Called with lock held */
  242. static int dps310_set_pres_precision(struct dps310_data *data, int val)
  243. {
  244. int rc;
  245. u8 shift_en;
  246. if (val < 0 || val > 128)
  247. return -EINVAL;
  248. shift_en = val >= 16 ? DPS310_PRS_SHIFT_EN : 0;
  249. rc = regmap_write_bits(data->regmap, DPS310_CFG_REG,
  250. DPS310_PRS_SHIFT_EN, shift_en);
  251. if (rc)
  252. return rc;
  253. return regmap_update_bits(data->regmap, DPS310_PRS_CFG,
  254. DPS310_PRS_PRC_BITS, ilog2(val));
  255. }
  256. /* Called with lock held */
  257. static int dps310_set_temp_precision(struct dps310_data *data, int val)
  258. {
  259. int rc;
  260. u8 shift_en;
  261. if (val < 0 || val > 128)
  262. return -EINVAL;
  263. shift_en = val >= 16 ? DPS310_TMP_SHIFT_EN : 0;
  264. rc = regmap_write_bits(data->regmap, DPS310_CFG_REG,
  265. DPS310_TMP_SHIFT_EN, shift_en);
  266. if (rc)
  267. return rc;
  268. return regmap_update_bits(data->regmap, DPS310_TMP_CFG,
  269. DPS310_TMP_PRC_BITS, ilog2(val));
  270. }
  271. /* Called with lock held */
  272. static int dps310_set_pres_samp_freq(struct dps310_data *data, int freq)
  273. {
  274. u8 val;
  275. if (freq < 0 || freq > 128)
  276. return -EINVAL;
  277. val = ilog2(freq) << 4;
  278. return regmap_update_bits(data->regmap, DPS310_PRS_CFG,
  279. DPS310_PRS_RATE_BITS, val);
  280. }
  281. /* Called with lock held */
  282. static int dps310_set_temp_samp_freq(struct dps310_data *data, int freq)
  283. {
  284. u8 val;
  285. if (freq < 0 || freq > 128)
  286. return -EINVAL;
  287. val = ilog2(freq) << 4;
  288. return regmap_update_bits(data->regmap, DPS310_TMP_CFG,
  289. DPS310_TMP_RATE_BITS, val);
  290. }
  291. static int dps310_get_pres_samp_freq(struct dps310_data *data, int *val)
  292. {
  293. int reg_val, rc;
  294. rc = regmap_read(data->regmap, DPS310_PRS_CFG, &reg_val);
  295. if (rc < 0)
  296. return rc;
  297. *val = BIT((reg_val & DPS310_PRS_RATE_BITS) >> 4);
  298. return 0;
  299. }
  300. static int dps310_get_temp_samp_freq(struct dps310_data *data, int *val)
  301. {
  302. int reg_val, rc;
  303. rc = regmap_read(data->regmap, DPS310_TMP_CFG, &reg_val);
  304. if (rc < 0)
  305. return rc;
  306. *val = BIT((reg_val & DPS310_TMP_RATE_BITS) >> 4);
  307. return 0;
  308. }
  309. static int dps310_get_pres_k(struct dps310_data *data, int *val)
  310. {
  311. int reg_val, rc;
  312. rc = regmap_read(data->regmap, DPS310_PRS_CFG, &reg_val);
  313. if (rc < 0)
  314. return rc;
  315. *val = scale_factors[reg_val & GENMASK(2, 0)];
  316. return 0;
  317. }
  318. static int dps310_get_temp_k(struct dps310_data *data, int *val)
  319. {
  320. int reg_val, rc;
  321. rc = regmap_read(data->regmap, DPS310_TMP_CFG, &reg_val);
  322. if (rc < 0)
  323. return rc;
  324. *val = scale_factors[reg_val & GENMASK(2, 0)];
  325. return 0;
  326. }
  327. static int dps310_reset_wait(struct dps310_data *data)
  328. {
  329. int rc;
  330. rc = regmap_write(data->regmap, DPS310_RESET, DPS310_RESET_MAGIC);
  331. if (rc)
  332. return rc;
  333. /* Wait for device chip access: 15ms in specification */
  334. usleep_range(15000, 55000);
  335. return 0;
  336. }
  337. static int dps310_reset_reinit(struct dps310_data *data)
  338. {
  339. int rc;
  340. rc = dps310_reset_wait(data);
  341. if (rc)
  342. return rc;
  343. return dps310_startup(data);
  344. }
  345. static int dps310_ready_status(struct dps310_data *data, int ready_bit, int timeout)
  346. {
  347. int sleep = DPS310_POLL_SLEEP_US(timeout);
  348. int ready;
  349. return regmap_read_poll_timeout(data->regmap, DPS310_MEAS_CFG, ready, ready & ready_bit,
  350. sleep, timeout);
  351. }
  352. static int dps310_ready(struct dps310_data *data, int ready_bit, int timeout)
  353. {
  354. int rc;
  355. rc = dps310_ready_status(data, ready_bit, timeout);
  356. if (rc) {
  357. if (rc == -ETIMEDOUT && !data->timeout_recovery_failed) {
  358. /* Reset and reinitialize the chip. */
  359. if (dps310_reset_reinit(data)) {
  360. data->timeout_recovery_failed = true;
  361. } else {
  362. /* Try again to get sensor ready status. */
  363. if (dps310_ready_status(data, ready_bit, timeout))
  364. data->timeout_recovery_failed = true;
  365. else
  366. return 0;
  367. }
  368. }
  369. return rc;
  370. }
  371. data->timeout_recovery_failed = false;
  372. return 0;
  373. }
  374. static int dps310_read_pres_raw(struct dps310_data *data)
  375. {
  376. int rc;
  377. int rate;
  378. int timeout;
  379. s32 raw;
  380. u8 val[3];
  381. if (mutex_lock_interruptible(&data->lock))
  382. return -EINTR;
  383. rc = dps310_get_pres_samp_freq(data, &rate);
  384. if (rc)
  385. goto done;
  386. timeout = DPS310_POLL_TIMEOUT_US(rate);
  387. /* Poll for sensor readiness; base the timeout upon the sample rate. */
  388. rc = dps310_ready(data, DPS310_PRS_RDY, timeout);
  389. if (rc)
  390. goto done;
  391. rc = regmap_bulk_read(data->regmap, DPS310_PRS_BASE, val, sizeof(val));
  392. if (rc < 0)
  393. goto done;
  394. raw = (val[0] << 16) | (val[1] << 8) | val[2];
  395. data->pressure_raw = sign_extend32(raw, 23);
  396. done:
  397. mutex_unlock(&data->lock);
  398. return rc;
  399. }
  400. /* Called with lock held */
  401. static int dps310_read_temp_ready(struct dps310_data *data)
  402. {
  403. int rc;
  404. u8 val[3];
  405. s32 raw;
  406. rc = regmap_bulk_read(data->regmap, DPS310_TMP_BASE, val, sizeof(val));
  407. if (rc < 0)
  408. return rc;
  409. raw = (val[0] << 16) | (val[1] << 8) | val[2];
  410. data->temp_raw = sign_extend32(raw, 23);
  411. return 0;
  412. }
  413. static int dps310_read_temp_raw(struct dps310_data *data)
  414. {
  415. int rc;
  416. int rate;
  417. int timeout;
  418. if (mutex_lock_interruptible(&data->lock))
  419. return -EINTR;
  420. rc = dps310_get_temp_samp_freq(data, &rate);
  421. if (rc)
  422. goto done;
  423. timeout = DPS310_POLL_TIMEOUT_US(rate);
  424. /* Poll for sensor readiness; base the timeout upon the sample rate. */
  425. rc = dps310_ready(data, DPS310_TMP_RDY, timeout);
  426. if (rc)
  427. goto done;
  428. rc = dps310_read_temp_ready(data);
  429. done:
  430. mutex_unlock(&data->lock);
  431. return rc;
  432. }
  433. static bool dps310_is_writeable_reg(struct device *dev, unsigned int reg)
  434. {
  435. switch (reg) {
  436. case DPS310_PRS_CFG:
  437. case DPS310_TMP_CFG:
  438. case DPS310_MEAS_CFG:
  439. case DPS310_CFG_REG:
  440. case DPS310_RESET:
  441. /* No documentation available on the registers below */
  442. case 0x0e:
  443. case 0x0f:
  444. case 0x62:
  445. return true;
  446. default:
  447. return false;
  448. }
  449. }
  450. static bool dps310_is_volatile_reg(struct device *dev, unsigned int reg)
  451. {
  452. switch (reg) {
  453. case DPS310_PRS_B0:
  454. case DPS310_PRS_B1:
  455. case DPS310_PRS_B2:
  456. case DPS310_TMP_B0:
  457. case DPS310_TMP_B1:
  458. case DPS310_TMP_B2:
  459. case DPS310_MEAS_CFG:
  460. case 0x32: /* No documentation available on this register */
  461. return true;
  462. default:
  463. return false;
  464. }
  465. }
  466. static int dps310_write_raw(struct iio_dev *iio,
  467. struct iio_chan_spec const *chan, int val,
  468. int val2, long mask)
  469. {
  470. int rc;
  471. struct dps310_data *data = iio_priv(iio);
  472. if (mutex_lock_interruptible(&data->lock))
  473. return -EINTR;
  474. switch (mask) {
  475. case IIO_CHAN_INFO_SAMP_FREQ:
  476. switch (chan->type) {
  477. case IIO_PRESSURE:
  478. rc = dps310_set_pres_samp_freq(data, val);
  479. break;
  480. case IIO_TEMP:
  481. rc = dps310_set_temp_samp_freq(data, val);
  482. break;
  483. default:
  484. rc = -EINVAL;
  485. break;
  486. }
  487. break;
  488. case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
  489. switch (chan->type) {
  490. case IIO_PRESSURE:
  491. rc = dps310_set_pres_precision(data, val);
  492. break;
  493. case IIO_TEMP:
  494. rc = dps310_set_temp_precision(data, val);
  495. break;
  496. default:
  497. rc = -EINVAL;
  498. break;
  499. }
  500. break;
  501. default:
  502. rc = -EINVAL;
  503. break;
  504. }
  505. mutex_unlock(&data->lock);
  506. return rc;
  507. }
  508. static int dps310_calculate_pressure(struct dps310_data *data, int *val)
  509. {
  510. int i;
  511. int rc;
  512. int t_ready;
  513. int kpi;
  514. int kti;
  515. s64 rem = 0ULL;
  516. s64 pressure = 0ULL;
  517. s64 p;
  518. s64 t;
  519. s64 denoms[7];
  520. s64 nums[7];
  521. s64 rems[7];
  522. s64 kp;
  523. s64 kt;
  524. rc = dps310_get_pres_k(data, &kpi);
  525. if (rc)
  526. return rc;
  527. rc = dps310_get_temp_k(data, &kti);
  528. if (rc)
  529. return rc;
  530. kp = (s64)kpi;
  531. kt = (s64)kti;
  532. /* Refresh temp if it's ready, otherwise just use the latest value */
  533. if (mutex_trylock(&data->lock)) {
  534. rc = regmap_read(data->regmap, DPS310_MEAS_CFG, &t_ready);
  535. if (rc >= 0 && t_ready & DPS310_TMP_RDY)
  536. dps310_read_temp_ready(data);
  537. mutex_unlock(&data->lock);
  538. }
  539. p = (s64)data->pressure_raw;
  540. t = (s64)data->temp_raw;
  541. /* Section 4.9.1 of the DPS310 spec; algebra'd to avoid underflow */
  542. nums[0] = (s64)data->c00;
  543. denoms[0] = 1LL;
  544. nums[1] = p * (s64)data->c10;
  545. denoms[1] = kp;
  546. nums[2] = p * p * (s64)data->c20;
  547. denoms[2] = kp * kp;
  548. nums[3] = p * p * p * (s64)data->c30;
  549. denoms[3] = kp * kp * kp;
  550. nums[4] = t * (s64)data->c01;
  551. denoms[4] = kt;
  552. nums[5] = t * p * (s64)data->c11;
  553. denoms[5] = kp * kt;
  554. nums[6] = t * p * p * (s64)data->c21;
  555. denoms[6] = kp * kp * kt;
  556. /* Kernel lacks a div64_s64_rem function; denoms are all positive */
  557. for (i = 0; i < 7; ++i) {
  558. u64 irem;
  559. if (nums[i] < 0LL) {
  560. pressure -= div64_u64_rem(-nums[i], denoms[i], &irem);
  561. rems[i] = -irem;
  562. } else {
  563. pressure += div64_u64_rem(nums[i], denoms[i], &irem);
  564. rems[i] = (s64)irem;
  565. }
  566. }
  567. /* Increase precision and calculate the remainder sum */
  568. for (i = 0; i < 7; ++i)
  569. rem += div64_s64((s64)rems[i] * 1000000000LL, denoms[i]);
  570. pressure += div_s64(rem, 1000000000LL);
  571. if (pressure < 0LL)
  572. return -ERANGE;
  573. *val = (int)min_t(s64, pressure, INT_MAX);
  574. return 0;
  575. }
  576. static int dps310_read_pressure(struct dps310_data *data, int *val, int *val2,
  577. long mask)
  578. {
  579. int rc;
  580. switch (mask) {
  581. case IIO_CHAN_INFO_SAMP_FREQ:
  582. rc = dps310_get_pres_samp_freq(data, val);
  583. if (rc)
  584. return rc;
  585. return IIO_VAL_INT;
  586. case IIO_CHAN_INFO_PROCESSED:
  587. rc = dps310_read_pres_raw(data);
  588. if (rc)
  589. return rc;
  590. rc = dps310_calculate_pressure(data, val);
  591. if (rc)
  592. return rc;
  593. *val2 = 1000; /* Convert Pa to KPa per IIO ABI */
  594. return IIO_VAL_FRACTIONAL;
  595. case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
  596. rc = dps310_get_pres_precision(data, val);
  597. if (rc)
  598. return rc;
  599. return IIO_VAL_INT;
  600. default:
  601. return -EINVAL;
  602. }
  603. }
  604. static int dps310_calculate_temp(struct dps310_data *data, int *val)
  605. {
  606. s64 c0;
  607. s64 t;
  608. int kt, rc;
  609. rc = dps310_get_temp_k(data, &kt);
  610. if (rc)
  611. return rc;
  612. /* Obtain inverse-scaled offset */
  613. c0 = div_s64((s64)kt * (s64)data->c0, 2);
  614. /* Add the offset to the unscaled temperature */
  615. t = c0 + ((s64)data->temp_raw * (s64)data->c1);
  616. /* Convert to milliCelsius and scale the temperature */
  617. *val = (int)div_s64(t * 1000LL, kt);
  618. return 0;
  619. }
  620. static int dps310_read_temp(struct dps310_data *data, int *val, int *val2,
  621. long mask)
  622. {
  623. int rc;
  624. switch (mask) {
  625. case IIO_CHAN_INFO_SAMP_FREQ:
  626. rc = dps310_get_temp_samp_freq(data, val);
  627. if (rc)
  628. return rc;
  629. return IIO_VAL_INT;
  630. case IIO_CHAN_INFO_PROCESSED:
  631. rc = dps310_read_temp_raw(data);
  632. if (rc)
  633. return rc;
  634. rc = dps310_calculate_temp(data, val);
  635. if (rc)
  636. return rc;
  637. return IIO_VAL_INT;
  638. case IIO_CHAN_INFO_OVERSAMPLING_RATIO:
  639. rc = dps310_get_temp_precision(data, val);
  640. if (rc)
  641. return rc;
  642. return IIO_VAL_INT;
  643. default:
  644. return -EINVAL;
  645. }
  646. }
  647. static int dps310_read_raw(struct iio_dev *iio,
  648. struct iio_chan_spec const *chan,
  649. int *val, int *val2, long mask)
  650. {
  651. struct dps310_data *data = iio_priv(iio);
  652. switch (chan->type) {
  653. case IIO_PRESSURE:
  654. return dps310_read_pressure(data, val, val2, mask);
  655. case IIO_TEMP:
  656. return dps310_read_temp(data, val, val2, mask);
  657. default:
  658. return -EINVAL;
  659. }
  660. }
  661. static void dps310_reset(void *action_data)
  662. {
  663. struct dps310_data *data = action_data;
  664. dps310_reset_wait(data);
  665. }
  666. static const struct regmap_config dps310_regmap_config = {
  667. .reg_bits = 8,
  668. .val_bits = 8,
  669. .writeable_reg = dps310_is_writeable_reg,
  670. .volatile_reg = dps310_is_volatile_reg,
  671. .cache_type = REGCACHE_RBTREE,
  672. .max_register = 0x62, /* No documentation available on this register */
  673. };
  674. static const struct iio_info dps310_info = {
  675. .read_raw = dps310_read_raw,
  676. .write_raw = dps310_write_raw,
  677. };
  678. static int dps310_probe(struct i2c_client *client)
  679. {
  680. const struct i2c_device_id *id = i2c_client_get_device_id(client);
  681. struct dps310_data *data;
  682. struct iio_dev *iio;
  683. int rc;
  684. iio = devm_iio_device_alloc(&client->dev, sizeof(*data));
  685. if (!iio)
  686. return -ENOMEM;
  687. data = iio_priv(iio);
  688. data->client = client;
  689. mutex_init(&data->lock);
  690. iio->name = id->name;
  691. iio->channels = dps310_channels;
  692. iio->num_channels = ARRAY_SIZE(dps310_channels);
  693. iio->info = &dps310_info;
  694. iio->modes = INDIO_DIRECT_MODE;
  695. data->regmap = devm_regmap_init_i2c(client, &dps310_regmap_config);
  696. if (IS_ERR(data->regmap))
  697. return PTR_ERR(data->regmap);
  698. /* Register to run the device reset when the device is removed */
  699. rc = devm_add_action_or_reset(&client->dev, dps310_reset, data);
  700. if (rc)
  701. return rc;
  702. rc = dps310_startup(data);
  703. if (rc)
  704. return rc;
  705. rc = devm_iio_device_register(&client->dev, iio);
  706. if (rc)
  707. return rc;
  708. i2c_set_clientdata(client, iio);
  709. return 0;
  710. }
  711. static const struct i2c_device_id dps310_id[] = {
  712. { DPS310_DEV_NAME },
  713. {}
  714. };
  715. MODULE_DEVICE_TABLE(i2c, dps310_id);
  716. static const struct acpi_device_id dps310_acpi_match[] = {
  717. { "IFX3100" },
  718. {}
  719. };
  720. MODULE_DEVICE_TABLE(acpi, dps310_acpi_match);
  721. static struct i2c_driver dps310_driver = {
  722. .driver = {
  723. .name = DPS310_DEV_NAME,
  724. .acpi_match_table = dps310_acpi_match,
  725. },
  726. .probe = dps310_probe,
  727. .id_table = dps310_id,
  728. };
  729. module_i2c_driver(dps310_driver);
  730. MODULE_AUTHOR("Joel Stanley <joel@jms.id.au>");
  731. MODULE_DESCRIPTION("Infineon DPS310 pressure and temperature sensor");
  732. MODULE_LICENSE("GPL v2");