linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Maxime Coquelin <mcoquelin.stm32@gmail.com>
To: Jonathan Corbet <corbet@lwn.net>,
	Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Ian Campbell <ijc+devicetree@hellion.org.uk>,
	Kumar Gala <galak@codeaurora.org>,
	Philipp Zabel <p.zabel@pengutronix.de>,
	Russell King <linux@arm.linux.org.uk>,
	Daniel Lezcano <daniel.lezcano@linaro.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Linus Walleij <linus.walleij@linaro.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jiri Slaby <jslaby@suse.cz>, Arnd Bergmann <arnd@arndb.de>,
	Andrew Morton <akpm@linux-foundation.org>,
	"David S. Miller" <davem@davemloft.net>,
	Mauro Carvalho Chehab <mchehab@osg.samsung.com>,
	Joe Perches <joe@perches.com>, Antti Palosaari <crope@iki.fi>,
	Tejun Heo <tj@kernel.org>, Will Deacon <will.deacon@arm.com>,
	Nikolay Borisov <Nikolay.Borisov@arm.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Kees Cook <keescook@chromium.org>, Michal Marek <mmarek@suse.cz>,
	linux-doc@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	linux-gpio@vger.kernel.org, linux-serial@vger.kernel.org,
	linux-arch@vger.kernel.org, linux-api@vger.kernel.org
Subject: [PATCH 06/14] drivers: reset: Add STM32 reset driver
Date: Thu, 12 Feb 2015 18:45:56 +0100	[thread overview]
Message-ID: <1423763164-5606-7-git-send-email-mcoquelin.stm32@gmail.com> (raw)
In-Reply-To: <1423763164-5606-1-git-send-email-mcoquelin.stm32@gmail.com>

The STM32 MCUs family IP can be reset by accessing some shared registers.

The specificity is that some reset lines are used by the timers.
At timer initialization time, the timer has to be reset, that's why
we cannot use a regular driver.

Signed-off-by: Maxime Coquelin <mcoquelin.stm32@gmail.com>
---
 .../devicetree/bindings/reset/st,stm32-reset.txt   |  19 ++++
 drivers/reset/Makefile                             |   1 +
 drivers/reset/reset-stm32.c                        | 124 +++++++++++++++++++++
 3 files changed, 144 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/reset/st,stm32-reset.txt
 create mode 100644 drivers/reset/reset-stm32.c

diff --git a/Documentation/devicetree/bindings/reset/st,stm32-reset.txt b/Documentation/devicetree/bindings/reset/st,stm32-reset.txt
new file mode 100644
index 0000000..add1298
--- /dev/null
+++ b/Documentation/devicetree/bindings/reset/st,stm32-reset.txt
@@ -0,0 +1,19 @@
+STMicroelectronics STM32 Peripheral Reset Controller
+====================================================
+
+Please also refer to reset.txt in this directory for common reset
+controller binding usage.
+
+Required properties:
+- compatible: Should be "st,stm32-reset"
+- reg: should be register base and length as documented in the
+  datasheet
+- #reset-cells: 1, see below
+
+example:
+
+reset_ahb1: reset@40023810 {
+	#reset-cells = <1>;
+	compatible = "st,stm32-reset";
+	reg = <0x40023810 0x4>;
+};
diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
index 157d421..aed12d1 100644
--- a/drivers/reset/Makefile
+++ b/drivers/reset/Makefile
@@ -1,5 +1,6 @@
 obj-$(CONFIG_RESET_CONTROLLER) += core.o
 obj-$(CONFIG_ARCH_SOCFPGA) += reset-socfpga.o
 obj-$(CONFIG_ARCH_BERLIN) += reset-berlin.o
+obj-$(CONFIG_ARCH_STM32) += reset-stm32.o
 obj-$(CONFIG_ARCH_SUNXI) += reset-sunxi.o
 obj-$(CONFIG_ARCH_STI) += sti/
