From: Andre Przywara <andre.przywara@arm.com>
To: Samuel Holland <samuel@sholland.org>
Cc: u-boot@lists.denx.de, Jagan Teki <jagan@amarulasolutions.com>,
Sean Anderson <seanga2@gmail.com>, Simon Glass <sjg@chromium.org>,
Heinrich Schuchardt <heinrich.schuchardt@canonical.com>,
Heiko Schocher <hs@denx.de>,
Joe Hershberger <joe.hershberger@ni.com>
Subject: Re: [PATCH v2 02/23] sunxi: pinctrl: Implement pin muxing functions
Date: Fri, 1 Apr 2022 00:34:23 +0100 [thread overview]
Message-ID: <20220401003423.6c64b5da@slackpad.lan> (raw)
In-Reply-To: <20220318035420.15058-3-samuel@sholland.org>
On Thu, 17 Mar 2022 22:53:59 -0500
Samuel Holland <samuel@sholland.org> wrote:
Hi Samuel,
> Implement the operations to get pin and function names, and to set the
> mux for a pin. The pin count and pin names are calculated as if each
> bank has the maximum number of pins. Function names are simply the index
> into a list of { function name, mux value } pairs.
Thank you very much for this neat and lean solution, I like that.
> We assume all pins associated with a function use the same mux value for
> that function. This is generally true within a group of pins on a single
> port, but generally false when some peripheral can be muxed to multiple
> ports. For example, A64 UART3 uses mux 3 on port D, and mux 2 on port H.
> But all of the port D pins use the same mux value, and so do all of the
> port H pins. This applies even when the pins for some function are not
> contiguous, and when the lower-numbered mux values are unused. A good
> example of both of these cases is SPI0 on most SoCs.
This is only *almost* universally true, however, but the exceptions are
not relevant for U-Boot, as it affects some multimedia functions only.
One example I could quickly find is CSI on the H6, for instance.
> This strategy saves a lot of space (which is especially important for
> SPL), but where the mux value for a certain function differs across
> ports, it forces us to choose a single port for that function at build
> time. Since almost all boards use the default (i.e. reference design)
> pin muxes[1], this is unlikely to be a problem.
Yes, I can live with that restriction. Should we come to a point where
we need non-consistent muxes across different ports, we can always add
a "port" member to struct sunxi_pinctrl_function, and encode 0 as
"don't care", so we would just need to explicitly add that to the groups
that actually differ.
Can you add at least a short summary of your commit message
(that it is a simplified mapping, and just noting the restrictions) to
the code as a comment, just before the struct sunxi_pinctrl_function
declaration? I am not sure this nice explanation will be found
easily otherwise. Or you copy the whole explanation in, I don't mind.
Cheers,
Andre
>
> [1]: See commit dda9fa734f81 ("sunxi: Simplify MMC pinmux selection")
>
> Signed-off-by: Samuel Holland <samuel@sholland.org>
> ---
>
> (no changes since v1)
>
> drivers/pinctrl/sunxi/Kconfig | 1 +
> drivers/pinctrl/sunxi/pinctrl-sunxi.c | 227 ++++++++++++++++++++++++++
> 2 files changed, 228 insertions(+)
>
> diff --git a/drivers/pinctrl/sunxi/Kconfig b/drivers/pinctrl/sunxi/Kconfig
> index 96c2f35f3a..f4949f89e0 100644
> --- a/drivers/pinctrl/sunxi/Kconfig
> +++ b/drivers/pinctrl/sunxi/Kconfig
> @@ -5,6 +5,7 @@ if ARCH_SUNXI
> config PINCTRL_SUNXI
> select PINCTRL_FULL
> select PINCTRL_GENERIC
> + select PINMUX
> bool
>
> config PINCTRL_SUNIV_F1C100S
> diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
> index 43bb1ec650..6ea8245c8e 100644
> --- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c
> +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c
> @@ -12,7 +12,14 @@
>
> extern U_BOOT_DRIVER(gpio_sunxi);
>
> +struct sunxi_pinctrl_function {
> + const char name[sizeof("gpio_out")];
> + u8 mux;
> +};
> +
> struct sunxi_pinctrl_desc {
> + const struct sunxi_pinctrl_function *functions;
> + u8 num_functions;
> u8 first_bank;
> u8 num_banks;
> };
> @@ -21,7 +28,66 @@ struct sunxi_pinctrl_plat {
> struct sunxi_gpio __iomem *base;
> };
>
> +static int sunxi_pinctrl_get_pins_count(struct udevice *dev)
> +{
> + const struct sunxi_pinctrl_desc *desc = dev_get_priv(dev);
> +
> + return desc->num_banks * SUNXI_GPIOS_PER_BANK;
> +}
> +
> +static const char *sunxi_pinctrl_get_pin_name(struct udevice *dev,
> + uint pin_selector)
> +{
> + const struct sunxi_pinctrl_desc *desc = dev_get_priv(dev);
> + static char pin_name[sizeof("PN31")];
> +
> + snprintf(pin_name, sizeof(pin_name), "P%c%d",
> + pin_selector / SUNXI_GPIOS_PER_BANK + desc->first_bank + 'A',
> + pin_selector % SUNXI_GPIOS_PER_BANK);
> +
> + return pin_name;
> +}
> +
> +static int sunxi_pinctrl_get_functions_count(struct udevice *dev)
> +{
> + const struct sunxi_pinctrl_desc *desc = dev_get_priv(dev);
> +
> + return desc->num_functions;
> +}
> +
> +static const char *sunxi_pinctrl_get_function_name(struct udevice *dev,
> + uint func_selector)
> +{
> + const struct sunxi_pinctrl_desc *desc = dev_get_priv(dev);
> +
> + return desc->functions[func_selector].name;
> +}
> +
> +static int sunxi_pinctrl_pinmux_set(struct udevice *dev, uint pin_selector,
> + uint func_selector)
> +{
> + const struct sunxi_pinctrl_desc *desc = dev_get_priv(dev);
> + struct sunxi_pinctrl_plat *plat = dev_get_plat(dev);
> + int bank = pin_selector / SUNXI_GPIOS_PER_BANK;
> + int pin = pin_selector % SUNXI_GPIOS_PER_BANK;
> +
> + debug("set mux: %-4s => %s (%d)\n",
> + sunxi_pinctrl_get_pin_name(dev, pin_selector),
> + sunxi_pinctrl_get_function_name(dev, func_selector),
> + desc->functions[func_selector].mux);
> +
> + sunxi_gpio_set_cfgbank(plat->base + bank, pin,
> + desc->functions[func_selector].mux);
> +
> + return 0;
> +}
> +
> static const struct pinctrl_ops sunxi_pinctrl_ops = {
> + .get_pins_count = sunxi_pinctrl_get_pins_count,
> + .get_pin_name = sunxi_pinctrl_get_pin_name,
> + .get_functions_count = sunxi_pinctrl_get_functions_count,
> + .get_function_name = sunxi_pinctrl_get_function_name,
> + .pinmux_set = sunxi_pinctrl_pinmux_set,
> .set_state = pinctrl_generic_set_state,
> };
>
> @@ -76,117 +142,278 @@ static int sunxi_pinctrl_probe(struct udevice *dev)
> return 0;
> }
>
> +static const struct sunxi_pinctrl_function suniv_f1c100s_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused suniv_f1c100s_pinctrl_desc = {
> + .functions = suniv_f1c100s_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(suniv_f1c100s_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 6,
> };
>
> +static const struct sunxi_pinctrl_function sun4i_a10_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun4i_a10_pinctrl_desc = {
> + .functions = sun4i_a10_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun4i_a10_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 9,
> };
>
> +static const struct sunxi_pinctrl_function sun5i_a13_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun5i_a13_pinctrl_desc = {
> + .functions = sun5i_a13_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun5i_a13_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 7,
> };
>
> +static const struct sunxi_pinctrl_function sun6i_a31_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun6i_a31_pinctrl_desc = {
> + .functions = sun6i_a31_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun6i_a31_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 8,
> };
>
> +static const struct sunxi_pinctrl_function sun6i_a31_r_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun6i_a31_r_pinctrl_desc = {
> + .functions = sun6i_a31_r_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun6i_a31_r_pinctrl_functions),
> .first_bank = SUNXI_GPIO_L,
> .num_banks = 2,
> };
>
> +static const struct sunxi_pinctrl_function sun7i_a20_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun7i_a20_pinctrl_desc = {
> + .functions = sun7i_a20_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun7i_a20_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 9,
> };
>
> +static const struct sunxi_pinctrl_function sun8i_a23_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun8i_a23_pinctrl_desc = {
> + .functions = sun8i_a23_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun8i_a23_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 8,
> };
>
> +static const struct sunxi_pinctrl_function sun8i_a23_r_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun8i_a23_r_pinctrl_desc = {
> + .functions = sun8i_a23_r_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun8i_a23_r_pinctrl_functions),
> .first_bank = SUNXI_GPIO_L,
> .num_banks = 1,
> };
>
> +static const struct sunxi_pinctrl_function sun8i_a33_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun8i_a33_pinctrl_desc = {
> + .functions = sun8i_a33_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun8i_a33_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 8,
> };
>
> +static const struct sunxi_pinctrl_function sun8i_a83t_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun8i_a83t_pinctrl_desc = {
> + .functions = sun8i_a83t_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun8i_a83t_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 8,
> };
>
> +static const struct sunxi_pinctrl_function sun8i_a83t_r_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun8i_a83t_r_pinctrl_desc = {
> + .functions = sun8i_a83t_r_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun8i_a83t_r_pinctrl_functions),
> .first_bank = SUNXI_GPIO_L,
> .num_banks = 1,
> };
>
> +static const struct sunxi_pinctrl_function sun8i_h3_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun8i_h3_pinctrl_desc = {
> + .functions = sun8i_h3_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun8i_h3_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 7,
> };
>
> +static const struct sunxi_pinctrl_function sun8i_h3_r_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun8i_h3_r_pinctrl_desc = {
> + .functions = sun8i_h3_r_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun8i_h3_r_pinctrl_functions),
> .first_bank = SUNXI_GPIO_L,
> .num_banks = 1,
> };
>
> +static const struct sunxi_pinctrl_function sun8i_v3s_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun8i_v3s_pinctrl_desc = {
> + .functions = sun8i_v3s_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun8i_v3s_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 7,
> };
>
> +static const struct sunxi_pinctrl_function sun9i_a80_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun9i_a80_pinctrl_desc = {
> + .functions = sun9i_a80_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun9i_a80_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 8,
> };
>
> +static const struct sunxi_pinctrl_function sun9i_a80_r_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun9i_a80_r_pinctrl_desc = {
> + .functions = sun9i_a80_r_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun9i_a80_r_pinctrl_functions),
> .first_bank = SUNXI_GPIO_L,
> .num_banks = 3,
> };
>
> +static const struct sunxi_pinctrl_function sun50i_a64_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun50i_a64_pinctrl_desc = {
> + .functions = sun50i_a64_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun50i_a64_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 8,
> };
>
> +static const struct sunxi_pinctrl_function sun50i_a64_r_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun50i_a64_r_pinctrl_desc = {
> + .functions = sun50i_a64_r_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun50i_a64_r_pinctrl_functions),
> .first_bank = SUNXI_GPIO_L,
> .num_banks = 1,
> };
>
> +static const struct sunxi_pinctrl_function sun50i_h5_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun50i_h5_pinctrl_desc = {
> + .functions = sun50i_h5_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun50i_h5_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 7,
> };
>
> +static const struct sunxi_pinctrl_function sun50i_h6_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun50i_h6_pinctrl_desc = {
> + .functions = sun50i_h6_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun50i_h6_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 8,
> };
>
> +static const struct sunxi_pinctrl_function sun50i_h6_r_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun50i_h6_r_pinctrl_desc = {
> + .functions = sun50i_h6_r_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun50i_h6_r_pinctrl_functions),
> .first_bank = SUNXI_GPIO_L,
> .num_banks = 2,
> };
>
> +static const struct sunxi_pinctrl_function sun50i_h616_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun50i_h616_pinctrl_desc = {
> + .functions = sun50i_h616_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun50i_h616_pinctrl_functions),
> .first_bank = SUNXI_GPIO_A,
> .num_banks = 9,
> };
>
> +static const struct sunxi_pinctrl_function sun50i_h616_r_pinctrl_functions[] = {
> + { "gpio_in", 0 },
> + { "gpio_out", 1 },
> +};
> +
> static const struct sunxi_pinctrl_desc __maybe_unused sun50i_h616_r_pinctrl_desc = {
> + .functions = sun50i_h616_r_pinctrl_functions,
> + .num_functions = ARRAY_SIZE(sun50i_h616_r_pinctrl_functions),
> .first_bank = SUNXI_GPIO_L,
> .num_banks = 1,
> };
next prev parent reply other threads:[~2022-03-31 23:44 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-18 3:53 [PATCH v2 00/23] sunxi: Add and use a pinctrl driver Samuel Holland
2022-03-18 3:53 ` [PATCH v2 01/23] sunxi: pinctrl: Create the driver skeleton Samuel Holland
2022-03-18 3:53 ` [PATCH v2 02/23] sunxi: pinctrl: Implement pin muxing functions Samuel Holland
2022-03-31 23:34 ` Andre Przywara [this message]
2022-03-18 3:54 ` [PATCH v2 03/23] sunxi: pinctrl: Implement get_pin_muxing function Samuel Holland
2022-03-31 23:36 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 04/23] sunxi: pinctrl: Implement pin configuration Samuel Holland
2022-03-18 3:54 ` [PATCH v2 05/23] pinctrl: sunxi: Add UART pinmuxes Samuel Holland
2022-03-31 23:18 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 06/23] sunxi: Skip non-DM UART pin setup when PINCTRL=y Samuel Holland
2022-03-31 23:19 ` Andre Przywara
2022-03-31 23:59 ` Samuel Holland
2022-03-18 3:54 ` [PATCH v2 07/23] pinctrl: sunxi: Add sun4i EMAC pinmuxes Samuel Holland
2022-03-31 23:19 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 08/23] net: sunxi_emac: Remove non-DM pin setup Samuel Holland
2022-03-31 23:19 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 09/23] pinctrl: sunxi: Add sunxi GMAC pinmuxes Samuel Holland
2022-03-31 23:19 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 10/23] sunxi: Remove non-DM GMAC pin setup Samuel Holland
2022-03-31 23:20 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 11/23] pinctrl: sunxi: Add sun8i EMAC pinmuxes Samuel Holland
2022-03-31 23:20 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 12/23] net: sun8i_emac: Remove non-DM pin setup Samuel Holland
2022-03-31 23:20 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 13/23] pinctrl: sunxi: Add I2C pinmuxes Samuel Holland
2022-03-27 17:22 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 14/23] sunxi: Remove options and setup code for I2C2-I2C4 Samuel Holland
2022-03-18 3:54 ` [PATCH v2 15/23] sunxi: Remove non-DM I2C clock/pin setup from U-Boot Samuel Holland
2022-03-31 23:20 ` Andre Przywara
2022-04-01 0:04 ` Samuel Holland
2022-03-18 3:54 ` [PATCH v2 16/23] i2c: sun6i_p2wi: Only do non-DM pin setup for non-DM I2C Samuel Holland
2022-03-31 23:20 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 17/23] i2c: sun8i_rsb: " Samuel Holland
2022-03-20 7:17 ` Heinrich Schuchardt
2022-03-20 7:22 ` Heinrich Schuchardt
2022-03-31 23:20 ` Andre Przywara
2022-04-01 0:10 ` Samuel Holland
2022-03-18 3:54 ` [PATCH v2 18/23] pinctrl: sunxi: Add MMC pinmuxes Samuel Holland
2022-03-31 23:20 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 19/23] sunxi: Remove non-DM MMC pin setup Samuel Holland
2022-03-31 23:21 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 20/23] pinctrl: sunxi: Add the A64 PWM pinmux Samuel Holland
2022-03-31 23:21 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 21/23] pwm: sunxi: Remove non-DM pin setup Samuel Holland
2022-03-31 23:21 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 22/23] pinctrl: sunxi: Add SPI0 pinmuxes Samuel Holland
2022-03-31 23:21 ` Andre Przywara
2022-03-18 3:54 ` [PATCH v2 23/23] spi: sun4i_spi: Remove non-DM pin setup Samuel Holland
2022-03-31 23:21 ` Andre Przywara
2022-04-04 0:54 ` [PATCH v2 00/23] sunxi: Add and use a pinctrl driver Andre Przywara
2022-04-04 1:24 ` Samuel Holland
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=20220401003423.6c64b5da@slackpad.lan \
--to=andre.przywara@arm.com \
--cc=heinrich.schuchardt@canonical.com \
--cc=hs@denx.de \
--cc=jagan@amarulasolutions.com \
--cc=joe.hershberger@ni.com \
--cc=samuel@sholland.org \
--cc=seanga2@gmail.com \
--cc=sjg@chromium.org \
--cc=u-boot@lists.denx.de \
/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.