All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/19] ASoC: rsnd: new module path method and DT support
@ 2014-02-25  6:13 Kuninori Morimoto
  2014-02-25  6:14 ` [PATCH 01/19] ASoC: rsnd: move priv member settings to upper side Kuninori Morimoto
                   ` (23 more replies)
  0 siblings, 24 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:13 UTC (permalink / raw)
  To: Mark Brown
  Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto, Kuninori Morimoto


Hi Mark

These are Renesas R-Car sound driver patches.
#1 - #7 are clean up patches.
#8 - #18 adds new module path method
#19 adds DT support

Now, Mark's ALSA branch doesn't include SH-ARM platform branch.
Thus, these patches are keeping compatible for it at this point.
Compatible code will be removed after merge.

Kuninori Morimoto (19):
       1) ASoC: rsnd: move priv member settings to upper side
       2) ASoC: rsnd: move rsnd_mod_call() macro
       3) ASoC: rsnd: remove verbose function parameter
       4) ASoC: rsnd: remove verbose debug message from scu/ssi
       5) ASoC: rsnd: unify rdai naming
       6) ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops
       7) ASoC: rsnd: tidyup RSND_SSI_xxx flags
       8) ASoC: rsnd: run rsnd_path_init() when probe() timing
       9) ASoC: rsnd: use mod array instead of list on rdai
      10) ASoC: rsnd: get ssi/scu from rsnd_dai_stream
      11) ASoC: rsnd: add struct rsnd_dai_platform_info
      12) ASoC: rsnd: use function pointer for each probe
      13) ASoC: rsnd: Get correct SCU ID
      14) ASoC: rsnd: add rsnd_scu_enable_ssi_irq()
      15) ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI
      16) ASoC: rsnd: add probe/remove callback on rsnd_mod_ops
      17) ASoC: rsnd: use mod probe method on SCU
      18) ASoC: rsnd: use mod probe method on SSI
      19) ASoC: rsnd: add DeviceTree support

 .../devicetree/bindings/sound/renesas,rsnd.txt     |  101 ++++++
 include/sound/rcar_snd.h                           |   21 +-
 sound/soc/sh/rcar/adg.c                            |    2 +-
 sound/soc/sh/rcar/core.c                           |  380 ++++++++++++++++----
 sound/soc/sh/rcar/gen.c                            |   78 +---
 sound/soc/sh/rcar/rsnd.h                           |   86 +++--
 sound/soc/sh/rcar/scu.c                            |  188 ++++++----
 sound/soc/sh/rcar/ssi.c                            |  191 +++++++---
 8 files changed, 759 insertions(+), 288 deletions(-)

^ permalink raw reply	[flat|nested] 68+ messages in thread

* [PATCH 01/19] ASoC: rsnd: move priv member settings to upper side
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
@ 2014-02-25  6:14 ` Kuninori Morimoto
  2014-03-03  1:19   ` Mark Brown
  2014-02-25  6:14 ` [PATCH 02/19] ASoC: rsnd: move rsnd_mod_call() macro Kuninori Morimoto
                   ` (22 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:14 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

There is no big meaning, but preparation for platform dai support

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |    8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index f316a663..a8e6aa6 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -594,6 +594,10 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 		return -ENOMEM;
 	}
 
+	priv->dai_nr	= dai_nr;
+	priv->daidrv	= drv;
+	priv->rdai	= rdai;
+
 	for (i = 0; i < dai_nr; i++) {
 
 		pmod = rsnd_ssi_mod_get_frm_dai(priv, i, 1);
@@ -630,10 +634,6 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 			cmod ? "capture" : "  --   ");
 	}
 
-	priv->dai_nr	= dai_nr;
-	priv->daidrv	= drv;
-	priv->rdai	= rdai;
-
 	return 0;
 }
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 02/19] ASoC: rsnd: move rsnd_mod_call() macro
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
  2014-02-25  6:14 ` [PATCH 01/19] ASoC: rsnd: move priv member settings to upper side Kuninori Morimoto
@ 2014-02-25  6:14 ` Kuninori Morimoto
  2014-03-03  1:19   ` Mark Brown
  2014-02-25  6:15 ` [PATCH 03/19] ASoC: rsnd: remove verbose function parameter Kuninori Morimoto
                   ` (21 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:14 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

core.c is the only user of rsnd_mod_call() macro.
Move it to core.c from rsnd.h

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   34 ++++++++++++++++++++++++----------
 sound/soc/sh/rcar/rsnd.h |   13 -------------
 2 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index a8e6aa6..5f6d9fe 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -291,16 +291,30 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 /*
  *	rsnd_dai functions
  */
-#define rsnd_dai_call(rdai, io, fn)			\
-({							\
-	struct rsnd_mod *mod, *n;			\
-	int ret = 0;					\
-	for_each_rsnd_mod(mod, n, io) {			\
-		ret = rsnd_mod_call(mod, fn, rdai, io);	\
-		if (ret < 0)				\
-			break;				\
-	}						\
-	ret;						\
+#define __rsnd_mod_call(mod, func, rdai, io)			\
+({								\
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);		\
+	struct device *dev = rsnd_priv_to_dev(priv);		\
+	dev_dbg(dev, "%s [%d] %s\n",				\
+		rsnd_mod_name(mod), rsnd_mod_id(mod), #func);	\
+	(mod)->ops->func(mod, rdai, io);			\
+})
+
+#define rsnd_mod_call(mod, func, rdai, io)	\
+	(!(mod) ? -ENODEV :			\
+	 !((mod)->ops->func) ? 0 :		\
+	 __rsnd_mod_call(mod, func, (rdai), (io)))
+
+#define rsnd_dai_call(rdai, io, fn)				\
+({								\
+	struct rsnd_mod *mod, *n;				\
+	int ret = 0;						\
+	for_each_rsnd_mod(mod, n, (io)) {			\
+		ret = rsnd_mod_call(mod, fn, (rdai), (io));	\
+		if (ret < 0)					\
+			break;					\
+	}							\
+	ret;							\
 })
 
 int rsnd_dai_connect(struct rsnd_dai *rdai,
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index d409390..fb1e0ce 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -169,19 +169,6 @@ struct rsnd_mod {
 #define rsnd_mod_id(mod) ((mod)->id)
 #define for_each_rsnd_mod(pos, n, io)	\
 	list_for_each_entry_safe(pos, n, &(io)->head, list)
-#define __rsnd_mod_call(mod, func, rdai, io)			\
-({								\
-	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);		\
-	struct device *dev = rsnd_priv_to_dev(priv);		\
-	dev_dbg(dev, "%s-%d-%s\n",				\
-		rsnd_mod_name(mod), rsnd_mod_id(mod), #func);	\
-	(mod)->ops->func(mod, rdai, io);			\
-})
-
-#define rsnd_mod_call(mod, func, rdai, io)	\
-	(!(mod) ? -ENODEV :			\
-	 !((mod)->ops->func) ? 0 :		\
-	 __rsnd_mod_call(mod, func, rdai, io))
 
 void rsnd_mod_init(struct rsnd_priv *priv,
 		   struct rsnd_mod *mod,
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 03/19] ASoC: rsnd: remove verbose function parameter
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
  2014-02-25  6:14 ` [PATCH 01/19] ASoC: rsnd: move priv member settings to upper side Kuninori Morimoto
  2014-02-25  6:14 ` [PATCH 02/19] ASoC: rsnd: move rsnd_mod_call() macro Kuninori Morimoto
@ 2014-02-25  6:15 ` Kuninori Morimoto
  2014-03-03  1:19   ` Mark Brown
  2014-02-25  6:15 ` [PATCH 04/19] ASoC: rsnd: remove verbose debug message from scu/ssi Kuninori Morimoto
                   ` (20 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:15 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

priv has rcar_snd_info pointer.
having priv and info in same time is verbose.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/adg.c  |    1 -
 sound/soc/sh/rcar/core.c |   11 +++++------
 sound/soc/sh/rcar/gen.c  |    7 ++-----
 sound/soc/sh/rcar/rsnd.h |    5 +----
 sound/soc/sh/rcar/scu.c  |    2 +-
 sound/soc/sh/rcar/ssi.c  |    2 +-
 6 files changed, 10 insertions(+), 18 deletions(-)

diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index af9e440..69d9394 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -391,7 +391,6 @@ static void rsnd_adg_ssi_clk_init(struct rsnd_priv *priv, struct rsnd_adg *adg)
 }
 
 int rsnd_adg_probe(struct platform_device *pdev,
-		   struct rcar_snd_info *info,
 		   struct rsnd_priv *priv)
 {
 	struct rsnd_adg *adg;
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 5f6d9fe..b2370f6 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -577,7 +577,6 @@ static const struct snd_soc_dai_ops rsnd_soc_dai_ops = {
 };
 
 static int rsnd_dai_probe(struct platform_device *pdev,
-			  struct rcar_snd_info *info,
 			  struct rsnd_priv *priv)
 {
 	struct snd_soc_dai_driver *drv;
@@ -773,23 +772,23 @@ static int rsnd_probe(struct platform_device *pdev)
 	/*
 	 *	init each module
 	 */
-	ret = rsnd_gen_probe(pdev, info, priv);
+	ret = rsnd_gen_probe(pdev, priv);
 	if (ret)
 		return ret;
 
-	ret = rsnd_ssi_probe(pdev, info, priv);
+	ret = rsnd_ssi_probe(pdev, priv);
 	if (ret)
 		return ret;
 
-	ret = rsnd_scu_probe(pdev, info, priv);
+	ret = rsnd_scu_probe(pdev, priv);
 	if (ret)
 		return ret;
 
-	ret = rsnd_adg_probe(pdev, info, priv);
+	ret = rsnd_adg_probe(pdev, priv);
 	if (ret)
 		return ret;
 
-	ret = rsnd_dai_probe(pdev, info, priv);
+	ret = rsnd_dai_probe(pdev, priv);
 	if (ret)
 		return ret;
 
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 0a43b90..bcb98f4 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -276,7 +276,6 @@ static int rsnd_gen2_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen)
 }
 
 static int rsnd_gen2_probe(struct platform_device *pdev,
-			   struct rcar_snd_info *info,
 			   struct rsnd_priv *priv)
 {
 	struct device *dev = rsnd_priv_to_dev(priv);
@@ -374,7 +373,6 @@ static int rsnd_gen1_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen)
 }
 
 static int rsnd_gen1_probe(struct platform_device *pdev,
-			   struct rcar_snd_info *info,
 			   struct rsnd_priv *priv)
 {
 	struct device *dev = rsnd_priv_to_dev(priv);
@@ -419,7 +417,6 @@ static int rsnd_gen1_probe(struct platform_device *pdev,
  *		Gen
  */
 int rsnd_gen_probe(struct platform_device *pdev,
-		   struct rcar_snd_info *info,
 		   struct rsnd_priv *priv)
 {
 	struct device *dev = rsnd_priv_to_dev(priv);
@@ -436,9 +433,9 @@ int rsnd_gen_probe(struct platform_device *pdev,
 
 	ret = -ENODEV;
 	if (rsnd_is_gen1(priv))
-		ret = rsnd_gen1_probe(pdev, info, priv);
+		ret = rsnd_gen1_probe(pdev, priv);
 	else if (rsnd_is_gen2(priv))
-		ret = rsnd_gen2_probe(pdev, info, priv);
+		ret = rsnd_gen2_probe(pdev, priv);
 
 	if (ret < 0)
 		dev_err(dev, "unknown generation R-Car sound device\n");
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index fb1e0ce..8ac28ac 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -226,7 +226,6 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
  *	R-Car Gen1/Gen2
  */
 int rsnd_gen_probe(struct platform_device *pdev,
-		   struct rcar_snd_info *info,
 		   struct rsnd_priv *priv);
 void rsnd_gen_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv);
@@ -248,7 +247,6 @@ void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
 int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
 int rsnd_adg_probe(struct platform_device *pdev,
-		   struct rcar_snd_info *info,
 		   struct rsnd_priv *priv);
 void rsnd_adg_remove(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
@@ -305,6 +303,7 @@ struct rsnd_priv {
 };
 
 #define rsnd_priv_to_dev(priv)	((priv)->dev)
+#define rsnd_priv_to_info(priv)	((priv)->info)
 #define rsnd_lock(priv, flags) spin_lock_irqsave(&priv->lock, flags)
 #define rsnd_unlock(priv, flags) spin_unlock_irqrestore(&priv->lock, flags)
 
@@ -312,7 +311,6 @@ struct rsnd_priv {
  *	R-Car SCU
  */
 int rsnd_scu_probe(struct platform_device *pdev,
-		   struct rcar_snd_info *info,
 		   struct rsnd_priv *priv);
 void rsnd_scu_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv);
@@ -327,7 +325,6 @@ unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
  *	R-Car SSI
  */
 int rsnd_ssi_probe(struct platform_device *pdev,
-		   struct rcar_snd_info *info,
 		   struct rsnd_priv *priv);
 void rsnd_ssi_remove(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 3984d4b..82d8b20 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -604,9 +604,9 @@ struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id)
 }
 
 int rsnd_scu_probe(struct platform_device *pdev,
-		   struct rcar_snd_info *info,
 		   struct rsnd_priv *priv)
 {
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
 	struct device *dev = rsnd_priv_to_dev(priv);
 	struct rsnd_scu *scu;
 	struct rsnd_mod_ops *ops;
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index d3371d7..2460c9f 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -511,9 +511,9 @@ static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *s
 }
 
 int rsnd_ssi_probe(struct platform_device *pdev,
-		   struct rcar_snd_info *info,
 		   struct rsnd_priv *priv)
 {
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
 	struct rsnd_ssi_platform_info *pinfo;
 	struct device *dev = rsnd_priv_to_dev(priv);
 	struct rsnd_mod_ops *ops;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 04/19] ASoC: rsnd: remove verbose debug message from scu/ssi
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (2 preceding siblings ...)
  2014-02-25  6:15 ` [PATCH 03/19] ASoC: rsnd: remove verbose function parameter Kuninori Morimoto
@ 2014-02-25  6:15 ` Kuninori Morimoto
  2014-03-03  1:20   ` Mark Brown
  2014-02-25  6:15 ` [PATCH 05/19] ASoC: rsnd: unify rdai naming Kuninori Morimoto
                   ` (19 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:15 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

scu/ssi probe() already have more detail debug message.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/scu.c |    1 -
 sound/soc/sh/rcar/ssi.c |    2 --
 2 files changed, 3 deletions(-)

diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 82d8b20..882e837 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -663,7 +663,6 @@ int rsnd_scu_probe(struct platform_device *pdev,
 
 		dev_dbg(dev, "SCU%d probed\n", i);
 	}
-	dev_dbg(dev, "scu probed\n");
 
 	return 0;
 }
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 2460c9f..38a62a8 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -589,8 +589,6 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 		rsnd_ssi_parent_clk_setup(priv, ssi);
 	}
 
-	dev_dbg(dev, "ssi probed\n");
-
 	return 0;
 }
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 05/19] ASoC: rsnd: unify rdai naming
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (3 preceding siblings ...)
  2014-02-25  6:15 ` [PATCH 04/19] ASoC: rsnd: remove verbose debug message from scu/ssi Kuninori Morimoto
@ 2014-02-25  6:15 ` Kuninori Morimoto
  2014-03-03  1:20   ` Mark Brown
  2014-02-25  6:15 ` [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops Kuninori Morimoto
                   ` (18 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:15 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

struct rsnd_dai is called as "rdai",
but its size has been called as "dai_nr".
Unify these as "rdai"

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |    8 ++++----
 sound/soc/sh/rcar/rsnd.h |    6 +++---
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index b2370f6..f0745af 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -352,7 +352,7 @@ int rsnd_dai_id(struct rsnd_priv *priv, struct rsnd_dai *rdai)
 {
 	int id = rdai - priv->rdai;
 
-	if ((id < 0) || (id >= rsnd_dai_nr(priv)))
+	if ((id < 0) || (id >= rsnd_rdai_nr(priv)))
 		return -EINVAL;
 
 	return id;
@@ -360,7 +360,7 @@ int rsnd_dai_id(struct rsnd_priv *priv, struct rsnd_dai *rdai)
 
 struct rsnd_dai *rsnd_dai_get(struct rsnd_priv *priv, int id)
 {
-	if ((id < 0) || (id >= rsnd_dai_nr(priv)))
+	if ((id < 0) || (id >= rsnd_rdai_nr(priv)))
 		return NULL;
 
 	return priv->rdai + id;
@@ -607,7 +607,7 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 		return -ENOMEM;
 	}
 
-	priv->dai_nr	= dai_nr;
+	priv->rdai_nr	= dai_nr;
 	priv->daidrv	= drv;
 	priv->rdai	= rdai;
 
@@ -802,7 +802,7 @@ static int rsnd_probe(struct platform_device *pdev)
 	}
 
 	ret = snd_soc_register_component(dev, &rsnd_soc_component,
-					 priv->daidrv, rsnd_dai_nr(priv));
+					 priv->daidrv, rsnd_rdai_nr(priv));
 	if (ret < 0) {
 		dev_err(dev, "cannot snd dai register\n");
 		goto exit_snd_soc;
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 8ac28ac..3962a50 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -202,10 +202,10 @@ struct rsnd_dai {
 	unsigned int data_alignment:1;
 };
 
-#define rsnd_dai_nr(priv) ((priv)->dai_nr)
+#define rsnd_rdai_nr(priv) ((priv)->rdai_nr)
 #define for_each_rsnd_dai(rdai, priv, i)		\
 	for (i = 0;					\
-	     (i < rsnd_dai_nr(priv)) &&			\
+	     (i < rsnd_rdai_nr(priv)) &&		\
 	     ((rdai) = rsnd_dai_get(priv, i));		\
 	     i++)
 
@@ -299,7 +299,7 @@ struct rsnd_priv {
 	 */
 	struct snd_soc_dai_driver *daidrv;
 	struct rsnd_dai *rdai;
-	int dai_nr;
+	int rdai_nr;
 };
 
 #define rsnd_priv_to_dev(priv)	((priv)->dev)
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (4 preceding siblings ...)
  2014-02-25  6:15 ` [PATCH 05/19] ASoC: rsnd: unify rdai naming Kuninori Morimoto
@ 2014-02-25  6:15 ` Kuninori Morimoto
  2014-03-03  1:18   ` Mark Brown
  2014-02-25  6:15 ` [PATCH 07/19] ASoC: rsnd: tidyup RSND_SSI_xxx flags Kuninori Morimoto
                   ` (17 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:15 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

This patch adds struct snd_soc_dai_ops :: set_sysclk.
But, it do nothing, since rsnd sysclk is controlled by ADG.
Without this patch, simple-card init will be failed
if DT case.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |    8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index f0745af..98771f7 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -571,9 +571,17 @@ static int rsnd_soc_dai_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
 	return 0;
 }
 
+static int rsnd_soc_dai_set_sysclk(struct snd_soc_dai *codec_dai,
+				   int clk_id, unsigned int freq, int dir)
+{
+	/* rsnd sysclk is controlled by ADG */
+	return 0;
+}
+
 static const struct snd_soc_dai_ops rsnd_soc_dai_ops = {
 	.trigger	= rsnd_soc_dai_trigger,
 	.set_fmt	= rsnd_soc_dai_set_fmt,
+	.set_sysclk	= rsnd_soc_dai_set_sysclk,
 };
 
 static int rsnd_dai_probe(struct platform_device *pdev,
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 07/19] ASoC: rsnd: tidyup RSND_SSI_xxx flags
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (5 preceding siblings ...)
  2014-02-25  6:15 ` [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops Kuninori Morimoto
@ 2014-02-25  6:15 ` Kuninori Morimoto
  2014-03-03  1:21   ` Mark Brown
  2014-02-25  6:15 ` [PATCH 08/19] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
                   ` (16 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:15 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

6f3ab6c1c022e7a4877d38940cd45ae7804a15e2
(ASoC: rsnd: remove pin sync option)
added unused RSND_SSI_CLK_FROM_ADG flag.
It should remove RSND_SSI_SYNC.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/rcar_snd.h |    3 ---
 1 file changed, 3 deletions(-)

diff --git a/include/sound/rcar_snd.h b/include/sound/rcar_snd.h
index 2be05ae..e3d585c 100644
--- a/include/sound/rcar_snd.h
+++ b/include/sound/rcar_snd.h
@@ -34,9 +34,6 @@
  * B : SSI direction
  */
 #define RSND_SSI_CLK_PIN_SHARE		(1 << 31)
-#define RSND_SSI_SYNC			(1 << 29) /* SSI34_sync etc */
-#define RSND_SSI_CLK_FROM_ADG		(1 << 30) /* clock parent is master */
-
 #define RSND_SSI_PLAY			(1 << 24)
 
 #define RSND_SSI_SET(_dai_id, _dma_id, _pio_irq, _flags)	\
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 08/19] ASoC: rsnd: run rsnd_path_init() when probe() timing
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (6 preceding siblings ...)
  2014-02-25  6:15 ` [PATCH 07/19] ASoC: rsnd: tidyup RSND_SSI_xxx flags Kuninori Morimoto
@ 2014-02-25  6:15 ` Kuninori Morimoto
  2014-03-03  1:22   ` Mark Brown
  2014-02-25  6:15 ` [PATCH 09/19] ASoC: rsnd: use mod array instead of list on rdai Kuninori Morimoto
                   ` (15 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:15 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current rsnd SSIU/SSI/SCU/SRU path is set
when playback/capture starts up.
But it is meaningless method, since the path is based
on platform and can be set in probe() timing.
This patch sets the path on probe() timing.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   94 ++++++++++++++++++++++++++++++++++++++--------
 sound/soc/sh/rcar/gen.c  |   56 ---------------------------
 sound/soc/sh/rcar/rsnd.h |    9 -----
 3 files changed, 78 insertions(+), 81 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 98771f7..325b8fb 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -317,9 +317,9 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 	ret;							\
 })
 
