From: Fabien DESSENNE <fabien.dessenne@st.com>
To: "Andreas Färber" <afaerber@suse.de>,
"linux-realtek-soc@lists.infradead.org"
<linux-realtek-soc@lists.infradead.org>
Cc: Cheng-Yu Lee <cylee12@realtek.com>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Ohad Ben-Cohen <ohad@wizery.com>,
"Bjorn Andersson <bjorn.andersson@linaro.org>,
linux-remoteproc@vger.kernel.org"
<linux-remoteproc@vger.kernel.org>
Subject: Re: [RFC 2/5] hwspinlock: Add Realtek RTD1195 SB2
Date: Tue, 3 Dec 2019 08:46:17 +0000 [thread overview]
Message-ID: <14b79ade-e1ae-388f-37de-07d67837de2f@st.com> (raw)
In-Reply-To: <20191202220535.6208-3-afaerber@suse.de>
Hi Andreas
Few comments below.
BR
Fabien
On 02/12/2019 11:05 PM, Andreas Färber wrote:
> 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;
The pdev, base and base_id members of this struct are set in .probe()
but never read anywhere: you may remove them and keep only lockdev
> + 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);
You may use devm_ioremap_resource() here.
> + 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>");
WARNING: multiple messages have this Message-ID (diff)
From: Fabien DESSENNE <fabien.dessenne@st.com>
To: "Andreas Färber" <afaerber@suse.de>,
"linux-realtek-soc@lists.infradead.org"
<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-remoteproc@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: [RFC 2/5] hwspinlock: Add Realtek RTD1195 SB2
Date: Tue, 3 Dec 2019 08:46:17 +0000 [thread overview]
Message-ID: <14b79ade-e1ae-388f-37de-07d67837de2f@st.com> (raw)
In-Reply-To: <20191202220535.6208-3-afaerber@suse.de>
Hi Andreas
Few comments below.
BR
Fabien
On 02/12/2019 11:05 PM, Andreas Färber wrote:
> 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;
The pdev, base and base_id members of this struct are set in .probe()
but never read anywhere: you may remove them and keep only lockdev
> + 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);
You may use devm_ioremap_resource() here.
> + 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>");
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-12-03 8:46 UTC|newest]
Thread overview: 23+ 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 ` [RFC 2/5] hwspinlock: " Andreas Färber
2019-12-02 22:05 ` Andreas Färber
2019-12-03 8:46 ` Fabien DESSENNE [this message]
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 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=14b79ade-e1ae-388f-37de-07d67837de2f@st.com \
--to=fabien.dessenne@st.com \
--cc=afaerber@suse.de \
--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.