From: Alexander Graf <hidden> Date: 2014-10-13 14:01:36
The generic Linux framework to power off the machine is a function pointer
called pm_power_off. The trick about this pointer is that device drivers can
potentially implement it rather than board files.
Today on PowerPC we set pm_power_off to invoke our generic full machine power
off logic which then calls ppc_md.power_off to invoke machine specific power
off.
However, when we want to add a power off GPIO via the "gpio-poweroff" driver,
this card house falls apart. That driver only registers itself if pm_power_off
is NULL to ensure it doesn't override board specific logic. However, since we
always set pm_power_off to the generic power off logic (which will just not
power off the machine if no ppc_md.power_off call is implemented), we can't
implement power off via the generic GPIO power off driver.
To fix this up, let's get rid of the ppc_md.power_off logic and just always use
pm_power_off as was intended. Then individual drivers such as the GPIO power off
driver can implement power off logic via that function pointer.
With this patch set applied and a few patches on top of QEMU that implement a
power off GPIO on the virt e500 machine, I can successfully turn off my virtual
machine after halt.
Michael / Ben, you can find this patch set as a git branch at the URL below.
When applying it, please use that one to ensure that Guenter can easily merge
his work with my work.
git://github.com/agraf/linux-2.6.git pm_power_off-v2
Alex
---
v1 -> v2:
- fix typo in 47x
- put ppc_md static replacement setters into probe function
Alexander Graf (20):
powerpc: Support override of pm_power_off
powerpc/xmon: Support either ppc_md.power_off or pm_power_off
powerpc/47x: Use pm_power_off rather than ppc_md.power_off
powerpc/52xx/efika: Use pm_power_off rather than ppc_md.power_off
powerpc/mpc8349emitx: Use pm_power_off rather than ppc_md.power_off
powerpc/corenet: Use pm_power_off rather than ppc_md.power_off
powerpc/85xx/sgy_cts1000: Use pm_power_off rather than
ppc_md.power_off
powerpc/celleb: Use pm_power_off rather than ppc_md.power_off
powerpc/cell/qpace: Use pm_power_off rather than ppc_md.power_off
powerpc/cell: Use pm_power_off rather than ppc_md.power_off
powerpc/chrp: Use pm_power_off rather than ppc_md.power_off
powerpc/6xx/gamecube: Use pm_power_off rather than ppc_md.power_off
powerpc/6xx/linkstation: Use pm_power_off rather than ppc_md.power_off
powerpc/6xx/wii: Use pm_power_off rather than ppc_md.power_off
powerpc/maple: Use pm_power_off rather than ppc_md.power_off
powerpc/powermac: Use pm_power_off rather than ppc_md.power_off
powerpc/powernv: Use pm_power_off rather than ppc_md.power_off
powerpc/ps3: Use pm_power_off rather than ppc_md.power_off
powerpc/pseries: Use pm_power_off rather than ppc_md.power_off
powerpc: Remove ppc_md.power_off
arch/powerpc/include/asm/machdep.h | 1 -
arch/powerpc/kernel/setup-common.c | 6 +-
arch/powerpc/platforms/44x/ppc476.c | 2 +-
arch/powerpc/platforms/52xx/efika.c | 3 +-
arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c | 8 +-
arch/powerpc/platforms/85xx/corenet_generic.c | 2 +-
arch/powerpc/platforms/85xx/sgy_cts1000.c | 4 +-
arch/powerpc/platforms/cell/celleb_setup.c | 4 +-
arch/powerpc/platforms/cell/qpace_setup.c | 2 +-
arch/powerpc/platforms/cell/setup.c | 2 +-
arch/powerpc/platforms/chrp/setup.c | 3 +-
arch/powerpc/platforms/embedded6xx/gamecube.c | 3 +-
arch/powerpc/platforms/embedded6xx/linkstation.c | 4 +-
arch/powerpc/platforms/embedded6xx/wii.c | 3 +-
arch/powerpc/platforms/maple/setup.c | 4 +-
arch/powerpc/platforms/powermac/setup.c | 147 ++++++++++++-----------
arch/powerpc/platforms/powernv/setup.c | 4 +-
arch/powerpc/platforms/ps3/setup.c | 2 +-
arch/powerpc/platforms/pseries/setup.c | 59 ++++-----
arch/powerpc/sysdev/fsl_soc.c | 2 +-
arch/powerpc/xmon/xmon.c | 3 +-
21 files changed, 138 insertions(+), 130 deletions(-)
--
1.8.1.4
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:36
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/52xx/efika.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:36
Xmon can manually turn off the machine. We now have 2 code paths for this:
1) ppc_md.power_off
2) pm_power_off
This patch allows xmon to support both and makes sure it graciously allows
a path to not be implemented.
Signed-off-by: Alexander Graf <redacted>
---
arch/powerpc/xmon/xmon.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:36
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/cell/celleb_setup.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:36
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- fix typo
---
arch/powerpc/platforms/44x/ppc476.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:39
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
arch/powerpc/platforms/85xx/sgy_cts1000.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:39
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/embedded6xx/linkstation.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:39
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
arch/powerpc/platforms/83xx/mcu_mpc8349emitx.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
@@ -167,10 +167,10 @@ static int mcu_probe(struct i2c_client *client, const struct i2c_device_id *id)if(ret)gotoerr;-/* XXX: this is potentially racy, but there is no lock for ppc_md */-if(!ppc_md.power_off){+/* XXX: this is potentially racy, but there is no lock for pm_power_off */+if(!pm_power_off){glob_mcu=mcu;-ppc_md.power_off=mcu_power_off;+pm_power_off=mcu_power_off;dev_info(&client->dev,"will provide power-off service\n");}
@@ -197,7 +197,7 @@ static int mcu_remove(struct i2c_client *client)device_remove_file(&client->dev,&dev_attr_status);if(glob_mcu==mcu){-ppc_md.power_off=NULL;+pm_power_off=NULL;glob_mcu=NULL;}
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:39
The pm_power_off callback is what drivers are supposed to modify when they
implement power off support for the system.
Support a modified callback on powerpc. That way power off support code can
now either override ppc_md.power_off or pm_power_off.
Signed-off-by: Alexander Graf <redacted>
---
arch/powerpc/kernel/setup-common.c | 2 ++
1 file changed, 2 insertions(+)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:39
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
arch/powerpc/platforms/85xx/corenet_generic.c | 2 +-
arch/powerpc/sysdev/fsl_soc.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:39
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/cell/qpace_setup.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:39
Now that we have all implementations of ppc_md.power_off converted to
pm_power_off we can remove the ppc_md variant.
While at it, also set the default for pm_power_off to NULL so that non
machine drivers can implement overrides.
Signed-off-by: Alexander Graf <redacted>
---
arch/powerpc/include/asm/machdep.h | 1 -
arch/powerpc/kernel/setup-common.c | 6 ++----
arch/powerpc/xmon/xmon.c | 2 --
3 files changed, 2 insertions(+), 7 deletions(-)
@@ -153,7 +151,7 @@ void machine_power_off(void)/* Used by the G5 thermal driver */EXPORT_SYMBOL_GPL(machine_power_off);-void(*pm_power_off)(void)=machine_power_off;+void(*pm_power_off)(void);EXPORT_SYMBOL_GPL(pm_power_off);voidmachine_halt(void)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:40
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
arch/powerpc/platforms/embedded6xx/gamecube.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:40
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/embedded6xx/wii.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:40
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/powermac/setup.c | 147 ++++++++++++++++----------------
1 file changed, 74 insertions(+), 73 deletions(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:43
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/chrp/setup.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:43
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
arch/powerpc/platforms/powernv/setup.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:43
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/maple/setup.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:43
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/cell/setup.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:43
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/pseries/setup.c | 59 +++++++++++++++++-----------------
1 file changed, 30 insertions(+), 29 deletions(-)
From: Alexander Graf <hidden> Date: 2014-10-13 14:01:43
The generic power off callback is pm_power_off. Use that one rather than
the powerpc specific ppc_md.power_off.
Signed-off-by: Alexander Graf <redacted>
---
v1 -> v2:
- write pm_power_off in probe function
---
arch/powerpc/platforms/ps3/setup.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
The generic Linux framework to power off the machine is a function pointer
called pm_power_off. The trick about this pointer is that device drivers can
potentially implement it rather than board files.
Today on PowerPC we set pm_power_off to invoke our generic full machine power
off logic which then calls ppc_md.power_off to invoke machine specific power
off.
However, when we want to add a power off GPIO via the "gpio-poweroff" driver,
this card house falls apart. That driver only registers itself if pm_power_off
is NULL to ensure it doesn't override board specific logic. However, since we
always set pm_power_off to the generic power off logic (which will just not
power off the machine if no ppc_md.power_off call is implemented), we can't
implement power off via the generic GPIO power off driver.
To fix this up, let's get rid of the ppc_md.power_off logic and just always use
pm_power_off as was intended. Then individual drivers such as the GPIO power off
driver can implement power off logic via that function pointer.
With this patch set applied and a few patches on top of QEMU that implement a
power off GPIO on the virt e500 machine, I can successfully turn off my virtual
machine after halt.
Michael / Ben, you can find this patch set as a git branch at the URL below.
When applying it, please use that one to ensure that Guenter can easily merge
his work with my work.
git://github.com/agraf/linux-2.6.git pm_power_off-v2
Best for me would be if someone (you or Ben or Michael) could create an
immutable branch which contains the patch set as to be submitted to Linus,
with all signatures, so I can merge it into my poweroff branch. If possible
that branch should have a signed tag which I can merge, to ensure that
I don't merge anything bad.
If I just merge your branch, I would not get the maintainer signature(s),
nor would it have the final SHA. Both would obviously be less than desirable.
Thanks,
Guenter
The generic Linux framework to power off the machine is a function pointer
called pm_power_off. The trick about this pointer is that device drivers can
potentially implement it rather than board files.
Today on PowerPC we set pm_power_off to invoke our generic full machine power
off logic which then calls ppc_md.power_off to invoke machine specific power
off.
However, when we want to add a power off GPIO via the "gpio-poweroff" driver,
this card house falls apart. That driver only registers itself if pm_power_off
is NULL to ensure it doesn't override board specific logic. However, since we
always set pm_power_off to the generic power off logic (which will just not
power off the machine if no ppc_md.power_off call is implemented), we can't
implement power off via the generic GPIO power off driver.
To fix this up, let's get rid of the ppc_md.power_off logic and just always use
pm_power_off as was intended. Then individual drivers such as the GPIO power off
driver can implement power off logic via that function pointer.
With this patch set applied and a few patches on top of QEMU that implement a
power off GPIO on the virt e500 machine, I can successfully turn off my virtual
machine after halt.
Michael / Ben, you can find this patch set as a git branch at the URL below.
When applying it, please use that one to ensure that Guenter can easily merge
his work with my work.
git://github.com/agraf/linux-2.6.git pm_power_off-v2
Alex
---
v1 -> v2:
- fix typo in 47x
- put ppc_md static replacement setters into probe function
Alexander Graf (20):
powerpc: Support override of pm_power_off
powerpc/xmon: Support either ppc_md.power_off or pm_power_off
powerpc/47x: Use pm_power_off rather than ppc_md.power_off
powerpc/52xx/efika: Use pm_power_off rather than ppc_md.power_off
powerpc/mpc8349emitx: Use pm_power_off rather than ppc_md.power_off
powerpc/corenet: Use pm_power_off rather than ppc_md.power_off
powerpc/85xx/sgy_cts1000: Use pm_power_off rather than
ppc_md.power_off
powerpc/celleb: Use pm_power_off rather than ppc_md.power_off
powerpc/cell/qpace: Use pm_power_off rather than ppc_md.power_off
powerpc/cell: Use pm_power_off rather than ppc_md.power_off
powerpc/chrp: Use pm_power_off rather than ppc_md.power_off
powerpc/6xx/gamecube: Use pm_power_off rather than ppc_md.power_off
powerpc/6xx/linkstation: Use pm_power_off rather than ppc_md.power_off
powerpc/6xx/wii: Use pm_power_off rather than ppc_md.power_off
powerpc/maple: Use pm_power_off rather than ppc_md.power_off
powerpc/powermac: Use pm_power_off rather than ppc_md.power_off
powerpc/powernv: Use pm_power_off rather than ppc_md.power_off
powerpc/ps3: Use pm_power_off rather than ppc_md.power_off
powerpc/pseries: Use pm_power_off rather than ppc_md.power_off
powerpc: Remove ppc_md.power_off
On another note, and maybe you discussed this separately: I don't really
see the value of having 20 separate patches here, other than creating
a lot of work for the maintainer. Wouldn't it be easier
to just have one patch instead ?
Sure, it would touch 20+ files instead of just one, but then you
could drop some of the workarounds you have to put in place just
to undo it at the end, and it is not as if the patches are really
independent of each other or as if there would be any benefit
in respect to the ability to bisect or merge into earlier versions
of the kernel.
I for my part don't plan for 20 patches when I convert it to
use the poweroff handler. Hope it is ok with everyone that it
will be just one patch.
Thanks,
Guenter