Input: mark serio and i8042 as suspended when hibernating too
[pandora-kernel.git] / drivers / input / serio / serio.c
index bc03325..d66f494 100644 (file)
@@ -41,17 +41,6 @@ MODULE_AUTHOR("Vojtech Pavlik <vojtech@ucw.cz>");
 MODULE_DESCRIPTION("Serio abstraction core");
 MODULE_LICENSE("GPL");
 
-EXPORT_SYMBOL(serio_interrupt);
-EXPORT_SYMBOL(__serio_register_port);
-EXPORT_SYMBOL(serio_unregister_port);
-EXPORT_SYMBOL(serio_unregister_child_port);
-EXPORT_SYMBOL(__serio_register_driver);
-EXPORT_SYMBOL(serio_unregister_driver);
-EXPORT_SYMBOL(serio_open);
-EXPORT_SYMBOL(serio_close);
-EXPORT_SYMBOL(serio_rescan);
-EXPORT_SYMBOL(serio_reconnect);
-
 /*
  * serio_mutex protects entire serio subsystem and is taken every time
  * serio port or driver registrered or unregistered.
@@ -506,9 +495,9 @@ static ssize_t serio_set_bind_mode(struct device *dev, struct device_attribute *
 
        retval = count;
        if (!strncmp(buf, "manual", count)) {
-               serio->manual_bind = 1;
+               serio->manual_bind = true;
        } else if (!strncmp(buf, "auto", count)) {
-               serio->manual_bind = 0;
+               serio->manual_bind = false;
        } else {
                retval = -EINVAL;
        }
@@ -581,7 +570,7 @@ static void serio_add_port(struct serio *serio)
                        "serio: device_add() failed for %s (%s), error: %d\n",
                        serio->phys, serio->name, error);
        else {
-               serio->registered = 1;
+               serio->registered = true;
                error = sysfs_create_group(&serio->dev.kobj, &serio_id_attr_group);
                if (error)
                        printk(KERN_ERR
@@ -617,7 +606,7 @@ static void serio_destroy_port(struct serio *serio)
        if (serio->registered) {
                sysfs_remove_group(&serio->dev.kobj, &serio_id_attr_group);
                device_del(&serio->dev);
-               serio->registered = 0;
+               serio->registered = false;
        }
 
        list_del_init(&serio->node);
@@ -692,11 +681,13 @@ void serio_rescan(struct serio *serio)
 {
        serio_queue_event(serio, NULL, SERIO_RESCAN_PORT);
 }
+EXPORT_SYMBOL(serio_rescan);
 
 void serio_reconnect(struct serio *serio)
 {
        serio_queue_event(serio, NULL, SERIO_RECONNECT_CHAIN);
 }
+EXPORT_SYMBOL(serio_reconnect);
 
 /*
  * Submits register request to kseriod for subsequent execution.
@@ -707,6 +698,7 @@ void __serio_register_port(struct serio *serio, struct module *owner)
        serio_init_port(serio);
        serio_queue_event(serio, owner, SERIO_REGISTER_PORT);
 }
+EXPORT_SYMBOL(__serio_register_port);
 
 /*
  * Synchronously unregisters serio port.
@@ -718,6 +710,7 @@ void serio_unregister_port(struct serio *serio)
        serio_destroy_port(serio);
        mutex_unlock(&serio_mutex);
 }
+EXPORT_SYMBOL(serio_unregister_port);
 
 /*
  * Safely unregisters child port if one is present.
@@ -731,6 +724,7 @@ void serio_unregister_child_port(struct serio *serio)
        }
        mutex_unlock(&serio_mutex);
 }
+EXPORT_SYMBOL(serio_unregister_child_port);
 
 
 /*
@@ -756,9 +750,9 @@ static ssize_t serio_driver_set_bind_mode(struct device_driver *drv, const char
 
        retval = count;
        if (!strncmp(buf, "manual", count)) {
-               serio_drv->manual_bind = 1;
+               serio_drv->manual_bind = true;
        } else if (!strncmp(buf, "auto", count)) {
-               serio_drv->manual_bind = 0;
+               serio_drv->manual_bind = false;
        } else {
                retval = -EINVAL;
        }
@@ -818,7 +812,7 @@ static void serio_attach_driver(struct serio_driver *drv)
 
 int __serio_register_driver(struct serio_driver *drv, struct module *owner, const char *mod_name)
 {
-       int manual_bind = drv->manual_bind;
+       bool manual_bind = drv->manual_bind;
        int error;
 
        drv->driver.bus = &serio_bus;
@@ -829,7 +823,7 @@ int __serio_register_driver(struct serio_driver *drv, struct module *owner, cons
         * Temporarily disable automatic binding because probing
         * takes long time and we are better off doing it in kseriod
         */
