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

From: Tomer Maimon
Date: Thu Nov 03 2022 - 03:12:48 EST


Hi Jonathan,

Thanks for your patch.

On Thu, 3 Nov 2022 at 01:09, Joel Stanley <joel@xxxxxxxxx> wrote:
>
> On Mon, 31 Oct 2022 at 22:40, Jonathan Neuschäfer <j.neuschaefer@xxxxxxx> 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@xxxxxxx>
> > Reviewed-by: Joel Stanley <joel@xxxxxxxxx>
> > Reviewed-by: Paul Menzel <pmenzel@xxxxxxxxxxxxx>
> > ---
> > 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@xxxxxxx/
> > - Add R-b tag
> > - rebase on 5.18-rc1
> >
> > v1:
> > - https://lore.kernel.org/lkml/20220129143316.2321460-1-j.neuschaefer@xxxxxxx/
> > ---
> > 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