All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Éric Piel" <eric.piel@tremplin-utc.net>
To: Samu Onkalo <samu.p.onkalo@nokia.com>
Cc: khali@linux-fr.org, guenter.roeck@ericsson.com, jic23@cam.ac.uk,
	lm-sensors@lm-sensors.org, linux-i2c@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 09/12] hwmon: lis3: use block read to access data registers
Date: Sun, 24 Oct 2010 16:53:52 +0200	[thread overview]
Message-ID: <4CC44880.6030107@tremplin-utc.net> (raw)
In-Reply-To: <1287748654-2626-10-git-send-email-samu.p.onkalo@nokia.com>

Op 22-10-10 13:57, Samu Onkalo schreef:
> Add optional blockread function to interface driver. If available
> the chip driver uses it for data register access. For 12 bit device
> it reads 6 bytes to get 3*16bit data. For 8 bit device it reads out
> 5 bytes since every second byte is dummy.
> This optimizes bus usage and reduces number of operations and
> interrupts needed for one data update.
>
> Signed-off-by: Samu Onkalo<samu.p.onkalo@nokia.com>
Acked-by: Eric Piel <eric.piel@tremplin-utc.net>

> ---
>   drivers/hwmon/lis3lv02d.c     |   21 ++++++++++++++++++---
>   drivers/hwmon/lis3lv02d.h     |    1 +
>   drivers/hwmon/lis3lv02d_i2c.c |   13 +++++++++++++
>   include/linux/lis3lv02d.h     |    1 +
>   4 files changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c
> index 7555091..9fd946c 100644
> --- a/drivers/hwmon/lis3lv02d.c
> +++ b/drivers/hwmon/lis3lv02d.c
> @@ -130,9 +130,24 @@ static void lis3lv02d_get_xyz(struct lis3lv02d *lis3, int *x, int *y, int *z)
>   	int position[3];
>   	int i;
>
> -	position[0] = lis3->read_data(lis3, OUTX);
> -	position[1] = lis3->read_data(lis3, OUTY);
> -	position[2] = lis3->read_data(lis3, OUTZ);
> +	if (lis3->blkread) {
> +		if (lis3_dev.whoami == WAI_12B) {
> +			u16 data[3];
> +			lis3->blkread(lis3, OUTX_L, 6, (u8 *)data);
> +			for (i = 0; i<  3; i++)
> +				position[i] = (s16)le16_to_cpu(data[i]);
> +		} else {
> +			u8 data[5];
> +			/* Data: x, dummy, y, dummy, z */
> +			lis3->blkread(lis3, OUTX, 5, data);
> +			for (i = 0; i<  3; i++)
> +				position[i] = (s8)data[i * 2];
> +		}
> +	} else {
> +		position[0] = lis3->read_data(lis3, OUTX);
> +		position[1] = lis3->read_data(lis3, OUTY);
> +		position[2] = lis3->read_data(lis3, OUTZ);
> +	}
>
>   	for (i = 0; i<  3; i++)
>   		position[i] = (position[i] * lis3->scale) / LIS3_ACCURACY;
> diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h
> index 2ac27b9..d3cb662 100644
> --- a/drivers/hwmon/lis3lv02d.h
> +++ b/drivers/hwmon/lis3lv02d.h
> @@ -225,6 +225,7 @@ struct lis3lv02d {
>   	int (*init) (struct lis3lv02d *lis3);
>   	int (*write) (struct lis3lv02d *lis3, int reg, u8 val);
>   	int (*read) (struct lis3lv02d *lis3, int reg, u8 *ret);
> +	int (*blkread) (struct lis3lv02d *lis3, int reg, int len, u8 *ret);
>   	int (*reg_ctrl) (struct lis3lv02d *lis3, bool state);
>
>   	int                     *odrs;     /* Supported output data rates */
> diff --git a/drivers/hwmon/lis3lv02d_i2c.c b/drivers/hwmon/lis3lv02d_i2c.c
> index 36171bf..61c109b 100644
> --- a/drivers/hwmon/lis3lv02d_i2c.c
> +++ b/drivers/hwmon/lis3lv02d_i2c.c
> @@ -66,6 +66,14 @@ static inline s32 lis3_i2c_read(struct lis3lv02d *lis3, int reg, u8 *v)
>   	return 0;
>   }
>
> +static inline s32 lis3_i2c_blockread(struct lis3lv02d *lis3, int reg, int len,
> +				u8 *v)
> +{
> +	struct i2c_client *c = lis3->bus_priv;
> +	reg |= (1<<  7); /* 7th bit enables address auto incrementation */
> +	return i2c_smbus_read_i2c_block_data(c, reg, len, v);
> +}
> +
>   static int lis3_i2c_init(struct lis3lv02d *lis3)
>   {
>   	u8 reg;
> @@ -103,6 +111,11 @@ static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client,
>   		if (pdata->driver_features&  LIS3_USE_REGULATOR_CTRL)
>   			lis3_dev.reg_ctrl = lis3_reg_ctrl;
>
> +		if ((pdata->driver_features&  LIS3_USE_BLOCK_READ)&&
> +			(i2c_check_functionality(client->adapter,
> +						I2C_FUNC_SMBUS_I2C_BLOCK)))
> +			lis3_dev.blkread  = lis3_i2c_blockread;
> +
>   		if (pdata->axis_x)
>   			lis3lv02d_axis_map.x = pdata->axis_x;
>
> diff --git a/include/linux/lis3lv02d.h b/include/linux/lis3lv02d.h
> index 18d578f..c949612 100644
> --- a/include/linux/lis3lv02d.h
> +++ b/include/linux/lis3lv02d.h
> @@ -68,6 +68,7 @@ struct lis3lv02d_platform_data {
>   	s8 axis_y;
>   	s8 axis_z;
>   #define LIS3_USE_REGULATOR_CTRL 0x01
> +#define LIS3_USE_BLOCK_READ	0x02
>   	u16 driver_features;
>   	int default_rate;
>   	int (*setup_resources)(void);

WARNING: multiple messages have this Message-ID (diff)
From: "Éric Piel" <eric.piel@tremplin-utc.net>
To: Samu Onkalo <samu.p.onkalo@nokia.com>
Cc: khali@linux-fr.org, guenter.roeck@ericsson.com, jic23@cam.ac.uk,
	lm-sensors@lm-sensors.org, linux-i2c@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [lm-sensors] [PATCH 09/12] hwmon: lis3: use block read to
Date: Sun, 24 Oct 2010 14:53:52 +0000	[thread overview]
Message-ID: <4CC44880.6030107@tremplin-utc.net> (raw)
In-Reply-To: <1287748654-2626-10-git-send-email-samu.p.onkalo@nokia.com>

Op 22-10-10 13:57, Samu Onkalo schreef:
> Add optional blockread function to interface driver. If available
> the chip driver uses it for data register access. For 12 bit device
> it reads 6 bytes to get 3*16bit data. For 8 bit device it reads out
> 5 bytes since every second byte is dummy.
> This optimizes bus usage and reduces number of operations and
> interrupts needed for one data update.
>
> Signed-off-by: Samu Onkalo<samu.p.onkalo@nokia.com>
Acked-by: Eric Piel <eric.piel@tremplin-utc.net>

> ---
>   drivers/hwmon/lis3lv02d.c     |   21 ++++++++++++++++++---
>   drivers/hwmon/lis3lv02d.h     |    1 +
>   drivers/hwmon/lis3lv02d_i2c.c |   13 +++++++++++++
>   include/linux/lis3lv02d.h     |    1 +
>   4 files changed, 33 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c
> index 7555091..9fd946c 100644
> --- a/drivers/hwmon/lis3lv02d.c
> +++ b/drivers/hwmon/lis3lv02d.c
> @@ -130,9 +130,24 @@ static void lis3lv02d_get_xyz(struct lis3lv02d *lis3, int *x, int *y, int *z)
>   	int position[3];
>   	int i;
>
> -	position[0] = lis3->read_data(lis3, OUTX);
> -	position[1] = lis3->read_data(lis3, OUTY);
> -	position[2] = lis3->read_data(lis3, OUTZ);
> +	if (lis3->blkread) {
> +		if (lis3_dev.whoami = WAI_12B) {
> +			u16 data[3];
> +			lis3->blkread(lis3, OUTX_L, 6, (u8 *)data);
> +			for (i = 0; i<  3; i++)
> +				position[i] = (s16)le16_to_cpu(data[i]);
> +		} else {
> +			u8 data[5];
> +			/* Data: x, dummy, y, dummy, z */
> +			lis3->blkread(lis3, OUTX, 5, data);
> +			for (i = 0; i<  3; i++)
> +				position[i] = (s8)data[i * 2];
> +		}
> +	} else {
> +		position[0] = lis3->read_data(lis3, OUTX);
> +		position[1] = lis3->read_data(lis3, OUTY);
> +		position[2] = lis3->read_data(lis3, OUTZ);
> +	}
>
>   	for (i = 0; i<  3; i++)
>   		position[i] = (position[i] * lis3->scale) / LIS3_ACCURACY;
> diff --git a/drivers/hwmon/lis3lv02d.h b/drivers/hwmon/lis3lv02d.h
> index 2ac27b9..d3cb662 100644
> --- a/drivers/hwmon/lis3lv02d.h
> +++ b/drivers/hwmon/lis3lv02d.h
> @@ -225,6 +225,7 @@ struct lis3lv02d {
>   	int (*init) (struct lis3lv02d *lis3);
>   	int (*write) (struct lis3lv02d *lis3, int reg, u8 val);
>   	int (*read) (struct lis3lv02d *lis3, int reg, u8 *ret);
> +	int (*blkread) (struct lis3lv02d *lis3, int reg, int len, u8 *ret);
>   	int (*reg_ctrl) (struct lis3lv02d *lis3, bool state);
>
>   	int                     *odrs;     /* Supported output data rates */
> diff --git a/drivers/hwmon/lis3lv02d_i2c.c b/drivers/hwmon/lis3lv02d_i2c.c
> index 36171bf..61c109b 100644
> --- a/drivers/hwmon/lis3lv02d_i2c.c
> +++ b/drivers/hwmon/lis3lv02d_i2c.c
> @@ -66,6 +66,14 @@ static inline s32 lis3_i2c_read(struct lis3lv02d *lis3, int reg, u8 *v)
>   	return 0;
>   }
>
> +static inline s32 lis3_i2c_blockread(struct lis3lv02d *lis3, int reg, int len,
> +				u8 *v)
> +{
> +	struct i2c_client *c = lis3->bus_priv;
> +	reg |= (1<<  7); /* 7th bit enables address auto incrementation */
> +	return i2c_smbus_read_i2c_block_data(c, reg, len, v);
> +}
> +
>   static int lis3_i2c_init(struct lis3lv02d *lis3)
>   {
>   	u8 reg;
> @@ -103,6 +111,11 @@ static int __devinit lis3lv02d_i2c_probe(struct i2c_client *client,
>   		if (pdata->driver_features&  LIS3_USE_REGULATOR_CTRL)
>   			lis3_dev.reg_ctrl = lis3_reg_ctrl;
>
> +		if ((pdata->driver_features&  LIS3_USE_BLOCK_READ)&&
> +			(i2c_check_functionality(client->adapter,
> +						I2C_FUNC_SMBUS_I2C_BLOCK)))
> +			lis3_dev.blkread  = lis3_i2c_blockread;
> +
>   		if (pdata->axis_x)
>   			lis3lv02d_axis_map.x = pdata->axis_x;
>
> diff --git a/include/linux/lis3lv02d.h b/include/linux/lis3lv02d.h
> index 18d578f..c949612 100644
> --- a/include/linux/lis3lv02d.h
> +++ b/include/linux/lis3lv02d.h
> @@ -68,6 +68,7 @@ struct lis3lv02d_platform_data {
>   	s8 axis_y;
>   	s8 axis_z;
>   #define LIS3_USE_REGULATOR_CTRL 0x01
> +#define LIS3_USE_BLOCK_READ	0x02
>   	u16 driver_features;
>   	int default_rate;
>   	int (*setup_resources)(void);


_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors

  parent reply	other threads:[~2010-10-24 14:53 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-10-22 11:57 [PATCH 00/12] lis3 accelerator feature update Samu Onkalo
2010-10-22 11:57 ` [lm-sensors] " Samu Onkalo
2010-10-22 11:57 ` [PATCH 03/12] hwmon: lis3: Cleanup interrupt handling Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] " Samu Onkalo
2010-10-24 14:18   ` Éric Piel
2010-10-24 14:18     ` Éric Piel
2010-10-24 14:18     ` [lm-sensors] [PATCH 03/12] hwmon: lis3: Cleanup interrupt Éric Piel
2010-10-22 11:57 ` [PATCH 04/12] hwmon: lis3: Update coordinates at polled device open Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 04/12] hwmon: lis3: Update coordinates at Samu Onkalo
2010-10-24 14:19   ` [PATCH 04/12] hwmon: lis3: Update coordinates at polled device open Éric Piel
2010-10-24 14:19     ` [lm-sensors] [PATCH 04/12] hwmon: lis3: Update coordinates at Éric Piel
2010-10-22 11:57 ` [PATCH 05/12] hwmon: lis3: Power on corrections Samu Onkalo
2010-10-22 11:57   ` Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] " Samu Onkalo
2010-10-24 14:22   ` Éric Piel
2010-10-24 14:22     ` Éric Piel
2010-10-24 14:22     ` [lm-sensors] " Éric Piel
     [not found] ` <1287748654-2626-1-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 11:57   ` [PATCH 01/12] hwmon: lis3: pm_runtime support Samu Onkalo
2010-10-22 11:57     ` Samu Onkalo
2010-10-22 11:57     ` [lm-sensors] " Samu Onkalo
     [not found]     ` <1287748654-2626-2-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 16:13       ` Jonathan Cameron
2010-10-22 16:13         ` Jonathan Cameron
2010-10-22 16:13         ` [lm-sensors] " Jonathan Cameron
2010-10-24 14:03     ` Éric Piel
2010-10-24 14:03       ` Éric Piel
2010-10-24 14:03       ` [lm-sensors] " Éric Piel
2010-10-22 11:57   ` [PATCH 02/12] hwmon: lis3: regulator control Samu Onkalo
2010-10-22 11:57     ` Samu Onkalo
2010-10-22 11:57     ` [lm-sensors] " Samu Onkalo
     [not found]     ` <1287748654-2626-3-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 16:11       ` Jonathan Cameron
2010-10-22 16:11         ` Jonathan Cameron
2010-10-22 16:11         ` [lm-sensors] " Jonathan Cameron
2010-10-24 14:59     ` Éric Piel
2010-10-24 14:59       ` [lm-sensors] " Éric Piel
2010-10-22 11:57   ` [PATCH 06/12] hwmon: lis3: restore axis enabled bits Samu Onkalo
2010-10-22 11:57     ` Samu Onkalo
2010-10-22 11:57     ` [lm-sensors] " Samu Onkalo
2010-10-24 14:24     ` Éric Piel
2010-10-24 14:24       ` [lm-sensors] [PATCH 06/12] hwmon: lis3: restore axis enabled Éric Piel
2010-10-22 11:57   ` [PATCH 11/12] hwmon: lis3: Short explanations of platform data fields Samu Onkalo
2010-10-22 11:57     ` Samu Onkalo
2010-10-22 11:57     ` [lm-sensors] [PATCH 11/12] hwmon: lis3: Short explanations of Samu Onkalo
     [not found]     ` <1287748654-2626-12-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 16:25       ` [PATCH 11/12] hwmon: lis3: Short explanations of platform data fields Jonathan Cameron
2010-10-22 16:25         ` Jonathan Cameron
2010-10-22 16:25         ` [lm-sensors] [PATCH 11/12] hwmon: lis3: Short explanations of Jonathan Cameron
     [not found]         ` <4CC1BAEE.3030708-KWPb1pKIrIJaa/9Udqfwiw@public.gmane.org>
2010-10-23 13:39           ` [PATCHv2] hwmon: lis3: Short explanations of platform data fields Samu Onkalo
2010-10-23 13:39             ` [lm-sensors] [PATCHv2] hwmon: lis3: Short explanations of platform Samu Onkalo
     [not found]             ` <1287841184-4871-1-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-24 14:59               ` [PATCHv2] hwmon: lis3: Short explanations of platform data fields Éric Piel
2010-10-24 14:59                 ` [lm-sensors] [PATCHv2] hwmon: lis3: Short explanations of Éric Piel
2010-10-22 20:08   ` [PATCH 00/12] lis3 accelerator feature update Guenter Roeck
2010-10-22 20:08     ` Guenter Roeck
2010-10-22 20:08     ` [lm-sensors] " Guenter Roeck
2010-10-22 23:44     ` Éric Piel
2010-10-22 23:44       ` [lm-sensors] " Éric Piel
     [not found]       ` <4CC221F0.5040608-VkQ1JFuSMpfAbQlEx87xDw@public.gmane.org>
2010-10-23  1:05         ` Guenter Roeck
2010-10-23  1:05           ` Guenter Roeck
2010-10-23  1:05           ` [lm-sensors] " Guenter Roeck
2010-10-24 15:05   ` Éric Piel
2010-10-24 15:05     ` Éric Piel
2010-10-24 15:05     ` [lm-sensors] " Éric Piel
     [not found]     ` <4CC44B3D.5030404-VkQ1JFuSMpfAbQlEx87xDw@public.gmane.org>
2010-10-24 15:35       ` Guenter Roeck
2010-10-24 15:35         ` Guenter Roeck
2010-10-24 15:35         ` [lm-sensors] " Guenter Roeck
     [not found]         ` <20101024153548.GA14303-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>
2010-10-24 16:35           ` Guenter Roeck
2010-10-24 16:35             ` Guenter Roeck
2010-10-24 16:35             ` Guenter Roeck
     [not found]             ` <20101024163529.GA14650-IzeFyvvaP7pWk0Htik3J/w@public.gmane.org>
2010-10-24 17:01               ` Guenter Roeck
2010-10-24 17:01                 ` Guenter Roeck
2010-10-24 17:01                 ` Guenter Roeck
2010-10-25  6:10       ` samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w
2010-10-25  6:10         ` samu.p.onkalo
2010-10-25  6:10         ` [lm-sensors] " samu.p.onkalo
2010-10-22 11:57 ` [PATCH 07/12] hwmon: lis3: New parameters to platform data Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 07/12] hwmon: lis3: New parameters to platform Samu Onkalo
     [not found]   ` <1287748654-2626-8-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-22 16:17     ` [PATCH 07/12] hwmon: lis3: New parameters to platform data Jonathan Cameron
2010-10-22 16:17       ` Jonathan Cameron
2010-10-22 16:17       ` [lm-sensors] [PATCH 07/12] hwmon: lis3: New parameters to Jonathan Cameron
2010-10-24 14:27   ` [PATCH 07/12] hwmon: lis3: New parameters to platform data Éric Piel
2010-10-24 14:27     ` Éric Piel
2010-10-24 14:27     ` [lm-sensors] [PATCH 07/12] hwmon: lis3: New parameters to Éric Piel
2010-10-22 11:57 ` [PATCH 08/12] hwmon: lis3: Adjust fuzziness for 8 bit device Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 08/12] hwmon: lis3: Adjust fuzziness for 8 bit Samu Onkalo
2010-10-24 14:33   ` [PATCH 08/12] hwmon: lis3: Adjust fuzziness for 8 bit device Éric Piel
2010-10-24 14:33     ` [lm-sensors] [PATCH 08/12] hwmon: lis3: Adjust fuzziness for 8 Éric Piel
2010-10-22 11:57 ` [PATCH 09/12] hwmon: lis3: use block read to access data registers Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 09/12] hwmon: lis3: use block read to access Samu Onkalo
2010-10-22 16:20   ` [PATCH 09/12] hwmon: lis3: use block read to access data registers Jonathan Cameron
2010-10-22 16:20     ` [lm-sensors] [PATCH 09/12] hwmon: lis3: use block read to Jonathan Cameron
2010-10-24 14:53   ` Éric Piel [this message]
2010-10-24 14:53     ` Éric Piel
2010-10-22 11:57 ` [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest with IRQ line test Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest with Samu Onkalo
     [not found]   ` <1287748654-2626-11-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-24 14:58     ` [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest with IRQ line test Éric Piel
2010-10-24 14:58       ` Éric Piel
2010-10-24 14:58       ` [lm-sensors] [PATCH 10/12] hwmon: lis3: Enhance lis3 selftest Éric Piel
2010-10-22 11:57 ` [PATCH 12/12] hwmon: lis3: Release resources is case of failure Samu Onkalo
2010-10-22 11:57   ` Samu Onkalo
2010-10-22 11:57   ` [lm-sensors] [PATCH 12/12] hwmon: lis3: Release resources is case Samu Onkalo
     [not found]   ` <1287748654-2626-13-git-send-email-samu.p.onkalo-xNZwKgViW5gAvxtiuMwx3w@public.gmane.org>
2010-10-24 14:59     ` [PATCH 12/12] hwmon: lis3: Release resources is case of failure Éric Piel
2010-10-24 14:59       ` Éric Piel
2010-10-24 14:59       ` [lm-sensors] [PATCH 12/12] hwmon: lis3: Release resources is Éric Piel

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=4CC44880.6030107@tremplin-utc.net \
    --to=eric.piel@tremplin-utc.net \
    --cc=guenter.roeck@ericsson.com \
    --cc=jic23@cam.ac.uk \
    --cc=khali@linux-fr.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lm-sensors@lm-sensors.org \
    --cc=samu.p.onkalo@nokia.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.