Merge remote-tracking branch 'regmap/topic/core' into regmap-next
This commit is contained in:
commit
bee54e310e
@ -15,10 +15,19 @@
|
|||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/list.h>
|
||||||
|
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
|
||||||
|
struct regmap_debugfs_node {
|
||||||
|
struct regmap *map;
|
||||||
|
const char *name;
|
||||||
|
struct list_head link;
|
||||||
|
};
|
||||||
|
|
||||||
static struct dentry *regmap_debugfs_root;
|
static struct dentry *regmap_debugfs_root;
|
||||||
|
static LIST_HEAD(regmap_debugfs_early_list);
|
||||||
|
static DEFINE_MUTEX(regmap_debugfs_early_lock);
|
||||||
|
|
||||||
/* Calculate the length of a fixed format */
|
/* Calculate the length of a fixed format */
|
||||||
static size_t regmap_calc_reg_len(int max_val, char *buf, size_t buf_size)
|
static size_t regmap_calc_reg_len(int max_val, char *buf, size_t buf_size)
|
||||||
@ -465,6 +474,20 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
|
|||||||
struct rb_node *next;
|
struct rb_node *next;
|
||||||
struct regmap_range_node *range_node;
|
struct regmap_range_node *range_node;
|
||||||
|
|
||||||
|
/* If we don't have the debugfs root yet, postpone init */
|
||||||
|
if (!regmap_debugfs_root) {
|
||||||
|
struct regmap_debugfs_node *node;
|
||||||
|
node = kzalloc(sizeof(*node), GFP_KERNEL);
|
||||||
|
if (!node)
|
||||||
|
return;
|
||||||
|
node->map = map;
|
||||||
|
node->name = name;
|
||||||
|
mutex_lock(®map_debugfs_early_lock);
|
||||||
|
list_add(&node->link, ®map_debugfs_early_list);
|
||||||
|
mutex_unlock(®map_debugfs_early_lock);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
INIT_LIST_HEAD(&map->debugfs_off_cache);
|
INIT_LIST_HEAD(&map->debugfs_off_cache);
|
||||||
mutex_init(&map->cache_lock);
|
mutex_init(&map->cache_lock);
|
||||||
|
|
||||||
@ -519,18 +542,42 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
|
|||||||
|
|
||||||
void regmap_debugfs_exit(struct regmap *map)
|
void regmap_debugfs_exit(struct regmap *map)
|
||||||
{
|
{
|
||||||
debugfs_remove_recursive(map->debugfs);
|
if (map->debugfs) {
|
||||||
mutex_lock(&map->cache_lock);
|
debugfs_remove_recursive(map->debugfs);
|
||||||
regmap_debugfs_free_dump_cache(map);
|
mutex_lock(&map->cache_lock);
|
||||||
mutex_unlock(&map->cache_lock);
|
regmap_debugfs_free_dump_cache(map);
|
||||||
kfree(map->debugfs_name);
|
mutex_unlock(&map->cache_lock);
|
||||||
|
kfree(map->debugfs_name);
|
||||||
|
} else {
|
||||||
|
struct regmap_debugfs_node *node, *tmp;
|
||||||
|
|
||||||
|
mutex_lock(®map_debugfs_early_lock);
|
||||||
|
list_for_each_entry_safe(node, tmp, ®map_debugfs_early_list,
|
||||||
|
link) {
|
||||||
|
if (node->map == map) {
|
||||||
|
list_del(&node->link);
|
||||||
|
kfree(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mutex_unlock(®map_debugfs_early_lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void regmap_debugfs_initcall(void)
|
void regmap_debugfs_initcall(void)
|
||||||
{
|
{
|
||||||
|
struct regmap_debugfs_node *node, *tmp;
|
||||||
|
|
||||||
regmap_debugfs_root = debugfs_create_dir("regmap", NULL);
|
regmap_debugfs_root = debugfs_create_dir("regmap", NULL);
|
||||||
if (!regmap_debugfs_root) {
|
if (!regmap_debugfs_root) {
|
||||||
pr_warn("regmap: Failed to create debugfs root\n");
|
pr_warn("regmap: Failed to create debugfs root\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_lock(®map_debugfs_early_lock);
|
||||||
|
list_for_each_entry_safe(node, tmp, ®map_debugfs_early_list, link) {
|
||||||
|
regmap_debugfs_init(node->map, node->name);
|
||||||
|
list_del(&node->link);
|
||||||
|
kfree(node);
|
||||||
|
}
|
||||||
|
mutex_unlock(®map_debugfs_early_lock);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user