All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandre Belloni <alexandre.belloni@free-electrons.com>
To: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
Cc: Ralf Baechle <ralf@linux-mips.org>,
	linux-mips@linux-mips.org, linux-kernel@vger.kernel.org,
	linux-pm@vger.kernel.org
Subject: Re: [PATCH v2 08/13] power: reset: Add a driver for the Microsemi Ocelot reset
Date: Fri, 8 Dec 2017 18:15:22 +0100	[thread overview]
Message-ID: <20171208171522.GC15660@piout.net> (raw)
In-Reply-To: <20171208170755.n6eqgn2jkjh4rbo5@earth>

On 08/12/2017 at 18:07:55 +0100, Sebastian Reichel wrote:
> Hi,
> 
> On Fri, Dec 08, 2017 at 04:46:13PM +0100, Alexandre Belloni wrote:
> > The Microsemi Ocelot SoC has a register allowing to reset the MIPS core.
> > Unfortunately, the syscon-reboot driver can't be used directly (but almost)
> > as the reset control may be disabled using another register.
> > 
> > Cc: Sebastian Reichel <sre@kernel.org>
> > Cc: linux-pm@vger.kernel.org
> > Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
> 
> Is it safe to apply this and the DT binding patch (once it has Rob's
> Ack-by) via the power-supply tree?
> 

Absolutely, and I think this is the best plan.

> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
> 
> -- Sebastian
> 
> >  drivers/power/reset/Kconfig        |  7 ++++
> >  drivers/power/reset/Makefile       |  1 +
> >  drivers/power/reset/ocelot-reset.c | 86 ++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 94 insertions(+)
> >  create mode 100644 drivers/power/reset/ocelot-reset.c
> > 
> > diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
> > index ca0de1a78e85..2372f8e1040d 100644
> > --- a/drivers/power/reset/Kconfig
> > +++ b/drivers/power/reset/Kconfig
> > @@ -113,6 +113,13 @@ config POWER_RESET_MSM
> >  	help
> >  	  Power off and restart support for Qualcomm boards.
> >  
> > +config POWER_RESET_OCELOT_RESET
> > +	bool "Microsemi Ocelot reset driver"
> > +	depends on MSCC_OCELOT || COMPILE_TEST
> > +	select MFD_SYSCON
> > +	help
> > +	  This driver supports restart for Microsemi Ocelot SoC.
> > +
> >  config POWER_RESET_PIIX4_POWEROFF
> >  	tristate "Intel PIIX4 power-off driver"
> >  	depends on PCI
> > diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile
> > index aeb65edb17b7..df9d92291c67 100644
> > --- a/drivers/power/reset/Makefile
> > +++ b/drivers/power/reset/Makefile
> > @@ -12,6 +12,7 @@ obj-$(CONFIG_POWER_RESET_GPIO_RESTART) += gpio-restart.o
> >  obj-$(CONFIG_POWER_RESET_HISI) += hisi-reboot.o
> >  obj-$(CONFIG_POWER_RESET_IMX) += imx-snvs-poweroff.o
> >  obj-$(CONFIG_POWER_RESET_MSM) += msm-poweroff.o
> > +obj-$(CONFIG_POWER_RESET_OCELOT_RESET) += ocelot-reset.o
> >  obj-$(CONFIG_POWER_RESET_PIIX4_POWEROFF) += piix4-poweroff.o
> >  obj-$(CONFIG_POWER_RESET_LTC2952) += ltc2952-poweroff.o
> >  obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
> > diff --git a/drivers/power/reset/ocelot-reset.c b/drivers/power/reset/ocelot-reset.c
> > new file mode 100644
> > index 000000000000..1fb14bf17191
> > --- /dev/null
> > +++ b/drivers/power/reset/ocelot-reset.c
> > @@ -0,0 +1,86 @@
> > +// SPDX-License-Identifier: (GPL-2.0 OR MIT)
> > +/*
> > + * Microsemi MIPS SoC reset driver
> > + *
> > + * License: Dual MIT/GPL
> > + * Copyright (c) 2017 Microsemi Corporation
> > + */
> > +#include <linux/delay.h>
> > +#include <linux/io.h>
> > +#include <linux/notifier.h>
> > +#include <linux/mfd/syscon.h>
> > +#include <linux/of_address.h>
> > +#include <linux/of_device.h>
> > +#include <linux/platform_device.h>
> > +#include <linux/reboot.h>
> > +#include <linux/regmap.h>
> > +
> > +struct ocelot_reset_context {
> > +	struct regmap *chip_regs;
> > +	struct regmap *cpu_ctrl;
> > +	struct notifier_block restart_handler;
> > +};
> > +
> > +#define ICPU_CFG_CPU_SYSTEM_CTRL_RESET 0x20
> > +#define CORE_RST_PROTECT BIT(2)
> > +
> > +#define CHIP_REGS_SOFT_RST 0x8
> > +#define SOFT_CHIP_RST BIT(0)
> > +
> > +static int ocelot_restart_handle(struct notifier_block *this,
> > +				 unsigned long mode, void *cmd)
> > +{
> > +	struct ocelot_reset_context *ctx = container_of(this, struct
> > +							ocelot_reset_context,
> > +							restart_handler);
> > +
> > +	/* Make sure the core is not protected from reset */
> > +	regmap_update_bits(ctx->cpu_ctrl, ICPU_CFG_CPU_SYSTEM_CTRL_RESET,
> > +			   CORE_RST_PROTECT, 0);
> > +
> > +	regmap_write(ctx->chip_regs, CHIP_REGS_SOFT_RST, SOFT_CHIP_RST);
> > +
> > +	pr_emerg("Unable to restart system\n");
> > +	return NOTIFY_DONE;
> > +}
> > +
> > +static int ocelot_reset_probe(struct platform_device *pdev)
> > +{
> > +	struct ocelot_reset_context *ctx;
> > +	struct device *dev = &pdev->dev;
> > +	int err;
> > +
> > +	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
> > +	if (!ctx)
> > +		return -ENOMEM;
> > +
> > +	ctx->chip_regs = syscon_node_to_regmap(of_get_parent(dev->of_node));
> > +	if (IS_ERR(ctx->chip_regs))
> > +		return PTR_ERR(ctx->chip_regs);
> > +
> > +	ctx->cpu_ctrl = syscon_regmap_lookup_by_compatible("mscc,ocelot-cpu-syscon");
> > +	if (IS_ERR(ctx->cpu_ctrl))
> > +		return PTR_ERR(ctx->cpu_ctrl);
> > +
> > +	ctx->restart_handler.notifier_call = ocelot_restart_handle;
> > +	ctx->restart_handler.priority = 192;
> > +	err = register_restart_handler(&ctx->restart_handler);
> > +	if (err)
> > +		dev_err(dev, "can't register restart notifier (err=%d)\n", err);
> > +
> > +	return err;
> > +}
> > +
> > +static const struct of_device_id ocelot_reset_of_match[] = {
> > +	{ .compatible = "mscc,ocelot-chip-reset" },
> > +	{}
> > +};
> > +
> > +static struct platform_driver ocelot_reset_driver = {
> > +	.probe = ocelot_reset_probe,
> > +	.driver = {
> > +		.name = "ocelot-chip-reset",
> > +		.of_match_table = ocelot_reset_of_match,
> > +	},
> > +};
> > +builtin_platform_driver(ocelot_reset_driver);
> > -- 
> > 2.15.1
> > 