-int rsnd_dai_connect(struct rsnd_dai *rdai,
-		     struct rsnd_mod *mod,
-		     struct rsnd_dai_stream *io)
+static int rsnd_dai_connect(struct rsnd_dai *rdai,
+			    struct rsnd_mod *mod,
+			    struct rsnd_dai_stream *io)
 {
 	if (!mod)
 		return -EIO;
@@ -340,7 +340,7 @@ int rsnd_dai_connect(struct rsnd_dai *rdai,
 	return 0;
 }
 
-int rsnd_dai_disconnect(struct rsnd_mod *mod)
+static int rsnd_dai_disconnect(struct rsnd_mod *mod)
 {
 	list_del_init(&mod->list);
 	mod->io = NULL;
@@ -418,10 +418,6 @@ static int rsnd_dai_stream_init(struct rsnd_dai_stream *io,
 {
 	struct snd_pcm_runtime *runtime = substream->runtime;
 
-	if (!list_empty(&io->head))
-		return -EIO;
-
-	INIT_LIST_HEAD(&io->head);
 	io->substream		= substream;
 	io->byte_pos		= 0;
 	io->period_pos		= 0;
@@ -476,10 +472,6 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 		if (ret < 0)
 			goto dai_trigger_end;
 
-		ret = rsnd_gen_path_init(priv, rdai, io);
-		if (ret < 0)
-			goto dai_trigger_end;
-
 		ret = rsnd_dai_call(rdai, io, init);
 		if (ret < 0)
 			goto dai_trigger_end;
@@ -497,10 +489,6 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 		if (ret < 0)
 			goto dai_trigger_end;
 
-		ret = rsnd_gen_path_exit(priv, rdai, io);
-		if (ret < 0)
-			goto dai_trigger_end;
-
 		ret = rsnd_platform_call(priv, dai, stop, ssi_id);
 		if (ret < 0)
 			goto dai_trigger_end;
@@ -584,6 +572,70 @@ static const struct snd_soc_dai_ops rsnd_soc_dai_ops = {
 	.set_sysclk	= rsnd_soc_dai_set_sysclk,
 };
 
+static int rsnd_path_init(struct rsnd_priv *priv,
+			  struct rsnd_dai *rdai,
+			  struct rsnd_dai_stream *io)
+{
+	struct rsnd_mod *mod;
+	int ret;
+	int id;
+
+	/*
+	 * Gen1 is created by SRU/SSI, and this SRU is base module of
+	 * Gen2's SCU/SSIU/SSI. (Gen2 SCU/SSIU came from SRU)
+	 *
+	 * Easy image is..
+	 *	Gen1 SRU = Gen2 SCU + SSIU + etc
+	 *
+	 * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is
+	 * using fixed path.
+	 *
+	 * Then, SSI id = SCU id here
+	 */
+	/* get SSI's ID */
+	mod = rsnd_ssi_mod_get_frm_dai(priv,
+				       rsnd_dai_id(priv, rdai),
+				       rsnd_dai_is_play(rdai, io));
+	if (!mod)
+		return 0;
+	id = rsnd_mod_id(mod);
+	ret = 0;
+
+	/* SCU */
+	mod = rsnd_scu_mod_get(priv, id);
+	if (mod) {
+		ret = rsnd_dai_connect(rdai, mod, io);
+		if (ret < 0)
+			return ret;
+	}
+
+	/* SSI */
+	mod = rsnd_ssi_mod_get(priv, id);
+	if (mod) {
+		ret = rsnd_dai_connect(rdai, mod, io);
+		if (ret < 0)
+			return ret;
+	}
+
+	return ret;
+}
+
+static int rsnd_path_exit(struct rsnd_priv *priv,
+			  struct rsnd_dai *rdai,
+			  struct rsnd_dai_stream *io)
+{
+	struct rsnd_mod *mod, *n;
+	int ret = 0;
+
+	/*
+	 * remove all mod from rdai
+	 */
+	for_each_rsnd_mod(mod, n, io)
+		ret |= rsnd_dai_disconnect(mod);
+
+	return ret;
+}
+
 static int rsnd_dai_probe(struct platform_device *pdev,
 			  struct rsnd_priv *priv)
 {
@@ -642,12 +694,14 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 			drv[i].playback.formats		= RSND_FMTS;
 			drv[i].playback.channels_min	= 2;
 			drv[i].playback.channels_max	= 2;
+			rsnd_path_init(priv, &rdai[i], &rdai[i].playback);
 		}
 		if (cmod) {
 			drv[i].capture.rates		= RSND_RATES;
 			drv[i].capture.formats		= RSND_FMTS;
 			drv[i].capture.channels_min	= 2;
 			drv[i].capture.channels_max	= 2;
+			rsnd_path_init(priv, &rdai[i], &rdai[i].capture);
 		}
 
 		dev_dbg(dev, "%s (%s/%s)\n", rdai[i].name,
@@ -661,6 +715,14 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 static void rsnd_dai_remove(struct platform_device *pdev,
 			  struct rsnd_priv *priv)
 {
+	struct rsnd_dai *rdai;
+	int i;
+
+	for (i = 0; i < rsnd_rdai_nr(priv); i++) {
+		rdai = rsnd_dai_get(priv, i);
+		rsnd_path_exit(priv, rdai, &rdai->playback);
+		rsnd_path_exit(priv, rdai, &rdai->capture);
+	}
 }
 
 /*
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index bcb98f4..4f2c1d0 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -155,62 +155,6 @@ static int rsnd_gen_regmap_init(struct rsnd_priv *priv,
 	return 0;
 }
 
-int rsnd_gen_path_init(struct rsnd_priv *priv,
-		       struct rsnd_dai *rdai,
-		       struct rsnd_dai_stream *io)
-{
-	struct rsnd_mod *mod;
-	int ret;
-	int id;
-
-	/*
-	 * Gen1 is created by SRU/SSI, and this SRU is base module of
-	 * Gen2's SCU/SSIU/SSI. (Gen2 SCU/SSIU came from SRU)
-	 *
-	 * Easy image is..
-	 *	Gen1 SRU = Gen2 SCU + SSIU + etc
-	 *
-	 * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is
-	 * using fixed path.
-	 *
-	 * Then, SSI id = SCU id here
-	 */
-
-	/* get SSI's ID */
-	mod = rsnd_ssi_mod_get_frm_dai(priv,
-				       rsnd_dai_id(priv, rdai),
-				       rsnd_dai_is_play(rdai, io));
-	id = rsnd_mod_id(mod);
-
-	/* SCU */
-	mod = rsnd_scu_mod_get(priv, id);
-	ret = rsnd_dai_connect(rdai, mod, io);
-	if (ret < 0)
-		return ret;
-
-	/* SSI */
-	mod = rsnd_ssi_mod_get(priv, id);
-	ret = rsnd_dai_connect(rdai, mod, io);
-
-	return ret;
-}
-
-int rsnd_gen_path_exit(struct rsnd_priv *priv,
-		       struct rsnd_dai *rdai,
-		       struct rsnd_dai_stream *io)
-{
-	struct rsnd_mod *mod, *n;
-	int ret = 0;
-
-	/*
-	 * remove all mod from rdai
-	 */
-	for_each_rsnd_mod(mod, n, io)
-		ret |= rsnd_dai_disconnect(mod);
-
-	return ret;
-}
-
 /*
  *		Gen2
  */
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 3962a50..6a25203 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -210,9 +210,6 @@ struct rsnd_dai {
 	     i++)
 
 struct rsnd_dai *rsnd_dai_get(struct rsnd_priv *priv, int id);
-int rsnd_dai_disconnect(struct rsnd_mod *mod);
-int rsnd_dai_connect(struct rsnd_dai *rdai, struct rsnd_mod *mod,
-		     struct rsnd_dai_stream *io);
 int rsnd_dai_is_play(struct rsnd_dai *rdai, struct rsnd_dai_stream *io);
 int rsnd_dai_id(struct rsnd_priv *priv, struct rsnd_dai *rdai);
 #define rsnd_dai_get_platform_info(rdai) ((rdai)->info)
@@ -229,12 +226,6 @@ int rsnd_gen_probe(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
 void rsnd_gen_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv);
-int rsnd_gen_path_init(struct rsnd_priv *priv,
-		       struct rsnd_dai *rdai,
-		       struct rsnd_dai_stream *io);
-int rsnd_gen_path_exit(struct rsnd_priv *priv,
-		       struct rsnd_dai *rdai,
-		       struct rsnd_dai_stream *io);
 void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 			       struct rsnd_mod *mod,
 			       enum rsnd_reg reg);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 09/19] ASoC: rsnd: use mod array instead of list on rdai
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (7 preceding siblings ...)
  2014-02-25  6:15 ` [PATCH 08/19] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
@ 2014-02-25  6:15 ` Kuninori Morimoto
  2014-02-25  6:15 ` [PATCH 10/19] ASoC: rsnd: get ssi/scu from rsnd_dai_stream Kuninori Morimoto
                   ` (14 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:15 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

struct rsnd_dai_stream used list for mod list.
It added only odd flexibility to current driver, and
it is a factor which makes extendibility difficult.
rsnd use mod array instead of list from now.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   42 +++++++++++++++++++++++-------------------
 sound/soc/sh/rcar/rsnd.h |   12 ++++++++----
 sound/soc/sh/rcar/scu.c  |    2 +-
 sound/soc/sh/rcar/ssi.c  |    2 +-
 4 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 325b8fb..1fc6216 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -121,12 +121,13 @@ char *rsnd_mod_name(struct rsnd_mod *mod)
 void rsnd_mod_init(struct rsnd_priv *priv,
 		   struct rsnd_mod *mod,
 		   struct rsnd_mod_ops *ops,
+		   enum rsnd_mod_type type,
 		   int id)
 {
 	mod->priv	= priv;
 	mod->id		= id;
 	mod->ops	= ops;
-	INIT_LIST_HEAD(&mod->list);
+	mod->type	= type;
 }
 
 /*
@@ -307,9 +308,12 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 
 #define rsnd_dai_call(rdai, io, fn)				\
 ({								\
-	struct rsnd_mod *mod, *n;				\
-	int ret = 0;						\
-	for_each_rsnd_mod(mod, n, (io)) {			\
+	struct rsnd_mod *mod;					\
+	int ret = 0, i;						\
+	for (i = 0; i < RSND_MOD_MAX; i++) {			\
+		mod = (io)->mod[i];				\
+		if (!mod)					\
+			continue;				\
 		ret = rsnd_mod_call(mod, fn, (rdai), (io));	\
 		if (ret < 0)					\
 			break;					\
@@ -317,14 +321,13 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 	ret;							\
 })
 
-static int rsnd_dai_connect(struct rsnd_dai *rdai,
-			    struct rsnd_mod *mod,
+static int rsnd_dai_connect(struct rsnd_mod *mod,
 			    struct rsnd_dai_stream *io)
 {
 	if (!mod)
 		return -EIO;
 
-	if (!list_empty(&mod->list)) {
+	if (io->mod[mod->type]) {
 		struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 		struct device *dev = rsnd_priv_to_dev(priv);
 
@@ -334,15 +337,15 @@ static int rsnd_dai_connect(struct rsnd_dai *rdai,
 		return -EIO;
 	}
 
-	list_add_tail(&mod->list, &io->head);
+	io->mod[mod->type] = mod;
 	mod->io = io;
 
 	return 0;
 }
 
-static int rsnd_dai_disconnect(struct rsnd_mod *mod)
+static int rsnd_dai_disconnect(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
 {
-	list_del_init(&mod->list);
+	io->mod[mod->type] = NULL;
 	mod->io = NULL;
 
 	return 0;
@@ -604,7 +607,7 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	/* SCU */
 	mod = rsnd_scu_mod_get(priv, id);
 	if (mod) {
-		ret = rsnd_dai_connect(rdai, mod, io);
+		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
 	}
@@ -612,7 +615,7 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	/* SSI */
 	mod = rsnd_ssi_mod_get(priv, id);
 	if (mod) {
-		ret = rsnd_dai_connect(rdai, mod, io);
+		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
 	}
@@ -624,14 +627,18 @@ static int rsnd_path_exit(struct rsnd_priv *priv,
 			  struct rsnd_dai *rdai,
 			  struct rsnd_dai_stream *io)
 {
-	struct rsnd_mod *mod, *n;
-	int ret = 0;
+	struct rsnd_mod *mod;
+	int ret = 0, i;
 
 	/*
 	 * remove all mod from rdai
 	 */
-	for_each_rsnd_mod(mod, n, io)
-		ret |= rsnd_dai_disconnect(mod);
+	for (i = 0; i < RSND_MOD_MAX; i++) {
+		mod = io->mod[i];
+		if (!mod)
+			continue;
+		ret |= rsnd_dai_disconnect(mod, io);
+	}
 
 	return ret;
 }
@@ -679,9 +686,6 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 		/*
 		 *	init rsnd_dai
 		 */
-		INIT_LIST_HEAD(&rdai[i].playback.head);
-		INIT_LIST_HEAD(&rdai[i].capture.head);
-
 		snprintf(rdai[i].name, RSND_DAI_NAME_SIZE, "rsnd-dai.%d", i);
 
 		/*
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 6a25203..7767a8f 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -135,6 +135,11 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 /*
  *	R-Car sound mod
  */
+enum rsnd_mod_type {
+	RSND_MOD_SCU = 0,
+	RSND_MOD_SSI,
+	RSND_MOD_MAX,
+};
 
 struct rsnd_mod_ops {
 	char *name;
@@ -155,9 +160,9 @@ struct rsnd_mod_ops {
 struct rsnd_dai_stream;
 struct rsnd_mod {
 	int id;
+	enum rsnd_mod_type type;
 	struct rsnd_priv *priv;
 	struct rsnd_mod_ops *ops;
-	struct list_head list; /* connect to rsnd_dai playback/capture */
 	struct rsnd_dma dma;
 	struct rsnd_dai_stream *io;
 };
@@ -167,12 +172,11 @@ struct rsnd_mod {
 #define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma)
 #define rsnd_mod_to_io(mod) ((mod)->io)
 #define rsnd_mod_id(mod) ((mod)->id)
-#define for_each_rsnd_mod(pos, n, io)	\
-	list_for_each_entry_safe(pos, n, &(io)->head, list)
 
 void rsnd_mod_init(struct rsnd_priv *priv,
 		   struct rsnd_mod *mod,
 		   struct rsnd_mod_ops *ops,
+		   enum rsnd_mod_type type,
 		   int id);
 char *rsnd_mod_name(struct rsnd_mod *mod);
 
@@ -181,8 +185,8 @@ char *rsnd_mod_name(struct rsnd_mod *mod);
  */
 #define RSND_DAI_NAME_SIZE	16
 struct rsnd_dai_stream {
-	struct list_head head; /* head of rsnd_mod list */
 	struct snd_pcm_substream *substream;
+	struct rsnd_mod *mod[RSND_MOD_MAX];
 	int byte_pos;
 	int period_pos;
 	int byte_per_period;
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 882e837..81264ec 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -659,7 +659,7 @@ int rsnd_scu_probe(struct platform_device *pdev,
 				ops = &rsnd_scu_non_gen2_ops;
 		}
 
-		rsnd_mod_init(priv, &scu->mod, ops, i);
+		rsnd_mod_init(priv, &scu->mod, ops, RSND_MOD_SCU, i);
 
 		dev_dbg(dev, "SCU%d probed\n", i);
 	}
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 38a62a8..480dde5 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -584,7 +584,7 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 			dev_dbg(dev, "SSI%d use PIO transfer\n", i);
 		}
 
-		rsnd_mod_init(priv, &ssi->mod, ops, i);
+		rsnd_mod_init(priv, &ssi->mod, ops, RSND_MOD_SSI, i);
 
 		rsnd_ssi_parent_clk_setup(priv, ssi);
 	}
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 10/19] ASoC: rsnd: get ssi/scu from rsnd_dai_stream
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (8 preceding siblings ...)
  2014-02-25  6:15 ` [PATCH 09/19] ASoC: rsnd: use mod array instead of list on rdai Kuninori Morimoto
@ 2014-02-25  6:15 ` Kuninori Morimoto
  2014-02-25  6:16 ` [PATCH 11/19] ASoC: rsnd: add struct rsnd_dai_platform_info Kuninori Morimoto
                   ` (13 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:15 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current driver is assuming that SSI id = SCU id.
But, now, it can get correct SSI/SCU from
rsnd_dai_stream. use it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/rsnd.h |    4 +++-
 sound/soc/sh/rcar/scu.c  |   20 +++++++++++---------
 sound/soc/sh/rcar/ssi.c  |    2 +-
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 7767a8f..cbc38a2 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -192,6 +192,8 @@ struct rsnd_dai_stream {
 	int byte_per_period;
 	int next_period_byte;
 };
+#define rsnd_io_to_mod_ssi(io)	((io)->mod[RSND_MOD_SSI])
+#define rsnd_io_to_mod_scu(io)	((io)->mod[RSND_MOD_SCU])
 
 struct rsnd_dai {
 	char name[RSND_DAI_NAME_SIZE];
@@ -311,7 +313,7 @@ void rsnd_scu_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
-				   struct rsnd_mod *ssi_mod,
+				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime);
 
 #define rsnd_scu_nr(priv) ((priv)->scu_nr)
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 81264ec..1073d35 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -121,7 +121,8 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 {
 	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	int id = rsnd_mod_id(mod);
+	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
+	int ssi_id = rsnd_mod_id(ssi_mod);
 	u32 convert_rate = rsnd_scu_convert_rate(scu);
 
 	if (convert_rate && !rsnd_dai_is_clk_master(rdai)) {
@@ -134,15 +135,15 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 	/*
 	 * SSI_MODE0
 	 */
-	rsnd_mod_bset(mod, SSI_MODE0, (1 << id),
-		      rsnd_scu_hpbif_is_enable(scu) ? 0 : (1 << id));
+	rsnd_mod_bset(mod, SSI_MODE0, (1 << ssi_id),
+		      rsnd_scu_hpbif_is_enable(scu) ? 0 : (1 << ssi_id));
 
 	/*
 	 * SSI_MODE1
 	 */
-	if (rsnd_ssi_is_pin_sharing(rsnd_ssi_mod_get(priv, id))) {
+	if (rsnd_ssi_is_pin_sharing(ssi_mod)) {
 		int shift = -1;
-		switch (id) {
+		switch (ssi_id) {
 		case 1:
 			shift = 0;
 			break;
@@ -165,14 +166,13 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 }
 
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
-				   struct rsnd_mod *ssi_mod,
+				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime)
 {
 	struct rsnd_scu *scu;
 	unsigned int rate;
 
-	/* this function is assuming SSI id = SCU id here */
-	scu = rsnd_mod_to_scu(rsnd_scu_mod_get(priv, rsnd_mod_id(ssi_mod)));
+	scu = rsnd_mod_to_scu(rsnd_io_to_mod_scu(io));
 
 	/*
 	 * return convert rate if SRC is used,
@@ -583,8 +583,10 @@ static int rsnd_scu_start_non_gen2(struct rsnd_mod *mod,
 				   struct rsnd_dai *rdai,
 				   struct rsnd_dai_stream *io)
 {
+	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
+
 	/* enable PIO interrupt */
-	rsnd_mod_write(mod, INT_ENABLE, 0x0f000000);
+	rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
 
 	return 0;
 }
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 480dde5..25a7d44 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -121,7 +121,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
 		1, 2, 4, 8, 16, 6, 12,
 	};
 	unsigned int main_rate;
-	unsigned int rate = rsnd_scu_get_ssi_rate(priv, &ssi->mod, runtime);
+	unsigned int rate = rsnd_scu_get_ssi_rate(priv, io, runtime);
 
 	/*
 	 * Find best clock, and try to start ADG
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 11/19] ASoC: rsnd: add struct rsnd_dai_platform_info
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (9 preceding siblings ...)
  2014-02-25  6:15 ` [PATCH 10/19] ASoC: rsnd: get ssi/scu from rsnd_dai_stream Kuninori Morimoto
@ 2014-02-25  6:16 ` Kuninori Morimoto
  2014-02-25  6:16 ` [PATCH 12/19] ASoC: rsnd: use function pointer for each probe Kuninori Morimoto
                   ` (12 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:16 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

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>
---
 include/sound/rcar_snd.h |   17 ++++++++++++++++-
 sound/soc/sh/rcar/core.c |   23 ++++++++++++++++-------
 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 e3d585c..698f7b5 100644
--- a/include/sound/rcar_snd.h
+++ b/include/sound/rcar_snd.h
@@ -36,13 +36,15 @@
 #define RSND_SSI_CLK_PIN_SHARE		(1 << 31)
 #define RSND_SSI_PLAY			(1 << 24)
 
+#define RSND_SSI(_dma_id, _pio_irq, _flags)		\
+{ .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags }
 #define RSND_SSI_SET(_dai_id, _dma_id, _pio_irq, _flags)	\
 { .dai_id = _dai_id, .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags }
 #define RSND_SSI_UNUSED \
 { .dai_id = -1, .dma_id = -1, .pio_irq = -1, .flags = 0 }
 
 struct rsnd_ssi_platform_info {
-	int dai_id;
+	int dai_id;	/* will be removed */
 	int dma_id;
 	int pio_irq;
 	u32 flags;
@@ -53,6 +55,8 @@ struct rsnd_ssi_platform_info {
  */
 #define RSND_SCU_USE_HPBIF		(1 << 31) /* it needs RSND_SSI_DEPENDENT */
 
+#define RSND_SCU(rate, _dma_id)						\
+{ .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, }
 #define RSND_SCU_SET(rate, _dma_id)		\
 	{ .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, }
 #define RSND_SCU_UNUSED				\
@@ -64,6 +68,15 @@ struct rsnd_scu_platform_info {
 	int dma_id; /* for Gen2 SCU */
 };
 
+struct rsnd_dai_path_info {
+	struct rsnd_ssi_platform_info *ssi;
+};
+
+struct rsnd_dai_platform_info {
+	struct rsnd_dai_path_info playback;
+	struct rsnd_dai_path_info capture;
+};
+
 /*
  * flags
  *
@@ -81,6 +94,8 @@ struct rcar_snd_info {
 	int ssi_info_nr;
 	struct rsnd_scu_platform_info *scu_info;
 	int scu_info_nr;
+	struct rsnd_dai_platform_info *dai_info;
+	int dai_info_nr;
 	int (*start)(int id);
 	int (*stop)(int id);
 };
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 1fc6216..50047b3 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -647,19 +647,26 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 			  struct rsnd_priv *priv)
 {
 	struct snd_soc_dai_driver *drv;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
 	struct rsnd_dai *rdai;
 	struct rsnd_mod *pmod, *cmod;
 	struct device *dev = rsnd_priv_to_dev(priv);
-	int dai_nr;
+	int dai_nr = info->dai_info_nr;
 	int i;
 
-	/* get max dai nr */
-	for (dai_nr = 0; dai_nr < 32; dai_nr++) {
-		pmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 1);
-		cmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 0);
+	/*
+	 * dai_nr should be set via dai_info_nr,
+	 * but allow it to keeping compatible
+	 */
+	if (!dai_nr) {
+		/* get max dai nr */
+		for (dai_nr = 0; dai_nr < 32; dai_nr++) {
+			pmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 1);
+			cmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 0);
 
-		if (!pmod && !cmod)
-			break;
+			if (!pmod && !cmod)
+				break;
+		}
 	}
 
 	if (!dai_nr) {
@@ -679,6 +686,8 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 	priv->rdai	= rdai;
 
 	for (i = 0; i < dai_nr; i++) {
+		if (info->dai_info)
+			rdai[i].info = &info->dai_info[i];
 
 		pmod = rsnd_ssi_mod_get_frm_dai(priv, i, 1);
 		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 25a7d44..3423481 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 = {
 struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv,
 					  int dai_id, int is_play)
 {
+	struct rsnd_dai_platform_info *dai_info = NULL;
+	struct rsnd_dai_path_info *path_info = NULL;
+	struct rsnd_ssi_platform_info *target_info = NULL;
 	struct rsnd_ssi *ssi;
 	int i, has_play;
 
+	if (priv->rdai)
+		dai_info = priv->rdai[dai_id].info;
+	if (dai_info)
+		path_info = (is_play) ? &dai_info->playback : &dai_info->capture;
+	if (path_info)
+		target_info = path_info->ssi;
+
 	is_play = !!is_play;
 
 	for_each_rsnd_ssi(ssi, priv, i) {
+		if (target_info == ssi->info)
+			return &ssi->mod;
+
+		/* for compatible */
 		if (rsnd_ssi_dai_id(ssi) != dai_id)
 			continue;
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 12/19] ASoC: rsnd: use function pointer for each probe
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (10 preceding siblings ...)
  2014-02-25  6:16 ` [PATCH 11/19] ASoC: rsnd: add struct rsnd_dai_platform_info Kuninori Morimoto
@ 2014-02-25  6:16 ` Kuninori Morimoto
  2014-02-25  6:16 ` [PATCH 13/19] ASoC: rsnd: Get correct SCU ID Kuninori Morimoto
                   ` (11 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:16 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

R-Car sound consists of many devices.
It will have more device support in the future.
Thus, for each probe become now function pointer array.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 50047b3..3933ec4 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -831,7 +831,15 @@ static int rsnd_probe(struct platform_device *pdev)
 	struct rcar_snd_info *info;
 	struct rsnd_priv *priv;
 	struct device *dev = &pdev->dev;
-	int ret;
+	int (*probe_func[])(struct platform_device *pdev,
+			    struct rsnd_priv *priv) = {
+		rsnd_gen_probe,
+		rsnd_ssi_probe,
+		rsnd_scu_probe,
+		rsnd_adg_probe,
+		rsnd_dai_probe,
+	};
+	int ret, i;
 
 	info = pdev->dev.platform_data;
 	if (!info) {
@@ -855,25 +863,11 @@ static int rsnd_probe(struct platform_device *pdev)
 	/*
 	 *	init each module
 	 */
-	ret = rsnd_gen_probe(pdev, priv);
-	if (ret)
-		return ret;
-
-	ret = rsnd_ssi_probe(pdev, priv);
-	if (ret)
-		return ret;
-
-	ret = rsnd_scu_probe(pdev, priv);
-	if (ret)
-		return ret;
-
-	ret = rsnd_adg_probe(pdev, priv);
-	if (ret)
-		return ret;
-
-	ret = rsnd_dai_probe(pdev, priv);
-	if (ret)
-		return ret;
+	for (i = 0; i < ARRAY_SIZE(probe_func); i++) {
+		ret = probe_func[i](pdev, priv);
+		if (ret)
+			return ret;
+	}
 
 	/*
 	 *	asoc register
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 13/19] ASoC: rsnd: Get correct SCU ID
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (11 preceding siblings ...)
  2014-02-25  6:16 ` [PATCH 12/19] ASoC: rsnd: use function pointer for each probe Kuninori Morimoto
@ 2014-02-25  6:16 ` Kuninori Morimoto
  2014-02-25  6:16 ` [PATCH 14/19] ASoC: rsnd: add rsnd_scu_enable_ssi_irq() Kuninori Morimoto
                   ` (10 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:16 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current rsnd driver is assuming that SCU/SRU ID is
same as SSIU/SSI ID, because Gen1 can't select it.
But, Gen2 can select it.
The SCU/SRU/SSIU/SSI pair depends on the platform.
This patch get correct SCU ID from platform info.
To keep compatible, it still assuming SCU ID = SSI ID
if platform doesn't have info

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/rcar_snd.h |    1 +
 sound/soc/sh/rcar/core.c |   47 ++++++++++++++++++++++++++++++++--------------
 sound/soc/sh/rcar/rsnd.h |   14 ++++++++++++++
 sound/soc/sh/rcar/scu.c  |   21 ++++++++++++++++-----
 sound/soc/sh/rcar/ssi.c  |    9 ++++++++-
 5 files changed, 72 insertions(+), 20 deletions(-)

diff --git a/include/sound/rcar_snd.h b/include/sound/rcar_snd.h
index 698f7b5..1d8c683 100644
--- a/include/sound/rcar_snd.h
+++ b/include/sound/rcar_snd.h
@@ -70,6 +70,7 @@ struct rsnd_scu_platform_info {
 
 struct rsnd_dai_path_info {
 	struct rsnd_ssi_platform_info *ssi;
+	struct rsnd_scu_platform_info *scu;
 };
 
 struct rsnd_dai_platform_info {
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 3933ec4..4817b0c 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -107,6 +107,11 @@
 	(!(priv->info->func) ? 0 :		\
 	 priv->info->func(param))
 
+#define rsnd_is_enable_path(io, name) \
+	((io)->info ? (io)->info->name : NULL)
+#define rsnd_info_id(priv, io, name) \
+	((io)->info->name - priv->info->name##_info)
+
 /*
  *	rsnd_mod functions
  */
@@ -580,8 +585,10 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 			  struct rsnd_dai_stream *io)
 {
 	struct rsnd_mod *mod;
+	struct rsnd_dai_platform_info *dai_info = rdai->info;
 	int ret;
-	int id;
+	int ssi_id = -1;
+	int scu_id = -1;
 
 	/*
 	 * Gen1 is created by SRU/SSI, and this SRU is base module of
@@ -592,29 +599,35 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	 *
 	 * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is
 	 * using fixed path.
-	 *
-	 * Then, SSI id = SCU id here
 	 */
-	/* get SSI's ID */
-	mod = rsnd_ssi_mod_get_frm_dai(priv,
-				       rsnd_dai_id(priv, rdai),
-				       rsnd_dai_is_play(rdai, io));
-	if (!mod)
-		return 0;
-	id = rsnd_mod_id(mod);
+	if (dai_info) {
+		if (rsnd_is_enable_path(io, ssi))
+			ssi_id = rsnd_info_id(priv, io, ssi);
+		if (rsnd_is_enable_path(io, scu))
+			scu_id = rsnd_info_id(priv, io, scu);
+	} else {
+		/* get SSI's ID */
+		mod = rsnd_ssi_mod_get_frm_dai(priv,
+					       rsnd_dai_id(priv, rdai),
+					       rsnd_dai_is_play(rdai, io));
+		if (!mod)
+			return 0;
+		ssi_id = scu_id = rsnd_mod_id(mod);
+	}
+
 	ret = 0;
 
 	/* SCU */
-	mod = rsnd_scu_mod_get(priv, id);
-	if (mod) {
+	if (scu_id >= 0) {
+		mod = rsnd_scu_mod_get(priv, scu_id);
 		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
 	}
 
 	/* SSI */
-	mod = rsnd_ssi_mod_get(priv, id);
-	if (mod) {
+	if (ssi_id >= 0) {
+		mod = rsnd_ssi_mod_get(priv, ssi_id);
 		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
@@ -707,6 +720,9 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 			drv[i].playback.formats		= RSND_FMTS;
 			drv[i].playback.channels_min	= 2;
 			drv[i].playback.channels_max	= 2;
+
+			if (info->dai_info)
+				rdai[i].playback.info = &info->dai_info[i].playback;
 			rsnd_path_init(priv, &rdai[i], &rdai[i].playback);
 		}
 		if (cmod) {
@@ -714,6 +730,9 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 			drv[i].capture.formats		= RSND_FMTS;
 			drv[i].capture.channels_min	= 2;
 			drv[i].capture.channels_max	= 2;
+
+			if (info->dai_info)
+				rdai[i].capture.info = &info->dai_info[i].capture;
 			rsnd_path_init(priv, &rdai[i], &rdai[i].capture);
 		}
 
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index cbc38a2..c45baa5 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -187,6 +187,7 @@ char *rsnd_mod_name(struct rsnd_mod *mod);
 struct rsnd_dai_stream {
 	struct snd_pcm_substream *substream;
 	struct rsnd_mod *mod[RSND_MOD_MAX];
+	struct rsnd_dai_path_info *info; /* rcar_snd.h */
 	int byte_pos;
 	int period_pos;
 	int byte_per_period;
@@ -304,6 +305,19 @@ struct rsnd_priv {
 #define rsnd_lock(priv, flags) spin_lock_irqsave(&priv->lock, flags)
 #define rsnd_unlock(priv, flags) spin_unlock_irqrestore(&priv->lock, flags)
 
+#define rsnd_info_is_playback(priv, type)				\
+({									\
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);		\
+	int i, is_play = 0;						\
+	for (i = 0; i < info->dai_info_nr; i++) {			\
+		if (info->dai_info[i].playback.type == (type)->info) {	\
+			is_play = 1;					\
+			break;						\
+		}							\
+	}								\
+	is_play;							\
+})
+
 /*
  *	R-Car SCU
  */
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 1073d35..b517300 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -620,6 +620,9 @@ int rsnd_scu_probe(struct platform_device *pdev,
 	 * init SCU
 	 */
 	nr	= info->scu_info_nr;
+	if (!nr)
+		return 0;
+
 	scu	= devm_kzalloc(dev, sizeof(*scu) * nr, GFP_KERNEL);
 	if (!scu) {
 		dev_err(dev, "SCU allocate failed\n");
@@ -644,11 +647,19 @@ int rsnd_scu_probe(struct platform_device *pdev,
 			if (rsnd_is_gen1(priv))
 				ops = &rsnd_scu_gen1_ops;
 			if (rsnd_is_gen2(priv)) {
-				struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, i);
-				int ret = rsnd_dma_init(priv,
-						rsnd_mod_to_dma(&scu->mod),
-						rsnd_ssi_is_play(ssi),
-						scu->info->dma_id);
+				int ret;
+				int is_play;
+
+				if (info->dai_info) {
+					is_play = rsnd_info_is_playback(priv, scu);
+				} else {
+					struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, i);
+					is_play = rsnd_ssi_is_play(ssi);
+				}
+				ret = rsnd_dma_init(priv,
+						    rsnd_mod_to_dma(&scu->mod),
+						    is_play,
+						    scu->info->dma_id);
 				if (ret < 0)
 					return ret;
 
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 3423481..9162c2b 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -567,9 +567,16 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 		 * SSI DMA case
 		 */
 		if (pinfo->dma_id > 0) {
+			int is_play;
+
+			if (info->dai_info)
+				is_play = rsnd_info_is_playback(priv, ssi);
+			else
+				is_play = rsnd_ssi_is_play(&ssi->mod);
+
 			ret = rsnd_dma_init(
 				priv, rsnd_mod_to_dma(&ssi->mod),
-				rsnd_ssi_is_play(&ssi->mod),
+				is_play,
 				pinfo->dma_id);
 			if (ret < 0)
 				dev_info(dev, "SSI DMA failed. try PIO transter\n");
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 14/19] ASoC: rsnd: add rsnd_scu_enable_ssi_irq()
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (12 preceding siblings ...)
  2014-02-25  6:16 ` [PATCH 13/19] ASoC: rsnd: Get correct SCU ID Kuninori Morimoto
@ 2014-02-25  6:16 ` Kuninori Morimoto
  2014-02-25  6:16 ` [PATCH 15/19] ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI Kuninori Morimoto
                   ` (9 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:16 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current R-Car sound driver is assuming that
SCU mod is used even though it is not needed.
Because scu.c is controlling SSIU too.
(it is Gen1 compatibility)
But, SCU mod will be really not used if new platform dai
feature was used.
Thus, SSIU irq setting is called from SSI
directory by this patch.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/rsnd.h |    3 +++
 sound/soc/sh/rcar/scu.c  |   26 +++++++++++++-------------
 sound/soc/sh/rcar/ssi.c  |    2 ++
 3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index c45baa5..d45ed77 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -329,6 +329,9 @@ struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
 				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime);
+int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
+			    struct rsnd_dai *rdai,
+			    struct rsnd_dai_stream *io);
 
 #define rsnd_scu_nr(priv) ((priv)->scu_nr)
 
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index b517300..8ce79e8 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -165,6 +165,19 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 	return 0;
 }
 
+int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
+			    struct rsnd_dai *rdai,
+			    struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
+
+	/* enable PIO interrupt if Gen2 */
+	if (rsnd_is_gen2(priv))
+		rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
+
+	return 0;
+}
+
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
 				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime)
@@ -579,22 +592,9 @@ static struct rsnd_mod_ops rsnd_scu_gen2_ops = {
 	.stop	= rsnd_scu_stop_gen2,
 };
 
-static int rsnd_scu_start_non_gen2(struct rsnd_mod *mod,
-				   struct rsnd_dai *rdai,
-				   struct rsnd_dai_stream *io)
-{
-	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
-
-	/* enable PIO interrupt */
-	rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
-
-	return 0;
-}
-
 static struct rsnd_mod_ops rsnd_scu_non_gen2_ops = {
 	.name	= "non-scu (gen2)",
 	.init	= rsnd_scu_ssi_mode_init,
-	.start	= rsnd_scu_start_non_gen2,
 };
 
 struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id)
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 9162c2b..a74c7a7 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -365,6 +365,8 @@ static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
 	/* enable PIO IRQ */
 	ssi->cr_etc = UIEN | OIEN | DIEN;
 
+	rsnd_scu_enable_ssi_irq(mod, rdai, io);
+
 	rsnd_ssi_hw_start(ssi, rdai, io);
 
 	return 0;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 15/19] ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (13 preceding siblings ...)
  2014-02-25  6:16 ` [PATCH 14/19] ASoC: rsnd: add rsnd_scu_enable_ssi_irq() Kuninori Morimoto
@ 2014-02-25  6:16 ` Kuninori Morimoto
  2014-02-25  6:16 ` [PATCH 16/19] ASoC: rsnd: add probe/remove callback on rsnd_mod_ops Kuninori Morimoto
                   ` (8 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:16 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current R-Car sound driver is assuming that
SCU mod is used even though it is not needed.
Because scu.c is controlling SSIU too.
(it is Gen1 compatibility)
But, SCU mod will be really not used if new platform dai
feature was added.
Thus, rsnd_scu_ssi_mode_init() is called from SSI
directory by this patch.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/rsnd.h |    3 +++
 sound/soc/sh/rcar/scu.c  |   54 +++++++++++++++-------------------------------
 sound/soc/sh/rcar/ssi.c  |    2 ++
 3 files changed, 22 insertions(+), 37 deletions(-)

diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index d45ed77..0f3d599 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -329,6 +329,9 @@ struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
 				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime);
+int rsnd_scu_ssi_mode_init(struct rsnd_mod *ssi_mod,
+			   struct rsnd_dai *rdai,
+			   struct rsnd_dai_stream *io);
 int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
 			    struct rsnd_dai *rdai,
 			    struct rsnd_dai_stream *io);
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 8ce79e8..63e6aeb 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -115,28 +115,28 @@ struct rsnd_scu {
 /*
  *		Gen1/Gen2 common functions
  */
-static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
-				  struct rsnd_dai *rdai,
-				  struct rsnd_dai_stream *io)
+int rsnd_scu_ssi_mode_init(struct rsnd_mod *ssi_mod,
+			   struct rsnd_dai *rdai,
+			   struct rsnd_dai_stream *io)
 {
-	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
+	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
+	struct rsnd_mod *scu_mod = rsnd_io_to_mod_scu(io);
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
 	int ssi_id = rsnd_mod_id(ssi_mod);
-	u32 convert_rate = rsnd_scu_convert_rate(scu);
-
-	if (convert_rate && !rsnd_dai_is_clk_master(rdai)) {
-		struct device *dev = rsnd_priv_to_dev(priv);
-
-		dev_err(dev, "rsnd should be clk master when you rate convert\n");
-		return -EINVAL;
-	}
+	int has_scu = 0;
 
 	/*
 	 * SSI_MODE0
 	 */
-	rsnd_mod_bset(mod, SSI_MODE0, (1 << ssi_id),
-		      rsnd_scu_hpbif_is_enable(scu) ? 0 : (1 << ssi_id));
+	if (info->dai_info) {
+		has_scu = !!scu_mod;
+	} else {
+		struct rsnd_scu *scu = rsnd_mod_to_scu(scu_mod);
+		has_scu = rsnd_scu_hpbif_is_enable(scu);
+	}
+
+	rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id),
+		      has_scu ? 0 : (1 << ssi_id));
 
 	/*
 	 * SSI_MODE1
@@ -156,7 +156,7 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 		}
 
 		if (shift >= 0)
-			rsnd_mod_bset(mod, SSI_MODE1,
+			rsnd_mod_bset(ssi_mod, SSI_MODE1,
 				      0x3 << shift,
 				      rsnd_dai_is_clk_master(rdai) ?
 				      0x2 << shift : 0x1 << shift);
@@ -253,14 +253,9 @@ static int rsnd_scu_init(struct rsnd_mod *mod,
 			 struct rsnd_dai_stream *io)
 {
 	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	int ret;
 
 	clk_enable(scu->clk);
 
-	ret = rsnd_scu_ssi_mode_init(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
 	return 0;
 }
 
@@ -487,11 +482,6 @@ static struct rsnd_mod_ops rsnd_scu_gen1_ops = {
 	.stop	= rsnd_scu_stop_gen1,
 };
 
-static struct rsnd_mod_ops rsnd_scu_non_gen1_ops = {
-	.name	= "non-sru (gen1)",
-	.init	= rsnd_scu_ssi_mode_init,
-};
-
 /*
  *		Gen2 functions
  */
@@ -592,11 +582,6 @@ static struct rsnd_mod_ops rsnd_scu_gen2_ops = {
 	.stop	= rsnd_scu_stop_gen2,
 };
 
-static struct rsnd_mod_ops rsnd_scu_non_gen2_ops = {
-	.name	= "non-scu (gen2)",
-	.init	= rsnd_scu_ssi_mode_init,
-};
-
 struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id)
 {
 	if (WARN_ON(id < 0 || id >= rsnd_scu_nr(priv)))
@@ -665,11 +650,6 @@ int rsnd_scu_probe(struct platform_device *pdev,
 
 				ops = &rsnd_scu_gen2_ops;
 			}
-		} else {
-			if (rsnd_is_gen1(priv))
-				ops = &rsnd_scu_non_gen1_ops;
-			if (rsnd_is_gen2(priv))
-				ops = &rsnd_scu_non_gen2_ops;
 		}
 
 		rsnd_mod_init(priv, &scu->mod, ops, RSND_MOD_SCU, i);
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index a74c7a7..a7df216 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -287,6 +287,8 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
 	ssi->cr_own	= cr;
 	ssi->err	= -1; /* ignore 1st error */
 
+	rsnd_scu_ssi_mode_init(mod, rdai, io);
+
 	return 0;
 }
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 16/19] ASoC: rsnd: add probe/remove callback on rsnd_mod_ops
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (14 preceding siblings ...)
  2014-02-25  6:16 ` [PATCH 15/19] ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI Kuninori Morimoto
@ 2014-02-25  6:16 ` Kuninori Morimoto
  2014-02-25  6:16 ` [PATCH 17/19] ASoC: rsnd: use mod probe method on SCU Kuninori Morimoto
                   ` (7 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:16 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Each rsnd mod needs specific probe method,
and its best timing is DAI probe timing.
But current code runs it mod probe timing.
This patch adds new probe/remove callback to solve it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   23 +++++++++++++++++++++++
 sound/soc/sh/rcar/rsnd.h |    6 ++++++
 2 files changed, 29 insertions(+)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 4817b0c..7ad63c7 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -850,6 +850,7 @@ static int rsnd_probe(struct platform_device *pdev)
 	struct rcar_snd_info *info;
 	struct rsnd_priv *priv;
 	struct device *dev = &pdev->dev;
+	struct rsnd_dai *rdai;
 	int (*probe_func[])(struct platform_device *pdev,
 			    struct rsnd_priv *priv) = {
 		rsnd_gen_probe,
@@ -888,6 +889,16 @@ static int rsnd_probe(struct platform_device *pdev)
 			return ret;
 	}
 
+	for_each_rsnd_dai(rdai, priv, i) {
+		ret = rsnd_dai_call(rdai, &rdai->playback, probe);
+		if (ret)
+			return ret;
+
+		ret = rsnd_dai_call(rdai, &rdai->capture, probe);
+		if (ret)
+			return ret;
+	}
+
 	/*
 	 *	asoc register
 	 */
@@ -920,9 +931,21 @@ exit_snd_soc:
 static int rsnd_remove(struct platform_device *pdev)
 {
 	struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev);
+	struct rsnd_dai *rdai;
+	int ret, i;
 
 	pm_runtime_disable(&pdev->dev);
 
+	for_each_rsnd_dai(rdai, priv, i) {
+		ret = rsnd_dai_call(rdai, &rdai->playback, probe);
+		if (ret)
+			return ret;
+
+		ret = rsnd_dai_call(rdai, &rdai->capture, probe);
+		if (ret)
+			return ret;
+	}
+
 	/*
 	 *	remove each module
 	 */
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 0f3d599..ec6c58e 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -143,6 +143,12 @@ enum rsnd_mod_type {
 
 struct rsnd_mod_ops {
 	char *name;
+	int (*probe)(struct rsnd_mod *mod,
+		     struct rsnd_dai *rdai,
+		     struct rsnd_dai_stream *io);
+	int (*remove)(struct rsnd_mod *mod,
+		      struct rsnd_dai *rdai,
+		      struct rsnd_dai_stream *io);
 	int (*init)(struct rsnd_mod *mod,
 		    struct rsnd_dai *rdai,
 		    struct rsnd_dai_stream *io);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 17/19] ASoC: rsnd: use mod probe method on SCU
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (15 preceding siblings ...)
  2014-02-25  6:16 ` [PATCH 16/19] ASoC: rsnd: add probe/remove callback on rsnd_mod_ops Kuninori Morimoto
@ 2014-02-25  6:16 ` Kuninori Morimoto
  2014-02-25  6:17 ` [PATCH 18/19] ASoC: rsnd: use mod probe method on SSI Kuninori Morimoto
                   ` (6 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:16 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Now, it can use .probe

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/scu.c |   64 +++++++++++++++++++++++++++++------------------
 1 file changed, 39 insertions(+), 25 deletions(-)

diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 63e6aeb..40250ac 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -525,6 +525,42 @@ static int rsnd_scu_set_convert_timing_gen2(struct rsnd_mod *mod,
 	return ret;
 }
 
+static int rsnd_scu_probe_gen2(struct rsnd_mod *mod,
+			       struct rsnd_dai *rdai,
+			       struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
+	struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, rsnd_mod_id(mod));
+	struct device *dev = rsnd_priv_to_dev(priv);
+	int ret;
+	int is_play;
+
+	if (info->dai_info)
+		is_play = rsnd_info_is_playback(priv, scu);
+	else
+		is_play = rsnd_ssi_is_play(ssi);
+
+	ret = rsnd_dma_init(priv,
+			    rsnd_mod_to_dma(mod),
+			    is_play,
+			    scu->info->dma_id);
+	if (ret < 0)
+		dev_err(dev, "SCU DMA failed\n");
+
+	return ret;
+}
+
+static int rsnd_scu_remove_gen2(struct rsnd_mod *mod,
+				struct rsnd_dai *rdai,
+				struct rsnd_dai_stream *io)
+{
+	rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));
+
+	return 0;
+}
+
 static int rsnd_scu_init_gen2(struct rsnd_mod *mod,
 			      struct rsnd_dai *rdai,
 			      struct rsnd_dai_stream *io)
@@ -576,6 +612,8 @@ static int rsnd_scu_stop_gen2(struct rsnd_mod *mod,
 
 static struct rsnd_mod_ops rsnd_scu_gen2_ops = {
 	.name	= "scu (gen2)",
+	.probe	= rsnd_scu_probe_gen2,
+	.remove	= rsnd_scu_remove_gen2,
 	.init	= rsnd_scu_init_gen2,
 	.quit	= rsnd_scu_quit,
 	.start	= rsnd_scu_start_gen2,
@@ -631,25 +669,8 @@ int rsnd_scu_probe(struct platform_device *pdev,
 		if (rsnd_scu_hpbif_is_enable(scu)) {
 			if (rsnd_is_gen1(priv))
 				ops = &rsnd_scu_gen1_ops;
-			if (rsnd_is_gen2(priv)) {
-				int ret;
-				int is_play;
-
-				if (info->dai_info) {
-					is_play = rsnd_info_is_playback(priv, scu);
-				} else {
-					struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, i);
-					is_play = rsnd_ssi_is_play(ssi);
-				}
-				ret = rsnd_dma_init(priv,
-						    rsnd_mod_to_dma(&scu->mod),
-						    is_play,
-						    scu->info->dma_id);
-				if (ret < 0)
-					return ret;
-
+			if (rsnd_is_gen2(priv))
 				ops = &rsnd_scu_gen2_ops;
-			}
 		}
 
 		rsnd_mod_init(priv, &scu->mod, ops, RSND_MOD_SCU, i);
@@ -663,11 +684,4 @@ int rsnd_scu_probe(struct platform_device *pdev,
 void rsnd_scu_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv)
 {
-	struct rsnd_scu *scu;
-	int i;
-
-	for_each_rsnd_scu(scu, priv, i) {
-		if (rsnd_scu_dma_available(scu))
-			rsnd_dma_quit(priv, rsnd_mod_to_dma(&scu->mod));
-	}
 }
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 18/19] ASoC: rsnd: use mod probe method on SSI
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (16 preceding siblings ...)
  2014-02-25  6:16 ` [PATCH 17/19] ASoC: rsnd: use mod probe method on SCU Kuninori Morimoto
@ 2014-02-25  6:17 ` Kuninori Morimoto
  2014-02-25  6:17 ` [PATCH 19/19] ASoC: rsnd: add DeviceTree support Kuninori Morimoto
                   ` (5 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:17 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Now, it can use .probe

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/ssi.c |  116 ++++++++++++++++++++++++++---------------------
 1 file changed, 65 insertions(+), 51 deletions(-)

diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index a7df216..0f3eeac 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -358,6 +358,26 @@ static irqreturn_t rsnd_ssi_pio_interrupt(int irq, void *data)
 	return ret;
 }
 
+static int rsnd_ssi_pio_probe(struct rsnd_mod *mod,
+			      struct rsnd_dai *rdai,
+			      struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct device *dev = rsnd_priv_to_dev(priv);
+	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+	int irq = ssi->info->pio_irq;
+	int ret;
+
+	ret = devm_request_irq(dev, irq,
+			       rsnd_ssi_pio_interrupt,
+			       IRQF_SHARED,
+			       dev_name(dev), ssi);
+	if (ret)
+		dev_err(dev, "SSI request interrupt failed\n");
+
+	return ret;
+}
+
 static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
 			      struct rsnd_dai *rdai,
 			      struct rsnd_dai_stream *io)
@@ -389,12 +409,50 @@ static int rsnd_ssi_pio_stop(struct rsnd_mod *mod,
 
 static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
 	.name	= "ssi (pio)",
+	.probe	= rsnd_ssi_pio_probe,
 	.init	= rsnd_ssi_init,
 	.quit	= rsnd_ssi_quit,
 	.start	= rsnd_ssi_pio_start,
 	.stop	= rsnd_ssi_pio_stop,
 };
 
+static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
+			  struct rsnd_dai *rdai,
+			  struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = rsnd_priv_to_dev(priv);
+	int dma_id = ssi->info->dma_id;
+	int is_play;
+	int ret;
+
+	if (info->dai_info)
+		is_play = rsnd_info_is_playback(priv, ssi);
+	else
+		is_play = rsnd_ssi_is_play(&ssi->mod);
+
+	ret = rsnd_dma_init(
+		priv, rsnd_mod_to_dma(mod),
+		is_play,
+		dma_id);
+
+	if (ret < 0)
+		dev_err(dev, "SSI DMA failed\n");
+
+	return ret;
+}
+
+static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
+			       struct rsnd_dai *rdai,
+			       struct rsnd_dai_stream *io)
+{
+	rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));
+
+	return 0;
+}
+
 static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
 			      struct rsnd_dai *rdai,
 			      struct rsnd_dai_stream *io)
@@ -436,6 +494,8 @@ static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
 
 static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
 	.name	= "ssi (dma)",
+	.probe	= rsnd_ssi_dma_probe,
+	.remove	= rsnd_ssi_dma_remove,
 	.init	= rsnd_ssi_init,
 	.quit	= rsnd_ssi_quit,
 	.start	= rsnd_ssi_dma_start,
@@ -538,7 +598,7 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 	struct clk *clk;
 	struct rsnd_ssi *ssi;
 	char name[RSND_SSI_NAME_SIZE];
