From: Arnd Bergmann <arnd@arndb.de> To: Tony Lindgren <tony@atomide.com>, Aaro Koskinen <aaro.koskinen@iki.fi>, Alan Stern <stern@rowland.harvard.edu>, Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Linus Walleij <linus.walleij@linaro.org>, Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>, Tomi Valkeinen <tomi.valkeinen@ti.com>, Arnd Bergmann <arnd@arndb.de>, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH 04/22] ARM: omap1: move ohci phy power handling to board files Date: Thu, 8 Aug 2019 23:22:13 +0200 [thread overview] Message-ID: <20190808212234.2213262-5-arnd@arndb.de> (raw) In-Reply-To: <20190808212234.2213262-1-arnd@arndb.de> Two boards require a a special handler to control their transceiver power. Move the corresponding code into the board files and out of the common code. The osk board already has a dependency on TPS65010, this adds another one, with the same hack to get it to compile with CONFIG_TPS65010=m. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- arch/arm/mach-omap1/board-innovator.c | 19 +++++++++++++++++ arch/arm/mach-omap1/board-osk.c | 19 +++++++++++++++++ drivers/usb/host/ohci-omap.c | 28 ++----------------------- include/linux/platform_data/usb-omap1.h | 2 ++ 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 2425f1bacb33..653af63320a8 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -290,6 +290,23 @@ static void __init innovator_init_smc91x(void) } #ifdef CONFIG_ARCH_OMAP15XX +/* + * Board specific gang-switched transceiver power on/off. + */ +static int innovator_omap_ohci_transceiver_power(int on) +{ + if (on) + __raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL) + | ((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), + INNOVATOR_FPGA_CAM_USB_CONTROL); + else + __raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL) + & ~((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), + INNOVATOR_FPGA_CAM_USB_CONTROL); + + return 0; +} + static struct omap_usb_config innovator1510_usb_config __initdata = { /* for bundled non-standard host and peripheral cables */ .hmc_mode = 4, @@ -300,6 +317,8 @@ static struct omap_usb_config innovator1510_usb_config __initdata = { .register_dev = 1, .pins[0] = 2, + + .transceiver_power = innovator_omap_ohci_transceiver_power, }; static const struct omap_lcd_config innovator1510_lcd_config __initconst = { diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 4df15e693b6e..3be7b3b580d3 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c @@ -278,6 +278,23 @@ static void __init osk_init_cf(void) irq_set_irq_type(gpio_to_irq(62), IRQ_TYPE_EDGE_FALLING); } +/* + * Board specific gang-switched transceiver power on/off. + * NOTE: OSK supplies power from DC, not battery. + */ +static int osk_omap_ohci_transceiver_power(int on) +{ + if (!IS_BUILTIN(CONFIG_TPS65010)) + return -ENXIO; + + if (on) + tps65010_set_gpio_out_value(GPIO1, LOW); + else + tps65010_set_gpio_out_value(GPIO1, HIGH); + + return 0; +} + static struct omap_usb_config osk_usb_config __initdata = { /* has usb host connector (A) ... for development it can also * be used, with a NONSTANDARD gender-bending cable/dongle, as @@ -292,6 +309,8 @@ static struct omap_usb_config osk_usb_config __initdata = { .rwc = 1, #endif .pins[0] = 2, + + .transceiver_power = osk_omap_ohci_transceiver_power, }; #ifdef CONFIG_OMAP_OSK_MISTRAL diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index f7efe65f01c5..e92ef3231f2c 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c @@ -77,31 +77,6 @@ static void omap_ohci_clock_power(int on) } } -/* - * Board specific gang-switched transceiver power on/off. - * NOTE: OSK supplies power from DC, not battery. - */ -static int omap_ohci_transceiver_power(int on) -{ - if (on) { - if (machine_is_omap_innovator() && cpu_is_omap1510()) - __raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL) - | ((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), - INNOVATOR_FPGA_CAM_USB_CONTROL); - else if (machine_is_omap_osk()) - tps65010_set_gpio_out_value(GPIO1, LOW); - } else { - if (machine_is_omap_innovator() && cpu_is_omap1510()) - __raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL) - & ~((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), - INNOVATOR_FPGA_CAM_USB_CONTROL); - else if (machine_is_omap_osk()) - tps65010_set_gpio_out_value(GPIO1, HIGH); - } - - return 0; -} - #ifdef CONFIG_USB_OTG static void start_hnp(struct ohci_hcd *ohci) @@ -213,7 +188,8 @@ static int ohci_omap_reset(struct usb_hcd *hcd) } /* FIXME hub_wq hub requests should manage power switching */ - omap_ohci_transceiver_power(1); + if (config->transceiver_power) + config->transceiver_power(1); /* board init will have already handled HMC and mux setup. * any external transceiver should already be initialized diff --git a/include/linux/platform_data/usb-omap1.h b/include/linux/platform_data/usb-omap1.h index 878e572a78bf..e7b8dc92a269 100644 --- a/include/linux/platform_data/usb-omap1.h +++ b/include/linux/platform_data/usb-omap1.h @@ -50,6 +50,8 @@ struct omap_usb_config { int (*ocpi_enable)(void); void (*lb_reset)(void); + + int (*transceiver_power)(int on); }; #endif /* __LINUX_USB_OMAP1_H */ -- 2.20.0
WARNING: multiple messages have this Message-ID (diff)
From: Arnd Bergmann <arnd@arndb.de> To: Tony Lindgren <tony@atomide.com>, Aaro Koskinen <aaro.koskinen@iki.fi>, Alan Stern <stern@rowland.harvard.edu>, Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Arnd Bergmann <arnd@arndb.de>, Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>, Linus Walleij <linus.walleij@linaro.org>, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, Tomi Valkeinen <tomi.valkeinen@ti.com>, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 04/22] ARM: omap1: move ohci phy power handling to board files Date: Thu, 8 Aug 2019 23:22:13 +0200 [thread overview] Message-ID: <20190808212234.2213262-5-arnd@arndb.de> (raw) In-Reply-To: <20190808212234.2213262-1-arnd@arndb.de> Two boards require a a special handler to control their transceiver power. Move the corresponding code into the board files and out of the common code. The osk board already has a dependency on TPS65010, this adds another one, with the same hack to get it to compile with CONFIG_TPS65010=m. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- arch/arm/mach-omap1/board-innovator.c | 19 +++++++++++++++++ arch/arm/mach-omap1/board-osk.c | 19 +++++++++++++++++ drivers/usb/host/ohci-omap.c | 28 ++----------------------- include/linux/platform_data/usb-omap1.h | 2 ++ 4 files changed, 42 insertions(+), 26 deletions(-) diff --git a/arch/arm/mach-omap1/board-innovator.c b/arch/arm/mach-omap1/board-innovator.c index 2425f1bacb33..653af63320a8 100644 --- a/arch/arm/mach-omap1/board-innovator.c +++ b/arch/arm/mach-omap1/board-innovator.c @@ -290,6 +290,23 @@ static void __init innovator_init_smc91x(void) } #ifdef CONFIG_ARCH_OMAP15XX +/* + * Board specific gang-switched transceiver power on/off. + */ +static int innovator_omap_ohci_transceiver_power(int on) +{ + if (on) + __raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL) + | ((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), + INNOVATOR_FPGA_CAM_USB_CONTROL); + else + __raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL) + & ~((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), + INNOVATOR_FPGA_CAM_USB_CONTROL); + + return 0; +} + static struct omap_usb_config innovator1510_usb_config __initdata = { /* for bundled non-standard host and peripheral cables */ .hmc_mode = 4, @@ -300,6 +317,8 @@ static struct omap_usb_config innovator1510_usb_config __initdata = { .register_dev = 1, .pins[0] = 2, + + .transceiver_power = innovator_omap_ohci_transceiver_power, }; static const struct omap_lcd_config innovator1510_lcd_config __initconst = { diff --git a/arch/arm/mach-omap1/board-osk.c b/arch/arm/mach-omap1/board-osk.c index 4df15e693b6e..3be7b3b580d3 100644 --- a/arch/arm/mach-omap1/board-osk.c +++ b/arch/arm/mach-omap1/board-osk.c @@ -278,6 +278,23 @@ static void __init osk_init_cf(void) irq_set_irq_type(gpio_to_irq(62), IRQ_TYPE_EDGE_FALLING); } +/* + * Board specific gang-switched transceiver power on/off. + * NOTE: OSK supplies power from DC, not battery. + */ +static int osk_omap_ohci_transceiver_power(int on) +{ + if (!IS_BUILTIN(CONFIG_TPS65010)) + return -ENXIO; + + if (on) + tps65010_set_gpio_out_value(GPIO1, LOW); + else + tps65010_set_gpio_out_value(GPIO1, HIGH); + + return 0; +} + static struct omap_usb_config osk_usb_config __initdata = { /* has usb host connector (A) ... for development it can also * be used, with a NONSTANDARD gender-bending cable/dongle, as @@ -292,6 +309,8 @@ static struct omap_usb_config osk_usb_config __initdata = { .rwc = 1, #endif .pins[0] = 2, + + .transceiver_power = osk_omap_ohci_transceiver_power, }; #ifdef CONFIG_OMAP_OSK_MISTRAL diff --git a/drivers/usb/host/ohci-omap.c b/drivers/usb/host/ohci-omap.c index f7efe65f01c5..e92ef3231f2c 100644 --- a/drivers/usb/host/ohci-omap.c +++ b/drivers/usb/host/ohci-omap.c @@ -77,31 +77,6 @@ static void omap_ohci_clock_power(int on) } } -/* - * Board specific gang-switched transceiver power on/off. - * NOTE: OSK supplies power from DC, not battery. - */ -static int omap_ohci_transceiver_power(int on) -{ - if (on) { - if (machine_is_omap_innovator() && cpu_is_omap1510()) - __raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL) - | ((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), - INNOVATOR_FPGA_CAM_USB_CONTROL); - else if (machine_is_omap_osk()) - tps65010_set_gpio_out_value(GPIO1, LOW); - } else { - if (machine_is_omap_innovator() && cpu_is_omap1510()) - __raw_writeb(__raw_readb(INNOVATOR_FPGA_CAM_USB_CONTROL) - & ~((1 << 5/*usb1*/) | (1 << 3/*usb2*/)), - INNOVATOR_FPGA_CAM_USB_CONTROL); - else if (machine_is_omap_osk()) - tps65010_set_gpio_out_value(GPIO1, HIGH); - } - - return 0; -} - #ifdef CONFIG_USB_OTG static void start_hnp(struct ohci_hcd *ohci) @@ -213,7 +188,8 @@ static int ohci_omap_reset(struct usb_hcd *hcd) } /* FIXME hub_wq hub requests should manage power switching */ - omap_ohci_transceiver_power(1); + if (config->transceiver_power) + config->transceiver_power(1); /* board init will have already handled HMC and mux setup. * any external transceiver should already be initialized diff --git a/include/linux/platform_data/usb-omap1.h b/include/linux/platform_data/usb-omap1.h index 878e572a78bf..e7b8dc92a269 100644 --- a/include/linux/platform_data/usb-omap1.h +++ b/include/linux/platform_data/usb-omap1.h @@ -50,6 +50,8 @@ struct omap_usb_config { int (*ocpi_enable)(void); void (*lb_reset)(void); + + int (*transceiver_power)(int on); }; #endif /* __LINUX_USB_OMAP1_H */ -- 2.20.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-08-08 21:26 UTC|newest] Thread overview: 138+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-08-08 21:22 [PATCH 00/22] ARM: omap1 multiplatform support Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` [PATCH 01/22] ARM: omap1: innovator: pass lcd control address as pdata Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-09 11:29 ` Bartlomiej Zolnierkiewicz 2019-08-09 11:29 ` Bartlomiej Zolnierkiewicz 2019-08-09 11:29 ` Bartlomiej Zolnierkiewicz 2019-08-08 21:22 ` [PATCH 02/22] ARM: omap1: make omapfb standalone compilable Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-09 11:32 ` Bartlomiej Zolnierkiewicz 2019-08-09 11:32 ` Bartlomiej Zolnierkiewicz 2019-08-09 11:43 ` Arnd Bergmann 2019-08-09 11:43 ` Arnd Bergmann 2019-08-09 14:36 ` Bartlomiej Zolnierkiewicz 2019-08-09 14:36 ` Bartlomiej Zolnierkiewicz 2019-08-09 19:55 ` Arnd Bergmann 2019-08-09 19:55 ` Arnd Bergmann 2019-08-12 9:21 ` Bartlomiej Zolnierkiewicz 2019-08-12 9:21 ` Bartlomiej Zolnierkiewicz 2019-08-08 21:22 ` [PATCH 03/22] ARM: omap1: move omap15xx local bus handling to usb.c Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-09 5:32 ` Felipe Balbi 2019-08-09 5:32 ` Felipe Balbi 2019-08-09 5:32 ` Felipe Balbi 2019-08-10 10:28 ` Christoph Hellwig 2019-08-10 10:28 ` Christoph Hellwig 2019-08-10 10:28 ` Christoph Hellwig 2019-08-08 21:22 ` Arnd Bergmann [this message] 2019-08-08 21:22 ` [PATCH 04/22] ARM: omap1: move ohci phy power handling to board files Arnd Bergmann 2019-08-08 21:22 ` [PATCH 05/22] ARM: omap1: move mach/usb.h to include/linux/soc Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` [PATCH 06/22] ARM: omap1: move some headers " Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` [PATCH 07/22] ARM: omap1: move perseus spi pinconf to board file Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 22:24 ` Mark Brown 2019-08-08 22:24 ` Mark Brown 2019-08-09 11:29 ` Arnd Bergmann 2019-08-09 11:29 ` Arnd Bergmann 2019-08-09 12:01 ` Mark Brown 2019-08-09 12:01 ` Mark Brown 2019-08-08 21:22 ` [PATCH 08/22] ARM: omap1: move CF chipselect setup " Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` [PATCH 09/22] fbdev: omap: avoid using mach/*.h files Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-09 11:34 ` Bartlomiej Zolnierkiewicz 2019-08-09 11:34 ` Bartlomiej Zolnierkiewicz 2019-08-09 11:34 ` Bartlomiej Zolnierkiewicz 2019-08-08 21:22 ` [PATCH 10/22] usb: omap: avoid mach/*.h headers Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-09 5:38 ` Greg Kroah-Hartman 2019-08-09 5:38 ` Greg Kroah-Hartman 2019-08-08 21:22 ` [PATCH 11/22] clocksource: ti-dmtimer: avoid using mach/hardware.h Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-09 7:01 ` Daniel Lezcano 2019-08-09 7:01 ` Daniel Lezcano 2019-08-09 7:33 ` Arnd Bergmann 2019-08-09 7:33 ` Arnd Bergmann 2019-08-09 7:57 ` Daniel Lezcano 2019-08-09 7:57 ` Daniel Lezcano 2019-08-08 21:22 ` [PATCH 12/22] serial: 8250/omap1: include linux/soc/ti/omap1-soc.h Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:22 ` [PATCH 13/22] input: omap: void using mach/*.h headers Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-08 21:42 ` Dmitry Torokhov 2019-08-08 21:42 ` Dmitry Torokhov 2019-08-08 21:46 ` Arnd Bergmann 2019-08-08 21:46 ` Arnd Bergmann 2019-08-08 21:46 ` Arnd Bergmann 2019-08-08 22:19 ` Dmitry Torokhov 2019-08-08 22:19 ` Dmitry Torokhov 2019-08-08 23:39 ` Sebastian Reichel 2019-08-08 23:39 ` Sebastian Reichel 2019-08-09 11:23 ` Arnd Bergmann 2019-08-09 11:23 ` Arnd Bergmann 2019-08-08 21:22 ` [PATCH 14/22] ARM: omap1: use pci_ioremap_io() for omap_cf Arnd Bergmann 2019-08-08 21:22 ` Arnd Bergmann 2019-08-13 10:36 ` Tony Lindgren 2019-08-13 10:36 ` Tony Lindgren 2019-08-13 11:02 ` Arnd Bergmann 2019-08-13 11:02 ` Arnd Bergmann 2019-08-13 18:11 ` Aaro Koskinen 2019-08-13 18:11 ` Aaro Koskinen 2019-08-13 18:11 ` Aaro Koskinen 2019-08-13 19:33 ` Arnd Bergmann 2019-08-13 19:33 ` Arnd Bergmann 2019-08-14 7:49 ` Tony Lindgren 2019-08-14 7:49 ` Tony Lindgren 2019-08-14 10:36 ` Arnd Bergmann 2019-08-14 10:36 ` Arnd Bergmann 2019-08-14 13:40 ` Tony Lindgren 2019-08-14 13:40 ` Tony Lindgren 2019-08-16 8:34 ` Aaro Koskinen 2019-08-16 8:34 ` Aaro Koskinen 2019-08-27 16:33 ` Arnd Bergmann 2019-08-27 16:33 ` Arnd Bergmann 2019-08-27 19:04 ` Aaro Koskinen 2019-08-27 19:04 ` Aaro Koskinen 2019-08-28 13:02 ` Arnd Bergmann 2019-08-28 13:02 ` Arnd Bergmann 2019-08-28 18:23 ` Aaro Koskinen 2019-08-28 18:23 ` Aaro Koskinen 2019-08-28 18:45 ` Tony Lindgren 2019-08-28 18:45 ` Tony Lindgren 2019-08-08 21:41 ` [PATCH 15/22] ARM: omap1: move mach/*.h into mach directory Arnd Bergmann 2019-08-08 21:41 ` Arnd Bergmann 2019-08-08 21:41 ` Arnd Bergmann 2019-08-08 21:41 ` [PATCH 16/22] ARM: omap1: move clk support into a single file Arnd Bergmann 2019-08-08 21:41 ` Arnd Bergmann 2019-08-08 21:41 ` Arnd Bergmann 2019-08-08 21:41 ` [PATCH 17/22] ARM: omap1: remove some dead clock code Arnd Bergmann 2019-08-08 21:41 ` Arnd Bergmann 2019-08-08 21:41 ` [PATCH 18/22] ARM: omap1: clk: rework 'struct clk' Arnd Bergmann 2019-08-08 21:41 ` Arnd Bergmann 2019-08-08 21:41 ` [PATCH 19/22] ARM: omap1: clk: use common_clk-like callbacks Arnd Bergmann 2019-08-08 21:41 ` Arnd Bergmann 2019-08-08 21:43 ` [PATCH 20/22] ARM: omap1: clk: use clk_init_data Arnd Bergmann 2019-08-08 21:43 ` Arnd Bergmann 2019-08-08 21:43 ` [PATCH 21/22] ARM: omap1: use common clk framework Arnd Bergmann 2019-08-08 21:43 ` Arnd Bergmann 2019-08-14 21:10 ` Aaro Koskinen 2019-08-14 21:10 ` Aaro Koskinen 2019-08-15 7:10 ` Arnd Bergmann 2019-08-15 7:10 ` Arnd Bergmann 2019-08-08 21:47 ` [PATCH 22/22] ARM: omap1: enable multiplatform Arnd Bergmann 2019-08-08 21:47 ` Arnd Bergmann 2019-08-08 21:47 ` Arnd Bergmann
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=20190808212234.2213262-5-arnd@arndb.de \ --to=arnd@arndb.de \ --cc=aaro.koskinen@iki.fi \ --cc=b.zolnierkie@samsung.com \ --cc=gregkh@linuxfoundation.org \ --cc=linus.walleij@linaro.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-omap@vger.kernel.org \ --cc=linux-usb@vger.kernel.org \ --cc=stern@rowland.harvard.edu \ --cc=tomi.valkeinen@ti.com \ --cc=tony@atomide.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.