From: sebastian.hesselbarth@gmail.com (Sebastian Hesselbarth)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 1/9] reset: add the Berlin reset controller driver
Date: Mon, 09 Jun 2014 12:32:50 +0200 [thread overview]
Message-ID: <53958D52.2050402@gmail.com> (raw)
In-Reply-To: <1401983326-19205-2-git-send-email-antoine.tenart@free-electrons.com>
On 06/05/2014 05:48 PM, Antoine T?nart wrote:
> Add a reset controller for Marvell Berlin SoCs which is used by the
> USB PHYs drivers (for now).
>
> Signed-off-by: Antoine T?nart <antoine.tenart@free-electrons.com>
> ---
> drivers/reset/Makefile | 1 +
> drivers/reset/reset-berlin.c | 113 +++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 114 insertions(+)
> create mode 100644 drivers/reset/reset-berlin.c
>
> diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
> index 4f60caf750ce..fffe2a3dd255 100644
> --- a/drivers/reset/Makefile
> +++ b/drivers/reset/Makefile
> @@ -1,3 +1,4 @@
> obj-$(CONFIG_RESET_CONTROLLER) += core.o
> +obj-$(CONFIG_ARCH_BERLIN) += reset-berlin.o
> obj-$(CONFIG_ARCH_SUNXI) += reset-sunxi.o
> obj-$(CONFIG_ARCH_STI) += sti/
> diff --git a/drivers/reset/reset-berlin.c b/drivers/reset/reset-berlin.c
> new file mode 100644
> index 000000000000..78b42c882cb2
> --- /dev/null
> +++ b/drivers/reset/reset-berlin.c
> @@ -0,0 +1,113 @@
> +/*
> + * Copyright (C) 2014 Marvell Technology Group Ltd.
> + *
> + * Antoine T?nart <antoine.tenart@free-electrons.com>
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +
> +#include <linux/delay.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>
> +
> +#define BERLIN_RESET_REGISTER 0x104
> +
> +#define to_berlin_reset_priv(p) \
> + container_of((p), struct berlin_reset_priv, rcdev)
> +
> +struct berlin_reset_priv {
> + spinlock_t lock;
> + void __iomem *base;
> + struct reset_controller_dev rcdev;
> +};
> +
> +static int berlin_reset_reset(struct reset_controller_dev *rcdev,
> + unsigned long id)
> +{
> + struct berlin_reset_priv *priv = to_berlin_reset_priv(rcdev);
> + unsigned long flags;
> + int bank = id / BITS_PER_LONG;
> + int offset = id % BITS_PER_LONG;
> +
> + spin_lock_irqsave(&priv->lock, flags);
> +
> + writel(BIT(offset), priv->base + bank * 4);
> +
> + spin_unlock_irqrestore(&priv->lock, flags);
> +
> + /* let the reset be effective */
> + udelay(10);
> +
> + return 0;
> +}
> +
> +static struct reset_control_ops berlin_reset_ops = {
> + .reset = berlin_reset_reset,
> +};
> +
> +static int __berlin_reset_init(struct device_node *np)
> +{
> + struct berlin_reset_priv *priv;
> + struct resource res;
> + resource_size_t size;
> + int ret;
> +
> + priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> + if (!priv)
> + return -ENOMEM;
> +
> + ret = of_address_to_resource(np, 0, &res);
> + if (ret)
> + goto err;
> +
> + size = resource_size(&res);
> +
> + priv->base = ioremap(res.start, size);
> + if (!priv->base) {
> + ret = -ENOMEM;
> + goto err;
> + }
> + priv->base += BERLIN_RESET_REGISTER;
I currently have no way to look it up myself, but is reset API providing
a way to deal with phandle+specifier with more than one parameter?
Chip-ctrl has a bunch of other reset bits spread over the regset, having
the offset encoded in the specifier would save us some SoC specific
boiler plate, i.e.
reset = <&chip 0x104 14>;
Sebastian
> + priv->rcdev.owner = THIS_MODULE;
> + priv->rcdev.nr_resets = size * 32;
> + priv->rcdev.ops = &berlin_reset_ops;
> + priv->rcdev.of_node = np;
> +
> + reset_controller_register(&priv->rcdev);
> +
> + return 0;
> +
> +err:
> + kfree(priv);
> + return ret;
> +}
> +
> +static const struct of_device_id berlin_reset_of_match[] __initdata = {
> + { .compatible = "marvell,berlin2q-chip-ctrl" },
> + { },
> +};
> +
> +static int __init berlin_reset_init(void)
> +{
> + struct device_node *np;
> + int ret;
> +
> + for_each_matching_node(np, berlin_reset_of_match) {
> + ret = __berlin_reset_init(np);
> + if (ret)
> + return ret;
> + }
> +
> + return 0;
> +}
> +arch_initcall(berlin_reset_init);
>
WARNING: multiple messages have this Message-ID (diff)
From: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
To: "Antoine Ténart" <antoine.tenart@free-electrons.com>,
p.zabel@pengutronix.de
Cc: alexandre.belloni@free-electrons.com,
thomas.petazzoni@free-electrons.com, zmxu@marvell.com,
jszhang@marvell.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 1/9] reset: add the Berlin reset controller driver
Date: Mon, 09 Jun 2014 12:32:50 +0200 [thread overview]
Message-ID: <53958D52.2050402@gmail.com> (raw)
In-Reply-To: <1401983326-19205-2-git-send-email-antoine.tenart@free-electrons.com>
On 06/05/2014 05:48 PM, Antoine Ténart wrote:
> Add a reset controller for Marvell Berlin SoCs which is used by the
> USB PHYs drivers (for now).
>
> Signed-off-by: Antoine Ténart <antoine.tenart@free-electrons.com>
> ---
> drivers/reset/Makefile | 1 +
> drivers/reset/reset-berlin.c | 113 +++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 114 insertions(+)
> create mode 100644 drivers/reset/reset-berlin.c
>
> diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile
> index 4f60caf750ce..fffe2a3dd255 100644
> --- a/drivers/reset/Makefile
> +++ b/drivers/reset/Makefile
> @@ -1,3 +1,4 @@
> obj-$(CONFIG_RESET_CONTROLLER) += core.o
> +obj-$(CONFIG_ARCH_BERLIN) += reset-berlin.o
> obj-$(CONFIG_ARCH_SUNXI) += reset-sunxi.o
> obj-$(CONFIG_ARCH_STI) += sti/
> diff --git a/drivers/reset/reset-berlin.c b/drivers/reset/reset-berlin.c
> new file mode 100644
> index 000000000000..78b42c882cb2
> --- /dev/null
> +++ b/drivers/reset/reset-berlin.c
> @@ -0,0 +1,113 @@
> +/*
> + * Copyright (C) 2014 Marvell Technology Group Ltd.
> + *
> + * Antoine Ténart <antoine.tenart@free-electrons.com>
> + *
> + * This file is licensed under the terms of the GNU General Public
> + * License version 2. This program is licensed "as is" without any
> + * warranty of any kind, whether express or implied.
> + */
> +
> +#include <linux/delay.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>
> +
> +#define BERLIN_RESET_REGISTER 0x104
> +
> +#define to_berlin_reset_priv(p) \
> + container_of((p), struct berlin_reset_priv, rcdev)
> +
> +struct berlin_reset_priv {
> + spinlock_t lock;
> + void __iomem *base;
> + struct reset_controller_dev rcdev;
> +};
> +
> +static int berlin_reset_reset(struct reset_controller_dev *rcdev,
> + unsigned long id)
> +{
> + struct berlin_reset_priv *priv = to_berlin_reset_priv(rcdev);
> + unsigned long flags;
> + int bank = id / BITS_PER_LONG;
> + int offset = id % BITS_PER_LONG;
> +
> + spin_lock_irqsave(&priv->lock, flags);
> +
> + writel(BIT(offset), priv->base + bank * 4);
> +
> + spin_unlock_irqrestore(&priv->lock, flags);
> +
> + /* let the reset be effective */
> + udelay(10);
> +
> + return 0;
> +}
> +
> +static struct reset_control_ops berlin_reset_ops = {
> + .reset = berlin_reset_reset,
> +};
> +
> +static int __berlin_reset_init(struct device_node *np)
> +{
> + struct berlin_reset_priv *priv;
> + struct resource res;
> + resource_size_t size;
> + int ret;
> +
> + priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> + if (!priv)
> + return -ENOMEM;
> +
> + ret = of_address_to_resource(np, 0, &res);
> + if (ret)
> + goto err;
> +
> + size = resource_size(&res);
> +
> + priv->base = ioremap(res.start, size);
> + if (!priv->base) {
> + ret = -ENOMEM;
> + goto err;
> + }
> + priv->base += BERLIN_RESET_REGISTER;
I currently have no way to look it up myself, but is reset API providing
a way to deal with phandle+specifier with more than one parameter?
Chip-ctrl has a bunch of other reset bits spread over the regset, having
the offset encoded in the specifier would save us some SoC specific
boiler plate, i.e.
reset = <&chip 0x104 14>;
Sebastian
> + priv->rcdev.owner = THIS_MODULE;
> + priv->rcdev.nr_resets = size * 32;
> + priv->rcdev.ops = &berlin_reset_ops;
> + priv->rcdev.of_node = np;
> +
> + reset_controller_register(&priv->rcdev);
> +
> + return 0;
> +
> +err:
> + kfree(priv);
> + return ret;
> +}
> +
> +static const struct of_device_id berlin_reset_of_match[] __initdata = {
> + { .compatible = "marvell,berlin2q-chip-ctrl" },
> + { },
> +};
> +
> +static int __init berlin_reset_init(void)
> +{
> + struct device_node *np;
> + int ret;
> +
> + for_each_matching_node(np, berlin_reset_of_match) {
> + ret = __berlin_reset_init(np);
> + if (ret)
> + return ret;
> + }
> +
> + return 0;
> +}
> +arch_initcall(berlin_reset_init);
>
next prev parent reply other threads:[~2014-06-09 10:32 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-05 15:48 [PATCH 0/9] ARM: Berlin: USB support Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 15:48 ` [PATCH 1/9] reset: add the Berlin reset controller driver Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 16:36 ` Philipp Zabel
2014-06-05 16:36 ` Philipp Zabel
2014-06-05 16:56 ` Antoine Ténart
2014-06-05 16:56 ` Antoine Ténart
2014-06-06 10:44 ` Sebastian Hesselbarth
2014-06-06 10:44 ` Sebastian Hesselbarth
2014-06-09 10:32 ` Sebastian Hesselbarth [this message]
2014-06-09 10:32 ` Sebastian Hesselbarth
2014-06-09 11:23 ` Philipp Zabel
2014-06-09 11:23 ` Philipp Zabel
2014-06-05 15:48 ` [PATCH 2/9] ARM: Berlin: select the reset controller Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 15:48 ` [PATCH 3/9] ARM: dts: berlin: add a required reset property in the chip controller node Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 16:39 ` Philipp Zabel
2014-06-05 16:39 ` Philipp Zabel
2014-06-05 16:39 ` Philipp Zabel
2014-06-05 16:44 ` Antoine Ténart
2014-06-05 16:44 ` Antoine Ténart
2014-06-05 15:48 ` [PATCH 4/9] usb: phy: add the Berlin USB PHY driver Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-06 6:39 ` Vivek Gautam
2014-06-06 6:39 ` Vivek Gautam
2014-06-06 7:11 ` Antoine Ténart
2014-06-06 7:11 ` Antoine Ténart
2014-06-06 11:02 ` Vivek Gautam
2014-06-06 11:02 ` Vivek Gautam
2014-06-19 13:45 ` Felipe Balbi
2014-06-19 13:45 ` Felipe Balbi
2014-06-06 10:54 ` Sebastian Hesselbarth
2014-06-06 10:54 ` Sebastian Hesselbarth
2014-06-06 11:59 ` Antoine Ténart
2014-06-06 11:59 ` Antoine Ténart
2014-06-09 8:26 ` Jisheng Zhang
2014-06-09 8:26 ` Jisheng Zhang
2014-06-09 10:11 ` Sebastian Hesselbarth
2014-06-09 10:11 ` Sebastian Hesselbarth
2014-06-09 10:52 ` Alexandre Belloni
2014-06-09 10:52 ` Alexandre Belloni
2014-06-05 15:48 ` [PATCH 5/9] Documentation: bindings: add doc for the Berlin USB PHY Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 15:48 ` [PATCH 6/9] usb: chipidea: add Berlin USB support Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-06 10:55 ` Sebastian Hesselbarth
2014-06-06 10:55 ` Sebastian Hesselbarth
2014-06-06 12:01 ` Antoine Ténart
2014-06-06 12:01 ` Antoine Ténart
2014-06-05 15:48 ` [PATCH 7/9] Documentation: bindings: add doc for the Berlin ChipIdea USB driver Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 15:48 ` [PATCH 8/9] ARM: dts: berlin: add BG2Q nodes for USB support Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-05 15:48 ` [PATCH 9/9] ARM: dts: Berlin: enable USB on the BG2Q DMP Antoine Ténart
2014-06-05 15:48 ` Antoine Ténart
2014-06-09 4:30 ` [PATCH 0/9] ARM: Berlin: USB support Peter Chen
2014-06-09 4:30 ` Peter Chen
2014-06-09 4:30 ` Peter Chen
2014-06-09 10:14 ` Sebastian Hesselbarth
2014-06-09 10:14 ` Sebastian Hesselbarth
2014-06-09 10:14 ` Sebastian Hesselbarth
2014-06-10 1:16 ` Peter Chen
2014-06-10 1:16 ` Peter Chen
2014-06-10 1:16 ` Peter Chen
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=53958D52.2050402@gmail.com \
--to=sebastian.hesselbarth@gmail.com \
--cc=linux-arm-kernel@lists.infradead.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 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.