diff options
| -rw-r--r-- | drivers/base/power/opp.c | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/drivers/base/power/opp.c b/drivers/base/power/opp.c index 525ffb202d77..1150b9d2e012 100644 --- a/drivers/base/power/opp.c +++ b/drivers/base/power/opp.c | |||
| @@ -386,6 +386,27 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev, | |||
| 386 | } | 386 | } |
| 387 | EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor); | 387 | EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor); |
| 388 | 388 | ||
| 389 | static struct device_opp *add_device_opp(struct device *dev) | ||
| 390 | { | ||
| 391 | struct device_opp *dev_opp; | ||
| 392 | |||
| 393 | /* | ||
| 394 | * Allocate a new device OPP table. In the infrequent case where a new | ||
| 395 | * device is needed to be added, we pay this penalty. | ||
| 396 | */ | ||
| 397 | dev_opp = kzalloc(sizeof(*dev_opp), GFP_KERNEL); | ||
| 398 | if (!dev_opp) | ||
| 399 | return NULL; | ||
| 400 | |||
| 401 | dev_opp->dev = dev; | ||
| 402 | srcu_init_notifier_head(&dev_opp->srcu_head); | ||
| 403 | INIT_LIST_HEAD(&dev_opp->opp_list); | ||
| 404 | |||
| 405 | /* Secure the device list modification */ | ||
| 406 | list_add_rcu(&dev_opp->node, &dev_opp_list); | ||
| 407 | return dev_opp; | ||
| 408 | } | ||
| 409 | |||
| 389 | static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq, | 410 | static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq, |
| 390 | unsigned long u_volt, bool dynamic) | 411 | unsigned long u_volt, bool dynamic) |
| 391 | { | 412 | { |
| @@ -412,27 +433,13 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq, | |||
| 412 | /* Check for existing list for 'dev' */ | 433 | /* Check for existing list for 'dev' */ |
| 413 | dev_opp = find_device_opp(dev); | 434 | dev_opp = find_device_opp(dev); |
| 414 | if (IS_ERR(dev_opp)) { | 435 | if (IS_ERR(dev_opp)) { |
| 415 | /* | 436 | dev_opp = add_device_opp(dev); |
| 416 | * Allocate a new device OPP table. In the infrequent case | ||
| 417 | * where a new device is needed to be added, we pay this | ||
| 418 | * penalty. | ||
| 419 | */ | ||
| 420 | dev_opp = kzalloc(sizeof(struct device_opp), GFP_KERNEL); | ||
| 421 | if (!dev_opp) { | 437 | if (!dev_opp) { |
| 422 | mutex_unlock(&dev_opp_list_lock); | 438 | mutex_unlock(&dev_opp_list_lock); |
| 423 | kfree(new_opp); | 439 | kfree(new_opp); |
| 424 | dev_warn(dev, | ||
| 425 | "%s: Unable to create device OPP structure\n", | ||
| 426 | __func__); | ||
| 427 | return -ENOMEM; | 440 | return -ENOMEM; |
| 428 | } | 441 | } |
| 429 | 442 | ||
| 430 | dev_opp->dev = dev; | ||
| 431 | srcu_init_notifier_head(&dev_opp->srcu_head); | ||
| 432 | INIT_LIST_HEAD(&dev_opp->opp_list); | ||
| 433 | |||
| 434 | /* Secure the device list modification */ | ||
| 435 | list_add_rcu(&dev_opp->node, &dev_opp_list); | ||
| 436 | head = &dev_opp->opp_list; | 443 | head = &dev_opp->opp_list; |
| 437 | goto list_add; | 444 | goto list_add; |
| 438 | } | 445 | } |
