Re: [PATCH] Staging: media: Added semicolon.

2014-10-06 Thread Hans Verkuil
On 10/04/2014 08:43 PM, Stevean Raja Kumar wrote:
> Added semicolon for the line usleep_range(1, 11000);

Against which kernel is this patch? I don't see a usleep_range in either the 
mainline
kernel or the media_tree.git kernel.

Regards,

Hans

> 
> Signed-off-by: Stevean Raja Kumar 
> ---
>  drivers/staging/media/cxd2099/cxd2099.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/drivers/staging/media/cxd2099/cxd2099.c 
> b/drivers/staging/media/cxd2099/cxd2099.c
> index cda1595..657ea48 100644
> --- a/drivers/staging/media/cxd2099/cxd2099.c
> +++ b/drivers/staging/media/cxd2099/cxd2099.c
> @@ -527,7 +527,7 @@ static int slot_reset(struct dvb_ca_en50221 *ca, int slot)
>   u8 val;
>  #endif
>   for (i = 0; i < 100; i++) {
> - usleep_range(1, 11000)
> + usleep_range(1, 11000);
>  #if 0
>   read_reg(ci, 0x06, &val);
>   dev_info(&ci->i2c->dev, "%d:%02x\n", i, val);
> 

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 1/1] [ion]: system-heap use PAGE_ALLOC_COSTLY_ORDER for high order

2014-10-06 Thread Pintu Kumar
The Android ion_system_heap uses allocation fallback mechanism
based on 8,4,0 order pages available in the system.
It changes gfp flags based on higher order allocation request.
This higher order value is hard-coded as 4, instead of using
the system defined higher order value.
Thus replacing this hard-coded value with PAGE_ALLOC_COSTLY_ORDER
which is defined as 3.
This will help mapping the higher order request in system heap with
the actual allocation request.

Signed-off-by: Pintu Kumar 
---
 drivers/staging/android/ion/ion_system_heap.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/android/ion/ion_system_heap.c 
b/drivers/staging/android/ion/ion_system_heap.c
index da2a63c..e6c393f 100644
--- a/drivers/staging/android/ion/ion_system_heap.c
+++ b/drivers/staging/android/ion/ion_system_heap.c
@@ -65,7 +65,7 @@ static struct page *alloc_buffer_page(struct ion_system_heap 
*heap,
} else {
gfp_t gfp_flags = low_order_gfp_flags;
 
-   if (order > 4)
+   if (order > PAGE_ALLOC_COSTLY_ORDER)
gfp_flags = high_order_gfp_flags;
page = alloc_pages(gfp_flags | __GFP_COMP, order);
if (!page)
@@ -276,7 +276,7 @@ struct ion_heap *ion_system_heap_create(struct 
ion_platform_heap *unused)
struct ion_page_pool *pool;
gfp_t gfp_flags = low_order_gfp_flags;
 
-   if (orders[i] > 4)
+   if (orders[i] > PAGE_ALLOC_COSTLY_ORDER)
gfp_flags = high_order_gfp_flags;
pool = ion_page_pool_create(gfp_flags, orders[i]);
if (!pool)
-- 
1.7.9.5

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH 1/1] [ion]: system-heap use PAGE_ALLOC_COSTLY_ORDER for high order

2014-10-06 Thread Heesub Shin

Hello Kumar,

On 10/06/2014 05:31 PM, Pintu Kumar wrote:

The Android ion_system_heap uses allocation fallback mechanism
based on 8,4,0 order pages available in the system.
It changes gfp flags based on higher order allocation request.
This higher order value is hard-coded as 4, instead of using
the system defined higher order value.
Thus replacing this hard-coded value with PAGE_ALLOC_COSTLY_ORDER
which is defined as 3.
This will help mapping the higher order request in system heap with
the actual allocation request.


Quite reasonable.

Reviewed-by: Heesub Shin 

BTW, Anyone knows how the allocation order (8,4 and 0) was decided? I 
think only Google guys might know the answer.


regards,
heesub



Signed-off-by: Pintu Kumar 
---
  drivers/staging/android/ion/ion_system_heap.c |4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/android/ion/ion_system_heap.c 
b/drivers/staging/android/ion/ion_system_heap.c
index da2a63c..e6c393f 100644
--- a/drivers/staging/android/ion/ion_system_heap.c
+++ b/drivers/staging/android/ion/ion_system_heap.c
@@ -65,7 +65,7 @@ static struct page *alloc_buffer_page(struct ion_system_heap 
*heap,
} else {
gfp_t gfp_flags = low_order_gfp_flags;

-   if (order > 4)
+   if (order > PAGE_ALLOC_COSTLY_ORDER)
gfp_flags = high_order_gfp_flags;
page = alloc_pages(gfp_flags | __GFP_COMP, order);
if (!page)
@@ -276,7 +276,7 @@ struct ion_heap *ion_system_heap_create(struct 
ion_platform_heap *unused)
struct ion_page_pool *pool;
gfp_t gfp_flags = low_order_gfp_flags;

-   if (orders[i] > 4)
+   if (orders[i] > PAGE_ALLOC_COSTLY_ORDER)
gfp_flags = high_order_gfp_flags;
pool = ion_page_pool_create(gfp_flags, orders[i]);
if (!pool)


___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v3] staging: Add Xilinx Clocking Wizard driver

2014-10-06 Thread Laurent Pinchart
Hi Sören,

Thank you for the patch.

On Thursday 02 October 2014 09:13:35 Soren Brinkmann wrote:
> Add a driver for the Xilinx Clocking Wizard soft IP. The clocking wizard
> provides an AXI interface to dynamically reconfigure the clocking
> resources of Xilinx FPGAs.
> 
> Signed-off-by: Soren Brinkmann 

For the DT bindings,

Acked-by: Laurent Pinchart 

