diff options
Diffstat (limited to 'drivers/media/IR/mceusb.c')
-rw-r--r-- | drivers/media/IR/mceusb.c | 56 |
1 files changed, 46 insertions, 10 deletions
diff --git a/drivers/media/IR/mceusb.c b/drivers/media/IR/mceusb.c index ed151c8290fe..ba224593b947 100644 --- a/drivers/media/IR/mceusb.c +++ b/drivers/media/IR/mceusb.c | |||
@@ -49,6 +49,7 @@ | |||
49 | #define USB_BUFLEN 32 /* USB reception buffer length */ | 49 | #define USB_BUFLEN 32 /* USB reception buffer length */ |
50 | #define USB_CTRL_MSG_SZ 2 /* Size of usb ctrl msg on gen1 hw */ | 50 | #define USB_CTRL_MSG_SZ 2 /* Size of usb ctrl msg on gen1 hw */ |
51 | #define MCE_G1_INIT_MSGS 40 /* Init messages on gen1 hw to throw out */ | 51 | #define MCE_G1_INIT_MSGS 40 /* Init messages on gen1 hw to throw out */ |
52 | #define MS_TO_NS(msec) ((msec) * 1000) | ||
52 | 53 | ||
53 | /* MCE constants */ | 54 | /* MCE constants */ |
54 | #define MCE_CMDBUF_SIZE 384 /* MCE Command buffer length */ | 55 | #define MCE_CMDBUF_SIZE 384 /* MCE Command buffer length */ |
@@ -92,6 +93,7 @@ | |||
92 | #define MCE_CMD_G_TXMASK 0x13 /* Set TX port bitmask */ | 93 | #define MCE_CMD_G_TXMASK 0x13 /* Set TX port bitmask */ |
93 | #define MCE_CMD_S_RXSENSOR 0x14 /* Set RX sensor (std/learning) */ | 94 | #define MCE_CMD_S_RXSENSOR 0x14 /* Set RX sensor (std/learning) */ |
94 | #define MCE_CMD_G_RXSENSOR 0x15 /* Get RX sensor (std/learning) */ | 95 | #define MCE_CMD_G_RXSENSOR 0x15 /* Get RX sensor (std/learning) */ |
96 | #define MCE_RSP_PULSE_COUNT 0x15 /* RX pulse count (only if learning) */ | ||
95 | #define MCE_CMD_TX_PORTS 0x16 /* Get number of TX ports */ | 97 | #define MCE_CMD_TX_PORTS 0x16 /* Get number of TX ports */ |
96 | #define MCE_CMD_G_WAKESRC 0x17 /* Get wake source */ | 98 | #define MCE_CMD_G_WAKESRC 0x17 /* Get wake source */ |
97 | #define MCE_CMD_UNKNOWN7 0x18 /* Unknown */ | 99 | #define MCE_CMD_UNKNOWN7 0x18 /* Unknown */ |
@@ -314,7 +316,10 @@ static struct usb_device_id mceusb_dev_table[] = { | |||
314 | struct mceusb_dev { | 316 | struct mceusb_dev { |
315 | /* ir-core bits */ | 317 | /* ir-core bits */ |
316 | struct ir_dev_props *props; | 318 | struct ir_dev_props *props; |
317 | struct ir_raw_event rawir; | 319 | |
320 | /* optional features we can enable */ | ||
321 | bool carrier_report_enabled; | ||
322 | bool learning_enabled; | ||
318 | 323 | ||
319 | /* core device bits */ | 324 | /* core device bits */ |
320 | struct device *dev; | 325 | struct device *dev; |
@@ -329,6 +334,8 @@ struct mceusb_dev { | |||
329 | /* buffers and dma */ | 334 | /* buffers and dma */ |
330 | unsigned char *buf_in; | 335 | unsigned char *buf_in; |
331 | unsigned int len_in; | 336 | unsigned int len_in; |
337 | dma_addr_t dma_in; | ||
338 | dma_addr_t dma_out; | ||
332 | 339 | ||
333 | enum { | 340 | enum { |
334 | CMD_HEADER = 0, | 341 | CMD_HEADER = 0, |
@@ -336,10 +343,8 @@ struct mceusb_dev { | |||
336 | CMD_DATA, | 343 | CMD_DATA, |
337 | PARSE_IRDATA, | 344 | PARSE_IRDATA, |
338 | } parser_state; | 345 | } parser_state; |
339 | u8 cmd, rem; /* Remaining IR data bytes in packet */ | ||
340 | 346 | ||
341 | dma_addr_t dma_in; | 347 | u8 cmd, rem; /* Remaining IR data bytes in packet */ |
342 | dma_addr_t dma_out; | ||
343 | 348 | ||
344 | struct { | 349 | struct { |
345 | u32 connected:1; | 350 | u32 connected:1; |
@@ -420,7 +425,7 @@ static int mceusb_cmdsize(u8 cmd, u8 subcmd) | |||
420 | case MCE_CMD_UNKNOWN: | 425 | case MCE_CMD_UNKNOWN: |
421 | case MCE_CMD_S_CARRIER: | 426 | case MCE_CMD_S_CARRIER: |
422 | case MCE_CMD_S_TIMEOUT: | 427 | case MCE_CMD_S_TIMEOUT: |
423 | case MCE_CMD_G_RXSENSOR: | 428 | case MCE_RSP_PULSE_COUNT: |
424 | datasize = 2; | 429 | datasize = 2; |
425 | break; | 430 | break; |
426 | case MCE_CMD_SIG_END: | 431 | case MCE_CMD_SIG_END: |
@@ -541,10 +546,11 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, char *buf, | |||
541 | inout, data1 == 0x02 ? "short" : "long"); | 546 | inout, data1 == 0x02 ? "short" : "long"); |
542 | break; | 547 | break; |
543 | case MCE_CMD_G_RXSENSOR: | 548 | case MCE_CMD_G_RXSENSOR: |
544 | if (len == 2) | 549 | /* aka MCE_RSP_PULSE_COUNT */ |
550 | if (out) | ||
545 | dev_info(dev, "Get receive sensor\n"); | 551 | dev_info(dev, "Get receive sensor\n"); |
546 | else | 552 | else if (ir->learning_enabled) |
547 | dev_info(dev, "Remaining pulse count is %d\n", | 553 | dev_info(dev, "RX pulse count: %d\n", |
548 | ((data1 << 8) | data2)); | 554 | ((data1 << 8) | data2)); |
549 | break; | 555 | break; |
550 | case MCE_RSP_CMD_INVALID: | 556 | case MCE_RSP_CMD_INVALID: |
@@ -798,6 +804,34 @@ static int mceusb_set_tx_carrier(void *priv, u32 carrier) | |||
798 | return carrier; | 804 | return carrier; |
799 | } | 805 | } |
800 | 806 | ||
807 | /* | ||
808 | * We don't do anything but print debug spew for many of the command bits | ||
809 | * we receive from the hardware, but some of them are useful information | ||
810 | * we want to store so that we can use them. | ||
811 | */ | ||
812 | static void mceusb_handle_command(struct mceusb_dev *ir, int index) | ||
813 | { | ||
814 | u8 hi = ir->buf_in[index + 1] & 0xff; | ||
815 | u8 lo = ir->buf_in[index + 2] & 0xff; | ||
816 | |||
817 | switch (ir->buf_in[index]) { | ||
818 | /* 2-byte return value commands */ | ||
819 | case MCE_CMD_S_TIMEOUT: | ||
820 | ir->props->timeout = MS_TO_NS((hi << 8 | lo) / 2); | ||
821 | break; | ||
822 | |||
823 | /* 1-byte return value commands */ | ||
824 | case MCE_CMD_S_TXMASK: | ||
825 | ir->tx_mask = hi; | ||
826 | break; | ||
827 | case MCE_CMD_S_RXSENSOR: | ||
828 | ir->learning_enabled = (hi == 0x02); | ||
829 | break; | ||
830 | default: | ||
831 | break; | ||
832 | } | ||
833 | } | ||
834 | |||
801 | static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) | 835 | static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) |
802 | { | 836 | { |
803 | DEFINE_IR_RAW_EVENT(rawir); | 837 | DEFINE_IR_RAW_EVENT(rawir); |
@@ -817,13 +851,14 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) | |||
817 | ir->rem = mceusb_cmdsize(ir->cmd, ir->buf_in[i]); | 851 | ir->rem = mceusb_cmdsize(ir->cmd, ir->buf_in[i]); |
818 | mceusb_dev_printdata(ir, ir->buf_in, i - 1, | 852 | mceusb_dev_printdata(ir, ir->buf_in, i - 1, |
819 | ir->rem + 2, false); | 853 | ir->rem + 2, false); |
854 | mceusb_handle_command(ir, i); | ||
820 | ir->parser_state = CMD_DATA; | 855 | ir->parser_state = CMD_DATA; |
821 | break; | 856 | break; |
822 | case PARSE_IRDATA: | 857 | case PARSE_IRDATA: |
823 | ir->rem--; | 858 | ir->rem--; |
824 | rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0); | 859 | rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0); |
825 | rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) | 860 | rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) |
826 | * MCE_TIME_UNIT * 1000; | 861 | * MS_TO_NS(MCE_TIME_UNIT); |
827 | 862 | ||
828 | dev_dbg(ir->dev, "Storing %s with duration %d\n", | 863 | dev_dbg(ir->dev, "Storing %s with duration %d\n", |
829 | rawir.pulse ? "pulse" : "space", | 864 | rawir.pulse ? "pulse" : "space", |
@@ -845,7 +880,8 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) | |||
845 | continue; | 880 | continue; |
846 | } | 881 | } |
847 | ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK); | 882 | ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK); |
848 | mceusb_dev_printdata(ir, ir->buf_in, i, ir->rem + 1, false); | 883 | mceusb_dev_printdata(ir, ir->buf_in, |
884 | i, ir->rem + 1, false); | ||
849 | if (ir->rem) | 885 | if (ir->rem) |
850 | ir->parser_state = PARSE_IRDATA; | 886 | ir->parser_state = PARSE_IRDATA; |
851 | break; | 887 | break; |