aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorJarod Wilson <jarod@redhat.com>2011-07-18 15:54:26 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-08-27 07:55:02 -0400
commita411e83944bc48ce274b1bafdb6929846815856c (patch)
treee35aeff7a832bbc5a9b8554a19d39aa72709abc3 /drivers/media
parentab1072eba9a635511279c72150b35c1cf95ceda1 (diff)
[media] mceusb: get misc port data from hardware
According to the specs, you can read the number of tx ports, number of rx sensors, which tx ports have cables plugged into them, and which rx sensors are active. In practice, most of my devices do seem to report sane values for tx ports and rx sensors (but not all -- one without any tx ports reports having them), and most report the active sensor correctly, but only one of eight reports cabled tx ports correctly. So for the most part, this is just for informational purposes. Signed-off-by: Jarod Wilson <jarod@redhat.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/rc/mceusb.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c
index 4c5909f06ac2..c4f3bc00611d 100644
--- a/drivers/media/rc/mceusb.c
+++ b/drivers/media/rc/mceusb.c
@@ -439,6 +439,10 @@ struct mceusb_dev {
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 u8 emver; /* emulator interface version */
442 u8 num_txports; /* number of transmit ports */
443 u8 num_rxports; /* number of receive sensors */
444 u8 txports_cabled; /* bitmask of transmitters with cable */
445 u8 rxports_active; /* bitmask of active receive sensors */
442}; 446};
443 447
444/* MCE Device Command Strings, generally a port and command pair */ 448/* MCE Device Command Strings, generally a port and command pair */
@@ -450,6 +454,7 @@ static char GET_WAKEVERSION[] = {MCE_CMD_PORT_SYS, MCE_CMD_GETWAKEVERSION};
450static char GET_UNKNOWN2[] = {MCE_CMD_PORT_IR, MCE_CMD_UNKNOWN2}; 454static char GET_UNKNOWN2[] = {MCE_CMD_PORT_IR, MCE_CMD_UNKNOWN2};
451static char GET_CARRIER_FREQ[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRCFS}; 455static char GET_CARRIER_FREQ[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRCFS};
452static char GET_RX_TIMEOUT[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRTIMEOUT}; 456static char GET_RX_TIMEOUT[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRTIMEOUT};
457static char GET_NUM_PORTS[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRNUMPORTS};
453static char GET_TX_BITMASK[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRTXPORTS}; 458static char GET_TX_BITMASK[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRTXPORTS};
454static char GET_RX_SENSOR[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRRXPORTEN}; 459static char GET_RX_SENSOR[] = {MCE_CMD_PORT_IR, MCE_CMD_GETIRRXPORTEN};
455/* sub in desired values in lower byte or bytes for full command */ 460/* sub in desired values in lower byte or bytes for full command */
@@ -543,6 +548,8 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
543 548
544 switch (cmd) { 549 switch (cmd) {
545 case MCE_CMD_NULL: 550 case MCE_CMD_NULL:
551 if (subcmd == MCE_CMD_NULL)
552 break;
546 if ((subcmd == MCE_CMD_PORT_SYS) && 553 if ((subcmd == MCE_CMD_PORT_SYS) &&
547 (data1 == MCE_CMD_RESUME)) 554 (data1 == MCE_CMD_RESUME))
548 dev_info(dev, "Device resume requested\n"); 555 dev_info(dev, "Device resume requested\n");
@@ -909,10 +916,20 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index)
909 u8 lo = ir->buf_in[index + 2] & 0xff; 916 u8 lo = ir->buf_in[index + 2] & 0xff;
910 917
911 switch (ir->buf_in[index]) { 918 switch (ir->buf_in[index]) {
919 /* the one and only 5-byte return value command */
920 case MCE_RSP_GETPORTSTATUS:
921 if ((ir->buf_in[index + 4] & 0xff) == 0x00)
922 ir->txports_cabled |= 1 << hi;
923 break;
924
912 /* 2-byte return value commands */ 925 /* 2-byte return value commands */
913 case MCE_RSP_EQIRTIMEOUT: 926 case MCE_RSP_EQIRTIMEOUT:
914 ir->rc->timeout = US_TO_NS((hi << 8 | lo) * MCE_TIME_UNIT); 927 ir->rc->timeout = US_TO_NS((hi << 8 | lo) * MCE_TIME_UNIT);
915 break; 928 break;
929 case MCE_RSP_EQIRNUMPORTS:
930 ir->num_txports = hi;
931 ir->num_rxports = lo;
932 break;
916 933
917 /* 1-byte return value commands */ 934 /* 1-byte return value commands */
918 case MCE_RSP_EQEMVER: 935 case MCE_RSP_EQEMVER:
@@ -923,6 +940,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index)
923 break; 940 break;
924 case MCE_RSP_EQIRRXPORTEN: 941 case MCE_RSP_EQIRRXPORTEN:
925 ir->learning_enabled = ((hi & 0x02) == 0x02); 942 ir->learning_enabled = ((hi & 0x02) == 0x02);
943 ir->rxports_active = hi;
926 break; 944 break;
927 case MCE_RSP_CMD_ILLEGAL: 945 case MCE_RSP_CMD_ILLEGAL:
928 ir->need_reset = true; 946 ir->need_reset = true;
@@ -1115,10 +1133,21 @@ static void mceusb_gen2_init(struct mceusb_dev *ir)
1115 1133
1116static void mceusb_get_parameters(struct mceusb_dev *ir) 1134static void mceusb_get_parameters(struct mceusb_dev *ir)
1117{ 1135{
1136 int i;
1137 unsigned char cmdbuf[3] = { MCE_CMD_PORT_SYS,
1138 MCE_CMD_GETPORTSTATUS, 0x00 };
1139
1140 /* defaults, if the hardware doesn't support querying */
1141 ir->num_txports = 2;
1142 ir->num_rxports = 2;
1143
1144 /* get number of tx and rx ports */
1145 mce_async_out(ir, GET_NUM_PORTS, sizeof(GET_NUM_PORTS));
1146
1118 /* get the carrier and frequency */ 1147 /* get the carrier and frequency */
1119 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); 1148 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
1120 1149
1121 if (!ir->flags.no_tx) 1150 if (ir->num_txports && !ir->flags.no_tx)
1122 /* get the transmitter bitmask */ 1151 /* get the transmitter bitmask */
1123 mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); 1152 mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
1124 1153
@@ -1127,6 +1156,11 @@ static void mceusb_get_parameters(struct mceusb_dev *ir)
1127 1156
1128 /* get receiver sensor setting */ 1157 /* get receiver sensor setting */
1129 mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR)); 1158 mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR));
1159
1160 for (i = 0; i < ir->num_txports; i++) {
1161 cmdbuf[2] = i;
1162 mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
1163 }
1130} 1164}
1131 1165
1132static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir) 1166static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
@@ -1322,6 +1356,10 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1322 1356
1323 dev_info(&intf->dev, "Registered %s with mce emulator interface " 1357 dev_info(&intf->dev, "Registered %s with mce emulator interface "
1324 "version %x\n", name, ir->emver); 1358 "version %x\n", name, ir->emver);
1359 dev_info(&intf->dev, "%x tx ports (0x%x cabled) and "
1360 "%x rx sensors (0x%x active)\n",
1361 ir->num_txports, ir->txports_cabled,
1362 ir->num_rxports, ir->rxports_active);
1325 1363
1326 return 0; 1364 return 0;
1327 1365