> ---
> v3:
>  - allow building the driver as module
>  - make speed grade positive
>  - document valid values for speed-grade DT property
> v2:
>  - implement dev_pm_ops
>  - don't use array for clock inputs
>  - add more information in error output
>  - fix style issues
>  - fix error path
> ---
>  drivers/staging/Kconfig|   2 +
>  drivers/staging/Makefile   |   1 +
>  drivers/staging/clocking-wizard/Kconfig|   9 +
>  drivers/staging/clocking-wizard/Makefile   |   1 +
>  drivers/staging/clocking-wizard/TODO   |  12 +
>  .../clocking-wizard/clk-xlnx-clock-wizard.c| 335 ++
>  drivers/staging/clocking-wizard/dt-binding.txt |  30 ++
>  7 files changed, 390 insertions(+)
>  create mode 100644 drivers/staging/clocking-wizard/Kconfig
>  create mode 100644 drivers/staging/clocking-wizard/Makefile
>  create mode 100644 drivers/staging/clocking-wizard/TODO
>  create mode 100644 drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c
>  create mode 100644 drivers/staging/clocking-wizard/dt-binding.txt
> 
> diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig
> index 35b494f5667f..7daf345bec0e 100644
> --- a/drivers/staging/Kconfig
> +++ b/drivers/staging/Kconfig
> @@ -118,4 +118,6 @@ source "drivers/staging/skein/Kconfig"
> 
>  source "drivers/staging/unisys/Kconfig"
> 
> +source "drivers/staging/clocking-wizard/Kconfig"
> +
>  endif # STAGING
> diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile
> index e66a5dbd9b02..03fec7f981cc 100644
> --- a/drivers/staging/Makefile
> +++ b/drivers/staging/Makefile
> @@ -51,3 +51,4 @@ obj-$(CONFIG_GS_FPGABOOT)   += gs_fpgaboot/
>  obj-$(CONFIG_BT_NOKIA_H4P)   += nokia_h4p/
>  obj-$(CONFIG_CRYPTO_SKEIN)   += skein/
>  obj-$(CONFIG_UNISYSSPAR) += unisys/
> +obj-$(CONFIG_COMMON_CLK_XLNX_CLKWZRD)+= clocking-wizard/
> diff --git a/drivers/staging/clocking-wizard/Kconfig
> b/drivers/staging/clocking-wizard/Kconfig new file mode 100644
> index ..357af02c562c
> --- /dev/null
> +++ b/drivers/staging/clocking-wizard/Kconfig
> @@ -0,0 +1,9 @@
> +#
> +# Xilinx Clocking Wizard Driver
> +#
> +
> +config COMMON_CLK_XLNX_CLKWZRD
> + tristate "Xilinx Clocking Wizard"
> + depends on COMMON_CLK && OF
> + ---help---
> +   Support for the Xilinx Clocking Wizard IP core clock generator.
> diff --git a/drivers/staging/clocking-wizard/Makefile
> b/drivers/staging/clocking-wizard/Makefile new file mode 100644
> index ..5ad352f521fe
> --- /dev/null
> +++ b/drivers/staging/clocking-wizard/Makefile
> @@ -0,0 +1 @@
> +obj-$(CONFIG_COMMON_CLK_XLNX_CLKWZRD)+= clk-xlnx-clock-wizard.o
> diff --git a/drivers/staging/clocking-wizard/TODO
> b/drivers/staging/clocking-wizard/TODO new file mode 100644
> index ..ebe99db7d153
> --- /dev/null
> +++ b/drivers/staging/clocking-wizard/TODO
> @@ -0,0 +1,12 @@
> +TODO:
> + - support for fractional multiplier
> + - support for fractional divider (output 0 only)
> + - support for set_rate() operations (may benefit from Stephen Boyd's
> +   refactoring of the clk primitives: https://lkml.org/lkml/2014/9/5/766)
> + - review arithmetic
> +   - overflow after multiplication?
> +   - maximize accuracy before divisions
> +
> +Patches to:
> + Greg Kroah-Hartman 
> + Sören Brinkmann 
> diff --git a/drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c
> b/drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c new file mode
> 100644
> index ..b8d89525bffd
> --- /dev/null
> +++ b/drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c
> @@ -0,0 +1,335 @@
> +/*
> + * Xilinx 'Clocking Wizard' driver
> + *
> + *  Copyright (C) 2013 - 2014 Xilinx
> + *
> + *  Sören Brinkmann 
> + *
> + * This program is free software: you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License v2 as published by
> + * the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program.  If not, see .
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define WZRD_NUM_OUTPUTS 7
> +#define WZRD_ACLK_MAX_FREQ   25000UL
> +
> +#define WZRD_CLK_CFG

Re: [PATCH 1/1] [ion]: system-heap use PAGE_ALLOC_COSTLY_ORDER for high order

2014-10-06 Thread Laura Abbott

On 10/6/2014 3:27 AM, Heesub Shin wrote:

Hello Kumar,

On 10/06/2014 05:31 PM, Pintu Kumar wrote:

The Android ion_system_heap uses allocation fallback mechanism
based on 8,4,0 order pages available in the system.
It changes gfp flags based on higher order allocation request.
This higher order value is hard-coded as 4, instead of using
the system defined higher order value.
Thus replacing this hard-coded value with PAGE_ALLOC_COSTLY_ORDER
which is defined as 3.
This will help mapping the higher order request in system heap with
the actual allocation request.


Quite reasonable.

Reviewed-by: Heesub Shin 

BTW, Anyone knows how the allocation order (8,4 and 0) was decided? I
think only Google guys might know the answer.

regards,
heesub



My understanding was this was completely unrelated to the costly order
and was related to the page sizes corresponding to IOMMU page sizes
(1MB, 64K, 4K). This won't make a difference for the uncached page
pool case but for the not page pool case, I'm not sure if there would
be a benefit for trying to get 32K pages with some effort vs. just
going back to 4K pages.

Do you have any data/metrics that show a benefit from this patch?

Thanks,
Laura

--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: Re: [PATCH 1/1] [ion]: system-heap use PAGE_ALLOC_COSTLY_ORDER for high order

2014-10-06 Thread PINTU KUMAR
Hi,
>
> From: Laura Abbott 
>To: Heesub Shin ; Pintu Kumar ; 
>a...@linux-foundation.org; gre...@linuxfoundation.org; john.stu...@linaro.org; 
>rebe...@android.com; ccr...@android.com; de...@driverdev.osuosl.org; 
>linux-ker...@vger.kernel.org 
>Cc: iqbal@samsung.com; pintu_agar...@yahoo.com; vishnu...@samsung.com 
>Sent: Monday, 6 October 2014 7:37 PM
>Subject: Re: [PATCH 1/1] [ion]: system-heap use PAGE_ALLOC_COSTLY_ORDER for 
>high order
> 
>
>On 10/6/2014 3:27 AM, Heesub Shin wrote:
>
>
>
>
>> Hello Kumar,
>>
>> On 10/06/2014 05:31 PM, Pintu Kumar wrote:
>>> The Android ion_system_heap uses allocation fallback mechanism
>>> based on 8,4,0 order pages available in the system.
>>> It changes gfp flags based on higher order allocation request.
>>> This higher order value is hard-coded as 4, instead of using
>>> the system defined higher order value.
>>> Thus replacing this hard-coded value with PAGE_ALLOC_COSTLY_ORDER
>>> which is defined as 3.
>>> This will help mapping the higher order request in system heap with
>>> the actual allocation request.
>>
>> Quite reasonable.
>>
>> Reviewed-by: Heesub Shin 
>>
>> BTW, Anyone knows how the allocation order (8,4 and 0) was decided? I
>> think only Google guys might know the answer.
>>
>> regards,
>> heesub
>>
>
>My understanding was this was completely unrelated to the costly order
>and was related to the page sizes corresponding to IOMMU page sizes
>(1MB, 64K, 4K). This won't make a difference for the uncached page
>pool case but for the not page pool case, I'm not sure if there would
>be a benefit for trying to get 32K pages with some effort vs. just
>going back to 4K pages.

No, it is not just related to IOMMU case. It comes into picture also for 
normal system-heap allocation (without iommu cases).
Also, it is applicable for both uncached and page_pool cases.
Please also check the changes under ion_system_heap_create.
Here the gfp_flags are set under the pool structure.
This value is used in ion_page_pool_alloc_pages.
In both the cases, it internally calls alloc_pages, with this gfp_flags.
Now, during memory pressure scenario, when alloc_pages moves to slowpath 
this gfp_flags will be used to decide allocation retry.
In the current code, the higher-order flag is set only when order is greater 
than 4.
But, in MM, the order 4 is also considered as higher-order request. 
This higher-order is decided based on PAGE_ALLOC_COSTLY_ORDER (3) value.
Hence, I think this value should be in sync with the MM code.

>
>Do you have any data/metrics that show a benefit from this patch?
I think it is not related to any data or metrics.
It is about replacing the hard-coded higher-order check to be in sync with 
the MM code.

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] Staging: media: Added semicolon.

2014-10-06 Thread Greg KH
On Mon, Oct 06, 2014 at 08:18:28PM +0530, Stevean Rk wrote:
> 
> Its against  3.17.0-rc6+
> I had cloned the Greg Kroah-Hartman's staging tree repository.
> git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git

Which branch?  3.17-rc6 is quite old, you need to work against the
staging-next branch in there if you want to send patches that can apply
properly.

thanks,

greg k-h
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: Re: [PATCH 1/1] [ion]: system-heap use PAGE_ALLOC_COSTLY_ORDER for high order

2014-10-06 Thread Colin Cross
On Mon, Oct 6, 2014 at 9:26 AM, PINTU KUMAR  wrote:
>
> Hi,
> >
> > From: Laura Abbott 
> >To: Heesub Shin ; Pintu Kumar 
> >; a...@linux-foundation.org; 
> >gre...@linuxfoundation.org; john.stu...@linaro.org; rebe...@android.com; 
> >ccr...@android.com; de...@driverdev.osuosl.org; linux-ker...@vger.kernel.org
> >Cc: iqbal@samsung.com; pintu_agar...@yahoo.com; vishnu...@samsung.com
> >Sent: Monday, 6 October 2014 7:37 PM
> >Subject: Re: [PATCH 1/1] [ion]: system-heap use PAGE_ALLOC_COSTLY_ORDER for 
> >high order
> >
> >
> >On 10/6/2014 3:27 AM, Heesub Shin wrote:
> >
> >
> >
> >
> >> Hello Kumar,
> >>
> >> On 10/06/2014 05:31 PM, Pintu Kumar wrote:
> >>> The Android ion_system_heap uses allocation fallback mechanism
> >>> based on 8,4,0 order pages available in the system.
> >>> It changes gfp flags based on higher order allocation request.
> >>> This higher order value is hard-coded as 4, instead of using
> >>> the system defined higher order value.
> >>> Thus replacing this hard-coded value with PAGE_ALLOC_COSTLY_ORDER
> >>> which is defined as 3.
> >>> This will help mapping the higher order request in system heap with
> >>> the actual allocation request.
> >>
> >> Quite reasonable.
> >>
> >> Reviewed-by: Heesub Shin 
> >>
> >> BTW, Anyone knows how the allocation order (8,4 and 0) was decided? I
> >> think only Google guys might know the answer.
> >>
> >> regards,
> >> heesub
> >>
> >
> >My understanding was this was completely unrelated to the costly order
> >and was related to the page sizes corresponding to IOMMU page sizes
> >(1MB, 64K, 4K). This won't make a difference for the uncached page
> >pool case but for the not page pool case, I'm not sure if there would
> >be a benefit for trying to get 32K pages with some effort vs. just
> >going back to 4K pages.
>
> No, it is not just related to IOMMU case. It comes into picture also for
> normal system-heap allocation (without iommu cases).
> Also, it is applicable for both uncached and page_pool cases.
> Please also check the changes under ion_system_heap_create.
> Here the gfp_flags are set under the pool structure.
> This value is used in ion_page_pool_alloc_pages.
> In both the cases, it internally calls alloc_pages, with this gfp_flags.
> Now, during memory pressure scenario, when alloc_pages moves to slowpath
> this gfp_flags will be used to decide allocation retry.
> In the current code, the higher-order flag is set only when order is greater 
> than 4.
> But, in MM, the order 4 is also considered as higher-order request.
> This higher-order is decided based on PAGE_ALLOC_COSTLY_ORDER (3) value.
> Hence, I think this value should be in sync with the MM code.
> >
> >Do you have any data/metrics that show a benefit from this patch?
> I think it is not related to any data or metrics.
> It is about replacing the hard-coded higher-order check to be in sync with
> the MM code.
>

The selection of the orders used for allocation (8, then 4, then 0) is
designed to match with the sizes often found in IOMMUs, but this isn't
changing the order of the allocation, it is changing the GFP flags
used for the order 4 allocation.  Right now we are using the
low_order_gfp_flags for order 4, this patch would change it to use
high_order_gfp_flags.  We originally used low_order_gfp_flags here
because the MM subsystem can usually satisfy these allocations, and
the additional load placed on the MM subsystem to kick off kswapd to
free up more order 4 chunks is generally worth it.  Using order 4
pages instead of order 0 pages can significantly improve the
performance of many IOMMUs by reducing TLB pressure and time spent
updating page tables.  Unless you have data showing that this improves
something, and doesn't just cause all allocations to be order 0 when
under memory pressure, I don't suggest merging this.
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: RTL8188SU(r8712u) - Unable to suspend/resume

2014-10-06 Thread poma

$ dmesg
...
[1.462812] usb 1-4: new high-speed USB device number 4 using ehci-pci
[1.579359] usb 1-4: New USB device found, idVendor=0bda, idProduct=8171
[1.579360] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1.579361] usb 1-4: Product: RTL8188S WLAN Adapter 
[1.579362] usb 1-4: Manufacturer: Manufacturer Realtek 
[1.579363] usb 1-4: SerialNumber: 00e04c01
[2.026431] usb 2-3: Product: 802.11 n WLAN
[   21.295330] r8712u: module is from the staging directory, the quality is 
unknown, you have been warned.
[   21.296110] r8712u: Staging version
[   21.296288] r8712u: register rtl8712_netdev_ops to netdev_ops
[   21.296583] usb 1-4: r8712u: USB_SPEED_HIGH with 4 endpoints
[   21.297469] usb 1-4: r8712u: Boot from EFUSE: Autoload OK
[   21.863363] usb 1-4: r8712u: CustomerID = 0x
[   21.864014] usb 1-4: r8712u: MAC Address from efuse = 00:11:22:33:44:55
[   21.864622] usb 1-4: r8712u: Loading firmware from "rtlwifi/rtl8712u.bin"
[   21.865330] usbcore: registered new interface driver r8712u
[   21.980454] r8712u 1-4:1.0 wlp0s2f1u4: renamed from wlan0
[   21.997197] systemd-udevd[452]: renamed network interface wlan0 to wlp0s2f1u4
[   28.252740] r8712u 1-4:1.0 wlp0s2f1u4: 1 RCR=0x153f00e
[   28.253856] r8712u 1-4:1.0 wlp0s2f1u4: 2 RCR=0x553f00e
[   28.359221] IPv6: ADDRCONF(NETDEV_UP): wlp0s2f1u4: link is not ready
[   28.664239] IPv6: ADDRCONF(NETDEV_UP): wlp0s2f1u4: link is not ready
[   28.978248] IPv6: ADDRCONF(NETDEV_UP): wlp0s2f1u4: link is not ready
[   56.734442] IPv6: ADDRCONF(NETDEV_CHANGE): wlp0s2f1u4: link becomes ready
...


$ nmcli device 
DEVICE  TYPE  STATE  CONNECTION 
wlp0s2f1u4  wifi  connected  ap   


$ iwconfig wlp0s2f1u4 
wlp0s2f1u4  IEEE 802.11bgn  ESSID:"ap"  Nickname:"rtl_wifi"
  Mode:Managed  Frequency:2.457 GHz  Access Point: 00:11:33:55:77:99   
  Bit Rate:150 Mb/s   Sensitivity:0/0  
  Retry:off   RTS thr:off   Fragment thr:off
  Power Management:off
  Link Quality=98/100  Signal level=48/100  Noise level=0/100
  Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
  Tx excessive retries:0  Invalid misc:0   Missed beacon:0


$ systemctl suspend


$ dmesg
...
[ 6218.212944] IPv6: ADDRCONF(NETDEV_CHANGE): wlp0s2f1u4: link becomes ready
[ 6218.426509] IPv6: ADDRCONF(NETDEV_UP): wlp0s2f1u4: link is not ready
[ 6219.437930] r8712u 1-4:1.0 wlp0s2f1u4: Suspending...
[ 6219.437932] r8712u 1-4:1.0 wlp0s2f1u4: Unable to suspend
[ 6222.063982] r8712u 1-4:1.0 wlp0s2f1u4: Resuming...
[ 6222.063984] r8712u 1-4:1.0 wlp0s2f1u4: Unable to resume
[ 6222.380137] IPv6: ADDRCONF(NETDEV_UP): wlp0s2f1u4: link is not ready
[ 6222.703179] IPv6: ADDRCONF(NETDEV_UP): wlp0s2f1u4: link is not ready
[ 6222.718697] r8712u 1-4:1.0 wlp0s2f1u4: In r8711_wx_set_scan: bDriverStopped=1
[ 6246.403973] r8712u 1-4:1.0 wlp0s2f1u4: In r8711_wx_set_scan: bDriverStopped=1
[ 6269.423294] r8712u 1-4:1.0 wlp0s2f1u4: In r8711_wx_set_scan: bDriverStopped=1
[ 6302.435194] r8712u 1-4:1.0 wlp0s2f1u4: In r8711_wx_set_scan: bDriverStopped=1
...


$ nmcli radio wifi 
enabled


$ nmcli device 
DEVICE  TYPE  STATE CONNECTION 
wlp0s2f1u4  wifi  disconnected  -- 


$ iwconfig wlp0s2f1u4 
wlp0s2f1u4  unassociated  Nickname:"rtl_wifi"
  Mode:Managed  Access Point: Not-Associated   Sensitivity:0/0  
  Retry:off   RTS thr:off   Fragment thr:off
  Power Management:off
  Link Quality:0  Signal level:0  Noise level:0
  Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
  Tx excessive retries:0  Invalid misc:0   Missed beacon:0


$ nmcli device connect wlp0s2f1u4 
Error: Device activation failed: The device has no connections available.


# modprobe -rv r8712u && modprobe -v r8712u
rmmod r8712u
insmod 
/lib/modules/3.17.0-1.fc21.x86_64/kernel/drivers/staging/rtl8712/r8712u.ko.xz 


$ dmesg
...
[ 6809.514301] usbcore: deregistering interface driver r8712u
[ 6809.858958] usb 1-4: reset high-speed USB device number 4 using ehci-pci
[ 6809.992458] r8712u: module is from the staging directory, the quality is 
unknown, you have been warned.
[ 6809.993163] r8712u: Staging version
[ 6809.993182] r8712u: register rtl8712_netdev_ops to netdev_ops
[ 6809.993187] usb 1-4: r8712u: USB_SPEED_HIGH with 4 endpoints
[ 6809.994152] usb 1-4: r8712u: Boot from EFUSE: Autoload OK
[ 6810.373993] usb 1-4: r8712u: CustomerID = 0x
[ 6810.374007] usb 1-4: r8712u: MAC Address from efuse = 00:11:22:33:44:55
[ 6810.374015] usb 1-4: r8712u: Loading firmware from "rtlwifi/rtl8712u.bin"
[ 6810.374824] usbcore: registered new interface driver r8712u
[ 6810.380437] r8712u 1-4:1.0 wlp0s2f1u4: renamed from wlan0
[ 6810.395219] systemd-udevd[3533]: renamed network interface wlan0 to 
wlp0s2f1u4
[ 6811.110320] r8712u 1-4:1.0 wlp0s2f1u4: 1 RCR=0x153f00e
[ 6811.110849] r8712u 1-4:1.0 wlp0s2f1u4: 2 RCR=0x553f00e
[ 6811.215147] IPv6: ADDRCONF(NETDEV_UP): wlp0s2f1u4: link

Re: [PATCH] mfd: rtsx: fix PM suspend for 5227 & 5249

2014-10-06 Thread Lee Jones
On Thu, 18 Sep 2014, micky_ch...@realsil.com.cn wrote:

> From: Micky Ching 
> 
> Fix rts5227&5249 failed send buffer cmd after suspend,
> PM_CTRL3 should reset before send any buffer cmd after suspend.
> Otherwise, buffer cmd will failed, this will lead resume fail.
> 
> Signed-off-by: Micky Ching 
> ---
>  drivers/mfd/Makefile |2 +-
>  drivers/mfd/rts5227.c|6 ++
>  drivers/mfd/rts5249.c|4 
>  drivers/mfd/rtsx_gops.c  |   36 
>  drivers/mfd/rtsx_pcr.h   |3 +++
>  include/linux/mfd/rtsx_pci.h |   12 
>  6 files changed, 62 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/mfd/rtsx_gops.c

[...]

> diff --git a/drivers/mfd/rtsx_gops.c b/drivers/mfd/rtsx_gops.c
> new file mode 100644
> index 000..3cf596f
> --- /dev/null
> +++ b/drivers/mfd/rtsx_gops.c
> @@ -0,0 +1,36 @@
> +/* Driver for Realtek PCI-Express card reader
> + *
> + * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU General Public License as published by the
> + * Free Software Foundation; either version 2, or (at your option) any
> + * later version.
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, see .
> + *
> + * Author:
> + *   Micky Ching 
> + */
> +
> +#include 
> +#include "rtsx_pcr.h"
> +
> +int rtsx_gops_pm_reset(struct rtsx_pcr *pcr)
> +{
> + int err;
> +
> + /* init aspm */
> + err = rtsx_pci_update_cfg_byte(pcr, LCTLR, 0xFC, 0);

I'm not keen on the magic numbers here.  Can you #define them?

> + if (err < 0)
> + return err;
> +
> + /* reset PM_CTRL3 before send buffer cmd */
> + return rtsx_pci_write_register(pcr, PM_CTRL3, 0x10, 0x00);

Same.

> +}
> diff --git a/drivers/mfd/rtsx_pcr.h b/drivers/mfd/rtsx_pcr.h
> index 07e4c2e..fe2bbb6 100644
> --- a/drivers/mfd/rtsx_pcr.h
> +++ b/drivers/mfd/rtsx_pcr.h
> @@ -72,4 +72,7 @@ do {
> \
>   pcr->ms_pull_ctl_disable_tbl = __device##_ms_pull_ctl_disable_tbl; \
>  } while (0)
>  
> +/* generic operations */
> +int rtsx_gops_pm_reset(struct rtsx_pcr *pcr);
> +
>  #endif
> diff --git a/include/linux/mfd/rtsx_pci.h b/include/linux/mfd/rtsx_pci.h
> index 74346d5..b34fec8 100644
> --- a/include/linux/mfd/rtsx_pci.h
> +++ b/include/linux/mfd/rtsx_pci.h
> @@ -967,4 +967,16 @@ static inline u8 *rtsx_pci_get_cmd_data(struct rtsx_pcr 
> *pcr)
>   return (u8 *)(pcr->host_cmds_ptr);
>  }
>  
> +static inline int rtsx_pci_update_cfg_byte(struct rtsx_pcr *pcr, int addr,
> + u8 mask, u8 append)
> +{
> + int err;
> + u8 val;
> +
> + err = pci_read_config_byte(pcr->pci, addr, &val);
> + if (err < 0)
> + return err;
> + return pci_write_config_byte(pcr->pci, addr, (val & mask) | append);
> +}
> +
>  #endif

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 42/44] efi: Register poweroff handler with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with low priority value of 64 since the efi code
states that this is a poweroff handler of last resort.

