summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolin Chen <b42378@freescale.com>2013-11-26 15:08:41 +0800
committerNicolin Chen <b42378@freescale.com>2013-11-27 19:39:31 +0800
commit438bd0ffe5cf3905b5986b91be65e2d7824371d4 (patch)
tree447fa03324bbf038bf8e49fde2970f51e5959081
parent1ff3f5d29c35f2eb6bd3bed93e18fddcc4c2d271 (diff)
ENGR00289643-2 ASoC: fsl: Add missing spba clock for esai and spdif
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> (cherry picked from commit a1238fa0fe2de5ccfa0b271537bb14dfd07815b1)
-rw-r--r--arch/arm/boot/dts/imx6qdl.dtsi7
-rw-r--r--arch/arm/boot/dts/imx6sl.dtsi5
-rw-r--r--sound/soc/fsl/fsl_esai.c11
-rw-r--r--sound/soc/fsl/fsl_esai.h1
-rw-r--r--sound/soc/fsl/fsl_spdif.c10
5 files changed, 28 insertions, 6 deletions
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi
index 9dd4cbdf6cef..bd6c7a0c266b 100644
--- a/arch/arm/boot/dts/imx6qdl.dtsi
+++ b/arch/arm/boot/dts/imx6qdl.dtsi
@@ -166,12 +166,12 @@
<&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";
};
@@ -234,7 +234,8 @@
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";
diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi
index c5684623ef2b..b937a4a94202 100644
--- a/arch/arm/boot/dts/imx6sl.dtsi
+++ b/arch/arm/boot/dts/imx6sl.dtsi
@@ -156,12 +156,13 @@
<&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";
};
diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
index 221b4e49ed60..72165238e4ac 100644
--- a/sound/soc/fsl/fsl_esai.c
+++ b/sound/soc/fsl/fsl_esai.c
@@ -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");
diff --git a/sound/soc/fsl/fsl_esai.h b/sound/soc/fsl/fsl_esai.h
index 32ff624af860..f0b6198a69a6 100644
--- a/sound/soc/fsl/fsl_esai.h
+++ b/sound/soc/fsl/fsl_esai.h
@@ -318,6 +318,7 @@
struct fsl_esai {
struct clk *clk;
+ struct clk *dmaclk;
void __iomem *base;
int irq;
unsigned int flags;
diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c
index 10e5c7568c4e..99480fe77f4f 100644
--- a/sound/soc/fsl/fsl_spdif.c
+++ b/sound/soc/fsl/fsl_spdif.c
@@ -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)) {