0001
0002
0003
0004
0005
0006
0007
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
0083
0084
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
0095
0096
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 }