diff options
author | Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | 2014-03-03 23:49:50 -0500 |
---|---|---|
committer | Mark Brown <broonie@linaro.org> | 2014-03-05 01:07:52 -0500 |
commit | 78f13d0c5a2888564b2bed7f8433c8ec889997ff (patch) | |
tree | 7e02accb8329e190585d57735bcd777fb42e59f7 | |
parent | c82e1c8874e5abaf52f9ed886386cbe08ec98a5b (diff) |
ASoC: rsnd: add struct rsnd_dai_platform_info
R-Car sound DAI consists from SSI/SCU/SSIU/SRU...
Current R-Car sound DAI is decided from these settings,
but it is intuitively unclear, and is not good design for DT support.
This patch adds new rsnd_dai_platform_info to solve this issue.
But now, many platform is using this driver without
rsnd_dai_platform_info.
So, this patch still supports DAI settings via SSI to keep compatible.
It will be removed in next Linux version.
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r-- | include/sound/rcar_snd.h | 17 | ||||
-rw-r--r-- | sound/soc/sh/rcar/core.c | 23 | ||||
-rw-r--r-- | sound/soc/sh/rcar/ssi.c | 14 |
3 files changed, 46 insertions, 8 deletions
diff --git a/include/sound/rcar_snd.h b/include/sound/rcar_snd.h index e3d585c67685..698f7b5fc76d 100644 --- a/include/sound/rcar_snd.h +++ b/include/sound/rcar_snd.h | |||
@@ -36,13 +36,15 @@ | |||
36 | #define RSND_SSI_CLK_PIN_SHARE (1 << 31) | 36 | #define RSND_SSI_CLK_PIN_SHARE (1 << 31) |
37 | #define RSND_SSI_PLAY (1 << 24) | 37 | #define RSND_SSI_PLAY (1 << 24) |
38 | 38 | ||
39 | #define RSND_SSI(_dma_id, _pio_irq, _flags) \ | ||
40 | { .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags } | ||
39 | #define RSND_SSI_SET(_dai_id, _dma_id, _pio_irq, _flags) \ | 41 | #define RSND_SSI_SET(_dai_id, _dma_id, _pio_irq, _flags) \ |
40 | { .dai_id = _dai_id, .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags } | 42 | { .dai_id = _dai_id, .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags } |
41 | #define RSND_SSI_UNUSED \ | 43 | #define RSND_SSI_UNUSED \ |
42 | { .dai_id = -1, .dma_id = -1, .pio_irq = -1, .flags = 0 } | 44 | { .dai_id = -1, .dma_id = -1, .pio_irq = -1, .flags = 0 } |
43 | 45 | ||
44 | struct rsnd_ssi_platform_info { | 46 | struct rsnd_ssi_platform_info { |
45 | int dai_id; | 47 | int dai_id; /* will be removed */ |
46 | int dma_id; | 48 | int dma_id; |
47 | int pio_irq; | 49 | int pio_irq; |
48 | u32 flags; | 50 | u32 flags; |
@@ -53,6 +55,8 @@ struct rsnd_ssi_platform_info { | |||
53 | */ | 55 | */ |
54 | #define RSND_SCU_USE_HPBIF (1 << 31) /* it needs RSND_SSI_DEPENDENT */ | 56 | #define RSND_SCU_USE_HPBIF (1 << 31) /* it needs RSND_SSI_DEPENDENT */ |
55 | 57 | ||
58 | #define RSND_SCU(rate, _dma_id) \ | ||
59 | { .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, } | ||
56 | #define RSND_SCU_SET(rate, _dma_id) \ | 60 | #define RSND_SCU_SET(rate, _dma_id) \ |
57 | { .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, } | 61 | { .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, } |
58 | #define RSND_SCU_UNUSED \ | 62 | #define RSND_SCU_UNUSED \ |
@@ -64,6 +68,15 @@ struct rsnd_scu_platform_info { | |||
64 | int dma_id; /* for Gen2 SCU */ | 68 | int dma_id; /* for Gen2 SCU */ |
65 | }; | 69 | }; |
66 | 70 | ||
71 | struct rsnd_dai_path_info { | ||
72 | struct rsnd_ssi_platform_info *ssi; | ||
73 | }; | ||
74 | |||
75 | struct rsnd_dai_platform_info { | ||
76 | struct rsnd_dai_path_info playback; | ||
77 | struct rsnd_dai_path_info capture; | ||
78 | }; | ||
79 | |||
67 | /* | 80 | /* |
68 | * flags | 81 | * flags |
69 | * | 82 | * |
@@ -81,6 +94,8 @@ struct rcar_snd_info { | |||
81 | int ssi_info_nr; | 94 | int ssi_info_nr; |
82 | struct rsnd_scu_platform_info *scu_info; | 95 | struct rsnd_scu_platform_info *scu_info; |
83 | int scu_info_nr; | 96 | int scu_info_nr; |
97 | struct rsnd_dai_platform_info *dai_info; | ||
98 | int dai_info_nr; | ||
84 | int (*start)(int id); | 99 | int (*start)(int id); |
85 | int (*stop)(int id); | 100 | int (*stop)(int id); |
86 | }; | 101 | }; |
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c index ea747614fbf8..450472633eb1 100644 --- a/sound/soc/sh/rcar/core.c +++ b/sound/soc/sh/rcar/core.c | |||
@@ -639,19 +639,26 @@ static int rsnd_dai_probe(struct platform_device *pdev, | |||
639 | struct rsnd_priv *priv) | 639 | struct rsnd_priv *priv) |
640 | { | 640 | { |
641 | struct snd_soc_dai_driver *drv; | 641 | struct snd_soc_dai_driver *drv; |
642 | struct rcar_snd_info *info = rsnd_priv_to_info(priv); | ||
642 | struct rsnd_dai *rdai; | 643 | struct rsnd_dai *rdai; |
643 | struct rsnd_mod *pmod, *cmod; | 644 | struct rsnd_mod *pmod, *cmod; |
644 | struct device *dev = rsnd_priv_to_dev(priv); | 645 | struct device *dev = rsnd_priv_to_dev(priv); |
645 | int dai_nr; | 646 | int dai_nr = info->dai_info_nr; |
646 | int i; | 647 | int i; |
647 | 648 | ||
648 | /* get max dai nr */ | 649 | /* |
649 | for (dai_nr = 0; dai_nr < 32; dai_nr++) { | 650 | * dai_nr should be set via dai_info_nr, |
650 | pmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 1); | 651 | * but allow it to keeping compatible |
651 | cmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 0); | 652 | */ |
653 | if (!dai_nr) { | ||
654 | /* get max dai nr */ | ||
655 | for (dai_nr = 0; dai_nr < 32; dai_nr++) { | ||
656 | pmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 1); | ||
657 | cmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 0); | ||
652 | 658 | ||
653 | if (!pmod && !cmod) | 659 | if (!pmod && !cmod) |
654 | break; | 660 | break; |
661 | } | ||
655 | } | 662 | } |
656 | 663 | ||
657 | if (!dai_nr) { | 664 | if (!dai_nr) { |
@@ -671,6 +678,8 @@ static int rsnd_dai_probe(struct platform_device *pdev, | |||
671 | priv->rdai = rdai; | 678 | priv->rdai = rdai; |
672 | 679 | ||
673 | for (i = 0; i < dai_nr; i++) { | 680 | for (i = 0; i < dai_nr; i++) { |
681 | if (info->dai_info) | ||
682 | rdai[i].info = &info->dai_info[i]; | ||
674 | 683 | ||
675 | pmod = rsnd_ssi_mod_get_frm_dai(priv, i, 1); | 684 | pmod = rsnd_ssi_mod_get_frm_dai(priv, i, 1); |
676 | cmod = rsnd_ssi_mod_get_frm_dai(priv, i, 0); | 685 | cmod = rsnd_ssi_mod_get_frm_dai(priv, i, 0); |
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c index 25a7d441f8fc..34234813f742 100644 --- a/sound/soc/sh/rcar/ssi.c +++ b/sound/soc/sh/rcar/ssi.c | |||
@@ -451,12 +451,26 @@ static struct rsnd_mod_ops rsnd_ssi_non_ops = { | |||
451 | struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv, | 451 | struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv, |
452 | int dai_id, int is_play) | 452 | int dai_id, int is_play) |
453 | { | 453 | { |
454 | struct rsnd_dai_platform_info *dai_info = NULL; | ||
455 | struct rsnd_dai_path_info *path_info = NULL; | ||
456 | struct rsnd_ssi_platform_info *target_info = NULL; | ||
454 | struct rsnd_ssi *ssi; | 457 | struct rsnd_ssi *ssi; |
455 | int i, has_play; | 458 | int i, has_play; |
456 | 459 | ||
460 | if (priv->rdai) | ||
461 | dai_info = priv->rdai[dai_id].info; | ||
462 | if (dai_info) | ||
463 | path_info = (is_play) ? &dai_info->playback : &dai_info->capture; | ||
464 | if (path_info) | ||
465 | target_info = path_info->ssi; | ||
466 | |||
457 | is_play = !!is_play; | 467 | is_play = !!is_play; |
458 | 468 | ||
459 | for_each_rsnd_ssi(ssi, priv, i) { | 469 | for_each_rsnd_ssi(ssi, priv, i) { |
470 | if (target_info == ssi->info) | ||
471 | return &ssi->mod; | ||
472 | |||
473 | /* for compatible */ | ||
460 | if (rsnd_ssi_dai_id(ssi) != dai_id) | 474 | if (rsnd_ssi_dai_id(ssi) != dai_id) |
461 | continue; | 475 | continue; |
462 | 476 | ||