From: Kamal Dasu <kamal.dasu@broadcom.com>
To: andersson@kernel.org, robh@kernel.org
Cc: krzysztof.kozlowski@linaro.org, conor+dt@kernel.org,
baolin.wang@linux.alibaba.com, florian.fainelli@broadcom.com,
bcm-kernel-feedback-list@broadcom.com,
linux-remoteproc@vger.kernel.org, devicetree@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org,
Kamal Dasu <kamal.dasu@broadcom.com>
Subject: [PATCH v7 2/3] hwspinlock: brcmstb hardware semaphore support
Date: Mon, 27 Apr 2026 16:12:32 -0400 [thread overview]
Message-ID: <20260427201233.380314-3-kamal.dasu@broadcom.com> (raw)
In-Reply-To: <20260427201233.380314-1-kamal.dasu@broadcom.com>
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
next prev parent reply other threads:[~2026-04-27 20:12 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
2026-04-27 20:12 ` [PATCH v7 3/3] MAINTAINERS: adding entry for BRCMSTB HWSPINLOCK driver Kamal Dasu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260427201233.380314-3-kamal.dasu@broadcom.com \
--to=kamal.dasu@broadcom.com \
--cc=andersson@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=florian.fainelli@broadcom.com \
--cc=krzysztof.kozlowski@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=robh@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox