From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Martin Blumenstingl Date: Sat, 25 Dec 2021 04:18:30 +0100 Subject: net: stmmac: dwmac-meson: Initialize all known PREG_ETHERNET_ADDR0 bits Initialize all known PREG_ETHERNET_ADDR0 register bits to be less dependent on the bootloader to set them up correctly. Signed-off-by: Martin Blumenstingl --- drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c | 25 ++++++++-- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c index 111111111111..222222222222 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c @@ -5,6 +5,7 @@ * Copyright (C) 2014 Beniamino Galvani */ +#include #include #include #include @@ -16,10 +17,20 @@ #include "stmmac_platform.h" -#define PREG_ETHERNET_ADDR0_DIV_EN BIT(0) +#define PREG_ETHERNET_ADDR0_DIV_EN BIT(0) /* divides the input clock by 20 (= 0x0) or 2 (= 0x1) */ -#define PREG_ETHERNET_ADDR0_SPEED_100 BIT(1) +#define PREG_ETHERNET_ADDR0_SPEED_100 BIT(1) + +/* 0x0 = little, 0x1 = big */ +#define PREG_ETHERNET_ADDR0_DATA_ENDIANNESS BIT(2) + +/* 0x0 = same order, 0x1: unknown */ +#define PREG_ETHERNET_ADDR0_DESC_ENDIANNESS BIT(3) + +#define PREG_ETHERNET_ADDR0_MII_MODE GENMASK(6, 4) +#define PREG_ETHERNET_ADDR0_MII_MODE_RGMII 0x1 +#define PREG_ETHERNET_ADDR0_MII_MODE_RMII 0x4 struct meson_dwmac { struct device *dev; @@ -49,6 +60,7 @@ static void meson6_dwmac_fix_mac_speed(void *priv, unsigned int speed, unsigned static int meson6_dwmac_init(struct platform_device *pdev, void *priv) { struct meson_dwmac *dwmac = priv; + u32 val; int ret; ret = clk_set_rate(dwmac->ethernet_clk, 50 * 1000 * 1000); @@ -59,7 +71,14 @@ static int meson6_dwmac_init(struct platform_device *pdev, void *priv) if (ret) return ret; - writel(readl(dwmac->reg) | PREG_ETHERNET_ADDR0_DIV_EN, dwmac->reg); + val = readl(dwmac->reg); + val &= ~PREG_ETHERNET_ADDR0_DATA_ENDIANNESS; + val &= ~PREG_ETHERNET_ADDR0_DESC_ENDIANNESS; + val &= ~PREG_ETHERNET_ADDR0_MII_MODE; + val |= FIELD_PREP(PREG_ETHERNET_ADDR0_MII_MODE, + PREG_ETHERNET_ADDR0_MII_MODE_RMII); + val |= PREG_ETHERNET_ADDR0_DIV_EN; + writel(val, dwmac->reg); return 0; } -- Armbian