diff --git a/drivers/reset/reset-stm32.c b/drivers/reset/reset-stm32.c
new file mode 100644
index 0000000..7a96677
--- /dev/null
+++ b/drivers/reset/reset-stm32.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) Maxime Coquelin 2015
+ * Author:  Maxime Coquelin <mcoquelin.stm32@gmail.com>
+ * License terms:  GNU General Public License (GPL), version 2
+ *
+ * Heavily based on sunxi driver from Maxime Ripard.
+ */
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/reset-controller.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+
+struct stm32_reset_data {
+	spinlock_t			lock;
+	void __iomem			*membase;
+	struct reset_controller_dev	rcdev;
+};
+
+static int stm32_reset_assert(struct reset_controller_dev *rcdev,
+			      unsigned long id)
+{
+	struct stm32_reset_data *data = container_of(rcdev,
+						     struct stm32_reset_data,
+						     rcdev);
+	int bank = id / BITS_PER_LONG;
+	int offset = id % BITS_PER_LONG;
+	unsigned long flags;
+	u32 reg;
+
+	spin_lock_irqsave(&data->lock, flags);
+
+	reg = readl_relaxed(data->membase + (bank * 4));
+	writel_relaxed(reg | BIT(offset), data->membase + (bank * 4));
+
+	spin_unlock_irqrestore(&data->lock, flags);
+
+	return 0;
+}
+
+static int stm32_reset_deassert(struct reset_controller_dev *rcdev,
+				unsigned long id)
+{
+	struct stm32_reset_data *data = container_of(rcdev,
+						     struct stm32_reset_data,
+						     rcdev);
+	int bank = id / BITS_PER_LONG;
+	int offset = id % BITS_PER_LONG;
+	unsigned long flags;
+	u32 reg;
+
+	spin_lock_irqsave(&data->lock, flags);
+
+	reg = readl_relaxed(data->membase + (bank * 4));
+	writel_relaxed(reg & ~BIT(offset), data->membase + (bank * 4));
+
+	spin_unlock_irqrestore(&data->lock, flags);
+
+	return 0;
+}
+
+static struct reset_control_ops stm32_reset_ops = {
+	.assert		= stm32_reset_assert,
+	.deassert	= stm32_reset_deassert,
+};
+
+static void stm32_reset_init(struct device_node *np)
+{
+	struct stm32_reset_data *data;
+	struct resource res;
+	resource_size_t size;
+	int err;
+
+	data = kzalloc(sizeof(*data), GFP_KERNEL);
+	if (!data)
+		return;
+
+	err = of_address_to_resource(np, 0, &res);
+	if (err)
+		goto err_alloc;
+
+	size = resource_size(&res);
+	if (!request_mem_region(res.start, size, np->name)) {
+		err = -EINVAL;
+		goto err_alloc;
+	}
+
+	data->membase = ioremap(res.start, size);
+	if (!data->membase) {
+		err = -ENOMEM;
+		goto err_alloc;
+	}
+
+	spin_lock_init(&data->lock);
+
+	data->rcdev.owner = THIS_MODULE;
+	data->rcdev.nr_resets = size * 8;
+	data->rcdev.ops = &stm32_reset_ops;
+	data->rcdev.of_node = np;
+
+	err = reset_controller_register(&data->rcdev);
+	if (err)
+		goto err_iomap;
+
+	pr_info("%s: %d reset lines registered\n", np->full_name,
+			data->rcdev.nr_resets);
+	return;
+
+err_iomap:
+	iounmap(data->membase);
+err_alloc:
+	kfree(data);
+	pr_err("%s: Reset ctrl registration failed (%d).\n",
+			np->full_name, err);
+}
+
+RESET_CONTROLLER_OF_DECLARE(stm32, "st,stm32-reset", stm32_reset_init);
+
-- 
1.9.1


  parent reply	other threads:[~2015-02-12 19:22 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-12 17:45 [PATCH 00/14] Add support to STMicroelectronics STM32 family Maxime Coquelin
2015-02-12 17:45 ` [PATCH 01/14] scripts: link-vmlinux: Don't pass page offset to kallsyms if XIP Kernel Maxime Coquelin
2015-02-12 17:45 ` [PATCH 02/14] ARM: ARMv7M: Enlarge vector table to 256 entries Maxime Coquelin
2015-02-12 20:34   ` Geert Uytterhoeven
2015-02-13  8:42     ` Maxime Coquelin
2015-02-13 10:00       ` Uwe Kleine-König
2015-02-15 14:34         ` Maxime Coquelin
2015-02-15 22:42       ` Rob Herring
2015-02-19 16:13         ` Maxime Coquelin
2015-02-19 16:35           ` Rob Herring
2015-02-12 17:45 ` [PATCH 03/14] clocksource: Add ARM System timer driver Maxime Coquelin
2015-02-15 22:31   ` Rob Herring
2015-02-16 12:08     ` Maxime Coquelin
2015-02-15 23:43   ` Andreas Färber
2015-02-16 12:21     ` Maxime Coquelin
2015-02-12 17:45 ` [PATCH 04/14] reset: Add reset_controller_of_init() function Maxime Coquelin
2015-02-13 11:49   ` Philipp Zabel
2015-02-13 16:00     ` Maxime Coquelin
2015-02-12 17:45 ` [PATCH 05/14] ARM: call reset_controller_of_init from default time_init handler Maxime Coquelin
2015-02-15 22:17   ` Rob Herring
2015-02-15 23:12     ` Russell King - ARM Linux
2015-02-16 15:48       ` Rob Herring
2015-02-16 12:02     ` Maxime Coquelin
2015-02-12 17:45 ` Maxime Coquelin [this message]
2015-02-15 23:59   ` [PATCH 06/14] drivers: reset: Add STM32 reset driver Andreas Färber
2015-02-16 12:25     ` Maxime Coquelin
2015-02-12 17:45 ` [PATCH 07/14] clockevent: Add STM32 Timer driver Maxime Coquelin
2015-03-06  8:57   ` Linus Walleij
2015-02-12 17:45 ` [PATCH 08/14] pinctrl: Add pinctrl driver for STM32 MCUs Maxime Coquelin
2015-02-12 20:37   ` Geert Uytterhoeven
2015-02-13  8:43     ` Maxime Coquelin
2015-02-12 17:45 ` [PATCH 09/14] serial: stm32-usart: Add STM32 USART Driver Maxime Coquelin
2015-02-12 17:46 ` [PATCH 10/14] ARM: Add STM32 family machine Maxime Coquelin
2015-02-12 17:46 ` [PATCH 11/14] ARM: dts: Add ARM System timer as clockevent in armv7m Maxime Coquelin
2015-02-12 17:46 ` [PATCH 12/14] ARM: dts: Introduce STM32F429 MCU Maxime Coquelin
2015-02-13 11:47   ` Philipp Zabel
2015-02-13 15:59     ` Maxime Coquelin
2015-02-13 16:25       ` Philipp Zabel
2015-02-13 16:41         ` Maxime Coquelin
2015-02-13 19:18           ` Philipp Zabel
2015-02-15 14:36             ` Maxime Coquelin
2015-02-12 17:46 ` [PATCH 13/14] ARM: configs: Add STM32 defconfig Maxime Coquelin
2015-02-12 17:46 ` [PATCH 14/14] MAINTAINERS: Add entry for STM32 MCUs Maxime Coquelin
2015-03-06  9:03   ` Linus Walleij
2015-03-06  9:55     ` Maxime Coquelin
2015-03-09 16:47       ` Linus Walleij
2015-03-09 17:01         ` Maxime Coquelin
2015-02-15 15:14 ` [PATCH 00/14] Add support to STMicroelectronics STM32 family Andreas Färber
2015-02-16 11:52   ` Maxime Coquelin

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=1423763164-5606-7-git-send-email-mcoquelin.stm32@gmail.com \
    --to=mcoquelin.stm32@gmail.com \
    --cc=Nikolay.Borisov@arm.com \
    --cc=akpm@linux-foundation.org \
    --cc=arnd@arndb.de \
    --cc=corbet@lwn.net \
    --cc=crope@iki.fi \
    --cc=daniel.lezcano@linaro.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=galak@codeaurora.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=ijc+devicetree@hellion.org.uk \
    --cc=joe@perches.com \
    --cc=jslaby@suse.cz \
    --cc=keescook@chromium.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=mark.rutland@arm.com \
    --cc=mchehab@osg.samsung.com \
    --cc=mmarek@suse.cz \
    --cc=p.zabel@pengutronix.de \
    --cc=pawel.moll@arm.com \
    --cc=robh+dt@kernel.org \
    --cc=rusty@rustcorp.com.au \
    --cc=tglx@linutronix.de \
    --cc=tj@kernel.org \
    --cc=will.deacon@arm.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).