-	int i, nr, ret;
+	int i, nr;
 
 	/*
 	 *	init SSI
@@ -566,48 +626,10 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 		ssi->clk	= clk;
 
 		ops = &rsnd_ssi_non_ops;
-
-		/*
-		 * SSI DMA case
-		 */
-		if (pinfo->dma_id > 0) {
-			int is_play;
-
-			if (info->dai_info)
-				is_play = rsnd_info_is_playback(priv, ssi);
-			else
-				is_play = rsnd_ssi_is_play(&ssi->mod);
-
-			ret = rsnd_dma_init(
-				priv, rsnd_mod_to_dma(&ssi->mod),
-				is_play,
-				pinfo->dma_id);
-			if (ret < 0)
-				dev_info(dev, "SSI DMA failed. try PIO transter\n");
-			else
-				ops	= &rsnd_ssi_dma_ops;
-
-			dev_dbg(dev, "SSI%d use DMA transfer\n", i);
-		}
-
-		/*
-		 * SSI PIO case
-		 */
-		if (!rsnd_ssi_dma_available(ssi) &&
-		     rsnd_ssi_pio_available(ssi)) {
-			ret = devm_request_irq(dev, pinfo->pio_irq,
-					       &rsnd_ssi_pio_interrupt,
-					       IRQF_SHARED,
-					       dev_name(dev), ssi);
-			if (ret) {
-				dev_err(dev, "SSI request interrupt failed\n");
-				return ret;
-			}
-
-			ops	= &rsnd_ssi_pio_ops;
-
-			dev_dbg(dev, "SSI%d use PIO transfer\n", i);
-		}
+		if (pinfo->dma_id > 0)
+			ops = &rsnd_ssi_dma_ops;
+		else if (rsnd_ssi_pio_available(ssi))
+			ops = &rsnd_ssi_pio_ops;
 
 		rsnd_mod_init(priv, &ssi->mod, ops, RSND_MOD_SSI, i);
 
@@ -620,12 +642,4 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 void rsnd_ssi_remove(struct platform_device *pdev,
 		   struct rsnd_priv *priv)
 {
-	struct rsnd_ssi *ssi;
-	int i;
-
-	for_each_rsnd_ssi(ssi, priv, i) {
-		if (rsnd_ssi_dma_available(ssi))
-			rsnd_dma_quit(priv, rsnd_mod_to_dma(&ssi->mod));
-	}
-
 }
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 19/19] ASoC: rsnd: add DeviceTree support
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (17 preceding siblings ...)
  2014-02-25  6:17 ` [PATCH 18/19] ASoC: rsnd: use mod probe method on SSI Kuninori Morimoto
@ 2014-02-25  6:17 ` Kuninori Morimoto
  2014-02-27  5:08 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Mark Brown
                   ` (4 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-25  6:17 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Support for loading the Renesas R-Car sound driver via DeviceTree.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 .../devicetree/bindings/sound/renesas,rsnd.txt     |  101 ++++++++++++++++
 sound/soc/sh/rcar/adg.c                            |    1 +
 sound/soc/sh/rcar/core.c                           |  122 +++++++++++++++++++-
 sound/soc/sh/rcar/gen.c                            |   15 +++
 sound/soc/sh/rcar/rsnd.h                           |   11 ++
 sound/soc/sh/rcar/scu.c                            |   36 ++++++
 sound/soc/sh/rcar/ssi.c                            |   56 +++++++++
 7 files changed, 339 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/sound/renesas,rsnd.txt

diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
new file mode 100644
index 0000000..47e3989
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
@@ -0,0 +1,101 @@
+Renesas R-Car sound
+
+Required properties:
+- compatible			: "renesas,rcar_sound-gen1" if generation1
+				  "renesas,rcar_sound-gen2" if generation2
+- reg				: Should contain the register physical address.
+				  required register is
+				   SRU/ADG/SSI      if generation1
+				   SRU/ADG/SSIU/SSI if generation2
+- rcar_sound,ssi		: SSI subnode
+- rcar_sound,scu		: SCU subnode
+- rcar_sound,dai		: DAI subnode
+
+SSI subnode properties:
+- interrupt-parent		: Should contain SSI interrup parent
+- interrupts			: Should contain SSI interrupt for PIO transfer
+- shared-pin			: if shared clock pin
+
+DAI subnode properties:
+- playback			: list of playback modules
+- capture			: list of capture  modules
+
+Example:
+
+rcar_sound: rcar_sound@0xffd90000 {
+	#sound-dai-cells = <1>;
+	compatible = "renesas,rcar_sound";
+	reg =	<0xffd90000 0x1000>, /* SRU */
+		<0xfffe0000 0x24>,   /* ADG */
+		<0xffd91000 0x1240>; /* SSI */
+
+	rcar_sound,scu {
+		scu0: scu@0 { };
+		scu1: scu@1 { };
+		scu2: scu@2 { };
+		scu3: scu@3 { };
+		scu4: scu@4 { };
+		scu5: scu@5 { };
+		scu6: scu@6 { };
+		scu7: scu@7 { };
+		scu8: scu@8 { };
+	};
+
+	rcar_sound,ssi {
+		ssi0: ssi@0 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi1: ssi@1 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi2: ssi@2 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi3: ssi@3 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi4: ssi@4 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi5: ssi@5 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi6: ssi@6 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi7: ssi@7 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi8: ssi@8 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+	};
+
+	rcar_sound,dai {
+		dai0 {
+			playback = <&ssi5 &scu5>;
+			capture  = <&ssi6 &scu6>;
+		};
+		dai1 {
+			playback = <&ssi3>;
+		};
+		dai2 {
+			capture  = <&ssi4>;
+		};
+		dai3 {
+			playback = <&ssi7>;
+		};
+		dai4 {
+			capture  = <&ssi8>;
+		};
+	};
+};
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 69d9394..5a897701 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -391,6 +391,7 @@ static void rsnd_adg_ssi_clk_init(struct rsnd_priv *priv, struct rsnd_adg *adg)
 }
 
 int rsnd_adg_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rsnd_adg *adg;
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 7ad63c7..9b648c3 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -100,6 +100,21 @@
 #define RSND_RATES SNDRV_PCM_RATE_8000_96000
 #define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
 
+static struct rsnd_of_data rsnd_of_data_gen1 = {
+	.flags = RSND_GEN1,
+};
+
+static struct rsnd_of_data rsnd_of_data_gen2 = {
+	.flags = RSND_GEN2,
+};
+
+static struct of_device_id rsnd_of_match[] = {
+	{ .compatible = "renesas,rcar_sound-gen1", .data = &rsnd_of_data_gen1 },
+	{ .compatible = "renesas,rcar_sound-gen2", .data = &rsnd_of_data_gen2 },
+	{},
+};
+MODULE_DEVICE_TABLE(of, rsnd_of_match);
+
 /*
  *	rsnd_platform functions
  */
@@ -656,7 +671,92 @@ static int rsnd_path_exit(struct rsnd_priv *priv,
 	return ret;
 }
 
+static void rsnd_of_parse_dai(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *dai_node,	*dai_np;
+	struct device_node *ssi_node,	*ssi_np;
+	struct device_node *scu_node,	*scu_np;
+	struct device_node *playback, *capture;
+	struct rsnd_dai_platform_info *dai_info;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = &pdev->dev;
+	int nr, i;
+	int dai_i, ssi_i, scu_i;
+
+	if (!of_data)
+		return;
+
+	dai_node = of_get_child_by_name(dev->of_node, "rcar_sound,dai");
+	if (!dai_node)
+		return;
+
+	nr = of_get_child_count(dai_node);
+	if (!nr)
+		return;
+
+	dai_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_dai_platform_info) * nr,
+				GFP_KERNEL);
+	if (!dai_info) {
+		dev_err(dev, "dai info allocation error\n");
+		return;
+	}
+
+	info->dai_info_nr	= nr;
+	info->dai_info		= dai_info;
+
+	ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
+	scu_node = of_get_child_by_name(dev->of_node, "rcar_sound,scu");
+
+#define mod_parse(name)							\
+if (name##_node) {							\
+	struct rsnd_##name##_platform_info *name##_info;		\
+									\
+	name##_i = 0;							\
+	for_each_child_of_node(name##_node, name##_np) {		\
+		name##_info = info->name##_info + name##_i;		\
+									\
+		if (name##_np == playback)				\
+			dai_info->playback.name = name##_info;		\
+		if (name##_np == capture)				\
+			dai_info->capture.name = name##_info;		\
+									\
+		name##_i++;						\
+	}								\
+}
+
+	/*
+	 * parse all dai
+	 */
+	dai_i = 0;
+	for_each_child_of_node(dai_node, dai_np) {
+		dai_info = info->dai_info + dai_i;
+
+		for (i = 0;; i++) {
+
+			playback = of_parse_phandle(dai_np, "playback", i);
+			capture  = of_parse_phandle(dai_np, "capture", i);
+
+			if (!playback && !capture)
+				break;
+
+			mod_parse(ssi);
+			mod_parse(scu);
+
+			if (playback)
+				of_node_put(playback);
+			if (capture)
+				of_node_put(capture);
+		}
+
+		dai_i++;
+	}
+}
+
 static int rsnd_dai_probe(struct platform_device *pdev,
+			  const struct rsnd_of_data *of_data,
 			  struct rsnd_priv *priv)
 {
 	struct snd_soc_dai_driver *drv;
@@ -664,13 +764,16 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 	struct rsnd_dai *rdai;
 	struct rsnd_mod *pmod, *cmod;
 	struct device *dev = rsnd_priv_to_dev(priv);
-	int dai_nr = info->dai_info_nr;
+	int dai_nr;
 	int i;
 
+	rsnd_of_parse_dai(pdev, of_data, priv);
+
 	/*
 	 * dai_nr should be set via dai_info_nr,
 	 * but allow it to keeping compatible
 	 */
+	dai_nr = info->dai_info_nr;
 	if (!dai_nr) {
 		/* get max dai nr */
 		for (dai_nr = 0; dai_nr < 32; dai_nr++) {
@@ -851,7 +954,10 @@ static int rsnd_probe(struct platform_device *pdev)
 	struct rsnd_priv *priv;
 	struct device *dev = &pdev->dev;
 	struct rsnd_dai *rdai;
+	const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev);
+	const struct rsnd_of_data *of_data;
 	int (*probe_func[])(struct platform_device *pdev,
+			    const struct rsnd_of_data *of_data,
 			    struct rsnd_priv *priv) = {
 		rsnd_gen_probe,
 		rsnd_ssi_probe,
@@ -861,7 +967,16 @@ static int rsnd_probe(struct platform_device *pdev)
 	};
 	int ret, i;
 
-	info = pdev->dev.platform_data;
+	info = NULL;
+	of_data = NULL;
+	if (of_id) {
+		info = devm_kzalloc(&pdev->dev,
+				    sizeof(struct rcar_snd_info), GFP_KERNEL);
+		of_data = of_id->data;
+	} else {
+		info = pdev->dev.platform_data;
+	}
+
 	if (!info) {
 		dev_err(dev, "driver needs R-Car sound information\n");
 		return -ENODEV;
@@ -884,7 +999,7 @@ static int rsnd_probe(struct platform_device *pdev)
 	 *	init each module
 	 */
 	for (i = 0; i < ARRAY_SIZE(probe_func); i++) {
-		ret = probe_func[i](pdev, priv);
+		ret = probe_func[i](pdev, of_data, priv);
 		if (ret)
 			return ret;
 	}
@@ -961,6 +1076,7 @@ static int rsnd_remove(struct platform_device *pdev)
 static struct platform_driver rsnd_driver = {
 	.driver	= {
 		.name	= "rcar_sound",
+		.of_match_table = rsnd_of_match,
 	},
 	.probe		= rsnd_probe,
 	.remove		= rsnd_remove,
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 4f2c1d0..8794711 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -360,13 +360,28 @@ static int rsnd_gen1_probe(struct platform_device *pdev,
 /*
  *		Gen
  */
+static void rsnd_of_parse_gen(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct rcar_snd_info *info = priv->info;
+
+	if (!of_data)
+		return;
+
+	info->flags = of_data->flags;
+}
+
 int rsnd_gen_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct device *dev = rsnd_priv_to_dev(priv);
 	struct rsnd_gen *gen;
 	int ret;
 
+	rsnd_of_parse_gen(pdev, of_data, priv);
+
 	gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL);
 	if (!gen) {
 		dev_err(dev, "GEN allocate failed\n");
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index ec6c58e..0e317e2 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -17,6 +17,8 @@
 #include <linux/io.h>
 #include <linux/list.h>
 #include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
 #include <linux/sh_dma.h>
 #include <linux/workqueue.h>
 #include <sound/rcar_snd.h>
@@ -89,6 +91,7 @@ enum rsnd_reg {
 	RSND_REG_MAX,
 };
 
+struct rsnd_of_data;
 struct rsnd_priv;
 struct rsnd_mod;
 struct rsnd_dai;
@@ -236,6 +239,7 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
  *	R-Car Gen1/Gen2
  */
 int rsnd_gen_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 void rsnd_gen_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv);
@@ -251,6 +255,7 @@ void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
 int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
 int rsnd_adg_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 void rsnd_adg_remove(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
@@ -270,6 +275,10 @@ int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod,
 /*
  *	R-Car sound priv
  */
+struct rsnd_of_data {
+	u32 flags;
+};
+
 struct rsnd_priv {
 
 	struct device *dev;
@@ -328,6 +337,7 @@ struct rsnd_priv {
  *	R-Car SCU
  */
 int rsnd_scu_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 void rsnd_scu_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv);
@@ -348,6 +358,7 @@ int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
  *	R-Car SSI
  */
 int rsnd_ssi_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 void rsnd_ssi_remove(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 40250ac..219ab27 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -628,7 +628,41 @@ struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id)
 	return &((struct rsnd_scu *)(priv->scu) + id)->mod;
 }
 
+static void rsnd_of_parse_scu(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *scu_node;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct rsnd_scu_platform_info *scu_info;
+	struct device *dev = &pdev->dev;
+	int nr;
+
+	if (!of_data)
+		return;
+
+	scu_node = of_get_child_by_name(dev->of_node, "rcar_sound,scu");
+	if (!scu_node)
+		return;
+
+	nr = of_get_child_count(scu_node);
+	if (!nr)
+		return;
+
+	scu_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_scu_platform_info) * nr,
+				GFP_KERNEL);
+	if (!scu_info) {
+		dev_err(dev, "scu info allocation error\n");
+		return;
+	}
+
+	info->scu_info		= scu_info;
+	info->scu_info_nr	= nr;
+}
+
 int rsnd_scu_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
@@ -639,6 +673,8 @@ int rsnd_scu_probe(struct platform_device *pdev,
 	char name[RSND_SCU_NAME_SIZE];
 	int i, nr;
 
+	rsnd_of_parse_scu(pdev, of_data, priv);
+
 	/*
 	 * init SCU
 	 */
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 0f3eeac..c9beef8 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -588,7 +588,61 @@ static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *s
 	}
 }
 
+
+static void rsnd_of_parse_ssi(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *node;
+	struct device_node *np;
+	struct rsnd_ssi_platform_info *ssi_info;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = &pdev->dev;
+	int nr, i;
+
+	if (!of_data)
+		return;
+
+	node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
+	if (!node)
+		return;
+
+	nr = of_get_child_count(node);
+	if (!nr)
+		return;
+
+	ssi_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_ssi_platform_info) * nr,
+				GFP_KERNEL);
+	if (!ssi_info) {
+		dev_err(dev, "ssi info allocation error\n");
+		return;
+	}
+
+	info->ssi_info		= ssi_info;
+	info->ssi_info_nr	= nr;
+
+	i = -1;
+	for_each_child_of_node(node, np) {
+		i++;
+
+		ssi_info = info->ssi_info + i;
+
+		/*
+		 * pin settings
+		 */
+		if (of_get_property(np, "shared-pin", NULL))
+			ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE;
+
+		/*
+		 * irq
+		 */
+		ssi_info->pio_irq = irq_of_parse_and_map(np, 0);
+	}
+}
+
 int rsnd_ssi_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
@@ -600,6 +654,8 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 	char name[RSND_SSI_NAME_SIZE];
 	int i, nr;
 
+	rsnd_of_parse_ssi(pdev, of_data, priv);
+
 	/*
 	 *	init SSI
 	 */
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [PATCH 0/19] ASoC: rsnd: new module path method and DT support
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (18 preceding siblings ...)
  2014-02-25  6:17 ` [PATCH 19/19] ASoC: rsnd: add DeviceTree support Kuninori Morimoto
@ 2014-02-27  5:08 ` Mark Brown
  2014-02-27 10:18   ` Kuninori Morimoto
  2014-03-03  1:29 ` Mark Brown
                   ` (3 subsequent siblings)
  23 siblings, 1 reply; 68+ messages in thread
From: Mark Brown @ 2014-02-27  5:08 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 316 bytes --]

On Mon, Feb 24, 2014 at 10:13:57PM -0800, Kuninori Morimoto wrote:

> Now, Mark's ALSA branch doesn't include SH-ARM platform branch.
> Thus, these patches are keeping compatible for it at this point.
> Compatible code will be removed after merge.

Would it make sense to do a cross tree merge of some of this code?

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 0/19] ASoC: rsnd: new module path method and DT support
  2014-02-27  5:08 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Mark Brown
@ 2014-02-27 10:18   ` Kuninori Morimoto
  2014-02-27 11:47     ` Mark Brown
  0 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-02-27 10:18 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


Hi Mark

> > Now, Mark's ALSA branch doesn't include SH-ARM platform branch.
> > Thus, these patches are keeping compatible for it at this point.
> > Compatible code will be removed after merge.
> 
> Would it make sense to do a cross tree merge of some of this code?

Thank you for your help.
I tested these well. it can keep compatibility.
Thus, mark/topic/rcar is no problem I think.

But, can you please drop last [19/19] DT patch ?
I noticed not good point on this.

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 0/19] ASoC: rsnd: new module path method and DT support
  2014-02-27 10:18   ` Kuninori Morimoto
@ 2014-02-27 11:47     ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-02-27 11:47 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 220 bytes --]

On Thu, Feb 27, 2014 at 02:18:41AM -0800, Kuninori Morimoto wrote:

> But, can you please drop last [19/19] DT patch ?
> I noticed not good point on this.

Sure, I'll skip it - still not read the full series yet anyway.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops
  2014-02-25  6:15 ` [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops Kuninori Morimoto
@ 2014-03-03  1:18   ` Mark Brown
  2014-03-03  2:08     ` Kuninori Morimoto
  0 siblings, 1 reply; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:18 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 501 bytes --]

On Mon, Feb 24, 2014 at 10:15:25PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> This patch adds struct snd_soc_dai_ops :: set_sysclk.
> But, it do nothing, since rsnd sysclk is controlled by ADG.
> Without this patch, simple-card init will be failed
> if DT case.

We should fix the simple-card code so that it does not need this rather
than adding empty functions to all the drivers - I'd expect it to handle
-ENOTSUPP as not an error.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 01/19] ASoC: rsnd: move priv member settings to upper side
  2014-02-25  6:14 ` [PATCH 01/19] ASoC: rsnd: move priv member settings to upper side Kuninori Morimoto
@ 2014-03-03  1:19   ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:19 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 223 bytes --]

On Mon, Feb 24, 2014 at 10:14:33PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> There is no big meaning, but preparation for platform dai support

Applied, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 02/19] ASoC: rsnd: move rsnd_mod_call() macro
  2014-02-25  6:14 ` [PATCH 02/19] ASoC: rsnd: move rsnd_mod_call() macro Kuninori Morimoto
@ 2014-03-03  1:19   ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:19 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 240 bytes --]

On Mon, Feb 24, 2014 at 10:14:41PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> core.c is the only user of rsnd_mod_call() macro.
> Move it to core.c from rsnd.h

Applied, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 03/19] ASoC: rsnd: remove verbose function parameter
  2014-02-25  6:15 ` [PATCH 03/19] ASoC: rsnd: remove verbose function parameter Kuninori Morimoto
@ 2014-03-03  1:19   ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:19 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 238 bytes --]

On Mon, Feb 24, 2014 at 10:15:00PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> priv has rcar_snd_info pointer.
> having priv and info in same time is verbose.

Applied, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 04/19] ASoC: rsnd: remove verbose debug message from scu/ssi
  2014-02-25  6:15 ` [PATCH 04/19] ASoC: rsnd: remove verbose debug message from scu/ssi Kuninori Morimoto
@ 2014-03-03  1:20   ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:20 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 213 bytes --]

On Mon, Feb 24, 2014 at 10:15:07PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> scu/ssi probe() already have more detail debug message.

Applied, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 05/19] ASoC: rsnd: unify rdai naming
  2014-02-25  6:15 ` [PATCH 05/19] ASoC: rsnd: unify rdai naming Kuninori Morimoto
@ 2014-03-03  1:20   ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:20 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 264 bytes --]

On Mon, Feb 24, 2014 at 10:15:18PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> struct rsnd_dai is called as "rdai",
> but its size has been called as "dai_nr".
> Unify these as "rdai"

Applied, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 07/19] ASoC: rsnd: tidyup RSND_SSI_xxx flags
  2014-02-25  6:15 ` [PATCH 07/19] ASoC: rsnd: tidyup RSND_SSI_xxx flags Kuninori Morimoto
@ 2014-03-03  1:21   ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:21 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 317 bytes --]

On Mon, Feb 24, 2014 at 10:15:33PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> 6f3ab6c1c022e7a4877d38940cd45ae7804a15e2
> (ASoC: rsnd: remove pin sync option)
> added unused RSND_SSI_CLK_FROM_ADG flag.
> It should remove RSND_SSI_SYNC.

Applied, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 08/19] ASoC: rsnd: run rsnd_path_init() when probe() timing
  2014-02-25  6:15 ` [PATCH 08/19] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
@ 2014-03-03  1:22   ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:22 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 426 bytes --]

On Mon, Feb 24, 2014 at 10:15:40PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> Current rsnd SSIU/SSI/SCU/SRU path is set
> when playback/capture starts up.
> But it is meaningless method, since the path is based
> on platform and can be set in probe() timing.
> This patch sets the path on probe() timing.

This is fine but it depends on the set_sysclk() patch.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 0/19] ASoC: rsnd: new module path method and DT support
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (19 preceding siblings ...)
  2014-02-27  5:08 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Mark Brown
@ 2014-03-03  1:29 ` Mark Brown
  2014-03-03  7:42 ` Kuninori Morimoto
                   ` (2 subsequent siblings)
  23 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-03  1:29 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 326 bytes --]

On Mon, Feb 24, 2014 at 10:13:57PM -0800, Kuninori Morimoto wrote:
> 
> Hi Mark
> 
> These are Renesas R-Car sound driver patches.
> #1 - #7 are clean up patches.
> #8 - #18 adds new module path method
> #19 adds DT support

The ones I didn't comment on look broadly OK but there's dependencies on
earlier patches.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops
  2014-03-03  1:18   ` Mark Brown
@ 2014-03-03  2:08     ` Kuninori Morimoto
  2014-03-03  2:12       ` Kuninori Morimoto
  0 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  2:08 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


Hi Mark

> > This patch adds struct snd_soc_dai_ops :: set_sysclk.
> > But, it do nothing, since rsnd sysclk is controlled by ADG.
> > Without this patch, simple-card init will be failed
> > if DT case.
> 
> We should fix the simple-card code so that it does not need this rather
> than adding empty functions to all the drivers - I'd expect it to handle
> -ENOTSUPP as not an error.

Ahh...

Current simple-card will get sysclk absolutely in normal (?) way.
Can you see end of asoc_simple_card_sub_parse_of() ?

rsnd got sysclk from it, but it is "module" clock, not "sysclk".

I guess I can avoid this issue if dtsi has

	system-clock-frequency = 0;

but it is strange.

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops
  2014-03-03  2:08     ` Kuninori Morimoto
@ 2014-03-03  2:12       ` Kuninori Morimoto
  2014-03-03  7:45         ` Kuninori Morimoto
  0 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  2:12 UTC (permalink / raw)
  To: Kuninori Morimoto
  Cc: Simon, Linux-ALSA, Mark Brown, Liam Girdwood, Kuninori Morimoto


Hi Mark again

> > > This patch adds struct snd_soc_dai_ops :: set_sysclk.
> > > But, it do nothing, since rsnd sysclk is controlled by ADG.
> > > Without this patch, simple-card init will be failed
> > > if DT case.
> > 
> > We should fix the simple-card code so that it does not need this rather
> > than adding empty functions to all the drivers - I'd expect it to handle
> > -ENOTSUPP as not an error.
> 
> Ahh...
> 
> Current simple-card will get sysclk absolutely in normal (?) way.
> Can you see end of asoc_simple_card_sub_parse_of() ?
> 
> rsnd got sysclk from it, but it is "module" clock, not "sysclk".
> 
> I guess I can avoid this issue if dtsi has
> 
> 	system-clock-frequency = 0;
> 
> but it is strange.

Oops, I was misunderstanding.
I see, I will add -ENOTSUPP support.

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 0/19] ASoC: rsnd: new module path method and DT support
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (20 preceding siblings ...)
  2014-03-03  1:29 ` Mark Brown
@ 2014-03-03  7:42 ` Kuninori Morimoto
  2014-03-03  7:42   ` [PATCH 1/8] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
                     ` (7 more replies)
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
  2014-03-10 16:28 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Ben Dooks
  23 siblings, 8 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:42 UTC (permalink / raw)
  To: Kuninori Morimoto
  Cc: Simon, Linux-ALSA, Mark Brown, Liam Girdwood, Kuninori Morimoto


Hi Mark

These are Renesas R-Car sound driver patches v2.
But I separated these into
 1) cleanup patches
 2) new feature patches

Because 1) + 2) becomes large number patches.
These are 1) part patches.
I will send 2) part patches if 1) are accepted

Kuninori Morimoto (8):
      ASoC: rsnd: run rsnd_path_init() when probe() timing
      ASoC: rsnd: use mod array instead of list on rdai
      ASoC: rsnd: get ssi/scu from rsnd_dai_stream
      ASoC: rsnd: use devm_clk_get() instead of clk_get()
      ASoC: rsnd: use function pointer for each probe
      ASoC: rsnd: remove unused SSI_CONTROL
      ASoC: rsnd: modify rsnd_adg_ssi_ws_timing_gen2() parameter
      ASoC: rsnd: share reg_field and reduce memory

 sound/soc/sh/rcar/adg.c  |   31 ++++------
 sound/soc/sh/rcar/core.c |  152 ++++++++++++++++++++++++++++++++--------------
 sound/soc/sh/rcar/gen.c  |   57 -----------------
 sound/soc/sh/rcar/rsnd.h |  107 +++++++++++++++++++-------------
 sound/soc/sh/rcar/scu.c  |   22 ++++---
 sound/soc/sh/rcar/ssi.c  |    4 +-
 6 files changed, 197 insertions(+), 176 deletions(-)

^ permalink raw reply	[flat|nested] 68+ messages in thread

* [PATCH 1/8] ASoC: rsnd: run rsnd_path_init() when probe() timing
  2014-03-03  7:42 ` Kuninori Morimoto
@ 2014-03-03  7:42   ` Kuninori Morimoto
  2014-03-04  4:13     ` Mark Brown
  2014-03-03  7:42   ` [PATCH 2/8] ASoC: rsnd: use mod array instead of list on rdai Kuninori Morimoto
                     ` (6 subsequent siblings)
  7 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:42 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current rsnd SSIU/SSI/SCU/SRU path is set
when playback/capture starts up.
But it is meaningless method, since the path is based
on platform and can be set in probe() timing.
This patch sets the path on probe() timing.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   94 ++++++++++++++++++++++++++++++++++++++--------
 sound/soc/sh/rcar/gen.c  |   56 ---------------------------
 sound/soc/sh/rcar/rsnd.h |    9 -----
 3 files changed, 78 insertions(+), 81 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index f0745af..96cb786 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -317,9 +317,9 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 	ret;							\
 })
 
-int rsnd_dai_connect(struct rsnd_dai *rdai,
-		     struct rsnd_mod *mod,
-		     struct rsnd_dai_stream *io)
+static int rsnd_dai_connect(struct rsnd_dai *rdai,
+			    struct rsnd_mod *mod,
+			    struct rsnd_dai_stream *io)
 {
 	if (!mod)
 		return -EIO;
@@ -340,7 +340,7 @@ int rsnd_dai_connect(struct rsnd_dai *rdai,
 	return 0;
 }
 
-int rsnd_dai_disconnect(struct rsnd_mod *mod)
+static int rsnd_dai_disconnect(struct rsnd_mod *mod)
 {
 	list_del_init(&mod->list);
 	mod->io = NULL;
@@ -418,10 +418,6 @@ static int rsnd_dai_stream_init(struct rsnd_dai_stream *io,
 {
 	struct snd_pcm_runtime *runtime = substream->runtime;
 
-	if (!list_empty(&io->head))
-		return -EIO;
-
-	INIT_LIST_HEAD(&io->head);
 	io->substream		= substream;
 	io->byte_pos		= 0;
 	io->period_pos		= 0;
@@ -476,10 +472,6 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 		if (ret < 0)
 			goto dai_trigger_end;
 
-		ret = rsnd_gen_path_init(priv, rdai, io);
-		if (ret < 0)
-			goto dai_trigger_end;
-
 		ret = rsnd_dai_call(rdai, io, init);
 		if (ret < 0)
 			goto dai_trigger_end;
@@ -497,10 +489,6 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 		if (ret < 0)
 			goto dai_trigger_end;
 
-		ret = rsnd_gen_path_exit(priv, rdai, io);
-		if (ret < 0)
-			goto dai_trigger_end;
-
 		ret = rsnd_platform_call(priv, dai, stop, ssi_id);
 		if (ret < 0)
 			goto dai_trigger_end;
@@ -576,6 +564,70 @@ static const struct snd_soc_dai_ops rsnd_soc_dai_ops = {
 	.set_fmt	= rsnd_soc_dai_set_fmt,
 };
 
+static int rsnd_path_init(struct rsnd_priv *priv,
+			  struct rsnd_dai *rdai,
+			  struct rsnd_dai_stream *io)
+{
+	struct rsnd_mod *mod;
+	int ret;
+	int id;
+
+	/*
+	 * Gen1 is created by SRU/SSI, and this SRU is base module of
+	 * Gen2's SCU/SSIU/SSI. (Gen2 SCU/SSIU came from SRU)
+	 *
+	 * Easy image is..
+	 *	Gen1 SRU = Gen2 SCU + SSIU + etc
+	 *
+	 * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is
+	 * using fixed path.
+	 *
+	 * Then, SSI id = SCU id here
+	 */
+	/* get SSI's ID */
+	mod = rsnd_ssi_mod_get_frm_dai(priv,
+				       rsnd_dai_id(priv, rdai),
+				       rsnd_dai_is_play(rdai, io));
+	if (!mod)
+		return 0;
+	id = rsnd_mod_id(mod);
+	ret = 0;
+
+	/* SCU */
+	mod = rsnd_scu_mod_get(priv, id);
+	if (mod) {
+		ret = rsnd_dai_connect(rdai, mod, io);
+		if (ret < 0)
+			return ret;
+	}
+
+	/* SSI */
+	mod = rsnd_ssi_mod_get(priv, id);
+	if (mod) {
+		ret = rsnd_dai_connect(rdai, mod, io);
+		if (ret < 0)
+			return ret;
+	}
+
+	return ret;
+}
+
+static int rsnd_path_exit(struct rsnd_priv *priv,
+			  struct rsnd_dai *rdai,
+			  struct rsnd_dai_stream *io)
+{
+	struct rsnd_mod *mod, *n;
+	int ret = 0;
+
+	/*
+	 * remove all mod from rdai
+	 */
+	for_each_rsnd_mod(mod, n, io)
+		ret |= rsnd_dai_disconnect(mod);
+
+	return ret;
+}
+
 static int rsnd_dai_probe(struct platform_device *pdev,
 			  struct rsnd_priv *priv)
 {
@@ -634,12 +686,14 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 			drv[i].playback.formats		= RSND_FMTS;
 			drv[i].playback.channels_min	= 2;
 			drv[i].playback.channels_max	= 2;
+			rsnd_path_init(priv, &rdai[i], &rdai[i].playback);
 		}
 		if (cmod) {
 			drv[i].capture.rates		= RSND_RATES;
 			drv[i].capture.formats		= RSND_FMTS;
 			drv[i].capture.channels_min	= 2;
 			drv[i].capture.channels_max	= 2;
+			rsnd_path_init(priv, &rdai[i], &rdai[i].capture);
 		}
 
 		dev_dbg(dev, "%s (%s/%s)\n", rdai[i].name,
@@ -653,6 +707,14 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 static void rsnd_dai_remove(struct platform_device *pdev,
 			  struct rsnd_priv *priv)
 {
+	struct rsnd_dai *rdai;
+	int i;
+
+	for (i = 0; i < rsnd_rdai_nr(priv); i++) {
+		rdai = rsnd_dai_get(priv, i);
+		rsnd_path_exit(priv, rdai, &rdai->playback);
+		rsnd_path_exit(priv, rdai, &rdai->capture);
+	}
 }
 
 /*
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index bcb98f4..4f2c1d0 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -155,62 +155,6 @@ static int rsnd_gen_regmap_init(struct rsnd_priv *priv,
 	return 0;
 }
 
-int rsnd_gen_path_init(struct rsnd_priv *priv,
-		       struct rsnd_dai *rdai,
-		       struct rsnd_dai_stream *io)
-{
-	struct rsnd_mod *mod;
-	int ret;
-	int id;
-
-	/*
-	 * Gen1 is created by SRU/SSI, and this SRU is base module of
-	 * Gen2's SCU/SSIU/SSI. (Gen2 SCU/SSIU came from SRU)
-	 *
-	 * Easy image is..
-	 *	Gen1 SRU = Gen2 SCU + SSIU + etc
-	 *
-	 * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is
-	 * using fixed path.
-	 *
-	 * Then, SSI id = SCU id here
-	 */
-
-	/* get SSI's ID */
-	mod = rsnd_ssi_mod_get_frm_dai(priv,
-				       rsnd_dai_id(priv, rdai),
-				       rsnd_dai_is_play(rdai, io));
-	id = rsnd_mod_id(mod);
-
-	/* SCU */
-	mod = rsnd_scu_mod_get(priv, id);
-	ret = rsnd_dai_connect(rdai, mod, io);
-	if (ret < 0)
-		return ret;
-
-	/* SSI */
-	mod = rsnd_ssi_mod_get(priv, id);
-	ret = rsnd_dai_connect(rdai, mod, io);
-
-	return ret;
-}
-
-int rsnd_gen_path_exit(struct rsnd_priv *priv,
-		       struct rsnd_dai *rdai,
-		       struct rsnd_dai_stream *io)
-{
-	struct rsnd_mod *mod, *n;
-	int ret = 0;
-
-	/*
-	 * remove all mod from rdai
-	 */
-	for_each_rsnd_mod(mod, n, io)
-		ret |= rsnd_dai_disconnect(mod);
-
-	return ret;
-}
-
 /*
  *		Gen2
  */
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 3962a50..6a25203 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -210,9 +210,6 @@ struct rsnd_dai {
 	     i++)
 
 struct rsnd_dai *rsnd_dai_get(struct rsnd_priv *priv, int id);
-int rsnd_dai_disconnect(struct rsnd_mod *mod);
-int rsnd_dai_connect(struct rsnd_dai *rdai, struct rsnd_mod *mod,
-		     struct rsnd_dai_stream *io);
 int rsnd_dai_is_play(struct rsnd_dai *rdai, struct rsnd_dai_stream *io);
 int rsnd_dai_id(struct rsnd_priv *priv, struct rsnd_dai *rdai);
 #define rsnd_dai_get_platform_info(rdai) ((rdai)->info)
@@ -229,12 +226,6 @@ int rsnd_gen_probe(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
 void rsnd_gen_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv);
-int rsnd_gen_path_init(struct rsnd_priv *priv,
-		       struct rsnd_dai *rdai,
-		       struct rsnd_dai_stream *io);
-int rsnd_gen_path_exit(struct rsnd_priv *priv,
-		       struct rsnd_dai *rdai,
-		       struct rsnd_dai_stream *io);
 void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 			       struct rsnd_mod *mod,
 			       enum rsnd_reg reg);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 2/8] ASoC: rsnd: use mod array instead of list on rdai
  2014-03-03  7:42 ` Kuninori Morimoto
  2014-03-03  7:42   ` [PATCH 1/8] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
@ 2014-03-03  7:42   ` Kuninori Morimoto
  2014-03-03  7:43   ` [PATCH 3/8] ASoC: rsnd: get ssi/scu from rsnd_dai_stream Kuninori Morimoto
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:42 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

struct rsnd_dai_stream used list for mod list.
It added only odd flexibility to current driver, and
it is a factor which makes extendibility difficult.
rsnd use mod array instead of list from now.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   42 +++++++++++++++++++++++-------------------
 sound/soc/sh/rcar/rsnd.h |   12 ++++++++----
 sound/soc/sh/rcar/scu.c  |    2 +-
 sound/soc/sh/rcar/ssi.c  |    2 +-
 4 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 96cb786..416b078 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -121,12 +121,13 @@ char *rsnd_mod_name(struct rsnd_mod *mod)
 void rsnd_mod_init(struct rsnd_priv *priv,
 		   struct rsnd_mod *mod,
 		   struct rsnd_mod_ops *ops,
+		   enum rsnd_mod_type type,
 		   int id)
 {
 	mod->priv	= priv;
 	mod->id		= id;
 	mod->ops	= ops;
-	INIT_LIST_HEAD(&mod->list);
+	mod->type	= type;
 }
 
 /*
@@ -307,9 +308,12 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 
 #define rsnd_dai_call(rdai, io, fn)				\
 ({								\
-	struct rsnd_mod *mod, *n;				\
-	int ret = 0;						\
-	for_each_rsnd_mod(mod, n, (io)) {			\
+	struct rsnd_mod *mod;					\
+	int ret = 0, i;						\
+	for (i = 0; i < RSND_MOD_MAX; i++) {			\
+		mod = (io)->mod[i];				\
+		if (!mod)					\
+			continue;				\
 		ret = rsnd_mod_call(mod, fn, (rdai), (io));	\
 		if (ret < 0)					\
 			break;					\
@@ -317,14 +321,13 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 	ret;							\
 })
 
-static int rsnd_dai_connect(struct rsnd_dai *rdai,
-			    struct rsnd_mod *mod,
+static int rsnd_dai_connect(struct rsnd_mod *mod,
 			    struct rsnd_dai_stream *io)
 {
 	if (!mod)
 		return -EIO;
 
-	if (!list_empty(&mod->list)) {
+	if (io->mod[mod->type]) {
 		struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 		struct device *dev = rsnd_priv_to_dev(priv);
 
@@ -334,15 +337,15 @@ static int rsnd_dai_connect(struct rsnd_dai *rdai,
 		return -EIO;
 	}
 
-	list_add_tail(&mod->list, &io->head);
+	io->mod[mod->type] = mod;
 	mod->io = io;
 
 	return 0;
 }
 
-static int rsnd_dai_disconnect(struct rsnd_mod *mod)
+static int rsnd_dai_disconnect(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
 {
-	list_del_init(&mod->list);
+	io->mod[mod->type] = NULL;
 	mod->io = NULL;
 
 	return 0;
@@ -596,7 +599,7 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	/* SCU */
 	mod = rsnd_scu_mod_get(priv, id);
 	if (mod) {
-		ret = rsnd_dai_connect(rdai, mod, io);
+		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
 	}
@@ -604,7 +607,7 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	/* SSI */
 	mod = rsnd_ssi_mod_get(priv, id);
 	if (mod) {
-		ret = rsnd_dai_connect(rdai, mod, io);
+		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
 	}
@@ -616,14 +619,18 @@ static int rsnd_path_exit(struct rsnd_priv *priv,
 			  struct rsnd_dai *rdai,
 			  struct rsnd_dai_stream *io)
 {
-	struct rsnd_mod *mod, *n;
-	int ret = 0;
+	struct rsnd_mod *mod;
+	int ret = 0, i;
 
 	/*
 	 * remove all mod from rdai
 	 */
-	for_each_rsnd_mod(mod, n, io)
-		ret |= rsnd_dai_disconnect(mod);
+	for (i = 0; i < RSND_MOD_MAX; i++) {
+		mod = io->mod[i];
+		if (!mod)
+			continue;
+		ret |= rsnd_dai_disconnect(mod, io);
+	}
 
 	return ret;
 }
@@ -671,9 +678,6 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 		/*
 		 *	init rsnd_dai
 		 */
-		INIT_LIST_HEAD(&rdai[i].playback.head);
-		INIT_LIST_HEAD(&rdai[i].capture.head);
-
 		snprintf(rdai[i].name, RSND_DAI_NAME_SIZE, "rsnd-dai.%d", i);
 
 		/*
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 6a25203..7767a8f 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -135,6 +135,11 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
 /*
  *	R-Car sound mod
  */
+enum rsnd_mod_type {
+	RSND_MOD_SCU = 0,
+	RSND_MOD_SSI,
+	RSND_MOD_MAX,
+};
 
 struct rsnd_mod_ops {
 	char *name;
@@ -155,9 +160,9 @@ struct rsnd_mod_ops {
 struct rsnd_dai_stream;
 struct rsnd_mod {
 	int id;
+	enum rsnd_mod_type type;
 	struct rsnd_priv *priv;
 	struct rsnd_mod_ops *ops;
-	struct list_head list; /* connect to rsnd_dai playback/capture */
 	struct rsnd_dma dma;
 	struct rsnd_dai_stream *io;
 };
@@ -167,12 +172,11 @@ struct rsnd_mod {
 #define rsnd_dma_to_mod(_dma) container_of((_dma), struct rsnd_mod, dma)
 #define rsnd_mod_to_io(mod) ((mod)->io)
 #define rsnd_mod_id(mod) ((mod)->id)
-#define for_each_rsnd_mod(pos, n, io)	\
-	list_for_each_entry_safe(pos, n, &(io)->head, list)
 
 void rsnd_mod_init(struct rsnd_priv *priv,
 		   struct rsnd_mod *mod,
 		   struct rsnd_mod_ops *ops,
+		   enum rsnd_mod_type type,
 		   int id);
 char *rsnd_mod_name(struct rsnd_mod *mod);
 
@@ -181,8 +185,8 @@ char *rsnd_mod_name(struct rsnd_mod *mod);
  */
 #define RSND_DAI_NAME_SIZE	16
 struct rsnd_dai_stream {
-	struct list_head head; /* head of rsnd_mod list */
 	struct snd_pcm_substream *substream;
+	struct rsnd_mod *mod[RSND_MOD_MAX];
 	int byte_pos;
 	int period_pos;
 	int byte_per_period;
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 882e837..81264ec 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -659,7 +659,7 @@ int rsnd_scu_probe(struct platform_device *pdev,
 				ops = &rsnd_scu_non_gen2_ops;
 		}
 
-		rsnd_mod_init(priv, &scu->mod, ops, i);
+		rsnd_mod_init(priv, &scu->mod, ops, RSND_MOD_SCU, i);
 
 		dev_dbg(dev, "SCU%d probed\n", i);
 	}
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 38a62a8..480dde5 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -584,7 +584,7 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 			dev_dbg(dev, "SSI%d use PIO transfer\n", i);
 		}
 
-		rsnd_mod_init(priv, &ssi->mod, ops, i);
+		rsnd_mod_init(priv, &ssi->mod, ops, RSND_MOD_SSI, i);
 
 		rsnd_ssi_parent_clk_setup(priv, ssi);
 	}
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 3/8] ASoC: rsnd: get ssi/scu from rsnd_dai_stream
  2014-03-03  7:42 ` Kuninori Morimoto
  2014-03-03  7:42   ` [PATCH 1/8] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
  2014-03-03  7:42   ` [PATCH 2/8] ASoC: rsnd: use mod array instead of list on rdai Kuninori Morimoto
