All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hermes Wu <Hermes.wu@ite.com.tw>
To: Andrzej Hajda <andrzej.hajda@intel.com>,
	 Neil Armstrong <neil.armstrong@linaro.org>,
	Robert Foss <rfoss@kernel.org>,
	 Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
	 Jonas Karlman <jonas@kwiboo.se>,
	Jernej Skrabec <jernej.skrabec@gmail.com>,
	 Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	 Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	 David Airlie <airlied@gmail.com>,
	Simona Vetter <simona@ffwll.ch>
Cc: treapking@chromium.org, dri-devel@lists.freedesktop.org,
	 linux-kernel@vger.kernel.org, Pet.Weng@ite.com.tw,
	Kenneth.Hung@ite.com.tw,  Hermes Wu <Hermes.wu@ite.com.tw>
Subject: [PATCH v2] drm/bridge: it6505: support hdmi_codec_ops for audio stream setup
Date: Mon, 03 Feb 2025 14:04:30 +0800	[thread overview]
Message-ID: <20250203-add-audio-codec-v2-1-5c8cd72ee5bb@ite.com.tw> (raw)

For supporting audio form I2S to DP audio data sub stream.
Add hdmi_audio callbacks to drm_bridge_funcs for the
HDMI codec framework. The DRM_BRIDGE_OP_HDMI flag in bridge.ops
must be set, and hdmi_write_infoframe and hdmi_clear_infoframe
are necessary for the drm_bridge_connector to enable the HDMI codec.

Signed-off-by: Hermes Wu <Hermes.wu@ite.com.tw>
---
Changes in v2:
- Use DRM HDMI codec framewrok for audio stream setup.
- Link to v1: https://lore.kernel.org/r/20250121-add-audio-codec-v1-1-e3ff71b3c819@ite.com.tw
---
 drivers/gpu/drm/bridge/ite-it6505.c | 151 +++++++++++++++++++++++++++++++-----
 1 file changed, 132 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
index 88ef76a37fe6accacdd343839ff2569b31b18ceb..361e2412b8e8f040cf4254479b60588d99e8c99a 100644
--- a/drivers/gpu/drm/bridge/ite-it6505.c
+++ b/drivers/gpu/drm/bridge/ite-it6505.c
@@ -1414,32 +1414,43 @@ static void it6505_variable_config(struct it6505 *it6505)
 	memset(it6505->bksvs, 0, sizeof(it6505->bksvs));
 }
 
+static int it6505_write_avi_infoframe(struct it6505 *it6505,
+				      const u8 *buffer, size_t len)
+{
+	struct device *dev = it6505->dev;
+
+	if (len - HDMI_INFOFRAME_HEADER_SIZE > 13) {
+		DRM_DEV_DEBUG_DRIVER(dev, "AVI size fail %d", len);
+		return -EINVAL;
+	}
+
+	it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0);
+	regmap_bulk_write(it6505->regmap, REG_AVI_INFO_DB1,
+			  buffer + HDMI_INFOFRAME_HEADER_SIZE,
+			  len - HDMI_INFOFRAME_HEADER_SIZE);
+
+	it6505_write(it6505, REG_AVI_INFO_SUM, buffer[3]);
+	it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT,
+			EN_AVI_PKT);
+
+	return 0;
+}
+
 static int it6505_send_video_infoframe(struct it6505 *it6505,
 				       struct hdmi_avi_infoframe *frame)
 {
 	u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
-	int err;
+	int err, length;
 	struct device *dev = it6505->dev;
 
-	err = hdmi_avi_infoframe_pack(frame, buffer, sizeof(buffer));
-	if (err < 0) {
-		dev_err(dev, "Failed to pack AVI infoframe: %d", err);
-		return err;
+	length = hdmi_avi_infoframe_pack(frame, buffer, sizeof(buffer));
+	if (length < 0) {
+		dev_err(dev, "Failed to pack AVI infoframe: %d", length);
+		return length;
 	}
 
-	err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0x00);
-	if (err)
-		return err;
-
-	err = regmap_bulk_write(it6505->regmap, REG_AVI_INFO_DB1,
-				buffer + HDMI_INFOFRAME_HEADER_SIZE,
-				frame->length);
-	if (err)
-		return err;
-
-	err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT,
-			      EN_AVI_PKT);
-	if (err)
+	err = it6505_write_avi_infoframe(it6505, buffer, length);
+	if (err < 0)
 		return err;
 
 	return 0;
