[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(ð->rst);
> + reset_free(ð->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