Cc: Matt Fleming 
Signed-off-by: Guenter Roeck 
---
 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..c082439 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 
  */
 #include 
+#include 
+#include 
 #include 
 
 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_poweroff_nb = {
+   .notifier_call = efi_power_off,
+   .priority = 64,
+};
+
 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_poweroff_handler(&efi_poweroff_nb);
+   if (ret)
+   pr_err("efi: Failed to register poweroff handler\n");
+   }
 
-   return 0;
+   return ret;
 }
 late_initcall(efi_shutdown_init);
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 39/44] x86: ce4100: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly.

Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: H. Peter Anvin 
Signed-off-by: Guenter Roeck 
---
 arch/x86/platform/ce4100/ce4100.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/platform/ce4100/ce4100.c 
b/arch/x86/platform/ce4100/ce4100.c
index 701fd58..4a7f3d6 100644
--- a/arch/x86/platform/ce4100/ce4100.c
+++ b/arch/x86/platform/ce4100/ce4100.c
@@ -164,5 +164,5 @@ void __init x86_ce4100_early_setup(void)
 */
reboot_type = BOOT_KBD;
 
-   pm_power_off = ce4100_power_off;
+   register_poweroff_handler_simple(ce4100_power_off, 128);
 }
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 17/44] mfd: tps65910: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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: Samuel Ortiz 
Cc: Lee Jones 
Signed-off-by: Guenter Roeck 
---
 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 f243e75..0b114d3 100644
--- a/drivers/mfd/tps65910.c
+++ b/drivers/mfd/tps65910.c
@@ -23,6 +23,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -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,
+poweroff_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,
@@ -500,9 +503,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->poweroff_nb.notifier_call = tps65910_power_off;
+   tps65910->poweroff_nb.priority = 64;
+   ret = register_poweroff_handler(&tps65910->poweroff_nb);
+   if (ret)
+   dev_err(&i2c->dev,
+   "failed to register poweroff handler\n");
}
 
