All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert
@ 2015-03-16  4:39 Kuninori Morimoto
  2015-03-16  4:44 ` [PATCH 01/12 v2] ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver Kuninori Morimoto
                   ` (11 more replies)
  0 siblings, 12 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:39 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju


Hi Mark

These are v2 of DPCM based sampling rate convert support patch-set for Rensas
sound driver. Then, it doesn't use simple-card. it uses new Renesas specific
sound card driver, but it is copied from simple-card.

 1 -  2 : prepare patch for Renesas new sound card driver
 3 -  4 : new Renesas sound card driver
 5      : tidyup for ak4642
 6 - 10 : fixup/tidyup patches for rsnd
11 - 12 : DPCM support patch for rsnd

Kuninori Morimoto (12):
       1) ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver
       2) ASoC: core: add snd_soc_get_dai_info() to get driver infomation
       3) ASoC: rsnd-dpcm-card: add Renesas sound card support for DPCM
       4) ASoC: rsnd-dpcm-card: add .be_hw_params_fixup support for convert rate
       5) ASoC: ak4642: tidyup DAPM route for playback
       6) ASoC: rsnd: no more SSI restart when unusual situation
       7) ASoC: rsnd: no more SRC restart when unusual situation
       8) ASoC: rsnd: tidyup error message format
       9) ASoC: rsnd: show debug info for sampling rate convert
      10) ASoC: rsnd: don't call clk_prepare_enable/unprepare() from inside spin lock
      11) ASoC: rsnd: add dai_link stream name
      12) ASoC: rsnd: add DPCM based sampling rate convert

 Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt |  72 ++++++++++++++
 include/sound/soc.h                                                |   6 +-
 sound/soc/codecs/ak4642.c                                          |   4 +-
 sound/soc/sh/Kconfig                                               |   5 +
 sound/soc/sh/rcar/Makefile                                         |   5 +-
 sound/soc/sh/rcar/adg.c                                            |   2 +
 sound/soc/sh/rcar/core.c                                           |  48 ++++++++-
 sound/soc/sh/rcar/dvc.c                                            |  12 +--
 sound/soc/sh/rcar/rsnd-dpcm-card.c                                 | 496 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 sound/soc/sh/rcar/rsnd.h                                           |  16 ++-
 sound/soc/sh/rcar/src.c                                            |  63 ++++++++++--
 sound/soc/sh/rcar/ssi.c                                            |  31 ++++--
 sound/soc/soc-core.c                                               |  71 ++++++++------
 13 files changed, 765 insertions(+), 66 deletions(-)

Best regards
---
Kuninori Morimoto
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

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

* [PATCH 01/12 v2] ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
@ 2015-03-16  4:44 ` Kuninori Morimoto
  2015-03-18  9:03   ` Lars-Peter Clausen
  2015-03-16  4:45 ` [PATCH 02/12 v2] ASoC: core: add snd_soc_get_dai_info() to get driver infomation Kuninori Morimoto
                   ` (10 subsequent siblings)
  11 siblings, 1 reply; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:44 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

No one is using .of_xlate_dai_name for DT,
Let's remove it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 include/sound/soc.h  |  3 ---
 sound/soc/soc-core.c | 48 +++++++++++++++++++++---------------------------
 2 files changed, 21 insertions(+), 30 deletions(-)

