summaryrefslogtreecommitdiff
path: root/drivers/hwmon
diff options
context:
space:
mode:
authorDeepak Nibade <dnibade@nvidia.com>2013-07-15 15:07:14 +0530
committerDan Willemsen <dwillemsen@nvidia.com>2013-09-14 13:32:08 -0700
commite6868ee66edbaa02639ae5135cf96593f10ef611 (patch)
tree8b6d171351b1e0953fc6cdaa5128b9096beed3cd /drivers/hwmon
parent9ffb484159b5412a7e41bd570cfe0a6e5bddb302 (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.c40
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),
};