Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 //
0003 // Freescale SSI ALSA SoC Digital Audio Interface (DAI) debugging functions
0004 //
0005 // Copyright 2014 Markus Pargmann <mpa@pengutronix.de>, Pengutronix
0006 //
0007 // Split from fsl_ssi.c
0008 
0009 #include <linux/debugfs.h>
0010 #include <linux/device.h>
0011 #include <linux/kernel.h>
0012 
0013 #include "fsl_ssi.h"
0014 
0015 void fsl_ssi_dbg_isr(struct fsl_ssi_dbg *dbg, u32 sisr)
0016 {
0017     if (sisr & SSI_SISR_RFRC)
0018         dbg->stats.rfrc++;
0019 
0020     if (sisr & SSI_SISR_TFRC)
0021         dbg->stats.tfrc++;
0022 
0023     if (sisr & SSI_SISR_CMDAU)
0024         dbg->stats.cmdau++;
0025 
0026     if (sisr & SSI_SISR_CMDDU)
0027         dbg->stats.cmddu++;
0028 
0029     if (sisr & SSI_SISR_RXT)
0030         dbg->stats.rxt++;
0031 
0032     if (sisr & SSI_SISR_RDR1)
0033         dbg->stats.rdr1++;
0034 
0035     if (sisr & SSI_SISR_RDR0)
0036         dbg->stats.rdr0++;
0037 
0038     if (sisr & SSI_SISR_TDE1)
0039         dbg->stats.tde1++;
0040 
0041     if (sisr & SSI_SISR_TDE0)
0042         dbg->stats.tde0++;
0043 
0044     if (sisr & SSI_SISR_ROE1)
0045         dbg->stats.roe1++;
0046 
0047     if (sisr & SSI_SISR_ROE0)
0048         dbg->stats.roe0++;
0049 
0050     if (sisr & SSI_SISR_TUE1)
0051         dbg->stats.tue1++;
0052 
0053     if (sisr & SSI_SISR_TUE0)
0054         dbg->stats.tue0++;
0055 
0056     if (sisr & SSI_SISR_TFS)
0057         dbg->stats.tfs++;
0058 
0059     if (sisr & SSI_SISR_RFS)
0060         dbg->stats.rfs++;
0061 
0062     if (sisr & SSI_SISR_TLS)
0063         dbg->stats.tls++;
0064 
0065     if (sisr & SSI_SISR_RLS)
0066         dbg->stats.rls++;
0067 
0068     if (sisr & SSI_SISR_RFF1)
0069         dbg->stats.rff1++;
0070 
0071     if (sisr & SSI_SISR_RFF0)
0072         dbg->stats.rff0++;
0073 
0074     if (sisr & SSI_SISR_TFE1)
0075         dbg->stats.tfe1++;
0076 
0077     if (sisr & SSI_SISR_TFE0)
0078         dbg->stats.tfe0++;
0079 }
0080 
0081 /*
0082  * Show the statistics of a flag only if its interrupt is enabled
0083  *
0084  * Compilers will optimize it to a no-op if the interrupt is disabled
0085  */
0086 #define SIER_SHOW(flag, name) \
0087     do { \
0088         if (SSI_SIER_##flag) \
0089             seq_printf(s, #name "=%u\n", ssi_dbg->stats.name); \
0090     } while (0)
0091 
0092 
0093 /*
0094  * Display the statistics for the current SSI device
0095  *
0096  * To avoid confusion, only show those counts that are enabled
0097  */
0098 static int fsl_ssi_stats_show(struct seq_file *s, void *unused)
0099 {
0100     struct fsl_ssi_dbg *ssi_dbg = s->private;
0101 
0102     SIER_SHOW(RFRC_EN, rfrc);
0103     SIER_SHOW(TFRC_EN, tfrc);
0104     SIER_SHOW(CMDAU_EN, cmdau);
0105     SIER_SHOW(CMDDU_EN, cmddu);
0106     SIER_SHOW(RXT_EN, rxt);
0107     SIER_SHOW(RDR1_EN, rdr1);
0108     SIER_SHOW(RDR0_EN, rdr0);
0109     SIER_SHOW(TDE1_EN, tde1);
0110     SIER_SHOW(TDE0_EN, tde0);
0111     SIER_SHOW(ROE1_EN, roe1);
0112     SIER_SHOW(ROE0_EN, roe0);
0113     SIER_SHOW(TUE1_EN, tue1);
0114     SIER_SHOW(TUE0_EN, tue0);
0115     SIER_SHOW(TFS_EN, tfs);
0116     SIER_SHOW(RFS_EN, rfs);
0117     SIER_SHOW(TLS_EN, tls);
0118     SIER_SHOW(RLS_EN, rls);
0119     SIER_SHOW(RFF1_EN, rff1);
0120     SIER_SHOW(RFF0_EN, rff0);
0121     SIER_SHOW(TFE1_EN, tfe1);
0122     SIER_SHOW(TFE0_EN, tfe0);
0123 
0124     return 0;
0125 }
0126 
0127 DEFINE_SHOW_ATTRIBUTE(fsl_ssi_stats);
0128 
0129 void fsl_ssi_debugfs_create(struct fsl_ssi_dbg *ssi_dbg, struct device *dev)
0130 {
0131     ssi_dbg->dbg_dir = debugfs_create_dir(dev_name(dev), NULL);
0132 
0133     debugfs_create_file("stats", 0444, ssi_dbg->dbg_dir, ssi_dbg,
0134                 &fsl_ssi_stats_fops);
0135 }
0136 
0137 void fsl_ssi_debugfs_remove(struct fsl_ssi_dbg *ssi_dbg)
0138 {
0139     debugfs_remove_recursive(ssi_dbg->dbg_dir);
0140 }