Re: [PATCH 4/4] net: dsa: soce: Add initial driver support for MRS switches
From: Andrew Lunn
Date: Wed Jul 29 2026 - 13:42:35 EST
> +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?
Andrew