aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Brown <broonie@linaro.org>2014-03-23 10:00:58 -0400
committerMark Brown <broonie@linaro.org>2014-03-23 10:00:58 -0400
commitca9e54c625911cb9c409687d96e78645cf55fa33 (patch)
tree7ddb1d9df392fd466d3175beb1715a0bf01bd0f8
parent980aac20877e428406959391e6cb6b8dc3243ad2 (diff)
parent90e8e50fce3585d6f9902701de08389b027dadc6 (diff)
Merge remote-tracking branch 'asoc/topic/rcar' into asoc-next
-rw-r--r--Documentation/devicetree/bindings/sound/renesas,rsnd.txt96
-rw-r--r--sound/soc/sh/rcar/adg.c1
-rw-r--r--sound/soc/sh/rcar/core.c122
-rw-r--r--sound/soc/sh/rcar/gen.c15
-rw-r--r--sound/soc/sh/rcar/rsnd.h11
-rw-r--r--sound/soc/sh/rcar/src.c36
-rw-r--r--sound/soc/sh/rcar/ssi.c56
7 files changed, 334 insertions, 3 deletions
diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
new file mode 100644
index 000000000000..7c6d33f29796
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
@@ -0,0 +1,96 @@
1Renesas R-Car sound
2
3Required properties:
4- compatible : "renesas,rcar_sound-gen1" if generation1
5 "renesas,rcar_sound-gen2" if generation2
6- reg : Should contain the register physical address.
7 required register is
8 SRU/ADG/SSI if generation1
9 SRU/ADG/SSIU/SSI if generation2
10- rcar_sound,ssi : SSI subnode
11- rcar_sound,scu : SCU subnode
12- rcar_sound,dai : DAI subnode
13
14SSI subnode properties:
15- interrupts : Should contain SSI interrupt for PIO transfer
16- shared-pin : if shared clock pin
17
18DAI subnode properties:
19- playback : list of playback modules
20- capture : list of capture modules
21
22Example:
23
24rcar_sound: rcar_sound@0xffd90000 {
25 #sound-dai-cells = <1>;
26 compatible = "renesas,rcar_sound-gen2";
27 reg = <0 0xec500000 0 0x1000>, /* SCU */
28 <0 0xec5a0000 0 0x100>, /* ADG */
29 <0 0xec540000 0 0x1000>, /* SSIU */
30 <0 0xec541000 0 0x1280>; /* SSI */
31
32 rcar_sound,src {
33 src0: src@0 { };
34 src1: src@1 { };
35 src2: src@2 { };
36 src3: src@3 { };
37 src4: src@4 { };
38 src5: src@5 { };
39 src6: src@6 { };
40 src7: src@7 { };
41 src8: src@8 { };
42 src9: src@9 { };
43 };
44
45 rcar_sound,ssi {
46 ssi0: ssi@0 {
47 interrupts = <0 370 IRQ_TYPE_LEVEL_HIGH>;
48 };
49 ssi1: ssi@1 {
50 interrupts = <0 371 IRQ_TYPE_LEVEL_HIGH>;
51 };
52 ssi2: ssi@2 {
53 interrupts = <0 372 IRQ_TYPE_LEVEL_HIGH>;
54 };
55 ssi3: ssi@3 {
56 interrupts = <0 373 IRQ_TYPE_LEVEL_HIGH>;
57 };
58 ssi4: ssi@4 {
59 interrupts = <0 374 IRQ_TYPE_LEVEL_HIGH>;
60 };
61 ssi5: ssi@5 {
62 interrupts = <0 375 IRQ_TYPE_LEVEL_HIGH>;
63 };
64 ssi6: ssi@6 {
65 interrupts = <0 376 IRQ_TYPE_LEVEL_HIGH>;
66 };
67 ssi7: ssi@7 {
68 interrupts = <0 377 IRQ_TYPE_LEVEL_HIGH>;
69 };
70 ssi8: ssi@8 {
71 interrupts = <0 378 IRQ_TYPE_LEVEL_HIGH>;
72 };
73 ssi9: ssi@9 {
74 interrupts = <0 379 IRQ_TYPE_LEVEL_HIGH>;
75 };
76 };
77
78 rcar_sound,dai {
79 dai0 {
80 playback = <&ssi5 &src5>;
81 capture = <&ssi6>;
82 };
83 dai1 {
84 playback = <&ssi3>;
85 };
86 dai2 {
87 capture = <&ssi4>;
88 };
89 dai3 {
90 playback = <&ssi7>;
91 };
92 dai4 {
93 capture = <&ssi8>;
94 };
95 };
96};
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 953f1cce982d..69c44269ebdb 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -392,6 +392,7 @@ static void rsnd_adg_ssi_clk_init(struct rsnd_priv *priv, struct rsnd_adg *adg)
392} 392}
393 393
394int rsnd_adg_probe(struct platform_device *pdev, 394int rsnd_adg_probe(struct platform_device *pdev,
395 const struct rsnd_of_data *of_data,
395 struct rsnd_priv *priv) 396 struct rsnd_priv *priv)
396{ 397{
397 struct rsnd_adg *adg; 398 struct rsnd_adg *adg;
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index d836e8a9fdce..215b668166be 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -100,6 +100,21 @@
100#define RSND_RATES SNDRV_PCM_RATE_8000_96000 100#define RSND_RATES SNDRV_PCM_RATE_8000_96000
101#define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE) 101#define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
102 102
103static struct rsnd_of_data rsnd_of_data_gen1 = {
104 .flags = RSND_GEN1,
105};
106
107static struct rsnd_of_data rsnd_of_data_gen2 = {
108 .flags = RSND_GEN2,
109};
110
111static struct of_device_id rsnd_of_match[] = {
112 { .compatible = "renesas,rcar_sound-gen1", .data = &rsnd_of_data_gen1 },
113 { .compatible = "renesas,rcar_sound-gen2", .data = &rsnd_of_data_gen2 },
114 {},
115};
116MODULE_DEVICE_TABLE(of, rsnd_of_match);
117
103/* 118/*
104 * rsnd_platform functions 119 * rsnd_platform functions
105 */ 120 */
@@ -620,7 +635,92 @@ static int rsnd_path_init(struct rsnd_priv *priv,
620 return ret; 635 return ret;
621} 636}
622 637
638static void rsnd_of_parse_dai(struct platform_device *pdev,
639 const struct rsnd_of_data *of_data,
640 struct rsnd_priv *priv)
641{
642 struct device_node *dai_node, *dai_np;
643 struct device_node *ssi_node, *ssi_np;
644 struct device_node *src_node, *src_np;
645 struct device_node *playback, *capture;
646 struct rsnd_dai_platform_info *dai_info;
647 struct rcar_snd_info *info = rsnd_priv_to_info(priv);
648 struct device *dev = &pdev->dev;
649 int nr, i;
650 int dai_i, ssi_i, src_i;
651
652 if (!of_data)
653 return;
654
655 dai_node = of_get_child_by_name(dev->of_node, "rcar_sound,dai");
656 if (!dai_node)
657 return;
658
659 nr = of_get_child_count(dai_node);
660 if (!nr)
661 return;
662
663 dai_info = devm_kzalloc(dev,
664 sizeof(struct rsnd_dai_platform_info) * nr,
665 GFP_KERNEL);
666 if (!dai_info) {
667 dev_err(dev, "dai info allocation error\n");
668 return;
669 }
670
671 info->dai_info_nr = nr;
672 info->dai_info = dai_info;
673
674 ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");