Re: [PATCH v4 7/8] soc: starfive: Add socinfo driver for JHB100 SoC

From: Changhuang Liang

Date: Tue Aug 11 2026 - 01:51:59 EST


Hi, Conor

Thanks for the review.

> On Sat, Aug 08, 2026 at 06:50:53PM -0700, Changhuang Liang wrote:
> > Add socinfo driver for JHB100 SoC. Currently available for
> > distinguishing between the two reversions, A0 and A1.
> >
> > Signed-off-by: Changhuang Liang <changhuang.liang@xxxxxxxxxxxxxxxx>
> > ---
> > MAINTAINERS | 6 ++
> > drivers/soc/Kconfig | 1 +
> > drivers/soc/Makefile | 1 +
> > drivers/soc/starfive/Kconfig | 6 ++
> > drivers/soc/starfive/Makefile | 2 +
> > drivers/soc/starfive/socinfo/Kconfig | 11 +++
> > drivers/soc/starfive/socinfo/Makefile | 2 +
> > drivers/soc/starfive/socinfo/jhb100-socinfo.c | 90
> > +++++++++++++++++++
> > 8 files changed, 119 insertions(+)
> > create mode 100644 drivers/soc/starfive/Kconfig create mode 100644
> > drivers/soc/starfive/Makefile create mode 100644
> > drivers/soc/starfive/socinfo/Kconfig
> > create mode 100644 drivers/soc/starfive/socinfo/Makefile
> > create mode 100644 drivers/soc/starfive/socinfo/jhb100-socinfo.c
> >
> > diff --git a/MAINTAINERS b/MAINTAINERS index
> > cecb4f279160..90919c672d4d 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -26040,6 +26040,7 @@ M: Conor Dooley <conor@xxxxxxxxxx>
> > S: Maintained
> > T: git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
> > F: Documentation/devicetree/bindings/soc/starfive/
> > +F: drivers/soc/starfive/
> >
> > STARFIVE STARLINK PMU DRIVER
> > M: Ji Sheng Teoh <jisheng.teoh@xxxxxxxxxxxxxxxx>
> > @@ -26094,6 +26095,11 @@ S: Maintained
> > F: drivers/reset/starfive/reset-starfive-jhb1*
> > F: include/dt-bindings/reset/starfive,jhb1*.h
> >
> > +STARFIVE JHB100 SOCINFO DRIVER
> > +M: Changhuang Liang <changhuang.liang@xxxxxxxxxxxxxxxx>
> > +S: Maintained
> > +F: drivers/soc/starfive/socinfo/jhb100-socinfo.c
> > +
> > STARFIVE JHB100 SYSCON
> > M: Changhuang Liang <changhuang.liang@xxxxxxxxxxxxxxxx>
> > S: Maintained
> > diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig index
> > a2d65adffb80..b3b01fc38139 100644
> > --- a/drivers/soc/Kconfig
> > +++ b/drivers/soc/Kconfig
> > @@ -24,6 +24,7 @@ source "drivers/soc/renesas/Kconfig"
> > source "drivers/soc/rockchip/Kconfig"
> > source "drivers/soc/samsung/Kconfig"
> > source "drivers/soc/sophgo/Kconfig"
> > +source "drivers/soc/starfive/Kconfig"
> > source "drivers/soc/sunxi/Kconfig"
> > source "drivers/soc/tegra/Kconfig"
> > source "drivers/soc/ti/Kconfig"
> > diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile index
> > c9e689080ceb..009f85ff891a 100644
> > --- a/drivers/soc/Makefile
> > +++ b/drivers/soc/Makefile
> > @@ -30,6 +30,7 @@ obj-y += renesas/
> > obj-y += rockchip/
> > obj-$(CONFIG_SOC_SAMSUNG) += samsung/
> > obj-y += sophgo/
> > +obj-y += starfive/
> > obj-y += sunxi/
> > obj-$(CONFIG_ARCH_TEGRA) += tegra/
> > obj-y += ti/
> > diff --git a/drivers/soc/starfive/Kconfig
> > b/drivers/soc/starfive/Kconfig new file mode 100644 index
> > 000000000000..04b020083d3e
> > --- /dev/null
> > +++ b/drivers/soc/starfive/Kconfig
> > @@ -0,0 +1,6 @@
> > +# SPDX-License-Identifier: GPL-2.0-only menu "StarFive SoC (System On
> > +Chip) specific Drivers"
> > +
> > +source "drivers/soc/starfive/socinfo/Kconfig"
> > +
> > +endmenu
> > diff --git a/drivers/soc/starfive/Makefile
> > b/drivers/soc/starfive/Makefile new file mode 100644 index
> > 000000000000..ca1e609b8104
> > --- /dev/null
> > +++ b/drivers/soc/starfive/Makefile
> > @@ -0,0 +1,2 @@
> > +# SPDX-License-Identifier: GPL-2.0-only obj-y += socinfo/
> > diff --git a/drivers/soc/starfive/socinfo/Kconfig
> > b/drivers/soc/starfive/socinfo/Kconfig
> > new file mode 100644
> > index 000000000000..92bbab62895b
> > --- /dev/null
> > +++ b/drivers/soc/starfive/socinfo/Kconfig
> > @@ -0,0 +1,11 @@
> > +# SPDX-License-Identifier: GPL-2.0-only
> > +
> > +config STARFIVE_JHB100_SOCINFO
> > + bool "StarFive JHB100 SoC Information"
> > + depends on ARCH_STARFIVE || COMPILE_TEST
> > + select SOC_BUS
> > + default y
> > + help
> > + Include support for the SoC bus socinfo for the StarFive JHB100 SoC
> > + platforms to provide information about the SoC family and variant
> > + to user space.
> > diff --git a/drivers/soc/starfive/socinfo/Makefile
> > b/drivers/soc/starfive/socinfo/Makefile
> > new file mode 100644
> > index 000000000000..26c2bdf1de3b
> > --- /dev/null
> > +++ b/drivers/soc/starfive/socinfo/Makefile
> > @@ -0,0 +1,2 @@
> > +# SPDX-License-Identifier: GPL-2.0-only
> > +obj-$(CONFIG_STARFIVE_JHB100_SOCINFO) += jhb100-socinfo.o
> > diff --git a/drivers/soc/starfive/socinfo/jhb100-socinfo.c
> > b/drivers/soc/starfive/socinfo/jhb100-socinfo.c
> > new file mode 100644
> > index 000000000000..638f81ef174c
> > --- /dev/null
> > +++ b/drivers/soc/starfive/socinfo/jhb100-socinfo.c
> > @@ -0,0 +1,90 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/*
> > + * Copyright (C) 2025 StarFive Technology Co., Ltd.
> > + *
> > + * Author: Changhuang Liang <changhuang.liang@xxxxxxxxxxxxxxxx>
> > + */
> > +
> > +#define pr_fmt(fmt) "jhb100-socinfo: " fmt
> > +
> > +#include <linux/bitfield.h>
> > +#include <linux/init.h>
> > +#include <linux/mfd/syscon.h>
> > +#include <linux/of.h>
> > +#include <linux/regmap.h>
> > +#include <linux/slab.h>
> > +#include <linux/string.h>
> > +#include <linux/sys_soc.h>
> > +
> > +#define JHB100_REV_ID 0x38
> > +#define JHB100_REV_ID_CHAR GENMASK(3, 2)
> > +#define JHB100_REV_ID_NUM GENMASK(1, 0)
> > +
> > +static int __init starfive_socinfo_init(void) {
> > + struct soc_device_attribute *attrs;
> > + struct soc_device *soc_dev;
> > + const char *machine = NULL;
> > + struct device_node *np;
> > + struct regmap *regmap;
> > + char rev_char;
> > + u32 rev_id;
> > + int ret;
> > +
> > + np = of_find_compatible_node(NULL, NULL,
> > +"starfive,jhb100-sys0-syscon");
>
> Remind me again why this is not just probed as an mfd cell from the syscon
> driver?
>
> (Hint: please put this info in the commit message).

The discussion result with Krzysztof at that time is recorded here:
https://lore.kernel.org/all/20260405-strong-watchful-marmot-fdfad6@quoll/

One register should not be treated as a separate device node.

>
> Cheers
> Conor.
>
> > + if (!of_device_is_available(np)) {
> > + of_node_put(np);
> > + return -ENODEV;
> > + }
> > +
> > + regmap = syscon_node_to_regmap(np);
> > + if (IS_ERR(regmap)) {
> > + of_node_put(np);
> > + return PTR_ERR(regmap);
> > + }
> > +
> > + ret = regmap_read(regmap, JHB100_REV_ID, &rev_id);
> > + if (ret) {
> > + of_node_put(np);
> > + return ret;
> > + }
> > +
> > + of_node_put(np);
> > +
> > + rev_char = (char)FIELD_GET(JHB100_REV_ID_CHAR, rev_id) + 'A';
> > + rev_id = (u32)FIELD_GET(JHB100_REV_ID_NUM, rev_id);
> > +
> > + attrs = kzalloc_obj(*attrs);
> > + if (!attrs)
> > + return -ENOMEM;
> > +
> > + np = of_find_node_by_path("/");
> > + of_property_read_string(np, "model", &machine);
> > + if (machine)
> > + attrs->machine = kstrdup(machine, GFP_KERNEL);
> > + of_node_put(np);
> > +
> > + attrs->revision = kasprintf(GFP_KERNEL, "%c%u", rev_char, rev_id);
> > + if (!attrs->revision) {
> > + kfree(attrs->machine);
> > + kfree(attrs);
> > + return -ENOMEM;
> > + }
> > +
> > + attrs->family = "JH";
> > + attrs->soc_id = "JHB100";
> > +
> > + soc_dev = soc_device_register(attrs);
> > + if (IS_ERR(soc_dev)) {
> > + kfree(attrs->revision);
> > + kfree(attrs->machine);
> > + kfree(attrs);
> > + return PTR_ERR(soc_dev);
> > + }
> > +
> > + pr_info("StarFive %s SoC rev(%s)\n", attrs->soc_id,
> > +attrs->revision);
> > +
> > + return 0;
> > +}
> > +
> > +subsys_initcall(starfive_socinfo_init);
> > --
> > 2.25.1
> >

Best Regards,
Changhuang