[PATCH 4.7 038/184] powerpc: sysdev: cpm: fix gpio save_regs functions

2016-09-22 Thread Greg Kroah-Hartman
4.7-stable review patch.  If anyone has any objections, please let me know.

--

From: Christophe Leroy 

commit 41017a7579cf49cb5513e17df1570dc918760079 upstream.

of_mm_gpiochip_add_data() calls mm_gc->save_regs() before
setting the data. Therefore ->save_regs() cannot use
gpiochip_get_data()

[0.275940] Unable to handle kernel paging request for data at address 
0x0130
[0.283120] Faulting instruction address: 0xc01b44cc
[0.288175] Oops: Kernel access of bad area, sig: 11 [#1]
[0.293343] PREEMPT CMPC885
[0.296141] CPU: 0 PID: 1 Comm: swapper Not tainted 4.7.0-g65124df-dirty #68
[0.304131] task: c6074000 ti: c608 task.ti: c608
[0.309459] NIP: c01b44cc LR: c0011720 CTR: c0011708
[0.314372] REGS: c6081d90 TRAP: 0300   Not tainted  (4.7.0-g65124df-dirty)
[0.322267] MSR: 9032   CR: 2428  XER: 2000
[0.328813] DAR: 0130 DSISR: c000
GPR00: c01b6d0c c6081e40 c6074000 c6017000 c9028000 c601d028 c6081dd8 
GPR08: c601d028   0001 2444  c0002790 
GPR16:       c05643b0 0083
GPR24: c04a1a6c c056 c04a8308 c04c6480 c0012498 c6017000 c7ffcc78 c6017000
[0.360806] NIP [c01b44cc] gpiochip_get_data+0x4/0xc
[0.365684] LR [c0011720] cpm1_gpio16_save_regs+0x18/0x44
[0.370972] Call Trace:
[0.373451] [c6081e50] [c01b6d0c] of_mm_gpiochip_add_data+0x70/0xdc
[0.379624] [c6081e70] [c00124c0] cpm_init_par_io+0x28/0x118
[0.385238] [c6081e80] [c04a8ac0] do_one_initcall+0xb0/0x17c
[0.390819] [c6081ef0] [c04a8cbc] kernel_init_freeable+0x130/0x1dc
[0.396924] [c6081f30] [c00027a4] kernel_init+0x14/0x110
[0.402177] [c6081f40] [c000b424] ret_from_kernel_thread+0x5c/0x64
[0.408233] Instruction dump:
[0.411168] 4182fafc 3f80c040 48234c6d 3bc0fff0 3b9c5ed0 4bfffaf4 81290020 
712a0004
[0.418825] 4182fb34 48234c51 4bfffb2c 81230004 <80690130> 4e800020 7c0802a6 
9421ffe0
[0.426763] ---[ end trace fe4113ee21d72ffa ]---

fixes: e65078f1f3490 ("powerpc: sysdev: cpm1: use gpiochip data pointer")
fixes: a14a2d484b386 ("powerpc: cpm_common: use gpiochip data pointer")
Signed-off-by: Christophe Leroy 
Reviewed-by: Linus Walleij 
Signed-off-by: Benjamin Herrenschmidt 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/powerpc/sysdev/cpm1.c   |6 --
 arch/powerpc/sysdev/cpm_common.c |3 ++-
 2 files changed, 6 insertions(+), 3 deletions(-)

--- a/arch/powerpc/sysdev/cpm1.c
+++ b/arch/powerpc/sysdev/cpm1.c
@@ -534,7 +534,8 @@ struct cpm1_gpio16_chip {
 
 static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc)
 {
-   struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(_gc->gc);
+   struct cpm1_gpio16_chip *cpm1_gc =
+   container_of(mm_gc, struct cpm1_gpio16_chip, mm_gc);
struct cpm_ioport16 __iomem *iop = mm_gc->regs;
 
cpm1_gc->cpdata = in_be16(>dat);
@@ -649,7 +650,8 @@ struct cpm1_gpio32_chip {
 
 static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
 {
-   struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(_gc->gc);
+   struct cpm1_gpio32_chip *cpm1_gc =
+   container_of(mm_gc, struct cpm1_gpio32_chip, mm_gc);
struct cpm_ioport32b __iomem *iop = mm_gc->regs;
 
cpm1_gc->cpdata = in_be32(>dat);
--- a/arch/powerpc/sysdev/cpm_common.c
+++ b/arch/powerpc/sysdev/cpm_common.c
@@ -82,7 +82,8 @@ struct cpm2_gpio32_chip {
 
 static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
 {
-   struct cpm2_gpio32_chip *cpm2_gc = gpiochip_get_data(_gc->gc);
+   struct cpm2_gpio32_chip *cpm2_gc =
+   container_of(mm_gc, struct cpm2_gpio32_chip, mm_gc);
struct cpm2_ioports __iomem *iop = mm_gc->regs;
 
cpm2_gc->cpdata = in_be32(>dat);




[PATCH 4.7 038/184] powerpc: sysdev: cpm: fix gpio save_regs functions

2016-09-22 Thread Greg Kroah-Hartman
4.7-stable review patch.  If anyone has any objections, please let me know.

--

From: Christophe Leroy 

commit 41017a7579cf49cb5513e17df1570dc918760079 upstream.

of_mm_gpiochip_add_data() calls mm_gc->save_regs() before
setting the data. Therefore ->save_regs() cannot use
gpiochip_get_data()

[0.275940] Unable to handle kernel paging request for data at address 
0x0130
[0.283120] Faulting instruction address: 0xc01b44cc
[0.288175] Oops: Kernel access of bad area, sig: 11 [#1]
[0.293343] PREEMPT CMPC885
[0.296141] CPU: 0 PID: 1 Comm: swapper Not tainted 4.7.0-g65124df-dirty #68
[0.304131] task: c6074000 ti: c608 task.ti: c608
[0.309459] NIP: c01b44cc LR: c0011720 CTR: c0011708
[0.314372] REGS: c6081d90 TRAP: 0300   Not tainted  (4.7.0-g65124df-dirty)
[0.322267] MSR: 9032   CR: 2428  XER: 2000
[0.328813] DAR: 0130 DSISR: c000
GPR00: c01b6d0c c6081e40 c6074000 c6017000 c9028000 c601d028 c6081dd8 
GPR08: c601d028   0001 2444  c0002790 
GPR16:       c05643b0 0083
GPR24: c04a1a6c c056 c04a8308 c04c6480 c0012498 c6017000 c7ffcc78 c6017000
[0.360806] NIP [c01b44cc] gpiochip_get_data+0x4/0xc
[0.365684] LR [c0011720] cpm1_gpio16_save_regs+0x18/0x44
[0.370972] Call Trace:
[0.373451] [c6081e50] [c01b6d0c] of_mm_gpiochip_add_data+0x70/0xdc
[0.379624] [c6081e70] [c00124c0] cpm_init_par_io+0x28/0x118
[0.385238] [c6081e80] [c04a8ac0] do_one_initcall+0xb0/0x17c
[0.390819] [c6081ef0] [c04a8cbc] kernel_init_freeable+0x130/0x1dc
[0.396924] [c6081f30] [c00027a4] kernel_init+0x14/0x110
[0.402177] [c6081f40] [c000b424] ret_from_kernel_thread+0x5c/0x64
[0.408233] Instruction dump:
[0.411168] 4182fafc 3f80c040 48234c6d 3bc0fff0 3b9c5ed0 4bfffaf4 81290020 
712a0004
[0.418825] 4182fb34 48234c51 4bfffb2c 81230004 <80690130> 4e800020 7c0802a6 
9421ffe0
[0.426763] ---[ end trace fe4113ee21d72ffa ]---

fixes: e65078f1f3490 ("powerpc: sysdev: cpm1: use gpiochip data pointer")
fixes: a14a2d484b386 ("powerpc: cpm_common: use gpiochip data pointer")
Signed-off-by: Christophe Leroy 
Reviewed-by: Linus Walleij 
Signed-off-by: Benjamin Herrenschmidt 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/powerpc/sysdev/cpm1.c   |6 --
 arch/powerpc/sysdev/cpm_common.c |3 ++-
 2 files changed, 6 insertions(+), 3 deletions(-)

--- a/arch/powerpc/sysdev/cpm1.c
+++ b/arch/powerpc/sysdev/cpm1.c
@@ -534,7 +534,8 @@ struct cpm1_gpio16_chip {
 
 static void cpm1_gpio16_save_regs(struct of_mm_gpio_chip *mm_gc)
 {
-   struct cpm1_gpio16_chip *cpm1_gc = gpiochip_get_data(_gc->gc);
+   struct cpm1_gpio16_chip *cpm1_gc =
+   container_of(mm_gc, struct cpm1_gpio16_chip, mm_gc);
struct cpm_ioport16 __iomem *iop = mm_gc->regs;
 
cpm1_gc->cpdata = in_be16(>dat);
@@ -649,7 +650,8 @@ struct cpm1_gpio32_chip {
 
 static void cpm1_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
 {
-   struct cpm1_gpio32_chip *cpm1_gc = gpiochip_get_data(_gc->gc);
+   struct cpm1_gpio32_chip *cpm1_gc =
+   container_of(mm_gc, struct cpm1_gpio32_chip, mm_gc);
struct cpm_ioport32b __iomem *iop = mm_gc->regs;
 
cpm1_gc->cpdata = in_be32(>dat);
--- a/arch/powerpc/sysdev/cpm_common.c
+++ b/arch/powerpc/sysdev/cpm_common.c
@@ -82,7 +82,8 @@ struct cpm2_gpio32_chip {
 
 static void cpm2_gpio32_save_regs(struct of_mm_gpio_chip *mm_gc)
 {
-   struct cpm2_gpio32_chip *cpm2_gc = gpiochip_get_data(_gc->gc);
+   struct cpm2_gpio32_chip *cpm2_gc =
+   container_of(mm_gc, struct cpm2_gpio32_chip, mm_gc);
struct cpm2_ioports __iomem *iop = mm_gc->regs;
 
cpm2_gc->cpdata = in_be32(>dat);