All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Heiko Stübner" <heiko@sntech.de>
To: linux-kernel@vger.kernel.org,
	Detlev Casanova <detlev.casanova@collabora.com>
Cc: "David S . Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Alexandre Torgue <alexandre.torgue@foss.st.com>,
	Jose Abreu <joabreu@synopsys.com>,
	Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	David Wu <david.wu@rock-chips.com>,
	Giuseppe Cavallaro <peppe.cavallaro@st.com>,
	netdev@vger.kernel.org, devicetree@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-rockchip@lists.infradead.org,
	linux-stm32@st-md-mailman.stormreply.com, kernel@collabora.com
Subject: Re: [PATCH v2 2/2] ethernet: stmmac: dwmac-rk: Add GMAC support for RK3576
Date: Thu, 15 Aug 2024 18:37:35 +0200	[thread overview]
Message-ID: <10024041.2OtUDhi4od@diego> (raw)
In-Reply-To: <3304458.aeNJFYEL58@trenzalore>

Am Freitag, 9. August 2024, 16:38:23 CEST schrieb Detlev Casanova:
> On Friday, 9 August 2024 09:16:44 EDT Heiko Stübner wrote:
> > Hi Detlev,
> > 
> > Am Donnerstag, 8. August 2024, 19:00:18 CEST schrieb Detlev Casanova:
> > > From: David Wu <david.wu@rock-chips.com>
> > > 
> > > Add constants and callback functions for the dwmac on RK3576 soc.
> > > 
> > > Signed-off-by: David Wu <david.wu@rock-chips.com>
> > > [rebase, extracted bindings]
> > > Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
> > > ---
> > > 
> > >  .../net/ethernet/stmicro/stmmac/dwmac-rk.c    | 156 ++++++++++++++++++
> > >  1 file changed, 156 insertions(+)
> > > 
> > > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> > > b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index
> > > 7ae04d8d291c8..e1fa8fc9f4012 100644
> > > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> > > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> > > @@ -1116,6 +1116,161 @@ static const struct rk_gmac_ops rk3568_ops = {
> > > 
> > >  	},
> > >  
> > >  };
> > > 
> 
> [...]
> 
> > > +/* SDGMAC_GRF */
> > > +#define RK3576_GRF_GMAC_CON0			0X0020
> > > +#define RK3576_GRF_GMAC_CON1			0X0024
> > > +
> > > +#define RK3576_GMAC_RMII_MODE			GRF_BIT(3)
> > > +#define RK3576_GMAC_RGMII_MODE			GRF_CLR_BIT(3)
> > > +
> > > +#define RK3576_GMAC_CLK_SELET_IO		GRF_BIT(7)
> > > +#define RK3576_GMAC_CLK_SELET_CRU		GRF_CLR_BIT(7)
> > 
> > nit: typos _CLK_SELECT_ ... missing the C in select
> 
> Ack

So all points below are resolved, and with the C added
Reviewed-by: Heiko Stuebner <heiko@sntech.de>

> 
> > > +
> > > +#define RK3576_GMAC_CLK_RMII_DIV2		GRF_BIT(5)
> > > +#define RK3576_GMAC_CLK_RMII_DIV20		GRF_CLR_BIT(5)
> > 
> > I think those are backwards
> > The TRM says bit[5]=0: 25MHz (DIV2) and bit[5]=1: 2.5MHz (DIV20)
> > 
> > I guess nobody also on Rockchip's side tested a RMII phy on those controllrs
> 
> Can't be sure about that. An error in the TRM is not impossible either, as for 
> rk3588, it is also bit[5]=0: DIV20 and bit[5]=1: DIV2. I can switch them to 
> match the TRM though, we may never now.

As David said, the TRM is wrong and the code is correct, so all good


