On 08/10/2013 10:53 AM, Michael Trimarchi wrote:
I found some time but I can't not test this patch now ;) too far from my office. The idea is to check with MAX_BCLK. There are two points that should cover slave and master mode. Is it the right direction? BTW Do you think that is better to have at soc level as a new constraint?
I would not bother with the bclk check for now. We did not had issues so far and 48MHz is quite high anyways for our users so far.
Michael
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 7483efb..ea95ad2 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -39,7 +39,9 @@ #include "mcbsp.h" #include "omap-mcbsp.h"
-#define OMAP_MCBSP_RATES (SNDRV_PCM_RATE_8000_96000) +#define OMAP_MCBSP_MAX_BCLK 48000000 +#define OMAP_MCBSP_RATES (SNDRV_PCM_RATE_8000_192000 | \
SNDRV_PCM_RATE_KNOT)
#define OMAP_MCBSP_SOC_SINGLE_S16_EXT(xname, xmin, xmax, \ xhandler_get, xhandler_put) \ @@ -225,10 +227,14 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, struct omap_mcbsp *mcbsp = snd_soc_dai_get_drvdata(cpu_dai); struct omap_mcbsp_reg_cfg *regs = &mcbsp->cfg_regs; struct snd_dmaengine_dai_dma_data *dma_data;
- int wlen, channels, wpf;
int wlen, channels, wpf, bclk; int pkt_size = 0; unsigned int format, div, framesize, master;
bclk = snd_soc_params_to_bclk(params);
if (bclk < 0 || bclk > OMAP_MCBSP_MAX_BCLK)
return -EINVAL;
dma_data = snd_soc_dai_get_dma_data(cpu_dai, substream); channels = params_channels(params);
@@ -326,7 +332,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, /* In McBSP master modes, FRAME (i.e. sample rate) is generated * by _counting_ BCLKs. Calculate frame size in BCLKs */ master = mcbsp->fmt & SND_SOC_DAIFMT_MASTER_MASK;
- if (master == SND_SOC_DAIFMT_CBS_CFS) {
- if (master == SND_SOC_DAIFMT_CBS_CFS) { div = mcbsp->clk_div ? mcbsp->clk_div : 1; framesize = (mcbsp->in_freq / div) / params_rate(params);
@@ -500,6 +506,9 @@ static int omap_mcbsp_dai_set_dai_sysclk(struct snd_soc_dai *cpu_dai, return -EBUSY; }
- if (freq > OMAP_MCBSP_MAX_BCLK)
return -EINVAL;
- mcbsp->in_freq = freq; regs->srgr2 &= ~CLKSM; regs->pcr0 &= ~SCLKME;
Michael
}, .capture = { .channels_min = 1, .channels_max = 16, .rates = OMAP_MCBSP_RATES,
.rate_min = 8000,
.rate_max = 384000,
Same here, do not set these.
.formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE,
}, .ops = &mcbsp_dai_ops,
-- Péter
-- Péter