-       drv->manual_bind = 1;
+       drv->manual_bind = true;
 
        error = driver_register(&drv->driver);
        if (error) {
@@ -844,7 +838,7 @@ int __serio_register_driver(struct serio_driver *drv, struct module *owner, cons
         * driver to free ports
         */
        if (!manual_bind) {
-               drv->manual_bind = 0;
+               drv->manual_bind = false;
                error = serio_queue_event(drv, NULL, SERIO_ATTACH_DRIVER);
                if (error) {
                        driver_unregister(&drv->driver);
@@ -854,6 +848,7 @@ int __serio_register_driver(struct serio_driver *drv, struct module *owner, cons
 
        return 0;
 }
+EXPORT_SYMBOL(__serio_register_driver);
 
 void serio_unregister_driver(struct serio_driver *drv)
 {
@@ -861,7 +856,7 @@ void serio_unregister_driver(struct serio_driver *drv)
 
        mutex_lock(&serio_mutex);
 
-       drv->manual_bind = 1;   /* so serio_find_driver ignores it */
+       drv->manual_bind = true;        /* so serio_find_driver ignores it */
        serio_remove_pending_events(drv);
 
 start_over:
@@ -877,6 +872,7 @@ start_over:
        driver_unregister(&drv->driver);
        mutex_unlock(&serio_mutex);
 }
+EXPORT_SYMBOL(serio_unregister_driver);
 
 static void serio_set_drv(struct serio *serio, struct serio_driver *drv)
 {
@@ -937,26 +933,28 @@ static int serio_uevent(struct device *dev, struct kobj_uevent_env *env)
 #ifdef CONFIG_PM
 static int serio_suspend(struct device *dev, pm_message_t state)
 {
-       if (dev->power.power_state.event != state.event) {
-               if (state.event == PM_EVENT_SUSPEND)
-                       serio_cleanup(to_serio_port(dev));
+       struct serio *serio = to_serio_port(dev);
 
-               dev->power.power_state = state;
-       }
+       if (!serio->suspended && state.event == PM_EVENT_SUSPEND)
+               serio_cleanup(serio);
+
+       serio->suspended = state.event == PM_EVENT_SUSPEND ||
+                          state.event == PM_EVENT_FREEZE;
 
        return 0;
 }
 
 static int serio_resume(struct device *dev)
 {
+       struct serio *serio = to_serio_port(dev);
+
        /*
         * Driver reconnect can take a while, so better let kseriod
         * deal with it.
         */
-       if (dev->power.power_state.event != PM_EVENT_ON) {
-               dev->power.power_state = PMSG_ON;
-               serio_queue_event(to_serio_port(dev), NULL,
-                                 SERIO_RECONNECT_PORT);
+       if (serio->suspended) {
+               serio->suspended = false;
+               serio_queue_event(serio, NULL, SERIO_RECONNECT_PORT);
        }
 
        return 0;
@@ -974,6 +972,7 @@ int serio_open(struct serio *serio, struct serio_driver *drv)
        }
        return 0;
 }
+EXPORT_SYMBOL(serio_open);
 
 /* called from serio_driver->connect/disconnect methods under serio_mutex */
 void serio_close(struct serio *serio)
@@ -983,6 +982,7 @@ void serio_close(struct serio *serio)
 
        serio_set_drv(serio, NULL);
 }
+EXPORT_SYMBOL(serio_close);
 
 irqreturn_t serio_interrupt(struct serio *serio,
                unsigned char data, unsigned int dfl)
@@ -1003,6 +1003,7 @@ irqreturn_t serio_interrupt(struct serio *serio,
 
        return ret;
 }
+EXPORT_SYMBOL(serio_interrupt);
 
 static struct bus_type serio_bus = {
        .name           = "serio",