* [PATCH v4 1/3] dt-bindings: hwlock: Adding brcmstb-hwspinlock support
2026-02-19 21:56 [PATCH v4 0/3] Adding brcmstb-hwspinlock support Kamal Dasu
@ 2026-02-19 21:57 ` Kamal Dasu
2026-02-20 7:30 ` Krzysztof Kozlowski
2026-02-19 21:57 ` [PATCH v4 2/3] hwspinlock: brcmstb hardware semaphore support Kamal Dasu
2026-02-19 21:57 ` [PATCH v4 3/3] MAINTAINERS: adding entry for BRCMSTB HWSPINLOCK driver Kamal Dasu
2 siblings, 1 reply; 7+ messages in thread
From: Kamal Dasu @ 2026-02-19 21:57 UTC (permalink / raw)
To: andersson, robh, krzk+dt, conor+dt
Cc: baolin.wang, florian.fainelli, bcm-kernel-feedback-list,
linux-remoteproc, devicetree, linux-arm-kernel, linux-kernel,
Kamal Dasu
The Broadcom settop SoCs have hardware semaphores as part of the
"sundry" IP block which has other controls that do not belong anywhere
else e.g. pin/mux controls, SoC identification, drive strength, reset
controls, and other misc bits are part of this block.
Adding brcmstb hwspinlock bindings which allows hwlock driver
to iomap 16 hardware semaphore registers that are part of all
settop SoCs. The bindings use the common
"brcm,brcmstb-sun-top-ctrl-semaphore" compatible string reflecting the
actual hardware register block name.
Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
---
.../hwlock/brcm,brcmstb-hwspinlock.yaml | 45 +++++++++++++++++++
1 file changed, 45 insertions(+)
create mode 100644 Documentation/devicetree/bindings/hwlock/brcm,brcmstb-hwspinlock.yaml
diff --git a/Documentation/devicetree/bindings/hwlock/brcm,brcmstb-hwspinlock.yaml b/Documentation/devicetree/bindings/hwlock/brcm,brcmstb-hwspinlock.yaml
new file mode 100644
index 000000000000..0a9a1bf19fe2
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwlock/brcm,brcmstb-hwspinlock.yaml
@@ -0,0 +1,45 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/hwlock/brcm,brcmstb-hwspinlock.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Broadcom Settop Sundry Block Hardware Semaphore
+
+description:
+ Broadcom settop SoCs contain 16 hardware semaphore registers
+ (SEMAPHORE_0 through SEMAPHORE_15) that provide hardware-arbitrated
+ mutual exclusion between drivers running on the SoC.
+
+ The semaphore registers belong to the sundry hardware block. The
+ node describes the semaphore register range carved out of the larger
+ sundry block address space.
+
+maintainers:
+ - Kamal Dasu <kamal.dasu@broadcom.com>
+
+properties:
+ compatible:
+ const: brcm,brcmstb-sun-top-ctrl-semaphore
+
+ "#hwlock-cells":
+ const: 1
+
+ reg:
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+ - "#hwlock-cells"
+
+additionalProperties: false
+
+examples:
+ - |
+ hwlock@8404038 {
+ compatible = "brcm,brcmstb-sun-top-ctrl-semaphore";
+ reg = <0x8404038 0x40>;
+ #hwlock-cells = <1>;
+ };
+
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v4 2/3] hwspinlock: brcmstb hardware semaphore support
2026-02-19 21:56 [PATCH v4 0/3] Adding brcmstb-hwspinlock support Kamal Dasu
2026-02-19 21:57 ` [PATCH v4 1/3] dt-bindings: hwlock: " Kamal Dasu
@ 2026-02-19 21:57 ` Kamal Dasu
2026-02-19 21:57 ` [PATCH v4 3/3] MAINTAINERS: adding entry for BRCMSTB HWSPINLOCK driver Kamal Dasu
2 siblings, 0 replies; 7+ messages in thread
From: Kamal Dasu @ 2026-02-19 21:57 UTC (permalink / raw)
To: andersson, robh, krzk+dt, conor+dt
Cc: baolin.wang, florian.fainelli, bcm-kernel-feedback-list,
linux-remoteproc, devicetree, linux-arm-kernel, linux-kernel,
Kamal Dasu
Broadcom settop SoCs have common 16 hardware semaphore registers that
can be used as part of the kernel hardware spinlock framework. The
hardware semaphores are part of the 'sundry' ip block that also has
controls like pin/mux controls, SoC identification, drive strength,
reset controls, and other misc bits.
Adding support for brcmstb_hwspinlock that only maps sundry block
registers SUN_TOP_CTRL_SEMAPHORE_[0:15] to implement the hardware
spinlock operations. Change allows other Broadcom settop drivers to
call hwspin_trylock() and hwspin_unlock() interfaces to make use of
hwspinlock framework. Other driver dt nodes just need to provide a
reference to the &hwspinlock and lock id to make use of a particular
hardware lock.
e.g. hwlocks = <&hwspinlock0 0>;
Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
---
drivers/hwspinlock/Kconfig | 11 ++-
drivers/hwspinlock/Makefile | 1 +
drivers/hwspinlock/brcmstb_hwspinlock.c | 96 +++++++++++++++++++++++++
3 files changed, 107 insertions(+), 1 deletion(-)
create mode 100644 drivers/hwspinlock/brcmstb_hwspinlock.c
diff --git a/drivers/hwspinlock/Kconfig b/drivers/hwspinlock/Kconfig
index 3874d15b0e9b..9b7f7bcce14b 100644
--- a/drivers/hwspinlock/Kconfig
+++ b/drivers/hwspinlock/Kconfig
@@ -8,6 +8,16 @@ menuconfig HWSPINLOCK
if HWSPINLOCK
+config HWSPINLOCK_BRCMSTB
+ tristate "Broadcom Settop Hardware Semaphore functionality"
+ depends on ARCH_BRCMSTB || COMPILE_TEST
+ help
+ Broadcom settop hwspinlock driver.
+ Say y here to support the Broadcom Hardware Semaphore functionality, which
+ provides a synchronisation mechanism on the SoC.
+
+ If unsure, say N.
+
config HWSPINLOCK_OMAP
tristate "OMAP Hardware Spinlock device"
depends on ARCH_OMAP4 || SOC_OMAP5 || SOC_DRA7XX || SOC_AM33XX || SOC_AM43XX || ARCH_K3 || COMPILE_TEST
@@ -62,5 +72,4 @@ config HSEM_U8500
SoC.
If unsure, say N.
-
endif # HWSPINLOCK
diff --git a/drivers/hwspinlock/Makefile b/drivers/hwspinlock/Makefile
index a0f16c9aaa82..35f2d94d8ba2 100644
--- a/drivers/hwspinlock/Makefile
+++ b/drivers/hwspinlock/Makefile
@@ -4,6 +4,7 @@
#
obj-$(CONFIG_HWSPINLOCK) += hwspinlock_core.o
+obj-$(CONFIG_HWSPINLOCK_BRCMSTB) += brcmstb_hwspinlock.o
obj-$(CONFIG_HWSPINLOCK_OMAP) += omap_hwspinlock.o
obj-$(CONFIG_HWSPINLOCK_QCOM) += qcom_hwspinlock.o
obj-$(CONFIG_HWSPINLOCK_SPRD) += sprd_hwspinlock.o
diff --git a/drivers/hwspinlock/brcmstb_hwspinlock.c b/drivers/hwspinlock/brcmstb_hwspinlock.c
new file mode 100644
index 000000000000..4488032a3f7f
--- /dev/null
+++ b/drivers/hwspinlock/brcmstb_hwspinlock.c
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * brcmstb HWSEM driver
+ *
+ * Copyright (C) 2025 Broadcom
+ *
+ */
+
+#include <linux/delay.h>
+#include <linux/hwspinlock.h>
+#include <linux/io.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include "hwspinlock_internal.h"
+
+#define BRCMSTB_NUM_SEMAPHORES 16
+#define RESET_SEMAPHORE 0
+
+#define HWSPINLOCK_VAL 'L'
+
+static int brcmstb_hwspinlock_trylock(struct hwspinlock *lock)
+{
+ void __iomem *lock_addr = (void __iomem *)lock->priv;
+
+ writel(HWSPINLOCK_VAL, lock_addr);
+
+ return (readl(lock_addr) == HWSPINLOCK_VAL);
+}
+
+static void brcmstb_hwspinlock_unlock(struct hwspinlock *lock)
+{
+ void __iomem *lock_addr = (void __iomem *)lock->priv;
+
+ /* release the lock by writing 0 to it */
+ writel(RESET_SEMAPHORE, lock_addr);
+}
+
+static void brcmstb_hwspinlock_relax(struct hwspinlock *lock)
+{
+ ndelay(50);
+}
+
+static const struct hwspinlock_ops brcmstb_hwspinlock_ops = {
+ .trylock = brcmstb_hwspinlock_trylock,
+ .unlock = brcmstb_hwspinlock_unlock,
+ .relax = brcmstb_hwspinlock_relax,
+};
+
+static int brcmstb_hwspinlock_probe(struct platform_device *pdev)
+{
+ struct hwspinlock_device *bank;
+ struct hwspinlock *hwlock;
+ void __iomem *io_base;
+ int i, num_locks = BRCMSTB_NUM_SEMAPHORES;
+
+ io_base = devm_platform_ioremap_resource(pdev, 0);
+ if (IS_ERR(io_base)) {
+ dev_err(&pdev->dev, "semaphore iobase mapping error\n");
+ return PTR_ERR(io_base);
+ }
+
+ bank = devm_kzalloc(&pdev->dev, struct_size(bank, lock, num_locks),
+ GFP_KERNEL);
+ if (!bank)
+ return -ENOMEM;
+
+ for (i = 0, hwlock = &bank->lock[0]; i < num_locks; i++, hwlock++)
+ hwlock->priv = (void __iomem *)(io_base + sizeof(u32) * i);
+
+ return devm_hwspin_lock_register(&pdev->dev, bank,
+ &brcmstb_hwspinlock_ops,
+ 0, num_locks);
+}
+
+static const struct of_device_id brcmstb_hwspinlock_ids[] = {
+ { .compatible = "brcm,brcmstb-sun-top-ctrl-semaphore", },
+ { /* end */ },
+};
+MODULE_DEVICE_TABLE(of, brcmstb_hwspinlock_ids);
+
+static struct platform_driver brcmstb_hwspinlock_driver = {
+ .probe = brcmstb_hwspinlock_probe,
+ .driver = {
+ .name = "brcmstb_hwspinlock",
+ .of_match_table = brcmstb_hwspinlock_ids,
+ },
+};
+
+module_platform_driver(brcmstb_hwspinlock_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Hardware Spinlock driver for brcmstb");
+MODULE_AUTHOR("Kamal Dasu <kamal.dasu@broadcom.com>");
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v4 3/3] MAINTAINERS: adding entry for BRCMSTB HWSPINLOCK driver
2026-02-19 21:56 [PATCH v4 0/3] Adding brcmstb-hwspinlock support Kamal Dasu
2026-02-19 21:57 ` [PATCH v4 1/3] dt-bindings: hwlock: " Kamal Dasu
2026-02-19 21:57 ` [PATCH v4 2/3] hwspinlock: brcmstb hardware semaphore support Kamal Dasu
@ 2026-02-19 21:57 ` Kamal Dasu
2 siblings, 0 replies; 7+ messages in thread
From: Kamal Dasu @ 2026-02-19 21:57 UTC (permalink / raw)
To: andersson, robh, krzk+dt, conor+dt
Cc: baolin.wang, florian.fainelli, bcm-kernel-feedback-list,
linux-remoteproc, devicetree, linux-arm-kernel, linux-kernel,
Kamal Dasu
Adding myself to the maintainers list for the hwspinlock
driver on broadcom settop platforms.
Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
---
MAINTAINERS | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index b8d8a5c41597..c5971cbcf087 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5249,6 +5249,14 @@ S: Supported
F: Documentation/devicetree/bindings/gpio/brcm,brcmstb-gpio.yaml
F: drivers/gpio/gpio-brcmstb.c
+BROADCOM BRCMSTB HWSPINLOCK DRIVER
+M: Kamal Dasu <kamal.dasu@broadcom.com>
+R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
+L: linux-remoteproc@vger.kernel.org
+S: Supported
+F: Documentation/devicetree/bindings/hwlock/brcm,brcmstb-hwspinlock.yaml
+F: drivers/hwspinlock/brcmstb_hwspinlock.c
+
BROADCOM BRCMSTB I2C DRIVER
M: Kamal Dasu <kamal.dasu@broadcom.com>
R: Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
--
2.34.1
^ permalink raw reply [flat|nested] 7+ messages in thread