Lines Matching +full:bi +full:- +full:directional
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 */
259 val = DIV_ROUND_CLOSEST((s16)regval, data->config->shunt_div); in ina2xx_get_value()
262 val = (regval >> data->config->bus_voltage_shift) * in ina2xx_get_value()
263 data->config->bus_voltage_lsb; in ina2xx_get_value()
267 val = regval * data->power_lsb_uW; in ina2xx_get_value()
271 val = (s16)regval * data->current_lsb_uA; in ina2xx_get_value()
289 * check if the chip has been power cycled or reset. If so, re-initialize it.
294 struct regmap *regmap = data->regmap; in ina2xx_read_init()
298 if (data->config->has_ishunt) { in ina2xx_read_init()
307 for (retry = 5; retry; retry--) { in ina2xx_read_init()
352 return -ENODEV; in ina2xx_read_init()
363 val = clamp_val(val, 0, SHRT_MAX * data->config->shunt_div); in ina226_alert_to_reg()
364 val *= data->config->shunt_div; in ina226_alert_to_reg()
368 val = (val * 1000) << data->config->bus_voltage_shift; in ina226_alert_to_reg()
369 val = DIV_ROUND_CLOSEST(val, data->config->bus_voltage_lsb); in ina226_alert_to_reg()
372 val = clamp_val(val, 0, UINT_MAX - data->power_lsb_uW); in ina226_alert_to_reg()
373 val = DIV_ROUND_CLOSEST(val, data->power_lsb_uW); in ina226_alert_to_reg()
378 val = DIV_ROUND_CLOSEST(val * 1000, data->current_lsb_uA); in ina226_alert_to_reg()
389 struct regmap *regmap = data->regmap; in ina226_alert_limit_read()
393 mutex_lock(&data->config_lock); in ina226_alert_limit_read()
407 mutex_unlock(&data->config_lock); in ina226_alert_limit_read()
413 struct regmap *regmap = data->regmap; in ina226_alert_limit_write()
417 return -EINVAL; in ina226_alert_limit_write()
422 * if the value is non-zero. in ina226_alert_limit_write()
424 mutex_lock(&data->config_lock); in ina226_alert_limit_write()
439 mutex_unlock(&data->config_lock); in ina226_alert_limit_write()
451 ret = regmap_read(data->regmap, INA2XX_CONFIG, ®val); in ina2xx_chip_read()
458 return -EOPNOTSUPP; in ina2xx_chip_read()
485 struct regmap *regmap = data->regmap; in ina2xx_in_read()
507 return -EOPNOTSUPP; in ina2xx_in_read()
525 /* 48-bit register read */ in sy24655_average_power_read()
526 ret = i2c_smbus_read_i2c_block_data(data->client, reg, 6, template); in sy24655_average_power_read()
530 return -EIO; in sy24655_average_power_read()
542 *val = DIV_ROUND_CLOSEST(accumulator_24, sample_count) * data->power_lsb_uW; in sy24655_average_power_read()
560 return ina226_alert_read(data->regmap, INA226_POWER_OVER_LIMIT_MASK, val); in ina2xx_power_read()
562 return -EOPNOTSUPP; in ina2xx_power_read()
569 struct regmap *regmap = data->regmap; in ina2xx_curr_read()
606 return -EOPNOTSUPP; in ina2xx_curr_read()
623 return -EOPNOTSUPP; in ina2xx_read()
633 return regmap_update_bits(data->regmap, INA2XX_CONFIG, in ina2xx_chip_write()
637 return -EOPNOTSUPP; in ina2xx_chip_write()
657 return -EOPNOTSUPP; in ina2xx_in_write()
671 return -EOPNOTSUPP; in ina2xx_power_write()
688 return -EOPNOTSUPP; in ina2xx_curr_write()
706 return -EOPNOTSUPP; in ina2xx_write()
714 bool has_alerts = data->config->has_alerts; in ina2xx_is_visible()
715 bool has_power_average = data->config->has_power_average; in ina2xx_is_visible()
716 enum ina2xx_ids chip = data->chip; in ina2xx_is_visible()
830 data->config->shunt_div); in ina2xx_set_shunt()
832 return -EINVAL; in ina2xx_set_shunt()
834 data->rshunt = val; in ina2xx_set_shunt()
835 data->current_lsb_uA = DIV_ROUND_CLOSEST(dividend, val); in ina2xx_set_shunt()
836 data->power_lsb_uW = data->config->power_lsb_factor * in ina2xx_set_shunt()
837 data->current_lsb_uA; in ina2xx_set_shunt()
847 return sysfs_emit(buf, "%li\n", data->rshunt); in shunt_resistor_show()
862 mutex_lock(&data->config_lock); in shunt_resistor_store()
864 mutex_unlock(&data->config_lock); in shunt_resistor_store()
884 struct regmap *regmap = data->regmap; in ina2xx_init()
888 if (data->config->has_ishunt) in ina2xx_init()
890 else if (device_property_read_u32(dev, "shunt-resistor", &shunt) < 0) in ina2xx_init()
897 ret = regmap_write(regmap, INA2XX_CONFIG, data->config->config_default); in ina2xx_init()
901 if (data->config->has_alerts) { in ina2xx_init()
902 bool active_high = device_property_read_bool(dev, "ti,alert-polarity-active-high"); in ina2xx_init()
909 if (data->config->has_power_average) { in ina2xx_init()
910 if (data->chip == sy24655) { in ina2xx_init()
923 if (data->config->has_ishunt) in ina2xx_init()
933 data->config->calibration_value); in ina2xx_init()
938 struct device *dev = &client->dev; in ina2xx_probe()
948 return -ENOMEM; in ina2xx_probe()
951 data->client = client; in ina2xx_probe()
952 data->config = &ina2xx_config[chip]; in ina2xx_probe()
953 data->chip = chip; in ina2xx_probe()
954 mutex_init(&data->config_lock); in ina2xx_probe()
956 data->regmap = devm_regmap_init_i2c(client, &ina2xx_regmap_config); in ina2xx_probe()
957 if (IS_ERR(data->regmap)) { in ina2xx_probe()
959 return PTR_ERR(data->regmap); in ina2xx_probe()
970 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, in ina2xx_probe()
972 data->config->has_ishunt ? in ina2xx_probe()
978 client->name, data->rshunt); in ina2xx_probe()
1039 MODULE_AUTHOR("Lothar Felten <l-felten@ti.com>");