CHROMIUM: Input: cyapa - remove detect work
authorDaniel Kurtz <djkurtz@chromium.org>
Thu, 29 Dec 2011 14:06:30 +0000 (22:06 +0800)
committerGrant Grundler <grundler@google.com>
Thu, 24 May 2012 22:12:00 +0000 (15:12 -0700)
CYAPA detect has been sped up enough now that it isn't worth the overhead
and complexity of having its own workqueue.

The only time detection is significantly slow (~2 seconds) is immediately
after a firmware update.  This case isn't even handled using the detect
work, since the firmware update is now done through the request_firmware()
interface which blocks until the entire update plus detection has
completed.

Signed-off-by: Daniel Kurtz <djkurtz@chromium.org>
BUG=chromium-os:21047
TEST=cyapa detect occurs immediately during probe and completes within
     300ms.

Change-Id: I1575f3a90f4df815737ea6656b5f10b9ee837d90
Reviewed-on: https://gerrit.chromium.org/gerrit/13534
Reviewed-by: Dudley Du <dudl@cypress.com>
Reviewed-by: Benson Leung <bleung@chromium.org>
Tested-by: Benson Leung <bleung@chromium.org>
Reviewed-by: Daniel Kurtz <djkurtz@chromium.org>
Tested-by: Daniel Kurtz <djkurtz@chromium.org>
Commit-Ready: Daniel Kurtz <djkurtz@chromium.org>

drivers/input/mouse/cyapa.c

index eb6d246..3c9c941 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/slab.h>
 #include <linux/spinlock.h>
 #include <linux/uaccess.h>
-#include <linux/workqueue.h>
 
 
 /* commands for read/write registers of Cypress trackpad */
@@ -212,8 +211,6 @@ struct cyapa {
 
        struct i2c_client       *client;
        struct input_dev        *input;
-       struct work_struct detect_work;
-       struct workqueue_struct *detect_wq;
        int irq;
        u8 adapter_func;
        bool smbus;
@@ -1718,19 +1715,9 @@ static void cyapa_detect(struct cyapa *cyapa)
                if (ret)
                        dev_err(dev, "create input_dev instance failed, %d\n",
                                ret);
-       } else {
-               ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
-               if (ret)
-                       dev_warn(dev, "resume active power failed, %d\n", ret);
        }
 }
 
-static void cyapa_detect_work(struct work_struct *work)
-{
-       struct cyapa *cyapa = container_of(work, struct cyapa, detect_work);
-       cyapa_detect(cyapa);
-}
-
 static int __devinit cyapa_probe(struct i2c_client *client,
                                 const struct i2c_device_id *dev_id)
 {
@@ -1788,30 +1775,10 @@ static int __devinit cyapa_probe(struct i2c_client *client,
        if (sysfs_create_group(&client->dev.kobj, &cyapa_sysfs_group))
                dev_warn(dev, "error creating sysfs entries.\n");
 
-       /*
-        * At boot it can take up to 2 seconds for firmware to complete sensor
-        * calibration. Probe in a workqueue so as not to block system boot.
-        */
-       cyapa->detect_wq = create_singlethread_workqueue("cyapa_detect_wq");
-       if (!cyapa->detect_wq) {
-               ret = -ENOMEM;
-               dev_err(dev, "create detect workqueue failed\n");
-               goto err_irq_free;
-       }
-
-       INIT_WORK(&cyapa->detect_work, cyapa_detect_work);
-       ret = queue_work(cyapa->detect_wq, &cyapa->detect_work);
-       if (ret < 0) {
-               dev_err(dev, "device detect failed, %d\n", ret);
-               goto err_wq_free;
-       }
+       cyapa_detect(cyapa);
 
        return 0;
 
-err_wq_free:
-       destroy_workqueue(cyapa->detect_wq);
-err_irq_free:
-       free_irq(cyapa->irq, cyapa);
 err_mem_free:
        kfree(cyapa);
        global_cyapa = NULL;
@@ -1830,8 +1797,6 @@ static int __devexit cyapa_remove(struct i2c_client *client)
        if (cyapa->input)
                input_unregister_device(cyapa->input);
 
-       if (cyapa->detect_wq)
-               destroy_workqueue(cyapa->detect_wq);
        kfree(cyapa);
        global_cyapa = NULL;
 
@@ -1844,9 +1809,6 @@ static int cyapa_suspend(struct device *dev)
        int ret;
        struct cyapa *cyapa = dev_get_drvdata(dev);
 
-       /* Wait for detection to complete before allowing suspend. */
-       flush_workqueue(cyapa->detect_wq);
-
        /* set trackpad device to light sleep mode. Just ignore any errors */
        ret = cyapa_set_power_mode(cyapa, PWR_MODE_LIGHT_SLEEP);
        if (ret < 0)
@@ -1868,12 +1830,11 @@ static int cyapa_resume(struct device *dev)
        if (device_may_wakeup(dev))
                disable_irq_wake(cyapa->irq);
 
-       PREPARE_WORK(&cyapa->detect_work, cyapa_detect_work);
-       ret = queue_work(cyapa->detect_wq, &cyapa->detect_work);
-       if (ret < 0) {
-               dev_err(dev, "queue detect work failed, %d\n", ret);
-               return ret;
-       }
+       cyapa_detect(cyapa);
+
+       ret = cyapa_set_power_mode(cyapa, PWR_MODE_FULL_ACTIVE);
+       if (ret)
+               dev_warn(dev, "resume active power failed, %d\n", ret);
 
        return 0;
 }