diff options
Diffstat (limited to 'drivers/base/power/trace.c')
| -rw-r--r-- | drivers/base/power/trace.c | 36 | 
1 files changed, 35 insertions, 1 deletions
diff --git a/drivers/base/power/trace.c b/drivers/base/power/trace.c index 0a1a2c4dbc6e..9f4258df4cfd 100644 --- a/drivers/base/power/trace.c +++ b/drivers/base/power/trace.c  | |||
| @@ -188,8 +188,10 @@ static int show_file_hash(unsigned int value) | |||
| 188 | static int show_dev_hash(unsigned int value) | 188 | static int show_dev_hash(unsigned int value) | 
| 189 | { | 189 | { | 
| 190 | int match = 0; | 190 | int match = 0; | 
| 191 | struct list_head *entry = dpm_list.prev; | 191 | struct list_head *entry; | 
| 192 | 192 | ||
| 193 | device_pm_lock(); | ||
| 194 | entry = dpm_list.prev; | ||
| 193 | while (entry != &dpm_list) { | 195 | while (entry != &dpm_list) { | 
| 194 | struct device * dev = to_device(entry); | 196 | struct device * dev = to_device(entry); | 
| 195 | unsigned int hash = hash_string(DEVSEED, dev_name(dev), DEVHASH); | 197 | unsigned int hash = hash_string(DEVSEED, dev_name(dev), DEVHASH); | 
| @@ -199,11 +201,43 @@ static int show_dev_hash(unsigned int value) | |||
| 199 | } | 201 | } | 
| 200 | entry = entry->prev; | 202 | entry = entry->prev; | 
| 201 | } | 203 | } | 
| 204 | device_pm_unlock(); | ||
| 202 | return match; | 205 | return match; | 
| 203 | } | 206 | } | 
| 204 | 207 | ||
| 205 | static unsigned int hash_value_early_read; | 208 | static unsigned int hash_value_early_read; | 
| 206 | 209 | ||
| 210 | int show_trace_dev_match(char *buf, size_t size) | ||
| 211 | { | ||
| 212 | unsigned int value = hash_value_early_read / (USERHASH * FILEHASH); | ||
| 213 | int ret = 0; | ||
| 214 | struct list_head *entry; | ||
| 215 | |||
| 216 | /* | ||
| 217 | * It's possible that multiple devices will match the hash and we can't | ||
| 218 | * tell which is the culprit, so it's best to output them all. | ||
| 219 | */ | ||
| 220 | device_pm_lock(); | ||
| 221 | entry = dpm_list.prev; | ||
| 222 | while (size && entry != &dpm_list) { | ||
| 223 | struct device *dev = to_device(entry); | ||
| 224 | unsigned int hash = hash_string(DEVSEED, dev_name(dev), | ||
| 225 | DEVHASH); | ||
| 226 | if (hash == value) { | ||
| 227 | int len = snprintf(buf, size, "%s\n", | ||
| 228 | dev_driver_string(dev)); | ||
| 229 | if (len > size) | ||
| 230 | len = size; | ||
| 231 | buf += len; | ||
| 232 | ret += len; | ||
| 233 | size -= len; | ||
| 234 | } | ||
| 235 | entry = entry->prev; | ||
| 236 | } | ||
| 237 | device_pm_unlock(); | ||
| 238 | return ret; | ||
| 239 | } | ||
| 240 | |||
| 207 | static int early_resume_init(void) | 241 | static int early_resume_init(void) | 
| 208 | { | 242 | { | 
| 209 | hash_value_early_read = read_magic_time(); | 243 | hash_value_early_read = read_magic_time(); | 
