Lines Matching refs:data

177 static inline u8 tmp51x_get_pga_shift(struct tmp51x_data *data)
179 return 5 - ffs(data->pga_gain);
182 static int tmp51x_get_value(struct tmp51x_data *data, u8 reg, u8 pos,
198 *val = sign_extend32(regval, 17 - tmp51x_get_pga_shift(data));
199 *val = DIV_ROUND_CLOSEST(*val * 10000, data->shunt_uohms);
210 *val = regval * data->pwr_lsb_uw;
214 *val = sign_extend32(regval, 16) * data->curr_lsb_ua;
243 static int tmp51x_set_value(struct tmp51x_data *data, u8 reg, long val)
255 val = DIV_ROUND_CLOSEST(val * data->shunt_uohms, 10000);
256 max_val = U16_MAX >> tmp51x_get_pga_shift(data);
262 max_val = (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) ?
269 regval = clamp_val(DIV_ROUND_CLOSEST(val, data->pwr_lsb_uw), 0,
293 return regmap_write(data->regmap, reg, regval);
295 return regmap_update_bits(data->regmap, reg, mask, regval);
398 struct tmp51x_data *data = dev_get_drvdata(dev);
410 ret = regmap_read(data->regmap, reg, &regval);
414 return tmp51x_get_value(data, reg, pos, regval, val);
433 const struct tmp51x_data *data = _data;
437 if (data->id == tmp512 && channel == 3)
463 if (!data->shunt_uohms)
477 if (!data->shunt_uohms)
530 static int tmp51x_calibrate(struct tmp51x_data *data)
532 int vshunt_max = data->pga_gain * 40;
542 if (data->shunt_uohms == 0)
543 return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, 0);
546 data->shunt_uohms);
552 data->curr_lsb_ua = DIV_ROUND_CLOSEST_ULL(max_curr_ma * 1000, 32767);
553 data->pwr_lsb_uw = 20 * data->curr_lsb_ua;
555 div = DIV_ROUND_CLOSEST_ULL(data->curr_lsb_ua * data->shunt_uohms,
558 return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION,
565 static int tmp51x_init(struct tmp51x_data *data)
568 int ret = regmap_write(data->regmap, TMP51X_SHUNT_CONFIG,
569 data->shunt_config);
573 ret = regmap_write(data->regmap, TMP51X_TEMP_CONFIG, data->temp_config);
578 ret = regmap_update_bits(data->regmap, TMP51X_N_FACTOR_AND_HYST_1,
579 TMP51X_NFACTOR_MASK, data->nfactor[0] << 8);
583 ret = regmap_write(data->regmap, TMP51X_N_FACTOR_2,
584 data->nfactor[1] << 8);
588 if (data->id == tmp513) {
589 ret = regmap_write(data->regmap, TMP513_N_FACTOR_3,
590 data->nfactor[2] << 8);
595 ret = tmp51x_calibrate(data);
600 return regmap_read(data->regmap, TMP51X_STATUS, &regval);
613 .data = (void *)tmp512
617 .data = (void *)tmp513
624 struct tmp51x_data *data)
626 if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) {
627 data->shunt_config |= TMP51X_BUS_VOLTAGE_MASK;
628 } else if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_16V) {
629 data->shunt_config &= ~TMP51X_BUS_VOLTAGE_MASK;
632 data->vbus_range_uvolt);
638 static int tmp51x_pga_gain_to_reg(struct device *dev, struct tmp51x_data *data)
640 if (data->pga_gain == 8) {
641 data->shunt_config |= CURRENT_SENSE_VOLTAGE_320_MASK;
642 } else if (data->pga_gain == 4) {
643 data->shunt_config |= CURRENT_SENSE_VOLTAGE_160_MASK;
644 } else if (data->pga_gain == 2) {
645 data->shunt_config |= CURRENT_SENSE_VOLTAGE_80_MASK;
646 } else if (data->pga_gain == 1) {
647 data->shunt_config |= CURRENT_SENSE_VOLTAGE_40_MASK;
649 dev_err(dev, "ti,pga-gain is invalid: %u\n", data->pga_gain);
655 static int tmp51x_read_properties(struct device *dev, struct tmp51x_data *data)
662 data->shunt_uohms = (ret >= 0) ? val : TMP51X_SHUNT_VALUE_DEFAULT;
665 data->vbus_range_uvolt = (ret >= 0) ? val : TMP51X_VBUS_RANGE_DEFAULT;
666 ret = tmp51x_vbus_range_to_reg(dev, data);
671 data->pga_gain = (ret >= 0) ? val : TMP51X_PGA_DEFAULT;
672 ret = tmp51x_pga_gain_to_reg(dev, data);
677 (data->id == tmp513) ? 3 : 2);
679 memcpy(data->nfactor, nfactor, (data->id == tmp513) ? 3 : 2);
682 if (data->shunt_uohms > data->pga_gain * 40 * 1000 * 1000) {
684 data->shunt_uohms, data->pga_gain);
691 static void tmp51x_use_default(struct tmp51x_data *data)
693 data->vbus_range_uvolt = TMP51X_VBUS_RANGE_DEFAULT;
694 data->pga_gain = TMP51X_PGA_DEFAULT;
695 data->shunt_uohms = TMP51X_SHUNT_VALUE_DEFAULT;
698 static int tmp51x_configure(struct device *dev, struct tmp51x_data *data)
700 data->shunt_config = TMP51X_SHUNT_CONFIG_DEFAULT;
701 data->temp_config = (data->id == tmp513) ?
705 return tmp51x_read_properties(dev, data);
707 tmp51x_use_default(data);
715 struct tmp51x_data *data;
719 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
720 if (!data)
723 data->id = (uintptr_t)i2c_get_match_data(client);
725 ret = tmp51x_configure(dev, data);
731 data->regmap = devm_regmap_init_i2c(client, &tmp51x_regmap_config);
732 if (IS_ERR(data->regmap)) {
734 return PTR_ERR(data->regmap);
737 ret = tmp51x_init(data);
744 data,