diff mbox

drivers/hid: Convert timers to use timer_setup()

Message ID 1508866222-15063-1-git-send-email-allen.pais@oracle.com (mailing list archive)
State New, archived
Headers show

Commit Message

Allen Oct. 24, 2017, 5:30 p.m. UTC
Switch to using the new timer_setup() and from_timer()
for drivers/hid/*

Cc: Kees Cook <keescook@chromium.org>
Signed-off-by: Allen Pais <allen.pais@oracle.com>
---
Note: This patch is only compile tested. 

 drivers/hid/hid-appleir.c      | 8 ++++----
 drivers/hid/hid-multitouch.c   | 6 +++---
 drivers/hid/hid-prodikeys.c    | 7 +++----
 drivers/hid/hid-wiimote-core.c | 6 +++---
 drivers/hid/usbhid/hid-core.c  | 8 ++++----
 5 files changed, 17 insertions(+), 18 deletions(-)

Comments

Allen Oct. 24, 2017, 5:34 p.m. UTC | #1
> Switch to using the new timer_setup() and from_timer()
> for drivers/hid/*
>
> Cc: Kees Cook <keescook@chromium.org>
> Signed-off-by: Allen Pais <allen.pais@oracle.com>

  Ignore the patch. I send out a wrong one by mistake.

--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
kernel test robot Oct. 25, 2017, 3:33 p.m. UTC | #2
Hi Allen,

[auto build test ERROR on v4.14-rc6]
[cannot apply to hid/for-next next-20171018]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Allen-Pais/drivers-hid-Convert-timers-to-use-timer_setup/20171025-230118
config: i386-randconfig-x008-201743 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All error/warnings (new ones prefixed by >>):

   In file included from include/linux/ioport.h:12:0,
                    from include/linux/device.h:16,
                    from drivers//hid/hid-multitouch.c:41:
   drivers//hid/hid-multitouch.c: In function 'mt_expired_timeout':
>> include/linux/kernel.h:928:51: error: 'struct hid_device' has no member named 'release_timer'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                                                      ^
   include/linux/compiler.h:553:19: note: in definition of macro '__compiletime_assert'
      bool __cond = !(condition);    \
                      ^~~~~~~~~
   include/linux/compiler.h:576:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:46:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:928:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:928:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
   include/linux/timer.h:183:2: note: in expansion of macro 'container_of'
     container_of(callback_timer, typeof(*var), timer_fieldname)
     ^~~~~~~~~~~~
>> drivers//hid/hid-multitouch.c:1251:28: note: in expansion of macro 'from_timer'
     struct hid_device *hdev = from_timer(hdev, t, release_timer);
                               ^~~~~~~~~~
   In file included from include/linux/compiler.h:58:0,
                    from include/linux/ioport.h:12,
                    from include/linux/device.h:16,
                    from drivers//hid/hid-multitouch.c:41:
>> include/linux/compiler-gcc.h:165:2: error: 'struct hid_device' has no member named 'release_timer'
     __builtin_offsetof(a, b)
     ^
   include/linux/stddef.h:16:32: note: in expansion of macro '__compiler_offsetof'
    #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
                                   ^~~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:931:21: note: in expansion of macro 'offsetof'
     ((type *)(__mptr - offsetof(type, member))); })
                        ^~~~~~~~
   include/linux/timer.h:183:2: note: in expansion of macro 'container_of'
     container_of(callback_timer, typeof(*var), timer_fieldname)
     ^~~~~~~~~~~~
>> drivers//hid/hid-multitouch.c:1251:28: note: in expansion of macro 'from_timer'
     struct hid_device *hdev = from_timer(hdev, t, release_timer);
                               ^~~~~~~~~~
--
   In file included from include/linux/ioport.h:12:0,
                    from include/linux/device.h:16,
                    from drivers/hid/hid-multitouch.c:41:
   drivers/hid/hid-multitouch.c: In function 'mt_expired_timeout':
>> include/linux/kernel.h:928:51: error: 'struct hid_device' has no member named 'release_timer'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                                                      ^
   include/linux/compiler.h:553:19: note: in definition of macro '__compiletime_assert'
      bool __cond = !(condition);    \
                      ^~~~~~~~~
   include/linux/compiler.h:576:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:46:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:928:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:928:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
   include/linux/timer.h:183:2: note: in expansion of macro 'container_of'
     container_of(callback_timer, typeof(*var), timer_fieldname)
     ^~~~~~~~~~~~
   drivers/hid/hid-multitouch.c:1251:28: note: in expansion of macro 'from_timer'
     struct hid_device *hdev = from_timer(hdev, t, release_timer);
                               ^~~~~~~~~~
   In file included from include/linux/compiler.h:58:0,
                    from include/linux/ioport.h:12,
                    from include/linux/device.h:16,
                    from drivers/hid/hid-multitouch.c:41:
>> include/linux/compiler-gcc.h:165:2: error: 'struct hid_device' has no member named 'release_timer'
     __builtin_offsetof(a, b)
     ^
   include/linux/stddef.h:16:32: note: in expansion of macro '__compiler_offsetof'
    #define offsetof(TYPE, MEMBER) __compiler_offsetof(TYPE, MEMBER)
                                   ^~~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:931:21: note: in expansion of macro 'offsetof'
     ((type *)(__mptr - offsetof(type, member))); })
                        ^~~~~~~~
   include/linux/timer.h:183:2: note: in expansion of macro 'container_of'
     container_of(callback_timer, typeof(*var), timer_fieldname)
     ^~~~~~~~~~~~
   drivers/hid/hid-multitouch.c:1251:28: note: in expansion of macro 'from_timer'
     struct hid_device *hdev = from_timer(hdev, t, release_timer);
                               ^~~~~~~~~~

vim +928 include/linux/kernel.h

^1da177e4 Linus Torvalds 2005-04-16  909  
91f68b735 Wu Fengguang   2009-01-07  910  
e8c97af0c Randy Dunlap   2017-10-13  911  /**
e8c97af0c Randy Dunlap   2017-10-13  912   * swap - swap values of @a and @b
e8c97af0c Randy Dunlap   2017-10-13  913   * @a: first value
e8c97af0c Randy Dunlap   2017-10-13  914   * @b: second value
91f68b735 Wu Fengguang   2009-01-07  915   */
ac7b90049 Peter Zijlstra 2009-02-04  916  #define swap(a, b) \
ac7b90049 Peter Zijlstra 2009-02-04  917  	do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
91f68b735 Wu Fengguang   2009-01-07  918  
^1da177e4 Linus Torvalds 2005-04-16  919  /**
^1da177e4 Linus Torvalds 2005-04-16  920   * container_of - cast a member of a structure out to the containing structure
^1da177e4 Linus Torvalds 2005-04-16  921   * @ptr:	the pointer to the member.
^1da177e4 Linus Torvalds 2005-04-16  922   * @type:	the type of the container struct this is embedded in.
^1da177e4 Linus Torvalds 2005-04-16  923   * @member:	the name of the member within the struct.
^1da177e4 Linus Torvalds 2005-04-16  924   *
^1da177e4 Linus Torvalds 2005-04-16  925   */
^1da177e4 Linus Torvalds 2005-04-16  926  #define container_of(ptr, type, member) ({				\
c7acec713 Ian Abbott     2017-07-12  927  	void *__mptr = (void *)(ptr);					\
c7acec713 Ian Abbott     2017-07-12 @928  	BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) &&	\
c7acec713 Ian Abbott     2017-07-12  929  			 !__same_type(*(ptr), void),			\
c7acec713 Ian Abbott     2017-07-12  930  			 "pointer type mismatch in container_of()");	\
c7acec713 Ian Abbott     2017-07-12  931  	((type *)(__mptr - offsetof(type, member))); })
^1da177e4 Linus Torvalds 2005-04-16  932  

:::::: The code at line 928 was first introduced by commit
:::::: c7acec713d14c6ce8a20154f9dfda258d6bcad3b kernel.h: handle pointers to arrays better in container_of()

:::::: TO: Ian Abbott <abbotti@mev.co.uk>
:::::: CC: Linus Torvalds <torvalds@linux-foundation.org>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
kernel test robot Oct. 25, 2017, 3:38 p.m. UTC | #3
Hi Allen,

[auto build test ERROR on v4.14-rc6]
[cannot apply to hid/for-next next-20171018]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Allen-Pais/drivers-hid-Convert-timers-to-use-timer_setup/20171025-230118
config: x86_64-randconfig-x011-201743 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All error/warnings (new ones prefixed by >>):

   In file included from include/linux/ioport.h:12:0,
                    from include/linux/device.h:16,
                    from drivers/hid/hid-appleir.c:26:
   drivers/hid/hid-appleir.c: In function 'key_up_tick':
>> drivers/hid/hid-appleir.c:178:39: error: 'applier' undeclared (first use in this function)
     struct appleir *appleir = from_timer(applier, t, key_up_timer);
                                          ^
   include/linux/compiler.h:553:19: note: in definition of macro '__compiletime_assert'
      bool __cond = !(condition);    \
                      ^~~~~~~~~
   include/linux/compiler.h:576:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:46:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:928:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:928:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
   include/linux/timer.h:183:2: note: in expansion of macro 'container_of'
     container_of(callback_timer, typeof(*var), timer_fieldname)
     ^~~~~~~~~~~~
