diff options
author | Raffaele Recalcati <raffaele.recalcati@bticino.it> | 2010-07-06 04:39:03 -0400 |
---|---|---|
committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2010-07-06 10:54:06 -0400 |
commit | ec6375533748806a1a49dad7ce124cc02886854a (patch) | |
tree | c0cc7a1d2472fc735c816d0575d2b9e445333bbc /sound/soc/davinci/davinci-i2s.c | |
parent | a4c8ea2ddaed2f461606c2828b19786524b551ac (diff) |
ASoC: DaVinci: Added selection of clk input pin for McBSP
When McBSP peripheral gets the clock from an external pin,
there are three possible chooses, MCBSP_CLKX, MCBSP_CLKR
and MCBSP_CLKS.
evm-dm365 uses MCBSP_CLKR, instead in bmx board I have a different
hardware connection and I use MCBSP_CLKS, so I have added
this possibility.
This patch has been developed against the:
http://git.kernel.org/pub/scm/linux/kernel/git/khilman/linux-davinci.git
git tree and has been tested on bmx board (similar to dm365 evm)
Signed-off-by: Raffaele Recalcati <raffaele.recalcati@bticino.it>
Signed-off-by: Davide Bonfanti <davide.bonfanti@bticino.it>
Acked-by: Liam Girdwood <lrg@slimlogic.co.uk>
Acked-by: Sudhakar Rajashekhara <sudhakar.raj@ti.com>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Diffstat (limited to 'sound/soc/davinci/davinci-i2s.c')
-rw-r--r-- | sound/soc/davinci/davinci-i2s.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c index c8f038cb4c5e..ba5644b5fbbf 100644 --- a/sound/soc/davinci/davinci-i2s.c +++ b/sound/soc/davinci/davinci-i2s.c | |||
@@ -122,6 +122,7 @@ static const unsigned char double_fmt[SNDRV_PCM_FORMAT_S32_LE + 1] = { | |||
122 | }; | 122 | }; |
123 | 123 | ||
124 | struct davinci_mcbsp_dev { | 124 | struct davinci_mcbsp_dev { |
125 | struct device *dev; | ||
125 | struct davinci_pcm_dma_params dma_params[2]; | 126 | struct davinci_pcm_dma_params dma_params[2]; |
126 | void __iomem *base; | 127 | void __iomem *base; |
127 | #define MOD_DSP_A 0 | 128 | #define MOD_DSP_A 0 |
@@ -153,6 +154,7 @@ struct davinci_mcbsp_dev { | |||
153 | 154 | ||
154 | unsigned int fmt; | 155 | unsigned int fmt; |
155 | int clk_div; | 156 | int clk_div; |
157 | int clk_input_pin; | ||
156 | }; | 158 | }; |
157 | 159 | ||
158 | static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, | 160 | static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, |
@@ -279,11 +281,26 @@ static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
279 | DAVINCI_MCBSP_PCR_CLKRM; | 281 | DAVINCI_MCBSP_PCR_CLKRM; |
280 | break; | 282 | break; |
281 | case SND_SOC_DAIFMT_CBM_CFS: | 283 | case SND_SOC_DAIFMT_CBM_CFS: |
282 | /* McBSP CLKR pin is the input for the Sample Rate Generator. | 284 | pcr = DAVINCI_MCBSP_PCR_FSRM | DAVINCI_MCBSP_PCR_FSXM; |
283 | * McBSP FSR and FSX are driven by the Sample Rate Generator. */ | 285 | /* |
284 | pcr = DAVINCI_MCBSP_PCR_SCLKME | | 286 | * Selection of the clock input pin that is the |
285 | DAVINCI_MCBSP_PCR_FSXM | | 287 | * input for the Sample Rate Generator. |
286 | DAVINCI_MCBSP_PCR_FSRM; | 288 | * McBSP FSR and FSX are driven by the Sample Rate |
289 | * Generator. | ||
290 | */ | ||
291 | switch (dev->clk_input_pin) { | ||
292 | case MCBSP_CLKS: | ||
293 | pcr |= DAVINCI_MCBSP_PCR_CLKXM | | ||
294 | DAVINCI_MCBSP_PCR_CLKRM; | ||
295 | break; | ||
296 | case MCBSP_CLKR: | ||
297 | pcr |= DAVINCI_MCBSP_PCR_SCLKME; | ||
298 | break; | ||
299 | default: | ||
300 | dev_err(dev->dev, "bad clk_input_pin\n"); | ||
301 | return -EINVAL; | ||
302 | } | ||
303 | |||
287 | break; | 304 | break; |
288 | case SND_SOC_DAIFMT_CBM_CFM: | 305 | case SND_SOC_DAIFMT_CBM_CFM: |
289 | /* codec is master */ | 306 | /* codec is master */ |
@@ -644,6 +661,7 @@ static int davinci_i2s_probe(struct platform_device *pdev) | |||
644 | pdata->sram_size_playback; | 661 | pdata->sram_size_playback; |
645 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].sram_size = | 662 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].sram_size = |
646 | pdata->sram_size_capture; | 663 | pdata->sram_size_capture; |
664 | dev->clk_input_pin = pdata->clk_input_pin; | ||
647 | } | 665 | } |
648 | dev->clk = clk_get(&pdev->dev, NULL); | 666 | dev->clk = clk_get(&pdev->dev, NULL); |
649 | if (IS_ERR(dev->clk)) { | 667 | if (IS_ERR(dev->clk)) { |
@@ -676,6 +694,7 @@ static int davinci_i2s_probe(struct platform_device *pdev) | |||
676 | goto err_free_mem; | 694 | goto err_free_mem; |
677 | } | 695 | } |
678 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; | 696 | dev->dma_params[SNDRV_PCM_STREAM_CAPTURE].channel = res->start; |
697 | dev->dev = &pdev->dev; | ||
679 | 698 | ||
680 | davinci_i2s_dai.private_data = dev; | 699 | davinci_i2s_dai.private_data = dev; |
681 | davinci_i2s_dai.capture.dma_data = dev->dma_params; | 700 | davinci_i2s_dai.capture.dma_data = dev->dma_params; |