Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: adc: rtq6056: Add support for the whole RTQ6056 family

RTQ6053 and RTQ6059 are the same series of RTQ6056.

The respective differences with RTQ6056 are listed below
RTQ6053
- chip package type

RTQ6059
- Reduce the pinout for vbus sensing pin
- Some internal ADC scaling change

Signed-off-by: ChiYuan Huang <cy_huang@richtek.com>
Link: https://lore.kernel.org/r/3541207c4727e3a76b9a3caf88ef812a4d47b764.1704676198.git.cy_huang@richtek.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

ChiYuan Huang and committed by
Jonathan Cameron
89a1034c 41b5684e

+255 -20
+255 -20
drivers/iio/adc/rtq6056.c
··· 39 39 #define RTQ6056_DEFAULT_CONFIG 0x4127 40 40 #define RTQ6056_CONT_ALLON 7 41 41 42 + #define RTQ6059_DEFAULT_CONFIG 0x3C47 43 + #define RTQ6059_VBUS_LSB_OFFSET 3 44 + #define RTQ6059_AVG_BASE 8 45 + 42 46 enum { 43 47 RTQ6056_CH_VSHUNT = 0, 44 48 RTQ6056_CH_VBUS, ··· 51 47 RTQ6056_MAX_CHANNEL 52 48 }; 53 49 50 + /* 51 + * The enum is to present the 0x00 CONFIG RG bitfield for the 16bit RG value 52 + * field value order from LSB to MSB 53 + * RTQ6053/6 is OPMODE->VSHUNTCT->VBUSCT->AVG->RESET 54 + * RTQ6059 is OPMODE->SADC->BADC->PGA->RESET 55 + */ 54 56 enum { 55 57 F_OPMODE = 0, 56 58 F_VSHUNTCT, 59 + F_RTQ6059_SADC = F_VSHUNTCT, 57 60 F_VBUSCT, 61 + F_RTQ6059_BADC = F_VBUSCT, 58 62 F_AVG, 63 + F_RTQ6059_PGA = F_AVG, 59 64 F_RESET, 60 65 F_MAX_FIELDS 66 + }; 67 + 68 + struct rtq6056_priv; 69 + 70 + struct richtek_dev_data { 71 + bool fixed_samp_freq; 72 + u8 vbus_offset; 73 + int default_conv_time_us; 74 + unsigned int default_config; 75 + unsigned int calib_coefficient; 76 + const int *avg_sample_list; 77 + int avg_sample_list_length; 78 + const struct reg_field *reg_fields; 79 + const struct iio_chan_spec *channels; 80 + int num_channels; 81 + int (*read_scale)(struct iio_chan_spec const *ch, int *val, int *val2); 82 + int (*set_average)(struct rtq6056_priv *priv, int val); 61 83 }; 62 84 63 85 struct rtq6056_priv { 64 86 struct device *dev; 65 87 struct regmap *regmap; 66 88 struct regmap_field *rm_fields[F_MAX_FIELDS]; 89 + const struct richtek_dev_data *devdata; 67 90 u32 shunt_resistor_uohm; 68 91 int vshuntct_us; 69 92 int vbusct_us; ··· 102 71 [F_VSHUNTCT] = REG_FIELD(RTQ6056_REG_CONFIG, 3, 5), 103 72 [F_VBUSCT] = REG_FIELD(RTQ6056_REG_CONFIG, 6, 8), 104 73 [F_AVG] = REG_FIELD(RTQ6056_REG_CONFIG, 9, 11), 74 + [F_RESET] = REG_FIELD(RTQ6056_REG_CONFIG, 15, 15), 75 + }; 76 + 77 + static const struct reg_field rtq6059_reg_fields[F_MAX_FIELDS] = { 78 + [F_OPMODE] = REG_FIELD(RTQ6056_REG_CONFIG, 0, 2), 79 + [F_RTQ6059_SADC] = REG_FIELD(RTQ6056_REG_CONFIG, 3, 6), 80 + [F_RTQ6059_BADC] = REG_FIELD(RTQ6056_REG_CONFIG, 7, 10), 81 + [F_RTQ6059_PGA] = REG_FIELD(RTQ6056_REG_CONFIG, 11, 12), 105 82 [F_RESET] = REG_FIELD(RTQ6056_REG_CONFIG, 15, 15), 106 83 }; 107 84 ··· 190 151 IIO_CHAN_SOFT_TIMESTAMP(RTQ6056_MAX_CHANNEL), 191 152 }; 192 153 154 + /* 155 + * Difference between RTQ6056 and RTQ6059 156 + * - Fixed sampling conversion time 157 + * - Average sample numbers 158 + * - Channel scale 159 + * - calibration coefficient 160 + */ 161 + static const struct iio_chan_spec rtq6059_channels[RTQ6056_MAX_CHANNEL + 1] = { 162 + { 163 + .type = IIO_VOLTAGE, 164 + .indexed = 1, 165 + .channel = 0, 166 + .address = RTQ6056_REG_SHUNTVOLT, 167 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 168 + BIT(IIO_CHAN_INFO_SCALE) | 169 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 170 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 171 + .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 172 + .scan_index = 0, 173 + .scan_type = { 174 + .sign = 's', 175 + .realbits = 16, 176 + .storagebits = 16, 177 + .endianness = IIO_CPU, 178 + }, 179 + }, 180 + { 181 + .type = IIO_VOLTAGE, 182 + .indexed = 1, 183 + .channel = 1, 184 + .address = RTQ6056_REG_BUSVOLT, 185 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 186 + BIT(IIO_CHAN_INFO_SCALE) | 187 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 188 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 189 + .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 190 + .scan_index = 1, 191 + .scan_type = { 192 + .sign = 'u', 193 + .realbits = 16, 194 + .storagebits = 16, 195 + .endianness = IIO_CPU, 196 + }, 197 + }, 198 + { 199 + .type = IIO_POWER, 200 + .indexed = 1, 201 + .channel = 2, 202 + .address = RTQ6056_REG_POWER, 203 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 204 + BIT(IIO_CHAN_INFO_SCALE) | 205 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 206 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 207 + .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 208 + .scan_index = 2, 209 + .scan_type = { 210 + .sign = 'u', 211 + .realbits = 16, 212 + .storagebits = 16, 213 + .endianness = IIO_CPU, 214 + }, 215 + }, 216 + { 217 + .type = IIO_CURRENT, 218 + .indexed = 1, 219 + .channel = 3, 220 + .address = RTQ6056_REG_CURRENT, 221 + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | 222 + BIT(IIO_CHAN_INFO_SAMP_FREQ), 223 + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 224 + .info_mask_shared_by_all_available = BIT(IIO_CHAN_INFO_OVERSAMPLING_RATIO), 225 + .scan_index = 3, 226 + .scan_type = { 227 + .sign = 's', 228 + .realbits = 16, 229 + .storagebits = 16, 230 + .endianness = IIO_CPU, 231 + }, 232 + }, 233 + IIO_CHAN_SOFT_TIMESTAMP(RTQ6056_MAX_CHANNEL), 234 + }; 235 + 193 236 static int rtq6056_adc_read_channel(struct rtq6056_priv *priv, 194 237 struct iio_chan_spec const *ch, 195 238 int *val) 196 239 { 240 + const struct richtek_dev_data *devdata = priv->devdata; 197 241 struct device *dev = priv->dev; 198 242 unsigned int addr = ch->address; 199 243 unsigned int regval; ··· 290 168 return ret; 291 169 292 170 /* Power and VBUS is unsigned 16-bit, others are signed 16-bit */ 293 - if (addr == RTQ6056_REG_BUSVOLT || addr == RTQ6056_REG_POWER) 171 + switch (addr) { 172 + case RTQ6056_REG_BUSVOLT: 173 + regval >>= devdata->vbus_offset; 294 174 *val = regval; 295 - else 175 + return IIO_VAL_INT; 176 + case RTQ6056_REG_POWER: 177 + *val = regval; 178 + return IIO_VAL_INT; 179 + case RTQ6056_REG_SHUNTVOLT: 180 + case RTQ6056_REG_CURRENT: 296 181 *val = sign_extend32(regval, 16); 297 - 298 - return IIO_VAL_INT; 182 + return IIO_VAL_INT; 183 + default: 184 + return -EINVAL; 185 + } 299 186 } 300 187 301 188 static int rtq6056_adc_read_scale(struct iio_chan_spec const *ch, int *val, ··· 324 193 case RTQ6056_REG_POWER: 325 194 /* Power lsb 25mW */ 326 195 *val = 25; 196 + return IIO_VAL_INT; 197 + default: 198 + return -EINVAL; 199 + } 200 + } 201 + 202 + static int rtq6059_adc_read_scale(struct iio_chan_spec const *ch, int *val, 203 + int *val2) 204 + { 205 + switch (ch->address) { 206 + case RTQ6056_REG_SHUNTVOLT: 207 + /* VSHUNT lsb 10uV */ 208 + *val = 10000; 209 + *val2 = 1000000; 210 + return IIO_VAL_FRACTIONAL; 211 + case RTQ6056_REG_BUSVOLT: 212 + /* VBUS lsb 4mV */ 213 + *val = 4; 214 + return IIO_VAL_INT; 215 + case RTQ6056_REG_POWER: 216 + /* Power lsb 20mW */ 217 + *val = 20; 327 218 return IIO_VAL_INT; 328 219 default: 329 220 return -EINVAL; ··· 401 248 1, 4, 16, 64, 128, 256, 512, 1024, 402 249 }; 403 250 251 + static const int rtq6059_avg_sample_list[] = { 252 + 1, 2, 4, 8, 16, 32, 64, 128, 253 + }; 254 + 404 255 static int rtq6056_adc_set_average(struct rtq6056_priv *priv, int val) 405 256 { 406 257 unsigned int selector; ··· 421 264 return ret; 422 265 423 266 priv->avg_sample = rtq6056_avg_sample_list[selector]; 267 + 268 + return 0; 269 + } 270 + 271 + static int rtq6059_adc_set_average(struct rtq6056_priv *priv, int val) 272 + { 273 + unsigned int selector; 274 + int ret; 275 + 276 + if (val > 128 || val < 1) 277 + return -EINVAL; 278 + 279 + /* The supported average sample is 2^x (x from 0 to 7) */ 280 + selector = fls(val) - 1; 281 + 282 + ret = regmap_field_write(priv->rm_fields[F_RTQ6059_BADC], 283 + RTQ6059_AVG_BASE + selector); 284 + if (ret) 285 + return ret; 286 + 287 + ret = regmap_field_write(priv->rm_fields[F_RTQ6059_SADC], 288 + RTQ6059_AVG_BASE + selector); 289 + 290 + priv->avg_sample = BIT(selector); 424 291 425 292 return 0; 426 293 } ··· 473 292 int *val2, long mask) 474 293 { 475 294 struct rtq6056_priv *priv = iio_priv(indio_dev); 295 + const struct richtek_dev_data *devdata = priv->devdata; 476 296 477 297 switch (mask) { 478 298 case IIO_CHAN_INFO_RAW: 479 299 return rtq6056_adc_read_channel(priv, chan, val); 480 300 case IIO_CHAN_INFO_SCALE: 481 - return rtq6056_adc_read_scale(chan, val, val2); 301 + return devdata->read_scale(chan, val, val2); 482 302 case IIO_CHAN_INFO_OVERSAMPLING_RATIO: 483 303 *val = priv->avg_sample; 484 304 return IIO_VAL_INT; ··· 495 313 const int **vals, int *type, int *length, 496 314 long mask) 497 315 { 316 + struct rtq6056_priv *priv = iio_priv(indio_dev); 317 + const struct richtek_dev_data *devdata = priv->devdata; 318 + 498 319 switch (mask) { 499 320 case IIO_CHAN_INFO_SAMP_FREQ: 500 321 *vals = rtq6056_samp_freq_list; ··· 505 320 *length = ARRAY_SIZE(rtq6056_samp_freq_list); 506 321 return IIO_AVAIL_LIST; 507 322 case IIO_CHAN_INFO_OVERSAMPLING_RATIO: 508 - *vals = rtq6056_avg_sample_list; 323 + *vals = devdata->avg_sample_list; 324 + *length = devdata->avg_sample_list_length; 509 325 *type = IIO_VAL_INT; 510 - *length = ARRAY_SIZE(rtq6056_avg_sample_list); 511 326 return IIO_AVAIL_LIST; 512 327 default: 513 328 return -EINVAL; ··· 519 334 int val2, long mask) 520 335 { 521 336 struct rtq6056_priv *priv = iio_priv(indio_dev); 337 + const struct richtek_dev_data *devdata = priv->devdata; 522 338 int ret; 523 339 524 340 ret = iio_device_claim_direct_mode(indio_dev); ··· 528 342 529 343 switch (mask) { 530 344 case IIO_CHAN_INFO_SAMP_FREQ: 345 + if (devdata->fixed_samp_freq) { 346 + ret = -EINVAL; 347 + break; 348 + } 349 + 531 350 ret = rtq6056_adc_set_samp_freq(priv, chan, val); 532 351 break; 533 352 case IIO_CHAN_INFO_OVERSAMPLING_RATIO: 534 - ret = rtq6056_adc_set_average(priv, val); 353 + ret = devdata->set_average(priv, val); 535 354 break; 536 355 default: 537 356 ret = -EINVAL; ··· 565 374 static int rtq6056_set_shunt_resistor(struct rtq6056_priv *priv, 566 375 int resistor_uohm) 567 376 { 377 + const struct richtek_dev_data *devdata = priv->devdata; 568 378 unsigned int calib_val; 569 379 int ret; 570 380 ··· 574 382 return -EINVAL; 575 383 } 576 384 577 - /* calibration = 5120000 / (Rshunt (uOhm) * current lsb (1mA)) */ 578 - calib_val = 5120000 / resistor_uohm; 385 + /* calibration = coefficient / (Rshunt (uOhm) * current lsb (1mA)) */ 386 + calib_val = devdata->calib_coefficient / resistor_uohm; 579 387 ret = regmap_write(priv->regmap, RTQ6056_REG_CALIBRATION, calib_val); 580 388 if (ret) 581 389 return ret; ··· 642 450 struct iio_poll_func *pf = p; 643 451 struct iio_dev *indio_dev = pf->indio_dev; 644 452 struct rtq6056_priv *priv = iio_priv(indio_dev); 453 + const struct richtek_dev_data *devdata = priv->devdata; 645 454 struct device *dev = priv->dev; 646 455 struct { 647 456 u16 vals[RTQ6056_MAX_CHANNEL]; ··· 661 468 ret = regmap_read(priv->regmap, addr, &raw); 662 469 if (ret) 663 470 goto out; 471 + 472 + if (addr == RTQ6056_REG_BUSVOLT) 473 + raw >>= devdata->vbus_offset; 664 474 665 475 data.vals[i++] = raw; 666 476 } ··· 724 528 struct rtq6056_priv *priv; 725 529 struct device *dev = &i2c->dev; 726 530 struct regmap *regmap; 531 + const struct richtek_dev_data *devdata; 727 532 unsigned int vendor_id, shunt_resistor_uohm; 728 533 int ret; 729 534 730 535 if (!i2c_check_functionality(i2c->adapter, I2C_FUNC_SMBUS_WORD_DATA)) 731 536 return -EOPNOTSUPP; 537 + 538 + devdata = device_get_match_data(dev); 539 + if (!devdata) 540 + return dev_err_probe(dev, -EINVAL, "Invalid dev data\n"); 732 541 733 542 indio_dev = devm_iio_device_alloc(dev, sizeof(*priv)); 734 543 if (!indio_dev) ··· 741 540 742 541 priv = iio_priv(indio_dev); 743 542 priv->dev = dev; 744 - priv->vshuntct_us = priv->vbusct_us = 1037; 543 + priv->vshuntct_us = priv->vbusct_us = devdata->default_conv_time_us; 745 544 priv->avg_sample = 1; 545 + priv->devdata = devdata; 746 546 i2c_set_clientdata(i2c, priv); 747 547 748 548 regmap = devm_regmap_init_i2c(i2c, &rtq6056_regmap_config); ··· 763 561 "Invalid vendor id 0x%04x\n", vendor_id); 764 562 765 563 ret = devm_regmap_field_bulk_alloc(dev, regmap, priv->rm_fields, 766 - rtq6056_reg_fields, F_MAX_FIELDS); 564 + devdata->reg_fields, F_MAX_FIELDS); 767 565 if (ret) 768 566 return dev_err_probe(dev, ret, "Failed to init regmap field\n"); 769 567 770 - /* 771 - * By default, configure average sample as 1, bus and shunt conversion 772 - * time as 1037 microsecond, and operating mode to all on. 773 - */ 774 - ret = regmap_write(regmap, RTQ6056_REG_CONFIG, RTQ6056_DEFAULT_CONFIG); 568 + ret = regmap_write(regmap, RTQ6056_REG_CONFIG, devdata->default_config); 775 569 if (ret) 776 570 return dev_err_probe(dev, ret, 777 571 "Failed to enable continuous sensing\n"); ··· 796 598 797 599 indio_dev->name = "rtq6056"; 798 600 indio_dev->modes = INDIO_DIRECT_MODE; 799 - indio_dev->channels = rtq6056_channels; 800 - indio_dev->num_channels = ARRAY_SIZE(rtq6056_channels); 601 + indio_dev->channels = devdata->channels; 602 + indio_dev->num_channels = devdata->num_channels; 801 603 indio_dev->info = &rtq6056_info; 802 604 803 605 ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, ··· 838 640 static DEFINE_RUNTIME_DEV_PM_OPS(rtq6056_pm_ops, rtq6056_runtime_suspend, 839 641 rtq6056_runtime_resume, NULL); 840 642 643 + static const struct richtek_dev_data rtq6056_devdata = { 644 + .default_conv_time_us = 1037, 645 + .calib_coefficient = 5120000, 646 + /* 647 + * By default, configure average sample as 1, bus and shunt conversion 648 + * time as 1037 microsecond, and operating mode to all on. 649 + */ 650 + .default_config = RTQ6056_DEFAULT_CONFIG, 651 + .avg_sample_list = rtq6056_avg_sample_list, 652 + .avg_sample_list_length = ARRAY_SIZE(rtq6056_avg_sample_list), 653 + .reg_fields = rtq6056_reg_fields, 654 + .channels = rtq6056_channels, 655 + .num_channels = ARRAY_SIZE(rtq6056_channels), 656 + .read_scale = rtq6056_adc_read_scale, 657 + .set_average = rtq6056_adc_set_average, 658 + }; 659 + 660 + static const struct richtek_dev_data rtq6059_devdata = { 661 + .fixed_samp_freq = true, 662 + .vbus_offset = RTQ6059_VBUS_LSB_OFFSET, 663 + .default_conv_time_us = 532, 664 + .calib_coefficient = 40960000, 665 + /* 666 + * By default, configure average sample as 1, bus and shunt conversion 667 + * time as 532 microsecond, and operating mode to all on. 668 + */ 669 + .default_config = RTQ6059_DEFAULT_CONFIG, 670 + .avg_sample_list = rtq6059_avg_sample_list, 671 + .avg_sample_list_length = ARRAY_SIZE(rtq6059_avg_sample_list), 672 + .reg_fields = rtq6059_reg_fields, 673 + .channels = rtq6059_channels, 674 + .num_channels = ARRAY_SIZE(rtq6059_channels), 675 + .read_scale = rtq6059_adc_read_scale, 676 + .set_average = rtq6059_adc_set_average, 677 + }; 678 + 841 679 static const struct of_device_id rtq6056_device_match[] = { 842 - { .compatible = "richtek,rtq6056" }, 680 + { .compatible = "richtek,rtq6056", .data = &rtq6056_devdata }, 681 + { .compatible = "richtek,rtq6059", .data = &rtq6059_devdata }, 843 682 {} 844 683 }; 845 684 MODULE_DEVICE_TABLE(of, rtq6056_device_match);