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