static s32 show_shunt_voltage(struct device *dev,
			struct device_attribute *attr,
			char *buf)
{
	struct i2c_client *client = to_i2c_client(dev);
	struct ina230_data *data = i2c_get_clientdata(client);
	s32 voltage_uV;
	int retval;

	mutex_lock(&data->mutex);
	retval = ensure_enabled_start(client);
	if (retval < 0) {
		mutex_unlock(&data->mutex);
		return retval;
	}

	voltage_uV =
		(s16)be16_to_cpu(i2c_smbus_read_word_data(client,
							  INA230_SHUNT));

	ensure_enabled_end(client);
	mutex_unlock(&data->mutex);

	voltage_uV = shuntv_register_to_uv(voltage_uV);

	return sprintf(buf, "%d uV\n", voltage_uV);
}
Esempio n. 2
0
static s32 show_current(struct device *dev,
		struct device_attribute *devattr,
		char *buf)
{
	struct i2c_client *client = to_i2c_client(dev);
	struct ina3221_data *data = i2c_get_clientdata(client);
	struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
	u8 index, shunt_volt_reg_addr;
	s32 ret;
	s32 voltage_uV;
	s32 current_mA;
	s32 inverse_shunt_resistor;

	mutex_lock(&data->mutex);
	if (data->shutdown_complete) {
		ret = -ENODEV;
		goto error;
	}
	index = attr->index;
	shunt_volt_reg_addr = (INA3221_SHUNT_VOL_CHAN1 + (index * 2));

	if (data->mode == TRIGGERED) {
		ret = __locked_power_up_ina3221(client,
				data->plat_data->trig_conf_data);
		if (ret < 0) {
			dev_err(dev,
				"power up failed sts: 0x%x\n", ret);
			goto error;
		}
	}

	/* getting voltage readings in micro volts*/
	voltage_uV =
		be16_to_cpu(i2c_smbus_read_word_data(client,
			shunt_volt_reg_addr));
	DEBUG_INA3221(("Ina3221 voltage reg Value: 0x%x\n", voltage_uV));
	if (voltage_uV < 0)
		goto error;
	voltage_uV = shuntv_register_to_uv(voltage_uV);
	DEBUG_INA3221(("Ina3221 voltage in uv: %d\n", voltage_uV));

	/* shunt_resistor is received in mOhms */
	inverse_shunt_resistor = 1000 / data->plat_data->shunt_resistor[index];
	current_mA = (voltage_uV * inverse_shunt_resistor) / 1000;

	if (data->mode == TRIGGERED) {
		/* set ina3221 to power down mode */
		ret = __locked_power_down_ina3221(client);
		if (ret < 0)
			goto error;
	}

	DEBUG_INA3221(("%s current = %d\n", __func__, current_mA));
	mutex_unlock(&data->mutex);
	return sprintf(buf, "%d mA\n", current_mA);
error:
	mutex_unlock(&data->mutex);
	dev_err(dev, "%s: failed\n", __func__);
	return ret;
}
Esempio n. 3
0
static s32 __locked_calculate_power(struct i2c_client *client,
					u8 shunt_volt_reg_addr,
					u8 bus_volt_reg_addr,
					int index)
{

	struct ina3221_data *data = i2c_get_clientdata(client);
	s32 voltage_mV;
	s32 voltage_uV;
	s32 inverse_shunt_resistor;
	s32 current_mA;
	s32 power_mW;
	/* getting voltage readings in micro volts*/
	voltage_uV =
		be16_to_cpu(i2c_smbus_read_word_data(client,
			shunt_volt_reg_addr));
	DEBUG_INA3221(("Ina3221 voltage reg Value: 0x%x\n", voltage_uV));
	if (voltage_uV < 0)
		goto error;
	voltage_uV = shuntv_register_to_uv(voltage_uV);
	DEBUG_INA3221(("Ina3221 voltage in uv: %d\n", voltage_uV));

	/* getting voltage readings in milli volts*/
	voltage_mV =
		be16_to_cpu(i2c_smbus_read_word_data(client,
			bus_volt_reg_addr));
	DEBUG_INA3221(("Ina3221 voltage reg Value: 0x%x\n", voltage_mV));
	if (voltage_mV < 0)
		goto error;
	voltage_mV = busv_register_to_mv(voltage_mV);
	DEBUG_INA3221(("Ina3221 voltage in mv: %d\n", voltage_mV));

	/* shunt_resistor is received in mOhms */
	inverse_shunt_resistor = 1000 / data->plat_data->shunt_resistor[index];
	current_mA = voltage_uV * inverse_shunt_resistor / 1000;
	power_mW = voltage_mV * current_mA / 1000;
	return power_mW;
error:
	return -EIO;
}