* [PATCH v5 RESEND] soc: nuvoton: Add SoC info driver for WPCM450
@ 2022-10-31 22:39 Jonathan Neuschäfer
2022-11-02 23:08 ` Joel Stanley
0 siblings, 1 reply; 4+ messages in thread
From: Jonathan Neuschäfer @ 2022-10-31 22:39 UTC (permalink / raw)
To: openbmc
Cc: Jonathan Neuschäfer, Joel Stanley, Paul Menzel,
Arnd Bergmann, Hector Martin, Robert Jarzmik, Lubomir Rintel,
Conor Dooley, Hitomi Hasegawa, Nicolas Ferre, Brian Norris,
Sven Peter, linux-kernel
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@gmx.net>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Reviewed-by: Paul Menzel <pmenzel@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
+ 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
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v5 RESEND] soc: nuvoton: Add SoC info driver for WPCM450
2022-10-31 22:39 [PATCH v5 RESEND] soc: nuvoton: Add SoC info driver for WPCM450 Jonathan Neuschäfer
@ 2022-11-02 23:08 ` Joel Stanley
2022-11-03 7:11 ` Tomer Maimon
0 siblings, 1 reply; 4+ messages in thread
From: Joel Stanley @ 2022-11-02 23:08 UTC (permalink / raw)
To: Jonathan Neuschäfer
Cc: openbmc, Hitomi Hasegawa, Paul Menzel, Brian Norris,
Arnd Bergmann, Sven Peter, linux-kernel, Hector Martin,
Nicolas Ferre, Lubomir Rintel, Conor Dooley, Robert Jarzmik
On Mon, 31 Oct 2022 at 22:40, Jonathan Neuschäfer <j.neuschaefer@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@gmx.net>
> Reviewed-by: Joel Stanley <joel@jms.id.au>
> Reviewed-by: Paul Menzel <pmenzel@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
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
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v5 RESEND] soc: nuvoton: Add SoC info driver for WPCM450
2022-11-02 23:08 ` Joel Stanley
@ 2022-11-03 7:11 ` Tomer Maimon
2022-11-03 15:45 ` Jonathan Neuschäfer
0 siblings, 1 reply; 4+ messages in thread
From: Tomer Maimon @ 2022-11-03 7:11 UTC (permalink / raw)
To: Joel Stanley
Cc: Jonathan Neuschäfer, Hitomi Hasegawa, Paul Menzel,
Hector Martin, Arnd Bergmann, Sven Peter, openbmc, Brian Norris,
linux-kernel, Nicolas Ferre, Lubomir Rintel, Conor Dooley,
Robert Jarzmik
Hi Jonathan,
Thanks for your patch.
On Thu, 3 Nov 2022 at 01:09, Joel Stanley <joel@jms.id.au> wrote:
>
> On Mon, 31 Oct 2022 at 22:40, Jonathan Neuschäfer <j.neuschaefer@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@gmx.net>
> > Reviewed-by: Joel Stanley <joel@jms.id.au>
> > Reviewed-by: Paul Menzel <pmenzel@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
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v5 RESEND] soc: nuvoton: Add SoC info driver for WPCM450
2022-11-03 7:11 ` Tomer Maimon
@ 2022-11-03 15:45 ` Jonathan Neuschäfer
0 siblings, 0 replies; 4+ messages in thread
From: Jonathan Neuschäfer @ 2022-11-03 15:45 UTC (permalink / raw)
To: Tomer Maimon
Cc: Joel Stanley, Jonathan Neuschäfer, Hitomi Hasegawa,
Paul Menzel, Hector Martin, Arnd Bergmann, Sven Peter, openbmc,
Brian Norris, linux-kernel, Nicolas Ferre, Lubomir Rintel,
Conor Dooley, Robert Jarzmik
[-- Attachment #1: Type: text/plain, Size: 2155 bytes --]
On Thu, Nov 03, 2022 at 09:11:08AM +0200, Tomer Maimon wrote:
> Hi Jonathan,
>
> Thanks for your patch.
>
> On Thu, 3 Nov 2022 at 01:09, Joel Stanley <joel@jms.id.au> wrote:
> >
> > On Mon, 31 Oct 2022 at 22:40, Jonathan Neuschäfer <j.neuschaefer@gmx.net> wrote:
> > >
> > > Add a SoC information driver for Nuvoton WPCM450 SoCs. It provides
> > > information such as the SoC revision.
[...]
> > > +++ 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.
Good point.
> >
> > We also should select REGMAP, as you're using it,
I'll add 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"
That sounds reasonable, I'll do something similar.
> Maybe you should remove
> if ARCH_WPCM450 || COMPILE_TEST
>
> and add ARCH_WPCM450 dependency in the WPCM450_SOCINFO driver configuration.
The WPCM450_SOCINFO driver would build fine on other NPCM SoC, it just
wouldn't be very useful, so I think the current "default y if ARCH_WPCM450"
solution is sufficient.
>
> >
> > 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
Thank you both,
Jonathan
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-11-03 15:45 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-10-31 22:39 [PATCH v5 RESEND] soc: nuvoton: Add SoC info driver for WPCM450 Jonathan Neuschäfer
2022-11-02 23:08 ` Joel Stanley
2022-11-03 7:11 ` Tomer Maimon
2022-11-03 15:45 ` Jonathan Neuschäfer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).