From: "Álvaro Fernández Rojas" <noltari@gmail.com>
To: p.zabel@pengutronix.de, robh+dt@kernel.org,
tsbogend@alpha.franken.de, f.fainelli@gmail.com,
jonas.gorski@gmail.com, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-mips@vger.kernel.org,
bcm-kernel-feedback-list@broadcom.com
Cc: "Álvaro Fernández Rojas" <noltari@gmail.com>,
"Florian Fainelli" <F.fainelli@gmail.com>
Subject: [PATCH v5 3/9] reset: add BCM6345 reset controller driver
Date: Sun, 14 Jun 2020 10:58:46 +0200 [thread overview]
Message-ID: <20200614085852.2130147-4-noltari@gmail.com> (raw)
In-Reply-To: <20200614085852.2130147-1-noltari@gmail.com>
Add support for resetting blocks through the Linux reset controller
subsystem for BCM63xx SoCs.
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
Reviewed-by: Florian Fainelli <F.fainelli@gmail.com>
---
v5: fix kbuild robot error (drop __init).
v4: no changes.
v3: using reset-simple isn't possible since sleeping after performing the
reset is also needed.
v2: add compatibility to reset-simple instead of adding a new driver.
drivers/reset/Kconfig | 7 ++
drivers/reset/Makefile | 1 +
drivers/reset/reset-bcm6345.c | 135 ++++++++++++++++++++++++++++++++++
3 files changed, 143 insertions(+)
create mode 100644 drivers/reset/reset-bcm6345.c
diff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig
index d9efbfd29646..9f1da978cef6 100644
--- a/drivers/reset/Kconfig
+++ b/drivers/reset/Kconfig
@@ -41,6 +41,13 @@ config RESET_BERLIN
help
This enables the reset controller driver for Marvell Berlin SoCs.
+config RESET_BCM6345
+ bool "BCM6345 Reset Controller"
+ depends on BMIPS_GENERIC || COMPILE_TEST
+ default BMIPS_GENERIC
+ help
+ This enables the reset controller driver for BCM6345 SoCs.
+
config RESET_BRCMSTB
tristate "Broadcom STB reset controller"
depends on ARCH_BRCMSTB || COMPILE_TEST
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index 249ed357c997..e642aae42f0f 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_ARCH_TEGRA) += tegra/
obj-$(CONFIG_RESET_A10SR) += reset-a10sr.o
obj-$(CONFIG_RESET_ATH79) += reset-ath79.o
obj-$(CONFIG_RESET_AXS10X) += reset-axs10x.o
+obj-$(CONFIG_RESET_BCM6345) += reset-bcm6345.o
obj-$(CONFIG_RESET_BERLIN) += reset-berlin.o
obj-$(CONFIG_RESET_BRCMSTB) += reset-brcmstb.o
obj-$(CONFIG_RESET_BRCMSTB_RESCAL) += reset-brcmstb-rescal.o
diff --git a/drivers/reset/reset-bcm6345.c b/drivers/reset/reset-bcm6345.c
new file mode 100644
index 000000000000..e1acb8d9f661
--- /dev/null
+++ b/drivers/reset/reset-bcm6345.c
@@ -0,0 +1,135 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * BCM6345 Reset Controller Driver
+ *
+ * Copyright (C) 2020 Álvaro Fernández Rojas <noltari@gmail.com>
+ */
+
+#include <linux/delay.h>
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/mod_devicetable.h>
+#include <linux/platform_device.h>
+#include <linux/reset-controller.h>
+
+#define BCM6345_RESET_NUM 32
+#define BCM6345_RESET_SLEEP_MIN_US 10000
+#define BCM6345_RESET_SLEEP_MAX_US 20000
+
+struct bcm6345_reset {
+ struct reset_controller_dev rcdev;
+ void __iomem *base;
+ spinlock_t lock;
+};
+
+static void bcm6345_reset_update(struct reset_controller_dev *rcdev,
+ unsigned long id, bool assert)
+{
+ struct bcm6345_reset *bcm6345_reset =
+ container_of(rcdev, struct bcm6345_reset, rcdev);
+ unsigned long flags;
+ uint32_t val;
+
+ spin_lock_irqsave(&bcm6345_reset->lock, flags);
+ val = __raw_readl(bcm6345_reset->base);
+ if (assert)
+ val &= ~BIT(id);
+ else
+ val |= BIT(id);
+ __raw_writel(val, bcm6345_reset->base);
+ spin_unlock_irqrestore(&bcm6345_reset->lock, flags);
+}
+
+static int bcm6345_reset_assert(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ bcm6345_reset_update(rcdev, id, true);
+
+ return 0;
+}
+
+static int bcm6345_reset_deassert(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ bcm6345_reset_update(rcdev, id, false);
+
+ return 0;
+}
+
+static int bcm6345_reset_reset(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ bcm6345_reset_update(rcdev, id, true);
+ usleep_range(BCM6345_RESET_SLEEP_MIN_US,
+ BCM6345_RESET_SLEEP_MAX_US);
+
+ bcm6345_reset_update(rcdev, id, false);
+ usleep_range(BCM6345_RESET_SLEEP_MIN_US,
+ BCM6345_RESET_SLEEP_MAX_US);
+
+ return 0;
+}
+
+static int bcm6345_reset_status(struct reset_controller_dev *rcdev,
+ unsigned long id)
+{
+ struct bcm6345_reset *bcm6345_reset =
+ container_of(rcdev, struct bcm6345_reset, rcdev);
+
+ return !(__raw_readl(bcm6345_reset->base) & BIT(id));
+}
+
+static struct reset_control_ops bcm6345_reset_ops = {
+ .assert = bcm6345_reset_assert,
+ .deassert = bcm6345_reset_deassert,
+ .reset = bcm6345_reset_reset,
+ .status = bcm6345_reset_status,
+};
+
+static int bcm6345_reset_probe(struct platform_device *pdev)
+{
+ struct bcm6345_reset *bcm6345_reset;
+ struct resource *res;
+ int err;
+
+ bcm6345_reset = devm_kzalloc(&pdev->dev,
+ sizeof(*bcm6345_reset), GFP_KERNEL);
+ if (!bcm6345_reset)
+ return -ENOMEM;
+
+ platform_set_drvdata(pdev, bcm6345_reset);
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ bcm6345_reset->base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(bcm6345_reset->base))
+ return PTR_ERR(bcm6345_reset->base);
+
+ spin_lock_init(&bcm6345_reset->lock);
+ bcm6345_reset->rcdev.ops = &bcm6345_reset_ops;
+ bcm6345_reset->rcdev.owner = THIS_MODULE;
+ bcm6345_reset->rcdev.of_node = pdev->dev.of_node;
+ bcm6345_reset->rcdev.of_reset_n_cells = 1;
+ bcm6345_reset->rcdev.nr_resets = BCM6345_RESET_NUM;
+
+ err = devm_reset_controller_register(&pdev->dev,
+ &bcm6345_reset->rcdev);
+ if (err)
+ return err;
+
+ return 0;
+}
+
+static const struct of_device_id bcm6345_reset_of_match[] = {
+ { .compatible = "brcm,bcm6345-reset" },
+ { },
+};
+
+static struct platform_driver bcm6345_reset_driver = {
+ .probe = bcm6345_reset_probe,
+ .driver = {
+ .name = "bcm6345-reset",
+ .of_match_table = bcm6345_reset_of_match,
+ .suppress_bind_attrs = true,
+ },
+};
+builtin_platform_driver(bcm6345_reset_driver);
--
2.27.0
next prev parent reply other threads:[~2020-06-14 8:59 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-09 13:42 [PATCH 0/7] bmips: add bcm6345 reset controller support Álvaro Fernández Rojas
2020-06-09 13:42 ` [PATCH 1/7] mips: bmips: select ARCH_HAS_RESET_CONTROLLER Álvaro Fernández Rojas
2020-06-09 13:42 ` [PATCH 2/7] dt-bindings: reset: add BCM6345 reset controller bindings Álvaro Fernández Rojas
2020-06-09 13:42 ` [PATCH 3/7] reset: add BCM6345 reset controller driver Álvaro Fernández Rojas
2020-06-09 15:06 ` Philipp Zabel
2020-06-09 15:14 ` Álvaro Fernández Rojas
2020-06-09 16:32 ` Philipp Zabel
2020-06-09 16:41 ` Álvaro Fernández Rojas
2020-06-09 20:17 ` Florian Fainelli
2020-06-10 6:08 ` Álvaro Fernández Rojas
2020-06-10 7:28 ` Philipp Zabel
2020-06-09 13:42 ` [PATCH 4/7] mips: bmips: dts: add BCM6328 reset controller support Álvaro Fernández Rojas
2020-06-09 13:42 ` [PATCH 5/7] mips: bmips: dts: add BCM6358 " Álvaro Fernández Rojas
2020-06-09 13:42 ` [PATCH 6/7] mips: bmips: dts: add BCM6362 " Álvaro Fernández Rojas
2020-06-09 13:42 ` [PATCH 7/7] mips: bmips: dts: add BCM6368 " Álvaro Fernández Rojas
2020-06-09 16:02 ` [PATCH v2 0/7] bmips: add bcm6345 " Álvaro Fernández Rojas
2020-06-09 16:02 ` [PATCH v2 1/7] mips: bmips: select ARCH_HAS_RESET_CONTROLLER Álvaro Fernández Rojas
2020-06-10 1:03 ` Florian Fainelli
2020-06-09 16:02 ` [PATCH v2 2/7] dt-bindings: reset: add BCM6345 reset controller bindings Álvaro Fernández Rojas
2020-06-10 1:11 ` Florian Fainelli
2020-06-09 16:02 ` [PATCH v2 3/7] drivers: reset: simple: add BCM6345 reset support Álvaro Fernández Rojas
2020-06-10 1:05 ` Florian Fainelli
2020-06-10 6:06 ` Álvaro Fernández Rojas
2020-06-09 16:02 ` [PATCH v2 4/7] mips: bmips: dts: add BCM6328 reset controller support Álvaro Fernández Rojas
2020-06-10 1:08 ` Florian Fainelli
2020-06-10 6:05 ` Álvaro Fernández Rojas
2020-06-09 16:02 ` [PATCH v2 5/7] mips: bmips: dts: add BCM6358 " Álvaro Fernández Rojas
2020-06-10 1:08 ` Florian Fainelli
2020-06-09 16:02 ` [PATCH v2 6/7] mips: bmips: dts: add BCM6362 " Álvaro Fernández Rojas
2020-06-10 1:09 ` Florian Fainelli
2020-06-09 16:02 ` [PATCH v2 7/7] mips: bmips: dts: add BCM6368 " Álvaro Fernández Rojas
2020-06-10 1:09 ` Florian Fainelli
2020-06-10 17:28 ` [PATCH v3 0/9] bmips: add bcm6345 " Álvaro Fernández Rojas
2020-06-10 17:28 ` [PATCH v3 1/9] mips: bmips: select ARCH_HAS_RESET_CONTROLLER Álvaro Fernández Rojas
2020-06-10 17:28 ` [PATCH v3 2/9] dt-bindings: reset: add BCM6345 reset controller bindings Álvaro Fernández Rojas
2020-06-12 21:57 ` Rob Herring
2020-06-12 22:37 ` Florian Fainelli
2020-06-10 17:28 ` [PATCH v3 3/9] reset: add BCM6345 reset controller driver Álvaro Fernández Rojas
2020-06-10 17:28 ` [PATCH v3 4/9] mips: bmips: dts: add BCM6328 reset controller support Álvaro Fernández Rojas
2020-06-10 17:28 ` [PATCH v3 5/9] mips: bmips: dts: add BCM6358 " Álvaro Fernández Rojas
2020-06-10 17:28 ` [PATCH v3 6/9] mips: bmips: dts: add BCM6362 " Álvaro Fernández Rojas
2020-06-10 17:28 ` [PATCH v3 7/9] mips: bmips: dts: add BCM6368 " Álvaro Fernández Rojas
2020-06-10 17:28 ` [PATCH v3 8/9] mips: bmips: dts: add BCM63268 " Álvaro Fernández Rojas
2020-06-10 17:28 ` [PATCH v3 9/9] mips: bmips: add BCM6318 reset controller definitions Álvaro Fernández Rojas
2020-06-13 8:38 ` [PATCH v4 0/9] bmips: add bcm6345 reset controller support Álvaro Fernández Rojas
2020-06-13 8:38 ` [PATCH v4 1/9] mips: bmips: select ARCH_HAS_RESET_CONTROLLER Álvaro Fernández Rojas
2020-06-13 8:38 ` [PATCH v4 2/9] dt-bindings: reset: add BCM6345 reset controller bindings Álvaro Fernández Rojas
2020-06-13 8:38 ` [PATCH v4 3/9] reset: add BCM6345 reset controller driver Álvaro Fernández Rojas
2020-06-14 3:33 ` kernel test robot
2020-06-14 3:33 ` kernel test robot
2020-06-14 4:52 ` Florian Fainelli
2020-06-13 8:38 ` [PATCH v4 4/9] mips: bmips: dts: add BCM6328 reset controller support Álvaro Fernández Rojas
2020-06-13 8:38 ` [PATCH v4 5/9] mips: bmips: dts: add BCM6358 " Álvaro Fernández Rojas
2020-06-13 8:38 ` [PATCH v4 6/9] mips: bmips: dts: add BCM6362 " Álvaro Fernández Rojas
2020-06-13 8:38 ` [PATCH v4 7/9] mips: bmips: dts: add BCM6368 " Álvaro Fernández Rojas
2020-06-13 8:38 ` [PATCH v4 8/9] mips: bmips: dts: add BCM63268 " Álvaro Fernández Rojas
2020-06-14 4:50 ` Florian Fainelli
2020-06-13 8:38 ` [PATCH v4 9/9] mips: bmips: add BCM6318 reset controller definitions Álvaro Fernández Rojas
2020-06-14 4:51 ` Florian Fainelli
2020-06-14 8:58 ` [PATCH v5 0/9] bmips: add bcm6345 reset controller support Álvaro Fernández Rojas
2020-06-14 8:58 ` [PATCH v5 1/9] mips: bmips: select ARCH_HAS_RESET_CONTROLLER Álvaro Fernández Rojas
2020-06-14 8:58 ` [PATCH v5 2/9] dt-bindings: reset: add BCM6345 reset controller bindings Álvaro Fernández Rojas
2020-06-14 8:58 ` Álvaro Fernández Rojas [this message]
2020-06-14 8:58 ` [PATCH v5 4/9] mips: bmips: dts: add BCM6328 reset controller support Álvaro Fernández Rojas
2020-06-14 8:58 ` [PATCH v5 5/9] mips: bmips: dts: add BCM6358 " Álvaro Fernández Rojas
2020-06-14 8:58 ` [PATCH v5 6/9] mips: bmips: dts: add BCM6362 " Álvaro Fernández Rojas
2020-06-14 8:58 ` [PATCH v5 7/9] mips: bmips: dts: add BCM6368 " Álvaro Fernández Rojas
2020-06-14 8:58 ` [PATCH v5 8/9] mips: bmips: dts: add BCM63268 " Álvaro Fernández Rojas
2020-06-14 8:58 ` [PATCH v5 9/9] mips: bmips: add BCM6318 reset controller definitions Álvaro Fernández Rojas
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=20200614085852.2130147-4-noltari@gmail.com \
--to=noltari@gmail.com \
--cc=bcm-kernel-feedback-list@broadcom.com \
--cc=devicetree@vger.kernel.org \
--cc=f.fainelli@gmail.com \
--cc=jonas.gorski@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=robh+dt@kernel.org \
--cc=tsbogend@alpha.franken.de \
/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.