mirror of
https://abf.rosa.ru/djam/kernel-5.15.git
synced 2025-02-23 18:42:55 +00:00

Information about config values was taken from: From 804820df7bcb3d53a33ecd074b1eac277e938f24 Mon Sep 17 00:00:00 2001 From: Alexey Sheplyakov <asheplyakov@altlinux.org> Date: Thu, 4 Feb 2021 19:35:14 +0400 Subject: [PATCH] config-aarch64: adjusted for Baikal-M (MBM1.0 board) * DW_APB_TIMER=y, DW_APB_TIMER_OF=y: SoC clocks * SERIAL_8250_DW=y: serial console * I2C_DESIGNWARE_CORE=y, I2C_DESIGNWARE_PLATFORM=y: BMC (board management controller) and RTC (Real Time Clock) are connected via I2C. * GPIO_DWAPB=y: device (PCIe, PHY, etc) reset/configuration * RTC_DRV_PCF2127=y: RTC compiled in so the kernel automatically sets the system time from the hardware clock * TP_BMC=y: amongst other things handles the power button * DRM_BAIKAL_VDU=m, DRM_BAIKAL_HDMI=m: video unit and HDMI transmitter * CMA_SIZE_MBYTES=256: video display unit and GPU use system RAM, hence CMA should reserve enough (contiguous) memory. Note: CMA reserves memory during very early init, hence the size has to be hard-coded into CONFIG * MALI_MIDGARD=m: GPU driver, kernel side of proprietary mali blob. Note: kernel mode code is GPLv2, so it's fine to distribute it. * SENSORS_BT1_PVT=m: hardware temperature/voltage sensors * PCI_BAIKAL=m: PCIe root complex. Compiled as a module since takes ages (60 seconds or so) to probe the hardware. If compiled in substantially increases the boot time, and machine is completely unresponsive during probing PCIe. When built as a module probing executes concurrently with other boot activities (unless booting from a PCIe device) * STMMAC_ETH=m, STMMAC_PLATFORM=m, DWMAC_BAIKAL=m: Ethernet driver
106 lines
3.1 KiB
Diff
106 lines
3.1 KiB
Diff
From ae07645b9fa53d7e863dc49998c266333d34906a Mon Sep 17 00:00:00 2001
|
|
From: Alexey Sheplyakov <asheplyakov@altlinux.org>
|
|
Date: Wed, 24 Feb 2021 13:46:49 +0400
|
|
Subject: [PATCH 622/625] stmmac_mdio: implemented reset via MAC GP out pin
|
|
|
|
BE-M1000 variant of stmmac mdio needs a special reset routine.
|
|
|
|
Related: #39714
|
|
---
|
|
.../net/ethernet/stmicro/stmmac/stmmac_mdio.c | 68 ++++++++++++++++++-
|
|
1 file changed, 66 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
|
|
index b2a707e2ef43..fa7b13e932e3 100644
|
|
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
|
|
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
|
|
@@ -287,6 +287,63 @@ static int stmmac_mdio_write(struct mii_bus *bus, int phyaddr, int phyreg,
|
|
100, 10000);
|
|
}
|
|
|
|
+#define MAC_GPIO 0xe0 /* GPIO register */
|
|
+#define MAC_GPIO_GPO0 (1 << 8) /* 0-output port */
|
|
+
|
|
+/**
|
|
+ * Reset the MII bus via MAC GP out pin
|
|
+ */
|
|
+static int stmmac_mdio_reset_gp_out(struct stmmac_priv *priv) {
|
|
+#if IS_ENABLED(CONFIG_STMMAC_PLATFORM) && IS_ENABLED(CONFIG_OF)
|
|
+ u32 value, high, low;
|
|
+ u32 delays[3] = { 0, 0, 0 };
|
|
+ bool active_low = false;
|
|
+ struct device_node *np = priv->device->of_node;
|
|
+
|
|
+ if (!np)
|
|
+ return -ENODEV;
|
|
+
|
|
+ if (!of_property_read_bool(np, "snps,reset-gp-out")) {
|
|
+ dev_warn(priv->device, "snps,reset-gp-out is not set\n");
|
|
+ return -ENODEV;
|
|
+ }
|
|
+
|
|
+ active_low = of_property_read_bool(np, "snsps,reset-active-low");
|
|
+ of_property_read_u32_array(np, "snps,reset-delays-us", delays, 3);
|
|
+
|
|
+ value = readl(priv->ioaddr + MAC_GPIO);
|
|
+ if (active_low) {
|
|
+ high = value | MAC_GPIO_GPO0;
|
|
+ low = value & ~MAC_GPIO_GPO0;
|
|
+ } else {
|
|
+ high = value & ~MAC_GPIO_GPO0;
|
|
+ low = value | MAC_GPIO_GPO0;
|
|
+ }
|
|
+
|
|
+ writel(high, priv->ioaddr + MAC_GPIO);
|
|
+ if (delays[0])
|
|
+ msleep(DIV_ROUND_UP(delays[0], 1000));
|
|
+
|
|
+ writel(low, priv->ioaddr + MAC_GPIO);
|
|
+ if (delays[1])
|
|
+ msleep(DIV_ROUND_UP(delays[1], 1000));
|
|
+
|
|
+ writel(high, priv->ioaddr + MAC_GPIO);
|
|
+ if (delays[2])
|
|
+ msleep(DIV_ROUND_UP(delays[2], 1000));
|
|
+
|
|
+ /* Clear PHY reset */
|
|
+ udelay(10);
|
|
+ value = readl(priv->ioaddr + MAC_GPIO);
|
|
+ value |= MAC_GPIO_GPO0;
|
|
+ writel(value, priv->ioaddr + MAC_GPIO);
|
|
+ mdelay(1000);
|
|
+ dev_info(priv->device, "mdio reset completed\n");
|
|
+ return 0;
|
|
+#endif
|
|
+ return -ENODEV;
|
|
+}
|
|
+
|
|
/**
|
|
* stmmac_mdio_reset
|
|
* @bus: points to the mii_bus structure
|
|
@@ -302,13 +359,20 @@ int stmmac_mdio_reset(struct mii_bus *bus)
|
|
#ifdef CONFIG_OF
|
|
if (priv->device->of_node) {
|
|
struct gpio_desc *reset_gpio;
|
|
+ bool need_reset_gp_out;
|
|
u32 delays[3] = { 0, 0, 0 };
|
|
|
|
reset_gpio = devm_gpiod_get_optional(priv->device,
|
|
"snps,reset",
|
|
GPIOD_OUT_LOW);
|
|
- if (IS_ERR(reset_gpio))
|
|
- return PTR_ERR(reset_gpio);
|
|
+ if (IS_ERR(reset_gpio)) {
|
|
+ need_reset_gp_out = of_property_read_bool(priv->device->of_node,
|
|
+ "snps,reset-gp-out");
|
|
+ if (need_reset_gp_out)
|
|
+ return stmmac_mdio_reset_gp_out(priv);
|
|
+ else
|
|
+ return PTR_ERR(reset_gpio);
|
|
+ }
|
|
|
|
device_property_read_u32_array(priv->device,
|
|
"snps,reset-delays-us",
|
|
--
|
|
2.31.1
|
|
|