Lines Matching +full:pga +full:- +full:gain

1 // SPDX-License-Identifier: GPL-2.0
15 * Copyright (C) 2019 Eric Tremblay <etremblay@distech-controls.com>
112 // Max possible value is -256 to +256 but datasheet indicated -40 to 125.
114 #define MIN_TEMP_LIMIT -40000
123 #define TMP51X_TEMP_CHANNEL_MASK(n) (GENMASK((n) - 1, 0) << 11)
185 // Set the shift based on the gain 8=4, 4=3, 2=2, 1=1
188 return 5 - ffs(data->pga_gain); in tmp51x_get_pga_shift()
205 * on the pga gain setting. 1lsb = 10uV in tmp51x_get_value()
207 *val = sign_extend32(regval, 17 - tmp51x_get_pga_shift(data)); in tmp51x_get_value()
208 *val = DIV_ROUND_CLOSEST(*val * 10 * MILLI, data->shunt_uohms); in tmp51x_get_value()
219 *val = regval * data->pwr_lsb_uw; in tmp51x_get_value()
223 *val = sign_extend32(regval, 16) * data->curr_lsb_ua; in tmp51x_get_value()
246 return -EOPNOTSUPP; in tmp51x_get_value()
264 val = DIV_ROUND_CLOSEST(val * data->shunt_uohms, 10 * MILLI); in tmp51x_set_value()
266 regval = clamp_val(val, -max_val, max_val); in tmp51x_set_value()
271 max_val = (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) ? in tmp51x_set_value()
278 regval = clamp_val(DIV_ROUND_CLOSEST(val, data->pwr_lsb_uw), 0, in tmp51x_set_value()
298 return -EOPNOTSUPP; in tmp51x_set_value()
302 return regmap_write(data->regmap, reg, regval); in tmp51x_set_value()
304 return regmap_update_bits(data->regmap, reg, mask, regval); in tmp51x_set_value()
414 return -EOPNOTSUPP; in tmp51x_read()
419 ret = regmap_read(data->regmap, reg, &regval); in tmp51x_read()
433 return -EOPNOTSUPP; in tmp51x_write()
446 if (channel >= data->max_channels) in tmp51x_is_visible()
472 if (!data->shunt_uohms) in tmp51x_is_visible()
486 if (!data->shunt_uohms) in tmp51x_is_visible()
541 int vshunt_max = data->pga_gain * 40; in tmp51x_calibrate()
551 if (data->shunt_uohms == 0) in tmp51x_calibrate()
552 return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, 0); in tmp51x_calibrate()
554 max_curr_ma = DIV_ROUND_CLOSEST_ULL(vshunt_max * MICRO, data->shunt_uohms); in tmp51x_calibrate()
560 data->curr_lsb_ua = DIV_ROUND_CLOSEST_ULL(max_curr_ma * MILLI, 32767); in tmp51x_calibrate()
561 data->pwr_lsb_uw = 20 * data->curr_lsb_ua; in tmp51x_calibrate()
563 div = DIV_ROUND_CLOSEST_ULL(data->curr_lsb_ua * data->shunt_uohms, MICRO); in tmp51x_calibrate()
565 return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, in tmp51x_calibrate()
575 int ret = regmap_write(data->regmap, TMP51X_SHUNT_CONFIG, in tmp51x_init()
576 data->shunt_config); in tmp51x_init()
580 ret = regmap_write(data->regmap, TMP51X_TEMP_CONFIG, data->temp_config); in tmp51x_init()
585 ret = regmap_update_bits(data->regmap, TMP51X_N_FACTOR_AND_HYST_1, in tmp51x_init()
586 TMP51X_NFACTOR_MASK, data->nfactor[0] << 8); in tmp51x_init()
590 ret = regmap_write(data->regmap, TMP51X_N_FACTOR_2, in tmp51x_init()
591 data->nfactor[1] << 8); in tmp51x_init()
595 if (data->max_channels == TMP513_MAX_CHANNELS) { in tmp51x_init()
596 ret = regmap_write(data->regmap, TMP513_N_FACTOR_3, in tmp51x_init()
597 data->nfactor[2] << 8); in tmp51x_init()
607 return regmap_read(data->regmap, TMP51X_STATUS, &regval); in tmp51x_init()
627 if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) { in tmp51x_vbus_range_to_reg()
628 data->shunt_config |= TMP51X_BUS_VOLTAGE_MASK; in tmp51x_vbus_range_to_reg()
629 } else if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_16V) { in tmp51x_vbus_range_to_reg()
630 data->shunt_config &= ~TMP51X_BUS_VOLTAGE_MASK; in tmp51x_vbus_range_to_reg()
632 return dev_err_probe(dev, -EINVAL, in tmp51x_vbus_range_to_reg()
633 "ti,bus-range-microvolt is invalid: %u\n", in tmp51x_vbus_range_to_reg()
634 data->vbus_range_uvolt); in tmp51x_vbus_range_to_reg()
641 if (data->pga_gain == 8) { in tmp51x_pga_gain_to_reg()
642 data->shunt_config |= CURRENT_SENSE_VOLTAGE_320_MASK; in tmp51x_pga_gain_to_reg()
643 } else if (data->pga_gain == 4) { in tmp51x_pga_gain_to_reg()
644 data->shunt_config |= CURRENT_SENSE_VOLTAGE_160_MASK; in tmp51x_pga_gain_to_reg()
645 } else if (data->pga_gain == 2) { in tmp51x_pga_gain_to_reg()
646 data->shunt_config |= CURRENT_SENSE_VOLTAGE_80_MASK; in tmp51x_pga_gain_to_reg()
647 } else if (data->pga_gain == 1) { in tmp51x_pga_gain_to_reg()
648 data->shunt_config |= CURRENT_SENSE_VOLTAGE_40_MASK; in tmp51x_pga_gain_to_reg()
650 return dev_err_probe(dev, -EINVAL, in tmp51x_pga_gain_to_reg()
651 "ti,pga-gain is invalid: %u\n", data->pga_gain); in tmp51x_pga_gain_to_reg()
661 ret = device_property_read_u32(dev, "shunt-resistor-micro-ohms", &val); in tmp51x_read_properties()
662 data->shunt_uohms = (ret >= 0) ? val : TMP51X_SHUNT_VALUE_DEFAULT; in tmp51x_read_properties()
664 ret = device_property_read_u32(dev, "ti,bus-range-microvolt", &val); in tmp51x_read_properties()
665 data->vbus_range_uvolt = (ret >= 0) ? val : TMP51X_VBUS_RANGE_DEFAULT; in tmp51x_read_properties()
670 ret = device_property_read_u32(dev, "ti,pga-gain", &val); in tmp51x_read_properties()
671 data->pga_gain = (ret >= 0) ? val : TMP51X_PGA_DEFAULT; in tmp51x_read_properties()
676 device_property_read_u32_array(dev, "ti,nfactor", data->nfactor, in tmp51x_read_properties()
677 data->max_channels - 1); in tmp51x_read_properties()
679 // Check if shunt value is compatible with pga-gain in tmp51x_read_properties()
680 if (data->shunt_uohms > data->pga_gain * 40 * MICRO) { in tmp51x_read_properties()
681 return dev_err_probe(dev, -EINVAL, in tmp51x_read_properties()
682 "shunt-resistor: %u too big for pga_gain: %u\n", in tmp51x_read_properties()
683 data->shunt_uohms, data->pga_gain); in tmp51x_read_properties()
691 data->vbus_range_uvolt = TMP51X_VBUS_RANGE_DEFAULT; in tmp51x_use_default()
692 data->pga_gain = TMP51X_PGA_DEFAULT; in tmp51x_use_default()
693 data->shunt_uohms = TMP51X_SHUNT_VALUE_DEFAULT; in tmp51x_use_default()
698 data->shunt_config = TMP51X_SHUNT_CONFIG_DEFAULT; in tmp51x_configure()
699 data->temp_config = TMP51X_TEMP_CONFIG_DEFAULT(data->max_channels); in tmp51x_configure()
701 if (dev->of_node) in tmp51x_configure()
711 struct device *dev = &client->dev; in tmp51x_probe()
718 return -ENOMEM; in tmp51x_probe()
720 data->max_channels = (uintptr_t)i2c_get_match_data(client); in tmp51x_probe()
726 data->regmap = devm_regmap_init_i2c(client, &tmp51x_regmap_config); in tmp51x_probe()
727 if (IS_ERR(data->regmap)) in tmp51x_probe()
728 return dev_err_probe(dev, PTR_ERR(data->regmap), in tmp51x_probe()
735 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, in tmp51x_probe()
742 dev_dbg(dev, "power monitor %s\n", client->name); in tmp51x_probe()