>> drivers/hid/hid-appleir.c:178:28: note: in expansion of macro 'from_timer'
     struct appleir *appleir = from_timer(applier, t, key_up_timer);
                               ^~~~~~~~~~
   drivers/hid/hid-appleir.c:178:39: note: each undeclared identifier is reported only once for each function it appears in
     struct appleir *appleir = from_timer(applier, t, key_up_timer);
                                          ^
   include/linux/compiler.h:553:19: note: in definition of macro '__compiletime_assert'
      bool __cond = !(condition);    \
                      ^~~~~~~~~
   include/linux/compiler.h:576:2: note: in expansion of macro '_compiletime_assert'
     _compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
     ^~~~~~~~~~~~~~~~~~~
   include/linux/build_bug.h:46:37: note: in expansion of macro 'compiletime_assert'
    #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
                                        ^~~~~~~~~~~~~~~~~~
   include/linux/kernel.h:928:2: note: in expansion of macro 'BUILD_BUG_ON_MSG'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
     ^~~~~~~~~~~~~~~~
   include/linux/kernel.h:928:20: note: in expansion of macro '__same_type'
     BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \
                       ^~~~~~~~~~~
   include/linux/timer.h:183:2: note: in expansion of macro 'container_of'
     container_of(callback_timer, typeof(*var), timer_fieldname)
     ^~~~~~~~~~~~
>> drivers/hid/hid-appleir.c:178:28: note: in expansion of macro 'from_timer'
     struct appleir *appleir = from_timer(applier, t, key_up_timer);
                               ^~~~~~~~~~

