]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
ENGR00289643-2 ASoC: fsl: Add missing spba clock for esai and spdif
authorNicolin Chen <b42378@freescale.com>
Tue, 26 Nov 2013 07:08:41 +0000 (15:08 +0800)
committerNicolin Chen <b42378@freescale.com>
Wed, 27 Nov 2013 11:35:38 +0000 (19:35 +0800)
Both esai and spdif are using SDMA script to transmit and receive data while
the essential spba clock is missed in the current two drivers. Thus add them.

Acked-by: Wang Shengjiu <b02247@freescale.com>
Signed-off-by: Nicolin Chen <b42378@freescale.com>
arch/arm/boot/dts/imx6qdl.dtsi
arch/arm/boot/dts/imx6sl.dtsi
sound/soc/fsl/fsl_esai.c
sound/soc/fsl/fsl_esai.h
sound/soc/fsl/fsl_spdif.c

index 9dd4cbdf6cef65d3a7a144ff9ef4b2f9c0e91a9e..bd6c7a0c266bc15ef30586ea13774086397794d4 100644 (file)
                                               <&clks 197>, <&clks 107>,
                                               <&clks 0>, <&clks 118>,
                                               <&clks 62>, <&clks 139>,
-                                              <&clks 0>;
+                                              <&clks 0>, <&clks 156>;
                                        clock-names = "core", "rxtx0",
                                                "rxtx1", "rxtx2",
                                                "rxtx3", "rxtx4",
                                                "rxtx5", "rxtx6",
-                                               "rxtx7";
+                                               "rxtx7", "dma";
                                        status = "disabled";
                                };
 
                                        compatible = "fsl,imx6q-esai";
                                        reg = <0x02024000 0x4000>;
                                        interrupts = <0 51 0x04>;
-                                       clocks = <&clks 118>;
+                                       clocks = <&clks 118>, <&clks 156>;
+                                       clock-names = "core", "dma";
                                        fsl,esai-dma-events = <24 23>;
                                        fsl,flags = <1>;
                                        status = "disabled";
index c5684623ef2bae85bb4156f368f839a4c0d88a6b..b937a4a94202b7ce138268a9572bb14f3090b1d8 100644 (file)
                                               <&clks IMX6SL_CLK_SPDIF>,
                                               <&clks 0>, <&clks 0>, <&clks 0>,
                                               <&clks IMX6SL_CLK_IPG>,
-                                              <&clks 0>, <&clks 0>;
+                                              <&clks 0>, <&clks 0>,
+                                              <&clks IMX6SL_CLK_SPBA>;
                                        clock-names = "core", "rxtx0",
                                                "rxtx1", "rxtx2",
                                                "rxtx3", "rxtx4",
                                                "rxtx5", "rxtx6",
-                                               "rxtx7";
+                                               "rxtx7", "dma";
                                        status = "disabled";
                                };
 
index 221b4e49ed609e843fbfb668c867ccc47c74c382..72165238e4aceb547e2a3b15fe71ea558fae9b20 100644 (file)
@@ -294,6 +294,7 @@ static int fsl_esai_startup(struct snd_pcm_substream *substream,
        struct fsl_esai *esai = snd_soc_dai_get_drvdata(cpu_dai);
 
        clk_enable(esai->clk);
+       clk_prepare_enable(esai->dmaclk);
        if (!cpu_dai->active) {
                writel(ESAI_GPIO_ESAI, esai->base + ESAI_PRRC);
                writel(ESAI_GPIO_ESAI, esai->base + ESAI_PCRC);
@@ -438,6 +439,7 @@ static void fsl_esai_shutdown(struct snd_pcm_substream *substream,
 {
        struct fsl_esai *esai = snd_soc_dai_get_drvdata(cpu_dai);
 
+       clk_disable_unprepare(esai->dmaclk);
        clk_disable(esai->clk);
 }
 
@@ -576,7 +578,7 @@ static int fsl_esai_probe(struct platform_device *pdev)
        }
        esai->flags = flag;
 
-       esai->clk = devm_clk_get(&pdev->dev, NULL);
+       esai->clk = devm_clk_get(&pdev->dev, "core");
        if (IS_ERR(esai->clk)) {
                ret = PTR_ERR(esai->clk);
                dev_err(&pdev->dev, "Cannot get the clock: %d\n", ret);
@@ -584,6 +586,13 @@ static int fsl_esai_probe(struct platform_device *pdev)
        }
        clk_prepare(esai->clk);
 
+       esai->dmaclk = devm_clk_get(&pdev->dev, "dma");
+       if (IS_ERR(esai->dmaclk)) {
+               ret = PTR_ERR(esai->dmaclk);
+               dev_err(&pdev->dev, "Cannot get dma clock: %d\n", ret);
+               goto failed_get_resource;
+       }
+
        ret = of_address_to_resource(np, 0, &res);
        if (ret) {
                dev_err(&pdev->dev, "could not determine device resources\n");
index 32ff624af86052a4986cae7c5c669b379e81572c..f0b6198a69a62fe3b8c7b2872a05c3e2b5ec9127 100644 (file)
 
 struct fsl_esai {
        struct clk *clk;
+       struct clk *dmaclk;
        void __iomem *base;
        int irq;
        unsigned int flags;
index 10e5c7568c4e93ce85475791e20c62af1a2e5954..99480fe77f4ffcc2d548ec67f5be1d792838bfe3 100644 (file)
@@ -83,6 +83,7 @@ struct fsl_spdif_priv {
        struct clk *txclk[SPDIF_TXRATE_MAX];
        struct clk *rxclk;
        struct clk *sysclk;
+       struct clk *dmaclk;
        struct snd_dmaengine_dai_dma_data dma_params_tx;
        struct snd_dmaengine_dai_dma_data dma_params_rx;
 
@@ -425,6 +426,7 @@ static int fsl_spdif_startup(struct snd_pcm_substream *substream,
        int ret;
 
        pm_runtime_get_sync(cpu_dai->dev);
+       clk_prepare_enable(spdif_priv->dmaclk);
 
        /* Reset module and interrupts only for first initialization */
        if (!cpu_dai->active) {
@@ -491,6 +493,7 @@ static void fsl_spdif_shutdown(struct snd_pcm_substream *substream,
                                SCR_LOW_POWER, SCR_LOW_POWER);
        }
 
+       clk_disable_unprepare(spdif_priv->dmaclk);
        pm_runtime_put_sync(cpu_dai->dev);
 }
 
@@ -1159,6 +1162,13 @@ static int fsl_spdif_probe(struct platform_device *pdev)
                return PTR_ERR(spdif_priv->sysclk);
        }
 
+       /* Get dma clock for dma script operation */
+       spdif_priv->dmaclk = devm_clk_get(&pdev->dev, "dma");
+       if (IS_ERR(spdif_priv->dmaclk)) {
+               dev_err(&pdev->dev, "no dma clock in devicetree\n");
+               return PTR_ERR(spdif_priv->dmaclk);
+       }
+
        /* Select clock source for rx/tx clock */
        spdif_priv->rxclk = devm_clk_get(&pdev->dev, "rxtx1");
        if (IS_ERR(spdif_priv->rxclk)) {