mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Sascha Hauer <s.hauer@pengutronix.de>
To: barebox@lists.infradead.org
Subject: [PATCH 5/5] drivers: Bail out if dev_request_mem_region fails
Date: Mon, 11 Mar 2013 22:01:56 +0100	[thread overview]
Message-ID: <1363035716-13386-6-git-send-email-s.hauer@pengutronix.de> (raw)
In-Reply-To: <1363035716-13386-1-git-send-email-s.hauer@pengutronix.de>

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
 arch/arm/mach-imx/clk-imx1.c        |  2 ++
 arch/arm/mach-imx/clk-imx21.c       |  2 ++
 arch/arm/mach-imx/clk-imx25.c       |  2 ++
 arch/arm/mach-imx/clk-imx27.c       |  2 ++
 arch/arm/mach-imx/clk-imx31.c       |  2 ++
 arch/arm/mach-imx/clk-imx35.c       |  2 ++
 arch/arm/mach-imx/clk-imx5.c        |  4 ++++
 arch/arm/mach-imx/clk-imx6.c        |  2 ++
 arch/arm/mach-imx/clocksource.c     |  2 ++
 arch/arm/mach-imx/esdctl.c          |  2 +-
 arch/arm/mach-imx/gpio.c            | 10 ++++++++++
 arch/arm/mach-imx/iim.c             |  2 ++
 arch/arm/mach-imx/iomux-v2.c        |  2 ++
 arch/arm/mach-imx/iomux-v3.c        |  2 ++
 drivers/mci/mxs.c                   | 10 ++++++++++
 drivers/mci/omap_hsmmc.c            | 10 ++++++++++
 drivers/mci/s3c.c                   | 10 ++++++++++
 drivers/mtd/nor/cfi_flash.c         | 12 ++++++++++++
 drivers/net/fec_imx.c               |  4 ++++
 drivers/serial/serial_altera_jtag.c | 11 +++++++++++
 drivers/serial/serial_imx.c         |  5 +++++
 drivers/serial/serial_s3c.c         | 10 ++++++++++
 drivers/serial/stm-serial.c         | 10 ++++++++++
 drivers/spi/imx_spi.c               |  4 ++++
 drivers/watchdog/imxwd.c            |  5 +++++
 25 files changed, 128 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-imx/clk-imx1.c b/arch/arm/mach-imx/clk-imx1.c
index 0d04a92..2192082 100644
--- a/arch/arm/mach-imx/clk-imx1.c
+++ b/arch/arm/mach-imx/clk-imx1.c
@@ -90,6 +90,8 @@ static int imx1_ccm_probe(struct device_d *dev)
 	void __iomem *regs;
 
 	regs = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	mx1_clocks_init(regs, 32000);
 
