Lines Matching +full:conversion +full:- +full:interval

1 // SPDX-License-Identifier: GPL-2.0-only
6 * Zero Drift Bi-Directional Current/Power Monitor with I2C Interface
10 * Bi-Directional Current/Power Monitor with I2C Interface
14 * Bi-Directional Current/Power Monitor with I2C Interface
18 * Bi-directional Current/Power Monitor with I2C Interface
59 /* settings - depend on use case */
95 * Both bus voltage and shunt voltage conversion times for ina226 are set
223 * Multiply the total conversion time by the number of averages.
233 static u16 ina226_interval_to_reg(long interval)
238 * The maximum supported interval is 1,024 * (2 * 8.244ms) ~= 16.8s.
241 interval = clamp_val(interval, 0, 32000);
243 avg = DIV_ROUND_CLOSEST(interval * 1000,
259 val = DIV_ROUND_CLOSEST((s16)regval, data->config->shunt_div);
262 val = (regval >> data->config->bus_voltage_shift) *
263 data->config->bus_voltage_lsb;
267 val = regval * data->power_lsb_uW;
271 val = (s16)regval * data->current_lsb_uA;
289 * check if the chip has been power cycled or reset. If so, re-initialize it.
294 struct regmap *regmap = data->regmap;
298 if (data->config->has_ishunt) {
307 for (retry = 5; retry; retry--) {
352 return -ENODEV;
363 val = clamp_val(val, 0, SHRT_MAX * data->config->shunt_div);
364 val *= data->config->shunt_div;
368 val = (val * 1000) << data->config->bus_voltage_shift;
369 val = DIV_ROUND_CLOSEST(val, data->config->bus_voltage_lsb);
372 val = clamp_val(val, 0, UINT_MAX - data->power_lsb_uW);
373 val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW);
378 val = DIV_ROUND_CLOSEST(val * 1000, data->current_lsb_uA);
389 struct regmap *regmap = data->regmap;
393 mutex_lock(&data->config_lock);
407 mutex_unlock(&data->config_lock);
413 struct regmap *regmap = data->regmap;
417 return -EINVAL;
422 * if the value is non-zero.
424 mutex_lock(&data->config_lock);
439 mutex_unlock(&data->config_lock);
451 ret = regmap_read(data->regmap, INA2XX_CONFIG, &regval);
458 return -EOPNOTSUPP;
485 struct regmap *regmap = data->regmap;
507 return -EOPNOTSUPP;
525 /* 48-bit register read */
526 ret = i2c_smbus_read_i2c_block_data(data->client, reg, 6, template);
530 return -EIO;
542 *val = DIV_ROUND_CLOSEST(accumulator_24, sample_count) * data->power_lsb_uW;
560 return ina226_alert_read(data->regmap, INA226_POWER_OVER_LIMIT_MASK, val);
562 return -EOPNOTSUPP;
569 struct regmap *regmap = data->regmap;
606 return -EOPNOTSUPP;
623 return -EOPNOTSUPP;
633 return regmap_update_bits(data->regmap, INA2XX_CONFIG,
637 return -EOPNOTSUPP;
657 return -EOPNOTSUPP;
671 return -EOPNOTSUPP;
688 return -EOPNOTSUPP;
706 return -EOPNOTSUPP;
714 bool has_alerts = data->config->has_alerts;
715 bool has_power_average = data->config->has_power_average;
716 enum ina2xx_ids chip = data->chip;
830 data->config->shunt_div);
832 return -EINVAL;
834 data->rshunt = val;
835 data->current_lsb_uA = DIV_ROUND_CLOSEST(dividend, val);
836 data->power_lsb_uW = data->config->power_lsb_factor *
837 data->current_lsb_uA;
847 return sysfs_emit(buf, "%li\n", data->rshunt);
862 mutex_lock(&data->config_lock);
864 mutex_unlock(&data->config_lock);
884 struct regmap *regmap = data->regmap;
888 if (data->config->has_ishunt)
890 else if (device_property_read_u32(dev, "shunt-resistor", &shunt) < 0)
897 ret = regmap_write(regmap, INA2XX_CONFIG, data->config->config_default);
901 if (data->config->has_alerts) {
902 bool active_high = device_property_read_bool(dev, "ti,alert-polarity-active-high");
909 if (data->config->has_power_average) {
910 if (data->chip == sy24655) {
923 if (data->config->has_ishunt)
933 data->config->calibration_value);
938 struct device *dev = &client->dev;
948 return -ENOMEM;
951 data->client = client;
952 data->config = &ina2xx_config[chip];
953 data->chip = chip;
954 mutex_init(&data->config_lock);
956 data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config);
957 if (IS_ERR(data->regmap)) {
959 return PTR_ERR(data->regmap);
963 * Regulator core returns -ENODEV if the 'vs' is not available.
964 * Hence the check for -ENODEV return code is necessary.
967 if (ret < 0 && ret != -ENODEV)
974 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name,
976 data->config->has_ishunt ?
982 client->name, data->rshunt);
1043 MODULE_AUTHOR("Lothar Felten <l-felten@ti.com>");