@ 2014-03-03  7:43   ` Kuninori Morimoto
  2014-03-03  7:43   ` [PATCH 4/8] ASoC: rsnd: use devm_clk_get() instead of clk_get() Kuninori Morimoto
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:43 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current driver is assuming that SSI id = SCU id.
But, now, it can get correct SSI/SCU from
rsnd_dai_stream. use it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/rsnd.h |    4 +++-
 sound/soc/sh/rcar/scu.c  |   20 +++++++++++---------
 sound/soc/sh/rcar/ssi.c  |    2 +-
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 7767a8f..cbc38a2 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -192,6 +192,8 @@ struct rsnd_dai_stream {
 	int byte_per_period;
 	int next_period_byte;
 };
+#define rsnd_io_to_mod_ssi(io)	((io)->mod[RSND_MOD_SSI])
+#define rsnd_io_to_mod_scu(io)	((io)->mod[RSND_MOD_SCU])
 
 struct rsnd_dai {
 	char name[RSND_DAI_NAME_SIZE];
@@ -311,7 +313,7 @@ void rsnd_scu_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
-				   struct rsnd_mod *ssi_mod,
+				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime);
 
 #define rsnd_scu_nr(priv) ((priv)->scu_nr)
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 81264ec..1073d35 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -121,7 +121,8 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 {
 	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	int id = rsnd_mod_id(mod);
+	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
+	int ssi_id = rsnd_mod_id(ssi_mod);
 	u32 convert_rate = rsnd_scu_convert_rate(scu);
 
 	if (convert_rate && !rsnd_dai_is_clk_master(rdai)) {
@@ -134,15 +135,15 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 	/*
 	 * SSI_MODE0
 	 */
-	rsnd_mod_bset(mod, SSI_MODE0, (1 << id),
-		      rsnd_scu_hpbif_is_enable(scu) ? 0 : (1 << id));
+	rsnd_mod_bset(mod, SSI_MODE0, (1 << ssi_id),
+		      rsnd_scu_hpbif_is_enable(scu) ? 0 : (1 << ssi_id));
 
 	/*
 	 * SSI_MODE1
 	 */
-	if (rsnd_ssi_is_pin_sharing(rsnd_ssi_mod_get(priv, id))) {
+	if (rsnd_ssi_is_pin_sharing(ssi_mod)) {
 		int shift = -1;
-		switch (id) {
+		switch (ssi_id) {
 		case 1:
 			shift = 0;
 			break;
@@ -165,14 +166,13 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 }
 
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
-				   struct rsnd_mod *ssi_mod,
+				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime)
 {
 	struct rsnd_scu *scu;
 	unsigned int rate;
 
-	/* this function is assuming SSI id = SCU id here */
-	scu = rsnd_mod_to_scu(rsnd_scu_mod_get(priv, rsnd_mod_id(ssi_mod)));
+	scu = rsnd_mod_to_scu(rsnd_io_to_mod_scu(io));
 
 	/*
 	 * return convert rate if SRC is used,
@@ -583,8 +583,10 @@ static int rsnd_scu_start_non_gen2(struct rsnd_mod *mod,
 				   struct rsnd_dai *rdai,
 				   struct rsnd_dai_stream *io)
 {
+	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
+
 	/* enable PIO interrupt */
-	rsnd_mod_write(mod, INT_ENABLE, 0x0f000000);
+	rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
 
 	return 0;
 }
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 480dde5..25a7d44 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -121,7 +121,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
 		1, 2, 4, 8, 16, 6, 12,
 	};
 	unsigned int main_rate;
-	unsigned int rate = rsnd_scu_get_ssi_rate(priv, &ssi->mod, runtime);
+	unsigned int rate = rsnd_scu_get_ssi_rate(priv, io, runtime);
 
 	/*
 	 * Find best clock, and try to start ADG
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 4/8] ASoC: rsnd: use devm_clk_get() instead of clk_get()
  2014-03-03  7:42 ` Kuninori Morimoto
                     ` (2 preceding siblings ...)
  2014-03-03  7:43   ` [PATCH 3/8] ASoC: rsnd: get ssi/scu from rsnd_dai_stream Kuninori Morimoto
@ 2014-03-03  7:43   ` Kuninori Morimoto
  2014-03-03  7:43   ` [PATCH 5/8] ASoC: rsnd: use function pointer for each probe Kuninori Morimoto
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:43 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/adg.c |   24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 69d9394..a05ad81 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -405,11 +405,11 @@ int rsnd_adg_probe(struct platform_device *pdev,
 		return -ENOMEM;
 	}
 
-	clk_orig	= clk_get(dev, NULL);
-	adg->clk[CLKA]	= clk_get(dev, "clk_a");
-	adg->clk[CLKB]	= clk_get(dev, "clk_b");
-	adg->clk[CLKC]	= clk_get(dev, "clk_c");
-	adg->clk[CLKI]	= clk_get(dev, "clk_i");
+	clk_orig	= devm_clk_get(dev, NULL);
+	adg->clk[CLKA]	= devm_clk_get(dev, "clk_a");
+	adg->clk[CLKB]	= devm_clk_get(dev, "clk_b");
+	adg->clk[CLKC]	= devm_clk_get(dev, "clk_c");
+	adg->clk[CLKI]	= devm_clk_get(dev, "clk_i");
 
 	/*
 	 * It request device dependent audio clock.
@@ -432,10 +432,10 @@ int rsnd_adg_probe(struct platform_device *pdev,
 	 * but will be removed soon
 	 */
 	if (use_old_style) {
-		adg->clk[CLKA] = clk_get(NULL, "audio_clk_a");
-		adg->clk[CLKB] = clk_get(NULL, "audio_clk_b");
-		adg->clk[CLKC] = clk_get(NULL, "audio_clk_c");
-		adg->clk[CLKI] = clk_get(NULL, "audio_clk_internal");
+		adg->clk[CLKA] = devm_clk_get(NULL, "audio_clk_a");
+		adg->clk[CLKB] = devm_clk_get(NULL, "audio_clk_b");
+		adg->clk[CLKC] = devm_clk_get(NULL, "audio_clk_c");
+		adg->clk[CLKI] = devm_clk_get(NULL, "audio_clk_internal");
 	}
 
 	for_each_rsnd_clk(clk, adg, i) {
@@ -457,10 +457,4 @@ int rsnd_adg_probe(struct platform_device *pdev,
 void rsnd_adg_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv)
 {
-	struct rsnd_adg *adg = priv->adg;
-	struct clk *clk;
-	int i;
-
-	for_each_rsnd_clk(clk, adg, i)
-		clk_put(clk);
 }
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 5/8] ASoC: rsnd: use function pointer for each probe
  2014-03-03  7:42 ` Kuninori Morimoto
                     ` (3 preceding siblings ...)
  2014-03-03  7:43   ` [PATCH 4/8] ASoC: rsnd: use devm_clk_get() instead of clk_get() Kuninori Morimoto
@ 2014-03-03  7:43   ` Kuninori Morimoto
  2014-03-03  7:43   ` [PATCH 6/8] ASoC: rsnd: remove unused SSI_CONTROL Kuninori Morimoto
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:43 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

R-Car sound consists of many devices.
It will have more device support in the future.
Thus, for each probe become now function pointer array.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   34 ++++++++++++++--------------------
 1 file changed, 14 insertions(+), 20 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 416b078..ea747614 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -814,7 +814,15 @@ static int rsnd_probe(struct platform_device *pdev)
 	struct rcar_snd_info *info;
 	struct rsnd_priv *priv;
 	struct device *dev = &pdev->dev;
-	int ret;
+	int (*probe_func[])(struct platform_device *pdev,
+			    struct rsnd_priv *priv) = {
+		rsnd_gen_probe,
+		rsnd_ssi_probe,
+		rsnd_scu_probe,
+		rsnd_adg_probe,
+		rsnd_dai_probe,
+	};
+	int ret, i;
 
 	info = pdev->dev.platform_data;
 	if (!info) {
@@ -838,25 +846,11 @@ static int rsnd_probe(struct platform_device *pdev)
 	/*
 	 *	init each module
 	 */
-	ret = rsnd_gen_probe(pdev, priv);
-	if (ret)
-		return ret;
-
-	ret = rsnd_ssi_probe(pdev, priv);
-	if (ret)
-		return ret;
-
-	ret = rsnd_scu_probe(pdev, priv);
-	if (ret)
-		return ret;
-
-	ret = rsnd_adg_probe(pdev, priv);
-	if (ret)
-		return ret;
-
-	ret = rsnd_dai_probe(pdev, priv);
-	if (ret)
-		return ret;
+	for (i = 0; i < ARRAY_SIZE(probe_func); i++) {
+		ret = probe_func[i](pdev, priv);
+		if (ret)
+			return ret;
+	}
 
 	/*
 	 *	asoc register
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 6/8] ASoC: rsnd: remove unused SSI_CONTROL
  2014-03-03  7:42 ` Kuninori Morimoto
                     ` (4 preceding siblings ...)
  2014-03-03  7:43   ` [PATCH 5/8] ASoC: rsnd: use function pointer for each probe Kuninori Morimoto
@ 2014-03-03  7:43   ` Kuninori Morimoto
  2014-03-03  7:43   ` [PATCH 7/8] ASoC: rsnd: modify rsnd_adg_ssi_ws_timing_gen2() parameter Kuninori Morimoto
  2014-03-03  7:43   ` [PATCH 8/8] ASoC: rsnd: share reg_field and reduce memory Kuninori Morimoto
  7 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:43 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/gen.c  |    1 -
 sound/soc/sh/rcar/rsnd.h |    1 -
 2 files changed, 2 deletions(-)

diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 4f2c1d0..92d1bc9 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -173,7 +173,6 @@ static int rsnd_gen2_regmap_init(struct rsnd_priv *priv, struct rsnd_gen *gen)
 		RSND_GEN2_S_REG(gen, SSIU,	SSI_MODE0,	0x800),
 		RSND_GEN2_S_REG(gen, SSIU,	SSI_MODE1,	0x804),
 		/* FIXME: it needs SSI_MODE2/3 in the future */
-		RSND_GEN2_S_REG(gen, SSIU,	SSI_CONTROL,	0x810),
 		RSND_GEN2_M_REG(gen, SSIU,	SSI_BUSIF_MODE,	0x0,	0x80),
 		RSND_GEN2_M_REG(gen, SSIU,	SSI_BUSIF_ADINR,0x4,	0x80),
 		RSND_GEN2_M_REG(gen, SSIU,	SSI_CTRL,	0x10,	0x80),
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index cbc38a2..e16acd2 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -39,7 +39,6 @@ enum rsnd_reg {
 	RSND_REG_SRC_ROUTE_CTRL,	/* for Gen1 */
 	RSND_REG_SRC_CTRL,		/* for Gen2 */
 	RSND_REG_SSI_CTRL,		/* for Gen2 */
-	RSND_REG_SSI_CONTROL,
 	RSND_REG_SSI_BUSIF_MODE,	/* for Gen2 */
 	RSND_REG_SSI_BUSIF_ADINR,	/* for Gen2 */
 	RSND_REG_SSI_MODE0,
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 7/8] ASoC: rsnd: modify rsnd_adg_ssi_ws_timing_gen2() parameter
  2014-03-03  7:42 ` Kuninori Morimoto
                     ` (5 preceding siblings ...)
  2014-03-03  7:43   ` [PATCH 6/8] ASoC: rsnd: remove unused SSI_CONTROL Kuninori Morimoto
@ 2014-03-03  7:43   ` Kuninori Morimoto
  2014-03-03  7:43   ` [PATCH 8/8] ASoC: rsnd: share reg_field and reduce memory Kuninori Morimoto
  7 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:43 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

rsnd_adg_ssi_ws_timing_gen2() returns SSI WS timing,
and it used "mod" as parameter.
but, this "mod" is sometimes not ssi mod.
Get SSI mod from rsnd_dai_stream

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/adg.c |    7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index a05ad81..8df00ac 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -32,8 +32,9 @@ struct rsnd_adg {
 #define rsnd_priv_to_adg(priv) ((struct rsnd_adg *)(priv)->adg)
 
 
-static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_mod *mod)
+static u32 rsnd_adg_ssi_ws_timing_gen2(struct rsnd_dai_stream *io)
 {
+	struct rsnd_mod *mod = rsnd_io_to_mod_ssi(io);
 	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 	int id = rsnd_mod_id(mod);
 	int ws = id;
@@ -67,7 +68,7 @@ static int rsnd_adg_set_src_timsel_gen2(struct rsnd_dai *rdai,
 	u32 mask, ws;
 	u32 in, out;
 
-	ws = rsnd_adg_ssi_ws_timing_gen2(mod);
+	ws = rsnd_adg_ssi_ws_timing_gen2(io);
 
 	in  = (is_play) ? timsel : ws;
 	out = (is_play) ? ws     : timsel;
@@ -174,7 +175,7 @@ int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod,
 				     struct rsnd_dai *rdai,
 				     struct rsnd_dai_stream *io)
 {
-	u32 val = rsnd_adg_ssi_ws_timing_gen2(mod);
+	u32 val = rsnd_adg_ssi_ws_timing_gen2(io);
 
 	return rsnd_adg_set_src_timsel_gen2(rdai, mod, io, val);
 }
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 8/8] ASoC: rsnd: share reg_field and reduce memory
  2014-03-03  7:42 ` Kuninori Morimoto
                     ` (6 preceding siblings ...)
  2014-03-03  7:43   ` [PATCH 7/8] ASoC: rsnd: modify rsnd_adg_ssi_ws_timing_gen2() parameter Kuninori Morimoto
@ 2014-03-03  7:43   ` Kuninori Morimoto
  7 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:43 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Gen1/Gen2 code never be used in same time.
Thus, driver can share Gen1 only register and Gen2 only register.
It can reduce memory too.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/rsnd.h |   81 ++++++++++++++++++++++++++++++----------------
 1 file changed, 53 insertions(+), 28 deletions(-)

diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index e16acd2..d5afdee 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -32,18 +32,8 @@
  */
 enum rsnd_reg {
 	/* SRU/SCU/SSIU */
-	RSND_REG_SRC_ROUTE_SEL,		/* for Gen1 */
-	RSND_REG_SRC_TMG_SEL0,		/* for Gen1 */
-	RSND_REG_SRC_TMG_SEL1,		/* for Gen1 */
-	RSND_REG_SRC_TMG_SEL2,		/* for Gen1 */
-	RSND_REG_SRC_ROUTE_CTRL,	/* for Gen1 */
-	RSND_REG_SRC_CTRL,		/* for Gen2 */
-	RSND_REG_SSI_CTRL,		/* for Gen2 */
-	RSND_REG_SSI_BUSIF_MODE,	/* for Gen2 */
-	RSND_REG_SSI_BUSIF_ADINR,	/* for Gen2 */
 	RSND_REG_SSI_MODE0,
 	RSND_REG_SSI_MODE1,
-	RSND_REG_INT_ENABLE,		/* for Gen2 */
 	RSND_REG_SRC_BUSIF_MODE,
 	RSND_REG_SRC_ROUTE_MODE0,
 	RSND_REG_SRC_SWRSR,
@@ -52,9 +42,6 @@ enum rsnd_reg {
 	RSND_REG_SRC_IFSCR,
 	RSND_REG_SRC_IFSVR,
 	RSND_REG_SRC_SRCCR,
-	RSND_REG_SRC_MNFSR,		/* for Gen1 */
-	RSND_REG_SRC_BSDSR,		/* for Gen2 */
-	RSND_REG_SRC_BSISR,		/* for Gen2 */
 
 	/* ADG */
 	RSND_REG_BRRA,
@@ -62,21 +49,6 @@ enum rsnd_reg {
 	RSND_REG_SSICKR,
 	RSND_REG_AUDIO_CLK_SEL0,
 	RSND_REG_AUDIO_CLK_SEL1,
-	RSND_REG_AUDIO_CLK_SEL2,
-	RSND_REG_AUDIO_CLK_SEL3,	/* for Gen1 */
-	RSND_REG_AUDIO_CLK_SEL4,	/* for Gen1 */
-	RSND_REG_AUDIO_CLK_SEL5,	/* for Gen1 */
-	RSND_REG_DIV_EN,		/* for Gen2 */
-	RSND_REG_SRCIN_TIMSEL0,		/* for Gen2 */
-	RSND_REG_SRCIN_TIMSEL1,		/* for Gen2 */
-	RSND_REG_SRCIN_TIMSEL2,		/* for Gen2 */
-	RSND_REG_SRCIN_TIMSEL3,		/* for Gen2 */
-	RSND_REG_SRCIN_TIMSEL4,		/* for Gen2 */
-	RSND_REG_SRCOUT_TIMSEL0,	/* for Gen2 */
-	RSND_REG_SRCOUT_TIMSEL1,	/* for Gen2 */
-	RSND_REG_SRCOUT_TIMSEL2,	/* for Gen2 */
-	RSND_REG_SRCOUT_TIMSEL3,	/* for Gen2 */
-	RSND_REG_SRCOUT_TIMSEL4,	/* for Gen2 */
 
 	/* SSI */
 	RSND_REG_SSICR,
@@ -85,9 +57,62 @@ enum rsnd_reg {
 	RSND_REG_SSIRDR,
 	RSND_REG_SSIWSR,
 
+	/* SHARE see below */
+	RSND_REG_SHARE01,
+	RSND_REG_SHARE02,
+	RSND_REG_SHARE03,
+	RSND_REG_SHARE04,
+	RSND_REG_SHARE05,
+	RSND_REG_SHARE06,
+	RSND_REG_SHARE07,
+	RSND_REG_SHARE08,
+	RSND_REG_SHARE09,
+	RSND_REG_SHARE10,
+	RSND_REG_SHARE11,
+	RSND_REG_SHARE12,
+	RSND_REG_SHARE13,
+	RSND_REG_SHARE14,
+	RSND_REG_SHARE15,
+	RSND_REG_SHARE16,
+	RSND_REG_SHARE17,
+	RSND_REG_SHARE18,
+	RSND_REG_SHARE19,
+
 	RSND_REG_MAX,
 };
 
+/* Gen1 only */
+#define RSND_REG_SRC_ROUTE_SEL		RSND_REG_SHARE01
+#define RSND_REG_SRC_TMG_SEL0		RSND_REG_SHARE02
+#define RSND_REG_SRC_TMG_SEL1		RSND_REG_SHARE03
+#define RSND_REG_SRC_TMG_SEL2		RSND_REG_SHARE04
+#define RSND_REG_SRC_ROUTE_CTRL		RSND_REG_SHARE05
+#define RSND_REG_SRC_MNFSR		RSND_REG_SHARE06
+#define RSND_REG_AUDIO_CLK_SEL3		RSND_REG_SHARE07
+#define RSND_REG_AUDIO_CLK_SEL4		RSND_REG_SHARE08
+#define RSND_REG_AUDIO_CLK_SEL5		RSND_REG_SHARE09
+
+/* Gen2 only */
+#define RSND_REG_SRC_CTRL		RSND_REG_SHARE01
+#define RSND_REG_SSI_CTRL		RSND_REG_SHARE02
+#define RSND_REG_SSI_BUSIF_MODE		RSND_REG_SHARE03
+#define RSND_REG_SSI_BUSIF_ADINR	RSND_REG_SHARE04
+#define RSND_REG_INT_ENABLE		RSND_REG_SHARE05
+#define RSND_REG_SRC_BSDSR		RSND_REG_SHARE06
+#define RSND_REG_SRC_BSISR		RSND_REG_SHARE07
+#define RSND_REG_DIV_EN			RSND_REG_SHARE08
+#define RSND_REG_SRCIN_TIMSEL0		RSND_REG_SHARE09
+#define RSND_REG_SRCIN_TIMSEL1		RSND_REG_SHARE10
+#define RSND_REG_SRCIN_TIMSEL2		RSND_REG_SHARE11
+#define RSND_REG_SRCIN_TIMSEL3		RSND_REG_SHARE12
+#define RSND_REG_SRCIN_TIMSEL4		RSND_REG_SHARE13
+#define RSND_REG_SRCOUT_TIMSEL0		RSND_REG_SHARE14
+#define RSND_REG_SRCOUT_TIMSEL1		RSND_REG_SHARE15
+#define RSND_REG_SRCOUT_TIMSEL2		RSND_REG_SHARE16
+#define RSND_REG_SRCOUT_TIMSEL3		RSND_REG_SHARE17
+#define RSND_REG_SRCOUT_TIMSEL4		RSND_REG_SHARE18
+#define RSND_REG_AUDIO_CLK_SEL2		RSND_REG_SHARE19
+
 struct rsnd_priv;
 struct rsnd_mod;
 struct rsnd_dai;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops
  2014-03-03  2:12       ` Kuninori Morimoto
@ 2014-03-03  7:45         ` Kuninori Morimoto
  0 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-03  7:45 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


Hi Mark again

> > > We should fix the simple-card code so that it does not need this rather
> > > than adding empty functions to all the drivers - I'd expect it to handle
> > > -ENOTSUPP as not an error.
(snip)
> Oops, I was misunderstanding.
> I see, I will add -ENOTSUPP support.

Current mark/topic/simple already has -ENOTSUPP support.
Thank you

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 1/8] ASoC: rsnd: run rsnd_path_init() when probe() timing
  2014-03-03  7:42   ` [PATCH 1/8] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
@ 2014-03-04  4:13     ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-04  4:13 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 392 bytes --]

On Sun, Mar 02, 2014 at 11:42:47PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> Current rsnd SSIU/SSI/SCU/SRU path is set
> when playback/capture starts up.
> But it is meaningless method, since the path is based
> on platform and can be set in probe() timing.
> This patch sets the path on probe() timing.

Applied all, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 0/19] ASoC: rsnd: new module path method and DT support
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (21 preceding siblings ...)
  2014-03-03  7:42 ` Kuninori Morimoto
@ 2014-03-04  4:49 ` Kuninori Morimoto
  2014-03-04  4:49   ` [PATCH 01/11] ASoC: rsnd: add struct rsnd_dai_platform_info Kuninori Morimoto
                     ` (10 more replies)
  2014-03-10 16:28 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Ben Dooks
  23 siblings, 11 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:49 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


Hi Mark

These are Renesas R-Car sound driver patches v2.

 1) cleanup patches
 2) new feature patches

These are 2) part patches.
#1, #2 patches add new style (= rsnd_dai_platform_info) to driver.
Current driver is still keeping compatible to old style,
but it will be removed after marge.
#10 is big patch, since it renames scu to src.
These #1, #2, and #10 are important for DT support

These are based on latest mark/topic/rcar

Kuninori Morimoto (11):
       1) ASoC: rsnd: add struct rsnd_dai_platform_info
       2) ASoC: rsnd: Get correct SCU ID
       3) ASoC: rsnd: add rsnd_scu_enable_ssi_irq()
       4) ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI
       5) ASoC: rsnd: add probe/remove callback on rsnd_mod_ops
       6) ASoC: rsnd: use mod probe method on SCU
       7) ASoC: rsnd: use mod probe method on SSI
       8) ASoC: rsnd: nothing to do on rsnd_dai_remove()
       9) ASoC: rsnd: remove all rsnd_xxx_remove()
      10) ASoC: rsnd: rename scu to src
      11) ASoC: rsnd: add DeviceTree support

 .../devicetree/bindings/sound/renesas,rsnd.txt     |  101 +++
 include/sound/rcar_snd.h                           |   32 +-
 sound/soc/sh/rcar/Makefile                         |    2 +-
 sound/soc/sh/rcar/adg.c                            |    6 +-
 sound/soc/sh/rcar/core.c                           |  259 +++++--
 sound/soc/sh/rcar/gen.c                            |   20 +-
 sound/soc/sh/rcar/rsnd.h                           |   65 +-
 sound/soc/sh/rcar/scu.c                            |  682 ------------------
 sound/soc/sh/rcar/src.c                            |  723 ++++++++++++++++++++
 sound/soc/sh/rcar/ssi.c                            |  190 +++--
 10 files changed, 1242 insertions(+), 838 deletions(-)

^ permalink raw reply	[flat|nested] 68+ messages in thread

* [PATCH 01/11] ASoC: rsnd: add struct rsnd_dai_platform_info
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
@ 2014-03-04  4:49   ` Kuninori Morimoto
  2014-03-04  4:50   ` [PATCH 02/11] ASoC: rsnd: Get correct SCU ID Kuninori Morimoto
                     ` (9 subsequent siblings)
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:49 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

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>
---
 include/sound/rcar_snd.h |   17 ++++++++++++++++-
 sound/soc/sh/rcar/core.c |   23 ++++++++++++++++-------
 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 e3d585c..698f7b5 100644
--- a/include/sound/rcar_snd.h
+++ b/include/sound/rcar_snd.h
@@ -36,13 +36,15 @@
 #define RSND_SSI_CLK_PIN_SHARE		(1 << 31)
 #define RSND_SSI_PLAY			(1 << 24)
 
+#define RSND_SSI(_dma_id, _pio_irq, _flags)		\
+{ .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags }
 #define RSND_SSI_SET(_dai_id, _dma_id, _pio_irq, _flags)	\
 { .dai_id = _dai_id, .dma_id = _dma_id, .pio_irq = _pio_irq, .flags = _flags }
 #define RSND_SSI_UNUSED \
 { .dai_id = -1, .dma_id = -1, .pio_irq = -1, .flags = 0 }
 
 struct rsnd_ssi_platform_info {
-	int dai_id;
+	int dai_id;	/* will be removed */
 	int dma_id;
 	int pio_irq;
 	u32 flags;
@@ -53,6 +55,8 @@ struct rsnd_ssi_platform_info {
  */
 #define RSND_SCU_USE_HPBIF		(1 << 31) /* it needs RSND_SSI_DEPENDENT */
 
+#define RSND_SCU(rate, _dma_id)						\
+{ .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, }
 #define RSND_SCU_SET(rate, _dma_id)		\
 	{ .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, }
 #define RSND_SCU_UNUSED				\
@@ -64,6 +68,15 @@ struct rsnd_scu_platform_info {
 	int dma_id; /* for Gen2 SCU */
 };
 
+struct rsnd_dai_path_info {
+	struct rsnd_ssi_platform_info *ssi;
+};
+
+struct rsnd_dai_platform_info {
+	struct rsnd_dai_path_info playback;
+	struct rsnd_dai_path_info capture;
+};
+
 /*
  * flags
  *
@@ -81,6 +94,8 @@ struct rcar_snd_info {
 	int ssi_info_nr;
 	struct rsnd_scu_platform_info *scu_info;
 	int scu_info_nr;
+	struct rsnd_dai_platform_info *dai_info;
+	int dai_info_nr;
 	int (*start)(int id);
 	int (*stop)(int id);
 };
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index ea747614..4504726 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,
 			  struct rsnd_priv *priv)
 {
 	struct snd_soc_dai_driver *drv;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
 	struct rsnd_dai *rdai;
 	struct rsnd_mod *pmod, *cmod;
 	struct device *dev = rsnd_priv_to_dev(priv);
-	int dai_nr;
+	int dai_nr = info->dai_info_nr;
 	int i;
 
-	/* get max dai nr */
-	for (dai_nr = 0; dai_nr < 32; dai_nr++) {
-		pmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 1);
-		cmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 0);
+	/*
+	 * dai_nr should be set via dai_info_nr,
+	 * but allow it to keeping compatible
+	 */
+	if (!dai_nr) {
+		/* get max dai nr */
+		for (dai_nr = 0; dai_nr < 32; dai_nr++) {
+			pmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 1);
+			cmod = rsnd_ssi_mod_get_frm_dai(priv, dai_nr, 0);
 
-		if (!pmod && !cmod)
-			break;
+			if (!pmod && !cmod)
+				break;
+		}
 	}
 
 	if (!dai_nr) {
@@ -671,6 +678,8 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 	priv->rdai	= rdai;
 
 	for (i = 0; i < dai_nr; i++) {
+		if (info->dai_info)
+			rdai[i].info = &info->dai_info[i];
 
 		pmod = rsnd_ssi_mod_get_frm_dai(priv, i, 1);
 		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 25a7d44..3423481 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 = {
 struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv,
 					  int dai_id, int is_play)
 {
+	struct rsnd_dai_platform_info *dai_info = NULL;
+	struct rsnd_dai_path_info *path_info = NULL;
+	struct rsnd_ssi_platform_info *target_info = NULL;
 	struct rsnd_ssi *ssi;
 	int i, has_play;
 
+	if (priv->rdai)
+		dai_info = priv->rdai[dai_id].info;
+	if (dai_info)
+		path_info = (is_play) ? &dai_info->playback : &dai_info->capture;
+	if (path_info)
+		target_info = path_info->ssi;
+
 	is_play = !!is_play;
 
 	for_each_rsnd_ssi(ssi, priv, i) {
+		if (target_info == ssi->info)
+			return &ssi->mod;
+
+		/* for compatible */
 		if (rsnd_ssi_dai_id(ssi) != dai_id)
 			continue;
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 02/11] ASoC: rsnd: Get correct SCU ID
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
  2014-03-04  4:49   ` [PATCH 01/11] ASoC: rsnd: add struct rsnd_dai_platform_info Kuninori Morimoto
@ 2014-03-04  4:50   ` Kuninori Morimoto
  2014-03-04  4:50   ` [PATCH 03/11] ASoC: rsnd: add rsnd_scu_enable_ssi_irq() Kuninori Morimoto
                     ` (8 subsequent siblings)
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:50 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current rsnd driver is assuming that SCU/SRU ID is
same as SSIU/SSI ID, because Gen1 can't select it.
But, Gen2 can select it.
The SCU/SRU/SSIU/SSI pair depends on the platform.
This patch get correct SCU ID from platform info.
To keep compatible, it still assuming SCU ID = SSI ID
if platform doesn't have info

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/rcar_snd.h |    1 +
 sound/soc/sh/rcar/core.c |   47 ++++++++++++++++++++++++++++++++--------------
 sound/soc/sh/rcar/rsnd.h |   14 ++++++++++++++
 sound/soc/sh/rcar/scu.c  |   21 ++++++++++++++++-----
 sound/soc/sh/rcar/ssi.c  |    9 ++++++++-
 5 files changed, 72 insertions(+), 20 deletions(-)

diff --git a/include/sound/rcar_snd.h b/include/sound/rcar_snd.h
index 698f7b5..1d8c683 100644
--- a/include/sound/rcar_snd.h
+++ b/include/sound/rcar_snd.h
@@ -70,6 +70,7 @@ struct rsnd_scu_platform_info {
 
 struct rsnd_dai_path_info {
 	struct rsnd_ssi_platform_info *ssi;
+	struct rsnd_scu_platform_info *scu;
 };
 
 struct rsnd_dai_platform_info {
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 4504726..7316d10 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -107,6 +107,11 @@
 	(!(priv->info->func) ? 0 :		\
 	 priv->info->func(param))
 
+#define rsnd_is_enable_path(io, name) \
+	((io)->info ? (io)->info->name : NULL)
+#define rsnd_info_id(priv, io, name) \
+	((io)->info->name - priv->info->name##_info)
+
 /*
  *	rsnd_mod functions
  */
@@ -572,8 +577,10 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 			  struct rsnd_dai_stream *io)
 {
 	struct rsnd_mod *mod;
+	struct rsnd_dai_platform_info *dai_info = rdai->info;
 	int ret;
-	int id;
+	int ssi_id = -1;
+	int scu_id = -1;
 
 	/*
 	 * Gen1 is created by SRU/SSI, and this SRU is base module of
@@ -584,29 +591,35 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	 *
 	 * Gen2 SCU path is very flexible, but, Gen1 SRU (SCU parts) is
 	 * using fixed path.
-	 *
-	 * Then, SSI id = SCU id here
 	 */
-	/* get SSI's ID */
-	mod = rsnd_ssi_mod_get_frm_dai(priv,
-				       rsnd_dai_id(priv, rdai),
-				       rsnd_dai_is_play(rdai, io));
-	if (!mod)
-		return 0;
-	id = rsnd_mod_id(mod);
+	if (dai_info) {
+		if (rsnd_is_enable_path(io, ssi))
+			ssi_id = rsnd_info_id(priv, io, ssi);
+		if (rsnd_is_enable_path(io, scu))
+			scu_id = rsnd_info_id(priv, io, scu);
+	} else {
+		/* get SSI's ID */
+		mod = rsnd_ssi_mod_get_frm_dai(priv,
+					       rsnd_dai_id(priv, rdai),
+					       rsnd_dai_is_play(rdai, io));
+		if (!mod)
+			return 0;
+		ssi_id = scu_id = rsnd_mod_id(mod);
+	}
+
 	ret = 0;
 
 	/* SCU */
-	mod = rsnd_scu_mod_get(priv, id);
-	if (mod) {
+	if (scu_id >= 0) {
+		mod = rsnd_scu_mod_get(priv, scu_id);
 		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
 	}
 
 	/* SSI */
-	mod = rsnd_ssi_mod_get(priv, id);
-	if (mod) {
+	if (ssi_id >= 0) {
+		mod = rsnd_ssi_mod_get(priv, ssi_id);
 		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
@@ -699,6 +712,9 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 			drv[i].playback.formats		= RSND_FMTS;
 			drv[i].playback.channels_min	= 2;
 			drv[i].playback.channels_max	= 2;
+
+			if (info->dai_info)
+				rdai[i].playback.info = &info->dai_info[i].playback;
 			rsnd_path_init(priv, &rdai[i], &rdai[i].playback);
 		}
 		if (cmod) {
@@ -706,6 +722,9 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 			drv[i].capture.formats		= RSND_FMTS;
 			drv[i].capture.channels_min	= 2;
 			drv[i].capture.channels_max	= 2;
+
+			if (info->dai_info)
+				rdai[i].capture.info = &info->dai_info[i].capture;
 			rsnd_path_init(priv, &rdai[i], &rdai[i].capture);
 		}
 
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index d5afdee..3472631 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -211,6 +211,7 @@ char *rsnd_mod_name(struct rsnd_mod *mod);
 struct rsnd_dai_stream {
 	struct snd_pcm_substream *substream;
 	struct rsnd_mod *mod[RSND_MOD_MAX];
+	struct rsnd_dai_path_info *info; /* rcar_snd.h */
 	int byte_pos;
 	int period_pos;
 	int byte_per_period;
@@ -328,6 +329,19 @@ struct rsnd_priv {
 #define rsnd_lock(priv, flags) spin_lock_irqsave(&priv->lock, flags)
 #define rsnd_unlock(priv, flags) spin_unlock_irqrestore(&priv->lock, flags)
 
+#define rsnd_info_is_playback(priv, type)				\
+({									\
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);		\
+	int i, is_play = 0;						\
+	for (i = 0; i < info->dai_info_nr; i++) {			\
+		if (info->dai_info[i].playback.type == (type)->info) {	\
+			is_play = 1;					\
+			break;						\
+		}							\
+	}								\
+	is_play;							\
+})
+
 /*
  *	R-Car SCU
  */
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 1073d35..b517300 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -620,6 +620,9 @@ int rsnd_scu_probe(struct platform_device *pdev,
 	 * init SCU
 	 */
 	nr	= info->scu_info_nr;
+	if (!nr)
+		return 0;
+
 	scu	= devm_kzalloc(dev, sizeof(*scu) * nr, GFP_KERNEL);
 	if (!scu) {
 		dev_err(dev, "SCU allocate failed\n");
@@ -644,11 +647,19 @@ int rsnd_scu_probe(struct platform_device *pdev,
 			if (rsnd_is_gen1(priv))
 				ops = &rsnd_scu_gen1_ops;
 			if (rsnd_is_gen2(priv)) {
-				struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, i);
-				int ret = rsnd_dma_init(priv,
-						rsnd_mod_to_dma(&scu->mod),
-						rsnd_ssi_is_play(ssi),
-						scu->info->dma_id);
+				int ret;
+				int is_play;
+
+				if (info->dai_info) {
+					is_play = rsnd_info_is_playback(priv, scu);
+				} else {
+					struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, i);
+					is_play = rsnd_ssi_is_play(ssi);
+				}
+				ret = rsnd_dma_init(priv,
+						    rsnd_mod_to_dma(&scu->mod),
+						    is_play,
+						    scu->info->dma_id);
 				if (ret < 0)
 					return ret;
 
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 3423481..9162c2b 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -567,9 +567,16 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 		 * SSI DMA case
 		 */
 		if (pinfo->dma_id > 0) {
+			int is_play;
+
+			if (info->dai_info)
+				is_play = rsnd_info_is_playback(priv, ssi);
+			else
+				is_play = rsnd_ssi_is_play(&ssi->mod);
+
 			ret = rsnd_dma_init(
 				priv, rsnd_mod_to_dma(&ssi->mod),
-				rsnd_ssi_is_play(&ssi->mod),
+				is_play,
 				pinfo->dma_id);
 			if (ret < 0)
 				dev_info(dev, "SSI DMA failed. try PIO transter\n");
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 03/11] ASoC: rsnd: add rsnd_scu_enable_ssi_irq()
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
  2014-03-04  4:49   ` [PATCH 01/11] ASoC: rsnd: add struct rsnd_dai_platform_info Kuninori Morimoto
  2014-03-04  4:50   ` [PATCH 02/11] ASoC: rsnd: Get correct SCU ID Kuninori Morimoto
@ 2014-03-04  4:50   ` Kuninori Morimoto
  2014-03-04  4:50   ` [PATCH 04/11] ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI Kuninori Morimoto
                     ` (7 subsequent siblings)
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:50 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current R-Car sound driver is assuming that
SCU mod is used even though it is not needed.
Because scu.c is controlling SSIU too.
(it is Gen1 compatibility)
But, SCU mod will be really not used if new platform dai
feature was used.
Thus, SSIU irq setting is called from SSI
directory by this patch.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/rsnd.h |    3 +++
 sound/soc/sh/rcar/scu.c  |   26 +++++++++++++-------------
 sound/soc/sh/rcar/ssi.c  |    2 ++
 3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 3472631..3b71b77 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -353,6 +353,9 @@ struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
 				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime);
+int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
+			    struct rsnd_dai *rdai,
+			    struct rsnd_dai_stream *io);
 
 #define rsnd_scu_nr(priv) ((priv)->scu_nr)
 
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index b517300..8ce79e8 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -165,6 +165,19 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 	return 0;
 }
 
+int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
+			    struct rsnd_dai *rdai,
+			    struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
+
+	/* enable PIO interrupt if Gen2 */
+	if (rsnd_is_gen2(priv))
+		rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
+
+	return 0;
+}
+
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
 				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime)
@@ -579,22 +592,9 @@ static struct rsnd_mod_ops rsnd_scu_gen2_ops = {
 	.stop	= rsnd_scu_stop_gen2,
 };
 
-static int rsnd_scu_start_non_gen2(struct rsnd_mod *mod,
-				   struct rsnd_dai *rdai,
-				   struct rsnd_dai_stream *io)
-{
-	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
-
-	/* enable PIO interrupt */
-	rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
-
-	return 0;
-}
-
 static struct rsnd_mod_ops rsnd_scu_non_gen2_ops = {
 	.name	= "non-scu (gen2)",
 	.init	= rsnd_scu_ssi_mode_init,
-	.start	= rsnd_scu_start_non_gen2,
 };
 
 struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id)
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 9162c2b..a74c7a7 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -365,6 +365,8 @@ static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
 	/* enable PIO IRQ */
 	ssi->cr_etc = UIEN | OIEN | DIEN;
 
+	rsnd_scu_enable_ssi_irq(mod, rdai, io);
+
 	rsnd_ssi_hw_start(ssi, rdai, io);
 
 	return 0;
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 04/11] ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                     ` (2 preceding siblings ...)
  2014-03-04  4:50   ` [PATCH 03/11] ASoC: rsnd: add rsnd_scu_enable_ssi_irq() Kuninori Morimoto
@ 2014-03-04  4:50   ` Kuninori Morimoto
  2014-03-04  4:50   ` [PATCH 05/11] ASoC: rsnd: add probe/remove callback on rsnd_mod_ops Kuninori Morimoto
                     ` (6 subsequent siblings)
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:50 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Current R-Car sound driver is assuming that
SCU mod is used even though it is not needed.
Because scu.c is controlling SSIU too.
(it is Gen1 compatibility)
But, SCU mod will be really not used if new platform dai
feature was added.
Thus, rsnd_scu_ssi_mode_init() is called from SSI
directory by this patch.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/rsnd.h |    3 +++
 sound/soc/sh/rcar/scu.c  |   54 +++++++++++++++-------------------------------
 sound/soc/sh/rcar/ssi.c  |    2 ++
 3 files changed, 22 insertions(+), 37 deletions(-)

diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 3b71b77..9205f96 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -353,6 +353,9 @@ struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
 				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime);
+int rsnd_scu_ssi_mode_init(struct rsnd_mod *ssi_mod,
+			   struct rsnd_dai *rdai,
+			   struct rsnd_dai_stream *io);
 int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
 			    struct rsnd_dai *rdai,
 			    struct rsnd_dai_stream *io);
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 8ce79e8..63e6aeb 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -115,28 +115,28 @@ struct rsnd_scu {
 /*
  *		Gen1/Gen2 common functions
  */
-static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
-				  struct rsnd_dai *rdai,
-				  struct rsnd_dai_stream *io)
+int rsnd_scu_ssi_mode_init(struct rsnd_mod *ssi_mod,
+			   struct rsnd_dai *rdai,
+			   struct rsnd_dai_stream *io)
 {
-	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
+	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
+	struct rsnd_mod *scu_mod = rsnd_io_to_mod_scu(io);
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
 	int ssi_id = rsnd_mod_id(ssi_mod);
-	u32 convert_rate = rsnd_scu_convert_rate(scu);
-
-	if (convert_rate && !rsnd_dai_is_clk_master(rdai)) {
-		struct device *dev = rsnd_priv_to_dev(priv);
-
-		dev_err(dev, "rsnd should be clk master when you rate convert\n");
-		return -EINVAL;
-	}
+	int has_scu = 0;
 
 	/*
 	 * SSI_MODE0
 	 */
-	rsnd_mod_bset(mod, SSI_MODE0, (1 << ssi_id),
-		      rsnd_scu_hpbif_is_enable(scu) ? 0 : (1 << ssi_id));
+	if (info->dai_info) {
+		has_scu = !!scu_mod;
+	} else {
+		struct rsnd_scu *scu = rsnd_mod_to_scu(scu_mod);
+		has_scu = rsnd_scu_hpbif_is_enable(scu);
+	}
+
+	rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id),
+		      has_scu ? 0 : (1 << ssi_id));
 
 	/*
 	 * SSI_MODE1
@@ -156,7 +156,7 @@ static int rsnd_scu_ssi_mode_init(struct rsnd_mod *mod,
 		}
 
 		if (shift >= 0)
-			rsnd_mod_bset(mod, SSI_MODE1,
+			rsnd_mod_bset(ssi_mod, SSI_MODE1,
 				      0x3 << shift,
 				      rsnd_dai_is_clk_master(rdai) ?
 				      0x2 << shift : 0x1 << shift);
@@ -253,14 +253,9 @@ static int rsnd_scu_init(struct rsnd_mod *mod,
 			 struct rsnd_dai_stream *io)
 {
 	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	int ret;
 
 	clk_enable(scu->clk);
 
-	ret = rsnd_scu_ssi_mode_init(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
 	return 0;
 }
 
@@ -487,11 +482,6 @@ static struct rsnd_mod_ops rsnd_scu_gen1_ops = {
 	.stop	= rsnd_scu_stop_gen1,
 };
 
-static struct rsnd_mod_ops rsnd_scu_non_gen1_ops = {
-	.name	= "non-sru (gen1)",
-	.init	= rsnd_scu_ssi_mode_init,
-};
-
 /*
  *		Gen2 functions
  */
@@ -592,11 +582,6 @@ static struct rsnd_mod_ops rsnd_scu_gen2_ops = {
 	.stop	= rsnd_scu_stop_gen2,
 };
 
-static struct rsnd_mod_ops rsnd_scu_non_gen2_ops = {
-	.name	= "non-scu (gen2)",
-	.init	= rsnd_scu_ssi_mode_init,
-};
-
 struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id)
 {
 	if (WARN_ON(id < 0 || id >= rsnd_scu_nr(priv)))
@@ -665,11 +650,6 @@ int rsnd_scu_probe(struct platform_device *pdev,
 
 				ops = &rsnd_scu_gen2_ops;
 			}
-		} else {
-			if (rsnd_is_gen1(priv))
-				ops = &rsnd_scu_non_gen1_ops;
-			if (rsnd_is_gen2(priv))
-				ops = &rsnd_scu_non_gen2_ops;
 		}
 
 		rsnd_mod_init(priv, &scu->mod, ops, RSND_MOD_SCU, i);
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index a74c7a7..a7df216 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -287,6 +287,8 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
 	ssi->cr_own	= cr;
 	ssi->err	= -1; /* ignore 1st error */
 
+	rsnd_scu_ssi_mode_init(mod, rdai, io);
+
 	return 0;
 }
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 05/11] ASoC: rsnd: add probe/remove callback on rsnd_mod_ops
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                     ` (3 preceding siblings ...)
  2014-03-04  4:50   ` [PATCH 04/11] ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI Kuninori Morimoto
@ 2014-03-04  4:50   ` Kuninori Morimoto
  2014-03-04  4:50   ` [PATCH 06/11] ASoC: rsnd: use mod probe method on SCU Kuninori Morimoto
                     ` (5 subsequent siblings)
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:50 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Each rsnd mod needs specific probe method,
and its best timing is DAI probe timing.
But current code runs it mod probe timing.
This patch adds new probe/remove callback to solve it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   23 +++++++++++++++++++++++
 sound/soc/sh/rcar/rsnd.h |    6 ++++++
 2 files changed, 29 insertions(+)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 7316d10..e8e585d 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -842,6 +842,7 @@ static int rsnd_probe(struct platform_device *pdev)
 	struct rcar_snd_info *info;
 	struct rsnd_priv *priv;
 	struct device *dev = &pdev->dev;
+	struct rsnd_dai *rdai;
 	int (*probe_func[])(struct platform_device *pdev,
 			    struct rsnd_priv *priv) = {
 		rsnd_gen_probe,
@@ -880,6 +881,16 @@ static int rsnd_probe(struct platform_device *pdev)
 			return ret;
 	}
 
+	for_each_rsnd_dai(rdai, priv, i) {
+		ret = rsnd_dai_call(rdai, &rdai->playback, probe);
+		if (ret)
+			return ret;
+
+		ret = rsnd_dai_call(rdai, &rdai->capture, probe);
+		if (ret)
+			return ret;
+	}
+
 	/*
 	 *	asoc register
 	 */
@@ -912,9 +923,21 @@ exit_snd_soc:
 static int rsnd_remove(struct platform_device *pdev)
 {
 	struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev);
+	struct rsnd_dai *rdai;
+	int ret, i;
 
 	pm_runtime_disable(&pdev->dev);
 
+	for_each_rsnd_dai(rdai, priv, i) {
+		ret = rsnd_dai_call(rdai, &rdai->playback, remove);
+		if (ret)
+			return ret;
+
+		ret = rsnd_dai_call(rdai, &rdai->capture, remove);
+		if (ret)
+			return ret;
+	}
+
 	/*
 	 *	remove each module
 	 */
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 9205f96..db20b37 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -167,6 +167,12 @@ enum rsnd_mod_type {
 
 struct rsnd_mod_ops {
 	char *name;
+	int (*probe)(struct rsnd_mod *mod,
+		     struct rsnd_dai *rdai,
+		     struct rsnd_dai_stream *io);
+	int (*remove)(struct rsnd_mod *mod,
+		      struct rsnd_dai *rdai,
+		      struct rsnd_dai_stream *io);
 	int (*init)(struct rsnd_mod *mod,
 		    struct rsnd_dai *rdai,
 		    struct rsnd_dai_stream *io);
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 06/11] ASoC: rsnd: use mod probe method on SCU
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                     ` (4 preceding siblings ...)
  2014-03-04  4:50   ` [PATCH 05/11] ASoC: rsnd: add probe/remove callback on rsnd_mod_ops Kuninori Morimoto
@ 2014-03-04  4:50   ` Kuninori Morimoto
  2014-03-04  4:50   ` [PATCH 07/11] ASoC: rsnd: use mod probe method on SSI Kuninori Morimoto
                     ` (4 subsequent siblings)
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:50 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Now, it can use .probe

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/scu.c |   64 +++++++++++++++++++++++++++++------------------
 1 file changed, 39 insertions(+), 25 deletions(-)

diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 63e6aeb..40250ac 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -525,6 +525,42 @@ static int rsnd_scu_set_convert_timing_gen2(struct rsnd_mod *mod,
 	return ret;
 }
 
+static int rsnd_scu_probe_gen2(struct rsnd_mod *mod,
+			       struct rsnd_dai *rdai,
+			       struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
+	struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, rsnd_mod_id(mod));
+	struct device *dev = rsnd_priv_to_dev(priv);
+	int ret;
+	int is_play;
+
+	if (info->dai_info)
+		is_play = rsnd_info_is_playback(priv, scu);
+	else
+		is_play = rsnd_ssi_is_play(ssi);
+
+	ret = rsnd_dma_init(priv,
+			    rsnd_mod_to_dma(mod),
+			    is_play,
+			    scu->info->dma_id);
+	if (ret < 0)
+		dev_err(dev, "SCU DMA failed\n");
+
+	return ret;
+}
+
+static int rsnd_scu_remove_gen2(struct rsnd_mod *mod,
+				struct rsnd_dai *rdai,
+				struct rsnd_dai_stream *io)
+{
+	rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));
+
+	return 0;
+}
+
 static int rsnd_scu_init_gen2(struct rsnd_mod *mod,
 			      struct rsnd_dai *rdai,
 			      struct rsnd_dai_stream *io)
@@ -576,6 +612,8 @@ static int rsnd_scu_stop_gen2(struct rsnd_mod *mod,
 
 static struct rsnd_mod_ops rsnd_scu_gen2_ops = {
 	.name	= "scu (gen2)",
+	.probe	= rsnd_scu_probe_gen2,
+	.remove	= rsnd_scu_remove_gen2,
 	.init	= rsnd_scu_init_gen2,
 	.quit	= rsnd_scu_quit,
 	.start	= rsnd_scu_start_gen2,
@@ -631,25 +669,8 @@ int rsnd_scu_probe(struct platform_device *pdev,
 		if (rsnd_scu_hpbif_is_enable(scu)) {
 			if (rsnd_is_gen1(priv))
 				ops = &rsnd_scu_gen1_ops;
-			if (rsnd_is_gen2(priv)) {
-				int ret;
-				int is_play;
-
-				if (info->dai_info) {
-					is_play = rsnd_info_is_playback(priv, scu);
-				} else {
-					struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, i);
-					is_play = rsnd_ssi_is_play(ssi);
-				}
-				ret = rsnd_dma_init(priv,
-						    rsnd_mod_to_dma(&scu->mod),
-						    is_play,
-						    scu->info->dma_id);
-				if (ret < 0)
-					return ret;
-
+			if (rsnd_is_gen2(priv))
 				ops = &rsnd_scu_gen2_ops;
-			}
 		}
 
 		rsnd_mod_init(priv, &scu->mod, ops, RSND_MOD_SCU, i);
@@ -663,11 +684,4 @@ int rsnd_scu_probe(struct platform_device *pdev,
 void rsnd_scu_remove(struct platform_device *pdev,
 		     struct rsnd_priv *priv)
 {
-	struct rsnd_scu *scu;
-	int i;
-
-	for_each_rsnd_scu(scu, priv, i) {
-		if (rsnd_scu_dma_available(scu))
-			rsnd_dma_quit(priv, rsnd_mod_to_dma(&scu->mod));
-	}
 }
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 07/11] ASoC: rsnd: use mod probe method on SSI
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                     ` (5 preceding siblings ...)
  2014-03-04  4:50   ` [PATCH 06/11] ASoC: rsnd: use mod probe method on SCU Kuninori Morimoto
@ 2014-03-04  4:50   ` Kuninori Morimoto
  2014-03-04  4:51   ` [PATCH 08/11] ASoC: rsnd: nothing to do on rsnd_dai_remove() Kuninori Morimoto
                     ` (3 subsequent siblings)
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:50 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Now, it can use .probe

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/ssi.c |  116 ++++++++++++++++++++++++++---------------------
 1 file changed, 65 insertions(+), 51 deletions(-)

diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index a7df216..0f3eeac 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -358,6 +358,26 @@ static irqreturn_t rsnd_ssi_pio_interrupt(int irq, void *data)
 	return ret;
 }
 
+static int rsnd_ssi_pio_probe(struct rsnd_mod *mod,
+			      struct rsnd_dai *rdai,
+			      struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct device *dev = rsnd_priv_to_dev(priv);
+	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+	int irq = ssi->info->pio_irq;
+	int ret;
+
+	ret = devm_request_irq(dev, irq,
+			       rsnd_ssi_pio_interrupt,
+			       IRQF_SHARED,
+			       dev_name(dev), ssi);
+	if (ret)
+		dev_err(dev, "SSI request interrupt failed\n");
+
+	return ret;
+}
+
 static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
 			      struct rsnd_dai *rdai,
 			      struct rsnd_dai_stream *io)
@@ -389,12 +409,50 @@ static int rsnd_ssi_pio_stop(struct rsnd_mod *mod,
 
 static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
 	.name	= "ssi (pio)",
+	.probe	= rsnd_ssi_pio_probe,
 	.init	= rsnd_ssi_init,
 	.quit	= rsnd_ssi_quit,
 	.start	= rsnd_ssi_pio_start,
 	.stop	= rsnd_ssi_pio_stop,
 };
 
+static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
+			  struct rsnd_dai *rdai,
+			  struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = rsnd_priv_to_dev(priv);
+	int dma_id = ssi->info->dma_id;
+	int is_play;
+	int ret;
+
+	if (info->dai_info)
+		is_play = rsnd_info_is_playback(priv, ssi);
+	else
+		is_play = rsnd_ssi_is_play(&ssi->mod);
+
+	ret = rsnd_dma_init(
+		priv, rsnd_mod_to_dma(mod),
+		is_play,
+		dma_id);
+
+	if (ret < 0)
+		dev_err(dev, "SSI DMA failed\n");
+
+	return ret;
+}
+
+static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
+			       struct rsnd_dai *rdai,
+			       struct rsnd_dai_stream *io)
+{
+	rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));
+
+	return 0;
+}
+
 static int rsnd_ssi_dma_start(struct rsnd_mod *mod,
 			      struct rsnd_dai *rdai,
 			      struct rsnd_dai_stream *io)
@@ -436,6 +494,8 @@ static int rsnd_ssi_dma_stop(struct rsnd_mod *mod,
 
 static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
 	.name	= "ssi (dma)",
+	.probe	= rsnd_ssi_dma_probe,
+	.remove	= rsnd_ssi_dma_remove,
 	.init	= rsnd_ssi_init,
 	.quit	= rsnd_ssi_quit,
 	.start	= rsnd_ssi_dma_start,
@@ -538,7 +598,7 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 	struct clk *clk;
 	struct rsnd_ssi *ssi;
 	char name[RSND_SSI_NAME_SIZE];
-	int i, nr, ret;
+	int i, nr;
 
 	/*
 	 *	init SSI
@@ -566,48 +626,10 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 		ssi->clk	= clk;
 
 		ops = &rsnd_ssi_non_ops;
-
-		/*
-		 * SSI DMA case
-		 */
-		if (pinfo->dma_id > 0) {
-			int is_play;
-
-			if (info->dai_info)
-				is_play = rsnd_info_is_playback(priv, ssi);
-			else
-				is_play = rsnd_ssi_is_play(&ssi->mod);
-
-			ret = rsnd_dma_init(
-				priv, rsnd_mod_to_dma(&ssi->mod),
-				is_play,
-				pinfo->dma_id);
-			if (ret < 0)
-				dev_info(dev, "SSI DMA failed. try PIO transter\n");
-			else
-				ops	= &rsnd_ssi_dma_ops;
-
-			dev_dbg(dev, "SSI%d use DMA transfer\n", i);
-		}
-
-		/*
-		 * SSI PIO case
-		 */
-		if (!rsnd_ssi_dma_available(ssi) &&
-		     rsnd_ssi_pio_available(ssi)) {
-			ret = devm_request_irq(dev, pinfo->pio_irq,
-					       &rsnd_ssi_pio_interrupt,
-					       IRQF_SHARED,
-					       dev_name(dev), ssi);
-			if (ret) {
-				dev_err(dev, "SSI request interrupt failed\n");
-				return ret;
-			}
-
-			ops	= &rsnd_ssi_pio_ops;
-
-			dev_dbg(dev, "SSI%d use PIO transfer\n", i);
-		}
+		if (pinfo->dma_id > 0)
+			ops = &rsnd_ssi_dma_ops;
+		else if (rsnd_ssi_pio_available(ssi))
+			ops = &rsnd_ssi_pio_ops;
 
 		rsnd_mod_init(priv, &ssi->mod, ops, RSND_MOD_SSI, i);
 
@@ -620,12 +642,4 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 void rsnd_ssi_remove(struct platform_device *pdev,
 		   struct rsnd_priv *priv)
 {
-	struct rsnd_ssi *ssi;
-	int i;
-
-	for_each_rsnd_ssi(ssi, priv, i) {
-		if (rsnd_ssi_dma_available(ssi))
-			rsnd_dma_quit(priv, rsnd_mod_to_dma(&ssi->mod));
-	}
-
 }
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 08/11] ASoC: rsnd: nothing to do on rsnd_dai_remove()
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                     ` (6 preceding siblings ...)
  2014-03-04  4:50   ` [PATCH 07/11] ASoC: rsnd: use mod probe method on SSI Kuninori Morimoto
@ 2014-03-04  4:51   ` Kuninori Morimoto
  2014-03-04  4:51   ` [PATCH 09/11] ASoC: rsnd: remove all rsnd_xxx_remove() Kuninori Morimoto
                     ` (2 subsequent siblings)
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:51 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

rsnd_dai_remove() called rsnd_path_exit(),
but these memory will be cleaned automatically.
Because it is created by devm_kzalloc().
nothing to do on rsnd_dai_remove()

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/core.c |   36 ------------------------------------
 1 file changed, 36 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index e8e585d..92e155b 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -348,14 +348,6 @@ static int rsnd_dai_connect(struct rsnd_mod *mod,
 	return 0;
 }
 
-static int rsnd_dai_disconnect(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
-{
-	io->mod[mod->type] = NULL;
-	mod->io = NULL;
-
-	return 0;
-}
-
 int rsnd_dai_id(struct rsnd_priv *priv, struct rsnd_dai *rdai)
 {
 	int id = rdai - priv->rdai;
@@ -628,26 +620,6 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	return ret;
 }
 
-static int rsnd_path_exit(struct rsnd_priv *priv,
-			  struct rsnd_dai *rdai,
-			  struct rsnd_dai_stream *io)
-{
-	struct rsnd_mod *mod;
-	int ret = 0, i;
-
-	/*
-	 * remove all mod from rdai
-	 */
-	for (i = 0; i < RSND_MOD_MAX; i++) {
-		mod = io->mod[i];
-		if (!mod)
-			continue;
-		ret |= rsnd_dai_disconnect(mod, io);
-	}
-
-	return ret;
-}
-
 static int rsnd_dai_probe(struct platform_device *pdev,
 			  struct rsnd_priv *priv)
 {
@@ -739,14 +711,6 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 static void rsnd_dai_remove(struct platform_device *pdev,
 			  struct rsnd_priv *priv)
 {
-	struct rsnd_dai *rdai;
-	int i;
-
-	for (i = 0; i < rsnd_rdai_nr(priv); i++) {
-		rdai = rsnd_dai_get(priv, i);
-		rsnd_path_exit(priv, rdai, &rdai->playback);
-		rsnd_path_exit(priv, rdai, &rdai->capture);
-	}
 }
 
 /*
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 09/11] ASoC: rsnd: remove all rsnd_xxx_remove()
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                     ` (7 preceding siblings ...)
  2014-03-04  4:51   ` [PATCH 08/11] ASoC: rsnd: nothing to do on rsnd_dai_remove() Kuninori Morimoto
@ 2014-03-04  4:51   ` Kuninori Morimoto
  2014-03-04  4:51   ` [PATCH 10/11] ASoC: rsnd: rename scu to src Kuninori Morimoto
  2014-03-04  4:51   ` [PATCH 11/11] ASoC: rsnd: add DeviceTree support Kuninori Morimoto
  10 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:51 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Now, rsnd_xxx_remove() do nothing.
remove these

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 sound/soc/sh/rcar/adg.c  |    5 -----
 sound/soc/sh/rcar/core.c |   14 --------------
 sound/soc/sh/rcar/gen.c  |    5 -----
 sound/soc/sh/rcar/rsnd.h |    8 --------
 sound/soc/sh/rcar/scu.c  |    5 -----
 sound/soc/sh/rcar/ssi.c  |    5 -----
 6 files changed, 42 deletions(-)

diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 8df00ac..953f1cc 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -454,8 +454,3 @@ int rsnd_adg_probe(struct platform_device *pdev,
 
 	return 0;
 }
-
-void rsnd_adg_remove(struct platform_device *pdev,
-		     struct rsnd_priv *priv)
-{
-}
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 92e155b..ceb4e8b 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -708,11 +708,6 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 	return 0;
 }
 
-static void rsnd_dai_remove(struct platform_device *pdev,
-			  struct rsnd_priv *priv)
-{
-}
-
 /*
  *		pcm ops
  */
@@ -902,15 +897,6 @@ static int rsnd_remove(struct platform_device *pdev)
 			return ret;
 	}
 
-	/*
-	 *	remove each module
-	 */
-	rsnd_ssi_remove(pdev, priv);
-	rsnd_adg_remove(pdev, priv);
-	rsnd_scu_remove(pdev, priv);
-	rsnd_dai_remove(pdev, priv);
-	rsnd_gen_remove(pdev, priv);
-
 	return 0;
 }
 
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 92d1bc9..9094970 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -385,8 +385,3 @@ int rsnd_gen_probe(struct platform_device *pdev,
 
 	return ret;
 }
-
-void rsnd_gen_remove(struct platform_device *pdev,
-		     struct rsnd_priv *priv)
-{
-}
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index db20b37..878dc6e 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -261,8 +261,6 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
  */
 int rsnd_gen_probe(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
-void rsnd_gen_remove(struct platform_device *pdev,
-		     struct rsnd_priv *priv);
 void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 			       struct rsnd_mod *mod,
 			       enum rsnd_reg reg);
@@ -276,8 +274,6 @@ int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
 int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
 int rsnd_adg_probe(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
-void rsnd_adg_remove(struct platform_device *pdev,
-		   struct rsnd_priv *priv);
 int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
 				  struct rsnd_mod *mod,
 				  unsigned int src_rate,
@@ -353,8 +349,6 @@ struct rsnd_priv {
  */
 int rsnd_scu_probe(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
-void rsnd_scu_remove(struct platform_device *pdev,
-		     struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
 				   struct rsnd_dai_stream *io,
@@ -373,8 +367,6 @@ int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
  */
 int rsnd_ssi_probe(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
-void rsnd_ssi_remove(struct platform_device *pdev,
-		   struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
 struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv,
 					  int dai_id, int is_play);
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
index 40250ac..3526a5c 100644
--- a/sound/soc/sh/rcar/scu.c
+++ b/sound/soc/sh/rcar/scu.c
@@ -680,8 +680,3 @@ int rsnd_scu_probe(struct platform_device *pdev,
 
 	return 0;
 }
-
-void rsnd_scu_remove(struct platform_device *pdev,
-		     struct rsnd_priv *priv)
-{
-}
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 0f3eeac..45f828d 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -638,8 +638,3 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 
 	return 0;
 }
-
-void rsnd_ssi_remove(struct platform_device *pdev,
-		   struct rsnd_priv *priv)
-{
-}
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 10/11] ASoC: rsnd: rename scu to src
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                     ` (8 preceding siblings ...)
  2014-03-04  4:51   ` [PATCH 09/11] ASoC: rsnd: remove all rsnd_xxx_remove() Kuninori Morimoto
@ 2014-03-04  4:51   ` Kuninori Morimoto
  2014-03-05  6:08     ` Mark Brown
  2014-03-04  4:51   ` [PATCH 11/11] ASoC: rsnd: add DeviceTree support Kuninori Morimoto
  10 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:51 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

R-Car sound has SCU unit which has SRC/CTU/MIX/DVC,
and current rsnd driver has scu.c and scu module.
Current scu.c has SRC support only.
My first concept was control these feature on scu.c
but, it become difficult and un-understandable now.
This patch rename scu to src

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 include/sound/rcar_snd.h   |   18 +-
 sound/soc/sh/rcar/Makefile |    2 +-
 sound/soc/sh/rcar/core.c   |   26 +-
 sound/soc/sh/rcar/rsnd.h   |   24 +-
 sound/soc/sh/rcar/scu.c    |  682 -------------------------------------------
 sound/soc/sh/rcar/src.c    |  687 ++++++++++++++++++++++++++++++++++++++++++++
 sound/soc/sh/rcar/ssi.c    |    6 +-
 7 files changed, 727 insertions(+), 718 deletions(-)
 delete mode 100644 sound/soc/sh/rcar/scu.c
 create mode 100644 sound/soc/sh/rcar/src.c

diff --git a/include/sound/rcar_snd.h b/include/sound/rcar_snd.h
index 1d8c683..34a3c02 100644
--- a/include/sound/rcar_snd.h
+++ b/include/sound/rcar_snd.h
@@ -55,14 +55,18 @@ struct rsnd_ssi_platform_info {
  */
 #define RSND_SCU_USE_HPBIF		(1 << 31) /* it needs RSND_SSI_DEPENDENT */
 
-#define RSND_SCU(rate, _dma_id)						\
+#define RSND_SRC(rate, _dma_id)						\
 { .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, }
-#define RSND_SCU_SET(rate, _dma_id)		\
+#define RSND_SRC_SET(rate, _dma_id)		\
 	{ .flags = RSND_SCU_USE_HPBIF, .convert_rate = rate, .dma_id = _dma_id, }
-#define RSND_SCU_UNUSED				\
+#define RSND_SRC_UNUSED				\
 	{ .flags = 0, .convert_rate = 0, .dma_id = 0, }
 
-struct rsnd_scu_platform_info {
+#define rsnd_scu_platform_info	rsnd_src_platform_info
+#define src_info		scu_info
+#define src_info_nr		scu_info_nr
+
+struct rsnd_src_platform_info {
 	u32 flags;
 	u32 convert_rate; /* sampling rate convert */
 	int dma_id; /* for Gen2 SCU */
@@ -70,7 +74,7 @@ struct rsnd_scu_platform_info {
 
 struct rsnd_dai_path_info {
 	struct rsnd_ssi_platform_info *ssi;
-	struct rsnd_scu_platform_info *scu;
+	struct rsnd_src_platform_info *src;
 };
 
 struct rsnd_dai_platform_info {
@@ -93,8 +97,8 @@ struct rcar_snd_info {
 	u32 flags;
 	struct rsnd_ssi_platform_info *ssi_info;
 	int ssi_info_nr;
-	struct rsnd_scu_platform_info *scu_info;
-	int scu_info_nr;
+	struct rsnd_src_platform_info *src_info;
+	int src_info_nr;
 	struct rsnd_dai_platform_info *dai_info;
 	int dai_info_nr;
 	int (*start)(int id);
diff --git a/sound/soc/sh/rcar/Makefile b/sound/soc/sh/rcar/Makefile
index 0ff492d..7d0051c 100644
--- a/sound/soc/sh/rcar/Makefile
+++ b/sound/soc/sh/rcar/Makefile
@@ -1,2 +1,2 @@
-snd-soc-rcar-objs	:= core.o gen.o scu.o adg.o ssi.o
+snd-soc-rcar-objs	:= core.o gen.o src.o adg.o ssi.o
 obj-$(CONFIG_SND_SOC_RCAR)	+= snd-soc-rcar.o
\ No newline at end of file
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index ceb4e8b..6a1b45df 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -73,13 +73,13 @@
  *   |  +- ssi[2]
  *   |  ...
  *   |
- *   | ** these control scu
+ *   | ** these control src
  *   |
- *   +- scu
+ *   +- src
  *      |
- *      +- scu[0]
- *      +- scu[1]
- *      +- scu[2]
+ *      +- src[0]
+ *      +- src[1]
+ *      +- src[2]
  *      ...
  *
  *
@@ -572,7 +572,7 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	struct rsnd_dai_platform_info *dai_info = rdai->info;
 	int ret;
 	int ssi_id = -1;
-	int scu_id = -1;
+	int src_id = -1;
 
 	/*
 	 * Gen1 is created by SRU/SSI, and this SRU is base module of
@@ -587,8 +587,8 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	if (dai_info) {
 		if (rsnd_is_enable_path(io, ssi))
 			ssi_id = rsnd_info_id(priv, io, ssi);
-		if (rsnd_is_enable_path(io, scu))
-			scu_id = rsnd_info_id(priv, io, scu);
+		if (rsnd_is_enable_path(io, src))
+			src_id = rsnd_info_id(priv, io, src);
 	} else {
 		/* get SSI's ID */
 		mod = rsnd_ssi_mod_get_frm_dai(priv,
@@ -596,14 +596,14 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 					       rsnd_dai_is_play(rdai, io));
 		if (!mod)
 			return 0;
-		ssi_id = scu_id = rsnd_mod_id(mod);
+		ssi_id = src_id = rsnd_mod_id(mod);
 	}
 
 	ret = 0;
 
-	/* SCU */
-	if (scu_id >= 0) {
-		mod = rsnd_scu_mod_get(priv, scu_id);
+	/* SRC */
+	if (src_id >= 0) {
+		mod = rsnd_src_mod_get(priv, src_id);
 		ret = rsnd_dai_connect(mod, io);
 		if (ret < 0)
 			return ret;
@@ -806,7 +806,7 @@ static int rsnd_probe(struct platform_device *pdev)
 			    struct rsnd_priv *priv) = {
 		rsnd_gen_probe,
 		rsnd_ssi_probe,
-		rsnd_scu_probe,
+		rsnd_src_probe,
 		rsnd_adg_probe,
 		rsnd_dai_probe,
 	};
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 878dc6e..c46e0af 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -160,7 +160,7 @@ void  rsnd_dma_quit(struct rsnd_priv *priv,
  *	R-Car sound mod
  */
 enum rsnd_mod_type {
-	RSND_MOD_SCU = 0,
+	RSND_MOD_SRC = 0,
 	RSND_MOD_SSI,
 	RSND_MOD_MAX,
 };
@@ -224,7 +224,7 @@ struct rsnd_dai_stream {
 	int next_period_byte;
 };
 #define rsnd_io_to_mod_ssi(io)	((io)->mod[RSND_MOD_SSI])
-#define rsnd_io_to_mod_scu(io)	((io)->mod[RSND_MOD_SCU])
+#define rsnd_io_to_mod_src(io)	((io)->mod[RSND_MOD_SRC])
 
 struct rsnd_dai {
 	char name[RSND_DAI_NAME_SIZE];
@@ -302,10 +302,10 @@ struct rsnd_priv {
 	void *gen;
 
 	/*
-	 * below value will be filled on rsnd_scu_probe()
+	 * below value will be filled on rsnd_src_probe()
 	 */
-	void *scu;
-	int scu_nr;
+	void *src;
+	int src_nr;
 
 	/*
 	 * below value will be filled on rsnd_adg_probe()
@@ -345,22 +345,22 @@ struct rsnd_priv {
 })
 
 /*
- *	R-Car SCU
+ *	R-Car SRC
  */
-int rsnd_scu_probe(struct platform_device *pdev,
+int rsnd_src_probe(struct platform_device *pdev,
 		   struct rsnd_priv *priv);
-struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id);
-unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
+struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
+unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
 				   struct rsnd_dai_stream *io,
 				   struct snd_pcm_runtime *runtime);
-int rsnd_scu_ssi_mode_init(struct rsnd_mod *ssi_mod,
+int rsnd_src_ssi_mode_init(struct rsnd_mod *ssi_mod,
 			   struct rsnd_dai *rdai,
 			   struct rsnd_dai_stream *io);
-int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
+int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod,
 			    struct rsnd_dai *rdai,
 			    struct rsnd_dai_stream *io);
 
-#define rsnd_scu_nr(priv) ((priv)->scu_nr)
+#define rsnd_src_nr(priv) ((priv)->src_nr)
 
 /*
  *	R-Car SSI
diff --git a/sound/soc/sh/rcar/scu.c b/sound/soc/sh/rcar/scu.c
deleted file mode 100644
index 3526a5c..0000000
--- a/sound/soc/sh/rcar/scu.c
+++ /dev/null
@@ -1,682 +0,0 @@
-/*
- * Renesas R-Car SCU support
- *
- * Copyright (C) 2013 Renesas Solutions Corp.
- * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-#include "rsnd.h"
-
-struct rsnd_scu {
-	struct rsnd_scu_platform_info *info; /* rcar_snd.h */
-	struct rsnd_mod mod;
-	struct clk *clk;
-};
-
-#define RSND_SCU_NAME_SIZE 16
-
-/*
- * ADINR
- */
-#define OTBL_24		(0 << 16)
-#define OTBL_22		(2 << 16)
-#define OTBL_20		(4 << 16)
-#define OTBL_18		(6 << 16)
-#define OTBL_16		(8 << 16)
-
-#define rsnd_scu_mode_flags(p) ((p)->info->flags)
-#define rsnd_scu_convert_rate(p) ((p)->info->convert_rate)
-#define rsnd_mod_to_scu(_mod)				\
-	container_of((_mod), struct rsnd_scu, mod)
-#define rsnd_scu_hpbif_is_enable(scu)	\
-	(rsnd_scu_mode_flags(scu) & RSND_SCU_USE_HPBIF)
-#define rsnd_scu_dma_available(scu) \
-	rsnd_dma_available(rsnd_mod_to_dma(&(scu)->mod))
-
-#define for_each_rsnd_scu(pos, priv, i)				\
-	for ((i) = 0;						\
-	     ((i) < rsnd_scu_nr(priv)) &&			\
-	     ((pos) = (struct rsnd_scu *)(priv)->scu + i);	\
-	     i++)
-
-
-/*
- *		image of SRC (Sampling Rate Converter)
- *
- * 96kHz   <-> +-----+	48kHz	+-----+	 48kHz	+-------+
- * 48kHz   <-> | SRC | <------>	| SSI |	<----->	| codec |
- * 44.1kHz <-> +-----+		+-----+		+-------+
- * ...
- *
- */
-
-/*
- * scu.c is caring...
- *
- * Gen1
- *
- * [mem] -> [SRU] -> [SSI]
- *        |--------|
- *
- * Gen2
- *
- * [mem] -> [SCU] -> [SSIU] -> [SSI]
- *        |-----------------|
- */
-
-/*
- *	How to use SRC bypass mode for debugging
- *
- * SRC has bypass mode, and it is useful for debugging.
- * In Gen2 case,
- * SRCm_MODE controls whether SRC is used or not
- * SSI_MODE0 controls whether SSIU which receives SRC data
- * is used or not.
- * Both SRCm_MODE/SSI_MODE0 settings are needed if you use SRC,
- * but SRC bypass mode needs SSI_MODE0 only.
- *
- * This driver request
- * struct rsnd_scu_platform_info {
- *	u32 flags;
- *	u32 convert_rate;
- * }
- *
- * rsnd_scu_hpbif_is_enable() will be true
- * if flags had RSND_SCU_USE_HPBIF,
- * and it controls whether SSIU is used or not.
- *
- * rsnd_scu_convert_rate() indicates
- * above convert_rate, and it controls
- * whether SRC is used or not.
- *
- * ex) doesn't use SRC
- * struct rsnd_scu_platform_info info = {
- *	.flags = 0,
- *	.convert_rate = 0,
- * };
- *
- * ex) uses SRC
- * struct rsnd_scu_platform_info info = {
- *	.flags = RSND_SCU_USE_HPBIF,
- *	.convert_rate = 48000,
- * };
- *
- * ex) uses SRC bypass mode
- * struct rsnd_scu_platform_info info = {
- *	.flags = RSND_SCU_USE_HPBIF,
- *	.convert_rate = 0,
- * };
- *
- */
-
-/*
- *		Gen1/Gen2 common functions
- */
-int rsnd_scu_ssi_mode_init(struct rsnd_mod *ssi_mod,
-			   struct rsnd_dai *rdai,
-			   struct rsnd_dai_stream *io)
-{
-	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
-	struct rsnd_mod *scu_mod = rsnd_io_to_mod_scu(io);
-	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
-	int ssi_id = rsnd_mod_id(ssi_mod);
-	int has_scu = 0;
-
-	/*
-	 * SSI_MODE0
-	 */
-	if (info->dai_info) {
-		has_scu = !!scu_mod;
-	} else {
-		struct rsnd_scu *scu = rsnd_mod_to_scu(scu_mod);
-		has_scu = rsnd_scu_hpbif_is_enable(scu);
-	}
-
-	rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id),
-		      has_scu ? 0 : (1 << ssi_id));
-
-	/*
-	 * SSI_MODE1
-	 */
-	if (rsnd_ssi_is_pin_sharing(ssi_mod)) {
-		int shift = -1;
-		switch (ssi_id) {
-		case 1:
-			shift = 0;
-			break;
-		case 2:
-			shift = 2;
-			break;
-		case 4:
-			shift = 16;
-			break;
-		}
-
-		if (shift >= 0)
-			rsnd_mod_bset(ssi_mod, SSI_MODE1,
-				      0x3 << shift,
-				      rsnd_dai_is_clk_master(rdai) ?
-				      0x2 << shift : 0x1 << shift);
-	}
-
-	return 0;
-}
-
-int rsnd_scu_enable_ssi_irq(struct rsnd_mod *ssi_mod,
-			    struct rsnd_dai *rdai,
-			    struct rsnd_dai_stream *io)
-{
-	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
-
-	/* enable PIO interrupt if Gen2 */
-	if (rsnd_is_gen2(priv))
-		rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
-
-	return 0;
-}
-
-unsigned int rsnd_scu_get_ssi_rate(struct rsnd_priv *priv,
-				   struct rsnd_dai_stream *io,
-				   struct snd_pcm_runtime *runtime)
-{
-	struct rsnd_scu *scu;
-	unsigned int rate;
-
-	scu = rsnd_mod_to_scu(rsnd_io_to_mod_scu(io));
-
-	/*
-	 * return convert rate if SRC is used,
-	 * otherwise, return runtime->rate as usual
-	 */
-	rate = rsnd_scu_convert_rate(scu);
-	if (!rate)
-		rate = runtime->rate;
-
-	return rate;
-}
-
-static int rsnd_scu_set_convert_rate(struct rsnd_mod *mod,
-				     struct rsnd_dai *rdai,
-				     struct rsnd_dai_stream *io)
-{
-	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	u32 convert_rate = rsnd_scu_convert_rate(scu);
-	u32 adinr = runtime->channels;
-	u32 fsrate = 0;
-
-	if (convert_rate)
-		fsrate = 0x0400000 / convert_rate * runtime->rate;
-
-	/* set/clear soft reset */
-	rsnd_mod_write(mod, SRC_SWRSR, 0);
-	rsnd_mod_write(mod, SRC_SWRSR, 1);
-
-	/*
-	 * Initialize the operation of the SRC internal circuits
-	 * see rsnd_scu_start()
-	 */
-	rsnd_mod_write(mod, SRC_SRCIR, 1);
-
-	/* Set channel number and output bit length */
-	switch (runtime->sample_bits) {
-	case 16:
-		adinr |= OTBL_16;
-		break;
-	case 32:
-		adinr |= OTBL_24;
-		break;
-	default:
-		return -EIO;
-	}
-	rsnd_mod_write(mod, SRC_ADINR, adinr);
-
-	/* Enable the initial value of IFS */
-	if (fsrate) {
-		rsnd_mod_write(mod, SRC_IFSCR, 1);
-
-		/* Set initial value of IFS */
-		rsnd_mod_write(mod, SRC_IFSVR, fsrate);
-	}
-
-	/* use DMA transfer */
-	rsnd_mod_write(mod, SRC_BUSIF_MODE, 1);
-
-	return 0;
-}
-
-static int rsnd_scu_init(struct rsnd_mod *mod,
-			 struct rsnd_dai *rdai,
-			 struct rsnd_dai_stream *io)
-{
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-
-	clk_enable(scu->clk);
-
-	return 0;
-}
-
-static int rsnd_scu_quit(struct rsnd_mod *mod,
-			 struct rsnd_dai *rdai,
-			 struct rsnd_dai_stream *io)
-{
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-
-	clk_disable(scu->clk);
-
-	return 0;
-}
-
-static int rsnd_scu_start(struct rsnd_mod *mod,
-			  struct rsnd_dai *rdai,
-			  struct rsnd_dai_stream *io)
-{
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-
-	/*
-	 * Cancel the initialization and operate the SRC function
-	 * see rsnd_scu_set_convert_rate()
-	 */
-	rsnd_mod_write(mod, SRC_SRCIR, 0);
-
-	if (rsnd_scu_convert_rate(scu))
-		rsnd_mod_write(mod, SRC_ROUTE_MODE0, 1);
-
-	return 0;
-}
-
-
-static int rsnd_scu_stop(struct rsnd_mod *mod,
-			 struct rsnd_dai *rdai,
-			 struct rsnd_dai_stream *io)
-{
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-
-	if (rsnd_scu_convert_rate(scu))
-		rsnd_mod_write(mod, SRC_ROUTE_MODE0, 0);
-
-	return 0;
-}
-
-static struct rsnd_mod_ops rsnd_scu_non_ops = {
-	.name	= "scu (non)",
-};
-
-/*
- *		Gen1 functions
- */
-static int rsnd_src_set_route_gen1(struct rsnd_mod *mod,
-				   struct rsnd_dai *rdai,
-				   struct rsnd_dai_stream *io)
-{
-	struct scu_route_config {
-		u32 mask;
-		int shift;
-	} routes[] = {
-		{ 0xF,  0, }, /* 0 */
-		{ 0xF,  4, }, /* 1 */
-		{ 0xF,  8, }, /* 2 */
-		{ 0x7, 12, }, /* 3 */
-		{ 0x7, 16, }, /* 4 */
-		{ 0x7, 20, }, /* 5 */
-		{ 0x7, 24, }, /* 6 */
-		{ 0x3, 28, }, /* 7 */
-		{ 0x3, 30, }, /* 8 */
-	};
-	u32 mask;
-	u32 val;
-	int id;
-
-	id = rsnd_mod_id(mod);
-	if (id < 0 || id >= ARRAY_SIZE(routes))
-		return -EIO;
-
-	/*
-	 * SRC_ROUTE_SELECT
-	 */
-	val = rsnd_dai_is_play(rdai, io) ? 0x1 : 0x2;
-	val = val		<< routes[id].shift;
-	mask = routes[id].mask	<< routes[id].shift;
-
-	rsnd_mod_bset(mod, SRC_ROUTE_SEL, mask, val);
-
-	return 0;
-}
-
-static int rsnd_scu_set_convert_timing_gen1(struct rsnd_mod *mod,
-					    struct rsnd_dai *rdai,
-					    struct rsnd_dai_stream *io)
-{
-	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
-	u32 convert_rate = rsnd_scu_convert_rate(scu);
-	u32 mask;
-	u32 val;
-	int shift;
-	int id = rsnd_mod_id(mod);
-	int ret;
-
-	/*
-	 * SRC_TIMING_SELECT
-	 */
-	shift	= (id % 4) * 8;
-	mask	= 0x1F << shift;
-
-	/*
-	 * ADG is used as source clock if SRC was used,
-	 * then, SSI WS is used as destination clock.
-	 * SSI WS is used as source clock if SRC is not used
-	 * (when playback, source/destination become reverse when capture)
-	 */
-	ret = 0;
-	if (convert_rate) {
-		/* use ADG */
-		val = 0;
-		ret = rsnd_adg_set_convert_clk_gen1(priv, mod,
-						    runtime->rate,
-						    convert_rate);
-	} else if (8 == id) {
-		/* use SSI WS, but SRU8 is special */
-		val = id << shift;
-	} else {
-		/* use SSI WS */
-		val = (id + 1) << shift;
-	}
-
-	if (ret < 0)
-		return ret;
-
-	switch (id / 4) {
-	case 0:
-		rsnd_mod_bset(mod, SRC_TMG_SEL0, mask, val);
-		break;
-	case 1:
-		rsnd_mod_bset(mod, SRC_TMG_SEL1, mask, val);
-		break;
-	case 2:
-		rsnd_mod_bset(mod, SRC_TMG_SEL2, mask, val);
-		break;
-	}
-
-	return 0;
-}
-
-static int rsnd_scu_set_convert_rate_gen1(struct rsnd_mod *mod,
-					  struct rsnd_dai *rdai,
-					  struct rsnd_dai_stream *io)
-{
-	int ret;
-
-	ret = rsnd_scu_set_convert_rate(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	/* Select SRC mode (fixed value) */
-	rsnd_mod_write(mod, SRC_SRCCR, 0x00010110);
-
-	/* Set the restriction value of the FS ratio (98%) */
-	rsnd_mod_write(mod, SRC_MNFSR,
-		       rsnd_mod_read(mod, SRC_IFSVR) / 100 * 98);
-
-	/* no SRC_BFSSR settings, since SRC_SRCCR::BUFMD is 0 */
-
-	return 0;
-}
-
-static int rsnd_scu_init_gen1(struct rsnd_mod *mod,
-			      struct rsnd_dai *rdai,
-			      struct rsnd_dai_stream *io)
-{
-	int ret;
-
-	ret = rsnd_scu_init(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	ret = rsnd_src_set_route_gen1(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	ret = rsnd_scu_set_convert_rate_gen1(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	ret = rsnd_scu_set_convert_timing_gen1(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	return 0;
-}
-
-static int rsnd_scu_start_gen1(struct rsnd_mod *mod,
-			       struct rsnd_dai *rdai,
-			       struct rsnd_dai_stream *io)
-{
-	int id = rsnd_mod_id(mod);
-
-	rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), (1 << id));
-
-	return rsnd_scu_start(mod, rdai, io);
-}
-
-static int rsnd_scu_stop_gen1(struct rsnd_mod *mod,
-			      struct rsnd_dai *rdai,
-			      struct rsnd_dai_stream *io)
-{
-	int id = rsnd_mod_id(mod);
-
-	rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), 0);
-
-	return rsnd_scu_stop(mod, rdai, io);
-}
-
-static struct rsnd_mod_ops rsnd_scu_gen1_ops = {
-	.name	= "sru (gen1)",
-	.init	= rsnd_scu_init_gen1,
-	.quit	= rsnd_scu_quit,
-	.start	= rsnd_scu_start_gen1,
-	.stop	= rsnd_scu_stop_gen1,
-};
-
-/*
- *		Gen2 functions
- */
-static int rsnd_scu_set_convert_rate_gen2(struct rsnd_mod *mod,
-					  struct rsnd_dai *rdai,
-					  struct rsnd_dai_stream *io)
-{
-	int ret;
-
-	ret = rsnd_scu_set_convert_rate(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	rsnd_mod_write(mod, SSI_BUSIF_ADINR, rsnd_mod_read(mod, SRC_ADINR));
-	rsnd_mod_write(mod, SSI_BUSIF_MODE,  rsnd_mod_read(mod, SRC_BUSIF_MODE));
-
-	rsnd_mod_write(mod, SRC_SRCCR, 0x00011110);
-
-	rsnd_mod_write(mod, SRC_BSDSR, 0x01800000);
-	rsnd_mod_write(mod, SRC_BSISR, 0x00100060);
-
-	return 0;
-}
-
-static int rsnd_scu_set_convert_timing_gen2(struct rsnd_mod *mod,
-					    struct rsnd_dai *rdai,
-					    struct rsnd_dai_stream *io)
-{
-	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	u32 convert_rate = rsnd_scu_convert_rate(scu);
-	int ret;
-
-	if (convert_rate)
-		ret = rsnd_adg_set_convert_clk_gen2(mod, rdai, io,
-						    runtime->rate,
-						    convert_rate);
-	else
-		ret = rsnd_adg_set_convert_timing_gen2(mod, rdai, io);
-
-	return ret;
-}
-
-static int rsnd_scu_probe_gen2(struct rsnd_mod *mod,
-			       struct rsnd_dai *rdai,
-			       struct rsnd_dai_stream *io)
-{
-	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
-	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-	struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, rsnd_mod_id(mod));
-	struct device *dev = rsnd_priv_to_dev(priv);
-	int ret;
-	int is_play;
-
-	if (info->dai_info)
-		is_play = rsnd_info_is_playback(priv, scu);
-	else
-		is_play = rsnd_ssi_is_play(ssi);
-
-	ret = rsnd_dma_init(priv,
-			    rsnd_mod_to_dma(mod),
-			    is_play,
-			    scu->info->dma_id);
-	if (ret < 0)
-		dev_err(dev, "SCU DMA failed\n");
-
-	return ret;
-}
-
-static int rsnd_scu_remove_gen2(struct rsnd_mod *mod,
-				struct rsnd_dai *rdai,
-				struct rsnd_dai_stream *io)
-{
-	rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));
-
-	return 0;
-}
-
-static int rsnd_scu_init_gen2(struct rsnd_mod *mod,
-			      struct rsnd_dai *rdai,
-			      struct rsnd_dai_stream *io)
-{
-	int ret;
-
-	ret = rsnd_scu_init(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	ret = rsnd_scu_set_convert_rate_gen2(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	ret = rsnd_scu_set_convert_timing_gen2(mod, rdai, io);
-	if (ret < 0)
-		return ret;
-
-	return 0;
-}
-
-static int rsnd_scu_start_gen2(struct rsnd_mod *mod,
-			       struct rsnd_dai *rdai,
-			       struct rsnd_dai_stream *io)
-{
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-
-	rsnd_dma_start(rsnd_mod_to_dma(&scu->mod));
-
-	rsnd_mod_write(mod, SSI_CTRL, 0x1);
-	rsnd_mod_write(mod, SRC_CTRL, 0x11);
-
-	return rsnd_scu_start(mod, rdai, io);
-}
-
-static int rsnd_scu_stop_gen2(struct rsnd_mod *mod,
-			      struct rsnd_dai *rdai,
-			      struct rsnd_dai_stream *io)
-{
-	struct rsnd_scu *scu = rsnd_mod_to_scu(mod);
-
-	rsnd_mod_write(mod, SSI_CTRL, 0);
-	rsnd_mod_write(mod, SRC_CTRL, 0);
-
-	rsnd_dma_stop(rsnd_mod_to_dma(&scu->mod));
-
-	return rsnd_scu_stop(mod, rdai, io);
-}
-
-static struct rsnd_mod_ops rsnd_scu_gen2_ops = {
-	.name	= "scu (gen2)",
-	.probe	= rsnd_scu_probe_gen2,
-	.remove	= rsnd_scu_remove_gen2,
-	.init	= rsnd_scu_init_gen2,
-	.quit	= rsnd_scu_quit,
-	.start	= rsnd_scu_start_gen2,
-	.stop	= rsnd_scu_stop_gen2,
-};
-
-struct rsnd_mod *rsnd_scu_mod_get(struct rsnd_priv *priv, int id)
-{
-	if (WARN_ON(id < 0 || id >= rsnd_scu_nr(priv)))
-		id = 0;
-
-	return &((struct rsnd_scu *)(priv->scu) + id)->mod;
-}
-
-int rsnd_scu_probe(struct platform_device *pdev,
-		   struct rsnd_priv *priv)
-{
-	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
-	struct device *dev = rsnd_priv_to_dev(priv);
-	struct rsnd_scu *scu;
-	struct rsnd_mod_ops *ops;
-	struct clk *clk;
-	char name[RSND_SCU_NAME_SIZE];
-	int i, nr;
-
-	/*
-	 * init SCU
-	 */
-	nr	= info->scu_info_nr;
-	if (!nr)
-		return 0;
-
-	scu	= devm_kzalloc(dev, sizeof(*scu) * nr, GFP_KERNEL);
-	if (!scu) {
-		dev_err(dev, "SCU allocate failed\n");
-		return -ENOMEM;
-	}
-
-	priv->scu_nr	= nr;
-	priv->scu	= scu;
-
-	for_each_rsnd_scu(scu, priv, i) {
-		snprintf(name, RSND_SCU_NAME_SIZE, "scu.%d", i);
-
-		clk = devm_clk_get(dev, name);
-		if (IS_ERR(clk))
-			return PTR_ERR(clk);
-
-		scu->info = &info->scu_info[i];
-		scu->clk = clk;
-
-		ops = &rsnd_scu_non_ops;
-		if (rsnd_scu_hpbif_is_enable(scu)) {
-			if (rsnd_is_gen1(priv))
-				ops = &rsnd_scu_gen1_ops;
-			if (rsnd_is_gen2(priv))
-				ops = &rsnd_scu_gen2_ops;
-		}
-
-		rsnd_mod_init(priv, &scu->mod, ops, RSND_MOD_SCU, i);
-
-		dev_dbg(dev, "SCU%d probed\n", i);
-	}
-
-	return 0;
-}
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
new file mode 100644
index 0000000..ea6a214
--- /dev/null
+++ b/sound/soc/sh/rcar/src.c
@@ -0,0 +1,687 @@
+/*
+ * Renesas R-Car SRC support
+ *
+ * Copyright (C) 2013 Renesas Solutions Corp.
+ * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+#include "rsnd.h"
+
+struct rsnd_src {
+	struct rsnd_src_platform_info *info; /* rcar_snd.h */
+	struct rsnd_mod mod;
+	struct clk *clk;
+};
+
+#define RSND_SRC_NAME_SIZE 16
+
+/*
+ * ADINR
+ */
+#define OTBL_24		(0 << 16)
+#define OTBL_22		(2 << 16)
+#define OTBL_20		(4 << 16)
+#define OTBL_18		(6 << 16)
+#define OTBL_16		(8 << 16)
+
+#define rsnd_src_mode_flags(p) ((p)->info->flags)
+#define rsnd_src_convert_rate(p) ((p)->info->convert_rate)
+#define rsnd_mod_to_src(_mod)				\
+	container_of((_mod), struct rsnd_src, mod)
+#define rsnd_src_hpbif_is_enable(src)	\
+	(rsnd_src_mode_flags(src) & RSND_SCU_USE_HPBIF)
+#define rsnd_src_dma_available(src) \
+	rsnd_dma_available(rsnd_mod_to_dma(&(src)->mod))
+
+#define for_each_rsnd_src(pos, priv, i)				\
+	for ((i) = 0;						\
+	     ((i) < rsnd_src_nr(priv)) &&			\
+	     ((pos) = (struct rsnd_src *)(priv)->src + i);	\
+	     i++)
+
+
+/*
+ *		image of SRC (Sampling Rate Converter)
+ *
+ * 96kHz   <-> +-----+	48kHz	+-----+	 48kHz	+-------+
+ * 48kHz   <-> | SRC | <------>	| SSI |	<----->	| codec |
+ * 44.1kHz <-> +-----+		+-----+		+-------+
+ * ...
+ *
+ */
+
+/*
+ * src.c is caring...
+ *
+ * Gen1
+ *
+ * [mem] -> [SRU] -> [SSI]
+ *        |--------|
+ *
+ * Gen2
+ *
+ * [mem] -> [SRC] -> [SSIU] -> [SSI]
+ *        |-----------------|
+ */
+
+/*
+ *	How to use SRC bypass mode for debugging
+ *
+ * SRC has bypass mode, and it is useful for debugging.
+ * In Gen2 case,
+ * SRCm_MODE controls whether SRC is used or not
+ * SSI_MODE0 controls whether SSIU which receives SRC data
+ * is used or not.
+ * Both SRCm_MODE/SSI_MODE0 settings are needed if you use SRC,
+ * but SRC bypass mode needs SSI_MODE0 only.
+ *
+ * This driver request
+ * struct rsnd_src_platform_info {
+ *	u32 flags;
+ *	u32 convert_rate;
+ * }
+ *
+ * rsnd_src_hpbif_is_enable() will be true
+ * if flags had RSND_SRC_USE_HPBIF,
+ * and it controls whether SSIU is used or not.
+ *
+ * rsnd_src_convert_rate() indicates
+ * above convert_rate, and it controls
+ * whether SRC is used or not.
+ *
+ * ex) doesn't use SRC
+ * struct rsnd_src_platform_info info = {
+ *	.flags = 0,
+ *	.convert_rate = 0,
+ * };
+ *
+ * ex) uses SRC
+ * struct rsnd_src_platform_info info = {
+ *	.flags = RSND_SRC_USE_HPBIF,
+ *	.convert_rate = 48000,
+ * };
+ *
+ * ex) uses SRC bypass mode
+ * struct rsnd_src_platform_info info = {
+ *	.flags = RSND_SRC_USE_HPBIF,
+ *	.convert_rate = 0,
+ * };
+ *
+ */
+
+/*
+ *		Gen1/Gen2 common functions
+ */
+int rsnd_src_ssi_mode_init(struct rsnd_mod *ssi_mod,
+			   struct rsnd_dai *rdai,
+			   struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
+	struct rsnd_mod *src_mod = rsnd_io_to_mod_src(io);
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	int ssi_id = rsnd_mod_id(ssi_mod);
+	int has_src = 0;
+
+	/*
+	 * SSI_MODE0
+	 */
+	if (info->dai_info) {
+		has_src = !!src_mod;
+	} else {
+		struct rsnd_src *src = rsnd_mod_to_src(src_mod);
+		has_src = rsnd_src_hpbif_is_enable(src);
+	}
+
+	rsnd_mod_bset(ssi_mod, SSI_MODE0, (1 << ssi_id),
+		      has_src ? 0 : (1 << ssi_id));
+
+	/*
+	 * SSI_MODE1
+	 */
+	if (rsnd_ssi_is_pin_sharing(ssi_mod)) {
+		int shift = -1;
+		switch (ssi_id) {
+		case 1:
+			shift = 0;
+			break;
+		case 2:
+			shift = 2;
+			break;
+		case 4:
+			shift = 16;
+			break;
+		}
+
+		if (shift >= 0)
+			rsnd_mod_bset(ssi_mod, SSI_MODE1,
+				      0x3 << shift,
+				      rsnd_dai_is_clk_master(rdai) ?
+				      0x2 << shift : 0x1 << shift);
+	}
+
+	return 0;
+}
+
+int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod,
+			    struct rsnd_dai *rdai,
+			    struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
+
+	/* enable PIO interrupt if Gen2 */
+	if (rsnd_is_gen2(priv))
+		rsnd_mod_write(ssi_mod, INT_ENABLE, 0x0f000000);
+
+	return 0;
+}
+
+unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
+				   struct rsnd_dai_stream *io,
+				   struct snd_pcm_runtime *runtime)
+{
+	struct rsnd_src *src;
+	unsigned int rate;
+
+	src = rsnd_mod_to_src(rsnd_io_to_mod_src(io));
+
+	/*
+	 * return convert rate if SRC is used,
+	 * otherwise, return runtime->rate as usual
+	 */
+	rate = rsnd_src_convert_rate(src);
+	if (!rate)
+		rate = runtime->rate;
+
+	return rate;
+}
+
+static int rsnd_src_set_convert_rate(struct rsnd_mod *mod,
+				     struct rsnd_dai *rdai,
+				     struct rsnd_dai_stream *io)
+{
+	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+	u32 convert_rate = rsnd_src_convert_rate(src);
+	u32 adinr = runtime->channels;
+	u32 fsrate = 0;
+
+	if (convert_rate)
+		fsrate = 0x0400000 / convert_rate * runtime->rate;
+
+	/* set/clear soft reset */
+	rsnd_mod_write(mod, SRC_SWRSR, 0);
+	rsnd_mod_write(mod, SRC_SWRSR, 1);
+
+	/*
+	 * Initialize the operation of the SRC internal circuits
+	 * see rsnd_src_start()
+	 */
+	rsnd_mod_write(mod, SRC_SRCIR, 1);
+
+	/* Set channel number and output bit length */
+	switch (runtime->sample_bits) {
+	case 16:
+		adinr |= OTBL_16;
+		break;
+	case 32:
+		adinr |= OTBL_24;
+		break;
+	default:
+		return -EIO;
+	}
+	rsnd_mod_write(mod, SRC_ADINR, adinr);
+
+	/* Enable the initial value of IFS */
+	if (fsrate) {
+		rsnd_mod_write(mod, SRC_IFSCR, 1);
+
+		/* Set initial value of IFS */
+		rsnd_mod_write(mod, SRC_IFSVR, fsrate);
+	}
+
+	/* use DMA transfer */
+	rsnd_mod_write(mod, SRC_BUSIF_MODE, 1);
+
+	return 0;
+}
+
+static int rsnd_src_init(struct rsnd_mod *mod,
+			 struct rsnd_dai *rdai,
+			 struct rsnd_dai_stream *io)
+{
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+
+	clk_enable(src->clk);
+
+	return 0;
+}
+
+static int rsnd_src_quit(struct rsnd_mod *mod,
+			 struct rsnd_dai *rdai,
+			 struct rsnd_dai_stream *io)
+{
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+
+	clk_disable(src->clk);
+
+	return 0;
+}
+
+static int rsnd_src_start(struct rsnd_mod *mod,
+			  struct rsnd_dai *rdai,
+			  struct rsnd_dai_stream *io)
+{
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+
+	/*
+	 * Cancel the initialization and operate the SRC function
+	 * see rsnd_src_set_convert_rate()
+	 */
+	rsnd_mod_write(mod, SRC_SRCIR, 0);
+
+	if (rsnd_src_convert_rate(src))
+		rsnd_mod_write(mod, SRC_ROUTE_MODE0, 1);
+
+	return 0;
+}
+
+
+static int rsnd_src_stop(struct rsnd_mod *mod,
+			 struct rsnd_dai *rdai,
+			 struct rsnd_dai_stream *io)
+{
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+
+	if (rsnd_src_convert_rate(src))
+		rsnd_mod_write(mod, SRC_ROUTE_MODE0, 0);
+
+	return 0;
+}
+
+static struct rsnd_mod_ops rsnd_src_non_ops = {
+	.name	= "src (non)",
+};
+
+/*
+ *		Gen1 functions
+ */
+static int rsnd_src_set_route_gen1(struct rsnd_mod *mod,
+				   struct rsnd_dai *rdai,
+				   struct rsnd_dai_stream *io)
+{
+	struct src_route_config {
+		u32 mask;
+		int shift;
+	} routes[] = {
+		{ 0xF,  0, }, /* 0 */
+		{ 0xF,  4, }, /* 1 */
+		{ 0xF,  8, }, /* 2 */
+		{ 0x7, 12, }, /* 3 */
+		{ 0x7, 16, }, /* 4 */
+		{ 0x7, 20, }, /* 5 */
+		{ 0x7, 24, }, /* 6 */
+		{ 0x3, 28, }, /* 7 */
+		{ 0x3, 30, }, /* 8 */
+	};
+	u32 mask;
+	u32 val;
+	int id;
+
+	id = rsnd_mod_id(mod);
+	if (id < 0 || id >= ARRAY_SIZE(routes))
+		return -EIO;
+
+	/*
+	 * SRC_ROUTE_SELECT
+	 */
+	val = rsnd_dai_is_play(rdai, io) ? 0x1 : 0x2;
+	val = val		<< routes[id].shift;
+	mask = routes[id].mask	<< routes[id].shift;
+
+	rsnd_mod_bset(mod, SRC_ROUTE_SEL, mask, val);
+
+	return 0;
+}
+
+static int rsnd_src_set_convert_timing_gen1(struct rsnd_mod *mod,
+					    struct rsnd_dai *rdai,
+					    struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+	u32 convert_rate = rsnd_src_convert_rate(src);
+	u32 mask;
+	u32 val;
+	int shift;
+	int id = rsnd_mod_id(mod);
+	int ret;
+
+	/*
+	 * SRC_TIMING_SELECT
+	 */
+	shift	= (id % 4) * 8;
+	mask	= 0x1F << shift;
+
+	/*
+	 * ADG is used as source clock if SRC was used,
+	 * then, SSI WS is used as destination clock.
+	 * SSI WS is used as source clock if SRC is not used
+	 * (when playback, source/destination become reverse when capture)
+	 */
+	ret = 0;
+	if (convert_rate) {
+		/* use ADG */
+		val = 0;
+		ret = rsnd_adg_set_convert_clk_gen1(priv, mod,
+						    runtime->rate,
+						    convert_rate);
+	} else if (8 == id) {
+		/* use SSI WS, but SRU8 is special */
+		val = id << shift;
+	} else {
+		/* use SSI WS */
+		val = (id + 1) << shift;
+	}
+
+	if (ret < 0)
+		return ret;
+
+	switch (id / 4) {
+	case 0:
+		rsnd_mod_bset(mod, SRC_TMG_SEL0, mask, val);
+		break;
+	case 1:
+		rsnd_mod_bset(mod, SRC_TMG_SEL1, mask, val);
+		break;
+	case 2:
+		rsnd_mod_bset(mod, SRC_TMG_SEL2, mask, val);
+		break;
+	}
+
+	return 0;
+}
+
+static int rsnd_src_set_convert_rate_gen1(struct rsnd_mod *mod,
+					  struct rsnd_dai *rdai,
+					  struct rsnd_dai_stream *io)
+{
+	int ret;
+
+	ret = rsnd_src_set_convert_rate(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	/* Select SRC mode (fixed value) */
+	rsnd_mod_write(mod, SRC_SRCCR, 0x00010110);
+
+	/* Set the restriction value of the FS ratio (98%) */
+	rsnd_mod_write(mod, SRC_MNFSR,
+		       rsnd_mod_read(mod, SRC_IFSVR) / 100 * 98);
+
+	/* no SRC_BFSSR settings, since SRC_SRCCR::BUFMD is 0 */
+
+	return 0;
+}
+
+static int rsnd_src_init_gen1(struct rsnd_mod *mod,
+			      struct rsnd_dai *rdai,
+			      struct rsnd_dai_stream *io)
+{
+	int ret;
+
+	ret = rsnd_src_init(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	ret = rsnd_src_set_route_gen1(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	ret = rsnd_src_set_convert_rate_gen1(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	ret = rsnd_src_set_convert_timing_gen1(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+static int rsnd_src_start_gen1(struct rsnd_mod *mod,
+			       struct rsnd_dai *rdai,
+			       struct rsnd_dai_stream *io)
+{
+	int id = rsnd_mod_id(mod);
+
+	rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), (1 << id));
+
+	return rsnd_src_start(mod, rdai, io);
+}
+
+static int rsnd_src_stop_gen1(struct rsnd_mod *mod,
+			      struct rsnd_dai *rdai,
+			      struct rsnd_dai_stream *io)
+{
+	int id = rsnd_mod_id(mod);
+
+	rsnd_mod_bset(mod, SRC_ROUTE_CTRL, (1 << id), 0);
+
+	return rsnd_src_stop(mod, rdai, io);
+}
+
+static struct rsnd_mod_ops rsnd_src_gen1_ops = {
+	.name	= "sru (gen1)",
+	.init	= rsnd_src_init_gen1,
+	.quit	= rsnd_src_quit,
+	.start	= rsnd_src_start_gen1,
+	.stop	= rsnd_src_stop_gen1,
+};
+
+/*
+ *		Gen2 functions
+ */
+static int rsnd_src_set_convert_rate_gen2(struct rsnd_mod *mod,
+					  struct rsnd_dai *rdai,
+					  struct rsnd_dai_stream *io)
+{
+	int ret;
+
+	ret = rsnd_src_set_convert_rate(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	rsnd_mod_write(mod, SSI_BUSIF_ADINR, rsnd_mod_read(mod, SRC_ADINR));
+	rsnd_mod_write(mod, SSI_BUSIF_MODE,  rsnd_mod_read(mod, SRC_BUSIF_MODE));
+
+	rsnd_mod_write(mod, SRC_SRCCR, 0x00011110);
+
+	rsnd_mod_write(mod, SRC_BSDSR, 0x01800000);
+	rsnd_mod_write(mod, SRC_BSISR, 0x00100060);
+
+	return 0;
+}
+
+static int rsnd_src_set_convert_timing_gen2(struct rsnd_mod *mod,
+					    struct rsnd_dai *rdai,
+					    struct rsnd_dai_stream *io)
+{
+	struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+	u32 convert_rate = rsnd_src_convert_rate(src);
+	int ret;
+
+	if (convert_rate)
+		ret = rsnd_adg_set_convert_clk_gen2(mod, rdai, io,
+						    runtime->rate,
+						    convert_rate);
+	else
+		ret = rsnd_adg_set_convert_timing_gen2(mod, rdai, io);
+
+	return ret;
+}
+
+static int rsnd_src_probe_gen2(struct rsnd_mod *mod,
+			       struct rsnd_dai *rdai,
+			       struct rsnd_dai_stream *io)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+	struct rsnd_mod *ssi = rsnd_ssi_mod_get(priv, rsnd_mod_id(mod));
+	struct device *dev = rsnd_priv_to_dev(priv);
+	int ret;
+	int is_play;
+
+	if (info->dai_info)
+		is_play = rsnd_info_is_playback(priv, src);
+	else
+		is_play = rsnd_ssi_is_play(ssi);
+
+	ret = rsnd_dma_init(priv,
+			    rsnd_mod_to_dma(mod),
+			    is_play,
+			    src->info->dma_id);
+	if (ret < 0)
+		dev_err(dev, "SRC DMA failed\n");
+
+	return ret;
+}
+
+static int rsnd_src_remove_gen2(struct rsnd_mod *mod,
+				struct rsnd_dai *rdai,
+				struct rsnd_dai_stream *io)
+{
+	rsnd_dma_quit(rsnd_mod_to_priv(mod), rsnd_mod_to_dma(mod));
+
+	return 0;
+}
+
+static int rsnd_src_init_gen2(struct rsnd_mod *mod,
+			      struct rsnd_dai *rdai,
+			      struct rsnd_dai_stream *io)
+{
+	int ret;
+
+	ret = rsnd_src_init(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	ret = rsnd_src_set_convert_rate_gen2(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	ret = rsnd_src_set_convert_timing_gen2(mod, rdai, io);
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+static int rsnd_src_start_gen2(struct rsnd_mod *mod,
+			       struct rsnd_dai *rdai,
+			       struct rsnd_dai_stream *io)
+{
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+
+	rsnd_dma_start(rsnd_mod_to_dma(&src->mod));
+
+	rsnd_mod_write(mod, SSI_CTRL, 0x1);
+	rsnd_mod_write(mod, SRC_CTRL, 0x11);
+
+	return rsnd_src_start(mod, rdai, io);
+}
+
+static int rsnd_src_stop_gen2(struct rsnd_mod *mod,
+			      struct rsnd_dai *rdai,
+			      struct rsnd_dai_stream *io)
+{
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+
+	rsnd_mod_write(mod, SSI_CTRL, 0);
+	rsnd_mod_write(mod, SRC_CTRL, 0);
+
+	rsnd_dma_stop(rsnd_mod_to_dma(&src->mod));
+
+	return rsnd_src_stop(mod, rdai, io);
+}
+
+static struct rsnd_mod_ops rsnd_src_gen2_ops = {
+	.name	= "src (gen2)",
+	.probe	= rsnd_src_probe_gen2,
+	.remove	= rsnd_src_remove_gen2,
+	.init	= rsnd_src_init_gen2,
+	.quit	= rsnd_src_quit,
+	.start	= rsnd_src_start_gen2,
+	.stop	= rsnd_src_stop_gen2,
+};
+
+struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
+{
+	if (WARN_ON(id < 0 || id >= rsnd_src_nr(priv)))
+		id = 0;
+
+	return &((struct rsnd_src *)(priv->src) + id)->mod;
+}
+
+int rsnd_src_probe(struct platform_device *pdev,
+		   struct rsnd_priv *priv)
+{
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = rsnd_priv_to_dev(priv);
+	struct rsnd_src *src;
+	struct rsnd_mod_ops *ops;
+	struct clk *clk;
+	char name[RSND_SRC_NAME_SIZE];
+	int i, nr;
+
+	/*
+	 * init SRC
+	 */
+	nr	= info->src_info_nr;
+	if (!nr)
+		return 0;
+
+	src	= devm_kzalloc(dev, sizeof(*src) * nr, GFP_KERNEL);
+	if (!src) {
+		dev_err(dev, "SRC allocate failed\n");
+		return -ENOMEM;
+	}
+
+	priv->src_nr	= nr;
+	priv->src	= src;
+
+	for_each_rsnd_src(src, priv, i) {
+		snprintf(name, RSND_SRC_NAME_SIZE, "src.%d", i);
+
+		clk = devm_clk_get(dev, name);
+		if (IS_ERR(clk)) {
+			snprintf(name, RSND_SRC_NAME_SIZE, "scu.%d", i);
+			clk = devm_clk_get(dev, name);
+		}
+
+		if (IS_ERR(clk))
+			return PTR_ERR(clk);
+
+		src->info = &info->src_info[i];
+		src->clk = clk;
+
+		ops = &rsnd_src_non_ops;
+		if (rsnd_src_hpbif_is_enable(src)) {
+			if (rsnd_is_gen1(priv))
+				ops = &rsnd_src_gen1_ops;
+			if (rsnd_is_gen2(priv))
+				ops = &rsnd_src_gen2_ops;
+		}
+
+		rsnd_mod_init(priv, &src->mod, ops, RSND_MOD_SRC, i);
+
+		dev_dbg(dev, "SRC%d probed\n", i);
+	}
+
+	return 0;
+}
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 45f828d..633b23d 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -121,7 +121,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_ssi *ssi,
 		1, 2, 4, 8, 16, 6, 12,
 	};
 	unsigned int main_rate;
-	unsigned int rate = rsnd_scu_get_ssi_rate(priv, io, runtime);
+	unsigned int rate = rsnd_src_get_ssi_rate(priv, io, runtime);
 
 	/*
 	 * Find best clock, and try to start ADG
@@ -287,7 +287,7 @@ static int rsnd_ssi_init(struct rsnd_mod *mod,
 	ssi->cr_own	= cr;
 	ssi->err	= -1; /* ignore 1st error */
 
-	rsnd_scu_ssi_mode_init(mod, rdai, io);
+	rsnd_src_ssi_mode_init(mod, rdai, io);
 
 	return 0;
 }
@@ -387,7 +387,7 @@ static int rsnd_ssi_pio_start(struct rsnd_mod *mod,
 	/* enable PIO IRQ */
 	ssi->cr_etc = UIEN | OIEN | DIEN;
 
-	rsnd_scu_enable_ssi_irq(mod, rdai, io);
+	rsnd_src_enable_ssi_irq(mod, rdai, io);
 
 	rsnd_ssi_hw_start(ssi, rdai, io);
 
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [PATCH 11/11] ASoC: rsnd: add DeviceTree support
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                     ` (9 preceding siblings ...)
  2014-03-04  4:51   ` [PATCH 10/11] ASoC: rsnd: rename scu to src Kuninori Morimoto
@ 2014-03-04  4:51   ` Kuninori Morimoto
  2014-03-05  6:39     ` Forward: " Kuninori Morimoto
  10 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-04  4:51 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto

From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>

Support for loading the Renesas R-Car sound driver via DeviceTree.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
 .../devicetree/bindings/sound/renesas,rsnd.txt     |  101 ++++++++++++++++
 sound/soc/sh/rcar/adg.c                            |    1 +
 sound/soc/sh/rcar/core.c                           |  122 +++++++++++++++++++-
 sound/soc/sh/rcar/gen.c                            |   15 +++
 sound/soc/sh/rcar/rsnd.h                           |   11 ++
 sound/soc/sh/rcar/src.c                            |   36 ++++++
 sound/soc/sh/rcar/ssi.c                            |   56 +++++++++
 7 files changed, 339 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/sound/renesas,rsnd.txt

diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
new file mode 100644
index 0000000..1b64225
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
@@ -0,0 +1,101 @@
+Renesas R-Car sound
+
+Required properties:
+- compatible			: "renesas,rcar_sound-gen1" if generation1
+				  "renesas,rcar_sound-gen2" if generation2
+- reg				: Should contain the register physical address.
+				  required register is
+				   SRU/ADG/SSI      if generation1
+				   SRU/ADG/SSIU/SSI if generation2
+- rcar_sound,ssi		: SSI subnode
+- rcar_sound,scu		: SCU subnode
+- rcar_sound,dai		: DAI subnode
+
+SSI subnode properties:
+- interrupt-parent		: Should contain SSI interrup parent
+- interrupts			: Should contain SSI interrupt for PIO transfer
+- shared-pin			: if shared clock pin
+
+DAI subnode properties:
+- playback			: list of playback modules
+- capture			: list of capture  modules
+
+Example:
+
+rcar_sound: rcar_sound@0xffd90000 {
+	#sound-dai-cells = <1>;
+	compatible = "renesas,rcar_sound";
+	reg =	<0xffd90000 0x1000>, /* SRU */
+		<0xfffe0000 0x24>,   /* ADG */
+		<0xffd91000 0x1240>; /* SSI */
+
+	rcar_sound,src {
+		src0: src@0 { };
+		src1: src@1 { };
+		src2: src@2 { };
+		src3: src@3 { };
+		src4: src@4 { };
+		src5: src@5 { };
+		src6: src@6 { };
+		src7: src@7 { };
+		src8: src@8 { };
+	};
+
+	rcar_sound,ssi {
+		ssi0: ssi@0 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi1: ssi@1 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi2: ssi@2 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi3: ssi@3 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi4: ssi@4 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi5: ssi@5 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi6: ssi@6 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi7: ssi@7 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi8: ssi@8 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+	};
+
+	rcar_sound,dai {
+		dai0 {
+			playback = <&ssi5 &src5>;
+			capture  = <&ssi6>;
+		};
+		dai1 {
+			playback = <&ssi3>;
+		};
+		dai2 {
+			capture  = <&ssi4>;
+		};
+		dai3 {
+			playback = <&ssi7>;
+		};
+		dai4 {
+			capture  = <&ssi8>;
+		};
+	};
+};
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 953f1cc..69c4426 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)
 }
 
 int rsnd_adg_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rsnd_adg *adg;
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 6a1b45df..e77f771 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -100,6 +100,21 @@
 #define RSND_RATES SNDRV_PCM_RATE_8000_96000
 #define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
 
+static struct rsnd_of_data rsnd_of_data_gen1 = {
+	.flags = RSND_GEN1,
+};
+
+static struct rsnd_of_data rsnd_of_data_gen2 = {
+	.flags = RSND_GEN2,
+};
+
+static struct of_device_id rsnd_of_match[] = {
+	{ .compatible = "renesas,rcar_sound-gen1", .data = &rsnd_of_data_gen1 },
+	{ .compatible = "renesas,rcar_sound-gen2", .data = &rsnd_of_data_gen2 },
+	{},
+};
+MODULE_DEVICE_TABLE(of, rsnd_of_match);
+
 /*
  *	rsnd_platform functions
  */
@@ -620,7 +635,92 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	return ret;
 }
 
+static void rsnd_of_parse_dai(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *dai_node,	*dai_np;
+	struct device_node *ssi_node,	*ssi_np;
+	struct device_node *src_node,	*src_np;
+	struct device_node *playback, *capture;
+	struct rsnd_dai_platform_info *dai_info;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = &pdev->dev;
+	int nr, i;
+	int dai_i, ssi_i, src_i;
+
+	if (!of_data)
+		return;
+
+	dai_node = of_get_child_by_name(dev->of_node, "rcar_sound,dai");
+	if (!dai_node)
+		return;
+
+	nr = of_get_child_count(dai_node);
+	if (!nr)
+		return;
+
+	dai_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_dai_platform_info) * nr,
+				GFP_KERNEL);
+	if (!dai_info) {
+		dev_err(dev, "dai info allocation error\n");
+		return;
+	}
+
+	info->dai_info_nr	= nr;
+	info->dai_info		= dai_info;
+
+	ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
+	src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
+
+#define mod_parse(name)							\
+if (name##_node) {							\
+	struct rsnd_##name##_platform_info *name##_info;		\
+									\
+	name##_i = 0;							\
+	for_each_child_of_node(name##_node, name##_np) {		\
+		name##_info = info->name##_info + name##_i;		\
+									\
+		if (name##_np == playback)				\
+			dai_info->playback.name = name##_info;		\
+		if (name##_np == capture)				\
+			dai_info->capture.name = name##_info;		\
+									\
+		name##_i++;						\
+	}								\
+}
+
+	/*
+	 * parse all dai
+	 */
+	dai_i = 0;
+	for_each_child_of_node(dai_node, dai_np) {
+		dai_info = info->dai_info + dai_i;
+
+		for (i = 0;; i++) {
+
+			playback = of_parse_phandle(dai_np, "playback", i);
+			capture  = of_parse_phandle(dai_np, "capture", i);
+
+			if (!playback && !capture)
+				break;
+
+			mod_parse(ssi);
+			mod_parse(src);
+
+			if (playback)
+				of_node_put(playback);
+			if (capture)
+				of_node_put(capture);
+		}
+
+		dai_i++;
+	}
+}
+
 static int rsnd_dai_probe(struct platform_device *pdev,
+			  const struct rsnd_of_data *of_data,
 			  struct rsnd_priv *priv)
 {
 	struct snd_soc_dai_driver *drv;
@@ -628,13 +728,16 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 	struct rsnd_dai *rdai;
 	struct rsnd_mod *pmod, *cmod;
 	struct device *dev = rsnd_priv_to_dev(priv);
-	int dai_nr = info->dai_info_nr;
+	int dai_nr;
 	int i;
 
+	rsnd_of_parse_dai(pdev, of_data, priv);
+
 	/*
 	 * dai_nr should be set via dai_info_nr,
 	 * but allow it to keeping compatible
 	 */
+	dai_nr = info->dai_info_nr;
 	if (!dai_nr) {
 		/* get max dai nr */
 		for (dai_nr = 0; dai_nr < 32; dai_nr++) {
@@ -802,7 +905,10 @@ static int rsnd_probe(struct platform_device *pdev)
 	struct rsnd_priv *priv;
 	struct device *dev = &pdev->dev;
 	struct rsnd_dai *rdai;
+	const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev);
+	const struct rsnd_of_data *of_data;
 	int (*probe_func[])(struct platform_device *pdev,
+			    const struct rsnd_of_data *of_data,
 			    struct rsnd_priv *priv) = {
 		rsnd_gen_probe,
 		rsnd_ssi_probe,
@@ -812,7 +918,16 @@ static int rsnd_probe(struct platform_device *pdev)
 	};
 	int ret, i;
 
-	info = pdev->dev.platform_data;
+	info = NULL;
+	of_data = NULL;
+	if (of_id) {
+		info = devm_kzalloc(&pdev->dev,
+				    sizeof(struct rcar_snd_info), GFP_KERNEL);
+		of_data = of_id->data;
+	} else {
+		info = pdev->dev.platform_data;
+	}
+
 	if (!info) {
 		dev_err(dev, "driver needs R-Car sound information\n");
 		return -ENODEV;
@@ -835,7 +950,7 @@ static int rsnd_probe(struct platform_device *pdev)
 	 *	init each module
 	 */
 	for (i = 0; i < ARRAY_SIZE(probe_func); i++) {
-		ret = probe_func[i](pdev, priv);
+		ret = probe_func[i](pdev, of_data, priv);
 		if (ret)
 			return ret;
 	}
@@ -903,6 +1018,7 @@ static int rsnd_remove(struct platform_device *pdev)
 static struct platform_driver rsnd_driver = {
 	.driver	= {
 		.name	= "rcar_sound",
+		.of_match_table = rsnd_of_match,
 	},
 	.probe		= rsnd_probe,
 	.remove		= rsnd_remove,
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 9094970..50a1ef3 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -359,13 +359,28 @@ static int rsnd_gen1_probe(struct platform_device *pdev,
 /*
  *		Gen
  */
+static void rsnd_of_parse_gen(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct rcar_snd_info *info = priv->info;
+
+	if (!of_data)
+		return;
+
+	info->flags = of_data->flags;
+}
+
 int rsnd_gen_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct device *dev = rsnd_priv_to_dev(priv);
 	struct rsnd_gen *gen;
 	int ret;
 
+	rsnd_of_parse_gen(pdev, of_data, priv);
+
 	gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL);
 	if (!gen) {
 		dev_err(dev, "GEN allocate failed\n");
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index c46e0af..619d198 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -17,6 +17,8 @@
 #include <linux/io.h>
 #include <linux/list.h>
 #include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
 #include <linux/sh_dma.h>
 #include <linux/workqueue.h>
 #include <sound/rcar_snd.h>
@@ -113,6 +115,7 @@ enum rsnd_reg {
 #define RSND_REG_SRCOUT_TIMSEL4		RSND_REG_SHARE18
 #define RSND_REG_AUDIO_CLK_SEL2		RSND_REG_SHARE19
 
+struct rsnd_of_data;
 struct rsnd_priv;
 struct rsnd_mod;
 struct rsnd_dai;
@@ -260,6 +263,7 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
  *	R-Car Gen1/Gen2
  */
 int rsnd_gen_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 			       struct rsnd_mod *mod,
@@ -273,6 +277,7 @@ void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
 int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
 int rsnd_adg_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
 				  struct rsnd_mod *mod,
@@ -290,6 +295,10 @@ int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod,
 /*
  *	R-Car sound priv
  */
+struct rsnd_of_data {
+	u32 flags;
+};
+
 struct rsnd_priv {
 
 	struct device *dev;
@@ -348,6 +357,7 @@ struct rsnd_priv {
  *	R-Car SRC
  */
 int rsnd_src_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
@@ -366,6 +376,7 @@ int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod,
  *	R-Car SSI
  */
 int rsnd_ssi_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
 struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv,
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index ea6a214..eee75eb 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -628,7 +628,41 @@ struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
 	return &((struct rsnd_src *)(priv->src) + id)->mod;
 }
 
+static void rsnd_of_parse_src(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *src_node;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct rsnd_src_platform_info *src_info;
+	struct device *dev = &pdev->dev;
+	int nr;
+
+	if (!of_data)
+		return;
+
+	src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
+	if (!src_node)
+		return;
+
+	nr = of_get_child_count(src_node);
+	if (!nr)
+		return;
+
+	src_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_src_platform_info) * nr,
+				GFP_KERNEL);
+	if (!src_info) {
+		dev_err(dev, "src info allocation error\n");
+		return;
+	}
+
+	info->src_info		= src_info;
+	info->src_info_nr	= nr;
+}
+
 int rsnd_src_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
@@ -639,6 +673,8 @@ int rsnd_src_probe(struct platform_device *pdev,
 	char name[RSND_SRC_NAME_SIZE];
 	int i, nr;
 
+	rsnd_of_parse_src(pdev, of_data, priv);
+
 	/*
 	 * init SRC
 	 */
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 633b23d..4b7e206 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -588,7 +588,61 @@ static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *s
 	}
 }
 
+
+static void rsnd_of_parse_ssi(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *node;
+	struct device_node *np;
+	struct rsnd_ssi_platform_info *ssi_info;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = &pdev->dev;
+	int nr, i;
+
+	if (!of_data)
+		return;
+
+	node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
+	if (!node)
+		return;
+
+	nr = of_get_child_count(node);
+	if (!nr)
+		return;
+
+	ssi_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_ssi_platform_info) * nr,
+				GFP_KERNEL);
+	if (!ssi_info) {
+		dev_err(dev, "ssi info allocation error\n");
+		return;
+	}
+
+	info->ssi_info		= ssi_info;
+	info->ssi_info_nr	= nr;
+
+	i = -1;
+	for_each_child_of_node(node, np) {
+		i++;
+
+		ssi_info = info->ssi_info + i;
+
+		/*
+		 * pin settings
+		 */
+		if (of_get_property(np, "shared-pin", NULL))
+			ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE;
+
+		/*
+		 * irq
+		 */
+		ssi_info->pio_irq = irq_of_parse_and_map(np, 0);
+	}
+}
+
 int rsnd_ssi_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
@@ -600,6 +654,8 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 	char name[RSND_SSI_NAME_SIZE];
 	int i, nr;
 
+	rsnd_of_parse_ssi(pdev, of_data, priv);
+
 	/*
 	 *	init SSI
 	 */
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [PATCH 10/11] ASoC: rsnd: rename scu to src
  2014-03-04  4:51   ` [PATCH 10/11] ASoC: rsnd: rename scu to src Kuninori Morimoto
@ 2014-03-05  6:08     ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-05  6:08 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, Liam Girdwood, Kuninori Morimoto


[-- Attachment #1.1: Type: text/plain, Size: 316 bytes --]

On Mon, Mar 03, 2014 at 08:51:21PM -0800, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> R-Car sound has SCU unit which has SRC/CTU/MIX/DVC,
> and current rsnd driver has scu.c and scu module.
> Current scu.c has SRC support only.

Applied all up to here, thanks.

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

[-- Attachment #2: Type: text/plain, Size: 0 bytes --]



^ permalink raw reply	[flat|nested] 68+ messages in thread

* Forward: [PATCH 11/11] ASoC: rsnd: add DeviceTree support
  2014-03-04  4:51   ` [PATCH 11/11] ASoC: rsnd: add DeviceTree support Kuninori Morimoto
@ 2014-03-05  6:39     ` Kuninori Morimoto
  2014-03-10 14:52       ` Ben Dooks
  0 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-05  6:39 UTC (permalink / raw)
  To: devicetree-u79uwXL29TY76Z2rM5mHXA; +Cc: Linux-ALSA

[-- Attachment #1: Type: text/plain, Size: 57 bytes --]


I didn't add device tree ML on this patch.
Forward it.


[-- Attachment #2: Type: message/rfc822, Size: 15829 bytes --]

From: Kuninori Morimoto <kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Linux-ALSA <alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw@public.gmane.org>, Liam Girdwood <lgirdwood-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>, Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>, Simon <horms-/R6kz+dDXgpPR4JQBCEnsQ@public.gmane.org>
Subject: [PATCH 11/11] ASoC: rsnd: add DeviceTree support
Date: Mon, 03 Mar 2014 20:51:29 -0800 (PST)
Message-ID: <87r46izhv5.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>

From: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>

Support for loading the Renesas R-Car sound driver via DeviceTree.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
---
 .../devicetree/bindings/sound/renesas,rsnd.txt     |  101 ++++++++++++++++
 sound/soc/sh/rcar/adg.c                            |    1 +
 sound/soc/sh/rcar/core.c                           |  122 +++++++++++++++++++-
 sound/soc/sh/rcar/gen.c                            |   15 +++
 sound/soc/sh/rcar/rsnd.h                           |   11 ++
 sound/soc/sh/rcar/src.c                            |   36 ++++++
 sound/soc/sh/rcar/ssi.c                            |   56 +++++++++
 7 files changed, 339 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/sound/renesas,rsnd.txt

diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
new file mode 100644
index 0000000..1b64225
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
@@ -0,0 +1,101 @@
+Renesas R-Car sound
+
+Required properties:
+- compatible			: "renesas,rcar_sound-gen1" if generation1
+				  "renesas,rcar_sound-gen2" if generation2
+- reg				: Should contain the register physical address.
+				  required register is
+				   SRU/ADG/SSI      if generation1
+				   SRU/ADG/SSIU/SSI if generation2
+- rcar_sound,ssi		: SSI subnode
+- rcar_sound,scu		: SCU subnode
+- rcar_sound,dai		: DAI subnode
+
+SSI subnode properties:
+- interrupt-parent		: Should contain SSI interrup parent
+- interrupts			: Should contain SSI interrupt for PIO transfer
+- shared-pin			: if shared clock pin
+
+DAI subnode properties:
+- playback			: list of playback modules
+- capture			: list of capture  modules
+
+Example:
+
+rcar_sound: rcar_sound@0xffd90000 {
+	#sound-dai-cells = <1>;
+	compatible = "renesas,rcar_sound";
+	reg =	<0xffd90000 0x1000>, /* SRU */
+		<0xfffe0000 0x24>,   /* ADG */
+		<0xffd91000 0x1240>; /* SSI */
+
+	rcar_sound,src {
+		src0: src@0 { };
+		src1: src@1 { };
+		src2: src@2 { };
+		src3: src@3 { };
+		src4: src@4 { };
+		src5: src@5 { };
+		src6: src@6 { };
+		src7: src@7 { };
+		src8: src@8 { };
+	};
+
+	rcar_sound,ssi {
+		ssi0: ssi@0 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi1: ssi@1 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi2: ssi@2 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi3: ssi@3 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi4: ssi@4 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 101 0x4>;
+		};
+		ssi5: ssi@5 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi6: ssi@6 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi7: ssi@7 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+		ssi8: ssi@8 {
+			interrupt-parent = <&gic>;
+			interrupts = <0 102 0x4>;
+		};
+	};
+
+	rcar_sound,dai {
+		dai0 {
+			playback = <&ssi5 &src5>;
+			capture  = <&ssi6>;
+		};
+		dai1 {
+			playback = <&ssi3>;
+		};
+		dai2 {
+			capture  = <&ssi4>;
+		};
+		dai3 {
+			playback = <&ssi7>;
+		};
+		dai4 {
+			capture  = <&ssi8>;
+		};
+	};
+};
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 953f1cc..69c4426 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)
 }
 
 int rsnd_adg_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rsnd_adg *adg;
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 6a1b45df..e77f771 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -100,6 +100,21 @@
 #define RSND_RATES SNDRV_PCM_RATE_8000_96000
 #define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
 
+static struct rsnd_of_data rsnd_of_data_gen1 = {
+	.flags = RSND_GEN1,
+};
+
+static struct rsnd_of_data rsnd_of_data_gen2 = {
+	.flags = RSND_GEN2,
+};
+
+static struct of_device_id rsnd_of_match[] = {
+	{ .compatible = "renesas,rcar_sound-gen1", .data = &rsnd_of_data_gen1 },
+	{ .compatible = "renesas,rcar_sound-gen2", .data = &rsnd_of_data_gen2 },
+	{},
+};
+MODULE_DEVICE_TABLE(of, rsnd_of_match);
+
 /*
  *	rsnd_platform functions
  */
@@ -620,7 +635,92 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	return ret;
 }
 
+static void rsnd_of_parse_dai(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *dai_node,	*dai_np;
+	struct device_node *ssi_node,	*ssi_np;
+	struct device_node *src_node,	*src_np;
+	struct device_node *playback, *capture;
+	struct rsnd_dai_platform_info *dai_info;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = &pdev->dev;
+	int nr, i;
+	int dai_i, ssi_i, src_i;
+
+	if (!of_data)
+		return;
+
+	dai_node = of_get_child_by_name(dev->of_node, "rcar_sound,dai");
+	if (!dai_node)
+		return;
+
+	nr = of_get_child_count(dai_node);
+	if (!nr)
+		return;
+
+	dai_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_dai_platform_info) * nr,
+				GFP_KERNEL);
+	if (!dai_info) {
+		dev_err(dev, "dai info allocation error\n");
+		return;
+	}
+
+	info->dai_info_nr	= nr;
+	info->dai_info		= dai_info;
+
+	ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
+	src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
+
+#define mod_parse(name)							\
+if (name##_node) {							\
+	struct rsnd_##name##_platform_info *name##_info;		\
+									\
+	name##_i = 0;							\
+	for_each_child_of_node(name##_node, name##_np) {		\
+		name##_info = info->name##_info + name##_i;		\
+									\
+		if (name##_np == playback)				\
+			dai_info->playback.name = name##_info;		\
+		if (name##_np == capture)				\
+			dai_info->capture.name = name##_info;		\
+									\
+		name##_i++;						\
+	}								\
+}
+
+	/*
+	 * parse all dai
+	 */
+	dai_i = 0;
+	for_each_child_of_node(dai_node, dai_np) {
+		dai_info = info->dai_info + dai_i;
+
+		for (i = 0;; i++) {
+
+			playback = of_parse_phandle(dai_np, "playback", i);
+			capture  = of_parse_phandle(dai_np, "capture", i);
+
+			if (!playback && !capture)
+				break;
+
+			mod_parse(ssi);
+			mod_parse(src);
+
+			if (playback)
+				of_node_put(playback);
+			if (capture)
+				of_node_put(capture);
+		}
+
+		dai_i++;
+	}
+}
+
 static int rsnd_dai_probe(struct platform_device *pdev,
+			  const struct rsnd_of_data *of_data,
 			  struct rsnd_priv *priv)
 {
 	struct snd_soc_dai_driver *drv;
@@ -628,13 +728,16 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 	struct rsnd_dai *rdai;
 	struct rsnd_mod *pmod, *cmod;
 	struct device *dev = rsnd_priv_to_dev(priv);
-	int dai_nr = info->dai_info_nr;
+	int dai_nr;
 	int i;
 
+	rsnd_of_parse_dai(pdev, of_data, priv);
+
 	/*
 	 * dai_nr should be set via dai_info_nr,
 	 * but allow it to keeping compatible
 	 */
+	dai_nr = info->dai_info_nr;
 	if (!dai_nr) {
 		/* get max dai nr */
 		for (dai_nr = 0; dai_nr < 32; dai_nr++) {
@@ -802,7 +905,10 @@ static int rsnd_probe(struct platform_device *pdev)
 	struct rsnd_priv *priv;
 	struct device *dev = &pdev->dev;
 	struct rsnd_dai *rdai;
+	const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev);
+	const struct rsnd_of_data *of_data;
 	int (*probe_func[])(struct platform_device *pdev,
+			    const struct rsnd_of_data *of_data,
 			    struct rsnd_priv *priv) = {
 		rsnd_gen_probe,
 		rsnd_ssi_probe,
@@ -812,7 +918,16 @@ static int rsnd_probe(struct platform_device *pdev)
 	};
 	int ret, i;
 
-	info = pdev->dev.platform_data;
+	info = NULL;
+	of_data = NULL;
+	if (of_id) {
+		info = devm_kzalloc(&pdev->dev,
+				    sizeof(struct rcar_snd_info), GFP_KERNEL);
+		of_data = of_id->data;
+	} else {
+		info = pdev->dev.platform_data;
+	}
+
 	if (!info) {
 		dev_err(dev, "driver needs R-Car sound information\n");
 		return -ENODEV;
@@ -835,7 +950,7 @@ static int rsnd_probe(struct platform_device *pdev)
 	 *	init each module
 	 */
 	for (i = 0; i < ARRAY_SIZE(probe_func); i++) {
-		ret = probe_func[i](pdev, priv);
+		ret = probe_func[i](pdev, of_data, priv);
 		if (ret)
 			return ret;
 	}
@@ -903,6 +1018,7 @@ static int rsnd_remove(struct platform_device *pdev)
 static struct platform_driver rsnd_driver = {
 	.driver	= {
 		.name	= "rcar_sound",
+		.of_match_table = rsnd_of_match,
 	},
 	.probe		= rsnd_probe,
 	.remove		= rsnd_remove,
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 9094970..50a1ef3 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -359,13 +359,28 @@ static int rsnd_gen1_probe(struct platform_device *pdev,
 /*
  *		Gen
  */
+static void rsnd_of_parse_gen(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct rcar_snd_info *info = priv->info;
+
+	if (!of_data)
+		return;
+
+	info->flags = of_data->flags;
+}
+
 int rsnd_gen_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct device *dev = rsnd_priv_to_dev(priv);
 	struct rsnd_gen *gen;
 	int ret;
 
+	rsnd_of_parse_gen(pdev, of_data, priv);
+
 	gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL);
 	if (!gen) {
 		dev_err(dev, "GEN allocate failed\n");
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index c46e0af..619d198 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -17,6 +17,8 @@
 #include <linux/io.h>
 #include <linux/list.h>
 #include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
 #include <linux/sh_dma.h>
 #include <linux/workqueue.h>
 #include <sound/rcar_snd.h>
@@ -113,6 +115,7 @@ enum rsnd_reg {
 #define RSND_REG_SRCOUT_TIMSEL4		RSND_REG_SHARE18
 #define RSND_REG_AUDIO_CLK_SEL2		RSND_REG_SHARE19
 
+struct rsnd_of_data;
 struct rsnd_priv;
 struct rsnd_mod;
 struct rsnd_dai;
@@ -260,6 +263,7 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
  *	R-Car Gen1/Gen2
  */
 int rsnd_gen_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 			       struct rsnd_mod *mod,
@@ -273,6 +277,7 @@ void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
 int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
 int rsnd_adg_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
 				  struct rsnd_mod *mod,
@@ -290,6 +295,10 @@ int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod,
 /*
  *	R-Car sound priv
  */
+struct rsnd_of_data {
+	u32 flags;
+};
+
 struct rsnd_priv {
 
 	struct device *dev;
@@ -348,6 +357,7 @@ struct rsnd_priv {
  *	R-Car SRC
  */
 int rsnd_src_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
@@ -366,6 +376,7 @@ int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod,
  *	R-Car SSI
  */
 int rsnd_ssi_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
 struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv,
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index ea6a214..eee75eb 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -628,7 +628,41 @@ struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
 	return &((struct rsnd_src *)(priv->src) + id)->mod;
 }
 
+static void rsnd_of_parse_src(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *src_node;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct rsnd_src_platform_info *src_info;
+	struct device *dev = &pdev->dev;
+	int nr;
+
+	if (!of_data)
+		return;
+
+	src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
+	if (!src_node)
+		return;
+
+	nr = of_get_child_count(src_node);
+	if (!nr)
+		return;
+
+	src_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_src_platform_info) * nr,
+				GFP_KERNEL);
+	if (!src_info) {
+		dev_err(dev, "src info allocation error\n");
+		return;
+	}
+
+	info->src_info		= src_info;
+	info->src_info_nr	= nr;
+}
+
 int rsnd_src_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
@@ -639,6 +673,8 @@ int rsnd_src_probe(struct platform_device *pdev,
 	char name[RSND_SRC_NAME_SIZE];
 	int i, nr;
 
+	rsnd_of_parse_src(pdev, of_data, priv);
+
 	/*
 	 * init SRC
 	 */
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 633b23d..4b7e206 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -588,7 +588,61 @@ static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *s
 	}
 }
 
+
+static void rsnd_of_parse_ssi(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *node;
+	struct device_node *np;
+	struct rsnd_ssi_platform_info *ssi_info;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = &pdev->dev;
+	int nr, i;
+
+	if (!of_data)
+		return;
+
+	node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
+	if (!node)
+		return;
+
+	nr = of_get_child_count(node);
+	if (!nr)
+		return;
+
+	ssi_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_ssi_platform_info) * nr,
+				GFP_KERNEL);
+	if (!ssi_info) {
+		dev_err(dev, "ssi info allocation error\n");
+		return;
+	}
+
+	info->ssi_info		= ssi_info;
+	info->ssi_info_nr	= nr;
+
+	i = -1;
+	for_each_child_of_node(node, np) {
+		i++;
+
+		ssi_info = info->ssi_info + i;
+
+		/*
+		 * pin settings
+		 */
+		if (of_get_property(np, "shared-pin", NULL))
+			ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE;
+
+		/*
+		 * irq
+		 */
+		ssi_info->pio_irq = irq_of_parse_and_map(np, 0);
+	}
+}
+
 int rsnd_ssi_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
@@ -600,6 +654,8 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 	char name[RSND_SSI_NAME_SIZE];
 	int i, nr;
 
+	rsnd_of_parse_ssi(pdev, of_data, priv);
+
 	/*
 	 *	init SSI
 	 */
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: Forward: [PATCH 11/11] ASoC: rsnd: add DeviceTree support
  2014-03-05  6:39     ` Forward: " Kuninori Morimoto
@ 2014-03-10 14:52       ` Ben Dooks
       [not found]         ` <20140310145254.GJ4400-SMNkleLxa3Z6Wcw2j4pizdi2O/JbrIOy@public.gmane.org>
  0 siblings, 1 reply; 68+ messages in thread
From: Ben Dooks @ 2014-03-10 14:52 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: devicetree, Linux-ALSA

On Tue, Mar 04, 2014 at 10:39:03PM -0800, Kuninori Morimoto wrote:
> 
> I didn't add device tree ML on this patch.
> Forward it.
> 

Date: Mon, 03 Mar 2014 20:51:29 -0800 (PST)
Message-ID: <87r46izhv5.wl%kuninori.morimoto.gx@gmail.com>
From: Kuninori Morimoto <kuninori.morimoto.gx@gmail.com>
Subject: [PATCH 11/11] ASoC: rsnd: add DeviceTree support
User-Agent: Wanderlust/2.14.0 Emacs/23.3 Mule/6.0
To: Mark Brown <broonie@kernel.org>
Cc: Linux-ALSA <alsa-devel@alsa-project.org>,
	Liam Girdwood <lgirdwood@gmail.com>,
	Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>,
	Simon <horms@verge.net.au>
In-Reply-To: <878usq1scd.wl%kuninori.morimoto.gx@gmail.com>
References: <87d2ib90t9.wl%kuninori.morimoto.gx@gmail.com>
	<878usq1scd.wl%kuninori.morimoto.gx@gmail.com>
MIME-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka")
Content-Type: text/plain; charset=US-ASCII
> 
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> Support for loading the Renesas R-Car sound driver via DeviceTree.
> 
> Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> ---
>  .../devicetree/bindings/sound/renesas,rsnd.txt     |  101 ++++++++++++++++
>  sound/soc/sh/rcar/adg.c                            |    1 +
>  sound/soc/sh/rcar/core.c                           |  122 +++++++++++++++++++-
>  sound/soc/sh/rcar/gen.c                            |   15 +++
>  sound/soc/sh/rcar/rsnd.h                           |   11 ++
>  sound/soc/sh/rcar/src.c                            |   36 ++++++
>  sound/soc/sh/rcar/ssi.c                            |   56 +++++++++
>  7 files changed, 339 insertions(+), 3 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/sound/renesas,rsnd.txt
> 
> diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
> new file mode 100644
> index 0000000..1b64225
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
> @@ -0,0 +1,101 @@
> +Renesas R-Car sound
> +
> +Required properties:
> +- compatible			: "renesas,rcar_sound-gen1" if generation1
> +				  "renesas,rcar_sound-gen2" if generation2
> +- reg				: Should contain the register physical address.
> +				  required register is
> +				   SRU/ADG/SSI      if generation1
> +				   SRU/ADG/SSIU/SSI if generation2
> +- rcar_sound,ssi		: SSI subnode
> +- rcar_sound,scu		: SCU subnode
> +- rcar_sound,dai		: DAI subnode
> +
> +SSI subnode properties:
> +- interrupt-parent		: Should contain SSI interrup parent
> +- interrupts			: Should contain SSI interrupt for PIO transfer
> +- shared-pin			: if shared clock pin
> +
> +DAI subnode properties:
> +- playback			: list of playback modules
> +- capture			: list of capture  modules
> +
> +Example:
> +
> +rcar_sound: rcar_sound@0xffd90000 {
> +	#sound-dai-cells = <1>;
> +	compatible = "renesas,rcar_sound";
> +	reg =	<0xffd90000 0x1000>, /* SRU */
> +		<0xfffe0000 0x24>,   /* ADG */
> +		<0xffd91000 0x1240>; /* SSI */
> +
> +	rcar_sound,src {
> +		src0: src@0 { };
> +		src1: src@1 { };
> +		src2: src@2 { };
> +		src3: src@3 { };
> +		src4: src@4 { };
> +		src5: src@5 { };
> +		src6: src@6 { };
> +		src7: src@7 { };
> +		src8: src@8 { };
> +	};
> +
> +	rcar_sound,ssi {
> +		ssi0: ssi@0 {
> +			interrupt-parent = <&gic>;
> +			interrupts = <0 101 0x4>;

I thought interrupt parent was not required for the gic interrupts
in the system?


-- 
Ben Dooks, ben@fluff.org, http://www.fluff.org/ben/

Large Hadron Colada: A large Pina Colada that makes the universe disappear.

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 0/19] ASoC: rsnd: new module path method and DT support
  2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
                   ` (22 preceding siblings ...)
  2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
@ 2014-03-10 16:28 ` Ben Dooks
  2014-03-11  0:00   ` Kuninori Morimoto
  23 siblings, 1 reply; 68+ messages in thread
From: Ben Dooks @ 2014-03-10 16:28 UTC (permalink / raw)
  To: Kuninori Morimoto
  Cc: Linux-ALSA, Mark Brown, Liam Girdwood, Simon, Kuninori Morimoto

On Mon, Feb 24, 2014 at 10:13:57PM -0800, Kuninori Morimoto wrote:
> 
> Hi Mark
> 
> These are Renesas R-Car sound driver patches.
> #1 - #7 are clean up patches.
> #8 - #18 adds new module path method
> #19 adds DT support
> 
> Now, Mark's ALSA branch doesn't include SH-ARM platform branch.
> Thus, these patches are keeping compatible for it at this point.
> Compatible code will be removed after merge.

I've merged the rcar branch that Mark Brown has pushed out, which has
all of these except #19 and have been trying to get it to work.

I am currently seeing issues where the CODEC fails to start, thus there
is no audio produced due to no audio bit or word clocks on the I2S bus
(the CODEC is the clock master).

-- 
Ben Dooks, ben@fluff.org, http://www.fluff.org/ben/

Large Hadron Colada: A large Pina Colada that makes the universe disappear.

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH 0/19] ASoC: rsnd: new module path method and DT support
  2014-03-10 16:28 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Ben Dooks
@ 2014-03-11  0:00   ` Kuninori Morimoto
  0 siblings, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-11  0:00 UTC (permalink / raw)
  To: Ben Dooks; +Cc: Linux-ALSA, Mark Brown, Liam Girdwood, Simon, Kuninori Morimoto


Hi Ben

Thank you for your testing

> > These are Renesas R-Car sound driver patches.
> > #1 - #7 are clean up patches.
> > #8 - #18 adds new module path method
> > #19 adds DT support
> > 
> > Now, Mark's ALSA branch doesn't include SH-ARM platform branch.
> > Thus, these patches are keeping compatible for it at this point.
> > Compatible code will be removed after merge.
> 
> I've merged the rcar branch that Mark Brown has pushed out, which has
> all of these except #19 and have been trying to get it to work.
> 
> I am currently seeing issues where the CODEC fails to start, thus there
> is no audio produced due to no audio bit or word clocks on the I2S bus
> (the CODEC is the clock master).

Please show me more detail.
Are you using Lager board ? are you using DT ? or non-DT ?
It needs Mark's mark/topic/simple branch too.
Can you show me error log ?

Best regards
---
Kuninori Morimoto

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [alsa-devel] Forward: [PATCH 11/11] ASoC: rsnd: add DeviceTree support
       [not found]         ` <20140310145254.GJ4400-SMNkleLxa3Z6Wcw2j4pizdi2O/JbrIOy@public.gmane.org>
@ 2014-03-14  0:34           ` Kuninori Morimoto
       [not found]             ` <87fvmlpqi1.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-14  0:34 UTC (permalink / raw)
  To: Ben Dooks; +Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, Linux-ALSA


Hi Ben

Thank you for your review.
This is quick question

> > +	rcar_sound,ssi {
> > +		ssi0: ssi@0 {
> > +			interrupt-parent = <&gic>;
> > +			interrupts = <0 101 0x4>;
> 
> I thought interrupt parent was not required for the gic interrupts
> in the system?

Does it mean it don't need "interrupt-parent" ?
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 68+ messages in thread

* [PATCH v2] ASoC: rsnd: add DeviceTree support
       [not found]             ` <87fvmlpqi1.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2014-03-18  2:29               ` Kuninori Morimoto
       [not found]                 ` <87ob14jl2d.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-18  2:29 UTC (permalink / raw)
  To: Mark Brown
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, Linux-ALSA, Liam Girdwood,
	Kuninori Morimoto, Kuninori Morimoto, Simon

From: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>

Support for loading the Renesas R-Car sound driver via DeviceTree.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
---
v1 -> v2

 - removed interrupt parent from ssi
 - tidyup example code on renesas,rsnd.txt

 .../devicetree/bindings/sound/renesas,rsnd.txt     |   96 +++++++++++++++
 sound/soc/sh/rcar/adg.c                            |    1 +
 sound/soc/sh/rcar/core.c                           |  122 +++++++++++++++++++-
 sound/soc/sh/rcar/gen.c                            |   15 +++
 sound/soc/sh/rcar/rsnd.h                           |   11 ++
 sound/soc/sh/rcar/src.c                            |   36 ++++++
 sound/soc/sh/rcar/ssi.c                            |   56 +++++++++
 7 files changed, 334 insertions(+), 3 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/sound/renesas,rsnd.txt

diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
new file mode 100644
index 0000000..7c6d33f
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
@@ -0,0 +1,96 @@
+Renesas R-Car sound
+
+Required properties:
+- compatible			: "renesas,rcar_sound-gen1" if generation1
+				  "renesas,rcar_sound-gen2" if generation2
+- reg				: Should contain the register physical address.
+				  required register is
+				   SRU/ADG/SSI      if generation1
+				   SRU/ADG/SSIU/SSI if generation2
+- rcar_sound,ssi		: SSI subnode
+- rcar_sound,scu		: SCU subnode
+- rcar_sound,dai		: DAI subnode
+
+SSI subnode properties:
+- interrupts			: Should contain SSI interrupt for PIO transfer
+- shared-pin			: if shared clock pin
+
+DAI subnode properties:
+- playback			: list of playback modules
+- capture			: list of capture  modules
+
+Example:
+
+rcar_sound: rcar_sound@0xffd90000 {
+	#sound-dai-cells = <1>;
+	compatible = "renesas,rcar_sound-gen2";
+	reg =	<0 0xec500000 0 0x1000>, /* SCU */
+		<0 0xec5a0000 0 0x100>,  /* ADG */
+		<0 0xec540000 0 0x1000>, /* SSIU */
+		<0 0xec541000 0 0x1280>; /* SSI */
+
+	rcar_sound,src {
+		src0: src@0 { };
+		src1: src@1 { };
+		src2: src@2 { };
+		src3: src@3 { };
+		src4: src@4 { };
+		src5: src@5 { };
+		src6: src@6 { };
+		src7: src@7 { };
+		src8: src@8 { };
+		src9: src@9 { };
+	};
+
+	rcar_sound,ssi {
+		ssi0: ssi@0 {
+			interrupts = <0 370 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi1: ssi@1 {
+			interrupts = <0 371 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi2: ssi@2 {
+			interrupts = <0 372 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi3: ssi@3 {
+			interrupts = <0 373 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi4: ssi@4 {
+			interrupts = <0 374 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi5: ssi@5 {
+			interrupts = <0 375 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi6: ssi@6 {
+			interrupts = <0 376 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi7: ssi@7 {
+			interrupts = <0 377 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi8: ssi@8 {
+			interrupts = <0 378 IRQ_TYPE_LEVEL_HIGH>;
+		};
+		ssi9: ssi@9 {
+			interrupts = <0 379 IRQ_TYPE_LEVEL_HIGH>;
+		};
+	};
+
+	rcar_sound,dai {
+		dai0 {
+			playback = <&ssi5 &src5>;
+			capture  = <&ssi6>;
+		};
+		dai1 {
+			playback = <&ssi3>;
+		};
+		dai2 {
+			capture  = <&ssi4>;
+		};
+		dai3 {
+			playback = <&ssi7>;
+		};
+		dai4 {
+			capture  = <&ssi8>;
+		};
+	};
+};
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 953f1cc..69c4426 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)
 }
 
 int rsnd_adg_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rsnd_adg *adg;
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index d836e8a..215b668 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -100,6 +100,21 @@
 #define RSND_RATES SNDRV_PCM_RATE_8000_96000
 #define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
 
+static struct rsnd_of_data rsnd_of_data_gen1 = {
+	.flags = RSND_GEN1,
+};
+
+static struct rsnd_of_data rsnd_of_data_gen2 = {
+	.flags = RSND_GEN2,
+};
+
+static struct of_device_id rsnd_of_match[] = {
+	{ .compatible = "renesas,rcar_sound-gen1", .data = &rsnd_of_data_gen1 },
+	{ .compatible = "renesas,rcar_sound-gen2", .data = &rsnd_of_data_gen2 },
+	{},
+};
+MODULE_DEVICE_TABLE(of, rsnd_of_match);
+
 /*
  *	rsnd_platform functions
  */
@@ -620,7 +635,92 @@ static int rsnd_path_init(struct rsnd_priv *priv,
 	return ret;
 }
 
+static void rsnd_of_parse_dai(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *dai_node,	*dai_np;
+	struct device_node *ssi_node,	*ssi_np;
+	struct device_node *src_node,	*src_np;
+	struct device_node *playback, *capture;
+	struct rsnd_dai_platform_info *dai_info;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = &pdev->dev;
+	int nr, i;
+	int dai_i, ssi_i, src_i;
+
+	if (!of_data)
+		return;
+
+	dai_node = of_get_child_by_name(dev->of_node, "rcar_sound,dai");
+	if (!dai_node)
+		return;
+
+	nr = of_get_child_count(dai_node);
+	if (!nr)
+		return;
+
+	dai_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_dai_platform_info) * nr,
+				GFP_KERNEL);
+	if (!dai_info) {
+		dev_err(dev, "dai info allocation error\n");
+		return;
+	}
+
+	info->dai_info_nr	= nr;
+	info->dai_info		= dai_info;
+
+	ssi_node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
+	src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
+
+#define mod_parse(name)							\
+if (name##_node) {							\
+	struct rsnd_##name##_platform_info *name##_info;		\
+									\
+	name##_i = 0;							\
+	for_each_child_of_node(name##_node, name##_np) {		\
+		name##_info = info->name##_info + name##_i;		\
+									\
+		if (name##_np == playback)				\
+			dai_info->playback.name = name##_info;		\
+		if (name##_np == capture)				\
+			dai_info->capture.name = name##_info;		\
+									\
+		name##_i++;						\
+	}								\
+}
+
+	/*
+	 * parse all dai
+	 */
+	dai_i = 0;
+	for_each_child_of_node(dai_node, dai_np) {
+		dai_info = info->dai_info + dai_i;
+
+		for (i = 0;; i++) {
+
+			playback = of_parse_phandle(dai_np, "playback", i);
+			capture  = of_parse_phandle(dai_np, "capture", i);
+
+			if (!playback && !capture)
+				break;
+
+			mod_parse(ssi);
+			mod_parse(src);
+
+			if (playback)
+				of_node_put(playback);
+			if (capture)
+				of_node_put(capture);
+		}
+
+		dai_i++;
+	}
+}
+
 static int rsnd_dai_probe(struct platform_device *pdev,
+			  const struct rsnd_of_data *of_data,
 			  struct rsnd_priv *priv)
 {
 	struct snd_soc_dai_driver *drv;
@@ -628,13 +728,16 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 	struct rsnd_dai *rdai;
 	struct rsnd_mod *pmod, *cmod;
 	struct device *dev = rsnd_priv_to_dev(priv);
-	int dai_nr = info->dai_info_nr;
+	int dai_nr;
 	int i;
 
+	rsnd_of_parse_dai(pdev, of_data, priv);
+
 	/*
 	 * dai_nr should be set via dai_info_nr,
 	 * but allow it to keeping compatible
 	 */
+	dai_nr = info->dai_info_nr;
 	if (!dai_nr) {
 		/* get max dai nr */
 		for (dai_nr = 0; dai_nr < 32; dai_nr++) {
@@ -802,7 +905,10 @@ static int rsnd_probe(struct platform_device *pdev)
 	struct rsnd_priv *priv;
 	struct device *dev = &pdev->dev;
 	struct rsnd_dai *rdai;
+	const struct of_device_id *of_id = of_match_device(rsnd_of_match, dev);
+	const struct rsnd_of_data *of_data;
 	int (*probe_func[])(struct platform_device *pdev,
+			    const struct rsnd_of_data *of_data,
 			    struct rsnd_priv *priv) = {
 		rsnd_gen_probe,
 		rsnd_ssi_probe,
@@ -812,7 +918,16 @@ static int rsnd_probe(struct platform_device *pdev)
 	};
 	int ret, i;
 
-	info = pdev->dev.platform_data;
+	info = NULL;
+	of_data = NULL;
+	if (of_id) {
+		info = devm_kzalloc(&pdev->dev,
+				    sizeof(struct rcar_snd_info), GFP_KERNEL);
+		of_data = of_id->data;
+	} else {
+		info = pdev->dev.platform_data;
+	}
+
 	if (!info) {
 		dev_err(dev, "driver needs R-Car sound information\n");
 		return -ENODEV;
@@ -835,7 +950,7 @@ static int rsnd_probe(struct platform_device *pdev)
 	 *	init each module
 	 */
 	for (i = 0; i < ARRAY_SIZE(probe_func); i++) {
-		ret = probe_func[i](pdev, priv);
+		ret = probe_func[i](pdev, of_data, priv);
 		if (ret)
 			return ret;
 	}
@@ -903,6 +1018,7 @@ static int rsnd_remove(struct platform_device *pdev)
 static struct platform_driver rsnd_driver = {
 	.driver	= {
 		.name	= "rcar_sound",
+		.of_match_table = rsnd_of_match,
 	},
 	.probe		= rsnd_probe,
 	.remove		= rsnd_remove,
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 9094970..50a1ef3 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -359,13 +359,28 @@ static int rsnd_gen1_probe(struct platform_device *pdev,
 /*
  *		Gen
  */
+static void rsnd_of_parse_gen(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct rcar_snd_info *info = priv->info;
+
+	if (!of_data)
+		return;
+
+	info->flags = of_data->flags;
+}
+
 int rsnd_gen_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct device *dev = rsnd_priv_to_dev(priv);
 	struct rsnd_gen *gen;
 	int ret;
 
+	rsnd_of_parse_gen(pdev, of_data, priv);
+
 	gen = devm_kzalloc(dev, sizeof(*gen), GFP_KERNEL);
 	if (!gen) {
 		dev_err(dev, "GEN allocate failed\n");
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index c46e0af..619d198 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -17,6 +17,8 @@
 #include <linux/io.h>
 #include <linux/list.h>
 #include <linux/module.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
 #include <linux/sh_dma.h>
 #include <linux/workqueue.h>
 #include <sound/rcar_snd.h>
@@ -113,6 +115,7 @@ enum rsnd_reg {
 #define RSND_REG_SRCOUT_TIMSEL4		RSND_REG_SHARE18
 #define RSND_REG_AUDIO_CLK_SEL2		RSND_REG_SHARE19
 
+struct rsnd_of_data;
 struct rsnd_priv;
 struct rsnd_mod;
 struct rsnd_dai;
@@ -260,6 +263,7 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
  *	R-Car Gen1/Gen2
  */
 int rsnd_gen_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 			       struct rsnd_mod *mod,
@@ -273,6 +277,7 @@ void __iomem *rsnd_gen_reg_get(struct rsnd_priv *priv,
 int rsnd_adg_ssi_clk_stop(struct rsnd_mod *mod);
 int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *mod, unsigned int rate);
 int rsnd_adg_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 int rsnd_adg_set_convert_clk_gen1(struct rsnd_priv *priv,
 				  struct rsnd_mod *mod,
@@ -290,6 +295,10 @@ int rsnd_adg_set_convert_timing_gen2(struct rsnd_mod *mod,
 /*
  *	R-Car sound priv
  */
+struct rsnd_of_data {
+	u32 flags;
+};
+
 struct rsnd_priv {
 
 	struct device *dev;
@@ -348,6 +357,7 @@ struct rsnd_priv {
  *	R-Car SRC
  */
 int rsnd_src_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id);
 unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv,
@@ -366,6 +376,7 @@ int rsnd_src_enable_ssi_irq(struct rsnd_mod *ssi_mod,
  *	R-Car SSI
  */
 int rsnd_ssi_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv);
 struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id);
 struct rsnd_mod *rsnd_ssi_mod_get_frm_dai(struct rsnd_priv *priv,
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index ea6a214..eee75eb 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -628,7 +628,41 @@ struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
 	return &((struct rsnd_src *)(priv->src) + id)->mod;
 }
 
+static void rsnd_of_parse_src(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *src_node;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct rsnd_src_platform_info *src_info;
+	struct device *dev = &pdev->dev;
+	int nr;
+
+	if (!of_data)
+		return;
+
+	src_node = of_get_child_by_name(dev->of_node, "rcar_sound,src");
+	if (!src_node)
+		return;
+
+	nr = of_get_child_count(src_node);
+	if (!nr)
+		return;
+
+	src_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_src_platform_info) * nr,
+				GFP_KERNEL);
+	if (!src_info) {
+		dev_err(dev, "src info allocation error\n");
+		return;
+	}
+
+	info->src_info		= src_info;
+	info->src_info_nr	= nr;
+}
+
 int rsnd_src_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
@@ -639,6 +673,8 @@ int rsnd_src_probe(struct platform_device *pdev,
 	char name[RSND_SRC_NAME_SIZE];
 	int i, nr;
 
+	rsnd_of_parse_src(pdev, of_data, priv);
+
 	/*
 	 * init SRC
 	 */
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 633b23d..4b7e206 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -588,7 +588,61 @@ static void rsnd_ssi_parent_clk_setup(struct rsnd_priv *priv, struct rsnd_ssi *s
 	}
 }
 
+
+static void rsnd_of_parse_ssi(struct platform_device *pdev,
+			      const struct rsnd_of_data *of_data,
+			      struct rsnd_priv *priv)
+{
+	struct device_node *node;
+	struct device_node *np;
+	struct rsnd_ssi_platform_info *ssi_info;
+	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
+	struct device *dev = &pdev->dev;
+	int nr, i;
+
+	if (!of_data)
+		return;
+
+	node = of_get_child_by_name(dev->of_node, "rcar_sound,ssi");
+	if (!node)
+		return;
+
+	nr = of_get_child_count(node);
+	if (!nr)
+		return;
+
+	ssi_info = devm_kzalloc(dev,
+				sizeof(struct rsnd_ssi_platform_info) * nr,
+				GFP_KERNEL);
+	if (!ssi_info) {
+		dev_err(dev, "ssi info allocation error\n");
+		return;
+	}
+
+	info->ssi_info		= ssi_info;
+	info->ssi_info_nr	= nr;
+
+	i = -1;
+	for_each_child_of_node(node, np) {
+		i++;
+
+		ssi_info = info->ssi_info + i;
+
+		/*
+		 * pin settings
+		 */
+		if (of_get_property(np, "shared-pin", NULL))
+			ssi_info->flags |= RSND_SSI_CLK_PIN_SHARE;
+
+		/*
+		 * irq
+		 */
+		ssi_info->pio_irq = irq_of_parse_and_map(np, 0);
+	}
+}
+
 int rsnd_ssi_probe(struct platform_device *pdev,
+		   const struct rsnd_of_data *of_data,
 		   struct rsnd_priv *priv)
 {
 	struct rcar_snd_info *info = rsnd_priv_to_info(priv);
@@ -600,6 +654,8 @@ int rsnd_ssi_probe(struct platform_device *pdev,
 	char name[RSND_SSI_NAME_SIZE];
 	int i, nr;
 
+	rsnd_of_parse_ssi(pdev, of_data, priv);
+
 	/*
 	 *	init SSI
 	 */
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [PATCH v2] ASoC: rsnd: add DeviceTree support
       [not found]                 ` <87ob14jl2d.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2014-03-21 18:18                   ` Mark Brown
       [not found]                     ` <20140321181813.GP552-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
  0 siblings, 1 reply; 68+ messages in thread
From: Mark Brown @ 2014-03-21 18:18 UTC (permalink / raw)
  To: Kuninori Morimoto
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, Linux-ALSA, Liam Girdwood,
	Kuninori Morimoto, Simon

[-- Attachment #1: Type: text/plain, Size: 871 bytes --]

On Mon, Mar 17, 2014 at 07:29:55PM -0700, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
> 
> Support for loading the Renesas R-Car sound driver via DeviceTree.

So, I've applied this but it needs some improvement - please do that
incrementally.  One thing you should have done here is CC the binding to
the DT list and maintainers for review.

> +- rcar_sound,ssi		: SSI subnode
> +- rcar_sound,scu		: SCU subnode
> +- rcar_sound,dai		: DAI subnode

This needs clearer documentation saying what the subnodes are - they're
actually collections of further nodes, each of which represents
something in the hardware.  The examples are fairly clear but the text
needs more than just "subnode".  Someone should be able to tell how to
write the DT just given the datasheet and this document.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [PATCH v2] ASoC: rsnd: add DeviceTree support
       [not found]                     ` <20140321181813.GP552-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
@ 2014-03-24  0:07                       ` Kuninori Morimoto
  2014-03-24  3:29                       ` [PATCH] ASoC: rcar: subnode tidyup for renesas,rsnd.txt Kuninori Morimoto
  1 sibling, 0 replies; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-24  0:07 UTC (permalink / raw)
  To: Mark Brown
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, Linux-ALSA, Liam Girdwood,
	Kuninori Morimoto, Simon


Hi Mark

> On Mon, Mar 17, 2014 at 07:29:55PM -0700, Kuninori Morimoto wrote:
> > From: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
> > 
> > Support for loading the Renesas R-Car sound driver via DeviceTree.
> 
> So, I've applied this but it needs some improvement - please do that
> incrementally.  One thing you should have done here is CC the binding to
> the DT list and maintainers for review.
> 
> > +- rcar_sound,ssi		: SSI subnode
> > +- rcar_sound,scu		: SCU subnode
> > +- rcar_sound,dai		: DAI subnode
> 
> This needs clearer documentation saying what the subnodes are - they're
> actually collections of further nodes, each of which represents
> something in the hardware.  The examples are fairly clear but the text
> needs more than just "subnode".  Someone should be able to tell how to
> write the DT just given the datasheet and this document.

I see. will do
Thank you for your advice

Best regards
---
Kuninori Morimoto
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 68+ messages in thread

* [PATCH] ASoC: rcar: subnode tidyup for renesas,rsnd.txt
       [not found]                     ` <20140321181813.GP552-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
  2014-03-24  0:07                       ` Kuninori Morimoto
@ 2014-03-24  3:29                       ` Kuninori Morimoto
       [not found]                         ` <87fvm8i8ah.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 68+ messages in thread
From: Kuninori Morimoto @ 2014-03-24  3:29 UTC (permalink / raw)
  To: Mark Brown
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, Linux-ALSA, Liam Girdwood,
	Kuninori Morimoto, Simon, Grant Likely, Rob Herring, Pawel Moll,
	Mark Rutland, Ian Campbell, Kumar Gala

From: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>

rcar_sound,ssi/src/dai subnode documentation
become more cleaner

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
---
 .../devicetree/bindings/sound/renesas,rsnd.txt     |   15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
index 7c6d33f..a44e917 100644
--- a/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd.txt
@@ -7,14 +7,23 @@ Required properties:
 				  required register is
 				   SRU/ADG/SSI      if generation1
 				   SRU/ADG/SSIU/SSI if generation2
-- rcar_sound,ssi		: SSI subnode
-- rcar_sound,scu		: SCU subnode
-- rcar_sound,dai		: DAI subnode
+- rcar_sound,ssi		: Should contain SSI feature.
+				  The number of SSI subnode should be same as HW.
+				  see below for detail.
+- rcar_sound,src		: Should contain SRC feature.
+				  The number of SRC subnode should be same as HW.
+				  see below for detail.
+- rcar_sound,dai		: DAI contents.
+				  The number of DAI subnode should be same as HW.
+				  see below for detail.
 
 SSI subnode properties:
 - interrupts			: Should contain SSI interrupt for PIO transfer
 - shared-pin			: if shared clock pin
 
+SRC subnode properties:
+no properties at this point
+
 DAI subnode properties:
 - playback			: list of playback modules
 - capture			: list of capture  modules
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [PATCH] ASoC: rcar: subnode tidyup for renesas,rsnd.txt
       [not found]                         ` <87fvm8i8ah.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2014-03-25 13:04                           ` Mark Brown
  0 siblings, 0 replies; 68+ messages in thread
From: Mark Brown @ 2014-03-25 13:04 UTC (permalink / raw)
  To: Kuninori Morimoto
  Cc: devicetree-u79uwXL29TY76Z2rM5mHXA, Linux-ALSA, Liam Girdwood,
	Kuninori Morimoto, Simon, Grant Likely, Rob Herring, Pawel Moll,
	Mark Rutland, Ian Campbell, Kumar Gala

[-- Attachment #1: Type: text/plain, Size: 253 bytes --]

On Sun, Mar 23, 2014 at 08:29:15PM -0700, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx-zM6kxYcvzFBBDgjK7y7TUQ@public.gmane.org>
> 
> rcar_sound,ssi/src/dai subnode documentation
> become more cleaner

Applied, thanks.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 68+ messages in thread

end of thread, other threads:[~2014-03-25 13:04 UTC | newest]

Thread overview: 68+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-25  6:13 [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
2014-02-25  6:14 ` [PATCH 01/19] ASoC: rsnd: move priv member settings to upper side Kuninori Morimoto
2014-03-03  1:19   ` Mark Brown
2014-02-25  6:14 ` [PATCH 02/19] ASoC: rsnd: move rsnd_mod_call() macro Kuninori Morimoto
2014-03-03  1:19   ` Mark Brown
2014-02-25  6:15 ` [PATCH 03/19] ASoC: rsnd: remove verbose function parameter Kuninori Morimoto
2014-03-03  1:19   ` Mark Brown
2014-02-25  6:15 ` [PATCH 04/19] ASoC: rsnd: remove verbose debug message from scu/ssi Kuninori Morimoto
2014-03-03  1:20   ` Mark Brown
2014-02-25  6:15 ` [PATCH 05/19] ASoC: rsnd: unify rdai naming Kuninori Morimoto
2014-03-03  1:20   ` Mark Brown
2014-02-25  6:15 ` [PATCH 06/19] ASoC: rsnd: add .set_sysclk on snd_soc_dai_ops Kuninori Morimoto
2014-03-03  1:18   ` Mark Brown
2014-03-03  2:08     ` Kuninori Morimoto
2014-03-03  2:12       ` Kuninori Morimoto
2014-03-03  7:45         ` Kuninori Morimoto
2014-02-25  6:15 ` [PATCH 07/19] ASoC: rsnd: tidyup RSND_SSI_xxx flags Kuninori Morimoto
2014-03-03  1:21   ` Mark Brown
2014-02-25  6:15 ` [PATCH 08/19] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
2014-03-03  1:22   ` Mark Brown
2014-02-25  6:15 ` [PATCH 09/19] ASoC: rsnd: use mod array instead of list on rdai Kuninori Morimoto
2014-02-25  6:15 ` [PATCH 10/19] ASoC: rsnd: get ssi/scu from rsnd_dai_stream Kuninori Morimoto
2014-02-25  6:16 ` [PATCH 11/19] ASoC: rsnd: add struct rsnd_dai_platform_info Kuninori Morimoto
2014-02-25  6:16 ` [PATCH 12/19] ASoC: rsnd: use function pointer for each probe Kuninori Morimoto
2014-02-25  6:16 ` [PATCH 13/19] ASoC: rsnd: Get correct SCU ID Kuninori Morimoto
2014-02-25  6:16 ` [PATCH 14/19] ASoC: rsnd: add rsnd_scu_enable_ssi_irq() Kuninori Morimoto
2014-02-25  6:16 ` [PATCH 15/19] ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI Kuninori Morimoto
2014-02-25  6:16 ` [PATCH 16/19] ASoC: rsnd: add probe/remove callback on rsnd_mod_ops Kuninori Morimoto
2014-02-25  6:16 ` [PATCH 17/19] ASoC: rsnd: use mod probe method on SCU Kuninori Morimoto
2014-02-25  6:17 ` [PATCH 18/19] ASoC: rsnd: use mod probe method on SSI Kuninori Morimoto
2014-02-25  6:17 ` [PATCH 19/19] ASoC: rsnd: add DeviceTree support Kuninori Morimoto
2014-02-27  5:08 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Mark Brown
2014-02-27 10:18   ` Kuninori Morimoto
2014-02-27 11:47     ` Mark Brown
2014-03-03  1:29 ` Mark Brown
2014-03-03  7:42 ` Kuninori Morimoto
2014-03-03  7:42   ` [PATCH 1/8] ASoC: rsnd: run rsnd_path_init() when probe() timing Kuninori Morimoto
2014-03-04  4:13     ` Mark Brown
2014-03-03  7:42   ` [PATCH 2/8] ASoC: rsnd: use mod array instead of list on rdai Kuninori Morimoto
2014-03-03  7:43   ` [PATCH 3/8] ASoC: rsnd: get ssi/scu from rsnd_dai_stream Kuninori Morimoto
2014-03-03  7:43   ` [PATCH 4/8] ASoC: rsnd: use devm_clk_get() instead of clk_get() Kuninori Morimoto
2014-03-03  7:43   ` [PATCH 5/8] ASoC: rsnd: use function pointer for each probe Kuninori Morimoto
2014-03-03  7:43   ` [PATCH 6/8] ASoC: rsnd: remove unused SSI_CONTROL Kuninori Morimoto
2014-03-03  7:43   ` [PATCH 7/8] ASoC: rsnd: modify rsnd_adg_ssi_ws_timing_gen2() parameter Kuninori Morimoto
2014-03-03  7:43   ` [PATCH 8/8] ASoC: rsnd: share reg_field and reduce memory Kuninori Morimoto
2014-03-04  4:49 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Kuninori Morimoto
2014-03-04  4:49   ` [PATCH 01/11] ASoC: rsnd: add struct rsnd_dai_platform_info Kuninori Morimoto
2014-03-04  4:50   ` [PATCH 02/11] ASoC: rsnd: Get correct SCU ID Kuninori Morimoto
2014-03-04  4:50   ` [PATCH 03/11] ASoC: rsnd: add rsnd_scu_enable_ssi_irq() Kuninori Morimoto
2014-03-04  4:50   ` [PATCH 04/11] ASoC: rsnd: call rsnd_scu_ssi_mode_init() from SSI Kuninori Morimoto
2014-03-04  4:50   ` [PATCH 05/11] ASoC: rsnd: add probe/remove callback on rsnd_mod_ops Kuninori Morimoto
2014-03-04  4:50   ` [PATCH 06/11] ASoC: rsnd: use mod probe method on SCU Kuninori Morimoto
2014-03-04  4:50   ` [PATCH 07/11] ASoC: rsnd: use mod probe method on SSI Kuninori Morimoto
2014-03-04  4:51   ` [PATCH 08/11] ASoC: rsnd: nothing to do on rsnd_dai_remove() Kuninori Morimoto
2014-03-04  4:51   ` [PATCH 09/11] ASoC: rsnd: remove all rsnd_xxx_remove() Kuninori Morimoto
2014-03-04  4:51   ` [PATCH 10/11] ASoC: rsnd: rename scu to src Kuninori Morimoto
2014-03-05  6:08     ` Mark Brown
2014-03-04  4:51   ` [PATCH 11/11] ASoC: rsnd: add DeviceTree support Kuninori Morimoto
2014-03-05  6:39     ` Forward: " Kuninori Morimoto
2014-03-10 14:52       ` Ben Dooks
     [not found]         ` <20140310145254.GJ4400-SMNkleLxa3Z6Wcw2j4pizdi2O/JbrIOy@public.gmane.org>
2014-03-14  0:34           ` [alsa-devel] " Kuninori Morimoto
     [not found]             ` <87fvmlpqi1.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-03-18  2:29               ` [PATCH v2] " Kuninori Morimoto
     [not found]                 ` <87ob14jl2d.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-03-21 18:18                   ` Mark Brown
     [not found]                     ` <20140321181813.GP552-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2014-03-24  0:07                       ` Kuninori Morimoto
2014-03-24  3:29                       ` [PATCH] ASoC: rcar: subnode tidyup for renesas,rsnd.txt Kuninori Morimoto
     [not found]                         ` <87fvm8i8ah.wl%kuninori.morimoto.gx-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-03-25 13:04                           ` Mark Brown
2014-03-10 16:28 ` [PATCH 0/19] ASoC: rsnd: new module path method and DT support Ben Dooks
2014-03-11  0:00   ` Kuninori Morimoto

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.