summaryrefslogtreecommitdiff
path: root/drivers/regulator/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/regulator/core.c')
-rw-r--r--drivers/regulator/core.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
index d8e6a429e8ba..bd081d4ae292 100644
--- a/drivers/regulator/core.c
+++ b/drivers/regulator/core.c
@@ -31,6 +31,9 @@
#define CREATE_TRACE_POINTS
#include <trace/events/regulator.h>
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
+#include <linux/uaccess.h>
#include "dummy.h"
@@ -2988,4 +2991,59 @@ unlock:
return 0;
}
+
+#ifdef CONFIG_DEBUG_FS
+static int regulator_syncevent(struct file *file, const char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ struct regulator_dev *rdev;
+ char buffer[40];
+ int buf_size;
+
+ memset(buffer, 0, sizeof(buffer));
+ buf_size = min(count, (sizeof(buffer)-1));
+
+ if (copy_from_user(buffer, user_buf, buf_size))
+ return -EFAULT;
+
+ if (!strnicmp("all", buffer, 3)) {
+
+ mutex_lock(&regulator_list_mutex);
+
+ list_for_each_entry(rdev, &regulator_list, list) {
+ mutex_lock(&rdev->mutex);
+
+ if (_regulator_is_enabled(rdev))
+ trace_regulator_enable(rdev_get_name(rdev));
+ else
+ trace_regulator_disable(rdev_get_name(rdev));
+
+ trace_regulator_set_voltage(rdev_get_name(rdev),
+ _regulator_get_voltage(rdev),
+ _regulator_get_voltage(rdev));
+
+ mutex_unlock(&rdev->mutex);
+ }
+ }
+
+ mutex_unlock(&regulator_list_mutex);
+
+ return count;
+}
+
+static const struct file_operations regulator_syncevent_fops = {
+ .write = regulator_syncevent,
+};
+
+static int __init regulator_init_debugfs(void)
+{
+ debugfs_create_file("syncevent_regulators", S_IWUGO, NULL, NULL,
+ &regulator_syncevent_fops);
+
+ return 0;
+}
+
+late_initcall(regulator_init_debugfs);
+#endif
+
late_initcall(regulator_init_complete);