diff options
author | Deepak Nibade <dnibade@nvidia.com> | 2013-07-15 15:07:14 +0530 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2013-09-14 13:32:08 -0700 |
commit | e6868ee66edbaa02639ae5135cf96593f10ef611 (patch) | |
tree | 8b6d171351b1e0953fc6cdaa5128b9096beed3cd /drivers/hwmon | |
parent | 9ffb484159b5412a7e41bd570cfe0a6e5bddb302 (diff) |
hwmon: ina230: add new sysfs for power measurement
- add new sysfs API "power2_input" for power measurement
- this sysfs makes use of shunt resistor value for power calculation
- it is independent of other constants like calibration and power lsb
Bug 1325760
Change-Id: I756e89b98c9771481b1b7e01e2ae0a8a0903eed6
Signed-off-by: Deepak Nibade <dnibade@nvidia.com>
Reviewed-on: http://git-master/r/249201
(cherry picked from commit 4529558b283ada071fd15c4113d9295c8db1d3fc)
Reviewed-on: http://git-master/r/250066
Reviewed-by: Sachin Nikam <snikam@nvidia.com>
Diffstat (limited to 'drivers/hwmon')
-rw-r--r-- | drivers/hwmon/ina230.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/hwmon/ina230.c b/drivers/hwmon/ina230.c index 93592b090fe4..e2e0510afa79 100644 --- a/drivers/hwmon/ina230.c +++ b/drivers/hwmon/ina230.c @@ -516,6 +516,45 @@ static s32 show_power(struct device *dev, return sprintf(buf, "%d mW\n", power_mW); } +static s32 show_power2(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 power_mW, voltage_uV, voltage_mV; + s32 inverse_shunt_resistor, current_mA; + int retval; + + mutex_lock(&data->mutex); + retval = ensure_enabled_start(client); + if (retval < 0) { + mutex_unlock(&data->mutex); + return retval; + } + + voltage_mV = + (s16)be16_to_cpu(i2c_smbus_read_word_data(client, + INA230_VOLTAGE)); + + voltage_uV = + (s16)be16_to_cpu(i2c_smbus_read_word_data(client, + INA230_SHUNT)); + + ensure_enabled_end(client); + mutex_unlock(&data->mutex); + + voltage_mV = busv_register_to_mv(voltage_mV); + + voltage_uV = shuntv_register_to_uv(voltage_uV); + + inverse_shunt_resistor = 1000 / data->pdata->resistor; + current_mA = voltage_uV * inverse_shunt_resistor / 1000; + power_mW = voltage_mV * current_mA / 1000; + + return sprintf(buf, "%d mW\n", power_mW); +} + static s32 show_alert_flag(struct device *dev, struct device_attribute *attr, char *buf) @@ -568,6 +607,7 @@ static struct sensor_device_attribute ina230[] = { SENSOR_ATTR(in1_input, S_IRUGO, show_bus_voltage, NULL, 0), #endif SENSOR_ATTR(power1_input, S_IRUGO, show_power, NULL, 0), + SENSOR_ATTR(power2_input, S_IRUGO, show_power2, NULL, 0), SENSOR_ATTR(alert_flag, S_IRUGO, show_alert_flag, NULL, 0), }; |