ret = mfd_add_devices(tps65910->dev, -1,
@@ -522,6 +529,8 @@ static int tps65910_i2c_remove(struct i2c_client *i2c)
 {
struct tps65910 *tps65910 = i2c_get_clientdata(i2c);
 
+   unregister_poweroff_handler(&tps65910->poweroff_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..65cae2c 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;
+
+   /* Poweroff handling */
+   struct notifier_block poweroff_nb;
 };
 
 struct tps65910_platform_data {
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 08/44] kernel: Move pm_power_off to common code

2014-10-06 Thread Guenter Roeck
pm_power_off is defined for all architectures. Move it to common code.

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

Cc: Richard Henderson 
Cc: Ivan Kokshaysky 
Cc: Matt Turner 
Cc: Vineet Gupta 
Cc: Russell King 
Cc: Catalin Marinas 
Cc: Will Deacon 
Cc: Haavard Skinnemoen 
Cc: Hans-Christian Egtvedt 
Cc: Steven Miao 
Cc: Mark Salter 
Cc: Aurelien Jacquiot 
Cc: Mikael Starvik 
Cc: Jesper Nilsson 
Cc: David Howells 
Cc: Richard Kuo 
Cc: Tony Luck 
Cc: Fenghua Yu 
Cc: Hirokazu Takata 
Cc: Geert Uytterhoeven 
Cc: James Hogan 
Cc: Michal Simek 
Cc: Ralf Baechle 
Cc: Koichi Yasutake 
Cc: Jonas Bonn 
Cc: James E.J. Bottomley 
Cc: Helge Deller 
Cc: Benjamin Herrenschmidt 
Cc: Paul Mackerras 
Cc: Michael Ellerman 
Cc: Martin Schwidefsky 
Cc: Heiko Carstens 
Cc: Chen Liqin 
Cc: Lennox Wu 
Cc: David S. Miller 
Cc: Chris Metcalf 
Cc: Jeff Dike 
Cc: Richard Weinberger 
Cc: Guan Xuetao 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: H. Peter Anvin 
Cc: Konrad Rzeszutek Wilk 
Cc: Boris Ostrovsky 
Cc: David Vrabel 
Cc: Chris Zankel 
Cc: Max Filippov 
Cc: Rafael J. Wysocki 
Cc: Len Brown 
Cc: Pavel Machek 
Signed-off-by: Guenter Roeck 
---
 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/poweroff_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..a463e8f 100644
--- a/arch/alpha/kernel/process.c
+++ b/arch/alpha/kernel/process.c
@@ -24,6 +24,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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_poweroff();
+
common_shutdown(LINUX_REBOOT_CMD_POWER_OFF, NULL);
 }
 
diff --git a/arch/arc/kernel/reset.c b/arch/arc/kernel/reset.c
index 2768fa1..8a4fc47 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_poweroff();
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 9fced7b..954e79c 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_poweroff();
 }
 
 /*
diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c
index e0ef8ba..db396bb 100644
--- a/arch/arm64/kernel/process.c
+++ b/arch/arm64/kernel/process.c
@@ -94,8 +94,6 @@ void soft_restart(unsigned long addr)

[PATCH 09/44] mfd: palmas: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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: Samuel Ortiz 
Cc: Lee Jones 
Signed-off-by: Guenter Roeck 
---
 drivers/mfd/palmas.c   | 30 +-
 include/linux/mfd/palmas.h |  3 +++
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/mfd/palmas.c b/drivers/mfd/palmas.c
index 28cb048..4d78847 100644
--- a/drivers/mfd/palmas.c
+++ b/drivers/mfd/palmas.c
@@ -19,6 +19,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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, poweroff_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,15 @@ 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) {
+   palmas->poweroff_nb.notifier_call = palmas_power_off;
+   palmas->poweroff_nb.priority = 64;
+   ret = register_poweroff_handler(&palmas->poweroff_nb);
+   if (ret) {
+   dev_err(palmas->dev,
+   "Failed to register poweroff handler");
+   ret = 0;
+   }
}
}
 
@@ -698,10 +705,7 @@ 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;
-   }
+   unregister_poweroff_handler(&palmas->poweroff_nb);
 
return 0;
 }
diff --git a/include/linux/mfd/palmas.h b/include/linux/mfd/palmas.h
index fb0390a..4715057 100644
--- a/include/linux/mfd/palmas.h
+++ b/include/linux/mfd/palmas.h
@@ -18,6 +18,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -68,6 +69,8 @@ struct palmas {
struct i2c_client *i2c_clients[PALMAS_NUM_CLIENTS];
struct regmap *regmap[PALMAS_NUM_CLIENTS];
 
+   struct notifier_block poweroff_nb;
+
/* Stored chip id */
int id;
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 23/44] power/reset: qnap-poweroff: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with default priority value of 128 to reflect that
the original code generates an error if another poweroff handler has
already been registered when the driver is loaded.

Cc: Sebastian Reichel 
Cc: Dmitry Eremin-Solenikov 
Cc: David Woodhouse 
Signed-off-by: Guenter Roeck 
---
 drivers/power/reset/qnap-poweroff.c | 28 ++--
 1 file changed, 14 insertions(+), 14 deletions(-)

diff --git a/drivers/power/reset/qnap-poweroff.c 
b/drivers/power/reset/qnap-poweroff.c
index a75db7f..c474980 100644
--- a/drivers/power/reset/qnap-poweroff.c
+++ b/drivers/power/reset/qnap-poweroff.c
@@ -16,7 +16,9 @@
 
 #include 
 #include 
+#include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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_poweroff_nb = {
+   .notifier_call = qnap_power_off,
+   .priority = 128,
+};
+
 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,22 +115,13 @@ 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;
+   return register_poweroff_handler(&qnap_poweroff_nb);
 }
 
 static int qnap_power_off_remove(struct platform_device *pdev)
 {
-   pm_power_off = NULL;
+   unregister_poweroff_handler(&qnap_poweroff_nb);
+
return 0;
 }
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 06/44] gpio-poweroff: Drop reference to pm_power_off from devicetree bindings

2014-10-06 Thread Guenter Roeck
pm_power_off is an implementation detail. Replace it with a more generic
description of the driver's functionality.

Cc: Rob Herring 
Cc: Pawel Moll 
Cc: Mark Rutland 
Signed-off-by: Guenter Roeck 
---
 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..c95a1a6 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 poweroff 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 poweroff handler is called. If this optional
   property is not specified, the GPIO is initialized as an output in its
   inactive state.
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 21/44] power/reset: gpio-poweroff: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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.

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 poweroff handler has already been
registered. This is perfectly normal and acceptable.

Do not display a warning traceback if the poweroff handler fails to
power off the system. There may be other poweroff handlers.

Cc: Sebastian Reichel 
Cc: Dmitry Eremin-Solenikov 
Cc: David Woodhouse 
Signed-off-by: Guenter Roeck 
---
 drivers/power/reset/gpio-poweroff.c | 36 ++--
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/drivers/power/reset/gpio-poweroff.c 
b/drivers/power/reset/gpio-poweroff.c
index ce849bc..e95a7a1 100644
--- a/drivers/power/reset/gpio-poweroff.c
+++ b/drivers/power/reset/gpio-poweroff.c
@@ -14,18 +14,18 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
 #include 
 
-/*
- * 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);
 
@@ -42,20 +42,18 @@ static void gpio_poweroff_do_poweroff(void)
/* give it some time */
mdelay(3000);
 
-   WARN_ON(1);
+   return NOTIFY_DONE;
 }
 
+static struct notifier_block gpio_poweroff_nb = {
+   .notifier_call = gpio_poweroff_do_poweroff,
+   .priority = 64,
+};
+
 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,14 +75,16 @@ static int gpio_poweroff_probe(struct platform_device *pdev)
}
}
 
-   pm_power_off = &gpio_poweroff_do_poweroff;
-   return 0;
+   err = register_poweroff_handler(&gpio_poweroff_nb);
+   if (err)
+   dev_err(&pdev->dev, "Failed to register poweroff handler\n");
+
+   return err;
 }
 
 static int gpio_poweroff_remove(struct platform_device *pdev)
 {
-   if (pm_power_off == &gpio_poweroff_do_poweroff)
-   pm_power_off = NULL;
+   unregister_poweroff_handler(&gpio_poweroff_nb);
 
return 0;
 }
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 22/44] power/reset: as3722-poweroff: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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: Sebastian Reichel 
Cc: Dmitry Eremin-Solenikov 
Cc: David Woodhouse 
Signed-off-by: Guenter Roeck 
---
 drivers/power/reset/as3722-poweroff.c | 36 ++-
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/drivers/power/reset/as3722-poweroff.c 
b/drivers/power/reset/as3722-poweroff.c
index 6849711..7ebaed9 100644
--- a/drivers/power/reset/as3722-poweroff.c
+++ b/drivers/power/reset/as3722-poweroff.c
@@ -17,32 +17,33 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
+#include 
 #include 
 
 struct as3722_poweroff {
struct device *dev;
struct as3722 *as3722;
+   struct notifier_block poweroff_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, poweroff_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,18 +64,19 @@ 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;
+   as3722_poweroff->poweroff_nb.notifier_call = as3722_power_off;
+   as3722_poweroff->poweroff_nb.priority = 64;
 
-   return 0;
+   platform_set_drvdata(pdev, as3722_poweroff);
+
+   return register_poweroff_handler(&as3722_poweroff->poweroff_nb);
 }
 
 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;
+   struct as3722_poweroff *as3722_poweroff = platform_get_drvdata(pdev);
+
+   unregister_poweroff_handler(&as3722_poweroff->poweroff_nb);
 
return 0;
 }
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 07/44] qnap-poweroff: Drop reference to pm_power_off from devicetree bindings

2014-10-06 Thread Guenter Roeck
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 
Cc: Pawel Moll 
Cc: Mark Rutland 
Signed-off-by: Guenter Roeck 
---
 Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt 
b/Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt
index af25e77..1e2260a 100644
--- a/Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt
+++ b/Documentation/devicetree/bindings/power_supply/qnap-poweroff.txt
@@ -3,8 +3,8 @@
 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. This driver installs a handler
+to power off the system.
 
 Synology NAS devices use a similar scheme, but a different baud rate,
 9600, and a different character, '1'.
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 40/44] x86: intel-mid: Drop registration of dummy poweroff handlers

2014-10-06 Thread Guenter Roeck
A dummy poweroff handler does not serve any purpose. Drop it.

Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: H. Peter Anvin 
Signed-off-by: Guenter Roeck 
---
 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

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 13/44] mfd: max8907: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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.

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 
Cc: Samuel Ortiz 
Signed-off-by: Guenter Roeck 
---
 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..b8cddc1 100644
--- a/drivers/mfd/max8907.c
+++ b/drivers/mfd/max8907.c
@@ -19,6 +19,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -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,
+  poweroff_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->poweroff_nb.notifier_call = max8907_power_off;
+   max8907->poweroff_nb.priority = 64;
+   ret = register_poweroff_handler(&max8907->poweroff_nb);
+   if (ret)
+   dev_err(&i2c->dev,
+   "Failed to register poweroff handler");
}
 
return 0;
@@ -293,6 +303,8 @@ static int max8907_i2c_remove(struct i2c_client *i2c)
 {
struct max8907 *max8907 = i2c_get_clientdata(i2c);
 
+   unregister_poweroff_handler(&max8907->poweroff_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..016428e 100644
--- a/include/linux/mfd/max8907.h
+++ b/include/linux/mfd/max8907.h
@@ -13,6 +13,7 @@
 #define __LINUX_MFD_MAX8907_H
 
 #include 
+#include 
 #include 
 
 #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   poweroff_nb;
 };
 
 #endif
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 36/44] mips: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly.

If there is an indication that there can be more than one poweroff handler,
use register_poweroff_handler, otherwise use register_poweroff_handler_simple
to register the poweroff handler.

If the poweroff handler only resets or stops the system, select a priority of
0 to indicate that the poweroff handler is one of last resort. If the poweroff
handler powers off the system, select a priority of 128, unless the poweroff
handler installation code suggests that there can be more than one poweroff
handler and the new handler is only installed conditionally. In this case,
select a priority of 64.

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

