/* * SSI PIO */ static void rsnd_ssi_parent_attach(struct rsnd_mod *mod, struct rsnd_dai_stream *io) { struct rsnd_dai *rdai = rsnd_io_to_rdai(io); struct rsnd_priv *priv = rsnd_mod_to_priv(mod); if (!__rsnd_ssi_is_pin_sharing(mod)) return; if (!rsnd_rdai_is_clk_master(rdai)) return; switch (rsnd_mod_id(mod)) { case 1: case 2: rsnd_dai_connect(rsnd_ssi_mod_get(priv, 0), io, RSND_MOD_SSIP); break; case 4: rsnd_dai_connect(rsnd_ssi_mod_get(priv, 3), io, RSND_MOD_SSIP); break; case 8: rsnd_dai_connect(rsnd_ssi_mod_get(priv, 7), io, RSND_MOD_SSIP); break; } }
static int rsnd_src_probe_gen2(struct rsnd_mod *mod, struct rsnd_dai *rdai, struct rsnd_dai_stream *io) { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); struct rcar_snd_info *info = rsnd_priv_to_info(priv); struct rsnd_src *src = rsnd_mod_to_src(mod); struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, rsnd_mod_id(mod)); struct device *dev = rsnd_priv_to_dev(priv); int ret; int is_play; if (info->dai_info) is_play = rsnd_info_is_playback(priv, src); else is_play = rsnd_ssi_is_play(ssi); ret = rsnd_dma_init(priv, rsnd_mod_to_dma(mod), is_play, src->info->dma_id); if (ret < 0) dev_err(dev, "SRC DMA failed\n"); return ret; }
static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *ssi) { if (!rsnd_ssi_is_pin_sharing(&ssi->mod)) return; switch (rsnd_mod_id(&ssi->mod)) { case 1: case 2: ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 0)); break; case 4: ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 3)); break; case 8: ssi->parent = rsnd_mod_to_ssi(rsnd_ssi_mod_get(priv, 7)); break; } }
/* * 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; }
void rsnd_parse_connect_ssi(struct rsnd_dai *rdai, struct device_node *playback, struct device_node *capture) { struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai); struct device_node *node; struct device_node *np; struct rsnd_mod *mod; int i; node = rsnd_ssi_of_node(priv); if (!node) return; i = 0; for_each_child_of_node(node, np) { mod = rsnd_ssi_mod_get(priv, i); if (np == playback) rsnd_ssi_connect(mod, &rdai->playback); if (np == capture) rsnd_ssi_connect(mod, &rdai->capture); i++; }