|
@@ -386,6 +386,27 @@ struct dev_pm_opp *dev_pm_opp_find_freq_floor(struct device *dev,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(dev_pm_opp_find_freq_floor);
|
|
|
|
|
|
+static struct device_opp *add_device_opp(struct device *dev)
|
|
|
+{
|
|
|
+ struct device_opp *dev_opp;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Allocate a new device OPP table. In the infrequent case where a new
|
|
|
+ * device is needed to be added, we pay this penalty.
|
|
|
+ */
|
|
|
+ dev_opp = kzalloc(sizeof(*dev_opp), GFP_KERNEL);
|
|
|
+ if (!dev_opp)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ dev_opp->dev = dev;
|
|
|
+ srcu_init_notifier_head(&dev_opp->srcu_head);
|
|
|
+ INIT_LIST_HEAD(&dev_opp->opp_list);
|
|
|
+
|
|
|
+ /* Secure the device list modification */
|
|
|
+ list_add_rcu(&dev_opp->node, &dev_opp_list);
|
|
|
+ return dev_opp;
|
|
|
+}
|
|
|
+
|
|
|
static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
|
|
|
unsigned long u_volt, bool dynamic)
|
|
|
{
|
|
@@ -412,27 +433,13 @@ static int dev_pm_opp_add_dynamic(struct device *dev, unsigned long freq,
|
|
|
/* Check for existing list for 'dev' */
|
|
|
dev_opp = find_device_opp(dev);
|
|
|
if (IS_ERR(dev_opp)) {
|
|
|
- /*
|
|
|
- * Allocate a new device OPP table. In the infrequent case
|
|
|
- * where a new device is needed to be added, we pay this
|
|
|
- * penalty.
|
|
|
- */
|
|
|
- dev_opp = kzalloc(sizeof(struct device_opp), GFP_KERNEL);
|
|
|
+ dev_opp = add_device_opp(dev);
|
|
|
if (!dev_opp) {
|
|
|
mutex_unlock(&dev_opp_list_lock);
|
|
|
kfree(new_opp);
|
|
|
- dev_warn(dev,
|
|
|
- "%s: Unable to create device OPP structure\n",
|
|
|
- __func__);
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- dev_opp->dev = dev;
|
|
|
- srcu_init_notifier_head(&dev_opp->srcu_head);
|
|
|
- INIT_LIST_HEAD(&dev_opp->opp_list);
|
|
|
-
|
|
|
- /* Secure the device list modification */
|
|
|
- list_add_rcu(&dev_opp->node, &dev_opp_list);
|
|
|
head = &dev_opp->opp_list;
|
|
|
goto list_add;
|
|
|
}
|