arm: vexpress: Move the poweroff/restart code to drivers/power/reset
authorCatalin Marinas <catalin.marinas@arm.com>
Tue, 15 Jan 2013 11:24:14 +0000 (11:24 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Thu, 21 Mar 2013 15:17:39 +0000 (15:17 +0000)
This patch moves the arch/arm/mach-vexpress/reset.c functionality to
drivers/platform/reset/ and adds the necessary Kconfig wiring.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Pawel Moll <pawel.moll@arm.com>
arch/arm/mach-vexpress/Kconfig
arch/arm/mach-vexpress/Makefile
arch/arm/mach-vexpress/reset.c [deleted file]
drivers/power/reset/Kconfig
drivers/power/reset/Makefile
drivers/power/reset/vexpress-poweroff.c [new file with mode: 0644]

index 52d315b792c8e8bb1561b4ae703194a724e865e0..0f1c5e53fb27b26a3353080a2cf551583a8379a8 100644 (file)
@@ -17,6 +17,9 @@ config ARCH_VEXPRESS
        select NO_IOPORT
        select PLAT_VERSATILE
        select PLAT_VERSATILE_CLCD
+       select POWER_RESET
+       select POWER_RESET_VEXPRESS
+       select POWER_SUPPLY
        select REGULATOR_FIXED_VOLTAGE if REGULATOR
        select VEXPRESS_CONFIG
        help
index 80b64971fbddbbf07b8c03eb626c773529db1b5e..42703e8b4d3bcdb674b99f4c01425e0dbcb44a21 100644 (file)
@@ -4,7 +4,7 @@
 ccflags-$(CONFIG_ARCH_MULTIPLATFORM) := -I$(srctree)/$(src)/include \
        -I$(srctree)/arch/arm/plat-versatile/include
 
-obj-y                                  := v2m.o reset.o
+obj-y                                  := v2m.o
 obj-$(CONFIG_ARCH_VEXPRESS_CA9X4)      += ct-ca9x4.o
 obj-$(CONFIG_SMP)                      += platsmp.o
 obj-$(CONFIG_HOTPLUG_CPU)              += hotplug.o
diff --git a/arch/arm/mach-vexpress/reset.c b/arch/arm/mach-vexpress/reset.c
deleted file mode 100644 (file)
index 465923a..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * Copyright (C) 2012 ARM Limited
- */
-
-#include <linux/jiffies.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
-#include <linux/platform_device.h>
-#include <linux/stat.h>
-#include <linux/vexpress.h>
-
-static void vexpress_reset_do(struct device *dev, const char *what)
-{
-       int err = -ENOENT;
-       struct vexpress_config_func *func =
-                       vexpress_config_func_get_by_dev(dev);
-
-       if (func) {
-               unsigned long timeout;
-
-               err = vexpress_config_write(func, 0, 0);
-
-               timeout = jiffies + HZ;
-               while (time_before(jiffies, timeout))
-                       cpu_relax();
-       }
-
-       dev_emerg(dev, "Unable to %s (%d)\n", what, err);
-}
-
-static struct device *vexpress_power_off_device;
-
-void vexpress_power_off(void)
-{
-       vexpress_reset_do(vexpress_power_off_device, "power off");
-}
-
-static struct device *vexpress_restart_device;
-
-void vexpress_restart(char str, const char *cmd)
-{
-       vexpress_reset_do(vexpress_restart_device, "restart");
-}
-
-static ssize_t vexpress_reset_active_show(struct device *dev,
-               struct device_attribute *attr, char *buf)
-{
-       return sprintf(buf, "%d\n", vexpress_restart_device == dev);
-}
-
-static ssize_t vexpress_reset_active_store(struct device *dev,
-               struct device_attribute *attr, const char *buf, size_t count)
-{
-       long value;
-       int err = kstrtol(buf, 0, &value);
-
-       if (!err && value)
-               vexpress_restart_device = dev;
-
-       return err ? err : count;
-}
-
-DEVICE_ATTR(active, S_IRUGO | S_IWUSR, vexpress_reset_active_show,
-               vexpress_reset_active_store);
-
-
-enum vexpress_reset_func { FUNC_RESET, FUNC_SHUTDOWN, FUNC_REBOOT };
-
-static struct of_device_id vexpress_reset_of_match[] = {
-       {
-               .compatible = "arm,vexpress-reset",
-               .data = (void *)FUNC_RESET,
-       }, {
-               .compatible = "arm,vexpress-shutdown",
-               .data = (void *)FUNC_SHUTDOWN
-       }, {
-               .compatible = "arm,vexpress-reboot",
-               .data = (void *)FUNC_REBOOT
-       },
-       {}
-};
-
-static int vexpress_reset_probe(struct platform_device *pdev)
-{
-       enum vexpress_reset_func func;
-       const struct of_device_id *match =
-                       of_match_device(vexpress_reset_of_match, &pdev->dev);
-
-       if (match)
-               func = (enum vexpress_reset_func)match->data;
-       else
-               func = pdev->id_entry->driver_data;
-
-       switch (func) {
-       case FUNC_SHUTDOWN:
-               vexpress_power_off_device = &pdev->dev;
-               break;
-       case FUNC_RESET:
-               if (!vexpress_restart_device)
-                       vexpress_restart_device = &pdev->dev;
-               device_create_file(&pdev->dev, &dev_attr_active);
-               break;
-       case FUNC_REBOOT:
-               vexpress_restart_device = &pdev->dev;
-               device_create_file(&pdev->dev, &dev_attr_active);
-               break;
-       };
-
-       return 0;
-}
-
-static const struct platform_device_id vexpress_reset_id_table[] = {
-       { .name = "vexpress-reset", .driver_data = FUNC_RESET, },
-       { .name = "vexpress-shutdown", .driver_data = FUNC_SHUTDOWN, },
-       { .name = "vexpress-reboot", .driver_data = FUNC_REBOOT, },
-       {}
-};
-
-static struct platform_driver vexpress_reset_driver = {
-       .probe = vexpress_reset_probe,
-       .driver = {
-               .name = "vexpress-reset",
-               .of_match_table = vexpress_reset_of_match,
-       },
-       .id_table = vexpress_reset_id_table,
-};
-
-static int __init vexpress_reset_init(void)
-{
-       return platform_driver_register(&vexpress_reset_driver);
-}
-device_initcall(vexpress_reset_init);
index 1ae65b822864b6b3eb5d4d36e2e1ccebd05fb0f4..349e9ae8090a75eaf3c98f8ece4f99695b2308f4 100644 (file)
@@ -30,3 +30,10 @@ config POWER_RESET_RESTART
          Some boards don't actually have the ability to power off.
          Instead they restart, and u-boot holds the SoC until the
          user presses a key. u-boot then boots into Linux.
+
+config POWER_RESET_VEXPRESS
+       bool
+       depends on POWER_RESET
+       help
+         Power off and reset support for the ARM Ltd. Versatile
+         Express boards.
index 0f317f50c56fb90f5ef0b76ab1ef7d324fdbf16e..372807fd83f78d32d352e1479721407293c24fce 100644 (file)
@@ -1,3 +1,4 @@
 obj-$(CONFIG_POWER_RESET_GPIO) += gpio-poweroff.o
 obj-$(CONFIG_POWER_RESET_QNAP) += qnap-poweroff.o
-obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o
\ No newline at end of file
+obj-$(CONFIG_POWER_RESET_RESTART) += restart-poweroff.o
+obj-$(CONFIG_POWER_RESET_VEXPRESS) += vexpress-poweroff.o
diff --git a/drivers/power/reset/vexpress-poweroff.c b/drivers/power/reset/vexpress-poweroff.c
new file mode 100644 (file)
index 0000000..465923a
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * Copyright (C) 2012 ARM Limited
+ */
+
+#include <linux/jiffies.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/platform_device.h>
+#include <linux/stat.h>
+#include <linux/vexpress.h>
+
+static void vexpress_reset_do(struct device *dev, const char *what)
+{
+       int err = -ENOENT;
+       struct vexpress_config_func *func =
+                       vexpress_config_func_get_by_dev(dev);
+
+       if (func) {
+               unsigned long timeout;
+
+               err = vexpress_config_write(func, 0, 0);
+
+               timeout = jiffies + HZ;
+               while (time_before(jiffies, timeout))
+                       cpu_relax();
+       }
+
+       dev_emerg(dev, "Unable to %s (%d)\n", what, err);
+}
+
+static struct device *vexpress_power_off_device;
+
+void vexpress_power_off(void)
+{
+       vexpress_reset_do(vexpress_power_off_device, "power off");
+}
+
+static struct device *vexpress_restart_device;
+
+void vexpress_restart(char str, const char *cmd)
+{
+       vexpress_reset_do(vexpress_restart_device, "restart");
+}
+
+static ssize_t vexpress_reset_active_show(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       return sprintf(buf, "%d\n", vexpress_restart_device == dev);
+}
+
+static ssize_t vexpress_reset_active_store(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       long value;
+       int err = kstrtol(buf, 0, &value);
+
+       if (!err && value)
+               vexpress_restart_device = dev;
+
+       return err ? err : count;
+}
+
+DEVICE_ATTR(active, S_IRUGO | S_IWUSR, vexpress_reset_active_show,
+               vexpress_reset_active_store);
+
+
+enum vexpress_reset_func { FUNC_RESET, FUNC_SHUTDOWN, FUNC_REBOOT };
+
+static struct of_device_id vexpress_reset_of_match[] = {
+       {
+               .compatible = "arm,vexpress-reset",
+               .data = (void *)FUNC_RESET,
+       }, {
+               .compatible = "arm,vexpress-shutdown",
+               .data = (void *)FUNC_SHUTDOWN
+       }, {
+               .compatible = "arm,vexpress-reboot",
+               .data = (void *)FUNC_REBOOT
+       },
+       {}
+};
+
+static int vexpress_reset_probe(struct platform_device *pdev)
+{
+       enum vexpress_reset_func func;
+       const struct of_device_id *match =
+                       of_match_device(vexpress_reset_of_match, &pdev->dev);
+
+       if (match)
+               func = (enum vexpress_reset_func)match->data;
+       else
+               func = pdev->id_entry->driver_data;
+
+       switch (func) {
+       case FUNC_SHUTDOWN:
+               vexpress_power_off_device = &pdev->dev;
+               break;
+       case FUNC_RESET:
+               if (!vexpress_restart_device)
+                       vexpress_restart_device = &pdev->dev;
+               device_create_file(&pdev->dev, &dev_attr_active);
+               break;
+       case FUNC_REBOOT:
+               vexpress_restart_device = &pdev->dev;
+               device_create_file(&pdev->dev, &dev_attr_active);
+               break;
+       };
+
+       return 0;
+}
+
+static const struct platform_device_id vexpress_reset_id_table[] = {
+       { .name = "vexpress-reset", .driver_data = FUNC_RESET, },
+       { .name = "vexpress-shutdown", .driver_data = FUNC_SHUTDOWN, },
+       { .name = "vexpress-reboot", .driver_data = FUNC_REBOOT, },
+       {}
+};
+
+static struct platform_driver vexpress_reset_driver = {
+       .probe = vexpress_reset_probe,
+       .driver = {
+               .name = "vexpress-reset",
+               .of_match_table = vexpress_reset_of_match,
+       },
+       .id_table = vexpress_reset_id_table,
+};
+
+static int __init vexpress_reset_init(void)
+{
+       return platform_driver_register(&vexpress_reset_driver);
+}
+device_initcall(vexpress_reset_init);