> 
> > > +
> > > +#define RK3576_GMAC_CLK_RGMII_DIV1		\
> > > +			(GRF_CLR_BIT(6) | GRF_CLR_BIT(5))
> > > +#define RK3576_GMAC_CLK_RGMII_DIV5		\
> > > +			(GRF_BIT(6) | GRF_BIT(5))
> > > +#define RK3576_GMAC_CLK_RGMII_DIV50		\
> > > +			(GRF_BIT(6) | GRF_CLR_BIT(5))
> > > +
> > 
> > in contrast, these are correct and match the TRM
> > 
> > > +#define RK3576_GMAC_CLK_RMII_GATE		GRF_BIT(4)
> > > +#define RK3576_GMAC_CLK_RMII_NOGATE		GRF_CLR_BIT(4)
> > > +
> > > +static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
> > > +				int tx_delay, int rx_delay)
> > > +{
> > > +	struct device *dev = &bsp_priv->pdev->dev;
> > > +	unsigned int offset_con;
> > > +
> > > +	if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
> > > +		dev_err(dev, "Missing rockchip,grf or rockchip,php_grf 
> property\n");
> > > +		return;
> > > +	}
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> > > +					 RK3576_GRF_GMAC_CON0;
> > > +
> > > +	regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RGMII_MODE);
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_VCCIO0_1_3_IOC_CON4 :
> > > +					 
> RK3576_VCCIO0_1_3_IOC_CON2;
> > > +
> > > +	/* m0 && m1 delay enabled */
> > > +	regmap_write(bsp_priv->php_grf, offset_con,
> > > +		     DELAY_ENABLE(RK3576, tx_delay, rx_delay));
> > > +	regmap_write(bsp_priv->php_grf, offset_con + 0x4,
> > > +		     DELAY_ENABLE(RK3576, tx_delay, rx_delay));
> > > +
> > > +	/* m0 && m1 delay value */
> > > +	regmap_write(bsp_priv->php_grf, offset_con,
> > > +		     RK3576_GMAC_CLK_TX_DL_CFG(tx_delay) |
> > > +		     RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
> > > +	regmap_write(bsp_priv->php_grf, offset_con + 0x4,
> > > +		     RK3576_GMAC_CLK_TX_DL_CFG(tx_delay) |
> > > +		     RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
> > > +}
> > > +
> > > +static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
> > > +{
> > > +	struct device *dev = &bsp_priv->pdev->dev;
> > > +	unsigned int offset_con;
> > > +
> > > +	if (IS_ERR(bsp_priv->php_grf)) {
> > > +		dev_err(dev, "%s: Missing rockchip,php_grf property\n", 
> __func__);
> > > +		return;
> > > +	}
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> > > +					 RK3576_GRF_GMAC_CON0;
> > > +
> > > +	regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RMII_MODE);
> > > +}
> > > +
> > > +static void rk3576_set_gmac_speed(struct rk_priv_data *bsp_priv, int
> > > speed) +{
> > > +	struct device *dev = &bsp_priv->pdev->dev;
> > > +	unsigned int val = 0, offset_con;
> > > +
> > > +	switch (speed) {
> > > +	case 10:
> > > +		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
> > > +			val = RK3576_GMAC_CLK_RMII_DIV20;
> > > +		else
> > > +			val = RK3576_GMAC_CLK_RGMII_DIV50;
> > 
> > 		val = bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII ?
> > 				RK3576_GMAC_CLK_RMII_DIV20 :
> > 				RK3576_GMAC_CLK_RGMII_DIV50;
> > perhaps?
> 
> This way matches how it is written in rk3588_set_gmac_speed(). I find that 
> having similar code for similar functions helps reading and understanding it 
> better (although I agree that your suggestion looks better).
> 
> I'd rather keep it like it is for now if that's ok.

ok, there is not much difference between the two variants anyway.


> > > +		break;
> > > +	case 100:
> > > +		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
> > > +			val = RK3576_GMAC_CLK_RMII_DIV2;
> > > +		else
> > > +			val = RK3576_GMAC_CLK_RGMII_DIV5;
> > 
> > same as above?
> > 
> > > +		break;
> > > +	case 1000:
> > > +		if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII)
> > > +			val = RK3576_GMAC_CLK_RGMII_DIV1;
> > > +		else
> > > +			goto err;
> > 
> > 		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
> > 			goto err;
> > 
> > 		val = RK3576_GMAC_CLK_RGMII_DIV1;
> > 
> > > +		break;
> > > +	default:
> > > +		goto err;
> > > +	}
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> > > +					 RK3576_GRF_GMAC_CON0;
> > > +
> > > +	regmap_write(bsp_priv->grf, offset_con, val);
> > > +
> > > +	return;
> > > +err:
> > > +	dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
> > > +}
> > > +
> > > +static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv,
> > > bool input, +				       bool enable)
> > > +{
> > > +	unsigned int val = input ? RK3576_GMAC_CLK_SELET_IO :
> > > +				   RK3576_GMAC_CLK_SELET_CRU;
> > > +	unsigned int offset_con;
> > > +
> > > +	val |= enable ? RK3576_GMAC_CLK_RMII_NOGATE :
> > > +			RK3576_GMAC_CLK_RMII_GATE;
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> > > +					 RK3576_GRF_GMAC_CON0;
> > 
> > nit: alignment of both looks like it could be nicer
> 
> That's strange, the alignments looks good in vim and git diff. It also looks 
> nice on the archive: https://lore.kernel.org/linux-rockchip/
> 20240808170113.82775-3-detlev.casanova@collabora.com/

ok, probably just some display artifact here :-)




