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 > --- > 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 > 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 > @@ -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 > +S: Maintained > +F: drivers/soc/starfive/socinfo/jhb100-socinfo.c > + > STARFIVE JHB100 SYSCON > M: Changhuang Liang > 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 > + */ > + > +#define pr_fmt(fmt) "jhb100-socinfo: " fmt > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#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). 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 >