diff options
| author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2014-06-22 20:59:28 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@linaro.org> | 2014-07-02 07:35:56 -0400 |
| commit | 34cb6123f90d264d63bdcd3ee0df0d2cb4b36aab (patch) | |
| tree | 201069d465c2f0c7144933e9f995b192c99d8f9c | |
| parent | 340371005d399b595f4044fc5e336f4a66ead101 (diff) | |
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>
| -rw-r--r-- | Documentation/devicetree/bindings/sound/renesas,rsnd.txt | 8 | ||||
| -rw-r--r-- | sound/soc/sh/rcar/core.c | 13 | ||||
| -rw-r--r-- | sound/soc/sh/rcar/dvc.c | 38 |
3 files changed, 57 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt index 41a120c2389d..aa697abf337e 100644 --- a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt +++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt | |||
| @@ -13,6 +13,9 @@ Required properties: | |||
| 13 | - rcar_sound,src : Should contain SRC feature. | 13 | - rcar_sound,src : Should contain SRC feature. |
| 14 | The number of SRC subnode should be same as HW. | 14 | The number of SRC subnode should be same as HW. |
| 15 | see below for detail. | 15 | see below for detail. |
| 16 | - rcar_sound,dvc : Should contain DVC feature. | ||
| 17 | The number of DVC subnode should be same as HW. | ||
| 18 | see below for detail. | ||
| 16 | - rcar_sound,dai : DAI contents. | 19 | - rcar_sound,dai : DAI contents. |
| 17 | The number of DAI subnode should be same as HW. | 20 | The number of DAI subnode should be same as HW. |
| 18 | see below for detail. | 21 | see below for detail. |
| @@ -40,6 +43,11 @@ rcar_sound: rcar_sound@0xffd90000 { | |||
| 40 | <0 0xec540000 0 0x1000>, /* SSIU */ | 43 | <0 0xec540000 0 0x1000>, /* SSIU */ |
| 41 | <0 0xec541000 0 0x1280>; /* SSI */ | 44 | <0 0xec541000 0 0x1280>; /* SSI */ |
| 42 | 45 | ||
| 46 | rcar_sound,dvc { | ||
| 47 | dvc0: dvc@0 { }; | ||
| 48 | dvc1: dvc@1 { }; | ||
| 49 | }; | ||
| 50 | |||
| 43 | rcar_sound,src { | 51 | rcar_sound,src { |
| 44 | src0: src@0 { }; | 52 | src0: src@0 { }; |
| 45 | src1: src@1 { }; | 53 | src1: src@1 { }; |
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index 49d9b31b185c..907d4802fd5c 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c | |||
| @@ -286,7 +286,13 @@ static void rsnd_dma_of_path(struct rsnd_dma *dma, | |||
| 286 | mod[i] = src; | 286 | mod[i] = src; |
| 287 | src = NULL; | 287 | src = NULL; |
| 288 | } else { | 288 | } else { |
| 289 | mod[i] = dvc; | 289 | if ((!is_play) && (this == src)) |
| 290 | this = dvc; | ||
| 291 | |||
| 292 | mod[i] = (is_play) ? src : dvc; | ||
| 293 | i++; | ||
| 294 | mod[i] = (is_play) ? dvc : src; | ||
| 295 | src = NULL; | ||
| 290 | dvc = NULL; | 296 | dvc = NULL; |
| 291 | } | 297 | } |
| 292 | 298 | ||
| @@ -719,12 +725,13 @@ static void rsnd_of_parse_dai(struct platform_device *pdev, | |||
| 719 | struct device_node *dai_node, *dai_np; | 725 | struct device_node *dai_node, *dai_np; |
| 720 | struct device_node *ssi_node, *ssi_np; | 726 | struct device_node *ssi_node, *ssi_np; |
| 721 | struct device_node *src_node, *src_np; | 727 | struct device_node *src_node, *src_np; |
| 728 | struct device_node *dvc_node, *dvc_np; | ||
| 722 | struct device_node *playback, *capture; | 729 | struct device_node *playback, *capture; |
| 723 | struct rsnd_dai_platform_info *dai_info; | 730 | struct rsnd_dai_platform_info *dai_info; |
| 724 | struct rcar_snd_info *info = rsnd_priv_to_info(priv); | 731 | struct rcar_snd_info *info = rsnd_priv_to_info(priv); |
| 725 | struct device *dev = &pdev->dev; | 732 | struct device *dev = &pdev->dev; |
| 726 | int nr, i; | 733 | int nr, i; |
| 727 | int dai_i, ssi_i, src_i; | 734 | int dai_i, ssi_i, src_i, dvc_i; |
| 728 | 735 | ||
| 729 | if (!of_data) | 736 | if (!of_data) |
| 730 | return; | 737 | return; |
| @@ -750,6 +757,7 @@ static void rsnd_of_parse_dai(struct platform_device *pdev, | |||
| 750 | 757 | ||
| 751 | ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi"); | 758 | ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi"); |
| 752 | src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src"); | 759 | src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src"); |
| 760 | dvc_node = of_get_child_by_name(dev->of_node, "rcar_sound,dvc"); | ||
| 753 | 761 | ||
| 754 | #define mod_parse(name) \ | 762 | #define mod_parse(name) \ |
| 755 | if (name##_node) { \ | 763 | if (name##_node) { \ |
| @@ -785,6 +793,7 @@ if (name##_node) { \ | |||
| 785 | 793 | ||
| 786 | mod_parse(ssi); | 794 | mod_parse(ssi); |
| 787 | mod_parse(src); | 795 | mod_parse(src); |
| 796 | mod_parse(dvc); | ||
| 788 | 797 | ||
| 789 | if (playback) | 798 | if (playback) |
| 790 | of_node_put(playback); | 799 | of_node_put(playback); |
diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c index deef310c75dc..9096fb03d001 100644 --- a/sound/soc/sh/rcar/dvc.c +++ b/sound/soc/sh/rcar/dvc.c | |||
| @@ -235,6 +235,42 @@ struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id) | |||
| 235 | return &((struct rsnd_dvc *)(priv->dvc) + id)->mod; | 235 | return &((struct rsnd_dvc *)(priv->dvc) + id)->mod; |
| 236 | } | 236 | } |
| 237 | 237 | ||
| 238 | static void rsnd_of_parse_dvc(struct platform_device *pdev, | ||
| 239 | const struct rsnd_of_data *of_data, | ||
| 240 | struct rsnd_priv *priv) | ||
| 241 | { | ||
| 242 | struct device_node *node; | ||
| 243 | struct rsnd_dvc_platform_info *dvc_info; | ||
| 244 | struct rcar_snd_info *info = rsnd_priv_to_info(priv); | ||
| 245 | struct device *dev = &pdev->dev; | ||
| 246 | int nr; | ||
| 247 | |||
| 248 | if (!of_data) | ||
| 249 | return; | ||
| 250 | |||
| 251 | node = of_get_child_by_name(dev->of_node, "rcar_sound,dvc"); | ||
| 252 | if (!node) | ||
| 253 | return; | ||
| 254 | |||
| 255 | nr = of_get_child_count(node); | ||
| 256 | if (!nr) | ||
| 257 | goto rsnd_of_parse_dvc_end; | ||
| 258 | |||
| 259 | dvc_info = devm_kzalloc(dev, | ||
| 260 | sizeof(struct rsnd_dvc_platform_info) * nr, | ||
| 261 | GFP_KERNEL); | ||
| 262 | if (!dvc_info) { | ||
| 263 | dev_err(dev, "dvc info allocation error\n"); | ||
| 264 | goto rsnd_of_parse_dvc_end; | ||
| 265 | } | ||
| 266 | |||
| 267 | info->dvc_info = dvc_info; | ||
| 268 | info->dvc_info_nr = nr; | ||
| 269 | |||
| 270 | rsnd_of_parse_dvc_end: | ||
| 271 | of_node_put(node); | ||
| 272 | } | ||
| 273 | |||
| 238 | int rsnd_dvc_probe(struct platform_device *pdev, | 274 | int rsnd_dvc_probe(struct platform_device *pdev, |
| 239 | const struct rsnd_of_data *of_data, | 275 | const struct rsnd_of_data *of_data, |
| 240 | struct rsnd_priv *priv) | 276 | struct rsnd_priv *priv) |
| @@ -246,6 +282,8 @@ int rsnd_dvc_probe(struct platform_device *pdev, | |||
| 246 | char name[RSND_DVC_NAME_SIZE]; | 282 | char name[RSND_DVC_NAME_SIZE]; |
| 247 | int i, nr; | 283 | int i, nr; |
| 248 | 284 | ||
| 285 | rsnd_of_parse_dvc(pdev, of_data, priv); | ||
| 286 | |||
| 249 | nr = info->dvc_info_nr; | 287 | nr = info->dvc_info_nr; |
| 250 | if (!nr) | 288 | if (!nr) |
| 251 | return 0; | 289 | return 0; |
