diff mbox series

[v9,net-next,1/7] mfd: ocelot: add helper to get regmap from a resource

Message ID 20220610175655.776153-2-colin.foster@in-advantage.com
State New
Headers show
Series add support for VSC7512 control over SPI | expand

Commit Message

Colin Foster June 10, 2022, 5:56 p.m. UTC
Several ocelot-related modules are designed for MMIO / regmaps. As such,
they often use a combination of devm_platform_get_and_ioremap_resource and
devm_regmap_init_mmio.

Operating in an MFD might be different, in that it could be memory mapped,
or it could be SPI, I2C... In these cases a fallback to use IORESOURCE_REG
instead of IORESOURCE_MEM becomes necessary.

When this happens, there's redundant logic that needs to be implemented in
every driver. In order to avoid this redundancy, utilize a single function
that, if the MFD scenario is enabled, will perform this fallback logic.

Signed-off-by: Colin Foster <colin.foster@in-advantage.com>
---
 MAINTAINERS                |  5 +++++
 include/linux/mfd/ocelot.h | 22 ++++++++++++++++++++++
 2 files changed, 27 insertions(+)
 create mode 100644 include/linux/mfd/ocelot.h

Comments

Andy Shevchenko June 11, 2022, 10:26 a.m. UTC | #1
On Fri, Jun 10, 2022 at 7:57 PM Colin Foster
<colin.foster@in-advantage.com> wrote:
>
> Several ocelot-related modules are designed for MMIO / regmaps. As such,
> they often use a combination of devm_platform_get_and_ioremap_resource and
> devm_regmap_init_mmio.
>
> Operating in an MFD might be different, in that it could be memory mapped,
> or it could be SPI, I2C... In these cases a fallback to use IORESOURCE_REG
> instead of IORESOURCE_MEM becomes necessary.
>
> When this happens, there's redundant logic that needs to be implemented in
> every driver. In order to avoid this redundancy, utilize a single function
> that, if the MFD scenario is enabled, will perform this fallback logic.

...

> +#include <linux/err.h>
> +#include <linux/platform_device.h>
> +#include <linux/regmap.h>

Since it's header the rule of thumb is to include headers this one is
a direct user of. Here I see missed
types.h

Also missed forward declarations

struct resource;

...

> +       if (!IS_ERR(regs))

Why not positive conditional?

> +               *map = devm_regmap_init_mmio(&pdev->dev, regs, config);
> +       else
> +               *map = ERR_PTR(ENODEV);

Missed -.
Colin Foster June 11, 2022, 3:53 p.m. UTC | #2
On Sat, Jun 11, 2022 at 12:26:31PM +0200, Andy Shevchenko wrote:
> On Fri, Jun 10, 2022 at 7:57 PM Colin Foster
> <colin.foster@in-advantage.com> wrote:
> >
> > Several ocelot-related modules are designed for MMIO / regmaps. As such,
> > they often use a combination of devm_platform_get_and_ioremap_resource and
> > devm_regmap_init_mmio.
> >
> > Operating in an MFD might be different, in that it could be memory mapped,
> > or it could be SPI, I2C... In these cases a fallback to use IORESOURCE_REG
> > instead of IORESOURCE_MEM becomes necessary.
> >
> > When this happens, there's redundant logic that needs to be implemented in
> > every driver. In order to avoid this redundancy, utilize a single function
> > that, if the MFD scenario is enabled, will perform this fallback logic.
> 
> ...
> 
> > +#include <linux/err.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/regmap.h>
> 
> Since it's header the rule of thumb is to include headers this one is
> a direct user of. Here I see missed
> types.h
> 
> Also missed forward declarations
> 
> struct resource;

Ahh, thank you. Yes, you mentioned this in v8 but I misuderstood what
you were saying. I'll also include types.h.

> 
> ...
> 
> > +       if (!IS_ERR(regs))
> 
> Why not positive conditional?
> 
> > +               *map = devm_regmap_init_mmio(&pdev->dev, regs, config);
> > +       else
> > +               *map = ERR_PTR(ENODEV);
> 
> Missed -.

Fixed. Thanks.

> 
> -- 
> With Best Regards,
> Andy Shevchenko
diff mbox series

Patch

diff --git a/MAINTAINERS b/MAINTAINERS
index 033a01b07f8f..91b4151c5ad1 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -14352,6 +14352,11 @@  F:	net/dsa/tag_ocelot.c
 F:	net/dsa/tag_ocelot_8021q.c
 F:	tools/testing/selftests/drivers/net/ocelot/*
 
+OCELOT EXTERNAL SWITCH CONTROL
+M:	Colin Foster <colin.foster@in-advantage.com>
+S:	Supported
+F:	include/linux/mfd/ocelot.h
+
 OCXL (Open Coherent Accelerator Processor Interface OpenCAPI) DRIVER
 M:	Frederic Barrat <fbarrat@linux.ibm.com>
 M:	Andrew Donnellan <ajd@linux.ibm.com>
diff --git a/include/linux/mfd/ocelot.h b/include/linux/mfd/ocelot.h
new file mode 100644
index 000000000000..40e775f1143f
--- /dev/null
+++ b/include/linux/mfd/ocelot.h
@@ -0,0 +1,22 @@ 
+/* 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>
+
+static inline void
+ocelot_platform_init_regmap_from_resource(struct platform_device *pdev,
+					  unsigned int index,
+					  struct regmap **map,
+					  struct resource **res,
+					  const struct regmap_config *config);
+{
+	u32 __iomem *regs =
+		devm_platform_get_and_ioremap_resource(pdev, index, res);
+
+	if (!IS_ERR(regs))
+		*map = devm_regmap_init_mmio(&pdev->dev, regs, config);
+	else
+		*map = ERR_PTR(ENODEV);
+}