aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-davinci/include/mach/asp.h15
-rw-r--r--sound/soc/davinci/davinci-i2s.c29
2 files changed, 39 insertions, 5 deletions
diff --git a/arch/arm/mach-davinci/include/mach/asp.h b/arch/arm/mach-davinci/include/mach/asp.h
index 834725f1e81..0847d2144f1 100644
--- a/arch/arm/mach-davinci/include/mach/asp.h
+++ b/arch/arm/mach-davinci/include/mach/asp.h
@@ -63,6 +63,16 @@ struct snd_platform_data {
63 unsigned sram_size_playback; 63 unsigned sram_size_playback;
64 unsigned sram_size_capture; 64 unsigned sram_size_capture;
65 65
66 /*
67 * If McBSP peripheral gets the clock from an external pin,
68 * there are three chooses, that are MCBSP_CLKX, MCBSP_CLKR
69 * and MCBSP_CLKS.
70 * Depending on different hardware connections it is possible
71 * to use this setting to change the behaviour of McBSP
72 * driver. The dm365_clk_input_pin enum is available for dm365
73 */
74 int clk_input_pin;
75
66 /* McASP specific fields */ 76 /* McASP specific fields */
67 int tdm_slots; 77 int tdm_slots;
68 u8 op_mode; 78 u8 op_mode;
@@ -78,6 +88,11 @@ enum {
78 MCASP_VERSION_2, /* DA8xx/OMAPL1x */ 88 MCASP_VERSION_2, /* DA8xx/OMAPL1x */
79}; 89};
80 90
91enum dm365_clk_input_pin {
92 MCBSP_CLKR = 0, /* DM365 */
93 MCBSP_CLKS,
94};
95
81#define INACTIVE_MODE 0 96#define INACTIVE_MODE 0
82#define TX_MODE 1 97#define TX_MODE 1
83#define RX_MODE 2 98#define RX_MODE 2
diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c
index c8f038cb4c5..ba5644b5fbb 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
124struct davinci_mcbsp_dev { 124struct 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
158static inline void davinci_mcbsp_write_reg(struct davinci_mcbsp_dev *dev, 160static 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;