diff --git a/arch/mips/alchemy/board-gpr.c b/arch/mips/alchemy/board-gpr.c
index acf9a2a..56190a3 100644
--- a/arch/mips/alchemy/board-gpr.c
+++ b/arch/mips/alchemy/board-gpr.c
@@ -89,7 +89,7 @@ void __init board_setup(void)
 {
printk(KERN_INFO "Trapeze ITS GPR board\n");
 
-   pm_power_off = gpr_power_off;
+   register_poweroff_handler_simple(gpr_power_off, 0);
_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..e2b06b5 100644
--- a/arch/mips/alchemy/board-mtx1.c
+++ b/arch/mips/alchemy/board-mtx1.c
@@ -98,7 +98,7 @@ 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_poweroff_handler_simple(mtx1_power_off, 0);
_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..aaa5f5f 100644
--- a/arch/mips/alchemy/board-xxs1500.c
+++ b/arch/mips/alchemy/board-xxs1500.c
@@ -79,7 +79,7 @@ void __init board_setup(void)
 {
u32 pin_func;
 
-   pm_power_off = xxs1500_power_off;
+   register_poweroff_handler_simple(xxs1500_power_off, 0);
_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 8df86eb..1734f72 100644
--- a/arch/mips/alchemy/devboards/platform.c
+++ b/arch/mips/alchemy/devboards/platform.c
@@ -6,6 +6,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -61,10 +62,22 @@ static void db1x_reset(char *c)
bcsr_write(BCSR_SYSTEM, 0);
 }
 
+static int db1x_power_off_notify(struct notifier *this,
+unsigned long unused1, void *unused2)
+{
+   db1x_power_off();
+   return NOTIFY_DONE;
+}
+
+static struct notifier_block db1x_poweroff_nb = {
+   .notifier_call = db1x_power_off_notify,
+   .priority = 64,
+}
+
 static int __init db1x_late_setup(void)
 {
-   if (!pm_power_off)
-   pm_power_off = db1x_power_off;
+   if (register_poweroff_handler(&db1x_poweroff_nb))
+   pr_err("dbx1: Failed to register poweroff 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..464067e 100644
--- a/arch/mips/ar

[PATCH 31/44] arm: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Always use register_poweroff_handler_simple as there is no
indication that more than one poweroff handler is registered.

If the poweroff handler only resets the system or puts the CPU in sleep mode,
select a priority of 0 to indicate that the poweroff handler is one of last
resort. If the poweroff handler powers off the system, select a priority
of 128.

Cc: Russell King 
Cc: Andrew Victor 
Cc: Nicolas Ferre 
Cc: Jean-Christophe Plagniol-Villard 
Cc: Stephen Warren 
Cc: Christian Daudt 
Cc: Matt Porter 
Cc: Anton Vorontsov 
Cc: Rob Herring 
Cc: Shawn Guo 
Cc: Sascha Hauer 
Cc: Imre Kaloz 
Cc: Krzysztof Halasa 
Cc: Tony Lindgren 
Cc: Jason Cooper 
Cc: Andrew Lunn 
Cc: Sebastian Hesselbarth 
Cc: Eric Miao 
Cc: Haojian Zhuang 
Cc: Robert Jarzmik 
Cc: Marek Vasut 
Cc: Ben Dooks 
Cc: Kukjin Kim 
Cc: Linus Walleij 
Cc: Tony Prisk 
Cc: Stefano Stabellini 
Signed-off-by: Guenter Roeck 
---
 arch/arm/kernel/psci.c | 2 +-
 arch/arm/mach-at91/board-gsia18s.c | 2 +-
 arch/arm/mach-at91/setup.c | 4 ++--
 arch/arm/mach-bcm/board_bcm2835.c  | 2 +-
 arch/arm/mach-cns3xxx/cns3420vb.c  | 2 +-
 arch/arm/mach-cns3xxx/core.c   | 2 +-
 arch/arm/mach-highbank/highbank.c  | 2 +-
 arch/arm/mach-imx/mach-mx31moboard.c   | 2 +-
 arch/arm/mach-iop32x/em7210.c  | 2 +-
 arch/arm/mach-iop32x/glantank.c| 2 +-
 arch/arm/mach-iop32x/iq31244.c | 2 +-
 arch/arm/mach-iop32x/n2100.c   | 2 +-
 arch/arm/mach-ixp4xx/dsmg600-setup.c   | 2 +-
 arch/arm/mach-ixp4xx/nas100d-setup.c   | 2 +-
 arch/arm/mach-ixp4xx/nslu2-setup.c | 2 +-
 arch/arm/mach-omap2/board-omap3touchbook.c | 2 +-
 arch/arm/mach-orion5x/board-mss2.c | 2 +-
 arch/arm/mach-orion5x/dns323-setup.c   | 6 +++---
 arch/arm/mach-orion5x/kurobox_pro-setup.c  | 2 +-
 arch/arm/mach-orion5x/ls-chl-setup.c   | 2 +-
 arch/arm/mach-orion5x/ls_hgl-setup.c   | 2 +-
 arch/arm/mach-orion5x/lsmini-setup.c   | 2 +-
 arch/arm/mach-orion5x/mv2120-setup.c   | 2 +-
 arch/arm/mach-orion5x/net2big-setup.c  | 2 +-
 arch/arm/mach-orion5x/terastation_pro2-setup.c | 2 +-
 arch/arm/mach-orion5x/ts209-setup.c| 2 +-
 arch/arm/mach-orion5x/ts409-setup.c| 2 +-
 arch/arm/mach-pxa/corgi.c  | 2 +-
 arch/arm/mach-pxa/mioa701.c| 2 +-
 arch/arm/mach-pxa/poodle.c | 2 +-
 arch/arm/mach-pxa/spitz.c  | 2 +-
 arch/arm/mach-pxa/tosa.c   | 2 +-
 arch/arm/mach-pxa/viper.c  | 2 +-
 arch/arm/mach-pxa/z2.c | 6 +++---
 arch/arm/mach-pxa/zeus.c   | 6 +++---
 arch/arm/mach-s3c24xx/mach-gta02.c | 2 +-
 arch/arm/mach-s3c24xx/mach-jive.c  | 2 +-
 arch/arm/mach-s3c24xx/mach-vr1000.c| 2 +-
 arch/arm/mach-s3c64xx/mach-smartq.c| 2 +-
 arch/arm/mach-sa1100/generic.c | 2 +-
 arch/arm/mach-sa1100/simpad.c  | 2 +-
 arch/arm/mach-u300/regulator.c | 2 +-
 arch/arm/mach-vt8500/vt8500.c  | 2 +-
 arch/arm/xen/enlighten.c   | 2 +-
 44 files changed, 51 insertions(+), 51 deletions(-)

diff --git a/arch/arm/kernel/psci.c b/arch/arm/kernel/psci.c
index f73891b..dd58d86 100644
--- a/arch/arm/kernel/psci.c
+++ b/arch/arm/kernel/psci.c
@@ -264,7 +264,7 @@ static int psci_0_2_init(struct device_node *np)
 
arm_pm_restart = psci_sys_reset;
 
-   pm_power_off = psci_sys_poweroff;
+   register_poweroff_handler_simple(psci_sys_poweroff, 128);
 
 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 b729dd1..6722e66 100644
--- a/arch/arm/mach-at91/board-gsia18s.c
+++ b/arch/arm/mach-at91/board-gsia18s.c
@@ -521,7 +521,7 @@ static void gsia18s_power_off(void)
 
 static int __init gsia18s_power_off_init(void)
 {
-   pm_power_off = gsia18s_power_off;
+   register_poweroff_handler_simple(gsia18s_power_off, 128);
return 0;
 }
 
diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c
index f7a07a5..9989e88 100644
--- a/arch/arm/mach-at91/setup.c
+++ b/arch/arm/mach-at91/setup.c
@@ -329,7 +329,7 @@ void __init at91_ioremap_shdwc(u32 base_addr)
at91_shdwc_base = ioremap(base_addr, 16);
if (!at91_shdwc_base)
panic("Impossible to ioremap at91_shdwc_base\n");
-   pm_power_off = at91sam9_poweroff;
+   register_poweroff_handler_simple(at91sam9_poweroff, 128);
 }
 
 void __iomem *at91_rstc_base;
@@ -482,7 +482,7 @@ static void at91_dt_shdwc(void)
at91_shdwc_write(AT91_SHDW_MR, wakeup_mode | mode);
 
 end:
-   pm_power_off = at91sam9_poweroff;
+

[PATCH 32/44] arm64: psci: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly.

Cc: Catalin Marinas 
Cc: Will Deacon 
Signed-off-by: Guenter Roeck 
---
 arch/arm64/kernel/psci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
index 5539547..c1f3d09 100644
--- a/arch/arm64/kernel/psci.c
+++ b/arch/arm64/kernel/psci.c
@@ -286,7 +286,7 @@ static int __init psci_0_2_init(struct device_node *np)
 
arm_pm_restart = psci_sys_reset;
 
-   pm_power_off = psci_sys_poweroff;
+   register_poweroff_handler_simple(psci_sys_poweroff, 128);
 
 out_put_node:
of_node_put(np);
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 33/44] avr32: atngw100: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly.

Cc: Haavard Skinnemoen 
Cc: Hans-Christian Egtvedt 
Signed-off-by: Guenter Roeck 
---
 arch/avr32/boards/atngw100/mrmt.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/avr32/boards/atngw100/mrmt.c 
b/arch/avr32/boards/atngw100/mrmt.c
index 91146b4..54d0c27 100644
--- a/arch/avr32/boards/atngw100/mrmt.c
+++ b/arch/avr32/boards/atngw100/mrmt.c
@@ -274,7 +274,7 @@ 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_poweroff_handler_simple(mrmt_power_off, 128);
 
/* Setup USARTS (other than console) */
at32_map_usart(2, 1, 0);/* USART 2: /dev/ttyS1, RMT1:DB9M */
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 43/44] hwmon: (ab8500) Call kernel_power_off instead of pm_power_off

2014-10-06 Thread Guenter Roeck
Drivers should not call pm_power_off directly; it is not guaranteed
to be non-NULL. Call kernel_power_off instead.

Cc: Jean Delvare 
Reviewed-by: Jean Delvare 
Signed-off-by: Guenter Roeck 
---
 drivers/hwmon/ab8500.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/hwmon/ab8500.c b/drivers/hwmon/ab8500.c
index d844dc8..8b6a4f4 100644
--- a/drivers/hwmon/ab8500.c
+++ b/drivers/hwmon/ab8500.c
@@ -6,7 +6,7 @@
  *
  * When the AB8500 thermal warning temperature is reached (threshold cannot
  * be changed by SW), an interrupt is set, and if no further action is taken
