Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6

* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (21 commits)
[media] mceusb: set a default rx timeout
[media] mceusb: fix inverted mask inversion logic
[media] mceusb: add another Fintek device ID
[media] lirc_dev: fixes in lirc_dev_fop_read()
[media] lirc_dev: stray unlock in lirc_dev_fop_poll()
[media] rc: fix sysfs entry for mceusb and streamzap
[media] streamzap: merge timeout space with trailing space
[media] mceusb: fix keybouce issue after parser simplification
[media] IR: add tv power scancode to rc6 mce keymap
[media] mceusb: buffer parsing fixups for 1st-gen device
[media] mceusb: fix up reporting of trailing space
[media] nuvoton-cir: improve buffer parsing responsiveness
[media] mceusb: add support for Conexant Hybrid TV RDU253S
[media] s5p-fimc: Fix output DMA handling in S5PV310 IP revisions
[media] s5p-fimc: Use correct fourcc code for 32-bit RGB format
[media] s5p-fimc: Convert m2m driver to unlocked_ioctl
[media] s5p-fimc: Explicitly add required header file
[media] s5p-fimc: Fix vidioc_g_crop/cropcap on camera sensor
[media] s5p-fimc: BKL lock removal - compilation fix
[media] soc-camera: fix static build of the sh_mobile_csi2.c driver
...

