From: Sebastian Reichel <sre@kernel.org>
To: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org, Ralf Baechle <ralf@linux-mips.org>,
Chris Brand <chris.brand@broadcom.com>,
Alexandre Belloni <alexandre.belloni@free-electrons.com>,
linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org,
Nicolas Ferre <nicolas.ferre@atmel.com>,
Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>,
Matthias Brugger <matthias.bgg@gmail.com>,
Andy Yan <andy.yan@rock-chips.com>,
Krzysztof Kozlowski <krzk@kernel.org>,
David Woodhouse <dwmw2@infradead.org>,
John Stultz <john.stultz@linaro.org>
Subject: Re: [PATCH v2 13/14] power: reset: Add Intel PIIX4 poweroff driver
Date: Tue, 20 Sep 2016 01:42:42 +0200 [thread overview]
Message-ID: <20160919234242.23xyy2y3zjvuhate@earth> (raw)
In-Reply-To: <20160919212132.28893-14-paul.burton@imgtec.com>
[-- Attachment #1: Type: text/plain, Size: 5826 bytes --]
Hi,
On Mon, Sep 19, 2016 at 10:21:30PM +0100, Paul Burton wrote:
> Add a driver which allows powering off the system via an Intel PIIX4
> southbridge, by entering the PIIX4 SOff state. This is useful on the
> MIPS Malta development board, where it will power down the FPGA based
> board until its ON/NMI button is pressed, or the QEMU implementation of
> the MIPS Malta board where it will cause QEMU to exit.
>
> Signed-off-by: Paul Burton <paul.burton@imgtec.com>
>
> ---
>
> Changes in v2:
> - Add MODULE_LICENSE
> - Allow non-MIPS builds with COMPILE_TEST
>
> drivers/power/reset/Kconfig | 10 ++++
> drivers/power/reset/Makefile | 1 +
> drivers/power/reset/piix4-poweroff.c | 104 +++++++++++++++++++++++++++++++++++
> 3 files changed, 115 insertions(+)
> create mode 100644 drivers/power/reset/piix4-poweroff.c
>
> diff --git a/drivers/power/reset/Kconfig b/drivers/power/reset/Kconfig
> index c74c3f6..abeb772 100644
> --- a/drivers/power/reset/Kconfig
> +++ b/drivers/power/reset/Kconfig
> @@ -104,6 +104,16 @@ config POWER_RESET_MSM
> help
> Power off and restart support for Qualcomm boards.
>
> +config POWER_RESET_PIIX4_POWEROFF
> + tristate "Intel PIIX4 power-off driver"
> + depends on PCI
> + depends on MIPS || COMPILE_TEST
> + help
> + This driver supports powering off a system using the Intel PIIX4
> + southbridge, for example the MIPS Malta development board. The
> + southbridge SOff state is entered in response to a request to
> + power off the system.
> +
> config POWER_RESET_LTC2952
> bool "LTC2952 PowerPath power-off driver"
> depends on OF_GPIO
> diff --git a/drivers/power/reset/Makefile b/drivers/power/reset/Makefile
> index 1be307c..11dae3b 100644
> --- a/drivers/power/reset/Makefile
> +++ b/drivers/power/reset/Makefile
> @@ -10,6 +10,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_PIIX4_POWEROFF) += piix4-poweroff.o
> obj-$(CONFIG_POWER_RESET_LTC2952) += ltc2952-poweroff.o
> obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
> obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o
> diff --git a/drivers/power/reset/piix4-poweroff.c b/drivers/power/reset/piix4-poweroff.c
> new file mode 100644
> index 0000000..11f0999
> --- /dev/null
> +++ b/drivers/power/reset/piix4-poweroff.c
> @@ -0,0 +1,104 @@
> +/*
> + * Copyright (C) 2016 Imagination Technologies
> + * Author: Paul Burton <paul.burton@imgtec.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2 of the License, or (at your
> + * option) any later version.
> + */
> +
> +#include <linux/delay.h>
> +#include <linux/io.h>
> +#include <linux/module.h>
> +#include <linux/pci.h>
> +#include <linux/pm.h>
> +
> +static struct pci_dev *pm_dev;
> +static resource_size_t io_offset;
> +
> +enum piix4_pm_io_reg {
> + PIIX4_FUNC3IO_PMSTS = 0x00,
> +#define PIIX4_FUNC3IO_PMSTS_PWRBTN_STS BIT(8)
> + PIIX4_FUNC3IO_PMCNTRL = 0x04,
> +#define PIIX4_FUNC3IO_PMCNTRL_SUS_EN BIT(13)
> +#define PIIX4_FUNC3IO_PMCNTRL_SUS_TYP_SOFF (0x0 << 10)
> +};
> +
> +#define PIIX4_SUSPEND_MAGIC 0x00120002
> +
> +static void piix4_poweroff(void)
> +{
> + int spec_devid;
> + u16 sts;
> +
> + /* Ensure the power button status is clear */
> + while (1) {
> + sts = inw(io_offset + PIIX4_FUNC3IO_PMSTS);
> + if (!(sts & PIIX4_FUNC3IO_PMSTS_PWRBTN_STS))
> + break;
> + outw(sts, io_offset + PIIX4_FUNC3IO_PMSTS);
> + }
> +
> + /* Enable entry to suspend */
> + outw(PIIX4_FUNC3IO_PMCNTRL_SUS_TYP_SOFF | PIIX4_FUNC3IO_PMCNTRL_SUS_EN,
> + io_offset + PIIX4_FUNC3IO_PMCNTRL);
> +
> + /* If the special cycle occurs too soon this doesn't work... */
> + mdelay(10);
> +
> + /*
> + * The PIIX4 will enter the suspend state only after seeing a special
> + * cycle with the correct magic data on the PCI bus. Generate that
> + * cycle now.
> + */
> + spec_devid = PCI_DEVID(0, PCI_DEVFN(0x1f, 0x7));
> + pci_bus_write_config_dword(pm_dev->bus, spec_devid, 0,
> + PIIX4_SUSPEND_MAGIC);
> +
> + /* Give the system some time to power down, then error */
> + mdelay(1000);
> + pr_emerg("Unable to poweroff system\n");
> +}
> +
> +static int piix4_poweroff_probe(struct pci_dev *dev,
> + const struct pci_device_id *id)
> +{
> + int res, io_region = PCI_BRIDGE_RESOURCES;
if (pm_dev)
return -EINVAL;
> + /* Request access to the PIIX4 PM IO registers */
> + res = pci_request_region(dev, io_region, "PIIX4 PM IO registers");
> + if (res) {
> + dev_err(&dev->dev, "failed to request PM IO registers: %d\n",
> + res);
> + return res;
> + }
> +
> + pm_dev = dev;
> + io_offset = pci_resource_start(dev, io_region);
> + pm_power_off = piix4_poweroff;
> +
> + return 0;
> +}
> +
> +static void piix4_poweroff_remove(struct pci_dev *dev)
> +{
> + if (pm_power_off == piix4_poweroff)
> + pm_power_off = NULL;
pci_release_region()
> +}
> +
> +static const struct pci_device_id piix4_poweroff_ids[] = {
> + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3) },
> + { 0 },
> +};
> +
> +static struct pci_driver piix4_poweroff_driver = {
> + .name = "piix4-poweroff",
> + .id_table = piix4_poweroff_ids,
> + .probe = piix4_poweroff_probe,
> + .remove = piix4_poweroff_remove,
> +};
> +
> +module_pci_driver(piix4_poweroff_driver);
> +MODULE_AUTHOR("Paul Burton <paul.burton@imgtec.com>");
> +MODULE_LICENSE("GPL");
-- Sebastian
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
next prev parent reply other threads:[~2016-09-19 23:42 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-09-19 21:21 [PATCH v2 00/14] Partial MIPS Malta DT conversion Paul Burton
2016-09-19 21:21 ` [PATCH v2 01/14] irqchip: i8259: Add domain before mapping parent irq Paul Burton
2016-09-30 14:40 ` Paul Burton
2016-09-30 18:41 ` Thomas Gleixner
2016-09-19 21:21 ` [PATCH v2 02/14] irqchip: i8259: Allow platforms to override poll function Paul Burton
2016-09-19 21:21 ` [PATCH v2 03/14] irqchip: i8259: Remove unused i8259A_irq_pending Paul Burton
2016-09-19 21:21 ` [PATCH v2 04/14] MIPS: Malta: Allow PCI devices DMA to lower 2GB physical Paul Burton
2016-09-19 21:21 ` [PATCH v2 05/14] MIPS: Malta: Use all available DDR by default Paul Burton
2016-09-19 21:21 ` [PATCH v2 06/14] MIPS: Malta: Probe interrupt controllers via DT Paul Burton
2016-09-19 21:21 ` [PATCH v2 07/14] of/platform: Probe "isa" busses by default Paul Burton
2016-09-23 12:42 ` Rob Herring
2016-09-19 21:21 ` [PATCH v2 08/14] MIPS: Malta: Remove custom DT match table Paul Burton
2016-09-19 21:21 ` [PATCH v2 09/14] MIPS: Malta: Probe RTC via DT Paul Burton
2016-09-20 10:21 ` Sergei Shtylyov
2016-09-20 10:34 ` Paul Burton
2016-09-20 10:55 ` Sergei Shtylyov
2016-09-19 21:21 ` [PATCH v2 10/14] MIPS: Malta: Probe pflash " Paul Burton
2016-09-19 21:21 ` [PATCH v2 11/14] MIPS: Malta: Use syscon-reboot driver to reboot Paul Burton
2016-10-22 9:08 ` Maciej W. Rozycki
2016-10-24 13:42 ` Paul Burton
2016-10-25 10:55 ` Maciej W. Rozycki
2016-09-19 21:21 ` [PATCH v2 12/14] MIPS: Malta: Remove custom halt implementation Paul Burton
2016-09-19 21:21 ` [PATCH v2 13/14] power: reset: Add Intel PIIX4 poweroff driver Paul Burton
2016-09-19 23:42 ` Sebastian Reichel [this message]
2016-09-19 21:21 ` [PATCH v2 14/14] MIPS: Malta: Use PIIX4 poweroff driver to power down Paul Burton
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=20160919234242.23xyy2y3zjvuhate@earth \
--to=sre@kernel.org \
--cc=alexandre.belloni@free-electrons.com \
--cc=andy.yan@rock-chips.com \
--cc=chris.brand@broadcom.com \
--cc=dbaryshkov@gmail.com \
--cc=dwmw2@infradead.org \
--cc=john.stultz@linaro.org \
--cc=krzk@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=linux-pm@vger.kernel.org \
--cc=matthias.bgg@gmail.com \
--cc=nicolas.ferre@atmel.com \
--cc=paul.burton@imgtec.com \
--cc=ralf@linux-mips.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 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).