All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: alsa-devel@alsa-project.org
Cc: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>,
	Jerome Anand <jerome.anand@intel.com>
Subject: [PATCH 34/53] ALSA: x86: Tidy up codes
Date: Thu,  2 Feb 2017 18:02:48 +0100	[thread overview]
Message-ID: <20170202170307.24484-36-tiwai@suse.de> (raw)
In-Reply-To: <20170202170307.24484-1-tiwai@suse.de>

Clean up codes, fix indentations, correct comments, etc.
No functional change.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 sound/x86/intel_hdmi_audio.c | 148 +++++++++++++++++--------------------------
 1 file changed, 59 insertions(+), 89 deletions(-)

diff --git a/sound/x86/intel_hdmi_audio.c b/sound/x86/intel_hdmi_audio.c
index 7c6549a10c1c..46db4883f0b5 100644
--- a/sound/x86/intel_hdmi_audio.c
+++ b/sound/x86/intel_hdmi_audio.c
@@ -285,7 +285,7 @@ static void snd_intelhad_reset_audio(struct snd_intelhad *intelhaddata,
 	had_write_register(intelhaddata, AUD_HDMI_STATUS_v2, reset);
 }
 
-/**
+/*
  * initialize audio channel status registers
  * This function is called in the prepare callback
  */
