* [PATCH v7 1/3] dt-bindings: hwlock: Adding brcmstb-hwspinlock support
2026-04-27 20:12 [PATCH v7 0/3] Adding brcmstb-hwspinlock support Kamal Dasu
@ 2026-04-27 20:12 ` Kamal Dasu
2026-04-27 20:12 ` [PATCH v7 2/3] hwspinlock: brcmstb hardware semaphore support Kamal Dasu
2026-04-27 20:12 ` [PATCH v7 3/3] MAINTAINERS: adding entry for BRCMSTB HWSPINLOCK driver Kamal Dasu
2 siblings, 0 replies; 4+ messages in thread
From: Kamal Dasu @ 2026-04-27 20:12 UTC (permalink / raw)
To: andersson, robh
Cc: krzysztof.kozlowski, conor+dt, 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 the hwspinlock driver
to iomap only the 16 hardware semaphore registers that are part of all
settop SoCs. The semaphore registers are based on the BCM7038 SoC
where they were first introduced in settop chips.
Signed-off-by: Kamal Dasu <kamal.dasu@broadcom.com>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
---
.../brcm,bcm7038-sun-top-ctrl-semaphore.yaml | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
create mode 100644 Documentation/devicetree/bindings/hwlock/brcm,bcm7038-sun-top-ctrl-semaphore.yaml
diff --git a/Documentation/devicetree/bindings/hwlock/brcm,bcm7038-sun-top-ctrl-semaphore.yaml b/Documentation/devicetree/bindings/hwlock/brcm,bcm7038-sun-top-ctrl-semaphore.yaml
new file mode 100644
index 000000000000..552f334256b5
--- /dev/null
+++ b/Documentation/devicetree/bindings/hwlock/brcm,bcm7038-sun-top-ctrl-semaphore.yaml
@@ -0,0 +1,44 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/hwlock/brcm,bcm7038-sun-top-ctrl-semaphore.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,bcm7038-sun-top-ctrl-semaphore
+
+ "#hwlock-cells":
+ const: 1
+
+ reg:
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+ - "#hwlock-cells"
+
+additionalProperties: false
+
+examples:
+ - |
+ hwlock@404038 {
+ compatible = "brcm,bcm7038-sun-top-ctrl-semaphore";
+ reg = <0x404038 0x40>;
+ #hwlock-cells = <1>;
+ };
--
2.34.1
^ permalink raw reply related [flat|nested] 4+ messages in thread* [PATCH v7 2/3] hwspinlock: brcmstb hardware semaphore support
2026-04-27 20:12 [PATCH v7 0/3] Adding brcmstb-hwspinlock support Kamal Dasu
2026-04-27 20:12 ` [PATCH v7 1/3] dt-bindings: hwlock: " Kamal Dasu
@ 2026-04-27 20:12 ` Kamal Dasu
2026-04-27 20:12 ` [PATCH v7 3/3] MAINTAINERS: adding entry for BRCMSTB HWSPINLOCK driver Kamal Dasu
2 siblings, 0 replies; 4+ messages in thread
From: Kamal Dasu @ 2026-04-27 20:12 UTC (permalink / raw)
To: andersson, robh
Cc: krzysztof.kozlowski, conor+dt, 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 | 10 +++
drivers/hwspinlock/Makefile | 1 +
drivers/hwspinlock/brcmstb_hwspinlock.c | 96 +++++++++++++++++++++++++
3 files changed, 107 insertions(+)
create mode 100644 drivers/hwspinlock/brcmstb_hwspinlock.c
diff --git a/drivers/hwspinlock/Kconfig b/drivers/hwspinlock/Kconfig
index d84e00084ee2..3a81a6785e45 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
diff --git a/drivers/hwspinlock/Makefile b/drivers/hwspinlock/Makefile
index 3a740805949d..379443987b94 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..7a5a35e741f3
--- /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,bcm7038-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 related [flat|nested] 4+ messages in thread* [PATCH v7 3/3] MAINTAINERS: adding entry for BRCMSTB HWSPINLOCK driver
2026-04-27 20:12 [PATCH v7 0/3] Adding brcmstb-hwspinlock support Kamal Dasu
2026-04-27 20:12 ` [PATCH v7 1/3] dt-bindings: hwlock: " Kamal Dasu
2026-04-27 20:12 ` [PATCH v7 2/3] hwspinlock: brcmstb hardware semaphore support Kamal Dasu
@ 2026-04-27 20:12 ` Kamal Dasu
2 siblings, 0 replies; 4+ messages in thread
From: Kamal Dasu @ 2026-04-27 20:12 UTC (permalink / raw)
To: andersson, robh
Cc: krzysztof.kozlowski, conor+dt, 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 2fb1c75afd16..4f3dfc6a090c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -5244,6 +5244,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,bcm7038-sun-top-ctrl-semaphore.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 related [flat|nested] 4+ messages in thread