diff options
| author | Mark Brown <broonie@linaro.org> | 2014-03-23 10:00:58 -0400 |
|---|---|---|
| committer | Mark Brown <broonie@linaro.org> | 2014-03-23 10:00:58 -0400 |
| commit | ca9e54c625911cb9c409687d96e78645cf55fa33 (patch) | |
| tree | 7ddb1d9df392fd466d3175beb1715a0bf01bd0f8 | |
| parent | 980aac20877e428406959391e6cb6b8dc3243ad2 (diff) | |
| parent | 90e8e50fce3585d6f9902701de08389b027dadc6 (diff) | |
Merge remote-tracking branch 'asoc/topic/rcar' into asoc-next
| -rw-r--r-- | Documentation/devicetree/bindings/sound/renesas,rsnd.txt | 96 | ||||
| -rw-r--r-- | sound/soc/sh/rcar/adg.c | 1 | ||||
| -rw-r--r-- | sound/soc/sh/rcar/core.c | 122 | ||||
| -rw-r--r-- | sound/soc/sh/rcar/gen.c | 15 | ||||
| -rw-r--r-- | sound/soc/sh/rcar/rsnd.h | 11 | ||||
| -rw-r--r-- | sound/soc/sh/rcar/src.c | 36 | ||||
| -rw-r--r-- | sound/soc/sh/rcar/ssi.c | 56 |
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 @@ | |||
| 1 | Renesas R-Car sound | ||
| 2 | |||
| 3 | Required 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 | |||
| 14 | SSI subnode properties: | ||
| 15 | - interrupts : Should contain SSI interrupt for PIO transfer | ||
| 16 | - shared-pin : if shared clock pin | ||
| 17 | |||
| 18 | DAI subnode properties: | ||
| 19 | - playback : list of playback modules | ||
| 20 | - capture : list of capture modules | ||
| 21 | |||
| 22 | Example: | ||
| 23 | |||
| 24 | rcar_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 | ||
| 394 | int rsnd_adg_probe(struct platform_device *pdev, | 394 | int 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 | ||
| 103 | static struct rsnd_of_data rsnd_of_data_gen1 = { | ||
| 104 | .flags = RSND_GEN1, | ||
| 105 | }; | ||
| 106 | |||
| 107 | static struct rsnd_of_data rsnd_of_data_gen2 = { | ||
| 108 | .flags = RSND_GEN2, | ||
| 109 | }; | ||
| 110 | |||
| 111 | static 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 | }; | ||
| 116 | MODULE_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 | ||
| 638 | static 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"); | ||
