static s32 show_bus_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_mV;
	int retval;

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

	/* getting voltage readings in milli volts*/
	voltage_mV =
		(s16)be16_to_cpu(i2c_smbus_read_word_data(client,
							  INA230_VOLTAGE));

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

	if (voltage_mV < 0) {
		dev_err(dev, "%s: failed\n", __func__);
		return -1;
	}

	voltage_mV = busv_register_to_mv(voltage_mV);

	return sprintf(buf, "%d mV\n", voltage_mV);
}
s32 ina230_get_batt_volt(void)
{
	struct i2c_client *client = to_i2c_client(this_dev);
	struct ina230_data *data = i2c_get_clientdata(client);
	s32 voltage_mV;
	int retval;

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

	/* getting voltage readings in milli volts*/
	voltage_mV =
		(s16)be16_to_cpu(i2c_smbus_read_word_data(client,
							  INA230_VOLTAGE));

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

	if (voltage_mV < 0) {
		dev_err(this_dev, "%s: failed\n", __func__);
		return -1;
	}

	voltage_mV = busv_register_to_mv(voltage_mV);
	return voltage_mV;
}
Example #3
0
static s32 show_voltage(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, bus_volt_reg_addr;
	s32 ret;
	s32 voltage_mV;

	mutex_lock(&data->mutex);
	if (data->shutdown_complete) {
		ret = -ENODEV;
		goto error;
	}
	index = attr->index;
	bus_volt_reg_addr = (INA3221_BUS_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, status: 0x%x\n", ret);
			goto error;
		}
	}

	/* 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));

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

	DEBUG_INA3221(("%s volt = %d\n", __func__, voltage_mV));
	mutex_unlock(&data->mutex);
	return sprintf(buf, "%d mV\n", voltage_mV);
error:
	mutex_unlock(&data->mutex);
	dev_err(dev, "%s: failed\n", __func__);
	return ret;
}
s32 ina230_get_bus_voltage_multi(s32 *voltage_mV, u32 num)
{
	struct i2c_client *client = to_i2c_client(this_dev);
	struct ina230_data *data = i2c_get_clientdata(client);
	int retval = 0;
	unsigned int i = 0;

	if (!voltage_mV || num == 0) {
		dev_err(this_dev, "%s: failed with bad parameter (%p, %u)\n", __func__, voltage_mV, num);
		retval = -1;
		goto fault;
	}

	mutex_lock(&data->mutex);
	i = 0;
	do {
		retval = ensure_enabled_start(client);
		if (retval < 0) {
			mutex_unlock(&data->mutex);
			goto fault;
		}

		/* getting voltage readings in milli volts*/
		voltage_mV[i] =
			(s16)be16_to_cpu(i2c_smbus_read_word_data(client,
						INA230_VOLTAGE));

		ensure_enabled_end(client);
		mdelay(1);
	} while (++i < num);
	mutex_unlock(&data->mutex);

	i = 0;
	do {
		if (voltage_mV[i] < 0) {
			dev_err(this_dev, "%s: failed at %u\n", __func__, i);
			retval = -1;
			goto fault;
		}
		voltage_mV[i] = busv_register_to_mv(voltage_mV[i]);
	} while (++i < num);

fault:
	return retval;
}
s32 ina230_get_batt_voltage_current(s32 *voltage_mV, s32 *current_mA)
{
	struct i2c_client *client = to_i2c_client(this_dev);
	struct ina230_data *data = i2c_get_clientdata(client);
	int retval = 0;

	if (!voltage_mV || !current_mA) {
		dev_err(this_dev, "%s: failed with bad parameter (%p, %p)\n", __func__, voltage_mV, current_mA);
		retval = -1;
		goto fault;
	}

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

	/* getting voltage readings in milli volts*/
	*voltage_mV =
		(s16)be16_to_cpu(i2c_smbus_read_word_data(client,
							  INA230_VOLTAGE));

	/* getting current readings in milli amps */
	*current_mA =
		(s16)be16_to_cpu(i2c_smbus_read_word_data(client,
							  INA230_CURRENT));

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

	if (*voltage_mV < 0) {
		dev_err(this_dev, "%s: failed\n", __func__);
		retval = -1;
		goto fault;
	}

	*voltage_mV = busv_register_to_mv(*voltage_mV);
	*current_mA = currenta_register_to_ma(*current_mA);
fault:
	return retval;
}
Example #6
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;
}