forked from Minki/linux
Merge branch 'topic/pcm-list' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-intel
This commit is contained in:
commit
b590d5e2ca
@ -1106,7 +1106,7 @@ struct snd_soc_card {
|
|||||||
/* CPU <--> Codec DAI links */
|
/* CPU <--> Codec DAI links */
|
||||||
struct snd_soc_dai_link *dai_link;
|
struct snd_soc_dai_link *dai_link;
|
||||||
int num_links;
|
int num_links;
|
||||||
struct snd_soc_pcm_runtime *rtd;
|
struct list_head rtd_list;
|
||||||
int num_rtd;
|
int num_rtd;
|
||||||
|
|
||||||
/* optional codec specific configuration */
|
/* optional codec specific configuration */
|
||||||
@ -1201,6 +1201,9 @@ struct snd_soc_pcm_runtime {
|
|||||||
struct dentry *debugfs_dpcm_root;
|
struct dentry *debugfs_dpcm_root;
|
||||||
struct dentry *debugfs_dpcm_state;
|
struct dentry *debugfs_dpcm_state;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
unsigned int num; /* 0-based and monotonic increasing */
|
||||||
|
struct list_head list; /* rtd list of the soc card */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* mixer control */
|
/* mixer control */
|
||||||
|
@ -222,12 +222,15 @@ static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card,
|
|||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
|
struct fsl_asoc_card_priv *priv = snd_soc_card_get_drvdata(card);
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *codec_dai;
|
||||||
struct codec_priv *codec_priv = &priv->codec_priv;
|
struct codec_priv *codec_priv = &priv->codec_priv;
|
||||||
struct device *dev = card->dev;
|
struct device *dev = card->dev;
|
||||||
unsigned int pll_out;
|
unsigned int pll_out;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
if (dapm->dev != codec_dai->dev)
|
if (dapm->dev != codec_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -69,13 +69,16 @@ static int imx_wm8962_set_bias_level(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *codec_dai;
|
||||||
struct imx_priv *priv = &card_priv;
|
struct imx_priv *priv = &card_priv;
|
||||||
struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card);
|
struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card);
|
||||||
struct device *dev = &priv->pdev->dev;
|
struct device *dev = &priv->pdev->dev;
|
||||||
unsigned int pll_out;
|
unsigned int pll_out;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
if (dapm->dev != codec_dai->dev)
|
if (dapm->dev != codec_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -135,12 +138,15 @@ static int imx_wm8962_set_bias_level(struct snd_soc_card *card,
|
|||||||
|
|
||||||
static int imx_wm8962_late_probe(struct snd_soc_card *card)
|
static int imx_wm8962_late_probe(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *codec_dai;
|
||||||
struct imx_priv *priv = &card_priv;
|
struct imx_priv *priv = &card_priv;
|
||||||
struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card);
|
struct imx_wm8962_data *data = snd_soc_card_get_drvdata(card);
|
||||||
struct device *dev = &priv->pdev->dev;
|
struct device *dev = &priv->pdev->dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
|
ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
|
||||||
data->clk_frequency, SND_SOC_CLOCK_IN);
|
data->clk_frequency, SND_SOC_CLOCK_IN);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -45,7 +45,7 @@ static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
|
|||||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
|
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||||
struct simple_dai_props *dai_props =
|
struct simple_dai_props *dai_props =
|
||||||
&priv->dai_props[rtd - rtd->card->rtd];
|
&priv->dai_props[rtd->num];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = clk_prepare_enable(dai_props->cpu_dai.clk);
|
ret = clk_prepare_enable(dai_props->cpu_dai.clk);
|
||||||
@ -64,7 +64,7 @@ static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
|
|||||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
|
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||||
struct simple_dai_props *dai_props =
|
struct simple_dai_props *dai_props =
|
||||||
&priv->dai_props[rtd - rtd->card->rtd];
|
&priv->dai_props[rtd->num];
|
||||||
|
|
||||||
clk_disable_unprepare(dai_props->cpu_dai.clk);
|
clk_disable_unprepare(dai_props->cpu_dai.clk);
|
||||||
|
|
||||||
@ -78,8 +78,7 @@ static int asoc_simple_card_hw_params(struct snd_pcm_substream *substream,
|
|||||||
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
||||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
|
struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||||
struct simple_dai_props *dai_props =
|
struct simple_dai_props *dai_props = &priv->dai_props[rtd->num];
|
||||||
&priv->dai_props[rtd - rtd->card->rtd];
|
|
||||||
unsigned int mclk, mclk_fs = 0;
|
unsigned int mclk, mclk_fs = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -174,10 +173,9 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
|
|||||||
struct snd_soc_dai *codec = rtd->codec_dai;
|
struct snd_soc_dai *codec = rtd->codec_dai;
|
||||||
struct snd_soc_dai *cpu = rtd->cpu_dai;
|
struct snd_soc_dai *cpu = rtd->cpu_dai;
|
||||||
struct simple_dai_props *dai_props;
|
struct simple_dai_props *dai_props;
|
||||||
int num, ret;
|
int ret;
|
||||||
|
|
||||||
num = rtd - rtd->card->rtd;
|
dai_props = &priv->dai_props[rtd->num];
|
||||||
dai_props = &priv->dai_props[num];
|
|
||||||
ret = __asoc_simple_card_dai_init(codec, &dai_props->codec_dai);
|
ret = __asoc_simple_card_dai_init(codec, &dai_props->codec_dai);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -760,15 +760,15 @@ static int sst_platform_remove(struct platform_device *pdev)
|
|||||||
static int sst_soc_prepare(struct device *dev)
|
static int sst_soc_prepare(struct device *dev)
|
||||||
{
|
{
|
||||||
struct sst_data *drv = dev_get_drvdata(dev);
|
struct sst_data *drv = dev_get_drvdata(dev);
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
/* suspend all pcms first */
|
/* suspend all pcms first */
|
||||||
snd_soc_suspend(drv->soc_card->dev);
|
snd_soc_suspend(drv->soc_card->dev);
|
||||||
snd_soc_poweroff(drv->soc_card->dev);
|
snd_soc_poweroff(drv->soc_card->dev);
|
||||||
|
|
||||||
/* set the SSPs to idle */
|
/* set the SSPs to idle */
|
||||||
for (i = 0; i < drv->soc_card->num_rtd; i++) {
|
list_for_each_entry(rtd, &drv->soc_card->rtd_list, list) {
|
||||||
struct snd_soc_dai *dai = drv->soc_card->rtd[i].cpu_dai;
|
struct snd_soc_dai *dai = rtd->cpu_dai;
|
||||||
|
|
||||||
if (dai->active) {
|
if (dai->active) {
|
||||||
send_ssp_cmd(dai, dai->name, 0);
|
send_ssp_cmd(dai, dai->name, 0);
|
||||||
@ -782,11 +782,11 @@ static int sst_soc_prepare(struct device *dev)
|
|||||||
static void sst_soc_complete(struct device *dev)
|
static void sst_soc_complete(struct device *dev)
|
||||||
{
|
{
|
||||||
struct sst_data *drv = dev_get_drvdata(dev);
|
struct sst_data *drv = dev_get_drvdata(dev);
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
/* restart SSPs */
|
/* restart SSPs */
|
||||||
for (i = 0; i < drv->soc_card->num_rtd; i++) {
|
list_for_each_entry(rtd, &drv->soc_card->rtd_list, list) {
|
||||||
struct snd_soc_dai *dai = drv->soc_card->rtd[i].cpu_dai;
|
struct snd_soc_dai *dai = rtd->cpu_dai;
|
||||||
|
|
||||||
if (dai->active) {
|
if (dai->active) {
|
||||||
sst_handle_vb_timer(dai, true);
|
sst_handle_vb_timer(dai, true);
|
||||||
|
@ -41,12 +41,9 @@ struct cht_mc_private {
|
|||||||
|
|
||||||
static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
|
static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_pcm_runtime *rtd;
|
|
||||||
|
|
||||||
rtd = card->rtd + i;
|
|
||||||
if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
|
if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
|
||||||
strlen(CHT_CODEC_DAI)))
|
strlen(CHT_CODEC_DAI)))
|
||||||
return rtd->codec_dai;
|
return rtd->codec_dai;
|
||||||
|
@ -47,12 +47,9 @@ struct cht_mc_private {
|
|||||||
|
|
||||||
static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
|
static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_pcm_runtime *rtd;
|
|
||||||
|
|
||||||
rtd = card->rtd + i;
|
|
||||||
if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
|
if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
|
||||||
strlen(CHT_CODEC_DAI)))
|
strlen(CHT_CODEC_DAI)))
|
||||||
return rtd->codec_dai;
|
return rtd->codec_dai;
|
||||||
|
@ -46,12 +46,9 @@ static struct snd_soc_jack_pin cht_bsw_headset_pins[] = {
|
|||||||
|
|
||||||
static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
|
static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_pcm_runtime *rtd;
|
|
||||||
|
|
||||||
rtd = card->rtd + i;
|
|
||||||
if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
|
if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
|
||||||
strlen(CHT_CODEC_DAI)))
|
strlen(CHT_CODEC_DAI)))
|
||||||
return rtd->codec_dai;
|
return rtd->codec_dai;
|
||||||
|
@ -81,8 +81,12 @@ static int rear_amp_power(struct snd_soc_codec *codec, int power)
|
|||||||
static int rear_amp_event(struct snd_soc_dapm_widget *widget,
|
static int rear_amp_event(struct snd_soc_dapm_widget *widget,
|
||||||
struct snd_kcontrol *kctl, int event)
|
struct snd_kcontrol *kctl, int event)
|
||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = widget->dapm->card->rtd[0].codec;
|
struct snd_soc_card *card = widget->dapm->card;
|
||||||
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_codec *codec;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec = rtd->codec;
|
||||||
return rear_amp_power(codec, SND_SOC_DAPM_EVENT_ON(event));
|
return rear_amp_power(codec, SND_SOC_DAPM_EVENT_ON(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,11 +58,16 @@ static int bells_set_bias_level(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_codec *codec = codec_dai->codec;
|
struct snd_soc_dai *codec_dai;
|
||||||
|
struct snd_soc_codec *codec;
|
||||||
struct bells_drvdata *bells = card->drvdata;
|
struct bells_drvdata *bells = card->drvdata;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
codec = codec_dai->codec;
|
||||||
|
|
||||||
if (dapm->dev != codec_dai->dev)
|
if (dapm->dev != codec_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -99,11 +104,16 @@ static int bells_set_bias_level_post(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_codec *codec = codec_dai->codec;
|
struct snd_soc_dai *codec_dai;
|
||||||
|
struct snd_soc_codec *codec;
|
||||||
struct bells_drvdata *bells = card->drvdata;
|
struct bells_drvdata *bells = card->drvdata;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
codec = codec_dai->codec;
|
||||||
|
|
||||||
if (dapm->dev != codec_dai->dev)
|
if (dapm->dev != codec_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -137,14 +147,22 @@ static int bells_set_bias_level_post(struct snd_soc_card *card,
|
|||||||
static int bells_late_probe(struct snd_soc_card *card)
|
static int bells_late_probe(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct bells_drvdata *bells = card->drvdata;
|
struct bells_drvdata *bells = card->drvdata;
|
||||||
struct snd_soc_codec *wm0010 = card->rtd[DAI_AP_DSP].codec;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_codec *codec = card->rtd[DAI_DSP_CODEC].codec;
|
struct snd_soc_codec *wm0010;
|
||||||
struct snd_soc_dai *aif1_dai = card->rtd[DAI_DSP_CODEC].codec_dai;
|
struct snd_soc_codec *codec;
|
||||||
|
struct snd_soc_dai *aif1_dai;
|
||||||
struct snd_soc_dai *aif2_dai;
|
struct snd_soc_dai *aif2_dai;
|
||||||
struct snd_soc_dai *aif3_dai;
|
struct snd_soc_dai *aif3_dai;
|
||||||
struct snd_soc_dai *wm9081_dai;
|
struct snd_soc_dai *wm9081_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_AP_DSP].name);
|
||||||
|
wm0010 = rtd->codec;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_DSP_CODEC].name);
|
||||||
|
codec = rtd->codec;
|
||||||
|
aif1_dai = rtd->codec_dai;
|
||||||
|
|
||||||
ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK,
|
ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK,
|
||||||
ARIZONA_CLK_SRC_FLL1,
|
ARIZONA_CLK_SRC_FLL1,
|
||||||
bells->sysclk_rate,
|
bells->sysclk_rate,
|
||||||
@ -181,7 +199,8 @@ static int bells_late_probe(struct snd_soc_card *card)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
aif2_dai = card->rtd[DAI_CODEC_CP].cpu_dai;
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_CODEC_CP].name);
|
||||||
|
aif2_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0);
|
ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
@ -192,8 +211,9 @@ static int bells_late_probe(struct snd_soc_card *card)
|
|||||||
if (card->num_rtd == DAI_CODEC_SUB)
|
if (card->num_rtd == DAI_CODEC_SUB)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
aif3_dai = card->rtd[DAI_CODEC_SUB].cpu_dai;
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[DAI_CODEC_SUB].name);
|
||||||
wm9081_dai = card->rtd[DAI_CODEC_SUB].codec_dai;
|
aif3_dai = rtd->cpu_dai;
|
||||||
|
wm9081_dai = rtd->codec_dai;
|
||||||
|
|
||||||
ret = snd_soc_dai_set_sysclk(aif3_dai, ARIZONA_CLK_SYSCLK, 0, 0);
|
ret = snd_soc_dai_set_sysclk(aif3_dai, ARIZONA_CLK_SYSCLK, 0, 0);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
@ -23,9 +23,13 @@ static int littlemill_set_bias_level(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *aif1_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
aif1_dai = rtd->codec_dai;
|
||||||
|
|
||||||
if (dapm->dev != aif1_dai->dev)
|
if (dapm->dev != aif1_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -66,9 +70,13 @@ static int littlemill_set_bias_level_post(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *aif1_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
aif1_dai = rtd->codec_dai;
|
||||||
|
|
||||||
if (dapm->dev != aif1_dai->dev)
|
if (dapm->dev != aif1_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -168,9 +176,13 @@ static int bbclk_ev(struct snd_soc_dapm_widget *w,
|
|||||||
struct snd_kcontrol *kcontrol, int event)
|
struct snd_kcontrol *kcontrol, int event)
|
||||||
{
|
{
|
||||||
struct snd_soc_card *card = w->dapm->card;
|
struct snd_soc_card *card = w->dapm->card;
|
||||||
struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *aif2_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
|
||||||
|
aif2_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case SND_SOC_DAPM_PRE_PMU:
|
case SND_SOC_DAPM_PRE_PMU:
|
||||||
ret = snd_soc_dai_set_pll(aif2_dai, WM8994_FLL2,
|
ret = snd_soc_dai_set_pll(aif2_dai, WM8994_FLL2,
|
||||||
@ -245,11 +257,19 @@ static struct snd_soc_jack littlemill_headset;
|
|||||||
|
|
||||||
static int littlemill_late_probe(struct snd_soc_card *card)
|
static int littlemill_late_probe(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = card->rtd[0].codec;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_dai *aif1_dai = card->rtd[0].codec_dai;
|
struct snd_soc_codec *codec;
|
||||||
struct snd_soc_dai *aif2_dai = card->rtd[1].cpu_dai;
|
struct snd_soc_dai *aif1_dai;
|
||||||
|
struct snd_soc_dai *aif2_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec = rtd->codec;
|
||||||
|
aif1_dai = rtd->codec_dai;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
|
||||||
|
aif2_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
ret = snd_soc_dai_set_sysclk(aif1_dai, WM8994_SYSCLK_MCLK2,
|
ret = snd_soc_dai_set_sysclk(aif1_dai, WM8994_SYSCLK_MCLK2,
|
||||||
32768, SND_SOC_CLOCK_IN);
|
32768, SND_SOC_CLOCK_IN);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -25,10 +25,15 @@ static struct snd_soc_dai_link odroidx2_dai[];
|
|||||||
|
|
||||||
static int odroidx2_late_probe(struct snd_soc_card *card)
|
static int odroidx2_late_probe(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_dai *cpu_dai = card->rtd[0].cpu_dai;
|
struct snd_soc_dai *codec_dai;
|
||||||
|
struct snd_soc_dai *cpu_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
cpu_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
ret = snd_soc_dai_set_sysclk(codec_dai, 0, MAX98090_MCLK,
|
ret = snd_soc_dai_set_sysclk(codec_dai, 0, MAX98090_MCLK,
|
||||||
SND_SOC_CLOCK_IN);
|
SND_SOC_CLOCK_IN);
|
||||||
|
|
||||||
|
@ -35,10 +35,15 @@ static struct snd_soc_dai_link snow_dai[] = {
|
|||||||
|
|
||||||
static int snow_late_probe(struct snd_soc_card *card)
|
static int snow_late_probe(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_dai *cpu_dai = card->rtd[0].cpu_dai;
|
struct snd_soc_dai *codec_dai;
|
||||||
|
struct snd_soc_dai *cpu_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
cpu_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
/* Set the MCLK rate for the codec */
|
/* Set the MCLK rate for the codec */
|
||||||
ret = snd_soc_dai_set_sysclk(codec_dai, 0,
|
ret = snd_soc_dai_set_sysclk(codec_dai, 0,
|
||||||
FIN_PLL_RATE, SND_SOC_CLOCK_IN);
|
FIN_PLL_RATE, SND_SOC_CLOCK_IN);
|
||||||
|
@ -25,9 +25,13 @@ static int speyside_set_bias_level(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[1].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *codec_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
|
||||||
if (dapm->dev != codec_dai->dev)
|
if (dapm->dev != codec_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -57,9 +61,13 @@ static int speyside_set_bias_level_post(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[1].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *codec_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[1].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
|
||||||
if (dapm->dev != codec_dai->dev)
|
if (dapm->dev != codec_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -23,9 +23,13 @@ static int tobermory_set_bias_level(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *codec_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
|
||||||
if (dapm->dev != codec_dai->dev)
|
if (dapm->dev != codec_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -62,9 +66,13 @@ static int tobermory_set_bias_level_post(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_context *dapm,
|
struct snd_soc_dapm_context *dapm,
|
||||||
enum snd_soc_bias_level level)
|
enum snd_soc_bias_level level)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
struct snd_soc_dai *codec_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
|
||||||
if (dapm->dev != codec_dai->dev)
|
if (dapm->dev != codec_dai->dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -170,10 +178,15 @@ static struct snd_soc_jack_pin tobermory_headset_pins[] = {
|
|||||||
|
|
||||||
static int tobermory_late_probe(struct snd_soc_card *card)
|
static int tobermory_late_probe(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_codec *codec = card->rtd[0].codec;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_dai *codec_dai = card->rtd[0].codec_dai;
|
struct snd_soc_codec *codec;
|
||||||
|
struct snd_soc_dai *codec_dai;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
|
codec = rtd->codec;
|
||||||
|
codec_dai = rtd->codec_dai;
|
||||||
|
|
||||||
ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
|
ret = snd_soc_dai_set_sysclk(codec_dai, WM8962_SYSCLK_MCLK,
|
||||||
32768, SND_SOC_CLOCK_IN);
|
32768, SND_SOC_CLOCK_IN);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -1040,7 +1040,7 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod,
|
|||||||
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
||||||
.name = name,
|
.name = name,
|
||||||
.info = rsnd_kctrl_info,
|
.info = rsnd_kctrl_info,
|
||||||
.index = rtd - soc_card->rtd,
|
.index = rtd->num,
|
||||||
.get = rsnd_kctrl_get,
|
.get = rsnd_kctrl_get,
|
||||||
.put = rsnd_kctrl_put,
|
.put = rsnd_kctrl_put,
|
||||||
.private_value = (unsigned long)cfg,
|
.private_value = (unsigned long)cfg,
|
||||||
|
@ -75,7 +75,7 @@ static int rsrc_card_startup(struct snd_pcm_substream *substream)
|
|||||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||||
struct rsrc_card_dai *dai_props =
|
struct rsrc_card_dai *dai_props =
|
||||||
rsrc_priv_to_props(priv, rtd - rtd->card->rtd);
|
rsrc_priv_to_props(priv, rtd->num);
|
||||||
|
|
||||||
return clk_prepare_enable(dai_props->clk);
|
return clk_prepare_enable(dai_props->clk);
|
||||||
}
|
}
|
||||||
@ -85,7 +85,7 @@ static void rsrc_card_shutdown(struct snd_pcm_substream *substream)
|
|||||||
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
struct snd_soc_pcm_runtime *rtd = substream->private_data;
|
||||||
struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
struct rsrc_card_priv *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||||
struct rsrc_card_dai *dai_props =
|
struct rsrc_card_dai *dai_props =
|
||||||
rsrc_priv_to_props(priv, rtd - rtd->card->rtd);
|
rsrc_priv_to_props(priv, rtd->num);
|
||||||
|
|
||||||
clk_disable_unprepare(dai_props->clk);
|
clk_disable_unprepare(dai_props->clk);
|
||||||
}
|
}
|
||||||
@ -101,7 +101,7 @@ static int rsrc_card_dai_init(struct snd_soc_pcm_runtime *rtd)
|
|||||||
struct snd_soc_dai *dai;
|
struct snd_soc_dai *dai;
|
||||||
struct snd_soc_dai_link *dai_link;
|
struct snd_soc_dai_link *dai_link;
|
||||||
struct rsrc_card_dai *dai_props;
|
struct rsrc_card_dai *dai_props;
|
||||||
int num = rtd - rtd->card->rtd;
|
int num = rtd->num;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
dai_link = rsrc_priv_to_link(priv, num);
|
dai_link = rsrc_priv_to_link(priv, num);
|
||||||
|
@ -537,26 +537,75 @@ static inline void snd_soc_debugfs_exit(void)
|
|||||||
struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
|
struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
|
||||||
const char *dai_link, int stream)
|
const char *dai_link, int stream)
|
||||||
{
|
{
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
for (i = 0; i < card->num_links; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
if (card->rtd[i].dai_link->no_pcm &&
|
if (rtd->dai_link->no_pcm &&
|
||||||
!strcmp(card->rtd[i].dai_link->name, dai_link))
|
!strcmp(rtd->dai_link->name, dai_link))
|
||||||
return card->rtd[i].pcm->streams[stream].substream;
|
return rtd->pcm->streams[stream].substream;
|
||||||
}
|
}
|
||||||
dev_dbg(card->dev, "ASoC: failed to find dai link %s\n", dai_link);
|
dev_dbg(card->dev, "ASoC: failed to find dai link %s\n", dai_link);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(snd_soc_get_dai_substream);
|
EXPORT_SYMBOL_GPL(snd_soc_get_dai_substream);
|
||||||
|
|
||||||
|
static struct snd_soc_pcm_runtime *soc_new_pcm_runtime(
|
||||||
|
struct snd_soc_card *card, struct snd_soc_dai_link *dai_link)
|
||||||
|
{
|
||||||
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
|
rtd = kzalloc(sizeof(struct snd_soc_pcm_runtime), GFP_KERNEL);
|
||||||
|
if (!rtd)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
rtd->card = card;
|
||||||
|
rtd->dai_link = dai_link;
|
||||||
|
rtd->codec_dais = kzalloc(sizeof(struct snd_soc_dai *) *
|
||||||
|
dai_link->num_codecs,
|
||||||
|
GFP_KERNEL);
|
||||||
|
if (!rtd->codec_dais) {
|
||||||
|
kfree(rtd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtd;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd)
|
||||||
|
{
|
||||||
|
if (rtd && rtd->codec_dais)
|
||||||
|
kfree(rtd->codec_dais);
|
||||||
|
kfree(rtd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void soc_add_pcm_runtime(struct snd_soc_card *card,
|
||||||
|
struct snd_soc_pcm_runtime *rtd)
|
||||||
|
{
|
||||||
|
list_add_tail(&rtd->list, &card->rtd_list);
|
||||||
|
rtd->num = card->num_rtd;
|
||||||
|
card->num_rtd++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void soc_remove_pcm_runtimes(struct snd_soc_card *card)
|
||||||
|
{
|
||||||
|
struct snd_soc_pcm_runtime *rtd, *_rtd;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(rtd, _rtd, &card->rtd_list, list) {
|
||||||
|
list_del(&rtd->list);
|
||||||
|
soc_free_pcm_runtime(rtd);
|
||||||
|
}
|
||||||
|
|
||||||
|
card->num_rtd = 0;
|
||||||
|
}
|
||||||
|
|
||||||
struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
|
struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
|
||||||
const char *dai_link)
|
const char *dai_link)
|
||||||
{
|
{
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
for (i = 0; i < card->num_links; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
if (!strcmp(card->rtd[i].dai_link->name, dai_link))
|
if (!strcmp(rtd->dai_link->name, dai_link))
|
||||||
return &card->rtd[i];
|
return rtd;
|
||||||
}
|
}
|
||||||
dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link);
|
dev_dbg(card->dev, "ASoC: failed to find rtd %s\n", dai_link);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -578,7 +627,8 @@ int snd_soc_suspend(struct device *dev)
|
|||||||
{
|
{
|
||||||
struct snd_soc_card *card = dev_get_drvdata(dev);
|
struct snd_soc_card *card = dev_get_drvdata(dev);
|
||||||
struct snd_soc_codec *codec;
|
struct snd_soc_codec *codec;
|
||||||
int i, j;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* If the card is not initialized yet there is nothing to do */
|
/* If the card is not initialized yet there is nothing to do */
|
||||||
if (!card->instantiated)
|
if (!card->instantiated)
|
||||||
@ -595,13 +645,13 @@ int snd_soc_suspend(struct device *dev)
|
|||||||
snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
|
snd_power_change_state(card->snd_card, SNDRV_CTL_POWER_D3hot);
|
||||||
|
|
||||||
/* mute any active DACs */
|
/* mute any active DACs */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
|
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (j = 0; j < card->rtd[i].num_codecs; j++) {
|
for (i = 0; i < rtd->num_codecs; i++) {
|
||||||
struct snd_soc_dai *dai = card->rtd[i].codec_dais[j];
|
struct snd_soc_dai *dai = rtd->codec_dais[i];
|
||||||
struct snd_soc_dai_driver *drv = dai->driver;
|
struct snd_soc_dai_driver *drv = dai->driver;
|
||||||
|
|
||||||
if (drv->ops->digital_mute && dai->playback_active)
|
if (drv->ops->digital_mute && dai->playback_active)
|
||||||
@ -610,20 +660,20 @@ int snd_soc_suspend(struct device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* suspend all pcms */
|
/* suspend all pcms */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
snd_pcm_suspend_all(card->rtd[i].pcm);
|
snd_pcm_suspend_all(rtd->pcm);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (card->suspend_pre)
|
if (card->suspend_pre)
|
||||||
card->suspend_pre(card);
|
card->suspend_pre(card);
|
||||||
|
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (cpu_dai->driver->suspend && !cpu_dai->driver->bus_control)
|
if (cpu_dai->driver->suspend && !cpu_dai->driver->bus_control)
|
||||||
@ -631,19 +681,19 @@ int snd_soc_suspend(struct device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* close any waiting streams */
|
/* close any waiting streams */
|
||||||
for (i = 0; i < card->num_rtd; i++)
|
list_for_each_entry(rtd, &card->rtd_list, list)
|
||||||
flush_delayed_work(&card->rtd[i].delayed_work);
|
flush_delayed_work(&rtd->delayed_work);
|
||||||
|
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
|
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
snd_soc_dapm_stream_event(&card->rtd[i],
|
snd_soc_dapm_stream_event(rtd,
|
||||||
SNDRV_PCM_STREAM_PLAYBACK,
|
SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
SND_SOC_DAPM_STREAM_SUSPEND);
|
SND_SOC_DAPM_STREAM_SUSPEND);
|
||||||
|
|
||||||
snd_soc_dapm_stream_event(&card->rtd[i],
|
snd_soc_dapm_stream_event(rtd,
|
||||||
SNDRV_PCM_STREAM_CAPTURE,
|
SNDRV_PCM_STREAM_CAPTURE,
|
||||||
SND_SOC_DAPM_STREAM_SUSPEND);
|
SND_SOC_DAPM_STREAM_SUSPEND);
|
||||||
}
|
}
|
||||||
@ -690,10 +740,10 @@ int snd_soc_suspend(struct device *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (cpu_dai->driver->suspend && cpu_dai->driver->bus_control)
|
if (cpu_dai->driver->suspend && cpu_dai->driver->bus_control)
|
||||||
@ -717,8 +767,9 @@ static void soc_resume_deferred(struct work_struct *work)
|
|||||||
{
|
{
|
||||||
struct snd_soc_card *card =
|
struct snd_soc_card *card =
|
||||||
container_of(work, struct snd_soc_card, deferred_resume_work);
|
container_of(work, struct snd_soc_card, deferred_resume_work);
|
||||||
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_codec *codec;
|
struct snd_soc_codec *codec;
|
||||||
int i, j;
|
int i;
|
||||||
|
|
||||||
/* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
|
/* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
|
||||||
* so userspace apps are blocked from touching us
|
* so userspace apps are blocked from touching us
|
||||||
@ -733,10 +784,10 @@ static void soc_resume_deferred(struct work_struct *work)
|
|||||||
card->resume_pre(card);
|
card->resume_pre(card);
|
||||||
|
|
||||||
/* resume control bus DAIs */
|
/* resume control bus DAIs */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (cpu_dai->driver->resume && cpu_dai->driver->bus_control)
|
if (cpu_dai->driver->resume && cpu_dai->driver->bus_control)
|
||||||
@ -751,28 +802,28 @@ static void soc_resume_deferred(struct work_struct *work)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
|
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
snd_soc_dapm_stream_event(&card->rtd[i],
|
snd_soc_dapm_stream_event(rtd,
|
||||||
SNDRV_PCM_STREAM_PLAYBACK,
|
SNDRV_PCM_STREAM_PLAYBACK,
|
||||||
SND_SOC_DAPM_STREAM_RESUME);
|
SND_SOC_DAPM_STREAM_RESUME);
|
||||||
|
|
||||||
snd_soc_dapm_stream_event(&card->rtd[i],
|
snd_soc_dapm_stream_event(rtd,
|
||||||
SNDRV_PCM_STREAM_CAPTURE,
|
SNDRV_PCM_STREAM_CAPTURE,
|
||||||
SND_SOC_DAPM_STREAM_RESUME);
|
SND_SOC_DAPM_STREAM_RESUME);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* unmute any active DACs */
|
/* unmute any active DACs */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
|
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (j = 0; j < card->rtd[i].num_codecs; j++) {
|
for (i = 0; i < rtd->num_codecs; i++) {
|
||||||
struct snd_soc_dai *dai = card->rtd[i].codec_dais[j];
|
struct snd_soc_dai *dai = rtd->codec_dais[i];
|
||||||
struct snd_soc_dai_driver *drv = dai->driver;
|
struct snd_soc_dai_driver *drv = dai->driver;
|
||||||
|
|
||||||
if (drv->ops->digital_mute && dai->playback_active)
|
if (drv->ops->digital_mute && dai->playback_active)
|
||||||
@ -780,10 +831,10 @@ static void soc_resume_deferred(struct work_struct *work)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
|
|
||||||
if (card->rtd[i].dai_link->ignore_suspend)
|
if (rtd->dai_link->ignore_suspend)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (cpu_dai->driver->resume && !cpu_dai->driver->bus_control)
|
if (cpu_dai->driver->resume && !cpu_dai->driver->bus_control)
|
||||||
@ -808,15 +859,14 @@ int snd_soc_resume(struct device *dev)
|
|||||||
{
|
{
|
||||||
struct snd_soc_card *card = dev_get_drvdata(dev);
|
struct snd_soc_card *card = dev_get_drvdata(dev);
|
||||||
bool bus_control = false;
|
bool bus_control = false;
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
/* If the card is not initialized yet there is nothing to do */
|
/* If the card is not initialized yet there is nothing to do */
|
||||||
if (!card->instantiated)
|
if (!card->instantiated)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* activate pins from sleep state */
|
/* activate pins from sleep state */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
|
|
||||||
struct snd_soc_dai **codec_dais = rtd->codec_dais;
|
struct snd_soc_dai **codec_dais = rtd->codec_dais;
|
||||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
int j;
|
int j;
|
||||||
@ -837,8 +887,8 @@ int snd_soc_resume(struct device *dev)
|
|||||||
* have that problem and may take a substantial amount of time to resume
|
* have that problem and may take a substantial amount of time to resume
|
||||||
* due to I/O costs and anti-pop so handle them out of line.
|
* due to I/O costs and anti-pop so handle them out of line.
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
bus_control |= cpu_dai->driver->bus_control;
|
bus_control |= cpu_dai->driver->bus_control;
|
||||||
}
|
}
|
||||||
if (bus_control) {
|
if (bus_control) {
|
||||||
@ -913,16 +963,20 @@ static struct snd_soc_dai *snd_soc_find_dai(
|
|||||||
static int soc_bind_dai_link(struct snd_soc_card *card, int num)
|
static int soc_bind_dai_link(struct snd_soc_card *card, int num)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai_link *dai_link = &card->dai_link[num];
|
struct snd_soc_dai_link *dai_link = &card->dai_link[num];
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
struct snd_soc_dai_link_component *codecs = dai_link->codecs;
|
struct snd_soc_dai_link_component *codecs = dai_link->codecs;
|
||||||
struct snd_soc_dai_link_component cpu_dai_component;
|
struct snd_soc_dai_link_component cpu_dai_component;
|
||||||
struct snd_soc_dai **codec_dais = rtd->codec_dais;
|
struct snd_soc_dai **codec_dais;
|
||||||
struct snd_soc_platform *platform;
|
struct snd_soc_platform *platform;
|
||||||
const char *platform_name;
|
const char *platform_name;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
dev_dbg(card->dev, "ASoC: binding %s at idx %d\n", dai_link->name, num);
|
dev_dbg(card->dev, "ASoC: binding %s at idx %d\n", dai_link->name, num);
|
||||||
|
|
||||||
|
rtd = soc_new_pcm_runtime(card, dai_link);
|
||||||
|
if (!rtd)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
cpu_dai_component.name = dai_link->cpu_name;
|
cpu_dai_component.name = dai_link->cpu_name;
|
||||||
cpu_dai_component.of_node = dai_link->cpu_of_node;
|
cpu_dai_component.of_node = dai_link->cpu_of_node;
|
||||||
cpu_dai_component.dai_name = dai_link->cpu_dai_name;
|
cpu_dai_component.dai_name = dai_link->cpu_dai_name;
|
||||||
@ -930,18 +984,19 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
|
|||||||
if (!rtd->cpu_dai) {
|
if (!rtd->cpu_dai) {
|
||||||
dev_err(card->dev, "ASoC: CPU DAI %s not registered\n",
|
dev_err(card->dev, "ASoC: CPU DAI %s not registered\n",
|
||||||
dai_link->cpu_dai_name);
|
dai_link->cpu_dai_name);
|
||||||
return -EPROBE_DEFER;
|
goto _err_defer;
|
||||||
}
|
}
|
||||||
|
|
||||||
rtd->num_codecs = dai_link->num_codecs;
|
rtd->num_codecs = dai_link->num_codecs;
|
||||||
|
|
||||||
/* Find CODEC from registered CODECs */
|
/* Find CODEC from registered CODECs */
|
||||||
|
codec_dais = rtd->codec_dais;
|
||||||
for (i = 0; i < rtd->num_codecs; i++) {
|
for (i = 0; i < rtd->num_codecs; i++) {
|
||||||
codec_dais[i] = snd_soc_find_dai(&codecs[i]);
|
codec_dais[i] = snd_soc_find_dai(&codecs[i]);
|
||||||
if (!codec_dais[i]) {
|
if (!codec_dais[i]) {
|
||||||
dev_err(card->dev, "ASoC: CODEC DAI %s not registered\n",
|
dev_err(card->dev, "ASoC: CODEC DAI %s not registered\n",
|
||||||
codecs[i].dai_name);
|
codecs[i].dai_name);
|
||||||
return -EPROBE_DEFER;
|
goto _err_defer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -973,9 +1028,12 @@ static int soc_bind_dai_link(struct snd_soc_card *card, int num)
|
|||||||
return -EPROBE_DEFER;
|
return -EPROBE_DEFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
card->num_rtd++;
|
soc_add_pcm_runtime(card, rtd);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
_err_defer:
|
||||||
|
soc_free_pcm_runtime(rtd);
|
||||||
|
return -EPROBE_DEFER;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void soc_remove_component(struct snd_soc_component *component)
|
static void soc_remove_component(struct snd_soc_component *component)
|
||||||
@ -1014,9 +1072,9 @@ static void soc_remove_dai(struct snd_soc_dai *dai, int order)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order)
|
static void soc_remove_link_dais(struct snd_soc_card *card,
|
||||||
|
struct snd_soc_pcm_runtime *rtd, int order)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* unregister the rtd device */
|
/* unregister the rtd device */
|
||||||
@ -1032,10 +1090,9 @@ static void soc_remove_link_dais(struct snd_soc_card *card, int num, int order)
|
|||||||
soc_remove_dai(rtd->cpu_dai, order);
|
soc_remove_dai(rtd->cpu_dai, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void soc_remove_link_components(struct snd_soc_card *card, int num,
|
static void soc_remove_link_components(struct snd_soc_card *card,
|
||||||
int order)
|
struct snd_soc_pcm_runtime *rtd, int order)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
|
|
||||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
struct snd_soc_platform *platform = rtd->platform;
|
struct snd_soc_platform *platform = rtd->platform;
|
||||||
struct snd_soc_component *component;
|
struct snd_soc_component *component;
|
||||||
@ -1061,21 +1118,20 @@ static void soc_remove_link_components(struct snd_soc_card *card, int num,
|
|||||||
|
|
||||||
static void soc_remove_dai_links(struct snd_soc_card *card)
|
static void soc_remove_dai_links(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
int dai, order;
|
int order;
|
||||||
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
|
for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
|
||||||
order++) {
|
order++) {
|
||||||
for (dai = 0; dai < card->num_rtd; dai++)
|
list_for_each_entry(rtd, &card->rtd_list, list)
|
||||||
soc_remove_link_dais(card, dai, order);
|
soc_remove_link_dais(card, rtd, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
|
for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
|
||||||
order++) {
|
order++) {
|
||||||
for (dai = 0; dai < card->num_rtd; dai++)
|
list_for_each_entry(rtd, &card->rtd_list, list)
|
||||||
soc_remove_link_components(card, dai, order);
|
soc_remove_link_components(card, rtd, order);
|
||||||
}
|
}
|
||||||
|
|
||||||
card->num_rtd = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void soc_set_name_prefix(struct snd_soc_card *card,
|
static void soc_set_name_prefix(struct snd_soc_card *card,
|
||||||
@ -1220,10 +1276,10 @@ static int soc_post_component_init(struct snd_soc_pcm_runtime *rtd,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int soc_probe_link_components(struct snd_soc_card *card, int num,
|
static int soc_probe_link_components(struct snd_soc_card *card,
|
||||||
|
struct snd_soc_pcm_runtime *rtd,
|
||||||
int order)
|
int order)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
|
|
||||||
struct snd_soc_platform *platform = rtd->platform;
|
struct snd_soc_platform *platform = rtd->platform;
|
||||||
struct snd_soc_component *component;
|
struct snd_soc_component *component;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
@ -1319,15 +1375,15 @@ static int soc_link_dai_widgets(struct snd_soc_card *card,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
|
static int soc_probe_link_dais(struct snd_soc_card *card,
|
||||||
|
struct snd_soc_pcm_runtime *rtd, int order)
|
||||||
{
|
{
|
||||||
struct snd_soc_dai_link *dai_link = &card->dai_link[num];
|
struct snd_soc_dai_link *dai_link = rtd->dai_link;
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[num];
|
|
||||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
int i, ret;
|
int i, ret;
|
||||||
|
|
||||||
dev_dbg(card->dev, "ASoC: probe %s dai link %d late %d\n",
|
dev_dbg(card->dev, "ASoC: probe %s dai link %d late %d\n",
|
||||||
card->name, num, order);
|
card->name, rtd->num, order);
|
||||||
|
|
||||||
/* set default power off timeout */
|
/* set default power off timeout */
|
||||||
rtd->pmdown_time = pmdown_time;
|
rtd->pmdown_time = pmdown_time;
|
||||||
@ -1372,7 +1428,7 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
|
|||||||
|
|
||||||
if (cpu_dai->driver->compress_new) {
|
if (cpu_dai->driver->compress_new) {
|
||||||
/*create compress_device"*/
|
/*create compress_device"*/
|
||||||
ret = cpu_dai->driver->compress_new(rtd, num);
|
ret = cpu_dai->driver->compress_new(rtd, rtd->num);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(card->dev, "ASoC: can't create compress %s\n",
|
dev_err(card->dev, "ASoC: can't create compress %s\n",
|
||||||
dai_link->stream_name);
|
dai_link->stream_name);
|
||||||
@ -1382,7 +1438,7 @@ static int soc_probe_link_dais(struct snd_soc_card *card, int num, int order)
|
|||||||
|
|
||||||
if (!dai_link->params) {
|
if (!dai_link->params) {
|
||||||
/* create the pcm */
|
/* create the pcm */
|
||||||
ret = soc_new_pcm(rtd, num);
|
ret = soc_new_pcm(rtd, rtd->num);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
|
dev_err(card->dev, "ASoC: can't create pcm %s :%d\n",
|
||||||
dai_link->stream_name, ret);
|
dai_link->stream_name, ret);
|
||||||
@ -1552,6 +1608,7 @@ EXPORT_SYMBOL_GPL(snd_soc_runtime_set_dai_fmt);
|
|||||||
static int snd_soc_instantiate_card(struct snd_soc_card *card)
|
static int snd_soc_instantiate_card(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_codec *codec;
|
struct snd_soc_codec *codec;
|
||||||
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
int ret, i, order;
|
int ret, i, order;
|
||||||
|
|
||||||
mutex_lock(&client_mutex);
|
mutex_lock(&client_mutex);
|
||||||
@ -1624,8 +1681,8 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
|
|||||||
/* probe all components used by DAI links on this card */
|
/* probe all components used by DAI links on this card */
|
||||||
for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
|
for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
|
||||||
order++) {
|
order++) {
|
||||||
for (i = 0; i < card->num_links; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
ret = soc_probe_link_components(card, i, order);
|
ret = soc_probe_link_components(card, rtd, order);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(card->dev,
|
dev_err(card->dev,
|
||||||
"ASoC: failed to instantiate card %d\n",
|
"ASoC: failed to instantiate card %d\n",
|
||||||
@ -1638,8 +1695,8 @@ static int snd_soc_instantiate_card(struct snd_soc_card *card)
|
|||||||
/* probe all DAI links on this card */
|
/* probe all DAI links on this card */
|
||||||
for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
|
for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
|
||||||
order++) {
|
order++) {
|
||||||
for (i = 0; i < card->num_links; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
ret = soc_probe_link_dais(card, i, order);
|
ret = soc_probe_link_dais(card, rtd, order);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(card->dev,
|
dev_err(card->dev,
|
||||||
"ASoC: failed to instantiate card %d\n",
|
"ASoC: failed to instantiate card %d\n",
|
||||||
@ -1733,6 +1790,7 @@ card_probe_error:
|
|||||||
snd_card_free(card->snd_card);
|
snd_card_free(card->snd_card);
|
||||||
|
|
||||||
base_error:
|
base_error:
|
||||||
|
soc_remove_pcm_runtimes(card);
|
||||||
mutex_unlock(&card->mutex);
|
mutex_unlock(&card->mutex);
|
||||||
mutex_unlock(&client_mutex);
|
mutex_unlock(&client_mutex);
|
||||||
|
|
||||||
@ -1763,13 +1821,12 @@ static int soc_probe(struct platform_device *pdev)
|
|||||||
|
|
||||||
static int soc_cleanup_card_resources(struct snd_soc_card *card)
|
static int soc_cleanup_card_resources(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* make sure any delayed work runs */
|
/* make sure any delayed work runs */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list)
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
|
|
||||||
flush_delayed_work(&rtd->delayed_work);
|
flush_delayed_work(&rtd->delayed_work);
|
||||||
}
|
|
||||||
|
|
||||||
/* remove auxiliary devices */
|
/* remove auxiliary devices */
|
||||||
for (i = 0; i < card->num_aux_devs; i++)
|
for (i = 0; i < card->num_aux_devs; i++)
|
||||||
@ -1777,6 +1834,7 @@ static int soc_cleanup_card_resources(struct snd_soc_card *card)
|
|||||||
|
|
||||||
/* remove and free each DAI */
|
/* remove and free each DAI */
|
||||||
soc_remove_dai_links(card);
|
soc_remove_dai_links(card);
|
||||||
|
soc_remove_pcm_runtimes(card);
|
||||||
|
|
||||||
soc_cleanup_card_debugfs(card);
|
soc_cleanup_card_debugfs(card);
|
||||||
|
|
||||||
@ -1803,29 +1861,26 @@ static int soc_remove(struct platform_device *pdev)
|
|||||||
int snd_soc_poweroff(struct device *dev)
|
int snd_soc_poweroff(struct device *dev)
|
||||||
{
|
{
|
||||||
struct snd_soc_card *card = dev_get_drvdata(dev);
|
struct snd_soc_card *card = dev_get_drvdata(dev);
|
||||||
int i;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
if (!card->instantiated)
|
if (!card->instantiated)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Flush out pmdown_time work - we actually do want to run it
|
/* Flush out pmdown_time work - we actually do want to run it
|
||||||
* now, we're shutting down so no imminent restart. */
|
* now, we're shutting down so no imminent restart. */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list)
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
|
|
||||||
flush_delayed_work(&rtd->delayed_work);
|
flush_delayed_work(&rtd->delayed_work);
|
||||||
}
|
|
||||||
|
|
||||||
snd_soc_dapm_shutdown(card);
|
snd_soc_dapm_shutdown(card);
|
||||||
|
|
||||||
/* deactivate pins to sleep state */
|
/* deactivate pins to sleep state */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
|
|
||||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
int j;
|
int i;
|
||||||
|
|
||||||
pinctrl_pm_select_sleep_state(cpu_dai->dev);
|
pinctrl_pm_select_sleep_state(cpu_dai->dev);
|
||||||
for (j = 0; j < rtd->num_codecs; j++) {
|
for (i = 0; i < rtd->num_codecs; i++) {
|
||||||
struct snd_soc_dai *codec_dai = rtd->codec_dais[j];
|
struct snd_soc_dai *codec_dai = rtd->codec_dais[i];
|
||||||
pinctrl_pm_select_sleep_state(codec_dai->dev);
|
pinctrl_pm_select_sleep_state(codec_dai->dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2337,6 +2392,7 @@ static int snd_soc_init_multicodec(struct snd_soc_card *card,
|
|||||||
int snd_soc_register_card(struct snd_soc_card *card)
|
int snd_soc_register_card(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
int i, j, ret;
|
int i, j, ret;
|
||||||
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
|
|
||||||
if (!card->name || !card->dev)
|
if (!card->name || !card->dev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -2408,25 +2464,15 @@ int snd_soc_register_card(struct snd_soc_card *card)
|
|||||||
|
|
||||||
snd_soc_initialize_card_lists(card);
|
snd_soc_initialize_card_lists(card);
|
||||||
|
|
||||||
card->rtd = devm_kzalloc(card->dev,
|
INIT_LIST_HEAD(&card->rtd_list);
|
||||||
sizeof(struct snd_soc_pcm_runtime) *
|
|
||||||
(card->num_links + card->num_aux_devs),
|
|
||||||
GFP_KERNEL);
|
|
||||||
if (card->rtd == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
card->num_rtd = 0;
|
card->num_rtd = 0;
|
||||||
card->rtd_aux = &card->rtd[card->num_links];
|
|
||||||
|
|
||||||
for (i = 0; i < card->num_links; i++) {
|
card->rtd_aux = devm_kzalloc(card->dev,
|
||||||
card->rtd[i].card = card;
|
sizeof(struct snd_soc_pcm_runtime) *
|
||||||
card->rtd[i].dai_link = &card->dai_link[i];
|
card->num_aux_devs,
|
||||||
card->rtd[i].codec_dais = devm_kzalloc(card->dev,
|
GFP_KERNEL);
|
||||||
sizeof(struct snd_soc_dai *) *
|
if (card->rtd_aux == NULL)
|
||||||
(card->rtd[i].dai_link->num_codecs),
|
return -ENOMEM;
|
||||||
GFP_KERNEL);
|
|
||||||
if (card->rtd[i].codec_dais == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < card->num_aux_devs; i++)
|
for (i = 0; i < card->num_aux_devs; i++)
|
||||||
card->rtd_aux[i].card = card;
|
card->rtd_aux[i].card = card;
|
||||||
@ -2442,8 +2488,7 @@ int snd_soc_register_card(struct snd_soc_card *card)
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* deactivate pins to sleep state */
|
/* deactivate pins to sleep state */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
struct snd_soc_pcm_runtime *rtd = &card->rtd[i];
|
|
||||||
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
|
@ -3893,13 +3893,10 @@ static void soc_dapm_dai_stream_event(struct snd_soc_dai *dai, int stream,
|
|||||||
|
|
||||||
void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
|
void snd_soc_dapm_connect_dai_link_widgets(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *rtd = card->rtd;
|
struct snd_soc_pcm_runtime *rtd;
|
||||||
int i;
|
|
||||||
|
|
||||||
/* for each BE DAI link... */
|
/* for each BE DAI link... */
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(rtd, &card->rtd_list, list) {
|
||||||
rtd = &card->rtd[i];
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dynamic FE links have no fixed DAI mapping.
|
* dynamic FE links have no fixed DAI mapping.
|
||||||
* CODEC<->CODEC links have no direct connection.
|
* CODEC<->CODEC links have no direct connection.
|
||||||
|
@ -1213,11 +1213,10 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
|
|||||||
struct snd_soc_dapm_widget *widget, int stream)
|
struct snd_soc_dapm_widget *widget, int stream)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *be;
|
struct snd_soc_pcm_runtime *be;
|
||||||
int i, j;
|
int i;
|
||||||
|
|
||||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||||
for (i = 0; i < card->num_links; i++) {
|
list_for_each_entry(be, &card->rtd_list, list) {
|
||||||
be = &card->rtd[i];
|
|
||||||
|
|
||||||
if (!be->dai_link->no_pcm)
|
if (!be->dai_link->no_pcm)
|
||||||
continue;
|
continue;
|
||||||
@ -1225,16 +1224,15 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
|
|||||||
if (be->cpu_dai->playback_widget == widget)
|
if (be->cpu_dai->playback_widget == widget)
|
||||||
return be;
|
return be;
|
||||||
|
|
||||||
for (j = 0; j < be->num_codecs; j++) {
|
for (i = 0; i < be->num_codecs; i++) {
|
||||||
struct snd_soc_dai *dai = be->codec_dais[j];
|
struct snd_soc_dai *dai = be->codec_dais[i];
|
||||||
if (dai->playback_widget == widget)
|
if (dai->playback_widget == widget)
|
||||||
return be;
|
return be;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
for (i = 0; i < card->num_links; i++) {
|
list_for_each_entry(be, &card->rtd_list, list) {
|
||||||
be = &card->rtd[i];
|
|
||||||
|
|
||||||
if (!be->dai_link->no_pcm)
|
if (!be->dai_link->no_pcm)
|
||||||
continue;
|
continue;
|
||||||
@ -1242,8 +1240,8 @@ static struct snd_soc_pcm_runtime *dpcm_get_be(struct snd_soc_card *card,
|
|||||||
if (be->cpu_dai->capture_widget == widget)
|
if (be->cpu_dai->capture_widget == widget)
|
||||||
return be;
|
return be;
|
||||||
|
|
||||||
for (j = 0; j < be->num_codecs; j++) {
|
for (i = 0; i < be->num_codecs; i++) {
|
||||||
struct snd_soc_dai *dai = be->codec_dais[j];
|
struct snd_soc_dai *dai = be->codec_dais[i];
|
||||||
if (dai->capture_widget == widget)
|
if (dai->capture_widget == widget)
|
||||||
return be;
|
return be;
|
||||||
}
|
}
|
||||||
@ -2343,12 +2341,12 @@ static int dpcm_run_old_update(struct snd_soc_pcm_runtime *fe, int stream)
|
|||||||
*/
|
*/
|
||||||
int soc_dpcm_runtime_update(struct snd_soc_card *card)
|
int soc_dpcm_runtime_update(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
int i, old, new, paths;
|
struct snd_soc_pcm_runtime *fe;
|
||||||
|
int old, new, paths;
|
||||||
|
|
||||||
mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
|
mutex_lock_nested(&card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
|
||||||
for (i = 0; i < card->num_rtd; i++) {
|
list_for_each_entry(fe, &card->rtd_list, list) {
|
||||||
struct snd_soc_dapm_widget_list *list;
|
struct snd_soc_dapm_widget_list *list;
|
||||||
struct snd_soc_pcm_runtime *fe = &card->rtd[i];
|
|
||||||
|
|
||||||
/* make sure link is FE */
|
/* make sure link is FE */
|
||||||
if (!fe->dai_link->dynamic)
|
if (!fe->dai_link->dynamic)
|
||||||
|
@ -199,7 +199,8 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
|
|||||||
|
|
||||||
static int tegra_wm8903_remove(struct snd_soc_card *card)
|
static int tegra_wm8903_remove(struct snd_soc_card *card)
|
||||||
{
|
{
|
||||||
struct snd_soc_pcm_runtime *rtd = &(card->rtd[0]);
|
struct snd_soc_pcm_runtime *rtd =
|
||||||
|
snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
|
||||||
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
struct snd_soc_dai *codec_dai = rtd->codec_dai;
|
||||||
struct snd_soc_codec *codec = codec_dai->codec;
|
struct snd_soc_codec *codec = codec_dai->codec;
|
||||||
struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
|
struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
|
||||||
|
Loading…
Reference in New Issue
Block a user