1 // SPDX-License-Identifier: GPL-2.0+
2 /* Copyright 2019 NXP
3  */
4 #include <linux/device.h>
5 #include <linux/debugfs.h>
6 #include <linux/fsl/ptp_qoriq.h>
7 
ptp_qoriq_fiper1_lpbk_get(void * data,u64 * val)8 static int ptp_qoriq_fiper1_lpbk_get(void *data, u64 *val)
9 {
10 	struct ptp_qoriq *ptp_qoriq = data;
11 	struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
12 	u32 ctrl;
13 
14 	ctrl = ptp_qoriq->read(&regs->ctrl_regs->tmr_ctrl);
15 	*val = ctrl & PP1L ? 1 : 0;
16 
17 	return 0;
18 }
19 
ptp_qoriq_fiper1_lpbk_set(void * data,u64 val)20 static int ptp_qoriq_fiper1_lpbk_set(void *data, u64 val)
21 {
22 	struct ptp_qoriq *ptp_qoriq = data;
23 	struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
24 	u32 ctrl;
25 
26 	ctrl = ptp_qoriq->read(&regs->ctrl_regs->tmr_ctrl);
27 	if (val == 0)
28 		ctrl &= ~PP1L;
29 	else
30 		ctrl |= PP1L;
31 
32 	ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl, ctrl);
33 	return 0;
34 }
35 
36 DEFINE_DEBUGFS_ATTRIBUTE(ptp_qoriq_fiper1_fops, ptp_qoriq_fiper1_lpbk_get,
37 			 ptp_qoriq_fiper1_lpbk_set, "%llu\n");
38 
ptp_qoriq_fiper2_lpbk_get(void * data,u64 * val)39 static int ptp_qoriq_fiper2_lpbk_get(void *data, u64 *val)
40 {
41 	struct ptp_qoriq *ptp_qoriq = data;
42 	struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
43 	u32 ctrl;
44 
45 	ctrl = ptp_qoriq->read(&regs->ctrl_regs->tmr_ctrl);
46 	*val = ctrl & PP2L ? 1 : 0;
47 
48 	return 0;
49 }
50 
ptp_qoriq_fiper2_lpbk_set(void * data,u64 val)51 static int ptp_qoriq_fiper2_lpbk_set(void *data, u64 val)
52 {
53 	struct ptp_qoriq *ptp_qoriq = data;
54 	struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
55 	u32 ctrl;
56 
57 	ctrl = ptp_qoriq->read(&regs->ctrl_regs->tmr_ctrl);
58 	if (val == 0)
59 		ctrl &= ~PP2L;
60 	else
61 		ctrl |= PP2L;
62 
63 	ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl, ctrl);
64 	return 0;
65 }
66 
67 DEFINE_DEBUGFS_ATTRIBUTE(ptp_qoriq_fiper2_fops, ptp_qoriq_fiper2_lpbk_get,
68 			 ptp_qoriq_fiper2_lpbk_set, "%llu\n");
69 
ptp_qoriq_create_debugfs(struct ptp_qoriq * ptp_qoriq)70 void ptp_qoriq_create_debugfs(struct ptp_qoriq *ptp_qoriq)
71 {
72 	struct dentry *root;
73 
74 	root = debugfs_create_dir(dev_name(ptp_qoriq->dev), NULL);
75 	if (IS_ERR(root))
76 		return;
77 	if (!root)
78 		goto err_root;
79 
80 	ptp_qoriq->debugfs_root = root;
81 
82 	if (!debugfs_create_file_unsafe("fiper1-loopback", 0600, root,
83 					ptp_qoriq, &ptp_qoriq_fiper1_fops))
84 		goto err_node;
85 	if (!debugfs_create_file_unsafe("fiper2-loopback", 0600, root,
86 					ptp_qoriq, &ptp_qoriq_fiper2_fops))
87 		goto err_node;
88 	return;
89 
90 err_node:
91 	debugfs_remove_recursive(root);
92 	ptp_qoriq->debugfs_root = NULL;
93 err_root:
94 	dev_err(ptp_qoriq->dev, "failed to initialize debugfs\n");
95 }
96 
ptp_qoriq_remove_debugfs(struct ptp_qoriq * ptp_qoriq)97 void ptp_qoriq_remove_debugfs(struct ptp_qoriq *ptp_qoriq)
98 {
99 	debugfs_remove_recursive(ptp_qoriq->debugfs_root);
100 	ptp_qoriq->debugfs_root = NULL;
101 }
102