- * within a certain time frame, pm_power off will be called.
+ * within a certain time frame, kernel_power_off will be called.
  *
  * When AB8500 thermal shutdown temperature is reached a hardware shutdown of
  * the AB8500 will occur.
@@ -21,6 +21,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include "abx500.h"
@@ -106,7 +107,7 @@ static void ab8500_thermal_power_off(struct work_struct 
*work)
 
dev_warn(&abx500_data->pdev->dev, "Power off due to critical temp\n");
 
-   pm_power_off();
+   kernel_power_off();
 }
 
 static ssize_t ab8500_show_name(struct device *dev,
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 26/44] x86: iris: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with high priority value of 192 to reflect that
the original code overwrites existing poweroff handlers.

Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: H. Peter Anvin 
Signed-off-by: Guenter Roeck 
---
 arch/x86/platform/iris/iris.c | 25 +++--
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/arch/x86/platform/iris/iris.c b/arch/x86/platform/iris/iris.c
index 4d171e8..662c4e8 100644
--- a/arch/x86/platform/iris/iris.c
+++ b/arch/x86/platform/iris/iris.c
@@ -23,6 +23,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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_poweroff_nb = {
+   .notifier_call = iris_power_off,
+   .priority = 192,
+};
+
 /*
  * 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,26 @@ 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 = register_poweroff_handler(&iris_poweroff_nb);
+   if (ret) {
+   dev_err(&pdev->dev, "Failed to register poweroff 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;
+   unregister_poweroff_handler(&iris_poweroff_nb);
printk(KERN_INFO "Iris power_off handler uninstalled.\n");
return 0;
 }
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 04/44] m68k: Replace mach_power_off with pm_power_off

2014-10-06 Thread Guenter Roeck
Replace mach_power_off with pm_power_off to simplify the subsequent
move of pm_power_off to generic code.

Cc: Geert Uytterhoeven 
Cc: Greg Ungerer 
Cc: Joshua Thompson 
Signed-off-by: Guenter Roeck 
---
 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 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -90,5 +91,5 @@ void __init nf_init(void)
pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16,
version & 0x);
 
-   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 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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 = 0x00ff; /* 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 
 #include 
 #include 
+#include 
 /* keyb */
 #include 
 #include 
@@ -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 = 0x;
 #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
mach_beep = mac_mksound;
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 18/44] mfd: twl4030-power: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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.

Make twl4030_power_off static as it is only called from the twl4030-power
driver.

Cc: Samuel Ortiz 
Cc: Lee Jones 
Signed-off-by: Guenter Roeck 
---
 drivers/mfd/twl4030-power.c | 25 +
 include/linux/i2c/twl.h |  1 -
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/drivers/mfd/twl4030-power.c b/drivers/mfd/twl4030-power.c
index 4d3ff37..bd6b830 100644
--- a/drivers/mfd/twl4030-power.c
+++ b/drivers/mfd/twl4030-power.c
@@ -25,9 +25,10 @@
  */
 
 #include 
-#include 
+#include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -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_poweroff_nb = {
+   .notifier_call = twl4030_power_off,
+   .priority = 64,
+};
+
 static bool twl4030_power_use_poweroff(const struct twl4030_power_data *pdata,
struct device_node *node)
 {
@@ -836,7 +845,7 @@ 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)) {
/* 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);
@@ -853,7 +862,13 @@ static int twl4030_power_probe(struct platform_device 
*pdev)
}
}
 
-   pm_power_off = twl4030_power_off;
+   err = register_poweroff_handler(&twl4030_poweroff_nb);
+   if (err) {
+   dev_err(&pdev->dev,
+   "Failed to register poweroff handler\n");
+   /* Not a fatal error */
+   err = 0;
+   }
}
 
 relock:
@@ -869,6 +884,8 @@ relock:
 
 static int twl4030_power_remove(struct platform_device *pdev)
 {
+   unregister_poweroff_handler(&twl4030_poweroff_nb);
+
return 0;
 }
 
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

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 27/44] x86: apm: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with high priority value of 192 to reflect that
the original code overwrites existing poweroff handlers.

Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: H. Peter Anvin 
Cc: Jiri Kosina 
Signed-off-by: Guenter Roeck 
---
 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..84566a6 100644
--- a/arch/x86/kernel/apm_32.c
+++ b/arch/x86/kernel/apm_32.c
@@ -219,6 +219,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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_poweroff_nb = {
+   .notifier_call = apm_power_off,
+   .priority = 192,
+};
+
 #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_poweroff_handler(&apm_poweroff_nb);
+   if (error)
+   pr_err("apm: Failed to register poweroff 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_poweroff_handler(&apm_poweroff_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

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 01/44] kernel: Add support for poweroff handler call chain

2014-10-06 Thread Guenter Roeck
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 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 poweroff 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 poweroff 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 poweroff functionality are expected to register with this call chain.
By using the priority field in the notifier block, callers can control
poweroff handler execution sequence and thus ensure that the poweroff
handler with the optimal capabilities to remove power for a given system
is called first.

Cc: Andrew Morton 
cc: Heiko Stuebner 
Cc: Romain Perier 
Cc: Rafael J. Wysocki 
Cc: Len Brown 
Cc: Pavel Machek 
Cc: Alexander Graf 
Cc: Geert Uytterhoeven 
Signed-off-by: Guenter Roeck 
---
 include/linux/pm.h  |  13 +++
 kernel/power/Makefile   |   1 +
 kernel/power/poweroff_handler.c | 172 
 3 files changed, 186 insertions(+)
 create mode 100644 kernel/power/poweroff_handler.c

diff --git a/include/linux/pm.h b/include/linux/pm.h
index 72c0fe0..45271b5 100644
--- a/include/linux/pm.h
+++ b/include/linux/pm.h
@@ -34,6 +34,19 @@
 extern void (*pm_power_off)(void);
 extern void (*pm_power_off_prepare)(void);
 
+/*
+ * Callbacks to manage poweroff handlers
+ */
+
+struct notifier_block;
+
+extern int register_poweroff_handler(struct notifier_block *);
+extern int register_poweroff_handler_simple(void (*function)(void),
+   int priority);
+extern int unregister_poweroff_handler(struct notifier_block *);
+extern void do_kernel_poweroff(void);
+extern bool have_kernel_poweroff(void);
+
 struct device; /* we have a circular dep with device.h */
 #ifdef CONFIG_VT_CONSOLE_SLEEP
 extern void pm_vt_switch_required(struct device *dev, bool required);
diff --git a/kernel/power/Makefile b/kernel/power/Makefile
index 29472bf..4d9f0c7 100644
--- a/kernel/power/Makefile
+++ b/kernel/power/Makefile
@@ -2,6 +2,7 @@
 ccflags-$(CONFIG_PM_DEBUG) := -DDEBUG
 
 obj-y  += qos.o
+obj-y  += poweroff_handler.o
 obj-$(CONFIG_PM)   += main.o
 obj-$(CONFIG_VT_CONSOLE_SLEEP) += console.o
 obj-$(CONFIG_FREEZER)  += process.o
diff --git a/kernel/power/poweroff_handler.c b/kernel/power/poweroff_handler.c
new file mode 100644
index 000..ed99e5e
--- /dev/null
+++ b/kernel/power/poweroff_handler.c
@@ -0,0 +1,172 @@
+/*
+ * linux/kernel/power/poweroff_handler.c - Poweroff 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)"poweroff: " fmt
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+/*
+ * Notifier list for kernel code which wants to be called
+ * to power off the system.
+ */
+static ATOMIC_NOTIFIER_HEAD(poweroff_handler_list);
+
+/**
+ * register_poweroff_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:  Poweroff handler of last resort,
+ * with limited poweroff capabilities,
+ * such as poweroff handlers which
+ * do not really power off the system
+ * but loop forever or stop the CPU.
+ * 128:Default poweroff handler; use if no other
+ * poweroff handler is expected to be available,
+ * and/or if poweroff functionality is
+ *   

[PATCH 34/44] ia64: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with lower priority of 64 to reflect that the call
is expected to be replaced at some point.

Cc: Tony Luck 
Cc: Fenghua Yu 
Signed-off-by: Guenter Roeck 
---
 arch/ia64/sn/kernel/setup.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/ia64/sn/kernel/setup.c b/arch/ia64/sn/kernel/setup.c
index 36182c8..6c83425 100644
--- a/arch/ia64/sn/kernel/setup.c
+++ b/arch/ia64/sn/kernel/setup.c
@@ -488,12 +488,12 @@ void __init sn_setup(char **cmdline_p)
sn_timer_init();
 
/*
-* set pm_power_off to a SAL call to allow
+* set poweroff 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_poweroff_handler_simple(ia64_sn_power_down, 64);
current->thread.flags |= IA64_THREAD_MIGRATION;
 }
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 14/44] mfd: tps80031: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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: Samuel Ortiz 
Cc: Lee Jones 
Signed-off-by: Guenter Roeck 
---
 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..24625a6 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,
+poweroff_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->poweroff_nb.notifier_call = tps80031_power_off;
+   tps80031->poweroff_nb.priority = 64;
+   ret = register_poweroff_handler(&tps80031->poweroff_nb);
+   if (ret)
+   dev_err(&client->dev,
+   "Failed to register poweroff 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_poweroff_handler(&tps80031->poweroff_nb);
 
mfd_remove_devices(tps80031->dev);
 
diff --git a/include/linux/mfd/tps80031.h b/include/linux/mfd/tps80031.h
index 2c75c9c..49bc006 100644
--- a/include/linux/mfd/tps80031.h
+++ b/include/linux/mfd/tps80031.h
@@ -24,6 +24,7 @@
 #define __LINUX_MFD_TPS80031_H
 
 #include 
+#include 
 #include 
 
 /* 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   poweroff_nb;
 };
 
 struct tps80031_pupd_init_data {
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 15/44] mfd: dm355evm_msp: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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: Samuel Ortiz 
Cc: Lee Jones 
Signed-off-by: Guenter Roeck 
---
 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..52a82f3 100644
--- a/drivers/mfd/dm355evm_msp.c
+++ b/drivers/mfd/dm355evm_msp.c
@@ -14,6 +14,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -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_poweroff_nb = {
+   .notifier_call = dm355evm_power_off,
+   .priority = 64,
+};
+
 static int dm355evm_msp_remove(struct i2c_client *client)
 {
-   pm_power_off = NULL;
+   unregister_poweroff_handler(&dm355evm_msp_poweroff_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_poweroff_handler(&dm355evm_msp_poweroff_nb);
+   if (status)
+   dev_err(&client->dev, "Failed to register poweroff handler\n");
 
return 0;
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 24/44] power/reset: msm-powroff: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Select proprity 0 since the code does not really poweroff
the system.

Signed-off-by: Guenter Roeck 
---
 drivers/power/reset/msm-poweroff.c | 13 +++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/power/reset/msm-poweroff.c 
b/drivers/power/reset/msm-poweroff.c
index 774f9a3..189bcd3 100644
--- a/drivers/power/reset/msm-poweroff.c
+++ b/drivers/power/reset/msm-poweroff.c
@@ -19,6 +19,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include 
@@ -31,12 +32,19 @@ static void do_msm_restart(enum reboot_mode reboot_mode, 
const char *cmd)
mdelay(1);
 }
 
-static void do_msm_poweroff(void)
+static int do_msm_poweroff(struct notifier_block *this,
+  unsigned long unused1, void *unused2)
 {
/* TODO: Add poweroff capability */
do_msm_restart(REBOOT_HARD, NULL);
+
+   return NOTIFY_DONE;
 }
 
