/* * Gen1 */ static int rsnd_gen1_path_init(struct rsnd_priv *priv, struct rsnd_dai *rdai, struct rsnd_dai_stream *io) { struct rsnd_mod *mod; int ret; int id; /* * Gen1 is created by SRU/SSI, and this SRU is base module of * Gen2's SCU/SSIU/SSI. (Gen2 SCU/SSIU came from SRU) * * Easy image is.. * Gen1 SRU = Gen2 SCU + SSIU + etc * * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is * using fixed path. * * Then, SSI id = SCU id here */ /* get SSI's ID */ mod = rsnd_ssi_mod_get_frm_dai(priv, rsnd_dai_id(priv, rdai), rsnd_dai_is_play(rdai, io)); id = rsnd_mod_id(mod); /* SSI */ mod = rsnd_ssi_mod_get(priv, id); ret = rsnd_dai_connect(rdai, mod, io); if (ret < 0) return ret; /* SCU */ mod = rsnd_scu_mod_get(priv, id); ret = rsnd_dai_connect(rdai, mod, io); return ret; }
static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_dai *dai) { struct rsnd_priv *priv = snd_soc_dai_get_drvdata(dai); struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai); struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream); struct rsnd_mod *mod = rsnd_ssi_mod_get_frm_dai(priv, rsnd_dai_id(priv, rdai), rsnd_dai_is_play(rdai, io)); int ssi_id = rsnd_mod_id(mod); int ret; unsigned long flags; rsnd_lock(priv, flags); switch (cmd) { case SNDRV_PCM_TRIGGER_START: ret = rsnd_dai_stream_init(io, substream); if (ret < 0) goto dai_trigger_end; ret = rsnd_platform_call(priv, dai, start, ssi_id); if (ret < 0) goto dai_trigger_end; ret = rsnd_gen_path_init(priv, rdai, io); if (ret < 0) goto dai_trigger_end; ret = rsnd_dai_call(rdai, io, init); if (ret < 0) goto dai_trigger_end; ret = rsnd_dai_call(rdai, io, start); if (ret < 0) goto dai_trigger_end; break; case SNDRV_PCM_TRIGGER_STOP: ret = rsnd_dai_call(rdai, io, stop); if (ret < 0) goto dai_trigger_end; ret = rsnd_dai_call(rdai, io, quit); if (ret < 0) goto dai_trigger_end; ret = rsnd_gen_path_exit(priv, rdai, io); if (ret < 0) goto dai_trigger_end; ret = rsnd_platform_call(priv, dai, stop, ssi_id); if (ret < 0) goto dai_trigger_end; break; default: ret = -EINVAL; } dai_trigger_end: rsnd_unlock(priv, flags); return ret; }