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