Merge remote-tracking branch 'sound-asoc/for-next'
[deliverable/linux.git] / sound / soc / fsl / fsl_sai.c
index 0754df771e3b4c8a945c29e8c3c99f5c23403719..9fadf7e31c5f86459efc0b70fb1674f45da5a289 100644 (file)
@@ -21,6 +21,8 @@
 #include <sound/core.h>
 #include <sound/dmaengine_pcm.h>
 #include <sound/pcm_params.h>
+#include <linux/mfd/syscon.h>
+#include <linux/mfd/syscon/imx6q-iomuxc-gpr.h>
 
 #include "fsl_sai.h"
 #include "imx-pcm.h"
@@ -786,10 +788,12 @@ static int fsl_sai_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
        struct fsl_sai *sai;
+       struct regmap *gpr;
        struct resource *res;
        void __iomem *base;
        char tmp[8];
        int irq, ret, i;
+       int index;
 
        sai = devm_kzalloc(&pdev->dev, sizeof(*sai), GFP_KERNEL);
        if (!sai)
@@ -797,7 +801,8 @@ static int fsl_sai_probe(struct platform_device *pdev)
 
        sai->pdev = pdev;
 
-       if (of_device_is_compatible(pdev->dev.of_node, "fsl,imx6sx-sai"))
+       if (of_device_is_compatible(np, "fsl,imx6sx-sai") ||
+           of_device_is_compatible(np, "fsl,imx6ul-sai"))
                sai->sai_on_imx = true;
 
        sai->is_lsb_first = of_property_read_bool(np, "lsb-first");
@@ -877,6 +882,22 @@ static int fsl_sai_probe(struct platform_device *pdev)
                fsl_sai_dai.symmetric_samplebits = 0;
        }
 
+       if (of_find_property(np, "fsl,sai-mclk-direction-output", NULL) &&
+           of_device_is_compatible(np, "fsl,imx6ul-sai")) {
+               gpr = syscon_regmap_lookup_by_compatible("fsl,imx6ul-iomuxc-gpr");
+               if (IS_ERR(gpr)) {
+                       dev_err(&pdev->dev, "cannot find iomuxc registers\n");
+                       return PTR_ERR(gpr);
+               }
+
+               index = of_alias_get_id(np, "sai");
+               if (index < 0)
+                       return index;
+
+               regmap_update_bits(gpr, IOMUXC_GPR1, MCLK_DIR(index),
+                                  MCLK_DIR(index));
+       }
+
        sai->dma_params_rx.addr = res->start + FSL_SAI_RDR;
        sai->dma_params_tx.addr = res->start + FSL_SAI_TDR;
        sai->dma_params_rx.maxburst = FSL_SAI_MAXBURST_RX;
@@ -898,6 +919,7 @@ static int fsl_sai_probe(struct platform_device *pdev)
 static const struct of_device_id fsl_sai_ids[] = {
        { .compatible = "fsl,vf610-sai", },
        { .compatible = "fsl,imx6sx-sai", },
+       { .compatible = "fsl,imx6ul-sai", },
        { /* sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, fsl_sai_ids);
This page took 0.027554 seconds and 5 git commands to generate.