[media] media/rc/imon.c: make send_packet() delay larger for 15c2:0036
authorKevin Baradon <kevin.baradon@gmail.com>
Mon, 18 Feb 2013 17:42:47 +0000 (14:42 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 21 Mar 2013 21:34:25 +0000 (18:34 -0300)
Some imon devices (like 15c2:0036) need a higher delay between
send_packet calls.

Default value is still 5ms to avoid regressions on already working
hardware.

Also use interruptible wait to avoid load average going too high (and
let caller handle signals).

Signed-off-by: Kevin Baradon <kevin.baradon@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/rc/imon.c

index dec203bb06f6dadfd78ab82e983584cb6d008891..178b94660b589a9309f08411200b126ed7520641 100644 (file)
@@ -112,6 +112,7 @@ struct imon_context {
        bool tx_control;
        unsigned char usb_rx_buf[8];
        unsigned char usb_tx_buf[8];
+       unsigned int send_packet_delay;
 
        struct tx_t {
                unsigned char data_buf[35];     /* user data buffer */
@@ -185,6 +186,10 @@ enum {
        IMON_KEY_PANEL  = 2,
 };
 
+enum {
+       IMON_NEED_20MS_PKT_DELAY = 1
+};
+
 /*
  * USB Device ID for iMON USB Control Boards
  *
@@ -215,7 +220,7 @@ static struct usb_device_id imon_usb_id_table[] = {
        /* SoundGraph iMON OEM Touch LCD (IR & 4.3" VGA LCD) */
        { USB_DEVICE(0x15c2, 0x0035) },
        /* SoundGraph iMON OEM VFD (IR & VFD) */
-       { USB_DEVICE(0x15c2, 0x0036) },
+       { USB_DEVICE(0x15c2, 0x0036), .driver_info = IMON_NEED_20MS_PKT_DELAY },
        /* device specifics unknown */
        { USB_DEVICE(0x15c2, 0x0037) },
        /* SoundGraph iMON OEM LCD (IR & LCD) */
@@ -535,12 +540,12 @@ static int send_packet(struct imon_context *ictx)
        kfree(control_req);
 
        /*
-        * Induce a mandatory 5ms delay before returning, as otherwise,
+        * Induce a mandatory delay before returning, as otherwise,
         * send_packet can get called so rapidly as to overwhelm the device,
         * particularly on faster systems and/or those with quirky usb.
         */
-       timeout = msecs_to_jiffies(5);
-       set_current_state(TASK_UNINTERRUPTIBLE);
+       timeout = msecs_to_jiffies(ictx->send_packet_delay);
+       set_current_state(TASK_INTERRUPTIBLE);
        schedule_timeout(timeout);
 
        return retval;
@@ -2335,6 +2340,10 @@ static int imon_probe(struct usb_interface *interface,
 
        }
 
+       /* default send_packet delay is 5ms but some devices need more */
+       ictx->send_packet_delay = id->driver_info & IMON_NEED_20MS_PKT_DELAY ?
+                                 20 : 5;
+
        usb_set_intfdata(interface, ictx);
 
        if (ifnum == 0) {