[PATCH 1/4] ipmi: bt-bmc: Use bitfield helpers for register definitions
From: Yu-Che Hsieh via B4 Relay
Date: Mon Jun 29 2026 - 02:52:56 EST
From: Yu-Che Hsieh <yc_hsieh@xxxxxxxxxxxxxx>
Use BIT(), GENMASK(), and FIELD_PREP() for the BT register definitions
and register field programming.
This makes the register layout easier to read and prepares the driver
for later changes that need to program the BT_CR0 fields from device
configuration.
Signed-off-by: Yu-Che Hsieh <yc_hsieh@xxxxxxxxxxxxxx>
---
drivers/char/ipmi/bt-bmc.c | 72 ++++++++++++++++++++++++----------------------
1 file changed, 37 insertions(+), 35 deletions(-)
diff --git a/drivers/char/ipmi/bt-bmc.c b/drivers/char/ipmi/bt-bmc.c
index a179d4797011..f3c67272502f 100644
--- a/drivers/char/ipmi/bt-bmc.c
+++ b/drivers/char/ipmi/bt-bmc.c
@@ -15,6 +15,7 @@
#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/timer.h>
+#include <linux/bitfield.h>
/*
* This is a BMC device used to communicate to the host
@@ -24,33 +25,34 @@
#define BT_IO_BASE 0xe4
#define BT_IRQ 10
-#define BT_CR0 0x0
-#define BT_CR0_IO_BASE 16
-#define BT_CR0_IRQ 12
-#define BT_CR0_EN_CLR_SLV_RDP 0x8
-#define BT_CR0_EN_CLR_SLV_WRP 0x4
-#define BT_CR0_ENABLE_IBT 0x1
-#define BT_CR1 0x4
-#define BT_CR1_IRQ_H2B 0x01
-#define BT_CR1_IRQ_HBUSY 0x40
-#define BT_CR2 0x8
-#define BT_CR2_IRQ_H2B 0x01
-#define BT_CR2_IRQ_HBUSY 0x40
-#define BT_CR3 0xc
-#define BT_CTRL 0x10
-#define BT_CTRL_B_BUSY 0x80
-#define BT_CTRL_H_BUSY 0x40
-#define BT_CTRL_OEM0 0x20
-#define BT_CTRL_SMS_ATN 0x10
-#define BT_CTRL_B2H_ATN 0x08
-#define BT_CTRL_H2B_ATN 0x04
-#define BT_CTRL_CLR_RD_PTR 0x02
-#define BT_CTRL_CLR_WR_PTR 0x01
-#define BT_BMC2HOST 0x14
-#define BT_INTMASK 0x18
-#define BT_INTMASK_B2H_IRQEN 0x01
-#define BT_INTMASK_B2H_IRQ 0x02
-#define BT_INTMASK_BMC_HWRST 0x80
+#define BT_CR0 0x0
+#define BT_CR0_IO_BASE GENMASK(31, 16)
+#define BT_CR0_SIRQ GENMASK(15, 12)
+#define BT_CR0_SIRQ_TYPE GENMASK(11, 10)
+#define BT_CR0_EN_CLR_SLV_RDP BIT(3)
+#define BT_CR0_EN_CLR_SLV_WRP BIT(2)
+#define BT_CR0_ENABLE_IBT BIT(0)
+#define BT_CR1 0x4
+#define BT_CR1_IRQ_EN_HBUSY BIT(6)
+#define BT_CR1_IRQ_EN_H2B BIT(0)
+#define BT_CR2 0x8
+#define BT_CR2_IRQ_STS_HBUSY BIT(6)
+#define BT_CR2_IRQ_STS_H2B BIT(0)
+#define BT_CR3 0xc
+#define BT_CTRL 0x10
+#define BT_CTRL_B_BUSY BIT(7)
+#define BT_CTRL_H_BUSY BIT(6)
+#define BT_CTRL_OEM0 BIT(5)
+#define BT_CTRL_SMS_ATN BIT(4)
+#define BT_CTRL_B2H_ATN BIT(3)
+#define BT_CTRL_H2B_ATN BIT(2)
+#define BT_CTRL_CLR_RD_PTR BIT(1)
+#define BT_CTRL_CLR_WR_PTR BIT(0)
+#define BT_BMC2HOST 0x14
+#define BT_INTMASK 0x18
+#define BT_INTMASK_BMC_HWRST BIT(7)
+#define BT_INTMASK_B2H_IRQ BIT(1)
+#define BT_INTMASK_B2H_IRQEN BIT(0)
#define BT_BMC_BUFFER_SIZE 256
@@ -361,7 +363,7 @@ static irqreturn_t bt_bmc_irq(int irq, void *arg)
reg = readl(bt_bmc->base + BT_CR2);
- reg &= BT_CR2_IRQ_H2B | BT_CR2_IRQ_HBUSY;
+ reg &= BT_CR2_IRQ_STS_H2B | BT_CR2_IRQ_STS_HBUSY;
if (!reg)
return IRQ_NONE;
@@ -398,7 +400,7 @@ static int bt_bmc_config_irq(struct bt_bmc *bt_bmc,
* message to the BT buffer
*/
reg = readl(bt_bmc->base + BT_CR1);
- reg |= BT_CR1_IRQ_H2B | BT_CR1_IRQ_HBUSY;
+ reg |= BT_CR1_IRQ_EN_H2B | BT_CR1_IRQ_EN_HBUSY;
writel(reg, bt_bmc->base + BT_CR1);
return 0;
@@ -447,12 +449,12 @@ static int bt_bmc_probe(struct platform_device *pdev)
add_timer(&bt_bmc->poll_timer);
}
- writel((BT_IO_BASE << BT_CR0_IO_BASE) |
- (BT_IRQ << BT_CR0_IRQ) |
- BT_CR0_EN_CLR_SLV_RDP |
- BT_CR0_EN_CLR_SLV_WRP |
- BT_CR0_ENABLE_IBT,
- bt_bmc->base + BT_CR0);
+ writel(FIELD_PREP(BT_CR0_IO_BASE, BT_IO_BASE) |
+ FIELD_PREP(BT_CR0_SIRQ, BT_IRQ) |
+ BT_CR0_EN_CLR_SLV_RDP |
+ BT_CR0_EN_CLR_SLV_WRP |
+ BT_CR0_ENABLE_IBT,
+ bt_bmc->base + BT_CR0);
clr_b_busy(bt_bmc);
--
2.34.1