All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC v3 0/7] ASoC: Add mediatek HDMI codec support
@ 2016-01-12 15:38 Philipp Zabel
       [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  0 siblings, 1 reply; 15+ messages in thread
From: Philipp Zabel @ 2016-01-12 15:38 UTC (permalink / raw)
  To: alsa-devel
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Philipp Zabel, Arnaud Pouliquen,
	Liam Girdwood, Jyri Sarha, Cawa Cheng, Mark Brown,
	linux-mediatek, Daniel Kurtz, kernel, Matthias Brugger

Hi,

these patches add an interface for Jyri's generic hdmi-codec driver [1] to
the mediatek hdmi bridge driver. I have added an initial connector status
event, made the hdmi bridge driver reuse the hdmi_codec_params that include
the IEC958 channel state, included a fix to allow playback while HDMI is not
connected, and added an ELD mixer control to the hdmi-codec driver.

The mediatek drm patches apply on top of
https://patchwork.kernel.org/patch/8018331/ ("drm/mediatek: Add HDMI support"),
the asoc patches depend on these two patches:
https://patchwork.kernel.org/patch/7215121/ ("ALSA: pcm: add IEC958 channel status helper for hw_params")
[1] https://patchwork.kernel.org/patch/7215271/ ("ASoC: hdmi-codec: Add hdmi-codec for external HDMI-encoders")

Changes since v2:
 - Pass down and reuse hdmi_codec_params, including the IEC958
   channel state.
 - Fixed hw_params not to fail when no hdmi cable is connected
 - Send an initial notification to set the correct jack state
 - Don't call get_eld, copy the ELD contained in the hdmi_event instead
 - Add an ELD control to the hdmi-codec driver

Koro Chen (1):
  ASoC: mediatek: Add HDMI dai-links in the machine driver

Philipp Zabel (6):
  drm/mediatek: hdmi: Add audio interface to the hdmi-codec driver
  ASoC: mediatek: address dai link array entries by enum
  video: rmk's HDMI notification prototype
  drm/mediatek: hdmi: issue notifications
  ASoC: hdmi-codec: Use HDMI notifications to add jack support
  ASoC: hdmi-codec: Add ELD control

 .../bindings/sound/mt8173-rt5650-rt5676.txt        |   5 +-
 drivers/gpu/drm/mediatek/Kconfig                   |   1 +
 drivers/gpu/drm/mediatek/mtk_cec.c                 |  11 ++
 drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c        | 148 +++++++++++++++++++++
 drivers/gpu/drm/mediatek/mtk_hdmi.c                |  89 ++++++-------
 drivers/gpu/drm/mediatek/mtk_hdmi.h                |  10 +-
 drivers/gpu/drm/mediatek/mtk_hdmi_hw.c             |  94 ++-----------
 drivers/gpu/drm/mediatek/mtk_hdmi_hw.h             |   4 +-
 drivers/video/Makefile                             |   2 +-
 drivers/video/hdmi-not.c                           |  61 +++++++++
 include/linux/hdmi-not.h                           |  39 ++++++
 include/sound/hdmi-codec.h                         |   6 +
 sound/soc/codecs/hdmi-codec.c                      | 105 ++++++++++++++-
 sound/soc/mediatek/mt8173-rt5650-rt5676.c          |  66 ++++++++-
 14 files changed, 496 insertions(+), 145 deletions(-)
 create mode 100644 drivers/video/hdmi-not.c
 create mode 100644 include/linux/hdmi-not.h

-- 
2.6.4

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

* [RFC v3 1/7] drm/mediatek: hdmi: Add audio interface to the hdmi-codec driver
       [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
@ 2016-01-12 15:38   ` Philipp Zabel
  2016-01-12 15:38   ` [RFC v3 2/7] ASoC: mediatek: address dai link array entries by enum Philipp Zabel
                     ` (5 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2016-01-12 15:38 UTC (permalink / raw)
  To: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Philipp Zabel, Jie Qiu,
	Arnaud Pouliquen, Liam Girdwood, Jyri Sarha, Cawa Cheng,
	Mark Brown, linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Matthias Brugger

Add the interface needed by Jyri's generic hdmi-codec driver [1] to start
or stop audio playback and to retrieve ELD (EDID like data) to limit the
supported audio formats to the HDMI sink capabilities.

[1] https://patchwork.kernel.org/patch/7215271/ ("ASoC: hdmi-codec: Add
    hdmi-codec for external HDMI-encoders")

Signed-off-by: Jie Qiu <jie.qiu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
Signed-off-by: Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
---
Changes since v2:
 - Pass down and reuse hdmi_codec_params, including the IEC958
   channel state.
 - Fixed hw_params not to fail when no hdmi cable is connected
---
 drivers/gpu/drm/mediatek/Kconfig            |   1 +
 drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c | 145 ++++++++++++++++++++++++++++
 drivers/gpu/drm/mediatek/mtk_hdmi.c         |  89 +++++++++--------
 drivers/gpu/drm/mediatek/mtk_hdmi.h         |  10 +-
 drivers/gpu/drm/mediatek/mtk_hdmi_hw.c      |  94 +++---------------
 drivers/gpu/drm/mediatek/mtk_hdmi_hw.h      |   4 +-
 6 files changed, 207 insertions(+), 136 deletions(-)

diff --git a/drivers/gpu/drm/mediatek/Kconfig b/drivers/gpu/drm/mediatek/Kconfig
index 829ab66..93b7ca9 100644
--- a/drivers/gpu/drm/mediatek/Kconfig
+++ b/drivers/gpu/drm/mediatek/Kconfig
@@ -17,6 +17,7 @@ config DRM_MEDIATEK
 config DRM_MEDIATEK_HDMI
 	tristate "DRM HDMI Support for Mediatek SoCs"
 	depends on DRM_MEDIATEK
+	select SND_SOC_HDMI_CODEC if SND_SOC
 	select GENERIC_PHY
 	help
 	  DRM/KMS HDMI driver for Mediatek SoCs
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c
index 6eff3f4..0d4a646 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c
@@ -26,6 +26,7 @@
 #include <linux/of_graph.h>
 #include <linux/phy/phy.h>
 #include <linux/platform_device.h>
+#include <sound/hdmi-codec.h>
 #include "mtk_cec.h"
 #include "mtk_hdmi.h"
 #include "mtk_hdmi_hw.h"
@@ -436,6 +437,148 @@ static irqreturn_t hdmi_flt_n_5v_irq_thread(int irq, void *arg)
 	return IRQ_HANDLED;
 }
 
+/*
+ * HDMI audio codec callbacks
+ */
+
+static int mtk_hdmi_audio_hw_params(struct device *dev,
+				    struct hdmi_codec_daifmt *daifmt,
+				    struct hdmi_codec_params *params)
+{
+	struct mtk_hdmi *hdmi = dev_get_drvdata(dev);
+	struct hdmi_audio_param hdmi_params;
+	unsigned int chan = params->cea.channels;
+
+	dev_dbg(hdmi->dev, "%s: %u Hz, %d bit, %d channels\n", __func__,
+		params->sample_rate, params->sample_width, chan);
+
+	if (!hdmi->bridge.encoder)
+		return -ENODEV;
+
+	switch (chan) {
+	case 2:
+		hdmi_params.aud_input_chan_type = HDMI_AUD_CHAN_TYPE_2_0;
+		break;
+	case 4:
+		hdmi_params.aud_input_chan_type = HDMI_AUD_CHAN_TYPE_4_0;
+		break;
+	case 6:
+		hdmi_params.aud_input_chan_type = HDMI_AUD_CHAN_TYPE_5_1;
+		break;
+	case 8:
+		hdmi_params.aud_input_chan_type = HDMI_AUD_CHAN_TYPE_7_1;
+		break;
+	default:
+		dev_err(hdmi->dev, "channel[%d] not supported!\n", chan);
+		return -EINVAL;
+	}
+
+	switch (params->sample_rate) {
+	case 32000:
+	case 44100:
+	case 48000:
+	case 88200:
+	case 96000:
+	case 176400:
+	case 192000:
+		break;
+	default:
+		dev_err(hdmi->dev, "rate[%d] not supported!\n",
+			params->sample_rate);
+		return -EINVAL;
+	}
+
+	switch (daifmt->fmt) {
+	case HDMI_I2S:
+		hdmi_params.aud_codec = HDMI_AUDIO_CODING_TYPE_PCM;
+		hdmi_params.aud_sampe_size = HDMI_AUDIO_SAMPLE_SIZE_16;
+		hdmi_params.aud_input_type = HDMI_AUD_INPUT_I2S;
+		hdmi_params.aud_i2s_fmt = HDMI_I2S_MODE_I2S_24BIT;
+		hdmi_params.aud_mclk = HDMI_AUD_MCLK_128FS;
+		break;
+	default:
+		dev_err(hdmi->dev, "%s: Invalid DAI format %d\n", __func__,
+			daifmt->fmt);
+		return -EINVAL;
+	}
+
+	memcpy(&hdmi_params.codec_params, params,
+	       sizeof(hdmi_params.codec_params));
+
+	mtk_hdmi_audio_set_param(hdmi, &hdmi_params);
+
+	return 0;
+}
+
+static int mtk_hdmi_audio_startup(struct device *dev,
+				  void (*abort_cb)(struct device *dev))
+{
+	struct mtk_hdmi *hdmi = dev_get_drvdata(dev);
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	mtk_hdmi_audio_enable(hdmi);
+
+	return 0;
+}
+
+static void mtk_hdmi_audio_shutdown(struct device *dev)
+{
+	struct mtk_hdmi *hdmi = dev_get_drvdata(dev);
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	mtk_hdmi_audio_disable(hdmi);
+}
+
+int mtk_hdmi_audio_digital_mute(struct device *dev, bool enable)
+{
+	struct mtk_hdmi *hdmi = dev_get_drvdata(dev);
+
+	dev_dbg(dev, "%s(%d)\n", __func__, enable);
+
+	mtk_hdmi_hw_aud_mute(hdmi, enable);
+
+	return 0;
+}
+
+static int mtk_hdmi_audio_get_eld(struct device *dev, uint8_t *buf, size_t len)
+{
+	struct mtk_hdmi *hdmi = dev_get_drvdata(dev);
+
+	dev_dbg(dev, "%s\n", __func__);
+
+	memcpy(buf, hdmi->conn.eld, min(sizeof(hdmi->conn.eld), len));
+
+	return 0;
+}
+
+static const struct hdmi_codec_ops mtk_hdmi_audio_codec_ops = {
+	.hw_params = mtk_hdmi_audio_hw_params,
+	.audio_startup = mtk_hdmi_audio_startup,
+	.audio_shutdown = mtk_hdmi_audio_shutdown,
+	.digital_mute = mtk_hdmi_audio_digital_mute,
+	.get_eld = mtk_hdmi_audio_get_eld,
+};
+
+static void mtk_hdmi_register_audio_driver(struct device *dev)
+{
+	struct hdmi_codec_pdata codec_data = {
+		.ops = &mtk_hdmi_audio_codec_ops,
+		.max_i2s_channels = 2,
+		.i2s = 1,
+	};
+	struct platform_device *pdev;
+
+	pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME,
+					     PLATFORM_DEVID_AUTO, &codec_data,
+					     sizeof(codec_data));
+	if (IS_ERR(pdev))
+		return;
+
+	DRM_INFO("%s driver bound to HDMI\n", HDMI_CODEC_DRV_NAME);
+}
+
 static int mtk_drm_hdmi_probe(struct platform_device *pdev)
 {
 	struct mtk_hdmi *hdmi;
@@ -484,6 +627,8 @@ static int mtk_drm_hdmi_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	mtk_hdmi_register_audio_driver(dev);
+
 	hdmi->bridge.funcs = &mtk_hdmi_bridge_funcs;
 	hdmi->bridge.of_node = pdev->dev.of_node;
 	ret = drm_bridge_add(&hdmi->bridge);
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index 5427d89..853d0db 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -197,46 +197,30 @@ static int mtk_hdmi_aud_set_input(struct mtk_hdmi *hdmi)
 static int mtk_hdmi_aud_set_src(struct mtk_hdmi *hdmi,
 				struct drm_display_mode *display_mode)
 {
+	unsigned int sample_rate = hdmi->aud_param.codec_params.sample_rate;
 	mtk_hdmi_aud_on_off_hw_ncts(hdmi, false);
 
 	if (hdmi->aud_param.aud_input_type == HDMI_AUD_INPUT_I2S) {
-		switch (hdmi->aud_param.aud_hdmi_fs) {
-		case HDMI_AUDIO_SAMPLE_FREQUENCY_32000:
-		case HDMI_AUDIO_SAMPLE_FREQUENCY_44100:
-		case HDMI_AUDIO_SAMPLE_FREQUENCY_48000:
-		case HDMI_AUDIO_SAMPLE_FREQUENCY_88200:
-		case HDMI_AUDIO_SAMPLE_FREQUENCY_96000:
+		switch (sample_rate) {
+		case 32000:
+		case 44100:
+		case 48000:
+		case 88200:
+		case 96000:
 			mtk_hdmi_hw_aud_src_off(hdmi);
 			/* mtk_hdmi_hw_aud_src_enable(hdmi, false); */
-			mtk_hdmi_hw_aud_set_mclk(
-			hdmi,
-			hdmi->aud_param.aud_mclk);
+			mtk_hdmi_hw_aud_set_mclk(hdmi,
+						 hdmi->aud_param.aud_mclk);
 			mtk_hdmi_hw_aud_aclk_inv_enable(hdmi, false);
 			break;
 		default:
 			break;
 		}
 	} else {
-		switch (hdmi->aud_param.iec_frame_fs) {
-		case HDMI_IEC_32K:
-			hdmi->aud_param.aud_hdmi_fs =
-			    HDMI_AUDIO_SAMPLE_FREQUENCY_32000;
-			mtk_hdmi_hw_aud_src_off(hdmi);
-			mtk_hdmi_hw_aud_set_mclk(hdmi,
-						 HDMI_AUD_MCLK_128FS);
-			mtk_hdmi_hw_aud_aclk_inv_enable(hdmi, false);
-			break;
-		case HDMI_IEC_48K:
-			hdmi->aud_param.aud_hdmi_fs =
-			    HDMI_AUDIO_SAMPLE_FREQUENCY_48000;
-			mtk_hdmi_hw_aud_src_off(hdmi);
-			mtk_hdmi_hw_aud_set_mclk(hdmi,
-						 HDMI_AUD_MCLK_128FS);
-			mtk_hdmi_hw_aud_aclk_inv_enable(hdmi, false);
-			break;
-		case HDMI_IEC_44K:
-			hdmi->aud_param.aud_hdmi_fs =
-			    HDMI_AUDIO_SAMPLE_FREQUENCY_44100;
+		switch (sample_rate) {
+		case 32000:
+		case 44100:
+		case 48000:
 			mtk_hdmi_hw_aud_src_off(hdmi);
 			mtk_hdmi_hw_aud_set_mclk(hdmi,
 						 HDMI_AUD_MCLK_128FS);
@@ -246,20 +230,10 @@ static int mtk_hdmi_aud_set_src(struct mtk_hdmi *hdmi,
 			break;
 		}
 	}
-	mtk_hdmi_hw_aud_set_ncts(hdmi, hdmi->aud_param.aud_hdmi_fs,
-				 display_mode->clock);
 
-	mtk_hdmi_hw_aud_src_reenable(hdmi);
-	return 0;
-}
+	mtk_hdmi_hw_aud_set_ncts(hdmi, sample_rate, display_mode->clock);
 
-static int mtk_hdmi_aud_set_chnl_status(struct mtk_hdmi *hdmi)
-{
-	mtk_hdmi_hw_aud_set_channel_status(
-		hdmi,
-	   hdmi->aud_param.hdmi_l_channel_state,
-	   hdmi->aud_param.hdmi_r_channel_state,
-	   hdmi->aud_param.aud_hdmi_fs);
+	mtk_hdmi_hw_aud_src_reenable(hdmi);
 	return 0;
 }
 
@@ -271,7 +245,8 @@ static int mtk_hdmi_aud_output_config(struct mtk_hdmi *hdmi,
 
 	mtk_hdmi_aud_set_input(hdmi);
 	mtk_hdmi_aud_set_src(hdmi, display_mode);
-	mtk_hdmi_aud_set_chnl_status(hdmi);
+	mtk_hdmi_hw_aud_set_channel_status(hdmi,
+			hdmi->aud_param.codec_params.iec.status);
 
 	usleep_range(50, 100);
 
@@ -413,15 +388,11 @@ int mtk_hdmi_output_init(struct mtk_hdmi *hdmi)
 	hdmi->csp = HDMI_COLORSPACE_RGB;
 	hdmi->output = true;
 	aud_param->aud_codec = HDMI_AUDIO_CODING_TYPE_PCM;
-	aud_param->aud_hdmi_fs = HDMI_AUDIO_SAMPLE_FREQUENCY_48000;
 	aud_param->aud_sampe_size = HDMI_AUDIO_SAMPLE_SIZE_16;
 	aud_param->aud_input_type = HDMI_AUD_INPUT_I2S;
 	aud_param->aud_i2s_fmt = HDMI_I2S_MODE_I2S_24BIT;
 	aud_param->aud_mclk = HDMI_AUD_MCLK_128FS;
-	aud_param->iec_frame_fs = HDMI_IEC_48K;
 	aud_param->aud_input_chan_type = HDMI_AUD_CHAN_TYPE_2_0;
-	aud_param->hdmi_l_channel_state[2] = 2;
-	aud_param->hdmi_r_channel_state[2] = 2;
 	hdmi->init = true;
 
 	return 0;
@@ -439,6 +410,32 @@ void mtk_hdmi_power_off(struct mtk_hdmi *hdmi)
 	mtk_hdmi_hw_make_reg_writable(hdmi, false);
 }
 
+void mtk_hdmi_audio_enable(struct mtk_hdmi *hdmi)
+{
+	mtk_hdmi_aud_enable_packet(hdmi, true);
+	hdmi->audio_enable = true;
+}
+
+void mtk_hdmi_audio_disable(struct mtk_hdmi *hdmi)
+{
+	mtk_hdmi_aud_enable_packet(hdmi, false);
+	hdmi->audio_enable = false;
+}
+
+int mtk_hdmi_audio_set_param(struct mtk_hdmi *hdmi,
+			     struct hdmi_audio_param *param)
+{
+	if (!hdmi->audio_enable) {
+		dev_err(hdmi->dev, "hdmi audio is in disable state!\n");
+		return -EINVAL;
+	}
+	dev_dbg(hdmi->dev, "codec:%d, input:%d, channel:%d, fs:%d\n",
+		param->aud_codec, param->aud_input_type,
+		param->aud_input_chan_type, param->codec_params.sample_rate);
+	memcpy(&hdmi->aud_param, param, sizeof(*param));
+	return mtk_hdmi_aud_output_config(hdmi, &hdmi->mode);
+}
+
 int mtk_hdmi_output_set_display_mode(struct mtk_hdmi *hdmi,
 				     struct drm_display_mode *mode)
 {
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.h b/drivers/gpu/drm/mediatek/mtk_hdmi.h
index ebef530..f3bada6 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.h
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.h
@@ -19,6 +19,7 @@
 #include <linux/io.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
+#include <sound/hdmi-codec.h>
 
 struct clk;
 struct device;
@@ -144,15 +145,12 @@ enum hdmi_aud_channel_swap_type {
 
 struct hdmi_audio_param {
 	enum hdmi_audio_coding_type aud_codec;
-	enum hdmi_audio_sample_frequency aud_hdmi_fs;
 	enum hdmi_audio_sample_size aud_sampe_size;
 	enum hdmi_aud_input_type aud_input_type;
 	enum hdmi_aud_i2s_fmt aud_i2s_fmt;
 	enum hdmi_aud_mclk aud_mclk;
-	enum hdmi_aud_iec_frame_rate iec_frame_fs;
 	enum hdmi_aud_channel_type aud_input_chan_type;
-	u8 hdmi_l_channel_state[6];
-	u8 hdmi_r_channel_state[6];
+	struct hdmi_codec_params codec_params;
 };
 
 struct mtk_hdmi {
@@ -203,6 +201,10 @@ int mtk_hdmi_output_set_display_mode(struct mtk_hdmi *hdmi,
 				     struct drm_display_mode *mode);
 void mtk_hdmi_power_on(struct mtk_hdmi *hdmi);
 void mtk_hdmi_power_off(struct mtk_hdmi *hdmi);
+void mtk_hdmi_audio_enable(struct mtk_hdmi *hctx);
+void mtk_hdmi_audio_disable(struct mtk_hdmi *hctx);
+int mtk_hdmi_audio_set_param(struct mtk_hdmi *hctx,
+			     struct hdmi_audio_param *param);
 #if defined(CONFIG_DEBUG_FS)
 int mtk_drm_hdmi_debugfs_init(struct mtk_hdmi *hdmi);
 void mtk_drm_hdmi_debugfs_exit(struct mtk_hdmi *hdmi);
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi_hw.c b/drivers/gpu/drm/mediatek/mtk_hdmi_hw.c
index 054afc6..43d74aa 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi_hw.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi_hw.c
@@ -394,90 +394,18 @@ void mtk_hdmi_hw_aud_set_input_type(struct mtk_hdmi *hdmi,
 }
 
 void mtk_hdmi_hw_aud_set_channel_status(struct mtk_hdmi *hdmi,
-					u8 *l_chan_status, u8 *r_chan_status,
-					enum hdmi_audio_sample_frequency
-					aud_hdmi_fs)
-{
-	u8 l_status[5];
-	u8 r_status[5];
-	u8 val = 0;
-
-	l_status[0] = l_chan_status[0];
-	l_status[1] = l_chan_status[1];
-	l_status[2] = l_chan_status[2];
-	r_status[0] = r_chan_status[0];
-	r_status[1] = r_chan_status[1];
-	r_status[2] = r_chan_status[2];
-
-	l_status[0] &= ~0x02;
-	r_status[0] &= ~0x02;
-
-	val = l_chan_status[3] & 0xf0;
-	switch (aud_hdmi_fs) {
-	case HDMI_AUDIO_SAMPLE_FREQUENCY_32000:
-		val |= 0x03;
-		break;
-	case HDMI_AUDIO_SAMPLE_FREQUENCY_44100:
-		break;
-	case HDMI_AUDIO_SAMPLE_FREQUENCY_88200:
-		val |= 0x08;
-		break;
-	case HDMI_AUDIO_SAMPLE_FREQUENCY_96000:
-		val |= 0x0a;
-		break;
-	case HDMI_AUDIO_SAMPLE_FREQUENCY_48000:
-		val |= 0x02;
-		break;
-	default:
-		val |= 0x02;
-		break;
-	}
-	l_status[3] = val;
-	r_status[3] = val;
-
-	val = l_chan_status[4];
-	val |= ((~(l_status[3] & 0x0f)) << 4);
-	l_status[4] = val;
-	r_status[4] = val;
-
-	val = l_status[0];
-	mtk_hdmi_write(hdmi, GRL_I2S_C_STA0, val);
-	mtk_hdmi_write(hdmi, GRL_L_STATUS_0, val);
-
-	val = r_status[0];
-	mtk_hdmi_write(hdmi, GRL_R_STATUS_0, val);
-
-	val = l_status[1];
-	mtk_hdmi_write(hdmi, GRL_I2S_C_STA1, val);
-	mtk_hdmi_write(hdmi, GRL_L_STATUS_1, val);
-
-	val = r_status[1];
-	mtk_hdmi_write(hdmi, GRL_R_STATUS_1, val);
-
-	val = l_status[2];
-	mtk_hdmi_write(hdmi, GRL_I2S_C_STA2, val);
-	mtk_hdmi_write(hdmi, GRL_L_STATUS_2, val);
-
-	val = r_status[2];
-	mtk_hdmi_write(hdmi, GRL_R_STATUS_2, val);
-
-	val = l_status[3];
-	mtk_hdmi_write(hdmi, GRL_I2S_C_STA3, val);
-	mtk_hdmi_write(hdmi, GRL_L_STATUS_3, val);
-
-	val = r_status[3];
-	mtk_hdmi_write(hdmi, GRL_R_STATUS_3, val);
-
-	val = l_status[4];
-	mtk_hdmi_write(hdmi, GRL_I2S_C_STA4, val);
-	mtk_hdmi_write(hdmi, GRL_L_STATUS_4, val);
-
-	val = r_status[4];
-	mtk_hdmi_write(hdmi, GRL_R_STATUS_4, val);
+					u8 *channel_status)
+{
+	int i;
 
-	for (val = 0; val < 19; val++) {
-		mtk_hdmi_write(hdmi, GRL_L_STATUS_5 + val * 4, 0);
-		mtk_hdmi_write(hdmi, GRL_R_STATUS_5 + val * 4, 0);
+	for (i = 0; i < 5; i++) {
+		mtk_hdmi_write(hdmi, GRL_I2S_C_STA0 + i * 4, channel_status[i]);
+		mtk_hdmi_write(hdmi, GRL_L_STATUS_0 + i * 4, channel_status[i]);
+		mtk_hdmi_write(hdmi, GRL_R_STATUS_0 + i * 4, channel_status[i]);
+	}
+	for (; i < 24; i++) {
+		mtk_hdmi_write(hdmi, GRL_L_STATUS_0 + i * 4, 0);
+		mtk_hdmi_write(hdmi, GRL_R_STATUS_0 + i * 4, 0);
 	}
 }
 
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi_hw.h b/drivers/gpu/drm/mediatek/mtk_hdmi_hw.h
index 9013219..a3e1bbc 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi_hw.h
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi_hw.h
@@ -46,9 +46,7 @@ void mtk_hdmi_hw_aud_set_i2s_chan_num(struct mtk_hdmi *hdmi,
 void mtk_hdmi_hw_aud_set_input_type(struct mtk_hdmi *hdmi,
 				    enum hdmi_aud_input_type input_type);
 void mtk_hdmi_hw_aud_set_channel_status(struct mtk_hdmi *hdmi,
-					u8 *l_chan_status, u8 *r_chan_staus,
-					enum hdmi_audio_sample_frequency
-					aud_hdmi_fs);
+					u8 *channel_status);
 void mtk_hdmi_hw_aud_src_enable(struct mtk_hdmi *hdmi, bool enable);
 void mtk_hdmi_hw_aud_set_mclk(struct mtk_hdmi *hdmi, enum hdmi_aud_mclk mclk);
 void mtk_hdmi_hw_aud_src_off(struct mtk_hdmi *hdmi);
-- 
2.6.4

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

* [RFC v3 2/7] ASoC: mediatek: address dai link array entries by enum
       [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  2016-01-12 15:38   ` [RFC v3 1/7] drm/mediatek: hdmi: Add audio interface to the hdmi-codec driver Philipp Zabel
@ 2016-01-12 15:38   ` Philipp Zabel
  2016-01-12 15:38   ` [RFC v3 3/7] ASoC: mediatek: Add HDMI dai-links in the machine driver Philipp Zabel
                     ` (4 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2016-01-12 15:38 UTC (permalink / raw)
  To: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Philipp Zabel, Arnaud Pouliquen,
	Liam Girdwood, Jyri Sarha, Cawa Cheng, Mark Brown,
	linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Matthias Brugger

This should be more robust to future changes than adressing
array entries by index number.

Signed-off-by: Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
---
 sound/soc/mediatek/mt8173-rt5650-rt5676.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/sound/soc/mediatek/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
index 50ba538..5c4c58c 100644
--- a/sound/soc/mediatek/mt8173-rt5650-rt5676.c
+++ b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
@@ -131,10 +131,17 @@ static struct snd_soc_dai_link_component mt8173_rt5650_rt5676_codecs[] = {
 	},
 };
 
+enum {
+	DAI_LINK_PLAYBACK,
+	DAI_LINK_CAPTURE,
+	DAI_LINK_CODEC_I2S,
+	DAI_LINK_INTERCODEC
+};
+
 /* Digital audio interface glue - connects codec <---> CPU */
 static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
 	/* Front End DAI links */
-	{
+	[DAI_LINK_PLAYBACK] = {
 		.name = "rt5650_rt5676 Playback",
 		.stream_name = "rt5650_rt5676 Playback",
 		.cpu_dai_name = "DL1",
@@ -144,7 +151,7 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
 		.dynamic = 1,
 		.dpcm_playback = 1,
 	},
-	{
+	[DAI_LINK_CAPTURE] = {
 		.name = "rt5650_rt5676 Capture",
 		.stream_name = "rt5650_rt5676 Capture",
 		.cpu_dai_name = "VUL",
@@ -156,7 +163,7 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
 	},
 
 	/* Back End DAI links */
-	{
+	[DAI_LINK_CODEC_I2S] = {
 		.name = "Codec",
 		.cpu_dai_name = "I2S",
 		.no_pcm = 1,
@@ -170,7 +177,8 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
 		.dpcm_playback = 1,
 		.dpcm_capture = 1,
 	},
-	{ /* rt5676 <-> rt5650 intercodec link: Sets rt5676 I2S2 as master */
+	/* rt5676 <-> rt5650 intercodec link: Sets rt5676 I2S2 as master */
+	[DAI_LINK_INTERCODEC] = {
 		.name = "rt5650_rt5676 intercodec",
 		.stream_name = "rt5650_rt5676 intercodec",
 		.cpu_dai_name = "snd-soc-dummy-dai",
@@ -240,7 +248,7 @@ static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev)
 	mt8173_rt5650_rt5676_codec_conf[0].of_node =
 		mt8173_rt5650_rt5676_codecs[1].of_node;
 
-	mt8173_rt5650_rt5676_dais[3].codec_of_node =
+	mt8173_rt5650_rt5676_dais[DAI_LINK_INTERCODEC].codec_of_node =
 		mt8173_rt5650_rt5676_codecs[1].of_node;
 
 	card->dev = &pdev->dev;
-- 
2.6.4

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

* [RFC v3 3/7] ASoC: mediatek: Add HDMI dai-links in the machine driver
       [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  2016-01-12 15:38   ` [RFC v3 1/7] drm/mediatek: hdmi: Add audio interface to the hdmi-codec driver Philipp Zabel
  2016-01-12 15:38   ` [RFC v3 2/7] ASoC: mediatek: address dai link array entries by enum Philipp Zabel
@ 2016-01-12 15:38   ` Philipp Zabel
  2016-01-12 15:38   ` [RFC v3 4/7] video: rmk's HDMI notification prototype Philipp Zabel
                     ` (3 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2016-01-12 15:38 UTC (permalink / raw)
  To: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Philipp Zabel, Arnaud Pouliquen,
	Liam Girdwood, Jyri Sarha, Cawa Cheng, Mark Brown,
	linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Matthias Brugger

From: Koro Chen <koro.chen-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>

This creates pcmC0D2p for the HDMI playback in the same card.

Signed-off-by: Koro Chen <koro.chen-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>
Signed-off-by: Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
---
 .../bindings/sound/mt8173-rt5650-rt5676.txt        |  5 ++-
 sound/soc/mediatek/mt8173-rt5650-rt5676.c          | 48 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
index f205ce9..ac28cdb 100644
--- a/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
+++ b/Documentation/devicetree/bindings/sound/mt8173-rt5650-rt5676.txt
@@ -1,15 +1,16 @@
-MT8173 with RT5650 RT5676 CODECS
+MT8173 with RT5650 RT5676 CODECS and HDMI via I2S
 
 Required properties:
 - compatible : "mediatek,mt8173-rt5650-rt5676"
 - mediatek,audio-codec: the phandles of rt5650 and rt5676 codecs
+			and of the hdmi encoder node
 - mediatek,platform: the phandle of MT8173 ASoC platform
 
 Example:
 
 	sound {
 		compatible = "mediatek,mt8173-rt5650-rt5676";
-		mediatek,audio-codec = <&rt5650 &rt5676>;
+		mediatek,audio-codec = <&rt5650 &rt5676 &hdmi0>;
 		mediatek,platform = <&afe>;
 	};
 
diff --git a/sound/soc/mediatek/mt8173-rt5650-rt5676.c b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
index 5c4c58c..def9d95 100644
--- a/sound/soc/mediatek/mt8173-rt5650-rt5676.c
+++ b/sound/soc/mediatek/mt8173-rt5650-rt5676.c
@@ -18,6 +18,7 @@
 #include <linux/gpio.h>
 #include <linux/of_gpio.h>
 #include <sound/soc.h>
+#include <sound/hdmi-codec.h>
 #include <sound/jack.h>
 #include "../codecs/rt5645.h"
 #include "../codecs/rt5677.h"
@@ -131,10 +132,31 @@ static struct snd_soc_dai_link_component mt8173_rt5650_rt5676_codecs[] = {
 	},
 };
 
+static struct snd_soc_jack mt8173_hdmi_card_jack;
+
+static int mt8173_hdmi_init(struct snd_soc_pcm_runtime *runtime)
+{
+	struct snd_soc_card *card = runtime->card;
+	struct snd_soc_codec *codec = runtime->codec;
+	int ret;
+
+	/* enable jack detection */
+	ret = snd_soc_card_jack_new(card, "HDMI Jack", SND_JACK_LINEOUT,
+				    &mt8173_hdmi_card_jack, NULL, 0);
+	if (ret) {
+		dev_err(card->dev, "Can't new HDMI Jack %d\n", ret);
+		return ret;
+	}
+
+	return hdmi_codec_set_jack_detect(codec, &mt8173_hdmi_card_jack);
+}
+
 enum {
 	DAI_LINK_PLAYBACK,
 	DAI_LINK_CAPTURE,
+	DAI_LINK_HDMI,
 	DAI_LINK_CODEC_I2S,
+	DAI_LINK_HDMI_I2S,
 	DAI_LINK_INTERCODEC
 };
 
@@ -161,6 +183,16 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
 		.dynamic = 1,
 		.dpcm_capture = 1,
 	},
+	[DAI_LINK_HDMI] = {
+		.name = "HDMI",
+		.stream_name = "HDMI PCM",
+		.cpu_dai_name = "HDMI",
+		.codec_name = "snd-soc-dummy",
+		.codec_dai_name = "snd-soc-dummy-dai",
+		.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
+		.dynamic = 1,
+		.dpcm_playback = 1,
+	},
 
 	/* Back End DAI links */
 	[DAI_LINK_CODEC_I2S] = {
@@ -177,6 +209,14 @@ static struct snd_soc_dai_link mt8173_rt5650_rt5676_dais[] = {
 		.dpcm_playback = 1,
 		.dpcm_capture = 1,
 	},
+	[DAI_LINK_HDMI_I2S] = {
+		.name = "HDMI BE",
+		.cpu_dai_name = "HDMIO",
+		.no_pcm = 1,
+		.codec_dai_name = "i2s-hifi",
+		.dpcm_playback = 1,
+		.init = mt8173_hdmi_init,
+	},
 	/* rt5676 <-> rt5650 intercodec link: Sets rt5676 I2S2 as master */
 	[DAI_LINK_INTERCODEC] = {
 		.name = "rt5650_rt5676 intercodec",
@@ -251,6 +291,14 @@ static int mt8173_rt5650_rt5676_dev_probe(struct platform_device *pdev)
 	mt8173_rt5650_rt5676_dais[DAI_LINK_INTERCODEC].codec_of_node =
 		mt8173_rt5650_rt5676_codecs[1].of_node;
 
+	mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codec_of_node =
+		of_parse_phandle(pdev->dev.of_node, "mediatek,audio-codec", 2);
+	if (!mt8173_rt5650_rt5676_dais[DAI_LINK_HDMI_I2S].codec_of_node) {
+		dev_err(&pdev->dev,
+			"Property 'audio-codec' missing or invalid\n");
+		return -EINVAL;
+	}
+
 	card->dev = &pdev->dev;
 	platform_set_drvdata(pdev, card);
 
-- 
2.6.4

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

* [RFC v3 4/7] video: rmk's HDMI notification prototype
       [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
                     ` (2 preceding siblings ...)
  2016-01-12 15:38   ` [RFC v3 3/7] ASoC: mediatek: Add HDMI dai-links in the machine driver Philipp Zabel
@ 2016-01-12 15:38   ` Philipp Zabel
  2016-01-12 15:38   ` [RFC v3 5/7] drm/mediatek: hdmi: issue notifications Philipp Zabel
                     ` (2 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2016-01-12 15:38 UTC (permalink / raw)
  To: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Philipp Zabel, Arnaud Pouliquen,
	Liam Girdwood, Jyri Sarha, Cawa Cheng, Mark Brown,
	linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Matthias Brugger

This is extracted from Russell's food for thought HDMI notification
prototype [1]. I've put it into drivers/video for the time being because
my kernels don't have drivers/cec yet.

The current use case for the notifications on MediaTek MT8173 is to
let the (dis)connection notifications control an ALSA jack object.

Still no Signed-off-by, this patch is not supposed to be merged.

[1] https://patchwork.kernel.org/patch/7339011/
---
 drivers/video/Makefile   |  2 +-
 drivers/video/hdmi-not.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++
 include/linux/hdmi-not.h | 39 +++++++++++++++++++++++++++++++
 3 files changed, 101 insertions(+), 1 deletion(-)
 create mode 100644 drivers/video/hdmi-not.c
 create mode 100644 include/linux/hdmi-not.h

diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index 9ad3c17..bf25760 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -1,5 +1,5 @@
 obj-$(CONFIG_VGASTATE)            += vgastate.o
-obj-$(CONFIG_HDMI)                += hdmi.o
+obj-$(CONFIG_HDMI)                += hdmi.o hdmi-not.o
 
 obj-$(CONFIG_VT)		  += console/
 obj-$(CONFIG_LOGO)		  += logo/
diff --git a/drivers/video/hdmi-not.c b/drivers/video/hdmi-not.c
new file mode 100644
index 0000000..ba3be8a
--- /dev/null
+++ b/drivers/video/hdmi-not.c
@@ -0,0 +1,61 @@
+#include <linux/export.h>
+#include <linux/hdmi-not.h>
+#include <linux/notifier.h>
+#include <linux/string.h>
+
+static BLOCKING_NOTIFIER_HEAD(hdmi_notifier);
+
+int hdmi_register_notifier(struct notifier_block *nb)
+{
+	return blocking_notifier_chain_register(&hdmi_notifier, nb);
+}
+EXPORT_SYMBOL_GPL(hdmi_register_notifier);
+
+int hdmi_unregister_notifier(struct notifier_block *nb)
+{
+	return blocking_notifier_chain_unregister(&hdmi_notifier, nb);
+}
+EXPORT_SYMBOL_GPL(hdmi_unregister_notifier);
+
+void hdmi_event_connect(struct device *dev)
+{
+	struct hdmi_event_base base;
+
+	base.source = dev;
+
+	blocking_notifier_call_chain(&hdmi_notifier, HDMI_CONNECTED, &base);
+}
+EXPORT_SYMBOL_GPL(hdmi_event_connect);
+
+void hdmi_event_disconnect(struct device *dev)
+{
+	struct hdmi_event_base base;
+
+	base.source = dev;
+
+	blocking_notifier_call_chain(&hdmi_notifier, HDMI_DISCONNECTED, &base);
+}
+EXPORT_SYMBOL_GPL(hdmi_event_disconnect);
+
+void hdmi_event_new_edid(struct device *dev, const void *edid, size_t size)
+{
+	struct hdmi_event_new_edid new_edid;
+
+	new_edid.base.source = dev;
+	new_edid.edid = edid;
+	new_edid.size = size;
+
+	blocking_notifier_call_chain(&hdmi_notifier, HDMI_NEW_EDID, &new_edid);
+}
+EXPORT_SYMBOL_GPL(hdmi_event_new_edid);
+
+void hdmi_event_new_eld(struct device *dev, const void *eld)
+{
+	struct hdmi_event_new_eld new_eld;
+
+	new_eld.base.source = dev;
+	memcpy(new_eld.eld, eld, sizeof(new_eld.eld));
+
+	blocking_notifier_call_chain(&hdmi_notifier, HDMI_NEW_ELD, &new_eld);
+}
+EXPORT_SYMBOL_GPL(hdmi_event_new_eld);
diff --git a/include/linux/hdmi-not.h b/include/linux/hdmi-not.h
new file mode 100644
index 0000000..940ece45
--- /dev/null
+++ b/include/linux/hdmi-not.h
@@ -0,0 +1,39 @@
+#include <linux/types.h>
+
+enum {
+	HDMI_CONNECTED,
+	HDMI_DISCONNECTED,
+	HDMI_NEW_EDID,
+	HDMI_NEW_ELD,
+};
+
+struct hdmi_event_base {
+	struct device *source;
+};
+
+struct hdmi_event_new_edid {
+	struct hdmi_event_base base;
+	const void *edid;
+	size_t size;
+};
+
+struct hdmi_event_new_eld {
+	struct hdmi_event_base base;
+	unsigned char eld[128];
+};
+
+union hdmi_event {
+	struct hdmi_event_base base;
+	struct hdmi_event_new_edid edid;
+	struct hdmi_event_new_eld eld;
+};
+
+struct notifier_block;
+
+int hdmi_register_notifier(struct notifier_block *nb);
+int hdmi_unregister_notifier(struct notifier_block *nb);
+
+void hdmi_event_connect(struct device *dev);
+void hdmi_event_disconnect(struct device *dev);
+void hdmi_event_new_edid(struct device *dev, const void *edid, size_t size);
+void hdmi_event_new_eld(struct device *dev, const void *eld);
-- 
2.6.4

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

* [RFC v3 5/7] drm/mediatek: hdmi: issue notifications
       [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
                     ` (3 preceding siblings ...)
  2016-01-12 15:38   ` [RFC v3 4/7] video: rmk's HDMI notification prototype Philipp Zabel
@ 2016-01-12 15:38   ` Philipp Zabel
  2016-01-12 15:38   ` [RFC v3 6/7] ASoC: hdmi-codec: Use HDMI notifications to add jack support Philipp Zabel
  2016-01-12 15:38   ` [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control Philipp Zabel
  6 siblings, 0 replies; 15+ messages in thread
From: Philipp Zabel @ 2016-01-12 15:38 UTC (permalink / raw)
  To: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Philipp Zabel, Arnaud Pouliquen,
	Liam Girdwood, Jyri Sarha, Cawa Cheng, Mark Brown,
	linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Matthias Brugger

Issue hot-plug detection, EDID update, and ELD update notifications
from the CEC and HDMI drivers.

Signed-off-by: Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
---
Changes since v2:
 - Send an initial notification to set the correct jack state.
---
 drivers/gpu/drm/mediatek/mtk_cec.c          | 11 +++++++++++
 drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c |  3 +++
 2 files changed, 14 insertions(+)

diff --git a/drivers/gpu/drm/mediatek/mtk_cec.c b/drivers/gpu/drm/mediatek/mtk_cec.c
index cba3647..c309920 100644
--- a/drivers/gpu/drm/mediatek/mtk_cec.c
+++ b/drivers/gpu/drm/mediatek/mtk_cec.c
@@ -13,6 +13,7 @@
  */
 #include <linux/clk.h>
 #include <linux/delay.h>
+#include <linux/hdmi-not.h>
 #include <linux/io.h>
 #include <linux/interrupt.h>
 #include <linux/platform_device.h>
@@ -79,6 +80,12 @@ void mtk_cec_set_hpd_event(struct device *dev,
 
 	cec->hdmi_dev = hdmi_dev;
 	cec->hpd_event = hpd_event;
+
+	/* Initial notification event to set jack state */
+	if (mtk_cec_hpd_high(dev))
+		hdmi_event_connect(hdmi_dev);
+	else
+		hdmi_event_disconnect(hdmi_dev);
 }
 
 bool mtk_cec_hpd_high(struct device *dev)
@@ -160,6 +167,10 @@ static irqreturn_t mtk_cec_htplg_isr_thread(int irq, void *arg)
 	if (cec->hpd != hpd) {
 		dev_info(dev, "hotplug event!,cur hpd = %d, hpd = %d\n",
 			 cec->hpd, hpd);
+		if (hpd)
+			hdmi_event_connect(cec->hdmi_dev);
+		else
+			hdmi_event_disconnect(cec->hdmi_dev);
 		cec->hpd = hpd;
 		if (cec->hpd_event)
 			cec->hpd_event(hpd, cec->hdmi_dev);
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c
index 0d4a646..1a128c5 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_hdmi_drv.c
@@ -17,6 +17,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <linux/clk.h>
+#include <linux/hdmi-not.h>
 #include <linux/i2c.h>
 #include <linux/kernel.h>
 #include <linux/mfd/syscon.h>
@@ -122,9 +123,11 @@ static int mtk_hdmi_conn_get_modes(struct drm_connector *conn)
 	hdmi->dvi_mode = !drm_detect_hdmi_monitor(edid);
 
 	drm_mode_connector_update_edid_property(conn, edid);
+	hdmi_event_new_edid(hdmi->dev, edid, sizeof(*edid));
 
 	ret = drm_add_edid_modes(conn, edid);
 	drm_edid_to_eld(conn, edid);
+	hdmi_event_new_eld(hdmi->dev, conn->eld);
 	kfree(edid);
 	return ret;
 }
-- 
2.6.4

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

* [RFC v3 6/7] ASoC: hdmi-codec: Use HDMI notifications to add jack support
       [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
                     ` (4 preceding siblings ...)
  2016-01-12 15:38   ` [RFC v3 5/7] drm/mediatek: hdmi: issue notifications Philipp Zabel
@ 2016-01-12 15:38   ` Philipp Zabel
  2016-01-18 21:08     ` Jyri Sarha
  2016-01-12 15:38   ` [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control Philipp Zabel
  6 siblings, 1 reply; 15+ messages in thread
From: Philipp Zabel @ 2016-01-12 15:38 UTC (permalink / raw)
  To: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Philipp Zabel, Arnaud Pouliquen,
	Liam Girdwood, Jyri Sarha, Cawa Cheng, Mark Brown,
	linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Matthias Brugger

Use HDMI connection / disconnection notifications to update an ALSA
jack object. Also make a copy of the ELD block after every change.

Signed-off-by: Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
---
Changes since v2:
 - Don't call get_eld, copy the ELD contained in the notification instead.
---
 include/sound/hdmi-codec.h    |  6 ++++
 sound/soc/codecs/hdmi-codec.c | 69 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 74 insertions(+), 1 deletion(-)

diff --git a/include/sound/hdmi-codec.h b/include/sound/hdmi-codec.h
index 15fe70f..8b6219d 100644
--- a/include/sound/hdmi-codec.h
+++ b/include/sound/hdmi-codec.h
@@ -99,6 +99,12 @@ struct hdmi_codec_pdata {
 	int max_i2s_channels;
 };
 
+struct snd_soc_codec;
+struct snd_soc_jack;
+
+int hdmi_codec_set_jack_detect(struct snd_soc_codec *codec,
+			       struct snd_soc_jack *jack);
+
 #define HDMI_CODEC_DRV_NAME "hdmi-audio-codec"
 
 #endif /* __HDMI_CODEC_H__ */
diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
index 687332d..6b327e2 100644
--- a/sound/soc/codecs/hdmi-codec.c
+++ b/sound/soc/codecs/hdmi-codec.c
@@ -12,9 +12,12 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
  * General Public License for more details.
  */
+#include <linux/hdmi-not.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
 #include <linux/string.h>
 #include <sound/core.h>
+#include <sound/jack.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 #include <sound/soc.h>
@@ -27,11 +30,15 @@
 struct hdmi_codec_priv {
 	struct hdmi_codec_pdata hcd;
 	struct snd_soc_dai_driver *daidrv;
+	struct snd_soc_jack *jack;
 	struct hdmi_codec_daifmt daifmt[2];
 	struct mutex current_stream_lock;
 	struct snd_pcm_substream *current_stream;
 	struct snd_pcm_hw_constraint_list ratec;
 	uint8_t eld[MAX_ELD_BYTES];
+	struct device *dev;
+	struct notifier_block nb;
+	unsigned int jack_status;
 };
 
 static const struct snd_soc_dapm_widget hdmi_widgets[] = {
@@ -326,6 +333,60 @@ static struct snd_soc_codec_driver hdmi_codec = {
 	.num_dapm_routes = ARRAY_SIZE(hdmi_routes),
 };
 
+static void hdmi_codec_jack_report(struct hdmi_codec_priv *hcp,
+				   unsigned int jack_status)
+{
+	if (!hcp->jack)
+		return;
+
+	if (jack_status != hcp->jack_status) {
+		snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT);
+		hcp->jack_status = jack_status;
+	}
+}
+
+static int hdmi_codec_notify(struct notifier_block *nb, unsigned long event,
+			     void *data)
+{
+	struct hdmi_codec_priv *hcp = container_of(nb, struct hdmi_codec_priv,
+						   nb);
+	union hdmi_event *event_block = data;
+
+	if (hcp->dev->parent != event_block->base.source)
+		return NOTIFY_OK;
+
+	if (!hcp->jack)
+		return NOTIFY_OK;
+
+	switch (event) {
+	case HDMI_CONNECTED:
+		hdmi_codec_jack_report(hcp, SND_JACK_LINEOUT);
+		break;
+	case HDMI_DISCONNECTED:
+		hdmi_codec_jack_report(hcp, 0);
+		break;
+	case HDMI_NEW_ELD:
+		memcpy(hcp->eld, event_block->eld.eld, sizeof(hcp->eld));
+		break;
+	}
+
+	return NOTIFY_OK;
+}
+
+int hdmi_codec_set_jack_detect(struct snd_soc_codec *codec,
+			       struct snd_soc_jack *jack)
+{
+	struct hdmi_codec_priv *hcp = snd_soc_codec_get_drvdata(codec);
+
+	hcp->jack = jack;
+	hcp->nb.notifier_call = hdmi_codec_notify;
+
+	hdmi_register_notifier(&hcp->nb);
+
+	return 0;
+}
+EXPORT_SYMBOL_GPL(hdmi_codec_set_jack_detect);
+
 static int hdmi_codec_probe(struct platform_device *pdev)
 {
 	struct hdmi_codec_pdata *hcd = pdev->dev.platform_data;
@@ -370,6 +431,8 @@ static int hdmi_codec_probe(struct platform_device *pdev)
 	if (hcd->spdif)
 		hcp->daidrv[i] = hdmi_spdif_dai;
 
+	dev_set_drvdata(dev, hcp);
+
 	ret = snd_soc_register_codec(dev, &hdmi_codec, hcp->daidrv,
 				     dai_count);
 	if (ret) {
@@ -378,12 +441,16 @@ static int hdmi_codec_probe(struct platform_device *pdev)
 		return ret;
 	}
 
-	dev_set_drvdata(dev, hcp);
+	hcp->dev = dev;
+
 	return 0;
 }
 
 static int hdmi_codec_remove(struct platform_device *pdev)
 {
+	struct hdmi_codec_priv *hcp = platform_get_drvdata(pdev);
+
+	hdmi_unregister_notifier(&hcp->nb);
 	snd_soc_unregister_codec(&pdev->dev);
 	return 0;
 }
-- 
2.6.4

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

* [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control
       [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
                     ` (5 preceding siblings ...)
  2016-01-12 15:38   ` [RFC v3 6/7] ASoC: hdmi-codec: Use HDMI notifications to add jack support Philipp Zabel
@ 2016-01-12 15:38   ` Philipp Zabel
  2016-01-19 12:00     ` Jyri Sarha
       [not found]     ` <1452613096-8116-8-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  6 siblings, 2 replies; 15+ messages in thread
From: Philipp Zabel @ 2016-01-12 15:38 UTC (permalink / raw)
  To: alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Philipp Zabel, Arnaud Pouliquen,
	Liam Girdwood, Jyri Sarha, Cawa Cheng, Mark Brown,
	linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Matthias Brugger

Exporting the ELD bytes to userspace allows an application to select
an appropriate audio format depending on the current capabilities of
the connected HDMI sink device.

Signed-off-by: Philipp Zabel <p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
---
 sound/soc/codecs/hdmi-codec.c | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)

diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
index 6b327e2..6cb7217 100644
--- a/sound/soc/codecs/hdmi-codec.c
+++ b/sound/soc/codecs/hdmi-codec.c
@@ -54,6 +54,40 @@ enum {
 	DAI_ID_SPDIF,
 };
 
+static int hdmi_eld_ctl_info(struct snd_kcontrol *kcontrol,
+			     struct snd_ctl_elem_info *uinfo)
+{
+	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+	struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component);
+
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
+	uinfo->count = sizeof(hcp->eld);
+
+	return 0;
+}
+
+static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
+			    struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
+	struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component);
+
+	memcpy(ucontrol->value.bytes.data, hcp->eld, sizeof(hcp->eld));
+
+	return 0;
+}
+
+static const struct snd_kcontrol_new hdmi_controls[] = {
+	{
+		.access = SNDRV_CTL_ELEM_ACCESS_READ |
+			  SNDRV_CTL_ELEM_ACCESS_VOLATILE,
+		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
+		.name = "ELD",
+		.info = hdmi_eld_ctl_info,
+		.get = hdmi_eld_ctl_get,
+	},
+};
+
 static void hdmi_codec_abort(struct device *dev)
 {
 	struct hdmi_codec_priv *hcp = dev_get_drvdata(dev);
@@ -327,6 +361,8 @@ static const struct snd_soc_dai_driver hdmi_spdif_dai = {
 };
 
 static struct snd_soc_codec_driver hdmi_codec = {
+	.controls = hdmi_controls,
+	.num_controls = ARRAY_SIZE(hdmi_controls),
 	.dapm_widgets = hdmi_widgets,
 	.num_dapm_widgets = ARRAY_SIZE(hdmi_widgets),
 	.dapm_routes = hdmi_routes,
-- 
2.6.4

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

* Re: [RFC v3 6/7] ASoC: hdmi-codec: Use HDMI notifications to add jack support
  2016-01-12 15:38   ` [RFC v3 6/7] ASoC: hdmi-codec: Use HDMI notifications to add jack support Philipp Zabel
@ 2016-01-18 21:08     ` Jyri Sarha
  0 siblings, 0 replies; 15+ messages in thread
From: Jyri Sarha @ 2016-01-18 21:08 UTC (permalink / raw)
  To: Philipp Zabel, alsa-devel
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Arnaud Pouliquen, Liam Girdwood,
	Daniel Kurtz, Cawa Cheng, Mark Brown, linux-mediatek, kernel,
	Matthias Brugger

On 01/12/16 17:38, Philipp Zabel wrote:
> Use HDMI connection / disconnection notifications to update an ALSA
> jack object. Also make a copy of the ELD block after every change.
>
> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
> Changes since v2:
>   - Don't call get_eld, copy the ELD contained in the notification instead.
> ---
>   include/sound/hdmi-codec.h    |  6 ++++
>   sound/soc/codecs/hdmi-codec.c | 69 ++++++++++++++++++++++++++++++++++++++++++-
>   2 files changed, 74 insertions(+), 1 deletion(-)
>
> diff --git a/include/sound/hdmi-codec.h b/include/sound/hdmi-codec.h
> index 15fe70f..8b6219d 100644
> --- a/include/sound/hdmi-codec.h
> +++ b/include/sound/hdmi-codec.h
> @@ -99,6 +99,12 @@ struct hdmi_codec_pdata {
>   	int max_i2s_channels;
>   };
>
> +struct snd_soc_codec;
> +struct snd_soc_jack;
> +
> +int hdmi_codec_set_jack_detect(struct snd_soc_codec *codec,
> +			       struct snd_soc_jack *jack);
> +
>   #define HDMI_CODEC_DRV_NAME "hdmi-audio-codec"
>
>   #endif /* __HDMI_CODEC_H__ */
> diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
> index 687332d..6b327e2 100644
> --- a/sound/soc/codecs/hdmi-codec.c
> +++ b/sound/soc/codecs/hdmi-codec.c
> @@ -12,9 +12,12 @@
>    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
>    * General Public License for more details.
>    */
> +#include <linux/hdmi-not.h>
>   #include <linux/module.h>
> +#include <linux/notifier.h>
>   #include <linux/string.h>
>   #include <sound/core.h>
> +#include <sound/jack.h>
>   #include <sound/pcm.h>
>   #include <sound/pcm_params.h>
>   #include <sound/soc.h>
> @@ -27,11 +30,15 @@
>   struct hdmi_codec_priv {
>   	struct hdmi_codec_pdata hcd;
>   	struct snd_soc_dai_driver *daidrv;
> +	struct snd_soc_jack *jack;
>   	struct hdmi_codec_daifmt daifmt[2];
>   	struct mutex current_stream_lock;
>   	struct snd_pcm_substream *current_stream;
>   	struct snd_pcm_hw_constraint_list ratec;
>   	uint8_t eld[MAX_ELD_BYTES];
> +	struct device *dev;
> +	struct notifier_block nb;
> +	unsigned int jack_status;
>   };
>
>   static const struct snd_soc_dapm_widget hdmi_widgets[] = {
> @@ -326,6 +333,60 @@ static struct snd_soc_codec_driver hdmi_codec = {
>   	.num_dapm_routes = ARRAY_SIZE(hdmi_routes),
>   };
>
> +static void hdmi_codec_jack_report(struct hdmi_codec_priv *hcp,
> +				   unsigned int jack_status)
> +{
> +	if (!hcp->jack)
> +		return;
> +
> +	if (jack_status != hcp->jack_status) {
> +		snd_soc_jack_report(hcp->jack, jack_status, SND_JACK_LINEOUT);
> +		hcp->jack_status = jack_status;
> +	}
> +}
> +
> +static int hdmi_codec_notify(struct notifier_block *nb, unsigned long event,
> +			     void *data)
> +{
> +	struct hdmi_codec_priv *hcp = container_of(nb, struct hdmi_codec_priv,
> +						   nb);
> +	union hdmi_event *event_block = data;
> +
> +	if (hcp->dev->parent != event_block->base.source)
> +		return NOTIFY_OK;
> +
> +	if (!hcp->jack)
> +		return NOTIFY_OK;
> +
> +	switch (event) {
> +	case HDMI_CONNECTED:
> +		hdmi_codec_jack_report(hcp, SND_JACK_LINEOUT);
> +		break;
> +	case HDMI_DISCONNECTED:
> +		hdmi_codec_jack_report(hcp, 0);
> +		break;
> +	case HDMI_NEW_ELD:
> +		memcpy(hcp->eld, event_block->eld.eld, sizeof(hcp->eld));

The access to eld should be protected my a mutex. There should be no 
disaster even without a protection, just a weird error if playback is 
started right in the middle when ELD is being updated, still it is 
better to be safe.

> +		break;
> +	}
> +
> +	return NOTIFY_OK;
> +}
> +
> +int hdmi_codec_set_jack_detect(struct snd_soc_codec *codec,
> +			       struct snd_soc_jack *jack)
> +{
> +	struct hdmi_codec_priv *hcp = snd_soc_codec_get_drvdata(codec);
> +
> +	hcp->jack = jack;
> +	hcp->nb.notifier_call = hdmi_codec_notify;
> +
> +	hdmi_register_notifier(&hcp->nb);
> +
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(hdmi_codec_set_jack_detect);
> +
>   static int hdmi_codec_probe(struct platform_device *pdev)
>   {
>   	struct hdmi_codec_pdata *hcd = pdev->dev.platform_data;
> @@ -370,6 +431,8 @@ static int hdmi_codec_probe(struct platform_device *pdev)
>   	if (hcd->spdif)
>   		hcp->daidrv[i] = hdmi_spdif_dai;
>
> +	dev_set_drvdata(dev, hcp);
> +
>   	ret = snd_soc_register_codec(dev, &hdmi_codec, hcp->daidrv,
>   				     dai_count);
>   	if (ret) {
> @@ -378,12 +441,16 @@ static int hdmi_codec_probe(struct platform_device *pdev)
>   		return ret;
>   	}
>
> -	dev_set_drvdata(dev, hcp);
> +	hcp->dev = dev;
> +
>   	return 0;
>   }
>
>   static int hdmi_codec_remove(struct platform_device *pdev)
>   {
> +	struct hdmi_codec_priv *hcp = platform_get_drvdata(pdev);
> +
> +	hdmi_unregister_notifier(&hcp->nb);
>   	snd_soc_unregister_codec(&pdev->dev);
>   	return 0;
>   }
>


Apart from above comment this looks good to me.

Cheers,
Jyri

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

* Re: [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control
  2016-01-12 15:38   ` [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control Philipp Zabel
@ 2016-01-19 12:00     ` Jyri Sarha
  2016-01-19 12:05       ` Takashi Iwai
       [not found]     ` <1452613096-8116-8-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
  1 sibling, 1 reply; 15+ messages in thread
From: Jyri Sarha @ 2016-01-19 12:00 UTC (permalink / raw)
  To: Philipp Zabel, alsa-devel
  Cc: Jean-Francois Moine, Koro Chen, Lars-Peter Clausen,
	Russell King - ARM Linux, Arnaud Pouliquen, Liam Girdwood,
	Daniel Kurtz, Cawa Cheng, Mark Brown, linux-mediatek, kernel,
	Matthias Brugger

On 01/12/16 17:38, Philipp Zabel wrote:
> Exporting the ELD bytes to userspace allows an application to select
> an appropriate audio format depending on the current capabilities of
> the connected HDMI sink device.
>

This looks good, but I was unable to test it. Obviously amixer or 
alsamixer is unable to show anything about an ELD mixer element, but 
shouldn't there be something about it shown under /proc/asound/card0/, 
or am I mistaken.

Cheers,
Jyri

> Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
> ---
>   sound/soc/codecs/hdmi-codec.c | 36 ++++++++++++++++++++++++++++++++++++
>   1 file changed, 36 insertions(+)
>
> diff --git a/sound/soc/codecs/hdmi-codec.c b/sound/soc/codecs/hdmi-codec.c
> index 6b327e2..6cb7217 100644
> --- a/sound/soc/codecs/hdmi-codec.c
> +++ b/sound/soc/codecs/hdmi-codec.c
> @@ -54,6 +54,40 @@ enum {
>   	DAI_ID_SPDIF,
>   };
>
> +static int hdmi_eld_ctl_info(struct snd_kcontrol *kcontrol,
> +			     struct snd_ctl_elem_info *uinfo)
> +{
> +	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
> +	struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component);
> +
> +	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
> +	uinfo->count = sizeof(hcp->eld);
> +
> +	return 0;
> +}
> +
> +static int hdmi_eld_ctl_get(struct snd_kcontrol *kcontrol,
> +			    struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
> +	struct hdmi_codec_priv *hcp = snd_soc_component_get_drvdata(component);
> +
> +	memcpy(ucontrol->value.bytes.data, hcp->eld, sizeof(hcp->eld));
> +
> +	return 0;
> +}
> +
> +static const struct snd_kcontrol_new hdmi_controls[] = {
> +	{
> +		.access = SNDRV_CTL_ELEM_ACCESS_READ |
> +			  SNDRV_CTL_ELEM_ACCESS_VOLATILE,
> +		.iface = SNDRV_CTL_ELEM_IFACE_PCM,
> +		.name = "ELD",
> +		.info = hdmi_eld_ctl_info,
> +		.get = hdmi_eld_ctl_get,
> +	},
> +};
> +
>   static void hdmi_codec_abort(struct device *dev)
>   {
>   	struct hdmi_codec_priv *hcp = dev_get_drvdata(dev);
> @@ -327,6 +361,8 @@ static const struct snd_soc_dai_driver hdmi_spdif_dai = {
>   };
>
>   static struct snd_soc_codec_driver hdmi_codec = {
> +	.controls = hdmi_controls,
> +	.num_controls = ARRAY_SIZE(hdmi_controls),
>   	.dapm_widgets = hdmi_widgets,
>   	.num_dapm_widgets = ARRAY_SIZE(hdmi_widgets),
>   	.dapm_routes = hdmi_routes,
>

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

* Re: [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control
  2016-01-19 12:00     ` Jyri Sarha
@ 2016-01-19 12:05       ` Takashi Iwai
  2016-01-19 12:47         ` Jyri Sarha
  2016-01-19 18:32         ` Mark Brown
  0 siblings, 2 replies; 15+ messages in thread
From: Takashi Iwai @ 2016-01-19 12:05 UTC (permalink / raw)
  To: Jyri Sarha
  Cc: Jean-Francois Moine, alsa-devel, Lars-Peter Clausen,
	Russell King - ARM Linux, kernel, Arnaud Pouliquen, Koro Chen,
	Daniel Kurtz, Liam Girdwood, Mark Brown, linux-mediatek,
	Philipp Zabel, Matthias Brugger, Cawa Cheng

On Tue, 19 Jan 2016 13:00:05 +0100,
Jyri Sarha wrote:
> 
> On 01/12/16 17:38, Philipp Zabel wrote:
> > Exporting the ELD bytes to userspace allows an application to select
> > an appropriate audio format depending on the current capabilities of
> > the connected HDMI sink device.
> >
> 
> This looks good, but I was unable to test it. Obviously amixer or 
> alsamixer is unable to show anything about an ELD mixer element,

You can use amixer cget command to retrieve the information.

> but 
> shouldn't there be something about it shown under /proc/asound/card0/, 
> or am I mistaken.

It's specific to driver.  HD-audio has one, but it doesn't show the
whole ELD but only parsed contents.


Takashi

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

* Re: [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control
  2016-01-19 12:05       ` Takashi Iwai
@ 2016-01-19 12:47         ` Jyri Sarha
  2016-01-19 18:32         ` Mark Brown
  1 sibling, 0 replies; 15+ messages in thread
From: Jyri Sarha @ 2016-01-19 12:47 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: Jean-Francois Moine, alsa-devel, Lars-Peter Clausen,
	Russell King - ARM Linux, kernel, Arnaud Pouliquen, Koro Chen,
	Daniel Kurtz, Liam Girdwood, Mark Brown, linux-mediatek,
	Philipp Zabel, Matthias Brugger, Cawa Cheng

On 01/19/16 14:05, Takashi Iwai wrote:
> On Tue, 19 Jan 2016 13:00:05 +0100,
> Jyri Sarha wrote:
>>
>> On 01/12/16 17:38, Philipp Zabel wrote:
>>> Exporting the ELD bytes to userspace allows an application to select
>>> an appropriate audio format depending on the current capabilities of
>>> the connected HDMI sink device.
>>>
>>
>> This looks good, but I was unable to test it. Obviously amixer or
>> alsamixer is unable to show anything about an ELD mixer element,
>
> You can use amixer cget command to retrieve the information.
>
>> but
>> shouldn't there be something about it shown under /proc/asound/card0/,
>> or am I mistaken.
>
> It's specific to driver.  HD-audio has one, but it doesn't show the
> whole ELD but only parsed contents.
>
>

Thanks,
I managed the read the ELD bytes with:

amixer -c0 cget iface=PCM,name='ELD',device=0

And the numbers change a bit when I connect to a different TV, so:

Reviewed-by: Jyri Sarha <jsarha@ti.com>
Tested-by: Jyri Sarha <jsarha@ti.com>

Cheers,
Jyri

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

* Re: [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control
       [not found]     ` <1452613096-8116-8-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
@ 2016-01-19 13:47       ` Lars-Peter Clausen
       [not found]         ` <569E3E86.2060500-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>
  0 siblings, 1 reply; 15+ messages in thread
From: Lars-Peter Clausen @ 2016-01-19 13:47 UTC (permalink / raw)
  To: Philipp Zabel, alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw
  Cc: Jean-Francois Moine, Koro Chen, Russell King - ARM Linux,
	Arnaud Pouliquen, Liam Girdwood, Jyri Sarha, Cawa Cheng,
	Mark Brown, linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Matthias Brugger

On 01/12/2016 04:38 PM, Philipp Zabel wrote:
> Exporting the ELD bytes to userspace allows an application to select
> an appropriate audio format depending on the current capabilities of
> the connected HDMI sink device.

This needs an explanation why this method, which will require explicit
support in applications, should be used rather than the standard ALSA
hardware capabilities reporting.

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

* Re: [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control
       [not found]         ` <569E3E86.2060500-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>
@ 2016-01-19 17:14           ` Russell King - ARM Linux
  0 siblings, 0 replies; 15+ messages in thread
From: Russell King - ARM Linux @ 2016-01-19 17:14 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: Jean-Francois Moine, alsa-devel-K7yf7f+aM1XWsZ/bQMPhNw,
	kernel-bIcnvbaLZ9MEGnE8C9+IrQ, Arnaud Pouliquen, Koro Chen,
	Jyri Sarha, Liam Girdwood, Mark Brown,
	linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Philipp Zabel,
	Matthias Brugger, Cawa Cheng

On Tue, Jan 19, 2016 at 02:47:50PM +0100, Lars-Peter Clausen wrote:
> On 01/12/2016 04:38 PM, Philipp Zabel wrote:
> > Exporting the ELD bytes to userspace allows an application to select
> > an appropriate audio format depending on the current capabilities of
> > the connected HDMI sink device.
> 
> This needs an explanation why this method, which will require explicit
> support in applications, should be used rather than the standard ALSA
> hardware capabilities reporting.

That can be summed up in one line:

ALSA doesn't know about all the different formats for compressed audio.

As far as I'm aware, applications today just lie to ALSA and use the
"16-bit PCM audio" formats (SNDRV_PCM_FORMAT_S16_LE or
SNDRV_PCM_FORMAT_U16_LE) to send compressed audio via ALSA, relying
on the IEC controls to set the channel status data correctly.

Maybe it would be nice to add formats for DTS, DTS-HD, AC3, OBA, etc
to the ALSA format list.

-- 
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.

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

* Re: [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control
  2016-01-19 12:05       ` Takashi Iwai
  2016-01-19 12:47         ` Jyri Sarha
@ 2016-01-19 18:32         ` Mark Brown
  1 sibling, 0 replies; 15+ messages in thread
From: Mark Brown @ 2016-01-19 18:32 UTC (permalink / raw)
  To: Takashi Iwai
  Cc: Jean-Francois Moine, alsa-devel, Lars-Peter Clausen,
	Russell King - ARM Linux, kernel, Arnaud Pouliquen, Koro Chen,
	Jyri Sarha, Liam Girdwood, linux-mediatek, Daniel Kurtz,
	Philipp Zabel, Matthias Brugger, Cawa Cheng


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

On Tue, Jan 19, 2016 at 01:05:19PM +0100, Takashi Iwai wrote:
> Jyri Sarha wrote:

> > but 
> > shouldn't there be something about it shown under /proc/asound/card0/, 
> > or am I mistaken.

> It's specific to driver.  HD-audio has one, but it doesn't show the
> whole ELD but only parsed contents.

Seems like it might be worth standardising at least some aspects of
that?

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

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



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

end of thread, other threads:[~2016-01-19 18:32 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-12 15:38 [RFC v3 0/7] ASoC: Add mediatek HDMI codec support Philipp Zabel
     [not found] ` <1452613096-8116-1-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2016-01-12 15:38   ` [RFC v3 1/7] drm/mediatek: hdmi: Add audio interface to the hdmi-codec driver Philipp Zabel
2016-01-12 15:38   ` [RFC v3 2/7] ASoC: mediatek: address dai link array entries by enum Philipp Zabel
2016-01-12 15:38   ` [RFC v3 3/7] ASoC: mediatek: Add HDMI dai-links in the machine driver Philipp Zabel
2016-01-12 15:38   ` [RFC v3 4/7] video: rmk's HDMI notification prototype Philipp Zabel
2016-01-12 15:38   ` [RFC v3 5/7] drm/mediatek: hdmi: issue notifications Philipp Zabel
2016-01-12 15:38   ` [RFC v3 6/7] ASoC: hdmi-codec: Use HDMI notifications to add jack support Philipp Zabel
2016-01-18 21:08     ` Jyri Sarha
2016-01-12 15:38   ` [RFC v3 7/7] ASoC: hdmi-codec: Add ELD control Philipp Zabel
2016-01-19 12:00     ` Jyri Sarha
2016-01-19 12:05       ` Takashi Iwai
2016-01-19 12:47         ` Jyri Sarha
2016-01-19 18:32         ` Mark Brown
     [not found]     ` <1452613096-8116-8-git-send-email-p.zabel-bIcnvbaLZ9MEGnE8C9+IrQ@public.gmane.org>
2016-01-19 13:47       ` Lars-Peter Clausen
     [not found]         ` <569E3E86.2060500-Qo5EllUWu/uELgA04lAiVw@public.gmane.org>
2016-01-19 17:14           ` Russell King - ARM Linux

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.