linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 00/47] kernel: Add support for power-off handler call chain
@ 2014-10-27 15:55 Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 01/47] " Guenter Roeck
                   ` (46 more replies)
  0 siblings, 47 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Alan Cox, Alexander Graf, Andrew Morton,
	Geert Uytterhoeven, Heiko Stuebner, Lee Jones, Len Brown,
	Pavel Machek, Rafael J. Wysocki, Romain Perier

Various drivers implement architecture and/or device specific means to
remove power from the system.  For the most part, those drivers set the
global variable pm_power_off to point to a function within the driver.

This mechanism has a number of drawbacks.  Typically only one means
to remove power is supported (at least if pm_power_off is used).
At least in theory there can be multiple means to remove power, some of
which may be less desirable.  For example, one mechanism might power off the
entire system through an I/O port or gpio pin, while another might power off
a board by disabling its power controller. Other mechanisms may really just
execute a restart sequence or drop into the ROM monitor, or put the CPU into
sleep mode.  Using pm_power_off can also be racy if the function pointer is
set from a driver built as module, as the driver may be in the process of
being unloaded when pm_power_off is called.  If there are multiple power-off
handlers in the system, removing a module with such a handler may
inadvertently reset the pointer to pm_power_off to NULL, leaving the system
with no means to remove power.

Introduce a system power-off handler call chain to solve the described
problems.  This call chain is expected to be executed from the architecture
specific machine_power_off() function.  Drivers providing system power-off
functionality are expected to register with this call chain.  By using the
priority field in the notifier block, callers can control power-off handler
execution sequence and thus ensure that the power-off handler with the
optimal capabilities to remove power for a given system is called first.
A call chain instead of a single call to the highest priority handler is
used to provide fallback: If multiple power-off handlers are installed,
all handlers will be called until one actually succeeds to power off the
system.

Patch 01/47 implements the power-off handler API.

Patches 02/47 to 04/47 are cleanup patches to prepare for the move of
pm_power_off to a common location.

Patches 05/47 to 07/47 remove references to pm_power_off from devicetree
bindings descriptions.

Patch 08/47 moves the pm_power_off variable from architecture code to
kernel/reboot.c. 

Patches 09/47 to 34/47 convert various drivers to register with the kernel
power-off handler instead of setting pm_power_off directly.

Patches 35/47 to 46/47 do the same for architecture code.

Patch 47/47 finally removes pm_power_off.

For the most part, the individual patches include explanations why specific
priorities were chosen, at least if the selected priority is not the default
priority. Subsystem and architecture maintainers are encouraged to have a look
at the selected priorities and suggest improvements.

I ran the final code through my normal build and qemu tests. Results are
available at http://server.roeck-us.net:8010/builders in the 'poweroff-handler'
column. I also built all available configurations for arm, mips, powerpc,
m68k, and sh architectures.

The series is available in branch poweroff-handler of my repository at
git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git.
It is based on 3.18-rc2.

A note on Cc: In the initial submission I had way too many Cc:, causing the
patchset to be treated as spam by many mailers and mailing list handlers,
which of course defeated the purpose. This time around I am cutting down
the distribution list down significantly. My apologies to anyone I may have
failed to copy this time around.

Important changes since v2:
- Rebased series to v3.18-rc2.
- Do not hold any locks while executing the power-off call chain.
  This ensures that power-off handlers are executed in the state
  selected by the machine_power_off function for a given architecture,
  ie without changing the current semantics of power-off callbacks and
  machine_power_off functions.
  Power-off handler registration and de-registration is handled in atomic
  context with interrupts disabled to ensure that those functions are not
  interrupted by code which powers off the system.
- Use [xxx_]power_off[_xxx] instead of [xxx_]poweroff[_xxx] for newly
  introduced function and variable names.
- Use power-off instead of poweroff in descriptive text and comments.
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
- Use ACPI: instead of acpi: for messages in acpi code.

Important changes since v1:
- Rebased series to v3.18-rc1.
- Use raw notifier with spinlock protection instead of atomic notifiers,
  since some power-off handlers need to have interrupts enabled.
- Renamed API functions from _poweroff to _power_off.
- Added various Acks.
- Build tested all configurations for arm, powerpc, and mips architectures.
- Fixed two compile errors in mips patch.
- Replaced dev_err and pr_err with dev_warn and pr_warn if an error is not
  fatal.
- Provide managed resources API and use where appropriate.
- Provide and use definitions for standard priorities.
- Added patches to convert newly introduced power-off handlers.
- Various minor changes.

Important changes since RFC:
- Move API to new file kernel/power/power_off_handler.c.
- Move pm_power_off pointer to kernel/power/power_off_handler.c. Call
  pm_power_off from do_kernel_power_off, and only call do_kernel_power_off
  from architecture code instead of calling both pm_power_off and
  do_kernel_power_off.
- Provide additional API function register_power_off_handler_simple
  to simplify conversion of architecture code.
- Provide additional API function have_kernel_power_off to check if
  a power-off handler was installed.
- Convert all drivers and architecture code to use the new API.
- Remove pm_power_off as last patch of the series.

Cc: Alan Cox <gnomes@lxorguk.ukuu.org.uk>
Cc: Alexander Graf <agraf@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
cc: Heiko Stuebner <heiko@sntech.de>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Len Brown <len.brown@intel.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Romain Perier <romain.perier@gmail.com>

^ permalink raw reply	[flat|nested] 88+ messages in thread

* [PATCH v3 01/47] kernel: Add support for power-off handler call chain
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-28 17:49   ` Pavel Machek
  2014-10-27 15:55 ` [PATCH v3 02/47] memory: emif: Use API function to determine power-off capability Guenter Roeck
                   ` (45 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Alan Cox, Alexander Graf, Andrew Morton,
	Geert Uytterhoeven, Heiko Stuebner, Lee Jones, Len Brown,
	Pavel Machek, Philippe Rétornaz, Rafael J. Wysocki,
	Romain Perier

Various drivers implement architecture and/or device specific means to
power off the system.  For the most part, those drivers set the global
variable pm_power_off to point to a function within the driver.

This mechanism has a number of drawbacks.  Typically only one scheme
to remove power is supported (at least if pm_power_off is used).
At least in theory there can be multiple means remove power, some of
which may be less desirable. For example, some mechanisms may only
power off the CPU or the CPU card, while another may power off the
entire system.  Others may really just execute a restart sequence
or drop into the ROM monitor. Using pm_power_off can also be racy
if the function pointer is set from a driver built as module, as the
driver may be in the process of being unloaded when pm_power_off is
called. If there are multiple power-off handlers in the system, removing
a module with such a handler may inadvertently reset the pointer to
pm_power_off to NULL, leaving the system with no means to remove power.

Introduce a system power-off handler call chain to solve the described
problems.  This call chain is expected to be executed from the
architecture specific machine_power_off() function.  Drivers providing
system power-off functionality are expected to register with this call chain.
By using the priority field in the notifier block, callers can control
power-off handler execution sequence and thus ensure that the power-off
handler with the optimal capabilities to remove power for a given system
is called first.

Cc: Alan Cox <gnomes@lxorguk.ukuu.org.uk>
Cc: Alexander Graf <agraf@suse.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Geert Uytterhoeven <geert@linux-m68k.org>
cc: Heiko Stuebner <heiko@sntech.de>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Len Brown <len.brown@intel.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Philippe Rétornaz <philippe.retornaz@gmail.com>
Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Romain Perier <romain.perier@gmail.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Rename new file to power_off_handler.c
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
- Execute power-off handlers without any locks held
v2:
- poweroff -> power_off
- Add defines for default priorities
- Use raw notifiers protected by spinlocks instead of atomic notifiers
- Add register_poweroff_handler_simple
- Add devm_register_power_off_handler

 include/linux/pm.h               |  22 ++++
 kernel/power/Makefile            |   1 +
 kernel/power/power_off_handler.c | 268 +++++++++++++++++++++++++++++++++++++++
 3 files changed, 291 insertions(+)
 create mode 100644 kernel/power/power_off_handler.c

diff --git a/include/linux/pm.h b/include/linux/pm.h
index 383fd68..49b3420 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -34,7 +34,29 @@
 extern void (*pm_power_off)(void);
 extern void (*pm_power_off_prepare)(void);
 
+/*
+ * Callbacks to manage power-off handlers
+ */
+
+struct notifier_block;
 struct device; /* we have a circular dep with device.h */
+
+int register_power_off_handler(struct notifier_block *);
+int devm_register_power_off_handler(struct device *, struct notifier_block *);
+int register_power_off_handler_simple(void (*function)(void), int priority);
+int unregister_power_off_handler(struct notifier_block *);
+void do_kernel_power_off(void);
+bool have_kernel_power_off(void);
+
+/*
+ * Pre-defined power-off handler priorities
+ */
+#define POWER_OFF_PRIORITY_FALLBACK	0
+#define POWER_OFF_PRIORITY_LOW		64
+#define POWER_OFF_PRIORITY_DEFAULT	128
+#define POWER_OFF_PRIORITY_HIGH		192
+#define POWER_OFF_PRIORITY_HIGHEST	255
+
 #ifdef CONFIG_VT_CONSOLE_SLEEP
 extern void pm_vt_switch_required(struct device *dev, bool required);
 extern void pm_vt_switch_unregister(struct device *dev);
diff --git a/kernel/power/Makefile b/kernel/power/Makefile
index 29472bf..567eda5 100644
--- a/kernel/power/Makefile
+++ b/kernel/power/Makefile
@@ -2,6 +2,7 @@
 ccflags-$(CONFIG_PM_DEBUG)	:= -DDEBUG
 
 obj-y				+= qos.o
+obj-y				+= power_off_handler.o
 obj-$(CONFIG_PM)		+= main.o
 obj-$(CONFIG_VT_CONSOLE_SLEEP)	+= console.o
 obj-$(CONFIG_FREEZER)		+= process.o
diff --git a/kernel/power/power_off_handler.c b/kernel/power/power_off_handler.c
new file mode 100644
index 0000000..f838e63
--- /dev/null
+++ b/kernel/power/power_off_handler.c
@@ -0,0 +1,268 @@
+/*
+ * linux/kernel/power/power_off_handler.c - Power-off handling functions
+ *
+ * Copyright (c) 2014 Guenter Roeck
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public Licence
+ * as published by the Free Software Foundation; either version
+ * 2 of the Licence, or (at your option) any later version.
+ */
+
+#define pr_fmt(fmt)	"power-off: " fmt
+
+#include <linux/ctype.h>
+#include <linux/device.h>
+#include <linux/export.h>
+#include <linux/kallsyms.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
+#include <linux/slab.h>
+#include <linux/spinlock.h>
+#include <linux/types.h>
+
+/*
+ *	Notifier list for kernel code which wants to be called
+ *	to power off the system.
+ */
+static RAW_NOTIFIER_HEAD(power_off_handler_list);
+static DEFINE_SPINLOCK(power_off_handler_lock);
+
+/*
+ * Internal function to register power-off notifier.
+ * Must be called with power-off spinlock acquired.
+ */
+static int _register_power_off_handler(struct notifier_block *nb)
+{
+	return raw_notifier_chain_register(&power_off_handler_list, nb);
+}
+
+/**
+ *	register_power_off_handler - Register function to be called to power off
+ *				     the system
+ *	@nb: Info about handler function to be called
+ *	@nb->priority:	Handler priority. Handlers should follow the
+ *			following guidelines for setting priorities.
+ *			0:	Power-off handler of last resort,
+ *				with limited power-off capabilities,
+ *				such as power-off handlers which
+ *				do not really power off the system
+ *				but loop forever or stop the CPU.
+ *			128:	Default power-off handler; use if no other
+ *				power-off handler is expected to be available,
+ *				and/or if power-off functionality is
+ *				sufficient to power off the entire system
+ *			255:	Highest priority power-off handler, will
+ *				preempt all other power-off handlers
+ *
+ *	Registers a function with code to be called to power off the
+ *	system.
+ *
+ *	Registered functions will be called from machine_power_off as last
+ *	step of the power-off sequence. Registered functions are expected
+ *	to power off the system immediately. If more than one function is
+ *	registered, the power-off handler priority selects which function
+ *	will be called first.
+ *
+ *	Power-off handlers may be registered from architecture code or from
+ *	drivers. A typical use case would be a system where power off
+ *	functionality is provided through a multi-function chip or through
+ *	a programmable power controller. Multiple power-off handlers may exist;
+ *	for example, one power-off handler might power off the entire system,
+ *	while another only powers off the CPU card. In such cases, the
+ *	power-off handler which only powers off part of the hardware is
+ *	expected to register with low priority to ensure that it only
+ *	runs if no other means to power off the system are available.
+ *
+ *	Always returns zero, as raw_notifier_chain_register() always
+ *	returns zero.
+ */
+int register_power_off_handler(struct notifier_block *nb)
+{
+	unsigned long flags;
+	int ret;
+
+	spin_lock_irqsave(&power_off_handler_lock, flags);
+	ret = _register_power_off_handler(nb);
+	spin_unlock_irqrestore(&power_off_handler_lock, flags);
+
+	return ret;
+}
+EXPORT_SYMBOL(register_power_off_handler);
+
+/**
+ *	unregister_power_off_handler - Unregister previously registered
+ *				       power-off handler
+ *	@nb: Hook to be unregistered
+ *
+ *	Unregisters a previously registered power-off handler function.
+ *
+ *	Returns zero on success, or %-ENOENT on failure.
+ */
+int unregister_power_off_handler(struct notifier_block *nb)
+{
+	unsigned long flags;
+	int ret;
+
+	spin_lock_irqsave(&power_off_handler_lock, flags);
+	ret = raw_notifier_chain_unregister(&power_off_handler_list, nb);
+	spin_unlock_irqrestore(&power_off_handler_lock, flags);
+
+	return ret;
+}
+EXPORT_SYMBOL(unregister_power_off_handler);
+
+struct _power_off_handler_data {
+	void (*handler)(void);
+	struct notifier_block power_off_nb;
+};
+
+static int _power_off_handler(struct notifier_block *this,
+			      unsigned long _unused1, void *_unused2)
+{
+	struct _power_off_handler_data *poh =
+		container_of(this, struct _power_off_handler_data,
+			     power_off_nb);
+
+	poh->handler();
+
+	return NOTIFY_DONE;
+}
+
+static struct _power_off_handler_data power_off_handler_data;
+
+/**
+ *	register_power_off_handler_simple - Register function to be called
+ *					    to power off the system
+ *	@handler:	Function to be called to power off the system
+ *	@priority:	Handler priority. For priority guidelines see
+ *			register_power_off_handler.
+ *
+ *	This is a simplified version of register_power_off_handler. It does
+ *	not take a notifier as argument, but a function pointer. The function
+ *	registers a power-off handler with specified priority. Power-off
+ *	handlers registered with this function can not be unregistered,
+ *	and only a single power-off handler can be installed using it.
+ *
+ *	This function must not be called from modules and is therefore
+ *	not exported.
+ *
+ *	Returns -EBUSY if a power-off handler has already been registered
+ *	using register_power_off_handler_simple. Otherwise returns zero,
+ *	since raw_notifier_chain_register() currently always returns zero.
+ */
+int register_power_off_handler_simple(void (*handler)(void), int priority)
+{
+	unsigned long flags;
+	int ret;
+
+	spin_lock_irqsave(&power_off_handler_lock, flags);
+
+	if (power_off_handler_data.handler) {
+		pr_warn("Power-off function already registered (%ps), cannot register %ps",
+			power_off_handler_data.handler, handler);
+		ret = -EBUSY;
+		goto abort;
+	}
+
+	power_off_handler_data.handler = handler;
+	power_off_handler_data.power_off_nb.notifier_call = _power_off_handler;
+	power_off_handler_data.power_off_nb.priority = priority;
+
+	ret = _register_power_off_handler(&power_off_handler_data.power_off_nb);
+abort:
+	spin_unlock_irqrestore(&power_off_handler_lock, flags);
+	return ret;
+}
+
+/* Device managed power-off handler registration */
+
+static void devm_power_off_release(struct device *dev, void *res)
+{
+	struct notifier_block *nb = *(struct notifier_block **)res;
+
+	unregister_power_off_handler(nb);
+}
+
+/**
+ *	devm_register_power_off_handler - Register function to be called
+ *					  to power off the system
+ *	@dev:		The device registering the power-off handler.
+ *	@handler:	Function to be called to power off the system
+ *	@priority:	Handler priority. For priority guidelines see
+ *			register_power_off_handler.
+ *
+ *	This is the device managed version of register_power_off_handler.
+ *
+ *	Returns -EINVAL if dev is NULL. Returns -ENOMEM if the system is out
+ *	of memory. Otherwise returns zero, since raw_notifier_chain_register()
+ *	currently always returns zero.
+ */
+int devm_register_power_off_handler(struct device *dev,
+				    struct notifier_block *nb)
+{
+	struct notifier_block **ptr;
+	unsigned long flags;
+	int ret;
+
+	if (!dev)
+		return -EINVAL;
+
+	ptr = devres_alloc(devm_power_off_release, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return -ENOMEM;
+
+	spin_lock_irqsave(&power_off_handler_lock, flags);
+	ret = _register_power_off_handler(nb);
+	spin_unlock_irqrestore(&power_off_handler_lock, flags);
+	if (ret)
+		goto error;
+
+	*ptr = nb;
+	devres_add(dev, ptr);
+	return 0;
+error:
+	devres_free(ptr);
+	return ret;
+}
+EXPORT_SYMBOL(devm_register_power_off_handler);
+
+/**
+ *	do_kernel_power_off - Execute kernel power-off handler call chain
+ *
+ *	Calls functions registered with register_power_off_handler.
+ *
+ *	Expected to be called from machine_power_off as last step of
+ *	the power-off sequence.
+ *
+ *	Powers the system off immediately if a power-off handler function
+ *	has been registered. Otherwise does nothing.
+ */
+void do_kernel_power_off(void)
+{
+	/*
+	 * No locking. This code can be called from both atomic and non-atomic
+	 * context, with interrupts enabled or disabled, depending on the
+	 * architecture and platform.
+	 *
+	 * Power-off handler registration and de-registration are executed in
+	 * atomic context with interrupts disabled, which guarantees that
+	 * do_kernel_power_off() will not be called while a power-off handler
+	 * is installed or removed.
+	 * There is a theoretic risc that a power-off handler is installed or
+	 * removed while the call chain is traversed, but we'll have to carry
+	 * that risk.
+	 */
+	raw_notifier_call_chain(&power_off_handler_list, 0, NULL);
+}
+
+/**
+ * have_kernel_power_off() - Check if kernel power-off handler is available
+ *
+ * Returns true is a kernel power-off handler is available, false otherwise.
+ */
+bool have_kernel_power_off(void)
+{
+	return pm_power_off != NULL || power_off_handler_list.head != NULL;
+}
+EXPORT_SYMBOL(have_kernel_power_off);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 02/47] memory: emif: Use API function to determine power-off capability
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 01/47] " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 03/47] hibernate: Call have_kernel_power_off instead of checking pm_power_off Guenter Roeck
                   ` (44 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Santosh Shilimkar, Santosh Shilimkar

Use have_kernel_power_off() to determine if the kernel is able
to power off the system.

Cc: Santosh Shilimkar <santosh.shilimkar@ti.com>
Acked-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
v2:
- poweroff -> power_off

 drivers/memory/emif.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/memory/emif.c b/drivers/memory/emif.c
index 04644e7..317d49f 100644
--- a/drivers/memory/emif.c
+++ b/drivers/memory/emif.c
@@ -1053,10 +1053,10 @@ static irqreturn_t emif_threaded_isr(int irq, void *dev_id)
 		dev_emerg(emif->dev, "SDRAM temperature exceeds operating limit.. Needs shut down!!!\n");
 
 		/* If we have Power OFF ability, use it, else try restarting */
-		if (pm_power_off) {
+		if (have_kernel_power_off()) {
 			kernel_power_off();
 		} else {
-			WARN(1, "FIXME: NO pm_power_off!!! trying restart\n");
+			WARN(1, "FIXME: NO kernel power-off capability!!! trying restart\n");
 			kernel_restart("SDRAM Over-temp Emergency restart");
 		}
 		return IRQ_HANDLED;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 03/47] hibernate: Call have_kernel_power_off instead of checking pm_power_off
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 01/47] " Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 02/47] memory: emif: Use API function to determine power-off capability Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-28 17:50   ` Pavel Machek
  2014-10-27 15:55 ` [PATCH v3 04/47] m68k: Replace mach_power_off with pm_power_off Guenter Roeck
                   ` (43 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Rafael J. Wysocki, Pavel Machek,
	Len Brown

Power-off handlers may now be installed with register_power_off_handler.
Use the new API function have_kernel_power_off to determine if a power-off
handler has been installed.

Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Len Brown <len.brown@intel.com>
Acked-by: Rafael J. Wysocki <rjw@rjwysocki.net>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- No change
v2:
- have_kernel_poweroff -> have_kernel_power_off

 kernel/power/hibernate.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
index a9dfa79..69225b7 100644
--- a/kernel/power/hibernate.c
+++ b/kernel/power/hibernate.c
@@ -602,7 +602,7 @@ static void power_down(void)
 	case HIBERNATION_PLATFORM:
 		hibernation_platform_enter();
 	case HIBERNATION_SHUTDOWN:
-		if (pm_power_off)
+		if (have_kernel_power_off())
 			kernel_power_off();
 		break;
 #ifdef CONFIG_SUSPEND
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 04/47] m68k: Replace mach_power_off with pm_power_off
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (2 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 03/47] hibernate: Call have_kernel_power_off instead of checking pm_power_off Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
       [not found] ` <1414425354-10359-1-git-send-email-linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
                   ` (42 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Geert Uytterhoeven, Greg Ungerer,
	Joshua Thompson, linux-m68k

Replace mach_power_off with pm_power_off to simplify the subsequent
move of pm_power_off to generic code.

Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Greg Ungerer <gerg@uclinux.org>
Cc: Joshua Thompson <funaho@jurai.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- No change
v2:
- have_kernel_poweroff -> have_kernel_power_off

 arch/m68k/emu/natfeat.c         | 3 ++-
 arch/m68k/include/asm/machdep.h | 1 -
 arch/m68k/kernel/process.c      | 5 +++--
 arch/m68k/kernel/setup_mm.c     | 1 -
 arch/m68k/kernel/setup_no.c     | 1 -
 arch/m68k/mac/config.c          | 3 ++-
 6 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/arch/m68k/emu/natfeat.c b/arch/m68k/emu/natfeat.c
index 71b78ec..91e2ae7 100644
--- a/arch/m68k/emu/natfeat.c
+++ b/arch/m68k/emu/natfeat.c
@@ -15,6 +15,7 @@
 #include <linux/string.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/pm.h>
 #include <linux/io.h>
 #include <asm/machdep.h>
 #include <asm/natfeat.h>
@@ -90,5 +91,5 @@ void __init nf_init(void)
 	pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16,
 		version & 0xffff);
 
-	mach_power_off = nf_poweroff;
+	pm_power_off = nf_poweroff;
 }
diff --git a/arch/m68k/include/asm/machdep.h b/arch/m68k/include/asm/machdep.h
index 953ca21..f9fac51 100644
--- a/arch/m68k/include/asm/machdep.h
+++ b/arch/m68k/include/asm/machdep.h
@@ -24,7 +24,6 @@ extern int (*mach_set_rtc_pll)(struct rtc_pll_info *);
 extern int (*mach_set_clock_mmss)(unsigned long);
 extern void (*mach_reset)( void );
 extern void (*mach_halt)( void );
-extern void (*mach_power_off)( void );
 extern unsigned long (*mach_hd_init) (unsigned long, unsigned long);
 extern void (*mach_hd_setup)(char *, int *);
 extern long mach_max_dma_address;
diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
index c55ff71..afe3d6e 100644
--- a/arch/m68k/kernel/process.c
+++ b/arch/m68k/kernel/process.c
@@ -22,6 +22,7 @@
 #include <linux/unistd.h>
 #include <linux/ptrace.h>
 #include <linux/user.h>
+#include <linux/pm.h>
 #include <linux/reboot.h>
 #include <linux/init_task.h>
 #include <linux/mqueue.h>
@@ -77,8 +78,8 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (mach_power_off)
-		mach_power_off();
+	if (pm_power_off)
+		pm_power_off();
 	for (;;);
 }
 
diff --git a/arch/m68k/kernel/setup_mm.c b/arch/m68k/kernel/setup_mm.c
index 5b8ec4d..002fea6 100644
--- a/arch/m68k/kernel/setup_mm.c
+++ b/arch/m68k/kernel/setup_mm.c
@@ -96,7 +96,6 @@ EXPORT_SYMBOL(mach_get_rtc_pll);
 EXPORT_SYMBOL(mach_set_rtc_pll);
 void (*mach_reset)( void );
 void (*mach_halt)( void );
-void (*mach_power_off)( void );
 long mach_max_dma_address = 0x00ffffff; /* default set to the lower 16MB */
 #ifdef CONFIG_HEARTBEAT
 void (*mach_heartbeat) (int);
diff --git a/arch/m68k/kernel/setup_no.c b/arch/m68k/kernel/setup_no.c
index 88c27d9..1520156 100644
--- a/arch/m68k/kernel/setup_no.c
+++ b/arch/m68k/kernel/setup_no.c
@@ -55,7 +55,6 @@ int (*mach_hwclk) (int, struct rtc_time*);
 /* machine dependent reboot functions */
 void (*mach_reset)(void);
 void (*mach_halt)(void);
-void (*mach_power_off)(void);
 
 #ifdef CONFIG_M68000
 #if defined(CONFIG_M68328)
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c
index a471eab..677913ff 100644
--- a/arch/m68k/mac/config.c
+++ b/arch/m68k/mac/config.c
@@ -16,6 +16,7 @@
 #include <linux/tty.h>
 #include <linux/console.h>
 #include <linux/interrupt.h>
+#include <linux/pm.h>
 /* keyb */
 #include <linux/random.h>
 #include <linux/delay.h>
@@ -159,7 +160,7 @@ void __init config_mac(void)
 	mach_set_clock_mmss = mac_set_clock_mmss;
 	mach_reset = mac_reset;
 	mach_halt = mac_poweroff;
-	mach_power_off = mac_poweroff;
+	pm_power_off = mac_poweroff;
 	mach_max_dma_address = 0xffffffff;
 #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
 	mach_beep = mac_mksound;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 05/47] mfd: as3722: Drop reference to pm_power_off from devicetree bindings
       [not found] ` <1414425354-10359-1-git-send-email-linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
@ 2014-10-27 15:55   ` Guenter Roeck
  2014-10-27 15:55   ` [PATCH v3 07/47] qnap-poweroff: " Guenter Roeck
  2014-10-27 15:55   ` [PATCH v3 46/47] efi: Register power-off handler with kernel power-off handler Guenter Roeck
  2 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-pm-u79uwXL29TY76Z2rM5mHXA, Guenter Roeck, Rob Herring,
	Pawel Moll, Mark Rutland, devicetree-u79uwXL29TY76Z2rM5mHXA,
	Ian Campbell, Kumar Gala

Devicetree bindings are supposed to be operating system independent
and should thus not describe how a specific functionality is implemented
in Linux.

Cc: Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Pawel Moll <pawel.moll-5wv7dgnIgG8@public.gmane.org>
Cc: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>
Acked-by: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>
Acked-by: Lee Jones <lee.jones-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
Signed-off-by: Guenter Roeck <linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
---
v3:
- No change
v2:
- No change

 Documentation/devicetree/bindings/mfd/as3722.txt | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/mfd/as3722.txt b/Documentation/devicetree/bindings/mfd/as3722.txt
index 4f64b2a..0b2a609 100644
--- a/Documentation/devicetree/bindings/mfd/as3722.txt
+++ b/Documentation/devicetree/bindings/mfd/as3722.txt
@@ -122,8 +122,7 @@ Following are properties of regulator subnode.
 
 Power-off:
 =========
-AS3722 supports the system power off by turning off all its rail. This
-is provided through pm_power_off.
+AS3722 supports the system power off by turning off all its rails.
 The device node should have the following properties to enable this
 functionality
 ams,system-power-controller: Boolean, to enable the power off functionality
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 06/47] gpio-poweroff: Drop reference to pm_power_off from devicetree bindings
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (4 preceding siblings ...)
       [not found] ` <1414425354-10359-1-git-send-email-linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 08/47] kernel: Move pm_power_off to common code Guenter Roeck
                   ` (40 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Rob Herring, Pawel Moll, Mark Rutland,
	devicetree, Ian Campbell, Kumar Gala

pm_power_off is an implementation detail. Replace it with a more generic
description of the driver's functionality.

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Pawel Moll <pawel.moll@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Acked-by: Mark Rutland <mark.rutland@arm.com>
Acked-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
v2:
- No change

 Documentation/devicetree/bindings/gpio/gpio-poweroff.txt | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt b/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt
index d4eab92..78262de 100644
--- a/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt
+++ b/Documentation/devicetree/bindings/gpio/gpio-poweroff.txt
@@ -2,12 +2,12 @@ Driver a GPIO line that can be used to turn the power off.
 
 The driver supports both level triggered and edge triggered power off.
 At driver load time, the driver will request the given gpio line and
-install a pm_power_off handler. If the optional properties 'input' is
-not found, the GPIO line will be driven in the inactive
+install a handler to power off the system. If the optional properties
+'input' is not found, the GPIO line will be driven in the inactive
 state. Otherwise its configured as an input.
 
-When the pm_power_off is called, the gpio is configured as an output,
-and drive active, so triggering a level triggered power off
+When the the power-off handler is called, the gpio is configured as an
+output, and drive active, so triggering a level triggered power off
 condition. This will also cause an inactive->active edge condition, so
 triggering positive edge triggered power off. After a delay of 100ms,
 the GPIO is set to inactive, thus causing an active->inactive edge,
@@ -24,7 +24,7 @@ Required properties:
 
 Optional properties:
 - input : Initially configure the GPIO line as an input. Only reconfigure
-  it to an output when the pm_power_off function is called. If this optional
+  it to an output when the power-off handler is called. If this optional
   property is not specified, the GPIO is initialized as an output in its
   inactive state.
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 07/47] qnap-poweroff: Drop reference to pm_power_off from devicetree bindings
       [not found] ` <1414425354-10359-1-git-send-email-linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
  2014-10-27 15:55   ` [PATCH v3 05/47] mfd: as3722: Drop reference to pm_power_off from devicetree bindings Guenter Roeck
@ 2014-10-27 15:55   ` Guenter Roeck
  2014-10-27 15:55   ` [PATCH v3 46/47] efi: Register power-off handler with kernel power-off handler Guenter Roeck
  2 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-pm-u79uwXL29TY76Z2rM5mHXA, Guenter Roeck, Rob Herring,
	Pawel Moll, Mark Rutland, devicetree-u79uwXL29TY76Z2rM5mHXA,
	Ian Campbell, Kumar Gala

Replace reference to pm_power_off (which is an implementation detail)
and replace it with a more generic description of the driver's functionality.

Cc: Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Pawel Moll <pawel.moll-5wv7dgnIgG8@public.gmane.org>
Cc: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>
Acked-by: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>
Acked-by: Andrew Lunn <andrew-g2DYL2Zd6BY@public.gmane.org>
Signed-off-by: Guenter Roeck <linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
---
v3:
- No change
v2:
- Drop implementation details

 Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt b/Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt
index af25e77..c363d71 100644
--- a/Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt
+++ b/Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt
@@ -3,8 +3,7 @@
 QNAP NAS devices have a microcontroller controlling the main power
 supply. This microcontroller is connected to UART1 of the Kirkwood and
 Orion5x SoCs. Sending the character 'A', at 19200 baud, tells the
-microcontroller to turn the power off. This driver adds a handler to
-pm_power_off which is called to turn the power off.
+microcontroller to turn the power off.
 
 Synology NAS devices use a similar scheme, but a different baud rate,
 9600, and a different character, '1'.
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 08/47] kernel: Move pm_power_off to common code
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (5 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 06/47] gpio-poweroff: Drop reference to pm_power_off from devicetree bindings Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler Guenter Roeck
                   ` (39 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, adi-buildroot-devel, linux390,
	linux-alpha, linux-am33-list, linux-arm-kernel, linux-c6x-dev,
	linux-cris-kernel, linux-hexagon, linux-ia64, linux, linux-m68k,
	linux-metag, linux-mips, linux-parisc, linuxppc-dev, linux-s390,
	linux-sh, linux-xtensa, sparclinux, user-mode-linux-devel,
	user-mode-linux-user, x86, xen-devel

pm_power_off is defined for all architectures. Move it to common code.

Have all architectures call do_kernel_power_off instead of pm_power_off.
Some architectures point pm_power_off to machine_power_off. For those,
call do_kernel_power_off from machine_power_off instead.

Acked-by: David Vrabel <david.vrabel@citrix.com>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Acked-by: Hirokazu Takata <takata@linux-m32r.org>
Acked-by: James Hogan <james.hogan@imgtec.com>
Acked-by: Jesper Nilsson <jesper.nilsson@axis.com>
Acked-by: Max Filippov <jcmvbkbc@gmail.com>
Acked-by: Rafael J. Wysocki <rjw@rjwysocki.net>
Acked-by: Richard Weinberger <richard@nod.at>
Acked-by: Xuetao Guan <gxt@mprc.pku.edu.cn>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
v2:
- do_kernel_poweroff -> do_kernel_power_off
- have_kernel_poweroff -> have_kernel_power_off

 arch/alpha/kernel/process.c        |  9 +++------
 arch/arc/kernel/reset.c            |  5 +----
 arch/arm/kernel/process.c          |  5 +----
 arch/arm64/kernel/process.c        |  5 +----
 arch/avr32/kernel/process.c        |  6 +-----
 arch/blackfin/kernel/process.c     |  3 ---
 arch/blackfin/kernel/reboot.c      |  2 ++
 arch/c6x/kernel/process.c          |  9 +--------
 arch/cris/kernel/process.c         |  4 +---
 arch/frv/kernel/process.c          |  5 ++---
 arch/hexagon/kernel/reset.c        |  5 ++---
 arch/ia64/kernel/process.c         |  5 +----
 arch/m32r/kernel/process.c         |  8 ++++----
 arch/m68k/kernel/process.c         |  6 +-----
 arch/metag/kernel/process.c        |  6 +-----
 arch/microblaze/kernel/process.c   |  3 ---
 arch/microblaze/kernel/reset.c     |  1 +
 arch/mips/kernel/reset.c           |  6 +-----
 arch/mn10300/kernel/process.c      |  8 ++------
 arch/openrisc/kernel/process.c     |  8 +++++---
 arch/parisc/kernel/process.c       |  8 ++++----
 arch/powerpc/kernel/setup-common.c |  6 +++---
 arch/s390/kernel/setup.c           |  8 ++------
 arch/score/kernel/process.c        |  8 ++++----
 arch/sh/kernel/reboot.c            |  6 +-----
 arch/sparc/kernel/process_32.c     | 10 ++--------
 arch/sparc/kernel/reboot.c         |  8 ++------
 arch/tile/kernel/reboot.c          |  7 +++----
 arch/um/kernel/reboot.c            |  2 --
 arch/unicore32/kernel/process.c    |  9 +--------
 arch/x86/kernel/reboot.c           | 11 +++--------
 arch/x86/xen/enlighten.c           |  3 +--
 arch/xtensa/kernel/process.c       |  4 ----
 drivers/parisc/power.c             |  3 +--
 kernel/power/power_off_handler.c   |  8 ++++++++
 kernel/reboot.c                    |  4 ++--
 36 files changed, 68 insertions(+), 146 deletions(-)

diff --git a/arch/alpha/kernel/process.c b/arch/alpha/kernel/process.c
index 1941a07..81c43f8 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -24,6 +24,7 @@
 #include <linux/vt.h>
 #include <linux/mman.h>
 #include <linux/elfcore.h>
+#include <linux/pm.h>
 #include <linux/reboot.h>
 #include <linux/tty.h>
 #include <linux/console.h>
@@ -40,12 +41,6 @@
 #include "proto.h"
 #include "pci_impl.h"
 
-/*
- * Power off function, if any
- */
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 #ifdef CONFIG_ALPHA_WTINT
 /*
  * Sleep the CPU.
@@ -184,6 +179,8 @@ machine_halt(void)
 void
 machine_power_off(void)
 {
+	do_kernel_power_off();
+
 	common_shutdown(LINUX_REBOOT_CMD_POWER_OFF, NULL);
 }
 
diff --git a/arch/arc/kernel/reset.c b/arch/arc/kernel/reset.c
index 2768fa1..0758d9d 100644
--- a/arch/arc/kernel/reset.c
+++ b/arch/arc/kernel/reset.c
@@ -26,9 +26,6 @@ void machine_restart(char *__unused)
 
 void machine_power_off(void)
 {
-	/* FIXME ::  power off ??? */
+	do_kernel_power_off();
 	machine_halt();
 }
-
-void (*pm_power_off) (void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c
index fe972a2..aa3f656 100644
--- a/arch/arm/kernel/process.c
+++ b/arch/arm/kernel/process.c
@@ -117,8 +117,6 @@ void soft_restart(unsigned long addr)
 /*
  * Function pointers to optional machine specific functions
  */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
 
 void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
 
@@ -205,8 +203,7 @@ void machine_power_off(void)
 	local_irq_disable();
 	smp_send_stop();
 
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
 
 /*
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index fde9923..6f623a0 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -68,8 +68,6 @@ void soft_restart(unsigned long addr)
 /*
  * Function pointers to optional machine specific functions
  */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL_GPL(pm_power_off);
 
 void (*arm_pm_restart)(enum reboot_mode reboot_mode, const char *cmd);
 
@@ -129,8 +127,7 @@ void machine_power_off(void)
 {
 	local_irq_disable();
 	smp_send_stop();
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
 
 /*
diff --git a/arch/avr32/kernel/process.c b/arch/avr32/kernel/process.c
index 42a53e74..529c1f6 100644
--- a/arch/avr32/kernel/process.c
+++ b/arch/avr32/kernel/process.c
@@ -23,9 +23,6 @@
 
 #include <mach/pm.h>
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 /*
  * This file handles the architecture-dependent parts of process handling..
  */
@@ -48,8 +45,7 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
 
 void machine_restart(char *cmd)
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c
index 4aa5545..812dd83 100644
--- a/arch/blackfin/kernel/process.c
+++ b/arch/blackfin/kernel/process.c
@@ -39,9 +39,6 @@ int nr_l1stack_tasks;
 void *l1_stack_base;
 unsigned long l1_stack_len;
 
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
 /*
  * The idle loop on BFIN
  */
diff --git a/arch/blackfin/kernel/reboot.c b/arch/blackfin/kernel/reboot.c
index c4f50a3..387d610 100644
--- a/arch/blackfin/kernel/reboot.c
+++ b/arch/blackfin/kernel/reboot.c
@@ -7,6 +7,7 @@
  */
 
 #include <linux/interrupt.h>
+#include <linux/pm.h>
 #include <asm/bfin-global.h>
 #include <asm/reboot.h>
 #include <asm/bfrom.h>
@@ -106,6 +107,7 @@ void machine_halt(void)
 __attribute__((weak))
 void native_machine_power_off(void)
 {
+	do_kernel_power_off();
 	idle_with_irq_disabled();
 }
 
diff --git a/arch/c6x/kernel/process.c b/arch/c6x/kernel/process.c
index 57d2ea8..edf7e5a 100644
--- a/arch/c6x/kernel/process.c
+++ b/arch/c6x/kernel/process.c
@@ -27,12 +27,6 @@ void	(*c6x_halt)(void);
 extern asmlinkage void ret_from_fork(void);
 extern asmlinkage void ret_from_kernel_thread(void);
 
-/*
- * power off function, if any
- */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 void arch_cpu_idle(void)
 {
 	unsigned long tmp;
@@ -73,8 +67,7 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	halt_loop();
 }
 
diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c
index b78498e..9ebd76b 100644
--- a/arch/cris/kernel/process.c
+++ b/arch/cris/kernel/process.c
@@ -31,9 +31,6 @@
 
 extern void default_idle(void);
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 void arch_cpu_idle(void)
 {
 	default_idle();
@@ -60,6 +57,7 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
+	do_kernel_power_off();
 }
 
 /*
diff --git a/arch/frv/kernel/process.c b/arch/frv/kernel/process.c
index 5d40aeb77..502dabb 100644
--- a/arch/frv/kernel/process.c
+++ b/arch/frv/kernel/process.c
@@ -42,9 +42,6 @@ asmlinkage void ret_from_kernel_thread(void);
 
 #include <asm/pgalloc.h>
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 static void core_sleep_idle(void)
 {
 #ifdef LED_DEBUG_SLEEP
@@ -107,6 +104,8 @@ void machine_power_off(void)
 	gdbstub_exit(0);
 #endif
 
+	do_kernel_power_off();
+
 	for (;;);
 }
 
diff --git a/arch/hexagon/kernel/reset.c b/arch/hexagon/kernel/reset.c
index 76483c1..6f607b6 100644
--- a/arch/hexagon/kernel/reset.c
+++ b/arch/hexagon/kernel/reset.c
@@ -16,11 +16,13 @@
  * 02110-1301, USA.
  */
 
+#include <linux/pm.h>
 #include <linux/smp.h>
 #include <asm/hexagon_vm.h>
 
 void machine_power_off(void)
 {
+	do_kernel_power_off();
 	smp_send_stop();
 	__vmstop();
 }
@@ -32,6 +34,3 @@ void machine_halt(void)
 void machine_restart(char *cmd)
 {
 }
-
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/ia64/kernel/process.c b/arch/ia64/kernel/process.c
index b515149..88121a2 100644
--- a/arch/ia64/kernel/process.c
+++ b/arch/ia64/kernel/process.c
@@ -57,8 +57,6 @@ void (*ia64_mark_idle)(int);
 
 unsigned long boot_option_idle_override = IDLE_NO_OVERRIDE;
 EXPORT_SYMBOL(boot_option_idle_override);
-void (*pm_power_off) (void);
-EXPORT_SYMBOL(pm_power_off);
 
 void
 ia64_do_show_stack (struct unw_frame_info *info, void *arg)
@@ -675,8 +673,7 @@ machine_halt (void)
 void
 machine_power_off (void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	machine_halt();
 }
 
diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c
index e69221d..65a037e 100644
--- a/arch/m32r/kernel/process.c
+++ b/arch/m32r/kernel/process.c
@@ -23,6 +23,7 @@
 #include <linux/fs.h>
 #include <linux/slab.h>
 #include <linux/module.h>
+#include <linux/pm.h>
 #include <linux/ptrace.h>
 #include <linux/unistd.h>
 #include <linux/hardirq.h>
@@ -44,9 +45,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
 	return tsk->thread.lr;
 }
 
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
 void machine_restart(char *__unused)
 {
 #if defined(CONFIG_PLAT_MAPPI3)
@@ -67,7 +65,9 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	/* M32R_FIXME */
+	do_kernel_power_off();
+	for (;;)
+		;
 }
 
 void show_regs(struct pt_regs * regs)
diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c
index afe3d6e..bbc0a63 100644
--- a/arch/m68k/kernel/process.c
+++ b/arch/m68k/kernel/process.c
@@ -78,14 +78,10 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	for (;;);
 }
 
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 void show_regs(struct pt_regs * regs)
 {
 	printk("\n");
diff --git a/arch/metag/kernel/process.c b/arch/metag/kernel/process.c
index 483dff9..8d95773 100644
--- a/arch/metag/kernel/process.c
+++ b/arch/metag/kernel/process.c
@@ -67,9 +67,6 @@ void arch_cpu_idle_dead(void)
 }
 #endif
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 void (*soc_restart)(char *cmd);
 void (*soc_halt)(void);
 
@@ -90,8 +87,7 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	smp_send_stop();
 	hard_processor_halt(HALT_OK);
 }
diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c
index b2dd371..0ebca36 100644
--- a/arch/microblaze/kernel/process.c
+++ b/arch/microblaze/kernel/process.c
@@ -44,9 +44,6 @@ void show_regs(struct pt_regs *regs)
 				regs->msr, regs->ear, regs->esr, regs->fsr);
 }
 
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
 void flush_thread(void)
 {
 }
diff --git a/arch/microblaze/kernel/reset.c b/arch/microblaze/kernel/reset.c
index fbe58c6..2c6b32c 100644
--- a/arch/microblaze/kernel/reset.c
+++ b/arch/microblaze/kernel/reset.c
@@ -103,6 +103,7 @@ void machine_halt(void)
 void machine_power_off(void)
 {
 	pr_notice("Machine power off...\n");
+	do_kernel_power_off();
 	while (1)
 		;
 }
diff --git a/arch/mips/kernel/reset.c b/arch/mips/kernel/reset.c
index 07fc524..09e74d2 100644
--- a/arch/mips/kernel/reset.c
+++ b/arch/mips/kernel/reset.c
@@ -21,9 +21,6 @@
  */
 void (*_machine_restart)(char *command);
 void (*_machine_halt)(void);
-void (*pm_power_off)(void);
-
-EXPORT_SYMBOL(pm_power_off);
 
 void machine_restart(char *command)
 {
@@ -39,6 +36,5 @@ void machine_halt(void)
 
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
diff --git a/arch/mn10300/kernel/process.c b/arch/mn10300/kernel/process.c
index 3707da5..c78b2eb 100644
--- a/arch/mn10300/kernel/process.c
+++ b/arch/mn10300/kernel/process.c
@@ -20,6 +20,7 @@
 #include <linux/user.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
+#include <linux/pm.h>
 #include <linux/reboot.h>
 #include <linux/percpu.h>
 #include <linux/err.h>
@@ -45,12 +46,6 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
 }
 
 /*
- * power off function, if any
- */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
-/*
  * On SMP it's slightly faster (but much more power-consuming!)
  * to poll the ->work.need_resched flag instead of waiting for the
  * cross-CPU IPI to arrive. Use this option with caution.
@@ -93,6 +88,7 @@ void machine_power_off(void)
 #ifdef CONFIG_KERNEL_DEBUGGER
 	gdbstub_exit(0);
 #endif
+	do_kernel_power_off();
 }
 
 void show_regs(struct pt_regs *regs)
diff --git a/arch/openrisc/kernel/process.c b/arch/openrisc/kernel/process.c
index 386af25..494afd2 100644
--- a/arch/openrisc/kernel/process.c
+++ b/arch/openrisc/kernel/process.c
@@ -25,6 +25,7 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/mm.h>
+#include <linux/pm.h>
 #include <linux/stddef.h>
 #include <linux/unistd.h>
 #include <linux/ptrace.h>
@@ -51,7 +52,7 @@
  */
 struct thread_info *current_thread_info_set[NR_CPUS] = { &init_thread_info, };
 
-void machine_restart(void)
+void machine_restart(char *cmd)
 {
 	printk(KERN_INFO "*** MACHINE RESTART ***\n");
 	__asm__("l.nop 1");
@@ -72,11 +73,12 @@ void machine_halt(void)
 void machine_power_off(void)
 {
 	printk(KERN_INFO "*** MACHINE POWER OFF ***\n");
+
+	do_kernel_power_off();
+
 	__asm__("l.nop 1");
 }
 
-void (*pm_power_off) (void) = machine_power_off;
-
 /*
  * When a process does an "exec", machine state like FPU and debug
  * registers need to be reset.  This is a hook function for that.
diff --git a/arch/parisc/kernel/process.c b/arch/parisc/kernel/process.c
index 0bbbf0d..3f5d14a 100644
--- a/arch/parisc/kernel/process.c
+++ b/arch/parisc/kernel/process.c
@@ -41,6 +41,7 @@
 #include <linux/fs.h>
 #include <linux/module.h>
 #include <linux/personality.h>
+#include <linux/pm.h>
 #include <linux/ptrace.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
@@ -133,7 +134,9 @@ void machine_power_off(void)
 	pdc_soft_power_button(0);
 	
 	pdc_chassis_send_status(PDC_CHASSIS_DIRECT_SHUTDOWN);
-		
+
+	do_kernel_power_off();
+
 	/* It seems we have no way to power the system off via
 	 * software. The user has to press the button himself. */
 
@@ -141,9 +144,6 @@ void machine_power_off(void)
 	       "Please power this system off now.");
 }
 
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 /*
  * Free current thread data structures etc..
  */
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c
index 1362cd6..5b7a851 100644
--- a/arch/powerpc/kernel/setup-common.c
+++ b/arch/powerpc/kernel/setup-common.c
@@ -141,6 +141,9 @@ void machine_power_off(void)
 	machine_shutdown();
 	if (ppc_md.power_off)
 		ppc_md.power_off();
+
+	do_kernel_power_off();
+
 #ifdef CONFIG_SMP
 	smp_send_stop();
 #endif
@@ -151,9 +154,6 @@ void machine_power_off(void)
 /* Used by the G5 thermal driver */
 EXPORT_SYMBOL_GPL(machine_power_off);
 
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL_GPL(pm_power_off);
-
 void machine_halt(void)
 {
 	machine_shutdown();
diff --git a/arch/s390/kernel/setup.c b/arch/s390/kernel/setup.c
index e80d9ff..267e025 100644
--- a/arch/s390/kernel/setup.c
+++ b/arch/s390/kernel/setup.c
@@ -263,13 +263,9 @@ void machine_power_off(void)
 		 */
 		console_unblank();
 	_machine_power_off();
-}
 
-/*
- * Dummy power off function.
- */
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL_GPL(pm_power_off);
+	do_kernel_power_off();
+}
 
 static int __init early_parse_mem(char *p)
 {
diff --git a/arch/score/kernel/process.c b/arch/score/kernel/process.c
index a1519ad3..b76ea67 100644
--- a/arch/score/kernel/process.c
+++ b/arch/score/kernel/process.c
@@ -29,9 +29,6 @@
 #include <linux/pm.h>
 #include <linux/rcupdate.h>
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 /* If or when software machine-restart is implemented, add code here. */
 void machine_restart(char *command) {}
 
@@ -39,7 +36,10 @@ void machine_restart(char *command) {}
 void machine_halt(void) {}
 
 /* If or when software machine-power-off is implemented, add code here. */
-void machine_power_off(void) {}
+void machine_power_off(void)
+{
+	do_kernel_power_off();
+}
 
 void ret_from_fork(void);
 void ret_from_kernel_thread(void);
diff --git a/arch/sh/kernel/reboot.c b/arch/sh/kernel/reboot.c
index 04afe5b..065de12 100644
--- a/arch/sh/kernel/reboot.c
+++ b/arch/sh/kernel/reboot.c
@@ -11,9 +11,6 @@
 #include <asm/tlbflush.h>
 #include <asm/traps.h>
 
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 #ifdef CONFIG_SUPERH32
 static void watchdog_trigger_immediate(void)
 {
@@ -51,8 +48,7 @@ static void native_machine_shutdown(void)
 
 static void native_machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 }
 
 static void native_machine_halt(void)
diff --git a/arch/sparc/kernel/process_32.c b/arch/sparc/kernel/process_32.c
index 50e7b62..cb8148a 100644
--- a/arch/sparc/kernel/process_32.c
+++ b/arch/sparc/kernel/process_32.c
@@ -48,14 +48,6 @@
  */
 void (*sparc_idle)(void);
 
-/* 
- * Power-off handler instantiation for pm.h compliance
- * This is done via auxio, but could be used as a fallback
- * handler when auxio is not present-- unused for now...
- */
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 /*
  * sysctl - toggle power-off restriction for serial console 
  * systems in machine_power_off()
@@ -112,6 +104,8 @@ void machine_power_off(void)
 		sbus_writeb(power_register, auxio_power_register);
 	}
 
+	do_kernel_power_off();
+
 	machine_halt();
 }
 
diff --git a/arch/sparc/kernel/reboot.c b/arch/sparc/kernel/reboot.c
index eba7d91..3c0bb03 100644
--- a/arch/sparc/kernel/reboot.c
+++ b/arch/sparc/kernel/reboot.c
@@ -16,17 +16,13 @@
  */
 int scons_pwroff = 1;
 
-/* This isn't actually used, it exists merely to satisfy the
- * reference in kernel/sys.c
- */
-void (*pm_power_off)(void) = machine_power_off;
-EXPORT_SYMBOL(pm_power_off);
-
 void machine_power_off(void)
 {
 	if (strcmp(of_console_device->type, "serial") || scons_pwroff)
 		prom_halt_power_off();
 
+	do_kernel_power_off();
+
 	prom_halt();
 }
 
diff --git a/arch/tile/kernel/reboot.c b/arch/tile/kernel/reboot.c
index 6c5d2c0..8ff4a7f 100644
--- a/arch/tile/kernel/reboot.c
+++ b/arch/tile/kernel/reboot.c
@@ -36,6 +36,9 @@ void machine_power_off(void)
 {
 	arch_local_irq_disable_all();
 	smp_send_stop();
+
+	do_kernel_power_off();
+
 	hv_power_off();
 }
 
@@ -45,7 +48,3 @@ void machine_restart(char *cmd)
 	smp_send_stop();
 	hv_restart((HV_VirtAddr) "vmlinux", (HV_VirtAddr) cmd);
 }
-
-/* No interesting distinction to be made here. */
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
diff --git a/arch/um/kernel/reboot.c b/arch/um/kernel/reboot.c
index ced8903..a82ef28 100644
--- a/arch/um/kernel/reboot.c
+++ b/arch/um/kernel/reboot.c
@@ -11,8 +11,6 @@
 #include <os.h>
 #include <skas.h>
 
-void (*pm_power_off)(void);
-
 static void kill_off_processes(void)
 {
 	if (proc_mm)
diff --git a/arch/unicore32/kernel/process.c b/arch/unicore32/kernel/process.c
index b008e99..9490dd5 100644
--- a/arch/unicore32/kernel/process.c
+++ b/arch/unicore32/kernel/process.c
@@ -56,16 +56,9 @@ void machine_halt(void)
 	gpio_set_value(GPO_SOFT_OFF, 0);
 }
 
-/*
- * Function pointers to optional machine specific functions
- */
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
 void machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	machine_halt();
 }
 
diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
index 17962e6..5c09e28 100644
--- a/arch/x86/kernel/reboot.c
+++ b/arch/x86/kernel/reboot.c
@@ -30,12 +30,6 @@
 #include <asm/x86_init.h>
 #include <asm/efi.h>
 
-/*
- * Power off function, if any
- */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
 static const struct desc_ptr no_idt = {};
 
 /*
@@ -647,11 +641,12 @@ static void native_machine_halt(void)
 
 static void native_machine_power_off(void)
 {
-	if (pm_power_off) {
+	if (have_kernel_power_off()) {
 		if (!reboot_force)
 			machine_shutdown();
-		pm_power_off();
+		do_kernel_power_off();
 	}
+
 	/* A fallback in case there is no PM info available */
 	tboot_shutdown(TB_SHUTDOWN_HALT);
 }
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index fac5e4f..bc08998 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -1320,8 +1320,7 @@ static void xen_machine_halt(void)
 
 static void xen_machine_power_off(void)
 {
-	if (pm_power_off)
-		pm_power_off();
+	do_kernel_power_off();
 	xen_reboot(SHUTDOWN_poweroff);
 }
 
diff --git a/arch/xtensa/kernel/process.c b/arch/xtensa/kernel/process.c
index 1c85323..c487296 100644
--- a/arch/xtensa/kernel/process.c
+++ b/arch/xtensa/kernel/process.c
@@ -49,10 +49,6 @@ extern void ret_from_kernel_thread(void);
 
 struct task_struct *current_set[NR_CPUS] = {&init_task, };
 
-void (*pm_power_off)(void) = NULL;
-EXPORT_SYMBOL(pm_power_off);
-
-
 #if XTENSA_HAVE_COPROCESSORS
 
 void coprocessor_release_all(struct thread_info *ti)
diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c
index ef31b77..f10cf92 100644
--- a/drivers/parisc/power.c
+++ b/drivers/parisc/power.c
@@ -95,8 +95,7 @@ static void process_shutdown(void)
 		/* send kill signal */
 		if (kill_cad_pid(SIGINT, 1)) {
 			/* just in case killing init process failed */
-			if (pm_power_off)
-				pm_power_off();
+			kernel_power_off();
 		}
 	}
 }
diff --git a/kernel/power/power_off_handler.c b/kernel/power/power_off_handler.c
index f838e63..97b7163 100644
--- a/kernel/power/power_off_handler.c
+++ b/kernel/power/power_off_handler.c
@@ -22,6 +22,12 @@
 #include <linux/types.h>
 
 /*
+ * If set, calling this function will power off the system immediately.
+ */
+void (*pm_power_off)(void);
+EXPORT_SYMBOL(pm_power_off);
+
+/*
  *	Notifier list for kernel code which wants to be called
  *	to power off the system.
  */
@@ -253,6 +259,8 @@ void do_kernel_power_off(void)
 	 * removed while the call chain is traversed, but we'll have to carry
 	 * that risk.
 	 */
+	if (pm_power_off)
+		pm_power_off();
 	raw_notifier_call_chain(&power_off_handler_list, 0, NULL);
 }
 
diff --git a/kernel/reboot.c b/kernel/reboot.c
index 5925f5a..d87d921 100644
--- a/kernel/reboot.c
+++ b/kernel/reboot.c
@@ -306,9 +306,9 @@ SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
 		return ret;
 
 	/* Instead of trying to make the power_off code look like
-	 * halt when pm_power_off is not set do it the easy way.
+	 * halt when no power-off handler exists do it the easy way.
 	 */
-	if ((cmd == LINUX_REBOOT_CMD_POWER_OFF) && !pm_power_off)
+	if (cmd == LINUX_REBOOT_CMD_POWER_OFF && !have_kernel_power_off())
 		cmd = LINUX_REBOOT_CMD_HALT;
 
 	mutex_lock(&reboot_mutex);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (6 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 08/47] kernel: Move pm_power_off to common code Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:56   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 10/47] mfd: axp20x: " Guenter Roeck
                   ` (38 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Samuel Ortiz, Lee Jones

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use devm_register_power_off_handler
- Use dev_warn instead of dev_err

 drivers/mfd/palmas.c       | 31 +++++++++++++++++--------------
 include/linux/mfd/palmas.h |  3 +++
 2 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c
index 28cb048..99c488e 100644
--- a/drivers/mfd/palmas.c
+++ b/drivers/mfd/palmas.c
@@ -19,6 +19,7 @@
 #include <linux/i2c.h>
 #include <linux/interrupt.h>
 #include <linux/irq.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 #include <linux/err.h>
 #include <linux/mfd/core.h>
@@ -425,20 +426,18 @@ static void palmas_dt_to_pdata(struct i2c_client *i2c,
 			"ti,system-power-controller");
 }
 
-static struct palmas *palmas_dev;
-static void palmas_power_off(void)
+static int palmas_power_off(struct notifier_block *this, unsigned long unused1,
+			    void *unused2)
 {
+	struct palmas *palmas = container_of(this, struct palmas, power_off_nb);
 	unsigned int addr;
 	int ret, slave;
 
-	if (!palmas_dev)
-		return;
-
 	slave = PALMAS_BASE_TO_SLAVE(PALMAS_PMU_CONTROL_BASE);
 	addr = PALMAS_BASE_TO_REG(PALMAS_PMU_CONTROL_BASE, PALMAS_DEV_CTRL);
 
 	ret = regmap_update_bits(
-			palmas_dev->regmap[slave],
+			palmas->regmap[slave],
 			addr,
 			PALMAS_DEV_CTRL_DEV_ON,
 			0);
@@ -446,6 +445,8 @@ static void palmas_power_off(void)
 	if (ret)
 		pr_err("%s: Unable to write to DEV_CTRL_DEV_ON: %d\n",
 				__func__, ret);
+
+	return NOTIFY_DONE;
 }
 
 static unsigned int palmas_features = PALMAS_PMIC_FEATURE_SMPS10_BOOST;
@@ -668,9 +669,16 @@ no_irq:
 		ret = of_platform_populate(node, NULL, NULL, &i2c->dev);
 		if (ret < 0) {
 			goto err_irq;
-		} else if (pdata->pm_off && !pm_power_off) {
-			palmas_dev = palmas;
-			pm_power_off = palmas_power_off;
+		} else if (pdata->pm_off) {
+			int ret2;
+
+			palmas->power_off_nb.notifier_call = palmas_power_off;
+			palmas->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+			ret2 = devm_register_power_off_handler(palmas->dev,
+							&palmas->power_off_nb);
+			if (ret2)
+				dev_warn(palmas->dev,
+					 "Failed to register power-off handler");
 		}
 	}
 
@@ -698,11 +706,6 @@ static int palmas_i2c_remove(struct i2c_client *i2c)
 			i2c_unregister_device(palmas->i2c_clients[i]);
 	}
 
-	if (palmas == palmas_dev) {
-		pm_power_off = NULL;
-		palmas_dev = NULL;
-	}
-
 	return 0;
 }
 
diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h
index fb0390a..7dbfe24 100644
--- a/include/linux/mfd/palmas.h
+++ b/include/linux/mfd/palmas.h
@@ -18,6 +18,7 @@
 
 #include <linux/usb/otg.h>
 #include <linux/leds.h>
+#include <linux/notifier.h>
 #include <linux/regmap.h>
 #include <linux/regulator/driver.h>
 #include <linux/extcon.h>
@@ -68,6 +69,8 @@ struct palmas {
 	struct i2c_client *i2c_clients[PALMAS_NUM_CLIENTS];
 	struct regmap *regmap[PALMAS_NUM_CLIENTS];
 
+	struct notifier_block power_off_nb;
+
 	/* Stored chip id */
 	int id;
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 10/47] mfd: axp20x: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (7 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:56   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 11/47] mfd: retu: " Guenter Roeck
                   ` (37 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Lee Jones, Samuel Ortiz

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with a low priority value of 64 to reflect that
the original code only sets pm_power_off if it was not already set.

Cc: Lee Jones <lee.jones@linaro.org>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify powroff handler priority
- Use devm_register_power_off_handler
- Use dev_warn instead of dev_err

 drivers/mfd/axp20x.c       | 30 ++++++++++++++++--------------
 include/linux/mfd/axp20x.h |  1 +
 2 files changed, 17 insertions(+), 14 deletions(-)

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 6231adb..f00db57 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -17,7 +17,8 @@
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
-#include <linux/pm_runtime.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
 #include <linux/regulator/consumer.h>
@@ -150,11 +151,16 @@ static struct mfd_cell axp20x_cells[] = {
 	},
 };
 
-static struct axp20x_dev *axp20x_pm_power_off;
-static void axp20x_power_off(void)
+static int axp20x_power_off(struct notifier_block *this, unsigned long unused1,
+			    void *unused2)
+
 {
-	regmap_write(axp20x_pm_power_off->regmap, AXP20X_OFF_CTRL,
-		     AXP20X_OFF);
+	struct axp20x_dev *axp20x = container_of(this, struct axp20x_dev,
+						 power_off_nb);
+
+	regmap_write(axp20x->regmap, AXP20X_OFF_CTRL, AXP20X_OFF);
+
+	return NOTIFY_DONE;
 }
 
 static int axp20x_i2c_probe(struct i2c_client *i2c,
@@ -204,10 +210,11 @@ static int axp20x_i2c_probe(struct i2c_client *i2c,
 		return ret;
 	}
 
-	if (!pm_power_off) {
-		axp20x_pm_power_off = axp20x;
-		pm_power_off = axp20x_power_off;
-	}
+	axp20x->power_off_nb.notifier_call = axp20x_power_off;
+	axp20x->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+	ret = devm_register_power_off_handler(&i2c->dev, &axp20x->power_off_nb);
+	if (ret)
+		dev_warn(&i2c->dev, "failed to register power-off handler\n");
 
 	dev_info(&i2c->dev, "AXP20X driver loaded\n");
 
@@ -218,11 +225,6 @@ static int axp20x_i2c_remove(struct i2c_client *i2c)
 {
 	struct axp20x_dev *axp20x = i2c_get_clientdata(i2c);
 
-	if (axp20x == axp20x_pm_power_off) {
-		axp20x_pm_power_off = NULL;
-		pm_power_off = NULL;
-	}
-
 	mfd_remove_devices(axp20x->dev);
 	regmap_del_irq_chip(axp20x->i2c_client->irq, axp20x->regmap_irqc);
 
diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
index d0e31a2..9b15482 100644
--- a/include/linux/mfd/axp20x.h
+++ b/include/linux/mfd/axp20x.h
@@ -175,6 +175,7 @@ struct axp20x_dev {
 	struct regmap			*regmap;
 	struct regmap_irq_chip_data	*regmap_irqc;
 	long				variant;
+	struct notifier_block		power_off_nb;
 };
 
 #endif /* __LINUX_MFD_AXP20X_H */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 11/47] mfd: retu: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (8 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 10/47] mfd: axp20x: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:56   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 12/47] mfd: ab8500-sysctrl: " Guenter Roeck
                   ` (36 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Lee Jones, Samuel Ortiz

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Lee Jones <lee.jones@linaro.org>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use devm_register_power_off_handler
- Use dev_warn instead of dev_err

 drivers/mfd/retu-mfd.c | 33 +++++++++++++++++++--------------
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/drivers/mfd/retu-mfd.c b/drivers/mfd/retu-mfd.c
index 663f8a3..7c657e6 100644
--- a/drivers/mfd/retu-mfd.c
+++ b/drivers/mfd/retu-mfd.c
@@ -22,6 +22,8 @@
 #include <linux/slab.h>
 #include <linux/mutex.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 #include <linux/mfd/core.h>
 #include <linux/mfd/retu.h>
@@ -43,6 +45,7 @@ struct retu_dev {
 	struct device			*dev;
 	struct mutex			mutex;
 	struct regmap_irq_chip_data	*irq_data;
+	struct notifier_block		power_off_nb;
 };
 
 static struct resource retu_pwrbutton_res[] = {
@@ -81,9 +84,6 @@ static struct regmap_irq_chip retu_irq_chip = {
 	.ack_base	= RETU_REG_IDR,
 };
 
-/* Retu device registered for the power off. */
-static struct retu_dev *retu_pm_power_off;
-
 static struct resource tahvo_usb_res[] = {
 	{
 		.name	= "tahvo-usb",
@@ -165,12 +165,14 @@ int retu_write(struct retu_dev *rdev, u8 reg, u16 data)
 }
 EXPORT_SYMBOL_GPL(retu_write);
 
-static void retu_power_off(void)
+static int retu_power_off(struct notifier_block *this, unsigned long unused1,
+			  void *unused2)
 {
-	struct retu_dev *rdev = retu_pm_power_off;
+	struct retu_dev *rdev = container_of(this, struct retu_dev,
+					     power_off_nb);
 	int reg;
 
-	mutex_lock(&retu_pm_power_off->mutex);
+	mutex_lock(&rdev->mutex);
 
 	/* Ignore power button state */
 	regmap_read(rdev->regmap, RETU_REG_CC1, &reg);
@@ -183,7 +185,9 @@ static void retu_power_off(void)
 	for (;;)
 		cpu_relax();
 
-	mutex_unlock(&retu_pm_power_off->mutex);
+	mutex_unlock(&rdev->mutex);
+
+	return NOTIFY_DONE;
 }
 
 static int retu_regmap_read(void *context, const void *reg, size_t reg_size,
@@ -279,9 +283,14 @@ static int retu_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
 		return ret;
 	}
 
-	if (i2c->addr == 1 && !pm_power_off) {
-		retu_pm_power_off = rdev;
-		pm_power_off	  = retu_power_off;
+	if (i2c->addr == 1) {
+		rdev->power_off_nb.notifier_call = retu_power_off;
+		rdev->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+		ret = devm_register_power_off_handler(rdev->dev,
+						      &rdev->power_off_nb);
+		if (ret)
+			dev_warn(rdev->dev,
+				 "Failed to register power-off handler\n");
 	}
 
 	return 0;
@@ -291,10 +300,6 @@ static int retu_remove(struct i2c_client *i2c)
 {
 	struct retu_dev *rdev = i2c_get_clientdata(i2c);
 
-	if (retu_pm_power_off == rdev) {
-		pm_power_off	  = NULL;
-		retu_pm_power_off = NULL;
-	}
 	mfd_remove_devices(rdev->dev);
 	regmap_del_irq_chip(i2c->irq, rdev->irq_data);
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 12/47] mfd: ab8500-sysctrl: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (9 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 11/47] mfd: retu: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:55   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 13/47] mfd: max8907: " Guenter Roeck
                   ` (35 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: Samuel Ortiz, linux-pm, Linus Walleij, Guenter Roeck, Lee Jones,
	linux-arm-kernel

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

sysctrl_dev is set prior to power-off handler registration, and the
power-off handler is unregistered prior to clearing sysrctrl_dev.
It is therefore not necessary to check if sysctrl_dev is NULL in the
power-off handler, and the check was removed. Setting sysctrl_dev to NULL
in the remove function was also removed as unnecessary. With those changes,
devm_register_power_off_handler can be used to register the poeroff handler.
The now empty remove function was retained since the ab8500_restart function,
which is currently unused, would likely need some cleanup if it was ever used.

Cc: Linus Walleij <linus.walleij@linaro.org>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use devm_register_power_off_handler
- Use dev_warn instead of dev_err
- Since we use devm_register_power_off_handler,
  we need to check if sysctrl_dev in the poweroff handler to avoid
  a race condition on unload, so this check is no longer removed

 drivers/mfd/ab8500-sysctrl.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/mfd/ab8500-sysctrl.c b/drivers/mfd/ab8500-sysctrl.c
index 8e0dae5..c49ecaf 100644
--- a/drivers/mfd/ab8500-sysctrl.c
+++ b/drivers/mfd/ab8500-sysctrl.c
@@ -6,6 +6,7 @@
 
 #include <linux/err.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
 #include <linux/reboot.h>
@@ -23,7 +24,8 @@
 
 static struct device *sysctrl_dev;
 
-static void ab8500_power_off(void)
+static int ab8500_power_off(struct notifier_block *this, unsigned long unused1,
+			    void *unused2)
 {
 	sigset_t old;
 	sigset_t all;
@@ -36,7 +38,7 @@ static void ab8500_power_off(void)
 
 	if (sysctrl_dev == NULL) {
 		pr_err("%s: sysctrl not initialized\n", __func__);
-		return;
+		return NOTIFY_DONE;
 	}
 
 	/*
@@ -83,8 +85,15 @@ shutdown:
 					 AB8500_STW4500CTRL1_SWRESET4500N);
 		(void)sigprocmask(SIG_SETMASK, &old, NULL);
 	}
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block ab8500_power_off_nb = {
+	.notifier_call = ab8500_power_off,
+	.priority = POWER_OFF_PRIORITY_LOW,
+};
+
 /*
  * Use the AB WD to reset the platform. It will perform a hard
  * reset instead of a soft reset. Write the reset reason to
@@ -185,6 +194,7 @@ static int ab8500_sysctrl_probe(struct platform_device *pdev)
 	struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
 	struct ab8500_platform_data *plat;
 	struct ab8500_sysctrl_platform_data *pdata;
+	int err;
 
 	plat = dev_get_platdata(pdev->dev.parent);
 
@@ -193,8 +203,10 @@ static int ab8500_sysctrl_probe(struct platform_device *pdev)
 
 	sysctrl_dev = &pdev->dev;
 
-	if (!pm_power_off)
-		pm_power_off = ab8500_power_off;
+	err = devm_register_power_off_handler(sysctrl_dev,
+					      &ab8500_power_off_nb);
+	if (err)
+		dev_warn(&pdev->dev, "Failed to register power-off handler\n");
 
 	pdata = plat->sysctrl;
 	if (pdata) {
@@ -228,9 +240,6 @@ static int ab8500_sysctrl_remove(struct platform_device *pdev)
 {
 	sysctrl_dev = NULL;
 
-	if (pm_power_off == ab8500_power_off)
-		pm_power_off = NULL;
-
 	return 0;
 }
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 13/47] mfd: max8907: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (10 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 12/47] mfd: ab8500-sysctrl: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:56   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 14/47] mfd: tps80031: " Guenter Roeck
                   ` (34 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Lee Jones, Samuel Ortiz

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Note that this patch fixes a problem on driver unload as side effect:
The old code did not restore or clean up pm_power_off on remove,
meaning the pointer was left in an undefined state.

Cc: Lee Jones <lee.jones@linaro.org>
Cc: Samuel Ortiz <sameo@linux.intel.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use dev_warn instead of dev_err

 drivers/mfd/max8907.c       | 24 ++++++++++++++++++------
 include/linux/mfd/max8907.h |  2 ++
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/drivers/mfd/max8907.c b/drivers/mfd/max8907.c
index 232749c..a159230 100644
--- a/drivers/mfd/max8907.c
+++ b/drivers/mfd/max8907.c
@@ -19,6 +19,7 @@
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 #include <linux/slab.h>
 
@@ -177,11 +178,16 @@ static const struct regmap_irq_chip max8907_rtc_irq_chip = {
 	.num_irqs = ARRAY_SIZE(max8907_rtc_irqs),
 };
 
-static struct max8907 *max8907_pm_off;
-static void max8907_power_off(void)
+static int max8907_power_off(struct notifier_block *this, unsigned long unused1,
+			     void *unused2)
 {
-	regmap_update_bits(max8907_pm_off->regmap_gen, MAX8907_REG_RESET_CNFG,
+	struct max8907 *max8907 = container_of(this, struct max8907,
+					       power_off_nb);
+
+	regmap_update_bits(max8907->regmap_gen, MAX8907_REG_RESET_CNFG,
 			MAX8907_MASK_POWER_OFF, MAX8907_MASK_POWER_OFF);
+
+	return NOTIFY_DONE;
 }
 
 static int max8907_i2c_probe(struct i2c_client *i2c,
@@ -267,9 +273,13 @@ static int max8907_i2c_probe(struct i2c_client *i2c,
 		goto err_add_devices;
 	}
 
-	if (pm_off && !pm_power_off) {
-		max8907_pm_off = max8907;
-		pm_power_off = max8907_power_off;
+	if (pm_off) {
+		max8907->power_off_nb.notifier_call = max8907_power_off;
+		max8907->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+		ret = register_power_off_handler(&max8907->power_off_nb);
+		if (ret)
+			dev_warn(&i2c->dev,
+				 "Failed to register power-off handler");
 	}
 
 	return 0;
@@ -293,6 +303,8 @@ static int max8907_i2c_remove(struct i2c_client *i2c)
 {
 	struct max8907 *max8907 = i2c_get_clientdata(i2c);
 
+	unregister_power_off_handler(&max8907->power_off_nb);
+
 	mfd_remove_devices(max8907->dev);
 
 	regmap_del_irq_chip(max8907->i2c_gen->irq, max8907->irqc_rtc);
diff --git a/include/linux/mfd/max8907.h b/include/linux/mfd/max8907.h
index b06f7a6..d8a341d 100644
--- a/include/linux/mfd/max8907.h
+++ b/include/linux/mfd/max8907.h
@@ -13,6 +13,7 @@
 #define __LINUX_MFD_MAX8907_H
 
 #include <linux/mutex.h>
+#include <linux/notifier.h>
 #include <linux/pm.h>
 
 #define MAX8907_GEN_I2C_ADDR		(0x78 >> 1)
@@ -247,6 +248,7 @@ struct max8907 {
 	struct regmap_irq_chip_data	*irqc_chg;
 	struct regmap_irq_chip_data	*irqc_on_off;
 	struct regmap_irq_chip_data	*irqc_rtc;
+	struct notifier_block		power_off_nb;
 };
 
 #endif
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 14/47] mfd: tps80031: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (11 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 13/47] mfd: max8907: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:55   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 15/47] mfd: dm355evm_msp: " Guenter Roeck
                   ` (33 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Samuel Ortiz, Lee Jones

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use dev_warn instead of dev_err

 drivers/mfd/tps80031.c       | 30 ++++++++++++++++++------------
 include/linux/mfd/tps80031.h |  2 ++
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/drivers/mfd/tps80031.c b/drivers/mfd/tps80031.c
index ed6c5b0..6504959 100644
--- a/drivers/mfd/tps80031.c
+++ b/drivers/mfd/tps80031.c
@@ -147,7 +147,6 @@ static const struct tps80031_pupd_data tps80031_pupds[] = {
 	[TPS80031_CTLI2C_SCL]		= PUPD_DATA(4, 0,	BIT(2)),
 	[TPS80031_CTLI2C_SDA]		= PUPD_DATA(4, 0,	BIT(3)),
 };
-static struct tps80031 *tps80031_power_off_dev;
 
 int tps80031_ext_power_req_config(struct device *dev,
 		unsigned long ext_ctrl_flag, int preq_bit,
@@ -209,11 +208,17 @@ int tps80031_ext_power_req_config(struct device *dev,
 }
 EXPORT_SYMBOL_GPL(tps80031_ext_power_req_config);
 
-static void tps80031_power_off(void)
+static int tps80031_power_off(struct notifier_block *this,
+			      unsigned long unused1, void *unused2)
 {
-	dev_info(tps80031_power_off_dev->dev, "switching off PMU\n");
-	tps80031_write(tps80031_power_off_dev->dev, TPS80031_SLAVE_ID1,
-				TPS80031_PHOENIX_DEV_ON, TPS80031_DEVOFF);
+	struct tps80031 *tps80031 = container_of(this, struct tps80031,
+						 power_off_nb);
+
+	dev_info(tps80031->dev, "switching off PMU\n");
+	tps80031_write(tps80031->dev, TPS80031_SLAVE_ID1,
+		       TPS80031_PHOENIX_DEV_ON, TPS80031_DEVOFF);
+
+	return NOTIFY_DONE;
 }
 
 static void tps80031_pupd_init(struct tps80031 *tps80031,
@@ -501,9 +506,13 @@ static int tps80031_probe(struct i2c_client *client,
 		goto fail_mfd_add;
 	}
 
-	if (pdata->use_power_off && !pm_power_off) {
-		tps80031_power_off_dev = tps80031;
-		pm_power_off = tps80031_power_off;
+	if (pdata->use_power_off) {
+		tps80031->power_off_nb.notifier_call = tps80031_power_off;
+		tps80031->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+		ret = register_power_off_handler(&tps80031->power_off_nb);
+		if (ret)
+			dev_warn(&client->dev,
+				 "Failed to register power-off handler\n");
 	}
 	return 0;
 
@@ -523,10 +532,7 @@ static int tps80031_remove(struct i2c_client *client)
 	struct tps80031 *tps80031 = i2c_get_clientdata(client);
 	int i;
 
-	if (tps80031_power_off_dev == tps80031) {
-		tps80031_power_off_dev = NULL;
-		pm_power_off = NULL;
-	}
+	unregister_power_off_handler(&tps80031->power_off_nb);
 
 	mfd_remove_devices(tps80031->dev);
 
diff --git a/include/linux/mfd/tps80031.h b/include/linux/mfd/tps80031.h
index 2c75c9c..2c6afc2 100644
--- a/include/linux/mfd/tps80031.h
+++ b/include/linux/mfd/tps80031.h
@@ -24,6 +24,7 @@
 #define __LINUX_MFD_TPS80031_H
 
 #include <linux/device.h>
+#include <linux/notifier.h>
 #include <linux/regmap.h>
 
 /* Pull-ups/Pull-downs */
@@ -513,6 +514,7 @@ struct tps80031 {
 	struct i2c_client	*clients[TPS80031_NUM_SLAVES];
 	struct regmap		*regmap[TPS80031_NUM_SLAVES];
 	struct regmap_irq_chip_data *irq_data;
+	struct notifier_block	power_off_nb;
 };
 
 struct tps80031_pupd_init_data {
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 15/47] mfd: dm355evm_msp: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (12 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 14/47] mfd: tps80031: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:55   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 16/47] mfd: tps6586x: " Guenter Roeck
                   ` (32 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Samuel Ortiz, Lee Jones

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use dev_warn instead of dev_err

 drivers/mfd/dm355evm_msp.c | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/mfd/dm355evm_msp.c b/drivers/mfd/dm355evm_msp.c
index 4c826f7..63a1632 100644
--- a/drivers/mfd/dm355evm_msp.c
+++ b/drivers/mfd/dm355evm_msp.c
@@ -14,6 +14,8 @@
 #include <linux/platform_device.h>
 #include <linux/clk.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/err.h>
 #include <linux/gpio.h>
 #include <linux/leds.h>
@@ -352,14 +354,22 @@ static void dm355evm_command(unsigned command)
 				command, status);
 }
 
-static void dm355evm_power_off(void)
+static int dm355evm_power_off(struct notifier_block *this,
+			      unsigned long unused1, void *unused2)
 {
 	dm355evm_command(MSP_COMMAND_POWEROFF);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block dm355evm_msp_power_off_nb = {
+	.notifier_call = dm355evm_power_off,
+	.priority = POWER_OFF_PRIORITY_LOW,
+};
+
 static int dm355evm_msp_remove(struct i2c_client *client)
 {
-	pm_power_off = NULL;
+	unregister_power_off_handler(&dm355evm_msp_power_off_nb);
 	msp430 = NULL;
 	return 0;
 }
@@ -398,7 +408,9 @@ dm355evm_msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
 		goto fail;
 
 	/* PM hookup */
-	pm_power_off = dm355evm_power_off;
+	status = register_power_off_handler(&dm355evm_msp_power_off_nb);
+	if (status)
+		dev_warn(&client->dev, "Failed to register power-off handler\n");
 
 	return 0;
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 16/47] mfd: tps6586x: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (13 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 15/47] mfd: dm355evm_msp: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:54   ` Lee Jones
  2014-11-03 17:57   ` Felipe Balbi
  2014-10-27 15:55 ` [PATCH v3 17/47] mfd: tps65910: " Guenter Roeck
                   ` (31 subsequent siblings)
  46 siblings, 2 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Samuel Ortiz, Lee Jones

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use dev_warn instead of dev_err

 drivers/mfd/tps6586x.c | 31 +++++++++++++++++++++++--------
 1 file changed, 23 insertions(+), 8 deletions(-)

diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c
index 8e1dbc4..1e97478 100644
--- a/drivers/mfd/tps6586x.c
+++ b/drivers/mfd/tps6586x.c
@@ -21,10 +21,12 @@
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/mutex.h>
+#include <linux/notifier.h>
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/i2c.h>
 #include <linux/platform_device.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 #include <linux/of.h>
 
@@ -133,6 +135,8 @@ struct tps6586x {
 	u32			irq_en;
 	u8			mask_reg[5];
 	struct irq_domain	*irq_domain;
+
+	struct notifier_block	power_off_nb;
 };
 
 static inline struct tps6586x *dev_to_tps6586x(struct device *dev)
@@ -472,13 +476,18 @@ static const struct regmap_config tps6586x_regmap_config = {
 	.cache_type = REGCACHE_RBTREE,
 };
 
-static struct device *tps6586x_dev;
-static void tps6586x_power_off(void)
+static int tps6586x_power_off(struct notifier_block *this,
+			      unsigned long unused1, void *unused2)
 {
-	if (tps6586x_clr_bits(tps6586x_dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT))
-		return;
+	struct tps6586x *tps6586x = container_of(this, struct tps6586x,
+						 power_off_nb);
+
+	if (tps6586x_clr_bits(tps6586x->dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT))
+		return NOTIFY_DONE;
 
-	tps6586x_set_bits(tps6586x_dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
+	tps6586x_set_bits(tps6586x->dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
+
+	return NOTIFY_DONE;
 }
 
 static void tps6586x_print_version(struct i2c_client *client, int version)
@@ -575,9 +584,13 @@ static int tps6586x_i2c_probe(struct i2c_client *client,
 		goto err_add_devs;
 	}
 
-	if (pdata->pm_off && !pm_power_off) {
-		tps6586x_dev = &client->dev;
-		pm_power_off = tps6586x_power_off;
+	if (pdata->pm_off) {
+		tps6586x->power_off_nb.notifier_call = tps6586x_power_off;
+		tps6586x->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+		ret = register_power_off_handler(&tps6586x->power_off_nb);
+		if (ret)
+			dev_warn(&client->dev,
+				 "failed to register power-off handler\n");
 	}
 
 	return 0;
@@ -594,6 +607,8 @@ static int tps6586x_i2c_remove(struct i2c_client *client)
 {
 	struct tps6586x *tps6586x = i2c_get_clientdata(client);
 
+	unregister_power_off_handler(&tps6586x->power_off_nb);
+
 	tps6586x_remove_subdevs(tps6586x);
 	mfd_remove_devices(tps6586x->dev);
 	if (client->irq)
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 17/47] mfd: tps65910: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (14 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 16/47] mfd: tps6586x: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:54   ` Lee Jones
  2014-11-03 17:57   ` Felipe Balbi
  2014-10-27 15:55 ` [PATCH v3 18/47] mfd: twl4030-power: " Guenter Roeck
                   ` (30 subsequent siblings)
  46 siblings, 2 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Samuel Ortiz, Lee Jones

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use dev_warn instead of dev_err

 drivers/mfd/tps65910.c       | 27 ++++++++++++++++++---------
 include/linux/mfd/tps65910.h |  3 +++
 2 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c
index 7612d89..3c94dbf 100644
--- a/drivers/mfd/tps65910.c
+++ b/drivers/mfd/tps65910.c
@@ -23,6 +23,8 @@
 #include <linux/irq.h>
 #include <linux/irqdomain.h>
 #include <linux/mfd/core.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 #include <linux/mfd/tps65910.h>
 #include <linux/of.h>
@@ -437,19 +439,20 @@ struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
 }
 #endif
 
-static struct i2c_client *tps65910_i2c_client;
-static void tps65910_power_off(void)
+static int tps65910_power_off(struct notifier_block *this,
+			      unsigned long unused1, void *unused2)
 {
-	struct tps65910 *tps65910;
-
-	tps65910 = dev_get_drvdata(&tps65910_i2c_client->dev);
+	struct tps65910 *tps65910 = container_of(this, struct tps65910,
+						 power_off_nb);
 
 	if (tps65910_reg_set_bits(tps65910, TPS65910_DEVCTRL,
 			DEVCTRL_PWR_OFF_MASK) < 0)
-		return;
+		return NOTIFY_DONE;
 
 	tps65910_reg_clear_bits(tps65910, TPS65910_DEVCTRL,
 			DEVCTRL_DEV_ON_MASK);
+
+	return NOTIFY_DONE;
 }
 
 static int tps65910_i2c_probe(struct i2c_client *i2c,
@@ -505,9 +508,13 @@ static int tps65910_i2c_probe(struct i2c_client *i2c,
 	tps65910_ck32k_init(tps65910, pmic_plat_data);
 	tps65910_sleepinit(tps65910, pmic_plat_data);
 
-	if (pmic_plat_data->pm_off && !pm_power_off) {
-		tps65910_i2c_client = i2c;
-		pm_power_off = tps65910_power_off;
+	if (pmic_plat_data->pm_off) {
+		tps65910->power_off_nb.notifier_call = tps65910_power_off;
+		tps65910->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+		ret = register_power_off_handler(&tps65910->power_off_nb);
+		if (ret)
+			dev_warn(&i2c->dev,
+				 "failed to register power-off handler\n");
 	}
 
 	ret = mfd_add_devices(tps65910->dev, -1,
@@ -527,6 +534,8 @@ static int tps65910_i2c_remove(struct i2c_client *i2c)
 {
 	struct tps65910 *tps65910 = i2c_get_clientdata(i2c);
 
+	unregister_power_off_handler(&tps65910->power_off_nb);
+
 	tps65910_irq_exit(tps65910);
 	mfd_remove_devices(tps65910->dev);
 
diff --git a/include/linux/mfd/tps65910.h b/include/linux/mfd/tps65910.h
index 6483a6f..94876c4 100644
--- a/include/linux/mfd/tps65910.h
+++ b/include/linux/mfd/tps65910.h
@@ -905,6 +905,9 @@ struct tps65910 {
 	/* IRQ Handling */
 	int chip_irq;
 	struct regmap_irq_chip_data *irq_data;
+
+	/* Power-off handling */
+	struct notifier_block power_off_nb;
 };
 
 struct tps65910_platform_data {
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 18/47] mfd: twl4030-power: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (15 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 17/47] mfd: tps65910: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:54   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 19/47] mfd: rk808: Register power-off handler " Guenter Roeck
                   ` (29 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Samuel Ortiz, Lee Jones

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Make twl4030_power_off static as it is only called from the twl4030-power
driver. Drop remove function as it is no longer needed.

Cc: Samuel Ortiz <sameo@linux.intel.com>
Cc: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use dev_warn instead of dev_err
- Use devm_register_power_off_handler
- Drop remove function as it is no longer needed.

 drivers/mfd/twl4030-power.c | 29 +++++++++++++++++++----------
 include/linux/i2c/twl.h     |  1 -
 2 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
index cf92a6d..e36eea9 100644
--- a/drivers/mfd/twl4030-power.c
+++ b/drivers/mfd/twl4030-power.c
@@ -25,9 +25,10 @@
  */
 
 #include <linux/module.h>
-#include <linux/pm.h>
+#include <linux/notifier.h>
 #include <linux/i2c/twl.h>
 #include <linux/platform_device.h>
+#include <linux/pm.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 
@@ -611,7 +612,8 @@ twl4030_power_configure_resources(const struct twl4030_power_data *pdata)
  * After a successful execution, TWL shuts down the power to the SoC
  * and all peripherals connected to it.
  */
-void twl4030_power_off(void)
+static int twl4030_power_off(struct notifier_block *this, unsigned long unused1,
+			     void *unused2)
 {
 	int err;
 
@@ -619,8 +621,15 @@ void twl4030_power_off(void)
 			       TWL4030_PM_MASTER_P1_SW_EVENTS);
 	if (err)
 		pr_err("TWL4030 Unable to power off\n");
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block twl4030_power_off_nb = {
+	.notifier_call = twl4030_power_off,
+	.priority = POWER_OFF_PRIORITY_LOW,
+};
+
 static bool twl4030_power_use_poweroff(const struct twl4030_power_data *pdata,
 					struct device_node *node)
 {
@@ -839,7 +848,9 @@ static int twl4030_power_probe(struct platform_device *pdev)
 	}
 
 	/* Board has to be wired properly to use this feature */
-	if (twl4030_power_use_poweroff(pdata, node) && !pm_power_off) {
+	if (twl4030_power_use_poweroff(pdata, node)) {
+		int ret;
+
 		/* Default for SEQ_OFFSYNC is set, lets ensure this */
 		err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &val,
 				      TWL4030_PM_MASTER_CFG_P123_TRANSITION);
@@ -856,7 +867,11 @@ static int twl4030_power_probe(struct platform_device *pdev)
 			}
 		}
 
-		pm_power_off = twl4030_power_off;
+		ret = devm_register_power_off_handler(&pdev->dev,
+						      &twl4030_power_off_nb);
+		if (ret)
+			dev_warn(&pdev->dev,
+				 "Failed to register power-off handler\n");
 	}
 
 relock:
@@ -870,11 +885,6 @@ relock:
 	return err;
 }
 
-static int twl4030_power_remove(struct platform_device *pdev)
-{
-	return 0;
-}
-
 static struct platform_driver twl4030_power_driver = {
 	.driver = {
 		.name	= "twl4030_power",
@@ -882,7 +892,6 @@ static struct platform_driver twl4030_power_driver = {
 		.of_match_table = of_match_ptr(twl4030_power_of_match),
 	},
 	.probe		= twl4030_power_probe,
-	.remove		= twl4030_power_remove,
 };
 
 module_platform_driver(twl4030_power_driver);
diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h
index 8cfb50f..f8544f1 100644
--- a/include/linux/i2c/twl.h
+++ b/include/linux/i2c/twl.h
@@ -680,7 +680,6 @@ struct twl4030_power_data {
 };
 
 extern int twl4030_remove_script(u8 flags);
-extern void twl4030_power_off(void);
 
 struct twl4030_codec_data {
 	unsigned int digimic_delay; /* in ms */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 19/47] mfd: rk808: Register power-off handler with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (16 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 18/47] mfd: twl4030-power: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:53   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 20/47] mfd: rn5t618: " Guenter Roeck
                   ` (28 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Chris Zhong, Zhang Qing, Lee Jones,
	Samuel Ortiz

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Chris Zhong <zyw@rock-chips.com>
Cc: Zhang Qing <zhangqing@rock-chips.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- New patch

 drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
 include/linux/mfd/rk808.h |  2 ++
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
index bd02150..5d5257d 100644
--- a/drivers/mfd/rk808.c
+++ b/drivers/mfd/rk808.c
@@ -21,6 +21,8 @@
 #include <linux/mfd/rk808.h>
 #include <linux/mfd/core.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 
 struct rk808_reg_data {
@@ -147,23 +149,19 @@ static struct regmap_irq_chip rk808_irq_chip = {
 	.init_ack_masked = true,
 };
 
-static struct i2c_client *rk808_i2c_client;
-static void rk808_device_shutdown(void)
+static int rk808_device_shutdown(struct notifier_block *this,
+				 unsigned long unused1, void *unused2)
 {
+	struct rk808 *rk808 = container_of(this, struct rk808, power_off_nb);
 	int ret;
-	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
-
-	if (!rk808) {
-		dev_warn(&rk808_i2c_client->dev,
-			 "have no rk808, so do nothing here\n");
-		return;
-	}
 
 	ret = regmap_update_bits(rk808->regmap,
 				 RK808_DEVCTRL_REG,
 				 DEV_OFF_RST, DEV_OFF_RST);
 	if (ret)
-		dev_err(&rk808_i2c_client->dev, "power off error!\n");
+		dev_err(&rk808->i2c->dev, "power off error!\n");
+
+	return NOTIFY_DONE;
 }
 
 static int rk808_probe(struct i2c_client *client,
@@ -222,9 +220,14 @@ static int rk808_probe(struct i2c_client *client,
 
 	pm_off = of_property_read_bool(np,
 				"rockchip,system-power-controller");
-	if (pm_off && !pm_power_off) {
-		rk808_i2c_client = client;
-		pm_power_off = rk808_device_shutdown;
+	if (pm_off) {
+		rk808->power_off_nb.notifier_call = rk808_device_shutdown;
+		rk808->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+		ret = devm_register_power_off_handler(&client->dev,
+						      &rk808->power_off_nb);
+		if (ret)
+			dev_warn(&client->dev,
+				 "Failed to register power-off handler\n");
 	}
 
 	return 0;
@@ -240,7 +243,6 @@ static int rk808_remove(struct i2c_client *client)
 
 	regmap_del_irq_chip(client->irq, rk808->irq_data);
 	mfd_remove_devices(&client->dev);
-	pm_power_off = NULL;
 
 	return 0;
 }
diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
index fb09312..6308fd4 100644
--- a/include/linux/mfd/rk808.h
+++ b/include/linux/mfd/rk808.h
@@ -19,6 +19,7 @@
 #ifndef __LINUX_REGULATOR_rk808_H
 #define __LINUX_REGULATOR_rk808_H
 
+#include <linux/notifier.h>
 #include <linux/regulator/machine.h>
 #include <linux/regmap.h>
 
@@ -192,5 +193,6 @@ struct rk808 {
 	struct i2c_client *i2c;
 	struct regmap_irq_chip_data *irq_data;
 	struct regmap *regmap;
+	struct notifier_block power_off_nb;
 };
 #endif /* __LINUX_REGULATOR_rk808_H */
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 20/47] mfd: rn5t618: Register power-off handler with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (17 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 19/47] mfd: rk808: Register power-off handler " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-03 17:54   ` Lee Jones
  2014-10-27 15:55 ` [PATCH v3 21/47] ipmi: Register " Guenter Roeck
                   ` (27 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Beniamino Galvani, Lee Jones,
	Samuel Ortiz

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Beniamino Galvani <b.galvani@gmail.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- New patch

 drivers/mfd/rn5t618.c       | 32 ++++++++++++++++----------------
 include/linux/mfd/rn5t618.h |  2 ++
 2 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c
index 6668571..ed564d1 100644
--- a/drivers/mfd/rn5t618.c
+++ b/drivers/mfd/rn5t618.c
@@ -15,6 +15,8 @@
 #include <linux/mfd/core.h>
 #include <linux/mfd/rn5t618.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/regmap.h>
 
 static const struct mfd_cell rn5t618_cells[] = {
@@ -47,16 +49,20 @@ static const struct regmap_config rn5t618_regmap_config = {
 	.cache_type	= REGCACHE_RBTREE,
 };
 
-static struct rn5t618 *rn5t618_pm_power_off;
-
-static void rn5t618_power_off(void)
+static int rn5t618_power_off(struct notifier_block *this,
+			     unsigned long unused1, void *unused2)
 {
+	struct rn5t618 *rn5t618 = container_of(this, struct rn5t618,
+					       power_off_nb);
+
 	/* disable automatic repower-on */
-	regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_REPCNT,
+	regmap_update_bits(rn5t618->regmap, RN5T618_REPCNT,
 			   RN5T618_REPCNT_REPWRON, 0);
 	/* start power-off sequence */
-	regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_SLPCNT,
+	regmap_update_bits(rn5t618->regmap, RN5T618_SLPCNT,
 			   RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF);
+
+	return NOTIFY_DONE;
 }
 
 static int rn5t618_i2c_probe(struct i2c_client *i2c,
@@ -85,23 +91,17 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c,
 		return ret;
 	}
 
-	if (!pm_power_off) {
-		rn5t618_pm_power_off = priv;
-		pm_power_off = rn5t618_power_off;
-	}
+	priv->power_off_nb.notifier_call = rn5t618_power_off;
+	priv->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+	ret = devm_register_power_off_handler(&i2c->dev, &priv->power_off_nb);
+	if (ret)
+		dev_warn(&i2c->dev, "Failed to register power-off handler\n");
 
 	return 0;
 }
 
 static int rn5t618_i2c_remove(struct i2c_client *i2c)
 {
-	struct rn5t618 *priv = i2c_get_clientdata(i2c);
-
-	if (priv == rn5t618_pm_power_off) {
-		rn5t618_pm_power_off = NULL;
-		pm_power_off = NULL;
-	}
-
 	mfd_remove_devices(&i2c->dev);
 	return 0;
 }
diff --git a/include/linux/mfd/rn5t618.h b/include/linux/mfd/rn5t618.h
index c72d534..21c9c39 100644
--- a/include/linux/mfd/rn5t618.h
+++ b/include/linux/mfd/rn5t618.h
@@ -14,6 +14,7 @@
 #ifndef __LINUX_MFD_RN5T618_H
 #define __LINUX_MFD_RN5T618_H
 
+#include <linux/notifier.h>
 #include <linux/regmap.h>
 
 #define RN5T618_LSIVER			0x00
@@ -223,6 +224,7 @@ enum {
 
 struct rn5t618 {
 	struct regmap *regmap;
+	struct notifier_block power_off_nb;
 };
 
 #endif /* __LINUX_MFD_RN5T618_H */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 21/47] ipmi: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (18 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 20/47] mfd: rn5t618: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 22/47] power/reset: restart-poweroff: " Guenter Roeck
                   ` (26 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: openipmi-developer, Corey Minyard, Guenter Roeck, linux-pm

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with high priority to reflect that the original code
overwrites pm_power_off unconditionally.

Register power-off handler after the ipmi system is ready, and unregister
it prior to cleanup. This avoids having to check for the ready variable
in the poweroff callback.

Reviewed-by: Corey Minyard <minyard@acm.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use pr_warn instead of pr_err
- Call unregister_power_off_handler on exit only if not already unregistered

 drivers/char/ipmi/ipmi_poweroff.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/drivers/char/ipmi/ipmi_poweroff.c b/drivers/char/ipmi/ipmi_poweroff.c
index 9f2e3be..0698e1c 100644
--- a/drivers/char/ipmi/ipmi_poweroff.c
+++ b/drivers/char/ipmi/ipmi_poweroff.c
@@ -36,6 +36,7 @@
 #include <linux/proc_fs.h>
 #include <linux/string.h>
 #include <linux/completion.h>
+#include <linux/notifier.h>
 #include <linux/pm.h>
 #include <linux/kdev_t.h>
 #include <linux/ipmi.h>
@@ -63,9 +64,6 @@ static ipmi_user_t ipmi_user;
 static int ipmi_ifnum;
 static void (*specific_poweroff_func)(ipmi_user_t user);
 
-/* Holds the old poweroff function so we can restore it on removal. */
-static void (*old_poweroff_func)(void);
-
 static int set_param_ifnum(const char *val, struct kernel_param *kp)
 {
 	int rv = param_set_int(val, kp);
@@ -544,15 +542,20 @@ static struct poweroff_function poweroff_functions[] = {
 
 
 /* Called on a powerdown request. */
-static void ipmi_poweroff_function(void)
+static int ipmi_poweroff_function(struct notifier_block *this,
+				  unsigned long unused1, void *unused2)
 {
-	if (!ready)
-		return;
-
 	/* Use run-to-completion mode, since interrupts may be off. */
 	specific_poweroff_func(ipmi_user);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block ipmi_power_off_nb = {
+	.notifier_call = ipmi_poweroff_function,
+	.priority = POWER_OFF_PRIORITY_HIGH,
+};
+
 /* Wait for an IPMI interface to be installed, the first one installed
    will be grabbed by this code and used to perform the powerdown. */
 static void ipmi_po_new_smi(int if_num, struct device *device)
@@ -631,9 +634,12 @@ static void ipmi_po_new_smi(int if_num, struct device *device)
 	printk(KERN_INFO PFX "Found a %s style poweroff function\n",
 	       poweroff_functions[i].platform_type);
 	specific_poweroff_func = poweroff_functions[i].poweroff_func;
-	old_poweroff_func = pm_power_off;
-	pm_power_off = ipmi_poweroff_function;
+
 	ready = 1;
+
+	rv = register_power_off_handler(&ipmi_power_off_nb);
+	if (rv)
+		pr_warn(PFX "failed to register power-off handler\n");
 }
 
 static void ipmi_po_smi_gone(int if_num)
@@ -644,9 +650,10 @@ static void ipmi_po_smi_gone(int if_num)
 	if (ipmi_ifnum != if_num)
 		return;
 
+	unregister_power_off_handler(&ipmi_power_off_nb);
+
 	ready = 0;
 	ipmi_destroy_user(ipmi_user);
-	pm_power_off = old_poweroff_func;
 }
 
 static struct ipmi_smi_watcher smi_watcher = {
@@ -733,11 +740,11 @@ static void __exit ipmi_poweroff_cleanup(void)
 	ipmi_smi_watcher_unregister(&smi_watcher);
 
 	if (ready) {
+		unregister_power_off_handler(&ipmi_power_off_nb);
 		rv = ipmi_destroy_user(ipmi_user);
 		if (rv)
 			printk(KERN_ERR PFX "could not cleanup the IPMI"
 			       " user: 0x%x\n", rv);
-		pm_power_off = old_poweroff_func;
 	}
 }
 module_exit(ipmi_poweroff_cleanup);
-- 
1.9.1


------------------------------------------------------------------------------

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 22/47] power/reset: restart-poweroff: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (19 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 21/47] ipmi: Register " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 23/47] power/reset: gpio-poweroff: " Guenter Roeck
                   ` (25 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Sebastian Reichel,
	Dmitry Eremin-Solenikov, David Woodhouse

Register with kernel power-off handler instead of setting pm_power_off
directly.  Register as power-off handler of last resort since the driver
does not really power off the system but executes a restart.

Drop remove function since it is no longer needed.

Cc: Sebastian Reichel <sre@kernel.org>
Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Acked-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to sepcify poweroff handler priority
- Use devm_register_power_off_handler
- Drop remove function since it is no longer needed

 drivers/power/reset/restart-poweroff.c | 33 +++++++++++++--------------------
 1 file changed, 13 insertions(+), 20 deletions(-)

diff --git a/drivers/power/reset/restart-poweroff.c b/drivers/power/reset/restart-poweroff.c
index edd707e..bdd1d6e 100644
--- a/drivers/power/reset/restart-poweroff.c
+++ b/drivers/power/reset/restart-poweroff.c
@@ -12,37 +12,31 @@
  */
 #include <linux/kernel.h>
 #include <linux/init.h>
+#include <linux/notifier.h>
 #include <linux/platform_device.h>
 #include <linux/of_platform.h>
 #include <linux/module.h>
+#include <linux/pm.h>
 #include <linux/reboot.h>
-#include <asm/system_misc.h>
 
-static void restart_poweroff_do_poweroff(void)
+static int restart_poweroff_do_poweroff(struct notifier_block *this,
+					unsigned long unused1, void *unused2)
 {
 	reboot_mode = REBOOT_HARD;
 	machine_restart(NULL);
-}
-
-static int restart_poweroff_probe(struct platform_device *pdev)
-{
-	/* If a pm_power_off function has already been added, leave it alone */
-	if (pm_power_off != NULL) {
-		dev_err(&pdev->dev,
-			"pm_power_off function already registered");
-		return -EBUSY;
-	}
 
-	pm_power_off = &restart_poweroff_do_poweroff;
-	return 0;
+	return NOTIFY_DONE;
 }
 
-static int restart_poweroff_remove(struct platform_device *pdev)
-{
-	if (pm_power_off == &restart_poweroff_do_poweroff)
-		pm_power_off = NULL;
+static struct notifier_block restart_power_off_handler = {
+	.notifier_call = restart_poweroff_do_poweroff,
+	.priority = POWER_OFF_PRIORITY_FALLBACK,
+};
 
-	return 0;
+static int restart_poweroff_probe(struct platform_device *pdev)
+{
+	return devm_register_power_off_handler(&pdev->dev,
+					      &restart_power_off_handler);
 }
 
 static const struct of_device_id of_restart_poweroff_match[] = {
@@ -52,7 +46,6 @@ static const struct of_device_id of_restart_poweroff_match[] = {
 
 static struct platform_driver restart_poweroff_driver = {
 	.probe = restart_poweroff_probe,
-	.remove = restart_poweroff_remove,
 	.driver = {
 		.name = "poweroff-restart",
 		.owner = THIS_MODULE,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 23/47] power/reset: gpio-poweroff: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (20 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 22/47] power/reset: restart-poweroff: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 24/47] power/reset: as3722-poweroff: " Guenter Roeck
                   ` (24 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Sebastian Reichel,
	Dmitry Eremin-Solenikov, David Woodhouse

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Other changes:

Drop note that there can not be an additional instance of this driver.
The original reason no longer applies, it should be obvious that there
can only be one instance of the driver if static variables are used to
reflect its state, and support for multiple instances can now be added
easily if needed by avoiding static variables.

Do not create an error message if another power-off handler has already
been registered. This is perfectly normal and acceptable.

Drop remove function since it is no longer needed.

Cc: Sebastian Reichel <sre@kernel.org>
Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Acked-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2;
- Use define to specify poweroff handler priority
- Use devm_register_power_off_handler
- Drop remove function as it is no longer needed

 drivers/power/reset/gpio-poweroff.c | 40 ++++++++++++++++---------------------
 1 file changed, 17 insertions(+), 23 deletions(-)

diff --git a/drivers/power/reset/gpio-poweroff.c b/drivers/power/reset/gpio-poweroff.c
index ce849bc..814c37b 100644
--- a/drivers/power/reset/gpio-poweroff.c
+++ b/drivers/power/reset/gpio-poweroff.c
@@ -14,18 +14,18 @@
 #include <linux/kernel.h>
 #include <linux/init.h>
 #include <linux/delay.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/platform_device.h>
 #include <linux/gpio/consumer.h>
 #include <linux/of_platform.h>
 #include <linux/module.h>
 
-/*
- * Hold configuration here, cannot be more than one instance of the driver
- * since pm_power_off itself is global.
- */
 static struct gpio_desc *reset_gpio;
 
-static void gpio_poweroff_do_poweroff(void)
+static int gpio_poweroff_do_poweroff(struct notifier_block *this,
+				     unsigned long unused1, void *unused2)
+
 {
 	BUG_ON(!reset_gpio);
 
@@ -43,19 +43,19 @@ static void gpio_poweroff_do_poweroff(void)
 	mdelay(3000);
 
 	WARN_ON(1);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block gpio_power_off_nb = {
+	.notifier_call = gpio_poweroff_do_poweroff,
+	.priority = POWER_OFF_PRIORITY_LOW,
+};
+
 static int gpio_poweroff_probe(struct platform_device *pdev)
 {
 	bool input = false;
-
-	/* If a pm_power_off function has already been added, leave it alone */
-	if (pm_power_off != NULL) {
-		dev_err(&pdev->dev,
-			"%s: pm_power_off function already registered",
-		       __func__);
-		return -EBUSY;
-	}
+	int err;
 
 	reset_gpio = devm_gpiod_get(&pdev->dev, NULL);
 	if (IS_ERR(reset_gpio))
@@ -77,16 +77,11 @@ static int gpio_poweroff_probe(struct platform_device *pdev)
 		}
 	}
 
-	pm_power_off = &gpio_poweroff_do_poweroff;
-	return 0;
-}
-
-static int gpio_poweroff_remove(struct platform_device *pdev)
-{
-	if (pm_power_off == &gpio_poweroff_do_poweroff)
-		pm_power_off = NULL;
+	err = devm_register_power_off_handler(&pdev->dev, &gpio_power_off_nb);
+	if (err)
+		dev_err(&pdev->dev, "Failed to register power-off handler\n");
 
-	return 0;
+	return err;
 }
 
 static const struct of_device_id of_gpio_poweroff_match[] = {
@@ -96,7 +91,6 @@ static const struct of_device_id of_gpio_poweroff_match[] = {
 
 static struct platform_driver gpio_poweroff_driver = {
 	.probe = gpio_poweroff_probe,
-	.remove = gpio_poweroff_remove,
 	.driver = {
 		.name = "poweroff-gpio",
 		.owner = THIS_MODULE,
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 24/47] power/reset: as3722-poweroff: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (21 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 23/47] power/reset: gpio-poweroff: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 25/47] power/reset: qnap-poweroff: " Guenter Roeck
                   ` (23 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Sebastian Reichel,
	Dmitry Eremin-Solenikov, David Woodhouse

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Drop remove function since it is no longer needed.

Cc: Sebastian Reichel <sre@kernel.org>
Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Acked-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use devm_register_power_off_handler
- Drop remove function since it is no longer needed

 drivers/power/reset/as3722-poweroff.c | 39 ++++++++++++++---------------------
 1 file changed, 15 insertions(+), 24 deletions(-)

diff --git a/drivers/power/reset/as3722-poweroff.c b/drivers/power/reset/as3722-poweroff.c
index 6849711..ebc177f 100644
--- a/drivers/power/reset/as3722-poweroff.c
+++ b/drivers/power/reset/as3722-poweroff.c
@@ -17,32 +17,33 @@
 
 #include <linux/mfd/as3722.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
+#include <linux/pm.h>
 #include <linux/slab.h>
 
 struct as3722_poweroff {
 	struct device *dev;
 	struct as3722 *as3722;
+	struct notifier_block power_off_nb;
 };
 
-static struct as3722_poweroff *as3722_pm_poweroff;
-
-static void as3722_pm_power_off(void)
+static int as3722_power_off(struct notifier_block *this, unsigned long unused1,
+			    void *unused2)
 {
+	struct as3722_poweroff *as3722_poweroff =
+		container_of(this, struct as3722_poweroff, power_off_nb);
 	int ret;
 
-	if (!as3722_pm_poweroff) {
-		pr_err("AS3722 poweroff is not initialised\n");
-		return;
-	}
-
-	ret = as3722_update_bits(as3722_pm_poweroff->as3722,
+	ret = as3722_update_bits(as3722_poweroff->as3722,
 		AS3722_RESET_CONTROL_REG, AS3722_POWER_OFF, AS3722_POWER_OFF);
 	if (ret < 0)
-		dev_err(as3722_pm_poweroff->dev,
+		dev_err(as3722_poweroff->dev,
 			"RESET_CONTROL_REG update failed, %d\n", ret);
+
+	return NOTIFY_DONE;
 }
 
 static int as3722_poweroff_probe(struct platform_device *pdev)
@@ -63,20 +64,11 @@ static int as3722_poweroff_probe(struct platform_device *pdev)
 
 	as3722_poweroff->as3722 = dev_get_drvdata(pdev->dev.parent);
 	as3722_poweroff->dev = &pdev->dev;
-	as3722_pm_poweroff = as3722_poweroff;
-	if (!pm_power_off)
-		pm_power_off = as3722_pm_power_off;
-
-	return 0;
-}
-
-static int as3722_poweroff_remove(struct platform_device *pdev)
-{
-	if (pm_power_off == as3722_pm_power_off)
-		pm_power_off = NULL;
-	as3722_pm_poweroff = NULL;
+	as3722_poweroff->power_off_nb.notifier_call = as3722_power_off;
+	as3722_poweroff->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
 
-	return 0;
+	return devm_register_power_off_handler(&pdev->dev,
+					      &as3722_poweroff->power_off_nb);
 }
 
 static struct platform_driver as3722_poweroff_driver = {
@@ -85,7 +77,6 @@ static struct platform_driver as3722_poweroff_driver = {
 		.owner = THIS_MODULE,
 	},
 	.probe = as3722_poweroff_probe,
-	.remove = as3722_poweroff_remove,
 };
 
 module_platform_driver(as3722_poweroff_driver);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 25/47] power/reset: qnap-poweroff: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (22 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 24/47] power/reset: as3722-poweroff: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 26/47] power/reset: msm-poweroff: " Guenter Roeck
                   ` (22 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Sebastian Reichel,
	Dmitry Eremin-Solenikov, David Woodhouse

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with default priority to reflect that the original
code generates an error if another power-off handler has already been
registered when the driver is loaded.

Drop remove function since it is no longer needed.

Cc: Sebastian Reichel <sre@kernel.org>
Cc: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Acked-by: Andrew Lunn <andrew@lunn.ch>
Acked-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use devm_register_power_off_handler
- Drop remove function since it is no longer needed

 drivers/power/reset/qnap-poweroff.c | 32 ++++++++++++--------------------
 1 file changed, 12 insertions(+), 20 deletions(-)

diff --git a/drivers/power/reset/qnap-poweroff.c b/drivers/power/reset/qnap-poweroff.c
index a75db7f..b9c8158 100644
--- a/drivers/power/reset/qnap-poweroff.c
+++ b/drivers/power/reset/qnap-poweroff.c
@@ -16,7 +16,9 @@
 
 #include <linux/kernel.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
 #include <linux/platform_device.h>
+#include <linux/pm.h>
 #include <linux/serial_reg.h>
 #include <linux/kallsyms.h>
 #include <linux/of.h>
@@ -55,7 +57,8 @@ static void __iomem *base;
 static unsigned long tclk;
 static const struct power_off_cfg *cfg;
 
-static void qnap_power_off(void)
+static int qnap_power_off(struct notifier_block *this, unsigned long unused1,
+			  void *unused2)
 {
 	const unsigned divisor = ((tclk + (8 * cfg->baud)) / (16 * cfg->baud));
 
@@ -72,14 +75,20 @@ static void qnap_power_off(void)
 
 	/* send the power-off command to PIC */
 	writel(cfg->cmd, UART1_REG(TX));
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block qnap_power_off_nb = {
+	.notifier_call = qnap_power_off,
+	.priority = POWER_OFF_PRIORITY_DEFAULT,
+};
+
 static int qnap_power_off_probe(struct platform_device *pdev)
 {
 	struct device_node *np = pdev->dev.of_node;
 	struct resource *res;
 	struct clk *clk;
-	char symname[KSYM_NAME_LEN];
 
 	const struct of_device_id *match =
 		of_match_node(qnap_power_off_of_match_table, np);
@@ -106,28 +115,11 @@ static int qnap_power_off_probe(struct platform_device *pdev)
 
 	tclk = clk_get_rate(clk);
 
-	/* Check that nothing else has already setup a handler */
-	if (pm_power_off) {
-		lookup_symbol_name((ulong)pm_power_off, symname);
-		dev_err(&pdev->dev,
-			"pm_power_off already claimed %p %s",
-			pm_power_off, symname);
-		return -EBUSY;
-	}
-	pm_power_off = qnap_power_off;
-
-	return 0;
-}
-
-static int qnap_power_off_remove(struct platform_device *pdev)
-{
-	pm_power_off = NULL;
-	return 0;
+	return devm_register_power_off_handler(&pdev->dev, &qnap_power_off_nb);
 }
 
 static struct platform_driver qnap_power_off_driver = {
 	.probe	= qnap_power_off_probe,
-	.remove	= qnap_power_off_remove,
 	.driver	= {
 		.owner	= THIS_MODULE,
 		.name	= "qnap_power_off",
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 26/47] power/reset: msm-poweroff: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (23 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 25/47] power/reset: qnap-poweroff: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 27/47] power/reset: vexpress-poweroff: " Guenter Roeck
                   ` (21 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, David Woodhouse, Dmitry Eremin-Solenikov,
	Sebastian Reichel

Register with kernel power-off handler instead of setting pm_power_off
directly. Select fallback priority since the code does not really poweroff
the system but resets it instead.

Acked-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Fix headline and description
- Merge with restart handler code now used in same driver
- Use dev_warn instead of dev_err

 drivers/power/reset/msm-poweroff.c | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c
index 4702efd..c63c070 100644
--- a/drivers/power/reset/msm-poweroff.c
+++ b/drivers/power/reset/msm-poweroff.c
@@ -19,10 +19,12 @@
 #include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
 #include <linux/reboot.h>
 #include <linux/pm.h>
 
 static void __iomem *msm_ps_hold;
+
 static int do_msm_restart(struct notifier_block *nb, unsigned long action,
 			   void *data)
 {
@@ -37,11 +39,11 @@ static struct notifier_block restart_nb = {
 	.priority = 128,
 };
 
-static void do_msm_poweroff(void)
-{
+static struct notifier_block msm_power_off_nb = {
 	/* TODO: Add poweroff capability */
-	do_msm_restart(&restart_nb, 0, NULL);
-}
+	.notifier_call = do_msm_restart,
+	.priority = POWER_OFF_PRIORITY_FALLBACK,
+};
 
 static int msm_restart_probe(struct platform_device *pdev)
 {
@@ -55,7 +57,8 @@ static int msm_restart_probe(struct platform_device *pdev)
 
 	register_restart_handler(&restart_nb);
 
-	pm_power_off = do_msm_poweroff;
+	if (register_power_off_handler(&msm_power_off_nb))
+		dev_warn(&pdev->dev, "Failed to register power-off handler\n");
 
 	return 0;
 }
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 27/47] power/reset: vexpress-poweroff: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (24 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 26/47] power/reset: msm-poweroff: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 28/47] power/reset: at91-poweroff: " Guenter Roeck
                   ` (20 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, David Woodhouse, Dmitry Eremin-Solenikov,
	Sebastian Reichel

Register with kernel power-off handler instead of setting pm_power_off
directly. Select default priority to reflect that the original code sets
pm_power_off unconditionally.

Acked-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 drivers/power/reset/vexpress-poweroff.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/drivers/power/reset/vexpress-poweroff.c b/drivers/power/reset/vexpress-poweroff.c
index 4dc102e2..b0a39cc 100644
--- a/drivers/power/reset/vexpress-poweroff.c
+++ b/drivers/power/reset/vexpress-poweroff.c
@@ -12,6 +12,7 @@
  */
 
 #include <linux/delay.h>
+#include <linux/notifier.h>
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
@@ -36,11 +37,19 @@ static void vexpress_reset_do(struct device *dev, const char *what)
 
 static struct device *vexpress_power_off_device;
 
-static void vexpress_power_off(void)
+static int vexpress_power_off(struct notifier_block *this,
+			      unsigned long unused1, void *unused2)
 {
 	vexpress_reset_do(vexpress_power_off_device, "power off");
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block vexpress_power_off_nb = {
+	.notifier_call = vexpress_power_off,
+	.priority = POWER_OFF_PRIORITY_DEFAULT,
+};
+
 static struct device *vexpress_restart_device;
 
 static void vexpress_restart(enum reboot_mode reboot_mode, const char *cmd)
@@ -92,6 +101,7 @@ static int vexpress_reset_probe(struct platform_device *pdev)
 	const struct of_device_id *match =
 			of_match_device(vexpress_reset_of_match, &pdev->dev);
 	struct regmap *regmap;
+	int ret;
 
 	if (match)
 		func = (enum vexpress_reset_func)match->data;
@@ -106,7 +116,12 @@ static int vexpress_reset_probe(struct platform_device *pdev)
 	switch (func) {
 	case FUNC_SHUTDOWN:
 		vexpress_power_off_device = &pdev->dev;
-		pm_power_off = vexpress_power_off;
+		ret = register_power_off_handler(&vexpress_power_off_nb);
+		if (ret) {
+			dev_err(&pdev->dev,
+				"Failed to register power-off handler\n");
+			return ret;
+		}
 		break;
 	case FUNC_RESET:
 		if (!vexpress_restart_device)
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 28/47] power/reset: at91-poweroff: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (25 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 27/47] power/reset: vexpress-poweroff: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 29/47] power/reset: ltc2952-poweroff: " Guenter Roeck
                   ` (19 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, David Woodhouse, Dmitry Eremin-Solenikov,
	Sebastian Reichel

Register with kernel power-off handler instead of setting pm_power_off
directly. Select default priority to reflect that the original code sets
pm_power_off unconditionally.

Acked-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Added patch

 drivers/power/reset/at91-poweroff.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/power/reset/at91-poweroff.c b/drivers/power/reset/at91-poweroff.c
index c610003..0894b45 100644
--- a/drivers/power/reset/at91-poweroff.c
+++ b/drivers/power/reset/at91-poweroff.c
@@ -12,8 +12,10 @@
 
 #include <linux/io.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
+#include <linux/pm.h>
 #include <linux/printk.h>
 
 #define AT91_SHDW_CR	0x00		/* Shut Down Control Register */
@@ -66,11 +68,19 @@ static void __init at91_wakeup_status(void)
 	pr_info("AT91: Wake-Up source: %s\n", reason);
 }
 
-static void at91_poweroff(void)
+static int at91_poweroff(struct notifier_block *this, unsigned long unused1,
+			 void *unused2)
 {
 	writel(AT91_SHDW_KEY | AT91_SHDW_SHDW, at91_shdwc_base + AT91_SHDW_CR);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block at91_power_off_nb = {
+	.notifier_call = at91_poweroff,
+	.priority = POWER_OFF_PRIORITY_DEFAULT,
+};
+
 const enum wakeup_type at91_poweroff_get_wakeup_mode(struct device_node *np)
 {
 	const char *pm;
@@ -134,9 +144,7 @@ static int at91_poweroff_probe(struct platform_device *pdev)
 	if (pdev->dev.of_node)
 		at91_poweroff_dt_set_wakeup_mode(pdev);
 
-	pm_power_off = at91_poweroff;
-
-	return 0;
+	return devm_register_power_off_handler(&pdev->dev, &at91_power_off_nb);
 }
 
 static struct of_device_id at91_poweroff_of_match[] = {
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 29/47] power/reset: ltc2952-poweroff: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (26 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 28/47] power/reset: at91-poweroff: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 30/47] x86: iris: " Guenter Roeck
                   ` (18 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, David Woodhouse, Dmitry Eremin-Solenikov,
	Sebastian Reichel

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
sets pm_power_off only if it was not already set.

Acked-by: Sebastian Reichel <sre@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Added patch

 drivers/power/reset/ltc2952-poweroff.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/power/reset/ltc2952-poweroff.c b/drivers/power/reset/ltc2952-poweroff.c
index 116a1ce..8d67bff 100644
--- a/drivers/power/reset/ltc2952-poweroff.c
+++ b/drivers/power/reset/ltc2952-poweroff.c
@@ -80,6 +80,8 @@ struct ltc2952_poweroff_data {
 	 * 2: kill
 	 */
 	struct gpio_desc *gpio[3];
+
+	struct notifier_block power_off_nb;
 };
 
 static int ltc2952_poweroff_panic;
@@ -180,9 +182,13 @@ irq_ok:
 	return IRQ_HANDLED;
 }
 
-static void ltc2952_poweroff_kill(void)
+static int ltc2952_poweroff_kill(struct notifier_block *this,
+				 unsigned long unused1, void *unused2)
+
 {
 	gpiod_set_value(ltc2952_data->gpio[POWERPATH_IO_KILL], 1);
+
+	return NOTIFY_DONE;
 }
 
 static int ltc2952_poweroff_suspend(struct platform_device *pdev,
@@ -285,12 +291,7 @@ err_io:
 
 static int ltc2952_poweroff_probe(struct platform_device *pdev)
 {
-	int ret;
-
-	if (pm_power_off) {
-		dev_err(&pdev->dev, "pm_power_off already registered");
-		return -EBUSY;
-	}
+	int i, ret;
 
 	ltc2952_data = kzalloc(sizeof(*ltc2952_data), GFP_KERNEL);
 	if (!ltc2952_data)
@@ -302,12 +303,20 @@ static int ltc2952_poweroff_probe(struct platform_device *pdev)
 	if (ret)
 		goto err;
 
-	pm_power_off = &ltc2952_poweroff_kill;
+	ltc2952_data->power_off_nb.notifier_call = ltc2952_poweroff_kill;
+	ltc2952_data->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
+	ret = register_power_off_handler(&ltc2952_data->power_off_nb);
+	if (ret)
+		goto err_power;
 
 	dev_info(&pdev->dev, "probe successful\n");
 
 	return 0;
 
+err_power:
+	free_irq(ltc2952_data->virq, ltc2952_data);
+	for (i = 0; i < ARRAY_SIZE(ltc2952_data->gpio); i++)
+		gpiod_put(ltc2952_data->gpio[i]);
 err:
 	kfree(ltc2952_data);
 	return ret;
@@ -317,7 +326,7 @@ static int ltc2952_poweroff_remove(struct platform_device *pdev)
 {
 	unsigned int i;
 
-	pm_power_off = NULL;
+	unregister_power_off_handler(&ltc2952_data->power_off_nb);
 
 	if (ltc2952_data) {
 		free_irq(ltc2952_data->virq, ltc2952_data);
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 30/47] x86: iris: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (27 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 29/47] power/reset: ltc2952-poweroff: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-11-01 19:41   ` Thomas Gleixner
  2014-10-27 15:55 ` [PATCH v3 31/47] x86: apm: " Guenter Roeck
                   ` (17 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, x86

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with high priority to reflect that the original code
overwrites existing power-off handlers.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use devm_register_power_off_handler

 arch/x86/platform/iris/iris.c | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)

diff --git a/arch/x86/platform/iris/iris.c b/arch/x86/platform/iris/iris.c
index 4d171e8..aac23db 100644
--- a/arch/x86/platform/iris/iris.c
+++ b/arch/x86/platform/iris/iris.c
@@ -23,6 +23,7 @@
 
 #include <linux/moduleparam.h>
 #include <linux/module.h>
+#include <linux/notifier.h>
 #include <linux/platform_device.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -47,15 +48,21 @@ static bool force;
 module_param(force, bool, 0);
 MODULE_PARM_DESC(force, "Set to one to force poweroff handler installation.");
 
-static void (*old_pm_power_off)(void);
-
-static void iris_power_off(void)
+static int iris_power_off(struct notifier_block *this, unsigned long unused1,
+			  void *unused2)
 {
 	outb(IRIS_GIO_PULSE, IRIS_GIO_OUTPUT);
 	msleep(850);
 	outb(IRIS_GIO_REST, IRIS_GIO_OUTPUT);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block iris_power_off_nb = {
+	.notifier_call = iris_power_off,
+	.priority = POWER_OFF_PRIORITY_HIGH,
+};
+
 /*
  * Before installing the power_off handler, try to make sure the OS is
  * running on an Iris.  Since Iris does not support DMI, this is done
@@ -65,20 +72,25 @@ static void iris_power_off(void)
 static int iris_probe(struct platform_device *pdev)
 {
 	unsigned char status = inb(IRIS_GIO_INPUT);
+	int ret;
+
 	if (status == IRIS_GIO_NODEV) {
 		printk(KERN_ERR "This machine does not seem to be an Iris. "
 			"Power off handler not installed.\n");
 		return -ENODEV;
 	}
-	old_pm_power_off = pm_power_off;
-	pm_power_off = &iris_power_off;
+
+	ret = devm_register_power_off_handler(&pdev->dev, &iris_power_off_nb);
+	if (ret) {
+		dev_err(&pdev->dev, "Failed to register power-off handler\n");
+		return ret;
+	}
 	printk(KERN_INFO "Iris power_off handler installed.\n");
 	return 0;
 }
 
 static int iris_remove(struct platform_device *pdev)
 {
-	pm_power_off = old_pm_power_off;
 	printk(KERN_INFO "Iris power_off handler uninstalled.\n");
 	return 0;
 }
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 31/47] x86: apm: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (28 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 30/47] x86: iris: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 32/47] x86: olpc: Register xo1 power-off handler " Guenter Roeck
                   ` (16 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, Jiri Kosina, x86

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with high priority to reflect that the original code
overwrites existing power-off handlers.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Jiri Kosina <jkosina@suse.cz>
Reviewed-by: Jiri Kosina <jkosina@suse.cz>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 arch/x86/kernel/apm_32.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
index 5848744..a5c9066 100644
--- a/arch/x86/kernel/apm_32.c
+++ b/arch/x86/kernel/apm_32.c
@@ -219,6 +219,7 @@
 #include <linux/init.h>
 #include <linux/time.h>
 #include <linux/sched.h>
+#include <linux/notifier.h>
 #include <linux/pm.h>
 #include <linux/capability.h>
 #include <linux/device.h>
@@ -981,7 +982,8 @@ recalc:
  *	on their first cpu.
  */
 
-static void apm_power_off(void)
+static int apm_power_off(struct notifier_block *this, unsigned long unused1,
+			 void *unused2)
 {
 	/* Some bioses don't like being called from CPU != 0 */
 	if (apm_info.realmode_power_off) {
@@ -990,8 +992,14 @@ static void apm_power_off(void)
 	} else {
 		(void)set_system_power_state(APM_STATE_OFF);
 	}
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block apm_power_off_nb = {
+	.notifier_call = apm_power_off,
+	.priority = POWER_OFF_PRIORITY_HIGH,
+};
+
 #ifdef CONFIG_APM_DO_ENABLE
 
 /**
@@ -1847,8 +1855,11 @@ static int apm(void *unused)
 	}
 
 	/* Install our power off handler.. */
-	if (power_off)
-		pm_power_off = apm_power_off;
+	if (power_off) {
+		error = register_power_off_handler(&apm_power_off_nb);
+		if (error)
+			pr_err("apm: Failed to register power-off handler\n");
+	}
 
 	if (num_online_cpus() == 1 || smp) {
 #if defined(CONFIG_APM_DISPLAY_BLANK) && defined(CONFIG_VT)
@@ -2408,9 +2419,8 @@ static void __exit apm_exit(void)
 			apm_error("disengage power management", error);
 	}
 	misc_deregister(&apm_device);
+	unregister_power_off_handler(&apm_power_off_nb);
 	remove_proc_entry("apm", NULL);
-	if (power_off)
-		pm_power_off = NULL;
 	if (kapmd_task) {
 		kthread_stop(kapmd_task);
 		kapmd_task = NULL;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 32/47] x86: olpc: Register xo1 power-off handler with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (29 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 31/47] x86: apm: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 33/47] staging: nvec: Register " Guenter Roeck
                   ` (15 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, x86

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with high priority to reflect that the driver
explicitly wants to override default power-off handlers.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 arch/x86/platform/olpc/olpc-xo1-pm.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/x86/platform/olpc/olpc-xo1-pm.c b/arch/x86/platform/olpc/olpc-xo1-pm.c
index a9acde7..e1b7ad0 100644
--- a/arch/x86/platform/olpc/olpc-xo1-pm.c
+++ b/arch/x86/platform/olpc/olpc-xo1-pm.c
@@ -15,6 +15,7 @@
 #include <linux/cs5535.h>
 #include <linux/platform_device.h>
 #include <linux/export.h>
+#include <linux/notifier.h>
 #include <linux/pm.h>
 #include <linux/mfd/core.h>
 #include <linux/suspend.h>
@@ -92,7 +93,8 @@ asmlinkage __visible int xo1_do_sleep(u8 sleep_state)
 	return 0;
 }
 
-static void xo1_power_off(void)
+static int xo1_power_off(struct notifier_block *this, unsigned long unused1,
+			 void *unused2)
 {
 	printk(KERN_INFO "OLPC XO-1 power off sequence...\n");
 
@@ -108,8 +110,15 @@ static void xo1_power_off(void)
 
 	/* Write SLP_EN bit to start the machinery */
 	outl(0x00002000, acpi_base + CS5536_PM1_CNT);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block xo1_power_off_nb = {
+	.notifier_call = xo1_power_off,
+	.priority = POWER_OFF_PRIORITY_HIGH,
+};
+
 static int xo1_power_state_valid(suspend_state_t pm_state)
 {
 	/* suspend-to-RAM only */
@@ -146,8 +155,12 @@ static int xo1_pm_probe(struct platform_device *pdev)
 
 	/* If we have both addresses, we can override the poweroff hook */
 	if (pms_base && acpi_base) {
+		err = register_power_off_handler(&xo1_power_off_nb);
+		if (err) {
+			dev_err(&pdev->dev, "Failed to register power-off handler\n");
+			return err;
+		}
 		suspend_set_ops(&xo1_suspend_ops);
-		pm_power_off = xo1_power_off;
 		printk(KERN_INFO "OLPC XO-1 support registered\n");
 	}
 
@@ -158,12 +171,13 @@ static int xo1_pm_remove(struct platform_device *pdev)
 {
 	mfd_cell_disable(pdev);
 
+	unregister_power_off_handler(&xo1_power_off_nb);
+
 	if (strcmp(pdev->name, "cs5535-pms") == 0)
 		pms_base = 0;
 	else if (strcmp(pdev->name, "olpc-xo1-pm-acpi") == 0)
 		acpi_base = 0;
 
-	pm_power_off = NULL;
 	return 0;
 }
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 33/47] staging: nvec: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (30 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 32/47] x86: olpc: Register xo1 power-off handler " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 34/47] acpi: Register power-off handler " Guenter Roeck
                   ` (14 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: devel, linux-pm, Julian Andres Klode, Greg Kroah-Hartman,
	Guenter Roeck, linux-tegra, ac100

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with default priority since we don't know any better.

Cc: Julian Andres Klode <jak@jak-linux.org>
Cc: Marc Dietrich <marvin24@gmx.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use dev_warn instead of dev_err

 drivers/staging/nvec/nvec.c | 24 +++++++++++++++---------
 drivers/staging/nvec/nvec.h |  2 ++
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/staging/nvec/nvec.c b/drivers/staging/nvec/nvec.c
index a93208a..3c94e29 100644
--- a/drivers/staging/nvec/nvec.c
+++ b/drivers/staging/nvec/nvec.c
@@ -33,6 +33,7 @@
 #include <linux/mfd/core.h>
 #include <linux/mutex.h>
 #include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/workqueue.h>
@@ -80,8 +81,6 @@ enum nvec_sleep_subcmds {
 #define LID_SWITCH BIT(1)
 #define PWR_BUTTON BIT(15)
 
-static struct nvec_chip *nvec_power_handle;
-
 static const struct mfd_cell nvec_devices[] = {
 	{
 		.name = "nvec-kbd",
@@ -759,12 +758,17 @@ static void nvec_disable_i2c_slave(struct nvec_chip *nvec)
 }
 #endif
 
-static void nvec_power_off(void)
+static int nvec_power_off(struct notifier_block *this, unsigned long unused1,
+			  void *unused2)
 {
+	struct nvec_chip *nvec = container_of(this, struct nvec_chip,
+					      power_off_nb);
 	char ap_pwr_down[] = { NVEC_SLEEP, AP_PWR_DOWN };
 
-	nvec_toggle_global_events(nvec_power_handle, false);
-	nvec_write_async(nvec_power_handle, ap_pwr_down, 2);
+	nvec_toggle_global_events(nvec, false);
+	nvec_write_async(nvec, ap_pwr_down, 2);
+
+	return NOTIFY_DONE;
 }
 
 /*
@@ -878,8 +882,11 @@ static int tegra_nvec_probe(struct platform_device *pdev)
 	nvec->nvec_status_notifier.notifier_call = nvec_status_notifier;
 	nvec_register_notifier(nvec, &nvec->nvec_status_notifier, 0);
 
-	nvec_power_handle = nvec;
-	pm_power_off = nvec_power_off;
+	nvec->power_off_nb.notifier_call = nvec_power_off;
+	nvec->power_off_nb.priority = POWER_OFF_PRIORITY_DEFAULT;
+	ret = register_power_off_handler(&nvec->power_off_nb);
+	if (ret)
+		dev_warn(nvec->dev, "Failed to register power-off handler\n");
 
 	/* Get Firmware Version */
 	msg = nvec_write_sync(nvec, get_firmware_version, 2);
@@ -914,13 +921,12 @@ static int tegra_nvec_remove(struct platform_device *pdev)
 {
 	struct nvec_chip *nvec = platform_get_drvdata(pdev);
 
+	unregister_power_off_handler(&nvec->power_off_nb);
 	nvec_toggle_global_events(nvec, false);
 	mfd_remove_devices(nvec->dev);
 	nvec_unregister_notifier(nvec, &nvec->nvec_status_notifier);
 	cancel_work_sync(&nvec->rx_work);
 	cancel_work_sync(&nvec->tx_work);
-	/* FIXME: needs check wether nvec is responsible for power off */
-	pm_power_off = NULL;
 
 	return 0;
 }
diff --git a/drivers/staging/nvec/nvec.h b/drivers/staging/nvec/nvec.h
index e271375..59e7375 100644
--- a/drivers/staging/nvec/nvec.h
+++ b/drivers/staging/nvec/nvec.h
@@ -163,6 +163,8 @@ struct nvec_chip {
 	struct nvec_msg *last_sync_msg;
 
 	int state;
+
+	struct notifier_block power_off_nb;
 };
 
 extern int nvec_write_async(struct nvec_chip *nvec, const unsigned char *data,
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 34/47] acpi: Register power-off handler with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (31 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 33/47] staging: nvec: Register " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-28  0:26   ` Rafael J. Wysocki
  2014-10-27 15:55 ` [PATCH v3 35/47] arm: Register " Guenter Roeck
                   ` (13 subsequent siblings)
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Rafael J. Wysocki, Len Brown, linux-acpi

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with high priority to reflect that the driver explicitly
overrides existing power-off handlers.

Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Len Brown <lenb@kernel.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
- Replace acpi: with ACPI: in log message
v2:
- Use define to specify poweroff handler priority
- Use pr_warn instead of pr_err

 drivers/acpi/sleep.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index 05a31b5..7875b92 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -16,6 +16,8 @@
 #include <linux/device.h>
 #include <linux/interrupt.h>
 #include <linux/suspend.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/reboot.h>
 #include <linux/acpi.h>
 #include <linux/module.h>
@@ -827,14 +829,22 @@ static void acpi_power_off_prepare(void)
 	acpi_disable_all_gpes();
 }
 
-static void acpi_power_off(void)
+static int acpi_power_off(struct notifier_block *this,
+			  unsigned long unused1, void *unused2)
 {
 	/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
 	printk(KERN_DEBUG "%s called\n", __func__);
 	local_irq_disable();
 	acpi_enter_sleep_state(ACPI_STATE_S5);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block acpi_power_off_nb = {
+	.notifier_call = acpi_power_off,
+	.priority = POWER_OFF_PRIORITY_HIGH,
+};
+
 int __init acpi_sleep_init(void)
 {
 	char supported[ACPI_S_STATE_COUNT * 3 + 1];
@@ -851,7 +861,8 @@ int __init acpi_sleep_init(void)
 	if (acpi_sleep_state_supported(ACPI_STATE_S5)) {
 		sleep_states[ACPI_STATE_S5] = 1;
 		pm_power_off_prepare = acpi_power_off_prepare;
-		pm_power_off = acpi_power_off;
+		if (register_power_off_handler(&acpi_power_off_nb))
+			pr_warn("ACPI: Failed to register power-off handler\n");
 	}
 
 	supported[0] = 0;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 35/47] arm: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (32 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 34/47] acpi: Register power-off handler " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 36/47] arm64: psci: " Guenter Roeck
                   ` (12 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Russell King, bcm-kernel-feedback-list,
	linux-arm-kernel, linux-omap, linux-rpi-kernel, linux-samsung-soc,
	xen-devel

Register with kernel power-off handler instead of setting pm_power_off
directly. Always use register_power_off_handler_simple as there is no
indication that more than one power-off handler is registered.

If the power-off handler only resets the system or puts the CPU in sleep mode,
select the fallback priority to indicate that the power-off handler is one
of last resort. If the power-off handler powers off the system, select the
default priority.

Cc: Russell King <linux@arm.linux.org.uk>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use defines to specify poweroff handler priorities
- Drop changes in arch/arm/mach-at91/setup.c (file removed upstream)

 arch/arm/kernel/psci.c                         | 3 ++-
 arch/arm/mach-at91/board-gsia18s.c             | 3 ++-
 arch/arm/mach-bcm/board_bcm2835.c              | 3 ++-
 arch/arm/mach-cns3xxx/cns3420vb.c              | 3 ++-
 arch/arm/mach-cns3xxx/core.c                   | 3 ++-
 arch/arm/mach-highbank/highbank.c              | 3 ++-
 arch/arm/mach-imx/mach-mx31moboard.c           | 3 ++-
 arch/arm/mach-iop32x/em7210.c                  | 3 ++-
 arch/arm/mach-iop32x/glantank.c                | 3 ++-
 arch/arm/mach-iop32x/iq31244.c                 | 3 ++-
 arch/arm/mach-iop32x/n2100.c                   | 3 ++-
 arch/arm/mach-ixp4xx/dsmg600-setup.c           | 3 ++-
 arch/arm/mach-ixp4xx/nas100d-setup.c           | 3 ++-
 arch/arm/mach-ixp4xx/nslu2-setup.c             | 3 ++-
 arch/arm/mach-omap2/board-omap3touchbook.c     | 3 ++-
 arch/arm/mach-orion5x/board-mss2.c             | 3 ++-
 arch/arm/mach-orion5x/dns323-setup.c           | 9 ++++++---
 arch/arm/mach-orion5x/kurobox_pro-setup.c      | 3 ++-
 arch/arm/mach-orion5x/ls-chl-setup.c           | 3 ++-
 arch/arm/mach-orion5x/ls_hgl-setup.c           | 3 ++-
 arch/arm/mach-orion5x/lsmini-setup.c           | 3 ++-
 arch/arm/mach-orion5x/mv2120-setup.c           | 3 ++-
 arch/arm/mach-orion5x/net2big-setup.c          | 3 ++-
 arch/arm/mach-orion5x/terastation_pro2-setup.c | 3 ++-
 arch/arm/mach-orion5x/ts209-setup.c            | 3 ++-
 arch/arm/mach-orion5x/ts409-setup.c            | 3 ++-
 arch/arm/mach-pxa/corgi.c                      | 3 ++-
 arch/arm/mach-pxa/mioa701.c                    | 3 ++-
 arch/arm/mach-pxa/poodle.c                     | 3 ++-
 arch/arm/mach-pxa/spitz.c                      | 3 ++-
 arch/arm/mach-pxa/tosa.c                       | 3 ++-
 arch/arm/mach-pxa/viper.c                      | 3 ++-
 arch/arm/mach-pxa/z2.c                         | 7 ++++---
 arch/arm/mach-pxa/zeus.c                       | 7 ++++---
 arch/arm/mach-s3c24xx/mach-gta02.c             | 3 ++-
 arch/arm/mach-s3c24xx/mach-jive.c              | 3 ++-
 arch/arm/mach-s3c24xx/mach-vr1000.c            | 3 ++-
 arch/arm/mach-s3c64xx/mach-smartq.c            | 3 ++-
 arch/arm/mach-sa1100/generic.c                 | 3 ++-
 arch/arm/mach-sa1100/simpad.c                  | 3 ++-
 arch/arm/mach-u300/regulator.c                 | 3 ++-
 arch/arm/mach-vt8500/vt8500.c                  | 3 ++-
 arch/arm/xen/enlighten.c                       | 3 ++-
 43 files changed, 94 insertions(+), 49 deletions(-)

diff --git a/arch/arm/kernel/psci.c b/arch/arm/kernel/psci.c
index f73891b..a7a2b4a 100644
--- a/arch/arm/kernel/psci.c
+++ b/arch/arm/kernel/psci.c
@@ -264,7 +264,8 @@ static int psci_0_2_init(struct device_node *np)
 
 	arm_pm_restart = psci_sys_reset;
 
-	pm_power_off = psci_sys_poweroff;
+	register_power_off_handler_simple(psci_sys_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 out_put_node:
 	of_node_put(np);
diff --git a/arch/arm/mach-at91/board-gsia18s.c b/arch/arm/mach-at91/board-gsia18s.c
index bf5cc55..e628c4a 100644
--- a/arch/arm/mach-at91/board-gsia18s.c
+++ b/arch/arm/mach-at91/board-gsia18s.c
@@ -521,7 +521,8 @@ static void gsia18s_power_off(void)
 
 static int __init gsia18s_power_off_init(void)
 {
-	pm_power_off = gsia18s_power_off;
+	register_power_off_handler_simple(gsia18s_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 	return 0;
 }
 
diff --git a/arch/arm/mach-bcm/board_bcm2835.c b/arch/arm/mach-bcm/board_bcm2835.c
index 70f2f39..1d75c76 100644
--- a/arch/arm/mach-bcm/board_bcm2835.c
+++ b/arch/arm/mach-bcm/board_bcm2835.c
@@ -111,7 +111,8 @@ static void __init bcm2835_init(void)
 
 	bcm2835_setup_restart();
 	if (wdt_regs)
-		pm_power_off = bcm2835_power_off;
+		register_power_off_handler_simple(bcm2835_power_off,
+						  POWER_OFF_PRIORITY_FALLBACK);
 
 	bcm2835_init_clocks();
 
diff --git a/arch/arm/mach-cns3xxx/cns3420vb.c b/arch/arm/mach-cns3xxx/cns3420vb.c
index 6428bcc7..5c50461 100644
--- a/arch/arm/mach-cns3xxx/cns3420vb.c
+++ b/arch/arm/mach-cns3xxx/cns3420vb.c
@@ -224,7 +224,8 @@ static void __init cns3420_init(void)
 	cns3xxx_ahci_init();
 	cns3xxx_sdhci_init();
 
-	pm_power_off = cns3xxx_power_off;
+	register_power_off_handler_simple(cns3xxx_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 static struct map_desc cns3420_io_desc[] __initdata = {
diff --git a/arch/arm/mach-cns3xxx/core.c b/arch/arm/mach-cns3xxx/core.c
index 4e9837d..9c214cf 100644
--- a/arch/arm/mach-cns3xxx/core.c
+++ b/arch/arm/mach-cns3xxx/core.c
@@ -386,7 +386,8 @@ static void __init cns3xxx_init(void)
 		cns3xxx_pwr_soft_rst(CNS3XXX_PWR_SOFTWARE_RST(SDIO));
 	}
 
-	pm_power_off = cns3xxx_power_off;
+	register_power_off_handler_simple(cns3xxx_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	of_platform_populate(NULL, of_default_bus_match_table,
                         cns3xxx_auxdata, NULL);
diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c
index 07a0957..6fbdc01 100644
--- a/arch/arm/mach-highbank/highbank.c
+++ b/arch/arm/mach-highbank/highbank.c
@@ -155,7 +155,8 @@ static void __init highbank_init(void)
 	sregs_base = of_iomap(np, 0);
 	WARN_ON(!sregs_base);
 
-	pm_power_off = highbank_power_off;
+	register_power_off_handler_simple(highbank_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 	highbank_pm_init();
 
 	bus_register_notifier(&platform_bus_type, &highbank_platform_nb);
diff --git a/arch/arm/mach-imx/mach-mx31moboard.c b/arch/arm/mach-imx/mach-mx31moboard.c
index bb6f8a5..3001b14 100644
--- a/arch/arm/mach-imx/mach-mx31moboard.c
+++ b/arch/arm/mach-imx/mach-mx31moboard.c
@@ -559,7 +559,8 @@ static void __init mx31moboard_init(void)
 
 	imx_add_platform_device("imx_mc13783", 0, NULL, 0, NULL, 0);
 
-	pm_power_off = mx31moboard_poweroff;
+	register_power_off_handler_simple(mx31moboard_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	switch (mx31moboard_baseboard) {
 	case MX31NOBOARD:
diff --git a/arch/arm/mach-iop32x/em7210.c b/arch/arm/mach-iop32x/em7210.c
index 77e1ff0..fd3ad09 100644
--- a/arch/arm/mach-iop32x/em7210.c
+++ b/arch/arm/mach-iop32x/em7210.c
@@ -201,7 +201,8 @@ static int __init em7210_request_gpios(void)
 		return 0;
 	}
 
-	pm_power_off = em7210_power_off;
+	register_power_off_handler_simple(em7210_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	return 0;
 }
diff --git a/arch/arm/mach-iop32x/glantank.c b/arch/arm/mach-iop32x/glantank.c
index 547b234..9298ea0 100644
--- a/arch/arm/mach-iop32x/glantank.c
+++ b/arch/arm/mach-iop32x/glantank.c
@@ -199,7 +199,8 @@ static void __init glantank_init_machine(void)
 	i2c_register_board_info(0, glantank_i2c_devices,
 		ARRAY_SIZE(glantank_i2c_devices));
 
-	pm_power_off = glantank_power_off;
+	register_power_off_handler_simple(glantank_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 MACHINE_START(GLANTANK, "GLAN Tank")
diff --git a/arch/arm/mach-iop32x/iq31244.c b/arch/arm/mach-iop32x/iq31244.c
index 0e1392b..50ba54b 100644
--- a/arch/arm/mach-iop32x/iq31244.c
+++ b/arch/arm/mach-iop32x/iq31244.c
@@ -293,7 +293,8 @@ static void __init iq31244_init_machine(void)
 	platform_device_register(&iop3xx_dma_1_channel);
 
 	if (is_ep80219())
-		pm_power_off = ep80219_power_off;
+		register_power_off_handler_simple(ep80219_power_off,
+						  POWER_OFF_PRIORITY_DEFAULT);
 
 	if (!is_80219())
 		platform_device_register(&iop3xx_aau_channel);
diff --git a/arch/arm/mach-iop32x/n2100.c b/arch/arm/mach-iop32x/n2100.c
index c1cd80e..734a092 100644
--- a/arch/arm/mach-iop32x/n2100.c
+++ b/arch/arm/mach-iop32x/n2100.c
@@ -356,7 +356,8 @@ static void __init n2100_init_machine(void)
 	i2c_register_board_info(0, n2100_i2c_devices,
 		ARRAY_SIZE(n2100_i2c_devices));
 
-	pm_power_off = n2100_power_off;
+	register_power_off_handler_simple(n2100_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 MACHINE_START(N2100, "Thecus N2100")
diff --git a/arch/arm/mach-ixp4xx/dsmg600-setup.c b/arch/arm/mach-ixp4xx/dsmg600-setup.c
index 43ee06d..f34564d 100644
--- a/arch/arm/mach-ixp4xx/dsmg600-setup.c
+++ b/arch/arm/mach-ixp4xx/dsmg600-setup.c
@@ -281,7 +281,8 @@ static void __init dsmg600_init(void)
 
 	platform_add_devices(dsmg600_devices, ARRAY_SIZE(dsmg600_devices));
 
-	pm_power_off = dsmg600_power_off;
+	register_power_off_handler_simple(dsmg600_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 MACHINE_START(DSMG600, "D-Link DSM-G600 RevA")
diff --git a/arch/arm/mach-ixp4xx/nas100d-setup.c b/arch/arm/mach-ixp4xx/nas100d-setup.c
index 4e0f762..43a9333 100644
--- a/arch/arm/mach-ixp4xx/nas100d-setup.c
+++ b/arch/arm/mach-ixp4xx/nas100d-setup.c
@@ -292,7 +292,8 @@ static void __init nas100d_init(void)
 
 	platform_add_devices(nas100d_devices, ARRAY_SIZE(nas100d_devices));
 
-	pm_power_off = nas100d_power_off;
+	register_power_off_handler_simple(nas100d_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	if (request_irq(gpio_to_irq(NAS100D_RB_GPIO), &nas100d_reset_handler,
 		IRQF_TRIGGER_LOW, "NAS100D reset button", NULL) < 0) {
diff --git a/arch/arm/mach-ixp4xx/nslu2-setup.c b/arch/arm/mach-ixp4xx/nslu2-setup.c
index 88c025f..e094d5f 100644
--- a/arch/arm/mach-ixp4xx/nslu2-setup.c
+++ b/arch/arm/mach-ixp4xx/nslu2-setup.c
@@ -262,7 +262,8 @@ static void __init nslu2_init(void)
 
 	platform_add_devices(nslu2_devices, ARRAY_SIZE(nslu2_devices));
 
-	pm_power_off = nslu2_power_off;
+	register_power_off_handler_simple(nslu2_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	if (request_irq(gpio_to_irq(NSLU2_RB_GPIO), &nslu2_reset_handler,
 		IRQF_TRIGGER_LOW, "NSLU2 reset button", NULL) < 0) {
diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c
index a01993e..8abce2c 100644
--- a/arch/arm/mach-omap2/board-omap3touchbook.c
+++ b/arch/arm/mach-omap2/board-omap3touchbook.c
@@ -344,7 +344,8 @@ static void __init omap3_touchbook_init(void)
 {
 	omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
 
-	pm_power_off = omap3_touchbook_poweroff;
+	register_power_off_handler_simple(omap3_touchbook_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	if (system_rev >= 0x20 && system_rev <= 0x34301000) {
 		omap_mux_init_gpio(23, OMAP_PIN_INPUT);
diff --git a/arch/arm/mach-orion5x/board-mss2.c b/arch/arm/mach-orion5x/board-mss2.c
index 66f9c3b..cac2793 100644
--- a/arch/arm/mach-orion5x/board-mss2.c
+++ b/arch/arm/mach-orion5x/board-mss2.c
@@ -86,5 +86,6 @@ static void mss2_power_off(void)
 void __init mss2_init(void)
 {
 	/* register mss2 specific power-off method */
-	pm_power_off = mss2_power_off;
+	register_power_off_handler_simple(mss2_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 }
diff --git a/arch/arm/mach-orion5x/dns323-setup.c b/arch/arm/mach-orion5x/dns323-setup.c
index 09d2a26..9876509 100644
--- a/arch/arm/mach-orion5x/dns323-setup.c
+++ b/arch/arm/mach-orion5x/dns323-setup.c
@@ -669,7 +669,8 @@ static void __init dns323_init(void)
 		if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
 		    gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
 			pr_err("DNS-323: failed to setup power-off GPIO\n");
-		pm_power_off = dns323a_power_off;
+		register_power_off_handler_simple(dns323a_power_off,
+						  POWER_OFF_PRIORITY_DEFAULT);
 		break;
 	case DNS323_REV_B1:
 		/* 5182 built-in SATA init */
@@ -686,7 +687,8 @@ static void __init dns323_init(void)
 		if (gpio_request(DNS323_GPIO_POWER_OFF, "POWEROFF") != 0 ||
 		    gpio_direction_output(DNS323_GPIO_POWER_OFF, 0) != 0)
 			pr_err("DNS-323: failed to setup power-off GPIO\n");
-		pm_power_off = dns323b_power_off;
+		register_power_off_handler_simple(dns323b_power_off,
+						  POWER_OFF_PRIORITY_DEFAULT);
 		break;
 	case DNS323_REV_C1:
 		/* 5182 built-in SATA init */
@@ -696,7 +698,8 @@ static void __init dns323_init(void)
 		if (gpio_request(DNS323C_GPIO_POWER_OFF, "POWEROFF") != 0 ||
 		    gpio_direction_output(DNS323C_GPIO_POWER_OFF, 0) != 0)
 			pr_err("DNS-323: failed to setup power-off GPIO\n");
-		pm_power_off = dns323c_power_off;
+		register_power_off_handler_simple(dns323c_power_off,
+						  POWER_OFF_PRIORITY_DEFAULT);
 
 		/* Now, -this- should theorically be done by the sata_mv driver
 		 * once I figure out what's going on there. Maybe the behaviour
diff --git a/arch/arm/mach-orion5x/kurobox_pro-setup.c b/arch/arm/mach-orion5x/kurobox_pro-setup.c
index fe6a48a..872d4fe 100644
--- a/arch/arm/mach-orion5x/kurobox_pro-setup.c
+++ b/arch/arm/mach-orion5x/kurobox_pro-setup.c
@@ -376,7 +376,8 @@ static void __init kurobox_pro_init(void)
 	i2c_register_board_info(0, &kurobox_pro_i2c_rtc, 1);
 
 	/* register Kurobox Pro specific power-off method */
-	pm_power_off = kurobox_pro_power_off;
+	register_power_off_handler_simple(kurobox_pro_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 #ifdef CONFIG_MACH_KUROBOX_PRO
diff --git a/arch/arm/mach-orion5x/ls-chl-setup.c b/arch/arm/mach-orion5x/ls-chl-setup.c
index 028ea03..3f540d1 100644
--- a/arch/arm/mach-orion5x/ls-chl-setup.c
+++ b/arch/arm/mach-orion5x/ls-chl-setup.c
@@ -312,7 +312,8 @@ static void __init lschl_init(void)
 	gpio_set_value(LSCHL_GPIO_USB_POWER, 1);
 
 	/* register power-off method */
-	pm_power_off = lschl_power_off;
+	register_power_off_handler_simple(lschl_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	pr_info("%s: finished\n", __func__);
 }
diff --git a/arch/arm/mach-orion5x/ls_hgl-setup.c b/arch/arm/mach-orion5x/ls_hgl-setup.c
index 32b7129..699a5a1 100644
--- a/arch/arm/mach-orion5x/ls_hgl-setup.c
+++ b/arch/arm/mach-orion5x/ls_hgl-setup.c
@@ -259,7 +259,8 @@ static void __init ls_hgl_init(void)
 	gpio_set_value(LS_HGL_GPIO_USB_POWER, 1);
 
 	/* register power-off method */
-	pm_power_off = ls_hgl_power_off;
+	register_power_off_handler_simple(ls_hgl_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	pr_info("%s: finished\n", __func__);
 }
diff --git a/arch/arm/mach-orion5x/lsmini-setup.c b/arch/arm/mach-orion5x/lsmini-setup.c
index a6493e7..c5712ff 100644
--- a/arch/arm/mach-orion5x/lsmini-setup.c
+++ b/arch/arm/mach-orion5x/lsmini-setup.c
@@ -260,7 +260,8 @@ static void __init lsmini_init(void)
 	gpio_set_value(LSMINI_GPIO_USB_POWER, 1);
 
 	/* register power-off method */
-	pm_power_off = lsmini_power_off;
+	register_power_off_handler_simple(lsmini_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	pr_info("%s: finished\n", __func__);
 }
diff --git a/arch/arm/mach-orion5x/mv2120-setup.c b/arch/arm/mach-orion5x/mv2120-setup.c
index e032f01..13efbec 100644
--- a/arch/arm/mach-orion5x/mv2120-setup.c
+++ b/arch/arm/mach-orion5x/mv2120-setup.c
@@ -225,7 +225,8 @@ static void __init mv2120_init(void)
 	if (gpio_request(MV2120_GPIO_POWER_OFF, "POWEROFF") != 0 ||
 	    gpio_direction_output(MV2120_GPIO_POWER_OFF, 1) != 0)
 		pr_err("mv2120: failed to setup power-off GPIO\n");
-	pm_power_off = mv2120_power_off;
+	register_power_off_handler_simple(mv2120_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 /* Warning: HP uses a wrong mach-type (=526) in their bootloader */
diff --git a/arch/arm/mach-orion5x/net2big-setup.c b/arch/arm/mach-orion5x/net2big-setup.c
index ba73dc7..c7648f0 100644
--- a/arch/arm/mach-orion5x/net2big-setup.c
+++ b/arch/arm/mach-orion5x/net2big-setup.c
@@ -413,7 +413,8 @@ static void __init net2big_init(void)
 
 	if (gpio_request(NET2BIG_GPIO_POWER_OFF, "power-off") == 0 &&
 	    gpio_direction_output(NET2BIG_GPIO_POWER_OFF, 0) == 0)
-		pm_power_off = net2big_power_off;
+		register_power_off_handler_simple(net2big_power_off,
+						  POWER_OFF_PRIORITY_DEFAULT);
 	else
 		pr_err("net2big: failed to configure power-off GPIO\n");
 
diff --git a/arch/arm/mach-orion5x/terastation_pro2-setup.c b/arch/arm/mach-orion5x/terastation_pro2-setup.c
index 1208674..227ae91 100644
--- a/arch/arm/mach-orion5x/terastation_pro2-setup.c
+++ b/arch/arm/mach-orion5x/terastation_pro2-setup.c
@@ -353,7 +353,8 @@ static void __init tsp2_init(void)
 	i2c_register_board_info(0, &tsp2_i2c_rtc, 1);
 
 	/* register Terastation Pro II specific power-off method */
-	pm_power_off = tsp2_power_off;
+	register_power_off_handler_simple(tsp2_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 MACHINE_START(TERASTATION_PRO2, "Buffalo Terastation Pro II/Live")
diff --git a/arch/arm/mach-orion5x/ts209-setup.c b/arch/arm/mach-orion5x/ts209-setup.c
index c725b7c..540e3f3 100644
--- a/arch/arm/mach-orion5x/ts209-setup.c
+++ b/arch/arm/mach-orion5x/ts209-setup.c
@@ -318,7 +318,8 @@ static void __init qnap_ts209_init(void)
 	i2c_register_board_info(0, &qnap_ts209_i2c_rtc, 1);
 
 	/* register tsx09 specific power-off method */
-	pm_power_off = qnap_tsx09_power_off;
+	register_power_off_handler_simple(qnap_tsx09_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 MACHINE_START(TS209, "QNAP TS-109/TS-209")
diff --git a/arch/arm/mach-orion5x/ts409-setup.c b/arch/arm/mach-orion5x/ts409-setup.c
index cf2ab53..40cbdd7 100644
--- a/arch/arm/mach-orion5x/ts409-setup.c
+++ b/arch/arm/mach-orion5x/ts409-setup.c
@@ -307,7 +307,8 @@ static void __init qnap_ts409_init(void)
 	platform_device_register(&ts409_leds);
 
 	/* register tsx09 specific power-off method */
-	pm_power_off = qnap_tsx09_power_off;
+	register_power_off_handler_simple(qnap_tsx09_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 MACHINE_START(TS409, "QNAP TS-409")
diff --git a/arch/arm/mach-pxa/corgi.c b/arch/arm/mach-pxa/corgi.c
index 06022b2..93b73a1 100644
--- a/arch/arm/mach-pxa/corgi.c
+++ b/arch/arm/mach-pxa/corgi.c
@@ -718,7 +718,8 @@ static void corgi_restart(enum reboot_mode mode, const char *cmd)
 
 static void __init corgi_init(void)
 {
-	pm_power_off = corgi_poweroff;
+	register_power_off_handler_simple(corgi_poweroff,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	/* Stop 3.6MHz and drive HIGH to PCMCIA and CS */
 	PCFR |= PCFR_OPDE;
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c
index 29997bd..5d318d4 100644
--- a/arch/arm/mach-pxa/mioa701.c
+++ b/arch/arm/mach-pxa/mioa701.c
@@ -750,7 +750,8 @@ static void __init mioa701_machine_init(void)
 	pxa_set_keypad_info(&mioa701_keypad_info);
 	pxa_set_udc_info(&mioa701_udc_info);
 	pxa_set_ac97_info(&mioa701_ac97_info);
-	pm_power_off = mioa701_poweroff;
+	register_power_off_handler_simple(mioa701_poweroff,
+					  POWER_OFF_PRIORITY_FALLBACK);
 	platform_add_devices(devices, ARRAY_SIZE(devices));
 	gsm_init();
 
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c
index 1319916..749d2af 100644
--- a/arch/arm/mach-pxa/poodle.c
+++ b/arch/arm/mach-pxa/poodle.c
@@ -432,7 +432,8 @@ static void __init poodle_init(void)
 {
 	int ret = 0;
 
-	pm_power_off = poodle_poweroff;
+	register_power_off_handler_simple(poodle_poweroff,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	PCFR |= PCFR_OPDE;
 
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
index 840c3a4..ab25b6c 100644
--- a/arch/arm/mach-pxa/spitz.c
+++ b/arch/arm/mach-pxa/spitz.c
@@ -944,7 +944,8 @@ static void spitz_restart(enum reboot_mode mode, const char *cmd)
 static void __init spitz_init(void)
 {
 	init_gpio_reset(SPITZ_GPIO_ON_RESET, 1, 0);
-	pm_power_off = spitz_poweroff;
+	register_power_off_handler_simple(spitz_poweroff,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	PMCR = 0x00;
 
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
index c158a6e..8823448 100644
--- a/arch/arm/mach-pxa/tosa.c
+++ b/arch/arm/mach-pxa/tosa.c
@@ -940,7 +940,8 @@ static void __init tosa_init(void)
 
 	init_gpio_reset(TOSA_GPIO_ON_RESET, 0, 0);
 
-	pm_power_off = tosa_poweroff;
+	register_power_off_handler_simple(tosa_poweroff,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	PCFR |= PCFR_OPDE;
 
diff --git a/arch/arm/mach-pxa/viper.c b/arch/arm/mach-pxa/viper.c
index de3b080..6bb4de3 100644
--- a/arch/arm/mach-pxa/viper.c
+++ b/arch/arm/mach-pxa/viper.c
@@ -919,7 +919,8 @@ static void __init viper_init(void)
 {
 	u8 version;
 
-	pm_power_off = viper_power_off;
+	register_power_off_handler_simple(viper_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	pxa2xx_mfp_config(ARRAY_AND_SIZE(viper_pin_config));
 
diff --git a/arch/arm/mach-pxa/z2.c b/arch/arm/mach-pxa/z2.c
index e1a121b..0d0a6ae 100644
--- a/arch/arm/mach-pxa/z2.c
+++ b/arch/arm/mach-pxa/z2.c
@@ -693,8 +693,6 @@ static void z2_power_off(void)
 	pxa27x_set_pwrmode(PWRMODE_DEEPSLEEP);
 	pxa27x_cpu_pm_enter(PM_SUSPEND_MEM);
 }
-#else
-#define z2_power_off   NULL
 #endif
 
 /******************************************************************************
@@ -719,7 +717,10 @@ static void __init z2_init(void)
 	z2_keys_init();
 	z2_pmic_init();
 
-	pm_power_off = z2_power_off;
+#ifdef CONFIG_PM
+	register_power_off_handler_simple(z2_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
+#endif
 }
 
 MACHINE_START(ZIPIT2, "Zipit Z2")
diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
index 205f9bf..457eed1 100644
--- a/arch/arm/mach-pxa/zeus.c
+++ b/arch/arm/mach-pxa/zeus.c
@@ -690,8 +690,6 @@ static void zeus_power_off(void)
 	local_irq_disable();
 	cpu_suspend(PWRMODE_DEEPSLEEP, pxa27x_finish_suspend);
 }
-#else
-#define zeus_power_off   NULL
 #endif
 
 #ifdef CONFIG_APM_EMULATION
@@ -847,7 +845,10 @@ static void __init zeus_init(void)
 	__raw_writel(msc0, MSC0);
 	__raw_writel(msc1, MSC1);
 
-	pm_power_off = zeus_power_off;
+#ifdef CONFIG_PM
+	register_power_off_handler_simple(zeus_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
+#endif
 	zeus_setup_apm();
 
 	pxa2xx_mfp_config(ARRAY_AND_SIZE(zeus_pin_config));
diff --git a/arch/arm/mach-s3c24xx/mach-gta02.c b/arch/arm/mach-s3c24xx/mach-gta02.c
index 6d1e0b9..8366b3e 100644
--- a/arch/arm/mach-s3c24xx/mach-gta02.c
+++ b/arch/arm/mach-s3c24xx/mach-gta02.c
@@ -579,7 +579,8 @@ static void __init gta02_machine_init(void)
 	i2c_register_board_info(0, gta02_i2c_devs, ARRAY_SIZE(gta02_i2c_devs));
 
 	platform_add_devices(gta02_devices, ARRAY_SIZE(gta02_devices));
-	pm_power_off = gta02_poweroff;
+	register_power_off_handler_simple(gta02_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	regulator_has_full_constraints();
 }
diff --git a/arch/arm/mach-s3c24xx/mach-jive.c b/arch/arm/mach-s3c24xx/mach-jive.c
index 7d99fe8..20beb39 100644
--- a/arch/arm/mach-s3c24xx/mach-jive.c
+++ b/arch/arm/mach-s3c24xx/mach-jive.c
@@ -657,7 +657,8 @@ static void __init jive_machine_init(void)
 	s3c_i2c0_set_platdata(&jive_i2c_cfg);
 	i2c_register_board_info(0, jive_i2c_devs, ARRAY_SIZE(jive_i2c_devs));
 
-	pm_power_off = jive_power_off;
+	register_power_off_handler_simple(jive_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	platform_add_devices(jive_devices, ARRAY_SIZE(jive_devices));
 }
diff --git a/arch/arm/mach-s3c24xx/mach-vr1000.c b/arch/arm/mach-s3c24xx/mach-vr1000.c
index 89f32bd..1f32ba7 100644
--- a/arch/arm/mach-s3c24xx/mach-vr1000.c
+++ b/arch/arm/mach-s3c24xx/mach-vr1000.c
@@ -306,7 +306,8 @@ static void vr1000_power_off(void)
 
 static void __init vr1000_map_io(void)
 {
-	pm_power_off = vr1000_power_off;
+	register_power_off_handler_simple(vr1000_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	s3c24xx_init_io(vr1000_iodesc, ARRAY_SIZE(vr1000_iodesc));
 	s3c24xx_init_uarts(vr1000_uartcfgs, ARRAY_SIZE(vr1000_uartcfgs));
diff --git a/arch/arm/mach-s3c64xx/mach-smartq.c b/arch/arm/mach-s3c64xx/mach-smartq.c
index b3d1353..b30906f 100644
--- a/arch/arm/mach-s3c64xx/mach-smartq.c
+++ b/arch/arm/mach-s3c64xx/mach-smartq.c
@@ -291,7 +291,8 @@ static int __init smartq_power_off_init(void)
 	/* leave power on */
 	gpio_direction_output(S3C64XX_GPK(15), 0);
 
-	pm_power_off = smartq_power_off;
+	register_power_off_handler_simple(smartq_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	return ret;
 }
diff --git a/arch/arm/mach-sa1100/generic.c b/arch/arm/mach-sa1100/generic.c
index d4ea142..371bffe 100644
--- a/arch/arm/mach-sa1100/generic.c
+++ b/arch/arm/mach-sa1100/generic.c
@@ -311,7 +311,8 @@ static struct platform_device *sa11x0_devices[] __initdata = {
 
 static int __init sa1100_init(void)
 {
-	pm_power_off = sa1100_power_off;
+	register_power_off_handler_simple(sa1100_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 	return platform_add_devices(sa11x0_devices, ARRAY_SIZE(sa11x0_devices));
 }
 
diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c
index 41e476e..fb85730 100644
--- a/arch/arm/mach-sa1100/simpad.c
+++ b/arch/arm/mach-sa1100/simpad.c
@@ -373,7 +373,8 @@ static int __init simpad_init(void)
 	if (ret)
 		printk(KERN_WARNING "simpad: Unable to register cs3 GPIO device");
 
-	pm_power_off = simpad_power_off;
+	register_power_off_handler_simple(simpad_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	sa11x0_ppc_configure_mcp();
 	sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources,
diff --git a/arch/arm/mach-u300/regulator.c b/arch/arm/mach-u300/regulator.c
index 0493a84..4ff09b0 100644
--- a/arch/arm/mach-u300/regulator.c
+++ b/arch/arm/mach-u300/regulator.c
@@ -98,7 +98,8 @@ static int __init __u300_init_boardpower(struct platform_device *pdev)
 			   U300_SYSCON_PMCR_DCON_ENABLE, 0);
 
 	/* Register globally exported PM poweroff hook */
-	pm_power_off = u300_pm_poweroff;
+	register_power_off_handler_simple(u300_pm_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	return 0;
 }
diff --git a/arch/arm/mach-vt8500/vt8500.c b/arch/arm/mach-vt8500/vt8500.c
index 3bc0dc9..48e4fbf 100644
--- a/arch/arm/mach-vt8500/vt8500.c
+++ b/arch/arm/mach-vt8500/vt8500.c
@@ -155,7 +155,8 @@ static void __init vt8500_init(void)
 			pr_err("%s:ioremap(power_off) failed\n", __func__);
 	}
 	if (pmc_base)
-		pm_power_off = &vt8500_power_off;
+		register_power_off_handler_simple(vt8500_power_off,
+						  POWER_OFF_PRIORITY_FALLBACK);
 	else
 		pr_err("%s: PMC Hibernation register could not be remapped, not enabling power off!\n", __func__);
 
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
index 0e15f01..1c8bce0 100644
--- a/arch/arm/xen/enlighten.c
+++ b/arch/arm/xen/enlighten.c
@@ -336,7 +336,8 @@ static int __init xen_pm_init(void)
 	if (!xen_domain())
 		return -ENODEV;
 
-	pm_power_off = xen_power_off;
+	register_power_off_handler_simple(xen_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 	arm_pm_restart = xen_restart;
 
 	return 0;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 36/47] arm64: psci: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (33 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 35/47] arm: Register " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 37/47] avr32: atngw100: " Guenter Roeck
                   ` (11 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Catalin Marinas, Will Deacon,
	linux-arm-kernel

Register with kernel power-off handler instead of setting pm_power_off
directly.

Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Tested-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 arch/arm64/kernel/psci.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 866c1c8..5cab066 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -359,7 +359,8 @@ static int __init psci_0_2_init(struct device_node *np)
 
 	arm_pm_restart = psci_sys_reset;
 
-	pm_power_off = psci_sys_poweroff;
+	register_power_off_handler_simple(psci_sys_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 out_put_node:
 	of_node_put(np);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 37/47] avr32: atngw100: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (34 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 36/47] arm64: psci: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 38/47] ia64: " Guenter Roeck
                   ` (10 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Haavard Skinnemoen,
	Hans-Christian Egtvedt

Register with kernel power-off handler instead of setting pm_power_off
directly.

Cc: Haavard Skinnemoen <hskinnemoen@gmail.com>
Cc: Hans-Christian Egtvedt <egtvedt@samfundet.no>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 arch/avr32/boards/atngw100/mrmt.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/avr32/boards/atngw100/mrmt.c b/arch/avr32/boards/atngw100/mrmt.c
index 91146b4..166c2e1 100644
--- a/arch/avr32/boards/atngw100/mrmt.c
+++ b/arch/avr32/boards/atngw100/mrmt.c
@@ -274,7 +274,8 @@ static int __init mrmt1_init(void)
 {
 	gpio_set_value( PIN_PWR_ON, 1 );	/* Ensure PWR_ON is enabled */
 
-	pm_power_off = mrmt_power_off;
+	register_power_off_handler_simple(mrmt_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	/* Setup USARTS (other than console) */
 	at32_map_usart(2, 1, 0);	/* USART 2: /dev/ttyS1, RMT1:DB9M */
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 38/47] ia64: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (35 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 37/47] avr32: atngw100: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 39/47] m68k: " Guenter Roeck
                   ` (9 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, Tony Luck, Fenghua Yu, linux-ia64

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the call is expected
to be replaced at some point in the future.

Cc: Tony Luck <tony.luck@intel.com>
Cc: Fenghua Yu <fenghua.yu@intel.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 arch/ia64/sn/kernel/setup.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c
index 5f6b6b4..fc9905e 100644
--- a/arch/ia64/sn/kernel/setup.c
+++ b/arch/ia64/sn/kernel/setup.c
@@ -488,12 +488,13 @@ void __init sn_setup(char **cmdline_p)
 	sn_timer_init();
 
 	/*
-	 * set pm_power_off to a SAL call to allow
+	 * set power-off handler to a SAL call to allow
 	 * sn machines to power off. The SAL call can be replaced
 	 * by an ACPI interface call when ACPI is fully implemented
 	 * for sn.
 	 */
-	pm_power_off = ia64_sn_power_down;
+	register_power_off_handler_simple(ia64_sn_power_down,
+					  POWER_OFF_PRIORITY_LOW);
 	current->thread.flags |= IA64_THREAD_MIGRATION;
 }
 
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 39/47] m68k: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (36 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 38/47] ia64: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 40/47] mips: " Guenter Roeck
                   ` (8 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Geert Uytterhoeven, Joshua Thompson,
	linux-m68k

Register with kernel power-off handler instead of setting pm_power_off
directly.

Cc: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Joshua Thompson <funaho@jurai.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use defines to specify poweroff handler priorities

 arch/m68k/emu/natfeat.c | 3 ++-
 arch/m68k/mac/config.c  | 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/m68k/emu/natfeat.c b/arch/m68k/emu/natfeat.c
index 91e2ae7..38fec50 100644
--- a/arch/m68k/emu/natfeat.c
+++ b/arch/m68k/emu/natfeat.c
@@ -91,5 +91,6 @@ void __init nf_init(void)
 	pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16,
 		version & 0xffff);
 
-	pm_power_off = nf_poweroff;
+	register_power_off_handler_simple(nf_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c
index 677913ff..14fd981 100644
--- a/arch/m68k/mac/config.c
+++ b/arch/m68k/mac/config.c
@@ -160,7 +160,8 @@ void __init config_mac(void)
 	mach_set_clock_mmss = mac_set_clock_mmss;
 	mach_reset = mac_reset;
 	mach_halt = mac_poweroff;
-	pm_power_off = mac_poweroff;
+	register_power_off_handler_simple(mac_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 	mach_max_dma_address = 0xffffffff;
 #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
 	mach_beep = mac_mksound;
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 40/47] mips: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (37 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 39/47] m68k: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 41/47] sh: " Guenter Roeck
                   ` (7 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Ralf Baechle, Maciej W. Rozycki,
	linux-mips

Register with kernel power-off handler instead of setting pm_power_off
directly.

If there is an indication that there can be more than one power-off handler,
use register_power_off_handler, otherwise use register_power_off_handler_simple
to register the power-off handler.

If the power-off handler only resets or stops the system, select the fallback
priority to indicate that the power-off handler is one of last resort.
If the power-off handler powers off the system, select the default priority,
unless the power-off handler installation code suggests that there can be
more than one power-off handler and the new handler is only installed
conditionally. In this case, install the handler with low priority.

Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Maciej W. Rozycki <macro@linux-mips.org>
Acked-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use defines to specify poweroff handler priorities

 arch/mips/alchemy/board-gpr.c          |  3 ++-
 arch/mips/alchemy/board-mtx1.c         |  3 ++-
 arch/mips/alchemy/board-xxs1500.c      |  3 ++-
 arch/mips/alchemy/devboards/platform.c | 17 +++++++++++++++--
 arch/mips/ar7/setup.c                  |  3 ++-
 arch/mips/ath79/setup.c                |  3 ++-
 arch/mips/bcm47xx/setup.c              |  3 ++-
 arch/mips/bcm63xx/setup.c              |  3 ++-
 arch/mips/cobalt/setup.c               |  3 ++-
 arch/mips/dec/setup.c                  |  3 ++-
 arch/mips/emma/markeins/setup.c        |  3 ++-
 arch/mips/jz4740/reset.c               |  3 ++-
 arch/mips/lantiq/falcon/reset.c        |  3 ++-
 arch/mips/lantiq/xway/reset.c          |  3 ++-
 arch/mips/lasat/reset.c                |  3 ++-
 arch/mips/loongson/common/reset.c      |  3 ++-
 arch/mips/loongson1/common/reset.c     |  3 ++-
 arch/mips/mti-malta/malta-reset.c      |  3 ++-
 arch/mips/mti-sead3/sead3-reset.c      |  3 ++-
 arch/mips/netlogic/xlp/setup.c         |  3 ++-
 arch/mips/netlogic/xlr/setup.c         |  3 ++-
 arch/mips/pmcs-msp71xx/msp_setup.c     |  3 ++-
 arch/mips/pnx833x/common/setup.c       |  3 ++-
 arch/mips/ralink/reset.c               |  3 ++-
 arch/mips/rb532/setup.c                |  3 ++-
 arch/mips/sgi-ip22/ip22-reset.c        |  3 ++-
 arch/mips/sgi-ip27/ip27-reset.c        |  3 ++-
 arch/mips/sgi-ip32/ip32-reset.c        |  3 ++-
 arch/mips/sibyte/common/cfe.c          |  3 ++-
 arch/mips/sni/setup.c                  |  3 ++-
 arch/mips/txx9/generic/setup.c         |  3 ++-
 arch/mips/vr41xx/common/pmu.c          |  3 ++-
 32 files changed, 77 insertions(+), 33 deletions(-)

diff --git a/arch/mips/alchemy/board-gpr.c b/arch/mips/alchemy/board-gpr.c
index acf9a2a..abfc93a 100644
--- a/arch/mips/alchemy/board-gpr.c
+++ b/arch/mips/alchemy/board-gpr.c
@@ -89,7 +89,8 @@ void __init board_setup(void)
 {
 	printk(KERN_INFO "Trapeze ITS GPR board\n");
 
-	pm_power_off = gpr_power_off;
+	register_power_off_handler_simple(gpr_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 	_machine_halt = gpr_power_off;
 	_machine_restart = gpr_reset;
 
diff --git a/arch/mips/alchemy/board-mtx1.c b/arch/mips/alchemy/board-mtx1.c
index 1e3b102..a78df2c 100644
--- a/arch/mips/alchemy/board-mtx1.c
+++ b/arch/mips/alchemy/board-mtx1.c
@@ -98,7 +98,8 @@ void __init board_setup(void)
 	alchemy_gpio_direction_output(211, 1);	/* green on */
 	alchemy_gpio_direction_output(212, 0);	/* red off */
 
-	pm_power_off = mtx1_power_off;
+	register_power_off_handler_simple(mtx1_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 	_machine_halt = mtx1_power_off;
 	_machine_restart = mtx1_reset;
 
diff --git a/arch/mips/alchemy/board-xxs1500.c b/arch/mips/alchemy/board-xxs1500.c
index 0fc53e0..6c413db 100644
--- a/arch/mips/alchemy/board-xxs1500.c
+++ b/arch/mips/alchemy/board-xxs1500.c
@@ -79,7 +79,8 @@ void __init board_setup(void)
 {
 	u32 pin_func;
 
-	pm_power_off = xxs1500_power_off;
+	register_power_off_handler_simple(xxs1500_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 	_machine_halt = xxs1500_power_off;
 	_machine_restart = xxs1500_reset;
 
diff --git a/arch/mips/alchemy/devboards/platform.c b/arch/mips/alchemy/devboards/platform.c
index be139a0..3ae40b2 100644
--- a/arch/mips/alchemy/devboards/platform.c
+++ b/arch/mips/alchemy/devboards/platform.c
@@ -6,6 +6,7 @@
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/map.h>
 #include <linux/mtd/physmap.h>
+#include <linux/notifier.h>
 #include <linux/slab.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
@@ -64,10 +65,22 @@ static void db1x_reset(char *c)
 	bcsr_write(BCSR_SYSTEM, 0);
 }
 
+static int db1x_power_off_notify(struct notifier_block *this,
+				 unsigned long unused1, void *unused2)
+{
+	db1x_power_off();
+	return NOTIFY_DONE;
+}
+
+static struct notifier_block db1x_power_off_nb = {
+	.notifier_call = db1x_power_off_notify,
+	.priority = POWER_OFF_PRIORITY_LOW,
+};
+
 static int __init db1x_late_setup(void)
 {
-	if (!pm_power_off)
-		pm_power_off = db1x_power_off;
+	if (register_power_off_handler(&db1x_power_off_nb))
+		pr_warn("dbx1: Failed to register power-off handler\n");
 	if (!_machine_halt)
 		_machine_halt = db1x_power_off;
 	if (!_machine_restart)
diff --git a/arch/mips/ar7/setup.c b/arch/mips/ar7/setup.c
index 820b7a3..7093266 100644
--- a/arch/mips/ar7/setup.c
+++ b/arch/mips/ar7/setup.c
@@ -91,7 +91,8 @@ void __init plat_mem_setup(void)
 
 	_machine_restart = ar7_machine_restart;
 	_machine_halt = ar7_machine_halt;
-	pm_power_off = ar7_machine_power_off;
+	register_power_off_handler_simple(ar7_machine_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	io_base = (unsigned long)ioremap(AR7_REGS_BASE, 0x10000);
 	if (!io_base)
diff --git a/arch/mips/ath79/setup.c b/arch/mips/ath79/setup.c
index 64807a4..66fe138 100644
--- a/arch/mips/ath79/setup.c
+++ b/arch/mips/ath79/setup.c
@@ -203,7 +203,8 @@ void __init plat_mem_setup(void)
 
 	_machine_restart = ath79_restart;
 	_machine_halt = ath79_halt;
-	pm_power_off = ath79_halt;
+	register_power_off_handler_simple(ath79_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 }
 
 void __init plat_time_init(void)
diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c
index c00585d..d0a142c 100644
--- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c
@@ -246,7 +246,8 @@ void __init plat_mem_setup(void)
 
 	_machine_restart = bcm47xx_machine_restart;
 	_machine_halt = bcm47xx_machine_halt;
-	pm_power_off = bcm47xx_machine_halt;
+	register_power_off_handler_simple(bcm47xx_machine_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 	bcm47xx_board_detect();
 	mips_set_machine_name(bcm47xx_board_get_name());
 }
diff --git a/arch/mips/bcm63xx/setup.c b/arch/mips/bcm63xx/setup.c
index 6660c7d..5050a19 100644
--- a/arch/mips/bcm63xx/setup.c
+++ b/arch/mips/bcm63xx/setup.c
@@ -149,7 +149,8 @@ void __init plat_mem_setup(void)
 
 	_machine_halt = bcm63xx_machine_halt;
 	_machine_restart = __bcm63xx_machine_reboot;
-	pm_power_off = bcm63xx_machine_halt;
+	register_power_off_handler_simple(bcm63xx_machine_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	set_io_port_base(0);
 	ioport_resource.start = 0;
diff --git a/arch/mips/cobalt/setup.c b/arch/mips/cobalt/setup.c
index 9a8c2fe..527f331 100644
--- a/arch/mips/cobalt/setup.c
+++ b/arch/mips/cobalt/setup.c
@@ -78,7 +78,8 @@ void __init plat_mem_setup(void)
 
 	_machine_restart = cobalt_machine_restart;
 	_machine_halt = cobalt_machine_halt;
-	pm_power_off = cobalt_machine_halt;
+	register_power_off_handler_simple(cobalt_machine_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	set_io_port_base(CKSEG1ADDR(GT_DEF_PCI0_IO_BASE));
 
diff --git a/arch/mips/dec/setup.c b/arch/mips/dec/setup.c
index 41bbffd..b5d3200 100644
--- a/arch/mips/dec/setup.c
+++ b/arch/mips/dec/setup.c
@@ -158,7 +158,8 @@ void __init plat_mem_setup(void)
 
 	_machine_restart = dec_machine_restart;
 	_machine_halt = dec_machine_halt;
-	pm_power_off = dec_machine_power_off;
+	register_power_off_handler_simple(dec_machine_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	ioport_resource.start = ~0UL;
 	ioport_resource.end = 0UL;
diff --git a/arch/mips/emma/markeins/setup.c b/arch/mips/emma/markeins/setup.c
index 9100122..4ea7ffb 100644
--- a/arch/mips/emma/markeins/setup.c
+++ b/arch/mips/emma/markeins/setup.c
@@ -103,7 +103,8 @@ void __init plat_mem_setup(void)
 
 	_machine_restart = markeins_machine_restart;
 	_machine_halt = markeins_machine_halt;
-	pm_power_off = markeins_machine_power_off;
+	register_power_off_handler_simple(markeins_machine_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	/* setup resource limits */
 	ioport_resource.start = EMMA2RH_PCI_IO_BASE;
diff --git a/arch/mips/jz4740/reset.c b/arch/mips/jz4740/reset.c
index b6c6343..157e0e2 100644
--- a/arch/mips/jz4740/reset.c
+++ b/arch/mips/jz4740/reset.c
@@ -114,5 +114,6 @@ void jz4740_reset_init(void)
 {
 	_machine_restart = jz4740_restart;
 	_machine_halt = jz4740_halt;
-	pm_power_off = jz4740_power_off;
+	register_power_off_handler_simple(jz4740_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
diff --git a/arch/mips/lantiq/falcon/reset.c b/arch/mips/lantiq/falcon/reset.c
index 5682482..7b60d36 100644
--- a/arch/mips/lantiq/falcon/reset.c
+++ b/arch/mips/lantiq/falcon/reset.c
@@ -83,7 +83,8 @@ static int __init mips_reboot_setup(void)
 {
 	_machine_restart = machine_restart;
 	_machine_halt = machine_halt;
-	pm_power_off = machine_power_off;
+	register_power_off_handler_simple(machine_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 	return 0;
 }
 
diff --git a/arch/mips/lantiq/xway/reset.c b/arch/mips/lantiq/xway/reset.c
index 1fa0f17..9b37cc1 100644
--- a/arch/mips/lantiq/xway/reset.c
+++ b/arch/mips/lantiq/xway/reset.c
@@ -157,7 +157,8 @@ static int __init mips_reboot_setup(void)
 
 	_machine_restart = ltq_machine_restart;
 	_machine_halt = ltq_machine_halt;
-	pm_power_off = ltq_machine_power_off;
+	register_power_off_handler_simple(ltq_machine_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	return 0;
 }
diff --git a/arch/mips/lasat/reset.c b/arch/mips/lasat/reset.c
index e21f0b9..91dab32 100644
--- a/arch/mips/lasat/reset.c
+++ b/arch/mips/lasat/reset.c
@@ -56,5 +56,6 @@ void lasat_reboot_setup(void)
 {
 	_machine_restart = lasat_machine_restart;
 	_machine_halt = lasat_machine_halt;
-	pm_power_off = lasat_machine_halt;
+	register_power_off_handler_simple(lasat_machine_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 }
diff --git a/arch/mips/loongson/common/reset.c b/arch/mips/loongson/common/reset.c
index a60715e..32b2de8 100644
--- a/arch/mips/loongson/common/reset.c
+++ b/arch/mips/loongson/common/reset.c
@@ -84,7 +84,8 @@ static int __init mips_reboot_setup(void)
 {
 	_machine_restart = loongson_restart;
 	_machine_halt = loongson_halt;
-	pm_power_off = loongson_poweroff;
+	register_power_off_handler_simple(loongson_poweroff,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	return 0;
 }
diff --git a/arch/mips/loongson1/common/reset.c b/arch/mips/loongson1/common/reset.c
index 547f34b..8a3cdd8 100644
--- a/arch/mips/loongson1/common/reset.c
+++ b/arch/mips/loongson1/common/reset.c
@@ -38,7 +38,8 @@ static int __init ls1x_reboot_setup(void)
 {
 	_machine_restart = ls1x_restart;
 	_machine_halt = ls1x_halt;
-	pm_power_off = ls1x_power_off;
+	register_power_off_handler_simple(ls1x_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	return 0;
 }
diff --git a/arch/mips/mti-malta/malta-reset.c b/arch/mips/mti-malta/malta-reset.c
index 2fd2cc2..2e4489f 100644
--- a/arch/mips/mti-malta/malta-reset.c
+++ b/arch/mips/mti-malta/malta-reset.c
@@ -40,7 +40,8 @@ static int __init mips_reboot_setup(void)
 {
 	_machine_restart = mips_machine_restart;
 	_machine_halt = mips_machine_halt;
-	pm_power_off = mips_machine_power_off;
+	register_power_off_handler_simple(mips_machine_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	return 0;
 }
diff --git a/arch/mips/mti-sead3/sead3-reset.c b/arch/mips/mti-sead3/sead3-reset.c
index e6fb244..039aaf6 100644
--- a/arch/mips/mti-sead3/sead3-reset.c
+++ b/arch/mips/mti-sead3/sead3-reset.c
@@ -33,7 +33,8 @@ static int __init mips_reboot_setup(void)
 {
 	_machine_restart = mips_machine_restart;
 	_machine_halt = mips_machine_halt;
-	pm_power_off = mips_machine_halt;
+	register_power_off_handler_simple(mips_machine_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	return 0;
 }
diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c
index 4fdd9fd..68529dd 100644
--- a/arch/mips/netlogic/xlp/setup.c
+++ b/arch/mips/netlogic/xlp/setup.c
@@ -106,7 +106,8 @@ void __init plat_mem_setup(void)
 #endif
 	_machine_restart = (void (*)(char *))nlm_linux_exit;
 	_machine_halt	= nlm_linux_exit;
-	pm_power_off	= nlm_linux_exit;
+	register_power_off_handler_simple(nlm_linux_exit,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	/* memory and bootargs from DT */
 	xlp_early_init_devtree();
diff --git a/arch/mips/netlogic/xlr/setup.c b/arch/mips/netlogic/xlr/setup.c
index d118b9a..898e950 100644
--- a/arch/mips/netlogic/xlr/setup.c
+++ b/arch/mips/netlogic/xlr/setup.c
@@ -75,7 +75,8 @@ void __init plat_mem_setup(void)
 {
 	_machine_restart = (void (*)(char *))nlm_linux_exit;
 	_machine_halt	= nlm_linux_exit;
-	pm_power_off	= nlm_linux_exit;
+	register_power_off_handler_simple(nlm_linux_exit,
+					  POWER_OFF_PRIORITY_FALLBACK);
 }
 
 const char *get_system_type(void)
diff --git a/arch/mips/pmcs-msp71xx/msp_setup.c b/arch/mips/pmcs-msp71xx/msp_setup.c
index 4f925e0..a2b4722 100644
--- a/arch/mips/pmcs-msp71xx/msp_setup.c
+++ b/arch/mips/pmcs-msp71xx/msp_setup.c
@@ -144,7 +144,8 @@ void __init plat_mem_setup(void)
 {
 	_machine_restart = msp_restart;
 	_machine_halt = msp_halt;
-	pm_power_off = msp_power_off;
+	register_power_off_handler_simple(msp_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 }
 
 void __init prom_init(void)
diff --git a/arch/mips/pnx833x/common/setup.c b/arch/mips/pnx833x/common/setup.c
index 99b4d94..55f7a22 100644
--- a/arch/mips/pnx833x/common/setup.c
+++ b/arch/mips/pnx833x/common/setup.c
@@ -51,7 +51,8 @@ int __init plat_mem_setup(void)
 
 	_machine_restart = pnx833x_machine_restart;
 	_machine_halt = pnx833x_machine_halt;
-	pm_power_off = pnx833x_machine_power_off;
+	register_power_off_handler_simple(pnx833x_machine_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	/* IO/MEM resources. */
 	set_io_port_base(KSEG1);
diff --git a/arch/mips/ralink/reset.c b/arch/mips/ralink/reset.c
index 55c7ec5..7b6dfdf3 100644
--- a/arch/mips/ralink/reset.c
+++ b/arch/mips/ralink/reset.c
@@ -98,7 +98,8 @@ static int __init mips_reboot_setup(void)
 {
 	_machine_restart = ralink_restart;
 	_machine_halt = ralink_halt;
-	pm_power_off = ralink_halt;
+	register_power_off_handler_simple(ralink_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	return 0;
 }
diff --git a/arch/mips/rb532/setup.c b/arch/mips/rb532/setup.c
index d0c64e7..1b95326b 100644
--- a/arch/mips/rb532/setup.c
+++ b/arch/mips/rb532/setup.c
@@ -44,7 +44,8 @@ void __init plat_mem_setup(void)
 
 	_machine_restart = rb_machine_restart;
 	_machine_halt = rb_machine_halt;
-	pm_power_off = rb_machine_halt;
+	register_power_off_handler_simple(rb_machine_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	set_io_port_base(KSEG1);
 
diff --git a/arch/mips/sgi-ip22/ip22-reset.c b/arch/mips/sgi-ip22/ip22-reset.c
index 063c2dd..ecd1970 100644
--- a/arch/mips/sgi-ip22/ip22-reset.c
+++ b/arch/mips/sgi-ip22/ip22-reset.c
@@ -188,7 +188,8 @@ static int __init reboot_setup(void)
 
 	_machine_restart = sgi_machine_restart;
 	_machine_halt = sgi_machine_halt;
-	pm_power_off = sgi_machine_power_off;
+	register_power_off_handler_simple(sgi_machine_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	res = request_irq(SGI_PANEL_IRQ, panel_int, 0, "Front Panel", NULL);
 	if (res) {
diff --git a/arch/mips/sgi-ip27/ip27-reset.c b/arch/mips/sgi-ip27/ip27-reset.c
index ac37e54..e695975 100644
--- a/arch/mips/sgi-ip27/ip27-reset.c
+++ b/arch/mips/sgi-ip27/ip27-reset.c
@@ -76,5 +76,6 @@ void ip27_reboot_setup(void)
 {
 	_machine_restart = ip27_machine_restart;
 	_machine_halt = ip27_machine_halt;
-	pm_power_off = ip27_machine_power_off;
+	register_power_off_handler_simple(ip27_machine_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 }
diff --git a/arch/mips/sgi-ip32/ip32-reset.c b/arch/mips/sgi-ip32/ip32-reset.c
index 1f823da..e3522fd 100644
--- a/arch/mips/sgi-ip32/ip32-reset.c
+++ b/arch/mips/sgi-ip32/ip32-reset.c
@@ -189,7 +189,8 @@ static __init int ip32_reboot_setup(void)
 
 	_machine_restart = ip32_machine_restart;
 	_machine_halt = ip32_machine_halt;
-	pm_power_off = ip32_machine_power_off;
+	register_power_off_handler_simple(ip32_machine_power_off,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	init_timer(&blink_timer);
 	blink_timer.function = blink_timeout;
diff --git a/arch/mips/sibyte/common/cfe.c b/arch/mips/sibyte/common/cfe.c
index 588e180..bf47de7 100644
--- a/arch/mips/sibyte/common/cfe.c
+++ b/arch/mips/sibyte/common/cfe.c
@@ -245,7 +245,8 @@ void __init prom_init(void)
 
 	_machine_restart   = cfe_linux_restart;
 	_machine_halt	   = cfe_linux_halt;
-	pm_power_off = cfe_linux_halt;
+	register_power_off_handler_simple(cfe_linux_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	/*
 	 * Check if a loader was used; if NOT, the 4 arguments are
diff --git a/arch/mips/sni/setup.c b/arch/mips/sni/setup.c
index efad85c..d278f0f 100644
--- a/arch/mips/sni/setup.c
+++ b/arch/mips/sni/setup.c
@@ -225,7 +225,8 @@ void __init plat_mem_setup(void)
 	}
 
 	_machine_restart = sni_machine_restart;
-	pm_power_off = sni_machine_power_off;
+	register_power_off_handler_simple(sni_machine_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	sni_display_setup();
 	sni_console_setup();
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c
index 2791b86..cb48e06 100644
--- a/arch/mips/txx9/generic/setup.c
+++ b/arch/mips/txx9/generic/setup.c
@@ -555,7 +555,8 @@ void __init plat_mem_setup(void)
 	/* fallback restart/halt routines */
 	_machine_restart = (void (*)(char *))txx9_machine_halt;
 	_machine_halt = txx9_machine_halt;
-	pm_power_off = txx9_machine_halt;
+	register_power_off_handler_simple(txx9_machine_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 #ifdef CONFIG_PCI
 	pcibios_plat_setup = txx9_pcibios_setup;
diff --git a/arch/mips/vr41xx/common/pmu.c b/arch/mips/vr41xx/common/pmu.c
index d7f7558..cd9a20d 100644
--- a/arch/mips/vr41xx/common/pmu.c
+++ b/arch/mips/vr41xx/common/pmu.c
@@ -127,7 +127,8 @@ static int __init vr41xx_pmu_init(void)
 	cpu_wait = vr41xx_cpu_wait;
 	_machine_restart = vr41xx_restart;
 	_machine_halt = vr41xx_halt;
-	pm_power_off = vr41xx_halt;
+	register_power_off_handler_simple(vr41xx_halt,
+					  POWER_OFF_PRIORITY_FALLBACK);
 
 	return 0;
 }
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 41/47] sh: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (38 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 40/47] mips: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 42/47] x86: lguest: " Guenter Roeck
                   ` (6 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-pm, Guenter Roeck, linux-sh

Register with kernel power-off handler instead of setting pm_power_off
directly.

Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use defines to specify poweroff handler priorities

 arch/sh/boards/board-sh7785lcr.c       | 3 ++-
 arch/sh/boards/board-urquell.c         | 3 ++-
 arch/sh/boards/mach-highlander/setup.c | 3 ++-
 arch/sh/boards/mach-landisk/setup.c    | 3 ++-
 arch/sh/boards/mach-r2d/setup.c        | 3 ++-
 arch/sh/boards/mach-sdk7786/setup.c    | 3 ++-
 6 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/arch/sh/boards/board-sh7785lcr.c b/arch/sh/boards/board-sh7785lcr.c
index 2c4771e..f7d2ffb 100644
--- a/arch/sh/boards/board-sh7785lcr.c
+++ b/arch/sh/boards/board-sh7785lcr.c
@@ -332,7 +332,8 @@ static void __init sh7785lcr_setup(char **cmdline_p)
 
 	printk(KERN_INFO "Renesas Technology Corp. R0P7785LC0011RL support.\n");
 
-	pm_power_off = sh7785lcr_power_off;
+	register_power_off_handler_simple(sh7785lcr_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	/* sm501 DRAM configuration */
 	sm501_reg = ioremap_nocache(SM107_REG_ADDR, SM501_DRAM_CONTROL);
diff --git a/arch/sh/boards/board-urquell.c b/arch/sh/boards/board-urquell.c
index b52abcc..8f44256 100644
--- a/arch/sh/boards/board-urquell.c
+++ b/arch/sh/boards/board-urquell.c
@@ -204,7 +204,8 @@ static void __init urquell_setup(char **cmdline_p)
 {
 	printk(KERN_INFO "Renesas Technology Corp. Urquell support.\n");
 
-	pm_power_off = urquell_power_off;
+	register_power_off_handler_simple(urquell_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	register_smp_ops(&shx3_smp_ops);
 }
diff --git a/arch/sh/boards/mach-highlander/setup.c b/arch/sh/boards/mach-highlander/setup.c
index 4a52590..fc9110a 100644
--- a/arch/sh/boards/mach-highlander/setup.c
+++ b/arch/sh/boards/mach-highlander/setup.c
@@ -385,7 +385,8 @@ static void __init highlander_setup(char **cmdline_p)
 
 	__raw_writew(__raw_readw(PA_IVDRCTL) | 0x01, PA_IVDRCTL);	/* Si13112 */
 
-	pm_power_off = r7780rp_power_off;
+	register_power_off_handler_simple(r7780rp_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 static unsigned char irl2irq[HL_NR_IRL];
diff --git a/arch/sh/boards/mach-landisk/setup.c b/arch/sh/boards/mach-landisk/setup.c
index f1147ca..56adabc 100644
--- a/arch/sh/boards/mach-landisk/setup.c
+++ b/arch/sh/boards/mach-landisk/setup.c
@@ -89,7 +89,8 @@ static void __init landisk_setup(char **cmdline_p)
 	__raw_writeb(__raw_readb(PA_LED) | 0x03, PA_LED);
 
 	printk(KERN_INFO "I-O DATA DEVICE, INC. \"LANDISK Series\" support.\n");
-	pm_power_off = landisk_power_off;
+	register_power_off_handler_simple(landisk_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
 
 /*
diff --git a/arch/sh/boards/mach-r2d/setup.c b/arch/sh/boards/mach-r2d/setup.c
index 4b98a52..4a23bce 100644
--- a/arch/sh/boards/mach-r2d/setup.c
+++ b/arch/sh/boards/mach-r2d/setup.c
@@ -279,7 +279,8 @@ static void __init rts7751r2d_setup(char **cmdline_p)
 					(ver >> 4) & 0xf, ver & 0xf);
 
 	__raw_writew(0x0000, PA_OUTPORT);
-	pm_power_off = rts7751r2d_power_off;
+	register_power_off_handler_simple(rts7751r2d_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	/* sm501 dram configuration:
 	 * ColSizeX = 11 - External Memory Column Size: 256 words.
diff --git a/arch/sh/boards/mach-sdk7786/setup.c b/arch/sh/boards/mach-sdk7786/setup.c
index c29268b..2d77760 100644
--- a/arch/sh/boards/mach-sdk7786/setup.c
+++ b/arch/sh/boards/mach-sdk7786/setup.c
@@ -252,7 +252,8 @@ static void __init sdk7786_setup(char **cmdline_p)
 	pr_info("\tPCB revision:\t%d\n", fpga_read_reg(PCBRR) & 0xf);
 
 	machine_ops.restart = sdk7786_restart;
-	pm_power_off = sdk7786_power_off;
+	register_power_off_handler_simple(sdk7786_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 
 	register_smp_ops(&shx3_smp_ops);
 }
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 42/47] x86: lguest: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (39 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 41/47] sh: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 43/47] x86: ce4100: " Guenter Roeck
                   ` (5 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Rusty Russell, Thomas Gleixner,
	Ingo Molnar, H. Peter Anvin, lguest, x86

Register with kernel power-off handler instead of setting pm_power_off
directly.

Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 arch/x86/lguest/boot.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
index aae9413..9dff406 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
@@ -1441,7 +1441,8 @@ __init void lguest_init(void)
 	 * the Guest routine to power off, and the reboot hook to our restart
 	 * routine.
 	 */
-	pm_power_off = lguest_power_off;
+	register_power_off_handler_simple(lguest_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 	machine_ops.restart = lguest_restart;
 
 	/*
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 43/47] x86: ce4100: Register with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (40 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 42/47] x86: lguest: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 44/47] x86: intel-mid: Drop registration of dummy power-off handlers Guenter Roeck
                   ` (4 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, x86

Register with kernel power-off handler instead of setting pm_power_off
directly.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 arch/x86/platform/ce4100/ce4100.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/x86/platform/ce4100/ce4100.c b/arch/x86/platform/ce4100/ce4100.c
index 701fd58..1816bc1 100644
--- a/arch/x86/platform/ce4100/ce4100.c
+++ b/arch/x86/platform/ce4100/ce4100.c
@@ -164,5 +164,6 @@ void __init x86_ce4100_early_setup(void)
 	 */
 	reboot_type = BOOT_KBD;
 
-	pm_power_off = ce4100_power_off;
+	register_power_off_handler_simple(ce4100_power_off,
+					  POWER_OFF_PRIORITY_DEFAULT);
 }
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 44/47] x86: intel-mid: Drop registration of dummy power-off handlers
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (41 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 43/47] x86: ce4100: " Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 45/47] x86: pmc_atom: Register power-off handler with kernel power-off handler Guenter Roeck
                   ` (3 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, x86

A dummy power-off handler does not serve any purpose. Drop it.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 arch/x86/platform/intel-mid/intel-mid.c | 5 -----
 arch/x86/platform/intel-mid/mfld.c      | 5 -----
 2 files changed, 10 deletions(-)

diff --git a/arch/x86/platform/intel-mid/intel-mid.c b/arch/x86/platform/intel-mid/intel-mid.c
index 1bbedc4..4b70666 100644
--- a/arch/x86/platform/intel-mid/intel-mid.c
+++ b/arch/x86/platform/intel-mid/intel-mid.c
@@ -67,10 +67,6 @@ static void *(*get_intel_mid_ops[])(void) = INTEL_MID_OPS_INIT;
 enum intel_mid_cpu_type __intel_mid_cpu_chip;
 EXPORT_SYMBOL_GPL(__intel_mid_cpu_chip);
 
-static void intel_mid_power_off(void)
-{
-};
-
 static void intel_mid_reboot(void)
 {
 	intel_scu_ipc_simple_command(IPCMSG_COLD_BOOT, 0);
@@ -183,7 +179,6 @@ void __init x86_intel_mid_early_setup(void)
 
 	legacy_pic = &null_legacy_pic;
 
-	pm_power_off = intel_mid_power_off;
 	machine_ops.emergency_restart  = intel_mid_reboot;
 
 	/* Avoid searching for BIOS MP tables */
diff --git a/arch/x86/platform/intel-mid/mfld.c b/arch/x86/platform/intel-mid/mfld.c
index 23381d2..cf6842f 100644
--- a/arch/x86/platform/intel-mid/mfld.c
+++ b/arch/x86/platform/intel-mid/mfld.c
@@ -23,10 +23,6 @@ static struct intel_mid_ops penwell_ops = {
 	.arch_setup = penwell_arch_setup,
 };
 
-static void mfld_power_off(void)
-{
-}
-
 static unsigned long __init mfld_calibrate_tsc(void)
 {
 	unsigned long fast_calibrate;
@@ -61,7 +57,6 @@ static unsigned long __init mfld_calibrate_tsc(void)
 static void __init penwell_arch_setup(void)
 {
 	x86_platform.calibrate_tsc = mfld_calibrate_tsc;
-	pm_power_off = mfld_power_off;
 }
 
 void *get_penwell_ops(void)
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 45/47] x86: pmc_atom: Register power-off handler with kernel power-off handler
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (42 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 44/47] x86: intel-mid: Drop registration of dummy power-off handlers Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-27 15:55 ` [PATCH v3 47/47] kernel: Remove pm_power_off Guenter Roeck
                   ` (2 subsequent siblings)
  46 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Thomas Gleixner, Ingo Molnar,
	H. Peter Anvin, x86

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority to reflect that the original code
only sets pm_power_off if it was not already set.

Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority
- Use dev_warn instead of dev_err

 arch/x86/kernel/pmc_atom.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/pmc_atom.c b/arch/x86/kernel/pmc_atom.c
index 0ee5025e..973cd5b 100644
--- a/arch/x86/kernel/pmc_atom.c
+++ b/arch/x86/kernel/pmc_atom.c
@@ -20,6 +20,8 @@
 #include <linux/pci.h>
 #include <linux/device.h>
 #include <linux/debugfs.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/seq_file.h>
 #include <linux/io.h>
 
@@ -92,7 +94,8 @@ static inline void pmc_reg_write(struct pmc_dev *pmc, int reg_offset, u32 val)
 	writel(val, pmc->regmap + reg_offset);
 }
 
-static void pmc_power_off(void)
+static int pmc_power_off(struct notifier_block *this, unsigned long unused1,
+			 void *unused2)
 {
 	u16	pm1_cnt_port;
 	u32	pm1_cnt_value;
@@ -107,8 +110,15 @@ static void pmc_power_off(void)
 	pm1_cnt_value |= SLEEP_ENABLE;
 
 	outl(pm1_cnt_value, pm1_cnt_port);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block pmc_power_off_nb = {
+	.notifier_call = pmc_power_off,
+	.priority = POWER_OFF_PRIORITY_LOW,
+};
+
 static void pmc_hw_reg_setup(struct pmc_dev *pmc)
 {
 	/*
@@ -252,8 +262,12 @@ static int pmc_setup_dev(struct pci_dev *pdev)
 	acpi_base_addr &= ACPI_BASE_ADDR_MASK;
 
 	/* Install power off function */
-	if (acpi_base_addr != 0 && pm_power_off == NULL)
-		pm_power_off = pmc_power_off;
+	if (acpi_base_addr != 0) {
+		ret = register_power_off_handler(&pmc_power_off_nb);
+		if (ret)
+			dev_warn(&pdev->dev,
+				 "Failed to install power-off handler\n");
+	}
 
 	pci_read_config_dword(pdev, PMC_BASE_ADDR_OFFSET, &pmc->base_addr);
 	pmc->base_addr &= PMC_BASE_ADDR_MASK;
-- 
1.9.1


^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 46/47] efi: Register power-off handler with kernel power-off handler
       [not found] ` <1414425354-10359-1-git-send-email-linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
  2014-10-27 15:55   ` [PATCH v3 05/47] mfd: as3722: Drop reference to pm_power_off from devicetree bindings Guenter Roeck
  2014-10-27 15:55   ` [PATCH v3 07/47] qnap-poweroff: " Guenter Roeck
@ 2014-10-27 15:55   ` Guenter Roeck
  2 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel-u79uwXL29TY76Z2rM5mHXA
  Cc: linux-pm-u79uwXL29TY76Z2rM5mHXA, Guenter Roeck, Matt Fleming,
	linux-efi-u79uwXL29TY76Z2rM5mHXA

Register with kernel power-off handler instead of setting pm_power_off
directly. Register with low priority since the efi code states that
this is a power-off handler of last resort.

Cc: Matt Fleming <matt.fleming-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Acked-by: Matt Fleming <matt.fleming-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Acked-by: Mark Salter <msalter-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Signed-off-by: Guenter Roeck <linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
- Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
v2:
- Use define to specify poweroff handler priority

 drivers/firmware/efi/reboot.c | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/drivers/firmware/efi/reboot.c b/drivers/firmware/efi/reboot.c
index 9c59d1c..df0ceb9 100644
--- a/drivers/firmware/efi/reboot.c
+++ b/drivers/firmware/efi/reboot.c
@@ -3,6 +3,8 @@
  * Copyright (c) 2014 Red Hat, Inc., Mark Salter <msalter-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
  */
 #include <linux/efi.h>
+#include <linux/notifier.h>
+#include <linux/pm.h>
 #include <linux/reboot.h>
 
 int efi_reboot_quirk_mode = -1;
@@ -38,19 +40,32 @@ bool __weak efi_poweroff_required(void)
 	return false;
 }
 
-static void efi_power_off(void)
+static int efi_power_off(struct notifier_block *this,
+			 unsigned long unused1, void *unused2)
 {
 	efi.reset_system(EFI_RESET_SHUTDOWN, EFI_SUCCESS, 0, NULL);
+
+	return NOTIFY_DONE;
 }
 
+static struct notifier_block efi_power_off_nb = {
+	.notifier_call = efi_power_off,
+	.priority = POWER_OFF_PRIORITY_LOW,
+};
+
 static int __init efi_shutdown_init(void)
 {
+	int ret = 0;
+
 	if (!efi_enabled(EFI_RUNTIME_SERVICES))
 		return -ENODEV;
 
-	if (efi_poweroff_required())
-		pm_power_off = efi_power_off;
+	if (efi_poweroff_required()) {
+		ret = register_power_off_handler(&efi_power_off_nb);
+		if (ret)
+			pr_err("efi: Failed to register power-off handler\n");
+	}
 
-	return 0;
+	return ret;
 }
 late_initcall(efi_shutdown_init);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* [PATCH v3 47/47] kernel: Remove pm_power_off
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (43 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 45/47] x86: pmc_atom: Register power-off handler with kernel power-off handler Guenter Roeck
@ 2014-10-27 15:55 ` Guenter Roeck
  2014-10-28 17:50   ` Pavel Machek
  2014-10-27 16:03 ` [PATCH v3 00/47] kernel: Add support for power-off handler call chain Felipe Balbi
  2014-11-03 17:59 ` Felipe Balbi
  46 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 15:55 UTC (permalink / raw)
  To: linux-kernel
  Cc: linux-pm, Guenter Roeck, Rafael J. Wysocki, Pavel Machek,
	Len Brown

No users of pm_power_off are left, so it is safe to remove the function.

Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Len Brown <len.brown@intel.com>
Acked-by: Rafael J. Wysocki <rjw@rjwysocki.net>
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
---
v3:
- Replace poweroff in all newly introduced variables and in text
  with power_off or power-off as appropriate
v2:
- poweroff -> power_off for API functions

 include/linux/pm.h               |  1 -
 kernel/power/power_off_handler.c | 10 +---------
 2 files changed, 1 insertion(+), 10 deletions(-)

diff --git a/include/linux/pm.h b/include/linux/pm.h
index 49b3420..4d92122 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -31,7 +31,6 @@
 /*
  * Callbacks for platform drivers to implement.
  */
-extern void (*pm_power_off)(void);
 extern void (*pm_power_off_prepare)(void);
 
 /*
diff --git a/kernel/power/power_off_handler.c b/kernel/power/power_off_handler.c
index 97b7163..8d01e77 100644
--- a/kernel/power/power_off_handler.c
+++ b/kernel/power/power_off_handler.c
@@ -22,12 +22,6 @@
 #include <linux/types.h>
 
 /*
- * If set, calling this function will power off the system immediately.
- */
-void (*pm_power_off)(void);
-EXPORT_SYMBOL(pm_power_off);
-
-/*
  *	Notifier list for kernel code which wants to be called
  *	to power off the system.
  */
@@ -259,8 +253,6 @@ void do_kernel_power_off(void)
 	 * removed while the call chain is traversed, but we'll have to carry
 	 * that risk.
 	 */
-	if (pm_power_off)
-		pm_power_off();
 	raw_notifier_call_chain(&power_off_handler_list, 0, NULL);
 }
 
@@ -271,6 +263,6 @@ void do_kernel_power_off(void)
  */
 bool have_kernel_power_off(void)
 {
-	return pm_power_off != NULL || power_off_handler_list.head != NULL;
+	return power_off_handler_list.head != NULL;
 }
 EXPORT_SYMBOL(have_kernel_power_off);
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 00/47] kernel: Add support for power-off handler call chain
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (44 preceding siblings ...)
  2014-10-27 15:55 ` [PATCH v3 47/47] kernel: Remove pm_power_off Guenter Roeck
@ 2014-10-27 16:03 ` Felipe Balbi
  2014-10-27 17:16   ` Guenter Roeck
  2014-11-03 17:59 ` Felipe Balbi
  46 siblings, 1 reply; 88+ messages in thread
From: Felipe Balbi @ 2014-10-27 16:03 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-kernel, linux-pm, Alan Cox, Alexander Graf, Andrew Morton,
	Geert Uytterhoeven, Heiko Stuebner, Lee Jones, Len Brown,
	Pavel Machek, Rafael J. Wysocki, Romain Perier, Johan Hovold

[-- Attachment #1: Type: text/plain, Size: 6861 bytes --]

Adding Johan, who's working on RTC power off for AM335x devices

On Mon, Oct 27, 2014 at 08:55:07AM -0700, Guenter Roeck wrote:
> Various drivers implement architecture and/or device specific means to
> remove power from the system.  For the most part, those drivers set the
> global variable pm_power_off to point to a function within the driver.
> 
> This mechanism has a number of drawbacks.  Typically only one means
> to remove power is supported (at least if pm_power_off is used).
> At least in theory there can be multiple means to remove power, some of
> which may be less desirable.  For example, one mechanism might power off the
> entire system through an I/O port or gpio pin, while another might power off
> a board by disabling its power controller. Other mechanisms may really just
> execute a restart sequence or drop into the ROM monitor, or put the CPU into
> sleep mode.  Using pm_power_off can also be racy if the function pointer is
> set from a driver built as module, as the driver may be in the process of
> being unloaded when pm_power_off is called.  If there are multiple power-off
> handlers in the system, removing a module with such a handler may
> inadvertently reset the pointer to pm_power_off to NULL, leaving the system
> with no means to remove power.
> 
> Introduce a system power-off handler call chain to solve the described
> problems.  This call chain is expected to be executed from the architecture
> specific machine_power_off() function.  Drivers providing system power-off
> functionality are expected to register with this call chain.  By using the
> priority field in the notifier block, callers can control power-off handler
> execution sequence and thus ensure that the power-off handler with the
> optimal capabilities to remove power for a given system is called first.
> A call chain instead of a single call to the highest priority handler is
> used to provide fallback: If multiple power-off handlers are installed,
> all handlers will be called until one actually succeeds to power off the
> system.
> 
> Patch 01/47 implements the power-off handler API.
> 
> Patches 02/47 to 04/47 are cleanup patches to prepare for the move of
> pm_power_off to a common location.
> 
> Patches 05/47 to 07/47 remove references to pm_power_off from devicetree
> bindings descriptions.
> 
> Patch 08/47 moves the pm_power_off variable from architecture code to
> kernel/reboot.c. 
> 
> Patches 09/47 to 34/47 convert various drivers to register with the kernel
> power-off handler instead of setting pm_power_off directly.
> 
> Patches 35/47 to 46/47 do the same for architecture code.
> 
> Patch 47/47 finally removes pm_power_off.
> 
> For the most part, the individual patches include explanations why specific
> priorities were chosen, at least if the selected priority is not the default
> priority. Subsystem and architecture maintainers are encouraged to have a look
> at the selected priorities and suggest improvements.
> 
> I ran the final code through my normal build and qemu tests. Results are
> available at http://server.roeck-us.net:8010/builders in the 'poweroff-handler'
> column. I also built all available configurations for arm, mips, powerpc,
> m68k, and sh architectures.
> 
> The series is available in branch poweroff-handler of my repository at
> git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git.
> It is based on 3.18-rc2.
> 
> A note on Cc: In the initial submission I had way too many Cc:, causing the
> patchset to be treated as spam by many mailers and mailing list handlers,
> which of course defeated the purpose. This time around I am cutting down
> the distribution list down significantly. My apologies to anyone I may have
> failed to copy this time around.
> 
> Important changes since v2:
> - Rebased series to v3.18-rc2.
> - Do not hold any locks while executing the power-off call chain.
>   This ensures that power-off handlers are executed in the state
>   selected by the machine_power_off function for a given architecture,
>   ie without changing the current semantics of power-off callbacks and
>   machine_power_off functions.
>   Power-off handler registration and de-registration is handled in atomic
>   context with interrupts disabled to ensure that those functions are not
>   interrupted by code which powers off the system.
> - Use [xxx_]power_off[_xxx] instead of [xxx_]poweroff[_xxx] for newly
>   introduced function and variable names.
> - Use power-off instead of poweroff in descriptive text and comments.
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> - Use ACPI: instead of acpi: for messages in acpi code.
> 
> Important changes since v1:
> - Rebased series to v3.18-rc1.
> - Use raw notifier with spinlock protection instead of atomic notifiers,
>   since some power-off handlers need to have interrupts enabled.
> - Renamed API functions from _poweroff to _power_off.
> - Added various Acks.
> - Build tested all configurations for arm, powerpc, and mips architectures.
> - Fixed two compile errors in mips patch.
> - Replaced dev_err and pr_err with dev_warn and pr_warn if an error is not
>   fatal.
> - Provide managed resources API and use where appropriate.
> - Provide and use definitions for standard priorities.
> - Added patches to convert newly introduced power-off handlers.
> - Various minor changes.
> 
> Important changes since RFC:
> - Move API to new file kernel/power/power_off_handler.c.
> - Move pm_power_off pointer to kernel/power/power_off_handler.c. Call
>   pm_power_off from do_kernel_power_off, and only call do_kernel_power_off
>   from architecture code instead of calling both pm_power_off and
>   do_kernel_power_off.
> - Provide additional API function register_power_off_handler_simple
>   to simplify conversion of architecture code.
> - Provide additional API function have_kernel_power_off to check if
>   a power-off handler was installed.
> - Convert all drivers and architecture code to use the new API.
> - Remove pm_power_off as last patch of the series.
> 
> Cc: Alan Cox <gnomes@lxorguk.ukuu.org.uk>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Geert Uytterhoeven <geert@linux-m68k.org>
> cc: Heiko Stuebner <heiko@sntech.de>
> Cc: Lee Jones <lee.jones@linaro.org>
> Cc: Len Brown <len.brown@intel.com>
> Cc: Pavel Machek <pavel@ucw.cz>
> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> Cc: Romain Perier <romain.perier@gmail.com>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 00/47] kernel: Add support for power-off handler call chain
  2014-10-27 16:03 ` [PATCH v3 00/47] kernel: Add support for power-off handler call chain Felipe Balbi
@ 2014-10-27 17:16   ` Guenter Roeck
  2014-10-27 17:33     ` Felipe Balbi
  0 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-27 17:16 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: linux-kernel, linux-pm, Alan Cox, Alexander Graf, Andrew Morton,
	Geert Uytterhoeven, Heiko Stuebner, Lee Jones, Len Brown,
	Pavel Machek, Rafael J. Wysocki, Romain Perier, Johan Hovold

On Mon, Oct 27, 2014 at 11:03:24AM -0500, Felipe Balbi wrote:
> Adding Johan, who's working on RTC power off for AM335x devices
> 
Hi Felipe,

is that the rtc-omap driver ?

I am tracking linux-next for related changes. As new power-off handlers are
introduced, I prepare patches for those as well. I currently have patches for
the following two drivers in the queue:
	drivers/regulator/act8865-regulator.c
	drivers/rtc/rtc-omap.c

I plan to send review requests for those patches in a week or so (I think
there is still some change pending to the power-off function in the rtc-omap
driver, and I want to wait for it).

My current plan is to send a pull request for the series directly to Linus
when the next commit window opens; this is what a number of maintainers
suggested I should do. This pull request would exclude the last patch,
so pm_power_off would still be there. Next steps would then be to submit
another set of patches to update the newly introduced power-off handlers
and then to finally remove pm_power_off; this would probably happen after
the commit window closes.

At least that is the plan unless someone has a better idea ....

There may be some variants; for example, it might make sense to create an
immutable branch with the key patches (1-3 and 8) to enable others to use
the new functions immediately. That would require Acks from affected
maintainers for patch 1, though, so I can not do that yet.

Thanks,
Guenter

> On Mon, Oct 27, 2014 at 08:55:07AM -0700, Guenter Roeck wrote:
> > Various drivers implement architecture and/or device specific means to
> > remove power from the system.  For the most part, those drivers set the
> > global variable pm_power_off to point to a function within the driver.
> > 
> > This mechanism has a number of drawbacks.  Typically only one means
> > to remove power is supported (at least if pm_power_off is used).
> > At least in theory there can be multiple means to remove power, some of
> > which may be less desirable.  For example, one mechanism might power off the
> > entire system through an I/O port or gpio pin, while another might power off
> > a board by disabling its power controller. Other mechanisms may really just
> > execute a restart sequence or drop into the ROM monitor, or put the CPU into
> > sleep mode.  Using pm_power_off can also be racy if the function pointer is
> > set from a driver built as module, as the driver may be in the process of
> > being unloaded when pm_power_off is called.  If there are multiple power-off
> > handlers in the system, removing a module with such a handler may
> > inadvertently reset the pointer to pm_power_off to NULL, leaving the system
> > with no means to remove power.
> > 
> > Introduce a system power-off handler call chain to solve the described
> > problems.  This call chain is expected to be executed from the architecture
> > specific machine_power_off() function.  Drivers providing system power-off
> > functionality are expected to register with this call chain.  By using the
> > priority field in the notifier block, callers can control power-off handler
> > execution sequence and thus ensure that the power-off handler with the
> > optimal capabilities to remove power for a given system is called first.
> > A call chain instead of a single call to the highest priority handler is
> > used to provide fallback: If multiple power-off handlers are installed,
> > all handlers will be called until one actually succeeds to power off the
> > system.
> > 
> > Patch 01/47 implements the power-off handler API.
> > 
> > Patches 02/47 to 04/47 are cleanup patches to prepare for the move of
> > pm_power_off to a common location.
> > 
> > Patches 05/47 to 07/47 remove references to pm_power_off from devicetree
> > bindings descriptions.
> > 
> > Patch 08/47 moves the pm_power_off variable from architecture code to
> > kernel/reboot.c. 
> > 
> > Patches 09/47 to 34/47 convert various drivers to register with the kernel
> > power-off handler instead of setting pm_power_off directly.
> > 
> > Patches 35/47 to 46/47 do the same for architecture code.
> > 
> > Patch 47/47 finally removes pm_power_off.
> > 
> > For the most part, the individual patches include explanations why specific
> > priorities were chosen, at least if the selected priority is not the default
> > priority. Subsystem and architecture maintainers are encouraged to have a look
> > at the selected priorities and suggest improvements.
> > 
> > I ran the final code through my normal build and qemu tests. Results are
> > available at http://server.roeck-us.net:8010/builders in the 'poweroff-handler'
> > column. I also built all available configurations for arm, mips, powerpc,
> > m68k, and sh architectures.
> > 
> > The series is available in branch poweroff-handler of my repository at
> > git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git.
> > It is based on 3.18-rc2.
> > 
> > A note on Cc: In the initial submission I had way too many Cc:, causing the
> > patchset to be treated as spam by many mailers and mailing list handlers,
> > which of course defeated the purpose. This time around I am cutting down
> > the distribution list down significantly. My apologies to anyone I may have
> > failed to copy this time around.
> > 
> > Important changes since v2:
> > - Rebased series to v3.18-rc2.
> > - Do not hold any locks while executing the power-off call chain.
> >   This ensures that power-off handlers are executed in the state
> >   selected by the machine_power_off function for a given architecture,
> >   ie without changing the current semantics of power-off callbacks and
> >   machine_power_off functions.
> >   Power-off handler registration and de-registration is handled in atomic
> >   context with interrupts disabled to ensure that those functions are not
> >   interrupted by code which powers off the system.
> > - Use [xxx_]power_off[_xxx] instead of [xxx_]poweroff[_xxx] for newly
> >   introduced function and variable names.
> > - Use power-off instead of poweroff in descriptive text and comments.
> > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > - Use ACPI: instead of acpi: for messages in acpi code.
> > 
> > Important changes since v1:
> > - Rebased series to v3.18-rc1.
> > - Use raw notifier with spinlock protection instead of atomic notifiers,
> >   since some power-off handlers need to have interrupts enabled.
> > - Renamed API functions from _poweroff to _power_off.
> > - Added various Acks.
> > - Build tested all configurations for arm, powerpc, and mips architectures.
> > - Fixed two compile errors in mips patch.
> > - Replaced dev_err and pr_err with dev_warn and pr_warn if an error is not
> >   fatal.
> > - Provide managed resources API and use where appropriate.
> > - Provide and use definitions for standard priorities.
> > - Added patches to convert newly introduced power-off handlers.
> > - Various minor changes.
> > 
> > Important changes since RFC:
> > - Move API to new file kernel/power/power_off_handler.c.
> > - Move pm_power_off pointer to kernel/power/power_off_handler.c. Call
> >   pm_power_off from do_kernel_power_off, and only call do_kernel_power_off
> >   from architecture code instead of calling both pm_power_off and
> >   do_kernel_power_off.
> > - Provide additional API function register_power_off_handler_simple
> >   to simplify conversion of architecture code.
> > - Provide additional API function have_kernel_power_off to check if
> >   a power-off handler was installed.
> > - Convert all drivers and architecture code to use the new API.
> > - Remove pm_power_off as last patch of the series.
> > 
> > Cc: Alan Cox <gnomes@lxorguk.ukuu.org.uk>
> > Cc: Alexander Graf <agraf@suse.de>
> > Cc: Andrew Morton <akpm@linux-foundation.org>
> > Cc: Geert Uytterhoeven <geert@linux-m68k.org>
> > cc: Heiko Stuebner <heiko@sntech.de>
> > Cc: Lee Jones <lee.jones@linaro.org>
> > Cc: Len Brown <len.brown@intel.com>
> > Cc: Pavel Machek <pavel@ucw.cz>
> > Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> > Cc: Romain Perier <romain.perier@gmail.com>
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at  http://www.tux.org/lkml/
> 
> -- 
> balbi

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 00/47] kernel: Add support for power-off handler call chain
  2014-10-27 17:16   ` Guenter Roeck
@ 2014-10-27 17:33     ` Felipe Balbi
  2014-10-27 17:43       ` Johan Hovold
  0 siblings, 1 reply; 88+ messages in thread
From: Felipe Balbi @ 2014-10-27 17:33 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Felipe Balbi, linux-kernel, linux-pm, Alan Cox, Alexander Graf,
	Andrew Morton, Geert Uytterhoeven, Heiko Stuebner, Lee Jones,
	Len Brown, Pavel Machek, Rafael J. Wysocki, Romain Perier,
	Johan Hovold

[-- Attachment #1: Type: text/plain, Size: 1838 bytes --]

On Mon, Oct 27, 2014 at 10:16:17AM -0700, Guenter Roeck wrote:
> On Mon, Oct 27, 2014 at 11:03:24AM -0500, Felipe Balbi wrote:
> > Adding Johan, who's working on RTC power off for AM335x devices
> > 
> Hi Felipe,
> 
> is that the rtc-omap driver ?

yes it is.

> I am tracking linux-next for related changes. As new power-off handlers are
> introduced, I prepare patches for those as well. I currently have patches for
> the following two drivers in the queue:
> 	drivers/regulator/act8865-regulator.c
> 	drivers/rtc/rtc-omap.c
> 
> I plan to send review requests for those patches in a week or so (I think
> there is still some change pending to the power-off function in the rtc-omap
> driver, and I want to wait for it).

yeah, Johan's working on that.

> My current plan is to send a pull request for the series directly to Linus
> when the next commit window opens; this is what a number of maintainers
> suggested I should do. This pull request would exclude the last patch,
> so pm_power_off would still be there. Next steps would then be to submit
> another set of patches to update the newly introduced power-off handlers
> and then to finally remove pm_power_off; this would probably happen after
> the commit window closes.
> 
> At least that is the plan unless someone has a better idea ....

sounds like a good idea to me :-)

> There may be some variants; for example, it might make sense to create an
> immutable branch with the key patches (1-3 and 8) to enable others to use
> the new functions immediately. That would require Acks from affected
> maintainers for patch 1, though, so I can not do that yet.

alright, I think an immutable branch people can merge would be
appreciated nevertheless, but I'd certainly defer that to arch and soc
maintainers.

cheers

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 00/47] kernel: Add support for power-off handler call chain
  2014-10-27 17:33     ` Felipe Balbi
@ 2014-10-27 17:43       ` Johan Hovold
  0 siblings, 0 replies; 88+ messages in thread
From: Johan Hovold @ 2014-10-27 17:43 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: Guenter Roeck, linux-kernel, linux-pm, Alan Cox, Alexander Graf,
	Andrew Morton, Geert Uytterhoeven, Heiko Stuebner, Lee Jones,
	Len Brown, Pavel Machek, Rafael J. Wysocki, Romain Perier,
	Johan Hovold

On Mon, Oct 27, 2014 at 12:33:10PM -0500, Felipe Balbi wrote:
> On Mon, Oct 27, 2014 at 10:16:17AM -0700, Guenter Roeck wrote:
> > On Mon, Oct 27, 2014 at 11:03:24AM -0500, Felipe Balbi wrote:
> > > Adding Johan, who's working on RTC power off for AM335x devices
> > > 
> > Hi Felipe,
> > 
> > is that the rtc-omap driver ?
> 
> yes it is.
> 
> > I am tracking linux-next for related changes. As new power-off handlers are
> > introduced, I prepare patches for those as well. I currently have patches for
> > the following two drivers in the queue:
> > 	drivers/regulator/act8865-regulator.c
> > 	drivers/rtc/rtc-omap.c
> > 
> > I plan to send review requests for those patches in a week or so (I think
> > there is still some change pending to the power-off function in the rtc-omap
> > driver, and I want to wait for it).
> 
> yeah, Johan's working on that.

It's finished. I just sent the final version to akpm this morning
(adding a single mdelay), so you should be fine basing any conversion on
either v2 (in mmotm) or v3.

Johan

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 34/47] acpi: Register power-off handler with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 34/47] acpi: Register power-off handler " Guenter Roeck
@ 2014-10-28  0:26   ` Rafael J. Wysocki
  2014-10-28  2:10     ` Guenter Roeck
  0 siblings, 1 reply; 88+ messages in thread
From: Rafael J. Wysocki @ 2014-10-28  0:26 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Len Brown, linux-acpi

On Monday, October 27, 2014 08:55:41 AM Guenter Roeck wrote:
> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with high priority to reflect that the driver explicitly
> overrides existing power-off handlers.

Well, I'm still rather unconvinced that notifiers are particularly suitable for
this purpose.

Specifically ->

> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> Cc: Len Brown <lenb@kernel.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> - Replace acpi: with ACPI: in log message
> v2:
> - Use define to specify poweroff handler priority
> - Use pr_warn instead of pr_err
> 
>  drivers/acpi/sleep.c | 15 +++++++++++++--
>  1 file changed, 13 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
> index 05a31b5..7875b92 100644
> --- a/drivers/acpi/sleep.c
> +++ b/drivers/acpi/sleep.c
> @@ -16,6 +16,8 @@
>  #include <linux/device.h>
>  #include <linux/interrupt.h>
>  #include <linux/suspend.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/reboot.h>
>  #include <linux/acpi.h>
>  #include <linux/module.h>
> @@ -827,14 +829,22 @@ static void acpi_power_off_prepare(void)
>  	acpi_disable_all_gpes();
>  }
>  
> -static void acpi_power_off(void)
> +static int acpi_power_off(struct notifier_block *this,
> +			  unsigned long unused1, void *unused2)
>  {

-> Is there any reason why any notifier in the new chain would use the
second argument for anything meaningful?  And the third argument for
that matter?

>  	/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
>  	printk(KERN_DEBUG "%s called\n", __func__);
>  	local_irq_disable();
>  	acpi_enter_sleep_state(ACPI_STATE_S5);
> +
> +	return NOTIFY_DONE;

Also is there any reason for any notifier in the new chain to return anything
different from NOTIFY_DONE and if so, then what happens when anything else
is returned?

>  }
>  
> +static struct notifier_block acpi_power_off_nb = {
> +	.notifier_call = acpi_power_off,
> +	.priority = POWER_OFF_PRIORITY_HIGH,
> +};
> +
>  int __init acpi_sleep_init(void)
>  {
>  	char supported[ACPI_S_STATE_COUNT * 3 + 1];
> @@ -851,7 +861,8 @@ int __init acpi_sleep_init(void)
>  	if (acpi_sleep_state_supported(ACPI_STATE_S5)) {
>  		sleep_states[ACPI_STATE_S5] = 1;
>  		pm_power_off_prepare = acpi_power_off_prepare;
> -		pm_power_off = acpi_power_off;
> +		if (register_power_off_handler(&acpi_power_off_nb))
> +			pr_warn("ACPI: Failed to register power-off handler\n");
>  	}
>  
>  	supported[0] = 0;
> 

-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 34/47] acpi: Register power-off handler with kernel power-off handler
  2014-10-28  0:26   ` Rafael J. Wysocki
@ 2014-10-28  2:10     ` Guenter Roeck
  2014-10-28 23:10       ` Rafael J. Wysocki
  0 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-28  2:10 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: linux-kernel, linux-pm, Len Brown, linux-acpi

On 10/27/2014 05:26 PM, Rafael J. Wysocki wrote:
> On Monday, October 27, 2014 08:55:41 AM Guenter Roeck wrote:
>> Register with kernel power-off handler instead of setting pm_power_off
>> directly. Register with high priority to reflect that the driver explicitly
>> overrides existing power-off handlers.
>
> Well, I'm still rather unconvinced that notifiers are particularly suitable for
> this purpose.
>
> Specifically ->
>

Fine.

>> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
>> Cc: Len Brown <lenb@kernel.org>
>> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
>> ---
>> v3:
>> - Replace poweroff in all newly introduced variables and in text
>>    with power_off or power-off as appropriate
>> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
>> - Replace acpi: with ACPI: in log message
>> v2:
>> - Use define to specify poweroff handler priority
>> - Use pr_warn instead of pr_err
>>
>>   drivers/acpi/sleep.c | 15 +++++++++++++--
>>   1 file changed, 13 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
>> index 05a31b5..7875b92 100644
>> --- a/drivers/acpi/sleep.c
>> +++ b/drivers/acpi/sleep.c
>> @@ -16,6 +16,8 @@
>>   #include <linux/device.h>
>>   #include <linux/interrupt.h>
>>   #include <linux/suspend.h>
>> +#include <linux/notifier.h>
>> +#include <linux/pm.h>
>>   #include <linux/reboot.h>
>>   #include <linux/acpi.h>
>>   #include <linux/module.h>
>> @@ -827,14 +829,22 @@ static void acpi_power_off_prepare(void)
>>   	acpi_disable_all_gpes();
>>   }
>>
>> -static void acpi_power_off(void)
>> +static int acpi_power_off(struct notifier_block *this,
>> +			  unsigned long unused1, void *unused2)
>>   {
>
> -> Is there any reason why any notifier in the new chain would use the
> second argument for anything meaningful?  And the third argument for
> that matter?
>
>>   	/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
>>   	printk(KERN_DEBUG "%s called\n", __func__);
>>   	local_irq_disable();
>>   	acpi_enter_sleep_state(ACPI_STATE_S5);
>> +
>> +	return NOTIFY_DONE;
>
> Also is there any reason for any notifier in the new chain to return anything
> different from NOTIFY_DONE and if so, then what happens when anything else
> is returned?
>

As mentioned earlier, notifiers just come handy. That is all.

Having said that, I don't have a strong opinion either way. If you want me
to implement a priority based callback handler with a single argument,
just let me know and I'll be happy to implement it. It is not worth arguing
about.

Would something like

struct power_off_block {
	void (*power_off_call)(struct power_off_block *);
	struct power_off_block __rcu *next;
	int priority;
};

for the data structure be acceptable ? The power-off handler code would then
be something like

static void acpi_power_off(struct power_off_block *this)
{
}

ie quite similar to the current power-off handler code, with an added argument.
The API would, except for the structure argument, pretty much stay the same.

Thanks,
Guenter


^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 01/47] kernel: Add support for power-off handler call chain
  2014-10-27 15:55 ` [PATCH v3 01/47] " Guenter Roeck
@ 2014-10-28 17:49   ` Pavel Machek
  0 siblings, 0 replies; 88+ messages in thread
From: Pavel Machek @ 2014-10-28 17:49 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-kernel, linux-pm, Alan Cox, Alexander Graf, Andrew Morton,
	Geert Uytterhoeven, Heiko Stuebner, Lee Jones, Len Brown,
	Philippe Rétornaz, Rafael J. Wysocki, Romain Perier

On Mon 2014-10-27 08:55:08, Guenter Roeck wrote:
> Various drivers implement architecture and/or device specific means to
> power off the system.  For the most part, those drivers set the global
> variable pm_power_off to point to a function within the driver.

Acked-by: Pavel Machek <pavel@ucw.cz>

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 03/47] hibernate: Call have_kernel_power_off instead of checking pm_power_off
  2014-10-27 15:55 ` [PATCH v3 03/47] hibernate: Call have_kernel_power_off instead of checking pm_power_off Guenter Roeck
@ 2014-10-28 17:50   ` Pavel Machek
  0 siblings, 0 replies; 88+ messages in thread
From: Pavel Machek @ 2014-10-28 17:50 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Rafael J. Wysocki, Len Brown

On Mon 2014-10-27 08:55:10, Guenter Roeck wrote:
> Power-off handlers may now be installed with register_power_off_handler.
> Use the new API function have_kernel_power_off to determine if a power-off
> handler has been installed.
> 
> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>

Acked-by: Pavel Machek <pavel@ucw.cz>

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 47/47] kernel: Remove pm_power_off
  2014-10-27 15:55 ` [PATCH v3 47/47] kernel: Remove pm_power_off Guenter Roeck
@ 2014-10-28 17:50   ` Pavel Machek
  0 siblings, 0 replies; 88+ messages in thread
From: Pavel Machek @ 2014-10-28 17:50 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Rafael J. Wysocki, Len Brown

On Mon 2014-10-27 08:55:54, Guenter Roeck wrote:
> No users of pm_power_off are left, so it is safe to remove the function.
> 
> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>

Acked-by: Pavel Machek <pavel@ucw.cz>

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 34/47] acpi: Register power-off handler with kernel power-off handler
  2014-10-28  2:10     ` Guenter Roeck
@ 2014-10-28 23:10       ` Rafael J. Wysocki
  2014-10-29  2:05         ` Guenter Roeck
  0 siblings, 1 reply; 88+ messages in thread
From: Rafael J. Wysocki @ 2014-10-28 23:10 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Len Brown, linux-acpi

On Monday, October 27, 2014 07:10:26 PM Guenter Roeck wrote:
> On 10/27/2014 05:26 PM, Rafael J. Wysocki wrote:
> > On Monday, October 27, 2014 08:55:41 AM Guenter Roeck wrote:
> >> Register with kernel power-off handler instead of setting pm_power_off
> >> directly. Register with high priority to reflect that the driver explicitly
> >> overrides existing power-off handlers.
> >
> > Well, I'm still rather unconvinced that notifiers are particularly suitable for
> > this purpose.
> >
> > Specifically ->
> >
> 
> Fine.
> 
> >> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> >> Cc: Len Brown <lenb@kernel.org>
> >> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> >> ---
> >> v3:
> >> - Replace poweroff in all newly introduced variables and in text
> >>    with power_off or power-off as appropriate
> >> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> >> - Replace acpi: with ACPI: in log message
> >> v2:
> >> - Use define to specify poweroff handler priority
> >> - Use pr_warn instead of pr_err
> >>
> >>   drivers/acpi/sleep.c | 15 +++++++++++++--
> >>   1 file changed, 13 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
> >> index 05a31b5..7875b92 100644
> >> --- a/drivers/acpi/sleep.c
> >> +++ b/drivers/acpi/sleep.c
> >> @@ -16,6 +16,8 @@
> >>   #include <linux/device.h>
> >>   #include <linux/interrupt.h>
> >>   #include <linux/suspend.h>
> >> +#include <linux/notifier.h>
> >> +#include <linux/pm.h>
> >>   #include <linux/reboot.h>
> >>   #include <linux/acpi.h>
> >>   #include <linux/module.h>
> >> @@ -827,14 +829,22 @@ static void acpi_power_off_prepare(void)
> >>   	acpi_disable_all_gpes();
> >>   }
> >>
> >> -static void acpi_power_off(void)
> >> +static int acpi_power_off(struct notifier_block *this,
> >> +			  unsigned long unused1, void *unused2)
> >>   {
> >
> > -> Is there any reason why any notifier in the new chain would use the
> > second argument for anything meaningful?  And the third argument for
> > that matter?
> >
> >>   	/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
> >>   	printk(KERN_DEBUG "%s called\n", __func__);
> >>   	local_irq_disable();
> >>   	acpi_enter_sleep_state(ACPI_STATE_S5);
> >> +
> >> +	return NOTIFY_DONE;
> >
> > Also is there any reason for any notifier in the new chain to return anything
> > different from NOTIFY_DONE and if so, then what happens when anything else
> > is returned?
> >
> 
> As mentioned earlier, notifiers just come handy. That is all.
> 
> Having said that, I don't have a strong opinion either way. If you want me
> to implement a priority based callback handler with a single argument,
> just let me know and I'll be happy to implement it. It is not worth arguing
> about.
> 
> Would something like
> 
> struct power_off_block {
> 	void (*power_off_call)(struct power_off_block *);
> 	struct power_off_block __rcu *next;
> 	int priority;
> };
> 
> for the data structure be acceptable ? The power-off handler code would then
> be something like
> 
> static void acpi_power_off(struct power_off_block *this)
> {
> }
> 
> ie quite similar to the current power-off handler code, with an added argument.
> The API would, except for the structure argument, pretty much stay the same.

That's better in my view.

You could also get rid of the priority if you had something like

struct power_off_block *power_off_list[MAX_LEVEL];

and then made your power_off_block registration pass the level as the
second argument.

I also would use struct list_head instead of the next pointer, because the
list manipulation would be trivial then (and the above would become
struct list_head power_off_list[MAX_LEVEL];) and the callers would only
need to do

static struct power_off_block my_power_off_block = {
	.power_off_call = my_routine,
};

and then something like

	register_power_off_block(&my_power_off_block, <level>);

which would be just list_add_tail(&block->node, &power_off_list[<level>]) plus
some bounds checking etc.  To avoid open coding stuff.

That would allow me to avoid arbitrary gaps in the priority space too and
if more levels need to be added over time, that should be easy to do too if
an enum is used to define them.

But if you prefer to use a unidirectional list and keep the priority in
struct power_off_block, I'm fine with that too.

[Dynamic allocation of memory for the struct power_off_block things is worth
considering too IMHO, so that users can simply pass the name of the routine
and the level to the registration function, like:

	ret = register_power_off_call(my_routine, <level>);
	if (ret)
		complain;

The unregistration would be somewhat less straightforward then, but I'm not
sure if unregistration is necessary at all in this case.]

Kind regards,
Rafael


^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 34/47] acpi: Register power-off handler with kernel power-off handler
  2014-10-28 23:10       ` Rafael J. Wysocki
@ 2014-10-29  2:05         ` Guenter Roeck
  2014-10-29 15:13           ` Rafael J. Wysocki
  0 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-10-29  2:05 UTC (permalink / raw)
  To: Rafael J. Wysocki; +Cc: linux-kernel, linux-pm, Len Brown, linux-acpi

On 10/28/2014 04:10 PM, Rafael J. Wysocki wrote:
> On Monday, October 27, 2014 07:10:26 PM Guenter Roeck wrote:
>> On 10/27/2014 05:26 PM, Rafael J. Wysocki wrote:
>>> On Monday, October 27, 2014 08:55:41 AM Guenter Roeck wrote:
>>>> Register with kernel power-off handler instead of setting pm_power_off
>>>> directly. Register with high priority to reflect that the driver explicitly
>>>> overrides existing power-off handlers.
>>>
>>> Well, I'm still rather unconvinced that notifiers are particularly suitable for
>>> this purpose.
>>>
>>> Specifically ->
>>>
>>
>> Fine.
>>
>>>> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
>>>> Cc: Len Brown <lenb@kernel.org>
>>>> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
>>>> ---
>>>> v3:
>>>> - Replace poweroff in all newly introduced variables and in text
>>>>     with power_off or power-off as appropriate
>>>> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
>>>> - Replace acpi: with ACPI: in log message
>>>> v2:
>>>> - Use define to specify poweroff handler priority
>>>> - Use pr_warn instead of pr_err
>>>>
>>>>    drivers/acpi/sleep.c | 15 +++++++++++++--
>>>>    1 file changed, 13 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
>>>> index 05a31b5..7875b92 100644
>>>> --- a/drivers/acpi/sleep.c
>>>> +++ b/drivers/acpi/sleep.c
>>>> @@ -16,6 +16,8 @@
>>>>    #include <linux/device.h>
>>>>    #include <linux/interrupt.h>
>>>>    #include <linux/suspend.h>
>>>> +#include <linux/notifier.h>
>>>> +#include <linux/pm.h>
>>>>    #include <linux/reboot.h>
>>>>    #include <linux/acpi.h>
>>>>    #include <linux/module.h>
>>>> @@ -827,14 +829,22 @@ static void acpi_power_off_prepare(void)
>>>>    	acpi_disable_all_gpes();
>>>>    }
>>>>
>>>> -static void acpi_power_off(void)
>>>> +static int acpi_power_off(struct notifier_block *this,
>>>> +			  unsigned long unused1, void *unused2)
>>>>    {
>>>
>>> -> Is there any reason why any notifier in the new chain would use the
>>> second argument for anything meaningful?  And the third argument for
>>> that matter?
>>>
>>>>    	/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
>>>>    	printk(KERN_DEBUG "%s called\n", __func__);
>>>>    	local_irq_disable();
>>>>    	acpi_enter_sleep_state(ACPI_STATE_S5);
>>>> +
>>>> +	return NOTIFY_DONE;
>>>
>>> Also is there any reason for any notifier in the new chain to return anything
>>> different from NOTIFY_DONE and if so, then what happens when anything else
>>> is returned?
>>>
>>
>> As mentioned earlier, notifiers just come handy. That is all.
>>
>> Having said that, I don't have a strong opinion either way. If you want me
>> to implement a priority based callback handler with a single argument,
>> just let me know and I'll be happy to implement it. It is not worth arguing
>> about.
>>
>> Would something like
>>
>> struct power_off_block {
>> 	void (*power_off_call)(struct power_off_block *);
>> 	struct power_off_block __rcu *next;
>> 	int priority;
>> };
>>
>> for the data structure be acceptable ? The power-off handler code would then
>> be something like
>>
>> static void acpi_power_off(struct power_off_block *this)
>> {
>> }
>>
>> ie quite similar to the current power-off handler code, with an added argument.
>> The API would, except for the structure argument, pretty much stay the same.
>
> That's better in my view.
>
> You could also get rid of the priority if you had something like
>
> struct power_off_block *power_off_list[MAX_LEVEL];
>
> and then made your power_off_block registration pass the level as the
> second argument.
>
> I also would use struct list_head instead of the next pointer, because the
> list manipulation would be trivial then (and the above would become
> struct list_head power_off_list[MAX_LEVEL];) and the callers would only
> need to do
>
> static struct power_off_block my_power_off_block = {
> 	.power_off_call = my_routine,
> };
>
> and then something like
>
> 	register_power_off_block(&my_power_off_block, <level>);
>
> which would be just list_add_tail(&block->node, &power_off_list[<level>]) plus
> some bounds checking etc.  To avoid open coding stuff.
>
> That would allow me to avoid arbitrary gaps in the priority space too and
> if more levels need to be added over time, that should be easy to do too if
> an enum is used to define them.
>
> But if you prefer to use a unidirectional list and keep the priority in
> struct power_off_block, I'm fine with that too.
>
I prefer a unidirectional list. It is not as if we expect dozens of registrations;
in most cases there will be one, rarely two and even more rarely three.

> [Dynamic allocation of memory for the struct power_off_block things is worth
> considering too IMHO, so that users can simply pass the name of the routine
> and the level to the registration function, like:
>
> 	ret = register_power_off_call(my_routine, <level>);
> 	if (ret)
> 		complain;
>
> The unregistration would be somewhat less straightforward then, but I'm not
> sure if unregistration is necessary at all in this case.]
>

Problem with dynamic memory allocation is that some callers don't have
the memory subsystem initialized when registering the poweroff function.
That was my initial implementation, and it got me some unexpected crashes.

Thanks,
Guenter


^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 34/47] acpi: Register power-off handler with kernel power-off handler
  2014-10-29  2:05         ` Guenter Roeck
@ 2014-10-29 15:13           ` Rafael J. Wysocki
  0 siblings, 0 replies; 88+ messages in thread
From: Rafael J. Wysocki @ 2014-10-29 15:13 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Len Brown, linux-acpi

On Tuesday, October 28, 2014 07:05:11 PM Guenter Roeck wrote:
> On 10/28/2014 04:10 PM, Rafael J. Wysocki wrote:
> > On Monday, October 27, 2014 07:10:26 PM Guenter Roeck wrote:
> >> On 10/27/2014 05:26 PM, Rafael J. Wysocki wrote:
> >>> On Monday, October 27, 2014 08:55:41 AM Guenter Roeck wrote:
> >>>> Register with kernel power-off handler instead of setting pm_power_off
> >>>> directly. Register with high priority to reflect that the driver explicitly
> >>>> overrides existing power-off handlers.
> >>>
> >>> Well, I'm still rather unconvinced that notifiers are particularly suitable for
> >>> this purpose.
> >>>
> >>> Specifically ->
> >>>
> >>
> >> Fine.
> >>
> >>>> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> >>>> Cc: Len Brown <lenb@kernel.org>
> >>>> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> >>>> ---
> >>>> v3:
> >>>> - Replace poweroff in all newly introduced variables and in text
> >>>>     with power_off or power-off as appropriate
> >>>> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> >>>> - Replace acpi: with ACPI: in log message
> >>>> v2:
> >>>> - Use define to specify poweroff handler priority
> >>>> - Use pr_warn instead of pr_err
> >>>>
> >>>>    drivers/acpi/sleep.c | 15 +++++++++++++--
> >>>>    1 file changed, 13 insertions(+), 2 deletions(-)
> >>>>
> >>>> diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
> >>>> index 05a31b5..7875b92 100644
> >>>> --- a/drivers/acpi/sleep.c
> >>>> +++ b/drivers/acpi/sleep.c
> >>>> @@ -16,6 +16,8 @@
> >>>>    #include <linux/device.h>
> >>>>    #include <linux/interrupt.h>
> >>>>    #include <linux/suspend.h>
> >>>> +#include <linux/notifier.h>
> >>>> +#include <linux/pm.h>
> >>>>    #include <linux/reboot.h>
> >>>>    #include <linux/acpi.h>
> >>>>    #include <linux/module.h>
> >>>> @@ -827,14 +829,22 @@ static void acpi_power_off_prepare(void)
> >>>>    	acpi_disable_all_gpes();
> >>>>    }
> >>>>
> >>>> -static void acpi_power_off(void)
> >>>> +static int acpi_power_off(struct notifier_block *this,
> >>>> +			  unsigned long unused1, void *unused2)
> >>>>    {
> >>>
> >>> -> Is there any reason why any notifier in the new chain would use the
> >>> second argument for anything meaningful?  And the third argument for
> >>> that matter?
> >>>
> >>>>    	/* acpi_sleep_prepare(ACPI_STATE_S5) should have already been called */
> >>>>    	printk(KERN_DEBUG "%s called\n", __func__);
> >>>>    	local_irq_disable();
> >>>>    	acpi_enter_sleep_state(ACPI_STATE_S5);
> >>>> +
> >>>> +	return NOTIFY_DONE;
> >>>
> >>> Also is there any reason for any notifier in the new chain to return anything
> >>> different from NOTIFY_DONE and if so, then what happens when anything else
> >>> is returned?
> >>>
> >>
> >> As mentioned earlier, notifiers just come handy. That is all.
> >>
> >> Having said that, I don't have a strong opinion either way. If you want me
> >> to implement a priority based callback handler with a single argument,
> >> just let me know and I'll be happy to implement it. It is not worth arguing
> >> about.
> >>
> >> Would something like
> >>
> >> struct power_off_block {
> >> 	void (*power_off_call)(struct power_off_block *);
> >> 	struct power_off_block __rcu *next;
> >> 	int priority;
> >> };
> >>
> >> for the data structure be acceptable ? The power-off handler code would then
> >> be something like
> >>
> >> static void acpi_power_off(struct power_off_block *this)
> >> {
> >> }
> >>
> >> ie quite similar to the current power-off handler code, with an added argument.
> >> The API would, except for the structure argument, pretty much stay the same.
> >
> > That's better in my view.
> >
> > You could also get rid of the priority if you had something like
> >
> > struct power_off_block *power_off_list[MAX_LEVEL];
> >
> > and then made your power_off_block registration pass the level as the
> > second argument.
> >
> > I also would use struct list_head instead of the next pointer, because the
> > list manipulation would be trivial then (and the above would become
> > struct list_head power_off_list[MAX_LEVEL];) and the callers would only
> > need to do
> >
> > static struct power_off_block my_power_off_block = {
> > 	.power_off_call = my_routine,
> > };
> >
> > and then something like
> >
> > 	register_power_off_block(&my_power_off_block, <level>);
> >
> > which would be just list_add_tail(&block->node, &power_off_list[<level>]) plus
> > some bounds checking etc.  To avoid open coding stuff.
> >
> > That would allow me to avoid arbitrary gaps in the priority space too and
> > if more levels need to be added over time, that should be easy to do too if
> > an enum is used to define them.
> >
> > But if you prefer to use a unidirectional list and keep the priority in
> > struct power_off_block, I'm fine with that too.
> >
> I prefer a unidirectional list. It is not as if we expect dozens of registrations;
> in most cases there will be one, rarely two and even more rarely three.

OK

> > [Dynamic allocation of memory for the struct power_off_block things is worth
> > considering too IMHO, so that users can simply pass the name of the routine
> > and the level to the registration function, like:
> >
> > 	ret = register_power_off_call(my_routine, <level>);
> > 	if (ret)
> > 		complain;
> >
> > The unregistration would be somewhat less straightforward then, but I'm not
> > sure if unregistration is necessary at all in this case.]
> >
> 
> Problem with dynamic memory allocation is that some callers don't have
> the memory subsystem initialized when registering the poweroff function.
> That was my initial implementation, and it got me some unexpected crashes.

I see.

-- 
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 30/47] x86: iris: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 30/47] x86: iris: " Guenter Roeck
@ 2014-11-01 19:41   ` Thomas Gleixner
  2014-11-01 21:15     ` Guenter Roeck
  0 siblings, 1 reply; 88+ messages in thread
From: Thomas Gleixner @ 2014-11-01 19:41 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Ingo Molnar, H. Peter Anvin, x86

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with high priority to reflect that the original code
> overwrites existing power-off handlers.

Acked-by-me for all the x86 parts of that series.

Thanks,

	tglx


^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 30/47] x86: iris: Register with kernel power-off handler
  2014-11-01 19:41   ` Thomas Gleixner
@ 2014-11-01 21:15     ` Guenter Roeck
  0 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-11-01 21:15 UTC (permalink / raw)
  To: Thomas Gleixner; +Cc: linux-kernel, linux-pm, Ingo Molnar, H. Peter Anvin, x86

On 11/01/2014 12:41 PM, Thomas Gleixner wrote:
> On Mon, 27 Oct 2014, Guenter Roeck wrote:
>
>> Register with kernel power-off handler instead of setting pm_power_off
>> directly. Register with high priority to reflect that the original code
>> overwrites existing power-off handlers.
>
> Acked-by-me for all the x86 parts of that series.
>
Thanks!

Guenter



^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 19/47] mfd: rk808: Register power-off handler with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 19/47] mfd: rk808: Register power-off handler " Guenter Roeck
@ 2014-11-03 17:53   ` Lee Jones
  2014-11-03 19:06     ` Guenter Roeck
  0 siblings, 1 reply; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:53 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-kernel, linux-pm, Chris Zhong, Zhang Qing, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Chris Zhong <zyw@rock-chips.com>
> Cc: Zhang Qing <zhangqing@rock-chips.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - New patch
> 
>  drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
>  include/linux/mfd/rk808.h |  2 ++
>  2 files changed, 18 insertions(+), 14 deletions(-)

Code looks okay:

Acked-by: Lee Jones <lee.jones@linaro.org>

... but how are you thinking about handling this set?

> diff --git a/drivers/mfd/rk808.c b/drivers/mfd/rk808.c
> index bd02150..5d5257d 100644
> --- a/drivers/mfd/rk808.c
> +++ b/drivers/mfd/rk808.c
> @@ -21,6 +21,8 @@
>  #include <linux/mfd/rk808.h>
>  #include <linux/mfd/core.h>
>  #include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  
>  struct rk808_reg_data {
> @@ -147,23 +149,19 @@ static struct regmap_irq_chip rk808_irq_chip = {
>  	.init_ack_masked = true,
>  };
>  
> -static struct i2c_client *rk808_i2c_client;
> -static void rk808_device_shutdown(void)
> +static int rk808_device_shutdown(struct notifier_block *this,
> +				 unsigned long unused1, void *unused2)
>  {
> +	struct rk808 *rk808 = container_of(this, struct rk808, power_off_nb);
>  	int ret;
> -	struct rk808 *rk808 = i2c_get_clientdata(rk808_i2c_client);
> -
> -	if (!rk808) {
> -		dev_warn(&rk808_i2c_client->dev,
> -			 "have no rk808, so do nothing here\n");
> -		return;
> -	}
>  
>  	ret = regmap_update_bits(rk808->regmap,
>  				 RK808_DEVCTRL_REG,
>  				 DEV_OFF_RST, DEV_OFF_RST);
>  	if (ret)
> -		dev_err(&rk808_i2c_client->dev, "power off error!\n");
> +		dev_err(&rk808->i2c->dev, "power off error!\n");
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static int rk808_probe(struct i2c_client *client,
> @@ -222,9 +220,14 @@ static int rk808_probe(struct i2c_client *client,
>  
>  	pm_off = of_property_read_bool(np,
>  				"rockchip,system-power-controller");
> -	if (pm_off && !pm_power_off) {
> -		rk808_i2c_client = client;
> -		pm_power_off = rk808_device_shutdown;
> +	if (pm_off) {
> +		rk808->power_off_nb.notifier_call = rk808_device_shutdown;
> +		rk808->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = devm_register_power_off_handler(&client->dev,
> +						      &rk808->power_off_nb);
> +		if (ret)
> +			dev_warn(&client->dev,
> +				 "Failed to register power-off handler\n");
>  	}
>  
>  	return 0;
> @@ -240,7 +243,6 @@ static int rk808_remove(struct i2c_client *client)
>  
>  	regmap_del_irq_chip(client->irq, rk808->irq_data);
>  	mfd_remove_devices(&client->dev);
> -	pm_power_off = NULL;
>  
>  	return 0;
>  }
> diff --git a/include/linux/mfd/rk808.h b/include/linux/mfd/rk808.h
> index fb09312..6308fd4 100644
> --- a/include/linux/mfd/rk808.h
> +++ b/include/linux/mfd/rk808.h
> @@ -19,6 +19,7 @@
>  #ifndef __LINUX_REGULATOR_rk808_H
>  #define __LINUX_REGULATOR_rk808_H
>  
> +#include <linux/notifier.h>
>  #include <linux/regulator/machine.h>
>  #include <linux/regmap.h>
>  
> @@ -192,5 +193,6 @@ struct rk808 {
>  	struct i2c_client *i2c;
>  	struct regmap_irq_chip_data *irq_data;
>  	struct regmap *regmap;
> +	struct notifier_block power_off_nb;
>  };
>  #endif /* __LINUX_REGULATOR_rk808_H */

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 20/47] mfd: rn5t618: Register power-off handler with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 20/47] mfd: rn5t618: " Guenter Roeck
@ 2014-11-03 17:54   ` Lee Jones
  0 siblings, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:54 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Beniamino Galvani, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Beniamino Galvani <b.galvani@gmail.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - New patch
> 
>  drivers/mfd/rn5t618.c       | 32 ++++++++++++++++----------------
>  include/linux/mfd/rn5t618.h |  2 ++
>  2 files changed, 18 insertions(+), 16 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/rn5t618.c b/drivers/mfd/rn5t618.c
> index 6668571..ed564d1 100644
> --- a/drivers/mfd/rn5t618.c
> +++ b/drivers/mfd/rn5t618.c
> @@ -15,6 +15,8 @@
>  #include <linux/mfd/core.h>
>  #include <linux/mfd/rn5t618.h>
>  #include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  
>  static const struct mfd_cell rn5t618_cells[] = {
> @@ -47,16 +49,20 @@ static const struct regmap_config rn5t618_regmap_config = {
>  	.cache_type	= REGCACHE_RBTREE,
>  };
>  
> -static struct rn5t618 *rn5t618_pm_power_off;
> -
> -static void rn5t618_power_off(void)
> +static int rn5t618_power_off(struct notifier_block *this,
> +			     unsigned long unused1, void *unused2)
>  {
> +	struct rn5t618 *rn5t618 = container_of(this, struct rn5t618,
> +					       power_off_nb);
> +
>  	/* disable automatic repower-on */
> -	regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_REPCNT,
> +	regmap_update_bits(rn5t618->regmap, RN5T618_REPCNT,
>  			   RN5T618_REPCNT_REPWRON, 0);
>  	/* start power-off sequence */
> -	regmap_update_bits(rn5t618_pm_power_off->regmap, RN5T618_SLPCNT,
> +	regmap_update_bits(rn5t618->regmap, RN5T618_SLPCNT,
>  			   RN5T618_SLPCNT_SWPWROFF, RN5T618_SLPCNT_SWPWROFF);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static int rn5t618_i2c_probe(struct i2c_client *i2c,
> @@ -85,23 +91,17 @@ static int rn5t618_i2c_probe(struct i2c_client *i2c,
>  		return ret;
>  	}
>  
> -	if (!pm_power_off) {
> -		rn5t618_pm_power_off = priv;
> -		pm_power_off = rn5t618_power_off;
> -	}
> +	priv->power_off_nb.notifier_call = rn5t618_power_off;
> +	priv->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +	ret = devm_register_power_off_handler(&i2c->dev, &priv->power_off_nb);
> +	if (ret)
> +		dev_warn(&i2c->dev, "Failed to register power-off handler\n");
>  
>  	return 0;
>  }
>  
>  static int rn5t618_i2c_remove(struct i2c_client *i2c)
>  {
> -	struct rn5t618 *priv = i2c_get_clientdata(i2c);
> -
> -	if (priv == rn5t618_pm_power_off) {
> -		rn5t618_pm_power_off = NULL;
> -		pm_power_off = NULL;
> -	}
> -
>  	mfd_remove_devices(&i2c->dev);
>  	return 0;
>  }
> diff --git a/include/linux/mfd/rn5t618.h b/include/linux/mfd/rn5t618.h
> index c72d534..21c9c39 100644
> --- a/include/linux/mfd/rn5t618.h
> +++ b/include/linux/mfd/rn5t618.h> @@ -14,6 +14,7 @@
>  #ifndef __LINUX_MFD_RN5T618_H
>  #define __LINUX_MFD_RN5T618_H
>  
> +#include <linux/notifier.h>
>  #include <linux/regmap.h>
>  
>  #define RN5T618_LSIVER			0x00
> @@ -223,6 +224,7 @@ enum {
>  
>  struct rn5t618 {
>  	struct regmap *regmap;
> +	struct notifier_block power_off_nb;
>  };
>  
>  #endif /* __LINUX_MFD_RN5T618_H */

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 18/47] mfd: twl4030-power: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 18/47] mfd: twl4030-power: " Guenter Roeck
@ 2014-11-03 17:54   ` Lee Jones
  2014-11-03 17:56     ` Felipe Balbi
  0 siblings, 1 reply; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:54 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Make twl4030_power_off static as it is only called from the twl4030-power
> driver. Drop remove function as it is no longer needed.
> 
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use dev_warn instead of dev_err
> - Use devm_register_power_off_handler
> - Drop remove function as it is no longer needed.
> 
>  drivers/mfd/twl4030-power.c | 29 +++++++++++++++++++----------
>  include/linux/i2c/twl.h     |  1 -
>  2 files changed, 19 insertions(+), 11 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
> index cf92a6d..e36eea9 100644
> --- a/drivers/mfd/twl4030-power.c
> +++ b/drivers/mfd/twl4030-power.c
> @@ -25,9 +25,10 @@
>   */
>  
>  #include <linux/module.h>
> -#include <linux/pm.h>
> +#include <linux/notifier.h>
>  #include <linux/i2c/twl.h>
>  #include <linux/platform_device.h>
> +#include <linux/pm.h>
>  #include <linux/of.h>
>  #include <linux/of_device.h>
>  
> @@ -611,7 +612,8 @@ twl4030_power_configure_resources(const struct twl4030_power_data *pdata)
>   * After a successful execution, TWL shuts down the power to the SoC
>   * and all peripherals connected to it.
>   */
> -void twl4030_power_off(void)
> +static int twl4030_power_off(struct notifier_block *this, unsigned long unused1,
> +			     void *unused2)
>  {
>  	int err;
>  
> @@ -619,8 +621,15 @@ void twl4030_power_off(void)
>  			       TWL4030_PM_MASTER_P1_SW_EVENTS);
>  	if (err)
>  		pr_err("TWL4030 Unable to power off\n");
> +
> +	return NOTIFY_DONE;
>  }
>  
> +static struct notifier_block twl4030_power_off_nb = {
> +	.notifier_call = twl4030_power_off,
> +	.priority = POWER_OFF_PRIORITY_LOW,
> +};
> +
>  static bool twl4030_power_use_poweroff(const struct twl4030_power_data *pdata,
>  					struct device_node *node)
>  {
> @@ -839,7 +848,9 @@ static int twl4030_power_probe(struct platform_device *pdev)
>  	}
>  
>  	/* Board has to be wired properly to use this feature */
> -	if (twl4030_power_use_poweroff(pdata, node) && !pm_power_off) {
> +	if (twl4030_power_use_poweroff(pdata, node)) {
> +		int ret;
> +
>  		/* Default for SEQ_OFFSYNC is set, lets ensure this */
>  		err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &val,
>  				      TWL4030_PM_MASTER_CFG_P123_TRANSITION);
> @@ -856,7 +867,11 @@ static int twl4030_power_probe(struct platform_device *pdev)
>  			}
>  		}
>  
> -		pm_power_off = twl4030_power_off;
> +		ret = devm_register_power_off_handler(&pdev->dev,
> +						      &twl4030_power_off_nb);
> +		if (ret)
> +			dev_warn(&pdev->dev,
> +				 "Failed to register power-off handler\n");
>  	}
>  
>  relock:
> @@ -870,11 +885,6 @@ relock:
>  	return err;
>  }
>  
> -static int twl4030_power_remove(struct platform_device *pdev)
> -{
> -	return 0;
> -}
> -
>  static struct platform_driver twl4030_power_driver = {
>  	.driver = {
>  		.name	= "twl4030_power",
> @@ -882,7 +892,6 @@ static struct platform_driver twl4030_power_driver = {
>  		.of_match_table = of_match_ptr(twl4030_power_of_match),
>  	},
>  	.probe		= twl4030_power_probe,
> -	.remove		= twl4030_power_remove,
>  };
>  
>  module_platform_driver(twl4030_power_driver);
> diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h
> index 8cfb50f..f8544f1 100644
> --- a/include/linux/i2c/twl.h
> +++ b/include/linux/i2c/twl.h
> @@ -680,7 +680,6 @@ struct twl4030_power_data {
>  };
>  
>  extern int twl4030_remove_script(u8 flags);
> -extern void twl4030_power_off(void);
>  
>  struct twl4030_codec_data {
>  	unsigned int digimic_delay; /* in ms */

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 17/47] mfd: tps65910: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 17/47] mfd: tps65910: " Guenter Roeck
@ 2014-11-03 17:54   ` Lee Jones
  2014-11-03 17:57   ` Felipe Balbi
  1 sibling, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:54 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/tps65910.c       | 27 ++++++++++++++++++---------
>  include/linux/mfd/tps65910.h |  3 +++
>  2 files changed, 21 insertions(+), 9 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c
> index 7612d89..3c94dbf 100644
> --- a/drivers/mfd/tps65910.c
> +++ b/drivers/mfd/tps65910.c
> @@ -23,6 +23,8 @@
>  #include <linux/irq.h>
>  #include <linux/irqdomain.h>
>  #include <linux/mfd/core.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/mfd/tps65910.h>
>  #include <linux/of.h>
> @@ -437,19 +439,20 @@ struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
>  }
>  #endif
>  
> -static struct i2c_client *tps65910_i2c_client;
> -static void tps65910_power_off(void)
> +static int tps65910_power_off(struct notifier_block *this,
> +			      unsigned long unused1, void *unused2)
>  {
> -	struct tps65910 *tps65910;
> -
> -	tps65910 = dev_get_drvdata(&tps65910_i2c_client->dev);
> +	struct tps65910 *tps65910 = container_of(this, struct tps65910,
> +						 power_off_nb);
>  
>  	if (tps65910_reg_set_bits(tps65910, TPS65910_DEVCTRL,
>  			DEVCTRL_PWR_OFF_MASK) < 0)
> -		return;
> +		return NOTIFY_DONE;
>  
>  	tps65910_reg_clear_bits(tps65910, TPS65910_DEVCTRL,
>  			DEVCTRL_DEV_ON_MASK);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static int tps65910_i2c_probe(struct i2c_client *i2c,
> @@ -505,9 +508,13 @@ static int tps65910_i2c_probe(struct i2c_client *i2c,
>  	tps65910_ck32k_init(tps65910, pmic_plat_data);
>  	tps65910_sleepinit(tps65910, pmic_plat_data);
>  
> -	if (pmic_plat_data->pm_off && !pm_power_off) {
> -		tps65910_i2c_client = i2c;
> -		pm_power_off = tps65910_power_off;
> +	if (pmic_plat_data->pm_off) {
> +		tps65910->power_off_nb.notifier_call = tps65910_power_off;
> +		tps65910->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = register_power_off_handler(&tps65910->power_off_nb);
> +		if (ret)
> +			dev_warn(&i2c->dev,
> +				 "failed to register power-off handler\n");
>  	}
>  
>  	ret = mfd_add_devices(tps65910->dev, -1,
> @@ -527,6 +534,8 @@ static int tps65910_i2c_remove(struct i2c_client *i2c)
>  {
>  	struct tps65910 *tps65910 = i2c_get_clientdata(i2c);
>  
> +	unregister_power_off_handler(&tps65910->power_off_nb);
> +
>  	tps65910_irq_exit(tps65910);
>  	mfd_remove_devices(tps65910->dev);
>  
> diff --git a/include/linux/mfd/tps65910.h b/include/linux/mfd/tps65910.h
> index 6483a6f..94876c4 100644
> --- a/include/linux/mfd/tps65910.h
> +++ b/include/linux/mfd/tps65910.h
> @@ -905,6 +905,9 @@ struct tps65910 {
>  	/* IRQ Handling */
>  	int chip_irq;
>  	struct regmap_irq_chip_data *irq_data;
> +
> +	/* Power-off handling */
> +	struct notifier_block power_off_nb;
>  };
>  
>  struct tps65910_platform_data {

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 16/47] mfd: tps6586x: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 16/47] mfd: tps6586x: " Guenter Roeck
@ 2014-11-03 17:54   ` Lee Jones
  2014-11-03 17:57   ` Felipe Balbi
  1 sibling, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:54 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/tps6586x.c | 31 +++++++++++++++++++++++--------
>  1 file changed, 23 insertions(+), 8 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c
> index 8e1dbc4..1e97478 100644
> --- a/drivers/mfd/tps6586x.c
> +++ b/drivers/mfd/tps6586x.c
> @@ -21,10 +21,12 @@
>  #include <linux/kernel.h>
>  #include <linux/module.h>
>  #include <linux/mutex.h>
> +#include <linux/notifier.h>
>  #include <linux/slab.h>
>  #include <linux/err.h>
>  #include <linux/i2c.h>
>  #include <linux/platform_device.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/of.h>
>  
> @@ -133,6 +135,8 @@ struct tps6586x {
>  	u32			irq_en;
>  	u8			mask_reg[5];
>  	struct irq_domain	*irq_domain;
> +
> +	struct notifier_block	power_off_nb;
>  };
>  
>  static inline struct tps6586x *dev_to_tps6586x(struct device *dev)
> @@ -472,13 +476,18 @@ static const struct regmap_config tps6586x_regmap_config = {
>  	.cache_type = REGCACHE_RBTREE,
>  };
>  
> -static struct device *tps6586x_dev;
> -static void tps6586x_power_off(void)
> +static int tps6586x_power_off(struct notifier_block *this,
> +			      unsigned long unused1, void *unused2)
>  {
> -	if (tps6586x_clr_bits(tps6586x_dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT))
> -		return;
> +	struct tps6586x *tps6586x = container_of(this, struct tps6586x,
> +						 power_off_nb);
> +
> +	if (tps6586x_clr_bits(tps6586x->dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT))
> +		return NOTIFY_DONE;
>  
> -	tps6586x_set_bits(tps6586x_dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
> +	tps6586x_set_bits(tps6586x->dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static void tps6586x_print_version(struct i2c_client *client, int version)
> @@ -575,9 +584,13 @@ static int tps6586x_i2c_probe(struct i2c_client *client,
>  		goto err_add_devs;
>  	}
>  
> -	if (pdata->pm_off && !pm_power_off) {
> -		tps6586x_dev = &client->dev;
> -		pm_power_off = tps6586x_power_off;
> +	if (pdata->pm_off) {
> +		tps6586x->power_off_nb.notifier_call = tps6586x_power_off;
> +		tps6586x->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = register_power_off_handler(&tps6586x->power_off_nb);
> +		if (ret)
> +			dev_warn(&client->dev,
> +				 "failed to register power-off handler\n");
>  	}
>  
>  	return 0;
> @@ -594,6 +607,8 @@ static int tps6586x_i2c_remove(struct i2c_client *client)
>  {
>  	struct tps6586x *tps6586x = i2c_get_clientdata(client);
>  
> +	unregister_power_off_handler(&tps6586x->power_off_nb);
> +
>  	tps6586x_remove_subdevs(tps6586x);
>  	mfd_remove_devices(tps6586x->dev);
>  	if (client->irq)

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 15/47] mfd: dm355evm_msp: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 15/47] mfd: dm355evm_msp: " Guenter Roeck
@ 2014-11-03 17:55   ` Lee Jones
  0 siblings, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:55 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/dm355evm_msp.c | 18 +++++++++++++++---
>  1 file changed, 15 insertions(+), 3 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/dm355evm_msp.c b/drivers/mfd/dm355evm_msp.c
> index 4c826f7..63a1632 100644
> --- a/drivers/mfd/dm355evm_msp.c
> +++ b/drivers/mfd/dm355evm_msp.c
> @@ -14,6 +14,8 @@
>  #include <linux/platform_device.h>
>  #include <linux/clk.h>
>  #include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/err.h>
>  #include <linux/gpio.h>
>  #include <linux/leds.h>
> @@ -352,14 +354,22 @@ static void dm355evm_command(unsigned command)
>  				command, status);
>  }
>  
> -static void dm355evm_power_off(void)
> +static int dm355evm_power_off(struct notifier_block *this,
> +			      unsigned long unused1, void *unused2)
>  {
>  	dm355evm_command(MSP_COMMAND_POWEROFF);
> +
> +	return NOTIFY_DONE;
>  }
>  
> +static struct notifier_block dm355evm_msp_power_off_nb = {
> +	.notifier_call = dm355evm_power_off,
> +	.priority = POWER_OFF_PRIORITY_LOW,
> +};
> +
>  static int dm355evm_msp_remove(struct i2c_client *client)
>  {
> -	pm_power_off = NULL;
> +	unregister_power_off_handler(&dm355evm_msp_power_off_nb);
>  	msp430 = NULL;
>  	return 0;
>  }
> @@ -398,7 +408,9 @@ dm355evm_msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
>  		goto fail;
>  
>  	/* PM hookup */
> -	pm_power_off = dm355evm_power_off;
> +	status = register_power_off_handler(&dm355evm_msp_power_off_nb);
> +	if (status)
> +		dev_warn(&client->dev, "Failed to register power-off handler\n");
>  
>  	return 0;
>  

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 14/47] mfd: tps80031: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 14/47] mfd: tps80031: " Guenter Roeck
@ 2014-11-03 17:55   ` Lee Jones
  0 siblings, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:55 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/tps80031.c       | 30 ++++++++++++++++++------------
>  include/linux/mfd/tps80031.h |  2 ++
>  2 files changed, 20 insertions(+), 12 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/tps80031.c b/drivers/mfd/tps80031.c
> index ed6c5b0..6504959 100644
> --- a/drivers/mfd/tps80031.c
> +++ b/drivers/mfd/tps80031.c
> @@ -147,7 +147,6 @@ static const struct tps80031_pupd_data tps80031_pupds[] = {
>  	[TPS80031_CTLI2C_SCL]		= PUPD_DATA(4, 0,	BIT(2)),
>  	[TPS80031_CTLI2C_SDA]		= PUPD_DATA(4, 0,	BIT(3)),
>  };
> -static struct tps80031 *tps80031_power_off_dev;
>  
>  int tps80031_ext_power_req_config(struct device *dev,
>  		unsigned long ext_ctrl_flag, int preq_bit,
> @@ -209,11 +208,17 @@ int tps80031_ext_power_req_config(struct device *dev,
>  }
>  EXPORT_SYMBOL_GPL(tps80031_ext_power_req_config);
>  
> -static void tps80031_power_off(void)
> +static int tps80031_power_off(struct notifier_block *this,
> +			      unsigned long unused1, void *unused2)
>  {
> -	dev_info(tps80031_power_off_dev->dev, "switching off PMU\n");
> -	tps80031_write(tps80031_power_off_dev->dev, TPS80031_SLAVE_ID1,
> -				TPS80031_PHOENIX_DEV_ON, TPS80031_DEVOFF);
> +	struct tps80031 *tps80031 = container_of(this, struct tps80031,
> +						 power_off_nb);
> +
> +	dev_info(tps80031->dev, "switching off PMU\n");
> +	tps80031_write(tps80031->dev, TPS80031_SLAVE_ID1,
> +		       TPS80031_PHOENIX_DEV_ON, TPS80031_DEVOFF);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static void tps80031_pupd_init(struct tps80031 *tps80031,
> @@ -501,9 +506,13 @@ static int tps80031_probe(struct i2c_client *client,
>  		goto fail_mfd_add;
>  	}
>  
> -	if (pdata->use_power_off && !pm_power_off) {
> -		tps80031_power_off_dev = tps80031;
> -		pm_power_off = tps80031_power_off;
> +	if (pdata->use_power_off) {
> +		tps80031->power_off_nb.notifier_call = tps80031_power_off;
> +		tps80031->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = register_power_off_handler(&tps80031->power_off_nb);
> +		if (ret)
> +			dev_warn(&client->dev,
> +				 "Failed to register power-off handler\n");
>  	}
>  	return 0;
>  
> @@ -523,10 +532,7 @@ static int tps80031_remove(struct i2c_client *client)
>  	struct tps80031 *tps80031 = i2c_get_clientdata(client);
>  	int i;
>  
> -	if (tps80031_power_off_dev == tps80031) {
> -		tps80031_power_off_dev = NULL;
> -		pm_power_off = NULL;
> -	}
> +	unregister_power_off_handler(&tps80031->power_off_nb);
>  
>  	mfd_remove_devices(tps80031->dev);
>  
> diff --git a/include/linux/mfd/tps80031.h b/include/linux/mfd/tps80031.h
> index 2c75c9c..2c6afc2 100644
> --- a/include/linux/mfd/tps80031.h
> +++ b/include/linux/mfd/tps80031.h
> @@ -24,6 +24,7 @@
>  #define __LINUX_MFD_TPS80031_H
>  
>  #include <linux/device.h>
> +#include <linux/notifier.h>
>  #include <linux/regmap.h>
>  
>  /* Pull-ups/Pull-downs */
> @@ -513,6 +514,7 @@ struct tps80031 {
>  	struct i2c_client	*clients[TPS80031_NUM_SLAVES];
>  	struct regmap		*regmap[TPS80031_NUM_SLAVES];
>  	struct regmap_irq_chip_data *irq_data;
> +	struct notifier_block	power_off_nb;
>  };
>  
>  struct tps80031_pupd_init_data {

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 12/47] mfd: ab8500-sysctrl: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 12/47] mfd: ab8500-sysctrl: " Guenter Roeck
@ 2014-11-03 17:55   ` Lee Jones
  0 siblings, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:55 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-kernel, linux-pm, Linus Walleij, Samuel Ortiz,
	linux-arm-kernel

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> sysctrl_dev is set prior to power-off handler registration, and the
> power-off handler is unregistered prior to clearing sysrctrl_dev.
> It is therefore not necessary to check if sysctrl_dev is NULL in the
> power-off handler, and the check was removed. Setting sysctrl_dev to NULL
> in the remove function was also removed as unnecessary. With those changes,
> devm_register_power_off_handler can be used to register the poeroff handler.
> The now empty remove function was retained since the ab8500_restart function,
> which is currently unused, would likely need some cleanup if it was ever used.
> 
> Cc: Linus Walleij <linus.walleij@linaro.org>
> Cc: Lee Jones <lee.jones@linaro.org>
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use devm_register_power_off_handler
> - Use dev_warn instead of dev_err
> - Since we use devm_register_power_off_handler,
>   we need to check if sysctrl_dev in the poweroff handler to avoid
>   a race condition on unload, so this check is no longer removed
> 
>  drivers/mfd/ab8500-sysctrl.c | 23 ++++++++++++++++-------
>  1 file changed, 16 insertions(+), 7 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/ab8500-sysctrl.c b/drivers/mfd/ab8500-sysctrl.c
> index 8e0dae5..c49ecaf 100644
> --- a/drivers/mfd/ab8500-sysctrl.c
> +++ b/drivers/mfd/ab8500-sysctrl.c
> @@ -6,6 +6,7 @@
>  
>  #include <linux/err.h>
>  #include <linux/module.h>
> +#include <linux/notifier.h>
>  #include <linux/platform_device.h>
>  #include <linux/pm.h>
>  #include <linux/reboot.h>
> @@ -23,7 +24,8 @@
>  
>  static struct device *sysctrl_dev;
>  
> -static void ab8500_power_off(void)
> +static int ab8500_power_off(struct notifier_block *this, unsigned long unused1,
> +			    void *unused2)
>  {
>  	sigset_t old;
>  	sigset_t all;
> @@ -36,7 +38,7 @@ static void ab8500_power_off(void)
>  
>  	if (sysctrl_dev == NULL) {
>  		pr_err("%s: sysctrl not initialized\n", __func__);
> -		return;
> +		return NOTIFY_DONE;
>  	}
>  
>  	/*
> @@ -83,8 +85,15 @@ shutdown:
>  					 AB8500_STW4500CTRL1_SWRESET4500N);
>  		(void)sigprocmask(SIG_SETMASK, &old, NULL);
>  	}
> +
> +	return NOTIFY_DONE;
>  }
>  
> +static struct notifier_block ab8500_power_off_nb = {
> +	.notifier_call = ab8500_power_off,
> +	.priority = POWER_OFF_PRIORITY_LOW,
> +};
> +
>  /*
>   * Use the AB WD to reset the platform. It will perform a hard
>   * reset instead of a soft reset. Write the reset reason to
> @@ -185,6 +194,7 @@ static int ab8500_sysctrl_probe(struct platform_device *pdev)
>  	struct ab8500 *ab8500 = dev_get_drvdata(pdev->dev.parent);
>  	struct ab8500_platform_data *plat;
>  	struct ab8500_sysctrl_platform_data *pdata;
> +	int err;
>  
>  	plat = dev_get_platdata(pdev->dev.parent);
>  
> @@ -193,8 +203,10 @@ static int ab8500_sysctrl_probe(struct platform_device *pdev)
>  
>  	sysctrl_dev = &pdev->dev;
>  
> -	if (!pm_power_off)
> -		pm_power_off = ab8500_power_off;
> +	err = devm_register_power_off_handler(sysctrl_dev,
> +					      &ab8500_power_off_nb);
> +	if (err)
> +		dev_warn(&pdev->dev, "Failed to register power-off handler\n");
>  
>  	pdata = plat->sysctrl;
>  	if (pdata) {
> @@ -228,9 +240,6 @@ static int ab8500_sysctrl_remove(struct platform_device *pdev)
>  {
>  	sysctrl_dev = NULL;
>  
> -	if (pm_power_off == ab8500_power_off)
> -		pm_power_off = NULL;
> -
>  	return 0;
>  }
>  

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 13/47] mfd: max8907: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 13/47] mfd: max8907: " Guenter Roeck
@ 2014-11-03 17:56   ` Lee Jones
  0 siblings, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:56 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Note that this patch fixes a problem on driver unload as side effect:
> The old code did not restore or clean up pm_power_off on remove,
> meaning the pointer was left in an undefined state.
> 
> Cc: Lee Jones <lee.jones@linaro.org>
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/max8907.c       | 24 ++++++++++++++++++------
>  include/linux/mfd/max8907.h |  2 ++
>  2 files changed, 20 insertions(+), 6 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/max8907.c b/drivers/mfd/max8907.c
> index 232749c..a159230 100644
> --- a/drivers/mfd/max8907.c
> +++ b/drivers/mfd/max8907.c
> @@ -19,6 +19,7 @@
>  #include <linux/module.h>
>  #include <linux/of.h>
>  #include <linux/of_device.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/slab.h>
>  
> @@ -177,11 +178,16 @@ static const struct regmap_irq_chip max8907_rtc_irq_chip = {
>  	.num_irqs = ARRAY_SIZE(max8907_rtc_irqs),
>  };
>  
> -static struct max8907 *max8907_pm_off;
> -static void max8907_power_off(void)
> +static int max8907_power_off(struct notifier_block *this, unsigned long unused1,
> +			     void *unused2)
>  {
> -	regmap_update_bits(max8907_pm_off->regmap_gen, MAX8907_REG_RESET_CNFG,
> +	struct max8907 *max8907 = container_of(this, struct max8907,
> +					       power_off_nb);
> +
> +	regmap_update_bits(max8907->regmap_gen, MAX8907_REG_RESET_CNFG,
>  			MAX8907_MASK_POWER_OFF, MAX8907_MASK_POWER_OFF);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static int max8907_i2c_probe(struct i2c_client *i2c,
> @@ -267,9 +273,13 @@ static int max8907_i2c_probe(struct i2c_client *i2c,
>  		goto err_add_devices;
>  	}
>  
> -	if (pm_off && !pm_power_off) {
> -		max8907_pm_off = max8907;
> -		pm_power_off = max8907_power_off;
> +	if (pm_off) {
> +		max8907->power_off_nb.notifier_call = max8907_power_off;
> +		max8907->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = register_power_off_handler(&max8907->power_off_nb);
> +		if (ret)
> +			dev_warn(&i2c->dev,
> +				 "Failed to register power-off handler");
>  	}
>  
>  	return 0;
> @@ -293,6 +303,8 @@ static int max8907_i2c_remove(struct i2c_client *i2c)
>  {
>  	struct max8907 *max8907 = i2c_get_clientdata(i2c);
>  
> +	unregister_power_off_handler(&max8907->power_off_nb);
> +
>  	mfd_remove_devices(max8907->dev);
>  
>  	regmap_del_irq_chip(max8907->i2c_gen->irq, max8907->irqc_rtc);
> diff --git a/include/linux/mfd/max8907.h b/include/linux/mfd/max8907.h
> index b06f7a6..d8a341d 100644
> --- a/include/linux/mfd/max8907.h
> +++ b/include/linux/mfd/max8907.h
> @@ -13,6 +13,7 @@
>  #define __LINUX_MFD_MAX8907_H
>  
>  #include <linux/mutex.h>
> +#include <linux/notifier.h>
>  #include <linux/pm.h>
>  
>  #define MAX8907_GEN_I2C_ADDR		(0x78 >> 1)
> @@ -247,6 +248,7 @@ struct max8907 {
>  	struct regmap_irq_chip_data	*irqc_chg;
>  	struct regmap_irq_chip_data	*irqc_on_off;
>  	struct regmap_irq_chip_data	*irqc_rtc;
> +	struct notifier_block		power_off_nb;
>  };
>  
>  #endif

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 11/47] mfd: retu: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 11/47] mfd: retu: " Guenter Roeck
@ 2014-11-03 17:56   ` Lee Jones
  0 siblings, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:56 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Lee Jones <lee.jones@linaro.org>
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use devm_register_power_off_handler
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/retu-mfd.c | 33 +++++++++++++++++++--------------
>  1 file changed, 19 insertions(+), 14 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/retu-mfd.c b/drivers/mfd/retu-mfd.c
> index 663f8a3..7c657e6 100644
> --- a/drivers/mfd/retu-mfd.c
> +++ b/drivers/mfd/retu-mfd.c
> @@ -22,6 +22,8 @@
>  #include <linux/slab.h>
>  #include <linux/mutex.h>
>  #include <linux/module.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/mfd/core.h>
>  #include <linux/mfd/retu.h>
> @@ -43,6 +45,7 @@ struct retu_dev {
>  	struct device			*dev;
>  	struct mutex			mutex;
>  	struct regmap_irq_chip_data	*irq_data;
> +	struct notifier_block		power_off_nb;
>  };
>  
>  static struct resource retu_pwrbutton_res[] = {
> @@ -81,9 +84,6 @@ static struct regmap_irq_chip retu_irq_chip = {
>  	.ack_base	= RETU_REG_IDR,
>  };
>  
> -/* Retu device registered for the power off. */
> -static struct retu_dev *retu_pm_power_off;
> -
>  static struct resource tahvo_usb_res[] = {
>  	{
>  		.name	= "tahvo-usb",
> @@ -165,12 +165,14 @@ int retu_write(struct retu_dev *rdev, u8 reg, u16 data)
>  }
>  EXPORT_SYMBOL_GPL(retu_write);
>  
> -static void retu_power_off(void)
> +static int retu_power_off(struct notifier_block *this, unsigned long unused1,
> +			  void *unused2)
>  {
> -	struct retu_dev *rdev = retu_pm_power_off;
> +	struct retu_dev *rdev = container_of(this, struct retu_dev,
> +					     power_off_nb);
>  	int reg;
>  
> -	mutex_lock(&retu_pm_power_off->mutex);
> +	mutex_lock(&rdev->mutex);
>  
>  	/* Ignore power button state */
>  	regmap_read(rdev->regmap, RETU_REG_CC1, &reg);
> @@ -183,7 +185,9 @@ static void retu_power_off(void)
>  	for (;;)
>  		cpu_relax();
>  
> -	mutex_unlock(&retu_pm_power_off->mutex);
> +	mutex_unlock(&rdev->mutex);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static int retu_regmap_read(void *context, const void *reg, size_t reg_size,
> @@ -279,9 +283,14 @@ static int retu_probe(struct i2c_client *i2c, const struct i2c_device_id *id)
>  		return ret;
>  	}
>  
> -	if (i2c->addr == 1 && !pm_power_off) {
> -		retu_pm_power_off = rdev;
> -		pm_power_off	  = retu_power_off;
> +	if (i2c->addr == 1) {
> +		rdev->power_off_nb.notifier_call = retu_power_off;
> +		rdev->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = devm_register_power_off_handler(rdev->dev,
> +						      &rdev->power_off_nb);
> +		if (ret)
> +			dev_warn(rdev->dev,
> +				 "Failed to register power-off handler\n");
>  	}
>  
>  	return 0;
> @@ -291,10 +300,6 @@ static int retu_remove(struct i2c_client *i2c)
>  {
>  	struct retu_dev *rdev = i2c_get_clientdata(i2c);
>  
> -	if (retu_pm_power_off == rdev) {
> -		pm_power_off	  = NULL;
> -		retu_pm_power_off = NULL;
> -	}
>  	mfd_remove_devices(rdev->dev);
>  	regmap_del_irq_chip(i2c->irq, rdev->irq_data);
>  

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 18/47] mfd: twl4030-power: Register with kernel power-off handler
  2014-11-03 17:54   ` Lee Jones
@ 2014-11-03 17:56     ` Felipe Balbi
  0 siblings, 0 replies; 88+ messages in thread
From: Felipe Balbi @ 2014-11-03 17:56 UTC (permalink / raw)
  To: Lee Jones
  Cc: Guenter Roeck, linux-kernel, linux-pm, Samuel Ortiz,
	Tony Lindgren

[-- Attachment #1: Type: text/plain, Size: 5060 bytes --]

Hi,

On Mon, Nov 03, 2014 at 05:54:27PM +0000, Lee Jones wrote:
> On Mon, 27 Oct 2014, Guenter Roeck wrote:
> 
> > Register with kernel power-off handler instead of setting pm_power_off
> > directly. Register with low priority to reflect that the original code
> > only sets pm_power_off if it was not already set.
> > 
> > Make twl4030_power_off static as it is only called from the twl4030-power
> > driver. Drop remove function as it is no longer needed.
> > 
> > Cc: Samuel Ortiz <sameo@linux.intel.com>
> > Cc: Lee Jones <lee.jones@linaro.org>
> > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > ---
> > v3:
> > - Replace poweroff in all newly introduced variables and in text
> >   with power_off or power-off as appropriate
> > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > v2:
> > - Use define to specify poweroff handler priority
> > - Use dev_warn instead of dev_err
> > - Use devm_register_power_off_handler
> > - Drop remove function as it is no longer needed.
> > 
> >  drivers/mfd/twl4030-power.c | 29 +++++++++++++++++++----------
> >  include/linux/i2c/twl.h     |  1 -
> >  2 files changed, 19 insertions(+), 11 deletions(-)
> 
> Acked-by: Lee Jones <lee.jones@linaro.org>

this was not sent to lakml or linux-omap. Care to resend ?

> > diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
> > index cf92a6d..e36eea9 100644
> > --- a/drivers/mfd/twl4030-power.c
> > +++ b/drivers/mfd/twl4030-power.c
> > @@ -25,9 +25,10 @@
> >   */
> >  
> >  #include <linux/module.h>
> > -#include <linux/pm.h>
> > +#include <linux/notifier.h>
> >  #include <linux/i2c/twl.h>
> >  #include <linux/platform_device.h>
> > +#include <linux/pm.h>
> >  #include <linux/of.h>
> >  #include <linux/of_device.h>
> >  
> > @@ -611,7 +612,8 @@ twl4030_power_configure_resources(const struct twl4030_power_data *pdata)
> >   * After a successful execution, TWL shuts down the power to the SoC
> >   * and all peripherals connected to it.
> >   */
> > -void twl4030_power_off(void)
> > +static int twl4030_power_off(struct notifier_block *this, unsigned long unused1,
> > +			     void *unused2)
> >  {
> >  	int err;
> >  
> > @@ -619,8 +621,15 @@ void twl4030_power_off(void)
> >  			       TWL4030_PM_MASTER_P1_SW_EVENTS);
> >  	if (err)
> >  		pr_err("TWL4030 Unable to power off\n");
> > +
> > +	return NOTIFY_DONE;
> >  }
> >  
> > +static struct notifier_block twl4030_power_off_nb = {
> > +	.notifier_call = twl4030_power_off,
> > +	.priority = POWER_OFF_PRIORITY_LOW,
> > +};
> > +
> >  static bool twl4030_power_use_poweroff(const struct twl4030_power_data *pdata,
> >  					struct device_node *node)
> >  {
> > @@ -839,7 +848,9 @@ static int twl4030_power_probe(struct platform_device *pdev)
> >  	}
> >  
> >  	/* Board has to be wired properly to use this feature */
> > -	if (twl4030_power_use_poweroff(pdata, node) && !pm_power_off) {
> > +	if (twl4030_power_use_poweroff(pdata, node)) {
> > +		int ret;
> > +
> >  		/* Default for SEQ_OFFSYNC is set, lets ensure this */
> >  		err = twl_i2c_read_u8(TWL_MODULE_PM_MASTER, &val,
> >  				      TWL4030_PM_MASTER_CFG_P123_TRANSITION);
> > @@ -856,7 +867,11 @@ static int twl4030_power_probe(struct platform_device *pdev)
> >  			}
> >  		}
> >  
> > -		pm_power_off = twl4030_power_off;
> > +		ret = devm_register_power_off_handler(&pdev->dev,
> > +						      &twl4030_power_off_nb);
> > +		if (ret)
> > +			dev_warn(&pdev->dev,
> > +				 "Failed to register power-off handler\n");
> >  	}
> >  
> >  relock:
> > @@ -870,11 +885,6 @@ relock:
> >  	return err;
> >  }
> >  
> > -static int twl4030_power_remove(struct platform_device *pdev)
> > -{
> > -	return 0;
> > -}
> > -
> >  static struct platform_driver twl4030_power_driver = {
> >  	.driver = {
> >  		.name	= "twl4030_power",
> > @@ -882,7 +892,6 @@ static struct platform_driver twl4030_power_driver = {
> >  		.of_match_table = of_match_ptr(twl4030_power_of_match),
> >  	},
> >  	.probe		= twl4030_power_probe,
> > -	.remove		= twl4030_power_remove,
> >  };
> >  
> >  module_platform_driver(twl4030_power_driver);
> > diff --git a/include/linux/i2c/twl.h b/include/linux/i2c/twl.h
> > index 8cfb50f..f8544f1 100644
> > --- a/include/linux/i2c/twl.h
> > +++ b/include/linux/i2c/twl.h
> > @@ -680,7 +680,6 @@ struct twl4030_power_data {
> >  };
> >  
> >  extern int twl4030_remove_script(u8 flags);
> > -extern void twl4030_power_off(void);
> >  
> >  struct twl4030_codec_data {
> >  	unsigned int digimic_delay; /* in ms */
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 10/47] mfd: axp20x: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 10/47] mfd: axp20x: " Guenter Roeck
@ 2014-11-03 17:56   ` Lee Jones
  0 siblings, 0 replies; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:56 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with a low priority value of 64 to reflect that
> the original code only sets pm_power_off if it was not already set.
> 
> Cc: Lee Jones <lee.jones@linaro.org>
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify powroff handler priority
> - Use devm_register_power_off_handler
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/axp20x.c       | 30 ++++++++++++++++--------------
>  include/linux/mfd/axp20x.h |  1 +
>  2 files changed, 17 insertions(+), 14 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index 6231adb..f00db57 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -17,7 +17,8 @@
>  #include <linux/interrupt.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
> -#include <linux/pm_runtime.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/slab.h>
>  #include <linux/regulator/consumer.h>
> @@ -150,11 +151,16 @@ static struct mfd_cell axp20x_cells[] = {
>  	},
>  };
>  
> -static struct axp20x_dev *axp20x_pm_power_off;
> -static void axp20x_power_off(void)
> +static int axp20x_power_off(struct notifier_block *this, unsigned long unused1,
> +			    void *unused2)
> +
>  {
> -	regmap_write(axp20x_pm_power_off->regmap, AXP20X_OFF_CTRL,
> -		     AXP20X_OFF);
> +	struct axp20x_dev *axp20x = container_of(this, struct axp20x_dev,
> +						 power_off_nb);
> +
> +	regmap_write(axp20x->regmap, AXP20X_OFF_CTRL, AXP20X_OFF);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static int axp20x_i2c_probe(struct i2c_client *i2c,
> @@ -204,10 +210,11 @@ static int axp20x_i2c_probe(struct i2c_client *i2c,
>  		return ret;
>  	}
>  
> -	if (!pm_power_off) {
> -		axp20x_pm_power_off = axp20x;
> -		pm_power_off = axp20x_power_off;
> -	}
> +	axp20x->power_off_nb.notifier_call = axp20x_power_off;
> +	axp20x->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +	ret = devm_register_power_off_handler(&i2c->dev, &axp20x->power_off_nb);
> +	if (ret)
> +		dev_warn(&i2c->dev, "failed to register power-off handler\n");
>  
>  	dev_info(&i2c->dev, "AXP20X driver loaded\n");
>  
> @@ -218,11 +225,6 @@ static int axp20x_i2c_remove(struct i2c_client *i2c)
>  {
>  	struct axp20x_dev *axp20x = i2c_get_clientdata(i2c);
>  
> -	if (axp20x == axp20x_pm_power_off) {
> -		axp20x_pm_power_off = NULL;
> -		pm_power_off = NULL;
> -	}
> -
>  	mfd_remove_devices(axp20x->dev);
>  	regmap_del_irq_chip(axp20x->i2c_client->irq, axp20x->regmap_irqc);
>  
> diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
> index d0e31a2..9b15482 100644
> --- a/include/linux/mfd/axp20x.h
> +++ b/include/linux/mfd/axp20x.h
> @@ -175,6 +175,7 @@ struct axp20x_dev {
>  	struct regmap			*regmap;
>  	struct regmap_irq_chip_data	*regmap_irqc;
>  	long				variant;
> +	struct notifier_block		power_off_nb;
>  };
>  
>  #endif /* __LINUX_MFD_AXP20X_H */

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler Guenter Roeck
@ 2014-11-03 17:56   ` Lee Jones
  2014-11-03 17:59     ` Felipe Balbi
  0 siblings, 1 reply; 88+ messages in thread
From: Lee Jones @ 2014-11-03 17:56 UTC (permalink / raw)
  To: Guenter Roeck; +Cc: linux-kernel, linux-pm, Samuel Ortiz

On Mon, 27 Oct 2014, Guenter Roeck wrote:

> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use devm_register_power_off_handler
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/palmas.c       | 31 +++++++++++++++++--------------
>  include/linux/mfd/palmas.h |  3 +++
>  2 files changed, 20 insertions(+), 14 deletions(-)

Acked-by: Lee Jones <lee.jones@linaro.org>

> diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c
> index 28cb048..99c488e 100644
> --- a/drivers/mfd/palmas.c
> +++ b/drivers/mfd/palmas.c
> @@ -19,6 +19,7 @@
>  #include <linux/i2c.h>
>  #include <linux/interrupt.h>
>  #include <linux/irq.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/err.h>
>  #include <linux/mfd/core.h>
> @@ -425,20 +426,18 @@ static void palmas_dt_to_pdata(struct i2c_client *i2c,
>  			"ti,system-power-controller");
>  }
>  
> -static struct palmas *palmas_dev;
> -static void palmas_power_off(void)
> +static int palmas_power_off(struct notifier_block *this, unsigned long unused1,
> +			    void *unused2)
>  {
> +	struct palmas *palmas = container_of(this, struct palmas, power_off_nb);
>  	unsigned int addr;
>  	int ret, slave;
>  
> -	if (!palmas_dev)
> -		return;
> -
>  	slave = PALMAS_BASE_TO_SLAVE(PALMAS_PMU_CONTROL_BASE);
>  	addr = PALMAS_BASE_TO_REG(PALMAS_PMU_CONTROL_BASE, PALMAS_DEV_CTRL);
>  
>  	ret = regmap_update_bits(
> -			palmas_dev->regmap[slave],
> +			palmas->regmap[slave],
>  			addr,
>  			PALMAS_DEV_CTRL_DEV_ON,
>  			0);
> @@ -446,6 +445,8 @@ static void palmas_power_off(void)
>  	if (ret)
>  		pr_err("%s: Unable to write to DEV_CTRL_DEV_ON: %d\n",
>  				__func__, ret);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static unsigned int palmas_features = PALMAS_PMIC_FEATURE_SMPS10_BOOST;
> @@ -668,9 +669,16 @@ no_irq:
>  		ret = of_platform_populate(node, NULL, NULL, &i2c->dev);
>  		if (ret < 0) {
>  			goto err_irq;
> -		} else if (pdata->pm_off && !pm_power_off) {
> -			palmas_dev = palmas;
> -			pm_power_off = palmas_power_off;
> +		} else if (pdata->pm_off) {
> +			int ret2;
> +
> +			palmas->power_off_nb.notifier_call = palmas_power_off;
> +			palmas->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +			ret2 = devm_register_power_off_handler(palmas->dev,
> +							&palmas->power_off_nb);
> +			if (ret2)
> +				dev_warn(palmas->dev,
> +					 "Failed to register power-off handler");
>  		}
>  	}
>  
> @@ -698,11 +706,6 @@ static int palmas_i2c_remove(struct i2c_client *i2c)
>  			i2c_unregister_device(palmas->i2c_clients[i]);
>  	}
>  
> -	if (palmas == palmas_dev) {
> -		pm_power_off = NULL;
> -		palmas_dev = NULL;
> -	}
> -
>  	return 0;
>  }
>  
> diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h
> index fb0390a..7dbfe24 100644
> --- a/include/linux/mfd/palmas.h
> +++ b/include/linux/mfd/palmas.h
> @@ -18,6 +18,7 @@
>  
>  #include <linux/usb/otg.h>
>  #include <linux/leds.h>
> +#include <linux/notifier.h>
>  #include <linux/regmap.h>
>  #include <linux/regulator/driver.h>
>  #include <linux/extcon.h>
> @@ -68,6 +69,8 @@ struct palmas {
>  	struct i2c_client *i2c_clients[PALMAS_NUM_CLIENTS];
>  	struct regmap *regmap[PALMAS_NUM_CLIENTS];
>  
> +	struct notifier_block power_off_nb;
> +
>  	/* Stored chip id */
>  	int id;
>  

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 16/47] mfd: tps6586x: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 16/47] mfd: tps6586x: " Guenter Roeck
  2014-11-03 17:54   ` Lee Jones
@ 2014-11-03 17:57   ` Felipe Balbi
  1 sibling, 0 replies; 88+ messages in thread
From: Felipe Balbi @ 2014-11-03 17:57 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-kernel, linux-pm, Samuel Ortiz, Lee Jones, Tony Lindgren,
	Linux OMAP Mailing List, Linux ARM Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 3729 bytes --]

On Mon, Oct 27, 2014 at 08:55:23AM -0700, Guenter Roeck wrote:
> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>

should be sent to linux-omap and lakml too

> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/tps6586x.c | 31 +++++++++++++++++++++++--------
>  1 file changed, 23 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c
> index 8e1dbc4..1e97478 100644
> --- a/drivers/mfd/tps6586x.c
> +++ b/drivers/mfd/tps6586x.c
> @@ -21,10 +21,12 @@
>  #include <linux/kernel.h>
>  #include <linux/module.h>
>  #include <linux/mutex.h>
> +#include <linux/notifier.h>
>  #include <linux/slab.h>
>  #include <linux/err.h>
>  #include <linux/i2c.h>
>  #include <linux/platform_device.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/of.h>
>  
> @@ -133,6 +135,8 @@ struct tps6586x {
>  	u32			irq_en;
>  	u8			mask_reg[5];
>  	struct irq_domain	*irq_domain;
> +
> +	struct notifier_block	power_off_nb;
>  };
>  
>  static inline struct tps6586x *dev_to_tps6586x(struct device *dev)
> @@ -472,13 +476,18 @@ static const struct regmap_config tps6586x_regmap_config = {
>  	.cache_type = REGCACHE_RBTREE,
>  };
>  
> -static struct device *tps6586x_dev;
> -static void tps6586x_power_off(void)
> +static int tps6586x_power_off(struct notifier_block *this,
> +			      unsigned long unused1, void *unused2)
>  {
> -	if (tps6586x_clr_bits(tps6586x_dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT))
> -		return;
> +	struct tps6586x *tps6586x = container_of(this, struct tps6586x,
> +						 power_off_nb);
> +
> +	if (tps6586x_clr_bits(tps6586x->dev, TPS6586X_SUPPLYENE, EXITSLREQ_BIT))
> +		return NOTIFY_DONE;
>  
> -	tps6586x_set_bits(tps6586x_dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
> +	tps6586x_set_bits(tps6586x->dev, TPS6586X_SUPPLYENE, SLEEP_MODE_BIT);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static void tps6586x_print_version(struct i2c_client *client, int version)
> @@ -575,9 +584,13 @@ static int tps6586x_i2c_probe(struct i2c_client *client,
>  		goto err_add_devs;
>  	}
>  
> -	if (pdata->pm_off && !pm_power_off) {
> -		tps6586x_dev = &client->dev;
> -		pm_power_off = tps6586x_power_off;
> +	if (pdata->pm_off) {
> +		tps6586x->power_off_nb.notifier_call = tps6586x_power_off;
> +		tps6586x->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = register_power_off_handler(&tps6586x->power_off_nb);
> +		if (ret)
> +			dev_warn(&client->dev,
> +				 "failed to register power-off handler\n");
>  	}
>  
>  	return 0;
> @@ -594,6 +607,8 @@ static int tps6586x_i2c_remove(struct i2c_client *client)
>  {
>  	struct tps6586x *tps6586x = i2c_get_clientdata(client);
>  
> +	unregister_power_off_handler(&tps6586x->power_off_nb);
> +
>  	tps6586x_remove_subdevs(tps6586x);
>  	mfd_remove_devices(tps6586x->dev);
>  	if (client->irq)
> -- 
> 1.9.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 17/47] mfd: tps65910: Register with kernel power-off handler
  2014-10-27 15:55 ` [PATCH v3 17/47] mfd: tps65910: " Guenter Roeck
  2014-11-03 17:54   ` Lee Jones
@ 2014-11-03 17:57   ` Felipe Balbi
  1 sibling, 0 replies; 88+ messages in thread
From: Felipe Balbi @ 2014-11-03 17:57 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-kernel, linux-pm, Samuel Ortiz, Lee Jones, Tony Lindgren,
	Linux OMAP Mailing List, Linux ARM Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 3894 bytes --]

On Mon, Oct 27, 2014 at 08:55:24AM -0700, Guenter Roeck wrote:
> Register with kernel power-off handler instead of setting pm_power_off
> directly. Register with low priority to reflect that the original code
> only sets pm_power_off if it was not already set.
> 
> Cc: Samuel Ortiz <sameo@linux.intel.com>
> Cc: Lee Jones <lee.jones@linaro.org>
> Signed-off-by: Guenter Roeck <linux@roeck-us.net>

missed lakml and linux-omap here too

> ---
> v3:
> - Replace poweroff in all newly introduced variables and in text
>   with power_off or power-off as appropriate
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> v2:
> - Use define to specify poweroff handler priority
> - Use dev_warn instead of dev_err
> 
>  drivers/mfd/tps65910.c       | 27 ++++++++++++++++++---------
>  include/linux/mfd/tps65910.h |  3 +++
>  2 files changed, 21 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c
> index 7612d89..3c94dbf 100644
> --- a/drivers/mfd/tps65910.c
> +++ b/drivers/mfd/tps65910.c
> @@ -23,6 +23,8 @@
>  #include <linux/irq.h>
>  #include <linux/irqdomain.h>
>  #include <linux/mfd/core.h>
> +#include <linux/notifier.h>
> +#include <linux/pm.h>
>  #include <linux/regmap.h>
>  #include <linux/mfd/tps65910.h>
>  #include <linux/of.h>
> @@ -437,19 +439,20 @@ struct tps65910_board *tps65910_parse_dt(struct i2c_client *client,
>  }
>  #endif
>  
> -static struct i2c_client *tps65910_i2c_client;
> -static void tps65910_power_off(void)
> +static int tps65910_power_off(struct notifier_block *this,
> +			      unsigned long unused1, void *unused2)
>  {
> -	struct tps65910 *tps65910;
> -
> -	tps65910 = dev_get_drvdata(&tps65910_i2c_client->dev);
> +	struct tps65910 *tps65910 = container_of(this, struct tps65910,
> +						 power_off_nb);
>  
>  	if (tps65910_reg_set_bits(tps65910, TPS65910_DEVCTRL,
>  			DEVCTRL_PWR_OFF_MASK) < 0)
> -		return;
> +		return NOTIFY_DONE;
>  
>  	tps65910_reg_clear_bits(tps65910, TPS65910_DEVCTRL,
>  			DEVCTRL_DEV_ON_MASK);
> +
> +	return NOTIFY_DONE;
>  }
>  
>  static int tps65910_i2c_probe(struct i2c_client *i2c,
> @@ -505,9 +508,13 @@ static int tps65910_i2c_probe(struct i2c_client *i2c,
>  	tps65910_ck32k_init(tps65910, pmic_plat_data);
>  	tps65910_sleepinit(tps65910, pmic_plat_data);
>  
> -	if (pmic_plat_data->pm_off && !pm_power_off) {
> -		tps65910_i2c_client = i2c;
> -		pm_power_off = tps65910_power_off;
> +	if (pmic_plat_data->pm_off) {
> +		tps65910->power_off_nb.notifier_call = tps65910_power_off;
> +		tps65910->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> +		ret = register_power_off_handler(&tps65910->power_off_nb);
> +		if (ret)
> +			dev_warn(&i2c->dev,
> +				 "failed to register power-off handler\n");
>  	}
>  
>  	ret = mfd_add_devices(tps65910->dev, -1,
> @@ -527,6 +534,8 @@ static int tps65910_i2c_remove(struct i2c_client *i2c)
>  {
>  	struct tps65910 *tps65910 = i2c_get_clientdata(i2c);
>  
> +	unregister_power_off_handler(&tps65910->power_off_nb);
> +
>  	tps65910_irq_exit(tps65910);
>  	mfd_remove_devices(tps65910->dev);
>  
> diff --git a/include/linux/mfd/tps65910.h b/include/linux/mfd/tps65910.h
> index 6483a6f..94876c4 100644
> --- a/include/linux/mfd/tps65910.h
> +++ b/include/linux/mfd/tps65910.h
> @@ -905,6 +905,9 @@ struct tps65910 {
>  	/* IRQ Handling */
>  	int chip_irq;
>  	struct regmap_irq_chip_data *irq_data;
> +
> +	/* Power-off handling */
> +	struct notifier_block power_off_nb;
>  };
>  
>  struct tps65910_platform_data {
> -- 
> 1.9.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 00/47] kernel: Add support for power-off handler call chain
  2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
                   ` (45 preceding siblings ...)
  2014-10-27 16:03 ` [PATCH v3 00/47] kernel: Add support for power-off handler call chain Felipe Balbi
@ 2014-11-03 17:59 ` Felipe Balbi
  2014-11-03 18:22   ` Guenter Roeck
  46 siblings, 1 reply; 88+ messages in thread
From: Felipe Balbi @ 2014-11-03 17:59 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Alan Cox, Linux OMAP Mailing List, Russell King, Heiko Stuebner,
	Len Brown, linux-pm, Tony Lindgren, Rafael J. Wysocki,
	Alexander Graf, linux-kernel, Geert Uytterhoeven, Pavel Machek,
	Andrew Morton, Romain Perier, Lee Jones,
	Linux ARM Kernel Mailing List


[-- Attachment #1.1: Type: text/plain, Size: 7066 bytes --]

Hi,

On Mon, Oct 27, 2014 at 08:55:07AM -0700, Guenter Roeck wrote:
> Various drivers implement architecture and/or device specific means to
> remove power from the system.  For the most part, those drivers set the
> global variable pm_power_off to point to a function within the driver.
> 
> This mechanism has a number of drawbacks.  Typically only one means
> to remove power is supported (at least if pm_power_off is used).
> At least in theory there can be multiple means to remove power, some of
> which may be less desirable.  For example, one mechanism might power off the
> entire system through an I/O port or gpio pin, while another might power off
> a board by disabling its power controller. Other mechanisms may really just
> execute a restart sequence or drop into the ROM monitor, or put the CPU into
> sleep mode.  Using pm_power_off can also be racy if the function pointer is
> set from a driver built as module, as the driver may be in the process of
> being unloaded when pm_power_off is called.  If there are multiple power-off
> handlers in the system, removing a module with such a handler may
> inadvertently reset the pointer to pm_power_off to NULL, leaving the system
> with no means to remove power.
> 
> Introduce a system power-off handler call chain to solve the described
> problems.  This call chain is expected to be executed from the architecture
> specific machine_power_off() function.  Drivers providing system power-off
> functionality are expected to register with this call chain.  By using the
> priority field in the notifier block, callers can control power-off handler
> execution sequence and thus ensure that the power-off handler with the
> optimal capabilities to remove power for a given system is called first.
> A call chain instead of a single call to the highest priority handler is
> used to provide fallback: If multiple power-off handlers are installed,
> all handlers will be called until one actually succeeds to power off the
> system.
> 
> Patch 01/47 implements the power-off handler API.
> 
> Patches 02/47 to 04/47 are cleanup patches to prepare for the move of
> pm_power_off to a common location.
> 
> Patches 05/47 to 07/47 remove references to pm_power_off from devicetree
> bindings descriptions.
> 
> Patch 08/47 moves the pm_power_off variable from architecture code to
> kernel/reboot.c. 
> 
> Patches 09/47 to 34/47 convert various drivers to register with the kernel
> power-off handler instead of setting pm_power_off directly.
> 
> Patches 35/47 to 46/47 do the same for architecture code.
> 
> Patch 47/47 finally removes pm_power_off.
> 
> For the most part, the individual patches include explanations why specific
> priorities were chosen, at least if the selected priority is not the default
> priority. Subsystem and architecture maintainers are encouraged to have a look
> at the selected priorities and suggest improvements.
> 
> I ran the final code through my normal build and qemu tests. Results are
> available at http://server.roeck-us.net:8010/builders in the 'poweroff-handler'
> column. I also built all available configurations for arm, mips, powerpc,
> m68k, and sh architectures.
> 
> The series is available in branch poweroff-handler of my repository at
> git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git.
> It is based on 3.18-rc2.
> 
> A note on Cc: In the initial submission I had way too many Cc:, causing the
> patchset to be treated as spam by many mailers and mailing list handlers,
> which of course defeated the purpose. This time around I am cutting down
> the distribution list down significantly. My apologies to anyone I may have
> failed to copy this time around.

you touch every single architecture with this patchset, but you didn't
care about Ccing any of the arch-specific mailing lists, like lakml ?

Please resend with proper people in Cc, IIRC RMK had a few very
important comments about the idea behind this series.

> Important changes since v2:
> - Rebased series to v3.18-rc2.
> - Do not hold any locks while executing the power-off call chain.
>   This ensures that power-off handlers are executed in the state
>   selected by the machine_power_off function for a given architecture,
>   ie without changing the current semantics of power-off callbacks and
>   machine_power_off functions.
>   Power-off handler registration and de-registration is handled in atomic
>   context with interrupts disabled to ensure that those functions are not
>   interrupted by code which powers off the system.
> - Use [xxx_]power_off[_xxx] instead of [xxx_]poweroff[_xxx] for newly
>   introduced function and variable names.
> - Use power-off instead of poweroff in descriptive text and comments.
> - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> - Use ACPI: instead of acpi: for messages in acpi code.
> 
> Important changes since v1:
> - Rebased series to v3.18-rc1.
> - Use raw notifier with spinlock protection instead of atomic notifiers,
>   since some power-off handlers need to have interrupts enabled.
> - Renamed API functions from _poweroff to _power_off.
> - Added various Acks.
> - Build tested all configurations for arm, powerpc, and mips architectures.
> - Fixed two compile errors in mips patch.
> - Replaced dev_err and pr_err with dev_warn and pr_warn if an error is not
>   fatal.
> - Provide managed resources API and use where appropriate.
> - Provide and use definitions for standard priorities.
> - Added patches to convert newly introduced power-off handlers.
> - Various minor changes.
> 
> Important changes since RFC:
> - Move API to new file kernel/power/power_off_handler.c.
> - Move pm_power_off pointer to kernel/power/power_off_handler.c. Call
>   pm_power_off from do_kernel_power_off, and only call do_kernel_power_off
>   from architecture code instead of calling both pm_power_off and
>   do_kernel_power_off.
> - Provide additional API function register_power_off_handler_simple
>   to simplify conversion of architecture code.
> - Provide additional API function have_kernel_power_off to check if
>   a power-off handler was installed.
> - Convert all drivers and architecture code to use the new API.
> - Remove pm_power_off as last patch of the series.
> 
> Cc: Alan Cox <gnomes@lxorguk.ukuu.org.uk>
> Cc: Alexander Graf <agraf@suse.de>
> Cc: Andrew Morton <akpm@linux-foundation.org>
> Cc: Geert Uytterhoeven <geert@linux-m68k.org>
> cc: Heiko Stuebner <heiko@sntech.de>
> Cc: Lee Jones <lee.jones@linaro.org>
> Cc: Len Brown <len.brown@intel.com>
> Cc: Pavel Machek <pavel@ucw.cz>
> Cc: Rafael J. Wysocki <rjw@rjwysocki.net>
> Cc: Romain Perier <romain.perier@gmail.com>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
balbi

[-- Attachment #1.2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

[-- Attachment #2: Type: text/plain, Size: 176 bytes --]

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler
  2014-11-03 17:56   ` Lee Jones
@ 2014-11-03 17:59     ` Felipe Balbi
  2014-11-03 18:36       ` Guenter Roeck
  0 siblings, 1 reply; 88+ messages in thread
From: Felipe Balbi @ 2014-11-03 17:59 UTC (permalink / raw)
  To: Lee Jones
  Cc: Guenter Roeck, linux-kernel, linux-pm, Samuel Ortiz,
	Linux OMAP Mailing List, Linux ARM Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 4692 bytes --]

On Mon, Nov 03, 2014 at 05:56:45PM +0000, Lee Jones wrote:
> On Mon, 27 Oct 2014, Guenter Roeck wrote:
> 
> > Register with kernel power-off handler instead of setting pm_power_off
> > directly. Register with low priority to reflect that the original code
> > only sets pm_power_off if it was not already set.
> > 
> > Cc: Samuel Ortiz <sameo@linux.intel.com>
> > Cc: Lee Jones <lee.jones@linaro.org>
> > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > ---
> > v3:
> > - Replace poweroff in all newly introduced variables and in text
> >   with power_off or power-off as appropriate
> > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > v2:
> > - Use define to specify poweroff handler priority
> > - Use devm_register_power_off_handler
> > - Use dev_warn instead of dev_err
> > 
> >  drivers/mfd/palmas.c       | 31 +++++++++++++++++--------------
> >  include/linux/mfd/palmas.h |  3 +++
> >  2 files changed, 20 insertions(+), 14 deletions(-)
> 
> Acked-by: Lee Jones <lee.jones@linaro.org>

missed lakml and linux-omap.

> 
> > diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c
> > index 28cb048..99c488e 100644
> > --- a/drivers/mfd/palmas.c
> > +++ b/drivers/mfd/palmas.c
> > @@ -19,6 +19,7 @@
> >  #include <linux/i2c.h>
> >  #include <linux/interrupt.h>
> >  #include <linux/irq.h>
> > +#include <linux/pm.h>
> >  #include <linux/regmap.h>
> >  #include <linux/err.h>
> >  #include <linux/mfd/core.h>
> > @@ -425,20 +426,18 @@ static void palmas_dt_to_pdata(struct i2c_client *i2c,
> >  			"ti,system-power-controller");
> >  }
> >  
> > -static struct palmas *palmas_dev;
> > -static void palmas_power_off(void)
> > +static int palmas_power_off(struct notifier_block *this, unsigned long unused1,
> > +			    void *unused2)
> >  {
> > +	struct palmas *palmas = container_of(this, struct palmas, power_off_nb);
> >  	unsigned int addr;
> >  	int ret, slave;
> >  
> > -	if (!palmas_dev)
> > -		return;
> > -
> >  	slave = PALMAS_BASE_TO_SLAVE(PALMAS_PMU_CONTROL_BASE);
> >  	addr = PALMAS_BASE_TO_REG(PALMAS_PMU_CONTROL_BASE, PALMAS_DEV_CTRL);
> >  
> >  	ret = regmap_update_bits(
> > -			palmas_dev->regmap[slave],
> > +			palmas->regmap[slave],
> >  			addr,
> >  			PALMAS_DEV_CTRL_DEV_ON,
> >  			0);
> > @@ -446,6 +445,8 @@ static void palmas_power_off(void)
> >  	if (ret)
> >  		pr_err("%s: Unable to write to DEV_CTRL_DEV_ON: %d\n",
> >  				__func__, ret);
> > +
> > +	return NOTIFY_DONE;
> >  }
> >  
> >  static unsigned int palmas_features = PALMAS_PMIC_FEATURE_SMPS10_BOOST;
> > @@ -668,9 +669,16 @@ no_irq:
> >  		ret = of_platform_populate(node, NULL, NULL, &i2c->dev);
> >  		if (ret < 0) {
> >  			goto err_irq;
> > -		} else if (pdata->pm_off && !pm_power_off) {
> > -			palmas_dev = palmas;
> > -			pm_power_off = palmas_power_off;
> > +		} else if (pdata->pm_off) {
> > +			int ret2;
> > +
> > +			palmas->power_off_nb.notifier_call = palmas_power_off;
> > +			palmas->power_off_nb.priority = POWER_OFF_PRIORITY_LOW;
> > +			ret2 = devm_register_power_off_handler(palmas->dev,
> > +							&palmas->power_off_nb);
> > +			if (ret2)
> > +				dev_warn(palmas->dev,
> > +					 "Failed to register power-off handler");
> >  		}
> >  	}
> >  
> > @@ -698,11 +706,6 @@ static int palmas_i2c_remove(struct i2c_client *i2c)
> >  			i2c_unregister_device(palmas->i2c_clients[i]);
> >  	}
> >  
> > -	if (palmas == palmas_dev) {
> > -		pm_power_off = NULL;
> > -		palmas_dev = NULL;
> > -	}
> > -
> >  	return 0;
> >  }
> >  
> > diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h
> > index fb0390a..7dbfe24 100644
> > --- a/include/linux/mfd/palmas.h
> > +++ b/include/linux/mfd/palmas.h
> > @@ -18,6 +18,7 @@
> >  
> >  #include <linux/usb/otg.h>
> >  #include <linux/leds.h>
> > +#include <linux/notifier.h>
> >  #include <linux/regmap.h>
> >  #include <linux/regulator/driver.h>
> >  #include <linux/extcon.h>
> > @@ -68,6 +69,8 @@ struct palmas {
> >  	struct i2c_client *i2c_clients[PALMAS_NUM_CLIENTS];
> >  	struct regmap *regmap[PALMAS_NUM_CLIENTS];
> >  
> > +	struct notifier_block power_off_nb;
> > +
> >  	/* Stored chip id */
> >  	int id;
> >  
> 
> -- 
> Lee Jones
> Linaro STMicroelectronics Landing Team Lead
> Linaro.org │ Open source software for ARM SoCs
> Follow Linaro: Facebook | Twitter | Blog
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 00/47] kernel: Add support for power-off handler call chain
  2014-11-03 17:59 ` Felipe Balbi
@ 2014-11-03 18:22   ` Guenter Roeck
  2014-11-03 18:28     ` Felipe Balbi
  0 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-11-03 18:22 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: linux-kernel, linux-pm, Alan Cox, Alexander Graf, Andrew Morton,
	Geert Uytterhoeven, Heiko Stuebner, Lee Jones, Len Brown,
	Pavel Machek, Rafael J. Wysocki, Romain Perier,
	Linux ARM Kernel Mailing List, Linux OMAP Mailing List,
	Tony Lindgren, Russell King

On Mon, Nov 03, 2014 at 11:59:35AM -0600, Felipe Balbi wrote:
> Hi,
> 
> On Mon, Oct 27, 2014 at 08:55:07AM -0700, Guenter Roeck wrote:
> > Various drivers implement architecture and/or device specific means to
> > remove power from the system.  For the most part, those drivers set the
> > global variable pm_power_off to point to a function within the driver.
> > 
> > This mechanism has a number of drawbacks.  Typically only one means
> > to remove power is supported (at least if pm_power_off is used).
> > At least in theory there can be multiple means to remove power, some of
> > which may be less desirable.  For example, one mechanism might power off the
> > entire system through an I/O port or gpio pin, while another might power off
> > a board by disabling its power controller. Other mechanisms may really just
> > execute a restart sequence or drop into the ROM monitor, or put the CPU into
> > sleep mode.  Using pm_power_off can also be racy if the function pointer is
> > set from a driver built as module, as the driver may be in the process of
> > being unloaded when pm_power_off is called.  If there are multiple power-off
> > handlers in the system, removing a module with such a handler may
> > inadvertently reset the pointer to pm_power_off to NULL, leaving the system
> > with no means to remove power.
> > 
> > Introduce a system power-off handler call chain to solve the described
> > problems.  This call chain is expected to be executed from the architecture
> > specific machine_power_off() function.  Drivers providing system power-off
> > functionality are expected to register with this call chain.  By using the
> > priority field in the notifier block, callers can control power-off handler
> > execution sequence and thus ensure that the power-off handler with the
> > optimal capabilities to remove power for a given system is called first.
> > A call chain instead of a single call to the highest priority handler is
> > used to provide fallback: If multiple power-off handlers are installed,
> > all handlers will be called until one actually succeeds to power off the
> > system.
> > 
> > Patch 01/47 implements the power-off handler API.
> > 
> > Patches 02/47 to 04/47 are cleanup patches to prepare for the move of
> > pm_power_off to a common location.
> > 
> > Patches 05/47 to 07/47 remove references to pm_power_off from devicetree
> > bindings descriptions.
> > 
> > Patch 08/47 moves the pm_power_off variable from architecture code to
> > kernel/reboot.c. 
> > 
> > Patches 09/47 to 34/47 convert various drivers to register with the kernel
> > power-off handler instead of setting pm_power_off directly.
> > 
> > Patches 35/47 to 46/47 do the same for architecture code.
> > 
> > Patch 47/47 finally removes pm_power_off.
> > 
> > For the most part, the individual patches include explanations why specific
> > priorities were chosen, at least if the selected priority is not the default
> > priority. Subsystem and architecture maintainers are encouraged to have a look
> > at the selected priorities and suggest improvements.
> > 
> > I ran the final code through my normal build and qemu tests. Results are
> > available at http://server.roeck-us.net:8010/builders in the 'poweroff-handler'
> > column. I also built all available configurations for arm, mips, powerpc,
> > m68k, and sh architectures.
> > 
> > The series is available in branch poweroff-handler of my repository at
> > git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git.
> > It is based on 3.18-rc2.
> > 
> > A note on Cc: In the initial submission I had way too many Cc:, causing the
> > patchset to be treated as spam by many mailers and mailing list handlers,
> > which of course defeated the purpose. This time around I am cutting down
> > the distribution list down significantly. My apologies to anyone I may have
> > failed to copy this time around.
> 
> you touch every single architecture with this patchset, but you didn't
> care about Ccing any of the arch-specific mailing lists, like lakml ?
> 
What is lakml ? linux-kernel@vger.kernel.org was copied, if that is what you
refer to. I don't find a reference to lakml anywhere, sorry. I'll be happy to
add it manually if you provide the address.

Architecture specific mailing lists were copied on individual patches as long
as those mailing lists are reported by the MAINTAINERS file.

> Please resend with proper people in Cc, IIRC RMK had a few very
> important comments about the idea behind this series.
> 
Felipe,

That doesn't work. I tried with rev 1. The result was that the patch series
was flagged as spam and got dropped by most mailing lists, as explained above,
and I got tagged as spammer by Google and several other mail servers,
preventing me from posting _anything_ for several days.

Please point me to the comments you refer to above in case I missed them.

Thanks,
Guenter

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 00/47] kernel: Add support for power-off handler call chain
  2014-11-03 18:22   ` Guenter Roeck
@ 2014-11-03 18:28     ` Felipe Balbi
  2014-11-03 18:49       ` Guenter Roeck
  0 siblings, 1 reply; 88+ messages in thread
From: Felipe Balbi @ 2014-11-03 18:28 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Felipe Balbi, linux-kernel, linux-pm, Alan Cox, Alexander Graf,
	Andrew Morton, Geert Uytterhoeven, Heiko Stuebner, Lee Jones,
	Len Brown, Pavel Machek, Rafael J. Wysocki, Romain Perier,
	Linux ARM Kernel Mailing List, Linux OMAP Mailing List,
	Tony Lindgren, Russell King

[-- Attachment #1: Type: text/plain, Size: 5272 bytes --]

Hi,

On Mon, Nov 03, 2014 at 10:22:13AM -0800, Guenter Roeck wrote:
> On Mon, Nov 03, 2014 at 11:59:35AM -0600, Felipe Balbi wrote:
> > Hi,
> > 
> > On Mon, Oct 27, 2014 at 08:55:07AM -0700, Guenter Roeck wrote:
> > > Various drivers implement architecture and/or device specific means to
> > > remove power from the system.  For the most part, those drivers set the
> > > global variable pm_power_off to point to a function within the driver.
> > > 
> > > This mechanism has a number of drawbacks.  Typically only one means
> > > to remove power is supported (at least if pm_power_off is used).
> > > At least in theory there can be multiple means to remove power, some of
> > > which may be less desirable.  For example, one mechanism might power off the
> > > entire system through an I/O port or gpio pin, while another might power off
> > > a board by disabling its power controller. Other mechanisms may really just
> > > execute a restart sequence or drop into the ROM monitor, or put the CPU into
> > > sleep mode.  Using pm_power_off can also be racy if the function pointer is
> > > set from a driver built as module, as the driver may be in the process of
> > > being unloaded when pm_power_off is called.  If there are multiple power-off
> > > handlers in the system, removing a module with such a handler may
> > > inadvertently reset the pointer to pm_power_off to NULL, leaving the system
> > > with no means to remove power.
> > > 
> > > Introduce a system power-off handler call chain to solve the described
> > > problems.  This call chain is expected to be executed from the architecture
> > > specific machine_power_off() function.  Drivers providing system power-off
> > > functionality are expected to register with this call chain.  By using the
> > > priority field in the notifier block, callers can control power-off handler
> > > execution sequence and thus ensure that the power-off handler with the
> > > optimal capabilities to remove power for a given system is called first.
> > > A call chain instead of a single call to the highest priority handler is
> > > used to provide fallback: If multiple power-off handlers are installed,
> > > all handlers will be called until one actually succeeds to power off the
> > > system.
> > > 
> > > Patch 01/47 implements the power-off handler API.
> > > 
> > > Patches 02/47 to 04/47 are cleanup patches to prepare for the move of
> > > pm_power_off to a common location.
> > > 
> > > Patches 05/47 to 07/47 remove references to pm_power_off from devicetree
> > > bindings descriptions.
> > > 
> > > Patch 08/47 moves the pm_power_off variable from architecture code to
> > > kernel/reboot.c. 
> > > 
> > > Patches 09/47 to 34/47 convert various drivers to register with the kernel
> > > power-off handler instead of setting pm_power_off directly.
> > > 
> > > Patches 35/47 to 46/47 do the same for architecture code.
> > > 
> > > Patch 47/47 finally removes pm_power_off.
> > > 
> > > For the most part, the individual patches include explanations why specific
> > > priorities were chosen, at least if the selected priority is not the default
> > > priority. Subsystem and architecture maintainers are encouraged to have a look
> > > at the selected priorities and suggest improvements.
> > > 
> > > I ran the final code through my normal build and qemu tests. Results are
> > > available at http://server.roeck-us.net:8010/builders in the 'poweroff-handler'
> > > column. I also built all available configurations for arm, mips, powerpc,
> > > m68k, and sh architectures.
> > > 
> > > The series is available in branch poweroff-handler of my repository at
> > > git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git.
> > > It is based on 3.18-rc2.
> > > 
> > > A note on Cc: In the initial submission I had way too many Cc:, causing the
> > > patchset to be treated as spam by many mailers and mailing list handlers,
> > > which of course defeated the purpose. This time around I am cutting down
> > > the distribution list down significantly. My apologies to anyone I may have
> > > failed to copy this time around.
> > 
> > you touch every single architecture with this patchset, but you didn't
> > care about Ccing any of the arch-specific mailing lists, like lakml ?
> > 
> What is lakml ? linux-kernel@vger.kernel.org was copied, if that is what you

only the greatest mailing list of all time.

heh, Linux ARM Kernel Mailing List.

> refer to. I don't find a reference to lakml anywhere, sorry. I'll be happy to
> add it manually if you provide the address.
> 
> Architecture specific mailing lists were copied on individual patches as long
> as those mailing lists are reported by the MAINTAINERS file.
> 
> > Please resend with proper people in Cc, IIRC RMK had a few very
> > important comments about the idea behind this series.
> > 
> Felipe,
> 
> That doesn't work. I tried with rev 1. The result was that the patch series
> was flagged as spam and got dropped by most mailing lists, as explained above,
> and I got tagged as spammer by Google and several other mail servers,
> preventing me from posting _anything_ for several days.

heh, that sucks.

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler
  2014-11-03 17:59     ` Felipe Balbi
@ 2014-11-03 18:36       ` Guenter Roeck
  2014-11-03 18:43         ` Felipe Balbi
  0 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-11-03 18:36 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: Lee Jones, linux-kernel, linux-pm, Samuel Ortiz,
	Linux OMAP Mailing List, Linux ARM Kernel Mailing List

On Mon, Nov 03, 2014 at 11:59:54AM -0600, Felipe Balbi wrote:
> On Mon, Nov 03, 2014 at 05:56:45PM +0000, Lee Jones wrote:
> > On Mon, 27 Oct 2014, Guenter Roeck wrote:
> > 
> > > Register with kernel power-off handler instead of setting pm_power_off
> > > directly. Register with low priority to reflect that the original code
> > > only sets pm_power_off if it was not already set.
> > > 
> > > Cc: Samuel Ortiz <sameo@linux.intel.com>
> > > Cc: Lee Jones <lee.jones@linaro.org>
> > > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > > ---
> > > v3:
> > > - Replace poweroff in all newly introduced variables and in text
> > >   with power_off or power-off as appropriate
> > > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > > v2:
> > > - Use define to specify poweroff handler priority
> > > - Use devm_register_power_off_handler
> > > - Use dev_warn instead of dev_err
> > > 
> > >  drivers/mfd/palmas.c       | 31 +++++++++++++++++--------------
> > >  include/linux/mfd/palmas.h |  3 +++
> > >  2 files changed, 20 insertions(+), 14 deletions(-)
> > 
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> 
> missed lakml and linux-omap.
> 
Felipe,

unfortunately, get_maintainer.pl doesn't give a hint that this and the
other affected patches should be sent to linux-omap. How am I supposed
to know ?

Note that linux-kernel@vger.kernel.org was copied on the entire series,
if that is what you mean with lakml. linux-pm@vger.kernel.org was also
copied on all patches. Additional mailing lists were only copied for
affected architectures to avoid for the patches to be tagged as spam.

If there is a list named lakml, I must have missed it, and I seem to be
unable to find a reference to it. If that is the case, my apologies,
and please provide a link to it.

Thanks,
Guenter

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler
  2014-11-03 18:36       ` Guenter Roeck
@ 2014-11-03 18:43         ` Felipe Balbi
  2014-11-03 18:58           ` Guenter Roeck
  0 siblings, 1 reply; 88+ messages in thread
From: Felipe Balbi @ 2014-11-03 18:43 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: Felipe Balbi, Lee Jones, linux-kernel, linux-pm, Samuel Ortiz,
	Linux OMAP Mailing List, Linux ARM Kernel Mailing List

[-- Attachment #1: Type: text/plain, Size: 2218 bytes --]

On Mon, Nov 03, 2014 at 10:36:53AM -0800, Guenter Roeck wrote:
> On Mon, Nov 03, 2014 at 11:59:54AM -0600, Felipe Balbi wrote:
> > On Mon, Nov 03, 2014 at 05:56:45PM +0000, Lee Jones wrote:
> > > On Mon, 27 Oct 2014, Guenter Roeck wrote:
> > > 
> > > > Register with kernel power-off handler instead of setting pm_power_off
> > > > directly. Register with low priority to reflect that the original code
> > > > only sets pm_power_off if it was not already set.
> > > > 
> > > > Cc: Samuel Ortiz <sameo@linux.intel.com>
> > > > Cc: Lee Jones <lee.jones@linaro.org>
> > > > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > > > ---
> > > > v3:
> > > > - Replace poweroff in all newly introduced variables and in text
> > > >   with power_off or power-off as appropriate
> > > > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > > > v2:
> > > > - Use define to specify poweroff handler priority
> > > > - Use devm_register_power_off_handler
> > > > - Use dev_warn instead of dev_err
> > > > 
> > > >  drivers/mfd/palmas.c       | 31 +++++++++++++++++--------------
> > > >  include/linux/mfd/palmas.h |  3 +++
> > > >  2 files changed, 20 insertions(+), 14 deletions(-)
> > > 
> > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > 
> > missed lakml and linux-omap.
> > 
> Felipe,
> 
> unfortunately, get_maintainer.pl doesn't give a hint that this and the
> other affected patches should be sent to linux-omap. How am I supposed
> to know ?

yeah, just looked and nobody bothered to patch MAINTAINERS when those
files were added. I just sent a patch adding them under OMAP SUPPORT.

> Note that linux-kernel@vger.kernel.org was copied on the entire series,
> if that is what you mean with lakml. linux-pm@vger.kernel.org was also
> copied on all patches. Additional mailing lists were only copied for
> affected architectures to avoid for the patches to be tagged as spam.
> 
> If there is a list named lakml, I must have missed it, and I seem to be
> unable to find a reference to it. If that is the case, my apologies,
> and please provide a link to it.

here it is:

Linux ARM Kernel Mailing List <linux-arm-kernel@lists.infradead.org>

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 00/47] kernel: Add support for power-off handler call chain
  2014-11-03 18:28     ` Felipe Balbi
@ 2014-11-03 18:49       ` Guenter Roeck
  0 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-11-03 18:49 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: linux-kernel, linux-pm, Alan Cox, Alexander Graf, Andrew Morton,
	Geert Uytterhoeven, Heiko Stuebner, Lee Jones, Len Brown,
	Pavel Machek, Rafael J. Wysocki, Romain Perier,
	Linux ARM Kernel Mailing List, Linux OMAP Mailing List,
	Tony Lindgren, Russell King

On Mon, Nov 03, 2014 at 12:28:29PM -0600, Felipe Balbi wrote:
> Hi,
> 
> On Mon, Nov 03, 2014 at 10:22:13AM -0800, Guenter Roeck wrote:
> > On Mon, Nov 03, 2014 at 11:59:35AM -0600, Felipe Balbi wrote:
> > > Hi,
> > > 
> > > On Mon, Oct 27, 2014 at 08:55:07AM -0700, Guenter Roeck wrote:
> > > > Various drivers implement architecture and/or device specific means to
> > > > remove power from the system.  For the most part, those drivers set the
> > > > global variable pm_power_off to point to a function within the driver.
> > > > 
> > > > This mechanism has a number of drawbacks.  Typically only one means
> > > > to remove power is supported (at least if pm_power_off is used).
> > > > At least in theory there can be multiple means to remove power, some of
> > > > which may be less desirable.  For example, one mechanism might power off the
> > > > entire system through an I/O port or gpio pin, while another might power off
> > > > a board by disabling its power controller. Other mechanisms may really just
> > > > execute a restart sequence or drop into the ROM monitor, or put the CPU into
> > > > sleep mode.  Using pm_power_off can also be racy if the function pointer is
> > > > set from a driver built as module, as the driver may be in the process of
> > > > being unloaded when pm_power_off is called.  If there are multiple power-off
> > > > handlers in the system, removing a module with such a handler may
> > > > inadvertently reset the pointer to pm_power_off to NULL, leaving the system
> > > > with no means to remove power.
> > > > 
> > > > Introduce a system power-off handler call chain to solve the described
> > > > problems.  This call chain is expected to be executed from the architecture
> > > > specific machine_power_off() function.  Drivers providing system power-off
> > > > functionality are expected to register with this call chain.  By using the
> > > > priority field in the notifier block, callers can control power-off handler
> > > > execution sequence and thus ensure that the power-off handler with the
> > > > optimal capabilities to remove power for a given system is called first.
> > > > A call chain instead of a single call to the highest priority handler is
> > > > used to provide fallback: If multiple power-off handlers are installed,
> > > > all handlers will be called until one actually succeeds to power off the
> > > > system.
> > > > 
> > > > Patch 01/47 implements the power-off handler API.
> > > > 
> > > > Patches 02/47 to 04/47 are cleanup patches to prepare for the move of
> > > > pm_power_off to a common location.
> > > > 
> > > > Patches 05/47 to 07/47 remove references to pm_power_off from devicetree
> > > > bindings descriptions.
> > > > 
> > > > Patch 08/47 moves the pm_power_off variable from architecture code to
> > > > kernel/reboot.c. 
> > > > 
> > > > Patches 09/47 to 34/47 convert various drivers to register with the kernel
> > > > power-off handler instead of setting pm_power_off directly.
> > > > 
> > > > Patches 35/47 to 46/47 do the same for architecture code.
> > > > 
> > > > Patch 47/47 finally removes pm_power_off.
> > > > 
> > > > For the most part, the individual patches include explanations why specific
> > > > priorities were chosen, at least if the selected priority is not the default
> > > > priority. Subsystem and architecture maintainers are encouraged to have a look
> > > > at the selected priorities and suggest improvements.
> > > > 
> > > > I ran the final code through my normal build and qemu tests. Results are
> > > > available at http://server.roeck-us.net:8010/builders in the 'poweroff-handler'
> > > > column. I also built all available configurations for arm, mips, powerpc,
> > > > m68k, and sh architectures.
> > > > 
> > > > The series is available in branch poweroff-handler of my repository at
> > > > git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git.
> > > > It is based on 3.18-rc2.
> > > > 
> > > > A note on Cc: In the initial submission I had way too many Cc:, causing the
> > > > patchset to be treated as spam by many mailers and mailing list handlers,
> > > > which of course defeated the purpose. This time around I am cutting down
> > > > the distribution list down significantly. My apologies to anyone I may have
> > > > failed to copy this time around.
> > > 
> > > you touch every single architecture with this patchset, but you didn't
> > > care about Ccing any of the arch-specific mailing lists, like lakml ?
> > > 
> > What is lakml ? linux-kernel@vger.kernel.org was copied, if that is what you
> 
> only the greatest mailing list of all time.
> 
> heh, Linux ARM Kernel Mailing List.
> 

Similar to linux-omap, linux-arm-kernel was copied on individual patches
if get_maintainer.pl suggested it. I'll be happy to add both lists manually
to the entire series for the next version of the patch set if the respective
maintainers (Tony and Russell) ask me to do so.

Note that this doesn't mean that the patches will actually be accepted by
those lists, especially if the lists are moderated for non-subscribers.

Guenter

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler
  2014-11-03 18:43         ` Felipe Balbi
@ 2014-11-03 18:58           ` Guenter Roeck
  0 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-11-03 18:58 UTC (permalink / raw)
  To: Felipe Balbi
  Cc: Lee Jones, linux-kernel, linux-pm, Samuel Ortiz,
	Linux OMAP Mailing List, Linux ARM Kernel Mailing List

On Mon, Nov 03, 2014 at 12:43:12PM -0600, Felipe Balbi wrote:
> On Mon, Nov 03, 2014 at 10:36:53AM -0800, Guenter Roeck wrote:
> > On Mon, Nov 03, 2014 at 11:59:54AM -0600, Felipe Balbi wrote:
> > > On Mon, Nov 03, 2014 at 05:56:45PM +0000, Lee Jones wrote:
> > > > On Mon, 27 Oct 2014, Guenter Roeck wrote:
> > > > 
> > > > > Register with kernel power-off handler instead of setting pm_power_off
> > > > > directly. Register with low priority to reflect that the original code
> > > > > only sets pm_power_off if it was not already set.
> > > > > 
> > > > > Cc: Samuel Ortiz <sameo@linux.intel.com>
> > > > > Cc: Lee Jones <lee.jones@linaro.org>
> > > > > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > > > > ---
> > > > > v3:
> > > > > - Replace poweroff in all newly introduced variables and in text
> > > > >   with power_off or power-off as appropriate
> > > > > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > > > > v2:
> > > > > - Use define to specify poweroff handler priority
> > > > > - Use devm_register_power_off_handler
> > > > > - Use dev_warn instead of dev_err
> > > > > 
> > > > >  drivers/mfd/palmas.c       | 31 +++++++++++++++++--------------
> > > > >  include/linux/mfd/palmas.h |  3 +++
> > > > >  2 files changed, 20 insertions(+), 14 deletions(-)
> > > > 
> > > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > 
> > > missed lakml and linux-omap.
> > > 
> > Felipe,
> > 
> > unfortunately, get_maintainer.pl doesn't give a hint that this and the
> > other affected patches should be sent to linux-omap. How am I supposed
> > to know ?
> 
> yeah, just looked and nobody bothered to patch MAINTAINERS when those
> files were added. I just sent a patch adding them under OMAP SUPPORT.
> 
I'll add the omap list as Cc: to the affected patches directly for now.

> > Note that linux-kernel@vger.kernel.org was copied on the entire series,
> > if that is what you mean with lakml. linux-pm@vger.kernel.org was also
> > copied on all patches. Additional mailing lists were only copied for
> > affected architectures to avoid for the patches to be tagged as spam.
> > 
> > If there is a list named lakml, I must have missed it, and I seem to be
> > unable to find a reference to it. If that is the case, my apologies,
> > and please provide a link to it.
> 
> here it is:
> 
> Linux ARM Kernel Mailing List <linux-arm-kernel@lists.infradead.org>
> 
Same problem here, though. If there are any ARM specific patches where the arm
mailing list was not copied, that was because the dependency is not listed in
the MAINTAINERS file. As mentioned before, copying the entire series to all
lists touched by one of the patches in the series just doesn't work (and may
be considered severe noise by some subscribers of those lists).

Guenter

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 19/47] mfd: rk808: Register power-off handler with kernel power-off handler
  2014-11-03 17:53   ` Lee Jones
@ 2014-11-03 19:06     ` Guenter Roeck
  2014-11-03 22:42       ` Lee Jones
  0 siblings, 1 reply; 88+ messages in thread
From: Guenter Roeck @ 2014-11-03 19:06 UTC (permalink / raw)
  To: Lee Jones; +Cc: linux-kernel, linux-pm, Chris Zhong, Zhang Qing, Samuel Ortiz

On Mon, Nov 03, 2014 at 05:53:46PM +0000, Lee Jones wrote:
> On Mon, 27 Oct 2014, Guenter Roeck wrote:
> 
> > Register with kernel power-off handler instead of setting pm_power_off
> > directly. Register with low priority to reflect that the original code
> > only sets pm_power_off if it was not already set.
> > 
> > Cc: Chris Zhong <zyw@rock-chips.com>
> > Cc: Zhang Qing <zhangqing@rock-chips.com>
> > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > ---
> > v3:
> > - Replace poweroff in all newly introduced variables and in text
> >   with power_off or power-off as appropriate
> > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > v2:
> > - New patch
> > 
> >  drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
> >  include/linux/mfd/rk808.h |  2 ++
> >  2 files changed, 18 insertions(+), 14 deletions(-)
> 
> Code looks okay:
> 
> Acked-by: Lee Jones <lee.jones@linaro.org>
> 
Thanks!

> ... but how are you thinking about handling this set?
> 

Plan is to send the entire series directly to Linus in the next
commit window, as suggested by several of the affected maintainers.

I am still missing an Ack for patch 1 of the series. If/when I get
that, I'll set up the series except for the last patch to be added
to linux-next for it to get some exposure.

Of course, that plan may all fall apart if someone objects. In that case,
the patches would have to be taken over several releases by the individual
maintainers.

Guenter

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 19/47] mfd: rk808: Register power-off handler with kernel power-off handler
  2014-11-03 19:06     ` Guenter Roeck
@ 2014-11-03 22:42       ` Lee Jones
  2014-11-03 22:52         ` Guenter Roeck
  0 siblings, 1 reply; 88+ messages in thread
From: Lee Jones @ 2014-11-03 22:42 UTC (permalink / raw)
  To: Guenter Roeck
  Cc: linux-kernel, linux-pm, Chris Zhong, Zhang Qing, Samuel Ortiz

On Mon, 03 Nov 2014, Guenter Roeck wrote:

> On Mon, Nov 03, 2014 at 05:53:46PM +0000, Lee Jones wrote:
> > On Mon, 27 Oct 2014, Guenter Roeck wrote:
> > 
> > > Register with kernel power-off handler instead of setting pm_power_off
> > > directly. Register with low priority to reflect that the original code
> > > only sets pm_power_off if it was not already set.
> > > 
> > > Cc: Chris Zhong <zyw@rock-chips.com>
> > > Cc: Zhang Qing <zhangqing@rock-chips.com>
> > > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > > ---
> > > v3:
> > > - Replace poweroff in all newly introduced variables and in text
> > >   with power_off or power-off as appropriate
> > > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > > v2:
> > > - New patch
> > > 
> > >  drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
> > >  include/linux/mfd/rk808.h |  2 ++
> > >  2 files changed, 18 insertions(+), 14 deletions(-)
> > 
> > Code looks okay:
> > 
> > Acked-by: Lee Jones <lee.jones@linaro.org>
> > 
> Thanks!
> 
> > ... but how are you thinking about handling this set?
> > 
> 
> Plan is to send the entire series directly to Linus in the next
> commit window, as suggested by several of the affected maintainers.
> 
> I am still missing an Ack for patch 1 of the series. If/when I get
> that, I'll set up the series except for the last patch to be added
> to linux-next for it to get some exposure.
> 
> Of course, that plan may all fall apart if someone objects. In that case,
> the patches would have to be taken over several releases by the individual
> maintainers.

Very well.  Either is okay with me.  It might also be worth
considering speaking to Linus and requesting permission to send during
-rc1 to minimise the risk of a huge number of conflicts.

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

^ permalink raw reply	[flat|nested] 88+ messages in thread

* Re: [PATCH v3 19/47] mfd: rk808: Register power-off handler with kernel power-off handler
  2014-11-03 22:42       ` Lee Jones
@ 2014-11-03 22:52         ` Guenter Roeck
  0 siblings, 0 replies; 88+ messages in thread
From: Guenter Roeck @ 2014-11-03 22:52 UTC (permalink / raw)
  To: Lee Jones; +Cc: linux-kernel, linux-pm, Chris Zhong, Zhang Qing, Samuel Ortiz

On Mon, Nov 03, 2014 at 10:42:27PM +0000, Lee Jones wrote:
> On Mon, 03 Nov 2014, Guenter Roeck wrote:
> 
> > On Mon, Nov 03, 2014 at 05:53:46PM +0000, Lee Jones wrote:
> > > On Mon, 27 Oct 2014, Guenter Roeck wrote:
> > > 
> > > > Register with kernel power-off handler instead of setting pm_power_off
> > > > directly. Register with low priority to reflect that the original code
> > > > only sets pm_power_off if it was not already set.
> > > > 
> > > > Cc: Chris Zhong <zyw@rock-chips.com>
> > > > Cc: Zhang Qing <zhangqing@rock-chips.com>
> > > > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > > > ---
> > > > v3:
> > > > - Replace poweroff in all newly introduced variables and in text
> > > >   with power_off or power-off as appropriate
> > > > - Replace POWEROFF_PRIORITY_xxx with POWER_OFF_PRIORITY_xxx
> > > > v2:
> > > > - New patch
> > > > 
> > > >  drivers/mfd/rk808.c       | 30 ++++++++++++++++--------------
> > > >  include/linux/mfd/rk808.h |  2 ++
> > > >  2 files changed, 18 insertions(+), 14 deletions(-)
> > > 
> > > Code looks okay:
> > > 
> > > Acked-by: Lee Jones <lee.jones@linaro.org>
> > > 
> > Thanks!
> > 
> > > ... but how are you thinking about handling this set?
> > > 
> > 
> > Plan is to send the entire series directly to Linus in the next
> > commit window, as suggested by several of the affected maintainers.
> > 
> > I am still missing an Ack for patch 1 of the series. If/when I get
> > that, I'll set up the series except for the last patch to be added
> > to linux-next for it to get some exposure.
> > 
> > Of course, that plan may all fall apart if someone objects. In that case,
> > the patches would have to be taken over several releases by the individual
> > maintainers.
> 
> Very well.  Either is okay with me.  It might also be worth
> considering speaking to Linus and requesting permission to send during
> -rc1 to minimise the risk of a huge number of conflicts.
> 
That sounds like a good idea. I may have to split the patches into two
parts anyway, to catch any new code setting pm_power_off directly. Maybe 
the first part can go in during the commit window and the final part
after -rc1.

Thanks,
Guenter

^ permalink raw reply	[flat|nested] 88+ messages in thread

end of thread, other threads:[~2014-11-03 22:52 UTC | newest]

Thread overview: 88+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-27 15:55 [PATCH v3 00/47] kernel: Add support for power-off handler call chain Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 01/47] " Guenter Roeck
2014-10-28 17:49   ` Pavel Machek
2014-10-27 15:55 ` [PATCH v3 02/47] memory: emif: Use API function to determine power-off capability Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 03/47] hibernate: Call have_kernel_power_off instead of checking pm_power_off Guenter Roeck
2014-10-28 17:50   ` Pavel Machek
2014-10-27 15:55 ` [PATCH v3 04/47] m68k: Replace mach_power_off with pm_power_off Guenter Roeck
     [not found] ` <1414425354-10359-1-git-send-email-linux-0h96xk9xTtrk1uMJSBkQmQ@public.gmane.org>
2014-10-27 15:55   ` [PATCH v3 05/47] mfd: as3722: Drop reference to pm_power_off from devicetree bindings Guenter Roeck
2014-10-27 15:55   ` [PATCH v3 07/47] qnap-poweroff: " Guenter Roeck
2014-10-27 15:55   ` [PATCH v3 46/47] efi: Register power-off handler with kernel power-off handler Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 06/47] gpio-poweroff: Drop reference to pm_power_off from devicetree bindings Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 08/47] kernel: Move pm_power_off to common code Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 09/47] mfd: palmas: Register with kernel power-off handler Guenter Roeck
2014-11-03 17:56   ` Lee Jones
2014-11-03 17:59     ` Felipe Balbi
2014-11-03 18:36       ` Guenter Roeck
2014-11-03 18:43         ` Felipe Balbi
2014-11-03 18:58           ` Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 10/47] mfd: axp20x: " Guenter Roeck
2014-11-03 17:56   ` Lee Jones
2014-10-27 15:55 ` [PATCH v3 11/47] mfd: retu: " Guenter Roeck
2014-11-03 17:56   ` Lee Jones
2014-10-27 15:55 ` [PATCH v3 12/47] mfd: ab8500-sysctrl: " Guenter Roeck
2014-11-03 17:55   ` Lee Jones
2014-10-27 15:55 ` [PATCH v3 13/47] mfd: max8907: " Guenter Roeck
2014-11-03 17:56   ` Lee Jones
2014-10-27 15:55 ` [PATCH v3 14/47] mfd: tps80031: " Guenter Roeck
2014-11-03 17:55   ` Lee Jones
2014-10-27 15:55 ` [PATCH v3 15/47] mfd: dm355evm_msp: " Guenter Roeck
2014-11-03 17:55   ` Lee Jones
2014-10-27 15:55 ` [PATCH v3 16/47] mfd: tps6586x: " Guenter Roeck
2014-11-03 17:54   ` Lee Jones
2014-11-03 17:57   ` Felipe Balbi
2014-10-27 15:55 ` [PATCH v3 17/47] mfd: tps65910: " Guenter Roeck
2014-11-03 17:54   ` Lee Jones
2014-11-03 17:57   ` Felipe Balbi
2014-10-27 15:55 ` [PATCH v3 18/47] mfd: twl4030-power: " Guenter Roeck
2014-11-03 17:54   ` Lee Jones
2014-11-03 17:56     ` Felipe Balbi
2014-10-27 15:55 ` [PATCH v3 19/47] mfd: rk808: Register power-off handler " Guenter Roeck
2014-11-03 17:53   ` Lee Jones
2014-11-03 19:06     ` Guenter Roeck
2014-11-03 22:42       ` Lee Jones
2014-11-03 22:52         ` Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 20/47] mfd: rn5t618: " Guenter Roeck
2014-11-03 17:54   ` Lee Jones
2014-10-27 15:55 ` [PATCH v3 21/47] ipmi: Register " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 22/47] power/reset: restart-poweroff: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 23/47] power/reset: gpio-poweroff: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 24/47] power/reset: as3722-poweroff: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 25/47] power/reset: qnap-poweroff: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 26/47] power/reset: msm-poweroff: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 27/47] power/reset: vexpress-poweroff: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 28/47] power/reset: at91-poweroff: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 29/47] power/reset: ltc2952-poweroff: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 30/47] x86: iris: " Guenter Roeck
2014-11-01 19:41   ` Thomas Gleixner
2014-11-01 21:15     ` Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 31/47] x86: apm: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 32/47] x86: olpc: Register xo1 power-off handler " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 33/47] staging: nvec: Register " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 34/47] acpi: Register power-off handler " Guenter Roeck
2014-10-28  0:26   ` Rafael J. Wysocki
2014-10-28  2:10     ` Guenter Roeck
2014-10-28 23:10       ` Rafael J. Wysocki
2014-10-29  2:05         ` Guenter Roeck
2014-10-29 15:13           ` Rafael J. Wysocki
2014-10-27 15:55 ` [PATCH v3 35/47] arm: Register " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 36/47] arm64: psci: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 37/47] avr32: atngw100: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 38/47] ia64: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 39/47] m68k: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 40/47] mips: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 41/47] sh: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 42/47] x86: lguest: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 43/47] x86: ce4100: " Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 44/47] x86: intel-mid: Drop registration of dummy power-off handlers Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 45/47] x86: pmc_atom: Register power-off handler with kernel power-off handler Guenter Roeck
2014-10-27 15:55 ` [PATCH v3 47/47] kernel: Remove pm_power_off Guenter Roeck
2014-10-28 17:50   ` Pavel Machek
2014-10-27 16:03 ` [PATCH v3 00/47] kernel: Add support for power-off handler call chain Felipe Balbi
2014-10-27 17:16   ` Guenter Roeck
2014-10-27 17:33     ` Felipe Balbi
2014-10-27 17:43       ` Johan Hovold
2014-11-03 17:59 ` Felipe Balbi
2014-11-03 18:22   ` Guenter Roeck
2014-11-03 18:28     ` Felipe Balbi
2014-11-03 18:49       ` Guenter Roeck

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).