@@ -1625,6 +1636,18 @@ static void it6505_enable_audio_infoframe(struct it6505 *it6505)
 			EN_AUD_CTRL_PKT);
 }
 
+static void it6505_write_audio_infoframe(struct it6505 *it6505,
+					 const u8 *buffer, size_t len)
+{
+	it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_PKT, 0);
+	regmap_bulk_write(it6505->regmap, REG_AUD_INFOFRAM_DB1,
+			  buffer + HDMI_INFOFRAME_HEADER_SIZE,
+			  4);
+	it6505_write(it6505, REG_AUD_INFOFRAM_SUM, buffer[3]);
+	it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_PKT,
+			EN_AUD_PKT);
+}
+
 static void it6505_disable_audio(struct it6505 *it6505)
 {
 	it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_AUD_MUTE, EN_AUD_MUTE);
@@ -3302,6 +3325,85 @@ static const struct drm_edid *it6505_bridge_edid_read(struct drm_bridge *bridge,
 	return drm_edid_dup(it6505->cached_edid);
 }
 
+static int it6505_bridge_hdmi_audio_startup(struct drm_connector *connector,
+					    struct drm_bridge *bridge)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+	struct device *dev = it6505->dev;
+
+	if (!it6505->powered || it6505->enable_drv_hold)
+		return -EIO;
+
+	DRM_DEV_DEBUG_DRIVER(dev, "Audio enable");
+	it6505_enable_audio(it6505);
+
+	return 0;
+}
+
+static int it6505_bridge_hdmi_audio_prepare(struct drm_connector *connector,
+					    struct drm_bridge *bridge,
+					    struct hdmi_codec_daifmt *fmt,
+					    struct hdmi_codec_params *hparms)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+
+	return it6505_audio_setup_hw_params(it6505, hparms);
+}
+
+static void it6505_bridge_hdmi_audio_shutdown(struct drm_connector *connector,
+					      struct drm_bridge *bridge)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+
+	if (it6505->powered && !it6505->enable_drv_hold)
+		it6505_disable_audio(it6505);
+}
+
+static int it6505_bridge_hdmi_clear_infoframe(struct drm_bridge *bridge,
+					      enum hdmi_infoframe_type type)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+	struct device *dev = it6505->dev;
+
+	switch (type) {
+	case HDMI_INFOFRAME_TYPE_AUDIO:
+		it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_PKT, 0);
+		break;
+
+	case HDMI_INFOFRAME_TYPE_AVI:
+		it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0);
+		break;
+	default:
+		dev_dbg(dev, "unsupported HDMI infoframe 0x%x\n", type);
+		break;
+	}
+
+	return 0;
+}
+
+static int it6505_bridge_hdmi_write_infoframe(struct drm_bridge *bridge,
+					      enum hdmi_infoframe_type type,
+					      const u8 *buffer, size_t len)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+	struct device *dev = it6505->dev;
+
+	switch (type) {
+	case HDMI_INFOFRAME_TYPE_AUDIO:
+		it6505_write_audio_infoframe(it6505, buffer, len);
+		break;
+
+	case HDMI_INFOFRAME_TYPE_AVI:
+		it6505_write_avi_infoframe(it6505, buffer, len);
+		break;
+	default:
+		dev_dbg(dev, "unsupported HDMI infoframe 0x%x\n", type);
+		break;
+	}
+
+	return 0;
+}
+
 static const struct drm_bridge_funcs it6505_bridge_funcs = {
 	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
 	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
@@ -3315,6 +3417,12 @@ static const struct drm_bridge_funcs it6505_bridge_funcs = {
 	.atomic_post_disable = it6505_bridge_atomic_post_disable,
 	.detect = it6505_bridge_detect,
 	.edid_read = it6505_bridge_edid_read,
+	.hdmi_audio_startup = it6505_bridge_hdmi_audio_startup,
+	.hdmi_audio_prepare = it6505_bridge_hdmi_audio_prepare,
+	.hdmi_audio_shutdown = it6505_bridge_hdmi_audio_shutdown,
+	.hdmi_clear_infoframe = it6505_bridge_hdmi_clear_infoframe,
+	.hdmi_write_infoframe = it6505_bridge_hdmi_write_infoframe,
+
 };
 
 static __maybe_unused int it6505_bridge_resume(struct device *dev)
@@ -3700,7 +3808,12 @@ static int it6505_i2c_probe(struct i2c_client *client)
 	it6505->bridge.funcs = &it6505_bridge_funcs;
 	it6505->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
 	it6505->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
-			     DRM_BRIDGE_OP_HPD;
+			     DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_HDMI;
+	it6505->bridge.vendor = "iTE";
+	it6505->bridge.product = "IT6505";
+	it6505->bridge.hdmi_audio_dev = dev;
+	it6505->bridge.hdmi_audio_max_i2s_playback_channels = 2;
+	it6505->bridge.hdmi_audio_dai_port = 1;
 	drm_bridge_add(&it6505->bridge);
 
 	return 0;

---
base-commit: fe003bcb69f7bff9ff2b30b659b004dbafe52907
change-id: 20250114-add-audio-codec-8c9d47062a6c

Best regards,
-- 
Hermes Wu <Hermes.wu@ite.com.tw>


WARNING: multiple messages have this Message-ID (diff)
From: Hermes Wu via B4 Relay <devnull+Hermes.wu.ite.com.tw@kernel.org>
To: Andrzej Hajda <andrzej.hajda@intel.com>,
	 Neil Armstrong <neil.armstrong@linaro.org>,
	Robert Foss <rfoss@kernel.org>,
	 Laurent Pinchart <Laurent.pinchart@ideasonboard.com>,
	 Jonas Karlman <jonas@kwiboo.se>,
	Jernej Skrabec <jernej.skrabec@gmail.com>,
	 Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	 Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	 David Airlie <airlied@gmail.com>,
	Simona Vetter <simona@ffwll.ch>
Cc: treapking@chromium.org, dri-devel@lists.freedesktop.org,
	 linux-kernel@vger.kernel.org, Pet.Weng@ite.com.tw,
	Kenneth.Hung@ite.com.tw,  Hermes Wu <Hermes.wu@ite.com.tw>
Subject: [PATCH v2] drm/bridge: it6505: support hdmi_codec_ops for audio stream setup
Date: Mon, 03 Feb 2025 14:04:30 +0800	[thread overview]
Message-ID: <20250203-add-audio-codec-v2-1-5c8cd72ee5bb@ite.com.tw> (raw)

From: Hermes Wu <Hermes.wu@ite.com.tw>

For supporting audio form I2S to DP audio data sub stream.
Add hdmi_audio callbacks to drm_bridge_funcs for the
HDMI codec framework. The DRM_BRIDGE_OP_HDMI flag in bridge.ops
must be set, and hdmi_write_infoframe and hdmi_clear_infoframe
are necessary for the drm_bridge_connector to enable the HDMI codec.

Signed-off-by: Hermes Wu <Hermes.wu@ite.com.tw>
---
Changes in v2:
- Use DRM HDMI codec framewrok for audio stream setup.
- Link to v1: https://lore.kernel.org/r/20250121-add-audio-codec-v1-1-e3ff71b3c819@ite.com.tw
---
 drivers/gpu/drm/bridge/ite-it6505.c | 151 +++++++++++++++++++++++++++++++-----
 1 file changed, 132 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/bridge/ite-it6505.c b/drivers/gpu/drm/bridge/ite-it6505.c
index 88ef76a37fe6accacdd343839ff2569b31b18ceb..361e2412b8e8f040cf4254479b60588d99e8c99a 100644
--- a/drivers/gpu/drm/bridge/ite-it6505.c
+++ b/drivers/gpu/drm/bridge/ite-it6505.c
@@ -1414,32 +1414,43 @@ static void it6505_variable_config(struct it6505 *it6505)
 	memset(it6505->bksvs, 0, sizeof(it6505->bksvs));
 }
 
