162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci//
362306a36Sopenharmony_ci// Freescale SSI ALSA SoC Digital Audio Interface (DAI) debugging functions
462306a36Sopenharmony_ci//
562306a36Sopenharmony_ci// Copyright 2014 Markus Pargmann <mpa@pengutronix.de>, Pengutronix
662306a36Sopenharmony_ci//
762306a36Sopenharmony_ci// Split from fsl_ssi.c
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/debugfs.h>
1062306a36Sopenharmony_ci#include <linux/device.h>
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "fsl_ssi.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_civoid fsl_ssi_dbg_isr(struct fsl_ssi_dbg *dbg, u32 sisr)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	if (sisr & SSI_SISR_RFRC)
1862306a36Sopenharmony_ci		dbg->stats.rfrc++;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	if (sisr & SSI_SISR_TFRC)
2162306a36Sopenharmony_ci		dbg->stats.tfrc++;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	if (sisr & SSI_SISR_CMDAU)
2462306a36Sopenharmony_ci		dbg->stats.cmdau++;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	if (sisr & SSI_SISR_CMDDU)
2762306a36Sopenharmony_ci		dbg->stats.cmddu++;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	if (sisr & SSI_SISR_RXT)
3062306a36Sopenharmony_ci		dbg->stats.rxt++;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	if (sisr & SSI_SISR_RDR1)
3362306a36Sopenharmony_ci		dbg->stats.rdr1++;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	if (sisr & SSI_SISR_RDR0)
3662306a36Sopenharmony_ci		dbg->stats.rdr0++;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	if (sisr & SSI_SISR_TDE1)
3962306a36Sopenharmony_ci		dbg->stats.tde1++;
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	if (sisr & SSI_SISR_TDE0)
4262306a36Sopenharmony_ci		dbg->stats.tde0++;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	if (sisr & SSI_SISR_ROE1)
4562306a36Sopenharmony_ci		dbg->stats.roe1++;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	if (sisr & SSI_SISR_ROE0)
4862306a36Sopenharmony_ci		dbg->stats.roe0++;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	if (sisr & SSI_SISR_TUE1)
5162306a36Sopenharmony_ci		dbg->stats.tue1++;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	if (sisr & SSI_SISR_TUE0)
5462306a36Sopenharmony_ci		dbg->stats.tue0++;
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	if (sisr & SSI_SISR_TFS)
5762306a36Sopenharmony_ci		dbg->stats.tfs++;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	if (sisr & SSI_SISR_RFS)
6062306a36Sopenharmony_ci		dbg->stats.rfs++;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	if (sisr & SSI_SISR_TLS)
6362306a36Sopenharmony_ci		dbg->stats.tls++;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	if (sisr & SSI_SISR_RLS)
6662306a36Sopenharmony_ci		dbg->stats.rls++;
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci	if (sisr & SSI_SISR_RFF1)
6962306a36Sopenharmony_ci		dbg->stats.rff1++;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	if (sisr & SSI_SISR_RFF0)
7262306a36Sopenharmony_ci		dbg->stats.rff0++;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	if (sisr & SSI_SISR_TFE1)
7562306a36Sopenharmony_ci		dbg->stats.tfe1++;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	if (sisr & SSI_SISR_TFE0)
7862306a36Sopenharmony_ci		dbg->stats.tfe0++;
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci/*
8262306a36Sopenharmony_ci * Show the statistics of a flag only if its interrupt is enabled
8362306a36Sopenharmony_ci *
8462306a36Sopenharmony_ci * Compilers will optimize it to a no-op if the interrupt is disabled
8562306a36Sopenharmony_ci */
8662306a36Sopenharmony_ci#define SIER_SHOW(flag, name) \
8762306a36Sopenharmony_ci	do { \
8862306a36Sopenharmony_ci		if (SSI_SIER_##flag) \
8962306a36Sopenharmony_ci			seq_printf(s, #name "=%u\n", ssi_dbg->stats.name); \
9062306a36Sopenharmony_ci	} while (0)
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/*
9462306a36Sopenharmony_ci * Display the statistics for the current SSI device
9562306a36Sopenharmony_ci *
9662306a36Sopenharmony_ci * To avoid confusion, only show those counts that are enabled
9762306a36Sopenharmony_ci */
9862306a36Sopenharmony_cistatic int fsl_ssi_stats_show(struct seq_file *s, void *unused)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	struct fsl_ssi_dbg *ssi_dbg = s->private;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	SIER_SHOW(RFRC_EN, rfrc);
10362306a36Sopenharmony_ci	SIER_SHOW(TFRC_EN, tfrc);
10462306a36Sopenharmony_ci	SIER_SHOW(CMDAU_EN, cmdau);
10562306a36Sopenharmony_ci	SIER_SHOW(CMDDU_EN, cmddu);
10662306a36Sopenharmony_ci	SIER_SHOW(RXT_EN, rxt);
10762306a36Sopenharmony_ci	SIER_SHOW(RDR1_EN, rdr1);
10862306a36Sopenharmony_ci	SIER_SHOW(RDR0_EN, rdr0);
10962306a36Sopenharmony_ci	SIER_SHOW(TDE1_EN, tde1);
11062306a36Sopenharmony_ci	SIER_SHOW(TDE0_EN, tde0);
11162306a36Sopenharmony_ci	SIER_SHOW(ROE1_EN, roe1);
11262306a36Sopenharmony_ci	SIER_SHOW(ROE0_EN, roe0);
11362306a36Sopenharmony_ci	SIER_SHOW(TUE1_EN, tue1);
11462306a36Sopenharmony_ci	SIER_SHOW(TUE0_EN, tue0);
11562306a36Sopenharmony_ci	SIER_SHOW(TFS_EN, tfs);
11662306a36Sopenharmony_ci	SIER_SHOW(RFS_EN, rfs);
11762306a36Sopenharmony_ci	SIER_SHOW(TLS_EN, tls);
11862306a36Sopenharmony_ci	SIER_SHOW(RLS_EN, rls);
11962306a36Sopenharmony_ci	SIER_SHOW(RFF1_EN, rff1);
12062306a36Sopenharmony_ci	SIER_SHOW(RFF0_EN, rff0);
12162306a36Sopenharmony_ci	SIER_SHOW(TFE1_EN, tfe1);
12262306a36Sopenharmony_ci	SIER_SHOW(TFE0_EN, tfe0);
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci	return 0;
12562306a36Sopenharmony_ci}
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(fsl_ssi_stats);
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_civoid fsl_ssi_debugfs_create(struct fsl_ssi_dbg *ssi_dbg, struct device *dev)
13062306a36Sopenharmony_ci{
13162306a36Sopenharmony_ci	ssi_dbg->dbg_dir = debugfs_create_dir(dev_name(dev), NULL);
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	debugfs_create_file("stats", 0444, ssi_dbg->dbg_dir, ssi_dbg,
13462306a36Sopenharmony_ci			    &fsl_ssi_stats_fops);
13562306a36Sopenharmony_ci}
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_civoid fsl_ssi_debugfs_remove(struct fsl_ssi_dbg *ssi_dbg)
13862306a36Sopenharmony_ci{
13962306a36Sopenharmony_ci	debugfs_remove_recursive(ssi_dbg->dbg_dir);
14062306a36Sopenharmony_ci}
141