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 | |
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(®s->ctrl_regs->tmr_ctrl); |
15 | *val = ctrl & PP1L ? 1 : 0; |
16 | |
17 | return 0; |
18 | } |
19 | |
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(®s->ctrl_regs->tmr_ctrl); |
27 | if (val == 0) |
28 | ctrl &= ~PP1L; |
29 | else |
30 | ctrl |= PP1L; |
31 | |
32 | ptp_qoriq->write(®s->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 | |
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(®s->ctrl_regs->tmr_ctrl); |
46 | *val = ctrl & PP2L ? 1 : 0; |
47 | |
48 | return 0; |
49 | } |
50 | |
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(®s->ctrl_regs->tmr_ctrl); |
58 | if (val == 0) |
59 | ctrl &= ~PP2L; |
60 | else |
61 | ctrl |= PP2L; |
62 | |
63 | ptp_qoriq->write(®s->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 | |
70 | void ptp_qoriq_create_debugfs(struct ptp_qoriq *ptp_qoriq) |
71 | { |
72 | struct dentry *root; |
73 | |
74 | root = debugfs_create_dir(name: dev_name(dev: ptp_qoriq->dev), NULL); |
75 | if (IS_ERR(ptr: root)) |
76 | return; |
77 | if (!root) |
78 | goto err_root; |
79 | |
80 | ptp_qoriq->debugfs_root = root; |
81 | |
82 | if (!debugfs_create_file_unsafe(name: "fiper1-loopback" , mode: 0600, parent: root, |
83 | data: ptp_qoriq, fops: &ptp_qoriq_fiper1_fops)) |
84 | goto err_node; |
85 | if (!debugfs_create_file_unsafe(name: "fiper2-loopback" , mode: 0600, parent: root, |
86 | data: ptp_qoriq, fops: &ptp_qoriq_fiper2_fops)) |
87 | goto err_node; |
88 | return; |
89 | |
90 | err_node: |
91 | debugfs_remove_recursive(dentry: root); |
92 | ptp_qoriq->debugfs_root = NULL; |
93 | err_root: |
94 | dev_err(ptp_qoriq->dev, "failed to initialize debugfs\n" ); |
95 | } |
96 | |
97 | void ptp_qoriq_remove_debugfs(struct ptp_qoriq *ptp_qoriq) |
98 | { |
99 | debugfs_remove_recursive(dentry: ptp_qoriq->debugfs_root); |
100 | ptp_qoriq->debugfs_root = NULL; |
101 | } |
102 | |