+static int it6505_write_avi_infoframe(struct it6505 *it6505,
+				      const u8 *buffer, size_t len)
+{
+	struct device *dev = it6505->dev;
+
+	if (len - HDMI_INFOFRAME_HEADER_SIZE > 13) {
+		DRM_DEV_DEBUG_DRIVER(dev, "AVI size fail %d", len);
+		return -EINVAL;
+	}
+
+	it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0);
+	regmap_bulk_write(it6505->regmap, REG_AVI_INFO_DB1,
+			  buffer + HDMI_INFOFRAME_HEADER_SIZE,
+			  len - HDMI_INFOFRAME_HEADER_SIZE);
+
+	it6505_write(it6505, REG_AVI_INFO_SUM, buffer[3]);
+	it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT,
+			EN_AVI_PKT);
+
+	return 0;
+}
+
 static int it6505_send_video_infoframe(struct it6505 *it6505,
 				       struct hdmi_avi_infoframe *frame)
 {
 	u8 buffer[HDMI_INFOFRAME_HEADER_SIZE + HDMI_AVI_INFOFRAME_SIZE];
-	int err;
+	int err, length;
 	struct device *dev = it6505->dev;
 
-	err = hdmi_avi_infoframe_pack(frame, buffer, sizeof(buffer));
-	if (err < 0) {
-		dev_err(dev, "Failed to pack AVI infoframe: %d", err);
-		return err;
+	length = hdmi_avi_infoframe_pack(frame, buffer, sizeof(buffer));
+	if (length < 0) {
+		dev_err(dev, "Failed to pack AVI infoframe: %d", length);
+		return length;
 	}
 
-	err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0x00);
-	if (err)
-		return err;
-
-	err = regmap_bulk_write(it6505->regmap, REG_AVI_INFO_DB1,
-				buffer + HDMI_INFOFRAME_HEADER_SIZE,
-				frame->length);
-	if (err)
-		return err;
-
-	err = it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT,
-			      EN_AVI_PKT);
-	if (err)
+	err = it6505_write_avi_infoframe(it6505, buffer, length);
+	if (err < 0)
 		return err;
 
 	return 0;
