|
@@ -25,6 +25,7 @@
|
|
|
#include <linux/list.h>
|
|
|
#include <linux/printk.h>
|
|
|
#include <linux/hrtimer.h>
|
|
|
+#include <linux/of.h>
|
|
|
#include "governor.h"
|
|
|
|
|
|
static struct class *devfreq_class;
|
|
@@ -639,6 +640,49 @@ struct devfreq *devm_devfreq_add_device(struct device *dev,
|
|
|
}
|
|
|
EXPORT_SYMBOL(devm_devfreq_add_device);
|
|
|
|
|
|
+#ifdef CONFIG_OF
|
|
|
+/*
|
|
|
+ * devfreq_get_devfreq_by_phandle - Get the devfreq device from devicetree
|
|
|
+ * @dev - instance to the given device
|
|
|
+ * @index - index into list of devfreq
|
|
|
+ *
|
|
|
+ * return the instance of devfreq device
|
|
|
+ */
|
|
|
+struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index)
|
|
|
+{
|
|
|
+ struct device_node *node;
|
|
|
+ struct devfreq *devfreq;
|
|
|
+
|
|
|
+ if (!dev)
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
+
|
|
|
+ if (!dev->of_node)
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
+
|
|
|
+ node = of_parse_phandle(dev->of_node, "devfreq", index);
|
|
|
+ if (!node)
|
|
|
+ return ERR_PTR(-ENODEV);
|
|
|
+
|
|
|
+ mutex_lock(&devfreq_list_lock);
|
|
|
+ list_for_each_entry(devfreq, &devfreq_list, node) {
|
|
|
+ if (devfreq->dev.parent
|
|
|
+ && devfreq->dev.parent->of_node == node) {
|
|
|
+ mutex_unlock(&devfreq_list_lock);
|
|
|
+ return devfreq;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mutex_unlock(&devfreq_list_lock);
|
|
|
+
|
|
|
+ return ERR_PTR(-EPROBE_DEFER);
|
|
|
+}
|
|
|
+#else
|
|
|
+struct devfreq *devfreq_get_devfreq_by_phandle(struct device *dev, int index)
|
|
|
+{
|
|
|
+ return ERR_PTR(-ENODEV);
|
|
|
+}
|
|
|
+#endif /* CONFIG_OF */
|
|
|
+EXPORT_SYMBOL_GPL(devfreq_get_devfreq_by_phandle);
|
|
|
+
|
|
|
/**
|
|
|
* devm_devfreq_remove_device() - Resource-managed devfreq_remove_device()
|
|
|
* @dev: the device to add devfreq feature.
|