Re: [PATCH 4/4] net: dsa: soce: Add initial driver support for MRS switches

Vasilij Strassheim <[email protected]>
Newsgroups gmane.linux.kernel,gmane.linux.drivers.devicetree,gmane.linux.network
Organization Linutronix GmbH
Message-ID <[email protected]>
On Wed, 2026-07-29 at 19:31 +0200, Andrew Lunn wrote:
> > +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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.