Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/soc/renesas/rcar/debugfs.c
26444 views
1
// SPDX-License-Identifier: GPL-2.0
2
//
3
// // Renesas R-Car debugfs support
4
//
5
// Copyright (c) 2021 Kuninori Morimoto <[email protected]>
6
//
7
// > mount -t debugfs none /sys/kernel/debug
8
// > cd /sys/kernel/debug/asoc/rcar-sound/ec500000.sound/rdai{N}/
9
// > cat playback/xxx
10
// > cat capture/xxx
11
//
12
#ifdef CONFIG_DEBUG_FS
13
14
#include <linux/debugfs.h>
15
#include "rsnd.h"
16
17
static int rsnd_debugfs_show(struct seq_file *m, void *v)
18
{
19
struct rsnd_dai_stream *io = m->private;
20
struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
21
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
22
int i;
23
24
/* adg is out of mods */
25
rsnd_adg_clk_dbg_info(priv, m);
26
27
for_each_rsnd_mod(i, mod, io) {
28
u32 *status = mod->ops->get_status(mod, io, mod->type);
29
30
seq_printf(m, "name: %s\n", rsnd_mod_name(mod));
31
seq_printf(m, "status: %08x\n", *status);
32
33
if (mod->ops->debug_info)
34
mod->ops->debug_info(m, io, mod);
35
}
36
37
return 0;
38
}
39
DEFINE_SHOW_ATTRIBUTE(rsnd_debugfs);
40
41
void rsnd_debugfs_reg_show(struct seq_file *m, phys_addr_t _addr,
42
void __iomem *base, int offset, int size)
43
{
44
int i, j;
45
46
for (i = 0; i < size; i += 0x10) {
47
phys_addr_t addr = _addr + offset + i;
48
49
seq_printf(m, "%pa:", &addr);
50
for (j = 0; j < 0x10; j += 0x4)
51
seq_printf(m, " %08x", __raw_readl(base + offset + i + j));
52
seq_puts(m, "\n");
53
}
54
}
55
56
void rsnd_debugfs_mod_reg_show(struct seq_file *m, struct rsnd_mod *mod,
57
int reg_id, int offset, int size)
58
{
59
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
60
61
rsnd_debugfs_reg_show(m,
62
rsnd_gen_get_phy_addr(priv, reg_id),
63
rsnd_gen_get_base_addr(priv, reg_id),
64
offset, size);
65
}
66
67
int rsnd_debugfs_probe(struct snd_soc_component *component)
68
{
69
struct rsnd_priv *priv = dev_get_drvdata(component->dev);
70
struct rsnd_dai *rdai;
71
struct dentry *dir;
72
char name[64];
73
int i;
74
75
/* Gen1 is not supported */
76
if (rsnd_is_gen1(priv))
77
return 0;
78
79
for_each_rsnd_dai(rdai, priv, i) {
80
/*
81
* created debugfs will be automatically
82
* removed, nothing to do for _remove.
83
* see
84
* soc_cleanup_component_debugfs()
85
*/
86
snprintf(name, sizeof(name), "rdai%d", i);
87
dir = debugfs_create_dir(name, component->debugfs_root);
88
89
debugfs_create_file("playback", 0444, dir, &rdai->playback, &rsnd_debugfs_fops);
90
debugfs_create_file("capture", 0444, dir, &rdai->capture, &rsnd_debugfs_fops);
91
}
92
93
return 0;
94
}
95
96
#endif /* CONFIG_DEBUG_FS */
97
98