diff options
author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-12-21 18:49:31 -0500 |
---|---|---|
committer | Liam Girdwood <lrg@slimlogic.co.uk> | 2011-01-12 09:33:05 -0500 |
commit | 1130e5b3ff4a7f3f54a48d46e9d0d81b47765bd8 (patch) | |
tree | 333918bbdd573be8efdc7004a6018f34bfd70a77 | |
parent | 21cf891a47ff5e7bd77fdc524a25072c447d56bb (diff) |
regulator: Add initial per-regulator debugfs support
We only expose the use and open counts to userspace, providing a tiny
bit of insight into what the API is up to.
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Signed-off-by: Liam Girdwood <lrg@slimlogic.co.uk>
-rw-r--r-- | drivers/regulator/core.c | 35 | ||||
-rw-r--r-- | include/linux/regulator/driver.h | 8 |
2 files changed, 41 insertions, 2 deletions
diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index 6066a8f2d5bb..9fa20957847d 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c | |||
@@ -17,6 +17,7 @@ | |||
17 | 17 | ||
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
20 | #include <linux/debugfs.h> | ||
20 | #include <linux/device.h> | 21 | #include <linux/device.h> |
21 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
22 | #include <linux/err.h> | 23 | #include <linux/err.h> |
@@ -47,6 +48,10 @@ static LIST_HEAD(regulator_map_list); | |||
47 | static bool has_full_constraints; | 48 | static bool has_full_constraints; |
48 | static bool board_wants_dummy_regulator; | 49 | static bool board_wants_dummy_regulator; |
49 | 50 | ||
51 | #ifdef CONFIG_DEBUG_FS | ||
52 | static struct dentry *debugfs_root; | ||
53 | #endif | ||
54 | |||
50 | /* | 55 | /* |
51 | * struct regulator_map | 56 | * struct regulator_map |
52 | * | 57 | * |
@@ -2404,6 +2409,23 @@ static int add_regulator_attributes(struct regulator_dev *rdev) | |||
2404 | return status; | 2409 | return status; |
2405 | } | 2410 | } |
2406 | 2411 | ||
2412 | static void rdev_init_debugfs(struct regulator_dev *rdev) | ||
2413 | { | ||
2414 | #ifdef CONFIG_DEBUG_FS | ||
2415 | rdev->debugfs = debugfs_create_dir(rdev_get_name(rdev), debugfs_root); | ||
2416 | if (IS_ERR(rdev->debugfs) || !rdev->debugfs) { | ||
2417 | rdev_warn(rdev, "Failed to create debugfs directory\n"); | ||
2418 | rdev->debugfs = NULL; | ||
2419 | return; | ||
2420 | } | ||
2421 | |||
2422 | debugfs_create_u32("use_count", 0444, rdev->debugfs, | ||
2423 | &rdev->use_count); | ||
2424 | debugfs_create_u32("open_count", 0444, rdev->debugfs, | ||
2425 | &rdev->open_count); | ||
2426 | #endif | ||
2427 | } | ||
2428 | |||
2407 | /** | 2429 | /** |
2408 | * regulator_register - register regulator | 2430 | * regulator_register - register regulator |
2409 | * @regulator_desc: regulator to register | 2431 | * @regulator_desc: regulator to register |
@@ -2548,6 +2570,8 @@ struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, | |||
2548 | } | 2570 | } |
2549 | 2571 | ||
2550 | list_add(&rdev->list, ®ulator_list); | 2572 | list_add(&rdev->list, ®ulator_list); |
2573 | |||
2574 | rdev_init_debugfs(rdev); | ||
2551 | out: | 2575 | out: |
2552 | mutex_unlock(®ulator_list_mutex); | 2576 | mutex_unlock(®ulator_list_mutex); |
2553 | return rdev; | 2577 | return rdev; |
@@ -2580,6 +2604,9 @@ void regulator_unregister(struct regulator_dev *rdev) | |||
2580 | return; | 2604 | return; |
2581 | 2605 | ||
2582 | mutex_lock(®ulator_list_mutex); | 2606 | mutex_lock(®ulator_list_mutex); |
2607 | #ifdef CONFIG_DEBUG_FS | ||
2608 | debugfs_remove_recursive(rdev->debugfs); | ||
2609 | #endif | ||
2583 | WARN_ON(rdev->open_count); | 2610 | WARN_ON(rdev->open_count); |
2584 | unset_regulator_supplies(rdev); | 2611 | unset_regulator_supplies(rdev); |
2585 | list_del(&rdev->list); | 2612 | list_del(&rdev->list); |
@@ -2723,6 +2750,14 @@ static int __init regulator_init(void) | |||
2723 | 2750 | ||
2724 | ret = class_register(®ulator_class); | 2751 | ret = class_register(®ulator_class); |
2725 | 2752 | ||
2753 | #ifdef CONFIG_DEBUG_FS | ||
2754 | debugfs_root = debugfs_create_dir("regulator", NULL); | ||
2755 | if (IS_ERR(debugfs_root) || !debugfs_root) { | ||
2756 | pr_warn("regulator: Failed to create debugfs directory\n"); | ||
2757 | debugfs_root = NULL; | ||
2758 | } | ||
2759 | #endif | ||
2760 | |||
2726 | regulator_dummy_init(); | 2761 | regulator_dummy_init(); |
2727 | 2762 | ||
2728 | return ret; | 2763 | return ret; |
diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h index 975ae06cb634..b8ed16a33c47 100644 --- a/include/linux/regulator/driver.h +++ b/include/linux/regulator/driver.h | |||
@@ -175,9 +175,9 @@ struct regulator_desc { | |||
175 | */ | 175 | */ |
176 | struct regulator_dev { | 176 | struct regulator_dev { |
177 | struct regulator_desc *desc; | 177 | struct regulator_desc *desc; |
178 | int use_count; | ||
179 | int open_count; | ||
180 | int exclusive; | 178 | int exclusive; |
179 | u32 use_count; | ||
180 | u32 open_count; | ||
181 | 181 | ||
182 | /* lists we belong to */ | 182 | /* lists we belong to */ |
183 | struct list_head list; /* list of all regulators */ | 183 | struct list_head list; /* list of all regulators */ |
@@ -195,6 +195,10 @@ struct regulator_dev { | |||
195 | struct regulator_dev *supply; /* for tree */ | 195 | struct regulator_dev *supply; /* for tree */ |
196 | 196 | ||
197 | void *reg_data; /* regulator_dev data */ | 197 | void *reg_data; /* regulator_dev data */ |
198 | |||
199 | #ifdef CONFIG_DEBUG_FS | ||
200 | struct dentry *debugfs; | ||
201 | #endif | ||
198 | }; | 202 | }; |
199 | 203 | ||
200 | struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, | 204 | struct regulator_dev *regulator_register(struct regulator_desc *regulator_desc, |