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