[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>

+60 -2
+35 -2
drivers/pcmcia/ds.c
··· 920 920 pcmcia_device_stringattr(prod_id3, prod_id[2]); 921 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 954 static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, char *buf) 924 955 { 925 956 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); ··· 976 945 struct device_attribute *attr, const char *buf, size_t count) 977 946 { 978 947 struct pcmcia_device *p_dev = to_pcmcia_dev(dev); 979 - if (!count) 980 - return -EINVAL; 948 + 949 + if (!count) 950 + return -EINVAL; 981 951 982 952 down(&p_dev->socket->skt_sem); 983 953 p_dev->allow_func_id_match = 1; ··· 991 959 992 960 static struct device_attribute pcmcia_dev_attrs[] = { 993 961 __ATTR(function, 0444, func_show, NULL), 962 + __ATTR(pm_state, 0644, pcmcia_show_pm_state, pcmcia_store_pm_state), 994 963 __ATTR_RO(func_id), 995 964 __ATTR_RO(manf_id), 996 965 __ATTR_RO(card_id),
+25
drivers/pcmcia/socket_sysfs.c
··· 98 98 } 99 99 static CLASS_DEVICE_ATTR(card_insert, 0200, NULL, pccard_store_insert); 100 100 101 + 102 + static ssize_t pccard_show_card_pm_state(struct class_device *dev, char *buf) 103 + { 104 + struct pcmcia_socket *s = to_socket(dev); 105 + return sprintf(buf, "%s\n", s->state & SOCKET_SUSPEND ? "off" : "on"); 106 + } 107 + 108 + static ssize_t pccard_store_card_pm_state(struct class_device *dev, const char *buf, size_t count) 109 + { 110 + ssize_t ret = -EINVAL; 111 + struct pcmcia_socket *s = to_socket(dev); 112 + 113 + if (!count) 114 + return -EINVAL; 115 + 116 + if (!(s->state & SOCKET_SUSPEND) && !strncmp(buf, "off", 3)) 117 + ret = pcmcia_suspend_card(s); 118 + else if ((s->state & SOCKET_SUSPEND) && !strncmp(buf, "on", 2)) 119 + ret = pcmcia_resume_card(s); 120 + 121 + return ret ? -ENODEV : count; 122 + } 123 + static CLASS_DEVICE_ATTR(card_pm_state, 0644, pccard_show_card_pm_state, pccard_store_card_pm_state); 124 + 101 125 static ssize_t pccard_store_eject(struct class_device *dev, const char *buf, size_t count) 102 126 { 103 127 ssize_t ret; ··· 344 320 &class_device_attr_card_vpp, 345 321 &class_device_attr_card_vcc, 346 322 &class_device_attr_card_insert, 323 + &class_device_attr_card_pm_state, 347 324 &class_device_attr_card_eject, 348 325 &class_device_attr_card_irq_mask, 349 326 &class_device_attr_available_resources_setup_done,