|
@@ -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)
|
|
@@ -878,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(pdev->dev.of_node, "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;
|