From patchwork Tue Apr 28 03:02:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peng Fan X-Patchwork-Id: 1278189 X-Patchwork-Delegate: sbabic@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256 header.s=selector2 header.b=QJ8yLO9X; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49B5Ts2SGgz9sSX for ; Tue, 28 Apr 2020 12:40:17 +1000 (AEST) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 4CAB881F1E; Tue, 28 Apr 2020 04:40:07 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de Authentication-Results: phobos.denx.de; dkim=pass (1024-bit key; unprotected) header.d=nxp.com header.i=@nxp.com header.b="QJ8yLO9X"; dkim-atps=neutral Received: by phobos.denx.de (Postfix, from userid 109) id 6D16281F17; Tue, 28 Apr 2020 04:39:56 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FORGED_SPF_HELO,MSGID_FROM_MTA_HEADER, SPF_HELO_PASS,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on0624.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe1e::624]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 06C3881F11 for ; Tue, 28 Apr 2020 04:39:50 +0200 (CEST) Authentication-Results: phobos.denx.de; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=peng.fan@nxp.com ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Rm+24WJkZSao6beQoO3CJLSyA/yuPuVS3+9a/JaBQ+G17Drk3xcoFgyFYkbbxjqR+ki2jQL/eM3nx5qqkGSeAaKMGL6PqqWZjgpzVQEPgpvmdLX+Elk/hcARMxvkcMPYsCAwZTHNjmN/9xshFWL28QLkkzS0dxc6aLJyS2T+NJJuZeob+YIggrIc+8/HSoaIxGKjBrXa8eZwc9McPxUkRSZ0i560YQ1WQWuEfB7pRJtFEJMbPofkLpZPBRO3N914IMxGngDCrVBlFg6G2hAIPDPP+MyjZR5KfhTb+ZOFNrPVWlDl/ZhXOm9ylxh42v27QT0+2xemOs8Gqu3aDiAi3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=huKktOFMGIloDwKm8FUqgKYzMupcXgAZr71TtLNgd3I=; b=Y8kV44afutknv/OLJ5nNz0eYdsPzBdOOilGX3JXWytcC5bAhAwicl80UiHPvvDlJVLYQ3N02OGsUzQ5dUPdAGLjc6ejDIO7gdbAgpdtkZlTqk4CT+BquSHICeOX85jVoYDxqaHUAWa6hbjWdqG+8/cu4oM7a8CeH7yX1PpsvBTq5m5gEM22/wWftvn1buIMEsusZ9uBy0Q1YPJmpU5gE5iZTuXPBUa47SN4ikPTAYaUuD6HaLkW1o/4A53iJ143rF/J4eiIwzUlvdiUwpEtgQ+HARm6lsGZIpUyXbHD6XZc7HGXg5R1EEN6uIpPwYAvok1lTejZkRgXgnToniVfT3Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=huKktOFMGIloDwKm8FUqgKYzMupcXgAZr71TtLNgd3I=; b=QJ8yLO9XyFvuhDQv8p3H8ZnkV1iELbvSxLIuslS2+sVWYp37ukLda+vqqoXBkQ3wqzviqLHhCdHf5AaD6kq8xx1WFnJa8fXliyvi4W8TdZ/fOB5XDutwMOdFTx+tyXFUkKj6X/cf484OY32ps+COoyLbQ0zSHLenrwMM39yZCVg= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=peng.fan@nxp.com; Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) by DB6PR0402MB2807.eurprd04.prod.outlook.com (2603:10a6:4:96::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.22; Tue, 28 Apr 2020 02:39:50 +0000 Received: from DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::d17b:d767:19c3:b871]) by DB6PR0402MB2760.eurprd04.prod.outlook.com ([fe80::d17b:d767:19c3:b871%6]) with mapi id 15.20.2937.020; Tue, 28 Apr 2020 02:39:50 +0000 From: Peng Fan To: joe.hershberger@ni.com Cc: sbabic@denx.de, ccaione@baylibre.com, u-boot@lists.denx.de, uboot-imx@nxp.com, Ye Li , Peng Fan Subject: [PATCH 2/8] net: Add eth phy generic driver for shared MDIO Date: Tue, 28 Apr 2020 11:02:22 +0800 Message-Id: <20200428030228.19964-3-peng.fan@nxp.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20200428030228.19964-1-peng.fan@nxp.com> References: <20200428030228.19964-1-peng.fan@nxp.com> X-ClientProxiedBy: SG2PR01CA0115.apcprd01.prod.exchangelabs.com (2603:1096:4:40::19) To DB6PR0402MB2760.eurprd04.prod.outlook.com (2603:10a6:4:a1::14) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from linux-1xn6.ap.freescale.net (119.31.174.71) by SG2PR01CA0115.apcprd01.prod.exchangelabs.com (2603:1096:4:40::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13 via Frontend Transport; Tue, 28 Apr 2020 02:39:47 +0000 X-Mailer: git-send-email 2.16.4 X-Originating-IP: [119.31.174.71] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 627417d6-5cd4-44e7-12b1-08d7eb1d6c3a X-MS-TrafficTypeDiagnostic: DB6PR0402MB2807:|DB6PR0402MB2807: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:89; X-Forefront-PRVS: 0387D64A71 X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB6PR0402MB2760.eurprd04.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(366004)(376002)(39860400002)(346002)(136003)(396003)(52116002)(66946007)(66476007)(16526019)(66556008)(316002)(6512007)(8936002)(186003)(81156014)(86362001)(2616005)(26005)(956004)(6506007)(44832011)(36756003)(54906003)(8676002)(1076003)(6916009)(5660300002)(4326008)(478600001)(6486002)(6666004)(2906002)(41533002); DIR:OUT; SFP:1101; Received-SPF: None (protection.outlook.com: nxp.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FzUFeckPuqR9QjWVQwKdWMP4qF0FBbOISwtzky7vLTYOicqse3rpIfknHQgXSsRj3bfS4RX0OHWjWEQ7V2FgiXMhKAycTQ7qv06xceB0+OJRAwQNlGTasFLavIaD/YiMAfjvWdX7CUu/a5dFB0489eZ4raxyVNj4rIQCMYFsJAz/mrC+dP97joayklJAO7bgOUeJ6R+58KNm7ZEko8+nIv8BJ1A3Xn3oXGzQyuJbz+/hbN5bnyrLzyDRq0H45c6zL7PR2b+sRZgAq5NT7/9NKm6gOF6vSf2ZPB/6oRcjyOsL8PzmUNk6wCeMLdkTFNsA5zj80bWP3Cb8naOwMll0/J1bws1VVIBDD8MidIVLC1PtX8VrfETDCbdouBHRT/4HxlpE3r8dKAwbVm2Z9s8T30IA4FgKEzwI7u81/tcjTn9NxKeYELJMJhYqIKcY9frR6cEX9enEAK9bROdyoIGD/625ANJwCCiKJgR/qWngoA0o/YATsjGxUdh4hDUo6GON X-MS-Exchange-AntiSpam-MessageData: hkgcbSF2+b/jd5TzL1tSVwXwX+aTIBjUks3iyJQUlpc47IOZDq3ifoIlmwltBMzvI4WkIImrZWcyTPpZEIfOFc+9qSvO3uWfgiSY8T/dFvwm2KsBxhYHlSEKQAUW4C1CcIDEiNOICtFHDzckTyZpHJ+ovmLfsVUKfPN0mO38l9JT9REoK3rj3+KHu7otu4EWLwjQjSJO+V6brwe2WufNUKc8R/T7AK8hOurImxB+iS2TpS/Yqfl4YrzgzJ2hss8qi+QzDuU4f9WF4Elvc6W6ABo8ZklCj1d4Q5KRcZ5+YP4krAIcZiBq3DiUMNxy3MFJPSkAIf1Y7hJ81VFIJ+Drwmzsqml/aQkoqgd2x6FBiFEUS69CAmCz8TZY+ZyX6+XPDcC4fp8XXb8ga/nPb56dHA4cNdNhzMJEvd9N86GT+gsLmkMNVNVXmu3oVGH1X3yoBD4DwuqoHCgrtuDtLGYbKXIkLyfhlu0btnzBpVNSRGF7Bve86qPlbFzwkZoS35syP/G2SBVMB/aZI2kD2Q2A6Hj8hAueOfS2dXb005oxbCheBToIqf/2u1MnR08rmh2FC3tNPcJPMgwgyWZbfFrxSafAoROI8DIL2Goykn9u1bc2u1c0u1MHi2iJJXgn1CCrtTeNQFC7lQlec3j8/72M2gi+Ut/zMnNMN3nWbua+2KItwsAO8qZRjFfHoU6vJvjhVC7mRQkh+mpsuVlmnTOQLfMlM2eZFSkzjJOXTT7GPEkkN9snvVxAKOO+7IA3nmwPc5A45JdbGDntwvOyWoYW+fsLv1nl4ioXZIoil0K5Urk= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 627417d6-5cd4-44e7-12b1-08d7eb1d6c3a X-MS-Exchange-CrossTenant-OriginalArrivalTime: 28 Apr 2020 02:39:50.0867 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: anKJx79NE8sQs1/2w7l/OblpOURAzpav2a2bVs+XUCXtHbLgBUMV3+AUXTRC4C8XbsSztAfspcCFc1thU+S74w== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0402MB2807 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.30rc1 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.102.2 at phobos.denx.de X-Virus-Status: Clean From: Ye Li For dual ethernet controllers, the HW design may connect ETH phys to one MDIO ports. So two different ethernet drivers have to share MDIO bus. Since two ethernet drivers are independent, we can't ensure their probe order. To resolve this problem, introduce an eth phy generic driver and uclass. After eth-uclass binds, we search the mdio node and binds the phy node with the eth-phy-generic driver. When one eth driver get its phy device, the parent of phy device will probe prior than phy device. So this ensure the eth driver ownes the MDIO bus will be probed before using its MDIO. Signed-off-by: Ye Li Signed-off-by: Peng Fan --- drivers/net/Kconfig | 6 +++ drivers/net/Makefile | 1 + drivers/net/eth-phy-uclass.c | 122 ++++++++++++++++++++++++++++++++++++++++++ include/dm/uclass-id.h | 1 + include/eth_phy.h | 17 ++++++ net/eth-uclass.c | 5 ++ 6 files changed, 152 insertions(+) create mode 100644 drivers/net/eth-phy-uclass.c create mode 100644 include/eth_phy.h diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 4d1013c984..d77bb221e0 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig @@ -57,6 +57,12 @@ config MDIO_MUX_SANDBOX This driver is used for testing in test/dm/mdio.c +config DM_ETH_PHY + bool "Enable Driver Model for Ethernet Generic PHY drivers" + depends on DM + help + Enable driver model for Ethernet Generic PHY . + menuconfig NETDEVICES bool "Network device support" depends on NET diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 6e0a68834d..f6c5ae4fe7 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -20,6 +20,7 @@ obj-$(CONFIG_ETH_DESIGNWARE) += designware.o obj-$(CONFIG_ETH_DESIGNWARE_SOCFPGA) += dwmac_socfpga.o obj-$(CONFIG_DRIVER_DM9000) += dm9000x.o obj-$(CONFIG_DNET) += dnet.o +obj-$(CONFIG_DM_ETH_PHY) += eth-phy-uclass.o obj-$(CONFIG_E1000) += e1000.o obj-$(CONFIG_E1000_SPI) += e1000_spi.o obj-$(CONFIG_EEPRO100) += eepro100.o diff --git a/drivers/net/eth-phy-uclass.c b/drivers/net/eth-phy-uclass.c new file mode 100644 index 0000000000..e87c7aee80 --- /dev/null +++ b/drivers/net/eth-phy-uclass.c @@ -0,0 +1,122 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2020 NXP + */ + +#include +#include +#include +#include +#include +#include + +struct eth_phy_device_priv { + struct mii_dev *mdio_bus; +}; + +int eth_phy_binds_nodes(struct udevice *eth_dev) +{ + ofnode mdio_node, phy_node; + const char *node_name; + int ret; + + mdio_node = dev_read_subnode(eth_dev, "mdio"); + if (!ofnode_valid(mdio_node)) { + debug("%s: %s mdio subnode not found!", __func__, + eth_dev->name); + return -ENXIO; + } + + ofnode_for_each_subnode(phy_node, mdio_node) { + node_name = ofnode_get_name(phy_node); + + debug("* Found child node: '%s'\n", node_name); + + ret = device_bind_driver_to_node(eth_dev, + "eth_phy_generic_drv", + node_name, phy_node, NULL); + if (ret) { + debug(" - Eth phy binding error: %d\n", ret); + continue; + } + + debug(" - bound phy device: '%s'\n", node_name); + } + + return 0; +} + +int eth_phy_set_mdio_bus(struct udevice *eth_dev, struct mii_dev *mdio_bus) +{ + struct udevice *dev; + struct eth_phy_device_priv *uc_priv; + + for (uclass_first_device(UCLASS_ETH_PHY, &dev); dev; + uclass_next_device(&dev)) { + if (dev->parent == eth_dev) { + uc_priv = (struct eth_phy_device_priv *)(dev->uclass_priv); + + if (!uc_priv->mdio_bus) + uc_priv->mdio_bus = mdio_bus; + } + } + + return 0; +} + +struct mii_dev *eth_phy_get_mdio_bus(struct udevice *eth_dev) +{ + int ret; + struct udevice *phy_dev; + struct eth_phy_device_priv *uc_priv; + + /* Will probe the parent of phy device, then phy device */ + ret = uclass_get_device_by_phandle(UCLASS_ETH_PHY, eth_dev, + "phy-handle", &phy_dev); + if (!ret) { + if (eth_dev != phy_dev->parent) { + /* + * phy_dev is shared and controlled by + * other eth controller + */ + uc_priv = (struct eth_phy_device_priv *)(phy_dev->uclass_priv); + if (uc_priv->mdio_bus) + printf("Get shared mii bus on %s\n", eth_dev->name); + else + printf("Can't get shared mii bus on %s\n", eth_dev->name); + + return uc_priv->mdio_bus; + } + } else { + printf("FEC: can't find phy-handle\n"); + } + + return NULL; +} + +int eth_phy_get_addr(struct udevice *dev) +{ + struct ofnode_phandle_args phandle_args; + int reg; + + if (dev_read_phandle_with_args(dev, "phy-handle", NULL, 0, 0, + &phandle_args)) { + debug("Failed to find phy-handle"); + return -ENODEV; + } + + reg = ofnode_read_u32_default(phandle_args.node, "reg", 0); + + return reg; +} + +UCLASS_DRIVER(eth_phy_generic) = { + .id = UCLASS_ETH_PHY, + .name = "eth_phy_generic", + .per_device_auto_alloc_size = sizeof(struct eth_phy_device_priv), +}; + +U_BOOT_DRIVER(eth_phy_generic_drv) = { + .name = "eth_phy_generic_drv", + .id = UCLASS_ETH_PHY, +}; diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h index 37ada51f9f..7837d459f1 100644 --- a/include/dm/uclass-id.h +++ b/include/dm/uclass-id.h @@ -47,6 +47,7 @@ enum uclass_id { UCLASS_DMA, /* Direct Memory Access */ UCLASS_EFI, /* EFI managed devices */ UCLASS_ETH, /* Ethernet device */ + UCLASS_ETH_PHY, /* Ethernet PHY device */ UCLASS_FIRMWARE, /* Firmware */ UCLASS_FS_FIRMWARE_LOADER, /* Generic loader */ UCLASS_GPIO, /* Bank of general-purpose I/O pins */ diff --git a/include/eth_phy.h b/include/eth_phy.h new file mode 100644 index 0000000000..50c496ff42 --- /dev/null +++ b/include/eth_phy.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright 2020 NXP + */ + +#ifndef _eth_phy_h_ +#define _eth_phy_h_ + +#include +#include + +int eth_phy_binds_nodes(struct udevice *eth_dev); +int eth_phy_set_mdio_bus(struct udevice *eth_dev, struct mii_dev *mdio_bus); +struct mii_dev *eth_phy_get_mdio_bus(struct udevice *eth_dev); +int eth_phy_get_addr(struct udevice *dev); + +#endif diff --git a/net/eth-uclass.c b/net/eth-uclass.c index 950a48d520..48560d59f6 100644 --- a/net/eth-uclass.c +++ b/net/eth-uclass.c @@ -13,6 +13,7 @@ #include #include #include "eth_internal.h" +#include DECLARE_GLOBAL_DATA_PTR; @@ -461,6 +462,10 @@ static int eth_post_bind(struct udevice *dev) return -EINVAL; } +#ifdef CONFIG_DM_ETH_PHY + eth_phy_binds_nodes(dev); +#endif + return 0; }