Commit 19df7510 authored by Yangbo Lu's avatar Yangbo Lu Committed by David S. Miller
Browse files

ptp: add debugfs support for ptp_qoriq



This patch is to add debugfs support for ptp_qoriq. Current debugfs
supports to control fiper1/fiper2 loopback mode. If the loopback mode
is enabled, the fiper1/fiper2 pulse is looped back into trigger1/
trigger2 input. This is very useful for validating hardware and driver
without external hardware. Below is an example to enable fiper1 loopback.

echo 1 > /sys/kernel/debug/2d10e00.ptp_clock/fiper1-loopback

Signed-off-by: default avatarYangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 47205e29
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -53,7 +53,7 @@ config PTP_1588_CLOCK_QORIQ
	  packets using the SO_TIMESTAMPING API.

	  To compile this driver as a module, choose M here: the module
	  will be called ptp_qoriq.
	  will be called ptp-qoriq.

config PTP_1588_CLOCK_IXP46X
	tristate "Intel IXP46x as PTP clock"
+3 −1
Original line number Diff line number Diff line
@@ -9,4 +9,6 @@ obj-$(CONFIG_PTP_1588_CLOCK_DTE) += ptp_dte.o
obj-$(CONFIG_PTP_1588_CLOCK_IXP46X)	+= ptp_ixp46x.o
obj-$(CONFIG_PTP_1588_CLOCK_PCH)	+= ptp_pch.o
obj-$(CONFIG_PTP_1588_CLOCK_KVM)	+= ptp_kvm.o
obj-$(CONFIG_PTP_1588_CLOCK_QORIQ)	+= ptp_qoriq.o
obj-$(CONFIG_PTP_1588_CLOCK_QORIQ)	+= ptp-qoriq.o
ptp-qoriq-y				+= ptp_qoriq.o
ptp-qoriq-$(CONFIG_DEBUG_FS)		+= ptp_qoriq_debugfs.o
+3 −0
Original line number Diff line number Diff line
@@ -471,6 +471,7 @@ static int qoriq_ptp_probe(struct platform_device *dev)

	err = -EINVAL;

	qoriq_ptp->dev = &dev->dev;
	qoriq_ptp->caps = ptp_qoriq_caps;

	if (of_property_read_u32(node, "fsl,cksel", &qoriq_ptp->cksel))
@@ -572,6 +573,7 @@ static int qoriq_ptp_probe(struct platform_device *dev)
	}
	qoriq_ptp->phc_index = ptp_clock_index(qoriq_ptp->clock);

	ptp_qoriq_create_debugfs(qoriq_ptp);
	platform_set_drvdata(dev, qoriq_ptp);

	return 0;
@@ -597,6 +599,7 @@ static int qoriq_ptp_remove(struct platform_device *dev)
	qoriq_write(&regs->ctrl_regs->tmr_temask, 0);
	qoriq_write(&regs->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);
+101 −0
Original line number Diff line number Diff line
// 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(&regs->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(&regs->ctrl_regs->tmr_ctrl);
	if (val == 0)
		ctrl &= ~PP1L;
	else
		ctrl |= PP1L;

	qoriq_write(&regs->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(&regs->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(&regs->ctrl_regs->tmr_ctrl);
	if (val == 0)
		ctrl &= ~PP2L;
	else
		ctrl |= PP2L;

	qoriq_write(&regs->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;
}
+12 −0
Original line number Diff line number Diff line
@@ -143,6 +143,8 @@ struct qoriq_ptp {
	struct ptp_clock *clock;
	struct ptp_clock_info caps;
	struct resource *rsrc;
	struct dentry *debugfs_root;
	struct device *dev;
	bool extts_fifo_support;
	int irq;
	int phc_index;
@@ -169,4 +171,14 @@ static inline void qoriq_write(unsigned __iomem *addr, u32 val)
	iowrite32be(val, addr);
}

#ifdef CONFIG_DEBUG_FS
void ptp_qoriq_create_debugfs(struct qoriq_ptp *qoriq_ptp);
void ptp_qoriq_remove_debugfs(struct qoriq_ptp *qoriq_ptp);
#else
static inline void ptp_qoriq_create_debugfs(struct qoriq_ptp *qoriq_ptp)
{ }
static inline void ptp_qoriq_remove_debugfs(struct qoriq_ptp *qoriq_ptp)
{ }
#endif

#endif