@@ -298,9 +298,9 @@ static int had_prog_status_reg(struct snd_pcm_substream *substream,
 	int format;
 
 	ch_stat0.status_0_regx.lpcm_id = (intelhaddata->aes_bits &
-						IEC958_AES0_NONAUDIO)>>1;
+					  IEC958_AES0_NONAUDIO) >> 1;
 	ch_stat0.status_0_regx.clk_acc = (intelhaddata->aes_bits &
-						IEC958_AES3_CON_CLOCK)>>4;
+					  IEC958_AES3_CON_CLOCK) >> 4;
 	cfg_val.cfg_regx_v2.val_bit = ch_stat0.status_0_regx.lpcm_id;
 
 	switch (substream->runtime->rate) {
@@ -330,9 +330,8 @@ static int had_prog_status_reg(struct snd_pcm_substream *substream,
 	default:
 		/* control should never come here */
 		return -EINVAL;
-	break;
-
 	}
+
 	had_write_register(intelhaddata,
 			   AUD_CH_STATUS_0, ch_stat0.status_0_regval);
 
@@ -348,6 +347,7 @@ static int had_prog_status_reg(struct snd_pcm_substream *substream,
 		ch_stat1.status_1_regx.max_wrd_len = 0;
 		ch_stat1.status_1_regx.wrd_len = 0;
 	}
+
 	had_write_register(intelhaddata,
 			   AUD_CH_STATUS_1, ch_stat1.status_1_regval);
 	return 0;
@@ -466,14 +466,14 @@ static int spk_to_chmap(int spk)
 
 static void had_build_channel_allocation_map(struct snd_intelhad *intelhaddata)
 {
-	int i = 0, c = 0;
+	int i, c;
 	int spk_mask = 0;
 	struct snd_pcm_chmap_elem *chmap;
 	u8 eld_high, eld_high_mask = 0xF0;
 	u8 high_msb;
 
 	chmap = kzalloc(sizeof(*chmap), GFP_KERNEL);
-	if (chmap == NULL) {
+	if (!chmap) {
 		intelhaddata->chmap->chmap = NULL;
 		return;
 	}
@@ -514,7 +514,7 @@ static void had_build_channel_allocation_map(struct snd_intelhad *intelhaddata)
 			for (c = 0; c < channel_allocations[i].channels; c++) {
 				chmap->map[c] = spk_to_chmap(
 					channel_allocations[i].speakers[
-						(MAX_SPEAKERS - 1)-c]);
+						(MAX_SPEAKERS - 1) - c]);
 			}
 			chmap->channels = channel_allocations[i].channels;
 			intelhaddata->chmap->chmap = chmap;
@@ -550,12 +550,12 @@ static int had_chmap_ctl_get(struct snd_kcontrol *kcontrol,
 {
 	struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
 	struct snd_intelhad *intelhaddata = info->private_data;
-	int i = 0;
+	int i;
 	const struct snd_pcm_chmap_elem *chmap;
 
 	if (intelhaddata->drv_status == HAD_DRV_DISCONNECTED)
 		return -ENODEV;
-	if (intelhaddata->chmap->chmap ==  NULL)
+	if (!intelhaddata->chmap->chmap)
 		return -ENODATA;
 	chmap = intelhaddata->chmap->chmap;
 	for (i = 0; i < chmap->channels; i++)
@@ -567,7 +567,7 @@ static int had_chmap_ctl_get(struct snd_kcontrol *kcontrol,
 static int had_register_chmap_ctls(struct snd_intelhad *intelhaddata,
 						struct snd_pcm *pcm)
 {
-	int err = 0;
+	int err;
 
 	err = snd_pcm_add_chmap_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK,
 			NULL, 0, (unsigned long)intelhaddata,
@@ -615,7 +615,7 @@ static void snd_intelhad_prog_dip(struct snd_pcm_substream *substream,
 		frame3.fr3_regx.chnl_alloc = snd_intelhad_channel_allocation(
 			intelhaddata, channels);
 
-		/*Calculte the byte wide checksum for all valid DIP words*/
+		/* Calculte the byte wide checksum for all valid DIP words */
 		for (i = 0; i < BYTES_PER_WORD; i++)
 			checksum += (info_frame >> i*BITS_PER_BYTE) & MASK_BYTE0;
 		for (i = 0; i < BYTES_PER_WORD; i++)
@@ -639,10 +639,8 @@ static void snd_intelhad_prog_dip(struct snd_pcm_substream *substream,
 	had_write_register(intelhaddata, AUD_CNTL_ST, ctrl_state.ctrl_val);
 }
 
-/**
- * snd_intelhad_prog_buffer - programs buffer
- * address and length registers
- *
+/*
+ * snd_intelhad_prog_buffer - programs buffer address and length registers
  * @substream:substream for which the prepare function is called
  * @intelhaddata:substream private data
  *
@@ -684,7 +682,7 @@ static int snd_intelhad_prog_buffer(struct snd_intelhad *intelhaddata,
 			intelhaddata->buf_info[i].buf_size = period_bytes;
 		else
 			intelhaddata->buf_info[i].buf_size = ring_buf_size -
-							(period_bytes*i);
+							(i * period_bytes);
 
 		had_write_register(intelhaddata,
 				   AUD_BUF_A_ADDR + (i * HAD_REG_WIDTH),
@@ -728,7 +726,7 @@ static int had_calculate_maud_value(u32 aud_samp_freq, u32 link_rate)
 {
 	u32 maud_val;
 
-	/* Select maud according to DP 1.2 spec*/
+	/* Select maud according to DP 1.2 spec */
 	if (link_rate == DP_2_7_GHZ) {
 		switch (aud_samp_freq) {
 		case AUD_SAMPLE_RATE_32:
@@ -836,41 +834,41 @@ static void snd_intelhad_prog_cts(u32 aud_samp_freq, u32 tmds,
 
 static int had_calculate_n_value(u32 aud_samp_freq)
 {
-	s32 n_val;
+	int n_val;
 
 	/* Select N according to HDMI 1.3a spec*/
 	switch (aud_samp_freq) {
 	case AUD_SAMPLE_RATE_32:
 		n_val = 4096;
-	break;
+		break;
 
 	case AUD_SAMPLE_RATE_44_1:
 		n_val = 6272;
-	break;
+		break;
 
 	case AUD_SAMPLE_RATE_48:
 		n_val = 6144;
-	break;
+		break;
 
 	case AUD_SAMPLE_RATE_88_2:
 		n_val = 12544;
-	break;
+		break;
 
 	case AUD_SAMPLE_RATE_96:
 		n_val = 12288;
-	break;
+		break;
 
 	case AUD_SAMPLE_RATE_176_4:
 		n_val = 25088;
-	break;
+		break;
 
 	case HAD_MAX_RATE:
 		n_val = 24576;
-	break;
+		break;
 
 	default:
 		n_val = -EINVAL;
-	break;
+		break;
 	}
 	return n_val;
 }
@@ -888,7 +886,7 @@ static int had_calculate_n_value(u32 aud_samp_freq)
 static int snd_intelhad_prog_n(u32 aud_samp_freq, u32 *n_param,
 			       struct snd_intelhad *intelhaddata)
 {
-	s32 n_val;
+	int n_val;
 
 	if (intelhaddata->dp_output) {
 		/*
@@ -920,7 +918,7 @@ static void snd_intelhad_handle_underrun(struct snd_intelhad *intelhaddata)
 	/* Reset buffer pointers */
 	had_write_register(intelhaddata, AUD_HDMI_STATUS_v2, 1);
 	had_write_register(intelhaddata, AUD_HDMI_STATUS_v2, 0);
-	/**
+	/*
 	 * The interrupt status 'sticky' bits might not be cleared by
 	 * setting '1' to that bit once...
 	 */
@@ -939,7 +937,7 @@ static void snd_intelhad_handle_underrun(struct snd_intelhad *intelhaddata)
 		dev_err(intelhaddata->dev, "Unable to clear UNDERRUN bits\n");
 }
 
-/**
+/*
  * snd_intelhad_open - stream initializations are done here
  * @substream:substream for which the stream function is called
  *
@@ -1029,25 +1027,8 @@ static void had_period_elapsed(struct snd_pcm_substream *substream)
 	snd_pcm_period_elapsed(substream);
 }
 
-/**
- * snd_intelhad_init_stream - internal function to initialize stream info
- * @substream:substream for which the stream function is called
- *
- */
-static int snd_intelhad_init_stream(struct snd_pcm_substream *substream)
-{
-	struct snd_intelhad *intelhaddata = snd_pcm_substream_chip(substream);
-
-	intelhaddata->stream_info.had_substream = substream;
-	intelhaddata->stream_info.buffer_ptr = 0;
-	intelhaddata->stream_info.buffer_rendered = 0;
-	intelhaddata->stream_info.sfreq = substream->runtime->rate;
-	return 0;
-}
-
-/**
- * snd_intelhad_close- to free parameteres when stream is stopped
- *
+/*
+ * snd_intelhad_close - to free parameteres when stream is stopped
  * @substream:  substream for which the function is called
  *
  * This function is called by ALSA framework when stream is stopped
@@ -1081,11 +1062,10 @@ static int snd_intelhad_close(struct snd_pcm_substream *substream)
 	return 0;
 }
 
-/**
- * snd_intelhad_hw_params- to setup the hardware parameters
- * like allocating the buffers
- *
- * @substream:  substream for which the function is called
+/*
+ * snd_intelhad_hw_params - to setup the hardware parameters
+ *   like allocating the buffers
+ * @substream: substream for which the function is called
  * @hw_params: hardware parameters
  *
  * This function is called by ALSA framework when hardware params are set
@@ -1121,14 +1101,12 @@ static int snd_intelhad_hw_params(struct snd_pcm_substream *substream,
 	return retval;
 }
 
-/**
- * snd_intelhad_hw_free- to release the resources allocated during
- * hardware params setup
- *
+/*
+ * snd_intelhad_hw_free - to release the resources allocated during
+ *   hardware params setup
  * @substream:  substream for which the function is called
  *
  * This function is called by ALSA framework before close callback.
- *
  */
 static int snd_intelhad_hw_free(struct snd_pcm_substream *substream)
 {
@@ -1146,10 +1124,11 @@ static int snd_intelhad_hw_free(struct snd_pcm_substream *substream)
 	return 0;
 }
 
-/**
+/*
  * snd_intelhad_pcm_trigger - stream activities are handled here
- * @substream:substream for which the stream function is called
- * @cmd:the stream commamd thats requested from upper layer
+ * @substream: substream for which the stream function is called
+ * @cmd: the stream commamd thats requested from upper layer
+ *
  * This function is called whenever an a stream activity is invoked
  */
 static int snd_intelhad_pcm_trigger(struct snd_pcm_substream *substream,
@@ -1208,10 +1187,9 @@ static int snd_intelhad_pcm_trigger(struct snd_pcm_substream *substream,
 	return retval;
 }
 
-/**
- * snd_intelhad_pcm_prepare- internal preparation before starting a stream
- *
- * @substream:  substream for which the function is called
+/*
+ * snd_intelhad_pcm_prepare - internal preparation before starting a stream
+ * @substream: substream for which the function is called
  *
  * This function is called when a stream is started for internal preparation.
  */
@@ -1252,10 +1230,10 @@ static int snd_intelhad_pcm_prepare(struct snd_pcm_substream *substream)
 		return retval;
 	}
 
-	retval = snd_intelhad_init_stream(substream);
-	if (retval)
-		goto prep_end;
-
+	intelhaddata->stream_info.had_substream = substream;
+	intelhaddata->stream_info.buffer_ptr = 0;
+	intelhaddata->stream_info.buffer_rendered = 0;
+	intelhaddata->stream_info.sfreq = substream->runtime->rate;
 
 	/* Get N value in KHz */
 	disp_samp_freq = intelhaddata->tmds_clock_speed;
@@ -1294,10 +1272,9 @@ static int snd_intelhad_pcm_prepare(struct snd_pcm_substream *substream)
 	return retval;
 }
 
-/**
+/*
  * snd_intelhad_pcm_pointer- to send the current buffer pointerprocessed by hw
- *
- * @substream:  substream for which the function is called
+ * @substream: substream for which the function is called
  *
  * This function is called by ALSA framework to get the current hw buffer ptr
  * when a period is elapsed
@@ -1359,11 +1336,10 @@ static snd_pcm_uframes_t snd_intelhad_pcm_pointer(
 	return intelhaddata->stream_info.buffer_ptr;
 }
 
-/**
+/*
  * snd_intelhad_pcm_mmap- mmaps a kernel buffer to user space for copying data
- *
- * @substream:  substream for which the function is called
- * @vma:		struct instance of memory VMM memory area
+ * @substream: substream for which the function is called
+ * @vma: struct instance of memory VMM memory area
  *
  * This function is called by OS when a user space component
  * tries to get mmap memory from driver
@@ -1418,11 +1394,9 @@ static int hdmi_audio_mode_change(struct snd_intelhad *intelhaddata)
 
 /*
  * hdmi_lpe_audio_suspend - power management suspend function
- *
  * @pdev: platform device
  *
- * This function is called by client driver to suspend the
- * hdmi audio.
+ * This function is called to suspend the hdmi audio.
  */
 static int hdmi_lpe_audio_suspend(struct platform_device *pdev,
 				  pm_message_t state)
@@ -1465,11 +1439,9 @@ static int hdmi_lpe_audio_suspend(struct platform_device *pdev,
 
 /*
  * hdmi_lpe_audio_resume - power management resume function
+ * @pdev: platform device
  *
- *@pdev: platform device
- *
- * This function is called by client driver to resume the
- * hdmi audio.
+ * This function is called to resume the hdmi audio.
  */
 static int hdmi_lpe_audio_resume(struct platform_device *pdev)
 {
@@ -1605,7 +1577,7 @@ static int had_process_buffer_done(struct snd_intelhad *intelhaddata)
 		return 0;
 	}
 
-	/*Reprogram the registers with addr and length*/
+	/* Reprogram the registers with addr and length */
 	had_write_register(intelhaddata,
 			   AUD_BUF_A_LENGTH + (buf_id * HAD_REG_WIDTH),
 			   buf_size);
@@ -1939,8 +1911,7 @@ static void hdmi_lpe_audio_free(struct snd_card *card)
  * hdmi_lpe_audio_probe - start bridge with i915
  *
  * This function is called when the i915 driver creates the
- * hdmi-lpe-audio platform device. Card creation is deferred until a
- * hot plug event is received
+ * hdmi-lpe-audio platform device.
  */
 static int hdmi_lpe_audio_probe(struct platform_device *pdev)
 {
@@ -2084,8 +2055,7 @@ static int hdmi_lpe_audio_probe(struct platform_device *pdev)
 /*
  * hdmi_lpe_audio_remove - stop bridge with i915
  *
- * This function is called when the platform device is destroyed. The sound
- * card should have been removed on hot plug event.
+ * This function is called when the platform device is destroyed.
  */
 static int hdmi_lpe_audio_remove(struct platform_device *pdev)
 {
-- 
2.11.0

  parent reply	other threads:[~2017-02-02 17:03 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-02 17:02 [PATCH 00/53] Intel LPE audio driver cleanups Takashi Iwai
2017-02-02 17:02 ` [PATCH 01/53] ALSA: x86: Don't set PCM state to DISCONNECTED Takashi Iwai
2017-02-02 17:02 ` [PATCH] drm/i915: Enable VLV audio chicken bit for LPE audio Takashi Iwai
2017-02-02 17:07   ` Takashi Iwai
2017-02-02 17:02 ` [PATCH 02/53] ALSA: x86: Remove v1 ops and structs Takashi Iwai
2017-02-02 17:02 ` [PATCH 03/53] ALSA: x86: Drop indirect calls of had_ops Takashi Iwai
2017-02-02 17:02 ` [PATCH 04/53] ALSA: x86: Replace indirect register ops with direct calls Takashi Iwai
2017-02-02 17:02 ` [PATCH 05/53] ALSA: x86: Replace indirect query_ops " Takashi Iwai
2017-02-02 17:02 ` [PATCH 06/53] ALSA: x86: Drop snd_intel_had_interface indirect calls Takashi Iwai
2017-02-02 17:02 ` [PATCH 07/53] ALSA: x86: Pass snd_intelhad object to helpers Takashi Iwai
2017-02-02 17:02 ` [PATCH 08/53] ALSA: x86: Handle the error from hdmi_audio_probe() properly Takashi Iwai
2017-02-02 17:02 ` [PATCH 09/53] ALSA: x86: Drop useless mutex at probe Takashi Iwai
2017-02-02 17:02 ` [PATCH 10/53] ALSA: x86: Call event callback directly Takashi Iwai
2017-02-02 17:02 ` [PATCH 11/53] ALSA: x86: Fix possible stale interrupt calls Takashi Iwai
2017-02-02 17:02 ` [PATCH 12/53] ALSA: x86: Drop unused mid_hdmi_audio_is_busy() Takashi Iwai
2017-02-02 17:02 ` [PATCH 13/53] ALSA: x86: Drop the global platform device reference Takashi Iwai
2017-02-02 17:02 ` [PATCH 14/53] ALSA: x86: Drop global hlpe_state Takashi Iwai
2017-02-02 17:02 ` [PATCH 15/53] ALSA: x86: Drop global ELD copy Takashi Iwai
2017-02-02 17:02 ` [PATCH 16/53] ALSA: x86: Move the global underrun_count to struct snd_intelhad Takashi Iwai
2017-02-02 17:02 ` [PATCH 17/53] ALSA: x86: Drop unused hw_silence field Takashi Iwai
2017-02-02 19:11   ` Pierre-Louis Bossart
2017-02-02 20:04     ` Takashi Iwai
2017-02-02 20:26       ` Pierre-Louis Bossart
2017-02-03  4:25         ` Ughreja, Rakesh A
2017-02-02 17:02 ` [PATCH 18/53] ALSA: x86: Move dma_mask debug print into intel_hdmi_lpe_audio.c Takashi Iwai
2017-02-02 17:02 ` [PATCH 19/53] ALSA: x86: Embed snd_intelhad into snd_card Takashi Iwai
2017-02-02 17:02 ` [PATCH 20/53] ALSA: x86: Drop superfluous CHT PCI ID check Takashi Iwai
2017-02-02 17:02 ` [PATCH 21/53] ALSA: x86: Check platform_data earlier Takashi Iwai
2017-02-02 17:02 ` [PATCH 22/53] ALSA: x86: Call snd_card_register() at the end Takashi Iwai
2017-02-02 17:02 ` [PATCH 23/53] ALSA: x86: Drop unused hdmi_audio_query() Takashi Iwai
2017-02-02 17:02 ` [PATCH 24/53] ALSA: x86: Flatten two abstraction layers Takashi Iwai
2017-02-02 17:02 ` [PATCH 25/53] ALSA: x86: Fold intel_hdmi_audio_if.c into main file Takashi Iwai
2017-02-02 17:02 ` [PATCH 26/53] ALSA: x86: Replace pr_xxx() with dev_xxx() Takashi Iwai
2017-02-02 17:02 ` [PATCH 27/53] ALSA: x86: Fix for CONFIG_PM=n Takashi Iwai
2017-02-02 17:02 ` [PATCH 28/53] ALSA: x86: Remove indirect call of snd_pcm_period_elapsed() Takashi Iwai
2017-02-02 17:02 ` [PATCH 29/53] ALSA: x86: Drop unused fields from snd_intelhad struct Takashi Iwai
2017-02-02 17:02 ` [PATCH 30/53] ALSA: x86: Drop superfluous PCM private_free Takashi Iwai
2017-02-02 17:02 ` [PATCH 31/53] ALSA: x86: Fix sleep-in-atomic via i915 notification Takashi Iwai
2017-02-02 17:02 ` [PATCH 32/53] ALSA: x86: Remove superfluous check at resume Takashi Iwai
2017-02-02 17:02 ` [PATCH 33/53] ALSA: x86: Drop had_get_hwstate() Takashi Iwai
2017-02-02 17:02 ` Takashi Iwai [this message]
2017-02-02 17:02 ` [PATCH 35/53] ALSA: x86: Remove _v[12] suffices Takashi Iwai
2017-02-02 17:02 ` [PATCH 36/53] ALSA: x86: Constfy tables Takashi Iwai
2017-02-02 17:02 ` [PATCH 37/53] ALSA: x86: Remove superfluous irqsave flags Takashi Iwai
2017-02-02 17:02 ` [PATCH 38/53] ALSA: x86: Fix racy access to chmap Takashi Iwai
2017-02-02 17:02 ` [PATCH 39/53] ALSA: x86: Drop flag_underrun field Takashi Iwai
2017-02-02 17:02 ` [PATCH 40/53] ALSA: x86: Drop superfluous state field Takashi Iwai
2017-02-02 17:02 ` [PATCH 41/53] ALSA: x86: Drop redundant had_stream_pvt Takashi Iwai
2017-02-02 17:02 ` [PATCH 42/53] ALSA: x86: Drop unused fields from pcm_stream_info Takashi Iwai
2017-02-02 17:02 ` [PATCH 43/53] ALSA: x86: Properly manage PCM substream lifetype Takashi Iwai
2017-02-02 17:02 ` [PATCH 44/53] ALSA: x86: Implement runtime PM Takashi Iwai
2017-02-02 17:02 ` [PATCH 45/53] ALSA: x86: Move stream status into pcm_stream_info Takashi Iwai
2017-02-02 17:03 ` [PATCH 46/53] ALSA: x86: Use the standard ELD bytes definitions Takashi Iwai
2017-02-02 17:03 ` [PATCH 47/53] ALSA: x86: Reduce redundant register field names Takashi Iwai
2017-02-02 17:03 ` [PATCH 48/53] ALSA: x86: Clean up unused defines and inclusions Takashi Iwai
2017-02-02 17:03 ` [PATCH 49/53] ALSA: x86: Create ELD control element Takashi Iwai
2017-02-02 17:03 ` [PATCH 50/53] ALSA: x86: Set CA bits for DisplayPort too Takashi Iwai
2017-02-02 17:03 ` [PATCH 51/53] ALSA: x86: Simplify comments Takashi Iwai
2017-02-02 17:03 ` [PATCH 52/53] ALSA: x86: Yet more tidy-up and clean-ups Takashi Iwai
2017-02-02 17:03 ` [PATCH 53/53] ALSA: x86: Rename drv_status to connected Takashi Iwai

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=20170202170307.24484-36-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@alsa-project.org \
    --cc=jerome.anand@intel.com \
    --cc=pierre-louis.bossart@linux.intel.com \
    /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.