#include <linux/dmaengine.h>
 #include <linux/module.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
                return -ENOMEM;
 
        sai->pdev = pdev;
-
-       if (of_device_is_compatible(np, "fsl,imx6sx-sai") ||
-           of_device_is_compatible(np, "fsl,imx6ul-sai"))
-               sai->sai_on_imx = true;
+       sai->soc_data = of_device_get_match_data(&pdev->dev);
 
        sai->is_lsb_first = of_property_read_bool(np, "lsb-first");
 
        if (ret)
                return ret;
 
-       if (sai->sai_on_imx)
+       if (sai->soc_data->use_imx_pcm)
                return imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
        else
                return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
        return 0;
 }
 
+static const struct fsl_sai_soc_data fsl_sai_vf610_data = {
+       .use_imx_pcm = false,
+};
+
+static const struct fsl_sai_soc_data fsl_sai_imx6sx_data = {
+       .use_imx_pcm = true,
+};
+
 static const struct of_device_id fsl_sai_ids[] = {
-       { .compatible = "fsl,vf610-sai", },
-       { .compatible = "fsl,imx6sx-sai", },
-       { .compatible = "fsl,imx6ul-sai", },
+       { .compatible = "fsl,vf610-sai", .data = &fsl_sai_vf610_data },
+       { .compatible = "fsl,imx6sx-sai", .data = &fsl_sai_imx6sx_data },
+       { .compatible = "fsl,imx6ul-sai", .data = &fsl_sai_imx6sx_data },
        { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, fsl_sai_ids);
 
 #define FSL_SAI_MAXBURST_TX 6
 #define FSL_SAI_MAXBURST_RX 6
 
+struct fsl_sai_soc_data {
+       bool use_imx_pcm;
+};
+
 struct fsl_sai {
        struct platform_device *pdev;
        struct regmap *regmap;
        bool is_slave_mode;
        bool is_lsb_first;
        bool is_dsp_mode;
-       bool sai_on_imx;
        bool synchronous[2];
 
        unsigned int mclk_id[2];
        unsigned int slots;
        unsigned int slot_width;
 
+       const struct fsl_sai_soc_data *soc_data;
        struct snd_dmaengine_dai_dma_data dma_params_rx;
        struct snd_dmaengine_dai_dma_data dma_params_tx;
 };