From patchwork Mon Apr 19 22:51:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 425079 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4767EC43460 for ; Mon, 19 Apr 2021 22:51:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1051C61177 for ; Mon, 19 Apr 2021 22:51:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230121AbhDSWwS (ORCPT ); Mon, 19 Apr 2021 18:52:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44054 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229723AbhDSWwR (ORCPT ); Mon, 19 Apr 2021 18:52:17 -0400 Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E9C69C06138A for ; Mon, 19 Apr 2021 15:51:46 -0700 (PDT) Received: by mail-lf1-x134.google.com with SMTP id h36so4361846lfv.7 for ; Mon, 19 Apr 2021 15:51:46 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=hRmZK9+uf+fZtxPOtr/Jm881SXcXvuSAx594PbZFhW4=; b=Py09nIfFDrvcZu9qx8JKpdaEpfY1vFnQg+G3M2RQycLPJPbDnP4LM9lowezTQk2PT6 qNy8/hxg+5uIWAfjPQgomI3VrFcAKRNtw4jwZGhnRDTydLlwmqnshMvSCJqIcdckfqtJ 9dhiT+OEoHerlixJq9ZRSe9jB+e955l0yii6LgKxdNGLIhRqlJspDr0rgM+ihBYvBXSG Ghww2BbogHZ20OcgyKY7vTskWGe4wB9Y3UHGk8DxC6F11/dxYiMd6OZMriqDGLq22awd EM5nql5qYE/XF/TJoSB72YbJUMryuKvWh0d1jhZSja6RcFYModilAo7ow60Comklq5ii kI5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=hRmZK9+uf+fZtxPOtr/Jm881SXcXvuSAx594PbZFhW4=; b=m1KHkx0HCmL2dwM5FiyQnR7RdU8LuaeFbAprmk6kiilONofU+XUqadnZbrukq9WLCC fNpEekmiTEpS6S8dML5y+65SgXM0x70i3RdegSTn5nfPLRiP3YkCZGhrA79ey9gDT7aj RFiFZb2pPPOCoUYDFAj5c7flabfTagpimpLKBmiOPw+sqThthAH+uO12DlfiMd6mGvsS IiAXEVxxEXdrT8VESotnKhzo+mi91lpPga41kG/CvuwqoiNpQrSdfb3gLfyXqERjrY4d RAuUjttQ2pi1lq3yHzAYhlTEvhiewuTsBVwKJ0vhaZCpxqN/c4YfEB2dafNPG8JSFV0U kzjw== X-Gm-Message-State: AOAM531JqceC3A5Ec9fCIRuh/gbb606kyH8sjPTg+YIf/66t9wPbKpGw hnPiXJ4FG6g0xNEqbAw8PSYqO4N/YH3+0g== X-Google-Smtp-Source: ABdhPJzIyB3PJLWF9guTTw8yfc8EyNCajD14vOz7iwvnc6gAxxFoE1pWxryPsUdTl1pVH+5LAofX3Q== X-Received: by 2002:ac2:48ac:: with SMTP id u12mr13390767lfg.604.1618872705352; Mon, 19 Apr 2021 15:51:45 -0700 (PDT) Received: from localhost.localdomain (c-fdcc225c.014-348-6c756e10.bbcust.telenor.se. [92.34.204.253]) by smtp.gmail.com with ESMTPSA id p5sm1950179lfg.183.2021.04.19.15.51.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Apr 2021 15:51:45 -0700 (PDT) From: Linus Walleij To: netdev@vger.kernel.org, "David S . Miller" , Jakub Kicinski Cc: Linus Walleij , Zoltan HERPAI , Raylynn Knight , devicetree@vger.kernel.org Subject: [PATCH 1/3] net: ethernet: ixp4xx: Add DT bindings Date: Tue, 20 Apr 2021 00:51:31 +0200 Message-Id: <20210419225133.2005360-1-linus.walleij@linaro.org> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This adds device tree bindings for the IXP4xx ethernet controller with optional MDIO bridge. Cc: Zoltan HERPAI Cc: Raylynn Knight Cc: devicetree@vger.kernel.org Signed-off-by: Linus Walleij --- ChangeLog v1->v2: - Add schema for the (optional) embedded MDIO bus inside the ethernet controller in an "mdio" node instead of just letting the code randomly populate and present it to the operating system. - Reference the standard schemas for ethernet controller and MDIO buses. - Add intel,npe to indentify the NPE unit used with each ethernet adapter. --- .../bindings/net/intel,ixp4xx-ethernet.yaml | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 Documentation/devicetree/bindings/net/intel,ixp4xx-ethernet.yaml diff --git a/Documentation/devicetree/bindings/net/intel,ixp4xx-ethernet.yaml b/Documentation/devicetree/bindings/net/intel,ixp4xx-ethernet.yaml new file mode 100644 index 000000000000..55ef6ff7d171 --- /dev/null +++ b/Documentation/devicetree/bindings/net/intel,ixp4xx-ethernet.yaml @@ -0,0 +1,80 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +# Copyright 2018 Linaro Ltd. +%YAML 1.2 +--- +$id: "http://devicetree.org/schemas/net/intel,ixp4xx-ethernet.yaml#" +$schema: "http://devicetree.org/meta-schemas/core.yaml#" + +title: Intel IXP4xx ethernet + +allOf: + - $ref: "ethernet-controller.yaml#" + +maintainers: + - Linus Walleij + +description: | + The Intel IXP4xx ethernet makes use of the IXP4xx NPE (Network + Processing Engine) and the IXP4xx Queue Mangager to process + the ethernet frames. It can optionally contain an MDIO bus to + talk to PHYs. + +properties: + compatible: + const: intel,ixp4xx-ethernet + + reg: + maxItems: 1 + description: Ethernet MMIO address range + + queue-rx: + $ref: '/schemas/types.yaml#/definitions/phandle-array' + maxItems: 1 + description: phandle to the RX queue on the NPE + + queue-txready: + $ref: '/schemas/types.yaml#/definitions/phandle-array' + maxItems: 1 + description: phandle to the TX READY queue on the NPE + + phy-handle: true + + intel,npe: + $ref: /schemas/types.yaml#/definitions/uint32 + enum: [0, 1, 2, 3] + description: which NPE (Network Processing Engine) this ethernet + instance is using + + mdio: + type: object + $ref: "mdio.yaml#" + description: optional node for embedded MDIO controller + +required: + - compatible + - reg + - queue-rx + - queue-txready + +additionalProperties: false + +examples: + - | + ethernet@c8009000 { + compatible = "intel,ixp4xx-ethernet"; + reg = <0xc8009000 0x1000>; + status = "disabled"; + queue-rx = <&qmgr 3>; + queue-txready = <&qmgr 20>; + intel,npe = <1>; + phy-handle = <&phy1>; + + mdio { + #address-cells = <1>; + #size-cells = <0>; + phy1: phy@1 { + #phy-cells = <0>; + reg = <1>; + }; + }; + }; From patchwork Mon Apr 19 22:51:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 424061 Delivered-To: patch@linaro.org Received: by 2002:a02:6a6f:0:0:0:0:0 with SMTP id m47csp3118491jaf; Mon, 19 Apr 2021 15:51:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyLCpTUCyKMDHXwIrG6CHlouHNPniiwHD5eems7SoeCpKR7n3dA/s2fBqX+wQt5wfN0Dndq X-Received: by 2002:a65:480a:: with SMTP id h10mr13800696pgs.63.1618872714215; Mon, 19 Apr 2021 15:51:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618872714; cv=none; d=google.com; s=arc-20160816; b=zeo1ys3WkRLJvWGTtlDDXjtGrAT/huK+bdAs26tKOTYWlfLBFiFXCzXA4X60GNCPkk nDHuxQfkB/woZxRFNyYcousAWTErbRzykCLJk+pvmFQ72cfVfXmHdnao7+3SpgOW9EZA llnHelCpbuLqEA+TOYgyfQa8/wPGptgw9CseL7KTNFCUca1FjpjknPHn35gRDNs8/M18 tALoSYqW6yrvZy1Tw9GwDlkzC6pcxxZ7okOIGTWucSNg3s9bHEl9+ZXdQ4FsSy8nfFQq l9eKGCZ5LncvoYuYWZ5aEubC4HOk3tikiCjp+VuAZqiHidIouhvY/4ofLpepnPdsse5Y exPg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=LaouYuT2TsKPl+1l/wjwTOHcDQc/paE8PY91JJJXoB0=; b=PyLK77bzdsvAKKvzONhX+/3ZNgN5DXAUUfmm6JdruY1Dzz8Qcv1/TPDHrKmVwcDOfe mVGEEh7ds4hGUvv8wf23gy38vNJYwiMEtcRhSCkP8MVKDTm3eZh4tjPTcJ9qbd1TN5h3 hVdT2PRym6hiBWipfVSseD45yBjgSMPBhobY2Dphm8Ckf0SK4ECAp5o+OLHzHeRcsphZ s2LzS43CfawY6ae662X7tZRri44ZDk6VzjixWSztFuib50/AHDl3cC4q76V7FWx74fb4 OWJeVQHbBurbBKA6fMU+764wnx0/HcXYRE3Fc93jSJzihp81EFNnYeyCwzS3WYqctCkU FLxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ln97YXHq; spf=pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hk2si942777pjb.44.2021.04.19.15.51.54; Mon, 19 Apr 2021 15:51:54 -0700 (PDT) Received-SPF: pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=ln97YXHq; spf=pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230487AbhDSWwX (ORCPT + 8 others); Mon, 19 Apr 2021 18:52:23 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44070 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230295AbhDSWwU (ORCPT ); Mon, 19 Apr 2021 18:52:20 -0400 Received: from mail-lf1-x12f.google.com (mail-lf1-x12f.google.com [IPv6:2a00:1450:4864:20::12f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 63683C06174A for ; Mon, 19 Apr 2021 15:51:49 -0700 (PDT) Received: by mail-lf1-x12f.google.com with SMTP id t14so1401604lfe.1 for ; Mon, 19 Apr 2021 15:51:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=LaouYuT2TsKPl+1l/wjwTOHcDQc/paE8PY91JJJXoB0=; b=ln97YXHqEeq71wTi82Dthmza6hs0baNtKFANjm4RfNYK3IgHLjQcXGeXoNBczzD4RN S0U0bl6W0krZXujQw0fC22HjQFAu3e0awKiPf+81/QZ6LEzSaHgPEf6Pfrs/F8o/d5DU VSUbeWMDm4mkZy7FCIeg3lQJgA+OCetW3BT7hO3Drtk53En0LC1g3W+NqEMMmfUPSfGE cNkMA9tABiIV842GmJmCXz3fNgLSgjI6FXcLnr39xatKS6Pa6470hEGCChCQx4TjxTrt 7NmeG9BKRx397kSHrpKuzw68NW75EDF2z9IfiDxNSLSl0ruJ6tXJquTjb7AgJ8App8pj IL6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=LaouYuT2TsKPl+1l/wjwTOHcDQc/paE8PY91JJJXoB0=; b=njs6jhVd73dbtDDRRIZ3mLciPgXh4zSeveAKxA9NSgD2UOsEomL6fP+jlkN4Vl+XVI 9ceZ8CDKJC5Oc+9smX3FDnZ54+r1L+UT94oiVnj2EubK9VUNFb55jvYDxrsrVoHXNhZ0 2DtBfzz9gPnP2USxOfQiOuxkAsdU4fUePGqfzHRc6OAWZfyZovrFvkDQ4qWe3za5b1jR 1R5MEBHb4X2zaUMksaY7QuLiTbkiL1Uvu9J7a009zOOoZJ/xRIukXgaY8QO/PqFPdU3r RXMYp8oxLfklerIqHck4vnR4j67PSev+nnsMriJYR+bwSqxXnshIV2XrdE2L96RffdCN /fvg== X-Gm-Message-State: AOAM5326ADJlij/e+/hwDUlg8OamSkW/K3VMFKop5pMS7N9ZoygLU3MM MTUsvPmwR5BOX5uwcsdv1vlQD09ZA0qSxw== X-Received: by 2002:a19:3847:: with SMTP id d7mr6972086lfj.137.1618872707691; Mon, 19 Apr 2021 15:51:47 -0700 (PDT) Received: from localhost.localdomain (c-fdcc225c.014-348-6c756e10.bbcust.telenor.se. [92.34.204.253]) by smtp.gmail.com with ESMTPSA id p5sm1950179lfg.183.2021.04.19.15.51.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Apr 2021 15:51:47 -0700 (PDT) From: Linus Walleij To: netdev@vger.kernel.org, "David S . Miller" , Jakub Kicinski Cc: Linus Walleij , Zoltan HERPAI , Raylynn Knight Subject: [PATCH 2/3] net: ethernet: ixp4xx: Support device tree probing Date: Tue, 20 Apr 2021 00:51:32 +0200 Message-Id: <20210419225133.2005360-2-linus.walleij@linaro.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210419225133.2005360-1-linus.walleij@linaro.org> References: <20210419225133.2005360-1-linus.walleij@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This adds device tree probing to the IXP4xx ethernet driver. Add a platform data bool to tell us whether to register an MDIO bus for the device or not, as well as the corresponding NPE. We need to drop the memory region request as part of this since the OF core will request the memory for the device. Cc: Zoltan HERPAI Cc: Raylynn Knight Signed-off-by: Linus Walleij --- ChangeLog v1->v2: - Do not rely on earlier attempt for identifying which ports to use: we split the support clearly in a DT way and a playform data way. - Isolate the DT code better. --- drivers/net/ethernet/xscale/ixp4xx_eth.c | 202 ++++++++++++++++------- include/linux/platform_data/eth_ixp4xx.h | 2 + 2 files changed, 148 insertions(+), 56 deletions(-) -- 2.29.2 diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index 9defaa21a1a9..758f820068b5 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -165,7 +166,6 @@ struct eth_regs { }; struct port { - struct resource *mem_res; struct eth_regs __iomem *regs; struct npe *npe; struct net_device *netdev; @@ -1358,19 +1358,132 @@ static const struct net_device_ops ixp4xx_netdev_ops = { .ndo_validate_addr = eth_validate_addr, }; +#ifdef CONFIG_OF +static struct eth_plat_info *ixp4xx_of_get_platdata(struct device *dev) +{ + struct device_node *np = dev->of_node; + struct of_phandle_args queue_spec; + struct eth_plat_info *plat; + struct device_node *phy_np; + struct device_node *mdio_np; + u32 val; + int ret; + + plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL); + if (!plat) + return NULL; + + ret = of_property_read_u32(np, "intel,npe", &val); + if (ret) { + dev_err(dev, "no NPE engine specified\n"); + return NULL; + } + /* NPE ID 0x00, 0x10, 0x20... */ + plat->npe = (val << 4); + + phy_np = of_parse_phandle(np, "phy-handle", 0); + if (phy_np) { + ret = of_property_read_u32(phy_np, "reg", &val); + if (ret) { + dev_err(dev, "cannot find phy reg\n"); + return NULL; + } + of_node_put(phy_np); + } else { + dev_err(dev, "cannot find phy instance\n"); + val = 0; + } + plat->phy = val; + + /* Check if this device has an MDIO bus */ + mdio_np = of_get_child_by_name(np, "mdio"); + if (mdio_np) { + plat->has_mdio = true; + of_node_put(mdio_np); + } + + /* Get the rx queue as a resource from queue manager */ + ret = of_parse_phandle_with_fixed_args(np, "queue-rx", 1, 0, + &queue_spec); + if (ret) { + dev_err(dev, "no rx queue phandle\n"); + return NULL; + } + plat->rxq = queue_spec.args[0]; + + /* Get the txready queue as resource from queue manager */ + ret = of_parse_phandle_with_fixed_args(np, "queue-txready", 1, 0, + &queue_spec); + if (ret) { + dev_err(dev, "no txready queue phandle\n"); + return NULL; + } + plat->txreadyq = queue_spec.args[0]; + + return plat; +} +#else +static struct eth_plat_info *ixp4xx_of_get_platdata(struct device *dev) +{ + return NULL; +} +#endif + static int ixp4xx_eth_probe(struct platform_device *pdev) { char phy_id[MII_BUS_ID_SIZE + 3]; struct phy_device *phydev = NULL; struct device *dev = &pdev->dev; + struct device_node *np = dev->of_node; struct eth_plat_info *plat; - resource_size_t regs_phys; struct net_device *ndev; struct resource *res; struct port *port; int err; - plat = dev_get_platdata(dev); + if (np) { + plat = ixp4xx_of_get_platdata(dev); + if (!plat) + return -ENODEV; + } else { + plat = dev_get_platdata(dev); + if (!plat) + return -ENODEV; + plat->npe = pdev->id; + switch (plat->npe) { + case IXP4XX_ETH_NPEA: + /* If the MDIO bus is not up yet, defer probe */ + break; + case IXP4XX_ETH_NPEB: + /* On all except IXP43x, NPE-B is used for the MDIO bus. + * If there is no NPE-B in the feature set, bail out, + * else we have the MDIO bus here. + */ + if (!cpu_is_ixp43x()) { + if (!(ixp4xx_read_feature_bits() & + IXP4XX_FEATURE_NPEB_ETH0)) + return -ENODEV; + /* Else register the MDIO bus on NPE-B */ + plat->has_mdio = true; + } + break; + case IXP4XX_ETH_NPEC: + /* IXP43x lacks NPE-B and uses NPE-C for the MDIO bus + * access, if there is no NPE-C, no bus, nothing works, + * so bail out. + */ + if (cpu_is_ixp43x()) { + if (!(ixp4xx_read_feature_bits() & + IXP4XX_FEATURE_NPEC_ETH)) + return -ENODEV; + /* Else register the MDIO bus on NPE-B */ + plat->has_mdio = true; + } + break; + default: + return -ENODEV; + } + } if (!(ndev = devm_alloc_etherdev(dev, sizeof(struct port)))) return -ENOMEM; @@ -1378,59 +1491,29 @@ static int ixp4xx_eth_probe(struct platform_device *pdev) SET_NETDEV_DEV(ndev, dev); port = netdev_priv(ndev); port->netdev = ndev; - port->id = pdev->id; + port->id = plat->npe; /* Get the port resource and remap */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) return -ENODEV; - regs_phys = res->start; port->regs = devm_ioremap_resource(dev, res); if (IS_ERR(port->regs)) return PTR_ERR(port->regs); - switch (port->id) { - case IXP4XX_ETH_NPEA: - /* If the MDIO bus is not up yet, defer probe */ - if (!mdio_bus) - return -EPROBE_DEFER; - break; - case IXP4XX_ETH_NPEB: - /* - * On all except IXP43x, NPE-B is used for the MDIO bus. - * If there is no NPE-B in the feature set, bail out, else - * register the MDIO bus. - */ - if (!cpu_is_ixp43x()) { - if (!(ixp4xx_read_feature_bits() & - IXP4XX_FEATURE_NPEB_ETH0)) - return -ENODEV; - /* Else register the MDIO bus on NPE-B */ - if ((err = ixp4xx_mdio_register(port->regs))) - return err; - } - if (!mdio_bus) - return -EPROBE_DEFER; - break; - case IXP4XX_ETH_NPEC: - /* - * IXP43x lacks NPE-B and uses NPE-C for the MDIO bus access, - * of there is no NPE-C, no bus, nothing works, so bail out. - */ - if (cpu_is_ixp43x()) { - if (!(ixp4xx_read_feature_bits() & - IXP4XX_FEATURE_NPEC_ETH)) - return -ENODEV; - /* Else register the MDIO bus on NPE-C */ - if ((err = ixp4xx_mdio_register(port->regs))) - return err; + /* Register the MDIO bus if we have it */ + if (plat->has_mdio) { + err = ixp4xx_mdio_register(port->regs); + if (err) { + dev_err(dev, "failed to register MDIO bus\n"); + return err; } - if (!mdio_bus) - return -EPROBE_DEFER; - break; - default: - return -ENODEV; } + /* If the instance with the MDIO bus has not yet appeared, + * defer probing until it gets probed. + */ + if (!mdio_bus) + return -EPROBE_DEFER; ndev->netdev_ops = &ixp4xx_netdev_ops; ndev->ethtool_ops = &ixp4xx_ethtool_ops; @@ -1444,12 +1527,6 @@ static int ixp4xx_eth_probe(struct platform_device *pdev) if (!(port->npe = npe_request(NPE_ID(port->id)))) return -EIO; - port->mem_res = request_mem_region(regs_phys, REGS_SIZE, ndev->name); - if (!port->mem_res) { - err = -EBUSY; - goto err_npe_rel; - } - port->plat = plat; npe_port_tab[NPE_ID(port->id)] = port; memcpy(ndev->dev_addr, plat->hwaddr, ETH_ALEN); @@ -1463,11 +1540,17 @@ static int ixp4xx_eth_probe(struct platform_device *pdev) udelay(50); snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, - mdio_bus->id, plat->phy); + mdio_bus->id, plat->phy); phydev = phy_connect(ndev, phy_id, &ixp4xx_adjust_link, PHY_INTERFACE_MODE_MII); + if (!phydev) { + err = -ENODEV; + dev_err(dev, "no phydev\n"); + goto err_free_mem; + } if (IS_ERR(phydev)) { err = PTR_ERR(phydev); + dev_err(dev, "could not connect phydev (%d)\n", err); goto err_free_mem; } @@ -1485,8 +1568,6 @@ static int ixp4xx_eth_probe(struct platform_device *pdev) phy_disconnect(phydev); err_free_mem: npe_port_tab[NPE_ID(port->id)] = NULL; - release_resource(port->mem_res); -err_npe_rel: npe_release(port->npe); return err; } @@ -1502,12 +1583,21 @@ static int ixp4xx_eth_remove(struct platform_device *pdev) ixp4xx_mdio_remove(); npe_port_tab[NPE_ID(port->id)] = NULL; npe_release(port->npe); - release_resource(port->mem_res); return 0; } +static const struct of_device_id ixp4xx_eth_of_match[] = { + { + .compatible = "intel,ixp4xx-ethernet", + }, + { }, +}; + static struct platform_driver ixp4xx_eth_driver = { - .driver.name = DRV_NAME, + .driver = { + .name = DRV_NAME, + .of_match_table = of_match_ptr(ixp4xx_eth_of_match), + }, .probe = ixp4xx_eth_probe, .remove = ixp4xx_eth_remove, }; diff --git a/include/linux/platform_data/eth_ixp4xx.h b/include/linux/platform_data/eth_ixp4xx.h index 6f652ea0c6ae..114b0940729f 100644 --- a/include/linux/platform_data/eth_ixp4xx.h +++ b/include/linux/platform_data/eth_ixp4xx.h @@ -14,6 +14,8 @@ struct eth_plat_info { u8 rxq; /* configurable, currently 0 - 31 only */ u8 txreadyq; u8 hwaddr[6]; + u8 npe; /* NPE instance used by this interface */ + bool has_mdio; /* If this instance has an MDIO bus */ }; #endif From patchwork Mon Apr 19 22:51:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 424062 Delivered-To: patch@linaro.org Received: by 2002:a02:6a6f:0:0:0:0:0 with SMTP id m47csp3118503jaf; Mon, 19 Apr 2021 15:51:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy/3r6ziJU4vMX/ZmUg6AyEOmb0N/8vEdp/BuDEBl2D9Hw0VffX2orbe2ukfFMdVXlXrKLY X-Received: by 2002:aa7:97ae:0:b029:24b:3b0f:b2c2 with SMTP id d14-20020aa797ae0000b029024b3b0fb2c2mr21584035pfq.38.1618872715254; Mon, 19 Apr 2021 15:51:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618872715; cv=none; d=google.com; s=arc-20160816; b=J1YSHbH7yoD529GCY/MYMkxByha352sXeVLx/S3h6O8uSp9leIlTwPi0/g1+odZtEu 3lZ2QMWdC8345E/kzIFcLvdVW2JFqfNqAz3H0dHgnykNQb8NFpz0Ln1Gv4e0MX9SGX+h /fy5z7tDUCRxvP9OHqwCwZREkMSE74Ty6sB4DEd85vQBWql59MHbWlH9R7xt1Yu4T3om rZHWZN/Ei2gc0K05+zjl9cbYdTQPKqgBSIC4J4ySiT9wCEgrMgebvYd6mYxTLyo9NpnW 1usuIhMyW2mQ6PwETDZy7QdaTnOfWgncwhIQz5wCM443nWSAeUawoqleCXjcmQzjzp6c nBwQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=1z4m04rYNKkzp/v7KiFWbrpwzCK1WACIqa+LnQcZqhU=; b=B5K8Tb7m9bnjYqcfpPSOx3vT2nBfUZ1h76gl+vMwr6RM1oa7lycNvHyRh5w/o0T1V4 iYDghYsmrnZ1YkvvZyK2DXEpWQ3oPVP19+DPeYTYaQNeRyW4F9TJVyr9tHu2YmNjGvFt iElJm7pokNUl0tQvykajS/9OXm4lWoEdzr7GaV/WKfOwCAx+N7P2rQEzbBZp0WPLMi6P hcNX5wfrR440/fch3LwRAKg2nH1xgCRdZQDLBJjqyWoaq9PPil8G0nLvbKBT4k6bu2sJ d2EFAAjrZ0mJOkK/5EF8fe4l8hSwQktAnxmO96m9Q6GaTMsri/rQUqURy9xRy2fbaj7/ hV9Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=RkUjedUh; spf=pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id hk2si942777pjb.44.2021.04.19.15.51.55; Mon, 19 Apr 2021 15:51:55 -0700 (PDT) Received-SPF: pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=RkUjedUh; spf=pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231624AbhDSWwY (ORCPT + 8 others); Mon, 19 Apr 2021 18:52:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44086 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229723AbhDSWwW (ORCPT ); Mon, 19 Apr 2021 18:52:22 -0400 Received: from mail-lf1-x12f.google.com (mail-lf1-x12f.google.com [IPv6:2a00:1450:4864:20::12f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5B8ACC06138C for ; Mon, 19 Apr 2021 15:51:51 -0700 (PDT) Received: by mail-lf1-x12f.google.com with SMTP id r128so31525303lff.4 for ; Mon, 19 Apr 2021 15:51:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1z4m04rYNKkzp/v7KiFWbrpwzCK1WACIqa+LnQcZqhU=; b=RkUjedUhCUu9EuKONFzXrYyO8xUaxkmEleMwQYVwmd6cA6nGCnKCcxP1d+RVEYTcYF kafgg8/9zDA/qGnnS/5CllcnJjcOVfWPKo57KDA+Ucqj2wpm57rDXTssjsra8sjB6+SO RyjqMreRbMNAb4ujWfh/us9gs1DbOn6xWC2Z+vvlX+6KelTZcTAut4N8MFmkd8A/Tfkp i8T/Uk88FmC66oXqtyWh84RLMaK0Wpb8C0VPdTFwBmn1zJTavOYShWFjwZu+d3z1/pur asQ/z1Rj+Quz1ALu/j/gsSApx8Cwi/bkW/L5HUL0YWkAPnVO49751+UmbG0X+uHSQsnl 7s5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1z4m04rYNKkzp/v7KiFWbrpwzCK1WACIqa+LnQcZqhU=; b=H5eVl+1cBDO5eyK0IOBfg9R+85eqLh6qIcpHijbJ4KVbGOgu0L8ZDZnu04TCdQd0d2 XNddn1Wqn2wHRVQpwNern8JldU0CR5467v3ivxVr8TSnosRXlnJ+VX7avVUClHYmpv4Y 7o17PKugG86uFL9B7/YnfjJnExUEDijFNt/6vatNehuVnvbSjlXUKACAo/Eb4pSPWSam dc6DI65e2c5f+/reFNu4+p9OxjyAhZk14q2YqVnMbvzMML/tprP0/Nq9lwgj8cBDIQlz J1c4KlBjloT6Qi5csj7fMvlAUIR0NCih0Yrj4EJFYR5srP47s9SUFZnZurLB6OkZy/gr v9VA== X-Gm-Message-State: AOAM530jAFFuN/7w7DmciG4ynx0+2EPaXHV2wcCwdksq2WW/uD2RA1Ze iLBsdQ/vD3KbKma80g4qJVBESKB9aip48A== X-Received: by 2002:a05:6512:a86:: with SMTP id m6mr14199168lfu.314.1618872709628; Mon, 19 Apr 2021 15:51:49 -0700 (PDT) Received: from localhost.localdomain (c-fdcc225c.014-348-6c756e10.bbcust.telenor.se. [92.34.204.253]) by smtp.gmail.com with ESMTPSA id p5sm1950179lfg.183.2021.04.19.15.51.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 19 Apr 2021 15:51:49 -0700 (PDT) From: Linus Walleij To: netdev@vger.kernel.org, "David S . Miller" , Jakub Kicinski Cc: Linus Walleij , Zoltan HERPAI , Raylynn Knight Subject: [PATCH 3/3] net: ethernet: ixp4xx: Use OF MDIO bus registration Date: Tue, 20 Apr 2021 00:51:33 +0200 Message-Id: <20210419225133.2005360-3-linus.walleij@linaro.org> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210419225133.2005360-1-linus.walleij@linaro.org> References: <20210419225133.2005360-1-linus.walleij@linaro.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This augments the IXP4xx to use the OF MDIO bus code when registering the MDIO bus and when looking up the PHY for the ethernet network device. Cc: Zoltan HERPAI Cc: Raylynn Knight Signed-off-by: Linus Walleij --- ChangeLog v1->v2: - New patch making use of more OF infrastructure. --- drivers/net/ethernet/xscale/Kconfig | 1 + drivers/net/ethernet/xscale/ixp4xx_eth.c | 34 +++++++++--------------- 2 files changed, 14 insertions(+), 21 deletions(-) -- 2.29.2 diff --git a/drivers/net/ethernet/xscale/Kconfig b/drivers/net/ethernet/xscale/Kconfig index 7b83a6e5d894..468ffe3d1707 100644 --- a/drivers/net/ethernet/xscale/Kconfig +++ b/drivers/net/ethernet/xscale/Kconfig @@ -22,6 +22,7 @@ config IXP4XX_ETH tristate "Intel IXP4xx Ethernet support" depends on ARM && ARCH_IXP4XX && IXP4XX_NPE && IXP4XX_QMGR select PHYLIB + select OF_MDIO if OF select NET_PTP_CLASSIFY help Say Y here if you want to use built-in Ethernet ports diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index 758f820068b5..1e1779b53f22 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c @@ -250,6 +250,7 @@ static inline void memcpy_swab32(u32 *dest, u32 *src, int cnt) static DEFINE_SPINLOCK(mdio_lock); static struct eth_regs __iomem *mdio_regs; /* mdio command and status only */ static struct mii_bus *mdio_bus; +static struct device_node *mdio_bus_np; static int ports_open; static struct port *npe_port_tab[MAX_NPES]; static struct dma_pool *dma_pool; @@ -533,7 +534,8 @@ static int ixp4xx_mdio_register(struct eth_regs __iomem *regs) mdio_bus->write = &ixp4xx_mdio_write; snprintf(mdio_bus->id, MII_BUS_ID_SIZE, "ixp4xx-eth-0"); - if ((err = mdiobus_register(mdio_bus))) + err = of_mdiobus_register(mdio_bus, mdio_bus_np); + if (err) mdiobus_free(mdio_bus); return err; } @@ -1364,7 +1366,6 @@ static struct eth_plat_info *ixp4xx_of_get_platdata(struct device *dev) struct device_node *np = dev->of_node; struct of_phandle_args queue_spec; struct eth_plat_info *plat; - struct device_node *phy_np; struct device_node *mdio_np; u32 val; int ret; @@ -1381,25 +1382,12 @@ static struct eth_plat_info *ixp4xx_of_get_platdata(struct device *dev) /* NPE ID 0x00, 0x10, 0x20... */ plat->npe = (val << 4); - phy_np = of_parse_phandle(np, "phy-handle", 0); - if (phy_np) { - ret = of_property_read_u32(phy_np, "reg", &val); - if (ret) { - dev_err(dev, "cannot find phy reg\n"); - return NULL; - } - of_node_put(phy_np); - } else { - dev_err(dev, "cannot find phy instance\n"); - val = 0; - } - plat->phy = val; - /* Check if this device has an MDIO bus */ mdio_np = of_get_child_by_name(np, "mdio"); if (mdio_np) { plat->has_mdio = true; - of_node_put(mdio_np); + mdio_bus_np = mdio_np; + /* DO NOT put the mdio_np, it will be used */ } /* Get the rx queue as a resource from queue manager */ @@ -1539,10 +1527,14 @@ static int ixp4xx_eth_probe(struct platform_device *pdev) __raw_writel(DEFAULT_CORE_CNTRL, &port->regs->core_control); udelay(50); - snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, - mdio_bus->id, plat->phy); - phydev = phy_connect(ndev, phy_id, &ixp4xx_adjust_link, - PHY_INTERFACE_MODE_MII); + if (np) { + phydev = of_phy_get_and_connect(ndev, np, ixp4xx_adjust_link); + } else { + snprintf(phy_id, MII_BUS_ID_SIZE + 3, PHY_ID_FMT, + mdio_bus->id, plat->phy); + phydev = phy_connect(ndev, phy_id, &ixp4xx_adjust_link, + PHY_INTERFACE_MODE_MII); + } if (!phydev) { err = -ENODEV; dev_err(dev, "no phydev\n");