diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2006-01-10 13:19:37 -0500 |
---|---|---|
committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2006-01-12 12:48:16 -0500 |
commit | db1019ca0548b263989bc98900eaf15107e533ad (patch) | |
tree | 19c399ec6345d8e91103b3b3625238f914246364 /drivers/pcmcia/ds.c | |
parent | f542ff6dd1a444c85cc245ac40aef5f703e48674 (diff) |
[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/ds.c')
-rw-r--r-- | drivers/pcmcia/ds.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 0252582b91cd..621ec459d27a 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c | |||
@@ -920,6 +920,37 @@ pcmcia_device_stringattr(prod_id2, prod_id[1]); | |||
920 | pcmcia_device_stringattr(prod_id3, prod_id[2]); | 920 | pcmcia_device_stringattr(prod_id3, prod_id[2]); |
921 | pcmcia_device_stringattr(prod_id4, prod_id[3]); | 921 | pcmcia_device_stringattr(prod_id4, prod_id[3]); |
922 | 922 | ||
923 | |||
924 | static ssize_t pcmcia_show_pm_state(struct device *dev, struct device_attribute *attr, char *buf) | ||
925 | { | ||
926 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); | ||
927 | |||
928 | if (p_dev->dev.power.power_state.event != PM_EVENT_ON) | ||
929 | return sprintf(buf, "off\n"); | ||
930 | else | ||
931 | return sprintf(buf, "on\n"); | ||
932 | } | ||
933 | |||
934 | static ssize_t pcmcia_store_pm_state(struct device *dev, struct device_attribute *attr, | ||
935 | const char *buf, size_t count) | ||
936 | { | ||
937 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); | ||
938 | int ret = 0; | ||
939 | |||
940 | if (!count) | ||
941 | return -EINVAL; | ||
942 | |||
943 | if ((p_dev->dev.power.power_state.event == PM_EVENT_ON) && | ||
944 | (!strncmp(buf, "off", 3))) | ||
945 | ret = dpm_runtime_suspend(dev, PMSG_SUSPEND); | ||
946 | else if ((p_dev->dev.power.power_state.event != PM_EVENT_ON) && | ||
947 | (!strncmp(buf, "on", 2))) | ||
948 | dpm_runtime_resume(dev); | ||
949 | |||
950 | return ret ? ret : count; | ||
951 | } | ||
952 | |||
953 | |||
923 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) | 954 | static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) |
924 | { | 955 | { |
925 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); | 956 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); |
@@ -945,8 +976,9 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev, | |||
945 | struct device_attribute *attr, const char *buf, size_t count) | 976 | struct device_attribute *attr, const char *buf, size_t count) |
946 | { | 977 | { |
947 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); | 978 | struct pcmcia_device *p_dev = to_pcmcia_dev(dev); |
948 | if (!count) | 979 | |
949 | return -EINVAL; | 980 | if (!count) |
981 | return -EINVAL; | ||
950 | 982 | ||
951 | down(&p_dev->socket->skt_sem); | 983 | down(&p_dev->socket->skt_sem); |
952 | p_dev->allow_func_id_match = 1; | 984 | p_dev->allow_func_id_match = 1; |
@@ -959,6 +991,7 @@ static ssize_t pcmcia_store_allow_func_id_match(struct device *dev, | |||
959 | 991 | ||
960 | static struct device_attribute pcmcia_dev_attrs[] = { | 992 | static struct device_attribute pcmcia_dev_attrs[] = { |
961 | __ATTR(function, 0444, func_show, NULL), | 993 | __ATTR(function, 0444, func_show, NULL), |
994 | __ATTR(pm_state, 0644, pcmcia_show_pm_state, pcmcia_store_pm_state), | ||
962 | __ATTR_RO(func_id), | 995 | __ATTR_RO(func_id), |
963 | __ATTR_RO(manf_id), | 996 | __ATTR_RO(manf_id), |
964 | __ATTR_RO(card_id), | 997 | __ATTR_RO(card_id), |