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:
Родитель
340371005d
Коммит
34cb6123f9
|
@ -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 { };
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче