Troy Kisky <[email protected]> writes:
> Currently, the aic33 codec is set to use I2S mode
> and the cpu is set to use dsp_b mode. Although,
> this seems to work if the codec is master. It is
> very confusing. Change both codec and cpu to
> use dsp_a mode.
>
> Signed-off-by: Troy Kisky <[email protected]>
>
> Kevin,
>
> I'm starting to split the patch apart to see where it goes
> wrong. Can you test this one?
On top of the current HEAD, I still here the pop, but don't hear any
audio.
If apply your 2 earlier patches
[PATCH 1/3] ARM: DaVinci: dma: don't clear link on stop yet
[PATCH 2/3] ARM: DaVinci: dma: move EXPORT immediately below function
And then this patch, I can hear audio again, but is very noisy
compared to without this patch.
Kevin
> diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
> index cff276e..3a83389 100644
> --- a/sound/soc/codecs/tlv320aic3x.c
> +++ b/sound/soc/codecs/tlv320aic3x.c
> @@ -871,7 +871,7 @@ static int aic3x_set_dai_fmt(struct snd_soc_dai
> *codec_dai,
> SND_SOC_DAIFMT_INV_MASK)) {
> case (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF):
> break;
> - case (SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF):
> + case (SND_SOC_DAIFMT_DSP_A | SND_SOC_DAIFMT_IB_NF):
> iface_breg |= (0x01 << 6);
> break;
> case (SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_NB_NF):
> diff --git a/sound/soc/davinci/davinci-evm.c b/sound/soc/davinci/davinci-evm.c
> index 24f1697..ba36ac3 100644
> --- a/sound/soc/davinci/davinci-evm.c
> +++ b/sound/soc/davinci/davinci-evm.c
> @@ -31,6 +31,9 @@
>
> #define EVM_CODEC_CLOCK 22579200
>
> +#define AUDIO_FORMAT (SND_SOC_DAIFMT_DSP_A | \
> + SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_IB_NF)
> +
> static int evm_hw_params(struct snd_pcm_substream *substream,
> struct snd_pcm_hw_params *params)
> {
> @@ -40,14 +43,12 @@ static int evm_hw_params(struct snd_pcm_substream
> *substream,
> int ret = 0;
>
> /* set codec DAI configuration */
> - ret = snd_soc_dai_set_fmt(codec_dai, SND_SOC_DAIFMT_I2S |
> - SND_SOC_DAIFMT_CBM_CFM);
> + ret = snd_soc_dai_set_fmt(codec_dai, AUDIO_FORMAT);
> if (ret < 0)
> return ret;
>
> /* set cpu DAI configuration */
> - ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBM_CFM |
> - SND_SOC_DAIFMT_IB_NF);
> + ret = snd_soc_dai_set_fmt(cpu_dai, AUDIO_FORMAT);
> if (ret < 0)
> return ret;
>
> diff --git a/sound/soc/davinci/davinci-i2s.c b/sound/soc/davinci/davinci-i2s.c
> index ca2a50a..3c81946 100644
> --- a/sound/soc/davinci/davinci-i2s.c
> +++ b/sound/soc/davinci/davinci-i2s.c
> @@ -219,59 +219,82 @@ static int davinci_i2s_startup(struct snd_pcm_substream
> *substream)
> return 0;
> }
>
> +#define DEFAULT_BITPERSAMPLE 16
> +
> static int davinci_i2s_set_dai_fmt(struct snd_soc_dai *cpu_dai,
> unsigned int fmt)
> {
> struct davinci_mcbsp_dev *dev = cpu_dai->private_data;
> - u32 w;
> -
> + unsigned int pcr;
> + unsigned int srgr;
> + unsigned rcr;
> + unsigned xcr;
> + srgr = DAVINCI_MCBSP_SRGR_FSGM |
> + DAVINCI_MCBSP_SRGR_FPER(DEFAULT_BITPERSAMPLE * 2 - 1) |
> + DAVINCI_MCBSP_SRGR_FWID(DEFAULT_BITPERSAMPLE - 1);
> +
> + /* set master/slave audio interface */
> switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
> case SND_SOC_DAIFMT_CBS_CFS:
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG,
> - DAVINCI_MCBSP_PCR_FSXM |
> - DAVINCI_MCBSP_PCR_FSRM |
> - DAVINCI_MCBSP_PCR_CLKXM |
> - DAVINCI_MCBSP_PCR_CLKRM);
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SRGR_REG,
> - DAVINCI_MCBSP_SRGR_FSGM);
> + /* cpu is master */
> + pcr = DAVINCI_MCBSP_PCR_FSXM |
> + DAVINCI_MCBSP_PCR_FSRM |
> + DAVINCI_MCBSP_PCR_CLKXM |
> + DAVINCI_MCBSP_PCR_CLKRM;
> break;
> case SND_SOC_DAIFMT_CBM_CFS:
> /* McBSP CLKR pin is the input for the Sample Rate Generator.
> * McBSP FSR and FSX are driven by the Sample Rate Generator. */
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG,
> - DAVINCI_MCBSP_PCR_SCLKME |
> - DAVINCI_MCBSP_PCR_FSXM |
> - DAVINCI_MCBSP_PCR_FSRM);
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SRGR_REG,
> - DAVINCI_MCBSP_SRGR_FSGM);
> + pcr = DAVINCI_MCBSP_PCR_SCLKME |
> + DAVINCI_MCBSP_PCR_FSXM |
> + DAVINCI_MCBSP_PCR_FSRM;
> break;
> case SND_SOC_DAIFMT_CBM_CFM:
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG, 0);
> + /* codec is master */
> + pcr = 0;
> break;
> default:
> + printk(KERN_ERR "%s:bad master\n", __func__);
> return -EINVAL;
> }
>
> switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
> case SND_SOC_DAIFMT_IB_NF:
> - w = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_PCR_REG);
> - MOD_REG_BIT(w, DAVINCI_MCBSP_PCR_CLKXP |
> - DAVINCI_MCBSP_PCR_CLKRP, 1);
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG, w);
> + /* CLKRP Receive clock polarity,
> + * 1 - sampled on rising edge of CLKR
> + * valid on rising edge
> + * CLKXP Transmit clock polarity,
> + * 1 - clocked on falling edge of CLKX
> + * valid on rising edge
> + * FSRP Receive frame sync pol, 0 - active high
> + * FSXP Transmit frame sync pol, 0 - active high
> + */
> + pcr |= (DAVINCI_MCBSP_PCR_CLKXP | DAVINCI_MCBSP_PCR_CLKRP);
> break;
> case SND_SOC_DAIFMT_NB_IF:
> - w = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_PCR_REG);
> - MOD_REG_BIT(w, DAVINCI_MCBSP_PCR_FSXP |
> - DAVINCI_MCBSP_PCR_FSRP, 1);
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG, w);
> + /* CLKRP Receive clock polarity,
> + * 0 - sampled on falling edge of CLKR
> + * valid on falling edge
> + * CLKXP Transmit clock polarity,
> + * 0 - clocked on rising edge of CLKX
> + * valid on falling edge
> + * FSRP Receive frame sync pol, 1 - active low
> + * FSXP Transmit frame sync pol, 1 - active low
> + */
> + pcr |= (DAVINCI_MCBSP_PCR_FSXP | DAVINCI_MCBSP_PCR_FSRP);
> break;
> case SND_SOC_DAIFMT_IB_IF:
> - w = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_PCR_REG);
> - MOD_REG_BIT(w, DAVINCI_MCBSP_PCR_CLKXP |
> - DAVINCI_MCBSP_PCR_CLKRP |
> - DAVINCI_MCBSP_PCR_FSXP |
> - DAVINCI_MCBSP_PCR_FSRP, 1);
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG, w);
> + /* CLKRP Receive clock polarity,
> + * 1 - sampled on rising edge of CLKR
> + * valid on rising edge
> + * CLKXP Transmit clock polarity,
> + * 1 - clocked on falling edge of CLKX
> + * valid on rising edge
> + * FSRP Receive frame sync pol, 1 - active low
> + * FSXP Transmit frame sync pol, 1 - active low
> + */
> + pcr |= (DAVINCI_MCBSP_PCR_CLKXP | DAVINCI_MCBSP_PCR_CLKRP |
> + DAVINCI_MCBSP_PCR_FSXP | DAVINCI_MCBSP_PCR_FSRP);
> break;
> case SND_SOC_DAIFMT_NB_NF:
> break;
> @@ -279,28 +302,24 @@ static int davinci_i2s_set_dai_fmt(struct snd_soc_dai
> *cpu_dai,
> return -EINVAL;
> }
>
> + /* interface format */
> + rcr = DAVINCI_MCBSP_RCR_RFRLEN1(1);
> + xcr = DAVINCI_MCBSP_XCR_XFIG | DAVINCI_MCBSP_XCR_XFRLEN1(1);
> switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
> - case SND_SOC_DAIFMT_RIGHT_J:
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_RCR_REG,
> - DAVINCI_MCBSP_RCR_RFRLEN1(1) |
> - DAVINCI_MCBSP_RCR_RDATDLY(0));
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_XCR_REG,
> - DAVINCI_MCBSP_XCR_XFRLEN1(1) |
> - DAVINCI_MCBSP_XCR_XDATDLY(0) |
> - DAVINCI_MCBSP_XCR_XFIG);
> + case SND_SOC_DAIFMT_DSP_A:
> break;
> - case SND_SOC_DAIFMT_I2S:
> - default:
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_RCR_REG,
> - DAVINCI_MCBSP_RCR_RFRLEN1(1) |
> - DAVINCI_MCBSP_RCR_RDATDLY(1));
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_XCR_REG,
> - DAVINCI_MCBSP_XCR_XFRLEN1(1) |
> - DAVINCI_MCBSP_XCR_XDATDLY(1) |
> - DAVINCI_MCBSP_XCR_XFIG);
> + case SND_SOC_DAIFMT_DSP_B:
> + rcr |= DAVINCI_MCBSP_RCR_RDATDLY(1);
> + xcr |= DAVINCI_MCBSP_XCR_XDATDLY(1);
> break;
> + default:
> + printk(KERN_ERR "%s:bad format\n", __func__);
> + return -EINVAL;
> }
> -
> + davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SRGR_REG, srgr);
> + davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_PCR_REG, pcr);
> + davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_RCR_REG, rcr);
> + davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_XCR_REG, xcr);
> return 0;
> }
>
> @@ -325,12 +344,10 @@ static int davinci_i2s_hw_params(struct
> snd_pcm_substream *substream,
> }
>
> i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
> - w = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SRGR_REG);
> + w = DAVINCI_MCBSP_SRGR_FSGM;
> MOD_REG_BIT(w, DAVINCI_MCBSP_SRGR_FWID(snd_interval_value(i) - 1), 1);
> - davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SRGR_REG, w);
>
> i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_FRAME_BITS);
> - w = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SRGR_REG);
> MOD_REG_BIT(w, DAVINCI_MCBSP_SRGR_FPER(snd_interval_value(i) - 1), 1);
> davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SRGR_REG, w);
>
> --
> 1.5.4.3
>
>
> _______________________________________________
> Davinci-linux-open-source mailing list
> [email protected]
> http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source