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; }
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; }
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; }