1 // SPDX-License-Identifier: GPL-2.0-only 2 3 #include "edac_module.h" 4 5 static struct dentry *edac_debugfs; 6 7 void __init edac_debugfs_init(void) 8 { 9 edac_debugfs = debugfs_create_dir("edac", NULL); 10 } 11 12 void edac_debugfs_exit(void) 13 { 14 debugfs_remove_recursive(edac_debugfs); 15 } 16 17 void edac_create_debugfs_nodes(struct mem_ctl_info *mci) 18 { 19 mci->debugfs = debugfs_create_dir(mci->dev.kobj.name, edac_debugfs); 20 } 21 22 /* Create a toplevel dir under EDAC's debugfs hierarchy */ 23 struct dentry *edac_debugfs_create_dir(const char *dirname) 24 { 25 if (!edac_debugfs) 26 return NULL; 27 28 return debugfs_create_dir(dirname, edac_debugfs); 29 } 30 EXPORT_SYMBOL_GPL(edac_debugfs_create_dir); 31 32 /* Create a toplevel dir under EDAC's debugfs hierarchy with parent @parent */ 33 struct dentry * 34 edac_debugfs_create_dir_at(const char *dirname, struct dentry *parent) 35 { 36 return debugfs_create_dir(dirname, parent); 37 } 38 EXPORT_SYMBOL_GPL(edac_debugfs_create_dir_at); 39 40 /* 41 * Create a file under EDAC's hierarchy or a sub-hierarchy: 42 * 43 * @name: file name 44 * @mode: file permissions 45 * @parent: parent dentry. If NULL, it becomes the toplevel EDAC dir 46 * @data: private data of caller 47 * @fops: file operations of this file 48 */ 49 struct dentry * 50 edac_debugfs_create_file(const char *name, umode_t mode, struct dentry *parent, 51 void *data, const struct file_operations *fops) 52 { 53 if (!parent) 54 parent = edac_debugfs; 55 56 return debugfs_create_file(name, mode, parent, data, fops); 57 } 58 EXPORT_SYMBOL_GPL(edac_debugfs_create_file); 59 60 /* Wrapper for debugfs_create_x8() */ 61 void edac_debugfs_create_x8(const char *name, umode_t mode, 62 struct dentry *parent, u8 *value) 63 { 64 if (!parent) 65 parent = edac_debugfs; 66 67 debugfs_create_x8(name, mode, parent, value); 68 } 69 EXPORT_SYMBOL_GPL(edac_debugfs_create_x8); 70 71 /* Wrapper for debugfs_create_x16() */ 72 void edac_debugfs_create_x16(const char *name, umode_t mode, 73 struct dentry *parent, u16 *value) 74 { 75 if (!parent) 76 parent = edac_debugfs; 77 78 debugfs_create_x16(name, mode, parent, value); 79 } 80 EXPORT_SYMBOL_GPL(edac_debugfs_create_x16); 81 82 /* Wrapper for debugfs_create_x32() */ 83 void edac_debugfs_create_x32(const char *name, umode_t mode, 84 struct dentry *parent, u32 *value) 85 { 86 if (!parent) 87 parent = edac_debugfs; 88 89 debugfs_create_x32(name, mode, parent, value); 90 } 91 EXPORT_SYMBOL_GPL(edac_debugfs_create_x32); 92