[PATCH v3 17/17] ASoC: add simple-graph-scu-card support

2016-11-10 Thread Kuninori Morimoto

From: Kuninori Morimoto 

graph base DT binding are used on V4L2, and ALSA SoC is using different
style of DT. In case of simple case, ALSA SoC supports simple-card
driver.
In the future, V4L2 / ALSA will support HDMI, and then, DT bindings
between V4L2 / ALSA should be merged somehow.
Sometimes, we would like to use DPCM base simple-card on graph base DT.
This patch adds graph base DT binding of simple-scu-card

Signed-off-by: Kuninori Morimoto 
---
v2 -> v3

 - no change

 sound/soc/generic/Kconfig |   8 +
 sound/soc/generic/Makefile|   2 +
 sound/soc/generic/simple-graph-scu-card.c | 417 ++
 3 files changed, 427 insertions(+)
 create mode 100644 sound/soc/generic/simple-graph-scu-card.c

diff --git a/sound/soc/generic/Kconfig b/sound/soc/generic/Kconfig
index efefabd..fc11828 100644
--- a/sound/soc/generic/Kconfig
+++ b/sound/soc/generic/Kconfig
@@ -21,3 +21,11 @@ config SND_SIMPLE_GRAPH_CARD
select SND_SIMPLE_CARD_UTILS
help
  This option enables generic simple Graph sound card support
+
+config SND_SIMPLE_GRAPH_SCU_CARD
+   tristate "ASoC Simple Graph SCU sound card support"
+   depends on OF
+   select SND_SIMPLE_CARD_UTILS
+   help
+ This option enables generic simple Graph SCU sound card support.
+ It supports DPCM of multi CPU single Codec ststem.
diff --git a/sound/soc/generic/Makefile b/sound/soc/generic/Makefile
index 94eb6f1..fd75b55 100644
--- a/sound/soc/generic/Makefile
+++ b/sound/soc/generic/Makefile
@@ -2,8 +2,10 @@ snd-soc-simple-card-utils-objs := simple-card-utils.o
 snd-soc-simple-card-objs   := simple-card.o
 snd-soc-simple-scu-card-objs   := simple-scu-card.o
 snd-soc-simple-graph-card-objs := simple-graph-card.o
+snd-soc-simple-graph-scu-card-objs := simple-graph-scu-card.o
 
 obj-$(CONFIG_SND_SIMPLE_CARD_UTILS)+= snd-soc-simple-card-utils.o
 obj-$(CONFIG_SND_SIMPLE_CARD)  += snd-soc-simple-card.o
 obj-$(CONFIG_SND_SIMPLE_SCU_CARD)  += snd-soc-simple-scu-card.o
 obj-$(CONFIG_SND_SIMPLE_GRAPH_CARD)+= snd-soc-simple-graph-card.o
