Commit 26ccbec4 authored by Kevin Baradon's avatar Kevin Baradon Committed by Mauro Carvalho Chehab

[media] media/rc/imon.c: make send_packet() delay larger for 15c2:0036

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: default avatarKevin Baradon <kevin.baradon@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 15170025
...@@ -112,6 +112,7 @@ struct imon_context { ...@@ -112,6 +112,7 @@ struct imon_context {
bool tx_control; bool tx_control;
unsigned char usb_rx_buf[8]; unsigned char usb_rx_buf[8];
unsigned char usb_tx_buf[8]; unsigned char usb_tx_buf[8];
unsigned int send_packet_delay;
struct tx_t { struct tx_t {
unsigned char data_buf[35]; /* user data buffer */ unsigned char data_buf[35]; /* user data buffer */
...@@ -185,6 +186,10 @@ enum { ...@@ -185,6 +186,10 @@ enum {
IMON_KEY_PANEL = 2, IMON_KEY_PANEL = 2,
}; };
enum {
IMON_NEED_20MS_PKT_DELAY = 1
};
/* /*
* USB Device ID for iMON USB Control Boards * USB Device ID for iMON USB Control Boards
* *
...@@ -215,7 +220,7 @@ static struct usb_device_id imon_usb_id_table[] = { ...@@ -215,7 +220,7 @@ static struct usb_device_id imon_usb_id_table[] = {
/* SoundGraph iMON OEM Touch LCD (IR & 4.3" VGA LCD) */ /* SoundGraph iMON OEM Touch LCD (IR & 4.3" VGA LCD) */
{ USB_DEVICE(0x15c2, 0x0035) }, { USB_DEVICE(0x15c2, 0x0035) },
/* SoundGraph iMON OEM VFD (IR & VFD) */ /* SoundGraph iMON OEM VFD (IR & VFD) */
{ USB_DEVICE(0x15c2, 0x0036) }, { USB_DEVICE(0x15c2, 0x0036), .driver_info = IMON_NEED_20MS_PKT_DELAY },
/* device specifics unknown */ /* device specifics unknown */
{ USB_DEVICE(0x15c2, 0x0037) }, { USB_DEVICE(0x15c2, 0x0037) },
/* SoundGraph iMON OEM LCD (IR & LCD) */ /* SoundGraph iMON OEM LCD (IR & LCD) */
...@@ -535,12 +540,12 @@ static int send_packet(struct imon_context *ictx) ...@@ -535,12 +540,12 @@ static int send_packet(struct imon_context *ictx)
kfree(control_req); 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, * send_packet can get called so rapidly as to overwhelm the device,
* particularly on faster systems and/or those with quirky usb. * particularly on faster systems and/or those with quirky usb.
*/ */
timeout = msecs_to_jiffies(5); timeout = msecs_to_jiffies(ictx->send_packet_delay);
set_current_state(TASK_UNINTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(timeout); schedule_timeout(timeout);
return retval; return retval;
...@@ -2335,6 +2340,10 @@ static int imon_probe(struct usb_interface *interface, ...@@ -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); usb_set_intfdata(interface, ictx);
if (ifnum == 0) { if (ifnum == 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment