Commit a93202fa authored by Mark Brown's avatar Mark Brown

Merge remote-tracking branch 'asoc/topic/pcm-list' into asoc-next

parents 3b88210d 61b0088b
...@@ -1040,6 +1040,9 @@ struct snd_soc_dai_link { ...@@ -1040,6 +1040,9 @@ struct snd_soc_dai_link {
/* pmdown_time is ignored at stop */ /* pmdown_time is ignored at stop */
unsigned int ignore_pmdown_time:1; unsigned int ignore_pmdown_time:1;
struct list_head list; /* DAI link list of the soc card */
struct snd_soc_dobj dobj; /* For topology */
}; };
struct snd_soc_codec_conf { struct snd_soc_codec_conf {
...@@ -1104,12 +1107,20 @@ struct snd_soc_card { ...@@ -1104,12 +1107,20 @@ struct snd_soc_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);
int (*add_dai_link)(struct snd_soc_card *,
struct snd_soc_dai_link *link);
void (*remove_dai_link)(struct snd_soc_card *,
struct snd_soc_dai_link *link);
long pmdown_time; long pmdown_time;
/* CPU <--> Codec DAI links */ /* CPU <--> Codec DAI links */
struct snd_soc_dai_link *dai_link; struct snd_soc_dai_link *dai_link; /* predefined links only */
int num_links; int num_links; /* predefined links only */
struct snd_soc_pcm_runtime *rtd; struct list_head dai_link_list; /* all links */
int num_dai_links;
struct list_head rtd_list;
int num_rtd; int num_rtd;
/* optional codec specific configuration */ /* optional codec specific configuration */
...@@ -1204,6 +1215,9 @@ struct snd_soc_pcm_runtime { ...@@ -1204,6 +1215,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 */
...@@ -1647,6 +1661,11 @@ int snd_soc_of_get_dai_link_codecs(struct device *dev, ...@@ -1647,6 +1661,11 @@ int snd_soc_of_get_dai_link_codecs(struct device *dev,
struct device_node *of_node, struct device_node *of_node,
struct snd_soc_dai_link *dai_link); struct snd_soc_dai_link *dai_link);
int snd_soc_add_dai_link(struct snd_soc_card *card,
struct snd_soc_dai_link *dai_link);
void snd_soc_remove_dai_link(struct snd_soc_card *card,
struct snd_soc_dai_link *dai_link);
#include <sound/soc-dai.h> #include <sound/soc-dai.h>
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
......
...@@ -222,12 +222,15 @@ static int fsl_asoc_card_set_bias_level(struct snd_soc_card *card, ...@@ -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;
...@@ -414,14 +417,16 @@ static int fsl_asoc_card_audmux_init(struct device_node *np, ...@@ -414,14 +417,16 @@ static int fsl_asoc_card_audmux_init(struct device_node *np,
static int fsl_asoc_card_late_probe(struct snd_soc_card *card) static int fsl_asoc_card_late_probe(struct snd_soc_card *card)
{ {
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 = list_first_entry(
&card->rtd_list, struct snd_soc_pcm_runtime, list);
struct snd_soc_dai *codec_dai = rtd->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;
int ret; int ret;
if (fsl_asoc_card_is_ac97(priv)) { if (fsl_asoc_card_is_ac97(priv)) {
#if IS_ENABLED(CONFIG_SND_AC97_CODEC) #if IS_ENABLED(CONFIG_SND_AC97_CODEC)
struct snd_soc_codec *codec = card->rtd[0].codec; struct snd_soc_codec *codec = rtd->codec;
struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
/* /*
......
...@@ -69,13 +69,16 @@ static int imx_wm8962_set_bias_level(struct snd_soc_card *card, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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 { ...@@ -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 { ...@@ -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++) {
struct snd_soc_pcm_runtime *rtd;
rtd = card->rtd + i; list_for_each_entry(rtd, &card->rtd_list, list) {
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[] = { ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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; ...@@ -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[]; ...@@ -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[] = { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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[] = { ...@@ -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)
......
...@@ -1033,14 +1033,13 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod, ...@@ -1033,14 +1033,13 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod,
void (*update)(struct rsnd_dai_stream *io, void (*update)(struct rsnd_dai_stream *io,
struct rsnd_mod *mod)) struct rsnd_mod *mod))
{ {
struct snd_soc_card *soc_card = rtd->card;
struct snd_card *card = rtd->card->snd_card; struct snd_card *card = rtd->card->snd_card;
struct snd_kcontrol *kctrl; struct snd_kcontrol *kctrl;
struct snd_kcontrol_new knew = { struct snd_kcontrol_new knew = {
.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) ...@@ -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) ...@@ -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) ...@@ -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);
......
This diff is collapsed.
...@@ -3905,13 +3905,10 @@ static void soc_dapm_dai_stream_event(struct snd_soc_dai *dai, int stream, ...@@ -3905,13 +3905,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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment