aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKuninori Morimoto <kuninori.morimoto.gx@renesas.com>2014-03-03 23:49:50 -0500
committerMark Brown <broonie@linaro.org>2014-03-05 01:07:52 -0500
commit78f13d0c5a2888564b2bed7f8433c8ec889997ff (patch)
tree7e02accb8329e190585d57735bcd777fb42e59f7
parentc82e1c8874e5abaf52f9ed886386cbe08ec98a5b (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.h17
-rw-r--r--sound/soc/sh/rcar/core.c23
-rw-r--r--sound/soc/sh/rcar/ssi.c14
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
44struct rsnd_ssi_platform_info { 46struct 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
71struct rsnd_dai_path_info {
72 struct rsnd_ssi_platform_info *ssi;
73};
74
75struct 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 = {
451struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv, 451struct 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