diff --git a/include/sound/soc.h b/include/sound/soc.h
index bc6cfab..235db71 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -713,9 +713,6 @@ struct snd_soc_component_driver {
 	void (*remove)(struct snd_soc_component *);
 
 	/* DT */
-	int (*of_xlate_dai_name)(struct snd_soc_component *component,
-				 struct of_phandle_args *args,
-				 const char **dai_name);
 	void (*seq_notifier)(struct snd_soc_component *, enum snd_soc_dapm_type,
 		int subseq);
 	int (*stream_event)(struct snd_soc_component *, int event);
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index a85bd42..3a68f13 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -3462,39 +3462,33 @@ static int snd_soc_get_dai_name(struct of_phandle_args *args,
 
 	mutex_lock(&client_mutex);
 	list_for_each_entry(pos, &component_list, list) {
+		int id = -1;
+
 		if (pos->dev->of_node != args->np)
 			continue;
 
-		if (pos->driver->of_xlate_dai_name) {
-			ret = pos->driver->of_xlate_dai_name(pos,
-							     args,
-							     dai_name);
-		} else {
-			int id = -1;
-
-			switch (args->args_count) {
-			case 0:
-				id = 0; /* same as dai_drv[0] */
-				break;
-			case 1:
-				id = args->args[0];
-				break;
-			default:
-				/* not supported */
-				break;
-			}
+		switch (args->args_count) {
+		case 0:
+			id = 0; /* same as dai_drv[0] */
+			break;
+		case 1:
+			id = args->args[0];
+			break;
+		default:
+			/* not supported */
+			break;
+		}
 
-			if (id < 0 || id >= pos->num_dai) {
-				ret = -EINVAL;
-				continue;
-			}
+		if (id < 0 || id >= pos->num_dai) {
+			ret = -EINVAL;
+			continue;
+		}
 
-			ret = 0;
+		ret = 0;
 
-			*dai_name = pos->dai_drv[id].name;
-			if (!*dai_name)
-				*dai_name = pos->name;
-		}
+		*dai_name = pos->dai_drv[id].name;
+		if (!*dai_name)
+			*dai_name = pos->name;
 
 		break;
 	}
-- 
1.9.1

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

* [PATCH 02/12 v2] ASoC: core: add snd_soc_get_dai_info() to get driver infomation
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
  2015-03-16  4:44 ` [PATCH 01/12 v2] ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver Kuninori Morimoto
@ 2015-03-16  4:45 ` Kuninori Morimoto
  2015-03-16  4:45 ` [PATCH 03/12 v2] ASoC: rsnd-dpcm-card: add Renesas sound card support for DPCM Kuninori Morimoto
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:45 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

Sometimes sound card driver want to get cpu/codec driver information.
This patch adds snd_soc_get_dai_info() and enable it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 include/sound/soc.h  |  3 +++
 sound/soc/soc-core.c | 29 ++++++++++++++++++++++++-----
 2 files changed, 27 insertions(+), 5 deletions(-)

diff --git a/include/sound/soc.h b/include/sound/soc.h
index 235db71..709f058 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -1505,6 +1505,9 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
 				     const char *prefix,
 				     struct device_node **bitclkmaster,
 				     struct device_node **framemaster);
+int snd_soc_get_dai_info(struct of_phandle_args *args,
+			 struct snd_soc_component **cmpnt,
+			 struct snd_soc_dai_driver **dai_drv);
 int snd_soc_of_get_dai_name(struct device_node *of_node,
 			    const char **dai_name);
 int snd_soc_of_get_dai_link_codecs(struct device *dev,
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index 3a68f13..5b01505 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -3454,8 +3454,9 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
 }
 EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
 
-static int snd_soc_get_dai_name(struct of_phandle_args *args,
-				const char **dai_name)
+int snd_soc_get_dai_info(struct of_phandle_args *args,
+			 struct snd_soc_component **cmpnt,
+			 struct snd_soc_dai_driver **dai_drv)
 {
 	struct snd_soc_component *pos;
 	int ret = -EPROBE_DEFER;
@@ -3486,15 +3487,33 @@ static int snd_soc_get_dai_name(struct of_phandle_args *args,
 
 		ret = 0;
 
-		*dai_name = pos->dai_drv[id].name;
-		if (!*dai_name)
-			*dai_name = pos->name;
+		*cmpnt = pos;
+		*dai_drv = pos->dai_drv + id;
 
 		break;
 	}
 	mutex_unlock(&client_mutex);
 	return ret;
 }
+EXPORT_SYMBOL_GPL(snd_soc_get_dai_info);
+
+static int snd_soc_get_dai_name(struct of_phandle_args *args,
+				const char **dai_name)
+{
+	struct snd_soc_component *cmpnt;
+	struct snd_soc_dai_driver *dai_drv;
+	int ret;
+
+	ret = snd_soc_get_dai_info(args, &cmpnt, &dai_drv);
+	if (ret)
+		return ret;
+
+	*dai_name = dai_drv->name;
+	if (!*dai_name)
+		*dai_name = cmpnt->name;
+
+	return ret;
+}
 
 int snd_soc_of_get_dai_name(struct device_node *of_node,
 			    const char **dai_name)
-- 
1.9.1

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

* [PATCH 03/12 v2] ASoC: rsnd-dpcm-card: add Renesas sound card support for DPCM
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
  2015-03-16  4:44 ` [PATCH 01/12 v2] ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver Kuninori Morimoto
  2015-03-16  4:45 ` [PATCH 02/12 v2] ASoC: core: add snd_soc_get_dai_info() to get driver infomation Kuninori Morimoto
@ 2015-03-16  4:45 ` Kuninori Morimoto
  2015-03-18  9:05   ` Lars-Peter Clausen
  2015-03-16  4:45 ` [PATCH 04/12 v2] ASoC: rsnd-dpcm-card: add .be_hw_params_fixup support for convert rate Kuninori Morimoto
                   ` (8 subsequent siblings)
  11 siblings, 1 reply; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:45 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

Renesas sound card has "sampling rate convert" feature which
should be implemented via DPCM.
But, sound card driver point of view, it is difficult to add
this DPCM feature on simple-card driver. Especially, DT binding
support is very difficult.

This patch implements DPCM feature on DT as Renesas specific sound card.
This new driver is copied from current simple-card driver.
Main difference between simple-card and this driver are...
 1. removed unused feature from simple-card
 2. removed driver named prefix from DT property
 3. CPU will be FE, CODEC will be BE with snd-soc-dummy
 4. it supports sampling rate convert via .be_hw_params_fixup

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - tidyuped CPU/CODEC method

 .../bindings/sound/renesas,rsnd-dpcm-card.txt      |  71 ++++
 sound/soc/sh/Kconfig                               |   5 +
 sound/soc/sh/rcar/Makefile                         |   5 +-
 sound/soc/sh/rcar/rsnd-dpcm-card.c                 | 473 +++++++++++++++++++++
 4 files changed, 553 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt
 create mode 100644 sound/soc/sh/rcar/rsnd-dpcm-card.c

diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt
new file mode 100644
index 0000000..c79fe72
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt
@@ -0,0 +1,71 @@
+Renesas DPCM sound card:
+
+Renesas DPCM sound card specifies audio DAI connections of SoC <-> codec.
+
+Required properties:
+
+- compatible				: "renesas-dpcm-audio-card"
+
+Optional properties:
+
+- card_name				: User specified audio sound card name, one string
+					  property.
+- routing				: A list of the connections between audio components.
+					  Each entry is a pair of strings, the first being the
+					  connection's sink, the second being the connection's
+					  source.
+- cpu					: CPU   sub-node
+- codec					: CODEC sub-node
+
+Optional subnode properties:
+
+- format				: CPU/CODEC common audio format.
+					  "i2s", "right_j", "left_j" , "dsp_a"
+					  "dsp_b", "ac97", "pdm", "msb", "lsb"
+- frame-master				: Indicates dai-link frame master.
+					  phandle to a cpu or codec subnode.
+- bitclock-master			: Indicates dai-link bit clock master.
+					  phandle to a cpu or codec subnode.
+- bitclock-inversion			: bool property. Add this if the
+					  dai-link uses bit clock inversion.
+- frame-inversion			: bool property. Add this if the
+					  dai-link uses frame clock inversion.
+
+Required CPU/CODEC subnodes properties:
+
+- sound-dai				: phandle and port of CPU/CODEC
+
+Optional CPU/CODEC subnodes properties:
+
+- clocks / system-clock-frequency	: specify subnode's clock if needed.
+					  it can be specified via "clocks" if system has
+					  clock node (= common clock), or "system-clock-frequency"
+					  (if system doens't support common clock)
+					  If a clock is specified, it is
+					  enabled with clk_prepare_enable()
+					  in dai startup() and disabled with
+					  clk_disable_unprepare() in dai
+					  shutdown().
+
+Example
+
+sound {
+	compatible = "renesas-dpcm-audio-card";
+
+	card-name = "rsnd-ak4643";
+	format = "left_j";
+	bitclock-master = <&sndcodec>;
+	frame-master = <&sndcodec>;
+
+	routing = "ak4642-hifi Playback", "DAI0 Playback",
+		  "DAI0 Capture", "ak4642-hifi Capture";
+
+	sndcpu: cpu {
+		sound-dai = <&rcar_sound>;
+	};
+
+	sndcodec: codec {
+		sound-dai = <&ak4643>;
+		system-clock-frequency = <11289600>;
+	};
+};
diff --git a/sound/soc/sh/Kconfig b/sound/soc/sh/Kconfig
index 80245b6..fa12924 100644
--- a/sound/soc/sh/Kconfig
+++ b/sound/soc/sh/Kconfig
@@ -41,6 +41,11 @@ config SND_SOC_RCAR
 	help
 	  This option enables R-Car SUR/SCU/SSIU/SSI sound support
 
+config SND_SOC_RSND_DPCM_CARD
+	tristate "Renesas sound card support for DPCM"
+	help
+	  This option enables simple sound if you need sampling rate convert
+
 ##
 ## Boards
 ##
diff --git a/sound/soc/sh/rcar/Makefile b/sound/soc/sh/rcar/Makefile
index 7b20492..fc3448a 100644
--- a/sound/soc/sh/rcar/Makefile
+++ b/sound/soc/sh/rcar/Makefile
@@ -1,2 +1,5 @@
 snd-soc-rcar-objs	:= core.o gen.o dma.o src.o adg.o ssi.o dvc.o
-obj-$(CONFIG_SND_SOC_RCAR)	+= snd-soc-rcar.o
\ No newline at end of file
+obj-$(CONFIG_SND_SOC_RCAR)	+= snd-soc-rcar.o
+
+snd-soc-rsnd-dpcm-card-objs	:= rsnd-dpcm-card.o
+obj-$(CONFIG_SND_SOC_RSND_DPCM_CARD)	+= snd-soc-rsnd-dpcm-card.o
diff --git a/sound/soc/sh/rcar/rsnd-dpcm-card.c b/sound/soc/sh/rcar/rsnd-dpcm-card.c
new file mode 100644
index 0000000..3381b9e
--- /dev/null
+++ b/sound/soc/sh/rcar/rsnd-dpcm-card.c
@@ -0,0 +1,473 @@
+/*
+ * Renesas sound card support for DPCM
+ *
+ * Copyright (C) 2015 Renesas Solutions Corp.
+ * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
+ *
+ * based on ${LINUX}/sound/soc/generic/simple-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 <linux/clk.h>
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/string.h>
+#include <sound/jack.h>
+#include <sound/soc.h>
+#include <sound/soc-dai.h>
+
+struct rdpcm_dai {
+	const char *name;
+	unsigned int fmt;
+	unsigned int sysclk;
+	struct clk *clk;
+};
+
+#define RDPCM_FB_NUM	2 /* FE/BE */
+#define IDX_CPU		0
+#define IDX_CODEC	1
+struct rdpcm_card_data {
+	struct snd_soc_card snd_card;
+	struct rdpcm_dai_props {
+		struct rdpcm_dai cpu_dai;
+		struct rdpcm_dai codec_dai;
+	} dai_props[RDPCM_FB_NUM];
+	struct snd_soc_codec_conf codec_conf;
+	struct snd_soc_dai_link dai_link[RDPCM_FB_NUM];
+};
+
+#define rdpcm_priv_to_dev(priv) ((priv)->snd_card.dev)
+#define rdpcm_priv_to_link(priv, i) ((priv)->snd_card.dai_link + i)
+#define rdpcm_priv_to_props(priv, i) ((priv)->dai_props + i)
+
+static int rdpcm_card_startup(struct snd_pcm_substream *substream)
+{
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct rdpcm_card_data *priv =	snd_soc_card_get_drvdata(rtd->card);
+	struct rdpcm_dai_props *dai_props =
+		&priv->dai_props[rtd - rtd->card->rtd];
+	int ret;
+
+	ret = clk_prepare_enable(dai_props->cpu_dai.clk);
+	if (ret)
+		return ret;
+
+	ret = clk_prepare_enable(dai_props->codec_dai.clk);
+	if (ret)
+		clk_disable_unprepare(dai_props->cpu_dai.clk);
+
+	return ret;
+}
+
+static void rdpcm_card_shutdown(struct snd_pcm_substream *substream)
+{
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct rdpcm_card_data *priv =	snd_soc_card_get_drvdata(rtd->card);
+	struct rdpcm_dai_props *dai_props =
+		&priv->dai_props[rtd - rtd->card->rtd];
+
+	clk_disable_unprepare(dai_props->cpu_dai.clk);
+
+	clk_disable_unprepare(dai_props->codec_dai.clk);
+}
+
+static struct snd_soc_ops rdpcm_card_ops = {
+	.startup = rdpcm_card_startup,
+	.shutdown = rdpcm_card_shutdown,
+};
+
+static int __rdpcm_card_dai_init(struct snd_soc_dai *dai,
+				       struct rdpcm_dai *set)
+{
+	int ret;
+
+	if (set->fmt) {
+		ret = snd_soc_dai_set_fmt(dai, set->fmt);
+		if (ret && ret != -ENOTSUPP) {
+			dev_err(dai->dev, "rdpcm-card: set_fmt error\n");
+			goto err;
+		}
+	}
+
+	if (set->sysclk) {
+		ret = snd_soc_dai_set_sysclk(dai, 0, set->sysclk, 0);
+		if (ret && ret != -ENOTSUPP) {
+			dev_err(dai->dev, "rdpcm-card: set_sysclk error\n");
+			goto err;
+		}
+	}
+
+	ret = 0;
+
+err:
+	return ret;
+}
+
+static int rdpcm_card_dai_init(struct snd_soc_pcm_runtime *rtd)
+{
+	struct rdpcm_card_data *priv =	snd_soc_card_get_drvdata(rtd->card);
+	struct snd_soc_dai *codec = rtd->codec_dai;
+	struct snd_soc_dai *cpu = rtd->cpu_dai;
+	struct rdpcm_dai_props *dai_props;
+	int num, ret;
+
+	num = rtd - rtd->card->rtd;
+	dai_props = &priv->dai_props[num];
+	ret = __rdpcm_card_dai_init(codec, &dai_props->codec_dai);
+	if (ret < 0)
+		return ret;
+
+	ret = __rdpcm_card_dai_init(cpu, &dai_props->cpu_dai);
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+static int
+rdpcm_card_sub_parse_of(struct rdpcm_card_data *priv,
+			struct device_node *np,
+			struct rdpcm_dai *dai,
+			struct snd_soc_dai_link *dai_link,
+			int *args_count)
+{
+	struct of_phandle_args args;
+	struct device_node **p_node;
+	struct snd_soc_component *cmpnt;
+	struct snd_soc_dai_driver *dai_drv;
+	struct clk *clk;
+	const char **dai_name;
+	const char **name;
+	u32 val;
+	int ret;
+
+	if (args_count) {
+		p_node		= &dai_link->cpu_of_node;
+		dai_name	= &dai_link->cpu_dai_name;
+		name		= &dai_link->cpu_name;
+	} else {
+		p_node		= &dai_link->codec_of_node;
+		dai_name	= &dai_link->codec_dai_name;
+		name		= &dai_link->codec_name;
+	}
+
+	if (!np) {
+		/* use snd-soc-dummy */
+		*p_node		= NULL;
+		*dai_name	= "snd-soc-dummy-dai";
+		*name		= "snd-soc-dummy";
+		return 0;
+	}
+
+	/*
+	 * Get node via "sound-dai = <&phandle port>"
+	 * it will be used as xxx_of_node on soc_bind_dai_link()
+	 */
+	ret = of_parse_phandle_with_args(np, "sound-dai",
+					 "#sound-dai-cells", 0, &args);
+	if (ret)
+		return ret;
+
+	*p_node = args.np;
+
+	/* Get dai->name */
+	ret = snd_soc_get_dai_info(&args, &cmpnt, &dai_drv);
+	if (ret < 0)
+		return ret;
+	*dai_name = dai_drv->name;
+	if (!*dai_name)
+		*dai_name = cmpnt->name;
+
+	/* for DPCM */
+	if (dai_drv->playback.stream_name)
+		dai_link->dpcm_playback = 1;
+	if (dai_drv->capture.stream_name)
+		dai_link->dpcm_capture = 1;
+
+	if (args_count) {
+		*args_count = args.args_count;
+		dai_link->dynamic = 1;
+	} else {
+		dai_link->no_pcm = 1;
+		priv->codec_conf.of_node = (*p_node);
+		priv->codec_conf.name_prefix = dai_drv->name;
+	}
+
+	/*
+	 * Parse dai->sysclk come from "clocks = <&xxx>"
+	 * (if system has common clock)
+	 *  or "system-clock-frequency = <xxx>"
+	 *  or device's module clock.
+	 */
+	if (of_property_read_bool(np, "clocks")) {
+		clk = of_clk_get(np, 0);
+		if (IS_ERR(clk)) {
+			ret = PTR_ERR(clk);
+			return ret;
+		}
+
+		dai->sysclk = clk_get_rate(clk);
+		dai->clk = clk;
+	} else if (!of_property_read_u32(np, "system-clock-frequency", &val)) {
+		dai->sysclk = val;
+	} else {
+		clk = of_clk_get(args.np, 0);
+		if (!IS_ERR(clk))
+			dai->sysclk = clk_get_rate(clk);
+	}
+
+	return 0;
+}
+
+static int rdpcm_card_parse_daifmt(struct device_node *node,
+					struct rdpcm_card_data *priv,
+					struct device_node *codec,
+					int idx)
+{
+	struct device_node *bitclkmaster = NULL;
+	struct device_node *framemaster = NULL;
+	struct rdpcm_dai_props *dai_props = rdpcm_priv_to_props(priv, idx);
+	struct rdpcm_dai *cpu_dai = &dai_props->cpu_dai;
+	struct rdpcm_dai *codec_dai = &dai_props->codec_dai;
+	unsigned int daifmt;
+
+	daifmt = snd_soc_of_parse_daifmt(node, NULL,
+					 &bitclkmaster, &framemaster);
+	daifmt &= ~SND_SOC_DAIFMT_MASTER_MASK;
+
+	if (!bitclkmaster && !framemaster)
+		return -EINVAL;
+
+	if (codec == bitclkmaster)
+		daifmt |= (codec == framemaster) ?
+			SND_SOC_DAIFMT_CBM_CFM : SND_SOC_DAIFMT_CBM_CFS;
+	else
+		daifmt |= (codec == framemaster) ?
+			SND_SOC_DAIFMT_CBS_CFM : SND_SOC_DAIFMT_CBS_CFS;
+
+	cpu_dai->fmt	= daifmt;
+	codec_dai->fmt	= daifmt;
+
+	of_node_put(bitclkmaster);
+	of_node_put(framemaster);
+
+	return 0;
+}
+
+static int rdpcm_card_dai_link_of(struct device_node *node,
+				  struct rdpcm_card_data *priv,
+				  int idx)
+{
+	struct device *dev = rdpcm_priv_to_dev(priv);
+	struct snd_soc_dai_link *dai_link = rdpcm_priv_to_link(priv, idx);
+	struct rdpcm_dai_props *dai_props = rdpcm_priv_to_props(priv, idx);
+	struct device_node *cpu = NULL;
+	struct device_node *codec = NULL;
+	char *name;
+	char prop[128];
+	int ret, cpu_args;
+
+	cpu = of_get_child_by_name(node, "cpu");
+	codec = of_get_child_by_name(node, "codec");
+
+	if (!cpu || !codec) {
+		ret = -EINVAL;
+		dev_err(dev, "%s: Can't find %s DT node\n", __func__, prop);
+		goto dai_link_of_err;
+	}
+
+	ret = rdpcm_card_parse_daifmt(node, priv, codec, idx);
+	if (ret < 0)
+		goto dai_link_of_err;
+
+	ret = rdpcm_card_sub_parse_of(priv, (idx == IDX_CPU) ? cpu : NULL,
+				      &dai_props->cpu_dai,
+				      dai_link,
+				      &cpu_args);
+	if (ret < 0)
+		goto dai_link_of_err;
+
+	ret = rdpcm_card_sub_parse_of(priv, (idx == IDX_CODEC) ? codec : NULL,
+				      &dai_props->codec_dai,
+				      dai_link,
+				      NULL);
+	if (ret < 0)
+		goto dai_link_of_err;
+
+	if (!dai_link->cpu_dai_name || !dai_link->codec_dai_name) {
+		ret = -EINVAL;
+		goto dai_link_of_err;
+	}
+
+	/* Simple Card assumes platform == cpu */
+	dai_link->platform_of_node = dai_link->cpu_of_node;
+
+	/* DAI link name is created from CPU/CODEC dai name */
+	name = devm_kzalloc(dev,
+			    strlen(dai_link->cpu_dai_name)   +
+			    strlen(dai_link->codec_dai_name) + 2,
+			    GFP_KERNEL);
+	if (!name) {
+		ret = -ENOMEM;
+		goto dai_link_of_err;
+	}
+
+	sprintf(name, "%s-%s", dai_link->cpu_dai_name,
+				dai_link->codec_dai_name);
+	dai_link->name = dai_link->stream_name = name;
+	dai_link->ops = &rdpcm_card_ops;
+	dai_link->init = rdpcm_card_dai_init;
+
+	dev_dbg(dev, "\tname : %s\n", dai_link->stream_name);
+	dev_dbg(dev, "\tcpu : %s / %04x / %d\n",
+		dai_link->cpu_dai_name,
+		dai_props->cpu_dai.fmt,
+		dai_props->cpu_dai.sysclk);
+	dev_dbg(dev, "\tcodec : %s / %04x / %d\n",
+		dai_link->codec_dai_name,
+		dai_props->codec_dai.fmt,
+		dai_props->codec_dai.sysclk);
+
+	/*
+	 * In soc_bind_dai_link() will check cpu name after
+	 * of_node matching if dai_link has cpu_dai_name.
+	 * but, it will never match if name was created by
+	 * fmt_single_name() remove cpu_dai_name if cpu_args
+	 * was 0. See:
+	 *	fmt_single_name()
+	 *	fmt_multiple_name()
+	 */
+	if (!cpu_args)
+		dai_link->cpu_dai_name = NULL;
+
+dai_link_of_err:
+	of_node_put(cpu);
+	of_node_put(codec);
+
+	return ret;
+}
+
+static int rdpcm_card_parse_of(struct device_node *node,
+				     struct rdpcm_card_data *priv)
+{
+	struct device *dev = rdpcm_priv_to_dev(priv);
+	int ret;
+	int i;
+
+	if (!node)
+		return -EINVAL;
+
+	/* Parse the card name from DT */
+	snd_soc_of_parse_card_name(&priv->snd_card, "card-name");
+
+	/* DAPM routes */
+	if (of_property_read_bool(node, "routing")) {
+		ret = snd_soc_of_parse_audio_routing(&priv->snd_card,
+					"routing");
+		if (ret)
+			return ret;
+	}
+
+	dev_dbg(dev, "New rsnd-dpcm-card: %s\n", priv->snd_card.name ?
+		priv->snd_card.name : "");
+
+	/* FE/BE */
+	for (i = 0; i < RDPCM_FB_NUM; i++) {
+		ret = rdpcm_card_dai_link_of(node, priv, i);
+		if (ret < 0)
+			return ret;
+	}
+
+	if (!priv->snd_card.name)
+		priv->snd_card.name = priv->snd_card.dai_link->name;
+
+	return 0;
+}
+
+/* Decrease the reference count of the device nodes */
+static int rdpcm_card_unref(struct snd_soc_card *card)
+{
+	struct snd_soc_dai_link *dai_link;
+	int num_links;
+
+	for (num_links = 0, dai_link = card->dai_link;
+	     num_links < card->num_links;
+	     num_links++, dai_link++) {
+		of_node_put(dai_link->cpu_of_node);
+		of_node_put(dai_link->codec_of_node);
+	}
+	return 0;
+}
+
+static int rdpcm_card_probe(struct platform_device *pdev)
+{
+	struct rdpcm_card_data *priv;
+	struct snd_soc_dai_link *dai_link;
+	struct device_node *np = pdev->dev.of_node;
+	struct device *dev = &pdev->dev;
+	int ret;
+
+	/* Allocate the private data */
+	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
+	if (!priv)
+		return -ENOMEM;
+
+	/* Init snd_soc_card */
+	priv->snd_card.owner = THIS_MODULE;
+	priv->snd_card.dev = dev;
+	dai_link = priv->dai_link;
+	priv->snd_card.dai_link = dai_link;
+	priv->snd_card.num_links = RDPCM_FB_NUM;
+	priv->snd_card.codec_conf = &priv->codec_conf;
+	priv->snd_card.num_configs = 1;
+
+	ret = rdpcm_card_parse_of(np, priv);
+	if (ret < 0) {
+		if (ret != -EPROBE_DEFER)
+			dev_err(dev, "parse error %d\n", ret);
+		goto err;
+	}
+
+	snd_soc_card_set_drvdata(&priv->snd_card, priv);
+
+	ret = devm_snd_soc_register_card(&pdev->dev, &priv->snd_card);
+	if (ret >= 0)
+		return ret;
+err:
+	rdpcm_card_unref(&priv->snd_card);
+
+	return ret;
+}
+
+static int rdpcm_card_remove(struct platform_device *pdev)
+{
+	struct snd_soc_card *card = platform_get_drvdata(pdev);
+
+	return rdpcm_card_unref(card);
+}
+
+static const struct of_device_id rdpcm_of_match[] = {
+	{ .compatible = "renesas-dpcm-audio-card", },
+	{},
+};
+MODULE_DEVICE_TABLE(of, rdpcm_of_match);
+
+static struct platform_driver rdpcm_card = {
+	.driver = {
+		.name = "renesas-dpcm-card",
+		.of_match_table = rdpcm_of_match,
+	},
+	.probe = rdpcm_card_probe,
+	.remove = rdpcm_card_remove,
+};
+
+module_platform_driver(rdpcm_card);
+
+MODULE_ALIAS("platform:renesas-dpcm-card");
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Renesas Sound Card for DPCM");
+MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>");
-- 
1.9.1

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

* [PATCH 04/12 v2] ASoC: rsnd-dpcm-card: add .be_hw_params_fixup support for convert rate
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (2 preceding siblings ...)
  2015-03-16  4:45 ` [PATCH 03/12 v2] ASoC: rsnd-dpcm-card: add Renesas sound card support for DPCM Kuninori Morimoto
@ 2015-03-16  4:45 ` Kuninori Morimoto
  2015-03-16  4:45 ` [PATCH 05/12 v2] ASoC: ak4642: tidyup DAPM route for playback Kuninori Morimoto
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:45 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

Current rsnd-dpcm-card is supporting DPCM FE/BE sound card.
This patch adds .be_hw_params_fixup and enabled sampling convert rate.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 .../bindings/sound/renesas,rsnd-dpcm-card.txt      |  1 +
 sound/soc/sh/rcar/rsnd-dpcm-card.c                 | 27 ++++++++++++++++++++--
 2 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt b/Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt
index c79fe72..23b45d7 100644
--- a/Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt
+++ b/Documentation/devicetree/bindings/sound/renesas,rsnd-dpcm-card.txt
@@ -30,6 +30,7 @@ Optional subnode properties:
 					  dai-link uses bit clock inversion.
 - frame-inversion			: bool property. Add this if the
 					  dai-link uses frame clock inversion.
+- convert-rate				: platform specified sampling rate convert
 
 Required CPU/CODEC subnodes properties:
 
diff --git a/sound/soc/sh/rcar/rsnd-dpcm-card.c b/sound/soc/sh/rcar/rsnd-dpcm-card.c
index 3381b9e..c2f2a3c 100644
--- a/sound/soc/sh/rcar/rsnd-dpcm-card.c
+++ b/sound/soc/sh/rcar/rsnd-dpcm-card.c
@@ -38,6 +38,7 @@ struct rdpcm_card_data {
 	} dai_props[RDPCM_FB_NUM];
 	struct snd_soc_codec_conf codec_conf;
 	struct snd_soc_dai_link dai_link[RDPCM_FB_NUM];
+	u32 convert_rate;
 };
 
 #define rdpcm_priv_to_dev(priv) ((priv)->snd_card.dev)
@@ -128,6 +129,21 @@ static int rdpcm_card_dai_init(struct snd_soc_pcm_runtime *rtd)
 	return 0;
 }
 