_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

WARNING: multiple messages have this Message-ID (diff)
From: "Heiko Stübner" <heiko@sntech.de>
To: linux-kernel@vger.kernel.org,
	Detlev Casanova <detlev.casanova@collabora.com>
Cc: "David S . Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Rob Herring <robh@kernel.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Alexandre Torgue <alexandre.torgue@foss.st.com>,
	Jose Abreu <joabreu@synopsys.com>,
	Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	David Wu <david.wu@rock-chips.com>,
	Giuseppe Cavallaro <peppe.cavallaro@st.com>,
	netdev@vger.kernel.org, devicetree@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-rockchip@lists.infradead.org,
	linux-stm32@st-md-mailman.stormreply.com, kernel@collabora.com
Subject: Re: [PATCH v2 2/2] ethernet: stmmac: dwmac-rk: Add GMAC support for RK3576
Date: Thu, 15 Aug 2024 18:37:35 +0200	[thread overview]
Message-ID: <10024041.2OtUDhi4od@diego> (raw)
In-Reply-To: <3304458.aeNJFYEL58@trenzalore>

Am Freitag, 9. August 2024, 16:38:23 CEST schrieb Detlev Casanova:
> On Friday, 9 August 2024 09:16:44 EDT Heiko Stübner wrote:
> > Hi Detlev,
> > 
> > Am Donnerstag, 8. August 2024, 19:00:18 CEST schrieb Detlev Casanova:
> > > From: David Wu <david.wu@rock-chips.com>
> > > 
> > > Add constants and callback functions for the dwmac on RK3576 soc.
> > > 
> > > Signed-off-by: David Wu <david.wu@rock-chips.com>
> > > [rebase, extracted bindings]
> > > Signed-off-by: Detlev Casanova <detlev.casanova@collabora.com>
> > > ---
> > > 
> > >  .../net/ethernet/stmicro/stmmac/dwmac-rk.c    | 156 ++++++++++++++++++
> > >  1 file changed, 156 insertions(+)
> > > 
> > > diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> > > b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index
> > > 7ae04d8d291c8..e1fa8fc9f4012 100644
> > > --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> > > +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
> > > @@ -1116,6 +1116,161 @@ static const struct rk_gmac_ops rk3568_ops = {
> > > 
> > >  	},
> > >  
> > >  };
> > > 
> 
> [...]
> 
> > > +/* SDGMAC_GRF */
> > > +#define RK3576_GRF_GMAC_CON0			0X0020
> > > +#define RK3576_GRF_GMAC_CON1			0X0024
> > > +
> > > +#define RK3576_GMAC_RMII_MODE			GRF_BIT(3)
> > > +#define RK3576_GMAC_RGMII_MODE			GRF_CLR_BIT(3)
> > > +
> > > +#define RK3576_GMAC_CLK_SELET_IO		GRF_BIT(7)
> > > +#define RK3576_GMAC_CLK_SELET_CRU		GRF_CLR_BIT(7)
> > 
> > nit: typos _CLK_SELECT_ ... missing the C in select
> 
> Ack

So all points below are resolved, and with the C added
Reviewed-by: Heiko Stuebner <heiko@sntech.de>

> 
> > > +
> > > +#define RK3576_GMAC_CLK_RMII_DIV2		GRF_BIT(5)
> > > +#define RK3576_GMAC_CLK_RMII_DIV20		GRF_CLR_BIT(5)
> > 
> > I think those are backwards
> > The TRM says bit[5]=0: 25MHz (DIV2) and bit[5]=1: 2.5MHz (DIV20)
> > 
> > I guess nobody also on Rockchip's side tested a RMII phy on those controllrs
> 
> Can't be sure about that. An error in the TRM is not impossible either, as for 
> rk3588, it is also bit[5]=0: DIV20 and bit[5]=1: DIV2. I can switch them to 
> match the TRM though, we may never now.

As David said, the TRM is wrong and the code is correct, so all good


> 
> > > +
> > > +#define RK3576_GMAC_CLK_RGMII_DIV1		\
> > > +			(GRF_CLR_BIT(6) | GRF_CLR_BIT(5))
> > > +#define RK3576_GMAC_CLK_RGMII_DIV5		\
> > > +			(GRF_BIT(6) | GRF_BIT(5))
> > > +#define RK3576_GMAC_CLK_RGMII_DIV50		\
> > > +			(GRF_BIT(6) | GRF_CLR_BIT(5))
> > > +
> > 
> > in contrast, these are correct and match the TRM
> > 
> > > +#define RK3576_GMAC_CLK_RMII_GATE		GRF_BIT(4)
> > > +#define RK3576_GMAC_CLK_RMII_NOGATE		GRF_CLR_BIT(4)
> > > +
> > > +static void rk3576_set_to_rgmii(struct rk_priv_data *bsp_priv,
> > > +				int tx_delay, int rx_delay)
> > > +{
> > > +	struct device *dev = &bsp_priv->pdev->dev;
> > > +	unsigned int offset_con;
> > > +
> > > +	if (IS_ERR(bsp_priv->grf) || IS_ERR(bsp_priv->php_grf)) {
> > > +		dev_err(dev, "Missing rockchip,grf or rockchip,php_grf 
> property\n");
> > > +		return;
> > > +	}
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> > > +					 RK3576_GRF_GMAC_CON0;
> > > +
> > > +	regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RGMII_MODE);
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_VCCIO0_1_3_IOC_CON4 :
> > > +					 
> RK3576_VCCIO0_1_3_IOC_CON2;
> > > +
> > > +	/* m0 && m1 delay enabled */
> > > +	regmap_write(bsp_priv->php_grf, offset_con,
> > > +		     DELAY_ENABLE(RK3576, tx_delay, rx_delay));
> > > +	regmap_write(bsp_priv->php_grf, offset_con + 0x4,
> > > +		     DELAY_ENABLE(RK3576, tx_delay, rx_delay));
> > > +
> > > +	/* m0 && m1 delay value */
> > > +	regmap_write(bsp_priv->php_grf, offset_con,
> > > +		     RK3576_GMAC_CLK_TX_DL_CFG(tx_delay) |
> > > +		     RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
> > > +	regmap_write(bsp_priv->php_grf, offset_con + 0x4,
> > > +		     RK3576_GMAC_CLK_TX_DL_CFG(tx_delay) |
> > > +		     RK3576_GMAC_CLK_RX_DL_CFG(rx_delay));
> > > +}
> > > +
> > > +static void rk3576_set_to_rmii(struct rk_priv_data *bsp_priv)
> > > +{
> > > +	struct device *dev = &bsp_priv->pdev->dev;
> > > +	unsigned int offset_con;
> > > +
> > > +	if (IS_ERR(bsp_priv->php_grf)) {
> > > +		dev_err(dev, "%s: Missing rockchip,php_grf property\n", 
> __func__);
> > > +		return;
> > > +	}
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> > > +					 RK3576_GRF_GMAC_CON0;
> > > +
> > > +	regmap_write(bsp_priv->grf, offset_con, RK3576_GMAC_RMII_MODE);
> > > +}
> > > +
> > > +static void rk3576_set_gmac_speed(struct rk_priv_data *bsp_priv, int
> > > speed) +{
> > > +	struct device *dev = &bsp_priv->pdev->dev;
> > > +	unsigned int val = 0, offset_con;
> > > +
> > > +	switch (speed) {
> > > +	case 10:
> > > +		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
> > > +			val = RK3576_GMAC_CLK_RMII_DIV20;
> > > +		else
> > > +			val = RK3576_GMAC_CLK_RGMII_DIV50;
> > 
> > 		val = bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII ?
> > 				RK3576_GMAC_CLK_RMII_DIV20 :
> > 				RK3576_GMAC_CLK_RGMII_DIV50;
> > perhaps?
> 
> This way matches how it is written in rk3588_set_gmac_speed(). I find that 
> having similar code for similar functions helps reading and understanding it 
> better (although I agree that your suggestion looks better).
> 
> I'd rather keep it like it is for now if that's ok.

ok, there is not much difference between the two variants anyway.


> > > +		break;
> > > +	case 100:
> > > +		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
> > > +			val = RK3576_GMAC_CLK_RMII_DIV2;
> > > +		else
> > > +			val = RK3576_GMAC_CLK_RGMII_DIV5;
> > 
> > same as above?
> > 
> > > +		break;
> > > +	case 1000:
> > > +		if (bsp_priv->phy_iface != PHY_INTERFACE_MODE_RMII)
> > > +			val = RK3576_GMAC_CLK_RGMII_DIV1;
> > > +		else
> > > +			goto err;
> > 
> > 		if (bsp_priv->phy_iface == PHY_INTERFACE_MODE_RMII)
> > 			goto err;
> > 
> > 		val = RK3576_GMAC_CLK_RGMII_DIV1;
> > 
> > > +		break;
> > > +	default:
> > > +		goto err;
> > > +	}
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> > > +					 RK3576_GRF_GMAC_CON0;
> > > +
> > > +	regmap_write(bsp_priv->grf, offset_con, val);
> > > +
> > > +	return;
> > > +err:
> > > +	dev_err(dev, "unknown speed value for GMAC speed=%d", speed);
> > > +}
> > > +
> > > +static void rk3576_set_clock_selection(struct rk_priv_data *bsp_priv,
> > > bool input, +				       bool enable)
> > > +{
> > > +	unsigned int val = input ? RK3576_GMAC_CLK_SELET_IO :
> > > +				   RK3576_GMAC_CLK_SELET_CRU;
> > > +	unsigned int offset_con;
> > > +
> > > +	val |= enable ? RK3576_GMAC_CLK_RMII_NOGATE :
> > > +			RK3576_GMAC_CLK_RMII_GATE;
> > > +
> > > +	offset_con = bsp_priv->id == 1 ? RK3576_GRF_GMAC_CON1 :
> > > +					 RK3576_GRF_GMAC_CON0;
> > 
> > nit: alignment of both looks like it could be nicer
> 
> That's strange, the alignments looks good in vim and git diff. It also looks 
> nice on the archive: https://lore.kernel.org/linux-rockchip/
> 20240808170113.82775-3-detlev.casanova@collabora.com/

ok, probably just some display artifact here :-)





  parent reply	other threads:[~2024-08-15 17:46 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-08 17:00 [PATCH v2 0/2] Add GMAC support for rk3576 Detlev Casanova
2024-08-08 17:00 ` Detlev Casanova
2024-08-08 17:00 ` [PATCH v2 1/2] dt-bindings: net: Add support for rk3576 dwmac Detlev Casanova
2024-08-08 17:00   ` Detlev Casanova
2024-08-08 17:00 ` [PATCH v2 2/2] ethernet: stmmac: dwmac-rk: Add GMAC support for RK3576 Detlev Casanova
2024-08-08 17:00   ` Detlev Casanova
2024-08-09 13:16   ` Heiko Stübner
2024-08-09 13:16     ` Heiko Stübner
2024-08-09 14:38     ` Detlev Casanova
2024-08-09 14:38       ` Detlev Casanova
     [not found]       ` <a73ff2ab-7e68-4d6b-b38d-37e7303af40d@rock-chips.com>
2024-08-15 16:35         ` Heiko Stübner
2024-08-15 16:35           ` Heiko Stübner
2024-08-15 16:37       ` Heiko Stübner [this message]
2024-08-15 16:37         ` Heiko Stübner

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=10024041.2OtUDhi4od@diego \
    --to=heiko@sntech.de \
    --cc=alexandre.torgue@foss.st.com \
    --cc=conor+dt@kernel.org \
    --cc=davem@davemloft.net \
    --cc=david.wu@rock-chips.com \
    --cc=detlev.casanova@collabora.com \
    --cc=devicetree@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=joabreu@synopsys.com \
    --cc=kernel@collabora.com \
    --cc=krzk+dt@kernel.org \
    --cc=kuba@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=peppe.cavallaro@st.com \
    --cc=robh@kernel.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 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.