Re: [PATCH v11 net-next 1/9] mfd: ocelot: add helper to get regmap from a resource
From: Vladimir Oltean <vladimir.oltean@nxp.com>
Date: 2022-06-28 16:10:01
Also in:
linux-arm-kernel, linux-devicetree, linux-gpio, lkml
On Tue, Jun 28, 2022 at 01:17:01AM -0700, Colin Foster wrote:
quoted hunk ↗ jump to hunk
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....