Commit ad285ae9 authored by Cornelia Huck's avatar Cornelia Huck Committed by Martin Schwidefsky

[S390] pm: chsc subchannel driver power management callbacks

Signed-off-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: default avatarSebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 93a27592
/* /*
* Driver for s390 chsc subchannels * Driver for s390 chsc subchannels
* *
* Copyright IBM Corp. 2008 * Copyright IBM Corp. 2008, 2009
*
* Author(s): Cornelia Huck <cornelia.huck@de.ibm.com> * Author(s): Cornelia Huck <cornelia.huck@de.ibm.com>
* *
*/ */
...@@ -112,6 +113,31 @@ static void chsc_subchannel_shutdown(struct subchannel *sch) ...@@ -112,6 +113,31 @@ static void chsc_subchannel_shutdown(struct subchannel *sch)
cio_disable_subchannel(sch); cio_disable_subchannel(sch);
} }
static int chsc_subchannel_prepare(struct subchannel *sch)
{
int cc;
struct schib schib;
/*
* Don't allow suspend while the subchannel is not idle
* since we don't have a way to clear the subchannel and
* cannot disable it with a request running.
*/
cc = stsch(sch->schid, &schib);
if (!cc && scsw_stctl(&schib.scsw))
return -EAGAIN;
return 0;
}
static int chsc_subchannel_freeze(struct subchannel *sch)
{
return cio_disable_subchannel(sch);
}
static int chsc_subchannel_restore(struct subchannel *sch)
{
return cio_enable_subchannel(sch, (u32)(unsigned long)sch);
}
static struct css_device_id chsc_subchannel_ids[] = { static struct css_device_id chsc_subchannel_ids[] = {
{ .match_flags = 0x1, .type =SUBCHANNEL_TYPE_CHSC, }, { .match_flags = 0x1, .type =SUBCHANNEL_TYPE_CHSC, },
{ /* end of list */ }, { /* end of list */ },
...@@ -125,6 +151,10 @@ static struct css_driver chsc_subchannel_driver = { ...@@ -125,6 +151,10 @@ static struct css_driver chsc_subchannel_driver = {
.probe = chsc_subchannel_probe, .probe = chsc_subchannel_probe,
.remove = chsc_subchannel_remove, .remove = chsc_subchannel_remove,
.shutdown = chsc_subchannel_shutdown, .shutdown = chsc_subchannel_shutdown,
.prepare = chsc_subchannel_prepare,
.freeze = chsc_subchannel_freeze,
.thaw = chsc_subchannel_restore,
.restore = chsc_subchannel_restore,
.name = "chsc_subchannel", .name = "chsc_subchannel",
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment