Commit dd129c63 authored by Paul Burton's avatar Paul Burton

MIPS: Malta: Use PIIX4 poweroff driver to power down

Remove the platform code used to power down the system, instead relying
upon the new PIIX4 poweroff driver. This reduces the amount of platform
code required for the Malta board in preparation for allowing it to be
part of a more generic kernel.
Signed-off-by: default avatarPaul Burton <paul.burton@mips.com>
Patchwork: https://patchwork.linux-mips.org/patch/14282/
parent a07539c0
...@@ -1974,12 +1974,6 @@ config SYS_HAS_CPU_XLR ...@@ -1974,12 +1974,6 @@ config SYS_HAS_CPU_XLR
config SYS_HAS_CPU_XLP config SYS_HAS_CPU_XLP
bool bool
config MIPS_MALTA_PM
depends on MIPS_MALTA
depends on PCI
bool
default y
# #
# CPU may reorder R->R, R->W, W->R, W->W # CPU may reorder R->R, R->W, W->R, W->W
# Reordering beyond LL and SC is handled in WEAK_REORDERING_BEYOND_LLSC # Reordering beyond LL and SC is handled in WEAK_REORDERING_BEYOND_LLSC
......
...@@ -317,6 +317,7 @@ CONFIG_MOUSE_PS2_ELANTECH=y ...@@ -317,6 +317,7 @@ CONFIG_MOUSE_PS2_ELANTECH=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -328,6 +328,7 @@ CONFIG_INPUT_MOUSEDEV=y ...@@ -328,6 +328,7 @@ CONFIG_INPUT_MOUSEDEV=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -330,6 +330,7 @@ CONFIG_INPUT_MOUSEDEV=y ...@@ -330,6 +330,7 @@ CONFIG_INPUT_MOUSEDEV=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -133,6 +133,7 @@ CONFIG_SERIAL_8250=y ...@@ -133,6 +133,7 @@ CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -133,6 +133,7 @@ CONFIG_SERIAL_8250=y ...@@ -133,6 +133,7 @@ CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -134,6 +134,7 @@ CONFIG_SERIAL_8250=y ...@@ -134,6 +134,7 @@ CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -137,6 +137,7 @@ CONFIG_SERIAL_8250=y ...@@ -137,6 +137,7 @@ CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -132,6 +132,7 @@ CONFIG_SERIAL_8250=y ...@@ -132,6 +132,7 @@ CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -326,6 +326,7 @@ CONFIG_MOUSE_PS2_ELANTECH=y ...@@ -326,6 +326,7 @@ CONFIG_MOUSE_PS2_ELANTECH=y
CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250=y
CONFIG_SERIAL_8250_CONSOLE=y CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_POWER_RESET=y CONFIG_POWER_RESET=y
CONFIG_POWER_RESET_PIIX4_POWEROFF=y
CONFIG_POWER_RESET_SYSCON=y CONFIG_POWER_RESET_SYSCON=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_FB=y CONFIG_FB=y
......
...@@ -13,11 +13,9 @@ obj-y += malta-init.o ...@@ -13,11 +13,9 @@ obj-y += malta-init.o
obj-y += malta-int.o obj-y += malta-int.o
obj-y += malta-memory.o obj-y += malta-memory.o
obj-y += malta-platform.o obj-y += malta-platform.o
obj-y += malta-reset.o
obj-y += malta-setup.o obj-y += malta-setup.o
obj-y += malta-time.o obj-y += malta-time.o
obj-$(CONFIG_MIPS_CMP) += malta-amon.o obj-$(CONFIG_MIPS_CMP) += malta-amon.o
obj-$(CONFIG_MIPS_MALTA_PM) += malta-pm.o
CFLAGS_malta-dtshim.o = -I$(src)/../../../scripts/dtc/libfdt CFLAGS_malta-dtshim.o = -I$(src)/../../../scripts/dtc/libfdt
/*
* Copyright (C) 2014 Imagination Technologies
* Author: Paul Burton <paul.burton@mips.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/init.h>
#include <linux/io.h>
#include <linux/pci.h>
#include <asm/mach-malta/malta-pm.h>
static struct pci_bus *pm_pci_bus;
static resource_size_t pm_io_offset;
int mips_pm_suspend(unsigned state)
{
int spec_devid;
u16 sts;
if (!pm_pci_bus || !pm_io_offset)
return -ENODEV;
/* Ensure the power button status is clear */
while (1) {
sts = inw(pm_io_offset + PIIX4_FUNC3IO_PMSTS);
if (!(sts & PIIX4_FUNC3IO_PMSTS_PWRBTN_STS))
break;
outw(sts, pm_io_offset + PIIX4_FUNC3IO_PMSTS);
}
/* Enable entry to suspend */
outw(state | PIIX4_FUNC3IO_PMCNTRL_SUS_EN,
pm_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_pci_bus, spec_devid, 0,
PIIX4_SUSPEND_MAGIC);
/* Give the system some time to power down */
mdelay(1000);
return 0;
}
static int __init malta_pm_setup(void)
{
struct pci_dev *dev;
int res, io_region = PCI_BRIDGE_RESOURCES;
/* Find a reference to the PCI bus */
pm_pci_bus = pci_find_next_bus(NULL);
if (!pm_pci_bus) {
pr_warn("malta-pm: failed to find reference to PCI bus\n");
return -ENODEV;
}
/* Find the PIIX4 PM device */
dev = pci_get_subsys(PCI_VENDOR_ID_INTEL,
PCI_DEVICE_ID_INTEL_82371AB_3, PCI_ANY_ID,
PCI_ANY_ID, NULL);
if (!dev) {
pr_warn("malta-pm: failed to find PIIX4 PM\n");
return -ENODEV;
}
/* Request access to the PIIX4 PM IO registers */
res = pci_request_region(dev, io_region, "PIIX4 PM IO registers");
if (res) {
pr_warn("malta-pm: failed to request PM IO registers (%d)\n",
res);
pci_dev_put(dev);
return -ENODEV;
}
/* Find the offset to the PIIX4 PM IO registers */
pm_io_offset = pci_resource_start(dev, io_region);
pci_dev_put(dev);
return 0;
}
late_initcall(malta_pm_setup);
/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Carsten Langgaard, carstenl@mips.com
* Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved.
*/
#include <linux/io.h>
#include <linux/pm.h>
#include <linux/reboot.h>
#include <asm/reboot.h>
#include <asm/mach-malta/malta-pm.h>
static void mips_machine_power_off(void)
{
mips_pm_suspend(PIIX4_FUNC3IO_PMCNTRL_SUS_TYP_SOFF);
pr_info("Failed to power down, resetting\n");
machine_restart(NULL);
}
static int __init mips_reboot_setup(void)
{
pm_power_off = mips_machine_power_off;
return 0;
}
arch_initcall(mips_reboot_setup);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment