[PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

Subsystems: arm/rockchip soc support, open firmware and flattened device tree bindings, sound, sound - soc layer / dynamic audio power management (asoc), the rest

STALE3735d

9 messages, 6 authors, 2016-06-17 · open the first message on its own page

[PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Xing Zheng <hidden>
Date: 2016-06-13 08:42:42

Because we need to support the multiple codecs (MAX98357A/RT5514/DA7219)
on the RK3399 GRU boards, this patch can help us to support these codecs.

Signed-off-by: Xing Zheng <redacted>
---

Changes in v5:
- fix the build warning for missing I2C/CLKDEV_LOOKUP dependency

Changes in v4:
- the compatible name needs to be based on a single reference design,
  and the name of the board is called "GRU"
- use one i2sX card "rockchip,cpu = <&i2s0>" instead of array that is
  based on GRU
- rename DOC to rockchip,rk3399-gru-sound.txt
- rename compatible to rockchip,rk3399-gru-sound
- rename source code to rk3399_gru_sound.c

Changes in v3:
- rename DOC to rockchip,rk3399-max98357a-rt5514-da7219.txt
- rename compatible to rockchip,rk3399-max98357a-rt5514-da7219
- rename source code to rk3399_max98357a_rt5514_da7219.c

Changes in v2:
- use the FS 256 to set mclks of the max98357a and rt5514 danamically
- add more sample rate for da7219

 .../bindings/sound/rockchip,rk3399-gru-sound.txt   |   15 +
 sound/soc/rockchip/Kconfig                         |   11 +
 sound/soc/rockchip/Makefile                        |    2 +
 sound/soc/rockchip/rk3399_gru_sound.c              |  339 ++++++++++++++++++++
 4 files changed, 367 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
 create mode 100644 sound/soc/rockchip/rk3399_gru_sound.c
diff --git a/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt b/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
new file mode 100644
index 0000000..f19b6c8
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
@@ -0,0 +1,15 @@
+ROCKCHIP with MAX98357A/RT5514/DA7219 codecs on GRU boards
+
+Required properties:
+- compatible: "rockchip,rk3399-gru-sound"
+- rockchip,cpu: The phandle of the Rockchip I2S controller that's
+  connected to the codecs
+- rockchip,codec: The phandle of the MAX98357A/RT5514/DA7219 codecs
+
+Example:
+
+sound {
+	compatible = "rockchip,rk3399-gru-sound";
+	rockchip,cpu = <&i2s0>;
+	rockchip,codec = <&max98357a &rt5514 &da7219>;
+};
diff --git a/sound/soc/rockchip/Kconfig b/sound/soc/rockchip/Kconfig
index f1e0c70..6d39032 100644
--- a/sound/soc/rockchip/Kconfig
+++ b/sound/soc/rockchip/Kconfig
@@ -41,3 +41,14 @@ config SND_SOC_ROCKCHIP_RT5645
 	help
 	  Say Y or M here if you want to add support for SoC audio on Rockchip
 	  boards using the RT5645/RT5650 codec, such as Veyron.
+
+config SND_SOC_RK3399_GRU_SOUND
+	tristate "ASoC support multiple codecs for Rockchip RK3399 GRU boards"
+	depends on SND_SOC_ROCKCHIP && I2C && GPIOLIB && CLKDEV_LOOKUP
+	select SND_SOC_ROCKCHIP_I2S
+	select SND_SOC_MAX98357A
+	select SND_SOC_RT5514
+	select SND_SOC_DA7219
+	help
+	  Say Y or M here if you want to add support multiple codecs for SoC
+	  audio on Rockchip RK3399 GRU boards.
diff --git a/sound/soc/rockchip/Makefile b/sound/soc/rockchip/Makefile
index c0bf560..84e5c7c 100644
--- a/sound/soc/rockchip/Makefile
+++ b/sound/soc/rockchip/Makefile
@@ -7,6 +7,8 @@ obj-$(CONFIG_SND_SOC_ROCKCHIP_SPDIF) += snd-soc-rockchip-spdif.o
 
 snd-soc-rockchip-max98090-objs := rockchip_max98090.o
 snd-soc-rockchip-rt5645-objs := rockchip_rt5645.o
+snd-soc-rk3399-gru-sound-objs := rk3399_gru_sound.o
 
 obj-$(CONFIG_SND_SOC_ROCKCHIP_MAX98090) += snd-soc-rockchip-max98090.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_RT5645) += snd-soc-rockchip-rt5645.o
+obj-$(CONFIG_SND_SOC_RK3399_GRU_SOUND) += snd-soc-rk3399-gru-sound.o
diff --git a/sound/soc/rockchip/rk3399_gru_sound.c b/sound/soc/rockchip/rk3399_gru_sound.c
new file mode 100644
index 0000000..cc9b943
--- /dev/null
+++ b/sound/soc/rockchip/rk3399_gru_sound.c
@@ -0,0 +1,339 @@
+/*
+ * Rockchip machine ASoC driver for boards using MAX98357A/RT5514/DA7219
+ *
+ * Copyright (c) 2016, ROCKCHIP CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
+#include <linux/delay.h>
+#include <linux/spi/spi.h>
+#include <sound/core.h>
+#include <sound/jack.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include "rockchip_i2s.h"
+#include "../codecs/da7219.h"
+#include "../codecs/da7219-aad.h"
+#include "../codecs/rt5514.h"
+
+#define DRV_NAME "rk3399-gru-sound"
+
+#define SOUND_FS	256
+
+static struct snd_soc_jack rockchip_sound_jack;
+
+static const struct snd_soc_dapm_widget rockchip_dapm_widgets[] = {
+	SND_SOC_DAPM_HP("Headphones", NULL),
+	SND_SOC_DAPM_SPK("Speakers", NULL),
+	SND_SOC_DAPM_MIC("Headset Mic", NULL),
+	SND_SOC_DAPM_MIC("Int Mic", NULL),
+};
+
+static const struct snd_soc_dapm_route rockchip_dapm_routes[] = {
+	/* Input Lines */
+	{"MIC", NULL, "Headset Mic"},
+	{"DMIC1L", NULL, "Int Mic"},
+	{"DMIC1R", NULL, "Int Mic"},
+
+	/* Output Lines */
+	{"Headphones", NULL, "HPL"},
+	{"Headphones", NULL, "HPR"},
+	{"Speakers", NULL, "Speakers"},
+};
+
+static const struct snd_kcontrol_new rockchip_controls[] = {
+	SOC_DAPM_PIN_SWITCH("Headphones"),
+	SOC_DAPM_PIN_SWITCH("Speakers"),
+	SOC_DAPM_PIN_SWITCH("Headset Mic"),
+	SOC_DAPM_PIN_SWITCH("Int Mic"),
+};
+
+static int rockchip_sound_max98357a_hw_params(struct snd_pcm_substream *substream,
+			     struct snd_pcm_hw_params *params)
+{
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
+	unsigned int mclk;
+	int ret;
+
+	snd_soc_dapm_disable_pin(dapm, "Headphones");
+	snd_soc_dapm_enable_pin(dapm, "Speakers");
+	snd_soc_dapm_sync(dapm);
+
+	/* max98357a supports these sample rates */
+	switch (params_rate(params)) {
+	case 8000:
+	case 16000:
+	case 48000:
+	case 96000:
+		mclk = params_rate(params) * SOUND_FS;
+		break;
+	default:
+		dev_err(rtd->card->dev, "%s() doesn't support this sample rate: %d\n",
+				__func__, params_rate(params));
+		return -EINVAL;
+	}
+
+	ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, 0, mclk, 0);
+	if (ret) {
+		dev_err(rtd->card->dev, "%s() error setting sysclk to %u: %d\n",
+				__func__, mclk, ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int rockchip_sound_rt5514_hw_params(struct snd_pcm_substream *substream,
+			     struct snd_pcm_hw_params *params)
+{
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+	struct snd_soc_dai *codec_dai = rtd->codec_dai;
+	struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
+	unsigned int mclk;
+	int ret;
+
+	snd_soc_dapm_disable_pin(dapm, "Headset Mic");
+	snd_soc_dapm_enable_pin(dapm, "Int Mic");
+	snd_soc_dapm_sync(dapm);
+
+	mclk = params_rate(params) * SOUND_FS;
+
+	ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
+				     SND_SOC_CLOCK_OUT);
+	if (ret < 0) {
+		dev_err(rtd->card->dev, "Can't set cpu clock out %d\n", ret);
+		return ret;
+	}
+
+	ret = snd_soc_dai_set_sysclk(codec_dai, RT5514_SCLK_S_MCLK,
+				     mclk, SND_SOC_CLOCK_IN);
+	if (ret) {
+		dev_err(rtd->card->dev, "%s() error setting sysclk to %u: %d\n",
+				__func__, params_rate(params) * 512, ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int rockchip_sound_da7219_hw_params(struct snd_pcm_substream *substream,
+			     struct snd_pcm_hw_params *params)
+{
+	struct snd_soc_pcm_runtime *rtd = substream->private_data;
+	struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+	struct snd_soc_dai *codec_dai = rtd->codec_dai;
+	struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
+	int mclk, ret;
+
+	snd_soc_dapm_disable_pin(dapm, "Speakers");
+	snd_soc_dapm_disable_pin(dapm, "Int Mic");
+	snd_soc_dapm_enable_pin(dapm, "Headphones");
+	snd_soc_dapm_enable_pin(dapm, "Headset Mic");
+	snd_soc_dapm_sync(dapm);
+
+	/* in bypass mode, the mclk has to be one of the frequencies below */
+	switch (params_rate(params)) {
+	case 8000:
+	case 16000:
+	case 24000:
+	case 32000:
+	case 48000:
+	case 64000:
+	case 96000:
+		mclk = 12288000;
+		break;
+	case 11025:
+	case 22050:
+	case 44100:
+	case 88200:
+		mclk = 11289600;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
+				     SND_SOC_CLOCK_OUT);
+	if (ret < 0) {
+		dev_err(codec_dai->dev, "Can't set cpu clock out %d\n", ret);
+		return ret;
+	}
+
+	ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
+				     SND_SOC_CLOCK_IN);
+	if (ret < 0) {
+		dev_err(codec_dai->dev, "Can't set codec clock in %d\n", ret);
+		return ret;
+	}
+
+	ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_MCLK, 0, 0);
+	if (ret < 0) {
+		dev_err(codec_dai->dev, "Can't set pll sysclk mclk %d\n", ret);
+		return ret;
+	}
+
+	return 0;
+}
+
+static int rockchip_sound_da7219_init(struct snd_soc_pcm_runtime *rtd)
+{
+	struct snd_soc_codec *codec = rtd->codec_dais[0]->codec;
+	int ret;
+
+	/* Enable Headset and 4 Buttons Jack detection */
+	ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
+				    SND_JACK_HEADSET |
+				    SND_JACK_BTN_0 | SND_JACK_BTN_1 |
+				    SND_JACK_BTN_2 | SND_JACK_BTN_3,
+				    &rockchip_sound_jack, NULL, 0);
+
+	if (ret) {
+		dev_err(rtd->card->dev, "New Headset Jack failed! (%d)\n", ret);
+		return ret;
+	}
+
+	da7219_aad_jack_det(codec, &rockchip_sound_jack);
+
+	return 0;
+}
+
+static struct snd_soc_ops rockchip_sound_max98357a_ops = {
+	.hw_params = rockchip_sound_max98357a_hw_params,
+};
+
+static struct snd_soc_ops rockchip_sound_rt5514_ops = {
+	.hw_params = rockchip_sound_rt5514_hw_params,
+};
+
+static struct snd_soc_ops rockchip_sound_da7219_ops = {
+	.hw_params = rockchip_sound_da7219_hw_params,
+};
+
+enum {
+	DAILINK_MAX98357A,
+	DAILINK_RT5514,
+	DAILINK_DA7219,
+};
+
+static struct snd_soc_dai_link rockchip_dailinks[] = {
+	[DAILINK_MAX98357A] = {
+		.name = "MAX98357A",
+		.stream_name = "MAX98357A PCM",
+		.codec_dai_name = "HiFi",
+		.ops = &rockchip_sound_max98357a_ops,
+		/* set max98357a as slave */
+		.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+			SND_SOC_DAIFMT_CBS_CFS,
+	},
+	[DAILINK_RT5514] = {
+		.name = "RT5514",
+		.stream_name = "RT5514 PCM",
+		.codec_dai_name = "rt5514-aif1",
+		.ops = &rockchip_sound_rt5514_ops,
+		/* set rt5514 as slave */
+		.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+			SND_SOC_DAIFMT_CBS_CFS,
+	},
+	[DAILINK_DA7219] = {
+		.name = "DA7219",
+		.stream_name = "DA7219 PCM",
+		.codec_dai_name = "da7219-hifi",
+		.init = rockchip_sound_da7219_init,
+		.ops = &rockchip_sound_da7219_ops,
+		/* set da7219 as slave */
+		.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+			SND_SOC_DAIFMT_CBS_CFS,
+	},
+};
+
+static struct snd_soc_card rockchip_sound_card = {
+	.name = "rk3399-gru-sound",
+	.owner = THIS_MODULE,
+	.dai_link = rockchip_dailinks,
+	.num_links =  ARRAY_SIZE(rockchip_dailinks),
+	.dapm_widgets = rockchip_dapm_widgets,
+	.num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets),
+	.dapm_routes = rockchip_dapm_routes,
+	.num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes),
+	.controls = rockchip_controls,
+	.num_controls = ARRAY_SIZE(rockchip_controls),
+};
+
+static int rockchip_sound_probe(struct platform_device *pdev)
+{
+	struct snd_soc_card *card = &rockchip_sound_card;
+	struct device_node *cpu_node;
+	int i, ret;
+
+	cpu_node = of_parse_phandle(pdev->dev.of_node, "rockchip,cpu", 0);
+	if (!cpu_node) {
+		dev_err(&pdev->dev, "Property 'rockchip,cpu' missing or invalid\n");
+		return -EINVAL;
+	}
+
+	for (i = 0; i < card->num_links; i++) {
+		rockchip_dailinks[i].platform_of_node = cpu_node;
+		rockchip_dailinks[i].cpu_of_node = cpu_node;
+
+		rockchip_dailinks[i].codec_of_node =
+			of_parse_phandle(pdev->dev.of_node, "rockchip,codec", i);
+		if (!rockchip_dailinks[i].codec_of_node) {
+			dev_err(&pdev->dev,
+				"Property[%d] 'rockchip,codec' missing or invalid\n", i);
+			return -EINVAL;
+		}
+	}
+
+	card->dev = &pdev->dev;
+	platform_set_drvdata(pdev, card);
+
+	ret = devm_snd_soc_register_card(&pdev->dev, card);
+	if (ret)
+		dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
+			__func__, ret);
+
+	return ret;
+}
+
+static const struct of_device_id rockchip_sound_of_match[] = {
+	{ .compatible = "rockchip,rk3399-gru-sound", },
+	{},
+};
+
+static struct platform_driver rockchip_sound_driver = {
+	.probe = rockchip_sound_probe,
+	.driver = {
+		.name = DRV_NAME,
+		.of_match_table = rockchip_sound_of_match,
+#ifdef CONFIG_PM
+		.pm = &snd_soc_pm_ops,
+#endif
+	},
+};
+
+module_platform_driver(rockchip_sound_driver);
+
+MODULE_AUTHOR("Xing Zheng <zhengxing@rock-chips.com>");
+MODULE_DESCRIPTION("Rockchip ASoC Machine Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);
+MODULE_DEVICE_TABLE(of, rockchip_sound_of_match);
-- 
1.7.9.5

Re: [PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Rob Herring <robh@kernel.org>
Date: 2016-06-14 22:38:15

On Mon, Jun 13, 2016 at 04:42:18PM +0800, Xing Zheng wrote:
quoted hunk
Because we need to support the multiple codecs (MAX98357A/RT5514/DA7219)
on the RK3399 GRU boards, this patch can help us to support these codecs.

Signed-off-by: Xing Zheng <redacted>
---

Changes in v5:
- fix the build warning for missing I2C/CLKDEV_LOOKUP dependency

Changes in v4:
- the compatible name needs to be based on a single reference design,
  and the name of the board is called "GRU"
- use one i2sX card "rockchip,cpu = <&i2s0>" instead of array that is
  based on GRU
- rename DOC to rockchip,rk3399-gru-sound.txt
- rename compatible to rockchip,rk3399-gru-sound
- rename source code to rk3399_gru_sound.c

Changes in v3:
- rename DOC to rockchip,rk3399-max98357a-rt5514-da7219.txt
- rename compatible to rockchip,rk3399-max98357a-rt5514-da7219
- rename source code to rk3399_max98357a_rt5514_da7219.c

Changes in v2:
- use the FS 256 to set mclks of the max98357a and rt5514 danamically
- add more sample rate for da7219

 .../bindings/sound/rockchip,rk3399-gru-sound.txt   |   15 +
 sound/soc/rockchip/Kconfig                         |   11 +
 sound/soc/rockchip/Makefile                        |    2 +
 sound/soc/rockchip/rk3399_gru_sound.c              |  339 ++++++++++++++++++++
 4 files changed, 367 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
 create mode 100644 sound/soc/rockchip/rk3399_gru_sound.c
diff --git a/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt b/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
new file mode 100644
index 0000000..f19b6c8
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
@@ -0,0 +1,15 @@
+ROCKCHIP with MAX98357A/RT5514/DA7219 codecs on GRU boards
+
+Required properties:
+- compatible: "rockchip,rk3399-gru-sound"
+- rockchip,cpu: The phandle of the Rockchip I2S controller that's
+  connected to the codecs
+- rockchip,codec: The phandle of the MAX98357A/RT5514/DA7219 codecs
+
+Example:
+
+sound {
+	compatible = "rockchip,rk3399-gru-sound";
+	rockchip,cpu = <&i2s0>;
+	rockchip,codec = <&max98357a &rt5514 &da7219>;
These seem fairly standard though a variety of versions in the bindings. 
Can we use audio-codec and audio-cpu (or cpu or audio-dai) here? Mark?

Rob

Re: [PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Mark Brown <broonie@kernel.org>
Date: 2016-06-15 09:54:06

On Tue, Jun 14, 2016 at 05:38:10PM -0500, Rob Herring wrote:
On Mon, Jun 13, 2016 at 04:42:18PM +0800, Xing Zheng wrote:
quoted
+sound {
+	compatible = "rockchip,rk3399-gru-sound";
+	rockchip,cpu = <&i2s0>;
+	rockchip,codec = <&max98357a &rt5514 &da7219>;
These seem fairly standard though a variety of versions in the bindings. 
Can we use audio-codec and audio-cpu (or cpu or audio-dai) here? Mark?
Well, the roles aren't actually that standard (the fact that there's
multiple CODECs and one CPU DAI here is really odd and definitely needs
a very system specific interpretation).  If they were standard we
already have the simple-card binding that things should be using.
There's no point in standard property names if the interpretation has to
be non-standard.

The vendor specific prefixes are there because all bindings are supposed
to add prefixes to property names.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160615/49033911/attachment.sig>

Re: [PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Rob Herring <robh@kernel.org>
Date: 2016-06-15 12:45:00

On Wed, Jun 15, 2016 at 4:53 AM, Mark Brown [off-list ref] wrote:
On Tue, Jun 14, 2016 at 05:38:10PM -0500, Rob Herring wrote:
quoted
On Mon, Jun 13, 2016 at 04:42:18PM +0800, Xing Zheng wrote:
quoted
quoted
+sound {
+   compatible = "rockchip,rk3399-gru-sound";
+   rockchip,cpu = <&i2s0>;
+   rockchip,codec = <&max98357a &rt5514 &da7219>;
quoted
These seem fairly standard though a variety of versions in the bindings.
Can we use audio-codec and audio-cpu (or cpu or audio-dai) here? Mark?
Well, the roles aren't actually that standard (the fact that there's
multiple CODECs and one CPU DAI here is really odd and definitely needs
a very system specific interpretation).  If they were standard we
already have the simple-card binding that things should be using.
There's no point in standard property names if the interpretation has to
be non-standard.
Okay, I agree with the system specific interpretation part. However, I
don't think using simple-card or not determines using common
properties.
The vendor specific prefixes are there because all bindings are supposed
to add prefixes to property names.
...unless they are common.

Rob

Re: [PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Steve Barber <hidden>
Date: 2016-06-15 19:44:00

On Mon, Jun 13, 2016 at 1:42 AM, Xing Zheng [off-list ref] wrote:
quoted hunk
Because we need to support the multiple codecs (MAX98357A/RT5514/DA7219)
on the RK3399 GRU boards, this patch can help us to support these codecs.

Signed-off-by: Xing Zheng <redacted>
---

Changes in v5:
- fix the build warning for missing I2C/CLKDEV_LOOKUP dependency

Changes in v4:
- the compatible name needs to be based on a single reference design,
  and the name of the board is called "GRU"
- use one i2sX card "rockchip,cpu = <&i2s0>" instead of array that is
  based on GRU
- rename DOC to rockchip,rk3399-gru-sound.txt
- rename compatible to rockchip,rk3399-gru-sound
- rename source code to rk3399_gru_sound.c

Changes in v3:
- rename DOC to rockchip,rk3399-max98357a-rt5514-da7219.txt
- rename compatible to rockchip,rk3399-max98357a-rt5514-da7219
- rename source code to rk3399_max98357a_rt5514_da7219.c

Changes in v2:
- use the FS 256 to set mclks of the max98357a and rt5514 danamically
- add more sample rate for da7219

 .../bindings/sound/rockchip,rk3399-gru-sound.txt   |   15 +
 sound/soc/rockchip/Kconfig                         |   11 +
 sound/soc/rockchip/Makefile                        |    2 +
 sound/soc/rockchip/rk3399_gru_sound.c              |  339 ++++++++++++++++++++
 4 files changed, 367 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
 create mode 100644 sound/soc/rockchip/rk3399_gru_sound.c
diff --git a/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt b/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
new file mode 100644
index 0000000..f19b6c8
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rockchip,rk3399-gru-sound.txt
@@ -0,0 +1,15 @@
+ROCKCHIP with MAX98357A/RT5514/DA7219 codecs on GRU boards
+
+Required properties:
+- compatible: "rockchip,rk3399-gru-sound"
+- rockchip,cpu: The phandle of the Rockchip I2S controller that's
+  connected to the codecs
+- rockchip,codec: The phandle of the MAX98357A/RT5514/DA7219 codecs
+
+Example:
+
+sound {
+       compatible = "rockchip,rk3399-gru-sound";
+       rockchip,cpu = <&i2s0>;
+       rockchip,codec = <&max98357a &rt5514 &da7219>;
+};
diff --git a/sound/soc/rockchip/Kconfig b/sound/soc/rockchip/Kconfig
index f1e0c70..6d39032 100644
--- a/sound/soc/rockchip/Kconfig
+++ b/sound/soc/rockchip/Kconfig
@@ -41,3 +41,14 @@ config SND_SOC_ROCKCHIP_RT5645
        help
          Say Y or M here if you want to add support for SoC audio on Rockchip
          boards using the RT5645/RT5650 codec, such as Veyron.
+
+config SND_SOC_RK3399_GRU_SOUND
+       tristate "ASoC support multiple codecs for Rockchip RK3399 GRU boards"
+       depends on SND_SOC_ROCKCHIP && I2C && GPIOLIB && CLKDEV_LOOKUP
+       select SND_SOC_ROCKCHIP_I2S
+       select SND_SOC_MAX98357A
+       select SND_SOC_RT5514
+       select SND_SOC_DA7219
+       help
+         Say Y or M here if you want to add support multiple codecs for SoC
+         audio on Rockchip RK3399 GRU boards.
diff --git a/sound/soc/rockchip/Makefile b/sound/soc/rockchip/Makefile
index c0bf560..84e5c7c 100644
--- a/sound/soc/rockchip/Makefile
+++ b/sound/soc/rockchip/Makefile
@@ -7,6 +7,8 @@ obj-$(CONFIG_SND_SOC_ROCKCHIP_SPDIF) += snd-soc-rockchip-spdif.o

 snd-soc-rockchip-max98090-objs := rockchip_max98090.o
 snd-soc-rockchip-rt5645-objs := rockchip_rt5645.o
+snd-soc-rk3399-gru-sound-objs := rk3399_gru_sound.o

 obj-$(CONFIG_SND_SOC_ROCKCHIP_MAX98090) += snd-soc-rockchip-max98090.o
 obj-$(CONFIG_SND_SOC_ROCKCHIP_RT5645) += snd-soc-rockchip-rt5645.o
+obj-$(CONFIG_SND_SOC_RK3399_GRU_SOUND) += snd-soc-rk3399-gru-sound.o
diff --git a/sound/soc/rockchip/rk3399_gru_sound.c b/sound/soc/rockchip/rk3399_gru_sound.c
new file mode 100644
index 0000000..cc9b943
--- /dev/null
+++ b/sound/soc/rockchip/rk3399_gru_sound.c
@@ -0,0 +1,339 @@
+/*
+ * Rockchip machine ASoC driver for boards using MAX98357A/RT5514/DA7219
+ *
+ * Copyright (c) 2016, ROCKCHIP CORPORATION.  All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/gpio.h>
+#include <linux/of_gpio.h>
+#include <linux/delay.h>
+#include <linux/spi/spi.h>
+#include <sound/core.h>
+#include <sound/jack.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include "rockchip_i2s.h"
+#include "../codecs/da7219.h"
+#include "../codecs/da7219-aad.h"
+#include "../codecs/rt5514.h"
+
+#define DRV_NAME "rk3399-gru-sound"
+
+#define SOUND_FS       256
+
+static struct snd_soc_jack rockchip_sound_jack;
+
+static const struct snd_soc_dapm_widget rockchip_dapm_widgets[] = {
+       SND_SOC_DAPM_HP("Headphones", NULL),
+       SND_SOC_DAPM_SPK("Speakers", NULL),
+       SND_SOC_DAPM_MIC("Headset Mic", NULL),
+       SND_SOC_DAPM_MIC("Int Mic", NULL),
+};
+
+static const struct snd_soc_dapm_route rockchip_dapm_routes[] = {
+       /* Input Lines */
+       {"MIC", NULL, "Headset Mic"},
+       {"DMIC1L", NULL, "Int Mic"},
+       {"DMIC1R", NULL, "Int Mic"},
+
+       /* Output Lines */
+       {"Headphones", NULL, "HPL"},
+       {"Headphones", NULL, "HPR"},
+       {"Speakers", NULL, "Speakers"},
+};
+
+static const struct snd_kcontrol_new rockchip_controls[] = {
+       SOC_DAPM_PIN_SWITCH("Headphones"),
+       SOC_DAPM_PIN_SWITCH("Speakers"),
+       SOC_DAPM_PIN_SWITCH("Headset Mic"),
+       SOC_DAPM_PIN_SWITCH("Int Mic"),
+};
+
+static int rockchip_sound_max98357a_hw_params(struct snd_pcm_substream *substream,
+                            struct snd_pcm_hw_params *params)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
+       unsigned int mclk;
+       int ret;
+
+       snd_soc_dapm_disable_pin(dapm, "Headphones");
+       snd_soc_dapm_enable_pin(dapm, "Speakers");
+       snd_soc_dapm_sync(dapm);
+
+       /* max98357a supports these sample rates */
+       switch (params_rate(params)) {
+       case 8000:
+       case 16000:
+       case 48000:
+       case 96000:
+               mclk = params_rate(params) * SOUND_FS;
+               break;
+       default:
+               dev_err(rtd->card->dev, "%s() doesn't support this sample rate: %d\n",
+                               __func__, params_rate(params));
+               return -EINVAL;
+       }
+
+       ret = snd_soc_dai_set_sysclk(rtd->cpu_dai, 0, mclk, 0);
+       if (ret) {
+               dev_err(rtd->card->dev, "%s() error setting sysclk to %u: %d\n",
+                               __func__, mclk, ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int rockchip_sound_rt5514_hw_params(struct snd_pcm_substream *substream,
+                            struct snd_pcm_hw_params *params)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
+       struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
+       unsigned int mclk;
+       int ret;
+
+       snd_soc_dapm_disable_pin(dapm, "Headset Mic");
+       snd_soc_dapm_enable_pin(dapm, "Int Mic");
+       snd_soc_dapm_sync(dapm);
+
+       mclk = params_rate(params) * SOUND_FS;
+
+       ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
+                                    SND_SOC_CLOCK_OUT);
+       if (ret < 0) {
+               dev_err(rtd->card->dev, "Can't set cpu clock out %d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_dai_set_sysclk(codec_dai, RT5514_SCLK_S_MCLK,
+                                    mclk, SND_SOC_CLOCK_IN);
+       if (ret) {
+               dev_err(rtd->card->dev, "%s() error setting sysclk to %u: %d\n",
+                               __func__, params_rate(params) * 512, ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int rockchip_sound_da7219_hw_params(struct snd_pcm_substream *substream,
+                            struct snd_pcm_hw_params *params)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
+       struct snd_soc_dapm_context *dapm = &rtd->card->dapm;
+       int mclk, ret;
+
+       snd_soc_dapm_disable_pin(dapm, "Speakers");
+       snd_soc_dapm_disable_pin(dapm, "Int Mic");
+       snd_soc_dapm_enable_pin(dapm, "Headphones");
+       snd_soc_dapm_enable_pin(dapm, "Headset Mic");
+       snd_soc_dapm_sync(dapm);
+
+       /* in bypass mode, the mclk has to be one of the frequencies below */
+       switch (params_rate(params)) {
+       case 8000:
+       case 16000:
+       case 24000:
+       case 32000:
+       case 48000:
+       case 64000:
+       case 96000:
+               mclk = 12288000;
+               break;
+       case 11025:
+       case 22050:
+       case 44100:
+       case 88200:
+               mclk = 11289600;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
+                                    SND_SOC_CLOCK_OUT);
+       if (ret < 0) {
+               dev_err(codec_dai->dev, "Can't set cpu clock out %d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
+                                    SND_SOC_CLOCK_IN);
+       if (ret < 0) {
+               dev_err(codec_dai->dev, "Can't set codec clock in %d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_MCLK, 0, 0);
+       if (ret < 0) {
+               dev_err(codec_dai->dev, "Can't set pll sysclk mclk %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int rockchip_sound_da7219_init(struct snd_soc_pcm_runtime *rtd)
+{
+       struct snd_soc_codec *codec = rtd->codec_dais[0]->codec;
+       int ret;
+
+       /* Enable Headset and 4 Buttons Jack detection */
+       ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
+                                   SND_JACK_HEADSET |
Should this also include SND_JACK_LINEOUT? da7219 differentiates
between the two so not including lineout means, for example, we can
miss jack insertion/removal events.
+                                   SND_JACK_BTN_0 | SND_JACK_BTN_1 |
+                                   SND_JACK_BTN_2 | SND_JACK_BTN_3,
+                                   &rockchip_sound_jack, NULL, 0);
+
+       if (ret) {
+               dev_err(rtd->card->dev, "New Headset Jack failed! (%d)\n", ret);
+               return ret;
+       }
+
+       da7219_aad_jack_det(codec, &rockchip_sound_jack);
+
+       return 0;
+}
+
+static struct snd_soc_ops rockchip_sound_max98357a_ops = {
+       .hw_params = rockchip_sound_max98357a_hw_params,
+};
+
+static struct snd_soc_ops rockchip_sound_rt5514_ops = {
+       .hw_params = rockchip_sound_rt5514_hw_params,
+};
+
+static struct snd_soc_ops rockchip_sound_da7219_ops = {
+       .hw_params = rockchip_sound_da7219_hw_params,
+};
+
+enum {
+       DAILINK_MAX98357A,
+       DAILINK_RT5514,
+       DAILINK_DA7219,
+};
+
+static struct snd_soc_dai_link rockchip_dailinks[] = {
+       [DAILINK_MAX98357A] = {
+               .name = "MAX98357A",
+               .stream_name = "MAX98357A PCM",
+               .codec_dai_name = "HiFi",
+               .ops = &rockchip_sound_max98357a_ops,
+               /* set max98357a as slave */
+               .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+                       SND_SOC_DAIFMT_CBS_CFS,
+       },
+       [DAILINK_RT5514] = {
+               .name = "RT5514",
+               .stream_name = "RT5514 PCM",
+               .codec_dai_name = "rt5514-aif1",
+               .ops = &rockchip_sound_rt5514_ops,
+               /* set rt5514 as slave */
+               .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+                       SND_SOC_DAIFMT_CBS_CFS,
+       },
+       [DAILINK_DA7219] = {
+               .name = "DA7219",
+               .stream_name = "DA7219 PCM",
+               .codec_dai_name = "da7219-hifi",
+               .init = rockchip_sound_da7219_init,
+               .ops = &rockchip_sound_da7219_ops,
+               /* set da7219 as slave */
+               .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+                       SND_SOC_DAIFMT_CBS_CFS,
+       },
+};
+
+static struct snd_soc_card rockchip_sound_card = {
+       .name = "rk3399-gru-sound",
+       .owner = THIS_MODULE,
+       .dai_link = rockchip_dailinks,
+       .num_links =  ARRAY_SIZE(rockchip_dailinks),
+       .dapm_widgets = rockchip_dapm_widgets,
+       .num_dapm_widgets = ARRAY_SIZE(rockchip_dapm_widgets),
+       .dapm_routes = rockchip_dapm_routes,
+       .num_dapm_routes = ARRAY_SIZE(rockchip_dapm_routes),
+       .controls = rockchip_controls,
+       .num_controls = ARRAY_SIZE(rockchip_controls),
+};
+
+static int rockchip_sound_probe(struct platform_device *pdev)
+{
+       struct snd_soc_card *card = &rockchip_sound_card;
+       struct device_node *cpu_node;
+       int i, ret;
+
+       cpu_node = of_parse_phandle(pdev->dev.of_node, "rockchip,cpu", 0);
+       if (!cpu_node) {
+               dev_err(&pdev->dev, "Property 'rockchip,cpu' missing or invalid\n");
+               return -EINVAL;
+       }
+
+       for (i = 0; i < card->num_links; i++) {
+               rockchip_dailinks[i].platform_of_node = cpu_node;
+               rockchip_dailinks[i].cpu_of_node = cpu_node;
+
+               rockchip_dailinks[i].codec_of_node =
+                       of_parse_phandle(pdev->dev.of_node, "rockchip,codec", i);
+               if (!rockchip_dailinks[i].codec_of_node) {
+                       dev_err(&pdev->dev,
+                               "Property[%d] 'rockchip,codec' missing or invalid\n", i);
+                       return -EINVAL;
+               }
+       }
+
+       card->dev = &pdev->dev;
+       platform_set_drvdata(pdev, card);
+
+       ret = devm_snd_soc_register_card(&pdev->dev, card);
+       if (ret)
+               dev_err(&pdev->dev, "%s snd_soc_register_card fail %d\n",
+                       __func__, ret);
+
+       return ret;
+}
+
+static const struct of_device_id rockchip_sound_of_match[] = {
+       { .compatible = "rockchip,rk3399-gru-sound", },
+       {},
+};
+
+static struct platform_driver rockchip_sound_driver = {
+       .probe = rockchip_sound_probe,
+       .driver = {
+               .name = DRV_NAME,
+               .of_match_table = rockchip_sound_of_match,
+#ifdef CONFIG_PM
+               .pm = &snd_soc_pm_ops,
+#endif
+       },
+};
+
+module_platform_driver(rockchip_sound_driver);
+
+MODULE_AUTHOR("Xing Zheng [off-list ref]");
+MODULE_DESCRIPTION("Rockchip ASoC Machine Driver");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:" DRV_NAME);
+MODULE_DEVICE_TABLE(of, rockchip_sound_of_match);
--
1.7.9.5



_______________________________________________
Linux-rockchip mailing list
Linux-rockchip at lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

Re: [PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Xing Zheng <hidden>
Date: 2016-06-16 01:15:41

// + Adam,

On 2016?06?16? 03:43, Steve Barber wrote:
On Mon, Jun 13, 2016 at 1:42 AM, Xing Zheng[off-list ref]  wrote:
quoted
+
+static int rockchip_sound_da7219_hw_params(struct snd_pcm_substream *substream,
+                            struct snd_pcm_hw_params *params)
+{
+       struct snd_soc_pcm_runtime *rtd = substream->private_data;
+       struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
+       struct snd_soc_dai *codec_dai = rtd->codec_dai;
+       struct snd_soc_dapm_context *dapm =&rtd->card->dapm;
+       int mclk, ret;
+
+       snd_soc_dapm_disable_pin(dapm, "Speakers");
+       snd_soc_dapm_disable_pin(dapm, "Int Mic");
+       snd_soc_dapm_enable_pin(dapm, "Headphones");
+       snd_soc_dapm_enable_pin(dapm, "Headset Mic");
+       snd_soc_dapm_sync(dapm);
+
+       /* in bypass mode, the mclk has to be one of the frequencies below */
+       switch (params_rate(params)) {
+       case 8000:
+       case 16000:
+       case 24000:
+       case 32000:
+       case 48000:
+       case 64000:
+       case 96000:
+               mclk = 12288000;
+               break;
+       case 11025:
+       case 22050:
+       case 44100:
+       case 88200:
+               mclk = 11289600;
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk,
+                                    SND_SOC_CLOCK_OUT);
+       if (ret<  0) {
+               dev_err(codec_dai->dev, "Can't set cpu clock out %d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_dai_set_sysclk(codec_dai, 0, mclk,
+                                    SND_SOC_CLOCK_IN);
+       if (ret<  0) {
+               dev_err(codec_dai->dev, "Can't set codec clock in %d\n", ret);
+               return ret;
+       }
+
+       ret = snd_soc_dai_set_pll(codec_dai, 0, DA7219_SYSCLK_MCLK, 0, 0);
+       if (ret<  0) {
+               dev_err(codec_dai->dev, "Can't set pll sysclk mclk %d\n", ret);
+               return ret;
+       }
+
+       return 0;
+}
+
+static int rockchip_sound_da7219_init(struct snd_soc_pcm_runtime *rtd)
+{
+       struct snd_soc_codec *codec = rtd->codec_dais[0]->codec;
+       int ret;
+
+       /* Enable Headset and 4 Buttons Jack detection */
+       ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
+                                   SND_JACK_HEADSET |
Should this also include SND_JACK_LINEOUT? da7219 differentiates
between the two so not including lineout means, for example, we can
miss jack insertion/removal events.
Hi Adam,

Could you please confirm Steve says that about SND_JACK_LINEOUT?

Thanks.

-- 
- Xing Zheng

Re: [alsa-devel] [PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Ben Zhang <hidden>
Date: 2016-06-16 02:36:21

On Wed, Jun 15, 2016 at 5:44 AM, Rob Herring [off-list ref] wrote:
On Wed, Jun 15, 2016 at 4:53 AM, Mark Brown [off-list ref] wrote:
quoted
On Tue, Jun 14, 2016 at 05:38:10PM -0500, Rob Herring wrote:
quoted
On Mon, Jun 13, 2016 at 04:42:18PM +0800, Xing Zheng wrote:
quoted
quoted
+sound {
+   compatible = "rockchip,rk3399-gru-sound";
+   rockchip,cpu = <&i2s0>;
+   rockchip,codec = <&max98357a &rt5514 &da7219>;
quoted
These seem fairly standard though a variety of versions in the bindings.
Can we use audio-codec and audio-cpu (or cpu or audio-dai) here? Mark?
Well, the roles aren't actually that standard (the fact that there's
multiple CODECs and one CPU DAI here is really odd and definitely needs
a very system specific interpretation).  If they were standard we
already have the simple-card binding that things should be using.
There's no point in standard property names if the interpretation has to
be non-standard.
Okay, I agree with the system specific interpretation part. However, I
don't think using simple-card or not determines using common
properties.
Hi Mark, I have a question for the one CPU DAI + multiple CODECs
setup. The machine driver defines 3 DAI links, connecting the same CPU
DAI to 3 different CODEC DAIs. Does ASoC/DAPM support
enabling/disabling an individual DAI link based on the status of the
endpoint widget (e.g. DAPM_SPK) connected to the corresponding CODEC?

The goal is to let user select either headphone(da7219) or
speaker(max98357a) as output. max98357a driver does not expose a
kcontrol for mute. It sets a shutdown GPIO on PCM_TRIGGER_START/STOP.
And it seems soc_pcm_trigger calls the trigger op of all 3 CODEC DAIs,
even when the DAPM_SPK widget is disabled by its pin switch.
quoted
The vendor specific prefixes are there because all bindings are supposed
to add prefixes to property names.
...unless they are common.

Rob
_______________________________________________
Alsa-devel mailing list
Alsa-devel at alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
Thanks,
Ben

RE: [PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Opensource [Adam Thomson] <hidden>
Date: 2016-06-16 08:40:57

On 16 June 2016 02:15, Xing Zheng wrote:
quoted
quoted
+       /* Enable Headset and 4 Buttons Jack detection */
+       ret = snd_soc_card_jack_new(rtd->card, "Headset Jack",
+                                   SND_JACK_HEADSET |
Should this also include SND_JACK_LINEOUT? da7219 differentiates
between the two so not including lineout means, for example, we can
miss jack insertion/removal events.
Hi Adam,

Could you please confirm Steve says that about SND_JACK_LINEOUT?

Thanks.
Hi Xing Zheng,

Yes, as Steve mentioned DA7219 does support SND_JACK_LINEOUT so we should really
include this here.

Re: [PATCH v5] ASoC: rockchip: Add machine driver for RK3399 GRU Boards

From: Mark Brown <broonie@kernel.org>
Date: 2016-06-17 12:21:44

On Wed, Jun 15, 2016 at 07:44:32AM -0500, Rob Herring wrote:
On Wed, Jun 15, 2016 at 4:53 AM, Mark Brown [off-list ref] wrote:
quoted
There's no point in standard property names if the interpretation has to
be non-standard.
Okay, I agree with the system specific interpretation part. However, I
don't think using simple-card or not determines using common
properties.
The point here is that if those properties were to have a standard
meaning the system would be using simple-card anyway, the meaning is
entirely in the context of the card.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160617/8982dd54/attachment.sig>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help