Merge remote-tracking branches 'asoc/topic/cygnus', 'asoc/topic/da7213', 'asoc/topic/davinci' and 'asoc/topic/doc' into asoc-next
This commit is contained in:
commit
67e85d4e4e
|
@ -655,23 +655,10 @@ static int cygnus_ssp_hw_params(struct snd_pcm_substream *substream,
|
||||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||||
value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
|
value = readl(aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
|
||||||
value &= ~BIT(BF_SRC_CFGX_BUFFER_PAIR_ENABLE);
|
value &= ~BIT(BF_SRC_CFGX_BUFFER_PAIR_ENABLE);
|
||||||
/* Configure channels as mono or stereo/TDM */
|
value &= ~BIT(BF_SRC_CFGX_SAMPLE_CH_MODE);
|
||||||
if (params_channels(params) == 1)
|
|
||||||
value |= BIT(BF_SRC_CFGX_SAMPLE_CH_MODE);
|
|
||||||
else
|
|
||||||
value &= ~BIT(BF_SRC_CFGX_SAMPLE_CH_MODE);
|
|
||||||
writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
|
writel(value, aio->cygaud->audio + aio->regs.bf_sourcech_cfg);
|
||||||
|
|
||||||
switch (params_format(params)) {
|
switch (params_format(params)) {
|
||||||
case SNDRV_PCM_FORMAT_S8:
|
|
||||||
if (aio->port_type == PORT_SPDIF) {
|
|
||||||
dev_err(aio->cygaud->dev,
|
|
||||||
"SPDIF does not support 8bit format\n");
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
bitres = 8;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case SNDRV_PCM_FORMAT_S16_LE:
|
case SNDRV_PCM_FORMAT_S16_LE:
|
||||||
bitres = 16;
|
bitres = 16;
|
||||||
break;
|
break;
|
||||||
|
@ -842,6 +829,7 @@ int cygnus_ssp_set_custom_fsync_width(struct snd_soc_dai *cpu_dai, int len)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(cygnus_ssp_set_custom_fsync_width);
|
||||||
|
|
||||||
static int cygnus_ssp_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
|
static int cygnus_ssp_set_fmt(struct snd_soc_dai *cpu_dai, unsigned int fmt)
|
||||||
{
|
{
|
||||||
|
@ -998,7 +986,7 @@ static int cygnus_set_dai_tdm_slot(struct snd_soc_dai *cpu_dai,
|
||||||
|
|
||||||
active_slots = hweight32(tx_mask);
|
active_slots = hweight32(tx_mask);
|
||||||
|
|
||||||
if ((active_slots < 0) || (active_slots > 16))
|
if (active_slots > 16)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
/* Slot value must be even */
|
/* Slot value must be even */
|
||||||
|
@ -1136,15 +1124,21 @@ static const struct snd_soc_dai_ops cygnus_ssp_dai_ops = {
|
||||||
.set_tdm_slot = cygnus_set_dai_tdm_slot,
|
.set_tdm_slot = cygnus_set_dai_tdm_slot,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct snd_soc_dai_ops cygnus_spdif_dai_ops = {
|
||||||
|
.startup = cygnus_ssp_startup,
|
||||||
|
.shutdown = cygnus_ssp_shutdown,
|
||||||
|
.trigger = cygnus_ssp_trigger,
|
||||||
|
.hw_params = cygnus_ssp_hw_params,
|
||||||
|
.set_sysclk = cygnus_ssp_set_sysclk,
|
||||||
|
};
|
||||||
|
|
||||||
#define INIT_CPU_DAI(num) { \
|
#define INIT_CPU_DAI(num) { \
|
||||||
.name = "cygnus-ssp" #num, \
|
.name = "cygnus-ssp" #num, \
|
||||||
.playback = { \
|
.playback = { \
|
||||||
.channels_min = 1, \
|
.channels_min = 2, \
|
||||||
.channels_max = 16, \
|
.channels_max = 16, \
|
||||||
.rates = SNDRV_PCM_RATE_KNOT, \
|
.rates = SNDRV_PCM_RATE_KNOT, \
|
||||||
.formats = SNDRV_PCM_FMTBIT_S8 | \
|
.formats = SNDRV_PCM_FMTBIT_S16_LE | \
|
||||||
SNDRV_PCM_FMTBIT_S16_LE | \
|
|
||||||
SNDRV_PCM_FMTBIT_S32_LE, \
|
SNDRV_PCM_FMTBIT_S32_LE, \
|
||||||
}, \
|
}, \
|
||||||
.capture = { \
|
.capture = { \
|
||||||
|
@ -1152,7 +1146,7 @@ static const struct snd_soc_dai_ops cygnus_ssp_dai_ops = {
|
||||||
.channels_max = 16, \
|
.channels_max = 16, \
|
||||||
.rates = SNDRV_PCM_RATE_KNOT, \
|
.rates = SNDRV_PCM_RATE_KNOT, \
|
||||||
.formats = SNDRV_PCM_FMTBIT_S16_LE | \
|
.formats = SNDRV_PCM_FMTBIT_S16_LE | \
|
||||||
SNDRV_PCM_FMTBIT_S32_LE, \
|
SNDRV_PCM_FMTBIT_S32_LE, \
|
||||||
}, \
|
}, \
|
||||||
.ops = &cygnus_ssp_dai_ops, \
|
.ops = &cygnus_ssp_dai_ops, \
|
||||||
.suspend = cygnus_ssp_suspend, \
|
.suspend = cygnus_ssp_suspend, \
|
||||||
|
@ -1174,7 +1168,7 @@ static const struct snd_soc_dai_driver cygnus_spdif_dai_info = {
|
||||||
.formats = SNDRV_PCM_FMTBIT_S16_LE |
|
.formats = SNDRV_PCM_FMTBIT_S16_LE |
|
||||||
SNDRV_PCM_FMTBIT_S32_LE,
|
SNDRV_PCM_FMTBIT_S32_LE,
|
||||||
},
|
},
|
||||||
.ops = &cygnus_ssp_dai_ops,
|
.ops = &cygnus_spdif_dai_ops,
|
||||||
.suspend = cygnus_ssp_suspend,
|
.suspend = cygnus_ssp_suspend,
|
||||||
.resume = cygnus_ssp_resume,
|
.resume = cygnus_ssp_resume,
|
||||||
};
|
};
|
||||||
|
|
|
@ -1220,6 +1220,7 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||||
struct snd_soc_codec *codec = codec_dai->codec;
|
struct snd_soc_codec *codec = codec_dai->codec;
|
||||||
struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
|
struct da7213_priv *da7213 = snd_soc_codec_get_drvdata(codec);
|
||||||
u8 dai_clk_mode = 0, dai_ctrl = 0;
|
u8 dai_clk_mode = 0, dai_ctrl = 0;
|
||||||
|
u8 dai_offset = 0;
|
||||||
|
|
||||||
/* Set master/slave mode */
|
/* Set master/slave mode */
|
||||||
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
|
||||||
|
@ -1234,17 +1235,46 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set clock normal/inverted */
|
/* Set clock normal/inverted */
|
||||||
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
|
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
||||||
case SND_SOC_DAIFMT_NB_NF:
|
case SND_SOC_DAIFMT_I2S:
|
||||||
|
case SND_SOC_DAIFMT_LEFT_J:
|
||||||
|
case SND_SOC_DAIFMT_RIGHT_J:
|
||||||
|
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
|
||||||
|
case SND_SOC_DAIFMT_NB_NF:
|
||||||
|
break;
|
||||||
|
case SND_SOC_DAIFMT_NB_IF:
|
||||||
|
dai_clk_mode |= DA7213_DAI_WCLK_POL_INV;
|
||||||
|
break;
|
||||||
|
case SND_SOC_DAIFMT_IB_NF:
|
||||||
|
dai_clk_mode |= DA7213_DAI_CLK_POL_INV;
|
||||||
|
break;
|
||||||
|
case SND_SOC_DAIFMT_IB_IF:
|
||||||
|
dai_clk_mode |= DA7213_DAI_WCLK_POL_INV |
|
||||||
|
DA7213_DAI_CLK_POL_INV;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case SND_SOC_DAIFMT_NB_IF:
|
case SND_SOC_DAI_FORMAT_DSP_A:
|
||||||
dai_clk_mode |= DA7213_DAI_WCLK_POL_INV;
|
case SND_SOC_DAI_FORMAT_DSP_B:
|
||||||
break;
|
/* The bclk is inverted wrt ASoC conventions */
|
||||||
case SND_SOC_DAIFMT_IB_NF:
|
switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
|
||||||
dai_clk_mode |= DA7213_DAI_CLK_POL_INV;
|
case SND_SOC_DAIFMT_NB_NF:
|
||||||
break;
|
dai_clk_mode |= DA7213_DAI_CLK_POL_INV;
|
||||||
case SND_SOC_DAIFMT_IB_IF:
|
break;
|
||||||
dai_clk_mode |= DA7213_DAI_WCLK_POL_INV | DA7213_DAI_CLK_POL_INV;
|
case SND_SOC_DAIFMT_NB_IF:
|
||||||
|
dai_clk_mode |= DA7213_DAI_WCLK_POL_INV |
|
||||||
|
DA7213_DAI_CLK_POL_INV;
|
||||||
|
break;
|
||||||
|
case SND_SOC_DAIFMT_IB_NF:
|
||||||
|
break;
|
||||||
|
case SND_SOC_DAIFMT_IB_IF:
|
||||||
|
dai_clk_mode |= DA7213_DAI_WCLK_POL_INV;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -1261,6 +1291,13 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||||
case SND_SOC_DAIFMT_RIGHT_J:
|
case SND_SOC_DAIFMT_RIGHT_J:
|
||||||
dai_ctrl |= DA7213_DAI_FORMAT_RIGHT_J;
|
dai_ctrl |= DA7213_DAI_FORMAT_RIGHT_J;
|
||||||
break;
|
break;
|
||||||
|
case SND_SOC_DAI_FORMAT_DSP_A: /* L data MSB after FRM LRC */
|
||||||
|
dai_ctrl |= DA7213_DAI_FORMAT_DSP;
|
||||||
|
dai_offset = 1;
|
||||||
|
break;
|
||||||
|
case SND_SOC_DAI_FORMAT_DSP_B: /* L data MSB during FRM LRC */
|
||||||
|
dai_ctrl |= DA7213_DAI_FORMAT_DSP;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -1271,6 +1308,7 @@ static int da7213_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
|
||||||
snd_soc_write(codec, DA7213_DAI_CLK_MODE, dai_clk_mode);
|
snd_soc_write(codec, DA7213_DAI_CLK_MODE, dai_clk_mode);
|
||||||
snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_FORMAT_MASK,
|
snd_soc_update_bits(codec, DA7213_DAI_CTRL, DA7213_DAI_FORMAT_MASK,
|
||||||
dai_ctrl);
|
dai_ctrl);
|
||||||
|
snd_soc_write(codec, DA7213_DAI_OFFSET, dai_offset);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,6 +188,7 @@
|
||||||
#define DA7213_DAI_FORMAT_I2S_MODE (0x0 << 0)
|
#define DA7213_DAI_FORMAT_I2S_MODE (0x0 << 0)
|
||||||
#define DA7213_DAI_FORMAT_LEFT_J (0x1 << 0)
|
#define DA7213_DAI_FORMAT_LEFT_J (0x1 << 0)
|
||||||
#define DA7213_DAI_FORMAT_RIGHT_J (0x2 << 0)
|
#define DA7213_DAI_FORMAT_RIGHT_J (0x2 << 0)
|
||||||
|
#define DA7213_DAI_FORMAT_DSP (0x3 << 0)
|
||||||
#define DA7213_DAI_FORMAT_MASK (0x3 << 0)
|
#define DA7213_DAI_FORMAT_MASK (0x3 << 0)
|
||||||
#define DA7213_DAI_WORD_LENGTH_S16_LE (0x0 << 2)
|
#define DA7213_DAI_WORD_LENGTH_S16_LE (0x0 << 2)
|
||||||
#define DA7213_DAI_WORD_LENGTH_S20_LE (0x1 << 2)
|
#define DA7213_DAI_WORD_LENGTH_S20_LE (0x1 << 2)
|
||||||
|
|
|
@ -1721,7 +1721,8 @@ static int davinci_mcasp_get_dma_type(struct davinci_mcasp *mcasp)
|
||||||
PTR_ERR(chan));
|
PTR_ERR(chan));
|
||||||
return PTR_ERR(chan);
|
return PTR_ERR(chan);
|
||||||
}
|
}
|
||||||
BUG_ON(!chan->device || !chan->device->dev);
|
if (WARN_ON(!chan->device || !chan->device->dev))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (chan->device->dev->of_node)
|
if (chan->device->dev->of_node)
|
||||||
ret = of_property_read_string(chan->device->dev->of_node,
|
ret = of_property_read_string(chan->device->dev->of_node,
|
||||||
|
@ -1867,6 +1868,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
||||||
if (irq >= 0) {
|
if (irq >= 0) {
|
||||||
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_common",
|
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_common",
|
||||||
dev_name(&pdev->dev));
|
dev_name(&pdev->dev));
|
||||||
|
if (!irq_name) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||||
davinci_mcasp_common_irq_handler,
|
davinci_mcasp_common_irq_handler,
|
||||||
IRQF_ONESHOT | IRQF_SHARED,
|
IRQF_ONESHOT | IRQF_SHARED,
|
||||||
|
@ -1884,6 +1889,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
||||||
if (irq >= 0) {
|
if (irq >= 0) {
|
||||||
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_rx",
|
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_rx",
|
||||||
dev_name(&pdev->dev));
|
dev_name(&pdev->dev));
|
||||||
|
if (!irq_name) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||||
davinci_mcasp_rx_irq_handler,
|
davinci_mcasp_rx_irq_handler,
|
||||||
IRQF_ONESHOT, irq_name, mcasp);
|
IRQF_ONESHOT, irq_name, mcasp);
|
||||||
|
@ -1899,6 +1908,10 @@ static int davinci_mcasp_probe(struct platform_device *pdev)
|
||||||
if (irq >= 0) {
|
if (irq >= 0) {
|
||||||
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_tx",
|
irq_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s_tx",
|
||||||
dev_name(&pdev->dev));
|
dev_name(&pdev->dev));
|
||||||
|
if (!irq_name) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
|
||||||
davinci_mcasp_tx_irq_handler,
|
davinci_mcasp_tx_irq_handler,
|
||||||
IRQF_ONESHOT, irq_name, mcasp);
|
IRQF_ONESHOT, irq_name, mcasp);
|
||||||
|
|
|
@ -2800,7 +2800,7 @@ EXPORT_SYMBOL_GPL(snd_soc_dai_set_bclk_ratio);
|
||||||
/**
|
/**
|
||||||
* snd_soc_dai_set_fmt - configure DAI hardware audio format.
|
* snd_soc_dai_set_fmt - configure DAI hardware audio format.
|
||||||
* @dai: DAI
|
* @dai: DAI
|
||||||
* @fmt: SND_SOC_DAIFMT_ format value.
|
* @fmt: SND_SOC_DAIFMT_* format value.
|
||||||
*
|
*
|
||||||
* Configures the DAI hardware format and clocking.
|
* Configures the DAI hardware format and clocking.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue