On Thu, Dec 05, 2024 at 03:51:33PM +0100, Christian Marangi wrote: > +static int an8855_efuse_read(void *context, unsigned int offset, > + void *val, size_t bytes) > +{ > + struct an8855_priv *priv = context; > + > + return regmap_bulk_read(priv->regmap, AN8855_EFUSE_DATA0 + offset, > + val, bytes / sizeof(u32)); > +} > + > +static struct nvmem_config an8855_nvmem_config = { > + .name = "an8855-efuse", > + .size = AN8855_EFUSE_CELL * sizeof(u32), > + .stride = sizeof(u32), > + .word_size = sizeof(u32), > + .reg_read = an8855_efuse_read, > +}; > + > +static int an8855_sw_register_nvmem(struct an8855_priv *priv) > +{ > + struct nvmem_device *nvmem; > + > + an8855_nvmem_config.priv = priv; > + an8855_nvmem_config.dev = priv->dev; > + nvmem = devm_nvmem_register(priv->dev, &an8855_nvmem_config); > + if (IS_ERR(nvmem)) > + return PTR_ERR(nvmem); > + > + return 0; > +} At some point we should enforce the rule that new drivers for switch SoCs with complex peripherals should use MFD and move all non-networking peripherals to drivers handled by their respective subsystems. I don't have the expertise to review a nvmem driver, and the majority of them are in drivers/nvmem, with a dedicated subsystem and maintainer. In general I want to make sure it is clear that I don't encourage the model where DSA owns the entire mdio_device. What other peripherals are there on this SoC other than an MDIO bus and an EFUSE? IRQCHIP, GPIOs, LED controller, sensors? You can take a look at drivers/mfd/ocelot* and Documentation/devicetree/bindings/mfd/mscc,ocelot.yaml for an example on how to use mfd for the top-level MDIO device, and DSA as just the driver for the Ethernet switch component (which will be represented as a platform_device).