summaryrefslogtreecommitdiffstats
path: root/drivers/media/rc
diff options
context:
space:
mode:
authorSean Young <sean@mess.org>2012-08-13 08:59:40 -0300
committerMauro Carvalho Chehab <mchehab@redhat.com>2012-08-13 16:05:57 -0300
commit0797b4802b57ce88e9361c8d64b0980508370649 (patch)
tree095b41fa36a42b7b330139e9ab46b3fe663bcdc8 /drivers/media/rc
parente99a7cfe93fd9b853d80e7dda8b86ecca71c22bb (diff)
downloadlinux-0797b4802b57ce88e9361c8d64b0980508370649.tar.bz2
[media] iguanair: ignore unsupported firmware versions
Firmware versions lower than 0x0205 use a different interface which is not supported. Also report the firmware version in the standard format. Signed-off-by: Sean Young <sean@mess.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/rc')
-rw-r--r--drivers/media/rc/Kconfig8
-rw-r--r--drivers/media/rc/iguanair.c21
2 files changed, 17 insertions, 12 deletions
diff --git a/drivers/media/rc/Kconfig b/drivers/media/rc/Kconfig
index 5180390be7ab..2e91e664d024 100644
--- a/drivers/media/rc/Kconfig
+++ b/drivers/media/rc/Kconfig
@@ -264,8 +264,12 @@ config IR_IGUANA
depends on RC_CORE
select USB
---help---
- Say Y here if you want to use the IgaunaWorks USB IR Transceiver.
- Both infrared receive and send are supported.
+ Say Y here if you want to use the IguanaWorks USB IR Transceiver.
+ Both infrared receive and send are supported. If you want to
+ change the ID or the pin config, use the user space driver from
+ IguanaWorks.
+
+ Only firmware 0x0205 and later is supported.
To compile this driver as a module, choose M here: the module will
be called iguanair.
diff --git a/drivers/media/rc/iguanair.c b/drivers/media/rc/iguanair.c
index bdd526df0b74..58854004db88 100644
--- a/drivers/media/rc/iguanair.c
+++ b/drivers/media/rc/iguanair.c
@@ -36,8 +36,8 @@ struct iguanair {
struct usb_device *udev;
int pipe_out;
+ uint16_t version;
uint8_t bufsize;
- uint8_t version[2];
struct mutex lock;
@@ -97,8 +97,8 @@ static void process_ir_data(struct iguanair *ir, unsigned len)
switch (ir->buf_in[3]) {
case CMD_GET_VERSION:
if (len == 6) {
- ir->version[0] = ir->buf_in[4];
- ir->version[1] = ir->buf_in[5];
+ ir->version = (ir->buf_in[5] << 8) |
+ ir->buf_in[4];
complete(&ir->completion);
}
break;
@@ -110,8 +110,7 @@ static void process_ir_data(struct iguanair *ir, unsigned len)
break;
case CMD_GET_FEATURES:
if (len > 5) {
- if (ir->version[0] >= 4)
- ir->cycle_overhead = ir->buf_in[5];
+ ir->cycle_overhead = ir->buf_in[5];
complete(&ir->completion);
}
break;
@@ -219,6 +218,12 @@ static int iguanair_get_features(struct iguanair *ir)
goto out;
}
+ if (ir->version < 0x205) {
+ dev_err(ir->dev, "firmware 0x%04x is too old\n", ir->version);
+ rc = -ENODEV;
+ goto out;
+ }
+
ir->bufsize = 150;
ir->cycle_overhead = 65;
@@ -230,9 +235,6 @@ static int iguanair_get_features(struct iguanair *ir)
goto out;
}
- if (ir->version[0] == 0 || ir->version[1] == 0)
- goto out;
-
packet.cmd = CMD_GET_FEATURES;
rc = iguanair_send(ir, &packet, sizeof(packet));
@@ -485,8 +487,7 @@ static int __devinit iguanair_probe(struct usb_interface *intf,
goto out2;
snprintf(ir->name, sizeof(ir->name),
- "IguanaWorks USB IR Transceiver version %d.%d",
- ir->version[0], ir->version[1]);
+ "IguanaWorks USB IR Transceiver version 0x%04x", ir->version);
usb_make_path(ir->udev, ir->phys, sizeof(ir->phys));