err = -EINVAL;
 
+       qoriq_ptp->dev = &dev->dev;
        qoriq_ptp->caps = ptp_qoriq_caps;
 
        if (of_property_read_u32(node, "fsl,cksel", &qoriq_ptp->cksel))
        }
        qoriq_ptp->phc_index = ptp_clock_index(qoriq_ptp->clock);
 
+       ptp_qoriq_create_debugfs(qoriq_ptp);
        platform_set_drvdata(dev, qoriq_ptp);
 
        return 0;
        qoriq_write(®s->ctrl_regs->tmr_temask, 0);
        qoriq_write(®s->ctrl_regs->tmr_ctrl,   0);
 
+       ptp_qoriq_remove_debugfs(qoriq_ptp);
        ptp_clock_unregister(qoriq_ptp->clock);
        iounmap(qoriq_ptp->base);
        release_resource(qoriq_ptp->rsrc);
 
--- /dev/null
+// SPDX-License-Identifier: GPL-2.0+
+/* Copyright 2019 NXP
+ */
+#include <linux/device.h>
+#include <linux/debugfs.h>
+#include <linux/fsl/ptp_qoriq.h>
+
+static int ptp_qoriq_fiper1_lpbk_get(void *data, u64 *val)
+{
+       struct qoriq_ptp *qoriq_ptp = data;
+       struct qoriq_ptp_registers *regs = &qoriq_ptp->regs;
+       u32 ctrl;
+
+       ctrl = qoriq_read(®s->ctrl_regs->tmr_ctrl);
+       *val = ctrl & PP1L ? 1 : 0;
+
+       return 0;
+}
+
+static int ptp_qoriq_fiper1_lpbk_set(void *data, u64 val)
+{
+       struct qoriq_ptp *qoriq_ptp = data;
+       struct qoriq_ptp_registers *regs = &qoriq_ptp->regs;
+       u32 ctrl;
+
+       ctrl = qoriq_read(®s->ctrl_regs->tmr_ctrl);
+       if (val == 0)
+               ctrl &= ~PP1L;
+       else
+               ctrl |= PP1L;
+
+       qoriq_write(®s->ctrl_regs->tmr_ctrl, ctrl);
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(ptp_qoriq_fiper1_fops, ptp_qoriq_fiper1_lpbk_get,
+                       ptp_qoriq_fiper1_lpbk_set, "%llu\n");
+
+static int ptp_qoriq_fiper2_lpbk_get(void *data, u64 *val)
+{
+       struct qoriq_ptp *qoriq_ptp = data;
+       struct qoriq_ptp_registers *regs = &qoriq_ptp->regs;
+       u32 ctrl;
+
+       ctrl = qoriq_read(®s->ctrl_regs->tmr_ctrl);
+       *val = ctrl & PP2L ? 1 : 0;
+
+       return 0;
+}
+
+static int ptp_qoriq_fiper2_lpbk_set(void *data, u64 val)
+{
+       struct qoriq_ptp *qoriq_ptp = data;
+       struct qoriq_ptp_registers *regs = &qoriq_ptp->regs;
+       u32 ctrl;
+
+       ctrl = qoriq_read(®s->ctrl_regs->tmr_ctrl);
+       if (val == 0)
+               ctrl &= ~PP2L;
+       else
+               ctrl |= PP2L;
+
+       qoriq_write(®s->ctrl_regs->tmr_ctrl, ctrl);
+       return 0;
+}
+
+DEFINE_SIMPLE_ATTRIBUTE(ptp_qoriq_fiper2_fops, ptp_qoriq_fiper2_lpbk_get,
+                       ptp_qoriq_fiper2_lpbk_set, "%llu\n");
+
+void ptp_qoriq_create_debugfs(struct qoriq_ptp *qoriq_ptp)
+{
+       struct dentry *root;
+
+       root = debugfs_create_dir(dev_name(qoriq_ptp->dev), NULL);
+       if (IS_ERR(root))
+               return;
+       if (!root)
+               goto err_root;
+
+       qoriq_ptp->debugfs_root = root;
+
+       if (!debugfs_create_file("fiper1-loopback", 0600, root, qoriq_ptp,
+                                &ptp_qoriq_fiper1_fops))
+               goto err_node;
+       if (!debugfs_create_file("fiper2-loopback", 0600, root, qoriq_ptp,
+                                &ptp_qoriq_fiper2_fops))
+               goto err_node;
+       return;
+
+err_node:
+       debugfs_remove_recursive(root);
+       qoriq_ptp->debugfs_root = NULL;
+err_root:
+       dev_err(qoriq_ptp->dev, "failed to initialize debugfs\n");
+}
+
+void ptp_qoriq_remove_debugfs(struct qoriq_ptp *qoriq_ptp)
+{
+       debugfs_remove_recursive(qoriq_ptp->debugfs_root);
+       qoriq_ptp->debugfs_root = NULL;
+}