ASoC: McASP: calculate values for channel size
Change davinci_config_channel_size() to derive the values for XSSZ and XROT in DAVINCI_MCASP_[RT]XFMT_REG from the configured word length rather than hard-coding them in a switch/case block. Also, by directly passing the word length to davinci_config_channel_size(), we can get rid of the DAVINCI_AUDIO_WORD_* enum. Signed-off-by: Daniel Mack <zonque@gmail.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
d0c6c482f6
commit
ba764b3def
|
@ -619,57 +619,14 @@ static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
|
|||
}
|
||||
|
||||
static int davinci_config_channel_size(struct davinci_audio_dev *dev,
|
||||
int channel_size)
|
||||
int word_length)
|
||||
{
|
||||
u32 fmt = 0;
|
||||
u32 mask, rotate;
|
||||
u32 fmt;
|
||||
u32 rotate = (32 - word_length) / 4;
|
||||
u32 mask = (1ULL << word_length) - 1;
|
||||
|
||||
switch (channel_size) {
|
||||
case DAVINCI_AUDIO_WORD_8:
|
||||
fmt = 0x03;
|
||||
rotate = 6;
|
||||
mask = 0x000000ff;
|
||||
break;
|
||||
|
||||
case DAVINCI_AUDIO_WORD_12:
|
||||
fmt = 0x05;
|
||||
rotate = 5;
|
||||
mask = 0x00000fff;
|
||||
break;
|
||||
|
||||
case DAVINCI_AUDIO_WORD_16:
|
||||
fmt = 0x07;
|
||||
rotate = 4;
|
||||
mask = 0x0000ffff;
|
||||
break;
|
||||
|
||||
case DAVINCI_AUDIO_WORD_20:
|
||||
fmt = 0x09;
|
||||
rotate = 3;
|
||||
mask = 0x000fffff;
|
||||
break;
|
||||
|
||||
case DAVINCI_AUDIO_WORD_24:
|
||||
fmt = 0x0B;
|
||||
rotate = 2;
|
||||
mask = 0x00ffffff;
|
||||
break;
|
||||
|
||||
case DAVINCI_AUDIO_WORD_28:
|
||||
fmt = 0x0D;
|
||||
rotate = 1;
|
||||
mask = 0x0fffffff;
|
||||
break;
|
||||
|
||||
case DAVINCI_AUDIO_WORD_32:
|
||||
fmt = 0x0F;
|
||||
rotate = 0;
|
||||
mask = 0xffffffff;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
/* mapping of the XSSZ bit-field as described in the datasheet */
|
||||
fmt = (word_length >> 1) - 1;
|
||||
|
||||
mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMT_REG,
|
||||
RXSSZ(fmt), RXSSZ(0x0F));
|
||||
|
@ -856,19 +813,19 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
|
|||
case SNDRV_PCM_FORMAT_U8:
|
||||
case SNDRV_PCM_FORMAT_S8:
|
||||
dma_params->data_type = 1;
|
||||
word_length = DAVINCI_AUDIO_WORD_8;
|
||||
word_length = 8;
|
||||
break;
|
||||
|
||||
case SNDRV_PCM_FORMAT_U16_LE:
|
||||
case SNDRV_PCM_FORMAT_S16_LE:
|
||||
dma_params->data_type = 2;
|
||||
word_length = DAVINCI_AUDIO_WORD_16;
|
||||
word_length = 16;
|
||||
break;
|
||||
|
||||
case SNDRV_PCM_FORMAT_U24_3LE:
|
||||
case SNDRV_PCM_FORMAT_S24_3LE:
|
||||
dma_params->data_type = 3;
|
||||
word_length = DAVINCI_AUDIO_WORD_24;
|
||||
word_length = 24;
|
||||
break;
|
||||
|
||||
case SNDRV_PCM_FORMAT_U24_LE:
|
||||
|
@ -876,7 +833,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
|
|||
case SNDRV_PCM_FORMAT_U32_LE:
|
||||
case SNDRV_PCM_FORMAT_S32_LE:
|
||||
dma_params->data_type = 4;
|
||||
word_length = DAVINCI_AUDIO_WORD_32;
|
||||
word_length = 32;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -27,16 +27,6 @@
|
|||
#define DAVINCI_MCASP_I2S_DAI 0
|
||||
#define DAVINCI_MCASP_DIT_DAI 1
|
||||
|
||||
enum {
|
||||
DAVINCI_AUDIO_WORD_8 = 0,
|
||||
DAVINCI_AUDIO_WORD_12,
|
||||
DAVINCI_AUDIO_WORD_16,
|
||||
DAVINCI_AUDIO_WORD_20,
|
||||
DAVINCI_AUDIO_WORD_24,
|
||||
DAVINCI_AUDIO_WORD_32,
|
||||
DAVINCI_AUDIO_WORD_28, /* This is only valid for McASP */
|
||||
};
|
||||
|
||||
struct davinci_audio_dev {
|
||||
struct davinci_pcm_dma_params dma_params[2];
|
||||
void __iomem *base;
|
||||
|
|
Loading…
Reference in New Issue