+obj-$(CONFIG_SND_SIMPLE_GRAPH_SCU_CARD)+= 
snd-soc-simple-graph-scu-card.o
diff --git a/sound/soc/generic/simple-graph-scu-card.c 
b/sound/soc/generic/simple-graph-scu-card.c
new file mode 100644
index 000..39a5019
--- /dev/null
+++ b/sound/soc/generic/simple-graph-scu-card.c
@@ -0,0 +1,417 @@
+/*
+ * ASoC simple graph SCU sound card support
+ *
+ * Copyright (C) 2016 Renesas Solutions Corp.
+ * Kuninori Morimoto 
+ *
+ * based on
+ * ${LINUX}/sound/soc/generic/simple-graph-card.c
+ * ${LINUX}/sound/soc/generic/simple-scu-card.c
+ *
+ * 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 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct simple_card_data {
+   struct snd_soc_card snd_card;
+   struct snd_soc_codec_conf codec_conf;
+   struct asoc_simple_dai *dai_props;
+   struct snd_soc_dai_link *dai_link;
+   u32 convert_rate;
+   u32 convert_channels;
+};
+
+#define simple_priv_to_dev(priv) ((priv)->snd_card.dev)
+#define simple_priv_to_link(priv, i) ((priv)->snd_card.dai_link + (i))
+#define simple_priv_to_props(priv, i) ((priv)->dai_props + (i))
+
+#define PREFIX "simple-audio-card,"
+
+static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
+{
+   struct snd_soc_pcm_runtime *rtd = substream->private_data;
+   struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
+   struct asoc_simple_dai *dai_props =
+   simple_priv_to_props(priv, rtd->num);
+
+   return clk_prepare_enable(dai_props->clk);
+}
+
+static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
+{
+   struct snd_soc_pcm_runtime *rtd = substream->private_data;
+   struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
+   struct asoc_simple_dai *dai_props =
+   simple_priv_to_props(priv, rtd->num);
+
+   clk_disable_unprepare(dai_props->clk);
+}
+
+static struct snd_soc_ops asoc_simple_card_ops = {
+   .startup = asoc_simple_card_startup,
+   .shutdown = asoc_simple_card_shutdown,
+};
+
+static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
+{
+   struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
+   struct snd_soc_dai *dai;
+   struct snd_soc_dai_link *dai_link;
+   struct asoc_simple_dai *dai_props;
+   int num = rtd->num;
+
+   dai_link= simple_priv_to_link(priv, num);
+   dai_props   = simple_priv_to_props(priv, num);
+   dai = dai_link->dynamic ?
+

[PATCH v3 17/17] ASoC: add simple-graph-scu-card support

2016-11-10 Thread Kuninori Morimoto

From: Kuninori Morimoto 

graph base DT binding are used on V4L2, and ALSA SoC is using different
style of DT. In case of simple case, ALSA SoC supports simple-card
driver.
In the future, V4L2 / ALSA will support HDMI, and then, DT bindings
between V4L2 / ALSA should be merged somehow.
Sometimes, we would like to use DPCM base simple-card on graph base DT.
This patch adds graph base DT binding of simple-scu-card

Signed-off-by: Kuninori Morimoto 
---
v2 -> v3

 - no change

 sound/soc/generic/Kconfig |   8 +
 sound/soc/generic/Makefile|   2 +
 sound/soc/generic/simple-graph-scu-card.c | 417 ++
 3 files changed, 427 insertions(+)
 create mode 100644 sound/soc/generic/simple-graph-scu-card.c

diff --git a/sound/soc/generic/Kconfig b/sound/soc/generic/Kconfig
index efefabd..fc11828 100644
--- a/sound/soc/generic/Kconfig
+++ b/sound/soc/generic/Kconfig
@@ -21,3 +21,11 @@ config SND_SIMPLE_GRAPH_CARD
select SND_SIMPLE_CARD_UTILS
help
  This option enables generic simple Graph sound card support
+
+config SND_SIMPLE_GRAPH_SCU_CARD
+   tristate "ASoC Simple Graph SCU sound card support"
+   depends on OF
+   select SND_SIMPLE_CARD_UTILS
+   help
+ This option enables generic simple Graph SCU sound card support.
+ It supports DPCM of multi CPU single Codec ststem.
diff --git a/sound/soc/generic/Makefile b/sound/soc/generic/Makefile
index 94eb6f1..fd75b55 100644
--- a/sound/soc/generic/Makefile
+++ b/sound/soc/generic/Makefile
@@ -2,8 +2,10 @@ snd-soc-simple-card-utils-objs := simple-card-utils.o
 snd-soc-simple-card-objs   := simple-card.o
 snd-soc-simple-scu-card-objs   := simple-scu-card.o
 snd-soc-simple-graph-card-objs := simple-graph-card.o
+snd-soc-simple-graph-scu-card-objs := simple-graph-scu-card.o
 
 obj-$(CONFIG_SND_SIMPLE_CARD_UTILS)+= snd-soc-simple-card-utils.o
 obj-$(CONFIG_SND_SIMPLE_CARD)  += snd-soc-simple-card.o
 obj-$(CONFIG_SND_SIMPLE_SCU_CARD)  += snd-soc-simple-scu-card.o
 obj-$(CONFIG_SND_SIMPLE_GRAPH_CARD)+= snd-soc-simple-graph-card.o
+obj-$(CONFIG_SND_SIMPLE_GRAPH_SCU_CARD)+= 
snd-soc-simple-graph-scu-card.o
diff --git a/sound/soc/generic/simple-graph-scu-card.c 
b/sound/soc/generic/simple-graph-scu-card.c
new file mode 100644
index 000..39a5019
--- /dev/null
+++ b/sound/soc/generic/simple-graph-scu-card.c
@@ -0,0 +1,417 @@
+/*
+ * ASoC simple graph SCU sound card support
+ *
+ * Copyright (C) 2016 Renesas Solutions Corp.
+ * Kuninori Morimoto 
+ *
+ * based on
+ * ${LINUX}/sound/soc/generic/simple-graph-card.c
+ * ${LINUX}/sound/soc/generic/simple-scu-card.c
+ *
+ * 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 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+struct simple_card_data {
+   struct snd_soc_card snd_card;
+   struct snd_soc_codec_conf codec_conf;
+   struct asoc_simple_dai *dai_props;
+   struct snd_soc_dai_link *dai_link;
+   u32 convert_rate;
+   u32 convert_channels;
+};
+
+#define simple_priv_to_dev(priv) ((priv)->snd_card.dev)
+#define simple_priv_to_link(priv, i) ((priv)->snd_card.dai_link + (i))
+#define simple_priv_to_props(priv, i) ((priv)->dai_props + (i))
+
+#define PREFIX "simple-audio-card,"
+
+static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
+{
+   struct snd_soc_pcm_runtime *rtd = substream->private_data;
+   struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
+   struct asoc_simple_dai *dai_props =
+   simple_priv_to_props(priv, rtd->num);
+
+   return clk_prepare_enable(dai_props->clk);
+}
+
+static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
+{
+   struct snd_soc_pcm_runtime *rtd = substream->private_data;
+   struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
+   struct asoc_simple_dai *dai_props =
+   simple_priv_to_props(priv, rtd->num);
+
+   clk_disable_unprepare(dai_props->clk);
+}
+
+static struct snd_soc_ops asoc_simple_card_ops = {
+   .startup = asoc_simple_card_startup,
+   .shutdown = asoc_simple_card_shutdown,
+};
+
+static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
+{
+   struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
+   struct snd_soc_dai *dai;
+   struct snd_soc_dai_link *dai_link;
+   struct asoc_simple_dai *dai_props;
+   int num = rtd->num;
+
+   dai_link= simple_priv_to_link(priv, num);
+   dai_props   = simple_priv_to_props(priv, num);
+   dai = dai_link->dynamic ?
+   rtd->cpu_dai :
+   rtd->codec_dai;
+
+   return