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

Changhuang Liang changhuang.liang at starfivetech.com
Mon Aug 10 22:36:19 PDT 2026


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 at starfivetech.com>
> > ---
> >  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 at kernel.org>
> >  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 at starfivetech.com>
> > @@ -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 at starfivetech.com>
> > +S:	Maintained
> > +F:	drivers/soc/starfive/socinfo/jhb100-socinfo.c
> > +
> >  STARFIVE JHB100 SYSCON
> >  M:	Changhuang Liang <changhuang.liang at starfivetech.com>
> >  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 at starfivetech.com>
> > + */
> > +
> > +#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



More information about the linux-riscv mailing list