* @imx: for imx platform
  * @shared_root_clock: flag of sharing a clock source with others;
  *                     so the driver shouldn't set root clock rate
+ * @interrupts: interrupt number
+ * @tx_burst: tx maxburst size
+ * @rx_burst: rx maxburst size
+ * @tx_formats: tx supported data format
  */
 struct fsl_spdif_soc_data {
        bool imx;
        bool shared_root_clock;
+       u32 interrupts;
+       u32 tx_burst;
+       u32 rx_burst;
+       u64 tx_formats;
 };
 
 /*
 static struct fsl_spdif_soc_data fsl_spdif_vf610 = {
        .imx = false,
        .shared_root_clock = false,
+       .interrupts = 1,
+       .tx_burst = FSL_SPDIF_TXFIFO_WML,
+       .rx_burst = FSL_SPDIF_RXFIFO_WML,
+       .tx_formats = FSL_SPDIF_FORMATS_PLAYBACK,
 };
 
 static struct fsl_spdif_soc_data fsl_spdif_imx35 = {
        .imx = true,
        .shared_root_clock = false,
+       .interrupts = 1,
+       .tx_burst = FSL_SPDIF_TXFIFO_WML,
+       .rx_burst = FSL_SPDIF_RXFIFO_WML,
+       .tx_formats = FSL_SPDIF_FORMATS_PLAYBACK,
 };
 
 static struct fsl_spdif_soc_data fsl_spdif_imx6sx = {
        .imx = true,
        .shared_root_clock = true,
+       .interrupts = 1,
+       .tx_burst = FSL_SPDIF_TXFIFO_WML,
+       .rx_burst = FSL_SPDIF_RXFIFO_WML,
+       .tx_formats = FSL_SPDIF_FORMATS_PLAYBACK,
+
+};
+
+static struct fsl_spdif_soc_data fsl_spdif_imx8qm = {
+       .imx = true,
+       .shared_root_clock = true,
+       .interrupts = 2,
+       .tx_burst = 2,          /* Applied for EDMA */
+       .rx_burst = 2,          /* Applied for EDMA */
+       .tx_formats = SNDRV_PCM_FMTBIT_S24_LE,  /* Applied for EDMA */
 };
 
 /* Check if clk is a root clock that does not share clock source with others */
        /* Initialize this copy of the CPU DAI driver structure */
        memcpy(&spdif_priv->cpu_dai_drv, &fsl_spdif_dai, sizeof(fsl_spdif_dai));
        spdif_priv->cpu_dai_drv.name = dev_name(&pdev->dev);
+       spdif_priv->cpu_dai_drv.playback.formats =
+                               spdif_priv->soc->tx_formats;
 
        /* Get the addresses and IRQ */
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
                return PTR_ERR(spdif_priv->regmap);
        }
 
-       irq = platform_get_irq(pdev, 0);
-       if (irq < 0)
-               return irq;
+       for (i = 0; i < spdif_priv->soc->interrupts; i++) {
+               irq = platform_get_irq(pdev, i);
+               if (irq < 0) {
+                       dev_err(&pdev->dev, "no irq for node %s\n", pdev->name);
+                       return irq;
+               }
 
-       ret = devm_request_irq(&pdev->dev, irq, spdif_isr, 0,
-                              dev_name(&pdev->dev), spdif_priv);
-       if (ret) {
-               dev_err(&pdev->dev, "could not claim irq %u\n", irq);
-               return ret;
+               ret = devm_request_irq(&pdev->dev, irq, spdif_isr, 0,
+                                      dev_name(&pdev->dev), spdif_priv);
+               if (ret) {
+                       dev_err(&pdev->dev, "could not claim irq %u\n", irq);
+                       return ret;
+               }
        }
 
        /* Get system clock for rx clock rate calculation */
 
        spdif_priv->dpll_locked = false;
 
-       spdif_priv->dma_params_tx.maxburst = FSL_SPDIF_TXFIFO_WML;
-       spdif_priv->dma_params_rx.maxburst = FSL_SPDIF_RXFIFO_WML;
+       spdif_priv->dma_params_tx.maxburst = spdif_priv->soc->tx_burst;
+       spdif_priv->dma_params_rx.maxburst = spdif_priv->soc->rx_burst;
        spdif_priv->dma_params_tx.addr = res->start + REG_SPDIF_STL;
        spdif_priv->dma_params_rx.addr = res->start + REG_SPDIF_SRL;
 
        { .compatible = "fsl,imx35-spdif", .data = &fsl_spdif_imx35, },
        { .compatible = "fsl,vf610-spdif", .data = &fsl_spdif_vf610, },
        { .compatible = "fsl,imx6sx-spdif", .data = &fsl_spdif_imx6sx, },
+       { .compatible = "fsl,imx8qm-spdif", .data = &fsl_spdif_imx8qm, },
        {}
 };
 MODULE_DEVICE_TABLE(of, fsl_spdif_dt_ids);