ASoC: rsnd: indicate IRQ error status for debug
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tue, 13 Feb 2018 02:08:53 +0000 (02:08 +0000)
committerMark Brown <broonie@kernel.org>
Tue, 13 Feb 2018 11:58:22 +0000 (11:58 +0000)
SSI/SRC have under/over flow error handling, and its status is useful
for debuging. But sometimes it might be too much message,
and it might blocks necessity other information.

To avoid such situation, basically this patch indicates interrupt
status debug message if DEBUG was defined, but it will be suppressed
if RSND_DEBUG_NO_IRQ_STATUS was defined.

Reported-by: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Tested-by: Hiroyuki Yokoyama <hiroyuki.yokoyama.vx@renesas.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sh/rcar/rsnd.h
sound/soc/sh/rcar/src.c
sound/soc/sh/rcar/ssi.c

index ad6523595b0acdd0f3c3a7932b5ae535e9eb4cab..5241ea7cf153578f9c4c3e086b7986215f209496 100644 (file)
@@ -788,4 +788,14 @@ void rsnd_mod_make_sure(struct rsnd_mod *mod, enum rsnd_mod_type type);
 #define rsnd_mod_confirm_dvc(mdvc)
 #endif
 
+/*
+ * If you don't need interrupt status debug message,
+ * define RSND_DEBUG_NO_IRQ_STATUS as 1 on top of src.c/ssi.c
+ *
+ * #define RSND_DEBUG_NO_IRQ_STATUS 1
+ */
+#define rsnd_dbg_irq_status(dev, param...)             \
+       if (!IS_BUILTIN(RSND_DEBUG_NO_IRQ_STATUS))      \
+               dev_dbg(dev, param)
+
 #endif
index 510b68a483b4056ec9e211d651b3638e1dac9c84..a727e71587b6e305ff89011b1bce8dc2f5789bc8 100644 (file)
@@ -8,6 +8,15 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+
+/*
+ * you can enable below define if you don't need
+ * SSI interrupt status debug message when debugging
+ * see rsnd_dbg_irq_status()
+ *
+ * #define RSND_DEBUG_NO_IRQ_STATUS 1
+ */
+
 #include "rsnd.h"
 
 #define SRC_NAME "src"
@@ -325,7 +334,10 @@ static void rsnd_src_status_clear(struct rsnd_mod *mod)
 
 static bool rsnd_src_error_occurred(struct rsnd_mod *mod)
 {
+       struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+       struct device *dev = rsnd_priv_to_dev(priv);
        u32 val0, val1;
+       u32 status0, status1;
        bool ret = false;
 
        val0 = val1 = OUF_SRC(rsnd_mod_id(mod));
@@ -338,9 +350,15 @@ static bool rsnd_src_error_occurred(struct rsnd_mod *mod)
        if (rsnd_src_sync_is_enabled(mod))
                val0 = val0 & 0xffff;
 
-       if ((rsnd_mod_read(mod, SCU_SYS_STATUS0) & val0) ||
-           (rsnd_mod_read(mod, SCU_SYS_STATUS1) & val1))
+       status0 = rsnd_mod_read(mod, SCU_SYS_STATUS0);
+       status1 = rsnd_mod_read(mod, SCU_SYS_STATUS1);
+       if ((status0 & val0) || (status1 & val1)) {
+               rsnd_dbg_irq_status(dev, "%s[%d] err status : 0x%08x, 0x%08x\n",
+                       rsnd_mod_name(mod), rsnd_mod_id(mod),
+                       status0, status1);
+
                ret = true;
+       }
 
        return ret;
 }
index 97a9db892a8f06461be29eacceae01e8c40f8da9..333b802681ad7be5818754588bbc5011925e4391 100644 (file)
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+
+/*
+ * you can enable below define if you don't need
+ * SSI interrupt status debug message when debugging
+ * see rsnd_dbg_irq_status()
+ *
+ * #define RSND_DEBUG_NO_IRQ_STATUS 1
+ */
+
 #include <sound/simple_card_utils.h>
 #include <linux/delay.h>
 #include "rsnd.h"
@@ -603,6 +612,7 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
                                 struct rsnd_dai_stream *io)
 {
        struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+       struct device *dev = rsnd_priv_to_dev(priv);
        int is_dma = rsnd_ssi_is_dma_mode(mod);
        u32 status;
        bool elapsed = false;
@@ -621,8 +631,12 @@ static void __rsnd_ssi_interrupt(struct rsnd_mod *mod,
                elapsed = rsnd_ssi_pio_interrupt(mod, io);
 
        /* DMA only */
-       if (is_dma && (status & (UIRQ | OIRQ)))
+       if (is_dma && (status & (UIRQ | OIRQ))) {
+               rsnd_dbg_irq_status(dev, "%s[%d] err status : 0x%08x\n",
+                       rsnd_mod_name(mod), rsnd_mod_id(mod), status);
+
                stop = true;
+       }
 
        rsnd_ssi_status_clear(mod);
 rsnd_ssi_interrupt_out: