ASoC: rsnd: add DT support to DVC

Now, DVC can use DT

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
This commit is contained in:
Kuninori Morimoto 2014-06-22 17:59:28 -07:00 committed by Mark Brown
parent 340371005d
commit 34cb6123f9
3 changed files with 57 additions and 2 deletions

View File

@ -13,6 +13,9 @@ Required properties:
- rcar_sound,src : Should contain SRC feature. - rcar_sound,src : Should contain SRC feature.
The number of SRC subnode should be same as HW. The number of SRC subnode should be same as HW.
see below for detail. see below for detail.
- rcar_sound,dvc : Should contain DVC feature.
The number of DVC subnode should be same as HW.
see below for detail.
- rcar_sound,dai : DAI contents. - rcar_sound,dai : DAI contents.
The number of DAI subnode should be same as HW. The number of DAI subnode should be same as HW.
see below for detail. see below for detail.
@ -40,6 +43,11 @@ rcar_sound: rcar_sound@0xffd90000 {
<0 0xec540000 0 0x1000>, /* SSIU */ <0 0xec540000 0 0x1000>, /* SSIU */
<0 0xec541000 0 0x1280>; /* SSI */ <0 0xec541000 0 0x1280>; /* SSI */
rcar_sound,dvc {
dvc0: dvc@0 { };
dvc1: dvc@1 { };
};
rcar_sound,src { rcar_sound,src {
src0: src@0 { }; src0: src@0 { };
src1: src@1 { }; src1: src@1 { };

View File

@ -286,7 +286,13 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma,
mod[i] = src; mod[i] = src;
src = NULL; src = NULL;
} else { } else {
mod[i] = dvc; if ((!is_play) && (this == src))
this = dvc;
mod[i] = (is_play) ? src : dvc;
i++;
mod[i] = (is_play) ? dvc : src;
src = NULL;
dvc = NULL; dvc = NULL;
} }
@ -719,12 +725,13 @@ static void rsnd_of_parse_dai(struct platform_device *pdev,
struct device_node *dai_node, *dai_np; struct device_node *dai_node, *dai_np;
struct device_node *ssi_node, *ssi_np; struct device_node *ssi_node, *ssi_np;
struct device_node *src_node, *src_np; struct device_node *src_node, *src_np;
struct device_node *dvc_node, *dvc_np;
struct device_node *playback, *capture; struct device_node *playback, *capture;
struct rsnd_dai_platform_info *dai_info; struct rsnd_dai_platform_info *dai_info;
struct rcar_snd_info *info = rsnd_priv_to_info(priv); struct rcar_snd_info *info = rsnd_priv_to_info(priv);
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
int nr, i; int nr, i;
int dai_i, ssi_i, src_i; int dai_i, ssi_i, src_i, dvc_i;
if (!of_data) if (!of_data)
return; return;
@ -750,6 +757,7 @@ static void rsnd_of_parse_dai(struct platform_device *pdev,
ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi"); ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src"); src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
dvc_node = of_get_child_by_name(dev->of_node, "rcar_sound,dvc");
#define mod_parse(name) \ #define mod_parse(name) \
if (name##_node) { \ if (name##_node) { \
@ -785,6 +793,7 @@ if (name##_node) { \
mod_parse(ssi); mod_parse(ssi);
mod_parse(src); mod_parse(src);
mod_parse(dvc);
if (playback) if (playback)
of_node_put(playback); of_node_put(playback);

View File

@ -235,6 +235,42 @@ struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id)
return &((struct rsnd_dvc *)(priv->dvc) + id)->mod; return &((struct rsnd_dvc *)(priv->dvc) + id)->mod;
} }
static void rsnd_of_parse_dvc(struct platform_device *pdev,
const struct rsnd_of_data *of_data,
struct rsnd_priv *priv)
{
struct device_node *node;
struct rsnd_dvc_platform_info *dvc_info;
struct rcar_snd_info *info = rsnd_priv_to_info(priv);
struct device *dev = &pdev->dev;
int nr;
if (!of_data)
return;
node = of_get_child_by_name(dev->of_node, "rcar_sound,dvc");
if (!node)
return;
nr = of_get_child_count(node);
if (!nr)
goto rsnd_of_parse_dvc_end;
dvc_info = devm_kzalloc(dev,
sizeof(struct rsnd_dvc_platform_info) * nr,
GFP_KERNEL);
if (!dvc_info) {
dev_err(dev, "dvc info allocation error\n");
goto rsnd_of_parse_dvc_end;
}
info->dvc_info = dvc_info;
info->dvc_info_nr = nr;
rsnd_of_parse_dvc_end:
of_node_put(node);
}
int rsnd_dvc_probe(struct platform_device *pdev, int rsnd_dvc_probe(struct platform_device *pdev,
const struct rsnd_of_data *of_data, const struct rsnd_of_data *of_data,
struct rsnd_priv *priv) struct rsnd_priv *priv)
@ -246,6 +282,8 @@ int rsnd_dvc_probe(struct platform_device *pdev,
char name[RSND_DVC_NAME_SIZE]; char name[RSND_DVC_NAME_SIZE];
int i, nr; int i, nr;
rsnd_of_parse_dvc(pdev, of_data, priv);
nr = info->dvc_info_nr; nr = info->dvc_info_nr;
if (!nr) if (!nr)
return 0; return 0;