All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Andreas Färber" <afaerber@suse.de>
To: linux-realtek-soc@lists.infradead.org
Cc: "Cheng-Yu Lee" <cylee12@realtek.com>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, "Andreas Färber" <afaerber@suse.de>,
	"Ohad Ben-Cohen" <ohad@wizery.com>,
	"Bjorn Andersson" <bjorn.andersson@linaro.org>,
	linux-remoteproc@vger.kernel.org
Subject: [RFC 2/5] hwspinlock: Add Realtek RTD1195 SB2
Date: Mon,  2 Dec 2019 23:05:32 +0100	[thread overview]
Message-ID: <20191202220535.6208-3-afaerber@suse.de> (raw)
In-Reply-To: <20191202220535.6208-1-afaerber@suse.de>

Implement a driver for hardware semaphores found in RTD1195 SoC.
It allows for both per-register instances (SB2_HD_SEM) as well as
contiguous register ranges (SB2_HD_SEM_NEW[0-7]).

While these registers are part of the SB2 syscon, this implementation
does not use syscon, to allow assigning one as SB2 syscon's hwlock.

Cc: Cheng-Yu Lee <cylee12@realtek.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 drivers/hwspinlock/Kconfig           |  11 ++++
 drivers/hwspinlock/Makefile          |   1 +
 drivers/hwspinlock/rtd1195_sb2_sem.c | 101 +++++++++++++++++++++++++++++++++++
 3 files changed, 113 insertions(+)
 create mode 100644 drivers/hwspinlock/rtd1195_sb2_sem.c

diff --git a/drivers/hwspinlock/Kconfig b/drivers/hwspinlock/Kconfig
index 37740e992cfa..9c26c436d399 100644
--- a/drivers/hwspinlock/Kconfig
+++ b/drivers/hwspinlock/Kconfig
@@ -28,6 +28,17 @@ config HWSPINLOCK_QCOM
 
 	  If unsure, say N.
 
+config HWSPINLOCK_RTD1195_SB2
+	tristate "Realtek RTD1195 SB2 Hardware Spinlock device"
+	depends on HWSPINLOCK
+	depends on ARCH_REALTEK || COMPILE_TEST
+	default ARCH_REALTEK
+	help
+	  Say y here to support the Realtek Hardware Semaphore functionality,
+	  found on the RTD1195 and later SoC families.
+
+	  If unsure, say N.
+
 config HWSPINLOCK_SIRF
 	tristate "SIRF Hardware Spinlock device"
 	depends on HWSPINLOCK
diff --git a/drivers/hwspinlock/Makefile b/drivers/hwspinlock/Makefile
index ed053e3f02be..d5bd59412468 100644
--- a/drivers/hwspinlock/Makefile
+++ b/drivers/hwspinlock/Makefile
@@ -6,6 +6,7 @@
 obj-$(CONFIG_HWSPINLOCK)		+= hwspinlock_core.o
 obj-$(CONFIG_HWSPINLOCK_OMAP)		+= omap_hwspinlock.o
 obj-$(CONFIG_HWSPINLOCK_QCOM)		+= qcom_hwspinlock.o
+obj-$(CONFIG_HWSPINLOCK_RTD1195_SB2)	+= rtd1195_sb2_sem.o
 obj-$(CONFIG_HWSPINLOCK_SIRF)		+= sirf_hwspinlock.o
 obj-$(CONFIG_HWSPINLOCK_SPRD)		+= sprd_hwspinlock.o
 obj-$(CONFIG_HWSPINLOCK_STM32)		+= stm32_hwspinlock.o