@@ -1625,6 +1636,18 @@ static void it6505_enable_audio_infoframe(struct it6505 *it6505)
 			EN_AUD_CTRL_PKT);
 }
 
+static void it6505_write_audio_infoframe(struct it6505 *it6505,
+					 const u8 *buffer, size_t len)
+{
+	it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_PKT, 0);
+	regmap_bulk_write(it6505->regmap, REG_AUD_INFOFRAM_DB1,
+			  buffer + HDMI_INFOFRAME_HEADER_SIZE,
+			  4);
+	it6505_write(it6505, REG_AUD_INFOFRAM_SUM, buffer[3]);
+	it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_PKT,
+			EN_AUD_PKT);
+}
+
 static void it6505_disable_audio(struct it6505 *it6505)
 {
 	it6505_set_bits(it6505, REG_DATA_MUTE_CTRL, EN_AUD_MUTE, EN_AUD_MUTE);
@@ -3302,6 +3325,85 @@ static const struct drm_edid *it6505_bridge_edid_read(struct drm_bridge *bridge,
 	return drm_edid_dup(it6505->cached_edid);
 }
 
+static int it6505_bridge_hdmi_audio_startup(struct drm_connector *connector,
+					    struct drm_bridge *bridge)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+	struct device *dev = it6505->dev;
+
+	if (!it6505->powered || it6505->enable_drv_hold)
+		return -EIO;
+
+	DRM_DEV_DEBUG_DRIVER(dev, "Audio enable");
+	it6505_enable_audio(it6505);
+
+	return 0;
+}
+
+static int it6505_bridge_hdmi_audio_prepare(struct drm_connector *connector,
+					    struct drm_bridge *bridge,
+					    struct hdmi_codec_daifmt *fmt,
+					    struct hdmi_codec_params *hparms)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+
+	return it6505_audio_setup_hw_params(it6505, hparms);
+}
+
+static void it6505_bridge_hdmi_audio_shutdown(struct drm_connector *connector,
+					      struct drm_bridge *bridge)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+
+	if (it6505->powered && !it6505->enable_drv_hold)
+		it6505_disable_audio(it6505);
+}
+
+static int it6505_bridge_hdmi_clear_infoframe(struct drm_bridge *bridge,
+					      enum hdmi_infoframe_type type)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+	struct device *dev = it6505->dev;
+
+	switch (type) {
+	case HDMI_INFOFRAME_TYPE_AUDIO:
+		it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AUD_PKT, 0);
+		break;
+
+	case HDMI_INFOFRAME_TYPE_AVI:
+		it6505_set_bits(it6505, REG_INFOFRAME_CTRL, EN_AVI_PKT, 0);
+		break;
+	default:
+		dev_dbg(dev, "unsupported HDMI infoframe 0x%x\n", type);
+		break;
+	}
+
+	return 0;
+}
+
+static int it6505_bridge_hdmi_write_infoframe(struct drm_bridge *bridge,
+					      enum hdmi_infoframe_type type,
+					      const u8 *buffer, size_t len)
+{
+	struct it6505 *it6505 = bridge_to_it6505(bridge);
+	struct device *dev = it6505->dev;
+
+	switch (type) {
+	case HDMI_INFOFRAME_TYPE_AUDIO:
+		it6505_write_audio_infoframe(it6505, buffer, len);
+		break;
+
+	case HDMI_INFOFRAME_TYPE_AVI:
+		it6505_write_avi_infoframe(it6505, buffer, len);
+		break;
+	default:
+		dev_dbg(dev, "unsupported HDMI infoframe 0x%x\n", type);
+		break;
+	}
+
+	return 0;
+}
+
 static const struct drm_bridge_funcs it6505_bridge_funcs = {
 	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
 	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
@@ -3315,6 +3417,12 @@ static const struct drm_bridge_funcs it6505_bridge_funcs = {
 	.atomic_post_disable = it6505_bridge_atomic_post_disable,
 	.detect = it6505_bridge_detect,
 	.edid_read = it6505_bridge_edid_read,
+	.hdmi_audio_startup = it6505_bridge_hdmi_audio_startup,
+	.hdmi_audio_prepare = it6505_bridge_hdmi_audio_prepare,
+	.hdmi_audio_shutdown = it6505_bridge_hdmi_audio_shutdown,
+	.hdmi_clear_infoframe = it6505_bridge_hdmi_clear_infoframe,
+	.hdmi_write_infoframe = it6505_bridge_hdmi_write_infoframe,
+
 };
 
 static __maybe_unused int it6505_bridge_resume(struct device *dev)
@@ -3700,7 +3808,12 @@ static int it6505_i2c_probe(struct i2c_client *client)
 	it6505->bridge.funcs = &it6505_bridge_funcs;
 	it6505->bridge.type = DRM_MODE_CONNECTOR_DisplayPort;
 	it6505->bridge.ops = DRM_BRIDGE_OP_DETECT | DRM_BRIDGE_OP_EDID |
-			     DRM_BRIDGE_OP_HPD;
+			     DRM_BRIDGE_OP_HPD | DRM_BRIDGE_OP_HDMI;
+	it6505->bridge.vendor = "iTE";
+	it6505->bridge.product = "IT6505";
+	it6505->bridge.hdmi_audio_dev = dev;
+	it6505->bridge.hdmi_audio_max_i2s_playback_channels = 2;
+	it6505->bridge.hdmi_audio_dai_port = 1;
 	drm_bridge_add(&it6505->bridge);
 
 	return 0;

---
base-commit: fe003bcb69f7bff9ff2b30b659b004dbafe52907
change-id: 20250114-add-audio-codec-8c9d47062a6c

Best regards,
-- 
Hermes Wu <Hermes.wu@ite.com.tw>



             reply	other threads:[~2025-02-03  6:04 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-03  6:04 Hermes Wu [this message]
2025-02-03  6:04 ` [PATCH v2] drm/bridge: it6505: support hdmi_codec_ops for audio stream setup Hermes Wu via B4 Relay
2025-02-03 17:28 ` Dmitry Baryshkov
2025-02-04  3:48   ` Hermes.Wu
2025-02-04  8:10     ` Pin-yen Lin
2025-02-04 15:37       ` Dmitry Baryshkov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20250203-add-audio-codec-v2-1-5c8cd72ee5bb@ite.com.tw \
    --to=hermes.wu@ite.com.tw \
    --cc=Kenneth.Hung@ite.com.tw \
    --cc=Laurent.pinchart@ideasonboard.com \
    --cc=Pet.Weng@ite.com.tw \
    --cc=airlied@gmail.com \
    --cc=andrzej.hajda@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=jernej.skrabec@gmail.com \
    --cc=jonas@kwiboo.se \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mripard@kernel.org \
    --cc=neil.armstrong@linaro.org \
    --cc=rfoss@kernel.org \
    --cc=simona@ffwll.ch \
    --cc=treapking@chromium.org \
    --cc=tzimmermann@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.