+static int rdpcm_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
+					 struct snd_pcm_hw_params *params)
+{
+	struct rdpcm_card_data *priv =	snd_soc_card_get_drvdata(rtd->card);
+	struct snd_interval *rate = hw_param_interval(params,
+						      SNDRV_PCM_HW_PARAM_RATE);
+
+	if (!priv->convert_rate)
+		return 0;
+
+	rate->min = rate->max = priv->convert_rate;
+
+	return 0;
+}
+
 static int
 rdpcm_card_sub_parse_of(struct rdpcm_card_data *priv,
 			struct device_node *np,
@@ -322,6 +338,9 @@ static int rdpcm_card_dai_link_of(struct device_node *node,
 	dai_link->ops = &rdpcm_card_ops;
 	dai_link->init = rdpcm_card_dai_init;
 
+	if (idx == IDX_CODEC)
+		dai_link->be_hw_params_fixup = rdpcm_card_be_hw_params_fixup;
+
 	dev_dbg(dev, "\tname : %s\n", dai_link->stream_name);
 	dev_dbg(dev, "\tcpu : %s / %04x / %d\n",
 		dai_link->cpu_dai_name,
@@ -372,8 +391,12 @@ static int rdpcm_card_parse_of(struct device_node *node,
 			return ret;
 	}
 
-	dev_dbg(dev, "New rsnd-dpcm-card: %s\n", priv->snd_card.name ?
-		priv->snd_card.name : "");
+	/* sampling rate convert */
+	of_property_read_u32(node, "convert-rate", &priv->convert_rate);
+
+	dev_dbg(dev, "New rsnd-dpcm-card: %s (%d)\n",
+		priv->snd_card.name ? priv->snd_card.name : "",
+		priv->convert_rate);
 
 	/* FE/BE */
 	for (i = 0; i < RDPCM_FB_NUM; i++) {
-- 
1.9.1

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

* [PATCH 05/12 v2] ASoC: ak4642: tidyup DAPM route for playback
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (3 preceding siblings ...)
  2015-03-16  4:45 ` [PATCH 04/12 v2] ASoC: rsnd-dpcm-card: add .be_hw_params_fixup support for convert rate Kuninori Morimoto
@ 2015-03-16  4:45 ` Kuninori Morimoto
  2015-03-17 12:22   ` Mark Brown
  2015-03-16  4:46 ` [PATCH 06/12 v2] ASoC: rsnd: no more SSI restart when unusual situation Kuninori Morimoto
                   ` (6 subsequent siblings)
  11 siblings, 1 reply; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:45 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

It needs DAC -> Playback route instead of direct settings via
SND_SOC_DAPM_DAC. otherwise, it can't find correct path if
sound card used prefix name

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - new patch

 sound/soc/codecs/ak4642.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/sound/soc/codecs/ak4642.c b/sound/soc/codecs/ak4642.c
index dde8b49..7255f69 100644
--- a/sound/soc/codecs/ak4642.c
+++ b/sound/soc/codecs/ak4642.c
@@ -187,7 +187,7 @@ static const struct snd_soc_dapm_widget ak4642_dapm_widgets[] = {
 			   ARRAY_SIZE(ak4642_lout_mixer_controls)),
 
 	/* DAC */
-	SND_SOC_DAPM_DAC("DAC", "HiFi Playback", PW_MGMT1, 2, 0),
+	SND_SOC_DAPM_DAC("DAC", NULL, PW_MGMT1, 2, 0),
 };
 
 static const struct snd_soc_dapm_route ak4642_intercon[] = {
@@ -205,6 +205,8 @@ static const struct snd_soc_dapm_route ak4642_intercon[] = {
 	{"DACH", NULL, "DAC"},
 
 	{"LINEOUT Mixer", "DACL", "DAC"},
+
+	{ "DAC", NULL, "Playback" },
 };
 
 /*
-- 
1.9.1

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

* [PATCH 06/12 v2] ASoC: rsnd: no more SSI restart when unusual situation
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (4 preceding siblings ...)
  2015-03-16  4:45 ` [PATCH 05/12 v2] ASoC: ak4642: tidyup DAPM route for playback Kuninori Morimoto
@ 2015-03-16  4:46 ` Kuninori Morimoto
  2015-03-16  4:46 ` [PATCH 07/12 v2] ASoC: rsnd: no more SRC " Kuninori Morimoto
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:46 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

It will be SSI interrupt endless loop f unusual situation happen.
This patch adds restart limit for it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 sound/soc/sh/rcar/ssi.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index fea4aa5..060d3d2 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -416,11 +416,14 @@ static irqreturn_t rsnd_ssi_interrupt(int irq, void *data)
 		/*
 		 * restart SSI
 		 */
-		rsnd_ssi_stop(mod, priv);
-		rsnd_ssi_start(mod, priv);
-
 		dev_dbg(dev, "%s[%d] restart\n",
 			rsnd_mod_name(mod), rsnd_mod_id(mod));
+
+		rsnd_ssi_stop(mod, priv);
+		if (ssi->err < 1024)
+			rsnd_ssi_start(mod, priv);
+		else
+			dev_warn(dev, "no more SSI restart\n");
 	}
 
 	rsnd_ssi_record_error(ssi, status);
-- 
1.9.1

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

* [PATCH 07/12 v2] ASoC: rsnd: no more SRC restart when unusual situation
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (5 preceding siblings ...)
  2015-03-16  4:46 ` [PATCH 06/12 v2] ASoC: rsnd: no more SSI restart when unusual situation Kuninori Morimoto
@ 2015-03-16  4:46 ` Kuninori Morimoto
  2015-03-16  4:46 ` [PATCH 08/12 v2] ASoC: rsnd: tidyup error message format Kuninori Morimoto
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:46 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

It will be SRC interrupt endless loop f unusual situation happen.
This patch adds restart limit for it.

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 sound/soc/sh/rcar/src.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index 6ce8985..cc93f32 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -620,13 +620,17 @@ static irqreturn_t rsnd_src_interrupt_gen2(int irq, void *data)
 
 	if (rsnd_src_error_record_gen2(mod)) {
 		struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+		struct rsnd_src *src = rsnd_mod_to_src(mod);
 		struct device *dev = rsnd_priv_to_dev(priv);
 
-		_rsnd_src_stop_gen2(mod);
-		_rsnd_src_start_gen2(mod);
-
 		dev_dbg(dev, "%s[%d] restart\n",
 			rsnd_mod_name(mod), rsnd_mod_id(mod));
+
+		_rsnd_src_stop_gen2(mod);
+		if (src->err < 1024)
+			_rsnd_src_start_gen2(mod);
+		else
+			dev_warn(dev, "no more SRC restart\n");
 	}
 
 	return IRQ_HANDLED;
-- 
1.9.1

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

* [PATCH 08/12 v2] ASoC: rsnd: tidyup error message format
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (6 preceding siblings ...)
  2015-03-16  4:46 ` [PATCH 07/12 v2] ASoC: rsnd: no more SRC " Kuninori Morimoto
@ 2015-03-16  4:46 ` Kuninori Morimoto
  2015-03-16  4:46 ` [PATCH 09/12 v2] ASoC: rsnd: show debug info for sampling rate convert Kuninori Morimoto
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:46 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

This driver sometimes fixups debug/error message format
30cc4faf703955cd5cd07da489bd817ae43e3fec
(ASoC: rsnd: tidyup debug message format and timing)
337b0b4c5f415705f1b97df57cecfac45903449a
(ASoC: rsnd: error meesage indicates its port)
But, it still exist un-fomated error message. This patch fixup it

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 sound/soc/sh/rcar/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index be03474..54042d9 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -232,7 +232,7 @@ static int rsnd_dai_connect(struct rsnd_mod *mod,
 		struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
 		struct device *dev = rsnd_priv_to_dev(priv);
 
-		dev_err(dev, "%s%d is not empty\n",
+		dev_err(dev, "%s[%d] is not empty\n",
 			rsnd_mod_name(mod),
 			rsnd_mod_id(mod));
 		return -EIO;
-- 
1.9.1

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

* [PATCH 09/12 v2] ASoC: rsnd: show debug info for sampling rate convert
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (7 preceding siblings ...)
  2015-03-16  4:46 ` [PATCH 08/12 v2] ASoC: rsnd: tidyup error message format Kuninori Morimoto
@ 2015-03-16  4:46 ` Kuninori Morimoto
  2015-03-16  4:47 ` [PATCH 10/12 v2] ASoC: rsnd: don't call clk_prepare_enable/unprepare() from inside spin lock Kuninori Morimoto
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:46 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 sound/soc/sh/rcar/adg.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 7ac35c9..7af374b 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -183,6 +183,8 @@ int rsnd_adg_set_convert_clk_gen2(struct rsnd_mod *mod,
 
 	rsnd_mod_bset(mod, DIV_EN, en, en);
 
+	dev_dbg(dev, "convert rate %d <-> %d\n", src_rate, dst_rate);
+
 	return 0;
 }
 
-- 
1.9.1

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

* [PATCH 10/12 v2] ASoC: rsnd: don't call clk_prepare_enable/unprepare() from inside spin lock
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (8 preceding siblings ...)
  2015-03-16  4:46 ` [PATCH 09/12 v2] ASoC: rsnd: show debug info for sampling rate convert Kuninori Morimoto
@ 2015-03-16  4:47 ` Kuninori Morimoto
  2015-03-16  4:47 ` [PATCH 11/12 v2] ASoC: rsnd: add dai_link stream name Kuninori Morimoto
  2015-03-16  4:47 ` [PATCH 12/12 v2] ASoC: rsnd: add DPCM based sampling rate convert Kuninori Morimoto
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:47 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

clk_prepare_enable/unprepare() uses mutex inside, and it uses __schedule().
Then, raw_spin_lock/unlock_irq() is called, and it breaks Renesas
sound driver's spin lock irq.
This patch moves clk_prepare_enable/unprepare to out of spin lock area.
Special thanks to Das Biju.

Reported-by: Das Biju <biju.das@bp.renesas.com>
Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 sound/soc/sh/rcar/core.c | 29 ++++++++++++++++++++++++++++-
 sound/soc/sh/rcar/dvc.c  | 12 +-----------
 sound/soc/sh/rcar/rsnd.h |  9 +++++++--
 sound/soc/sh/rcar/src.c  |  6 ++----
 sound/soc/sh/rcar/ssi.c  | 22 ++++++++++++++++++----
 5 files changed, 56 insertions(+), 22 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 54042d9..e6c1c7a4 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -190,7 +190,7 @@ u32 rsnd_get_adinr(struct rsnd_mod *mod)
 ({								\
 	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);		\
 	struct device *dev = rsnd_priv_to_dev(priv);		\
-	u32 mask = 1 << __rsnd_mod_shift_##func;			\
+	u32 mask = (1 << __rsnd_mod_shift_##func) & ~(1 << 31);		\
 	u32 call = __rsnd_mod_call_##func << __rsnd_mod_shift_##func;	\
 	int ret = 0;							\
 	if ((mod->status & mask) == call) {				\
@@ -222,6 +222,27 @@ u32 rsnd_get_adinr(struct rsnd_mod *mod)
 	ret;							\
 })
 
+int rsnd_mod_clk(struct rsnd_mod *mod, int enable)
+{
+	struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
+	struct device *dev = rsnd_priv_to_dev(priv);
+
+	/*
+	 * clk_prepare_enable/unprepare() should not be called
+	 * from inside spin lock
+	 */
+	if (enable)
+		clk_prepare_enable(mod->clk);
+	else
+		clk_disable_unprepare(mod->clk);
+
+	dev_dbg(dev, "%s[%d] clk %s\n",
+		rsnd_mod_name(mod), rsnd_mod_id(mod),
+		enable ? "ON" : "OFF");
+
+	return 0;
+}
+
 static int rsnd_dai_connect(struct rsnd_mod *mod,
 			    struct rsnd_dai_stream *io)
 {
@@ -345,6 +366,9 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 	int ret;
 	unsigned long flags;
 
+	if (cmd == SNDRV_PCM_TRIGGER_START)
+		rsnd_dai_call(clk, io, 1);
+
 	rsnd_lock(priv, flags);
 
 	switch (cmd) {
@@ -385,6 +409,9 @@ static int rsnd_soc_dai_trigger(struct snd_pcm_substream *substream, int cmd,
 dai_trigger_end:
 	rsnd_unlock(priv, flags);
 
+	if (cmd == SNDRV_PCM_TRIGGER_STOP)
+		rsnd_dai_call(clk, io, 0);
+
 	return ret;
 }
 
diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
index aeeef13..9420349 100644
--- a/sound/soc/sh/rcar/dvc.c
+++ b/sound/soc/sh/rcar/dvc.c
@@ -166,8 +166,6 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
 		return -EINVAL;
 	}
 
-	rsnd_mod_hw_start(dvc_mod);
-
 	/*
 	 * fixme
 	 * it doesn't support CTU/MIX
@@ -191,14 +189,6 @@ static int rsnd_dvc_init(struct rsnd_mod *dvc_mod,
 	return 0;
 }
 
-static int rsnd_dvc_quit(struct rsnd_mod *mod,
-			 struct rsnd_priv *priv)
-{
-	rsnd_mod_hw_stop(mod);
-
-	return 0;
-}
-
 static int rsnd_dvc_start(struct rsnd_mod *mod,
 			  struct rsnd_priv *priv)
 {
@@ -286,9 +276,9 @@ static struct rsnd_mod_ops rsnd_dvc_ops = {
 	.probe		= rsnd_dvc_probe_gen2,
 	.remove		= rsnd_dvc_remove_gen2,
 	.init		= rsnd_dvc_init,
-	.quit		= rsnd_dvc_quit,
 	.start		= rsnd_dvc_start,
 	.stop		= rsnd_dvc_stop,
+	.clk		= rsnd_mod_clk,
 	.pcm_new	= rsnd_dvc_pcm_new,
 };
 
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 52c401c..40a12f4 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -237,6 +237,7 @@ struct rsnd_mod_ops {
 		     struct rsnd_priv *priv);
 	int (*stop)(struct rsnd_mod *mod,
 		    struct rsnd_priv *priv);
+	int (*clk)(struct rsnd_mod *mod, int enable);
 	int (*pcm_new)(struct rsnd_mod *mod,
 		       struct snd_soc_pcm_runtime *rtd);
 	int (*fallback)(struct rsnd_mod *mod,
@@ -262,6 +263,9 @@ struct rsnd_mod {
  * 2	0: start	1: stop
  * 3	0: pcm_new
  * 4	0: fallback
+ *
+ * 31 bit is always called (see __rsnd_mod_call)
+ * 31	0: clk
  */
 #define __rsnd_mod_shift_probe		0
 #define __rsnd_mod_shift_remove		0
@@ -271,6 +275,7 @@ struct rsnd_mod {
 #define __rsnd_mod_shift_stop		2
 #define __rsnd_mod_shift_pcm_new	3
 #define __rsnd_mod_shift_fallback	4
+#define __rsnd_mod_shift_clk		31 /* always called */
 
 #define __rsnd_mod_call_probe		0
 #define __rsnd_mod_call_remove		1
@@ -280,13 +285,12 @@ struct rsnd_mod {
 #define __rsnd_mod_call_stop		1
 #define __rsnd_mod_call_pcm_new		0
 #define __rsnd_mod_call_fallback	0
+#define __rsnd_mod_call_clk		0
 
 #define rsnd_mod_to_priv(mod) (rsnd_io_to_priv(rsnd_mod_to_io(mod)))
 #define rsnd_mod_to_dma(mod) (&(mod)->dma)
 #define rsnd_mod_to_io(mod) ((mod)->io)
 #define rsnd_mod_id(mod) ((mod)->id)
-#define rsnd_mod_hw_start(mod)	clk_prepare_enable((mod)->clk)
-#define rsnd_mod_hw_stop(mod)	clk_disable_unprepare((mod)->clk)
 
 void rsnd_mod_init(struct rsnd_mod *mod,
 		   struct rsnd_mod_ops *ops,
@@ -294,6 +298,7 @@ void rsnd_mod_init(struct rsnd_mod *mod,
 		   enum rsnd_mod_type type,
 		   int id);
 char *rsnd_mod_name(struct rsnd_mod *mod);
+int rsnd_mod_clk(struct rsnd_mod *mod, int enable);
 struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod);
 
 /*
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index cc93f32..83032ee 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -292,8 +292,6 @@ static int rsnd_src_init(struct rsnd_mod *mod)
 {
 	struct rsnd_src *src = rsnd_mod_to_src(mod);
 
-	rsnd_mod_hw_start(mod);
-
 	src->err = 0;
 
 	/*
@@ -311,8 +309,6 @@ static int rsnd_src_quit(struct rsnd_mod *mod,
 	struct rsnd_src *src = rsnd_mod_to_src(mod);
 	struct device *dev = rsnd_priv_to_dev(priv);
 
-	rsnd_mod_hw_stop(mod);
-
 	if (src->err)
 		dev_warn(dev, "%s[%d] under/over flow err = %d\n",
 			 rsnd_mod_name(mod), rsnd_mod_id(mod), src->err);
@@ -523,6 +519,7 @@ static struct rsnd_mod_ops rsnd_src_gen1_ops = {
 	.quit	= rsnd_src_quit,
 	.start	= rsnd_src_start_gen1,
 	.stop	= rsnd_src_stop_gen1,
+	.clk	= rsnd_mod_clk,
 };
 
 /*
@@ -803,6 +800,7 @@ static struct rsnd_mod_ops rsnd_src_gen2_ops = {
 	.quit	= rsnd_src_quit,
 	.start	= rsnd_src_start_gen2,
 	.stop	= rsnd_src_stop_gen2,
+	.clk	= rsnd_mod_clk,
 };
 
 struct rsnd_mod *rsnd_src_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 060d3d2..583ca97 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -176,6 +176,22 @@ static void rsnd_ssi_master_clk_stop(struct rsnd_ssi *ssi)
 	rsnd_adg_ssi_clk_stop(&ssi->mod);
 }
 
+static int rsnd_ssi_clk(struct rsnd_mod *mod, int enable)
+{
+	struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
+	struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
+	struct rsnd_dai *rdai = rsnd_io_to_rdai(io);
+
+	rsnd_mod_clk(mod, enable);
+
+	if (rsnd_rdai_is_clk_master(rdai)) {
+		if (rsnd_ssi_clk_from_parent(ssi))
+			rsnd_mod_clk(&ssi->parent->mod, enable);
+	}
+
+	return 0;
+}
+
 static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
 			      struct rsnd_dai_stream *io)
 {
@@ -186,8 +202,6 @@ static void rsnd_ssi_hw_start(struct rsnd_ssi *ssi,
 	u32 cr;
 
 	if (0 == ssi->usrcnt) {
-		rsnd_mod_hw_start(&ssi->mod);
-
 		if (rsnd_rdai_is_clk_master(rdai)) {
 			if (rsnd_ssi_clk_from_parent(ssi))
 				rsnd_ssi_hw_start(ssi->parent, io);
@@ -258,8 +272,6 @@ static void rsnd_ssi_hw_stop(struct rsnd_ssi *ssi)
 			else
 				rsnd_ssi_master_clk_stop(ssi);
 		}
-
-		rsnd_mod_hw_stop(&ssi->mod);
 	}
 
 	dev_dbg(dev, "%s[%d] hw stopped\n",
@@ -462,6 +474,7 @@ static struct rsnd_mod_ops rsnd_ssi_pio_ops = {
 	.quit	= rsnd_ssi_quit,
 	.start	= rsnd_ssi_start,
 	.stop	= rsnd_ssi_stop,
+	.clk	= rsnd_ssi_clk,
 };
 
 static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
@@ -581,6 +594,7 @@ static struct rsnd_mod_ops rsnd_ssi_dma_ops = {
 	.quit	= rsnd_ssi_quit,
 	.start	= rsnd_ssi_dma_start,
 	.stop	= rsnd_ssi_dma_stop,
+	.clk	= rsnd_ssi_clk,
 	.fallback = rsnd_ssi_fallback,
 };
 
-- 
1.9.1

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

* [PATCH 11/12 v2] ASoC: rsnd: add dai_link stream name
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (9 preceding siblings ...)
  2015-03-16  4:47 ` [PATCH 10/12 v2] ASoC: rsnd: don't call clk_prepare_enable/unprepare() from inside spin lock Kuninori Morimoto
@ 2015-03-16  4:47 ` Kuninori Morimoto
  2015-03-16  4:47 ` [PATCH 12/12 v2] ASoC: rsnd: add DPCM based sampling rate convert Kuninori Morimoto
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:47 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

This patch adds missing dai_link stream_name
which is used when DPCM

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 sound/soc/sh/rcar/core.c | 8 ++++++++
 sound/soc/sh/rcar/rsnd.h | 1 +
 2 files changed, 9 insertions(+)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index e6c1c7a4..929c282 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -675,20 +675,28 @@ static int rsnd_dai_probe(struct platform_device *pdev,
 		drv[i].name	= rdai[i].name;
 		drv[i].ops	= &rsnd_soc_dai_ops;
 		if (pmod) {
+			snprintf(rdai[i].playback.name, RSND_DAI_NAME_SIZE,
+				 "DAI%d Playback", i);
+
 			drv[i].playback.rates		= RSND_RATES;
 			drv[i].playback.formats		= RSND_FMTS;
 			drv[i].playback.channels_min	= 2;
 			drv[i].playback.channels_max	= 2;
+			drv[i].playback.stream_name	= rdai[i].playback.name;
 
 			rdai[i].playback.info = &info->dai_info[i].playback;
 			rdai[i].playback.rdai = rdai + i;
 			rsnd_path_init(priv, &rdai[i], &rdai[i].playback);
 		}
 		if (cmod) {
+			snprintf(rdai[i].capture.name, RSND_DAI_NAME_SIZE,
+				 "DAI%d Capture", i);
+
 			drv[i].capture.rates		= RSND_RATES;
 			drv[i].capture.formats		= RSND_FMTS;
 			drv[i].capture.channels_min	= 2;
 			drv[i].capture.channels_max	= 2;
+			drv[i].capture.stream_name	= rdai[i].capture.name;
 
 			rdai[i].capture.info = &info->dai_info[i].capture;
 			rdai[i].capture.rdai = rdai + i;
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index 40a12f4..be1ca7a 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -306,6 +306,7 @@ struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod);
  */
 #define RSND_DAI_NAME_SIZE	16
 struct rsnd_dai_stream {
+	char name[RSND_DAI_NAME_SIZE];
 	struct snd_pcm_substream *substream;
 	struct rsnd_mod *mod[RSND_MOD_MAX];
 	struct rsnd_dai_path_info *info; /* rcar_snd.h */
-- 
1.9.1

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

* [PATCH 12/12 v2] ASoC: rsnd: add DPCM based sampling rate convert
  2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
                   ` (10 preceding siblings ...)
  2015-03-16  4:47 ` [PATCH 11/12 v2] ASoC: rsnd: add dai_link stream name Kuninori Morimoto
@ 2015-03-16  4:47 ` Kuninori Morimoto
  11 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-16  4:47 UTC (permalink / raw)
  To: Mark Brown; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

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

This patch supports DPCM based sampling rate convert on Renesas sound
driver. It assumes...
 1. SRC is implemented as FE
 2. BE dai_link supports .be_hw_params_fixup

Signed-off-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
---
v1 -> v2

 - no change

 sound/soc/sh/rcar/core.c |  9 +++++++++
 sound/soc/sh/rcar/rsnd.h |  6 ++++++
 sound/soc/sh/rcar/src.c  | 49 ++++++++++++++++++++++++++++++++++++++++++++----
 3 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index 929c282..b3851cf 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -742,6 +742,15 @@ static int rsnd_pcm_open(struct snd_pcm_substream *substream)
 static int rsnd_hw_params(struct snd_pcm_substream *substream,
 			 struct snd_pcm_hw_params *hw_params)
 {
+	struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
+	struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
+	struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
+	int ret;
+
+	ret = rsnd_dai_call(hw_params, io, substream, hw_params);
+	if (ret)
+		return ret;
+
 	return snd_pcm_lib_malloc_pages(substream,
 					params_buffer_bytes(hw_params));
 }
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index be1ca7a..4ada02b 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -240,6 +240,9 @@ struct rsnd_mod_ops {
 	int (*clk)(struct rsnd_mod *mod, int enable);
 	int (*pcm_new)(struct rsnd_mod *mod,
 		       struct snd_soc_pcm_runtime *rtd);
+	int (*hw_params)(struct rsnd_mod *mod,
+			 struct snd_pcm_substream *substream,
+			 struct snd_pcm_hw_params *hw_params);
 	int (*fallback)(struct rsnd_mod *mod,
 			struct rsnd_priv *priv);
 };
@@ -266,6 +269,7 @@ struct rsnd_mod {
  *
  * 31 bit is always called (see __rsnd_mod_call)
  * 31	0: clk
+ * 31	0: hw_params
  */
 #define __rsnd_mod_shift_probe		0
 #define __rsnd_mod_shift_remove		0
@@ -276,6 +280,7 @@ struct rsnd_mod {
 #define __rsnd_mod_shift_pcm_new	3
 #define __rsnd_mod_shift_fallback	4
 #define __rsnd_mod_shift_clk		31 /* always called */
+#define __rsnd_mod_shift_hw_params	31 /* always called */
 
 #define __rsnd_mod_call_probe		0
 #define __rsnd_mod_call_remove		1
@@ -286,6 +291,7 @@ struct rsnd_mod {
 #define __rsnd_mod_call_pcm_new		0
 #define __rsnd_mod_call_fallback	0
 #define __rsnd_mod_call_clk		0
+#define __rsnd_mod_call_hw_params	0
 
 #define rsnd_mod_to_priv(mod) (rsnd_io_to_priv(rsnd_mod_to_io(mod)))
 #define rsnd_mod_to_dma(mod) (&(mod)->dma)
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index 83032ee..f53f625 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -22,12 +22,13 @@
 struct rsnd_src {
 	struct rsnd_src_platform_info *info; /* rcar_snd.h */
 	struct rsnd_mod mod;
+	u32 convert_rate; /* sampling rate convert */
 	int err;
 };
 
 #define RSND_SRC_NAME_SIZE 16
 
-#define rsnd_src_convert_rate(p) ((p)->info->convert_rate)
+#define rsnd_src_convert_rate(s) ((s)->convert_rate)
 #define rsnd_src_of_node(priv) \
 	of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,src")
 
@@ -288,7 +289,43 @@ static int rsnd_src_set_convert_rate(struct rsnd_mod *mod)
 	return 0;
 }
 
-static int rsnd_src_init(struct rsnd_mod *mod)
+static int rsnd_src_hw_params(struct rsnd_mod *mod,
+			      struct snd_pcm_substream *substream,
+			      struct snd_pcm_hw_params *fe_params)
+{
+	struct rsnd_src *src = rsnd_mod_to_src(mod);
+	struct snd_soc_pcm_runtime *fe = substream->private_data;
+
+	/* default value (mainly for non-DT) */
+	src->convert_rate = src->info->convert_rate;
+
+	/*
+	 * SRC assumes that it is used under DPCM if user want to use
+	 * sampling rate convert. Then, SRC should be FE.
+	 * And then, this function will be called *after* BE settings.
+	 * this means, each BE already has fixuped hw_params.
+	 * see
+	 *	dpcm_fe_dai_hw_params()
+	 *	dpcm_be_dai_hw_params()
+	 */
+	if (fe->dai_link->dynamic) {
+		int stream = substream->stream;
+		struct snd_soc_dpcm *dpcm;
+		struct snd_pcm_hw_params *be_params;
+
+		list_for_each_entry(dpcm, &fe->dpcm[stream].be_clients, list_be) {
+			be_params = &dpcm->hw_params;
+
+			if (params_rate(fe_params) != params_rate(be_params))
+				src->convert_rate = params_rate(be_params);
+		}
+	}
+
+	return 0;
+}
+
+static int rsnd_src_init(struct rsnd_mod *mod,
+			 struct rsnd_priv *priv)
 {
 	struct rsnd_src *src = rsnd_mod_to_src(mod);
 
@@ -313,6 +350,8 @@ static int rsnd_src_quit(struct rsnd_mod *mod,
 		dev_warn(dev, "%s[%d] under/over flow err = %d\n",
 			 rsnd_mod_name(mod), rsnd_mod_id(mod), src->err);
 
+	src->convert_rate = 0;
+
 	return 0;
 }
 
@@ -472,7 +511,7 @@ static int rsnd_src_init_gen1(struct rsnd_mod *mod,
 {
 	int ret;
 
-	ret = rsnd_src_init(mod);
+	ret = rsnd_src_init(mod, priv);
 	if (ret < 0)
 		return ret;
 
@@ -520,6 +559,7 @@ static struct rsnd_mod_ops rsnd_src_gen1_ops = {
 	.start	= rsnd_src_start_gen1,
 	.stop	= rsnd_src_stop_gen1,
 	.clk	= rsnd_mod_clk,
+	.hw_params = rsnd_src_hw_params,
 };
 
 /*
@@ -756,7 +796,7 @@ static int rsnd_src_init_gen2(struct rsnd_mod *mod,
 {
 	int ret;
 
-	ret = rsnd_src_init(mod);
+	ret = rsnd_src_init(mod, priv);
 	if (ret < 0)
 		return ret;
 
@@ -801,6 +841,7 @@ static struct rsnd_mod_ops rsnd_src_gen2_ops = {
 	.start	= rsnd_src_start_gen2,
 	.stop	= rsnd_src_stop_gen2,
 	.clk	= rsnd_mod_clk,
+	.hw_params = rsnd_src_hw_params,
 };
 
 struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id)
-- 
1.9.1

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

* Re: [PATCH 05/12 v2] ASoC: ak4642: tidyup DAPM route for playback
  2015-03-16  4:45 ` [PATCH 05/12 v2] ASoC: ak4642: tidyup DAPM route for playback Kuninori Morimoto
@ 2015-03-17 12:22   ` Mark Brown
  0 siblings, 0 replies; 18+ messages in thread
From: Mark Brown @ 2015-03-17 12:22 UTC (permalink / raw)
  To: Kuninori Morimoto; +Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju


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

On Mon, Mar 16, 2015 at 04:45:54AM +0000, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> 
> It needs DAC -> Playback route instead of direct settings via
> SND_SOC_DAPM_DAC. otherwise, it can't find correct path if
> sound card used prefix name

applied, thanks.

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

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



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

* Re: [PATCH 01/12 v2] ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver
  2015-03-16  4:44 ` [PATCH 01/12 v2] ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver Kuninori Morimoto
@ 2015-03-18  9:03   ` Lars-Peter Clausen
  2015-03-18 23:59     ` Kuninori Morimoto
  0 siblings, 1 reply; 18+ messages in thread
From: Lars-Peter Clausen @ 2015-03-18  9:03 UTC (permalink / raw)
  To: Kuninori Morimoto, Mark Brown
  Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

On 03/16/2015 05:44 AM, Kuninori Morimoto wrote:
> From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
>
> No one is using .of_xlate_dai_name for DT,
> Let's remove it.

I'd prefer to keep this, there will probably be user for it eventually.

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

* Re: [PATCH 03/12 v2] ASoC: rsnd-dpcm-card: add Renesas sound card support for DPCM
  2015-03-16  4:45 ` [PATCH 03/12 v2] ASoC: rsnd-dpcm-card: add Renesas sound card support for DPCM Kuninori Morimoto
@ 2015-03-18  9:05   ` Lars-Peter Clausen
  2015-03-19  0:08     ` Kuninori Morimoto
  0 siblings, 1 reply; 18+ messages in thread
From: Lars-Peter Clausen @ 2015-03-18  9:05 UTC (permalink / raw)
  To: Kuninori Morimoto, Mark Brown
  Cc: Linux-ALSA, Simon, shiiba, Liam Girdwood, Das Biju

On 03/16/2015 05:45 AM, Kuninori Morimoto wrote:
> +sound {
> +	compatible = "renesas-dpcm-audio-card";

dpcm is a software component, the devicetree should describe the hardware.

> +
> +	card-name = "rsnd-ak4643";
> +	format = "left_j";
> +	bitclock-master = <&sndcodec>;
> +	frame-master = <&sndcodec>;
> +
> +	routing = "ak4642-hifi Playback", "DAI0 Playback",
> +		  "DAI0 Capture", "ak4642-hifi Capture";

This does not belong into the devicetree. These strings are all Linux driver 
specific.
[...]

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

* Re: [PATCH 01/12 v2] ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver
  2015-03-18  9:03   ` Lars-Peter Clausen
@ 2015-03-18 23:59     ` Kuninori Morimoto
  0 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-18 23:59 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Linux-ALSA, shiiba, Simon, Liam Girdwood, Das Biju, Mark Brown


Hi Lars

> > From: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
> >
> > No one is using .of_xlate_dai_name for DT,
> > Let's remove it.
> 
> I'd prefer to keep this, there will probably be user for it eventually.

OK, will fix in v3

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

* Re: [PATCH 03/12 v2] ASoC: rsnd-dpcm-card: add Renesas sound card support for DPCM
  2015-03-18  9:05   ` Lars-Peter Clausen
@ 2015-03-19  0:08     ` Kuninori Morimoto
  0 siblings, 0 replies; 18+ messages in thread
From: Kuninori Morimoto @ 2015-03-19  0:08 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Linux-ALSA, shiiba, Simon, Liam Girdwood, Das Biju, Mark Brown


Hi Lars

> > +	card-name = "rsnd-ak4643";
> > +	format = "left_j";
> > +	bitclock-master = <&sndcodec>;
> > +	frame-master = <&sndcodec>;
> > +
> > +	routing = "ak4642-hifi Playback", "DAI0 Playback",
> > +		  "DAI0 Capture", "ak4642-hifi Capture";
> 
> This does not belong into the devicetree. These strings are all Linux
> driver specific.

Hmm... but this is already supported in simple-card ?
and snd_soc_of_parse_audio_routing() is soc-core function...

Is your favorite style like this ?

	compatible = "rsnd-ak4642-card";

	static struct of_device_id rsnd_card_of_match[] = {
		{ .compatible = "rsnd-ak4642-card", .data = &rsnd_ak4642_route },
		{ .compatible = "rsnd-xxxxxx-card", .data = &rsnd_xxxxxx_route },
		{},

# Hmm... DT...

Best regards
---
Kuninori Morimoto

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

end of thread, other threads:[~2015-03-19  0:08 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-16  4:39 [PATCH 0/12 v2] ASoC: Renesas adds DPCM based sampling rate convert Kuninori Morimoto
2015-03-16  4:44 ` [PATCH 01/12 v2] ASoC: core: remove of_xlate_dai_name from snd_soc_component_driver Kuninori Morimoto
2015-03-18  9:03   ` Lars-Peter Clausen
2015-03-18 23:59     ` Kuninori Morimoto
2015-03-16  4:45 ` [PATCH 02/12 v2] ASoC: core: add snd_soc_get_dai_info() to get driver infomation Kuninori Morimoto
2015-03-16  4:45 ` [PATCH 03/12 v2] ASoC: rsnd-dpcm-card: add Renesas sound card support for DPCM Kuninori Morimoto
2015-03-18  9:05   ` Lars-Peter Clausen
2015-03-19  0:08     ` Kuninori Morimoto
2015-03-16  4:45 ` [PATCH 04/12 v2] ASoC: rsnd-dpcm-card: add .be_hw_params_fixup support for convert rate Kuninori Morimoto
2015-03-16  4:45 ` [PATCH 05/12 v2] ASoC: ak4642: tidyup DAPM route for playback Kuninori Morimoto
2015-03-17 12:22   ` Mark Brown
2015-03-16  4:46 ` [PATCH 06/12 v2] ASoC: rsnd: no more SSI restart when unusual situation Kuninori Morimoto
2015-03-16  4:46 ` [PATCH 07/12 v2] ASoC: rsnd: no more SRC " Kuninori Morimoto
2015-03-16  4:46 ` [PATCH 08/12 v2] ASoC: rsnd: tidyup error message format Kuninori Morimoto
2015-03-16  4:46 ` [PATCH 09/12 v2] ASoC: rsnd: show debug info for sampling rate convert Kuninori Morimoto
2015-03-16  4:47 ` [PATCH 10/12 v2] ASoC: rsnd: don't call clk_prepare_enable/unprepare() from inside spin lock Kuninori Morimoto
2015-03-16  4:47 ` [PATCH 11/12 v2] ASoC: rsnd: add dai_link stream name Kuninori Morimoto
2015-03-16  4:47 ` [PATCH 12/12 v2] ASoC: rsnd: add DPCM based sampling rate convert 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.