[PATCH v4 7/8] soc: starfive: Add socinfo driver for JHB100 SoC
Changhuang Liang <[email protected]> Sat, 8 Aug 2026 18:50:53 -0700
| Newsgroups | org.kernel.vger.linux-clk,org.infradead.lists.linux-riscv,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Add socinfo driver for JHB100 SoC. Currently available for distinguishing between the two reversions, A0 and A1. Signed-off-by: Changhuang Liang <[email protected]> --- 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 <[email protected]> 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 <[email protected]> @@ -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 <[email protected]> +S: Maintained +F: drivers/soc/starfive/socinfo/jhb100-socinfo.c + STARFIVE JHB100 SYSCON M: Changhuang Liang <[email protected]> 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 <[email protected]> + */ + +#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"); + 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