From nobody Mon Sep 15 03:53:09 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A2D49C46467 for ; Mon, 16 Jan 2023 17:53:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235161AbjAPRx0 (ORCPT ); Mon, 16 Jan 2023 12:53:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38574 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234991AbjAPRwc (ORCPT ); Mon, 16 Jan 2023 12:52:32 -0500 Received: from mail-lj1-x229.google.com (mail-lj1-x229.google.com [IPv6:2a00:1450:4864:20::229]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2F00A3B3FC for ; Mon, 16 Jan 2023 09:35:03 -0800 (PST) Received: by mail-lj1-x229.google.com with SMTP id c3so807681ljh.1 for ; Mon, 16 Jan 2023 09:35:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=semihalf.com; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2mmk9wI3+C8ssmxR+DpT3SDJM6QGPsI0pDiXXE/Ux+4=; b=mVSJR9izrtn8REjhj4XqnwcyPGABR2JM6lKBsAZbCEjbjsHURusNR09T5nKNDVhIIZ NTaYjBj8l7WG9pkdbHHGCOYl0yrqUES+kElLjeaXPo6GSTje2genBqcuhWjgaVRnhPx8 yatCz72qgWRumx2nfT0Lp1DOwoSBLsXRFH9AT9M4V8+1DbKEfzxPACN97T+sNzAsVW4M Oc8g7B1djvHKggbrz+Fy6zgU0JlosLxCnMFdyltQY46tggiYUnG58NrzpRHbKJuHxLBQ mA3Dd5UCy9v3CLLuIA6r6tPXn8HvRs+tuv385DmyMQyldDQUruLpcDL+NYRTATsXWo+b uW/Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2mmk9wI3+C8ssmxR+DpT3SDJM6QGPsI0pDiXXE/Ux+4=; b=vdgQGrYBEaulnQbDYunlTeFgza2w2lPJmFzfXyi8yHamlP7FRkH+NQb26maSrZtRP9 0L1Rt/t434ibohu1mU8zI0l1Phwa3VZ8U/84TOls8gXQaeNa0fzh/Ik+5GccTFRpggH0 +2h1CdL7qe2czOuAh0NNGGybeZo3oYJQcRIp7kTuLpk0J3zcEVwrFtZsriD1bhW79NGE Xs+3enJmO23L3irGwvRUDV5TziRiti7lWw93wBiSH+s4toyk6gAlmkxfY7Uetd3PijUe J3EqINsOuiiwgw0QNxqI97qjvIk/m04AJ00ooRHPIn2XSvXAL3JUf6NPzSWMQP1qijqq JV/w== X-Gm-Message-State: AFqh2kq3Ltq15hPNd+miD7UR0VHH4i4dzd/J3kWHsk6HD6FCVVIjrE54 xPwAMCvXhs/D6yEgkuEjltBItsRxsSxsRJ8Q X-Google-Smtp-Source: AMrXdXss8H0gbWs28XqQtnJ2QyT/hDi+CE2b0WlWVk57pQf05wIO5SbYvmxXHAzd6auZ7WOrCC7Qeg== X-Received: by 2002:a2e:5cd:0:b0:282:160b:e359 with SMTP id 196-20020a2e05cd000000b00282160be359mr166385ljf.23.1673890501403; Mon, 16 Jan 2023 09:35:01 -0800 (PST) Received: from gilgamesh.lab.semihalf.net ([83.142.187.85]) by smtp.gmail.com with ESMTPSA id k20-20020a2e8894000000b0028b7f51414fsm707333lji.80.2023.01.16.09.35.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Jan 2023 09:35:00 -0800 (PST) From: Marcin Wojtas To: linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, netdev@vger.kernel.org Cc: rafael@kernel.org, andriy.shevchenko@linux.intel.com, sean.wang@mediatek.com, Landen.Chao@mediatek.com, linus.walleij@linaro.org, andrew@lunn.ch, vivien.didelot@gmail.com, f.fainelli@gmail.com, olteanv@gmail.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, linux@armlinux.org.uk, hkallweit1@gmail.com, mw@semihalf.com, jaz@semihalf.com, tn@semihalf.com, Samer.El-Haj-Mahmoud@arm.com Subject: [net-next: PATCH v4 3/8] net: dsa: switch to device_/fwnode_ APIs Date: Mon, 16 Jan 2023 18:34:15 +0100 Message-Id: <20230116173420.1278704-4-mw@semihalf.com> X-Mailer: git-send-email 2.29.0 In-Reply-To: <20230116173420.1278704-1-mw@semihalf.com> References: <20230116173420.1278704-1-mw@semihalf.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" In order to support both DT and ACPI in future, modify the generic DSA code to use device_/fwnode_ equivalent routines. Drop using port's 'dn' field and use only fwnode - update all dependent drivers. Because support for more generic fwnode is added, replace '_of' suffix with '_fw' in related routines. No functional change is introduced by this patch. Signed-off-by: Marcin Wojtas --- include/net/dsa.h | 2 +- net/dsa/port.h | 4 +- drivers/net/dsa/mt7530.c | 6 +- drivers/net/dsa/mv88e6xxx/chip.c | 16 +-- drivers/net/dsa/qca/qca8k-8xxx.c | 2 +- drivers/net/dsa/realtek/rtl8365mb.c | 2 +- net/dsa/dsa.c | 117 +++++++++++--------- net/dsa/port.c | 85 +++++++------- net/dsa/slave.c | 7 +- 9 files changed, 120 insertions(+), 121 deletions(-) diff --git a/include/net/dsa.h b/include/net/dsa.h index 96086289aa9b..b933b88ace78 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -300,7 +300,7 @@ struct dsa_port { =20 u8 setup:1; =20 - struct device_node *dn; + struct fwnode_handle *fwnode; unsigned int ageing_time; =20 struct dsa_bridge *bridge; diff --git a/net/dsa/port.h b/net/dsa/port.h index 9c218660d223..5037b8be982e 100644 --- a/net/dsa/port.h +++ b/net/dsa/port.h @@ -101,8 +101,8 @@ int dsa_port_mrp_del_ring_role(const struct dsa_port *d= p, const struct switchdev_obj_ring_role_mrp *mrp); int dsa_port_phylink_create(struct dsa_port *dp); void dsa_port_phylink_destroy(struct dsa_port *dp); -int dsa_shared_port_link_register_of(struct dsa_port *dp); -void dsa_shared_port_link_unregister_of(struct dsa_port *dp); +int dsa_shared_port_link_register_fw(struct dsa_port *dp); +void dsa_shared_port_link_unregister_fw(struct dsa_port *dp); int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr); void dsa_port_hsr_leave(struct dsa_port *dp, struct net_device *hsr); int dsa_port_tag_8021q_vlan_add(struct dsa_port *dp, u16 vid, bool broadca= st); diff --git a/drivers/net/dsa/mt7530.c b/drivers/net/dsa/mt7530.c index 908fa89444c9..35c4c71216fe 100644 --- a/drivers/net/dsa/mt7530.c +++ b/drivers/net/dsa/mt7530.c @@ -2235,8 +2235,10 @@ mt7530_setup(struct dsa_switch *ds) =20 if (!dsa_is_unused_port(ds, 5)) { priv->p5_intf_sel =3D P5_INTF_SEL_GMAC5; - ret =3D of_get_phy_mode(dsa_to_port(ds, 5)->dn, &interface); - if (ret && ret !=3D -ENODEV) + ret =3D fwnode_get_phy_mode(dsa_to_port(ds, 5)->fwnode); + if (ret >=3D 0) + interface =3D ret; + else if (ret !=3D -ENODEV) return ret; } else { /* Scan the ethernet nodes. look for GMAC1, lookup used phy */ diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/c= hip.c index 1168ea75f5f5..6731597bded0 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -3285,7 +3285,7 @@ static int mv88e6xxx_setup_upstream_port(struct mv88e= 6xxx_chip *chip, int port) =20 static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) { - struct device_node *phy_handle =3D NULL; + struct fwnode_handle *phy_handle =3D NULL; struct dsa_switch *ds =3D chip->ds; phy_interface_t mode; struct dsa_port *dp; @@ -3509,18 +3509,14 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_ch= ip *chip, int port) =20 if (chip->info->ops->serdes_set_tx_amplitude) { if (dp) - phy_handle =3D of_parse_phandle(dp->dn, "phy-handle", 0); + phy_handle =3D fwnode_find_reference(dp->fwnode, "phy-handle", 0); =20 - if (phy_handle && !of_property_read_u32(phy_handle, - "tx-p2p-microvolt", - &tx_amp)) + if (!fwnode_property_read_u32(phy_handle, "tx-p2p-microvolt", &tx_amp)) err =3D chip->info->ops->serdes_set_tx_amplitude(chip, port, tx_amp); - if (phy_handle) { - of_node_put(phy_handle); - if (err) - return err; - } + fwnode_handle_put(phy_handle); + if (err) + return err; } =20 /* Port based VLAN map: give each port the same default address diff --git a/drivers/net/dsa/qca/qca8k-8xxx.c b/drivers/net/dsa/qca/qca8k-8= xxx.c index 2f224b166bbb..6ceb9478309f 100644 --- a/drivers/net/dsa/qca/qca8k-8xxx.c +++ b/drivers/net/dsa/qca/qca8k-8xxx.c @@ -1088,7 +1088,7 @@ qca8k_parse_port_config(struct qca8k_priv *priv) continue; =20 dp =3D dsa_to_port(priv->ds, port); - port_dn =3D dp->dn; + port_dn =3D to_of_node(dp->fwnode); cpu_port_index++; =20 if (!of_device_is_available(port_dn)) diff --git a/drivers/net/dsa/realtek/rtl8365mb.c b/drivers/net/dsa/realtek/= rtl8365mb.c index da31d8b839ac..d61da012451f 100644 --- a/drivers/net/dsa/realtek/rtl8365mb.c +++ b/drivers/net/dsa/realtek/rtl8365mb.c @@ -887,7 +887,7 @@ static int rtl8365mb_ext_config_rgmii(struct realtek_pr= iv *priv, int port, return -ENODEV; =20 dp =3D dsa_to_port(priv->ds, port); - dn =3D dp->dn; + dn =3D to_of_node(dp->fwnode); =20 /* Set the RGMII TX/RX delay * diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c index e5f156940c67..d1ca3bb03858 100644 --- a/net/dsa/dsa.c +++ b/net/dsa/dsa.c @@ -273,12 +273,12 @@ static void dsa_tree_put(struct dsa_switch_tree *dst) } =20 static struct dsa_port *dsa_tree_find_port_by_node(struct dsa_switch_tree = *dst, - struct device_node *dn) + struct fwnode_handle *fwnode) { struct dsa_port *dp; =20 list_for_each_entry(dp, &dst->ports, list) - if (dp->dn =3D=3D dn) + if (dp->fwnode =3D=3D fwnode) return dp; =20 return NULL; @@ -314,14 +314,13 @@ static bool dsa_port_setup_routing_table(struct dsa_p= ort *dp) { struct dsa_switch *ds =3D dp->ds; struct dsa_switch_tree *dst =3D ds->dst; - struct device_node *dn =3D dp->dn; struct of_phandle_iterator it; struct dsa_port *link_dp; struct dsa_link *dl; int err; =20 - of_for_each_phandle(&it, err, dn, "link", NULL, 0) { - link_dp =3D dsa_tree_find_port_by_node(dst, it.node); + of_for_each_phandle(&it, err, to_of_node(dp->fwnode), "link", NULL, 0) { + link_dp =3D dsa_tree_find_port_by_node(dst, of_fwnode_handle(it.node)); if (!link_dp) { of_node_put(it.node); return false; @@ -366,14 +365,17 @@ static struct dsa_port *dsa_tree_find_first_cpu(struc= t dsa_switch_tree *dst) =20 struct net_device *dsa_tree_find_first_master(struct dsa_switch_tree *dst) { - struct device_node *ethernet; + struct fwnode_handle *ethernet; struct net_device *master; struct dsa_port *cpu_dp; =20 cpu_dp =3D dsa_tree_find_first_cpu(dst); - ethernet =3D of_parse_phandle(cpu_dp->dn, "ethernet", 0); - master =3D of_find_net_device_by_node(ethernet); - of_node_put(ethernet); + ethernet =3D fwnode_find_reference(cpu_dp->fwnode, "ethernet", 0); + if (IS_ERR(ethernet)) + return NULL; + + master =3D of_find_net_device_by_node(to_of_node(ethernet)); + fwnode_handle_put(ethernet); =20 return master; } @@ -457,8 +459,8 @@ static int dsa_port_setup(struct dsa_port *dp) dsa_port_disable(dp); break; case DSA_PORT_TYPE_CPU: - if (dp->dn) { - err =3D dsa_shared_port_link_register_of(dp); + if (dp->fwnode) { + err =3D dsa_shared_port_link_register_fw(dp); if (err) break; dsa_port_link_registered =3D true; @@ -475,8 +477,8 @@ static int dsa_port_setup(struct dsa_port *dp) =20 break; case DSA_PORT_TYPE_DSA: - if (dp->dn) { - err =3D dsa_shared_port_link_register_of(dp); + if (dp->fwnode) { + err =3D dsa_shared_port_link_register_fw(dp); if (err) break; dsa_port_link_registered =3D true; @@ -493,7 +495,7 @@ static int dsa_port_setup(struct dsa_port *dp) =20 break; case DSA_PORT_TYPE_USER: - of_get_mac_address(dp->dn, dp->mac); + fwnode_get_mac_address(dp->fwnode, dp->mac); err =3D dsa_slave_create(dp); break; } @@ -501,7 +503,7 @@ static int dsa_port_setup(struct dsa_port *dp) if (err && dsa_port_enabled) dsa_port_disable(dp); if (err && dsa_port_link_registered) - dsa_shared_port_link_unregister_of(dp); + dsa_shared_port_link_unregister_fw(dp); if (err) { dsa_port_devlink_teardown(dp); return err; @@ -522,13 +524,13 @@ static void dsa_port_teardown(struct dsa_port *dp) break; case DSA_PORT_TYPE_CPU: dsa_port_disable(dp); - if (dp->dn) - dsa_shared_port_link_unregister_of(dp); + if (dp->fwnode) + dsa_shared_port_link_unregister_fw(dp); break; case DSA_PORT_TYPE_DSA: dsa_port_disable(dp); - if (dp->dn) - dsa_shared_port_link_unregister_of(dp); + if (dp->fwnode) + dsa_shared_port_link_unregister_fw(dp); break; case DSA_PORT_TYPE_USER: if (dp->slave) { @@ -603,7 +605,7 @@ static void dsa_switch_teardown_tag_protocol(struct dsa= _switch *ds) =20 static int dsa_switch_setup(struct dsa_switch *ds) { - struct device_node *dn; + struct fwnode_handle *fwnode; int err; =20 if (ds->setup) @@ -643,10 +645,10 @@ static int dsa_switch_setup(struct dsa_switch *ds) =20 dsa_slave_mii_bus_init(ds); =20 - dn =3D of_get_child_by_name(ds->dev->of_node, "mdio"); + fwnode =3D device_get_named_child_node(ds->dev, "mdio"); =20 - err =3D of_mdiobus_register(ds->slave_mii_bus, dn); - of_node_put(dn); + err =3D of_mdiobus_register(ds->slave_mii_bus, to_of_node(fwnode)); + fwnode_handle_put(fwnode); if (err < 0) goto free_slave_mii_bus; } @@ -1216,24 +1218,31 @@ static int dsa_port_parse_cpu(struct dsa_port *dp, = struct net_device *master, return 0; } =20 -static int dsa_port_parse_of(struct dsa_port *dp, struct device_node *dn) +static int dsa_port_parse_fw(struct dsa_port *dp, struct fwnode_handle *fw= node) { - struct device_node *ethernet =3D of_parse_phandle(dn, "ethernet", 0); - const char *name =3D of_get_property(dn, "label", NULL); - bool link =3D of_property_read_bool(dn, "link"); + struct fwnode_handle *ethernet =3D fwnode_find_reference(fwnode, "etherne= t", 0); + bool link =3D fwnode_property_present(fwnode, "link"); + const char *name; + int ret; =20 - dp->dn =3D dn; + fwnode_property_read_string(fwnode, "label", &name); =20 - if (ethernet) { + dp->fwnode =3D fwnode; + + if (!IS_ERR(ethernet)) { struct net_device *master; const char *user_protocol; =20 - master =3D of_find_net_device_by_node(ethernet); - of_node_put(ethernet); + master =3D of_find_net_device_by_node(to_of_node(ethernet)); + fwnode_handle_put(ethernet); if (!master) return -EPROBE_DEFER; =20 - user_protocol =3D of_get_property(dn, "dsa-tag-protocol", NULL); + ret =3D fwnode_property_read_string(fwnode, "dsa-tag-protocol", + &user_protocol); + if (ret) + user_protocol =3D NULL; + return dsa_port_parse_cpu(dp, master, user_protocol); } =20 @@ -1243,61 +1252,61 @@ static int dsa_port_parse_of(struct dsa_port *dp, s= truct device_node *dn) return dsa_port_parse_user(dp, name); } =20 -static int dsa_switch_parse_ports_of(struct dsa_switch *ds, - struct device_node *dn) +static int dsa_switch_parse_ports_fw(struct dsa_switch *ds, + struct fwnode_handle *fwnode) { - struct device_node *ports, *port; + struct fwnode_handle *ports, *port; struct dsa_port *dp; int err =3D 0; u32 reg; =20 - ports =3D of_get_child_by_name(dn, "ports"); + ports =3D fwnode_get_named_child_node(fwnode, "ports"); if (!ports) { /* The second possibility is "ethernet-ports" */ - ports =3D of_get_child_by_name(dn, "ethernet-ports"); + ports =3D fwnode_get_named_child_node(fwnode, "ethernet-ports"); if (!ports) { dev_err(ds->dev, "no ports child node found\n"); return -EINVAL; } } =20 - for_each_available_child_of_node(ports, port) { - err =3D of_property_read_u32(port, "reg", ®); + fwnode_for_each_available_child_node(ports, port) { + err =3D fwnode_property_read_u32(port, "reg", ®); if (err) { - of_node_put(port); + fwnode_handle_put(port); goto out_put_node; } =20 if (reg >=3D ds->num_ports) { dev_err(ds->dev, "port %pOF index %u exceeds num_ports (%u)\n", port, reg, ds->num_ports); - of_node_put(port); + fwnode_handle_put(port); err =3D -EINVAL; goto out_put_node; } =20 dp =3D dsa_to_port(ds, reg); =20 - err =3D dsa_port_parse_of(dp, port); + err =3D dsa_port_parse_fw(dp, port); if (err) { - of_node_put(port); + fwnode_handle_put(port); goto out_put_node; } } =20 out_put_node: - of_node_put(ports); + fwnode_handle_put(ports); return err; } =20 -static int dsa_switch_parse_member_of(struct dsa_switch *ds, - struct device_node *dn) +static int dsa_switch_parse_member_fw(struct dsa_switch *ds, + struct fwnode_handle *fwnode) { u32 m[2] =3D { 0, 0 }; int sz; =20 /* Don't error out if this optional property isn't found */ - sz =3D of_property_read_variable_u32_array(dn, "dsa,member", m, 2, 2); + sz =3D fwnode_property_read_u32_array(fwnode, "dsa,member", m, 2); if (sz < 0 && sz !=3D -EINVAL) return sz; =20 @@ -1334,11 +1343,11 @@ static int dsa_switch_touch_ports(struct dsa_switch= *ds) return 0; } =20 -static int dsa_switch_parse_of(struct dsa_switch *ds, struct device_node *= dn) +static int dsa_switch_parse_fw(struct dsa_switch *ds, struct fwnode_handle= *fwnode) { int err; =20 - err =3D dsa_switch_parse_member_of(ds, dn); + err =3D dsa_switch_parse_member_fw(ds, fwnode); if (err) return err; =20 @@ -1346,7 +1355,7 @@ static int dsa_switch_parse_of(struct dsa_switch *ds,= struct device_node *dn) if (err) return err; =20 - return dsa_switch_parse_ports_of(ds, dn); + return dsa_switch_parse_ports_fw(ds, fwnode); } =20 static int dev_is_class(struct device *dev, void *class) @@ -1475,20 +1484,20 @@ static int dsa_switch_probe(struct dsa_switch *ds) { struct dsa_switch_tree *dst; struct dsa_chip_data *pdata; - struct device_node *np; + struct fwnode_handle *fwnode; int err; =20 if (!ds->dev) return -ENODEV; =20 pdata =3D ds->dev->platform_data; - np =3D ds->dev->of_node; + fwnode =3D dev_fwnode(ds->dev); =20 if (!ds->num_ports) return -EINVAL; =20 - if (np) { - err =3D dsa_switch_parse_of(ds, np); + if (fwnode) { + err =3D dsa_switch_parse_fw(ds, fwnode); if (err) dsa_switch_release_ports(ds); } else if (pdata) { diff --git a/net/dsa/port.c b/net/dsa/port.c index 67ad1adec2a2..8f5793f87f40 100644 --- a/net/dsa/port.c +++ b/net/dsa/port.c @@ -6,11 +6,10 @@ * Vivien Didelot */ =20 +#include #include #include #include -#include -#include =20 #include "dsa.h" #include "port.h" @@ -1535,20 +1534,20 @@ void dsa_port_set_tag_protocol(struct dsa_port *cpu= _dp, =20 static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp) { - struct device_node *phy_dn; + struct fwnode_handle *phy_handle; struct phy_device *phydev; =20 - phy_dn =3D of_parse_phandle(dp->dn, "phy-handle", 0); - if (!phy_dn) + phy_handle =3D fwnode_find_reference(dp->fwnode, "phy-handle", 0); + if (IS_ERR(phy_handle)) return NULL; =20 - phydev =3D of_phy_find_device(phy_dn); + phydev =3D fwnode_phy_find_device(phy_handle); if (!phydev) { - of_node_put(phy_dn); + fwnode_handle_put(phy_handle); return ERR_PTR(-EPROBE_DEFER); } =20 - of_node_put(phy_dn); + fwnode_handle_put(phy_handle); return phydev; } =20 @@ -1678,12 +1677,11 @@ static const struct phylink_mac_ops dsa_port_phylin= k_mac_ops =3D { int dsa_port_phylink_create(struct dsa_port *dp) { struct dsa_switch *ds =3D dp->ds; - phy_interface_t mode; struct phylink *pl; - int err; + int mode; =20 - err =3D of_get_phy_mode(dp->dn, &mode); - if (err) + mode =3D fwnode_get_phy_mode(dp->fwnode); + if (mode < 0) mode =3D PHY_INTERFACE_MODE_NA; =20 /* Presence of phylink_mac_link_state or phylink_mac_an_restart is @@ -1696,7 +1694,7 @@ int dsa_port_phylink_create(struct dsa_port *dp) if (ds->ops->phylink_get_caps) ds->ops->phylink_get_caps(ds, dp->index, &dp->pl_config); =20 - pl =3D phylink_create(&dp->pl_config, of_fwnode_handle(dp->dn), + pl =3D phylink_create(&dp->pl_config, dp->fwnode, mode, &dsa_port_phylink_mac_ops); if (IS_ERR(pl)) { pr_err("error creating PHYLINK: %ld\n", PTR_ERR(pl)); @@ -1714,7 +1712,7 @@ void dsa_port_phylink_destroy(struct dsa_port *dp) dp->pl =3D NULL; } =20 -static int dsa_shared_port_setup_phy_of(struct dsa_port *dp, bool enable) +static int dsa_shared_port_setup_phy_fw(struct dsa_port *dp, bool enable) { struct dsa_switch *ds =3D dp->ds; struct phy_device *phydev; @@ -1752,16 +1750,15 @@ static int dsa_shared_port_setup_phy_of(struct dsa_= port *dp, bool enable) return err; } =20 -static int dsa_shared_port_fixed_link_register_of(struct dsa_port *dp) +static int dsa_shared_port_fixed_link_register_fw(struct dsa_port *dp) { - struct device_node *dn =3D dp->dn; struct dsa_switch *ds =3D dp->ds; struct phy_device *phydev; int port =3D dp->index; - phy_interface_t mode; + int mode; int err; =20 - err =3D of_phy_register_fixed_link(dn); + err =3D fwnode_phy_register_fixed_link(dp->fwnode); if (err) { dev_err(ds->dev, "failed to register the fixed PHY of port %d\n", @@ -1769,10 +1766,10 @@ static int dsa_shared_port_fixed_link_register_of(s= truct dsa_port *dp) return err; } =20 - phydev =3D of_phy_find_device(dn); + phydev =3D fwnode_phy_find_device(dp->fwnode); =20 - err =3D of_get_phy_mode(dn, &mode); - if (err) + mode =3D fwnode_get_phy_mode(dp->fwnode); + if (mode < 0) mode =3D PHY_INTERFACE_MODE_NA; phydev->interface =3D mode; =20 @@ -1789,7 +1786,6 @@ static int dsa_shared_port_fixed_link_register_of(str= uct dsa_port *dp) static int dsa_shared_port_phylink_register(struct dsa_port *dp) { struct dsa_switch *ds =3D dp->ds; - struct device_node *port_dn =3D dp->dn; int err; =20 dp->pl_config.dev =3D ds->dev; @@ -1799,7 +1795,7 @@ static int dsa_shared_port_phylink_register(struct ds= a_port *dp) if (err) return err; =20 - err =3D phylink_of_phy_connect(dp->pl, port_dn, 0); + err =3D phylink_fwnode_phy_connect(dp->pl, dp->fwnode, 0); if (err && err !=3D -ENODEV) { pr_err("could not attach to PHY: %d\n", err); goto err_phy_connect; @@ -1926,51 +1922,50 @@ static const char * const dsa_switches_apply_workar= ounds[] =3D { NULL, }; =20 -static void dsa_shared_port_validate_of(struct dsa_port *dp, +static void dsa_shared_port_validate_fw(struct dsa_port *dp, bool *missing_phy_mode, bool *missing_link_description) { - struct device_node *dn =3D dp->dn, *phy_np; + struct fwnode_handle *phy_handle; struct dsa_switch *ds =3D dp->ds; - phy_interface_t mode; =20 *missing_phy_mode =3D false; *missing_link_description =3D false; =20 - if (of_get_phy_mode(dn, &mode)) { + if (fwnode_get_phy_mode(dp->fwnode) < 0) { *missing_phy_mode =3D true; dev_err(ds->dev, - "OF node %pOF of %s port %d lacks the required \"phy-mode\" property\n", - dn, dsa_port_is_cpu(dp) ? "CPU" : "DSA", dp->index); + "FW node %p of %s port %d lacks the required \"phy-mode\" property\n", + dp->fwnode, dsa_port_is_cpu(dp) ? "CPU" : "DSA", dp->index); } =20 - /* Note: of_phy_is_fixed_link() also returns true for + /* Note: fwnode_phy_is_fixed_link() also returns true for * managed =3D "in-band-status" */ - if (of_phy_is_fixed_link(dn)) + if (fwnode_phy_is_fixed_link(dp->fwnode)) return; =20 - phy_np =3D of_parse_phandle(dn, "phy-handle", 0); - if (phy_np) { - of_node_put(phy_np); + phy_handle =3D fwnode_find_reference(dp->fwnode, "phy-handle", 0); + if (!IS_ERR(phy_handle)) { + fwnode_handle_put(phy_handle); return; } =20 *missing_link_description =3D true; =20 dev_err(ds->dev, - "OF node %pOF of %s port %d lacks the required \"phy-handle\", \"fixed-l= ink\" or \"managed\" properties\n", - dn, dsa_port_is_cpu(dp) ? "CPU" : "DSA", dp->index); + "FW node %p of %s port %d lacks the required \"phy-handle\", \"fixed-lin= k\" or \"managed\" properties\n", + dp->fwnode, dsa_port_is_cpu(dp) ? "CPU" : "DSA", dp->index); } =20 -int dsa_shared_port_link_register_of(struct dsa_port *dp) +int dsa_shared_port_link_register_fw(struct dsa_port *dp) { struct dsa_switch *ds =3D dp->ds; bool missing_link_description; bool missing_phy_mode; int port =3D dp->index; =20 - dsa_shared_port_validate_of(dp, &missing_phy_mode, + dsa_shared_port_validate_fw(dp, &missing_phy_mode, &missing_link_description); =20 if ((missing_phy_mode || missing_link_description) && @@ -1996,13 +1991,13 @@ int dsa_shared_port_link_register_of(struct dsa_por= t *dp) dev_warn(ds->dev, "Using legacy PHYLIB callbacks. Please migrate to PHYLINK!\n"); =20 - if (of_phy_is_fixed_link(dp->dn)) - return dsa_shared_port_fixed_link_register_of(dp); + if (fwnode_phy_is_fixed_link(dp->fwnode)) + return dsa_shared_port_fixed_link_register_fw(dp); else - return dsa_shared_port_setup_phy_of(dp, true); + return dsa_shared_port_setup_phy_fw(dp, true); } =20 -void dsa_shared_port_link_unregister_of(struct dsa_port *dp) +void dsa_shared_port_link_unregister_fw(struct dsa_port *dp) { struct dsa_switch *ds =3D dp->ds; =20 @@ -2014,10 +2009,10 @@ void dsa_shared_port_link_unregister_of(struct dsa_= port *dp) return; } =20 - if (of_phy_is_fixed_link(dp->dn)) - of_phy_deregister_fixed_link(dp->dn); + if (fwnode_phy_is_fixed_link(dp->fwnode)) + fwnode_phy_deregister_fixed_link(dp->fwnode); else - dsa_shared_port_setup_phy_of(dp, false); + dsa_shared_port_setup_phy_fw(dp, false); } =20 int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr) diff --git a/net/dsa/slave.c b/net/dsa/slave.c index aab79c355224..fb150a543c30 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -10,8 +10,6 @@ #include #include #include -#include -#include #include #include #include @@ -2309,7 +2307,6 @@ static int dsa_slave_phy_connect(struct net_device *s= lave_dev, int addr, static int dsa_slave_phy_setup(struct net_device *slave_dev) { struct dsa_port *dp =3D dsa_slave_to_port(slave_dev); - struct device_node *port_dn =3D dp->dn; struct dsa_switch *ds =3D dp->ds; u32 phy_flags =3D 0; int ret; @@ -2333,7 +2330,7 @@ static int dsa_slave_phy_setup(struct net_device *sla= ve_dev) if (ds->ops->get_phy_flags) phy_flags =3D ds->ops->get_phy_flags(ds, dp->index); =20 - ret =3D phylink_of_phy_connect(dp->pl, port_dn, phy_flags); + ret =3D phylink_fwnode_phy_connect(dp->pl, dp->fwnode, phy_flags); if (ret =3D=3D -ENODEV && ds->slave_mii_bus) { /* We could not connect to a designated PHY or SFP, so try to * use the switch internal MDIO bus instead @@ -2455,7 +2452,7 @@ int dsa_slave_create(struct dsa_port *port) =20 SET_NETDEV_DEV(slave_dev, port->ds->dev); SET_NETDEV_DEVLINK_PORT(slave_dev, &port->devlink_port); - slave_dev->dev.of_node =3D port->dn; + device_set_node(&slave_dev->dev, port->fwnode); slave_dev->vlan_features =3D master->vlan_features; =20 p =3D netdev_priv(slave_dev); --=20 2.29.0