seq_puts(s, "Unknown conversion\n");
 }
 
-static int bdisp_dbg_last_nodes(struct seq_file *s, void *data)
+static int last_nodes_show(struct seq_file *s, void *data)
 {
        /* Not dumping all fields, focusing on significant ones */
        struct bdisp_dev *bdisp = s->private;
        return 0;
 }
 
-static int bdisp_dbg_last_nodes_raw(struct seq_file *s, void *data)
+static int last_nodes_raw_show(struct seq_file *s, void *data)
 {
        struct bdisp_dev *bdisp = s->private;
        struct bdisp_node *node;
        }
 }
 
-static int bdisp_dbg_last_request(struct seq_file *s, void *data)
+static int last_request_show(struct seq_file *s, void *data)
 {
        struct bdisp_dev *bdisp = s->private;
        struct bdisp_request *request = &bdisp->dbg.copy_request;
 
 #define DUMP(reg) seq_printf(s, #reg " \t0x%08X\n", readl(bdisp->regs + reg))
 
-static int bdisp_dbg_regs(struct seq_file *s, void *data)
+static int regs_show(struct seq_file *s, void *data)
 {
        struct bdisp_dev *bdisp = s->private;
        int ret;
 
 #define SECOND 1000000
 
-static int bdisp_dbg_perf(struct seq_file *s, void *data)
+static int perf_show(struct seq_file *s, void *data)
 {
        struct bdisp_dev *bdisp = s->private;
        struct bdisp_request *request = &bdisp->dbg.copy_request;
        return 0;
 }
 
-#define bdisp_dbg_declare(name) \
-       static int bdisp_dbg_##name##_open(struct inode *i, struct file *f) \
-       { \
-               return single_open(f, bdisp_dbg_##name, i->i_private); \
-       } \
-       static const struct file_operations bdisp_dbg_##name##_fops = { \
-               .open           = bdisp_dbg_##name##_open, \
-               .read           = seq_read, \
-               .llseek         = seq_lseek, \
-               .release        = single_release, \
-       }
-
 #define bdisp_dbg_create_entry(name) \
        debugfs_create_file(#name, S_IRUGO, bdisp->dbg.debugfs_entry, bdisp, \
-                           &bdisp_dbg_##name##_fops)
+                           &name##_fops)
 
-bdisp_dbg_declare(regs);
-bdisp_dbg_declare(last_nodes);
-bdisp_dbg_declare(last_nodes_raw);
-bdisp_dbg_declare(last_request);
-bdisp_dbg_declare(perf);
+DEFINE_SHOW_ATTRIBUTE(regs);
+DEFINE_SHOW_ATTRIBUTE(last_nodes);
+DEFINE_SHOW_ATTRIBUTE(last_nodes_raw);
+DEFINE_SHOW_ATTRIBUTE(last_request);
+DEFINE_SHOW_ATTRIBUTE(perf);
 
 int bdisp_debugfs_create(struct bdisp_dev *bdisp)
 {
 
  * device debug info
  */
 
-static int hva_dbg_device(struct seq_file *s, void *data)
+static int device_show(struct seq_file *s, void *data)
 {
        struct hva_dev *hva = s->private;
 
        return 0;
 }
 
-static int hva_dbg_encoders(struct seq_file *s, void *data)
+static int encoders_show(struct seq_file *s, void *data)
 {
        struct hva_dev *hva = s->private;
        unsigned int i = 0;
        return 0;
 }
 
-static int hva_dbg_last(struct seq_file *s, void *data)
+static int last_show(struct seq_file *s, void *data)
 {
        struct hva_dev *hva = s->private;
        struct hva_ctx *last_ctx = &hva->dbg.last_ctx;
        return 0;
 }
 
-static int hva_dbg_regs(struct seq_file *s, void *data)
+static int regs_show(struct seq_file *s, void *data)
 {
        struct hva_dev *hva = s->private;
 
        return 0;
 }
 
-#define hva_dbg_declare(name)                                            \
-       static int hva_dbg_##name##_open(struct inode *i, struct file *f) \
-       {                                                                 \
-               return single_open(f, hva_dbg_##name, i->i_private);      \
-       }                                                                 \
-       static const struct file_operations hva_dbg_##name##_fops = {     \
-               .open           = hva_dbg_##name##_open,                  \
-               .read           = seq_read,                               \
-               .llseek         = seq_lseek,                              \
-               .release        = single_release,                         \
-       }
-
 #define hva_dbg_create_entry(name)                                      \
        debugfs_create_file(#name, 0444, hva->dbg.debugfs_entry, hva, \
-                           &hva_dbg_##name##_fops)
+                           &name##_fops)
 
-hva_dbg_declare(device);
-hva_dbg_declare(encoders);
-hva_dbg_declare(last);
-hva_dbg_declare(regs);
+DEFINE_SHOW_ATTRIBUTE(device);
+DEFINE_SHOW_ATTRIBUTE(encoders);
+DEFINE_SHOW_ATTRIBUTE(last);
+DEFINE_SHOW_ATTRIBUTE(regs);
 
 void hva_debugfs_create(struct hva_dev *hva)
 {
  * context (instance) debug info
  */
 
-static int hva_dbg_ctx(struct seq_file *s, void *data)
+static int ctx_show(struct seq_file *s, void *data)
 {
        struct hva_ctx *ctx = s->private;
 
        return 0;
 }
 
-hva_dbg_declare(ctx);
+DEFINE_SHOW_ATTRIBUTE(ctx);
 
 void hva_dbg_ctx_create(struct hva_ctx *ctx)
 {
 
        ctx->dbg.debugfs_entry = debugfs_create_file(name, 0444,
                                                     hva->dbg.debugfs_entry,
-                                                    ctx, &hva_dbg_ctx_fops);
+                                                    ctx, &ctx_fops);
 }
 
 void hva_dbg_ctx_remove(struct hva_ctx *ctx)