[PATCH v1 8/9] misc: npcm_host_intf: Disable pending KCS/BPC interrupts

Jim Liu jim.t90615 at gmail.com
Tue Aug 5 11:18:49 CEST 2025


If there is an unhandled KCS/BPC pending interrupt after reboot,
the KCS/BPC Linux driver may trigger interrupts immediately upon
registering the irq. However, since the driver is not yet initialized
to handle them, this can lead to unexpected behavior.

To prevent this, disable KCS/BPC interrupts in u-boot to avoid pending
interrupts from being raised before the Linux driver is fully initialized.

Signed-off-by: Stanley Chu <yschu at nuvoton.com>
Signed-off-by: Jim Liu <JJLIU0 at nuvoton.com>
---
 arch/arm/dts/nuvoton-common-npcm8xx.dtsi |  2 +-
 drivers/misc/npcm_host_intf.c            | 21 ++++++++++++++++++++-
 2 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/arch/arm/dts/nuvoton-common-npcm8xx.dtsi b/arch/arm/dts/nuvoton-common-npcm8xx.dtsi
index be06b2a0cae..6866005336f 100644
--- a/arch/arm/dts/nuvoton-common-npcm8xx.dtsi
+++ b/arch/arm/dts/nuvoton-common-npcm8xx.dtsi
@@ -141,7 +141,7 @@
 
 			host_intf: host_intf at 9f000 {
 				compatible = "nuvoton,npcm845-host-intf";
-				reg = <0x9f000 0x1000>;
+				reg = <0x9f000 0x1000>, <0x7000 0x40>;
 				type = "espi";
 				ioaddr = <0x4e>;
 				channel-support = <0xf>;
diff --git a/drivers/misc/npcm_host_intf.c b/drivers/misc/npcm_host_intf.c
index 2c89bd7a167..e3b0663625b 100644
--- a/drivers/misc/npcm_host_intf.c
+++ b/drivers/misc/npcm_host_intf.c
@@ -45,10 +45,20 @@
 #define ESPI_TEN_ENABLE		0x55
 #define ESPI_TEN_DISABLE	0
 
+/* KCS/BPC interrupt control */
+#define BPCFEN			0x46
+#define FRIE			BIT(3)
+#define HRIE			BIT(4)
+#define KCS1CTL			0x18
+#define KCS2CTL			0x2a
+#define KCS3CTL			0x3c
+#define IBFIE			BIT(0)
+#define OBEIE			BIT(1)
+
 static int npcm_host_intf_bind(struct udevice *dev)
 {
 	struct regmap *syscon;
-	void __iomem *base;
+	void __iomem *base, *kcs_base;
 	u32 ch_supp, val;
 	u32 ioaddr;
 	const char *type;
@@ -104,6 +114,15 @@ static int npcm_host_intf_bind(struct udevice *dev)
 	/* Release host wait */
 	setbits_8(SMC_CTL_REG_ADDR, SMC_CTL_HOSTWAIT);
 
+	kcs_base = dev_read_addr_index_ptr(dev, 1);
+	if (kcs_base) {
+		/* Disable KCS/BPC interrupts */
+		clrbits_8(kcs_base + BPCFEN, FRIE | HRIE);
+		clrbits_8(kcs_base + KCS1CTL, IBFIE | OBEIE);
+		clrbits_8(kcs_base + KCS2CTL, IBFIE | OBEIE);
+		clrbits_8(kcs_base + KCS3CTL, IBFIE | OBEIE);
+	}
+
 	return 0;
 }
 
-- 
2.34.1



More information about the U-Boot mailing list