[PATCH 02/11] drivers: misc: pm8916_pon: add glue driver

Sam Day via B4 Relay devnull+me.samcday.com at kernel.org
Sat Jun 6 10:47:33 CEST 2026


From: Sam Day <me at samcday.com>

Initially, this driver binds the existing qcom_pwrkey driver to continue
supporting pwrkey/resin buttons. In follow-up commits it will be further
extended to bind a reboot-mode driver.

The "qcom,pm8916-pon" compatible is removed from qcom_pwrkey, since
pm8916_pon owns it and handles binding qcom_pwrkey.

Signed-off-by: Sam Day <me at samcday.com>
---
 drivers/button/button-qcom-pmic.c |  1 -
 drivers/misc/Kconfig              |  7 ++++
 drivers/misc/Makefile             |  1 +
 drivers/misc/pm8916_pon.c         | 78 +++++++++++++++++++++++++++++++++++++++
 4 files changed, 86 insertions(+), 1 deletion(-)

diff --git a/drivers/button/button-qcom-pmic.c b/drivers/button/button-qcom-pmic.c
index d9ac6a51df5..caa47cd9373 100644
--- a/drivers/button/button-qcom-pmic.c
+++ b/drivers/button/button-qcom-pmic.c
@@ -216,7 +216,6 @@ static const struct button_ops button_qcom_pmic_ops = {
 };
 
 static const struct udevice_id qcom_pwrkey_ids[] = {
-	{ .compatible = "qcom,pm8916-pon" },
 	{ .compatible = "qcom,pm8941-pon" },
 	{ .compatible = "qcom,pm8998-pon" },
 	{ .compatible = "qcom,pmk8350-pon" },
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index ea785793d18..d2e9b833ff7 100644
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -439,6 +439,13 @@ config SPL_PWRSEQ
 	  device. When the device is started up, its power sequence can be
 	  initiated.
 
+config PM8916_PON
+	bool "Enable PM8916 PON driver"
+	depends on PMIC_QCOM && MISC
+	help
+	  The PM8916 PMIC is a multifunction device that handles pwr/resin buttons,
+	  reboot type (soft/hard/poweroff) and reboot mode (recovery/bootloader).
+
 config STM32MP_FUSE
 	bool "Enable STM32MP fuse wrapper providing the fuse API"
 	depends on ARCH_STM32MP && MISC
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index e2170212e5a..6b979ba4289 100644
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -92,3 +92,4 @@ obj-$(CONFIG_K3_BIST) += k3_bist.o
 obj-$(CONFIG_ESM_PMIC) += esm_pmic.o
 obj-$(CONFIG_SL28CPLD) += sl28cpld.o
 obj-$(CONFIG_SPL_SOCFPGA_DT_REG) += socfpga_dtreg.o
+obj-$(CONFIG_PM8916_PON) += pm8916_pon.o
diff --git a/drivers/misc/pm8916_pon.c b/drivers/misc/pm8916_pon.c
new file mode 100644
index 00000000000..d65a7cab459
--- /dev/null
+++ b/drivers/misc/pm8916_pon.c
@@ -0,0 +1,78 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Qualcomm PM8916 PON glue driver
+ *
+ * The PON device handles pwrkey/resin buttons, as well as setting reboot
+ * type and reboot mode. This glue driver binds the respective drivers.
+ */
+
+#include <dm.h>
+#include <dm/lists.h>
+#include <dm/device_compat.h>
+#include <power/pmic.h>
+#include "button/qcom-pmic.h"
+
+#define PON_REV2 0x01
+
+struct pm8916_pon_priv {
+	struct udevice *pmic;
+	phys_addr_t base;
+	u32 revision;
+};
+
+static int pm8916_pon_probe(struct udevice *dev)
+{
+	int ret;
+	struct pm8916_pon_priv *priv = dev_get_priv(dev);
+
+	priv->pmic = dev->parent;
+	if (!priv->pmic) {
+		dev_err(dev, "PMIC driver not found\n");
+		return -EINVAL;
+	}
+
+	priv->base = dev_read_addr(dev);
+
+	if (!priv->base) {
+		dev_err(dev, "missing reg base\n");
+		return -EINVAL;
+	}
+
+	ret = pmic_reg_read(priv->pmic, priv->base + PON_REV2);
+	if (ret < 0) {
+		dev_err(dev, "failed to determine PON rev: %d\n", ret);
+		return ret;
+	}
+
+	priv->revision = ret;
+	dev_dbg(dev, "PON rev: %d\n", priv->revision);
+
+	return 0;
+}
+
+static int pm8916_pon_bind(struct udevice *dev)
+{
+	int ret;
+
+	if (CONFIG_IS_ENABLED(BUTTON_QCOM_PMIC)) {
+		ret = button_qcom_pmic_setup(dev);
+		if (ret)
+			dev_warn(dev, "failed to bind qcom_pwrkey: %d\n", ret);
+	}
+
+	return 0;
+}
+
+static const struct udevice_id pm8916_pon_ids[] = {
+	{ .compatible = "qcom,pm8916-pon" },
+	{},
+};
+
+U_BOOT_DRIVER(pm8916_pon) = {
+	.name = "pm8916_pon",
+	.id = UCLASS_MISC,
+	.of_match = pm8916_pon_ids,
+	.bind = pm8916_pon_bind,
+	.probe = pm8916_pon_probe,
+	.priv_auto = sizeof(struct pm8916_pon_priv),
+};

-- 
2.54.0




More information about the U-Boot mailing list