aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/rc
diff options
context:
space:
mode:
authorJarod Wilson <jarod@redhat.com>2011-07-18 15:54:25 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-08-27 07:53:15 -0400
commitab1072eba9a635511279c72150b35c1cf95ceda1 (patch)
tree8bec89db664347e5af29000ae7230a98fc9ab59a /drivers/media/rc
parent4840b788ad608977d47964d39ee53a55bec41702 (diff)
[media] mceusb: query device for firmware emulator version
Supposedly, there are essentially three different classes of devices that are compatible with Microsoft's specs. First are the "legacy" devices, which are built using Microsoft-provided hardware specs and firmware. Second are "emulator" devices, which are built using custom hardware and firmware, written to emulate Microsoft's firmware. Third are "port" devices, which have their own device driver and firmware, which provides compatible data to higher levels of the stack. >From what I can tell, things like nuvoton-cir and fintek-cir are essentially "port" devices -- their raw IR buffer format is very similar to that of the mceusb devices. Now, within the mceusb driver, we have three different "generations", which at first, seemed like maybe they mapped to emulator versions. Unfortuantely, every single device I have responds "illegal command" to the query to get firmware emulator version from the hardware, which means they're either all emulator version 1, or they're legacy devices, and our different "generations" aren't at all related here. Though in theory, its possible the gen1 devices are "legacy" devices and the rest are emulator v1. There are some useful features of the v2 interface I was hoping to play with, but alas... Signed-off-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/rc')
-rw-r--r--drivers/media/rc/mceusb.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c
index 181a9b61de0e..4c5909f06ac2 100644
--- a/drivers/media/rc/mceusb.c
+++ b/drivers/media/rc/mceusb.c
@@ -438,12 +438,14 @@ struct mceusb_dev {
438 enum mceusb_model_type model; 438 enum mceusb_model_type model;
439 439
440 bool need_reset; /* flag to issue a device resume cmd */ 440 bool need_reset; /* flag to issue a device resume cmd */
441 u8 emver; /* emulator interface version */
441}; 442};
442 443
443/* MCE Device Command Strings, generally a port and command pair */ 444/* MCE Device Command Strings, generally a port and command pair */
444static char DEVICE_RESUME[] = {MCE_CMD_NULL, MCE_CMD_PORT_SYS, 445static char DEVICE_RESUME[] = {MCE_CMD_NULL, MCE_CMD_PORT_SYS,
445 MCE_CMD_RESUME}; 446 MCE_CMD_RESUME};
446static char GET_REVISION[] = {MCE_CMD_PORT_SYS, MCE_CMD_G_REVISION}; 447static char GET_REVISION[] = {MCE_CMD_PORT_SYS, MCE_CMD_G_REVISION};
448static char GET_EMVER[] = {MCE_CMD_PORT_SYS, MCE_CMD_GETEMVER};
447static char GET_WAKEVERSION[] = {MCE_CMD_PORT_SYS, MCE_CMD_GETWAKEVERSION}; 449static char GET_WAKEVERSION[] = {MCE_CMD_PORT_SYS, MCE_CMD_GETWAKEVERSION};
448static char GET_UNKNOWN2[] = {MCE_CMD_PORT_IR, MCE_CMD_UNKNOWN2}; 450static char GET_UNKNOWN2[] = {MCE_CMD_PORT_IR, MCE_CMD_UNKNOWN2};
449static char GET_CARRIER_FREQ[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRCFS}; 451static char GET_CARRIER_FREQ[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRCFS};
@@ -913,6 +915,9 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index)
913 break; 915 break;
914 916
915 /* 1-byte return value commands */ 917 /* 1-byte return value commands */
918 case MCE_RSP_EQEMVER:
919 ir->emver = hi;
920 break;
916 case MCE_RSP_EQIRTXPORTS: 921 case MCE_RSP_EQIRTXPORTS:
917 ir->tx_mask = hi; 922 ir->tx_mask = hi;
918 break; 923 break;
@@ -1035,6 +1040,13 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
1035 usb_submit_urb(urb, GFP_ATOMIC); 1040 usb_submit_urb(urb, GFP_ATOMIC);
1036} 1041}
1037 1042
1043static void mceusb_get_emulator_version(struct mceusb_dev *ir)
1044{
1045 /* If we get no reply or an illegal command reply, its ver 1, says MS */
1046 ir->emver = 1;
1047 mce_async_out(ir, GET_EMVER, sizeof(GET_EMVER));
1048}
1049
1038static void mceusb_gen1_init(struct mceusb_dev *ir) 1050static void mceusb_gen1_init(struct mceusb_dev *ir)
1039{ 1051{
1040 int ret; 1052 int ret;
@@ -1288,6 +1300,9 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1288 mce_dbg(&intf->dev, "Flushing receive buffers\n"); 1300 mce_dbg(&intf->dev, "Flushing receive buffers\n");
1289 mce_flush_rx_buffer(ir, maxp); 1301 mce_flush_rx_buffer(ir, maxp);
1290 1302
1303 /* figure out which firmware/emulator version this hardware has */
1304 mceusb_get_emulator_version(ir);
1305
1291 /* initialize device */ 1306 /* initialize device */
1292 if (ir->flags.microsoft_gen1) 1307 if (ir->flags.microsoft_gen1)
1293 mceusb_gen1_init(ir); 1308 mceusb_gen1_init(ir);
@@ -1305,8 +1320,8 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1305 device_set_wakeup_capable(ir->dev, true); 1320 device_set_wakeup_capable(ir->dev, true);
1306 device_set_wakeup_enable(ir->dev, true); 1321 device_set_wakeup_enable(ir->dev, true);
1307 1322
1308 dev_info(&intf->dev, "Registered %s on usb%d:%d\n", name, 1323 dev_info(&intf->dev, "Registered %s with mce emulator interface "
1309 dev->bus->busnum, dev->devnum); 1324 "version %x\n", name, ir->emver);
1310 1325
1311 return 0; 1326 return 0;
1312 1327