/* DSP architecture specific callbacks for oops and stack dumps */
 struct dsp_arch_ops {
-       void (*dsp_oops)(struct snd_sof_dev *sdev, void *oops);
-       void (*dsp_stack)(struct snd_sof_dev *sdev, void *oops,
+       void (*dsp_oops)(struct snd_sof_dev *sdev, const char *level, void *oops);
+       void (*dsp_stack)(struct snd_sof_dev *sdev, const char *level, void *oops,
                          u32 *stack, u32 stack_words);
 };
 
 /*
  * DSP Architectures.
  */
-static inline void sof_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
-                            u32 stack_words)
+static inline void sof_stack(struct snd_sof_dev *sdev, const char *level,
+                            void *oops, u32 *stack, u32 stack_words)
 {
-               sof_dsp_arch_ops(sdev)->dsp_stack(sdev, oops, stack, stack_words);
+               sof_dsp_arch_ops(sdev)->dsp_stack(sdev, level,  oops, stack,
+                                                 stack_words);
 }
 
-static inline void sof_oops(struct snd_sof_dev *sdev, void *oops)
+static inline void sof_oops(struct snd_sof_dev *sdev, const char *level, void *oops)
 {
        if (sof_dsp_arch_ops(sdev)->dsp_oops)
-               sof_dsp_arch_ops(sdev)->dsp_oops(sdev, oops);
+               sof_dsp_arch_ops(sdev)->dsp_oops(sdev, level, oops);
 }
 
 extern const struct dsp_arch_ops sof_xtensa_arch_ops;
 
 };
 
 /* only need xtensa atm */
-static void xtensa_dsp_oops(struct snd_sof_dev *sdev, void *oops)
+static void xtensa_dsp_oops(struct snd_sof_dev *sdev, const char *level, void *oops)
 {
        struct sof_ipc_dsp_oops_xtensa *xoops = oops;
        int i;
 
-       dev_err(sdev->dev, "error: DSP Firmware Oops\n");
+       dev_printk(level, sdev->dev, "error: DSP Firmware Oops\n");
        for (i = 0; i < ARRAY_SIZE(xtensa_exception_causes); i++) {
                if (xtensa_exception_causes[i].id == xoops->exccause) {
-                       dev_err(sdev->dev, "error: Exception Cause: %s, %s\n",
-                               xtensa_exception_causes[i].msg,
-                               xtensa_exception_causes[i].description);
+                       dev_printk(level, sdev->dev,
+                                  "error: Exception Cause: %s, %s\n",
+                                  xtensa_exception_causes[i].msg,
+                                  xtensa_exception_causes[i].description);
                }
        }
-       dev_err(sdev->dev, "EXCCAUSE 0x%8.8x EXCVADDR 0x%8.8x PS       0x%8.8x SAR     0x%8.8x\n",
-               xoops->exccause, xoops->excvaddr, xoops->ps, xoops->sar);
-       dev_err(sdev->dev, "EPC1     0x%8.8x EPC2     0x%8.8x EPC3     0x%8.8x EPC4    0x%8.8x",
-               xoops->epc1, xoops->epc2, xoops->epc3, xoops->epc4);
-       dev_err(sdev->dev, "EPC5     0x%8.8x EPC6     0x%8.8x EPC7     0x%8.8x DEPC    0x%8.8x",
-               xoops->epc5, xoops->epc6, xoops->epc7, xoops->depc);
-       dev_err(sdev->dev, "EPS2     0x%8.8x EPS3     0x%8.8x EPS4     0x%8.8x EPS5    0x%8.8x",
-               xoops->eps2, xoops->eps3, xoops->eps4, xoops->eps5);
-       dev_err(sdev->dev, "EPS6     0x%8.8x EPS7     0x%8.8x INTENABL 0x%8.8x INTERRU 0x%8.8x",
-               xoops->eps6, xoops->eps7, xoops->intenable, xoops->interrupt);
+       dev_printk(level, sdev->dev,
+                  "EXCCAUSE 0x%8.8x EXCVADDR 0x%8.8x PS       0x%8.8x SAR     0x%8.8x\n",
+                  xoops->exccause, xoops->excvaddr, xoops->ps, xoops->sar);
+       dev_printk(level, sdev->dev,
+                  "EPC1     0x%8.8x EPC2     0x%8.8x EPC3     0x%8.8x EPC4    0x%8.8x",
+                  xoops->epc1, xoops->epc2, xoops->epc3, xoops->epc4);
+       dev_printk(level, sdev->dev,
+                  "EPC5     0x%8.8x EPC6     0x%8.8x EPC7     0x%8.8x DEPC    0x%8.8x",
+                  xoops->epc5, xoops->epc6, xoops->epc7, xoops->depc);
+       dev_printk(level, sdev->dev,
+                  "EPS2     0x%8.8x EPS3     0x%8.8x EPS4     0x%8.8x EPS5    0x%8.8x",
+                  xoops->eps2, xoops->eps3, xoops->eps4, xoops->eps5);
+       dev_printk(level, sdev->dev,
+                  "EPS6     0x%8.8x EPS7     0x%8.8x INTENABL 0x%8.8x INTERRU 0x%8.8x",
+                  xoops->eps6, xoops->eps7, xoops->intenable, xoops->interrupt);
 }
 
-static void xtensa_stack(struct snd_sof_dev *sdev, void *oops, u32 *stack,
-                        u32 stack_words)
+static void xtensa_stack(struct snd_sof_dev *sdev, const char *level, void *oops,
+                        u32 *stack, u32 stack_words)
 {
        struct sof_ipc_dsp_oops_xtensa *xoops = oops;
        u32 stack_ptr = xoops->plat_hdr.stackptr;
        unsigned char buf[4 * 8 + 3 + 1];
        int i;
 
-       dev_err(sdev->dev, "stack dump from 0x%8.8x\n", stack_ptr);
+       dev_printk(level, sdev->dev, "stack dump from 0x%8.8x\n", stack_ptr);
 
        /*
         * example output:
        for (i = 0; i < stack_words; i += 4) {
                hex_dump_to_buffer(stack + i, 16, 16, 4,
                                   buf, sizeof(buf), false);
-               dev_err(sdev->dev, "0x%08x: %s\n", stack_ptr + i * 4, buf);
+               dev_printk(level, sdev->dev, "0x%08x: %s\n", stack_ptr + i * 4, buf);
        }
 }