diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2006-01-10 19:19:37 +0100 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2006-01-12 18:48:16 +0100 |
commit | db1019ca0548b263989bc98900eaf15107e533ad (patch) | |
tree | 19c399ec6345d8e91103b3b3625238f914246364 /drivers/pcmcia/socket_sysfs.c | |
parent | f542ff6dd1a444c85cc245ac40aef5f703e48674 (diff) | |
download | op-kernel-dev-db1019ca0548b263989bc98900eaf15107e533ad.zip op-kernel-dev-db1019ca0548b263989bc98900eaf15107e533ad.tar.gz |
[PATCH] pcmcia: runtime powermanagement interface
With the "power/state" sysfs interface being deprecated, make another
one available which is compatible to what was discussed on the linux
PM mailinglist.
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'drivers/pcmcia/socket_sysfs.c')
-rw-r--r-- | drivers/pcmcia/socket_sysfs.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/pcmcia/socket_sysfs.c b/drivers/pcmcia/socket_sysfs.c index 7a77446..5ab1cde 100644 --- a/drivers/pcmcia/socket_sysfs.c +++ b/drivers/pcmcia/socket_sysfs.c @@ -98,6 +98,30 @@ static ssize_t pccard_store_insert(struct class_device *dev, const char *buf, si } static CLASS_DEVICE_ATTR(card_insert, 0200, NULL, pccard_store_insert); + +static ssize_t pccard_show_card_pm_state(struct class_device *dev, char *buf) +{ + struct pcmcia_socket *s = to_socket(dev); + return sprintf(buf, "%s\n", s->state & SOCKET_SUSPEND ? "off" : "on"); +} + +static ssize_t pccard_store_card_pm_state(struct class_device *dev, const char *buf, size_t count) +{ + ssize_t ret = -EINVAL; + struct pcmcia_socket *s = to_socket(dev); + + if (!count) + return -EINVAL; + + if (!(s->state & SOCKET_SUSPEND) && !strncmp(buf, "off", 3)) + ret = pcmcia_suspend_card(s); + else if ((s->state & SOCKET_SUSPEND) && !strncmp(buf, "on", 2)) + ret = pcmcia_resume_card(s); + + return ret ? -ENODEV : count; +} +static CLASS_DEVICE_ATTR(card_pm_state, 0644, pccard_show_card_pm_state, pccard_store_card_pm_state); + static ssize_t pccard_store_eject(struct class_device *dev, const char *buf, size_t count) { ssize_t ret; @@ -320,6 +344,7 @@ static struct class_device_attribute *pccard_socket_attributes[] = { &class_device_attr_card_vpp, &class_device_attr_card_vcc, &class_device_attr_card_insert, + &class_device_attr_card_pm_state, &class_device_attr_card_eject, &class_device_attr_card_irq_mask, &class_device_attr_available_resources_setup_done, |