ASoC: rsnd: add debugfs support
Current rsnd supports #define DEBUG, but it is not helpful if issue happen after 4-5 hours. This patch adds debugfs support for it. Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> Message-Id: <87y2c0lwyn.wl-kuninori.morimoto.gx@renesas.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Родитель
1788a15201
Коммит
1f9c82b5ab
|
@ -1,3 +1,3 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
snd-soc-rcar-objs := core.o gen.o dma.o adg.o ssi.o ssiu.o src.o ctu.o mix.o dvc.o cmd.o
|
||||
snd-soc-rcar-objs := core.o gen.o dma.o adg.o ssi.o ssiu.o src.o ctu.o mix.o dvc.o cmd.o debugfs.o
|
||||
obj-$(CONFIG_SND_SOC_RCAR) += snd-soc-rcar.o
|
||||
|
|
|
@ -583,32 +583,49 @@ rsnd_adg_get_clkout_end:
|
|||
adg->rbgb = rbgb;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
static void rsnd_adg_clk_dbg_info(struct rsnd_priv *priv, struct rsnd_adg *adg)
|
||||
#if defined(DEBUG) || defined(CONFIG_DEBUG_FS)
|
||||
static void dbg_msg(struct device *dev, struct seq_file *m,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
char msg[128];
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
vsnprintf(msg, sizeof(msg), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
if (m)
|
||||
seq_puts(m, msg);
|
||||
else
|
||||
dev_dbg(dev, "%s", msg);
|
||||
}
|
||||
|
||||
void rsnd_adg_clk_dbg_info(struct rsnd_priv *priv, struct seq_file *m)
|
||||
{
|
||||
struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
struct clk *clk;
|
||||
int i;
|
||||
|
||||
for_each_rsnd_clk(clk, adg, i)
|
||||
dev_dbg(dev, "%s : %pa : %ld\n",
|
||||
dbg_msg(dev, m, "%s : %pa : %ld\n",
|
||||
clk_name[i], clk, clk_get_rate(clk));
|
||||
|
||||
dev_dbg(dev, "BRGCKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x\n",
|
||||
dbg_msg(dev, m, "BRGCKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x\n",
|
||||
adg->ckr, adg->rbga, adg->rbgb);
|
||||
dev_dbg(dev, "BRGA (for 44100 base) = %d\n", adg->rbga_rate_for_441khz);
|
||||
dev_dbg(dev, "BRGB (for 48000 base) = %d\n", adg->rbgb_rate_for_48khz);
|
||||
dbg_msg(dev, m, "BRGA (for 44100 base) = %d\n", adg->rbga_rate_for_441khz);
|
||||
dbg_msg(dev, m, "BRGB (for 48000 base) = %d\n", adg->rbgb_rate_for_48khz);
|
||||
|
||||
/*
|
||||
* Actual CLKOUT will be exchanged in rsnd_adg_ssi_clk_try_start()
|
||||
* by BRGCKR::BRGCKR_31
|
||||
*/
|
||||
for_each_rsnd_clkout(clk, adg, i)
|
||||
dev_dbg(dev, "clkout %d : %pa : %ld\n", i,
|
||||
dbg_msg(dev, m, "clkout %d : %pa : %ld\n", i,
|
||||
clk, clk_get_rate(clk));
|
||||
}
|
||||
#else
|
||||
#define rsnd_adg_clk_dbg_info(priv, adg)
|
||||
#define rsnd_adg_clk_dbg_info(priv, m)
|
||||
#endif
|
||||
|
||||
int rsnd_adg_probe(struct rsnd_priv *priv)
|
||||
|
@ -628,11 +645,11 @@ int rsnd_adg_probe(struct rsnd_priv *priv)
|
|||
|
||||
rsnd_adg_get_clkin(priv, adg);
|
||||
rsnd_adg_get_clkout(priv, adg);
|
||||
rsnd_adg_clk_dbg_info(priv, adg);
|
||||
|
||||
priv->adg = adg;
|
||||
|
||||
rsnd_adg_clk_enable(priv);
|
||||
rsnd_adg_clk_dbg_info(priv, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -114,12 +114,26 @@ static int rsnd_cmd_stop(struct rsnd_mod *mod,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void rsnd_cmd_debug_info(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SCU,
|
||||
0x180 + rsnd_mod_id_raw(mod) * 0x20, 0x30);
|
||||
}
|
||||
#define DEBUG_INFO .debug_info = rsnd_cmd_debug_info
|
||||
#else
|
||||
#define DEBUG_INFO
|
||||
#endif
|
||||
|
||||
static struct rsnd_mod_ops rsnd_cmd_ops = {
|
||||
.name = CMD_NAME,
|
||||
.init = rsnd_cmd_init,
|
||||
.start = rsnd_cmd_start,
|
||||
.stop = rsnd_cmd_stop,
|
||||
.get_status = rsnd_mod_get_status,
|
||||
DEBUG_INFO
|
||||
};
|
||||
|
||||
static struct rsnd_mod *rsnd_cmd_mod_get(struct rsnd_priv *priv, int id)
|
||||
|
|
|
@ -1717,6 +1717,7 @@ int rsnd_kctrl_new(struct rsnd_mod *mod,
|
|||
*/
|
||||
static const struct snd_soc_component_driver rsnd_soc_component = {
|
||||
.name = "rsnd",
|
||||
.probe = rsnd_debugfs_probe,
|
||||
.hw_params = rsnd_hw_params,
|
||||
.hw_free = rsnd_hw_free,
|
||||
.pointer = rsnd_pointer,
|
||||
|
|
|
@ -275,6 +275,19 @@ static int rsnd_ctu_id_sub(struct rsnd_mod *mod)
|
|||
return mod->id % 4;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void rsnd_ctu_debug_info(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SCU,
|
||||
0x500 + rsnd_mod_id_raw(mod) * 0x100, 0x100);
|
||||
}
|
||||
#define DEBUG_INFO .debug_info = rsnd_ctu_debug_info
|
||||
#else
|
||||
#define DEBUG_INFO
|
||||
#endif
|
||||
|
||||
static struct rsnd_mod_ops rsnd_ctu_ops = {
|
||||
.name = CTU_NAME,
|
||||
.probe = rsnd_ctu_probe_,
|
||||
|
@ -285,6 +298,7 @@ static struct rsnd_mod_ops rsnd_ctu_ops = {
|
|||
.id = rsnd_ctu_id,
|
||||
.id_sub = rsnd_ctu_id_sub,
|
||||
.id_cmd = rsnd_mod_id_raw,
|
||||
DEBUG_INFO
|
||||
};
|
||||
|
||||
struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id)
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
//
|
||||
// // Renesas R-Car debugfs support
|
||||
//
|
||||
// Copyright (c) 2021 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
|
||||
//
|
||||
// > mount -t debugfs none /sys/kernel/debug
|
||||
// > cd /sys/kernel/debug/asoc/rcar-sound/ec500000.sound/rdai{N}/
|
||||
// > cat playback/xxx
|
||||
// > cat capture/xxx
|
||||
//
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
||||
#include <linux/debugfs.h>
|
||||
#include "rsnd.h"
|
||||
|
||||
static int rsnd_debugfs_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct rsnd_dai_stream *io = m->private;
|
||||
struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
int i;
|
||||
|
||||
/* adg is out of mods */
|
||||
rsnd_adg_clk_dbg_info(priv, m);
|
||||
|
||||
for_each_rsnd_mod(i, mod, io) {
|
||||
u32 *status = mod->ops->get_status(mod, io, mod->type);
|
||||
|
||||
seq_printf(m, "name: %s\n", rsnd_mod_name(mod));
|
||||
seq_printf(m, "status: %08x\n", *status);
|
||||
|
||||
if (mod->ops->debug_info)
|
||||
mod->ops->debug_info(m, io, mod);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
DEFINE_SHOW_ATTRIBUTE(rsnd_debugfs);
|
||||
|
||||
void rsnd_debugfs_reg_show(struct seq_file *m, phys_addr_t _addr,
|
||||
void __iomem *base, int offset, int size)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < size; i += 0x10) {
|
||||
phys_addr_t addr = _addr + offset + i;
|
||||
|
||||
seq_printf(m, "%pa:", &addr);
|
||||
for (j = 0; j < 0x10; j += 0x4)
|
||||
seq_printf(m, " %08x", __raw_readl(base + offset + i + j));
|
||||
seq_puts(m, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
void rsnd_debugfs_mod_reg_show(struct seq_file *m, struct rsnd_mod *mod,
|
||||
int reg_id, int offset, int size)
|
||||
{
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
|
||||
rsnd_debugfs_reg_show(m,
|
||||
rsnd_gen_get_phy_addr(priv, reg_id),
|
||||
rsnd_gen_get_base_addr(priv, reg_id),
|
||||
offset, size);
|
||||
}
|
||||
|
||||
int rsnd_debugfs_probe(struct snd_soc_component *component)
|
||||
{
|
||||
struct rsnd_priv *priv = dev_get_drvdata(component->dev);
|
||||
struct rsnd_dai *rdai;
|
||||
struct dentry *dir;
|
||||
char name[64];
|
||||
int i;
|
||||
|
||||
/* Gen1 is not supported */
|
||||
if (rsnd_is_gen1(priv))
|
||||
return 0;
|
||||
|
||||
for_each_rsnd_dai(rdai, priv, i) {
|
||||
/*
|
||||
* created debugfs will be automatically
|
||||
* removed, nothing to do for _remove.
|
||||
* see
|
||||
* soc_cleanup_component_debugfs()
|
||||
*/
|
||||
snprintf(name, sizeof(name), "rdai%d", i);
|
||||
dir = debugfs_create_dir(name, component->debugfs_root);
|
||||
|
||||
debugfs_create_file("playback", 0444, dir, &rdai->playback, &rsnd_debugfs_fops);
|
||||
debugfs_create_file("capture", 0444, dir, &rdai->capture, &rsnd_debugfs_fops);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DEBUG_FS */
|
|
@ -44,7 +44,8 @@ struct rsnd_dma {
|
|||
};
|
||||
|
||||
struct rsnd_dma_ctrl {
|
||||
void __iomem *base;
|
||||
void __iomem *ppbase;
|
||||
phys_addr_t ppres;
|
||||
int dmaen_num;
|
||||
int dmapp_num;
|
||||
};
|
||||
|
@ -415,7 +416,7 @@ static u32 rsnd_dmapp_get_chcr(struct rsnd_dai_stream *io,
|
|||
}
|
||||
|
||||
#define rsnd_dmapp_addr(dmac, dma, reg) \
|
||||
(dmac->base + 0x20 + reg + \
|
||||
(dmac->ppbase + 0x20 + reg + \
|
||||
(0x10 * rsnd_dma_to_dmapp(dma)->dmapp_id))
|
||||
static void rsnd_dmapp_write(struct rsnd_dma *dma, u32 data, u32 reg)
|
||||
{
|
||||
|
@ -504,12 +505,31 @@ static int rsnd_dmapp_attach(struct rsnd_dai_stream *io,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void rsnd_dmapp_debug_info(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
|
||||
struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
|
||||
struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
|
||||
|
||||
rsnd_debugfs_reg_show(m, dmac->ppres, dmac->ppbase,
|
||||
0x20 + 0x10 * dmapp->dmapp_id, 0x10);
|
||||
}
|
||||
#define DEBUG_INFO .debug_info = rsnd_dmapp_debug_info
|
||||
#else
|
||||
#define DEBUG_INFO
|
||||
#endif
|
||||
|
||||
static struct rsnd_mod_ops rsnd_dmapp_ops = {
|
||||
.name = "audmac-pp",
|
||||
.start = rsnd_dmapp_start,
|
||||
.stop = rsnd_dmapp_stop,
|
||||
.quit = rsnd_dmapp_stop,
|
||||
.get_status = rsnd_mod_get_status,
|
||||
DEBUG_INFO
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -864,9 +884,10 @@ int rsnd_dma_probe(struct rsnd_priv *priv)
|
|||
}
|
||||
|
||||
dmac->dmapp_num = 0;
|
||||
dmac->base = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(dmac->base))
|
||||
return PTR_ERR(dmac->base);
|
||||
dmac->ppres = res->start;
|
||||
dmac->ppbase = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(dmac->ppbase))
|
||||
return PTR_ERR(dmac->ppbase);
|
||||
|
||||
priv->dma = dmac;
|
||||
|
||||
|
|
|
@ -285,6 +285,19 @@ static struct dma_chan *rsnd_dvc_dma_req(struct rsnd_dai_stream *io,
|
|||
mod, "tx");
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void rsnd_dvc_debug_info(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SCU,
|
||||
0xe00 + rsnd_mod_id(mod) * 0x100, 0x60);
|
||||
}
|
||||
#define DEBUG_INFO .debug_info = rsnd_dvc_debug_info
|
||||
#else
|
||||
#define DEBUG_INFO
|
||||
#endif
|
||||
|
||||
static struct rsnd_mod_ops rsnd_dvc_ops = {
|
||||
.name = DVC_NAME,
|
||||
.dma_req = rsnd_dvc_dma_req,
|
||||
|
@ -293,6 +306,7 @@ static struct rsnd_mod_ops rsnd_dvc_ops = {
|
|||
.quit = rsnd_dvc_quit,
|
||||
.pcm_new = rsnd_dvc_pcm_new,
|
||||
.get_status = rsnd_mod_get_status,
|
||||
DEBUG_INFO
|
||||
};
|
||||
|
||||
struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id)
|
||||
|
|
|
@ -141,6 +141,15 @@ phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id)
|
|||
return gen->res[reg_id];
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void __iomem *rsnd_gen_get_base_addr(struct rsnd_priv *priv, int reg_id)
|
||||
{
|
||||
struct rsnd_gen *gen = rsnd_priv_to_gen(priv);
|
||||
|
||||
return gen->base[reg_id];
|
||||
}
|
||||
#endif
|
||||
|
||||
#define rsnd_gen_regmap_init(priv, id_size, reg_id, name, conf) \
|
||||
_rsnd_gen_regmap_init(priv, id_size, reg_id, name, conf, ARRAY_SIZE(conf))
|
||||
static int _rsnd_gen_regmap_init(struct rsnd_priv *priv,
|
||||
|
|
|
@ -250,6 +250,19 @@ static int rsnd_mix_pcm_new(struct rsnd_mod *mod,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void rsnd_mix_debug_info(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SCU,
|
||||
0xd00 + rsnd_mod_id(mod) * 0x40, 0x30);
|
||||
}
|
||||
#define DEBUG_INFO .debug_info = rsnd_mix_debug_info
|
||||
#else
|
||||
#define DEBUG_INFO
|
||||
#endif
|
||||
|
||||
static struct rsnd_mod_ops rsnd_mix_ops = {
|
||||
.name = MIX_NAME,
|
||||
.probe = rsnd_mix_probe_,
|
||||
|
@ -257,6 +270,7 @@ static struct rsnd_mod_ops rsnd_mix_ops = {
|
|||
.quit = rsnd_mix_quit,
|
||||
.pcm_new = rsnd_mix_pcm_new,
|
||||
.get_status = rsnd_mod_get_status,
|
||||
DEBUG_INFO
|
||||
};
|
||||
|
||||
struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id)
|
||||
|
|
|
@ -345,6 +345,11 @@ struct rsnd_mod_ops {
|
|||
int (*id)(struct rsnd_mod *mod);
|
||||
int (*id_sub)(struct rsnd_mod *mod);
|
||||
int (*id_cmd)(struct rsnd_mod *mod);
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void (*debug_info)(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io, struct rsnd_mod *mod);
|
||||
#endif
|
||||
};
|
||||
|
||||
struct rsnd_dai_stream;
|
||||
|
@ -592,6 +597,9 @@ void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
|
|||
struct rsnd_mod *mod,
|
||||
enum rsnd_reg reg);
|
||||
phys_addr_t rsnd_gen_get_phy_addr(struct rsnd_priv *priv, int reg_id);
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void __iomem *rsnd_gen_get_base_addr(struct rsnd_priv *priv, int reg_id);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* R-Car ADG
|
||||
|
@ -610,6 +618,7 @@ int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *cmd_mod,
|
|||
#define rsnd_adg_clk_enable(priv) rsnd_adg_clk_control(priv, 1)
|
||||
#define rsnd_adg_clk_disable(priv) rsnd_adg_clk_control(priv, 0)
|
||||
void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable);
|
||||
void rsnd_adg_clk_dbg_info(struct rsnd_priv *priv, struct seq_file *m);
|
||||
|
||||
/*
|
||||
* R-Car sound priv
|
||||
|
@ -897,3 +906,14 @@ void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type);
|
|||
dev_dbg(dev, param)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
int rsnd_debugfs_probe(struct snd_soc_component *component);
|
||||
void rsnd_debugfs_reg_show(struct seq_file *m, phys_addr_t _addr,
|
||||
void __iomem *base, int offset, int size);
|
||||
void rsnd_debugfs_mod_reg_show(struct seq_file *m, struct rsnd_mod *mod,
|
||||
int reg_id, int offset, int size);
|
||||
|
||||
#else
|
||||
#define rsnd_debugfs_probe NULL
|
||||
#endif
|
||||
|
|
|
@ -597,6 +597,25 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void rsnd_src_debug_info(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SCU,
|
||||
rsnd_mod_id(mod) * 0x20, 0x20);
|
||||
seq_puts(m, "\n");
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SCU,
|
||||
0x1c0, 0x20);
|
||||
seq_puts(m, "\n");
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SCU,
|
||||
0x200 + rsnd_mod_id(mod) * 0x40, 0x40);
|
||||
}
|
||||
#define DEBUG_INFO .debug_info = rsnd_src_debug_info
|
||||
#else
|
||||
#define DEBUG_INFO
|
||||
#endif
|
||||
|
||||
static struct rsnd_mod_ops rsnd_src_ops = {
|
||||
.name = SRC_NAME,
|
||||
.dma_req = rsnd_src_dma_req,
|
||||
|
@ -608,6 +627,7 @@ static struct rsnd_mod_ops rsnd_src_ops = {
|
|||
.irq = rsnd_src_irq,
|
||||
.pcm_new = rsnd_src_pcm_new,
|
||||
.get_status = rsnd_mod_get_status,
|
||||
DEBUG_INFO
|
||||
};
|
||||
|
||||
struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
|
||||
|
|
|
@ -1118,6 +1118,34 @@ static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_dai_stream *io,
|
|||
mod, name);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void rsnd_ssi_debug_info(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
|
||||
struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
|
||||
|
||||
seq_printf(m, "clock: %s\n", rsnd_rdai_is_clk_master(rdai) ?
|
||||
"provider" : "consumer");
|
||||
seq_printf(m, "bit_clk_inv: %d\n", rdai->bit_clk_inv);
|
||||
seq_printf(m, "frm_clk_inv: %d\n", rdai->frm_clk_inv);
|
||||
seq_printf(m, "pin share: %d\n", __rsnd_ssi_is_pin_sharing(mod));
|
||||
seq_printf(m, "can out clk: %d\n", rsnd_ssi_can_output_clk(mod));
|
||||
seq_printf(m, "multi secondary: %d\n", rsnd_ssi_is_multi_secondary(mod, io));
|
||||
seq_printf(m, "tdm: %d, %d\n", rsnd_runtime_is_tdm(io),
|
||||
rsnd_runtime_is_tdm_split(io));
|
||||
seq_printf(m, "chan: %d\n", ssi->chan);
|
||||
seq_printf(m, "user: %d\n", ssi->usrcnt);
|
||||
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SSI,
|
||||
rsnd_mod_id(mod) * 0x40, 0x40);
|
||||
}
|
||||
#define DEBUG_INFO .debug_info = rsnd_ssi_debug_info
|
||||
#else
|
||||
#define DEBUG_INFO
|
||||
#endif
|
||||
|
||||
static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
|
||||
.name = SSI_NAME,
|
||||
.dma_req = rsnd_ssi_dma_req,
|
||||
|
@ -1132,6 +1160,7 @@ static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
|
|||
.fallback = rsnd_ssi_fallback,
|
||||
.hw_params = rsnd_ssi_hw_params,
|
||||
.get_status = rsnd_ssi_get_status,
|
||||
DEBUG_INFO
|
||||
};
|
||||
|
||||
int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod)
|
||||
|
|
|
@ -314,6 +314,19 @@ static struct dma_chan *rsnd_ssiu_dma_req(struct rsnd_dai_stream *io,
|
|||
mod, name);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
static void rsnd_ssiu_debug_info(struct seq_file *m,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
rsnd_debugfs_mod_reg_show(m, mod, RSND_GEN2_SSIU,
|
||||
rsnd_mod_id(mod) * 0x80, 0x80);
|
||||
}
|
||||
#define DEBUG_INFO .debug_info = rsnd_ssiu_debug_info
|
||||
#else
|
||||
#define DEBUG_INFO
|
||||
#endif
|
||||
|
||||
static struct rsnd_mod_ops rsnd_ssiu_ops_gen2 = {
|
||||
.name = SSIU_NAME,
|
||||
.dma_req = rsnd_ssiu_dma_req,
|
||||
|
@ -321,6 +334,7 @@ static struct rsnd_mod_ops rsnd_ssiu_ops_gen2 = {
|
|||
.start = rsnd_ssiu_start_gen2,
|
||||
.stop = rsnd_ssiu_stop_gen2,
|
||||
.get_status = rsnd_ssiu_get_status,
|
||||
DEBUG_INFO
|
||||
};
|
||||
|
||||
static struct rsnd_mod *rsnd_ssiu_mod_get(struct rsnd_priv *priv, int id)
|
||||
|
|
Загрузка…
Ссылка в новой задаче