From patchwork Wed Dec 13 09:30:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Neil Armstrong X-Patchwork-Id: 1875555 X-Patchwork-Delegate: narmstrong@baylibre.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.a=rsa-sha256 header.s=google header.b=G0EzvfsJ; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=85.214.62.61; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1)) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4SqqwV1GnTz1ySd for ; Wed, 13 Dec 2023 20:30:50 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 3D2EA87800; Wed, 13 Dec 2023 10:30:39 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (2048-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b="G0EzvfsJ"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id D24F987015; Wed, 13 Dec 2023 10:30:23 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-wr1-x42c.google.com (mail-wr1-x42c.google.com [IPv6:2a00:1450:4864:20::42c]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 362F8871AA for ; Wed, 13 Dec 2023 10:30:21 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=neil.armstrong@linaro.org Received: by mail-wr1-x42c.google.com with SMTP id ffacd0b85a97d-33635d11d92so752571f8f.1 for ; Wed, 13 Dec 2023 01:30:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1702459820; x=1703064620; darn=lists.denx.de; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Xb+HF1PPlgWJ5vSvv5zwE9PzUMBCQyQC6W64EY5QSn0=; b=G0EzvfsJYT2H71tpro8+b7NsVLyJYklHJQ9GyaHHUU/wepC9Vez3t2GyaxWSJ4xFpE CUHYHwgwzuquM76daIRHzNyFX3/riOat6O3Waxjn9v3uzgTJ+db/W2h5BO6aOpm7OAiG 0WMVBlFy/Iowq/ztg6uunWoy/ZCNP9WRRHPCC9i7Smp7RVu33GQxl5Kcc3pa/yIjZ6Fm CIPe8LdQwiBTFA/sBQYpRzaYvDfOzuBrt+KtPEdtd9720eHqw7Aoe59RRInQtOPStNhF c2kQPGzFcEtogU4fDf7FeGi2bh/wmWsmPbS7DLED4Y9t4apfPmPuDq8S/TGbqBmLAICs g6Qg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702459820; x=1703064620; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Xb+HF1PPlgWJ5vSvv5zwE9PzUMBCQyQC6W64EY5QSn0=; b=J3PKSrzikKLFWdce8cyiFS4jxeVP8bSdZTDovmGutVmro1dzEdcMIIuqEA4Kw8i1Oo uHT6IIppCfTjbJjNAOP1lWGOD63DUGSuAeOkG0e41qTRYFy8PAEfw4lh3Y3Q1c3rqOJu Ieg+hx3ugtmEh4LxY/bEhJHWOOEQrUUdxUZtCfO55022TMu0xmcUVrBn7w/vLq4cCZrT c1c7fm3Sy0bBttw//kIM61WjBr86aZa+PO3LfM9IIu7X6fPcL/WP8WN4Y4foiDhRCecv cajS0LOKvsCChTHWLv1KJycVtACXwDVvxszrGXKDiM4cSqqPewN5SWTpvySvpvk1ylKc n/TQ== X-Gm-Message-State: AOJu0Yybdda2bR9EsZ97eCRsbCx2B4SmtJfNd6mMGa8HfyMjaLYFdm8I 2bnfhy5gG+xqnmUXVMJ51Jb0Ng== X-Google-Smtp-Source: AGHT+IFAc0uYXf3JS8n8Xb/qtCyVLfDLOuAFagrl9K4g4qzfCNdETt8VP1BFrl1JcylIaQ0cEAaXlA== X-Received: by 2002:adf:e4c4:0:b0:336:1b08:be28 with SMTP id v4-20020adfe4c4000000b003361b08be28mr3443489wrm.61.1702459820526; Wed, 13 Dec 2023 01:30:20 -0800 (PST) Received: from [127.0.1.1] ([2a01:e0a:982:cbb0:596e:6d4f:fc0a:ec65]) by smtp.gmail.com with ESMTPSA id h12-20020a5d504c000000b003333521a1cesm678817wrt.57.2023.12.13.01.30.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Dec 2023 01:30:20 -0800 (PST) From: Neil Armstrong Date: Wed, 13 Dec 2023 10:30:12 +0100 Subject: [PATCH v2 1/2] net: Add Amlogic GXL MDIO Mux driver MIME-Version: 1.0 Message-Id: <20231213-u-boot-gxl-mdio-mux-v2-1-c56bb02a75ea@linaro.org> References: <20231213-u-boot-gxl-mdio-mux-v2-0-c56bb02a75ea@linaro.org> In-Reply-To: <20231213-u-boot-gxl-mdio-mux-v2-0-c56bb02a75ea@linaro.org> To: Joe Hershberger , Ramon Fried , Vyacheslav Bocharov Cc: u-boot@lists.denx.de, u-boot-amlogic@groups.io, Neil Armstrong X-Mailer: b4 0.12.3 X-Developer-Signature: v=1; a=openpgp-sha256; l=5612; i=neil.armstrong@linaro.org; h=from:subject:message-id; bh=8zFHpbaCfpky6TcLUOMzXDzzHLvfk+56YGGbydKVkWo=; b=owEBbQKS/ZANAwAKAXfc29rIyEnRAcsmYgBleXmohPdC3pm4mweZQrtsK+AUsw6g4xtf8ld9P 03tSilv6CyJAjMEAAEKAB0WIQQ9U8YmyFYF/h30LIt33NvayMhJ0QUCZXl5qAAKCRB33NvayMhJ 0b2UEACw0I2RnUmlEeNUwqH8Ekfoj7tttNV+sN3EYlBM3AI9+QrxO/QcwWPBv5gR7kC/WXDmAFb YsUKgzVsf5q/r9iqC4jxTDOvCRN92MbvPsS6PyWrPRpeVR5BE/xgJ+v5KoeggHbCCC16TXzQJDA A4Dbh7g6nriRwmVbPz6rYoGFmgADcI2/Hi15syChPv3gjnKDVQ/XPYw/xHzdKkGAKqlfLfwiG1I poeKMWbkZmThI8kYleWyiDR/64DLH2xHGYEWJJh/74QOf985Vh0OJ40I+S49C1mWqqJgcsF7lpm w+SKPRX/rkyQPFR0y8Ysd6tuMjbFdONYGlnaaTGwrqrdPFfHh7n5lSuDabxJKZ4+FEZp+os+2zt 6ctfJQlCwM4nIbmyiqKbyC2E8ujwOTLxAmYzfvp4JrEzGGj5zijEki7mAbjh23Iu4aOMljELVwW 2N2xBM6zlLSKq96yrL1u6zIujqMy7pQ08YJs6OiXXvj+RCMUVhbvZajHNNeNSqMxjwMYtlKJUys dmE4mdvwJnS8sIQr5uy7sQojQ5I/xLGBCg7rW20Obz8XIQKMT4cuiI0xrhdrZOcEo6S9ah3vQly WcI5q+wu8gDS/6iUZF68t3TfN1VFR5lyrB30LHdqTon/sIp0ilrAGjE95gv/NrQQmEdyhN4Z1nw o6pixB62sTJanQQ== X-Developer-Key: i=neil.armstrong@linaro.org; a=openpgp; fpr=89EC3D058446217450F22848169AB7B1A4CFF8AE X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.39 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.103.8 at phobos.denx.de X-Virus-Status: Clean Port the mdio-mux-meson-gxl.c Linux driver introduced in [1], and adapt it to U-Boot. This driver is needed to boot U-Boot with Linux DT since v6.4, since it switched the MDIO mux from the mmio to a proper GXL driver. [1] 9a24e1ff4326 ("net: mdio: add amlogic gxl mdio mux support") Signed-off-by: Neil Armstrong --- drivers/net/Kconfig | 7 ++ drivers/net/Makefile | 1 + drivers/net/mdio_mux_meson_gxl.c | 138 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index ebab4d9f2e..18ec910d12 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -988,4 +988,11 @@ config MDIO_MUX_MESON_G12A This driver is used for the MDIO mux found on the Amlogic G12A & compatible SoCs. +config MDIO_MUX_MESON_GXL + bool "MDIO MUX for Amlogic Meson GXL SoCs" + depends on DM_MDIO_MUX + help + This driver is used for the MDIO mux found on the Amlogic GXL & compatible + SoCs. + endif # NETDEVICES diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 1ce6fea323..3794609fd2 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -58,6 +58,7 @@ obj-$(CONFIG_MCFFEC) += mcffec.o mcfmii.o obj-$(CONFIG_MDIO_IPQ4019) += mdio-ipq4019.o obj-$(CONFIG_MDIO_MUX_I2CREG) += mdio_mux_i2creg.o obj-$(CONFIG_MDIO_MUX_MESON_G12A) += mdio_mux_meson_g12a.o +obj-$(CONFIG_MDIO_MUX_MESON_GXL) += mdio_mux_meson_gxl.o obj-$(CONFIG_MDIO_MUX_MMIOREG) += mdio_mux_mmioreg.o obj-$(CONFIG_MDIO_MUX_SANDBOX) += mdio_mux_sandbox.o obj-$(CONFIG_MDIO_SANDBOX) += mdio_sandbox.o diff --git a/drivers/net/mdio_mux_meson_gxl.c b/drivers/net/mdio_mux_meson_gxl.c new file mode 100644 index 0000000000..8ef3ae598b --- /dev/null +++ b/drivers/net/mdio_mux_meson_gxl.c @@ -0,0 +1,138 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2022 Baylibre, SAS. + * Author: Jerome Brunet + * Copyright (c) 2023 Neil Armstrong + */ + +#include +#include +#include +#include +#include +#include +#include + +#define ETH_REG2 0x0 +#define REG2_PHYID GENMASK(21, 0) +#define EPHY_GXL_ID 0x110181 +#define REG2_LEDACT GENMASK(23, 22) +#define REG2_LEDLINK GENMASK(25, 24) +#define REG2_DIV4SEL BIT(27) +#define REG2_ADCBYPASS BIT(30) +#define REG2_CLKINSEL BIT(31) +#define ETH_REG3 0x4 +#define REG3_ENH BIT(3) +#define REG3_CFGMODE GENMASK(6, 4) +#define REG3_AUTOMDIX BIT(7) +#define REG3_PHYADDR GENMASK(12, 8) +#define REG3_PWRUPRST BIT(21) +#define REG3_PWRDOWN BIT(22) +#define REG3_LEDPOL BIT(23) +#define REG3_PHYMDI BIT(26) +#define REG3_CLKINEN BIT(29) +#define REG3_PHYIP BIT(30) +#define REG3_PHYEN BIT(31) +#define ETH_REG4 0x8 +#define REG4_PWRUPRSTSIG BIT(0) + +#define MESON_GXL_MDIO_EXTERNAL_ID 0 +#define MESON_GXL_MDIO_INTERNAL_ID 1 + +struct mdio_mux_meson_gxl_priv { + phys_addr_t regs; +}; + +static int meson_gxl_enable_internal_mdio(struct mdio_mux_meson_gxl_priv *priv) +{ + u32 val; + + /* Setup the internal phy */ + val = (REG3_ENH | + FIELD_PREP(REG3_CFGMODE, 0x7) | + REG3_AUTOMDIX | + FIELD_PREP(REG3_PHYADDR, 8) | + REG3_LEDPOL | + REG3_PHYMDI | + REG3_CLKINEN | + REG3_PHYIP); + + writel(REG4_PWRUPRSTSIG, priv->regs + ETH_REG4); + writel(val, priv->regs + ETH_REG3); + mdelay(10); + + /* NOTE: The HW kept the phy id configurable at runtime. + * The id below is arbitrary. It is the one used in the vendor code. + * The only constraint is that it must match the one in + * drivers/net/phy/meson-gxl.c to properly match the PHY. + */ + writel(FIELD_PREP(REG2_PHYID, EPHY_GXL_ID), + priv->regs + ETH_REG2); + + /* Enable the internal phy */ + val |= REG3_PHYEN; + writel(val, priv->regs + ETH_REG3); + writel(0, priv->regs + ETH_REG4); + + /* The phy needs a bit of time to power up */ + mdelay(10); + + return 0; +} + +static int meson_gxl_enable_external_mdio(struct mdio_mux_meson_gxl_priv *priv) +{ + /* Reset the mdio bus mux to the external phy */ + writel(0, priv->regs + ETH_REG3); + + return 0; +} + +static int mdio_mux_meson_gxl_select(struct udevice *mux, int cur, int sel) +{ + struct mdio_mux_meson_gxl_priv *priv = dev_get_priv(mux); + + debug("%s: %x -> %x\n", __func__, (u32)cur, (u32)sel); + + /* if last selection didn't change we're good to go */ + if (cur == sel) + return 0; + + switch (sel) { + case MESON_GXL_MDIO_EXTERNAL_ID: + return meson_gxl_enable_external_mdio(priv); + case MESON_GXL_MDIO_INTERNAL_ID: + return meson_gxl_enable_internal_mdio(priv); + default: + return -EINVAL; + } + + return 0; +} + +static const struct mdio_mux_ops mdio_mux_meson_gxl_ops = { + .select = mdio_mux_meson_gxl_select, +}; + +static int mdio_mux_meson_gxl_probe(struct udevice *dev) +{ + struct mdio_mux_meson_gxl_priv *priv = dev_get_priv(dev); + + priv->regs = dev_read_addr(dev); + + return 0; +} + +static const struct udevice_id mdio_mux_meson_gxl_ids[] = { + { .compatible = "amlogic,gxl-mdio-mux" }, + { } +}; + +U_BOOT_DRIVER(mdio_mux_meson_gxl) = { + .name = "mdio_mux_meson_gxl", + .id = UCLASS_MDIO_MUX, + .of_match = mdio_mux_meson_gxl_ids, + .probe = mdio_mux_meson_gxl_probe, + .ops = &mdio_mux_meson_gxl_ops, + .priv_auto = sizeof(struct mdio_mux_meson_gxl_priv), +};