static void rsnd_of_parse_ssi(struct platform_device *pdev, const struct rsnd_of_data *of_data, struct rsnd_priv *priv) { struct device_node *node; struct device_node *np; struct rsnd_ssi_platform_info *ssi_info; struct rcar_snd_info *info = rsnd_priv_to_info(priv); struct device *dev = &pdev->dev; int nr, i; if (!of_data) return; node = rsnd_ssi_of_node(priv); if (!node) return; nr = of_get_child_count(node); if (!nr) goto rsnd_of_parse_ssi_end; ssi_info = devm_kzalloc(dev, sizeof(struct rsnd_ssi_platform_info) * nr, GFP_KERNEL); if (!ssi_info) { dev_err(dev, "ssi info allocation error\n"); goto rsnd_of_parse_ssi_end; } info->ssi_info = ssi_info; info->ssi_info_nr = nr; i = -1; for_each_child_of_node(node, np) { i++; ssi_info = info->ssi_info + i; /* * pin settings */ if (of_get_property(np, "shared-pin", NULL)) ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE; /* * irq */ ssi_info->irq = irq_of_parse_and_map(np, 0); /* * DMA */ ssi_info->dma_id = of_get_property(np, "pio-transfer", NULL) ? 0 : 1; if (of_get_property(np, "no-busif", NULL)) ssi_info->flags |= RSND_SSI_NO_BUSIF; }
static struct dma_chan *rsnd_ssi_dma_req(struct rsnd_mod *mod) { struct rsnd_priv *priv = rsnd_mod_to_priv(mod); struct rsnd_dai_stream *io = rsnd_mod_to_io(mod); int is_play = rsnd_io_is_play(io); char *name; if (rsnd_ssi_use_busif(mod)) name = is_play ? "rxu" : "txu"; else name = is_play ? "rx" : "tx"; return rsnd_dma_request_channel(rsnd_ssi_of_node(priv), mod, name); }
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++; }