|
@@ -544,6 +544,69 @@ int devfreq_remove_device(struct devfreq *devfreq)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(devfreq_remove_device);
|
|
EXPORT_SYMBOL(devfreq_remove_device);
|
|
|
|
|
|
|
|
+static int devm_devfreq_dev_match(struct device *dev, void *res, void *data)
|
|
|
|
+{
|
|
|
|
+ struct devfreq **r = res;
|
|
|
|
+
|
|
|
|
+ if (WARN_ON(!r || !*r))
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ return *r == data;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void devm_devfreq_dev_release(struct device *dev, void *res)
|
|
|
|
+{
|
|
|
|
+ devfreq_remove_device(*(struct devfreq **)res);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * devm_devfreq_add_device() - Resource-managed devfreq_add_device()
|
|
|
|
+ * @dev: the device to add devfreq feature.
|
|
|
|
+ * @profile: device-specific profile to run devfreq.
|
|
|
|
+ * @governor_name: name of the policy to choose frequency.
|
|
|
|
+ * @data: private data for the governor. The devfreq framework does not
|
|
|
|
+ * touch this value.
|
|
|
|
+ *
|
|
|
|
+ * This function manages automatically the memory of devfreq device using device
|
|
|
|
+ * resource management and simplify the free operation for memory of devfreq
|
|
|
|
+ * device.
|
|
|
|
+ */
|
|
|
|
+struct devfreq *devm_devfreq_add_device(struct device *dev,
|
|
|
|
+ struct devfreq_dev_profile *profile,
|
|
|
|
+ const char *governor_name,
|
|
|
|
+ void *data)
|
|
|
|
+{
|
|
|
|
+ struct devfreq **ptr, *devfreq;
|
|
|
|
+
|
|
|
|
+ ptr = devres_alloc(devm_devfreq_dev_release, sizeof(*ptr), GFP_KERNEL);
|
|
|
|
+ if (!ptr)
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+
|
|
|
|
+ devfreq = devfreq_add_device(dev, profile, governor_name, data);
|
|
|
|
+ if (IS_ERR(devfreq)) {
|
|
|
|
+ devres_free(ptr);
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ *ptr = devfreq;
|
|
|
|
+ devres_add(dev, ptr);
|
|
|
|
+
|
|
|
|
+ return devfreq;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(devm_devfreq_add_device);
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * devm_devfreq_remove_device() - Resource-managed devfreq_remove_device()
|
|
|
|
+ * @dev: the device to add devfreq feature.
|
|
|
|
+ * @devfreq: the devfreq instance to be removed
|
|
|
|
+ */
|
|
|
|
+void devm_devfreq_remove_device(struct device *dev, struct devfreq *devfreq)
|
|
|
|
+{
|
|
|
|
+ WARN_ON(devres_release(dev, devm_devfreq_dev_release,
|
|
|
|
+ devm_devfreq_dev_match, devfreq));
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(devm_devfreq_remove_device);
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* devfreq_suspend_device() - Suspend devfreq of a device.
|
|
* devfreq_suspend_device() - Suspend devfreq of a device.
|
|
* @devfreq: the devfreq instance to be suspended
|
|
* @devfreq: the devfreq instance to be suspended
|