- Fix IR wakeup on nuvoton-cir-driven hardware - Make mceusb only bind to the IR interface on Realtek multifuction thingy - Kill the crappy old lirc_it* drivers, add new ite_cir driver - Fix HVR-1950 (and possibly other) device bring-up (#680450) Signed-off-by: Jarod Wilson <jarod@redhat.com>
658 lines
24 KiB
Diff
658 lines
24 KiB
Diff
Most IR fixups take from:
|
|
|
|
http://git.kernel.org/?p=linux/kernel/git/jarod/linux-2.6-ir.git;a=shortlog;h=refs/heads/staging
|
|
|
|
Last three taken from:
|
|
|
|
http://git.linuxtv.org/jarod/linux-2.6-ir.git?a=shortlog;h=refs/heads/for-2.6.38
|
|
|
|
Should all be in v4l/dvb/rc soon...
|
|
|
|
|
|
commit db7e4498b17d9b52c8fddf828bad54454ab130ec
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Thu Jan 27 13:08:35 2011 -0500
|
|
|
|
rc/streamzap: fix reporting response times
|
|
|
|
The streamzap driver has relatively low sampling resolution, and any
|
|
delays in reporting events seem to cause some minor problems for the
|
|
likes of irw when using the lirc bridge driver, resulting in a single
|
|
keypress registering as multiple independent ones, rather than as a
|
|
single press with repeats. If we call ir_raw_event_handle() more
|
|
frequently and reset the rawir kfifo at end-of-signal, the behavior
|
|
improves quite a bit.
|
|
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
commit 583602a0c6cab187b2f3b4c90509bbe2b85f5d51
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Mon Jan 24 22:06:32 2011 -0500
|
|
|
|
mceusb: really fix remaining keybounce issues
|
|
|
|
Make sure rawir struct is zeroed out before populating it for each
|
|
ir_raw_event_store_with_filter() call, and when we see a trailing 0x80
|
|
packet (end-of-data), issue an ir_raw_event_reset() call.
|
|
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
commit 8b07e7fe2fa1c763a8f08a179917fdf1a43b479d
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Thu Jan 20 16:31:18 2011 -0500
|
|
|
|
ir-kbd-i2c: improve remote behavior with z8 behind usb
|
|
|
|
Add the same "are you ready?" i2c_master_send() poll command to
|
|
get_key_haup_xvr found in lirc_zilog, which is apparently seen in
|
|
the Windows driver for the PVR-150 w/a z8. This stabilizes what is
|
|
received from both the HD-PVR and HVR-1950, even with their polling
|
|
intervals at the default of 100, thus the removal of the custom
|
|
260ms polling_interval in pvrusb2-i2c-core.c.
|
|
|
|
Acked-by: Andy Walls <awalls@md.metrocast.net>
|
|
Acked-by: Mike Isely <isely@isely.net>
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
commit aedf7d79cdeaf97d3efc7d667eeb94689bbc6e7d
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Wed Jan 19 16:49:19 2011 -0500
|
|
|
|
lirc_zilog: z8 on usb doesn't like back-to-back i2c_master_send
|
|
|
|
Both the HD-PVR and HVR-1950, driven by the hdpvr and pvrusb2 drivers
|
|
respectively, have a zilog z8 chip exposed via i2c. These are both
|
|
usb-connected devices, and on both of them, back-to-back i2c_master_send
|
|
calls that work fine with a z8 on a pci card fail with a -EIO, as the
|
|
chip isn't yet ready from the prior command. To cope with that, add a
|
|
delay and retry loop where necessary.
|
|
|
|
Acked-by: Andy Walls <awalls@md.metrocast.net>
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
t 2b197149441796e694721db984db9e5ca4656856
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Wed Jan 19 16:10:14 2011 -0500
|
|
|
|
hdpvr: fix up i2c device registration
|
|
|
|
We have to actually call i2c_new_device() once for each of the rx and tx
|
|
addresses. Also improve error-handling and device remove i2c cleanup.
|
|
|
|
Reviewed-by: Andy Walls <awalls@md.metrocast.net>
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
commit f2a6849f005fc0da0528ada0c3c79c7572db2898
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Tue Jan 18 00:33:08 2011 -0500
|
|
|
|
rc/ir-lirc-codec: add back debug spew
|
|
|
|
Some occasionally useful debug spew disappeared as part of a feature
|
|
update a while back, and I'm finding myself in need of it again to help
|
|
diagnose some issues.
|
|
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
commit 20285f04106a578f6202ba043e0044df614aee05
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Tue Jan 18 00:27:45 2011 -0500
|
|
|
|
rc/mce: add mappings for missing keys
|
|
|
|
Per http://mediacenterguides.com/book/export/html/31 and investigation
|
|
by Erin, we were missing these last three mappings to complete the mce
|
|
key table. Lets remedy that.
|
|
|
|
Reported-by: Erin Simonds <fisslefink@gmail.com>
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
commit 2469809bfffe496fa51cb030759f6c2f55dc5002
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Tue Mar 1 10:21:50 2011 -0500
|
|
|
|
tda829x: fix regression in probe functions
|
|
|
|
In commit 567aba0b7997dad5fe3fb4aeb174ee9018df8c5b, the probe address
|
|
for tda8290_probe and tda8295_probe was hard-coded to 0x4b, which is the
|
|
default i2c address for those devices, but its possible for the device
|
|
to be at an alternate address, 0x42, which is the case for the HVR-1950.
|
|
If we probe the wrong address, probe fails and we have a non-working
|
|
device. We have the actual address passed into the function by way of
|
|
i2c_props, we just need to use it. Also fix up some copy/paste comment
|
|
issues and streamline debug spew a touch. Verified to restore my
|
|
HVR-1950 to full working order.
|
|
|
|
Special thanks to Ken Bass for reporting the issue in the first place,
|
|
and to both he and Gary Buhrmaster for aiding in debugging and analysis
|
|
of the problem.
|
|
|
|
Reported-by: Ken Bass <kbass@kenbass.com>
|
|
Tested-by: Jarod Wilson <jarod@redhat.com>
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
commit 428cca0644eba44c867b21b1fef5d30678d52e8a
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Mon Feb 28 17:04:43 2011 -0500
|
|
|
|
mceusb: don't claim multifunction device non-IR parts
|
|
|
|
There's a Realtek combo card reader and IR receiver device with multiple
|
|
usb interfaces on it. The mceusb driver is incorrectly grabbing all of
|
|
them. This change should make it bind to only interface 2 (patch based
|
|
on lsusb output on the linux-media list from Lucian Muresan).
|
|
|
|
Tested regression-free with the six mceusb devices I have myself.
|
|
|
|
Reported-by: Patrick Boettcher <pboettcher@kernellabs.com>
|
|
Reported-by: Lucian Muresan <lucianm@users.sourceforge.net>
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
commit 24a576808cee7c32f2be97ed9050562fd671292e
|
|
Author: Jarod Wilson <jarod@redhat.com>
|
|
Date: Mon Feb 28 16:33:32 2011 -0500
|
|
|
|
nuvoton-cir: fix wake from suspend
|
|
|
|
The CIR Wake FIFO is 67 bytes long, but the stock remote appears to only
|
|
populate 65 of them. Limit comparison to 65 bytes, and wake from suspend
|
|
works a whole lot better (it wasn't working at all for most folks).
|
|
|
|
Fix based on comparison with the old lirc_wb677 driver from Nuvoton,
|
|
debugging and testing done by Dave Treacy by way of the lirc mailing
|
|
list.
|
|
|
|
Reported-by: Dave Treacy <davetreacy@gmail.com>
|
|
CC: stable@vger.kernel.org
|
|
Signed-off-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
|
|
diff --git a/drivers/media/rc/ir-lirc-codec.c b/drivers/media/rc/ir-lirc-codec.c
|
|
index f011c5d..1c5cc65 100644
|
|
--- a/drivers/media/rc/ir-lirc-codec.c
|
|
+++ b/drivers/media/rc/ir-lirc-codec.c
|
|
@@ -1,4 +1,4 @@
|
|
-/* ir-lirc-codec.c - ir-core to classic lirc interface bridge
|
|
+/* ir-lirc-codec.c - rc-core to classic lirc interface bridge
|
|
*
|
|
* Copyright (C) 2010 by Jarod Wilson <jarod@redhat.com>
|
|
*
|
|
@@ -47,6 +47,7 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
|
/* Carrier reports */
|
|
if (ev.carrier_report) {
|
|
sample = LIRC_FREQUENCY(ev.carrier);
|
|
+ IR_dprintk(2, "carrier report (freq: %d)\n", sample);
|
|
|
|
/* Packet end */
|
|
} else if (ev.timeout) {
|
|
@@ -62,6 +63,7 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
|
return 0;
|
|
|
|
sample = LIRC_TIMEOUT(ev.duration / 1000);
|
|
+ IR_dprintk(2, "timeout report (duration: %d)\n", sample);
|
|
|
|
/* Normal sample */
|
|
} else {
|
|
@@ -85,6 +87,8 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev)
|
|
|
|
sample = ev.pulse ? LIRC_PULSE(ev.duration / 1000) :
|
|
LIRC_SPACE(ev.duration / 1000);
|
|
+ IR_dprintk(2, "delivering %uus %s to lirc_dev\n",
|
|
+ TO_US(ev.duration), TO_STR(ev.pulse));
|
|
}
|
|
|
|
lirc_buffer_write(dev->raw->lirc.drv->rbuf,
|
|
diff --git a/drivers/media/rc/keymaps/rc-rc6-mce.c b/drivers/media/rc/keymaps/rc-rc6-mce.c
|
|
index 3bf3337..2f5dc06 100644
|
|
--- a/drivers/media/rc/keymaps/rc-rc6-mce.c
|
|
+++ b/drivers/media/rc/keymaps/rc-rc6-mce.c
|
|
@@ -3,6 +3,9 @@
|
|
*
|
|
* Copyright (c) 2010 by Jarod Wilson <jarod@redhat.com>
|
|
*
|
|
+ * See http://mediacenterguides.com/book/export/html/31 for details on
|
|
+ * key mappings.
|
|
+ *
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
@@ -60,6 +63,9 @@ static struct rc_map_table rc6_mce[] = {
|
|
{ 0x800f0426, KEY_EPG }, /* Guide */
|
|
{ 0x800f0427, KEY_ZOOM }, /* Aspect */
|
|
|
|
+ { 0x800f0432, KEY_MODE }, /* Visualization */
|
|
+ { 0x800f0433, KEY_PRESENTATION }, /* Slide Show */
|
|
+ { 0x800f0434, KEY_EJECTCD },
|
|
{ 0x800f043a, KEY_BRIGHTNESSUP },
|
|
|
|
{ 0x800f0446, KEY_TV },
|
|
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c
|
|
index 079353e..cf763fb 100644
|
|
--- a/drivers/media/rc/mceusb.c
|
|
+++ b/drivers/media/rc/mceusb.c
|
|
@@ -855,6 +855,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
|
|
break;
|
|
case PARSE_IRDATA:
|
|
ir->rem--;
|
|
+ init_ir_raw_event(&rawir);
|
|
rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0);
|
|
rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK)
|
|
* MS_TO_US(MCE_TIME_UNIT);
|
|
@@ -883,6 +884,8 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
|
|
i, ir->rem + 1, false);
|
|
if (ir->rem)
|
|
ir->parser_state = PARSE_IRDATA;
|
|
+ else
|
|
+ ir_raw_event_reset(ir->rc);
|
|
break;
|
|
}
|
|
|
|
diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c
|
|
index a6572e5..a27d93b 100644
|
|
--- a/drivers/media/video/hdpvr/hdpvr-core.c
|
|
+++ b/drivers/media/video/hdpvr/hdpvr-core.c
|
|
@@ -283,6 +283,7 @@ static int hdpvr_probe(struct usb_interface *interface,
|
|
struct hdpvr_device *dev;
|
|
struct usb_host_interface *iface_desc;
|
|
struct usb_endpoint_descriptor *endpoint;
|
|
+ struct i2c_client *client;
|
|
size_t buffer_size;
|
|
int i;
|
|
int retval = -ENOMEM;
|
|
@@ -381,13 +382,21 @@ static int hdpvr_probe(struct usb_interface *interface,
|
|
#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
|
retval = hdpvr_register_i2c_adapter(dev);
|
|
if (retval < 0) {
|
|
- v4l2_err(&dev->v4l2_dev, "registering i2c adapter failed\n");
|
|
+ v4l2_err(&dev->v4l2_dev, "i2c adapter register failed\n");
|
|
goto error;
|
|
}
|
|
|
|
- retval = hdpvr_register_i2c_ir(dev);
|
|
- if (retval < 0)
|
|
- v4l2_err(&dev->v4l2_dev, "registering i2c IR devices failed\n");
|
|
+ client = hdpvr_register_ir_rx_i2c(dev);
|
|
+ if (!client) {
|
|
+ v4l2_err(&dev->v4l2_dev, "i2c IR RX device register failed\n");
|
|
+ goto reg_fail;
|
|
+ }
|
|
+
|
|
+ client = hdpvr_register_ir_tx_i2c(dev);
|
|
+ if (!client) {
|
|
+ v4l2_err(&dev->v4l2_dev, "i2c IR TX device register failed\n");
|
|
+ goto reg_fail;
|
|
+ }
|
|
#endif
|
|
|
|
/* let the user know what node this device is now attached to */
|
|
@@ -395,6 +404,10 @@ static int hdpvr_probe(struct usb_interface *interface,
|
|
video_device_node_name(dev->video_dev));
|
|
return 0;
|
|
|
|
+reg_fail:
|
|
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
|
+ i2c_del_adapter(&dev->i2c_adapter);
|
|
+#endif
|
|
error:
|
|
if (dev) {
|
|
/* Destroy single thread */
|
|
@@ -424,6 +437,9 @@ static void hdpvr_disconnect(struct usb_interface *interface)
|
|
mutex_lock(&dev->io_mutex);
|
|
hdpvr_cancel_queue(dev);
|
|
mutex_unlock(&dev->io_mutex);
|
|
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
|
|
+ i2c_del_adapter(&dev->i2c_adapter);
|
|
+#endif
|
|
video_unregister_device(dev->video_dev);
|
|
atomic_dec(&dev_nr);
|
|
}
|
|
diff --git a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
|
index 89b71fa..e53fa55 100644
|
|
--- a/drivers/media/video/hdpvr/hdpvr-i2c.c
|
|
+++ b/drivers/media/video/hdpvr/hdpvr-i2c.c
|
|
@@ -31,26 +31,34 @@
|
|
#define Z8F0811_IR_RX_I2C_ADDR 0x71
|
|
|
|
|
|
-static struct i2c_board_info hdpvr_i2c_board_info = {
|
|
- I2C_BOARD_INFO("ir_tx_z8f0811_hdpvr", Z8F0811_IR_TX_I2C_ADDR),
|
|
- I2C_BOARD_INFO("ir_rx_z8f0811_hdpvr", Z8F0811_IR_RX_I2C_ADDR),
|
|
-};
|
|
+struct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev)
|
|
+{
|
|
+ struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data;
|
|
+ struct i2c_board_info hdpvr_ir_tx_i2c_board_info = {
|
|
+ I2C_BOARD_INFO("ir_tx_z8f0811_hdpvr", Z8F0811_IR_TX_I2C_ADDR),
|
|
+ };
|
|
+
|
|
+ init_data->name = "HD-PVR";
|
|
+ hdpvr_ir_tx_i2c_board_info.platform_data = init_data;
|
|
|
|
-int hdpvr_register_i2c_ir(struct hdpvr_device *dev)
|
|
+ return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_tx_i2c_board_info);
|
|
+}
|
|
+
|
|
+struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev)
|
|
{
|
|
- struct i2c_client *c;
|
|
struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data;
|
|
+ struct i2c_board_info hdpvr_ir_rx_i2c_board_info = {
|
|
+ I2C_BOARD_INFO("ir_rx_z8f0811_hdpvr", Z8F0811_IR_RX_I2C_ADDR),
|
|
+ };
|
|
|
|
/* Our default information for ir-kbd-i2c.c to use */
|
|
init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW;
|
|
init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
|
|
init_data->type = RC_TYPE_RC5;
|
|
- init_data->name = "HD PVR";
|
|
- hdpvr_i2c_board_info.platform_data = init_data;
|
|
-
|
|
- c = i2c_new_device(&dev->i2c_adapter, &hdpvr_i2c_board_info);
|
|
+ init_data->name = "HD-PVR";
|
|
+ hdpvr_ir_rx_i2c_board_info.platform_data = init_data;
|
|
|
|
- return (c == NULL) ? -ENODEV : 0;
|
|
+ return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_rx_i2c_board_info);
|
|
}
|
|
|
|
static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus,
|
|
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h
|
|
index ee74e3b..072f23c 100644
|
|
--- a/drivers/media/video/hdpvr/hdpvr.h
|
|
+++ b/drivers/media/video/hdpvr/hdpvr.h
|
|
@@ -313,7 +313,8 @@ int hdpvr_cancel_queue(struct hdpvr_device *dev);
|
|
/* i2c adapter registration */
|
|
int hdpvr_register_i2c_adapter(struct hdpvr_device *dev);
|
|
|
|
-int hdpvr_register_i2c_ir(struct hdpvr_device *dev);
|
|
+struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev);
|
|
+struct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev);
|
|
|
|
/*========================================================================*/
|
|
/* buffer management */
|
|
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c
|
|
index d2b20ad..a221ad6 100644
|
|
--- a/drivers/media/video/ir-kbd-i2c.c
|
|
+++ b/drivers/media/video/ir-kbd-i2c.c
|
|
@@ -128,6 +128,19 @@ static int get_key_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
|
|
|
static int get_key_haup_xvr(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
|
{
|
|
+ int ret;
|
|
+ unsigned char buf[1] = { 0 };
|
|
+
|
|
+ /*
|
|
+ * This is the same apparent "are you ready?" poll command observed
|
|
+ * watching Windows driver traffic and implemented in lirc_zilog. With
|
|
+ * this added, we get far saner remote behavior with z8 chips on usb
|
|
+ * connected devices, even with the default polling interval of 100ms.
|
|
+ */
|
|
+ ret = i2c_master_send(ir->c, buf, 1);
|
|
+ if (ret != 1)
|
|
+ return (ret < 0) ? ret : -EINVAL;
|
|
+
|
|
return get_key_haup_common (ir, ir_key, ir_raw, 6, 3);
|
|
}
|
|
|
|
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
|
|
index ccc8849..451ecd4 100644
|
|
--- a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
|
|
+++ b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c
|
|
@@ -597,7 +597,6 @@ static void pvr2_i2c_register_ir(struct pvr2_hdw *hdw)
|
|
init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
|
|
init_data->type = RC_TYPE_RC5;
|
|
init_data->name = hdw->hdw_desc->description;
|
|
- init_data->polling_interval = 260; /* ms From lirc_zilog */
|
|
/* IR Receiver */
|
|
info.addr = 0x71;
|
|
info.platform_data = init_data;
|
|
diff --git a/drivers/staging/lirc/lirc_zilog.c b/drivers/staging/lirc/lirc_zilog.c
|
|
index 3fe5f41..0aad0d7 100644
|
|
--- a/drivers/staging/lirc/lirc_zilog.c
|
|
+++ b/drivers/staging/lirc/lirc_zilog.c
|
|
@@ -495,7 +495,7 @@ static int send_data_block(struct IR_tx *tx, unsigned char *data_block)
|
|
/* send boot data to the IR TX device */
|
|
static int send_boot_data(struct IR_tx *tx)
|
|
{
|
|
- int ret;
|
|
+ int ret, i;
|
|
unsigned char buf[4];
|
|
|
|
/* send the boot block */
|
|
@@ -503,7 +503,7 @@ static int send_boot_data(struct IR_tx *tx)
|
|
if (ret != 0)
|
|
return ret;
|
|
|
|
- /* kick it off? */
|
|
+ /* Hit the go button to activate the new boot data */
|
|
buf[0] = 0x00;
|
|
buf[1] = 0x20;
|
|
ret = i2c_master_send(tx->c, buf, 2);
|
|
@@ -511,7 +511,19 @@ static int send_boot_data(struct IR_tx *tx)
|
|
zilog_error("i2c_master_send failed with %d\n", ret);
|
|
return ret < 0 ? ret : -EFAULT;
|
|
}
|
|
- ret = i2c_master_send(tx->c, buf, 1);
|
|
+
|
|
+ /*
|
|
+ * Wait for zilog to settle after hitting go post boot block upload.
|
|
+ * Without this delay, the HD-PVR and HVR-1950 both return an -EIO
|
|
+ * upon attempting to get firmware revision, and tx probe thus fails.
|
|
+ */
|
|
+ for (i = 0; i < 10; i++) {
|
|
+ ret = i2c_master_send(tx->c, buf, 1);
|
|
+ if (ret == 1)
|
|
+ break;
|
|
+ udelay(100);
|
|
+ }
|
|
+
|
|
if (ret != 1) {
|
|
zilog_error("i2c_master_send failed with %d\n", ret);
|
|
return ret < 0 ? ret : -EFAULT;
|
|
@@ -523,8 +535,8 @@ static int send_boot_data(struct IR_tx *tx)
|
|
zilog_error("i2c_master_recv failed with %d\n", ret);
|
|
return 0;
|
|
}
|
|
- if (buf[0] != 0x80) {
|
|
- zilog_error("unexpected IR TX response: %02x\n", buf[0]);
|
|
+ if ((buf[0] != 0x80) && (buf[0] != 0xa0)) {
|
|
+ zilog_error("unexpected IR TX init response: %02x\n", buf[0]);
|
|
return 0;
|
|
}
|
|
zilog_notify("Zilog/Hauppauge IR blaster firmware version "
|
|
@@ -827,7 +839,15 @@ static int send_code(struct IR_tx *tx, unsigned int code, unsigned int key)
|
|
zilog_error("i2c_master_send failed with %d\n", ret);
|
|
return ret < 0 ? ret : -EFAULT;
|
|
}
|
|
- ret = i2c_master_send(tx->c, buf, 1);
|
|
+
|
|
+ /* Give the z8 a moment to process data block */
|
|
+ for (i = 0; i < 10; i++) {
|
|
+ ret = i2c_master_send(tx->c, buf, 1);
|
|
+ if (ret == 1)
|
|
+ break;
|
|
+ udelay(100);
|
|
+ }
|
|
+
|
|
if (ret != 1) {
|
|
zilog_error("i2c_master_send failed with %d\n", ret);
|
|
return ret < 0 ? ret : -EFAULT;
|
|
diff --git a/drivers/media/rc/streamzap.c b/drivers/media/rc/streamzap.c
|
|
index d9b6b48..e435d94 100644
|
|
--- a/drivers/media/rc/streamzap.c
|
|
+++ b/drivers/media/rc/streamzap.c
|
|
@@ -273,6 +273,7 @@ static void streamzap_callback(struct urb *urb)
|
|
if (sz->timeout_enabled)
|
|
sz_push(sz, rawir);
|
|
ir_raw_event_handle(sz->rdev);
|
|
+ ir_raw_event_reset(sz->rdev);
|
|
} else {
|
|
sz_push_full_space(sz, sz->buf_in[i]);
|
|
}
|
|
@@ -290,6 +291,7 @@ static void streamzap_callback(struct urb *urb)
|
|
}
|
|
}
|
|
|
|
+ ir_raw_event_handle(sz->rdev);
|
|
usb_submit_urb(urb, GFP_ATOMIC);
|
|
|
|
return;
|
|
diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c
|
|
index dd4caf8..d0b1c10 100644
|
|
--- a/drivers/media/rc/nuvoton-cir.c
|
|
+++ b/drivers/media/rc/nuvoton-cir.c
|
|
@@ -385,8 +385,9 @@ static void nvt_cir_regs_init(struct nvt_dev *nvt)
|
|
|
|
static void nvt_cir_wake_regs_init(struct nvt_dev *nvt)
|
|
{
|
|
- /* set number of bytes needed for wake key comparison (default 67) */
|
|
- nvt_cir_wake_reg_write(nvt, CIR_WAKE_FIFO_LEN, CIR_WAKE_FIFO_CMP_DEEP);
|
|
+ /* set number of bytes needed for wake from s3 (default 65) */
|
|
+ nvt_cir_wake_reg_write(nvt, CIR_WAKE_FIFO_CMP_BYTES,
|
|
+ CIR_WAKE_FIFO_CMP_DEEP);
|
|
|
|
/* set tolerance/variance allowed per byte during wake compare */
|
|
nvt_cir_wake_reg_write(nvt, CIR_WAKE_CMP_TOLERANCE,
|
|
diff --git a/drivers/media/rc/nuvoton-cir.h b/drivers/media/rc/nuvoton-cir.h
|
|
index 1df8235..048135e 100644
|
|
--- a/drivers/media/rc/nuvoton-cir.h
|
|
+++ b/drivers/media/rc/nuvoton-cir.h
|
|
@@ -305,8 +305,11 @@ struct nvt_dev {
|
|
#define CIR_WAKE_IRFIFOSTS_RX_EMPTY 0x20
|
|
#define CIR_WAKE_IRFIFOSTS_RX_FULL 0x10
|
|
|
|
-/* CIR Wake FIFO buffer is 67 bytes long */
|
|
-#define CIR_WAKE_FIFO_LEN 67
|
|
+/*
|
|
+ * The CIR Wake FIFO buffer is 67 bytes long, but the stock remote wakes
|
|
+ * the system comparing only 65 bytes (fails with this set to 67)
|
|
+ */
|
|
+#define CIR_WAKE_FIFO_CMP_BYTES 65
|
|
/* CIR Wake byte comparison tolerance */
|
|
#define CIR_WAKE_CMP_TOLERANCE 5
|
|
|
|
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c
|
|
index 079353e..d21ae1a 100644
|
|
--- a/drivers/media/rc/mceusb.c
|
|
+++ b/drivers/media/rc/mceusb.c
|
|
@@ -148,6 +148,7 @@ enum mceusb_model_type {
|
|
MCE_GEN2_TX_INV,
|
|
POLARIS_EVK,
|
|
CX_HYBRID_TV,
|
|
+ MULTIFUNCTION,
|
|
};
|
|
|
|
struct mceusb_model {
|
|
@@ -155,9 +156,10 @@ struct mceusb_model {
|
|
u32 mce_gen2:1;
|
|
u32 mce_gen3:1;
|
|
u32 tx_mask_normal:1;
|
|
- u32 is_polaris:1;
|
|
u32 no_tx:1;
|
|
|
|
+ int ir_intfnum;
|
|
+
|
|
const char *rc_map; /* Allow specify a per-board map */
|
|
const char *name; /* per-board name */
|
|
};
|
|
@@ -179,7 +181,6 @@ static const struct mceusb_model mceusb_model[] = {
|
|
.tx_mask_normal = 1,
|
|
},
|
|
[POLARIS_EVK] = {
|
|
- .is_polaris = 1,
|
|
/*
|
|
* In fact, the EVK is shipped without
|
|
* remotes, but we should have something handy,
|
|
@@ -189,10 +190,13 @@ static const struct mceusb_model mceusb_model[] = {
|
|
.name = "Conexant Hybrid TV (cx231xx) MCE IR",
|
|
},
|
|
[CX_HYBRID_TV] = {
|
|
- .is_polaris = 1,
|
|
.no_tx = 1, /* tx isn't wired up at all */
|
|
.name = "Conexant Hybrid TV (cx231xx) MCE IR",
|
|
},
|
|
+ [MULTIFUNCTION] = {
|
|
+ .mce_gen2 = 1,
|
|
+ .ir_intfnum = 2,
|
|
+ },
|
|
};
|
|
|
|
static struct usb_device_id mceusb_dev_table[] = {
|
|
@@ -216,8 +220,9 @@ static struct usb_device_id mceusb_dev_table[] = {
|
|
{ USB_DEVICE(VENDOR_PHILIPS, 0x206c) },
|
|
/* Philips/Spinel plus IR transceiver for ASUS */
|
|
{ USB_DEVICE(VENDOR_PHILIPS, 0x2088) },
|
|
- /* Realtek MCE IR Receiver */
|
|
- { USB_DEVICE(VENDOR_REALTEK, 0x0161) },
|
|
+ /* Realtek MCE IR Receiver and card reader */
|
|
+ { USB_DEVICE(VENDOR_REALTEK, 0x0161),
|
|
+ .driver_info = MULTIFUNCTION },
|
|
/* SMK/Toshiba G83C0004D410 */
|
|
{ USB_DEVICE(VENDOR_SMK, 0x031d),
|
|
.driver_info = MCE_GEN2_TX_INV },
|
|
@@ -1098,7 +1103,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
|
|
bool is_gen3;
|
|
bool is_microsoft_gen1;
|
|
bool tx_mask_normal;
|
|
- bool is_polaris;
|
|
+ int ir_intfnum;
|
|
|
|
dev_dbg(&intf->dev, "%s called\n", __func__);
|
|
|
|
@@ -1107,13 +1112,11 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
|
|
is_gen3 = mceusb_model[model].mce_gen3;
|
|
is_microsoft_gen1 = mceusb_model[model].mce_gen1;
|
|
tx_mask_normal = mceusb_model[model].tx_mask_normal;
|
|
- is_polaris = mceusb_model[model].is_polaris;
|
|
+ ir_intfnum = mceusb_model[model].ir_intfnum;
|
|
|
|
- if (is_polaris) {
|
|
- /* Interface 0 is IR */
|
|
- if (idesc->desc.bInterfaceNumber)
|
|
- return -ENODEV;
|
|
- }
|
|
+ /* There are multi-function devices with non-IR interfaces */
|
|
+ if (idesc->desc.bInterfaceNumber != ir_intfnum)
|
|
+ return -ENODEV;
|
|
|
|
/* step through the endpoints to find first bulk in and out endpoint */
|
|
for (i = 0; i < idesc->desc.bNumEndpoints; ++i) {
|
|
diff --git a/drivers/media/common/tuners/tda8290.c b/drivers/media/common/tuners/tda8290.c
|
|
index bc6a677..8c48521 100644
|
|
--- a/drivers/media/common/tuners/tda8290.c
|
|
+++ b/drivers/media/common/tuners/tda8290.c
|
|
@@ -658,13 +658,13 @@ static int tda8290_probe(struct tuner_i2c_props *i2c_props)
|
|
#define TDA8290_ID 0x89
|
|
u8 reg = 0x1f, id;
|
|
struct i2c_msg msg_read[] = {
|
|
- { .addr = 0x4b, .flags = 0, .len = 1, .buf = ® },
|
|
- { .addr = 0x4b, .flags = I2C_M_RD, .len = 1, .buf = &id },
|
|
+ { .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = ® },
|
|
+ { .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id },
|
|
};
|
|
|
|
/* detect tda8290 */
|
|
if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) {
|
|
- printk(KERN_WARNING "%s: tda8290 couldn't read register 0x%02x\n",
|
|
+ printk(KERN_WARNING "%s: couldn't read register 0x%02x\n",
|
|
__func__, reg);
|
|
return -ENODEV;
|
|
}
|
|
@@ -685,13 +685,13 @@ static int tda8295_probe(struct tuner_i2c_props *i2c_props)
|
|
#define TDA8295C2_ID 0x8b
|
|
u8 reg = 0x2f, id;
|
|
struct i2c_msg msg_read[] = {
|
|
- { .addr = 0x4b, .flags = 0, .len = 1, .buf = ® },
|
|
- { .addr = 0x4b, .flags = I2C_M_RD, .len = 1, .buf = &id },
|
|
+ { .addr = i2c_props->addr, .flags = 0, .len = 1, .buf = ® },
|
|
+ { .addr = i2c_props->addr, .flags = I2C_M_RD, .len = 1, .buf = &id },
|
|
};
|
|
|
|
- /* detect tda8290 */
|
|
+ /* detect tda8295 */
|
|
if (i2c_transfer(i2c_props->adap, msg_read, 2) != 2) {
|
|
- printk(KERN_WARNING "%s: tda8290 couldn't read register 0x%02x\n",
|
|
+ printk(KERN_WARNING "%s: couldn't read register 0x%02x\n",
|
|
__func__, reg);
|
|
return -ENODEV;
|
|
}
|