Re: [PATCH 4/4] net: dsa: soce: Add initial driver support for MRS switches
From: Vasilij Strassheim <hidden>
Date: 2026-08-03 15:40:16
Also in:
linux-devicetree, lkml
On Wed, 2026-07-29 at 19:31 +0200, Andrew Lunn wrote:
quoted
+static int soce_sw_probe(struct mdio_device *mdiodev) +{ + const struct soce_variant_desc *variant; + struct device *dev = &mdiodev->dev; + struct device_node *switch_node; + struct soce_dsa_local *local; + const char *soce_compatible; + struct soce_priv *priv; + u32 numports; + int ret; + + priv = devm_kzalloc(&mdiodev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->ds = devm_kzalloc(&mdiodev->dev, sizeof(*priv->ds), GFP_KERNEL); + if (!priv->ds) + return -ENOMEM; + + priv->ds->dev = dev; + priv->ds->priv = priv; + local = &priv->local; + + switch_node = of_parse_phandle(dev->of_node, "soce,switch-ip", 0); + if (!switch_node) { + dev_err(dev, "missing or invalid switch IP reference\n"); + return -EINVAL; + } + + ret = of_property_read_string(switch_node, "compatible", + &soce_compatible); + if (ret) { + dev_err(dev, "missing compatible property in %pOF\n", + switch_node); + of_node_put(switch_node); + return -EINVAL; + } + + variant = soce_match_variant(soce_compatible); + if (!variant) { + dev_err(dev, "unsupported compatible '%s' in %pOF\n", + soce_compatible, switch_node); + of_node_put(switch_node); + return -ENODEV; + } + + ret = of_property_read_u32(switch_node, "soce,num-ports", &numports); + if (ret) { + dev_err(dev, "missing soce,num-ports in %pOF\n", switch_node); + of_node_put(switch_node); + return -EINVAL; + } + if (numports == 0 || numports > SOCE_MAX_NUM_PORTS) { + dev_err(dev, "invalid soce,num-ports %u (max %d)\n", numports, + SOCE_MAX_NUM_PORTS); + of_node_put(switch_node); + return -EINVAL; + } + + local->base_addr = devm_of_iomap(dev, switch_node, 0, NULL); + if (IS_ERR(local->base_addr)) { + dev_err(dev, "failed to map switch register space for %pOF\n", + switch_node); + of_node_put(switch_node); + return PTR_ERR(local->base_addr); + } + + priv->ds->ops = &soce_switch_ops; + local->mdio_ops = variant->mdio_ops; + local->mdio_master_addr = + local->base_addr + variant->mdio_master_offset; + local->layout = variant->layout; + of_node_put(switch_node); + + priv->ds->num_ports = numports; + ret = soce_sw_parse_port_mdio(priv, dev, numports); + if (ret) + return ret; + + dev_set_drvdata(&mdiodev->dev, priv); + + dev_info(dev, "soce %s SDSA driver probed.\n", soce_compatible); + + return dsa_register_switch(priv->ds); +}Looking at this struct mdio_device *mdiodev is not used, other than for ->dev. Is this device actually on an MDIO bus?
I only have a memory-mapped version to test. I will remove this *mdiodev in the next version.
Andrew
Thanks, Vasilij