Lines Matching +full:uv +full:- +full:sensor

1 // SPDX-License-Identifier: GPL-2.0
7 * Local Temperature Sensor and Current Shunt Monitor
12 * and Local Temperature Sensor and Current Shunt Monitor
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 -> 1, 4 -> 2, 2 -> 3, 1 -> 4
188 return 5 - ffs(data->pga_gain); in tmp51x_get_pga_shift()
205 * on the pga gain setting. 1lsb = 10uV in tmp51x_get_value()
209 16 - tmp51x_get_pga_shift(data) : 15); in tmp51x_get_value()
210 *val = DIV_ROUND_CLOSEST(*val * 10 * (long)MILLI, (long)data->shunt_uohms); in tmp51x_get_value()
222 *val = regval * data->pwr_lsb_uw; in tmp51x_get_value()
226 *val = sign_extend32(regval, 15) * (long)data->curr_lsb_ua; in tmp51x_get_value()
249 return -EOPNOTSUPP; in tmp51x_get_value()
265 * voltage. 1lsb = 10uV in tmp51x_set_value()
267 val = DIV_ROUND_CLOSEST(val * (long)data->shunt_uohms, 10 * (long)MILLI); in tmp51x_set_value()
269 regval = clamp_val(val, -max_val, max_val); in tmp51x_set_value()
274 max_val = (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) ? in tmp51x_set_value()
281 regval = clamp_val(DIV_ROUND_CLOSEST(val, data->pwr_lsb_uw), 0, in tmp51x_set_value()
301 return -EOPNOTSUPP; in tmp51x_set_value()
305 return regmap_write(data->regmap, reg, regval); in tmp51x_set_value()
307 return regmap_update_bits(data->regmap, reg, mask, regval); in tmp51x_set_value()
417 return -EOPNOTSUPP; in tmp51x_read()
422 ret = regmap_read(data->regmap, reg, &regval); in tmp51x_read()
436 return -EOPNOTSUPP; in tmp51x_write()
449 if (channel >= data->max_channels) in tmp51x_is_visible()
475 if (!data->shunt_uohms) in tmp51x_is_visible()
489 if (!data->shunt_uohms) in tmp51x_is_visible()
544 int vshunt_max = data->pga_gain * 40; in tmp51x_calibrate()
551 * of the sensor will not work. Temperature and voltage sensing will in tmp51x_calibrate()
554 if (data->shunt_uohms == 0) in tmp51x_calibrate()
555 return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, 0); in tmp51x_calibrate()
557 max_curr_ma = DIV_ROUND_CLOSEST_ULL(vshunt_max * MICRO, data->shunt_uohms); in tmp51x_calibrate()
563 data->curr_lsb_ua = DIV_ROUND_CLOSEST_ULL(max_curr_ma * MILLI, 32767); in tmp51x_calibrate()
564 data->pwr_lsb_uw = 20 * data->curr_lsb_ua; in tmp51x_calibrate()
566 div = DIV_ROUND_CLOSEST_ULL(data->curr_lsb_ua * data->shunt_uohms, MICRO); in tmp51x_calibrate()
568 return regmap_write(data->regmap, TMP51X_SHUNT_CALIBRATION, in tmp51x_calibrate()
578 int ret = regmap_write(data->regmap, TMP51X_SHUNT_CONFIG, in tmp51x_init()
579 data->shunt_config); in tmp51x_init()
583 ret = regmap_write(data->regmap, TMP51X_TEMP_CONFIG, data->temp_config); in tmp51x_init()
588 ret = regmap_update_bits(data->regmap, TMP51X_N_FACTOR_AND_HYST_1, in tmp51x_init()
589 TMP51X_NFACTOR_MASK, data->nfactor[0] << 8); in tmp51x_init()
593 ret = regmap_write(data->regmap, TMP51X_N_FACTOR_2, in tmp51x_init()
594 data->nfactor[1] << 8); in tmp51x_init()
598 if (data->max_channels == TMP513_MAX_CHANNELS) { in tmp51x_init()
599 ret = regmap_write(data->regmap, TMP513_N_FACTOR_3, in tmp51x_init()
600 data->nfactor[2] << 8); in tmp51x_init()
610 return regmap_read(data->regmap, TMP51X_STATUS, &regval); in tmp51x_init()
630 if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_32V) { in tmp51x_vbus_range_to_reg()
631 data->shunt_config |= TMP51X_BUS_VOLTAGE_MASK; in tmp51x_vbus_range_to_reg()
632 } else if (data->vbus_range_uvolt == TMP51X_VBUS_RANGE_16V) { in tmp51x_vbus_range_to_reg()
633 data->shunt_config &= ~TMP51X_BUS_VOLTAGE_MASK; in tmp51x_vbus_range_to_reg()
635 return dev_err_probe(dev, -EINVAL, in tmp51x_vbus_range_to_reg()
636 "ti,bus-range-microvolt is invalid: %u\n", in tmp51x_vbus_range_to_reg()
637 data->vbus_range_uvolt); in tmp51x_vbus_range_to_reg()
644 if (data->pga_gain == 8) { in tmp51x_pga_gain_to_reg()
645 data->shunt_config |= CURRENT_SENSE_VOLTAGE_320_MASK; in tmp51x_pga_gain_to_reg()
646 } else if (data->pga_gain == 4) { in tmp51x_pga_gain_to_reg()
647 data->shunt_config |= CURRENT_SENSE_VOLTAGE_160_MASK; in tmp51x_pga_gain_to_reg()
648 } else if (data->pga_gain == 2) { in tmp51x_pga_gain_to_reg()
649 data->shunt_config |= CURRENT_SENSE_VOLTAGE_80_MASK; in tmp51x_pga_gain_to_reg()
650 } else if (data->pga_gain == 1) { in tmp51x_pga_gain_to_reg()
651 data->shunt_config |= CURRENT_SENSE_VOLTAGE_40_MASK; in tmp51x_pga_gain_to_reg()
653 return dev_err_probe(dev, -EINVAL, in tmp51x_pga_gain_to_reg()
654 "ti,pga-gain is invalid: %u\n", data->pga_gain); in tmp51x_pga_gain_to_reg()
664 ret = device_property_read_u32(dev, "shunt-resistor-micro-ohms", &val); in tmp51x_read_properties()
665 data->shunt_uohms = (ret >= 0) ? val : TMP51X_SHUNT_VALUE_DEFAULT; in tmp51x_read_properties()
667 ret = device_property_read_u32(dev, "ti,bus-range-microvolt", &val); in tmp51x_read_properties()
668 data->vbus_range_uvolt = (ret >= 0) ? val : TMP51X_VBUS_RANGE_DEFAULT; in tmp51x_read_properties()
673 ret = device_property_read_u32(dev, "ti,pga-gain", &val); in tmp51x_read_properties()
674 data->pga_gain = (ret >= 0) ? val : TMP51X_PGA_DEFAULT; in tmp51x_read_properties()
679 device_property_read_u32_array(dev, "ti,nfactor", data->nfactor, in tmp51x_read_properties()
680 data->max_channels - 1); in tmp51x_read_properties()
682 // Check if shunt value is compatible with pga-gain in tmp51x_read_properties()
683 if (data->shunt_uohms > data->pga_gain * 40 * MICRO) { in tmp51x_read_properties()
684 return dev_err_probe(dev, -EINVAL, in tmp51x_read_properties()
685 "shunt-resistor: %u too big for pga_gain: %u\n", in tmp51x_read_properties()
686 data->shunt_uohms, data->pga_gain); in tmp51x_read_properties()
694 data->vbus_range_uvolt = TMP51X_VBUS_RANGE_DEFAULT; in tmp51x_use_default()
695 data->pga_gain = TMP51X_PGA_DEFAULT; in tmp51x_use_default()
696 data->shunt_uohms = TMP51X_SHUNT_VALUE_DEFAULT; in tmp51x_use_default()
701 data->shunt_config = TMP51X_SHUNT_CONFIG_DEFAULT; in tmp51x_configure()
702 data->temp_config = TMP51X_TEMP_CONFIG_DEFAULT(data->max_channels); in tmp51x_configure()
704 if (dev->of_node) in tmp51x_configure()
714 struct device *dev = &client->dev; in tmp51x_probe()
721 return -ENOMEM; in tmp51x_probe()
723 data->max_channels = (uintptr_t)i2c_get_match_data(client); in tmp51x_probe()
729 data->regmap = devm_regmap_init_i2c(client, &tmp51x_regmap_config); in tmp51x_probe()
730 if (IS_ERR(data->regmap)) in tmp51x_probe()
731 return dev_err_probe(dev, PTR_ERR(data->regmap), in tmp51x_probe()
738 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, in tmp51x_probe()
745 dev_dbg(dev, "power monitor %s\n", client->name); in tmp51x_probe()