+257 -134
+11 -10
drivers/media/IR/keymaps/rc-rc6-mce.c
··· 26 27 { 0x800f040a, KEY_DELETE }, 28 { 0x800f040b, KEY_ENTER }, 29 - { 0x800f040c, KEY_POWER }, 30 - { 0x800f040d, KEY_PROG1 }, /* Windows MCE button */ 31 { 0x800f040e, KEY_MUTE }, 32 { 0x800f040f, KEY_INFO }, 33 ··· 56 { 0x800f0422, KEY_OK }, 57 { 0x800f0423, KEY_EXIT }, 58 { 0x800f0424, KEY_DVD }, 59 - { 0x800f0425, KEY_TUNER }, /* LiveTV */ 60 - { 0x800f0426, KEY_EPG }, /* Guide */ 61 - { 0x800f0427, KEY_ZOOM }, /* Aspect */ 62 63 { 0x800f043a, KEY_BRIGHTNESSUP }, 64 65 { 0x800f0446, KEY_TV }, 66 - { 0x800f0447, KEY_AUDIO }, /* My Music */ 67 - { 0x800f0448, KEY_PVR }, /* RecordedTV */ 68 { 0x800f0449, KEY_CAMERA }, 69 { 0x800f044a, KEY_VIDEO }, 70 { 0x800f044c, KEY_LANGUAGE }, 71 { 0x800f044d, KEY_TITLE }, 72 - { 0x800f044e, KEY_PRINT }, /* Print - HP OEM version of remote */ 73 74 { 0x800f0450, KEY_RADIO }, 75 76 - { 0x800f045a, KEY_SUBTITLE }, /* Caption/Teletext */ 77 { 0x800f045b, KEY_RED }, 78 { 0x800f045c, KEY_GREEN }, 79 { 0x800f045d, KEY_YELLOW }, 80 { 0x800f045e, KEY_BLUE }, 81 82 { 0x800f046e, KEY_PLAYPAUSE }, 83 - { 0x800f046f, KEY_MEDIA }, /* Start media application (NEW) */ 84 85 { 0x800f0480, KEY_BRIGHTNESSDOWN }, 86 { 0x800f0481, KEY_PLAYPAUSE },
··· 26 27 { 0x800f040a, KEY_DELETE }, 28 { 0x800f040b, KEY_ENTER }, 29 + { 0x800f040c, KEY_POWER }, /* PC Power */ 30 + { 0x800f040d, KEY_PROG1 }, /* Windows MCE button */ 31 { 0x800f040e, KEY_MUTE }, 32 { 0x800f040f, KEY_INFO }, 33 ··· 56 { 0x800f0422, KEY_OK }, 57 { 0x800f0423, KEY_EXIT }, 58 { 0x800f0424, KEY_DVD }, 59 + { 0x800f0425, KEY_TUNER }, /* LiveTV */ 60 + { 0x800f0426, KEY_EPG }, /* Guide */ 61 + { 0x800f0427, KEY_ZOOM }, /* Aspect */ 62 63 { 0x800f043a, KEY_BRIGHTNESSUP }, 64 65 { 0x800f0446, KEY_TV }, 66 + { 0x800f0447, KEY_AUDIO }, /* My Music */ 67 + { 0x800f0448, KEY_PVR }, /* RecordedTV */ 68 { 0x800f0449, KEY_CAMERA }, 69 { 0x800f044a, KEY_VIDEO }, 70 { 0x800f044c, KEY_LANGUAGE }, 71 { 0x800f044d, KEY_TITLE }, 72 + { 0x800f044e, KEY_PRINT }, /* Print - HP OEM version of remote */ 73 74 { 0x800f0450, KEY_RADIO }, 75 76 + { 0x800f045a, KEY_SUBTITLE }, /* Caption/Teletext */ 77 { 0x800f045b, KEY_RED }, 78 { 0x800f045c, KEY_GREEN }, 79 { 0x800f045d, KEY_YELLOW }, 80 { 0x800f045e, KEY_BLUE }, 81 82 + { 0x800f0465, KEY_POWER2 }, /* TV Power */ 83 { 0x800f046e, KEY_PLAYPAUSE }, 84 + { 0x800f046f, KEY_MEDIA }, /* Start media application (NEW) */ 85 86 { 0x800f0480, KEY_BRIGHTNESSDOWN }, 87 { 0x800f0481, KEY_PLAYPAUSE },
+16 -13
drivers/media/IR/lirc_dev.c
··· 522 523 dev_dbg(ir->d.dev, LOGHEAD "poll called\n", ir->d.name, ir->d.minor); 524 525 - if (!ir->attached) { 526 - mutex_unlock(&ir->irctl_lock); 527 return POLLERR; 528 - } 529 530 poll_wait(file, &ir->buf->wait_poll, wait); 531 ··· 647 if (!buf) 648 return -ENOMEM; 649 650 - if (mutex_lock_interruptible(&ir->irctl_lock)) 651 - return -ERESTARTSYS; 652 if (!ir->attached) { 653 - mutex_unlock(&ir->irctl_lock); 654 - return -ENODEV; 655 } 656 657 if (length % ir->chunk_size) { 658 - dev_dbg(ir->d.dev, LOGHEAD "read result = -EINVAL\n", 659 - ir->d.name, ir->d.minor); 660 - mutex_unlock(&ir->irctl_lock); 661 - return -EINVAL; 662 } 663 664 /* ··· 709 lirc_buffer_read(ir->buf, buf); 710 ret = copy_to_user((void *)buffer+written, buf, 711 ir->buf->chunk_size); 712 - written += ir->buf->chunk_size; 713 } 714 } 715 716 remove_wait_queue(&ir->buf->wait_poll, &wait); 717 set_current_state(TASK_RUNNING); 718 mutex_unlock(&ir->irctl_lock); 719 720 out_unlocked: 721 kfree(buf); 722 dev_dbg(ir->d.dev, LOGHEAD "read result = %s (%d)\n", 723 - ir->d.name, ir->d.minor, ret ? "-EFAULT" : "OK", ret); 724 725 return ret ? ret : written; 726 }
··· 522 523 dev_dbg(ir->d.dev, LOGHEAD "poll called\n", ir->d.name, ir->d.minor); 524 525 + if (!ir->attached) 526 return POLLERR; 527 528 poll_wait(file, &ir->buf->wait_poll, wait); 529 ··· 649 if (!buf) 650 return -ENOMEM; 651 652 + if (mutex_lock_interruptible(&ir->irctl_lock)) { 653 + ret = -ERESTARTSYS; 654 + goto out_unlocked; 655 + } 656 if (!ir->attached) { 657 + ret = -ENODEV; 658 + goto out_locked; 659 } 660 661 if (length % ir->chunk_size) { 662 + ret = -EINVAL; 663 + goto out_locked; 664 } 665 666 /* ··· 711 lirc_buffer_read(ir->buf, buf); 712 ret = copy_to_user((void *)buffer+written, buf, 713 ir->buf->chunk_size); 714 + if (!ret) 715 + written += ir->buf->chunk_size; 716 + else 717 + ret = -EFAULT; 718 } 719 } 720 721 remove_wait_queue(&ir->buf->wait_poll, &wait); 722 set_current_state(TASK_RUNNING); 723 + 724 + out_locked: 725 mutex_unlock(&ir->irctl_lock); 726 727 out_unlocked: 728 kfree(buf); 729 dev_dbg(ir->d.dev, LOGHEAD "read result = %s (%d)\n", 730 + ir->d.name, ir->d.minor, ret ? "<fail>" : "<ok>", ret); 731 732 return ret ? ret : written; 733 }
+109 -65
drivers/media/IR/mceusb.c
··· 35 #include <linux/device.h> 36 #include <linux/module.h> 37 #include <linux/slab.h> 38 - #include <linux/usb.h> 39 #include <linux/input.h> 40 #include <media/ir-core.h> 41 - #include <media/ir-common.h> 42 43 #define DRIVER_VERSION "1.91" 44 #define DRIVER_AUTHOR "Jarod Wilson <jarod@wilsonet.com>" ··· 49 #define USB_BUFLEN 32 /* USB reception buffer length */ 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 */ 52 53 /* MCE constants */ 54 #define MCE_CMDBUF_SIZE 384 /* MCE Command buffer length */ ··· 75 #define MCE_PACKET_LENGTH_MASK 0x1f /* Packet length mask */ 76 77 /* Sub-commands, which follow MCE_COMMAND_HEADER or MCE_HW_CMD_HEADER */ 78 #define MCE_CMD_PING 0x03 /* Ping device */ 79 #define MCE_CMD_UNKNOWN 0x04 /* Unknown */ 80 #define MCE_CMD_UNKNOWN2 0x05 /* Unknown */ ··· 93 #define MCE_CMD_G_TXMASK 0x13 /* Set TX port bitmask */ 94 #define MCE_CMD_S_RXSENSOR 0x14 /* Set RX sensor (std/learning) */ 95 #define MCE_CMD_G_RXSENSOR 0x15 /* Get RX sensor (std/learning) */ 96 #define MCE_CMD_TX_PORTS 0x16 /* Get number of TX ports */ 97 #define MCE_CMD_G_WAKESRC 0x17 /* Get wake source */ 98 #define MCE_CMD_UNKNOWN7 0x18 /* Unknown */ ··· 149 MCE_GEN3, 150 MCE_GEN2_TX_INV, 151 POLARIS_EVK, 152 }; 153 154 struct mceusb_model { 155 u32 mce_gen1:1; 156 u32 mce_gen2:1; 157 u32 mce_gen3:1; 158 - u32 tx_mask_inverted:1; 159 u32 is_polaris:1; 160 161 const char *rc_map; /* Allow specify a per-board map */ 162 const char *name; /* per-board name */ ··· 167 static const struct mceusb_model mceusb_model[] = { 168 [MCE_GEN1] = { 169 .mce_gen1 = 1, 170 - .tx_mask_inverted = 1, 171 }, 172 [MCE_GEN2] = { 173 .mce_gen2 = 1, 174 }, 175 [MCE_GEN2_TX_INV] = { 176 .mce_gen2 = 1, 177 - .tx_mask_inverted = 1, 178 }, 179 [MCE_GEN3] = { 180 .mce_gen3 = 1, 181 - .tx_mask_inverted = 1, 182 }, 183 [POLARIS_EVK] = { 184 .is_polaris = 1, ··· 188 * to allow testing it 189 */ 190 .rc_map = RC_MAP_RC5_HAUPPAUGE_NEW, 191 - .name = "cx231xx MCE IR", 192 }, 193 }; 194 ··· 283 { USB_DEVICE(VENDOR_FORMOSA, 0xe03c) }, 284 /* Formosa Industrial Computing */ 285 { USB_DEVICE(VENDOR_FORMOSA, 0xe03e) }, 286 /* Fintek eHome Infrared Transceiver */ 287 { USB_DEVICE(VENDOR_FINTEK, 0x0602) }, 288 /* Fintek eHome Infrared Transceiver (in the AOpen MP45) */ ··· 304 { USB_DEVICE(VENDOR_NORTHSTAR, 0xe004) }, 305 /* TiVo PC IR Receiver */ 306 { USB_DEVICE(VENDOR_TIVO, 0x2000) }, 307 - /* Conexant SDK */ 308 { USB_DEVICE(VENDOR_CONEXANT, 0x58a1), 309 .driver_info = POLARIS_EVK }, 310 /* Terminating entry */ 311 { } 312 }; ··· 318 struct mceusb_dev { 319 /* ir-core bits */ 320 struct ir_dev_props *props; 321 - struct ir_raw_event rawir; 322 323 /* core device bits */ 324 struct device *dev; ··· 336 /* buffers and dma */ 337 unsigned char *buf_in; 338 unsigned int len_in; 339 340 enum { 341 CMD_HEADER = 0, ··· 345 CMD_DATA, 346 PARSE_IRDATA, 347 } parser_state; 348 - u8 cmd, rem; /* Remaining IR data bytes in packet */ 349 350 - dma_addr_t dma_in; 351 - dma_addr_t dma_out; 352 353 struct { 354 u32 connected:1; 355 - u32 tx_mask_inverted:1; 356 u32 microsoft_gen1:1; 357 } flags; 358 359 /* transmit support */ ··· 427 case MCE_CMD_UNKNOWN: 428 case MCE_CMD_S_CARRIER: 429 case MCE_CMD_S_TIMEOUT: 430 - case MCE_CMD_G_RXSENSOR: 431 datasize = 2; 432 break; 433 case MCE_CMD_S_TXMASK: 434 case MCE_CMD_S_RXSENSOR: 435 datasize = 1; ··· 453 return; 454 455 /* skip meaningless 0xb1 0x60 header bytes on orig receiver */ 456 - if (ir->flags.microsoft_gen1 && !out) 457 skip = 2; 458 459 if (len <= skip) ··· 511 break; 512 case MCE_COMMAND_HEADER: 513 switch (subcmd) { 514 case MCE_CMD_PING: 515 dev_info(dev, "Ping\n"); 516 break; ··· 548 inout, data1 == 0x02 ? "short" : "long"); 549 break; 550 case MCE_CMD_G_RXSENSOR: 551 - if (len == 2) 552 dev_info(dev, "Get receive sensor\n"); 553 - else 554 - dev_info(dev, "Received pulse count is %d\n", 555 ((data1 << 8) | data2)); 556 break; 557 case MCE_RSP_CMD_INVALID: ··· 748 return ret ? ret : n; 749 } 750 751 - /* Sets active IR outputs -- mce devices typically (all?) have two */ 752 static int mceusb_set_tx_mask(void *priv, u32 mask) 753 { 754 struct mceusb_dev *ir = priv; 755 756 - if (ir->flags.tx_mask_inverted) 757 ir->tx_mask = (mask != MCE_DEFAULT_TX_MASK ? 758 mask ^ MCE_DEFAULT_TX_MASK : mask) << 1; 759 - else 760 - ir->tx_mask = mask; 761 762 return 0; 763 } ··· 776 777 if (carrier == 0) { 778 ir->carrier = carrier; 779 - cmdbuf[2] = 0x01; 780 cmdbuf[3] = MCE_IRDATA_TRAILER; 781 dev_dbg(ir->dev, "%s: disabling carrier " 782 "modulation\n", __func__); ··· 806 return carrier; 807 } 808 809 static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) 810 { 811 DEFINE_IR_RAW_EVENT(rawir); ··· 843 if (ir->flags.microsoft_gen1) 844 i = 2; 845 846 for (; i < buf_len; i++) { 847 switch (ir->parser_state) { 848 case SUBCMD: 849 ir->rem = mceusb_cmdsize(ir->cmd, ir->buf_in[i]); 850 mceusb_dev_printdata(ir, ir->buf_in, i - 1, 851 ir->rem + 2, false); 852 ir->parser_state = CMD_DATA; 853 break; 854 case PARSE_IRDATA: 855 ir->rem--; 856 rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0); 857 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) 858 - * MCE_TIME_UNIT * 1000; 859 - 860 - if ((ir->buf_in[i] & MCE_PULSE_MASK) == 0x7f) { 861 - if (ir->rawir.pulse == rawir.pulse) { 862 - ir->rawir.duration += rawir.duration; 863 - } else { 864 - ir->rawir.duration = rawir.duration; 865 - ir->rawir.pulse = rawir.pulse; 866 - } 867 - if (ir->rem) 868 - break; 869 - } 870 - rawir.duration += ir->rawir.duration; 871 - ir->rawir.duration = 0; 872 - ir->rawir.pulse = rawir.pulse; 873 874 dev_dbg(ir->dev, "Storing %s with duration %d\n", 875 rawir.pulse ? "pulse" : "space", 876 rawir.duration); 877 878 - ir_raw_event_store(ir->idev, &rawir); 879 break; 880 case CMD_DATA: 881 ir->rem--; ··· 882 continue; 883 } 884 ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK); 885 - mceusb_dev_printdata(ir, ir->buf_in, i, ir->rem + 1, false); 886 - if (ir->rem) { 887 ir->parser_state = PARSE_IRDATA; 888 - break; 889 - } 890 - /* 891 - * a package with len=0 (e. g. 0x80) means end of 892 - * data. We could use it to do the call to 893 - * ir_raw_event_handle(). For now, we don't need to 894 - * use it. 895 - */ 896 break; 897 } 898 ··· 1020 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); 1021 mce_sync_in(ir, NULL, maxp); 1022 1023 - /* get the transmitter bitmask */ 1024 - mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); 1025 - mce_sync_in(ir, NULL, maxp); 1026 1027 /* get receiver timeout value */ 1028 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); ··· 1073 props->priv = ir; 1074 props->driver_type = RC_DRIVER_IR_RAW; 1075 props->allowed_protos = IR_TYPE_ALL; 1076 - props->s_tx_mask = mceusb_set_tx_mask; 1077 - props->s_tx_carrier = mceusb_set_tx_carrier; 1078 - props->tx_ir = mceusb_tx_ir; 1079 1080 ir->props = props; 1081 1082 if (mceusb_model[ir->model].rc_map) 1083 rc_map = mceusb_model[ir->model].rc_map; ··· 1118 enum mceusb_model_type model = id->driver_info; 1119 bool is_gen3; 1120 bool is_microsoft_gen1; 1121 - bool tx_mask_inverted; 1122 bool is_polaris; 1123 1124 - dev_dbg(&intf->dev, ": %s called\n", __func__); 1125 1126 idesc = intf->cur_altsetting; 1127 1128 is_gen3 = mceusb_model[model].mce_gen3; 1129 is_microsoft_gen1 = mceusb_model[model].mce_gen1; 1130 - tx_mask_inverted = mceusb_model[model].tx_mask_inverted; 1131 is_polaris = mceusb_model[model].is_polaris; 1132 1133 if (is_polaris) { ··· 1151 ep_in = ep; 1152 ep_in->bmAttributes = USB_ENDPOINT_XFER_INT; 1153 ep_in->bInterval = 1; 1154 - dev_dbg(&intf->dev, ": acceptable inbound endpoint " 1155 "found\n"); 1156 } 1157 ··· 1166 ep_out = ep; 1167 ep_out->bmAttributes = USB_ENDPOINT_XFER_INT; 1168 ep_out->bInterval = 1; 1169 - dev_dbg(&intf->dev, ": acceptable outbound endpoint " 1170 "found\n"); 1171 } 1172 } 1173 if (ep_in == NULL) { 1174 - dev_dbg(&intf->dev, ": inbound and/or endpoint not found\n"); 1175 return -ENODEV; 1176 } 1177 ··· 1194 ir->dev = &intf->dev; 1195 ir->len_in = maxp; 1196 ir->flags.microsoft_gen1 = is_microsoft_gen1; 1197 - ir->flags.tx_mask_inverted = tx_mask_inverted; 1198 ir->model = model; 1199 - 1200 - init_ir_raw_event(&ir->rawir); 1201 1202 /* Saving usb interface data for use by the transmitter routine */ 1203 ir->usb_ep_in = ep_in; ··· 1234 1235 mceusb_get_parameters(ir); 1236 1237 - mceusb_set_tx_mask(ir, MCE_DEFAULT_TX_MASK); 1238 1239 usb_set_intfdata(intf, ir); 1240
··· 35 #include <linux/device.h> 36 #include <linux/module.h> 37 #include <linux/slab.h> 38 #include <linux/input.h> 39 + #include <linux/usb.h> 40 + #include <linux/usb/input.h> 41 #include <media/ir-core.h> 42 43 #define DRIVER_VERSION "1.91" 44 #define DRIVER_AUTHOR "Jarod Wilson <jarod@wilsonet.com>" ··· 49 #define USB_BUFLEN 32 /* USB reception buffer length */ 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 */ 52 + #define MS_TO_NS(msec) ((msec) * 1000) 53 54 /* MCE constants */ 55 #define MCE_CMDBUF_SIZE 384 /* MCE Command buffer length */ ··· 74 #define MCE_PACKET_LENGTH_MASK 0x1f /* Packet length mask */ 75 76 /* Sub-commands, which follow MCE_COMMAND_HEADER or MCE_HW_CMD_HEADER */ 77 + #define MCE_CMD_SIG_END 0x01 /* End of signal */ 78 #define MCE_CMD_PING 0x03 /* Ping device */ 79 #define MCE_CMD_UNKNOWN 0x04 /* Unknown */ 80 #define MCE_CMD_UNKNOWN2 0x05 /* Unknown */ ··· 91 #define MCE_CMD_G_TXMASK 0x13 /* Set TX port bitmask */ 92 #define MCE_CMD_S_RXSENSOR 0x14 /* Set RX sensor (std/learning) */ 93 #define MCE_CMD_G_RXSENSOR 0x15 /* Get RX sensor (std/learning) */ 94 + #define MCE_RSP_PULSE_COUNT 0x15 /* RX pulse count (only if learning) */ 95 #define MCE_CMD_TX_PORTS 0x16 /* Get number of TX ports */ 96 #define MCE_CMD_G_WAKESRC 0x17 /* Get wake source */ 97 #define MCE_CMD_UNKNOWN7 0x18 /* Unknown */ ··· 146 MCE_GEN3, 147 MCE_GEN2_TX_INV, 148 POLARIS_EVK, 149 + CX_HYBRID_TV, 150 }; 151 152 struct mceusb_model { 153 u32 mce_gen1:1; 154 u32 mce_gen2:1; 155 u32 mce_gen3:1; 156 + u32 tx_mask_normal:1; 157 u32 is_polaris:1; 158 + u32 no_tx:1; 159 160 const char *rc_map; /* Allow specify a per-board map */ 161 const char *name; /* per-board name */ ··· 162 static const struct mceusb_model mceusb_model[] = { 163 [MCE_GEN1] = { 164 .mce_gen1 = 1, 165 + .tx_mask_normal = 1, 166 }, 167 [MCE_GEN2] = { 168 .mce_gen2 = 1, 169 }, 170 [MCE_GEN2_TX_INV] = { 171 .mce_gen2 = 1, 172 + .tx_mask_normal = 1, 173 }, 174 [MCE_GEN3] = { 175 .mce_gen3 = 1, 176 + .tx_mask_normal = 1, 177 }, 178 [POLARIS_EVK] = { 179 .is_polaris = 1, ··· 183 * to allow testing it 184 */ 185 .rc_map = RC_MAP_RC5_HAUPPAUGE_NEW, 186 + .name = "Conexant Hybrid TV (cx231xx) MCE IR", 187 + }, 188 + [CX_HYBRID_TV] = { 189 + .is_polaris = 1, 190 + .no_tx = 1, /* tx isn't wired up at all */ 191 + .name = "Conexant Hybrid TV (cx231xx) MCE IR", 192 }, 193 }; 194 ··· 273 { USB_DEVICE(VENDOR_FORMOSA, 0xe03c) }, 274 /* Formosa Industrial Computing */ 275 { USB_DEVICE(VENDOR_FORMOSA, 0xe03e) }, 276 + /* Fintek eHome Infrared Transceiver (HP branded) */ 277 + { USB_DEVICE(VENDOR_FINTEK, 0x5168) }, 278 /* Fintek eHome Infrared Transceiver */ 279 { USB_DEVICE(VENDOR_FINTEK, 0x0602) }, 280 /* Fintek eHome Infrared Transceiver (in the AOpen MP45) */ ··· 292 { USB_DEVICE(VENDOR_NORTHSTAR, 0xe004) }, 293 /* TiVo PC IR Receiver */ 294 { USB_DEVICE(VENDOR_TIVO, 0x2000) }, 295 + /* Conexant Hybrid TV "Shelby" Polaris SDK */ 296 { USB_DEVICE(VENDOR_CONEXANT, 0x58a1), 297 .driver_info = POLARIS_EVK }, 298 + /* Conexant Hybrid TV RDU253S Polaris */ 299 + { USB_DEVICE(VENDOR_CONEXANT, 0x58a5), 300 + .driver_info = CX_HYBRID_TV }, 301 /* Terminating entry */ 302 { } 303 }; ··· 303 struct mceusb_dev { 304 /* ir-core bits */ 305 struct ir_dev_props *props; 306 + 307 + /* optional features we can enable */ 308 + bool carrier_report_enabled; 309 + bool learning_enabled; 310 311 /* core device bits */ 312 struct device *dev; ··· 318 /* buffers and dma */ 319 unsigned char *buf_in; 320 unsigned int len_in; 321 + dma_addr_t dma_in; 322 + dma_addr_t dma_out; 323 324 enum { 325 CMD_HEADER = 0, ··· 325 CMD_DATA, 326 PARSE_IRDATA, 327 } parser_state; 328 329 + u8 cmd, rem; /* Remaining IR data bytes in packet */ 330 331 struct { 332 u32 connected:1; 333 + u32 tx_mask_normal:1; 334 u32 microsoft_gen1:1; 335 + u32 no_tx:1; 336 } flags; 337 338 /* transmit support */ ··· 408 case MCE_CMD_UNKNOWN: 409 case MCE_CMD_S_CARRIER: 410 case MCE_CMD_S_TIMEOUT: 411 + case MCE_RSP_PULSE_COUNT: 412 datasize = 2; 413 break; 414 + case MCE_CMD_SIG_END: 415 case MCE_CMD_S_TXMASK: 416 case MCE_CMD_S_RXSENSOR: 417 datasize = 1; ··· 433 return; 434 435 /* skip meaningless 0xb1 0x60 header bytes on orig receiver */ 436 + if (ir->flags.microsoft_gen1 && !out && !offset) 437 skip = 2; 438 439 if (len <= skip) ··· 491 break; 492 case MCE_COMMAND_HEADER: 493 switch (subcmd) { 494 + case MCE_CMD_SIG_END: 495 + dev_info(dev, "End of signal\n"); 496 + break; 497 case MCE_CMD_PING: 498 dev_info(dev, "Ping\n"); 499 break; ··· 525 inout, data1 == 0x02 ? "short" : "long"); 526 break; 527 case MCE_CMD_G_RXSENSOR: 528 + /* aka MCE_RSP_PULSE_COUNT */ 529 + if (out) 530 dev_info(dev, "Get receive sensor\n"); 531 + else if (ir->learning_enabled) 532 + dev_info(dev, "RX pulse count: %d\n", 533 ((data1 << 8) | data2)); 534 break; 535 case MCE_RSP_CMD_INVALID: ··· 724 return ret ? ret : n; 725 } 726 727 + /* Sets active IR outputs -- mce devices typically have two */ 728 static int mceusb_set_tx_mask(void *priv, u32 mask) 729 { 730 struct mceusb_dev *ir = priv; 731 732 + if (ir->flags.tx_mask_normal) 733 + ir->tx_mask = mask; 734 + else 735 ir->tx_mask = (mask != MCE_DEFAULT_TX_MASK ? 736 mask ^ MCE_DEFAULT_TX_MASK : mask) << 1; 737 738 return 0; 739 } ··· 752 753 if (carrier == 0) { 754 ir->carrier = carrier; 755 + cmdbuf[2] = MCE_CMD_SIG_END; 756 cmdbuf[3] = MCE_IRDATA_TRAILER; 757 dev_dbg(ir->dev, "%s: disabling carrier " 758 "modulation\n", __func__); ··· 782 return carrier; 783 } 784 785 + /* 786 + * We don't do anything but print debug spew for many of the command bits 787 + * we receive from the hardware, but some of them are useful information 788 + * we want to store so that we can use them. 789 + */ 790 + static void mceusb_handle_command(struct mceusb_dev *ir, int index) 791 + { 792 + u8 hi = ir->buf_in[index + 1] & 0xff; 793 + u8 lo = ir->buf_in[index + 2] & 0xff; 794 + 795 + switch (ir->buf_in[index]) { 796 + /* 2-byte return value commands */ 797 + case MCE_CMD_S_TIMEOUT: 798 + ir->props->timeout = MS_TO_NS((hi << 8 | lo) / 2); 799 + break; 800 + 801 + /* 1-byte return value commands */ 802 + case MCE_CMD_S_TXMASK: 803 + ir->tx_mask = hi; 804 + break; 805 + case MCE_CMD_S_RXSENSOR: 806 + ir->learning_enabled = (hi == 0x02); 807 + break; 808 + default: 809 + break; 810 + } 811 + } 812 + 813 static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) 814 { 815 DEFINE_IR_RAW_EVENT(rawir); ··· 791 if (ir->flags.microsoft_gen1) 792 i = 2; 793 794 + /* if there's no data, just return now */ 795 + if (buf_len <= i) 796 + return; 797 + 798 for (; i < buf_len; i++) { 799 switch (ir->parser_state) { 800 case SUBCMD: 801 ir->rem = mceusb_cmdsize(ir->cmd, ir->buf_in[i]); 802 mceusb_dev_printdata(ir, ir->buf_in, i - 1, 803 ir->rem + 2, false); 804 + mceusb_handle_command(ir, i); 805 ir->parser_state = CMD_DATA; 806 break; 807 case PARSE_IRDATA: 808 ir->rem--; 809 rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0); 810 rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) 811 + * MS_TO_NS(MCE_TIME_UNIT); 812 813 dev_dbg(ir->dev, "Storing %s with duration %d\n", 814 rawir.pulse ? "pulse" : "space", 815 rawir.duration); 816 817 + ir_raw_event_store_with_filter(ir->idev, &rawir); 818 break; 819 case CMD_DATA: 820 ir->rem--; ··· 839 continue; 840 } 841 ir->rem = (ir->cmd & MCE_PACKET_LENGTH_MASK); 842 + mceusb_dev_printdata(ir, ir->buf_in, 843 + i, ir->rem + 1, false); 844 + if (ir->rem) 845 ir->parser_state = PARSE_IRDATA; 846 break; 847 } 848 ··· 984 mce_async_out(ir, GET_CARRIER_FREQ, sizeof(GET_CARRIER_FREQ)); 985 mce_sync_in(ir, NULL, maxp); 986 987 + if (!ir->flags.no_tx) { 988 + /* get the transmitter bitmask */ 989 + mce_async_out(ir, GET_TX_BITMASK, sizeof(GET_TX_BITMASK)); 990 + mce_sync_in(ir, NULL, maxp); 991 + } 992 993 /* get receiver timeout value */ 994 mce_async_out(ir, GET_RX_TIMEOUT, sizeof(GET_RX_TIMEOUT)); ··· 1035 props->priv = ir; 1036 props->driver_type = RC_DRIVER_IR_RAW; 1037 props->allowed_protos = IR_TYPE_ALL; 1038 + props->timeout = MS_TO_NS(1000); 1039 + if (!ir->flags.no_tx) { 1040 + props->s_tx_mask = mceusb_set_tx_mask; 1041 + props->s_tx_carrier = mceusb_set_tx_carrier; 1042 + props->tx_ir = mceusb_tx_ir; 1043 + } 1044 1045 ir->props = props; 1046 + 1047 + usb_to_input_id(ir->usbdev, &idev->id); 1048 + idev->dev.parent = ir->dev; 1049 1050 if (mceusb_model[ir->model].rc_map) 1051 rc_map = mceusb_model[ir->model].rc_map; ··· 1074 enum mceusb_model_type model = id->driver_info; 1075 bool is_gen3; 1076 bool is_microsoft_gen1; 1077 + bool tx_mask_normal; 1078 bool is_polaris; 1079 1080 + dev_dbg(&intf->dev, "%s called\n", __func__); 1081 1082 idesc = intf->cur_altsetting; 1083 1084 is_gen3 = mceusb_model[model].mce_gen3; 1085 is_microsoft_gen1 = mceusb_model[model].mce_gen1; 1086 + tx_mask_normal = mceusb_model[model].tx_mask_normal; 1087 is_polaris = mceusb_model[model].is_polaris; 1088 1089 if (is_polaris) { ··· 1107 ep_in = ep; 1108 ep_in->bmAttributes = USB_ENDPOINT_XFER_INT; 1109 ep_in->bInterval = 1; 1110 + dev_dbg(&intf->dev, "acceptable inbound endpoint " 1111 "found\n"); 1112 } 1113 ··· 1122 ep_out = ep; 1123 ep_out->bmAttributes = USB_ENDPOINT_XFER_INT; 1124 ep_out->bInterval = 1; 1125 + dev_dbg(&intf->dev, "acceptable outbound endpoint " 1126 "found\n"); 1127 } 1128 } 1129 if (ep_in == NULL) { 1130 + dev_dbg(&intf->dev, "inbound and/or endpoint not found\n"); 1131 return -ENODEV; 1132 } 1133 ··· 1150 ir->dev = &intf->dev; 1151 ir->len_in = maxp; 1152 ir->flags.microsoft_gen1 = is_microsoft_gen1; 1153 + ir->flags.tx_mask_normal = tx_mask_normal; 1154 + ir->flags.no_tx = mceusb_model[model].no_tx; 1155 ir->model = model; 1156 1157 /* Saving usb interface data for use by the transmitter routine */ 1158 ir->usb_ep_in = ep_in; ··· 1191 1192 mceusb_get_parameters(ir); 1193 1194 + if (!ir->flags.no_tx) 1195 + mceusb_set_tx_mask(ir, MCE_DEFAULT_TX_MASK); 1196 1197 usb_set_intfdata(intf, ir); 1198
+8 -2
drivers/media/IR/nuvoton-cir.c
··· 603 count = nvt->pkts; 604 nvt_dbg_verbose("Processing buffer of len %d", count); 605 606 for (i = 0; i < count; i++) { 607 nvt->pkts--; 608 sample = nvt->buf[i]; ··· 645 * indicates end of IR signal, but new data incoming. In both 646 * cases, it means we're ready to call ir_raw_event_handle 647 */ 648 - if (sample == BUF_PULSE_BIT || ((sample != BUF_LEN_MASK) && 649 - (sample & BUF_REPEAT_MASK) == BUF_REPEAT_BYTE)) 650 ir_raw_event_handle(nvt->rdev); 651 } 652 653 if (nvt->pkts) { 654 nvt_dbg("Odd, pkts should be 0 now... (its %u)", nvt->pkts);
··· 603 count = nvt->pkts; 604 nvt_dbg_verbose("Processing buffer of len %d", count); 605 606 + init_ir_raw_event(&rawir); 607 + 608 for (i = 0; i < count; i++) { 609 nvt->pkts--; 610 sample = nvt->buf[i]; ··· 643 * indicates end of IR signal, but new data incoming. In both 644 * cases, it means we're ready to call ir_raw_event_handle 645 */ 646 + if ((sample == BUF_PULSE_BIT) && nvt->pkts) { 647 + nvt_dbg("Calling ir_raw_event_handle (signal end)\n"); 648 ir_raw_event_handle(nvt->rdev); 649 + } 650 } 651 + 652 + nvt_dbg("Calling ir_raw_event_handle (buffer empty)\n"); 653 + ir_raw_event_handle(nvt->rdev); 654 655 if (nvt->pkts) { 656 nvt_dbg("Odd, pkts should be 0 now... (its %u)", nvt->pkts);
+12 -9
drivers/media/IR/streamzap.c
··· 34 #include <linux/device.h> 35 #include <linux/module.h> 36 #include <linux/slab.h> 37 - #include <linux/usb.h> 38 #include <linux/input.h> 39 #include <media/ir-core.h> 40 41 #define DRIVER_VERSION "1.61" ··· 141 142 static void sz_push(struct streamzap_ir *sz, struct ir_raw_event rawir) 143 { 144 - ir_raw_event_store(sz->idev, &rawir); 145 } 146 147 static void sz_push_full_pulse(struct streamzap_ir *sz, ··· 170 rawir.duration *= 1000; 171 rawir.duration &= IR_MAX_DURATION; 172 } 173 - dev_dbg(sz->dev, "ls %u\n", rawir.duration); 174 sz_push(sz, rawir); 175 176 sz->idle = false; ··· 182 sz->sum += rawir.duration; 183 rawir.duration *= 1000; 184 rawir.duration &= IR_MAX_DURATION; 185 - dev_dbg(sz->dev, "p %u\n", rawir.duration); 186 sz_push(sz, rawir); 187 } 188 ··· 201 rawir.duration += SZ_RESOLUTION / 2; 202 sz->sum += rawir.duration; 203 rawir.duration *= 1000; 204 - dev_dbg(sz->dev, "s %u\n", rawir.duration); 205 sz_push(sz, rawir); 206 } 207 ··· 221 struct streamzap_ir *sz; 222 unsigned int i; 223 int len; 224 - static int timeout = (((SZ_TIMEOUT * SZ_RESOLUTION * 1000) & 225 - IR_MAX_DURATION) | 0x03000000); 226 227 if (!urb) 228 return; ··· 244 245 dev_dbg(sz->dev, "%s: received urb, len %d\n", __func__, len); 246 for (i = 0; i < len; i++) { 247 - dev_dbg(sz->dev, "sz idx %d: %x\n", 248 i, (unsigned char)sz->buf_in[i]); 249 switch (sz->decoder_state) { 250 case PulseSpace: ··· 271 DEFINE_IR_RAW_EVENT(rawir); 272 273 rawir.pulse = false; 274 - rawir.duration = timeout; 275 sz->idle = true; 276 if (sz->timeout_enabled) 277 sz_push(sz, rawir); ··· 332 props->allowed_protos = IR_TYPE_ALL; 333 334 sz->props = props; 335 336 ret = ir_input_register(idev, RC_MAP_STREAMZAP, props, DRIVER_NAME); 337 if (ret < 0) { ··· 445 sz->decoder_state = PulseSpace; 446 /* FIXME: don't yet have a way to set this */ 447 sz->timeout_enabled = true; 448 #if 0 449 /* not yet supported, depends on patches from maxim */ 450 /* see also: LIRC_GET_REC_RESOLUTION and LIRC_SET_REC_TIMEOUT */
··· 34 #include <linux/device.h> 35 #include <linux/module.h> 36 #include <linux/slab.h> 37 #include <linux/input.h> 38 + #include <linux/usb.h> 39 + #include <linux/usb/input.h> 40 #include <media/ir-core.h> 41 42 #define DRIVER_VERSION "1.61" ··· 140 141 static void sz_push(struct streamzap_ir *sz, struct ir_raw_event rawir) 142 { 143 + dev_dbg(sz->dev, "Storing %s with duration %u us\n", 144 + (rawir.pulse ? "pulse" : "space"), rawir.duration); 145 + ir_raw_event_store_with_filter(sz->idev, &rawir); 146 } 147 148 static void sz_push_full_pulse(struct streamzap_ir *sz, ··· 167 rawir.duration *= 1000; 168 rawir.duration &= IR_MAX_DURATION; 169 } 170 sz_push(sz, rawir); 171 172 sz->idle = false; ··· 180 sz->sum += rawir.duration; 181 rawir.duration *= 1000; 182 rawir.duration &= IR_MAX_DURATION; 183 sz_push(sz, rawir); 184 } 185 ··· 200 rawir.duration += SZ_RESOLUTION / 2; 201 sz->sum += rawir.duration; 202 rawir.duration *= 1000; 203 sz_push(sz, rawir); 204 } 205 ··· 221 struct streamzap_ir *sz; 222 unsigned int i; 223 int len; 224 225 if (!urb) 226 return; ··· 246 247 dev_dbg(sz->dev, "%s: received urb, len %d\n", __func__, len); 248 for (i = 0; i < len; i++) { 249 + dev_dbg(sz->dev, "sz->buf_in[%d]: %x\n", 250 i, (unsigned char)sz->buf_in[i]); 251 switch (sz->decoder_state) { 252 case PulseSpace: ··· 273 DEFINE_IR_RAW_EVENT(rawir); 274 275 rawir.pulse = false; 276 + rawir.duration = sz->props->timeout; 277 sz->idle = true; 278 if (sz->timeout_enabled) 279 sz_push(sz, rawir); ··· 334 props->allowed_protos = IR_TYPE_ALL; 335 336 sz->props = props; 337 + 338 + usb_to_input_id(sz->usbdev, &idev->id); 339 + idev->dev.parent = sz->dev; 340 341 ret = ir_input_register(idev, RC_MAP_STREAMZAP, props, DRIVER_NAME); 342 if (ret < 0) { ··· 444 sz->decoder_state = PulseSpace; 445 /* FIXME: don't yet have a way to set this */ 446 sz->timeout_enabled = true; 447 + sz->props->timeout = (((SZ_TIMEOUT * SZ_RESOLUTION * 1000) & 448 + IR_MAX_DURATION) | 0x03000000); 449 #if 0 450 /* not yet supported, depends on patches from maxim */ 451 /* see also: LIRC_GET_REC_RESOLUTION and LIRC_SET_REC_TIMEOUT */
-2
drivers/media/video/mx2_camera.c
··· 807 808 if (common_flags & SOCAM_PCLK_SAMPLE_RISING) 809 csicr1 |= CSICR1_REDGE; 810 - if (common_flags & SOCAM_PCLK_SAMPLE_FALLING) 811 - csicr1 |= CSICR1_INV_PCLK; 812 if (common_flags & SOCAM_VSYNC_ACTIVE_HIGH) 813 csicr1 |= CSICR1_SOF_POL; 814 if (common_flags & SOCAM_HSYNC_ACTIVE_HIGH)
··· 807 808 if (common_flags & SOCAM_PCLK_SAMPLE_RISING) 809 csicr1 |= CSICR1_REDGE; 810 if (common_flags & SOCAM_VSYNC_ACTIVE_HIGH) 811 csicr1 |= CSICR1_SOF_POL; 812 if (common_flags & SOCAM_HSYNC_ACTIVE_HIGH)
+48 -3
drivers/media/video/s5p-fimc/fimc-capture.c
··· 522 INIT_LIST_HEAD(&fimc->vid_cap.active_buf_q); 523 fimc->vid_cap.active_buf_cnt = 0; 524 fimc->vid_cap.frame_count = 0; 525 526 set_bit(ST_CAPT_PEND, &fimc->state); 527 ret = videobuf_streamon(&fimc->vid_cap.vbq); ··· 653 return ret; 654 } 655 656 static int fimc_cap_s_crop(struct file *file, void *fh, 657 struct v4l2_crop *cr) 658 { ··· 761 .vidioc_g_ctrl = fimc_vidioc_g_ctrl, 762 .vidioc_s_ctrl = fimc_cap_s_ctrl, 763 764 - .vidioc_g_crop = fimc_vidioc_g_crop, 765 .vidioc_s_crop = fimc_cap_s_crop, 766 - .vidioc_cropcap = fimc_vidioc_cropcap, 767 768 .vidioc_enum_input = fimc_cap_enum_input, 769 .vidioc_s_input = fimc_cap_s_input, ··· 830 videobuf_queue_dma_contig_init(&vid_cap->vbq, &fimc_qops, 831 vid_cap->v4l2_dev.dev, &fimc->irqlock, 832 V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE, 833 - sizeof(struct fimc_vid_buffer), (void *)ctx); 834 835 ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1); 836 if (ret) {
··· 522 INIT_LIST_HEAD(&fimc->vid_cap.active_buf_q); 523 fimc->vid_cap.active_buf_cnt = 0; 524 fimc->vid_cap.frame_count = 0; 525 + fimc->vid_cap.buf_index = fimc_hw_get_frame_index(fimc); 526 527 set_bit(ST_CAPT_PEND, &fimc->state); 528 ret = videobuf_streamon(&fimc->vid_cap.vbq); ··· 652 return ret; 653 } 654 655 + static int fimc_cap_cropcap(struct file *file, void *fh, 656 + struct v4l2_cropcap *cr) 657 + { 658 + struct fimc_frame *f; 659 + struct fimc_ctx *ctx = fh; 660 + struct fimc_dev *fimc = ctx->fimc_dev; 661 + 662 + if (cr->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) 663 + return -EINVAL; 664 + 665 + if (mutex_lock_interruptible(&fimc->lock)) 666 + return -ERESTARTSYS; 667 + 668 + f = &ctx->s_frame; 669 + cr->bounds.left = 0; 670 + cr->bounds.top = 0; 671 + cr->bounds.width = f->o_width; 672 + cr->bounds.height = f->o_height; 673 + cr->defrect = cr->bounds; 674 + 675 + mutex_unlock(&fimc->lock); 676 + return 0; 677 + } 678 + 679 + static int fimc_cap_g_crop(struct file *file, void *fh, struct v4l2_crop *cr) 680 + { 681 + struct fimc_frame *f; 682 + struct fimc_ctx *ctx = file->private_data; 683 + struct fimc_dev *fimc = ctx->fimc_dev; 684 + 685 + 686 + if (mutex_lock_interruptible(&fimc->lock)) 687 + return -ERESTARTSYS; 688 + 689 + f = &ctx->s_frame; 690 + cr->c.left = f->offs_h; 691 + cr->c.top = f->offs_v; 692 + cr->c.width = f->width; 693 + cr->c.height = f->height; 694 + 695 + mutex_unlock(&fimc->lock); 696 + return 0; 697 + } 698 + 699 static int fimc_cap_s_crop(struct file *file, void *fh, 700 struct v4l2_crop *cr) 701 { ··· 716 .vidioc_g_ctrl = fimc_vidioc_g_ctrl, 717 .vidioc_s_ctrl = fimc_cap_s_ctrl, 718 719 + .vidioc_g_crop = fimc_cap_g_crop, 720 .vidioc_s_crop = fimc_cap_s_crop, 721 + .vidioc_cropcap = fimc_cap_cropcap, 722 723 .vidioc_enum_input = fimc_cap_enum_input, 724 .vidioc_s_input = fimc_cap_s_input, ··· 785 videobuf_queue_dma_contig_init(&vid_cap->vbq, &fimc_qops, 786 vid_cap->v4l2_dev.dev, &fimc->irqlock, 787 V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_FIELD_NONE, 788 + sizeof(struct fimc_vid_buffer), (void *)ctx, NULL); 789 790 ret = video_register_device(vfd, VFL_TYPE_GRABBER, -1); 791 if (ret) {
+33 -21
drivers/media/video/s5p-fimc/fimc-core.c
··· 50 .planes_cnt = 1, 51 .flags = FMT_FLAGS_M2M, 52 }, { 53 - .name = "XRGB-8-8-8-8, 24 bpp", 54 - .fourcc = V4L2_PIX_FMT_RGB24, 55 .depth = 32, 56 .color = S5P_FIMC_RGB888, 57 .buff_cnt = 1, ··· 983 { 984 struct fimc_ctx *ctx = priv; 985 struct v4l2_queryctrl *c; 986 987 c = get_ctrl(qc->id); 988 if (c) { ··· 991 return 0; 992 } 993 994 - if (ctx->state & FIMC_CTX_CAP) 995 - return v4l2_subdev_call(ctx->fimc_dev->vid_cap.sd, 996 core, queryctrl, qc); 997 - return -EINVAL; 998 } 999 1000 int fimc_vidioc_g_ctrl(struct file *file, void *priv, ··· 1120 return 0; 1121 } 1122 1123 - int fimc_vidioc_cropcap(struct file *file, void *fh, 1124 struct v4l2_cropcap *cr) 1125 { 1126 struct fimc_frame *frame; ··· 1144 return 0; 1145 } 1146 1147 - int fimc_vidioc_g_crop(struct file *file, void *fh, struct v4l2_crop *cr) 1148 { 1149 struct fimc_frame *frame; 1150 struct fimc_ctx *ctx = file->private_data; ··· 1172 struct fimc_frame *f; 1173 u32 min_size, halign; 1174 1175 - f = (cr->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) ? 1176 - &ctx->s_frame : &ctx->d_frame; 1177 - 1178 if (cr->c.top < 0 || cr->c.left < 0) { 1179 v4l2_err(&fimc->m2m.v4l2_dev, 1180 "doesn't support negative values for top & left\n"); 1181 return -EINVAL; 1182 } 1183 1184 - f = ctx_get_frame(ctx, cr->type); 1185 - if (IS_ERR(f)) 1186 - return PTR_ERR(f); 1187 1188 - min_size = (cr->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) 1189 - ? fimc->variant->min_inp_pixsize 1190 - : fimc->variant->min_out_pixsize; 1191 1192 if (ctx->state & FIMC_CTX_M2M) { 1193 if (fimc->id == 1 && fimc->variant->pix_hoff) ··· 1238 f = (cr->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) ? 1239 &ctx->s_frame : &ctx->d_frame; 1240 1241 spin_lock_irqsave(&ctx->slock, flags); 1242 if (~ctx->state & (FIMC_SRC_FMT | FIMC_DST_FMT)) { 1243 /* Check to see if scaling ratio is within supported range */ ··· 1249 else 1250 ret = fimc_check_scaler_ratio(&cr->c, &ctx->s_frame); 1251 if (ret) { 1252 - spin_unlock_irqrestore(&ctx->slock, flags); 1253 v4l2_err(&fimc->m2m.v4l2_dev, "Out of scaler range"); 1254 - return -EINVAL; 1255 } 1256 } 1257 ctx->state |= FIMC_PARAMS; ··· 1261 f->width = cr->c.width; 1262 f->height = cr->c.height; 1263 1264 spin_unlock_irqrestore(&ctx->slock, flags); 1265 return 0; 1266 } 1267 ··· 1295 .vidioc_g_ctrl = fimc_vidioc_g_ctrl, 1296 .vidioc_s_ctrl = fimc_m2m_s_ctrl, 1297 1298 - .vidioc_g_crop = fimc_vidioc_g_crop, 1299 .vidioc_s_crop = fimc_m2m_s_crop, 1300 - .vidioc_cropcap = fimc_vidioc_cropcap 1301 1302 }; 1303 ··· 1406 .open = fimc_m2m_open, 1407 .release = fimc_m2m_release, 1408 .poll = fimc_m2m_poll, 1409 - .ioctl = video_ioctl2, 1410 .mmap = fimc_m2m_mmap, 1411 }; 1412 ··· 1746 .pix_hoff = 1, 1747 .has_inp_rot = 1, 1748 .has_out_rot = 1, 1749 .min_inp_pixsize = 16, 1750 .min_out_pixsize = 16, 1751 .hor_offs_align = 1, ··· 1756 1757 static struct samsung_fimc_variant fimc2_variant_s5pv310 = { 1758 .pix_hoff = 1, 1759 .min_inp_pixsize = 16, 1760 .min_out_pixsize = 16, 1761 .hor_offs_align = 1,
··· 50 .planes_cnt = 1, 51 .flags = FMT_FLAGS_M2M, 52 }, { 53 + .name = "XRGB-8-8-8-8, 32 bpp", 54 + .fourcc = V4L2_PIX_FMT_RGB32, 55 .depth = 32, 56 .color = S5P_FIMC_RGB888, 57 .buff_cnt = 1, ··· 983 { 984 struct fimc_ctx *ctx = priv; 985 struct v4l2_queryctrl *c; 986 + int ret = -EINVAL; 987 988 c = get_ctrl(qc->id); 989 if (c) { ··· 990 return 0; 991 } 992 993 + if (ctx->state & FIMC_CTX_CAP) { 994 + if (mutex_lock_interruptible(&ctx->fimc_dev->lock)) 995 + return -ERESTARTSYS; 996 + ret = v4l2_subdev_call(ctx->fimc_dev->vid_cap.sd, 997 core, queryctrl, qc); 998 + mutex_unlock(&ctx->fimc_dev->lock); 999 + } 1000 + return ret; 1001 } 1002 1003 int fimc_vidioc_g_ctrl(struct file *file, void *priv, ··· 1115 return 0; 1116 } 1117 1118 + static int fimc_m2m_cropcap(struct file *file, void *fh, 1119 struct v4l2_cropcap *cr) 1120 { 1121 struct fimc_frame *frame; ··· 1139 return 0; 1140 } 1141 1142 + static int fimc_m2m_g_crop(struct file *file, void *fh, struct v4l2_crop *cr) 1143 { 1144 struct fimc_frame *frame; 1145 struct fimc_ctx *ctx = file->private_data; ··· 1167 struct fimc_frame *f; 1168 u32 min_size, halign; 1169 1170 if (cr->c.top < 0 || cr->c.left < 0) { 1171 v4l2_err(&fimc->m2m.v4l2_dev, 1172 "doesn't support negative values for top & left\n"); 1173 return -EINVAL; 1174 } 1175 1176 + if (cr->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) 1177 + f = (ctx->state & FIMC_CTX_CAP) ? &ctx->s_frame : &ctx->d_frame; 1178 + else if (cr->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && 1179 + ctx->state & FIMC_CTX_M2M) 1180 + f = &ctx->s_frame; 1181 + else 1182 + return -EINVAL; 1183 1184 + min_size = (f == &ctx->s_frame) ? 1185 + fimc->variant->min_inp_pixsize : fimc->variant->min_out_pixsize; 1186 1187 if (ctx->state & FIMC_CTX_M2M) { 1188 if (fimc->id == 1 && fimc->variant->pix_hoff) ··· 1233 f = (cr->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) ? 1234 &ctx->s_frame : &ctx->d_frame; 1235 1236 + if (mutex_lock_interruptible(&fimc->lock)) 1237 + return -ERESTARTSYS; 1238 + 1239 spin_lock_irqsave(&ctx->slock, flags); 1240 if (~ctx->state & (FIMC_SRC_FMT | FIMC_DST_FMT)) { 1241 /* Check to see if scaling ratio is within supported range */ ··· 1241 else 1242 ret = fimc_check_scaler_ratio(&cr->c, &ctx->s_frame); 1243 if (ret) { 1244 v4l2_err(&fimc->m2m.v4l2_dev, "Out of scaler range"); 1245 + ret = -EINVAL; 1246 + goto scr_unlock; 1247 } 1248 } 1249 ctx->state |= FIMC_PARAMS; ··· 1253 f->width = cr->c.width; 1254 f->height = cr->c.height; 1255 1256 + scr_unlock: 1257 spin_unlock_irqrestore(&ctx->slock, flags); 1258 + mutex_unlock(&fimc->lock); 1259 return 0; 1260 } 1261 ··· 1285 .vidioc_g_ctrl = fimc_vidioc_g_ctrl, 1286 .vidioc_s_ctrl = fimc_m2m_s_ctrl, 1287 1288 + .vidioc_g_crop = fimc_m2m_g_crop, 1289 .vidioc_s_crop = fimc_m2m_s_crop, 1290 + .vidioc_cropcap = fimc_m2m_cropcap 1291 1292 }; 1293 ··· 1396 .open = fimc_m2m_open, 1397 .release = fimc_m2m_release, 1398 .poll = fimc_m2m_poll, 1399 + .unlocked_ioctl = video_ioctl2, 1400 .mmap = fimc_m2m_mmap, 1401 }; 1402 ··· 1736 .pix_hoff = 1, 1737 .has_inp_rot = 1, 1738 .has_out_rot = 1, 1739 + .has_cistatus2 = 1, 1740 .min_inp_pixsize = 16, 1741 .min_out_pixsize = 16, 1742 .hor_offs_align = 1, ··· 1745 1746 static struct samsung_fimc_variant fimc2_variant_s5pv310 = { 1747 .pix_hoff = 1, 1748 + .has_cistatus2 = 1, 1749 .min_inp_pixsize = 16, 1750 .min_out_pixsize = 16, 1751 .hor_offs_align = 1,
+16 -8
drivers/media/video/s5p-fimc/fimc-core.h
··· 13 14 /*#define DEBUG*/ 15 16 #include <linux/types.h> 17 #include <media/videobuf-core.h> 18 #include <media/v4l2-device.h> 19 #include <media/v4l2-mem2mem.h> 20 #include <media/v4l2-mediabus.h> 21 #include <media/s3c_fimc.h> 22 - #include <linux/videodev2.h> 23 #include "regs-fimc.h" 24 25 #define err(fmt, args...) \ ··· 371 * @pix_hoff: indicate whether horizontal offset is in pixels or in bytes 372 * @has_inp_rot: set if has input rotator 373 * @has_out_rot: set if has output rotator 374 * @pix_limit: pixel size constraints for the scaler 375 * @min_inp_pixsize: minimum input pixel size 376 * @min_out_pixsize: minimum output pixel size ··· 382 unsigned int pix_hoff:1; 383 unsigned int has_inp_rot:1; 384 unsigned int has_out_rot:1; 385 struct fimc_pix_limit *pix_limit; 386 u16 min_inp_pixsize; 387 u16 min_out_pixsize; ··· 558 return frame; 559 } 560 561 static inline u32 fimc_hw_get_frame_index(struct fimc_dev *dev) 562 { 563 - u32 reg = readl(dev->regs + S5P_CISTATUS); 564 - return (reg & S5P_CISTATUS_FRAMECNT_MASK) >> 565 - S5P_CISTATUS_FRAMECNT_SHIFT; 566 } 567 568 /* -----------------------------------------------------*/ ··· 606 struct v4l2_format *f); 607 int fimc_vidioc_try_fmt(struct file *file, void *priv, 608 struct v4l2_format *f); 609 - int fimc_vidioc_g_crop(struct file *file, void *fh, 610 - struct v4l2_crop *cr); 611 - int fimc_vidioc_cropcap(struct file *file, void *fh, 612 - struct v4l2_cropcap *cr); 613 int fimc_vidioc_queryctrl(struct file *file, void *priv, 614 struct v4l2_queryctrl *qc); 615 int fimc_vidioc_g_ctrl(struct file *file, void *priv,
··· 13 14 /*#define DEBUG*/ 15 16 + #include <linux/sched.h> 17 #include <linux/types.h> 18 + #include <linux/videodev2.h> 19 #include <media/videobuf-core.h> 20 #include <media/v4l2-device.h> 21 #include <media/v4l2-mem2mem.h> 22 #include <media/v4l2-mediabus.h> 23 #include <media/s3c_fimc.h> 24 + 25 #include "regs-fimc.h" 26 27 #define err(fmt, args...) \ ··· 369 * @pix_hoff: indicate whether horizontal offset is in pixels or in bytes 370 * @has_inp_rot: set if has input rotator 371 * @has_out_rot: set if has output rotator 372 + * @has_cistatus2: 1 if CISTATUS2 register is present in this IP revision 373 * @pix_limit: pixel size constraints for the scaler 374 * @min_inp_pixsize: minimum input pixel size 375 * @min_out_pixsize: minimum output pixel size ··· 379 unsigned int pix_hoff:1; 380 unsigned int has_inp_rot:1; 381 unsigned int has_out_rot:1; 382 + unsigned int has_cistatus2:1; 383 struct fimc_pix_limit *pix_limit; 384 u16 min_inp_pixsize; 385 u16 min_out_pixsize; ··· 554 return frame; 555 } 556 557 + /* Return an index to the buffer actually being written. */ 558 static inline u32 fimc_hw_get_frame_index(struct fimc_dev *dev) 559 { 560 + u32 reg; 561 + 562 + if (dev->variant->has_cistatus2) { 563 + reg = readl(dev->regs + S5P_CISTATUS2) & 0x3F; 564 + return reg > 0 ? --reg : reg; 565 + } else { 566 + reg = readl(dev->regs + S5P_CISTATUS); 567 + return (reg & S5P_CISTATUS_FRAMECNT_MASK) >> 568 + S5P_CISTATUS_FRAMECNT_SHIFT; 569 + } 570 } 571 572 /* -----------------------------------------------------*/ ··· 594 struct v4l2_format *f); 595 int fimc_vidioc_try_fmt(struct file *file, void *priv, 596 struct v4l2_format *f); 597 int fimc_vidioc_queryctrl(struct file *file, void *priv, 598 struct v4l2_queryctrl *qc); 599 int fimc_vidioc_g_ctrl(struct file *file, void *priv,
+3
drivers/media/video/s5p-fimc/regs-fimc.h
··· 165 #define S5P_CISTATUS_VVALID_A (1 << 15) 166 #define S5P_CISTATUS_VVALID_B (1 << 14) 167 168 /* Image capture control */ 169 #define S5P_CIIMGCPT 0xc0 170 #define S5P_CIIMGCPT_IMGCPTEN (1 << 31)
··· 165 #define S5P_CISTATUS_VVALID_A (1 << 15) 166 #define S5P_CISTATUS_VVALID_B (1 << 14) 167 168 + /* Indexes to the last and the currently processed buffer. */ 169 + #define S5P_CISTATUS2 0x68 170 + 171 /* Image capture control */ 172 #define S5P_CIIMGCPT 0xc0 173 #define S5P_CIIMGCPT_IMGCPTEN (1 << 31)
+1 -1
drivers/media/video/sh_mobile_ceu_camera.c
··· 1980 * we complete the completion. 1981 */ 1982 1983 - if (!csi2->driver || !csi2->driver->owner) { 1984 complete(&wait.completion); 1985 /* Either too late, or probing failed */ 1986 bus_unregister_notifier(&platform_bus_type, &wait.notifier);
··· 1980 * we complete the completion. 1981 */ 1982 1983 + if (!csi2->driver) { 1984 complete(&wait.completion); 1985 /* Either too late, or probing failed */ 1986 bus_unregister_notifier(&platform_bus_type, &wait.notifier);