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: Yangbo Lu <yangbo.lu@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
47205e2985
commit
19df7510d5
@ -53,7 +53,7 @@ config PTP_1588_CLOCK_QORIQ
|
|||||||
packets using the SO_TIMESTAMPING API.
|
packets using the SO_TIMESTAMPING API.
|
||||||
|
|
||||||
To compile this driver as a module, choose M here: the module
|
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
|
config PTP_1588_CLOCK_IXP46X
|
||||||
tristate "Intel IXP46x as PTP clock"
|
tristate "Intel IXP46x as PTP clock"
|
||||||
|
@ -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_IXP46X) += ptp_ixp46x.o
|
||||||
obj-$(CONFIG_PTP_1588_CLOCK_PCH) += ptp_pch.o
|
obj-$(CONFIG_PTP_1588_CLOCK_PCH) += ptp_pch.o
|
||||||
obj-$(CONFIG_PTP_1588_CLOCK_KVM) += ptp_kvm.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
|
||||||
|
@ -471,6 +471,7 @@ static int qoriq_ptp_probe(struct platform_device *dev)
|
|||||||
|
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
|
|
||||||
|
qoriq_ptp->dev = &dev->dev;
|
||||||
qoriq_ptp->caps = ptp_qoriq_caps;
|
qoriq_ptp->caps = ptp_qoriq_caps;
|
||||||
|
|
||||||
if (of_property_read_u32(node, "fsl,cksel", &qoriq_ptp->cksel))
|
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);
|
qoriq_ptp->phc_index = ptp_clock_index(qoriq_ptp->clock);
|
||||||
|
|
||||||
|
ptp_qoriq_create_debugfs(qoriq_ptp);
|
||||||
platform_set_drvdata(dev, qoriq_ptp);
|
platform_set_drvdata(dev, qoriq_ptp);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -597,6 +599,7 @@ static int qoriq_ptp_remove(struct platform_device *dev)
|
|||||||
qoriq_write(®s->ctrl_regs->tmr_temask, 0);
|
qoriq_write(®s->ctrl_regs->tmr_temask, 0);
|
||||||
qoriq_write(®s->ctrl_regs->tmr_ctrl, 0);
|
qoriq_write(®s->ctrl_regs->tmr_ctrl, 0);
|
||||||
|
|
||||||
|
ptp_qoriq_remove_debugfs(qoriq_ptp);
|
||||||
ptp_clock_unregister(qoriq_ptp->clock);
|
ptp_clock_unregister(qoriq_ptp->clock);
|
||||||
iounmap(qoriq_ptp->base);
|
iounmap(qoriq_ptp->base);
|
||||||
release_resource(qoriq_ptp->rsrc);
|
release_resource(qoriq_ptp->rsrc);
|
||||||
|
101
drivers/ptp/ptp_qoriq_debugfs.c
Normal file
101
drivers/ptp/ptp_qoriq_debugfs.c
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
// 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;
|
||||||
|
}
|
@ -143,6 +143,8 @@ struct qoriq_ptp {
|
|||||||
struct ptp_clock *clock;
|
struct ptp_clock *clock;
|
||||||
struct ptp_clock_info caps;
|
struct ptp_clock_info caps;
|
||||||
struct resource *rsrc;
|
struct resource *rsrc;
|
||||||
|
struct dentry *debugfs_root;
|
||||||
|
struct device *dev;
|
||||||
bool extts_fifo_support;
|
bool extts_fifo_support;
|
||||||
int irq;
|
int irq;
|
||||||
int phc_index;
|
int phc_index;
|
||||||
@ -169,4 +171,14 @@ static inline void qoriq_write(unsigned __iomem *addr, u32 val)
|
|||||||
iowrite32be(val, addr);
|
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
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user