diff --git a/arch/arm/mach-imx/clk-imx21.c b/arch/arm/mach-imx/clk-imx21.c
index 6e91424..d76ba9a 100644
--- a/arch/arm/mach-imx/clk-imx21.c
+++ b/arch/arm/mach-imx/clk-imx21.c
@@ -112,6 +112,8 @@ static int imx21_ccm_probe(struct device_d *dev)
 	unsigned long href = 26000000;
 
 	base = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	writel(PCCR0_UART1_EN | PCCR0_UART2_EN | PCCR0_UART3_EN | PCCR0_UART4_EN |
 			PCCR0_CSPI1_EN | PCCR0_CSPI2_EN | PCCR0_SDHC1_EN |
diff --git a/arch/arm/mach-imx/clk-imx25.c b/arch/arm/mach-imx/clk-imx25.c
index 95b105d..81db426 100644
--- a/arch/arm/mach-imx/clk-imx25.c
+++ b/arch/arm/mach-imx/clk-imx25.c
@@ -75,6 +75,8 @@ static int imx25_ccm_probe(struct device_d *dev)
 	void __iomem *base;
 
 	base = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	writel((1 << 3) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 8) | (1 << 9) |
 			(1 << 10) | (1 << 15) |	(1 << 19) | (1 << 21) | (1 << 22) |
diff --git a/arch/arm/mach-imx/clk-imx27.c b/arch/arm/mach-imx/clk-imx27.c
index e221928..4c84744 100644
--- a/arch/arm/mach-imx/clk-imx27.c
+++ b/arch/arm/mach-imx/clk-imx27.c
@@ -134,6 +134,8 @@ static int imx27_ccm_probe(struct device_d *dev)
 	void __iomem *base;
 
 	base = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	writel(PCCR0_SDHC3_EN | PCCR0_SDHC2_EN | PCCR0_SDHC1_EN |
 			PCCR0_PWM_EN | PCCR0_KPP_EN | PCCR0_IIM_EN |
diff --git a/arch/arm/mach-imx/clk-imx31.c b/arch/arm/mach-imx/clk-imx31.c
index aa1b652..435aed7 100644
--- a/arch/arm/mach-imx/clk-imx31.c
+++ b/arch/arm/mach-imx/clk-imx31.c
@@ -83,6 +83,8 @@ static int imx31_ccm_probe(struct device_d *dev)
 	void __iomem *base;
 
 	base = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	writel(0xffffffff, base + CCM_CGR0);
 	writel(0xffffffff, base + CCM_CGR1);
diff --git a/arch/arm/mach-imx/clk-imx35.c b/arch/arm/mach-imx/clk-imx35.c
index f50c07d..e1ee979 100644
--- a/arch/arm/mach-imx/clk-imx35.c
+++ b/arch/arm/mach-imx/clk-imx35.c
@@ -96,6 +96,8 @@ static int imx35_ccm_probe(struct device_d *dev)
 	void __iomem *base;
 
 	base = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	writel(0xffffffff, base + CCM_CGR0);
 	writel(0xffffffff, base + CCM_CGR1);
diff --git a/arch/arm/mach-imx/clk-imx5.c b/arch/arm/mach-imx/clk-imx5.c
index 8b5bffd..350cce9 100644
--- a/arch/arm/mach-imx/clk-imx5.c
+++ b/arch/arm/mach-imx/clk-imx5.c
@@ -229,6 +229,8 @@ static int imx51_ccm_probe(struct device_d *dev)
 	void __iomem *regs;
 
 	regs = dev_request_mem_region(dev, 0);
+	if (!regs)
+		return -EBUSY;
 
 	mx51_clocks_init(regs, 32768, 24000000, 22579200, 0); /* FIXME */
 
@@ -292,6 +294,8 @@ static int imx53_ccm_probe(struct device_d *dev)
 	void __iomem *regs;
 
 	regs = dev_request_mem_region(dev, 0);
+	if (!regs)
+		return -EBUSY;
 
 	mx53_clocks_init(regs, 32768, 24000000, 22579200, 0); /* FIXME */
 
diff --git a/arch/arm/mach-imx/clk-imx6.c b/arch/arm/mach-imx/clk-imx6.c
index f1b167a..1cd1bf9 100644
--- a/arch/arm/mach-imx/clk-imx6.c
+++ b/arch/arm/mach-imx/clk-imx6.c
@@ -187,6 +187,8 @@ static int imx6_ccm_probe(struct device_d *dev)
 
 	anatop_base = (void *)MX6_ANATOP_BASE_ADDR;
 	ccm_base = dev_request_mem_region(dev, 0);
+	if (!ccm_base)
+		return -EBUSY;
 
 	base = anatop_base;
 
diff --git a/arch/arm/mach-imx/clocksource.c b/arch/arm/mach-imx/clocksource.c
index e18685e..1022503 100644
--- a/arch/arm/mach-imx/clocksource.c
+++ b/arch/arm/mach-imx/clocksource.c
@@ -103,6 +103,8 @@ static int imx_gpt_probe(struct device_d *dev)
 		return ret;
 
 	timer_base = dev_request_mem_region(dev, 0);
+	if (!timer_base)
+		return -EBUSY;
 
 	/* setup GP Timer 1 */
 	writel(TCTL_SWR, timer_base + GPT_TCTL);
diff --git a/arch/arm/mach-imx/esdctl.c b/arch/arm/mach-imx/esdctl.c
index cc2bdc1..14d52b3 100644
--- a/arch/arm/mach-imx/esdctl.c
+++ b/arch/arm/mach-imx/esdctl.c
@@ -230,7 +230,7 @@ static int imx_esdctl_probe(struct device_d *dev)
 
 	base = dev_request_mem_region(dev, 0);
 	if (!base)
-		return -ENOMEM;
+		return -EBUSY;
 
 	data->add_mem(base, data);
 
diff --git a/arch/arm/mach-imx/gpio.c b/arch/arm/mach-imx/gpio.c
index 1bf4100..15919ef 100644
--- a/arch/arm/mach-imx/gpio.c
+++ b/arch/arm/mach-imx/gpio.c
@@ -22,6 +22,7 @@
 
 #include <common.h>
 #include <errno.h>
+#include <malloc.h>
 #include <io.h>
 #include <gpio.h>
 #include <init.h>
@@ -131,6 +132,11 @@ static int imx_gpio_probe(struct device_d *dev)
 
 	imxgpio = xzalloc(sizeof(*imxgpio));
 	imxgpio->base = dev_request_mem_region(dev, 0);
+	if (!imxgpio->base) {
+		ret = -EBUSY;
+		goto err_free;
+	}
+
 	imxgpio->chip.ops = &imx_gpio_ops;
 	if (dev->id < 0) {
 		imxgpio->chip.base = of_alias_get_id(dev->device_node, "gpio");
@@ -148,6 +154,10 @@ static int imx_gpio_probe(struct device_d *dev)
 	dev_dbg(dev, "probed gpiochip%d with base %d\n", dev->id, imxgpio->chip.base);
 
 	return 0;
+err_free:
+	free(imxgpio);
+
+	return ret;
 }
 
 static __maybe_unused struct of_device_id imx_gpio_dt_ids[] = {
diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c
index 69ddc4d..5d24848 100644
--- a/arch/arm/mach-imx/iim.c
+++ b/arch/arm/mach-imx/iim.c
@@ -259,6 +259,8 @@ static int imx_iim_probe(struct device_d *dev)
 	void __iomem *base;
 
 	base = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	if (pdata)
 		mac_addr_base = pdata->mac_addr_base;
diff --git a/arch/arm/mach-imx/iomux-v2.c b/arch/arm/mach-imx/iomux-v2.c
index cef0340..a0c1d69 100644
--- a/arch/arm/mach-imx/iomux-v2.c
+++ b/arch/arm/mach-imx/iomux-v2.c
@@ -118,6 +118,8 @@ int imx_iomux_setup_multiple_pins(const unsigned int *pin_list, unsigned count)
 static int imx_iomux_probe(struct device_d *dev)
 {
 	base = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	return 0;
 }
diff --git a/arch/arm/mach-imx/iomux-v3.c b/arch/arm/mach-imx/iomux-v3.c
index 8a6064d..7c0d088 100644
--- a/arch/arm/mach-imx/iomux-v3.c
+++ b/arch/arm/mach-imx/iomux-v3.c
@@ -73,6 +73,8 @@ EXPORT_SYMBOL(mxc_iomux_v3_setup_multiple_pads);
 static int imx_iomux_probe(struct device_d *dev)
 {
 	base = dev_request_mem_region(dev, 0);
+	if (!base)
+		return -EBUSY;
 
 	return 0;
 }
diff --git a/drivers/mci/mxs.c b/drivers/mci/mxs.c
index 3657b3e..f2ceb10 100644
--- a/drivers/mci/mxs.c
+++ b/drivers/mci/mxs.c
@@ -569,6 +569,7 @@ static int mxs_mci_probe(struct device_d *hw_dev)
 	struct mxs_mci_platform_data *pd = hw_dev->platform_data;
 	struct mxs_mci_host *mxs_mci;
 	struct mci_host *host;
+	int ret;
 
 	if (hw_dev->platform_data == NULL) {
 		pr_err("Missing platform data\n");
@@ -584,6 +585,10 @@ static int mxs_mci_probe(struct device_d *hw_dev)
 	host->set_ios = mxs_mci_set_ios;
 	host->init = mxs_mci_initialize;
 	mxs_mci->regs = dev_request_mem_region(hw_dev, 0);
+	if (!mxs_mci->regs) {
+		ret = -EBUSY;
+		goto err_free;
+	}
 
 	/* feed forward the platform specific values */
 	host->voltages = pd->voltages;
@@ -635,6 +640,11 @@ static int mxs_mci_probe(struct device_d *hw_dev)
 #endif
 
 	return mci_register(host);
+
+err_free:
+	free(mxs_mci);
+
+	return ret;
 }
 
 static struct driver_d mxs_mci_driver = {
diff --git a/drivers/mci/omap_hsmmc.c b/drivers/mci/omap_hsmmc.c
index b379c31..52bd751 100644
--- a/drivers/mci/omap_hsmmc.c
+++ b/drivers/mci/omap_hsmmc.c
@@ -596,6 +596,11 @@ static int omap_mmc_probe(struct device_d *dev)
 	hsmmc->mci.hw_dev = dev;
 
 	hsmmc->iobase = dev_request_mem_region(dev, 0);
+	if (!hsmmc->iobase) {
+		ret = -EBUSY;
+		goto err_free;
+	}
+
 	hsmmc->base = hsmmc->iobase + reg_ofs;
 
 	hsmmc->mci.voltages = MMC_VDD_32_33 | MMC_VDD_33_34;
@@ -611,6 +616,11 @@ static int omap_mmc_probe(struct device_d *dev)
 	mci_register(&hsmmc->mci);
 
 	return 0;
+
+err_free:
+	free(hsmmc);
+
+	return ret;
 }
 
 static struct platform_device_id omap_mmc_ids[] = {
diff --git a/drivers/mci/s3c.c b/drivers/mci/s3c.c
index 4e7345c..2b96603 100644
--- a/drivers/mci/s3c.c
+++ b/drivers/mci/s3c.c
@@ -726,6 +726,7 @@ static int s3c_mci_probe(struct device_d *hw_dev)
 {
 	struct s3c_mci_host *s3c_host;
 	struct s3c_mci_platform_data *pd = hw_dev->platform_data;
+	int ret;
 
 	s3c_host = xzalloc(sizeof(*s3c_host));
 	s3c_host->host.send_cmd = mci_request;
@@ -743,6 +744,11 @@ static int s3c_mci_probe(struct device_d *hw_dev)
 
 	hw_dev->priv = s3c_host;
 	s3c_host->base = dev_request_mem_region(hw_dev, 0);
+	if (!s3c_host->base) {
+		ret = -EBUSY;
+		goto err_free;
+	}
+
 	s3c_host->host.hw_dev = hw_dev;
 
 	/* feed forward the platform specific values */
@@ -758,6 +764,10 @@ static int s3c_mci_probe(struct device_d *hw_dev)
 	writel(SDICON_FIFORESET | SDICON_MMCCLOCK, s3c_host->base + SDICON);
 
 	return mci_register(&s3c_host->host);
+
+err_free:
+	free(s3c_host);
+	return err;
 }
 
 static struct driver_d s3c_mci_driver = {
diff --git a/drivers/mtd/nor/cfi_flash.c b/drivers/mtd/nor/cfi_flash.c
index 0cfac2d..0396676 100644
--- a/drivers/mtd/nor/cfi_flash.c
+++ b/drivers/mtd/nor/cfi_flash.c
@@ -954,6 +954,7 @@ static void cfi_init_mtd(struct flash_info *info)
 static int cfi_probe (struct device_d *dev)
 {
 	struct flash_info *info = xzalloc(sizeof(*info));
+	int ret;
 
 	dev->priv = (void *)info;
 
@@ -961,6 +962,11 @@ static int cfi_probe (struct device_d *dev)
 	info->flash_id = FLASH_UNKNOWN;
 	info->cmd_reset = FLASH_CMD_RESET;
 	info->base = dev_request_mem_region(dev, 0);
+	if (!info->base) {
+		ret = -EBUSY;
+		goto err_free;
+	}
+
 	info->size = flash_get_size(info);
 
 	if (info->flash_id == FLASH_UNKNOWN) {
@@ -975,6 +981,12 @@ static int cfi_probe (struct device_d *dev)
 	cfi_init_mtd(info);
 
 	return 0;
+
+err_free:
+
+	free(info);
+
+	return ret;
 }
 
 static __maybe_unused struct of_device_id cfi_dt_ids[] = {
diff --git a/drivers/net/fec_imx.c b/drivers/net/fec_imx.c
index 578000a..f6cdc84 100644
--- a/drivers/net/fec_imx.c
+++ b/drivers/net/fec_imx.c
@@ -666,6 +666,10 @@ static int fec_probe(struct device_d *dev)
 	}
 
 	fec->regs = dev_request_mem_region(dev, 0);
+	if (!fec->regs) {
+		ret = -EBUSY;
+		goto err_free;
+	}
 
 	/* Reset chip. */
 	writel(FEC_ECNTRL_RESET, fec->regs + FEC_ECNTRL);
diff --git a/drivers/serial/serial_altera_jtag.c b/drivers/serial/serial_altera_jtag.c
index b83fcbd..76a9bfd 100644
--- a/drivers/serial/serial_altera_jtag.c
+++ b/drivers/serial/serial_altera_jtag.c
@@ -85,11 +85,17 @@ static int altera_serial_jtag_probe(struct device_d *dev) {
 
 	struct console_device *cdev;
 	struct altera_serial_jtag_priv *priv;
+	int ret;
 
 	priv = xzalloc(sizeof(*priv));
 	cdev = &priv->cdev;
 
 	priv->regs = dev_request_mem_region(dev, 0);
+	if (!priv->regs) {
+		ret = -EBUSY;
+		goto err_free;
+	}
+
 	cdev->dev = dev;
 	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
 	cdev->tstc = altera_serial_jtag_tstc;
@@ -100,6 +106,11 @@ static int altera_serial_jtag_probe(struct device_d *dev) {
 	console_register(cdev);
 
 	return 0;
+
+err_free:
+	free(priv);
+
+	return ret;
 }
 
 static struct driver_d altera_serial_jtag_driver = {
diff --git a/drivers/serial/serial_imx.c b/drivers/serial/serial_imx.c
index 3f219ae..5a3316d 100644
--- a/drivers/serial/serial_imx.c
+++ b/drivers/serial/serial_imx.c
@@ -329,6 +329,11 @@ static int imx_serial_probe(struct device_d *dev)
 	}
 
 	priv->regs = dev_request_mem_region(dev, 0);
+	if (!priv->regs) {
+		ret = -EBUSY;
+		goto err_free;
+	}
+
 	cdev->dev = dev;
 	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
 	cdev->tstc = imx_serial_tstc;
diff --git a/drivers/serial/serial_s3c.c b/drivers/serial/serial_s3c.c
index ed401ab..71382ef 100644
--- a/drivers/serial/serial_s3c.c
+++ b/drivers/serial/serial_s3c.c
@@ -178,10 +178,15 @@ static int s3c_serial_probe(struct device_d *dev)
 {
 	struct s3c_uart *priv;
 	struct console_device *cdev;
+	int ret;
 
 	priv = xzalloc(sizeof(struct s3c_uart));
 	cdev = &priv->cdev;
 	priv->regs = dev_request_mem_region(dev, 0);
+	if (!priv->regs) {
+		ret = -EBUSY;
+		goto err_free;
+	}
 	dev->priv = priv;
 	cdev->dev = dev;
 	cdev->f_caps = CONSOLE_STDIN | CONSOLE_STDOUT | CONSOLE_STDERR;
@@ -197,6 +202,11 @@ static int s3c_serial_probe(struct device_d *dev)
 	console_register(cdev);
 
 	return 0;
+
+err_free:
+	free(priv);
+
+	return ret;
 }
 
 static void s3c_serial_remove(struct device_d *dev)
diff --git a/drivers/serial/stm-serial.c b/drivers/serial/stm-serial.c
index 3968892..3f15bb5 100644
--- a/drivers/serial/stm-serial.c
+++ b/drivers/serial/stm-serial.c
@@ -144,6 +144,7 @@ static int stm_serial_probe(struct device_d *dev)
 {
 	struct stm_priv *priv;
 	struct console_device *cdev;
+	int ret;
 
 	priv = xzalloc(sizeof *priv);
 
@@ -159,6 +160,10 @@ static int stm_serial_probe(struct device_d *dev)
 
 	dev->priv = priv;
 	priv->base = dev_request_mem_region(dev, 0);
+	if (!priv->base) {
+		ret = -EBUSY;
+		goto err_free;
+	}
 
 	stm_serial_init_port(priv);
 	stm_serial_setbaudrate(cdev, CONFIG_BAUDRATE);
@@ -171,6 +176,11 @@ static int stm_serial_probe(struct device_d *dev)
 	clock_register_client(&priv->notify);
 
 	return 0;
+
+err_free:
+	free(priv);
+
+	return ret;
 }
 
 static void stm_serial_remove(struct device_d *dev)
diff --git a/drivers/spi/imx_spi.c b/drivers/spi/imx_spi.c
index b749337..9f88955 100644
--- a/drivers/spi/imx_spi.c
+++ b/drivers/spi/imx_spi.c
@@ -568,6 +568,10 @@ static int imx_spi_probe(struct device_d *dev)
 	imx->xchg_single = spi_imx_devtype_data[version].xchg_single;
 	imx->init = spi_imx_devtype_data[version].init;
 	imx->regs = dev_request_mem_region(dev, 0);
+	if (!imx->regs) {
+		ret = -EBUSY;
+		goto err_free;
+	}
 
 	imx->init(imx);
 
diff --git a/drivers/watchdog/imxwd.c b/drivers/watchdog/imxwd.c
index 78f0f38..3165e25 100644
--- a/drivers/watchdog/imxwd.c
+++ b/drivers/watchdog/imxwd.c
@@ -158,6 +158,11 @@ static int imx_wd_probe(struct device_d *dev)
 
 	priv = xzalloc(sizeof(struct imx_wd));
 	priv->base = dev_request_mem_region(dev, 0);
+	if (!priv->base) {
+		ret = -EBUSY;
+		goto on_error;
+	}
+
 	priv->set_timeout = fn;
 	priv->wd.set_timeout = imx_watchdog_set_timeout;
 	priv->dev = dev;
-- 
1.8.2.rc2


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

      parent reply	other threads:[~2013-03-11 21:02 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-11 21:01 [PATCH] Add dtc Sascha Hauer
2013-03-11 21:01 ` [PATCH 2/5] Makefile.lib: Add dtc support Sascha Hauer
2013-03-11 21:01 ` [PATCH 3/5] ARM: Initial dts support Sascha Hauer
2013-03-11 21:01 ` [PATCH 4/5] ARM: Add initial i.MX27 dts files Sascha Hauer
2013-03-11 21:01 ` Sascha Hauer [this message]

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=1363035716-13386-6-git-send-email-s.hauer@pengutronix.de \
    --to=s.hauer@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox