diff options
author | Oleg Drokin <green@linuxhacker.ru> | 2016-06-18 20:26:01 -0400 |
---|---|---|
committer | Nivedita Swaminathan <nivedita.swaminathan@intel.com> | 2016-07-21 15:12:34 -0700 |
commit | ddba023b8650effe4ee361b7d6e847d546e2b44b (patch) | |
tree | 54faf1a1382e019eff0e4647ca52076cd2b57990 | |
parent | b0503dc123532e81a1633f7318dc7a30da03e7ce (diff) | |
download | powertop-2.0-ddba023b8650effe4ee361b7d6e847d546e2b44b.tar.gz |
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.cpp | 28 | ||||
-rw-r--r-- | src/devices/usb.h | 3 |
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; }; |