aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleg Drokin <green@linuxhacker.ru>2016-06-18 20:26:01 -0400
committerNivedita Swaminathan <nivedita.swaminathan@intel.com>2016-07-21 15:12:34 -0700
commitddba023b8650effe4ee361b7d6e847d546e2b44b (patch)
tree54faf1a1382e019eff0e4647ca52076cd2b57990
parentb0503dc123532e81a1633f7318dc7a30da03e7ce (diff)
Add support for usbdevfs
Similar to ALSA, usb devices could be held at full power by opening them via usbdevfs, so it's good to track such processes and attribute the power to them. Signed-off-by: Oleg Drokin <green@linuxhacker.ru>
-rw-r--r--src/devices/usb.cpp28
-rw-r--r--src/devices/usb.h3
2 files changed, 31 insertions, 0 deletions
diff --git a/src/devices/usb.cpp b/src/devices/usb.cpp
index aa9c227..5042699 100644
--- a/src/devices/usb.cpp
+++ b/src/devices/usb.cpp
@@ -31,6 +31,7 @@
#include <limits.h>
#include "../lib.h"
+#include "../devlist.h"
#include "../parameters/parameters.h"
#include <iostream>
@@ -52,6 +53,8 @@ usbdevice::usbdevice(const char *_name, const char *path, const char *devid): de
active_after = 0;
connected_before = 0;
connected_after = 0;
+ busnum = 0;
+ devnum = 0;
index = get_param_index(devname);
r_index = get_result_index(name);
@@ -93,6 +96,22 @@ usbdevice::usbdevice(const char *_name, const char *path, const char *devid): de
snprintf(humanname, sizeof(humanname), _("USB device: %s"), product);
else if (strlen(vendor))
snprintf(humanname, sizeof(humanname), _("USB device: %s"), vendor);
+
+ /* For usbdevfs we need bus number and device number */
+ snprintf(filename, sizeof(filename), "%s/busnum", path);
+ file.open(filename, ios::in);
+ if (file) {
+
+ file >> busnum;
+ file.close();
+ };
+ snprintf(filename, sizeof(filename), "%s/devnum", path);
+ file.open(filename, ios::in);
+ if (file) {
+
+ file >> devnum;
+ file.close();
+ };
}
@@ -165,6 +184,15 @@ const char * usbdevice::human_name(void)
return humanname;
}
+void usbdevice::register_power_with_devlist(struct result_bundle *results, struct parameter_bundle *bundle)
+{
+ char devfs_name[1024];
+
+ snprintf(devfs_name, sizeof(devfs_name), "usb/%03d/%03d", busnum,
+ devnum);
+
+ register_devpower(devfs_name, power_usage(results, bundle), this);
+}
double usbdevice::power_usage(struct result_bundle *result, struct parameter_bundle *bundle)
{
diff --git a/src/devices/usb.h b/src/devices/usb.h
index 097df51..7e76a55 100644
--- a/src/devices/usb.h
+++ b/src/devices/usb.h
@@ -40,6 +40,8 @@ class usbdevice: public device {
int index;
int r_index;
int rootport;
+ int busnum;
+ int devnum;
public:
usbdevice(const char *_name, const char *path, const char *devid);
@@ -53,6 +55,7 @@ public:
virtual const char * device_name(void);
virtual const char * human_name(void);
+ virtual void register_power_with_devlist(struct result_bundle *results, struct parameter_bundle *bundle);
virtual double power_usage(struct result_bundle *result, struct parameter_bundle *bundle);
virtual int power_valid(void) { return utilization_power_valid(r_index);};
virtual int grouping_prio(void) { return 4; };