+static struct notifier_block msm_powroff_nb = {
+   .notifier_call = do_msm_poweroff,
+};
+
 static int msm_restart_probe(struct platform_device *pdev)
 {
struct device *dev = &pdev->dev;
@@ -47,7 +55,8 @@ static int msm_restart_probe(struct platform_device *pdev)
if (IS_ERR(msm_ps_hold))
return PTR_ERR(msm_ps_hold);
 
-   pm_power_off = do_msm_poweroff;
+   if (register_poweroff_handler(&msm_powroff_nb))
+   dev_err(&pdev->dev, "Failed to register poweroff handler\n");
arm_pm_restart = do_msm_restart;
return 0;
 }
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 16/44] mfd: tps6586x: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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: Samuel Ortiz 
Cc: Lee Jones 
Signed-off-by: Guenter Roeck 
---
 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..bc14509 100644
--- a/drivers/mfd/tps6586x.c
+++ b/drivers/mfd/tps6586x.c
@@ -21,10 +21,12 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 
@@ -133,6 +135,8 @@ struct tps6586x {
u32 irq_en;
u8  mask_reg[5];
struct irq_domain   *irq_domain;
+
+   struct notifier_block   poweroff_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,
+poweroff_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->poweroff_nb.notifier_call = tps6586x_power_off;
+   tps6586x->poweroff_nb.priority = 64;
+   ret = register_poweroff_handler(&tps6586x->poweroff_nb);
+   if (ret)
+   dev_err(&client->dev,
+   "failed to register poweroff 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_poweroff_handler(&tps6586x->poweroff_nb);
+
tps6586x_remove_subdevs(tps6586x);
mfd_remove_devices(tps6586x->dev);
if (client->irq)
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 25/44] power/reset: vexpress-poweroff: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly.

Signed-off-by: Guenter Roeck 
---
 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..060c55d 100644
--- a/drivers/power/reset/vexpress-poweroff.c
+++ b/drivers/power/reset/vexpress-poweroff.c
@@ -12,6 +12,7 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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_poweroff_nb = {
+   .notifier_call = vexpress_power_off,
+   .priority = 128,
+};
+
 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_poweroff_handler(&vexpress_poweroff_nb);
+   if (ret) {
+   dev_err(&pdev->dev,
+   "Failed to register poweroff handler\n");
+   return ret;
+   }
break;
case FUNC_RESET:
if (!vexpress_restart_device)
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 19/44] ipmi: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with a high priority value of 192 to reflect that
the original code overwrites pm_power_off unconditionally.

Register poweroff 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.

Cc: Corey Minyard 
Signed-off-by: Guenter Roeck 
---
 drivers/char/ipmi/ipmi_poweroff.c | 30 +++---
 1 file changed, 19 insertions(+), 11 deletions(-)

diff --git a/drivers/char/ipmi/ipmi_poweroff.c 
b/drivers/char/ipmi/ipmi_poweroff.c
index 9f2e3be..a942a41 100644
--- a/drivers/char/ipmi/ipmi_poweroff.c
+++ b/drivers/char/ipmi/ipmi_poweroff.c
@@ -36,6 +36,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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_poweroff_nb = {
+   .notifier_call = ipmi_poweroff_function,
+   .priority = 192,
+};
+
 /* 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_poweroff_handler(&ipmi_poweroff_nb);
+   if (rv)
+   pr_err(PFX "failed to register poweroff 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_poweroff_handler(&ipmi_poweroff_nb);
+
ready = 0;
ipmi_destroy_user(ipmi_user);
-   pm_power_off = old_poweroff_func;
 }
 
 static struct ipmi_smi_watcher smi_watcher = {
@@ -732,12 +739,13 @@ static void __exit ipmi_poweroff_cleanup(void)
 
ipmi_smi_watcher_unregister(&smi_watcher);
 
+   unregister_poweroff_handler(&ipmi_poweroff_nb);
+
if (ready) {
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

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 38/44] x86: lguest: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly.

Cc: Rusty Russell 
Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: H. Peter Anvin 
Signed-off-by: Guenter Roeck 
---
 arch/x86/lguest/boot.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/lguest/boot.c b/arch/x86/lguest/boot.c
index aae9413..083a999 100644
--- a/arch/x86/lguest/boot.c
+++ b/arch/x86/lguest/boot.c
@@ -1441,7 +1441,7 @@ __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_poweroff_handler_simple(lguest_power_off, 128);
machine_ops.restart = lguest_restart;
 
/*
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 20/44] power/reset: restart-poweroff: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of seting pm_power_off
directly.  Register as poweroff handler of last resort since the driver
does not really power off the system but executes a restart.

Cc: Sebastian Reichel 
Cc: Dmitry Eremin-Solenikov 
Cc: David Woodhouse 
Signed-off-by: Guenter Roeck 
---
 drivers/power/reset/restart-poweroff.c | 25 -
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/drivers/power/reset/restart-poweroff.c 
b/drivers/power/reset/restart-poweroff.c
index edd707e..5437697 100644
--- a/drivers/power/reset/restart-poweroff.c
+++ b/drivers/power/reset/restart-poweroff.c
@@ -12,35 +12,34 @@
  */
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
+#include 
 #include 
-#include 
 
-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);
+
+   return NOTIFY_DONE;
 }
 
+static struct notifier_block restart_poweroff_handler = {
+   .notifier_call = restart_poweroff_do_poweroff,
+};
+
 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 register_poweroff_handler(&restart_poweroff_handler);
 }
 
 static int restart_poweroff_remove(struct platform_device *pdev)
 {
-   if (pm_power_off == &restart_poweroff_do_poweroff)
-   pm_power_off = NULL;
+   unregister_poweroff_handler(&restart_poweroff_handler);
 
return 0;
 }
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 11/44] mfd: retu: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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 
Cc: Samuel Ortiz 
Signed-off-by: Guenter Roeck 
---
 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..64b60fa 100644
--- a/drivers/mfd/retu-mfd.c
+++ b/drivers/mfd/retu-mfd.c
@@ -22,6 +22,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -43,6 +45,7 @@ struct retu_dev {
struct device   *dev;
struct mutexmutex;
struct regmap_irq_chip_data *irq_data;
+   struct notifier_block   poweroff_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,
+poweroff_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, ®);
@@ -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,13 @@ 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->poweroff_nb.notifier_call = retu_power_off;
+   rdev->poweroff_nb.priority = 64;
+   ret = register_poweroff_handler(&rdev->poweroff_nb);
+   if (ret)
+   dev_err(rdev->dev,
+   "Failed to register poweroff handler\n");
}
 
return 0;
@@ -291,10 +299,7 @@ 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;
-   }
+   unregister_poweroff_handler(&rdev->poweroff_nb);
mfd_remove_devices(rdev->dev);
regmap_del_irq_chip(i2c->irq, rdev->irq_data);
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 44/44] kernel: Remove pm_power_off

2014-10-06 Thread Guenter Roeck
No users of pm_power_off are left, so it is safe to remove the function.

Cc: Rafael J. Wysocki 
Cc: Pavel Machek 
Cc: Len Brown 
Signed-off-by: Guenter Roeck 
---
 include/linux/pm.h  |  1 -
 kernel/power/poweroff_handler.c | 10 +-
 2 files changed, 1 insertion(+), 10 deletions(-)

diff --git a/include/linux/pm.h b/include/linux/pm.h
index 45271b5..fce7645 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/poweroff_handler.c b/kernel/power/poweroff_handler.c
index 96f59ef..01a3a39 100644
--- a/kernel/power/poweroff_handler.c
+++ b/kernel/power/poweroff_handler.c
@@ -20,12 +20,6 @@
 #include 
 
 /*
- * 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.
  */
@@ -163,8 +157,6 @@ int register_poweroff_handler_simple(void (*handler)(void), 
int priority)
  */
 void do_kernel_poweroff(void)
 {
-   if (pm_power_off)
-   pm_power_off();
atomic_notifier_call_chain(&poweroff_handler_list, 0, NULL);
 }
 
@@ -175,6 +167,6 @@ void do_kernel_poweroff(void)
  */
 bool have_kernel_poweroff(void)
 {
-   return pm_power_off != NULL || poweroff_handler_list.head != NULL;
+   return poweroff_handler_list.head != NULL;
 }
 EXPORT_SYMBOL(have_kernel_poweroff);
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 35/44] m68k: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly.

Cc: Geert Uytterhoeven 
Cc: Joshua Thompson 
Signed-off-by: Guenter Roeck 
---
 arch/m68k/emu/natfeat.c | 2 +-
 arch/m68k/mac/config.c  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/m68k/emu/natfeat.c b/arch/m68k/emu/natfeat.c
index 91e2ae7..c4d5bd8 100644
--- a/arch/m68k/emu/natfeat.c
+++ b/arch/m68k/emu/natfeat.c
@@ -91,5 +91,5 @@ void __init nf_init(void)
pr_info("NatFeats found (%s, %lu.%lu)\n", buf, version >> 16,
version & 0x);
 
-   pm_power_off = nf_poweroff;
+   register_poweroff_handler_simple(nf_poweroff, 128);
 }
diff --git a/arch/m68k/mac/config.c b/arch/m68k/mac/config.c
index 677913ff..5d8e2e6 100644
--- a/arch/m68k/mac/config.c
+++ b/arch/m68k/mac/config.c
@@ -160,7 +160,7 @@ 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_poweroff_handler_simple(mac_poweroff, 128);
mach_max_dma_address = 0x;
 #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
mach_beep = mac_mksound;
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 10/44] mfd: axp20x: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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 
Cc: Samuel Ortiz 
Signed-off-by: Guenter Roeck 
---
 drivers/mfd/axp20x.c   | 30 +-
 include/linux/mfd/axp20x.h |  1 +
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index dee6539..238db4c 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -17,7 +17,8 @@
 #include 
 #include 
 #include 
