* [PATCH v2 10/12] ASoC: dw-hdmi-audio: add codec driver for dw hdmi audio
[not found] <1422617031-25098-1-git-send-email-ykk@rock-chips.com>
@ 2015-01-30 11:41 ` Yakir Yang
[not found] ` <1422618071-27178-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
[not found] ` <1422617031-25098-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2015-01-30 11:44 ` [PATCH v2 12/12] dt-bindings: Add documentation for Rockchip dw-hdmi-audio Yakir Yang
2 siblings, 1 reply; 6+ messages in thread
From: Yakir Yang @ 2015-01-30 11:41 UTC (permalink / raw)
To: Russell King, Liam Girdwood, Mark Brown, Jaroslav Kysela
Cc: Takashi Iwai, Lars-Peter Clausen, Brian Austin, Bard Liao,
Max Filippov, Oder Chiou, Arnd Bergmann, Sean Cross, Jyri Sarha,
Ben Zhang, Yakir Yang, linux-kernel, alsa-devel, Heiko Stuebner,
linux-arm-kernel, Rob Herring, Pawel Moll, Mark Rutland,
Ian Campbell, Kumar Gala, devicetree, djkurtz, dbehr, mmind00,
dianders, marcheu, mark.yao, rockchip-discuss
codec driver creat an standard alsa device, than config audio
and report jack status through some callback interfaces that
dw_hdmi driver support.
Signed-off-by: Yakir Yang <ykk@rock-chips.com>
---
Changes in v2:
- Update dw_hdmi audio control interfaces, and adjust jack report process
sound/soc/codecs/Kconfig | 4 +
sound/soc/codecs/Makefile | 2 +
sound/soc/codecs/dw-hdmi-audio.c | 314 +++++++++++++++++++++++++++++++++++++++
sound/soc/codecs/dw-hdmi-audio.h | 17 +++
4 files changed, 337 insertions(+)
create mode 100644 sound/soc/codecs/dw-hdmi-audio.c
create mode 100644 sound/soc/codecs/dw-hdmi-audio.h
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index 8349f98..b34dd12 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -75,6 +75,7 @@ config SND_SOC_ALL_CODECS
select SND_SOC_MC13783 if MFD_MC13XXX
select SND_SOC_ML26124 if I2C
select SND_SOC_HDMI_CODEC
+ select SND_SOC_DW_HDMI_AUDIO
select SND_SOC_PCM1681 if I2C
select SND_SOC_PCM1792A if SPI_MASTER
select SND_SOC_PCM3008
@@ -459,6 +460,9 @@ config SND_SOC_MAX98095
config SND_SOC_MAX9850
tristate
+config SND_SOC_DW_HDMI_AUDIO
+ tristate
+
config SND_SOC_PCM1681
tristate "Texas Instruments PCM1681 CODEC"
depends on I2C
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index bbdfd1e..0ebb664 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -68,6 +68,7 @@ snd-soc-max9850-objs := max9850.o
snd-soc-mc13783-objs := mc13783.o
snd-soc-ml26124-objs := ml26124.o
snd-soc-hdmi-codec-objs := hdmi.o
+snd-soc-dw-hdmi-audio-objs := dw-hdmi-audio.o
snd-soc-pcm1681-objs := pcm1681.o
snd-soc-pcm1792a-codec-objs := pcm1792a.o
snd-soc-pcm3008-objs := pcm3008.o
@@ -249,6 +250,7 @@ obj-$(CONFIG_SND_SOC_MAX9850) += snd-soc-max9850.o
obj-$(CONFIG_SND_SOC_MC13783) += snd-soc-mc13783.o
obj-$(CONFIG_SND_SOC_ML26124) += snd-soc-ml26124.o
obj-$(CONFIG_SND_SOC_HDMI_CODEC) += snd-soc-hdmi-codec.o
+obj-$(CONFIG_SND_SOC_DW_HDMI_AUDIO) += snd-soc-dw-hdmi-audio.o
obj-$(CONFIG_SND_SOC_PCM1681) += snd-soc-pcm1681.o
obj-$(CONFIG_SND_SOC_PCM1792A) += snd-soc-pcm1792a-codec.o
obj-$(CONFIG_SND_SOC_PCM3008) += snd-soc-pcm3008.o
diff --git a/sound/soc/codecs/dw-hdmi-audio.c b/sound/soc/codecs/dw-hdmi-audio.c
new file mode 100644
index 0000000..ed046ce
--- /dev/null
+++ b/sound/soc/codecs/dw-hdmi-audio.c
@@ -0,0 +1,314 @@
+/*
+ * dw-hdmi-codec.c
+ *
+ * DesignerWare ALSA SoC DAI driver for DW HDMI audio.
+ * Copyright (c) 2014, CORPORATION. All rights reserved.
+ * Authors: Yakir Yang <ykk@rock-chips.com>
+ *
+ * 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/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/device.h>
+#include <linux/moduleparam.h>
+
+#include <sound/pcm.h>
+#include <sound/soc.h>
+#include <sound/core.h>
+#include <sound/jack.h>
+#include <sound/initval.h>
+#include <sound/pcm_params.h>
+
+#include <drm/bridge/dw_hdmi.h>
+#include "dw-hdmi-audio.h"
+
+struct snd_dw_hdmi {
+ struct device *dev;
+ struct dw_hdmi_audio_data data;
+
+ u8 jack_status;
+ struct snd_soc_jack *jack;
+ struct delayed_work jack_work;
+};
+
+/**
+ * dw_hdmi_jack_detect - Enable hdmi detection via the HDMI IRQ
+ *
+ * @codec: HDMI codec
+ * @jack: jack to report detection events on
+ *
+ * Enable HDMI detection via IRQ on the HDMI.
+ *
+ * If no jack is supplied detection will be disabled.
+ */
+int dw_hdmi_jack_detect(struct snd_soc_codec *codec_dai,
+ struct snd_soc_jack *jack)
+{
+ struct snd_dw_hdmi *hdmi = snd_soc_codec_get_drvdata(codec_dai);
+
+ hdmi->jack = jack;
+ hdmi->jack_status = 0;
+
+ snd_soc_jack_report(hdmi->jack, 0, SND_JACK_LINEOUT);
+
+ queue_delayed_work(system_power_efficient_wq, &hdmi->jack_work,
+ msecs_to_jiffies(50));
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(dw_hdmi_jack_detect);
+
+static void dw_hdmi_jack_work(struct work_struct *work)
+{
+ struct snd_dw_hdmi *hdmi = container_of(work, struct snd_dw_hdmi,
+ jack_work.work);
+ u8 jack_status, status;
+
+ status = hdmi->data.get_connect_status(hdmi->data.dw);
+ jack_status = status ? SND_JACK_LINEOUT : 0;
+ if (jack_status != hdmi->jack_status) {
+ snd_soc_jack_report(hdmi->jack, jack_status,
+ SND_JACK_LINEOUT);
+ hdmi->jack_status = jack_status;
+
+ dev_dbg(hdmi->dev, "jack report [%d]\n", hdmi->jack_status);
+ }
+}
+
+static irqreturn_t snd_dw_hdmi_irq(int irq, void *dev_id)
+{
+ struct snd_dw_hdmi *hdmi = dev_id;
+
+ queue_delayed_work(system_power_efficient_wq, &hdmi->jack_work,
+ msecs_to_jiffies(50));
+
+ return IRQ_HANDLED;
+}
+
+static int dw_hdmi_dai_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params,
+ struct snd_soc_dai *codec_dai)
+{
+ struct snd_dw_hdmi *hdmi = snd_soc_dai_get_drvdata(codec_dai);
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct hdmi_audio_fmt hdmi_fmt;
+ unsigned int fmt, rate, chan, width;
+
+ fmt = rtd->dai_link->dai_fmt & SND_SOC_DAIFMT_FORMAT_MASK;
+ switch (fmt) {
+ case SND_SOC_DAIFMT_I2S:
+ hdmi_fmt.dai_fmt = AUDIO_DAIFMT_IIS;
+ break;
+ case SND_SOC_DAIFMT_LEFT_J:
+ hdmi_fmt.dai_fmt = AUDIO_DAIFMT_LEFT_J;
+ break;
+ case SND_SOC_DAIFMT_RIGHT_J:
+ hdmi_fmt.dai_fmt = AUDIO_DAIFMT_RIGHT_J;
+ break;
+ default:
+ dev_err(codec_dai->dev, "DAI format unsupported");
+ return -EINVAL;
+ }
+ dev_dbg(codec_dai->dev, "[codec_dai]: dai_fmt = %d.\n", fmt);
+
+ width = params_width(params);
+ switch (width) {
+ case 16:
+ case 24:
+ hdmi_fmt.word_length = width;
+ break;
+ default:
+ dev_err(codec_dai->dev, "width[%d] not support!\n", width);
+ return -EINVAL;
+ }
+ dev_dbg(codec_dai->dev, "[codec_dai]: word_length = %d.\n", width);
+
+ chan = params_channels(params);
+ switch (chan) {
+ case 2:
+ hdmi_fmt.chan_num = AUDIO_CHANNELNUM_2;
+ break;
+ case 4:
+ hdmi_fmt.chan_num = AUDIO_CHANNELNUM_4;
+ break;
+ case 6:
+ hdmi_fmt.chan_num = AUDIO_CHANNELNUM_6;
+ break;
+ case 8:
+ hdmi_fmt.chan_num = AUDIO_CHANNELNUM_8;
+ break;
+ default:
+ dev_err(codec_dai->dev, "channel[%d] not support!\n", chan);
+ return -EINVAL;
+ }
+ dev_dbg(codec_dai->dev, "[codec_dai]: chan_num = %d.\n", chan);
+
+ rate = params_rate(params);
+ switch (rate) {
+ case 32000:
+ case 44100:
+ case 48000:
+ case 88200:
+ case 96000:
+ case 176400:
+ case 192000:
+ hdmi_fmt.sample_rate = rate;
+ break;
+ default:
+ dev_err(codec_dai->dev, "rate[%d] not support!\n", rate);
+ return -EINVAL;
+ }
+ dev_dbg(codec_dai->dev, "[codec_dai]: sample_rate = %d.\n", rate);
+
+ hdmi->data.config_audio(hdmi->data.dw, &hdmi_fmt);
+
+ return 0;
+}
+
+static int dw_hdmi_dai_trigger(struct snd_pcm_substream *substream,
+ int cmd, struct snd_soc_dai *codec_dai)
+{
+ struct snd_dw_hdmi *hdmi = snd_soc_dai_get_drvdata(codec_dai);
+
+ switch (cmd) {
+ case SNDRV_PCM_TRIGGER_START:
+ case SNDRV_PCM_TRIGGER_RESUME:
+ case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+ hdmi->data.enable_clk(hdmi->data.dw);
+ dev_dbg(codec_dai->dev, "[codec_dai]: trigger enable.\n");
+ break;
+
+ case SNDRV_PCM_TRIGGER_STOP:
+ case SNDRV_PCM_TRIGGER_SUSPEND:
+ case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+ hdmi->data.disable_clk(hdmi->data.dw);
+ dev_dbg(codec_dai->dev, "[codec_dai]: trigger disable.\n");
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static const struct snd_soc_dapm_widget dw_hdmi_widgets[] = {
+ SND_SOC_DAPM_OUTPUT("TX"),
+};
+
+static const struct snd_soc_dapm_route dw_hdmi_routes[] = {
+ { "TX", NULL, "Playback" },
+};
+
+static const struct snd_soc_dai_ops dw_hdmi_dai_ops = {
+ .hw_params = dw_hdmi_dai_hw_params,
+ .trigger = dw_hdmi_dai_trigger,
+};
+
+static struct snd_soc_dai_driver dw_hdmi_audio_dai = {
+ .name = "dw-hdmi-hifi",
+ .playback = {
+ .stream_name = "Playback",
+ .channels_min = 2,
+ .channels_max = 8,
+ .rates = SNDRV_PCM_RATE_32000 |
+ SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 |
+ SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 |
+ SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000,
+ .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE,
+ },
+ .ops = &dw_hdmi_dai_ops,
+};
+
+static const struct snd_soc_codec_driver dw_hdmi_audio = {
+ .dapm_widgets = dw_hdmi_widgets,
+ .num_dapm_widgets = ARRAY_SIZE(dw_hdmi_widgets),
+ .dapm_routes = dw_hdmi_routes,
+ .num_dapm_routes = ARRAY_SIZE(dw_hdmi_routes),
+};
+
+static int dw_hdmi_audio_probe(struct platform_device *pdev)
+{
+ struct dw_hdmi_audio_data *data = pdev->dev.platform_data;
+ struct snd_dw_hdmi *hdmi;
+ int ret;
+
+ hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
+ if (!hdmi)
+ return -ENOMEM;
+
+ hdmi->data = *data;
+ hdmi->dev = &pdev->dev;
+ platform_set_drvdata(pdev, hdmi);
+
+ INIT_DELAYED_WORK(&hdmi->jack_work, dw_hdmi_jack_work);
+
+ ret = devm_request_irq(&pdev->dev, hdmi->data.irq, snd_dw_hdmi_irq,
+ IRQF_SHARED, "dw-hdmi-audio", hdmi);
+ if (ret) {
+ dev_err(&pdev->dev, "request irq failed (%d)\n", ret);
+ goto free_hdmi_data;
+ }
+
+ ret = snd_soc_register_codec(&pdev->dev, &dw_hdmi_audio,
+ &dw_hdmi_audio_dai, 1);
+ if (ret) {
+ dev_err(&pdev->dev, "register codec failed (%d)\n", ret);
+ goto free_irq;
+ }
+
+ dev_info(&pdev->dev, "hdmi audio init success.\n");
+
+ return 0;
+
+free_irq:
+ devm_free_irq(&pdev->dev, hdmi->data.irq, hdmi);
+free_hdmi_data:
+ devm_kfree(&pdev->dev, hdmi);
+
+ return ret;
+}
+
+static int dw_hdmi_audio_remove(struct platform_device *pdev)
+{
+ struct snd_dw_hdmi *hdmi = platform_get_drvdata(pdev);
+
+ snd_soc_unregister_codec(&pdev->dev);
+ devm_free_irq(&pdev->dev, hdmi->data.irq, hdmi);
+ devm_kfree(&pdev->dev, hdmi);
+
+ return 0;
+}
+
+static const struct of_device_id dw_hdmi_audio_ids[] = {
+ { .compatible = "dw-hdmi-audio", },
+ { }
+};
+
+static struct platform_driver dw_hdmi_audio_driver = {
+ .driver = {
+ .name = "dw-hdmi-audio",
+ .owner = THIS_MODULE,
+ .of_match_table = of_match_ptr(dw_hdmi_audio_ids),
+ },
+ .probe = dw_hdmi_audio_probe,
+ .remove = dw_hdmi_audio_remove,
+};
+module_platform_driver(dw_hdmi_audio_driver);
+
+MODULE_AUTHOR("Yakir Yang <ykk@rock-chips.com>");
+MODULE_DESCRIPTION("DW HDMI Audio ASoC Interface");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" "dw-hdmi-audio");
+MODULE_DEVICE_TABLE(of, dw_hdmi_audio_ids);
diff --git a/sound/soc/codecs/dw-hdmi-audio.h b/sound/soc/codecs/dw-hdmi-audio.h
new file mode 100644
index 0000000..2a7b5b4
--- /dev/null
+++ b/sound/soc/codecs/dw-hdmi-audio.h
@@ -0,0 +1,17 @@
+/*
+ * dw-hdmi-audio.h -- DW HDMI ALSA SoC Audio driver
+ *
+ * Copyright 2011-2012 DesignerWare Products
+ *
+ * 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.
+ */
+
+#ifndef _DW_HDMI_AUDIO_H
+#define _DW_HDMI_AUDIO_H
+
+int dw_hdmi_jack_detect(struct snd_soc_codec *codec_dai,
+ struct snd_soc_jack *jack);
+
+#endif
--
2.1.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 11/12] ASoC: rockchip-hdmi-audio: add sound driver for hdmi audio
[not found] ` <1422617031-25098-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
@ 2015-01-30 11:43 ` Yakir Yang
0 siblings, 0 replies; 6+ messages in thread
From: Yakir Yang @ 2015-01-30 11:43 UTC (permalink / raw)
To: Russell King, Liam Girdwood, Mark Brown, Jaroslav Kysela
Cc: Takashi Iwai, Lars-Peter Clausen, Brian Austin, Bard Liao,
Max Filippov, Oder Chiou, Arnd Bergmann, Sean Cross, Jyri Sarha,
Ben Zhang, Yakir Yang, linux-kernel-u79uwXL29TY76Z2rM5mHXA,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw, Heiko Stuebner,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Rob Herring,
Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
devicetree-u79uwXL29TY76Z2rM5mHXA, djkurtz-F7+t8E8rja9g9hUCZPvPmw,
dbehr-ph2c+iIn4itg9hUCZPvPmw, mmind00-gM/Ye1E23mwN+BqQ9rBEUg,
dianders-F7+t8E8rja9g9hUCZPvPmw, marcheu-F7+t8E8rja9g9hUCZPvPmw,
mark.yao-TNX95d0MmH7DzftRWevZcw,
rockchip-discuss-F7+t8E8rja9g9hUCZPvPmw
Add a sound driver that combines rockchip-i2s cpu_dai and dw-hdmi-codec
as codec_dai to provide hdmi audio output on rk3288 platforms.
Signed-off-by: Yakir Yang <ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
---
Changes in v2:
- give "codec-name" & "codec-dai-name" an const name
sound/soc/rockchip/Kconfig | 9 ++
sound/soc/rockchip/Makefile | 2 +
sound/soc/rockchip/rockchip_hdmi_audio.c | 196 +++++++++++++++++++++++++++++++
3 files changed, 207 insertions(+)
create mode 100644 sound/soc/rockchip/rockchip_hdmi_audio.c
diff --git a/sound/soc/rockchip/Kconfig b/sound/soc/rockchip/Kconfig
index e181826..ed2b7f0 100644
--- a/sound/soc/rockchip/Kconfig
+++ b/sound/soc/rockchip/Kconfig
@@ -14,3 +14,12 @@ config SND_SOC_ROCKCHIP_I2S
Say Y or M if you want to add support for I2S driver for
Rockchip I2S device. The device supports upto maximum of
8 channels each for play and record.
+
+config SND_SOC_ROCKCHIP_HDMI_AUDIO
+ tristate "ASoC support for Rockchip HDMI audio"
+ depends on SND_SOC_ROCKCHIP
+ select SND_SOC_ROCKCHIP_I2S
+ select SND_SOC_DW_HDMI_AUDIO
+ help
+ Say Y or M here if you want to add support for SoC audio on Rockchip
+ HDMI, such as rk3288 hdmi.
diff --git a/sound/soc/rockchip/Makefile b/sound/soc/rockchip/Makefile
index b921909..b9185b3 100644
--- a/sound/soc/rockchip/Makefile
+++ b/sound/soc/rockchip/Makefile
@@ -1,4 +1,6 @@
# ROCKCHIP Platform Support
snd-soc-i2s-objs := rockchip_i2s.o
+snd-soc-rockchip-hdmi-audio-objs := rockchip_hdmi_audio.o
obj-$(CONFIG_SND_SOC_ROCKCHIP_I2S) += snd-soc-i2s.o
+obj-$(CONFIG_SND_SOC_ROCKCHIP_HDMI_AUDIO) += snd-soc-rockchip-hdmi-audio.o
diff --git a/sound/soc/rockchip/rockchip_hdmi_audio.c b/sound/soc/rockchip/rockchip_hdmi_audio.c
new file mode 100644
index 0000000..0c9f497
--- /dev/null
+++ b/sound/soc/rockchip/rockchip_hdmi_audio.c
@@ -0,0 +1,196 @@
+/*
+ * rockchip-hdmi-card.c
+ *
+ * ROCKCHIP ALSA SoC DAI driver for HDMI audio on rockchip processors.
+ * Copyright (c) 2014, ROCKCHIP CORPORATION. All rights reserved.
+ * Authors: Yakir Yang <ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
+ *
+ * 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/device.h>
+#include <linux/platform_device.h>
+
+#include <sound/soc.h>
+#include <sound/pcm.h>
+#include <sound/jack.h>
+#include <sound/core.h>
+#include <sound/pcm_params.h>
+
+#include "rockchip_i2s.h"
+#include "../codecs/dw-hdmi-audio.h"
+
+#define DRV_NAME "rockchip-hdmi-audio"
+
+struct hdmi_audio_private {
+ struct snd_soc_jack hdmi_jack;
+};
+
+static int rockchip_hdmi_audio_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;
+ unsigned int dai_fmt = rtd->dai_link->dai_fmt;
+ int mclk, ret;
+
+ 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_fmt(cpu_dai, dai_fmt);
+ if (ret < 0) {
+ dev_err(cpu_dai->dev, "failed to set cpu_dai fmt.\n");
+ return ret;
+ }
+
+ ret = snd_soc_dai_set_sysclk(cpu_dai, 0, mclk, SND_SOC_CLOCK_OUT);
+ if (ret < 0) {
+ dev_err(cpu_dai->dev, "failed to set cpu_dai sysclk.\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+static int hdmi_audio_dai_init(struct snd_soc_pcm_runtime *runtime)
+{
+ struct snd_soc_codec *codec = runtime->codec;
+ struct snd_soc_card *card = runtime->card;
+ struct hdmi_audio_private *drv = snd_soc_card_get_drvdata(card);
+
+ /* Enable headphone jack detection */
+ snd_soc_jack_new(codec, "HDMI Jack", SND_JACK_LINEOUT,
+ &drv->hdmi_jack);
+
+ return dw_hdmi_jack_detect(codec, &drv->hdmi_jack);
+}
+
+static struct snd_soc_ops hdmi_audio_dai_ops = {
+ .hw_params = rockchip_hdmi_audio_hw_params,
+};
+
+static struct snd_soc_dai_link hdmi_audio_dai = {
+ .name = "RockchipHDMI",
+ .stream_name = "RockchipHDMI",
+ .codec_name = "dw-hdmi-audio",
+ .codec_dai_name = "dw-hdmi-hifi",
+ .init = hdmi_audio_dai_init,
+ .ops = &hdmi_audio_dai_ops,
+ .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
+ SND_SOC_DAIFMT_CBS_CFS,
+};
+
+static struct snd_soc_card rockchip_hdmi_audio_card = {
+ .name = "RockchipHDMI",
+ .owner = THIS_MODULE,
+ .dai_link = &hdmi_audio_dai,
+ .num_links = 1,
+};
+
+static int rockchip_hdmi_audio_probe(struct platform_device *pdev)
+{
+ struct snd_soc_card *card = &rockchip_hdmi_audio_card;
+ struct device_node *np = pdev->dev.of_node;
+ struct hdmi_audio_private *drv;
+ int ret;
+
+ drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_KERNEL);
+ if (!drv)
+ return -ENOMEM;
+
+ card->dev = &pdev->dev;
+ platform_set_drvdata(pdev, card);
+ snd_soc_card_set_drvdata(card, drv);
+
+ hdmi_audio_dai.cpu_of_node = of_parse_phandle(np, "i2s-controller", 0);
+ if (!hdmi_audio_dai.cpu_of_node) {
+ dev_err(&pdev->dev, "Property 'i2s-controller' missing !\n");
+ goto free_priv_data;
+ }
+
+ hdmi_audio_dai.platform_of_node = hdmi_audio_dai.cpu_of_node;
+
+ ret = snd_soc_register_card(card);
+ if (ret) {
+ dev_err(&pdev->dev, "register card failed (%d)\n", ret);
+ card->dev = NULL;
+ goto free_cpu_of_node;
+ }
+
+ dev_info(&pdev->dev, "hdmi audio init success.\n");
+
+ return 0;
+
+free_cpu_of_node:
+ hdmi_audio_dai.cpu_of_node = NULL;
+ hdmi_audio_dai.platform_of_node = NULL;
+free_priv_data:
+ snd_soc_card_set_drvdata(card, NULL);
+ platform_set_drvdata(pdev, NULL);
+ devm_kfree(&pdev->dev, drv);
+ card->dev = NULL;
+
+ return ret;
+}
+
+static int rockchip_hdmi_audio_remove(struct platform_device *pdev)
+{
+ struct snd_soc_card *card = platform_get_drvdata(pdev);
+
+ snd_soc_unregister_card(card);
+ snd_soc_card_set_drvdata(card, NULL);
+ platform_set_drvdata(pdev, NULL);
+ card->dev = NULL;
+
+ return 0;
+}
+
+static const struct of_device_id rockchip_hdmi_audio_of_match[] = {
+ { .compatible = "rockchip,rk3288-hdmi-audio", },
+ {},
+};
+
+static struct platform_driver rockchip_hdmi_audio_driver = {
+ .driver = {
+ .name = DRV_NAME,
+ .owner = THIS_MODULE,
+ .of_match_table = rockchip_hdmi_audio_of_match,
+ },
+ .probe = rockchip_hdmi_audio_probe,
+ .remove = rockchip_hdmi_audio_remove,
+};
+module_platform_driver(rockchip_hdmi_audio_driver);
+
+MODULE_AUTHOR("Yakir Yang <ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>");
+MODULE_DESCRIPTION("Rockchip HDMI Audio ASoC Interface");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:" DRV_NAME);
+MODULE_DEVICE_TABLE(of, rockchip_hdmi_audio_of_match);
--
2.1.2
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 12/12] dt-bindings: Add documentation for Rockchip dw-hdmi-audio
[not found] <1422617031-25098-1-git-send-email-ykk@rock-chips.com>
2015-01-30 11:41 ` [PATCH v2 10/12] ASoC: dw-hdmi-audio: add codec driver for dw hdmi audio Yakir Yang
[not found] ` <1422617031-25098-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
@ 2015-01-30 11:44 ` Yakir Yang
[not found] ` <1422618253-27312-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2 siblings, 1 reply; 6+ messages in thread
From: Yakir Yang @ 2015-01-30 11:44 UTC (permalink / raw)
To: Russell King, Liam Girdwood, Mark Brown, Jaroslav Kysela
Cc: Takashi Iwai, Lars-Peter Clausen, Brian Austin, Bard Liao,
Max Filippov, Oder Chiou, Arnd Bergmann, Sean Cross, Jyri Sarha,
Ben Zhang, Yakir Yang, linux-kernel, alsa-devel, Heiko Stuebner,
linux-arm-kernel, Rob Herring, Pawel Moll, Mark Rutland,
Ian Campbell, Kumar Gala, devicetree, djkurtz, dbehr, mmind00,
dianders, marcheu, mark.yao, rockchip-discuss
Required properties:
- compatible: platform specific
- cpu-of-node: the device node of cpu_dai
Signed-off-by: Yakir Yang <ykk@rock-chips.com>
---
Changes in v2:
- remove codec-name and codec-dai-name
- rename rockchip,rockchip-hdmi-audio.txt to rockchip,rockchip-dw-hdmi-audio.txt
.../bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt | 12 ++++++++++++
1 file changed, 12 insertions(+)
create mode 100644 Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
diff --git a/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt b/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
new file mode 100644
index 0000000..5b86eed
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
@@ -0,0 +1,12 @@
+Rockchip hdmi audio bindings
+
+Required properties:
+- compatible: platform specific
+- cpu-of-node: the device node of cpu_dai
+
+Example:
+
+sound {
+ compatible = "rockchip,rk3288-hdmi-audio";
+ cpu-of-node = <&i2s>;
+};
--
2.1.2
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 12/12] dt-bindings: Add documentation for Rockchip dw-hdmi-audio
[not found] ` <1422618253-27312-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
@ 2015-01-31 11:36 ` Russell King - ARM Linux
[not found] ` <20150131113659.GA26493-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
0 siblings, 1 reply; 6+ messages in thread
From: Russell King - ARM Linux @ 2015-01-31 11:36 UTC (permalink / raw)
To: Yakir Yang
Cc: Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
Lars-Peter Clausen, Brian Austin, Bard Liao, Max Filippov,
Oder Chiou, Arnd Bergmann, Sean Cross, Jyri Sarha, Ben Zhang,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw, Heiko Stuebner,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Rob Herring,
Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
devicetree-u79uwXL29TY76Z2rM5mHXA, djkurtz-F7+t8E8rja9g9hUCZPvPmw,
dbehr-ph2c+iIn4itg9hUCZPvPmw, mmind00-gM/Ye1E23mwN+BqQ9rBEUg,
dianders-F7+t8E8rja9g9hUCZPvPmw, march
On Fri, Jan 30, 2015 at 06:44:13AM -0500, Yakir Yang wrote:
> Required properties:
> - compatible: platform specific
> - cpu-of-node: the device node of cpu_dai
>
> Signed-off-by: Yakir Yang <ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
> ---
> Changes in v2:
> - remove codec-name and codec-dai-name
> - rename rockchip,rockchip-hdmi-audio.txt to rockchip,rockchip-dw-hdmi-audio.txt
>
> .../bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
>
> diff --git a/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt b/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
> new file mode 100644
> index 0000000..5b86eed
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
> @@ -0,0 +1,12 @@
> +Rockchip hdmi audio bindings
> +
> +Required properties:
> +- compatible: platform specific
> +- cpu-of-node: the device node of cpu_dai
> +
> +Example:
> +
> +sound {
> + compatible = "rockchip,rk3288-hdmi-audio";
> + cpu-of-node = <&i2s>;
> +};
In patch 11, it looks like you parse a property called i2s-controller.
This doesn't appear to be documented. Maybe it's what you call
"cpu-of-node" above?
--
FTTC broadband for 0.8mile line: currently at 10.5Mbps down 400kbps up
according to speedtest.net.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 10/12] ASoC: dw-hdmi-audio: add codec driver for dw hdmi audio
[not found] ` <1422618071-27178-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
@ 2015-01-31 11:39 ` Russell King - ARM Linux
0 siblings, 0 replies; 6+ messages in thread
From: Russell King - ARM Linux @ 2015-01-31 11:39 UTC (permalink / raw)
To: Yakir Yang
Cc: Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
Lars-Peter Clausen, Brian Austin, Bard Liao, Max Filippov,
Oder Chiou, Arnd Bergmann, Sean Cross, Jyri Sarha, Ben Zhang,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw, Heiko Stuebner,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Rob Herring,
Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
devicetree-u79uwXL29TY76Z2rM5mHXA, djkurtz-F7+t8E8rja9g9hUCZPvPmw,
dbehr-ph2c+iIn4itg9hUCZPvPmw, mmind00-gM/Ye1E23mwN+BqQ9rBEUg,
dianders-F7+t8E8rja9g9hUCZPvPmw, march
On Fri, Jan 30, 2015 at 06:41:11AM -0500, Yakir Yang wrote:
> codec driver creat an standard alsa device, than config audio
> and report jack status through some callback interfaces that
> dw_hdmi driver support.
>
> Signed-off-by: Yakir Yang <ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
> ---
> Changes in v2:
> - Update dw_hdmi audio control interfaces, and adjust jack report process
As you are aware, this can't work with iMX6 SoCs. We need to come up with
some way to deal with the different IP cores in a sane way.
The "codec" part of this IP is different between the two implementations;
your ASoC codec driver is not useful on the iMX6 SoC implementation.
We need to find a way to allow these two implementations to co-exist
sanely.
--
FTTC broadband for 0.8mile line: currently at 10.5Mbps down 400kbps up
according to speedtest.net.
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 12/12] dt-bindings: Add documentation for Rockchip dw-hdmi-audio
[not found] ` <20150131113659.GA26493-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
@ 2015-01-31 13:51 ` Yang Kuankuan
0 siblings, 0 replies; 6+ messages in thread
From: Yang Kuankuan @ 2015-01-31 13:51 UTC (permalink / raw)
To: Russell King - ARM Linux
Cc: Liam Girdwood, Mark Brown, Jaroslav Kysela, Takashi Iwai,
Lars-Peter Clausen, Brian Austin, Bard Liao, Max Filippov,
Oder Chiou, Arnd Bergmann, Sean Cross, Jyri Sarha, Ben Zhang,
linux-kernel-u79uwXL29TY76Z2rM5mHXA,
alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw, Heiko Stuebner,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Rob Herring,
Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
devicetree-u79uwXL29TY76Z2rM5mHXA, djkurtz-F7+t8E8rja9g9hUCZPvPmw,
dbehr-ph2c+iIn4itg9hUCZPvPmw, mmind00-gM/Ye1E23mwN+BqQ9rBEUg,
dianders-F7+t8E8rja9g9hUCZPvPmw, march
On 01/31/2015 06:36 AM, Russell King - ARM Linux wrote:
> On Fri, Jan 30, 2015 at 06:44:13AM -0500, Yakir Yang wrote:
>> Required properties:
>> - compatible: platform specific
>> - cpu-of-node: the device node of cpu_dai
>>
>> Signed-off-by: Yakir Yang <ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
>> ---
>> Changes in v2:
>> - remove codec-name and codec-dai-name
>> - rename rockchip,rockchip-hdmi-audio.txt to rockchip,rockchip-dw-hdmi-audio.txt
>>
>> .../bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt | 12 ++++++++++++
>> 1 file changed, 12 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
>>
>> diff --git a/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt b/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
>> new file mode 100644
>> index 0000000..5b86eed
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/sound/rockchip,rockchip-dw-hdmi-audio.txt
>> @@ -0,0 +1,12 @@
>> +Rockchip hdmi audio bindings
>> +
>> +Required properties:
>> +- compatible: platform specific
>> +- cpu-of-node: the device node of cpu_dai
>> +
>> +Example:
>> +
>> +sound {
>> + compatible = "rockchip,rk3288-hdmi-audio";
>> + cpu-of-node = <&i2s>;
>> +};
> In patch 11, it looks like you parse a property called i2s-controller.
> This doesn't appear to be documented. Maybe it's what you call
> "cpu-of-node" above?
>
Mistaken, i will modify dt-bings in next version v3.
Thanks for your kindness remind. : )
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2015-01-31 13:51 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1422617031-25098-1-git-send-email-ykk@rock-chips.com>
2015-01-30 11:41 ` [PATCH v2 10/12] ASoC: dw-hdmi-audio: add codec driver for dw hdmi audio Yakir Yang
[not found] ` <1422618071-27178-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2015-01-31 11:39 ` Russell King - ARM Linux
[not found] ` <1422617031-25098-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2015-01-30 11:43 ` [PATCH v2 11/12] ASoC: rockchip-hdmi-audio: add sound driver for " Yakir Yang
2015-01-30 11:44 ` [PATCH v2 12/12] dt-bindings: Add documentation for Rockchip dw-hdmi-audio Yakir Yang
[not found] ` <1422618253-27312-1-git-send-email-ykk-TNX95d0MmH7DzftRWevZcw@public.gmane.org>
2015-01-31 11:36 ` Russell King - ARM Linux
[not found] ` <20150131113659.GA26493-l+eeeJia6m9vn6HldHNs0ANdhmdF6hFW@public.gmane.org>
2015-01-31 13:51 ` Yang Kuankuan
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).