From: Rob Herring <robh@kernel.org> To: Russell King <linux@arm.linux.org.uk>, linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, arm@kernel.org, Rob Herring <robh@kernel.org>, Linus Walleij <linus.walleij@linaro.org>, Stephen Warren <swarren@wwwdotorg.org>, Lee Jones <lee@kernel.org>, Matthias Brugger <matthias.bgg@gmail.com>, Tomasz Figa <tomasz.figa@gmail.com>, Thomas Abraham <thomas.abraham@linaro.org>, Kukjin Kim <kgene@kernel.org>, Krzysztof Kozlowski <k.kozlowski@samsung.com>, linux-gpio@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-samsung-soc@vger.kernel.org Subject: [PATCH 11/15] pinctrl: kill off set_irq_flags usage Date: Tue, 9 Jun 2015 13:26:37 -0500 [thread overview] Message-ID: <1433874401-27161-12-git-send-email-robh@kernel.org> (raw) In-Reply-To: <1433874401-27161-1-git-send-email-robh@kernel.org> set_irq_flags is ARM specific with custom flags which have genirq equivalents. Convert drivers to use the genirq interfaces directly, so we can kill off set_irq_flags. The translation of flags is as follows: IRQF_VALID -> !IRQ_NOREQUEST IRQF_PROBE -> !IRQ_NOPROBE IRQF_NOAUTOEN -> IRQ_NOAUTOEN For IRQs managed by an irqdomain, the irqdomain core code handles clearing and setting IRQ_NOREQUEST already, so there is no need to do this in .map() functions and we can simply remove the set_irq_flags calls. Some users also set IRQ_NOPROBE and this has been maintained although it is not clear that is really needed. There appears to be a great deal of blind copy and paste of this code. Signed-off-by: Rob Herring <robh@kernel.org> Cc: Linus Walleij <linus.walleij@linaro.org> Cc: Stephen Warren <swarren@wwwdotorg.org> Cc: Lee Jones <lee@kernel.org> Cc: Matthias Brugger <matthias.bgg@gmail.com> Cc: Tomasz Figa <tomasz.figa@gmail.com> Cc: Thomas Abraham <thomas.abraham@linaro.org> Cc: Kukjin Kim <kgene@kernel.org> Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com> Cc: linux-gpio@vger.kernel.org Cc: linux-rpi-kernel@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-mediatek@lists.infradead.org Cc: linux-samsung-soc@vger.kernel.org --- drivers/pinctrl/bcm/pinctrl-bcm2835.c | 1 - drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 2 -- drivers/pinctrl/pinctrl-single.c | 5 ----- drivers/pinctrl/samsung/pinctrl-exynos.c | 1 - drivers/pinctrl/samsung/pinctrl-exynos5440.c | 1 - drivers/pinctrl/samsung/pinctrl-s3c24xx.c | 2 -- drivers/pinctrl/samsung/pinctrl-s3c64xx.c | 2 -- 7 files changed, 14 deletions(-) diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c index 8d908e3..de34017 100644 --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c @@ -987,7 +987,6 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev) irq_set_chip_and_handler(irq, &bcm2835_gpio_irq_chip, handle_level_irq); irq_set_chip_data(irq, pc); - set_irq_flags(irq, IRQF_VALID); } for (i = 0; i < BCM2835_NUM_BANKS; i++) { diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c index 474812e..e80cd1a 100644 --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c @@ -1239,12 +1239,10 @@ int mtk_pctrl_init(struct platform_device *pdev, irq_set_chip_and_handler(virq, &mtk_pinctrl_irq_chip, handle_level_irq); irq_set_chip_data(virq, pctl); - set_irq_flags(virq, IRQF_VALID); }; irq_set_chained_handler(irq, mtk_eint_irq_handler); irq_set_handler_data(irq, pctl); - set_irq_flags(irq, IRQF_VALID); return 0; chip_error: diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 13b45f2..6f0da84 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c @@ -1716,12 +1716,7 @@ static int pcs_irqdomain_map(struct irq_domain *d, unsigned int irq, irq_set_chip_data(irq, pcs_soc); irq_set_chip_and_handler(irq, &pcs->chip, handle_level_irq); - -#ifdef CONFIG_ARM - set_irq_flags(irq, IRQF_VALID); -#else irq_set_noprobe(irq); -#endif return 0; } diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c index 0b7afa5..9996183 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c @@ -256,7 +256,6 @@ static int exynos_eint_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_data(virq, b); irq_set_chip_and_handler(virq, &b->irq_chip->chip, handle_level_irq); - set_irq_flags(virq, IRQF_VALID); return 0; } diff --git a/drivers/pinctrl/samsung/pinctrl-exynos5440.c b/drivers/pinctrl/samsung/pinctrl-exynos5440.c index 86192be..3eb7b11 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos5440.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos5440.c @@ -929,7 +929,6 @@ static int exynos5440_gpio_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_data(virq, d); irq_set_chip_and_handler(virq, &exynos5440_gpio_irq_chip, handle_level_irq); - set_irq_flags(virq, IRQF_VALID); return 0; } diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c index f1993f42..189f15b 100644 --- a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c +++ b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c @@ -437,7 +437,6 @@ static int s3c24xx_gpf_irq_map(struct irq_domain *h, unsigned int virq, handle_edge_irq); } irq_set_chip_data(virq, bank); - set_irq_flags(virq, IRQF_VALID); return 0; } @@ -457,7 +456,6 @@ static int s3c24xx_gpg_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_and_handler(virq, &s3c24xx_eint_chip, handle_edge_irq); irq_set_chip_data(virq, bank); - set_irq_flags(virq, IRQF_VALID); return 0; } diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c index 7756c1e..1134f18 100644 --- a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c +++ b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c @@ -395,7 +395,6 @@ static int s3c64xx_gpio_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_and_handler(virq, &s3c64xx_gpio_irq_chip, handle_level_irq); irq_set_chip_data(virq, bank); - set_irq_flags(virq, IRQF_VALID); return 0; } @@ -674,7 +673,6 @@ static int s3c64xx_eint0_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_and_handler(virq, &s3c64xx_eint0_irq_chip, handle_level_irq); irq_set_chip_data(virq, ddata); - set_irq_flags(virq, IRQF_VALID); return 0; } -- 2.1.0
WARNING: multiple messages have this Message-ID (diff)
From: robh@kernel.org (Rob Herring) To: linux-arm-kernel@lists.infradead.org Subject: [PATCH 11/15] pinctrl: kill off set_irq_flags usage Date: Tue, 9 Jun 2015 13:26:37 -0500 [thread overview] Message-ID: <1433874401-27161-12-git-send-email-robh@kernel.org> (raw) In-Reply-To: <1433874401-27161-1-git-send-email-robh@kernel.org> set_irq_flags is ARM specific with custom flags which have genirq equivalents. Convert drivers to use the genirq interfaces directly, so we can kill off set_irq_flags. The translation of flags is as follows: IRQF_VALID -> !IRQ_NOREQUEST IRQF_PROBE -> !IRQ_NOPROBE IRQF_NOAUTOEN -> IRQ_NOAUTOEN For IRQs managed by an irqdomain, the irqdomain core code handles clearing and setting IRQ_NOREQUEST already, so there is no need to do this in .map() functions and we can simply remove the set_irq_flags calls. Some users also set IRQ_NOPROBE and this has been maintained although it is not clear that is really needed. There appears to be a great deal of blind copy and paste of this code. Signed-off-by: Rob Herring <robh@kernel.org> Cc: Linus Walleij <linus.walleij@linaro.org> Cc: Stephen Warren <swarren@wwwdotorg.org> Cc: Lee Jones <lee@kernel.org> Cc: Matthias Brugger <matthias.bgg@gmail.com> Cc: Tomasz Figa <tomasz.figa@gmail.com> Cc: Thomas Abraham <thomas.abraham@linaro.org> Cc: Kukjin Kim <kgene@kernel.org> Cc: Krzysztof Kozlowski <k.kozlowski@samsung.com> Cc: linux-gpio at vger.kernel.org Cc: linux-rpi-kernel at lists.infradead.org Cc: linux-arm-kernel at lists.infradead.org Cc: linux-mediatek at lists.infradead.org Cc: linux-samsung-soc at vger.kernel.org --- drivers/pinctrl/bcm/pinctrl-bcm2835.c | 1 - drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 2 -- drivers/pinctrl/pinctrl-single.c | 5 ----- drivers/pinctrl/samsung/pinctrl-exynos.c | 1 - drivers/pinctrl/samsung/pinctrl-exynos5440.c | 1 - drivers/pinctrl/samsung/pinctrl-s3c24xx.c | 2 -- drivers/pinctrl/samsung/pinctrl-s3c64xx.c | 2 -- 7 files changed, 14 deletions(-) diff --git a/drivers/pinctrl/bcm/pinctrl-bcm2835.c b/drivers/pinctrl/bcm/pinctrl-bcm2835.c index 8d908e3..de34017 100644 --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c @@ -987,7 +987,6 @@ static int bcm2835_pinctrl_probe(struct platform_device *pdev) irq_set_chip_and_handler(irq, &bcm2835_gpio_irq_chip, handle_level_irq); irq_set_chip_data(irq, pc); - set_irq_flags(irq, IRQF_VALID); } for (i = 0; i < BCM2835_NUM_BANKS; i++) { diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c index 474812e..e80cd1a 100644 --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c @@ -1239,12 +1239,10 @@ int mtk_pctrl_init(struct platform_device *pdev, irq_set_chip_and_handler(virq, &mtk_pinctrl_irq_chip, handle_level_irq); irq_set_chip_data(virq, pctl); - set_irq_flags(virq, IRQF_VALID); }; irq_set_chained_handler(irq, mtk_eint_irq_handler); irq_set_handler_data(irq, pctl); - set_irq_flags(irq, IRQF_VALID); return 0; chip_error: diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c index 13b45f2..6f0da84 100644 --- a/drivers/pinctrl/pinctrl-single.c +++ b/drivers/pinctrl/pinctrl-single.c @@ -1716,12 +1716,7 @@ static int pcs_irqdomain_map(struct irq_domain *d, unsigned int irq, irq_set_chip_data(irq, pcs_soc); irq_set_chip_and_handler(irq, &pcs->chip, handle_level_irq); - -#ifdef CONFIG_ARM - set_irq_flags(irq, IRQF_VALID); -#else irq_set_noprobe(irq); -#endif return 0; } diff --git a/drivers/pinctrl/samsung/pinctrl-exynos.c b/drivers/pinctrl/samsung/pinctrl-exynos.c index 0b7afa5..9996183 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos.c @@ -256,7 +256,6 @@ static int exynos_eint_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_data(virq, b); irq_set_chip_and_handler(virq, &b->irq_chip->chip, handle_level_irq); - set_irq_flags(virq, IRQF_VALID); return 0; } diff --git a/drivers/pinctrl/samsung/pinctrl-exynos5440.c b/drivers/pinctrl/samsung/pinctrl-exynos5440.c index 86192be..3eb7b11 100644 --- a/drivers/pinctrl/samsung/pinctrl-exynos5440.c +++ b/drivers/pinctrl/samsung/pinctrl-exynos5440.c @@ -929,7 +929,6 @@ static int exynos5440_gpio_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_data(virq, d); irq_set_chip_and_handler(virq, &exynos5440_gpio_irq_chip, handle_level_irq); - set_irq_flags(virq, IRQF_VALID); return 0; } diff --git a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c index f1993f42..189f15b 100644 --- a/drivers/pinctrl/samsung/pinctrl-s3c24xx.c +++ b/drivers/pinctrl/samsung/pinctrl-s3c24xx.c @@ -437,7 +437,6 @@ static int s3c24xx_gpf_irq_map(struct irq_domain *h, unsigned int virq, handle_edge_irq); } irq_set_chip_data(virq, bank); - set_irq_flags(virq, IRQF_VALID); return 0; } @@ -457,7 +456,6 @@ static int s3c24xx_gpg_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_and_handler(virq, &s3c24xx_eint_chip, handle_edge_irq); irq_set_chip_data(virq, bank); - set_irq_flags(virq, IRQF_VALID); return 0; } diff --git a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c index 7756c1e..1134f18 100644 --- a/drivers/pinctrl/samsung/pinctrl-s3c64xx.c +++ b/drivers/pinctrl/samsung/pinctrl-s3c64xx.c @@ -395,7 +395,6 @@ static int s3c64xx_gpio_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_and_handler(virq, &s3c64xx_gpio_irq_chip, handle_level_irq); irq_set_chip_data(virq, bank); - set_irq_flags(virq, IRQF_VALID); return 0; } @@ -674,7 +673,6 @@ static int s3c64xx_eint0_irq_map(struct irq_domain *h, unsigned int virq, irq_set_chip_and_handler(virq, &s3c64xx_eint0_irq_chip, handle_level_irq); irq_set_chip_data(virq, ddata); - set_irq_flags(virq, IRQF_VALID); return 0; } -- 2.1.0
next prev parent reply other threads:[~2015-06-09 18:27 UTC|newest] Thread overview: 112+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-06-09 18:26 [PATCH 00/15] Kill off set_irq_flags Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` [PATCH 01/15] ARM: kill off set_irq_flags usage Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-12 9:30 ` Krzysztof Kozlowski 2015-06-12 9:30 ` Krzysztof Kozlowski 2015-06-12 14:05 ` Hans Ulli Kroll 2015-06-12 14:05 ` Hans Ulli Kroll 2015-06-12 14:05 ` Hans Ulli Kroll 2015-06-12 14:35 ` Rob Herring 2015-06-12 14:35 ` Rob Herring 2015-06-12 14:35 ` Rob Herring 2015-06-12 16:23 ` Hans Ulli Kroll 2015-06-12 16:23 ` Hans Ulli Kroll 2015-06-12 16:23 ` Hans Ulli Kroll 2015-06-13 11:32 ` Wan ZongShun 2015-06-13 11:32 ` Wan ZongShun 2015-06-13 11:32 ` Wan ZongShun 2015-06-09 18:26 ` [PATCH 02/15] regmap: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 19:12 ` Mark Brown 2015-06-09 19:12 ` Mark Brown 2015-06-09 21:27 ` Russell King - ARM Linux 2015-06-09 21:27 ` Russell King - ARM Linux 2015-06-09 23:20 ` Mark Brown 2015-06-09 23:20 ` Mark Brown 2015-06-09 18:26 ` [PATCH 03/15] clk: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:44 ` Boris Brezillon 2015-06-09 18:44 ` Boris Brezillon 2015-06-09 18:52 ` Stephen Boyd 2015-06-09 18:52 ` Stephen Boyd 2015-06-09 18:26 ` [PATCH 04/15] dma: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` [PATCH 05/15] gpio: " Rob Herring 2015-06-09 18:26 ` Rob Herring [not found] ` <1433874401-27161-6-git-send-email-robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> 2015-06-10 12:43 ` Linus Walleij 2015-06-10 12:43 ` Linus Walleij 2015-06-10 12:43 ` Linus Walleij 2015-06-09 18:26 ` [PATCH 06/15] gpu/drm: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` [PATCH 07/15] irqchip: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-10 17:13 ` Rob Herring 2015-06-10 17:13 ` Rob Herring 2015-06-10 17:13 ` Rob Herring 2015-06-09 18:26 ` [PATCH 08/15] memory: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-11 12:18 ` Roger Quadros 2015-06-11 12:18 ` Roger Quadros 2015-06-11 12:18 ` Roger Quadros 2015-06-11 13:17 ` Rob Herring 2015-06-11 13:17 ` Rob Herring 2015-06-11 13:17 ` Rob Herring 2015-06-11 14:00 ` Roger Quadros 2015-06-11 14:00 ` Roger Quadros 2015-06-11 14:00 ` Roger Quadros 2015-06-09 18:26 ` [PATCH 09/15] mfd: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-10 12:43 ` Linus Walleij 2015-06-10 12:43 ` Linus Walleij 2015-06-10 12:43 ` Linus Walleij 2015-06-11 8:51 ` Lee Jones 2015-06-11 8:51 ` Lee Jones 2015-06-09 18:26 ` [PATCH 10/15] PCI: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-18 16:59 ` Bjorn Helgaas 2015-06-18 16:59 ` Bjorn Helgaas 2015-06-18 16:59 ` Bjorn Helgaas 2015-06-18 20:08 ` Rob Herring 2015-06-18 20:08 ` Rob Herring 2015-06-18 20:08 ` Rob Herring 2015-06-18 20:10 ` Bjorn Helgaas 2015-06-18 20:10 ` Bjorn Helgaas 2015-06-18 20:10 ` Bjorn Helgaas 2015-06-09 18:26 ` Rob Herring [this message] 2015-06-09 18:26 ` [PATCH 11/15] pinctrl: " Rob Herring 2015-06-10 12:42 ` Linus Walleij 2015-06-10 12:42 ` Linus Walleij 2015-06-10 12:42 ` Linus Walleij 2015-06-09 18:26 ` [PATCH 12/15] SH: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-07-07 0:53 ` Simon Horman 2015-07-07 0:53 ` Simon Horman 2015-07-07 0:53 ` Simon Horman 2015-07-07 1:55 ` Simon Horman 2015-07-07 1:55 ` Simon Horman 2015-07-07 1:55 ` Simon Horman 2015-07-07 14:38 ` Rob Herring 2015-07-07 14:38 ` Rob Herring 2015-07-07 14:38 ` Rob Herring 2015-07-08 1:04 ` Simon Horman 2015-07-08 1:04 ` Simon Horman 2015-07-08 1:04 ` Simon Horman 2015-06-09 18:26 ` [PATCH 13/15] tty/serial: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` [PATCH 14/15] ARM: remove ununsed set_irq_flags Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-09 18:26 ` [PATCH 15/15] arm64: " Rob Herring 2015-06-09 18:26 ` Rob Herring 2015-06-10 16:56 ` Catalin Marinas 2015-06-10 16:56 ` Catalin Marinas 2015-06-09 20:28 ` [PATCH 00/15] Kill off set_irq_flags Russell King - ARM Linux 2015-06-09 20:28 ` Russell King - ARM Linux 2015-06-09 21:23 ` Rob Herring 2015-06-09 21:23 ` Rob Herring 2015-06-10 23:32 ` Kevin Hilman 2015-06-10 23:32 ` Kevin Hilman
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=1433874401-27161-12-git-send-email-robh@kernel.org \ --to=robh@kernel.org \ --cc=arm@kernel.org \ --cc=k.kozlowski@samsung.com \ --cc=kgene@kernel.org \ --cc=lee@kernel.org \ --cc=linus.walleij@linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-gpio@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mediatek@lists.infradead.org \ --cc=linux-rpi-kernel@lists.infradead.org \ --cc=linux-samsung-soc@vger.kernel.org \ --cc=linux@arm.linux.org.uk \ --cc=matthias.bgg@gmail.com \ --cc=swarren@wwwdotorg.org \ --cc=thomas.abraham@linaro.org \ --cc=tomasz.figa@gmail.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: linkBe 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.