]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/pcmcia/ds.c
Driver core: change add_uevent_var to use a struct
[linux-2.6-omap-h63xx.git] / drivers / pcmcia / ds.c
index 143c6efc478ab9c9bcfbdc926ab39fb5e7c08521..55baa1f0fcbb5f8893456d117a5439bf7f1a950c 100644 (file)
@@ -1064,11 +1064,10 @@ static int pcmcia_bus_match(struct device * dev, struct device_driver * drv) {
 
 #ifdef CONFIG_HOTPLUG
 
-static int pcmcia_bus_uevent(struct device *dev, char **envp, int num_envp,
-                            char *buffer, int buffer_size)
+static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
        struct pcmcia_device *p_dev;
-       int i, length = 0;
+       int i;
        u32 hash[4] = { 0, 0, 0, 0};
 
        if (!dev)
@@ -1083,23 +1082,13 @@ static int pcmcia_bus_uevent(struct device *dev, char **envp, int num_envp,
                hash[i] = crc32(0, p_dev->prod_id[i], strlen(p_dev->prod_id[i]));
        }
 
-       i = 0;
-
-       if (add_uevent_var(envp, num_envp, &i,
-                          buffer, buffer_size, &length,
-                          "SOCKET_NO=%u",
-                          p_dev->socket->sock))
+       if (add_uevent_var(env, "SOCKET_NO=%u", p_dev->socket->sock))
                return -ENOMEM;
 
-       if (add_uevent_var(envp, num_envp, &i,
-                          buffer, buffer_size, &length,
-                          "DEVICE_NO=%02X",
-                          p_dev->device_no))
+       if (add_uevent_var(env, "DEVICE_NO=%02X", p_dev->device_no))
                return -ENOMEM;
 
-       if (add_uevent_var(envp, num_envp, &i,
-                          buffer, buffer_size, &length,
-                          "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
+       if (add_uevent_var(env, "MODALIAS=pcmcia:m%04Xc%04Xf%02Xfn%02Xpfn%02X"
                           "pa%08Xpb%08Xpc%08Xpd%08X",
                           p_dev->has_manf_id ? p_dev->manf_id : 0,
                           p_dev->has_card_id ? p_dev->card_id : 0,
@@ -1112,21 +1101,46 @@ static int pcmcia_bus_uevent(struct device *dev, char **envp, int num_envp,
                           hash[3]))
                return -ENOMEM;
 
-       envp[i] = NULL;
-
        return 0;
 }
 
 #else
 
-static int pcmcia_bus_uevent(struct device *dev, char **envp, int num_envp,
-                             char *buffer, int buffer_size)
+static int pcmcia_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
 {
        return -ENODEV;
 }
 
 #endif
 
+/************************ runtime PM support ***************************/
+
+static int pcmcia_dev_suspend(struct device *dev, pm_message_t state);
+static int pcmcia_dev_resume(struct device *dev);
+
+static int runtime_suspend(struct device *dev)
+{
+       int rc;
+
+       down(&dev->sem);
+       rc = pcmcia_dev_suspend(dev, PMSG_SUSPEND);
+       up(&dev->sem);
+       if (!rc)
+               dev->power.power_state.event = PM_EVENT_SUSPEND;
+       return rc;
+}
+
+static void runtime_resume(struct device *dev)
+{
+       int rc;
+
+       down(&dev->sem);
+       rc = pcmcia_dev_resume(dev);
+       up(&dev->sem);
+       if (!rc)
+               dev->power.power_state.event = PM_EVENT_ON;
+}
+
 /************************ per-device sysfs output ***************************/
 
 #define pcmcia_device_attr(field, test, format)                                \
@@ -1173,9 +1187,9 @@ static ssize_t pcmcia_store_pm_state(struct device *dev, struct device_attribute
                 return -EINVAL;
 
        if ((!p_dev->suspended) && !strncmp(buf, "off", 3))
-               ret = dpm_runtime_suspend(dev, PMSG_SUSPEND);
+               ret = runtime_suspend(dev);
        else if (p_dev->suspended && !strncmp(buf, "on", 2))
-               dpm_runtime_resume(dev);
+               runtime_resume(dev);
 
        return ret ? ret : count;
 }
@@ -1312,10 +1326,10 @@ static int pcmcia_bus_suspend_callback(struct device *dev, void * _data)
        struct pcmcia_socket *skt = _data;
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
 
-       if (p_dev->socket != skt)
+       if (p_dev->socket != skt || p_dev->suspended)
                return 0;
 
-       return dpm_runtime_suspend(dev, PMSG_SUSPEND);
+       return runtime_suspend(dev);
 }
 
 static int pcmcia_bus_resume_callback(struct device *dev, void * _data)
@@ -1323,10 +1337,10 @@ static int pcmcia_bus_resume_callback(struct device *dev, void * _data)
        struct pcmcia_socket *skt = _data;
        struct pcmcia_device *p_dev = to_pcmcia_dev(dev);
 
-       if (p_dev->socket != skt)
+       if (p_dev->socket != skt || !p_dev->suspended)
                return 0;
 
-       dpm_runtime_resume(dev);
+       runtime_resume(dev);
 
        return 0;
 }