From: Michael Walle <mwalle@kernel.org>
To: Tom Rini <trini@konsulko.com>, Simon Glass <sjg@chromium.org>
Cc: u-boot@lists.denx.de, Michael Walle <mwalle@kernel.org>
Subject: [PATCH 3/4] sysinfo: add driver for the Kontron SMARC-sAM67 board
Date: Tue, 27 Jan 2026 16:02:32 +0100 [thread overview]
Message-ID: <20260127150401.1177176-4-mwalle@kernel.org> (raw)
In-Reply-To: <20260127150401.1177176-1-mwalle@kernel.org>
The board has 3way strapping pins which are used to encode the board
variants. I.e. if it has a second ethernet interface or which RTC is
available.
Add a driver to query that information. The board code will use that
information to skip any unrelated device tree overlay. In the future,
this can also be used to select the correct base device tree.
Signed-off-by: Michael Walle <mwalle@kernel.org>
---
drivers/sysinfo/Kconfig | 7 ++
drivers/sysinfo/Makefile | 1 +
drivers/sysinfo/sa67.c | 149 +++++++++++++++++++++++++++++++++++++++
include/sysinfo/sa67.h | 21 ++++++
4 files changed, 178 insertions(+)
create mode 100644 drivers/sysinfo/sa67.c
create mode 100644 include/sysinfo/sa67.h
diff --git a/drivers/sysinfo/Kconfig b/drivers/sysinfo/Kconfig
index df83df69ffb..0ba2e249430 100644
--- a/drivers/sysinfo/Kconfig
+++ b/drivers/sysinfo/Kconfig
@@ -31,6 +31,13 @@ config SYSINFO_RCAR3
help
Support querying SoC version information for Renesas R-Car Gen3.
+config SYSINFO_SA67
+ bool "Enable sysinfo driver for the Kontron SMARC-sA67 board"
+ depends on TARGET_J722S_A53_SA67 || TARGET_J722S_R5_SA67
+ help
+ Support querying board strapping options for the Kontron SMARC-sa67
+ board.
+
config SYSINFO_IOT2050
bool "Enable sysinfo driver for the Siemens IOT2050"
depends on TARGET_IOT2050_A53
diff --git a/drivers/sysinfo/Makefile b/drivers/sysinfo/Makefile
index 26ca3150999..541a4456b56 100644
--- a/drivers/sysinfo/Makefile
+++ b/drivers/sysinfo/Makefile
@@ -7,5 +7,6 @@ obj-$(CONFIG_SYSINFO_GAZERBEAM) += gazerbeam.o
obj-$(CONFIG_SYSINFO_GPIO) += gpio.o
obj-$(CONFIG_SYSINFO_IOT2050) += iot2050.o
obj-$(CONFIG_SYSINFO_RCAR3) += rcar3.o
+obj-$(CONFIG_SYSINFO_SA67) += sa67.o
obj-$(CONFIG_SYSINFO_SANDBOX) += sandbox.o
obj-$(CONFIG_SYSINFO_SMBIOS) += smbios.o
diff --git a/drivers/sysinfo/sa67.c b/drivers/sysinfo/sa67.c
new file mode 100644
index 00000000000..1a3b8cd3dc9
--- /dev/null
+++ b/drivers/sysinfo/sa67.c
@@ -0,0 +1,149 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <dm.h>
+#include <log.h>
+#include <sysinfo.h>
+#include <asm/gpio.h>
+#include <sysinfo/sa67.h>
+
+struct sysinfo_sa67_priv {
+ struct gpio_desc brdcfg_gpios[5];
+ struct gpio_desc rev_gpios[2];
+ int revision;
+ int brdcfg;
+};
+
+static int sysinfo_sa67_detect(struct udevice *dev)
+{
+ struct sysinfo_sa67_priv *priv = dev_get_priv(dev);
+ int ret;
+
+ ret = dm_gpio_get_values_as_int_base3_pctrl(dev,
+ priv->rev_gpios,
+ ARRAY_SIZE(priv->rev_gpios));
+ if (ret < 0)
+ return ret;
+
+ priv->revision = ret;
+
+ ret = dm_gpio_get_values_as_int_base3_pctrl(dev,
+ priv->brdcfg_gpios,
+ ARRAY_SIZE(priv->brdcfg_gpios));
+ if (ret < 0)
+ return ret;
+
+ priv->brdcfg = ret;
+
+ return 0;
+}
+
+static int sysinfo_sa67_get_bool(struct udevice *dev, int id, bool *val)
+{
+ struct sysinfo_sa67_priv *priv = dev_get_priv(dev);
+ int c0 = priv->brdcfg % 9;
+ int c1 = (priv->brdcfg / 9) % 9;
+
+ /*
+ * This only supports the preconfigured table mode. There are also
+ * custom board variants on the upper range.
+ */
+ if (priv->brdcfg >= 81)
+ return -ENOENT;
+
+ switch (id) {
+ case BOARD_HAS_GBE1:
+ *val = c0 & 4;
+ break;
+ case BOARD_HAS_RTC_RV3032:
+ *val = !(c1 & 4);
+ break;
+ case BOARD_HAS_RTC_RV8263:
+ *val = c1 & 4;
+ break;
+ case BOARD_HAS_DP0:
+ *val = c1 & 1;
+ break;
+ case BOARD_HAS_DSI1:
+ *val = (c1 & 3) == 2;
+ break;
+ default:
+ return -ENOENT;
+ }
+
+ return 0;
+}
+
+static int sysinfo_sa67_get_int(struct udevice *dev, int id, int *val)
+{
+ struct sysinfo_sa67_priv *priv = dev_get_priv(dev);
+ int c0 = priv->brdcfg % 9;
+
+ if (priv->brdcfg >= 81)
+ return -ENOENT;
+
+ switch (id) {
+ case BOARD_REVISION:
+ *val = priv->revision;
+ break;
+ case BOARD_CFG:
+ *val = priv->brdcfg;
+ break;
+ case BOARD_MEMORY:
+ *val = 1 << (c0 & 3);
+ break;
+ default:
+ return -ENOENT;
+ }
+
+ return 0;
+}
+
+static int sysinfo_sa67_get_str(struct udevice *dev, int id, size_t size, char *val)
+{
+ return -ENOENT;
+};
+
+static const struct sysinfo_ops sysinfo_sa67_ops = {
+ .detect = sysinfo_sa67_detect,
+ .get_bool = sysinfo_sa67_get_bool,
+ .get_int = sysinfo_sa67_get_int,
+ .get_str = sysinfo_sa67_get_str,
+};
+
+static int sysinfo_sa67_probe(struct udevice *dev)
+{
+ struct sysinfo_sa67_priv *priv = dev_get_priv(dev);
+ int ret;
+
+ ret = gpio_request_list_by_name(dev, "revision-gpios", priv->rev_gpios,
+ ARRAY_SIZE(priv->rev_gpios),
+ GPIOD_IS_IN);
+ if (ret != ARRAY_SIZE(priv->rev_gpios)) {
+ debug("could not get revision-gpios (err = %d)\n", ret);
+ return ret;
+ }
+
+ ret = gpio_request_list_by_name(dev, "boardcfg-gpios", priv->brdcfg_gpios,
+ ARRAY_SIZE(priv->brdcfg_gpios),
+ GPIOD_IS_IN);
+ if (ret != ARRAY_SIZE(priv->brdcfg_gpios)) {
+ debug("could not get boardcfg-gpios (err = %d)\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static const struct udevice_id sysinfo_sa67_ids[] = {
+ { .compatible = "kontron,sysinfo-sa67" },
+ {}
+};
+
+U_BOOT_DRIVER(sysinfo_sa67) = {
+ .name = "sysinfo_sa67",
+ .id = UCLASS_SYSINFO,
+ .of_match = sysinfo_sa67_ids,
+ .ops = &sysinfo_sa67_ops,
+ .priv_auto = sizeof(struct sysinfo_sa67_priv),
+ .probe = sysinfo_sa67_probe,
+};
diff --git a/include/sysinfo/sa67.h b/include/sysinfo/sa67.h
new file mode 100644
index 00000000000..28b87268e44
--- /dev/null
+++ b/include/sysinfo/sa67.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+
+#ifndef __SYSINFO_SA67_H
+#define __SYSINFO_SA67_H
+
+#include <sysinfo.h>
+
+enum {
+ BOARD_REVISION = SYSID_BOARD_MODEL,
+ BOARD_CFG = SYSID_USER,
+ BOARD_MEMORY,
+ BOARD_HAS_GBE1,
+ BOARD_HAS_LVDS1,
+ BOARD_HAS_DP0,
+ BOARD_HAS_EDP1,
+ BOARD_HAS_DSI1,
+ BOARD_HAS_RTC_RV3032,
+ BOARD_HAS_RTC_RV8263,
+};
+
+#endif /* __SYSINFO_SA67_H */
--
2.47.3
next prev parent reply other threads:[~2026-01-27 15:04 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-27 15:02 [PATCH 0/4] board: kontron: add initial SMARC-sAM67 support Michael Walle
2026-01-27 15:02 ` [PATCH 1/4] arm64: dts: ti: Add support for Kontron SMARC-sAM67 Michael Walle
2026-01-27 15:02 ` [PATCH 2/4] gpio: 3way strapping: add pinctrl method Michael Walle
2026-01-27 15:02 ` Michael Walle [this message]
2026-01-27 15:02 ` [PATCH 4/4] board: kontron: initial commit for the SMARC-sAM67 Michael Walle
2026-01-28 9:44 ` [PATCH 0/4] board: kontron: add initial SMARC-sAM67 support Michael Walle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260127150401.1177176-4-mwalle@kernel.org \
--to=mwalle@kernel.org \
--cc=sjg@chromium.org \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox