From: p.zabel@pengutronix.de (Philipp Zabel)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 03/10] reset: berlin: convert to a platform driver
Date: Mon, 09 Mar 2015 11:16:26 +0100 [thread overview]
Message-ID: <1425896186.3152.25.camel@pengutronix.de> (raw)
In-Reply-To: <1425654328-26298-4-git-send-email-antoine.tenart@free-electrons.com>
Hi Antoine,
Am Freitag, den 06.03.2015, 16:05 +0100 schrieb Antoine Tenart:
> The Berlin reset controller was introduced without being a platform
> driver because of a needed DT rework: the node describing the reset
> controller also describes the pinctrl and clk controllers...
>
> The DT issue being solved thanks to the addition of the Berlin
> controller mfd driver, it is now possible to convert the Berlin reset
> driver to a plaftorm driver.
>
> Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Looks good to me. Do you want to merge this together with the rest of
the series, or should I queue the reset patch?
Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
regards
Philipp
> ---
> drivers/reset/reset-berlin.c | 71 +++++++++++++++++---------------------------
> 1 file changed, 27 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/reset/reset-berlin.c b/drivers/reset/reset-berlin.c
> index f8b48a13cf0b..5f414fa142ff 100644
> --- a/drivers/reset/reset-berlin.c
> +++ b/drivers/reset/reset-berlin.c
> @@ -12,10 +12,12 @@
> #include <linux/delay.h>
> #include <linux/io.h>
> #include <linux/module.h>
> +#include <linux/mfd/syscon.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
> #include <linux/platform_device.h>
> #include <linux/reset-controller.h>
> +#include <linux/regmap.h>
> #include <linux/slab.h>
> #include <linux/types.h>
>
> @@ -25,8 +27,7 @@
> container_of((p), struct berlin_reset_priv, rcdev)
>
> struct berlin_reset_priv {
> - void __iomem *base;
> - unsigned int size;
> + struct regmap *regmap;
> struct reset_controller_dev rcdev;
> };
>
> @@ -37,7 +38,7 @@ static int berlin_reset_reset(struct reset_controller_dev *rcdev,
> int offset = id >> 8;
> int mask = BIT(id & 0x1f);
>
> - writel(mask, priv->base + offset);
> + regmap_write(priv->regmap, offset, mask);
>
> /* let the reset be effective */
> udelay(10);
> @@ -52,7 +53,6 @@ static struct reset_control_ops berlin_reset_ops = {
> static int berlin_reset_xlate(struct reset_controller_dev *rcdev,
> const struct of_phandle_args *reset_spec)
> {
> - struct berlin_reset_priv *priv = to_berlin_reset_priv(rcdev);
> unsigned offset, bit;
>
> if (WARN_ON(reset_spec->args_count != rcdev->of_reset_n_cells))
> @@ -61,71 +61,54 @@ static int berlin_reset_xlate(struct reset_controller_dev *rcdev,
> offset = reset_spec->args[0];
> bit = reset_spec->args[1];
>
> - if (offset >= priv->size)
> - return -EINVAL;
> -
> if (bit >= BERLIN_MAX_RESETS)
> return -EINVAL;
>
> return (offset << 8) | bit;
> }
>
> -static int __berlin_reset_init(struct device_node *np)
> +static int berlin2_reset_probe(struct platform_device *pdev)
> {
> + struct device_node *parent_np = of_get_parent(pdev->dev.of_node);
> struct berlin_reset_priv *priv;
> - struct resource res;
> - resource_size_t size;
> - int ret;
>
> - priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> + priv = devm_kzalloc(&pdev->dev, 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->size = size;
> + priv->regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> + if (IS_ERR(priv->regmap))
> + return PTR_ERR(priv->regmap);
>
> priv->rcdev.owner = THIS_MODULE;
> priv->rcdev.ops = &berlin_reset_ops;
> - priv->rcdev.of_node = np;
> + priv->rcdev.of_node = pdev->dev.of_node;
> priv->rcdev.of_reset_n_cells = 2;
> priv->rcdev.of_xlate = berlin_reset_xlate;
>
> reset_controller_register(&priv->rcdev);
>
> return 0;
> -
> -err:
> - kfree(priv);
> - return ret;
> }
>
> -static const struct of_device_id berlin_reset_of_match[] __initconst = {
> - { .compatible = "marvell,berlin2-chip-ctrl" },
> - { .compatible = "marvell,berlin2cd-chip-ctrl" },
> - { .compatible = "marvell,berlin2q-chip-ctrl" },
> +static const struct of_device_id berlin_reset_of_match[] = {
> + { .compatible = "marvell,berlin2-reset" },
> { },
> };
> +MODULE_DEVICE_TABLE(of, berlin_reset_of_match);
>
> -static int __init berlin_reset_init(void)
> -{
> - struct device_node *np;
> - int ret;
> +static struct platform_driver berlin_reset_driver = {
> + .probe = berlin2_reset_probe,
> + .driver = {
> + .name = "berlin2-reset",
> + .of_match_table = berlin_reset_of_match,
> + },
>
> - for_each_matching_node(np, berlin_reset_of_match) {
> - ret = __berlin_reset_init(np);
> - if (ret)
> - return ret;
> - }
> +};
> +module_platform_driver(berlin_reset_driver);
>
> - return 0;
> -}
> -arch_initcall(berlin_reset_init);
> +MODULE_AUTHOR("Antoine Tenart <antoine.tenart@free-electrons.com>");
> +MODULE_AUTHOR("Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>");
> +MODULE_DESCRIPTION("Marvell Berlin reset driver");
> +MODULE_LICENSE("GPL");
WARNING: multiple messages have this Message-ID (diff)
From: Philipp Zabel <p.zabel@pengutronix.de>
To: Antoine Tenart <antoine.tenart@free-electrons.com>
Cc: sebastian.hesselbarth@gmail.com, jszhang@marvell.com,
zmxu@marvell.com, linux-arm-kernel@lists.infradead.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 03/10] reset: berlin: convert to a platform driver
Date: Mon, 09 Mar 2015 11:16:26 +0100 [thread overview]
Message-ID: <1425896186.3152.25.camel@pengutronix.de> (raw)
In-Reply-To: <1425654328-26298-4-git-send-email-antoine.tenart@free-electrons.com>
Hi Antoine,
Am Freitag, den 06.03.2015, 16:05 +0100 schrieb Antoine Tenart:
> The Berlin reset controller was introduced without being a platform
> driver because of a needed DT rework: the node describing the reset
> controller also describes the pinctrl and clk controllers...
>
> The DT issue being solved thanks to the addition of the Berlin
> controller mfd driver, it is now possible to convert the Berlin reset
> driver to a plaftorm driver.
>
> Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Looks good to me. Do you want to merge this together with the rest of
the series, or should I queue the reset patch?
Acked-by: Philipp Zabel <p.zabel@pengutronix.de>
regards
Philipp
> ---
> drivers/reset/reset-berlin.c | 71 +++++++++++++++++---------------------------
> 1 file changed, 27 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/reset/reset-berlin.c b/drivers/reset/reset-berlin.c
> index f8b48a13cf0b..5f414fa142ff 100644
> --- a/drivers/reset/reset-berlin.c
> +++ b/drivers/reset/reset-berlin.c
> @@ -12,10 +12,12 @@
> #include <linux/delay.h>
> #include <linux/io.h>
> #include <linux/module.h>
> +#include <linux/mfd/syscon.h>
> #include <linux/of.h>
> #include <linux/of_address.h>
> #include <linux/platform_device.h>
> #include <linux/reset-controller.h>
> +#include <linux/regmap.h>
> #include <linux/slab.h>
> #include <linux/types.h>
>
> @@ -25,8 +27,7 @@
> container_of((p), struct berlin_reset_priv, rcdev)
>
> struct berlin_reset_priv {
> - void __iomem *base;
> - unsigned int size;
> + struct regmap *regmap;
> struct reset_controller_dev rcdev;
> };
>
> @@ -37,7 +38,7 @@ static int berlin_reset_reset(struct reset_controller_dev *rcdev,
> int offset = id >> 8;
> int mask = BIT(id & 0x1f);
>
> - writel(mask, priv->base + offset);
> + regmap_write(priv->regmap, offset, mask);
>
> /* let the reset be effective */
> udelay(10);
> @@ -52,7 +53,6 @@ static struct reset_control_ops berlin_reset_ops = {
> static int berlin_reset_xlate(struct reset_controller_dev *rcdev,
> const struct of_phandle_args *reset_spec)
> {
> - struct berlin_reset_priv *priv = to_berlin_reset_priv(rcdev);
> unsigned offset, bit;
>
> if (WARN_ON(reset_spec->args_count != rcdev->of_reset_n_cells))
> @@ -61,71 +61,54 @@ static int berlin_reset_xlate(struct reset_controller_dev *rcdev,
> offset = reset_spec->args[0];
> bit = reset_spec->args[1];
>
> - if (offset >= priv->size)
> - return -EINVAL;
> -
> if (bit >= BERLIN_MAX_RESETS)
> return -EINVAL;
>
> return (offset << 8) | bit;
> }
>
> -static int __berlin_reset_init(struct device_node *np)
> +static int berlin2_reset_probe(struct platform_device *pdev)
> {
> + struct device_node *parent_np = of_get_parent(pdev->dev.of_node);
> struct berlin_reset_priv *priv;
> - struct resource res;
> - resource_size_t size;
> - int ret;
>
> - priv = kzalloc(sizeof(*priv), GFP_KERNEL);
> + priv = devm_kzalloc(&pdev->dev, 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->size = size;
> + priv->regmap = syscon_node_to_regmap(parent_np);
> + of_node_put(parent_np);
> + if (IS_ERR(priv->regmap))
> + return PTR_ERR(priv->regmap);
>
> priv->rcdev.owner = THIS_MODULE;
> priv->rcdev.ops = &berlin_reset_ops;
> - priv->rcdev.of_node = np;
> + priv->rcdev.of_node = pdev->dev.of_node;
> priv->rcdev.of_reset_n_cells = 2;
> priv->rcdev.of_xlate = berlin_reset_xlate;
>
> reset_controller_register(&priv->rcdev);
>
> return 0;
> -
> -err:
> - kfree(priv);
> - return ret;
> }
>
> -static const struct of_device_id berlin_reset_of_match[] __initconst = {
> - { .compatible = "marvell,berlin2-chip-ctrl" },
> - { .compatible = "marvell,berlin2cd-chip-ctrl" },
> - { .compatible = "marvell,berlin2q-chip-ctrl" },
> +static const struct of_device_id berlin_reset_of_match[] = {
> + { .compatible = "marvell,berlin2-reset" },
> { },
> };
> +MODULE_DEVICE_TABLE(of, berlin_reset_of_match);
>
> -static int __init berlin_reset_init(void)
> -{
> - struct device_node *np;
> - int ret;
> +static struct platform_driver berlin_reset_driver = {
> + .probe = berlin2_reset_probe,
> + .driver = {
> + .name = "berlin2-reset",
> + .of_match_table = berlin_reset_of_match,
> + },
>
> - for_each_matching_node(np, berlin_reset_of_match) {
> - ret = __berlin_reset_init(np);
> - if (ret)
> - return ret;
> - }
> +};
> +module_platform_driver(berlin_reset_driver);
>
> - return 0;
> -}
> -arch_initcall(berlin_reset_init);
> +MODULE_AUTHOR("Antoine Tenart <antoine.tenart@free-electrons.com>");
> +MODULE_AUTHOR("Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>");
> +MODULE_DESCRIPTION("Marvell Berlin reset driver");
> +MODULE_LICENSE("GPL");
next prev parent reply other threads:[~2015-03-09 10:16 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-06 15:05 [PATCH v2 00/10] ARM: berlin: refactor chip and system controllers Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-03-06 15:05 ` [PATCH v2 01/10] Documentation: bindings: update the Berlin controllers documentation Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-03-06 15:05 ` [PATCH v2 02/10] ARM: berlin: select MFD_SYSCON by default Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-03-06 15:05 ` [PATCH v2 03/10] reset: berlin: convert to a platform driver Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-03-09 10:16 ` Philipp Zabel [this message]
2015-03-09 10:16 ` Philipp Zabel
2015-03-10 9:57 ` Antoine Tenart
2015-03-10 9:57 ` Antoine Tenart
2015-03-25 8:26 ` Linus Walleij
2015-03-25 8:26 ` Linus Walleij
2015-05-12 14:43 ` Antoine Tenart
2015-05-12 14:43 ` Antoine Tenart
2015-05-13 8:38 ` Philipp Zabel
2015-05-13 8:38 ` Philipp Zabel
2015-05-15 9:14 ` Sebastian Hesselbarth
2015-05-15 9:14 ` Sebastian Hesselbarth
2015-03-06 15:05 ` [PATCH v2 04/10] Documentation: bindings: move the Berlin reset documentation Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-03-09 10:16 ` Philipp Zabel
2015-03-09 10:16 ` Philipp Zabel
2015-03-06 15:05 ` [PATCH v2 05/10] pinctrl: berlin: use the regmap provided by syscon Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-04-28 11:30 ` Sebastian Hesselbarth
2015-04-28 11:30 ` Sebastian Hesselbarth
2015-05-06 14:28 ` Linus Walleij
2015-05-06 14:28 ` Linus Walleij
2015-03-06 15:05 ` [PATCH v2 06/10] pinctrl: berlin: use proper compatibles Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-06-10 7:13 ` Linus Walleij
2015-06-10 7:13 ` Linus Walleij
2015-06-12 9:05 ` Antoine Tenart
2015-06-12 9:05 ` Antoine Tenart
2015-06-12 9:05 ` Antoine Tenart
2015-06-12 9:24 ` Sebastian Hesselbarth
2015-06-12 9:24 ` Sebastian Hesselbarth
2015-03-06 15:05 ` [PATCH v2 07/10] Documentation: bindings: move the Berlin pinctrl documentation Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-06-10 7:14 ` Linus Walleij
2015-06-10 7:14 ` Linus Walleij
2015-03-06 15:05 ` [PATCH v2 08/10] ARM: berlin: rework chip and system controller nodes for BG2 Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-03-06 15:05 ` [PATCH v2 09/10] ARM: berlin: rework chip and system controller nodes for BG2CD Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-03-06 15:05 ` [PATCH v2 10/10] ARM: berlin: rework chip and system controller nodes for BG2Q Antoine Tenart
2015-03-06 15:05 ` Antoine Tenart
2015-03-09 17:13 ` [PATCH v2 00/10] ARM: berlin: refactor chip and system controllers Linus Walleij
2015-03-09 17:13 ` Linus Walleij
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=1425896186.3152.25.camel@pengutronix.de \
--to=p.zabel@pengutronix.de \
--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.