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