vim +/applier +178 drivers/hid/hid-appleir.c

  > 26	#include <linux/device.h>
    27	#include <linux/hid.h>
    28	#include <linux/module.h>
    29	#include "hid-ids.h"
    30	
    31	MODULE_AUTHOR("James McKenzie");
    32	MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@redhat.com>");
    33	MODULE_DESCRIPTION("HID Apple IR remote controls");
    34	MODULE_LICENSE("GPL");
    35	
    36	#define KEY_MASK		0x0F
    37	#define TWO_PACKETS_MASK	0x40
    38	
    39	/*
    40	 * James McKenzie has two devices both of which report the following
    41	 * 25 87 ee 83 0a	+
    42	 * 25 87 ee 83 0c	-
    43	 * 25 87 ee 83 09	<<
    44	 * 25 87 ee 83 06	>>
    45	 * 25 87 ee 83 05	>"
    46	 * 25 87 ee 83 03	menu
    47	 * 26 00 00 00 00	for key repeat
    48	 */
    49	
    50	/*
    51	 * Thomas Glanzmann reports the following responses
    52	 * 25 87 ee ca 0b	+
    53	 * 25 87 ee ca 0d	-
    54	 * 25 87 ee ca 08	<<
    55	 * 25 87 ee ca 07	>>
    56	 * 25 87 ee ca 04	>"
    57	 * 25 87 ee ca 02	menu
    58	 * 26 00 00 00 00       for key repeat
    59	 *
    60	 * He also observes the following event sometimes
    61	 * sent after a key is release, which I interpret
    62	 * as a flat battery message
    63	 * 25 87 e0 ca 06	flat battery
    64	 */
    65	
    66	/*
    67	 * Alexandre Karpenko reports the following responses for Device ID 0x8242
    68	 * 25 87 ee 47 0b	+
    69	 * 25 87 ee 47 0d	-
    70	 * 25 87 ee 47 08	<<
    71	 * 25 87 ee 47 07	>>
    72	 * 25 87 ee 47 04	>"
    73	 * 25 87 ee 47 02	menu
    74	 * 26 87 ee 47 **	for key repeat (** is the code of the key being held)
    75	 */
    76	
    77	/*
    78	 * Bastien Nocera's remote
    79	 * 25 87 ee 91 5f	followed by
    80	 * 25 87 ee 91 05	gives you >"
    81	 *
    82	 * 25 87 ee 91 5c	followed by
    83	 * 25 87 ee 91 05	gives you the middle button
    84	 */
    85	
    86	/*
    87	 * Fabien Andre's remote
    88	 * 25 87 ee a3 5e	followed by
    89	 * 25 87 ee a3 04	gives you >"
    90	 *
    91	 * 25 87 ee a3 5d	followed by
    92	 * 25 87 ee a3 04	gives you the middle button
    93	 */
    94	
    95	static const unsigned short appleir_key_table[] = {
    96		KEY_RESERVED,
    97		KEY_MENU,
    98		KEY_PLAYPAUSE,
    99		KEY_FORWARD,
   100		KEY_BACK,
   101		KEY_VOLUMEUP,
   102		KEY_VOLUMEDOWN,
   103		KEY_RESERVED,
   104		KEY_RESERVED,
   105		KEY_RESERVED,
   106		KEY_RESERVED,
   107		KEY_RESERVED,
   108		KEY_RESERVED,
   109		KEY_RESERVED,
   110		KEY_ENTER,
   111		KEY_PLAYPAUSE,
   112		KEY_RESERVED,
   113	};
   114	
   115	struct appleir {
   116		struct input_dev *input_dev;
   117		struct hid_device *hid;
   118		unsigned short keymap[ARRAY_SIZE(appleir_key_table)];
   119		struct timer_list key_up_timer;	/* timer for key up */
   120		spinlock_t lock;		/* protects .current_key */
   121		int current_key;		/* the currently pressed key */
   122		int prev_key_idx;		/* key index in a 2 packets message */
   123	};
   124	
   125	static int get_key(int data)
   126	{
   127		/*
   128		 * The key is coded accross bits 2..9:
   129		 *
   130		 * 0x00 or 0x01 (        )	key:  0		-> KEY_RESERVED
   131		 * 0x02 or 0x03 (  menu  )	key:  1		-> KEY_MENU
   132		 * 0x04 or 0x05 (   >"   )	key:  2		-> KEY_PLAYPAUSE
   133		 * 0x06 or 0x07 (   >>   )	key:  3		-> KEY_FORWARD
   134		 * 0x08 or 0x09 (   <<   )	key:  4		-> KEY_BACK
   135		 * 0x0a or 0x0b (    +   )	key:  5		-> KEY_VOLUMEUP
   136		 * 0x0c or 0x0d (    -   )	key:  6		-> KEY_VOLUMEDOWN
   137		 * 0x0e or 0x0f (        )	key:  7		-> KEY_RESERVED
   138		 * 0x50 or 0x51 (        )	key:  8		-> KEY_RESERVED
   139		 * 0x52 or 0x53 (        )	key:  9		-> KEY_RESERVED
   140		 * 0x54 or 0x55 (        )	key: 10		-> KEY_RESERVED
   141		 * 0x56 or 0x57 (        )	key: 11		-> KEY_RESERVED
   142		 * 0x58 or 0x59 (        )	key: 12		-> KEY_RESERVED
   143		 * 0x5a or 0x5b (        )	key: 13		-> KEY_RESERVED
   144		 * 0x5c or 0x5d ( middle )	key: 14		-> KEY_ENTER
   145		 * 0x5e or 0x5f (   >"   )	key: 15		-> KEY_PLAYPAUSE
   146		 *
   147		 * Packets starting with 0x5 are part of a two-packets message,
   148		 * we notify the caller by sending a negative value.
   149		 */
   150		int key = (data >> 1) & KEY_MASK;
   151	
   152		if ((data & TWO_PACKETS_MASK))
   153			/* Part of a 2 packets-command */
   154			key = -key;
   155	
   156		return key;
   157	}
   158	
   159	static void key_up(struct hid_device *hid, struct appleir *appleir, int key)
   160	{
   161		input_report_key(appleir->input_dev, key, 0);
   162		input_sync(appleir->input_dev);
   163	}
   164	
   165	static void key_down(struct hid_device *hid, struct appleir *appleir, int key)
   166	{
   167		input_report_key(appleir->input_dev, key, 1);
   168		input_sync(appleir->input_dev);
   169	}
   170	
   171	static void battery_flat(struct appleir *appleir)
   172	{
   173		dev_err(&appleir->input_dev->dev, "possible flat battery?\n");
   174	}
   175	
   176	static void key_up_tick(struct timer_list *t)
   177	{
 > 178		struct appleir *appleir = from_timer(applier, t, key_up_timer);
   179		struct hid_device *hid = appleir->hid;
   180		unsigned long flags;
   181	
   182		spin_lock_irqsave(&appleir->lock, flags);
   183		if (appleir->current_key) {
   184			key_up(hid, appleir, appleir->current_key);
   185			appleir->current_key = 0;
   186		}
   187		spin_unlock_irqrestore(&appleir->lock, flags);
   188	}
   189	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
diff mbox

Patch

diff --git a/drivers/hid/hid-appleir.c b/drivers/hid/hid-appleir.c
index 07cbc70..f5f4a93 100644
--- a/drivers/hid/hid-appleir.c
+++ b/drivers/hid/hid-appleir.c
@@ -173,9 +173,9 @@  static void battery_flat(struct appleir *appleir)
 	dev_err(&appleir->input_dev->dev, "possible flat battery?\n");
 }
 
-static void key_up_tick(unsigned long data)
+static void key_up_tick(struct timer_list *t)
 {
-	struct appleir *appleir = (struct appleir *)data;
+	struct appleir *appleir = from_timer(applier, t, key_up_timer);
 	struct hid_device *hid = appleir->hid;
 	unsigned long flags;
 
@@ -303,8 +303,8 @@  static int appleir_probe(struct hid_device *hid, const struct hid_device_id *id)
 	hid->quirks |= HID_QUIRK_HIDINPUT_FORCE;
 
 	spin_lock_init(&appleir->lock);
-	setup_timer(&appleir->key_up_timer,
-		    key_up_tick, (unsigned long) appleir);
+	timer_setup(&appleir->key_up_timer,
+		    key_up_tick, 0);
 
 	hid_set_drvdata(hid, appleir);
 
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
index 9e8c4d2..b5117a8 100644
--- a/drivers/hid/hid-multitouch.c
+++ b/drivers/hid/hid-multitouch.c
@@ -1246,9 +1246,9 @@  static void mt_release_contacts(struct hid_device *hid)
 	td->num_received = 0;
 }
 
