aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/rc/mceusb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/rc/mceusb.c')
-rw-r--r--drivers/media/rc/mceusb.c89
1 files changed, 43 insertions, 46 deletions
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c
index ad927fcaa02..ec972dc2579 100644
--- a/drivers/media/rc/mceusb.c
+++ b/drivers/media/rc/mceusb.c
@@ -108,6 +108,12 @@ static int debug = 1;
108static int debug; 108static int debug;
109#endif 109#endif
110 110
111#define mce_dbg(dev, fmt, ...) \
112 do { \
113 if (debug) \
114 dev_info(dev, fmt, ## __VA_ARGS__); \
115 } while (0)
116
111/* general constants */ 117/* general constants */
112#define SEND_FLAG_IN_PROGRESS 1 118#define SEND_FLAG_IN_PROGRESS 1
113#define SEND_FLAG_COMPLETE 2 119#define SEND_FLAG_COMPLETE 2
@@ -246,6 +252,9 @@ static struct usb_device_id mceusb_dev_table[] = {
246 .driver_info = MCE_GEN2_TX_INV }, 252 .driver_info = MCE_GEN2_TX_INV },
247 /* SMK eHome Infrared Transceiver */ 253 /* SMK eHome Infrared Transceiver */
248 { USB_DEVICE(VENDOR_SMK, 0x0338) }, 254 { USB_DEVICE(VENDOR_SMK, 0x0338) },
255 /* SMK/I-O Data GV-MC7/RCKIT Receiver */
256 { USB_DEVICE(VENDOR_SMK, 0x0353),
257 .driver_info = MCE_GEN2_NO_TX },
249 /* Tatung eHome Infrared Transceiver */ 258 /* Tatung eHome Infrared Transceiver */
250 { USB_DEVICE(VENDOR_TATUNG, 0x9150) }, 259 { USB_DEVICE(VENDOR_TATUNG, 0x9150) },
251 /* Shuttle eHome Infrared Transceiver */ 260 /* Shuttle eHome Infrared Transceiver */
@@ -549,9 +558,10 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf,
549 inout, data1); 558 inout, data1);
550 break; 559 break;
551 case MCE_CMD_S_TIMEOUT: 560 case MCE_CMD_S_TIMEOUT:
552 /* value is in units of 50us, so x*50/100 or x/2 ms */ 561 /* value is in units of 50us, so x*50/1000 ms */
553 dev_info(dev, "%s receive timeout of %d ms\n", 562 dev_info(dev, "%s receive timeout of %d ms\n",
554 inout, ((data1 << 8) | data2) / 2); 563 inout,
564 ((data1 << 8) | data2) * MCE_TIME_UNIT / 1000);
555 break; 565 break;
556 case MCE_CMD_G_TIMEOUT: 566 case MCE_CMD_G_TIMEOUT:
557 dev_info(dev, "Get receive timeout\n"); 567 dev_info(dev, "Get receive timeout\n");
@@ -606,12 +616,15 @@ static void mce_async_callback(struct urb *urb, struct pt_regs *regs)
606 if (ir) { 616 if (ir) {
607 len = urb->actual_length; 617 len = urb->actual_length;
608 618
609 dev_dbg(ir->dev, "callback called (status=%d len=%d)\n", 619 mce_dbg(ir->dev, "callback called (status=%d len=%d)\n",
610 urb->status, len); 620 urb->status, len);
611 621
612 mceusb_dev_printdata(ir, urb->transfer_buffer, 0, len, true); 622 mceusb_dev_printdata(ir, urb->transfer_buffer, 0, len, true);
613 } 623 }
614 624
625 /* the transfer buffer and urb were allocated in mce_request_packet */
626 kfree(urb->transfer_buffer);
627 usb_free_urb(urb);
615} 628}
616 629
617/* request incoming or send outgoing usb packet - used to initialize remote */ 630/* request incoming or send outgoing usb packet - used to initialize remote */
@@ -655,17 +668,17 @@ static void mce_request_packet(struct mceusb_dev *ir, unsigned char *data,
655 return; 668 return;
656 } 669 }
657 670
658 dev_dbg(dev, "receive request called (size=%#x)\n", size); 671 mce_dbg(dev, "receive request called (size=%#x)\n", size);
659 672
660 async_urb->transfer_buffer_length = size; 673 async_urb->transfer_buffer_length = size;
661 async_urb->dev = ir->usbdev; 674 async_urb->dev = ir->usbdev;
662 675
663 res = usb_submit_urb(async_urb, GFP_ATOMIC); 676 res = usb_submit_urb(async_urb, GFP_ATOMIC);
664 if (res) { 677 if (res) {
665 dev_dbg(dev, "receive request FAILED! (res=%d)\n", res); 678 mce_dbg(dev, "receive request FAILED! (res=%d)\n", res);
666 return; 679 return;
667 } 680 }
668 dev_dbg(dev, "receive request complete (res=%d)\n", res); 681 mce_dbg(dev, "receive request complete (res=%d)\n", res);
669} 682}
670 683
671static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size) 684static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
@@ -673,9 +686,9 @@ static void mce_async_out(struct mceusb_dev *ir, unsigned char *data, int size)
673 mce_request_packet(ir, data, size, MCEUSB_TX); 686 mce_request_packet(ir, data, size, MCEUSB_TX);
674} 687}
675 688
676static void mce_sync_in(struct mceusb_dev *ir, unsigned char *data, int size) 689static void mce_flush_rx_buffer(struct mceusb_dev *ir, int size)
677{ 690{
678 mce_request_packet(ir, data, size, MCEUSB_RX); 691 mce_request_packet(ir, NULL, size, MCEUSB_RX);
679} 692}
680 693
681/* Send data out the IR blaster port(s) */ 694/* Send data out the IR blaster port(s) */
@@ -794,7 +807,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
794 ir->carrier = carrier; 807 ir->carrier = carrier;
795 cmdbuf[2] = MCE_CMD_SIG_END; 808 cmdbuf[2] = MCE_CMD_SIG_END;
796 cmdbuf[3] = MCE_IRDATA_TRAILER; 809 cmdbuf[3] = MCE_IRDATA_TRAILER;
797 dev_dbg(ir->dev, "%s: disabling carrier " 810 mce_dbg(ir->dev, "%s: disabling carrier "
798 "modulation\n", __func__); 811 "modulation\n", __func__);
799 mce_async_out(ir, cmdbuf, sizeof(cmdbuf)); 812 mce_async_out(ir, cmdbuf, sizeof(cmdbuf));
800 return carrier; 813 return carrier;
@@ -806,7 +819,7 @@ static int mceusb_set_tx_carrier(struct rc_dev *dev, u32 carrier)
806 ir->carrier = carrier; 819 ir->carrier = carrier;
807 cmdbuf[2] = prescaler; 820 cmdbuf[2] = prescaler;
808 cmdbuf[3] = divisor; 821 cmdbuf[3] = divisor;
809 dev_dbg(ir->dev, "%s: requesting %u HZ " 822 mce_dbg(ir->dev, "%s: requesting %u HZ "
810 "carrier\n", __func__, carrier); 823 "carrier\n", __func__, carrier);
811 824
812 /* Transmit new carrier to mce device */ 825 /* Transmit new carrier to mce device */
@@ -835,7 +848,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index)
835 switch (ir->buf_in[index]) { 848 switch (ir->buf_in[index]) {
836 /* 2-byte return value commands */ 849 /* 2-byte return value commands */
837 case MCE_CMD_S_TIMEOUT: 850 case MCE_CMD_S_TIMEOUT:
838 ir->rc->timeout = US_TO_NS((hi << 8 | lo) / 2); 851 ir->rc->timeout = US_TO_NS((hi << 8 | lo) * MCE_TIME_UNIT);
839 break; 852 break;
840 853
841 /* 1-byte return value commands */ 854 /* 1-byte return value commands */
@@ -879,7 +892,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
879 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) 892 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK)
880 * US_TO_NS(MCE_TIME_UNIT); 893 * US_TO_NS(MCE_TIME_UNIT);
881 894
882 dev_dbg(ir->dev, "Storing %s with duration %d\n", 895 mce_dbg(ir->dev, "Storing %s with duration %d\n",
883 rawir.pulse ? "pulse" : "space", 896 rawir.pulse ? "pulse" : "space",
884 rawir.duration); 897 rawir.duration);
885 898
@@ -911,7 +924,7 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len)
911 if (ir->parser_state != CMD_HEADER && !ir->rem) 924 if (ir->parser_state != CMD_HEADER && !ir->rem)
912 ir->parser_state = CMD_HEADER; 925 ir->parser_state = CMD_HEADER;
913 } 926 }
914 dev_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n"); 927 mce_dbg(ir->dev, "processed IR data, calling ir_raw_event_handle\n");
915 ir_raw_event_handle(ir->rc); 928 ir_raw_event_handle(ir->rc);
916} 929}
917 930
@@ -933,7 +946,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
933 946
934 if (ir->send_flags == RECV_FLAG_IN_PROGRESS) { 947 if (ir->send_flags == RECV_FLAG_IN_PROGRESS) {
935 ir->send_flags = SEND_FLAG_COMPLETE; 948 ir->send_flags = SEND_FLAG_COMPLETE;
936 dev_dbg(ir->dev, "setup answer received %d bytes\n", 949 mce_dbg(ir->dev, "setup answer received %d bytes\n",
937 buf_len); 950 buf_len);
938 } 951 }
939 952
@@ -951,7 +964,7 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
951 964
952 case -EPIPE: 965 case -EPIPE:
953 default: 966 default:
954 dev_dbg(ir->dev, "Error: urb status = %d\n", urb->status); 967 mce_dbg(ir->dev, "Error: urb status = %d\n", urb->status);
955 break; 968 break;
956 } 969 }
957 970
@@ -961,7 +974,6 @@ static void mceusb_dev_recv(struct urb *urb, struct pt_regs *regs)
961static void mceusb_gen1_init(struct mceusb_dev *ir) 974static void mceusb_gen1_init(struct mceusb_dev *ir)
962{ 975{
963 int ret; 976 int ret;
964 int maxp = ir->len_in;
965 struct device *dev = ir->dev; 977 struct device *dev = ir->dev;
966 char *data; 978 char *data;
967 979
@@ -978,8 +990,8 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
978 ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0), 990 ret = usb_control_msg(ir->usbdev, usb_rcvctrlpipe(ir->usbdev, 0),
979 USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0, 991 USB_REQ_SET_ADDRESS, USB_TYPE_VENDOR, 0, 0,
980 data, USB_CTRL_MSG_SZ, HZ * 3); 992 data, USB_CTRL_MSG_SZ, HZ * 3);
981 dev_dbg(dev, "%s - ret = %d\n", __func__, ret); 993 mce_dbg(dev, "%s - ret = %d\n", __func__, ret);
982 dev_dbg(dev, "%s - data[0] = %d, data[1] = %d\n", 994 mce_dbg(dev, "%s - data[0] = %d, data[1] = %d\n",
983 __func__, data[0], data[1]); 995 __func__, data[0], data[1]);
984 996
985 /* set feature: bit rate 38400 bps */ 997 /* set feature: bit rate 38400 bps */
@@ -987,71 +999,56 @@ static void mceusb_gen1_init(struct mceusb_dev *ir)
987 USB_REQ_SET_FEATURE, USB_TYPE_VENDOR, 999 USB_REQ_SET_FEATURE, USB_TYPE_VENDOR,
988 0xc04e, 0x0000, NULL, 0, HZ * 3); 1000 0xc04e, 0x0000, NULL, 0, HZ * 3);
989 1001
990 dev_dbg(dev, "%s - ret = %d\n", __func__, ret); 1002 mce_dbg(dev, "%s - ret = %d\n", __func__, ret);
991 1003
992 /* bRequest 4: set char length to 8 bits */ 1004 /* bRequest 4: set char length to 8 bits */
993 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), 1005 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
994 4, USB_TYPE_VENDOR, 1006 4, USB_TYPE_VENDOR,
995 0x0808, 0x0000, NULL, 0, HZ * 3); 1007 0x0808, 0x0000, NULL, 0, HZ * 3);
996 dev_dbg(dev, "%s - retB = %d\n", __func__, ret); 1008 mce_dbg(dev, "%s - retB = %d\n", __func__, ret);
997 1009
998 /* bRequest 2: set handshaking to use DTR/DSR */ 1010 /* bRequest 2: set handshaking to use DTR/DSR */
999 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0), 1011 ret = usb_control_msg(ir->usbdev, usb_sndctrlpipe(ir->usbdev, 0),
1000 2, USB_TYPE_VENDOR, 1012 2, USB_TYPE_VENDOR,
1001 0x0000, 0x0100, NULL, 0, HZ * 3); 1013 0x0000, 0x0100, NULL, 0, HZ * 3);
1002 dev_dbg(dev, "%s - retC = %d\n", __func__, ret); 1014 mce_dbg(dev, "%s - retC = %d\n", __func__, ret);
1003 1015
1004 /* device reset */ 1016 /* device reset */
1005 mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET)); 1017 mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
1006 mce_sync_in(ir, NULL, maxp);
1007 1018
1008 /* get hw/sw revision? */ 1019 /* get hw/sw revision? */
1009 mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION)); 1020 mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
1010 mce_sync_in(ir, NULL, maxp);
1011 1021
1012 kfree(data); 1022 kfree(data);
1013}; 1023};
1014 1024
1015static void mceusb_gen2_init(struct mceusb_dev *ir) 1025static void mceusb_gen2_init(struct mceusb_dev *ir)
1016{ 1026{
1017 int maxp = ir->len_in;
1018
1019 /* device reset */ 1027 /* device reset */
1020 mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET)); 1028 mce_async_out(ir, DEVICE_RESET, sizeof(DEVICE_RESET));
1021 mce_sync_in(ir, NULL, maxp);
1022 1029
1023 /* get hw/sw revision? */ 1030 /* get hw/sw revision? */
1024 mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION)); 1031 mce_async_out(ir, GET_REVISION, sizeof(GET_REVISION));
1025 mce_sync_in(ir, NULL, maxp);
1026 1032
1027 /* unknown what the next two actually return... */ 1033 /* unknown what the next two actually return... */
1028 mce_async_out(ir, GET_UNKNOWN, sizeof(GET_UNKNOWN)); 1034 mce_async_out(ir, GET_UNKNOWN, sizeof(GET_UNKNOWN));
1029 mce_sync_in(ir, NULL, maxp);
1030 mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2)); 1035 mce_async_out(ir, GET_UNKNOWN2, sizeof(GET_UNKNOWN2));
1031 mce_sync_in(ir, NULL, maxp);
1032} 1036}
1033 1037
1034static void mceusb_get_parameters(struct mceusb_dev *ir) 1038static void mceusb_get_parameters(struct mceusb_dev *ir)
1035{ 1039{
1036 int maxp = ir->len_in;
1037
1038 /* get the carrier and frequency */ 1040 /* get the carrier and frequency */
1039 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); 1041 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ));
1040 mce_sync_in(ir, NULL, maxp);
1041 1042
1042 if (!ir->flags.no_tx) { 1043 if (!ir->flags.no_tx)
1043 /* get the transmitter bitmask */ 1044 /* get the transmitter bitmask */
1044 mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); 1045 mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK));
1045 mce_sync_in(ir, NULL, maxp);
1046 }
1047 1046
1048 /* get receiver timeout value */ 1047 /* get receiver timeout value */
1049 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); 1048 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT));
1050 mce_sync_in(ir, NULL, maxp);
1051 1049
1052 /* get receiver sensor setting */ 1050 /* get receiver sensor setting */
1053 mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR)); 1051 mce_async_out(ir, GET_RX_SENSOR, sizeof(GET_RX_SENSOR));
1054 mce_sync_in(ir, NULL, maxp);
1055} 1052}
1056 1053
1057static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir) 1054static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
@@ -1082,7 +1079,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir)
1082 rc->priv = ir; 1079 rc->priv = ir;
1083 rc->driver_type = RC_DRIVER_IR_RAW; 1080 rc->driver_type = RC_DRIVER_IR_RAW;
1084 rc->allowed_protos = RC_TYPE_ALL; 1081 rc->allowed_protos = RC_TYPE_ALL;
1085 rc->timeout = US_TO_NS(1000); 1082 rc->timeout = MS_TO_NS(100);
1086 if (!ir->flags.no_tx) { 1083 if (!ir->flags.no_tx) {
1087 rc->s_tx_mask = mceusb_set_tx_mask; 1084 rc->s_tx_mask = mceusb_set_tx_mask;
1088 rc->s_tx_carrier = mceusb_set_tx_carrier; 1085 rc->s_tx_carrier = mceusb_set_tx_carrier;
@@ -1122,7 +1119,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1122 bool tx_mask_normal; 1119 bool tx_mask_normal;
1123 int ir_intfnum; 1120 int ir_intfnum;
1124 1121
1125 dev_dbg(&intf->dev, "%s called\n", __func__); 1122 mce_dbg(&intf->dev, "%s called\n", __func__);
1126 1123
1127 idesc = intf->cur_altsetting; 1124 idesc = intf->cur_altsetting;
1128 1125
@@ -1150,7 +1147,7 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1150 ep_in = ep; 1147 ep_in = ep;
1151 ep_in->bmAttributes = USB_ENDPOINT_XFER_INT; 1148 ep_in->bmAttributes = USB_ENDPOINT_XFER_INT;
1152 ep_in->bInterval = 1; 1149 ep_in->bInterval = 1;
1153 dev_dbg(&intf->dev, "acceptable inbound endpoint " 1150 mce_dbg(&intf->dev, "acceptable inbound endpoint "
1154 "found\n"); 1151 "found\n");
1155 } 1152 }
1156 1153
@@ -1165,12 +1162,12 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1165 ep_out = ep; 1162 ep_out = ep;
1166 ep_out->bmAttributes = USB_ENDPOINT_XFER_INT; 1163 ep_out->bmAttributes = USB_ENDPOINT_XFER_INT;
1167 ep_out->bInterval = 1; 1164 ep_out->bInterval = 1;
1168 dev_dbg(&intf->dev, "acceptable outbound endpoint " 1165 mce_dbg(&intf->dev, "acceptable outbound endpoint "
1169 "found\n"); 1166 "found\n");
1170 } 1167 }
1171 } 1168 }
1172 if (ep_in == NULL) { 1169 if (ep_in == NULL) {
1173 dev_dbg(&intf->dev, "inbound and/or endpoint not found\n"); 1170 mce_dbg(&intf->dev, "inbound and/or endpoint not found\n");
1174 return -ENODEV; 1171 return -ENODEV;
1175 } 1172 }
1176 1173
@@ -1215,16 +1212,16 @@ static int __devinit mceusb_dev_probe(struct usb_interface *intf,
1215 if (!ir->rc) 1212 if (!ir->rc)
1216 goto rc_dev_fail; 1213 goto rc_dev_fail;
1217 1214
1218 /* flush buffers on the device */
1219 mce_sync_in(ir, NULL, maxp);
1220 mce_sync_in(ir, NULL, maxp);
1221
1222 /* wire up inbound data handler */ 1215 /* wire up inbound data handler */
1223 usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in, 1216 usb_fill_int_urb(ir->urb_in, dev, pipe, ir->buf_in,
1224 maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval); 1217 maxp, (usb_complete_t) mceusb_dev_recv, ir, ep_in->bInterval);
1225 ir->urb_in->transfer_dma = ir->dma_in; 1218 ir->urb_in->transfer_dma = ir->dma_in;
1226 ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; 1219 ir->urb_in->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
1227 1220
1221 /* flush buffers on the device */
1222 mce_dbg(&intf->dev, "Flushing receive buffers\n");
1223 mce_flush_rx_buffer(ir, maxp);
1224
1228 /* initialize device */ 1225 /* initialize device */
1229 if (ir->flags.microsoft_gen1) 1226 if (ir->flags.microsoft_gen1)
1230 mceusb_gen1_init(ir); 1227 mceusb_gen1_init(ir);