-#include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -161,11 +162,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,
+poweroff_nb);
+
+   regmap_write(axp20x->regmap, AXP20X_OFF_CTRL, AXP20X_OFF);
+
+   return NOTIFY_DONE;
 }
 
 static int axp20x_i2c_probe(struct i2c_client *i2c,
@@ -215,10 +221,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->poweroff_nb.notifier_call = axp20x_power_off;
+   axp20x->poweroff_nb.priority = 64;
+   ret = register_poweroff_handler(&axp20x->poweroff_nb);
+   if (ret)
+   dev_err(&i2c->dev, "failed to register poweroff handler\n");
 
dev_info(&i2c->dev, "AXP20X driver loaded\n");
 
@@ -229,10 +236,7 @@ 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;
-   }
+   unregister_poweroff_handler(&axp20x->poweroff_nb);
 
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..8f23b39 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;
longvariant;
+   struct notifier_block   poweroff_nb;
 };
 
 #endif /* __LINUX_MFD_AXP20X_H */
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 12/44] mfd: ab8500-sysctrl: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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: Linus Walleij 
Cc: Lee Jones 
Cc: Samuel Ortiz 
Signed-off-by: Guenter Roeck 
---
 drivers/mfd/ab8500-sysctrl.c | 26 +++---
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/mfd/ab8500-sysctrl.c b/drivers/mfd/ab8500-sysctrl.c
index 8e0dae5..677438f 100644
--- a/drivers/mfd/ab8500-sysctrl.c
+++ b/drivers/mfd/ab8500-sysctrl.c
@@ -6,6 +6,7 @@
 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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;
@@ -34,11 +36,6 @@ static void ab8500_power_off(void)
struct power_supply *psy;
int ret;
 
-   if (sysctrl_dev == NULL) {
-   pr_err("%s: sysctrl not initialized\n", __func__);
-   return;
-   }
-
/*
 * If we have a charger connected and we're powering off,
 * reboot into charge-only mode.
@@ -83,8 +80,15 @@ shutdown:
 AB8500_STW4500CTRL1_SWRESET4500N);
(void)sigprocmask(SIG_SETMASK, &old, NULL);
}
+
+   return NOTIFY_DONE;
 }
 
+static struct notifier_block ab8500_poweroff_nb = {
+   .notifier_call = ab8500_power_off,
+   .priority = 64,
+};
+
 /*
  * 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 +189,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 +198,9 @@ static int ab8500_sysctrl_probe(struct platform_device 
*pdev)
 
sysctrl_dev = &pdev->dev;
 
-   if (!pm_power_off)
-   pm_power_off = ab8500_power_off;
+   err = register_poweroff_handler(&ab8500_poweroff_nb);
+   if (err)
+   dev_err(&pdev->dev, "Failed to register poweroff handler\n");
 
pdata = plat->sysctrl;
if (pdata) {
@@ -226,11 +232,9 @@ static int ab8500_sysctrl_probe(struct platform_device 
*pdev)
 
 static int ab8500_sysctrl_remove(struct platform_device *pdev)
 {
+   unregister_poweroff_handler(&ab8500_poweroff_nb);
sysctrl_dev = NULL;
 
-   if (pm_power_off == ab8500_power_off)
-   pm_power_off = NULL;
-
return 0;
 }
 
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 02/44] memory: emif: Use API function to determine poweroff capability

2014-10-06 Thread Guenter Roeck
Use have_kernel_poweroff() to determine if the kernel is able
to power off the system.

Cc: Santosh Shilimkar 
Signed-off-by: Guenter Roeck 
---
 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..acd830a 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_poweroff()) {
kernel_power_off();
} else {
-   WARN(1, "FIXME: NO pm_power_off!!! trying restart\n");
+   WARN(1, "FIXME: NO kernel poweroff capability!!! trying 
restart\n");
kernel_restart("SDRAM Over-temp Emergency restart");
}
return IRQ_HANDLED;
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 37/44] sh: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly.

Signed-off-by: Guenter Roeck 
---
 arch/sh/boards/board-sh7785lcr.c   | 2 +-
 arch/sh/boards/board-urquell.c | 2 +-
 arch/sh/boards/mach-highlander/setup.c | 2 +-
 arch/sh/boards/mach-landisk/setup.c| 2 +-
 arch/sh/boards/mach-r2d/setup.c| 2 +-
 arch/sh/boards/mach-sdk7786/setup.c| 2 +-
 6 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/arch/sh/boards/board-sh7785lcr.c b/arch/sh/boards/board-sh7785lcr.c
index 2c4771e..c092402 100644
--- a/arch/sh/boards/board-sh7785lcr.c
+++ b/arch/sh/boards/board-sh7785lcr.c
@@ -332,7 +332,7 @@ static void __init sh7785lcr_setup(char **cmdline_p)
 
printk(KERN_INFO "Renesas Technology Corp. R0P7785LC0011RL support.\n");
 
-   pm_power_off = sh7785lcr_power_off;
+   register_poweroff_handler_simple(sh7785lcr_power_off, 128);
 
/* 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..b3fa56f 100644
--- a/arch/sh/boards/board-urquell.c
+++ b/arch/sh/boards/board-urquell.c
@@ -204,7 +204,7 @@ static void __init urquell_setup(char **cmdline_p)
 {
printk(KERN_INFO "Renesas Technology Corp. Urquell support.\n");
 
-   pm_power_off = urquell_power_off;
+   register_poweroff_handler_simple(urquell_power_off, 128);
 
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..998f1a5 100644
--- a/arch/sh/boards/mach-highlander/setup.c
+++ b/arch/sh/boards/mach-highlander/setup.c
@@ -385,7 +385,7 @@ 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_poweroff_handler_simple(r7780rp_power_off, 128);
 }
 
 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..c817d80 100644
--- a/arch/sh/boards/mach-landisk/setup.c
+++ b/arch/sh/boards/mach-landisk/setup.c
@@ -89,7 +89,7 @@ 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_poweroff_handler_simple(landisk_power_off, 128);
 }
 
 /*
diff --git a/arch/sh/boards/mach-r2d/setup.c b/arch/sh/boards/mach-r2d/setup.c
index 4b98a52..a759d39 100644
--- a/arch/sh/boards/mach-r2d/setup.c
+++ b/arch/sh/boards/mach-r2d/setup.c
@@ -279,7 +279,7 @@ static void __init rts7751r2d_setup(char **cmdline_p)
(ver >> 4) & 0xf, ver & 0xf);
 
__raw_writew(0x, PA_OUTPORT);
-   pm_power_off = rts7751r2d_power_off;
+   register_poweroff_handler_simple(rts7751r2d_power_off, 128);
 
/* 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..cb26336 100644
--- a/arch/sh/boards/mach-sdk7786/setup.c
+++ b/arch/sh/boards/mach-sdk7786/setup.c
@@ -252,7 +252,7 @@ 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_poweroff_handler_simple(sdk7786_power_off, 128);
 
register_smp_ops(&shx3_smp_ops);
 }
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 03/44] hibernate: Call have_kernel_poweroff instead of checking pm_power_off

2014-10-06 Thread Guenter Roeck
Poweroff handlers may now be installed with register_poweroff_handler.
Use the new API function have_kernel_poweroff to determine if a poweroff
handler has been installed.

Cc: Rafael J. Wysocki 
Cc: Pavel Machek 
Cc: Len Brown 
Signed-off-by: Guenter Roeck 
---
 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..20353c5 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_poweroff())
kernel_power_off();
break;
 #ifdef CONFIG_SUSPEND
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 41/44] x86: pmc_atom: Register poweroff handler with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff 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: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: H. Peter Anvin 
Signed-off-by: Guenter Roeck 
---
 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 0c424a6..79331a2 100644
--- a/arch/x86/kernel/pmc_atom.c
+++ b/arch/x86/kernel/pmc_atom.c
@@ -20,6 +20,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 
@@ -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_poweroff_nb = {
+   .notifier_call = pmc_power_off,
+   .priority = 64,
+};
+
 static void pmc_hw_reg_setup(struct pmc_dev *pmc)
 {
/*
@@ -247,8 +257,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_poweroff_handler(&pmc_poweroff_nb);
+   if (ret)
+   dev_err(&pdev->dev,
+   "Failed to install poweroff handler\n");
+   }
 
pci_read_config_dword(pdev, PMC_BASE_ADDR_OFFSET, &pmc->base_addr);
pmc->base_addr &= PMC_BASE_ADDR_MASK;
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 30/44] acpi: Register poweroff handler with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with high priority value of 192 to reflect that
the driver explicitly overrides existing poweroff handlers.

Cc: Rafael J. Wysocki 
Cc: Len Brown 
Signed-off-by: Guenter Roeck 
---
 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 54da4a3..25aad22 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -15,6 +15,8 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 #include 
 #include 
 #include 
@@ -811,14 +813,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_poweroff_nb = {
+   .notifier_call = acpi_power_off,
+   .priority = 192,
+};
+
 int __init acpi_sleep_init(void)
 {
char supported[ACPI_S_STATE_COUNT * 3 + 1];
@@ -835,7 +845,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_poweroff_handler(&acpi_poweroff_nb))
+   pr_err("acpi: Failed to register poweroff handler\n");
}
 
supported[0] = 0;
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 28/44] x86: olpc: Register xo1 poweroff handler with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with high priority value of 192 to reflect that
the driver explicitly wants to override default poweroff handlers.

Cc: Thomas Gleixner 
Cc: Ingo Molnar 
Cc: H. Peter Anvin 
Signed-off-by: Guenter Roeck 
---
 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..96fba36 100644
--- a/arch/x86/platform/olpc/olpc-xo1-pm.c
+++ b/arch/x86/platform/olpc/olpc-xo1-pm.c
@@ -15,6 +15,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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(0x2000, acpi_base + CS5536_PM1_CNT);
+
+   return NOTIFY_DONE;
 }
 
+static struct notifier_block xo1_poweroff_nb = {
+   .notifier_call = xo1_power_off,
+   .priority = 192,
+};
+
 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_poweroff_handler(&xo1_poweroff_nb);
+   if (err) {
+   dev_err(&pdev->dev, "Failed to register poweroff 
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_poweroff_handler(&xo1_poweroff_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

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 29/44] staging: nvec: Register with kernel poweroff handler

2014-10-06 Thread Guenter Roeck
Register with kernel poweroff handler instead of setting pm_power_off
directly. Register with default priority value of 128 since we don't know
any better.

Cc: Julian Andres Klode 
Cc: Marc Dietrich 
Cc: Greg Kroah-Hartman 
Signed-off-by: Guenter Roeck 
---
 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..33d406c 100644
--- a/drivers/staging/nvec/nvec.c
+++ b/drivers/staging/nvec/nvec.c
@@ -33,6 +33,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -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,
+ poweroff_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->poweroff_nb.notifier_call = nvec_power_off;
+   nvec->poweroff_nb.priority = 128;
+   ret = register_poweroff_handler(&nvec->poweroff_nb);
+   if (ret)
+   dev_err(nvec->dev, "Failed to register poweroff 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_poweroff_handler(&nvec->poweroff_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..e5ee2af 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 poweroff_nb;
 };
 
 extern int nvec_write_async(struct nvec_chip *nvec, const unsigned char *data,
-- 
1.9.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 05/44] mfd: as3722: Drop reference to pm_power_off from devicetree bindings

2014-10-06 Thread Guenter Roeck
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 
Cc: Pawel Moll 
Cc: Mark Rutland 
Signed-off-by: Guenter Roeck 
---
 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

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel