[PATCH 11/14] net: ravb: Add RZ/G2L Support

Marek Vasut marek.vasut at mailbox.org
Sun Oct 27 17:29:43 CET 2024


On 10/24/24 5:24 PM, Paul Barker wrote:
> The Renesas R9A07G044L (RZ/G2L) SoC includes two Gigabit Ethernet
> interfaces which can be supported using the ravb driver. Some RZ/G2L
> specific steps need to be taken during initialization due to differences
> between this SoC and previously supported SoCs. We also need to ensure
> that the module reset is de-asserted after the module clock is enabled
> but before any Ethernet register reads/writes take place.
> 
> Signed-off-by: Paul Barker <paul.barker.ct at bp.renesas.com>
> ---
>   arch/arm/mach-renesas/Kconfig |   1 +
>   drivers/net/Kconfig           |   2 +
>   drivers/net/ravb.c            | 183 ++++++++++++++++++++++++++++++++--
>   3 files changed, 176 insertions(+), 10 deletions(-)
> 
> diff --git a/arch/arm/mach-renesas/Kconfig b/arch/arm/mach-renesas/Kconfig
> index aeb55da609bd..d373ab56ce91 100644
> --- a/arch/arm/mach-renesas/Kconfig
> +++ b/arch/arm/mach-renesas/Kconfig
> @@ -76,6 +76,7 @@ config RZG2L
>   	imply MULTI_DTB_FIT
>   	imply MULTI_DTB_FIT_USER_DEFINED_AREA
>   	imply PINCTRL_RZG2L
> +	imply RENESAS_RAVB
>   	imply RENESAS_SDHI
>   	imply RZG2L_GPIO
>   	imply SCIF_CONSOLE
> diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
> index 89f7411bdf33..d009acdcd94f 100644
> --- a/drivers/net/Kconfig
> +++ b/drivers/net/Kconfig
> @@ -822,6 +822,8 @@ config RENESAS_RAVB
>   	depends on RCAR_64
>   	select PHYLIB
>   	select PHY_ETHERNET_ID
> +	select BITBANGMII
> +	select BITBANGMII_MULTI

Keep the list sorted.

>   	help
>   	  This driver implements support for the Ethernet AVB block in
>   	  Renesas M3 and H3 SoCs.
> diff --git a/drivers/net/ravb.c b/drivers/net/ravb.c
> index fb869cd0872e..e2ab929858c8 100644
> --- a/drivers/net/ravb.c
> +++ b/drivers/net/ravb.c

[...]

> @@ -108,6 +122,16 @@
>   
>   #define RAVB_TX_TIMEOUT_MS		1000
>   
> +#define RAVB_RCV_BUFF_MAX		8192
> +
> +struct ravb_device_ops {
> +	int (*mac_init)(struct udevice *dev);
> +	int (*dmac_init)(struct udevice *dev);
> +	int (*config)(struct udevice *dev);
> +	int (*reset_deassert)(struct udevice *dev);
> +	void (*reset_assert)(struct udevice *dev);
> +};

[...]

> +static int ravb_reset_deassert_rcar(struct udevice *dev)
> +{

The callsites should check if a callback is assigned or NULL and only 
call the callback if it is assigned. Then you won't need empty callbacks 
like this.

Basically add if (ops->reset_deassert) ops->reset_deassert() and remove 
this empty function.

> +	return 0;
> +}
> +
> +static void ravb_reset_assert_rzg2l(struct udevice *dev)
> +{
> +	struct ravb_priv *eth = dev_get_priv(dev);
> +
> +	reset_assert(&eth->rst);
> +	reset_free(&eth->rst);
> +}

A bit of a design question -- would it make sense to have ravb-rcar.c 
and ravb-rzg2l.c to contain the differences between the ravb variants, 
and keep common code only in ravb.c ?

[...]

> @@ -684,9 +821,35 @@ int ravb_of_to_plat(struct udevice *dev)
>   	return 0;
>   }
>   
> +static const struct ravb_device_ops ravb_device_ops_rzg2l = {

Keep the list sorted, rzg is below rcar (Z is after C) .

> +	.mac_init = ravb_mac_init_rzg2l,
> +	.dmac_init = ravb_dmac_init_rzg2l,
> +	.config = ravb_config_rzg2l,
> +	.reset_deassert = ravb_reset_deassert_rzg2l,
> +	.reset_assert = ravb_reset_assert_rzg2l,
> +};
> +
> +static const struct ravb_device_ops ravb_device_ops_rcar = {
> +	.mac_init = ravb_mac_init_rcar,
> +	.dmac_init = ravb_dmac_init_rcar,
> +	.config = ravb_config_rcar,
> +	.reset_deassert = ravb_reset_deassert_rcar,
> +	.reset_assert = ravb_reset_assert_rcar,
> +};
[...]


More information about the U-Boot mailing list