#ifdef CONFIG_COMPAT
 #include <linux/compat.h>
 #endif
+#include <linux/debugfs.h>
+#include <linux/seq_file.h>
 
 #include "pi433_if.h"
 #include "rf69.h"
        .llseek =       no_llseek,
 };
 
+static int pi433_debugfs_regs_show(struct seq_file *m, void *p)
+{
+       struct pi433_device *dev;
+       u8 reg_data[114];
+       int i;
+       char *fmt = "0x%02x, 0x%02x\n";
+       int ret;
+
+       dev = m->private;
+
+       mutex_lock(&dev->tx_fifo_lock);
+       mutex_lock(&dev->rx_lock);
+
+       // wait for on-going operations to finish
+       ret = wait_event_interruptible(dev->rx_wait_queue, !dev->tx_active);
+       if (ret)
+               goto out_unlock;
+
+       ret = wait_event_interruptible(dev->tx_wait_queue, !dev->rx_active);
+       if (ret)
+               goto out_unlock;
+
+       // skip FIFO register (0x0) otherwise this can affect some of uC ops
+       for (i = 1; i < 0x50; i++)
+               reg_data[i] = rf69_read_reg(dev->spi, i);
+
+       reg_data[REG_TESTLNA] = rf69_read_reg(dev->spi, REG_TESTLNA);
+       reg_data[REG_TESTPA1] = rf69_read_reg(dev->spi, REG_TESTPA1);
+       reg_data[REG_TESTPA2] = rf69_read_reg(dev->spi, REG_TESTPA2);
+       reg_data[REG_TESTDAGC] = rf69_read_reg(dev->spi, REG_TESTDAGC);
+       reg_data[REG_TESTAFC] = rf69_read_reg(dev->spi, REG_TESTAFC);
+
+       seq_puts(m, "# reg, val\n");
+
+       for (i = 1; i < 0x50; i++)
+               seq_printf(m, fmt, i, reg_data[i]);
+
+       seq_printf(m, fmt, REG_TESTLNA, reg_data[REG_TESTLNA]);
+       seq_printf(m, fmt, REG_TESTPA1, reg_data[REG_TESTPA1]);
+       seq_printf(m, fmt, REG_TESTPA2, reg_data[REG_TESTPA2]);
+       seq_printf(m, fmt, REG_TESTDAGC, reg_data[REG_TESTDAGC]);
+       seq_printf(m, fmt, REG_TESTAFC, reg_data[REG_TESTAFC]);
+
+out_unlock:
+       mutex_unlock(&dev->rx_lock);
+       mutex_unlock(&dev->tx_fifo_lock);
+
+       return ret;
+}
+
+static int pi433_debugfs_regs_open(struct inode *inode, struct file *filp)
+{
+       return single_open(filp, pi433_debugfs_regs_show, inode->i_private);
+}
+
+static const struct file_operations debugfs_fops = {
+       .llseek =       seq_lseek,
+       .open =         pi433_debugfs_regs_open,
+       .owner =        THIS_MODULE,
+       .read =         seq_read,
+       .release =      single_release
+};
+
 /*-------------------------------------------------------------------------*/
 
 static int pi433_probe(struct spi_device *spi)
 {
        struct pi433_device     *device;
        int                     retval;
+       struct dentry           *entry;
 
        /* setup spi parameters */
        spi->mode = 0x00;
        /* spi setup */
        spi_set_drvdata(spi, device);
 
+       entry = debugfs_create_dir(dev_name(device->dev),
+                                  debugfs_lookup(KBUILD_MODNAME, NULL));
+       debugfs_create_file("regs", 0400, entry, device, &debugfs_fops);
+
        return 0;
 
 del_cdev:
 static int pi433_remove(struct spi_device *spi)
 {
        struct pi433_device     *device = spi_get_drvdata(spi);
+       struct dentry *mod_entry = debugfs_lookup(KBUILD_MODNAME, NULL);
+
+       debugfs_remove(debugfs_lookup(dev_name(device->dev), mod_entry));
 
        /* free GPIOs */
        free_gpio(device);
                return PTR_ERR(pi433_class);
        }
 
+       debugfs_create_dir(KBUILD_MODNAME, NULL);
+
        status = spi_register_driver(&pi433_spi_driver);
        if (status < 0) {
                class_destroy(pi433_class);
        spi_unregister_driver(&pi433_spi_driver);
        class_destroy(pi433_class);
        unregister_chrdev(MAJOR(pi433_dev), pi433_spi_driver.driver.name);
+       debugfs_remove_recursive(debugfs_lookup(KBUILD_MODNAME, NULL));
 }
 module_exit(pi433_exit);