diff --git a/drivers/hwspinlock/rtd1195_sb2_sem.c b/drivers/hwspinlock/rtd1195_sb2_sem.c
new file mode 100644
index 000000000000..ae925d057874
--- /dev/null
+++ b/drivers/hwspinlock/rtd1195_sb2_sem.c
@@ -0,0 +1,101 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * RTD1195 SB2 hardware semaphore
+ *
+ * Copyright (c) 2019 Andreas Färber
+ */
+
+#include <linux/bitops.h>
+#include <linux/hwspinlock.h>
+#include <linux/idr.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+
+#include "hwspinlock_internal.h"
+
+struct rtd1195_sb2_sem {
+	struct platform_device *pdev;
+	void __iomem *base;
+	int base_id;
+	struct hwspinlock_device lockdev;
+};
+
+static DEFINE_IDR(rtd1195_sb2_sem_idr);
+
+static int rtd1195_sb2_sem_trylock(struct hwspinlock *lock)
+{
+	void __iomem *reg = (void __iomem *)lock->priv;
+
+	return readl_relaxed(reg) & BIT(0);
+}
+
+static void rtd1195_sb2_sem_unlock(struct hwspinlock *lock)
+{
+	void __iomem *reg = (void __iomem *)lock->priv;
+
+	writel_relaxed(0, reg);
+}
+
+static const struct hwspinlock_ops rtd1195_sb2_sem_hwspinlock_ops = {
+	.trylock	= rtd1195_sb2_sem_trylock,
+	.unlock		= rtd1195_sb2_sem_unlock,
+};
+
+static int rtd1195_sb2_sem_probe(struct platform_device *pdev)
+{
+	struct rtd1195_sb2_sem *sem;
+	struct hwspinlock *lock;
+	struct resource *res;
+	int i, num;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -ENOMEM;
+
+	num = resource_size(res) / 4;
+
+	sem = devm_kzalloc(&pdev->dev, sizeof(*sem) + num * sizeof(*lock),
+			   GFP_KERNEL);
+	if (!sem)
+		return -ENOMEM;
+
+	sem->pdev = pdev;
+
+	sem->base = of_iomap(pdev->dev.of_node, 0);
+	if (!sem->base)
+		return -ENOMEM;
+
+	for (i = 0; i < num; i++) {
+		lock = &sem->lockdev.lock[i];
+		lock->priv = sem->base + i * 4;
+	}
+
+	platform_set_drvdata(pdev, sem);
+
+	sem->base_id = idr_alloc(&rtd1195_sb2_sem_idr, sem, 0, 0, GFP_KERNEL);
+
+	return devm_hwspin_lock_register(&pdev->dev, &sem->lockdev,
+		&rtd1195_sb2_sem_hwspinlock_ops, sem->base_id, num);
+}
+
+static const struct of_device_id rtd1195_sb2_sem_dt_ids[] = {
+	{ .compatible = "realtek,rtd1195-sb2-sem" },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, rtd1195_sb2_sem_dt_ids);
+
+static struct platform_driver rtd1195_sb2_sem_platform_driver = {
+	.driver = {
+		.name = "rtd1195-sb2-sem",
+		.of_match_table = rtd1195_sb2_sem_dt_ids,
+	},
+	.probe = rtd1195_sb2_sem_probe,
+};
+module_platform_driver(rtd1195_sb2_sem_platform_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Hardware spinlock driver for Realtek RTD1195 SB2");
+MODULE_AUTHOR("Andreas Färber <afaerber@suse.de>");
-- 
2.16.4

WARNING: multiple messages have this Message-ID (diff)
From: "Andreas Färber" <afaerber@suse.de>
To: linux-realtek-soc@lists.infradead.org
Cc: "Ohad Ben-Cohen" <ohad@wizery.com>,
	"Cheng-Yu Lee" <cylee12@realtek.com>,
	linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org,
	"Bjorn Andersson" <bjorn.andersson@linaro.org>,
	"Andreas Färber" <afaerber@suse.de>,
	linux-arm-kernel@lists.infradead.org
Subject: [RFC 2/5] hwspinlock: Add Realtek RTD1195 SB2
Date: Mon,  2 Dec 2019 23:05:32 +0100	[thread overview]
Message-ID: <20191202220535.6208-3-afaerber@suse.de> (raw)
In-Reply-To: <20191202220535.6208-1-afaerber@suse.de>

Implement a driver for hardware semaphores found in RTD1195 SoC.
It allows for both per-register instances (SB2_HD_SEM) as well as
contiguous register ranges (SB2_HD_SEM_NEW[0-7]).

While these registers are part of the SB2 syscon, this implementation
does not use syscon, to allow assigning one as SB2 syscon's hwlock.

Cc: Cheng-Yu Lee <cylee12@realtek.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
 drivers/hwspinlock/Kconfig           |  11 ++++
 drivers/hwspinlock/Makefile          |   1 +
 drivers/hwspinlock/rtd1195_sb2_sem.c | 101 +++++++++++++++++++++++++++++++++++
 3 files changed, 113 insertions(+)
 create mode 100644 drivers/hwspinlock/rtd1195_sb2_sem.c

diff --git a/drivers/hwspinlock/Kconfig b/drivers/hwspinlock/Kconfig
index 37740e992cfa..9c26c436d399 100644
--- a/drivers/hwspinlock/Kconfig
+++ b/drivers/hwspinlock/Kconfig
@@ -28,6 +28,17 @@ config HWSPINLOCK_QCOM
 
 	  If unsure, say N.
 
+config HWSPINLOCK_RTD1195_SB2
+	tristate "Realtek RTD1195 SB2 Hardware Spinlock device"
+	depends on HWSPINLOCK
+	depends on ARCH_REALTEK || COMPILE_TEST
+	default ARCH_REALTEK
+	help
+	  Say y here to support the Realtek Hardware Semaphore functionality,
+	  found on the RTD1195 and later SoC families.
+
+	  If unsure, say N.
+
 config HWSPINLOCK_SIRF
 	tristate "SIRF Hardware Spinlock device"
 	depends on HWSPINLOCK
diff --git a/drivers/hwspinlock/Makefile b/drivers/hwspinlock/Makefile
index ed053e3f02be..d5bd59412468 100644
--- a/drivers/hwspinlock/Makefile
+++ b/drivers/hwspinlock/Makefile
@@ -6,6 +6,7 @@
 obj-$(CONFIG_HWSPINLOCK)		+= hwspinlock_core.o
 obj-$(CONFIG_HWSPINLOCK_OMAP)		+= omap_hwspinlock.o
 obj-$(CONFIG_HWSPINLOCK_QCOM)		+= qcom_hwspinlock.o
+obj-$(CONFIG_HWSPINLOCK_RTD1195_SB2)	+= rtd1195_sb2_sem.o
 obj-$(CONFIG_HWSPINLOCK_SIRF)		+= sirf_hwspinlock.o
 obj-$(CONFIG_HWSPINLOCK_SPRD)		+= sprd_hwspinlock.o
 obj-$(CONFIG_HWSPINLOCK_STM32)		+= stm32_hwspinlock.o
diff --git a/drivers/hwspinlock/rtd1195_sb2_sem.c b/drivers/hwspinlock/rtd1195_sb2_sem.c
new file mode 100644
index 000000000000..ae925d057874
--- /dev/null
+++ b/drivers/hwspinlock/rtd1195_sb2_sem.c
@@ -0,0 +1,101 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * RTD1195 SB2 hardware semaphore
+ *
+ * Copyright (c) 2019 Andreas Färber
+ */
+
+#include <linux/bitops.h>
+#include <linux/hwspinlock.h>
+#include <linux/idr.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+
+#include "hwspinlock_internal.h"
+
+struct rtd1195_sb2_sem {
+	struct platform_device *pdev;
+	void __iomem *base;
+	int base_id;
+	struct hwspinlock_device lockdev;
+};
+
+static DEFINE_IDR(rtd1195_sb2_sem_idr);
+
+static int rtd1195_sb2_sem_trylock(struct hwspinlock *lock)
+{
+	void __iomem *reg = (void __iomem *)lock->priv;
+
+	return readl_relaxed(reg) & BIT(0);
+}
+
+static void rtd1195_sb2_sem_unlock(struct hwspinlock *lock)
+{
+	void __iomem *reg = (void __iomem *)lock->priv;
+
+	writel_relaxed(0, reg);
+}
+
+static const struct hwspinlock_ops rtd1195_sb2_sem_hwspinlock_ops = {
+	.trylock	= rtd1195_sb2_sem_trylock,
+	.unlock		= rtd1195_sb2_sem_unlock,
+};
+
+static int rtd1195_sb2_sem_probe(struct platform_device *pdev)
+{
+	struct rtd1195_sb2_sem *sem;
+	struct hwspinlock *lock;
+	struct resource *res;
+	int i, num;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -ENOMEM;
+
+	num = resource_size(res) / 4;
+
+	sem = devm_kzalloc(&pdev->dev, sizeof(*sem) + num * sizeof(*lock),
+			   GFP_KERNEL);
+	if (!sem)
+		return -ENOMEM;
+
+	sem->pdev = pdev;
+
+	sem->base = of_iomap(pdev->dev.of_node, 0);
+	if (!sem->base)
+		return -ENOMEM;
+
+	for (i = 0; i < num; i++) {
+		lock = &sem->lockdev.lock[i];
+		lock->priv = sem->base + i * 4;
+	}
+
+	platform_set_drvdata(pdev, sem);
+
+	sem->base_id = idr_alloc(&rtd1195_sb2_sem_idr, sem, 0, 0, GFP_KERNEL);
+
+	return devm_hwspin_lock_register(&pdev->dev, &sem->lockdev,
+		&rtd1195_sb2_sem_hwspinlock_ops, sem->base_id, num);
+}
+
+static const struct of_device_id rtd1195_sb2_sem_dt_ids[] = {
+	{ .compatible = "realtek,rtd1195-sb2-sem" },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, rtd1195_sb2_sem_dt_ids);
+
+static struct platform_driver rtd1195_sb2_sem_platform_driver = {
+	.driver = {
+		.name = "rtd1195-sb2-sem",
+		.of_match_table = rtd1195_sb2_sem_dt_ids,
+	},
+	.probe = rtd1195_sb2_sem_probe,
+};
+module_platform_driver(rtd1195_sb2_sem_platform_driver);
+
+MODULE_LICENSE("GPL");
+MODULE_DESCRIPTION("Hardware spinlock driver for Realtek RTD1195 SB2");
+MODULE_AUTHOR("Andreas Färber <afaerber@suse.de>");
-- 
2.16.4


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2019-12-02 22:05 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-02 22:05 [RFC 0/5] ARM: dts: realtek: SB2 semaphores Andreas Färber
2019-12-02 22:05 ` Andreas Färber
2019-12-02 22:05 ` [RFC 1/5] dt-bindings: hwlock: Add Realtek RTD1195 SB2 Andreas Färber
2019-12-02 22:05   ` Andreas Färber
2019-12-13 23:40   ` Rob Herring
2019-12-13 23:40     ` Rob Herring
2019-12-13 23:40     ` Rob Herring
2019-12-02 22:05 ` Andreas Färber [this message]
2019-12-02 22:05   ` [RFC 2/5] hwspinlock: " Andreas Färber
2019-12-03  8:46   ` Fabien DESSENNE
2019-12-03  8:46     ` Fabien DESSENNE
2019-12-03  8:46     ` Fabien DESSENNE
2019-12-03  8:58     ` Andreas Färber
2019-12-03  8:58       ` Andreas Färber
2019-12-03  8:58       ` Andreas Färber
2019-12-03  9:50       ` Fabien DESSENNE
2019-12-03  9:50         ` Fabien DESSENNE
2019-12-03  9:50         ` Fabien DESSENNE
2019-12-02 22:05 ` [RFC 3/5] ARM: dts: rtd1195: Add SB2 sem nodes Andreas Färber
2019-12-02 22:05   ` Andreas Färber
2019-12-02 22:05 ` [RFC 4/5] arm64: dts: realtek: rtd129x: " Andreas Färber
2019-12-02 22:05   ` Andreas Färber
2019-12-02 22:05 ` [RFC 5/5] arm64: dts: realtek: rtd139x: " Andreas Färber
2019-12-02 22:05   ` Andreas Färber
2019-12-02 23:12   ` Andreas Färber
2019-12-02 23:12     ` Andreas Färber

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=20191202220535.6208-3-afaerber@suse.de \
    --to=afaerber@suse.de \
    --cc=bjorn.andersson@linaro.org \
    --cc=cylee12@realtek.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-realtek-soc@lists.infradead.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=ohad@wizery.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.