[PATCH v5 RESEND] soc: nuvoton: Add SoC info driver for WPCM450

Tomer Maimon tmaimon77 at gmail.com
Thu Nov 3 18:11:08 AEDT 2022


Hi Jonathan,

Thanks for your patch.

On Thu, 3 Nov 2022 at 01:09, Joel Stanley <joel at jms.id.au> wrote:
>
> On Mon, 31 Oct 2022 at 22:40, Jonathan Neuschäfer <j.neuschaefer at gmx.net> wrote:
> >
> > Add a SoC information driver for Nuvoton WPCM450 SoCs. It provides
> > information such as the SoC revision.
> >
> > Usage example:
> >
> >   # grep . /sys/devices/soc0/*
> >   /sys/devices/soc0/family:Nuvoton NPCM
> >   /sys/devices/soc0/revision:A3
> >   /sys/devices/soc0/soc_id:WPCM450
> >
> > Signed-off-by: Jonathan Neuschäfer <j.neuschaefer at gmx.net>
> > Reviewed-by: Joel Stanley <joel at jms.id.au>
> > Reviewed-by: Paul Menzel <pmenzel at molgen.mpg.de>
> > ---
> > v5:
> > - Change Kconfig option from bool to tristate
> >
> > v4:
> > - rebase on 5.19-rc1
> >
> > v3:
> > - Declare revisions array as static
> > - Change get_revision parameter to `unsigned int`
> > - Add Paul's R-b tag
> > - Add usage example
> > - Sort includes
> >
> > v2:
> > - https://lore.kernel.org/lkml/20220409173319.2491196-1-j.neuschaefer@gmx.net/
> > - Add R-b tag
> > - rebase on 5.18-rc1
> >
> > v1:
> > - https://lore.kernel.org/lkml/20220129143316.2321460-1-j.neuschaefer@gmx.net/
> > ---
> >  drivers/soc/Kconfig               |   1 +
> >  drivers/soc/Makefile              |   1 +
> >  drivers/soc/nuvoton/Kconfig       |  11 +++
> >  drivers/soc/nuvoton/Makefile      |   2 +
> >  drivers/soc/nuvoton/wpcm450-soc.c | 109 ++++++++++++++++++++++++++++++
> >  5 files changed, 124 insertions(+)
> >  create mode 100644 drivers/soc/nuvoton/Kconfig
> >  create mode 100644 drivers/soc/nuvoton/Makefile
> >  create mode 100644 drivers/soc/nuvoton/wpcm450-soc.c
> >
> > diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
> > index 86ccf5970bc1b..cca3dfa5c6aea 100644
> > --- a/drivers/soc/Kconfig
> > +++ b/drivers/soc/Kconfig
> > @@ -14,6 +14,7 @@ source "drivers/soc/ixp4xx/Kconfig"
> >  source "drivers/soc/litex/Kconfig"
> >  source "drivers/soc/mediatek/Kconfig"
> >  source "drivers/soc/microchip/Kconfig"
> > +source "drivers/soc/nuvoton/Kconfig"
> >  source "drivers/soc/pxa/Kconfig"
> >  source "drivers/soc/qcom/Kconfig"
> >  source "drivers/soc/renesas/Kconfig"
> > diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
> > index 919716e0e7001..b9eb3c75e551a 100644
> > --- a/drivers/soc/Makefile
> > +++ b/drivers/soc/Makefile
> > @@ -19,6 +19,7 @@ obj-$(CONFIG_SOC_XWAY)                += lantiq/
> >  obj-$(CONFIG_LITEX_SOC_CONTROLLER) += litex/
> >  obj-y                          += mediatek/
> >  obj-y                          += microchip/
> > +obj-y                          += nuvoton/
> >  obj-y                          += pxa/
> >  obj-y                          += amlogic/
> >  obj-y                          += qcom/
> > diff --git a/drivers/soc/nuvoton/Kconfig b/drivers/soc/nuvoton/Kconfig
> > new file mode 100644
> > index 0000000000000..df46182088ec2
> > --- /dev/null
> > +++ b/drivers/soc/nuvoton/Kconfig
> > @@ -0,0 +1,11 @@
> > +# SPDX-License-Identifier: GPL-2.0
> > +menuconfig WPCM450_SOC
> > +       tristate "Nuvoton WPCM450 SoC driver"
> > +       default y if ARCH_WPCM450
> > +       select SOC_BUS
>
> Sorry for not noticing this earlier. This is a bit confusing. If we
> have a menu option, the soc driver should appear under it. Or we could
> do without the menu all together, as there's only one driver so far.
>
> We also should select REGMAP, as you're using it, and hide the option
> behind ARCH_WPCM450 || COMPILE_TEST.
>
> How about this:
>
> if ARCH_WPCM450 || COMPILE_TEST
These days we working on LPC BPC driver for NPCM7xx and NPCM8xx that
will be placed in nuvoton soc folder.
we will use:

if ARCH_NPCM || COMPILE_TEST

menu "NPCM SoC drivers"

Maybe you should remove
if ARCH_WPCM450 || COMPILE_TEST

and add ARCH_WPCM450 dependency in the WPCM450_SOCINFO driver configuration.

>
> config WPCM450_SOCINFO
>         tristate "Nuvoton WPCM450 SoC driver"
>         default y if ARCH_WPCM450
>         select SOC_BUS
>         select REGMAP
>         help
>           Say Y here to compile the SoC information driver for Nuvoton
>           WPCM450 SoCs.
>
>           This driver provides information such as the SoC model and
>           revision.
>
> endif
>
>
>
>
> > +       help
> > +         Say Y here to compile the SoC information driver for Nuvoton
> > +         WPCM450 SoCs.
> > +
> > +         This driver provides information such as the SoC model and
> > +         revision.
> > diff --git a/drivers/soc/nuvoton/Makefile b/drivers/soc/nuvoton/Makefile
> > new file mode 100644
> > index 0000000000000..e30317b4e8290
> > --- /dev/null
> > +++ b/drivers/soc/nuvoton/Makefile
> > @@ -0,0 +1,2 @@
> > +# SPDX-License-Identifier: GPL-2.0-only
> > +obj-$(CONFIG_WPCM450_SOC)      += wpcm450-soc.o
> > diff --git a/drivers/soc/nuvoton/wpcm450-soc.c b/drivers/soc/nuvoton/wpcm450-soc.c
> > new file mode 100644
> > index 0000000000000..c5e0d11c383b1
> > --- /dev/null
> > +++ b/drivers/soc/nuvoton/wpcm450-soc.c
> > @@ -0,0 +1,109 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Nuvoton WPCM450 SoC Identification
> > + *
> > + * Copyright (C) 2022 Jonathan Neuschäfer
> > + */
> > +
> > +#include <linux/mfd/syscon.h>
> > +#include <linux/of.h>
> > +#include <linux/regmap.h>
> > +#include <linux/slab.h>
> > +#include <linux/sys_soc.h>
> > +
> > +#define GCR_PDID       0
> > +#define PDID_CHIP(x)   ((x) & 0x00ffffff)
> > +#define CHIP_WPCM450   0x926450
> > +#define PDID_REV(x)    ((x) >> 24)
> > +
> > +struct revision {
> > +       u8 number;
> > +       const char *name;
> > +};
> > +
> > +static const struct revision revisions[] __initconst = {
> > +       { 0x00, "Z1" },
> > +       { 0x03, "Z2" },
> > +       { 0x04, "Z21" },
> > +       { 0x08, "A1" },
> > +       { 0x09, "A2" },
> > +       { 0x0a, "A3" },
> > +       {}
> > +};
> > +
> > +static const char * __init get_revision(unsigned int rev)
> > +{
> > +       int i;
> > +
> > +       for (i = 0; revisions[i].name; i++)
> > +               if (revisions[i].number == rev)
> > +                       return revisions[i].name;
> > +       return NULL;
> > +}
> > +
> > +static struct soc_device_attribute *wpcm450_attr;
> > +static struct soc_device *wpcm450_soc;
> > +
> > +static int __init wpcm450_soc_init(void)
> > +{
> > +       struct soc_device_attribute *attr;
> > +       struct soc_device *soc;
> > +       const char *revision;
> > +       struct regmap *gcr;
> > +       u32 pdid;
> > +       int ret;
> > +
> > +       if (!of_machine_is_compatible("nuvoton,wpcm450"))
> > +               return 0;
> > +
> > +       gcr = syscon_regmap_lookup_by_compatible("nuvoton,wpcm450-gcr");
> > +       if (IS_ERR(gcr))
> > +               return PTR_ERR(gcr);
> > +       ret = regmap_read(gcr, GCR_PDID, &pdid);
> > +       if (ret)
> > +               return ret;
> > +
> > +       if (PDID_CHIP(pdid) != CHIP_WPCM450) {
> > +               pr_warn("Unknown chip ID in GCR.PDID: 0x%06x\n", PDID_CHIP(pdid));
> > +               return -ENODEV;
> > +       }
> > +
> > +       revision = get_revision(PDID_REV(pdid));
> > +       if (!revision) {
> > +               pr_warn("Unknown chip revision in GCR.PDID: 0x%02x\n", PDID_REV(pdid));
> > +               return -ENODEV;
> > +       }
> > +
> > +       attr = kzalloc(sizeof(*attr), GFP_KERNEL);
> > +       if (!attr)
> > +               return -ENOMEM;
> > +
> > +       attr->family = "Nuvoton NPCM";
> > +       attr->soc_id = "WPCM450";
> > +       attr->revision = revision;
> > +       soc = soc_device_register(attr);
> > +       if (IS_ERR(soc)) {
> > +               kfree(attr);
> > +               pr_warn("Could not register SoC device\n");
> > +               return PTR_ERR(soc);
> > +       }
> > +
> > +       wpcm450_soc = soc;
> > +       wpcm450_attr = attr;
> > +       return 0;
> > +}
> > +module_init(wpcm450_soc_init);
> > +
> > +static void __exit wpcm450_soc_exit(void)
> > +{
> > +       if (wpcm450_soc) {
> > +               soc_device_unregister(wpcm450_soc);
> > +               wpcm450_soc = NULL;
> > +               kfree(wpcm450_attr);
> > +       }
> > +}
> > +module_exit(wpcm450_soc_exit);
> > +
> > +MODULE_LICENSE("GPL");
> > +MODULE_AUTHOR("Jonathan Neuschäfer");
> > +MODULE_DESCRIPTION("Nuvoton WPCM450 SoC Identification driver");
> > --
> > 2.35.1
> >

Thanks,

Tomer


More information about the openbmc mailing list