On Tue, Jun 28, 2022 at 01:17:01AM -0700, Colin Foster wrote: > diff --git a/include/linux/mfd/ocelot.h b/include/linux/mfd/ocelot.h > new file mode 100644 > index 000000000000..5c95e4ee38a6 > --- /dev/null > +++ b/include/linux/mfd/ocelot.h > @@ -0,0 +1,27 @@ > +/* SPDX-License-Identifier: GPL-2.0 OR MIT */ > +/* Copyright 2022 Innovative Advantage Inc. */ > + > +#include <linux/err.h> > +#include <linux/platform_device.h> > +#include <linux/regmap.h> > +#include <linux/types.h> > + > +struct resource; > + > +static inline struct regmap * > +ocelot_platform_init_regmap_from_resource(struct platform_device *pdev, > + unsigned int index, > + const struct regmap_config *config) I think this function name is too long (especially if you're going to also introduce ocelot_platform_init_regmap_from_resource_optional), and I have the impression that the "platform_init_" part of the name doesn't bring too much value. How about ocelot_regmap_from_resource()? > +{ > + struct resource *res; > + u32 __iomem *regs; > + > + regs = devm_platform_get_and_ioremap_resource(pdev, index, &res); > + > + if (!res) > + return ERR_PTR(-ENOENT); > + else if (IS_ERR(regs)) > + return ERR_CAST(regs); > + else > + return devm_regmap_init_mmio(&pdev->dev, regs, config); > +} > -- > 2.25.1 > To illustrate what I'm trying to say, these would be the shim definitions: static inline struct regmap * ocelot_regmap_from_resource(struct platform_device *pdev, unsigned int index, const struct regmap_config *config) { struct resource *res; void __iomem *regs; regs = devm_platform_get_and_ioremap_resource(pdev, index, &res); if (IS_ERR(regs)) return regs; return devm_regmap_init_mmio(&pdev->dev, regs, config); } static inline struct regmap * ocelot_regmap_from_resource_optional(struct platform_device *pdev, unsigned int index, const struct regmap_config *config) { struct resource *res; void __iomem *regs; res = platform_get_resource(pdev, IORESOURCE_MEM, index); if (!res) return NULL; regs = devm_ioremap_resource(&pdev->dev, r); if (IS_ERR(regs)) return regs; return devm_regmap_init_mmio(&pdev->dev, regs, config); } and these would be the full versions: static struct regmap * ocelot_regmap_from_mem_resource(struct device *dev, struct resource *res, const struct regmap_config *config) { void __iomem *regs; regs = devm_ioremap_resource(dev, r); if (IS_ERR(regs)) return regs; return devm_regmap_init_mmio(dev, regs, config); } static struct regmap * ocelot_regmap_from_reg_resource(struct device *dev, struct resource *res, const struct regmap_config *config) { /* Open question: how to differentiate SPI from I2C resources? */ return ocelot_spi_init_regmap(dev->parent, dev, res); } struct regmap * ocelot_regmap_from_resource_optional(struct platform_device *pdev, unsigned int index, const struct regmap_config *config) { struct device *dev = &pdev->dev; struct resource *res; res = platform_get_resource(pdev, IORESOURCE_MEM, index); if (res) return ocelot_regmap_from_mem_resource(dev, res, config); /* * Fall back to using IORESOURCE_REG, which is possible in an * MFD configuration */ res = platform_get_resource(pdev, IORESOURCE_REG, index); if (res) return ocelot_regmap_from_reg_resource(dev, res, config); return NULL; } struct regmap * ocelot_regmap_from_resource(struct platform_device *pdev, unsigned int index, const struct regmap_config *config) { struct regmap *map; map = ocelot_regmap_from_resource_optional(pdev, index, config); return map ? : ERR_PTR(-ENOENT); } I hope I didn't get something wrong, this is all code written within the email client, so it is obviously not compiled/tested....