-static void mt_expired_timeout(unsigned long arg)
+static void mt_expired_timeout(struct timer_list *t)
 {
-	struct hid_device *hdev = (void *)arg;
+	struct hid_device *hdev = from_timer(hdev, t, release_timer);
 	struct mt_device *td = hid_get_drvdata(hdev);
 
 	/*
@@ -1331,7 +1331,7 @@  static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
 	 */
 	hdev->quirks |= HID_QUIRK_NO_INIT_REPORTS;
 
-	setup_timer(&td->release_timer, mt_expired_timeout, (long)hdev);
+	timer_setup(&td->release_timer, mt_expired_timeout, 0);
 
 	ret = hid_parse(hdev);
 	if (ret != 0)
diff --git a/drivers/hid/hid-prodikeys.c b/drivers/hid/hid-prodikeys.c
index 49c4bd3..87eda34 100644
--- a/drivers/hid/hid-prodikeys.c
+++ b/drivers/hid/hid-prodikeys.c
@@ -239,9 +239,9 @@  static void pcmidi_send_note(struct pcmidi_snd *pm,
 	return;
 }
 
-static void pcmidi_sustained_note_release(unsigned long data)
+static void pcmidi_sustained_note_release(struct timer_list *t)
 {
-	struct pcmidi_sustain *pms = (struct pcmidi_sustain *)data;
+	struct pcmidi_sustain *pms = from_timer(pms, t, timer);
 
 	pcmidi_send_note(pms->pm, pms->status, pms->note, pms->velocity);
 	pms->in_use = 0;
@@ -256,8 +256,7 @@  static void init_sustain_timers(struct pcmidi_snd *pm)
 		pms = &pm->sustained_notes[i];
 		pms->in_use = 0;
 		pms->pm = pm;
-		setup_timer(&pms->timer, pcmidi_sustained_note_release,
-			(unsigned long)pms);
+		timer_setup(&pms->timer, pcmidi_sustained_note_release, 0);
 	}
 }
 
diff --git a/drivers/hid/hid-wiimote-core.c b/drivers/hid/hid-wiimote-core.c
index d003914..579884e 100644
--- a/drivers/hid/hid-wiimote-core.c
+++ b/drivers/hid/hid-wiimote-core.c
@@ -1226,9 +1226,9 @@  static void wiimote_schedule(struct wiimote_data *wdata)
 	spin_unlock_irqrestore(&wdata->state.lock, flags);
 }
 
-static void wiimote_init_timeout(unsigned long arg)
+static void wiimote_init_timeout(struct timer_list *t)
 {
-	struct wiimote_data *wdata = (void*)arg;
+	struct wiimote_data *wdata = from_timer(wdata, t, timer);
 
 	wiimote_schedule(wdata);
 }
@@ -1740,7 +1740,7 @@  static struct wiimote_data *wiimote_create(struct hid_device *hdev)
 	wdata->state.cmd_battery = 0xff;
 
 	INIT_WORK(&wdata->init_worker, wiimote_init_worker);
-	setup_timer(&wdata->timer, wiimote_init_timeout, (long)wdata);
+	timer_setup(&wdata->timer, wiimote_init_timeout, 0);
 
 	return wdata;
 }
diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
index 045b5da..640dfb93 100644
--- a/drivers/hid/usbhid/hid-core.c
+++ b/drivers/hid/usbhid/hid-core.c
@@ -101,10 +101,10 @@  static int hid_start_in(struct hid_device *hid)
 }
 
 /* I/O retry timer routine */
-static void hid_retry_timeout(unsigned long _hid)
+static void hid_retry_timeout(struct timer_list *t)
 {
-	struct hid_device *hid = (struct hid_device *) _hid;
-	struct usbhid_device *usbhid = hid->driver_data;
+	struct usbhid_device *usbhid = from_timer(usbhid, t, io_retry);
+	struct hid_device *hid = usbhid->hid;
 
 	dev_dbg(&usbhid->intf->dev, "retrying intr urb\n");
 	if (hid_start_in(hid))
@@ -1373,7 +1373,7 @@  static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id *
 
 	init_waitqueue_head(&usbhid->wait);
 	INIT_WORK(&usbhid->reset_work, hid_reset);
-	setup_timer(&usbhid->io_retry, hid_retry_timeout, (unsigned long) hid);
+	timer_setup(&usbhid->io_retry, hid_retry_timeout, 0);
 	spin_lock_init(&usbhid->lock);
 
 	ret = hid_add_device(hid);