forked from Minki/linux
Merge remote-tracking branches 'asoc/topic/jz4740', 'asoc/topic/kirkwood', 'asoc/topic/mtk', 'asoc/topic/multi' and 'asoc/topic/mxs' into asoc-next
This commit is contained in:
commit
9abbe73e7d
@ -485,6 +485,7 @@ static const struct of_device_id jz4740_of_matches[] = {
|
||||
{ .compatible = "ingenic,jz4780-i2s", .data = (void *)JZ_I2S_JZ4780 },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, jz4740_of_matches);
|
||||
#endif
|
||||
|
||||
static int jz4740_i2s_dev_probe(struct platform_device *pdev)
|
||||
|
@ -130,6 +130,7 @@ static const struct of_device_id a370db_dt_ids[] = {
|
||||
{ .compatible = "marvell,a370db-audio" },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, a370db_dt_ids);
|
||||
|
||||
static struct platform_driver a370db_driver = {
|
||||
.driver = {
|
||||
|
@ -179,21 +179,13 @@ static int mt8173_max98090_dev_probe(struct platform_device *pdev)
|
||||
}
|
||||
card->dev = &pdev->dev;
|
||||
|
||||
ret = snd_soc_register_card(card);
|
||||
ret = devm_snd_soc_register_card(&pdev->dev, card);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mt8173_max98090_dev_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
|
||||
snd_soc_unregister_card(card);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id mt8173_max98090_dt_match[] = {
|
||||
{ .compatible = "mediatek,mt8173-max98090", },
|
||||
{ }
|
||||
@ -209,7 +201,6 @@ static struct platform_driver mt8173_max98090_driver = {
|
||||
#endif
|
||||
},
|
||||
.probe = mt8173_max98090_dev_probe,
|
||||
.remove = mt8173_max98090_dev_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(mt8173_max98090_driver);
|
||||
|
@ -246,21 +246,13 @@ static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev)
|
||||
card->dev = &pdev->dev;
|
||||
platform_set_drvdata(pdev, card);
|
||||
|
||||
ret = snd_soc_register_card(card);
|
||||
ret = devm_snd_soc_register_card(&pdev->dev, card);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
|
||||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int mt8173_rt5650_rt5676_dev_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
|
||||
snd_soc_unregister_card(card);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id mt8173_rt5650_rt5676_dt_match[] = {
|
||||
{ .compatible = "mediatek,mt8173-rt5650-rt5676", },
|
||||
{ }
|
||||
@ -276,7 +268,6 @@ static struct platform_driver mt8173_rt5650_rt5676_driver = {
|
||||
#endif
|
||||
},
|
||||
.probe = mt8173_rt5650_rt5676_dev_probe,
|
||||
.remove = mt8173_rt5650_rt5676_dev_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(mt8173_rt5650_rt5676_driver);
|
||||
|
@ -142,7 +142,7 @@ static int mxs_sgtl5000_probe(struct platform_device *pdev)
|
||||
card->dev = &pdev->dev;
|
||||
platform_set_drvdata(pdev, card);
|
||||
|
||||
ret = snd_soc_register_card(card);
|
||||
ret = devm_snd_soc_register_card(&pdev->dev, card);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
|
||||
ret);
|
||||
@ -154,12 +154,8 @@ static int mxs_sgtl5000_probe(struct platform_device *pdev)
|
||||
|
||||
static int mxs_sgtl5000_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct snd_soc_card *card = platform_get_drvdata(pdev);
|
||||
|
||||
mxs_saif_put_mclk(0);
|
||||
|
||||
snd_soc_unregister_card(card);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -34,6 +34,24 @@
|
||||
|
||||
#define DPCM_MAX_BE_USERS 8
|
||||
|
||||
/*
|
||||
* snd_soc_dai_stream_valid() - check if a DAI supports the given stream
|
||||
*
|
||||
* Returns true if the DAI supports the indicated stream type.
|
||||
*/
|
||||
static bool snd_soc_dai_stream_valid(struct snd_soc_dai *dai, int stream)
|
||||
{
|
||||
struct snd_soc_pcm_stream *codec_stream;
|
||||
|
||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
codec_stream = &dai->driver->playback;
|
||||
else
|
||||
codec_stream = &dai->driver->capture;
|
||||
|
||||
/* If the codec specifies any rate at all, it supports the stream. */
|
||||
return codec_stream->rates;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_soc_runtime_activate() - Increment active count for PCM runtime components
|
||||
* @rtd: ASoC PCM runtime that is activated
|
||||
@ -371,6 +389,20 @@ static void soc_pcm_init_runtime_hw(struct snd_pcm_substream *substream)
|
||||
|
||||
/* first calculate min/max only for CODECs in the DAI link */
|
||||
for (i = 0; i < rtd->num_codecs; i++) {
|
||||
|
||||
/*
|
||||
* Skip CODECs which don't support the current stream type.
|
||||
* Otherwise, since the rate, channel, and format values will
|
||||
* zero in that case, we would have no usable settings left,
|
||||
* causing the resulting setup to fail.
|
||||
* At least one CODEC should match, otherwise we should have
|
||||
* bailed out on a higher level, since there would be no
|
||||
* CODEC to support the transfer direction in that case.
|
||||
*/
|
||||
if (!snd_soc_dai_stream_valid(rtd->codec_dais[i],
|
||||
substream->stream))
|
||||
continue;
|
||||
|
||||
codec_dai_drv = rtd->codec_dais[i]->driver;
|
||||
if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
|
||||
codec_stream = &codec_dai_drv->playback;
|
||||
@ -827,6 +859,23 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream,
|
||||
struct snd_soc_dai *codec_dai = rtd->codec_dais[i];
|
||||
struct snd_pcm_hw_params codec_params;
|
||||
|
||||
/*
|
||||
* Skip CODECs which don't support the current stream type,
|
||||
* the idea being that if a CODEC is not used for the currently
|
||||
* set up transfer direction, it should not need to be
|
||||
* configured, especially since the configuration used might
|
||||
* not even be supported by that CODEC. There may be cases
|
||||
* however where a CODEC needs to be set up although it is
|
||||
* actually not being used for the transfer, e.g. if a
|
||||
* capture-only CODEC is acting as an LRCLK and/or BCLK master
|
||||
* for the DAI link including a playback-only CODEC.
|
||||
* If this becomes necessary, we will have to augment the
|
||||
* machine driver setup with information on how to act, so
|
||||
* we can do the right thing here.
|
||||
*/
|
||||
if (!snd_soc_dai_stream_valid(codec_dai, substream->stream))
|
||||
continue;
|
||||
|
||||
/* copy params for each codec */
|
||||
codec_params = *params;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user