diff options
Diffstat (limited to 'drivers/regulator/core.c')
-rw-r--r-- | drivers/regulator/core.c | 58 |
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(®ulator_list_mutex); + + list_for_each_entry(rdev, ®ulator_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(®ulator_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, + ®ulator_syncevent_fops); + + return 0; +} + +late_initcall(regulator_init_debugfs); +#endif + late_initcall(regulator_init_complete); |