sh: push-switch fixups for work_struct API damage.
authorPaul Mundt <lethal@linux-sh.org>
Thu, 7 Dec 2006 04:20:58 +0000 (13:20 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Mon, 11 Dec 2006 23:42:07 +0000 (08:42 +0900)
INIT_WORK() dropped the data arg, so now we have to stash an extra
pointer and backpedal instead.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/drivers/push-switch.c
include/asm-sh/push-switch.h

index f2b9157c314fb15e073e20c25b8202c317def8b8..b3d20c0e021fee71a00620fb767c120697911e17 100644 (file)
@@ -14,7 +14,7 @@
 #include <asm/push-switch.h>
 
 #define DRV_NAME "push-switch"
-#define DRV_VERSION "0.1.0"
+#define DRV_VERSION "0.1.1"
 
 static ssize_t switch_show(struct device *dev,
                           struct device_attribute *attr,
@@ -32,10 +32,10 @@ static void switch_timer(unsigned long data)
        schedule_work(&psw->work);
 }
 
-static void switch_work_handler(void *data)
+static void switch_work_handler(struct work_struct *work)
 {
-       struct platform_device *pdev = data;
-       struct push_switch *psw = platform_get_drvdata(pdev);
+       struct push_switch *psw = container_of(work, struct push_switch, work);
+       struct platform_device *pdev = psw->pdev;
 
        psw->state = 0;
 
@@ -76,12 +76,15 @@ static int switch_drv_probe(struct platform_device *pdev)
                }
        }
 
-       INIT_WORK(&psw->work, switch_work_handler, pdev);
+       INIT_WORK(&psw->work, switch_work_handler);
        init_timer(&psw->debounce);
 
        psw->debounce.function = switch_timer;
        psw->debounce.data = (unsigned long)psw;
 
+       /* Workqueue API brain-damage */
+       psw->pdev = pdev;
+
        platform_set_drvdata(pdev, psw);
 
        return 0;
index dfc6bad567f050c848f6b8cded7d0436c8702264..4903f9e52dd858aee3a5805da7d22a156798d98f 100644 (file)
@@ -4,6 +4,7 @@
 #include <linux/timer.h>
 #include <linux/interrupt.h>
 #include <linux/workqueue.h>
+#include <linux/platform_device.h>
 
 struct push_switch {
        /* switch state */
@@ -12,6 +13,8 @@ struct push_switch {
        struct timer_list       debounce;
        /* workqueue */
        struct work_struct      work;
+       /* platform device, for workqueue handler */
+       struct platform_device  *pdev;
 };
 
 struct push_switch_platform_info {