edac: create top-level debugfs directory
Rob Herring [Tue, 12 Jun 2012 02:32:12 +0000 (21:32 -0500)]
Create a single, top-level "edac" directory for debugfs. An "mc[0-N]"
directory is then created for each memory controller. Individual drivers
can create additional entries such as h/w error injection control.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

drivers/edac/edac_mc_sysfs.c
drivers/edac/edac_module.c
drivers/edac/edac_module.h

index 55b2f0a..a2bf7e9 100644 (file)
@@ -899,13 +899,33 @@ static struct device_type mci_attr_type = {
 };
 
 #ifdef CONFIG_EDAC_DEBUG
+static struct dentry *edac_debugfs;
+
+int __init edac_debugfs_init(void)
+{
+       edac_debugfs = debugfs_create_dir("edac", NULL);
+       if (IS_ERR(edac_debugfs)) {
+               edac_debugfs = NULL;
+               return -ENOMEM;
+       }
+       return 0;
+}
+
+void __exit edac_debugfs_exit(void)
+{
+       debugfs_remove(edac_debugfs);
+}
+
 int edac_create_debug_nodes(struct mem_ctl_info *mci)
 {
        struct dentry *d, *parent;
        char name[80];
        int i;
 
-       d = debugfs_create_dir(mci->dev.kobj.name, mci->debugfs);
+       if (!edac_debugfs)
+               return -ENODEV;
+
+       d = debugfs_create_dir(mci->dev.kobj.name, edac_debugfs);
        if (!d)
                return -ENOMEM;
        parent = d;
@@ -930,6 +950,7 @@ int edac_create_debug_nodes(struct mem_ctl_info *mci)
        if (!d)
                goto nomem;
 
+       mci->debugfs = parent;
        return 0;
 nomem:
        debugfs_remove(mci->debugfs);
index 3454798..58a28d8 100644 (file)
@@ -94,6 +94,8 @@ static int __init edac_init(void)
        if (err)
                goto error;
 
+       edac_debugfs_init();
+
        /* Setup/Initialize the workq for this core */
        err = edac_workqueue_setup();
        if (err) {
@@ -118,6 +120,7 @@ static void __exit edac_exit(void)
        /* tear down the various subsystems */
        edac_workqueue_teardown();
        edac_mc_sysfs_exit();
+       edac_debugfs_exit();
 }
 
 /*
index 62de640..3d139c6 100644 (file)
@@ -57,6 +57,20 @@ extern void edac_mc_reset_delay_period(int value);
 extern void *edac_align_ptr(void **p, unsigned size, int n_elems);
 
 /*
+ * EDAC debugfs functions
+ */
+#ifdef CONFIG_EDAC_DEBUG
+int edac_debugfs_init(void);
+void edac_debugfs_exit(void);
+#else
+static inline int edac_debugfs_init(void)
+{
+       return -ENODEV;
+}
+static inline void edac_debugfs_exit(void) {}
+#endif
+
+/*
  * EDAC PCI functions
  */
 #ifdef CONFIG_PCI