-- 
Alexandre Belloni, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com

  reply	other threads:[~2017-12-08 17:15 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-08 15:46 [PATCH v2 00/13] MIPS: add support for the Microsemi MIPS SoCs Alexandre Belloni
2017-12-08 15:46 ` [PATCH v2 01/13] dt-bindings: Add vendor prefix for Microsemi Corporation Alexandre Belloni
2017-12-08 15:46 ` [PATCH v2 02/13] dt-bindings: interrupt-controller: Add binding for the Microsemi Ocelot interrupt controller Alexandre Belloni
2017-12-08 15:46 ` [PATCH v2 03/13] irqchip: Add a driver for the Microsemi Ocelot controller Alexandre Belloni
2017-12-08 15:46 ` [PATCH v2 04/13] dt-bindings: pinctrl: Add bindings for Microsemi Ocelot Alexandre Belloni
2017-12-13  7:39   ` Linus Walleij
2017-12-08 15:46 ` [PATCH v2 05/13] pinctrl: Add Microsemi Ocelot SoC driver Alexandre Belloni
2017-12-13  8:15   ` Linus Walleij
2017-12-13  9:23     ` Philippe Ombredanne
2017-12-14 23:53       ` Linus Walleij
2017-12-15  7:59         ` Philippe Ombredanne
2017-12-18 16:09           ` Alexandre Belloni
2018-01-05 23:46     ` Alexandre Belloni
2018-01-06  0:09     ` [PATCH v3] " Alexandre Belloni
2018-01-09 13:56       ` Linus Walleij
2018-01-09 14:07         ` Alexandre Belloni
2017-12-08 15:46 ` [PATCH v2 06/13] dt-bindings: mips: Add bindings for Microsemi SoCs Alexandre Belloni
2017-12-13  0:44   ` Rob Herring
2017-12-08 15:46 ` [PATCH v2 07/13] dt-bindings: power: reset: Document ocelot-reset binding Alexandre Belloni
2017-12-15 20:23   ` Rob Herring
2017-12-15 20:23     ` Rob Herring
2017-12-15 22:07     ` Alexandre Belloni
2017-12-15 22:07       ` Alexandre Belloni
2017-12-08 15:46 ` [PATCH v2 08/13] power: reset: Add a driver for the Microsemi Ocelot reset Alexandre Belloni
2017-12-08 17:07   ` Sebastian Reichel
2017-12-08 17:15     ` Alexandre Belloni [this message]
2017-12-18 13:26   ` PrasannaKumar Muralidharan
2017-12-08 15:46 ` [PATCH v2 09/13] MIPS: mscc: Add initial support for Microsemi MIPS SoCs Alexandre Belloni
2017-12-18 13:23   ` PrasannaKumar Muralidharan
2017-12-19 14:57   ` PrasannaKumar Muralidharan
2017-12-19 20:09     ` Alexandre Belloni
2017-12-21 13:36       ` PrasannaKumar Muralidharan
2017-12-08 15:46 ` [PATCH v2 10/13] MIPS: mscc: add ocelot dtsi Alexandre Belloni
2017-12-18 13:22   ` PrasannaKumar Muralidharan
2017-12-08 15:46 ` [PATCH v2 11/13] MIPS: mscc: add ocelot PCB123 device tree Alexandre Belloni
2017-12-18 13:29   ` PrasannaKumar Muralidharan
2017-12-08 15:46 ` [PATCH v2 12/13] MIPS: defconfigs: add a defconfig for Microsemi SoCs Alexandre Belloni
2017-12-08 15:46 ` [PATCH v2 13/13] MAINTAINERS: Add entry for Microsemi MIPS SoCs Alexandre Belloni
2017-12-17 16:59 ` [PATCH v2 00/13] MIPS: add support for the " PrasannaKumar Muralidharan

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=20171208171522.GC15660@piout.net \
    --to=alexandre.belloni@free-electrons.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@linux-mips.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=ralf@linux-mips.org \
    --cc=sebastian.reichel@collabora.co.uk \
    /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.