diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-02-02 20:52:19 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-02-02 20:52:19 -0500 |
| commit | f2f1756d7de37cc8ca17705c5bc3dfcbfb589ab9 (patch) | |
| tree | 49d28fd08917f7a4e03b0bb983f2ecf2388681f8 | |
| parent | b8ef289daa313b3e5eb6564ed1c2758ddb6e3d6f (diff) | |
| parent | bed3c1de66d04f9e5efcdfc5b8035f3354c4ffcc (diff) | |
Merge branch 'media_fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'media_fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6:
[media] fix saa7111 non-detection
[media] rc/streamzap: fix reporting response times
[media] mceusb: really fix remaining keybounce issues
[media] rc: use time unit conversion macros correctly
[media] rc/ir-lirc-codec: add back debug spew
[media] ir-kbd-i2c: improve remote behavior with z8 behind usb
[media] lirc_zilog: z8 on usb doesn't like back-to-back i2c_master_send
[media] hdpvr: fix up i2c device registration
[media] rc/mce: add mappings for missing keys
[media] gspca - zc3xx: Discard the partial frames
[media] gspca - zc3xx: Fix bad images with the sensor hv7131r
[media] gspca - zc3xx: Bad delay when given by a table
| -rw-r--r-- | drivers/media/rc/ir-lirc-codec.c | 6 | ||||
| -rw-r--r-- | drivers/media/rc/keymaps/rc-rc6-mce.c | 6 | ||||
| -rw-r--r-- | drivers/media/rc/mceusb.c | 9 | ||||
| -rw-r--r-- | drivers/media/rc/nuvoton-cir.c | 6 | ||||
| -rw-r--r-- | drivers/media/rc/streamzap.c | 14 | ||||
| -rw-r--r-- | drivers/media/video/gspca/zc3xx.c | 31 | ||||
| -rw-r--r-- | drivers/media/video/hdpvr/hdpvr-core.c | 24 | ||||
| -rw-r--r-- | drivers/media/video/hdpvr/hdpvr-i2c.c | 30 | ||||
| -rw-r--r-- | drivers/media/video/hdpvr/hdpvr.h | 3 | ||||
| -rw-r--r-- | drivers/media/video/ir-kbd-i2c.c | 13 | ||||
| -rw-r--r-- | drivers/media/video/pvrusb2/pvrusb2-i2c-core.c | 1 | ||||
| -rw-r--r-- | drivers/media/video/saa7115.c | 2 | ||||
| -rw-r--r-- | drivers/staging/lirc/lirc_zilog.c | 32 |
13 files changed, 135 insertions, 42 deletions
diff --git a/drivers/media/rc/ir-lirc-codec.c b/drivers/media/rc/ir-lirc-codec.c index f011c5d9dea..1c5cc65ea1e 100644 --- a/drivers/media/rc/ir-lirc-codec.c +++ b/drivers/media/rc/ir-lirc-codec.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* ir-lirc-codec.c - ir-core to classic lirc interface bridge | 1 | /* ir-lirc-codec.c - rc-core to classic lirc interface bridge |
| 2 | * | 2 | * |
| 3 | * Copyright (C) 2010 by Jarod Wilson <jarod@redhat.com> | 3 | * Copyright (C) 2010 by Jarod Wilson <jarod@redhat.com> |
| 4 | * | 4 | * |
| @@ -47,6 +47,7 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev) | |||
| 47 | /* Carrier reports */ | 47 | /* Carrier reports */ |
| 48 | if (ev.carrier_report) { | 48 | if (ev.carrier_report) { |
| 49 | sample = LIRC_FREQUENCY(ev.carrier); | 49 | sample = LIRC_FREQUENCY(ev.carrier); |
| 50 | IR_dprintk(2, "carrier report (freq: %d)\n", sample); | ||
| 50 | 51 | ||
| 51 | /* Packet end */ | 52 | /* Packet end */ |
| 52 | } else if (ev.timeout) { | 53 | } else if (ev.timeout) { |
| @@ -62,6 +63,7 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev) | |||
| 62 | return 0; | 63 | return 0; |
| 63 | 64 | ||
| 64 | sample = LIRC_TIMEOUT(ev.duration / 1000); | 65 | sample = LIRC_TIMEOUT(ev.duration / 1000); |
| 66 | IR_dprintk(2, "timeout report (duration: %d)\n", sample); | ||
| 65 | 67 | ||
| 66 | /* Normal sample */ | 68 | /* Normal sample */ |
| 67 | } else { | 69 | } else { |
| @@ -85,6 +87,8 @@ static int ir_lirc_decode(struct rc_dev *dev, struct ir_raw_event ev) | |||
| 85 | 87 | ||
| 86 | sample = ev.pulse ? LIRC_PULSE(ev.duration / 1000) : | 88 | sample = ev.pulse ? LIRC_PULSE(ev.duration / 1000) : |
| 87 | LIRC_SPACE(ev.duration / 1000); | 89 | LIRC_SPACE(ev.duration / 1000); |
| 90 | IR_dprintk(2, "delivering %uus %s to lirc_dev\n", | ||
| 91 | TO_US(ev.duration), TO_STR(ev.pulse)); | ||
| 88 | } | 92 | } |
| 89 | 93 | ||
| 90 | lirc_buffer_write(dev->raw->lirc.drv->rbuf, | 94 | lirc_buffer_write(dev->raw->lirc.drv->rbuf, |
diff --git a/drivers/media/rc/keymaps/rc-rc6-mce.c b/drivers/media/rc/keymaps/rc-rc6-mce.c index 3bf3337875d..2f5dc0622b9 100644 --- a/drivers/media/rc/keymaps/rc-rc6-mce.c +++ b/drivers/media/rc/keymaps/rc-rc6-mce.c | |||
| @@ -3,6 +3,9 @@ | |||
| 3 | * | 3 | * |
| 4 | * Copyright (c) 2010 by Jarod Wilson <jarod@redhat.com> | 4 | * Copyright (c) 2010 by Jarod Wilson <jarod@redhat.com> |
| 5 | * | 5 | * |
| 6 | * See http://mediacenterguides.com/book/export/html/31 for details on | ||
| 7 | * key mappings. | ||
| 8 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | 9 | * This program is free software; you can redistribute it and/or modify |
| 7 | * it under the terms of the GNU General Public License as published by | 10 | * it under the terms of the GNU General Public License as published by |
| 8 | * the Free Software Foundation; either version 2 of the License, or | 11 | * the Free Software Foundation; either version 2 of the License, or |
| @@ -60,6 +63,9 @@ static struct rc_map_table rc6_mce[] = { | |||
| 60 | { 0x800f0426, KEY_EPG }, /* Guide */ | 63 | { 0x800f0426, KEY_EPG }, /* Guide */ |
| 61 | { 0x800f0427, KEY_ZOOM }, /* Aspect */ | 64 | { 0x800f0427, KEY_ZOOM }, /* Aspect */ |
| 62 | 65 | ||
| 66 | { 0x800f0432, KEY_MODE }, /* Visualization */ | ||
| 67 | { 0x800f0433, KEY_PRESENTATION }, /* Slide Show */ | ||
| 68 | { 0x800f0434, KEY_EJECTCD }, | ||
| 63 | { 0x800f043a, KEY_BRIGHTNESSUP }, | 69 | { 0x800f043a, KEY_BRIGHTNESSUP }, |
| 64 | 70 | ||
| 65 | { 0x800f0446, KEY_TV }, | 71 | { 0x800f0446, KEY_TV }, |
diff --git a/drivers/media/rc/mceusb.c b/drivers/media/rc/mceusb.c index 079353e5d55..6df0a498064 100644 --- a/drivers/media/rc/mceusb.c +++ b/drivers/media/rc/mceusb.c | |||
| @@ -816,7 +816,7 @@ static void mceusb_handle_command(struct mceusb_dev *ir, int index) | |||
| 816 | switch (ir->buf_in[index]) { | 816 | switch (ir->buf_in[index]) { |
| 817 | /* 2-byte return value commands */ | 817 | /* 2-byte return value commands */ |
| 818 | case MCE_CMD_S_TIMEOUT: | 818 | case MCE_CMD_S_TIMEOUT: |
| 819 | ir->rc->timeout = MS_TO_NS((hi << 8 | lo) / 2); | 819 | ir->rc->timeout = US_TO_NS((hi << 8 | lo) / 2); |
| 820 | break; | 820 | break; |
| 821 | 821 | ||
| 822 | /* 1-byte return value commands */ | 822 | /* 1-byte return value commands */ |
| @@ -855,9 +855,10 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) | |||
| 855 | break; | 855 | break; |
| 856 | case PARSE_IRDATA: | 856 | case PARSE_IRDATA: |
| 857 | ir->rem--; | 857 | ir->rem--; |
| 858 | init_ir_raw_event(&rawir); | ||
| 858 | rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0); | 859 | rawir.pulse = ((ir->buf_in[i] & MCE_PULSE_BIT) != 0); |
| 859 | rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) | 860 | rawir.duration = (ir->buf_in[i] & MCE_PULSE_MASK) |
| 860 | * MS_TO_US(MCE_TIME_UNIT); | 861 | * US_TO_NS(MCE_TIME_UNIT); |
| 861 | 862 | ||
| 862 | dev_dbg(ir->dev, "Storing %s with duration %d\n", | 863 | dev_dbg(ir->dev, "Storing %s with duration %d\n", |
| 863 | rawir.pulse ? "pulse" : "space", | 864 | rawir.pulse ? "pulse" : "space", |
| @@ -883,6 +884,8 @@ static void mceusb_process_ir_data(struct mceusb_dev *ir, int buf_len) | |||
| 883 | i, ir->rem + 1, false); | 884 | i, ir->rem + 1, false); |
| 884 | if (ir->rem) | 885 | if (ir->rem) |
| 885 | ir->parser_state = PARSE_IRDATA; | 886 | ir->parser_state = PARSE_IRDATA; |
| 887 | else | ||
| 888 | ir_raw_event_reset(ir->rc); | ||
| 886 | break; | 889 | break; |
| 887 | } | 890 | } |
| 888 | 891 | ||
| @@ -1060,7 +1063,7 @@ static struct rc_dev *mceusb_init_rc_dev(struct mceusb_dev *ir) | |||
| 1060 | rc->priv = ir; | 1063 | rc->priv = ir; |
| 1061 | rc->driver_type = RC_DRIVER_IR_RAW; | 1064 | rc->driver_type = RC_DRIVER_IR_RAW; |
| 1062 | rc->allowed_protos = RC_TYPE_ALL; | 1065 | rc->allowed_protos = RC_TYPE_ALL; |
| 1063 | rc->timeout = MS_TO_NS(1000); | 1066 | rc->timeout = US_TO_NS(1000); |
| 1064 | if (!ir->flags.no_tx) { | 1067 | if (!ir->flags.no_tx) { |
| 1065 | rc->s_tx_mask = mceusb_set_tx_mask; | 1068 | rc->s_tx_mask = mceusb_set_tx_mask; |
| 1066 | rc->s_tx_carrier = mceusb_set_tx_carrier; | 1069 | rc->s_tx_carrier = mceusb_set_tx_carrier; |
diff --git a/drivers/media/rc/nuvoton-cir.c b/drivers/media/rc/nuvoton-cir.c index dd4caf8ef80..273d9d67479 100644 --- a/drivers/media/rc/nuvoton-cir.c +++ b/drivers/media/rc/nuvoton-cir.c | |||
| @@ -460,7 +460,7 @@ static u32 nvt_rx_carrier_detect(struct nvt_dev *nvt) | |||
| 460 | return 0; | 460 | return 0; |
| 461 | } | 461 | } |
| 462 | 462 | ||
| 463 | carrier = (count * 1000000) / duration; | 463 | carrier = MS_TO_NS(count) / duration; |
| 464 | 464 | ||
| 465 | if ((carrier > MAX_CARRIER) || (carrier < MIN_CARRIER)) | 465 | if ((carrier > MAX_CARRIER) || (carrier < MIN_CARRIER)) |
| 466 | nvt_dbg("WTF? Carrier frequency out of range!"); | 466 | nvt_dbg("WTF? Carrier frequency out of range!"); |
| @@ -612,8 +612,8 @@ static void nvt_process_rx_ir_data(struct nvt_dev *nvt) | |||
| 612 | sample = nvt->buf[i]; | 612 | sample = nvt->buf[i]; |
| 613 | 613 | ||
| 614 | rawir.pulse = ((sample & BUF_PULSE_BIT) != 0); | 614 | rawir.pulse = ((sample & BUF_PULSE_BIT) != 0); |
| 615 | rawir.duration = (sample & BUF_LEN_MASK) | 615 | rawir.duration = US_TO_NS((sample & BUF_LEN_MASK) |
| 616 | * SAMPLE_PERIOD * 1000; | 616 | * SAMPLE_PERIOD); |
| 617 | 617 | ||
| 618 | if ((sample & BUF_LEN_MASK) == BUF_LEN_MASK) { | 618 | if ((sample & BUF_LEN_MASK) == BUF_LEN_MASK) { |
| 619 | if (nvt->rawir.pulse == rawir.pulse) | 619 | if (nvt->rawir.pulse == rawir.pulse) |
diff --git a/drivers/media/rc/streamzap.c b/drivers/media/rc/streamzap.c index 6e2911c2abf..e435d94c077 100644 --- a/drivers/media/rc/streamzap.c +++ b/drivers/media/rc/streamzap.c | |||
| @@ -164,7 +164,7 @@ static void sz_push_full_pulse(struct streamzap_ir *sz, | |||
| 164 | sz->signal_start.tv_usec - | 164 | sz->signal_start.tv_usec - |
| 165 | sz->signal_last.tv_usec); | 165 | sz->signal_last.tv_usec); |
| 166 | rawir.duration -= sz->sum; | 166 | rawir.duration -= sz->sum; |
| 167 | rawir.duration *= 1000; | 167 | rawir.duration = US_TO_NS(rawir.duration); |
| 168 | rawir.duration &= IR_MAX_DURATION; | 168 | rawir.duration &= IR_MAX_DURATION; |
| 169 | } | 169 | } |
| 170 | sz_push(sz, rawir); | 170 | sz_push(sz, rawir); |
| @@ -177,7 +177,7 @@ static void sz_push_full_pulse(struct streamzap_ir *sz, | |||
| 177 | rawir.duration = ((int) value) * SZ_RESOLUTION; | 177 | rawir.duration = ((int) value) * SZ_RESOLUTION; |
| 178 | rawir.duration += SZ_RESOLUTION / 2; | 178 | rawir.duration += SZ_RESOLUTION / 2; |
| 179 | sz->sum += rawir.duration; | 179 | sz->sum += rawir.duration; |
| 180 | rawir.duration *= 1000; | 180 | rawir.duration = US_TO_NS(rawir.duration); |
| 181 | rawir.duration &= IR_MAX_DURATION; | 181 | rawir.duration &= IR_MAX_DURATION; |
| 182 | sz_push(sz, rawir); | 182 | sz_push(sz, rawir); |
| 183 | } | 183 | } |
| @@ -197,7 +197,7 @@ static void sz_push_full_space(struct streamzap_ir *sz, | |||
| 197 | rawir.duration = ((int) value) * SZ_RESOLUTION; | 197 | rawir.duration = ((int) value) * SZ_RESOLUTION; |
| 198 | rawir.duration += SZ_RESOLUTION / 2; | 198 | rawir.duration += SZ_RESOLUTION / 2; |
| 199 | sz->sum += rawir.duration; | 199 | sz->sum += rawir.duration; |
| 200 | rawir.duration *= 1000; | 200 | rawir.duration = US_TO_NS(rawir.duration); |
| 201 | sz_push(sz, rawir); | 201 | sz_push(sz, rawir); |
| 202 | } | 202 | } |
| 203 | 203 | ||
| @@ -273,6 +273,7 @@ static void streamzap_callback(struct urb *urb) | |||
| 273 | if (sz->timeout_enabled) | 273 | if (sz->timeout_enabled) |
| 274 | sz_push(sz, rawir); | 274 | sz_push(sz, rawir); |
| 275 | ir_raw_event_handle(sz->rdev); | 275 | ir_raw_event_handle(sz->rdev); |
| 276 | ir_raw_event_reset(sz->rdev); | ||
| 276 | } else { | 277 | } else { |
| 277 | sz_push_full_space(sz, sz->buf_in[i]); | 278 | sz_push_full_space(sz, sz->buf_in[i]); |
| 278 | } | 279 | } |
| @@ -290,6 +291,7 @@ static void streamzap_callback(struct urb *urb) | |||
| 290 | } | 291 | } |
| 291 | } | 292 | } |
| 292 | 293 | ||
| 294 | ir_raw_event_handle(sz->rdev); | ||
| 293 | usb_submit_urb(urb, GFP_ATOMIC); | 295 | usb_submit_urb(urb, GFP_ATOMIC); |
| 294 | 296 | ||
| 295 | return; | 297 | return; |
| @@ -430,13 +432,13 @@ static int __devinit streamzap_probe(struct usb_interface *intf, | |||
| 430 | sz->decoder_state = PulseSpace; | 432 | sz->decoder_state = PulseSpace; |
| 431 | /* FIXME: don't yet have a way to set this */ | 433 | /* FIXME: don't yet have a way to set this */ |
| 432 | sz->timeout_enabled = true; | 434 | sz->timeout_enabled = true; |
| 433 | sz->rdev->timeout = (((SZ_TIMEOUT * SZ_RESOLUTION * 1000) & | 435 | sz->rdev->timeout = ((US_TO_NS(SZ_TIMEOUT * SZ_RESOLUTION) & |
| 434 | IR_MAX_DURATION) | 0x03000000); | 436 | IR_MAX_DURATION) | 0x03000000); |
| 435 | #if 0 | 437 | #if 0 |
| 436 | /* not yet supported, depends on patches from maxim */ | 438 | /* not yet supported, depends on patches from maxim */ |
| 437 | /* see also: LIRC_GET_REC_RESOLUTION and LIRC_SET_REC_TIMEOUT */ | 439 | /* see also: LIRC_GET_REC_RESOLUTION and LIRC_SET_REC_TIMEOUT */ |
| 438 | sz->min_timeout = SZ_TIMEOUT * SZ_RESOLUTION * 1000; | 440 | sz->min_timeout = US_TO_NS(SZ_TIMEOUT * SZ_RESOLUTION); |
| 439 | sz->max_timeout = SZ_TIMEOUT * SZ_RESOLUTION * 1000; | 441 | sz->max_timeout = US_TO_NS(SZ_TIMEOUT * SZ_RESOLUTION); |
| 440 | #endif | 442 | #endif |
| 441 | 443 | ||
| 442 | do_gettimeofday(&sz->signal_start); | 444 | do_gettimeofday(&sz->signal_start); |
diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c index 865216e9362..47236a58bf3 100644 --- a/drivers/media/video/gspca/zc3xx.c +++ b/drivers/media/video/gspca/zc3xx.c | |||
| @@ -5793,7 +5793,7 @@ static void usb_exchange(struct gspca_dev *gspca_dev, | |||
| 5793 | break; | 5793 | break; |
| 5794 | default: | 5794 | default: |
| 5795 | /* case 0xdd: * delay */ | 5795 | /* case 0xdd: * delay */ |
| 5796 | msleep(action->val / 64 + 10); | 5796 | msleep(action->idx); |
| 5797 | break; | 5797 | break; |
| 5798 | } | 5798 | } |
| 5799 | action++; | 5799 | action++; |
| @@ -5830,7 +5830,7 @@ static void setmatrix(struct gspca_dev *gspca_dev) | |||
| 5830 | [SENSOR_GC0305] = gc0305_matrix, | 5830 | [SENSOR_GC0305] = gc0305_matrix, |
| 5831 | [SENSOR_HDCS2020b] = NULL, | 5831 | [SENSOR_HDCS2020b] = NULL, |
| 5832 | [SENSOR_HV7131B] = NULL, | 5832 | [SENSOR_HV7131B] = NULL, |
| 5833 | [SENSOR_HV7131R] = NULL, | 5833 | [SENSOR_HV7131R] = po2030_matrix, |
| 5834 | [SENSOR_ICM105A] = po2030_matrix, | 5834 | [SENSOR_ICM105A] = po2030_matrix, |
| 5835 | [SENSOR_MC501CB] = NULL, | 5835 | [SENSOR_MC501CB] = NULL, |
| 5836 | [SENSOR_MT9V111_1] = gc0305_matrix, | 5836 | [SENSOR_MT9V111_1] = gc0305_matrix, |
| @@ -5936,6 +5936,7 @@ static void setquality(struct gspca_dev *gspca_dev) | |||
| 5936 | case SENSOR_ADCM2700: | 5936 | case SENSOR_ADCM2700: |
| 5937 | case SENSOR_GC0305: | 5937 | case SENSOR_GC0305: |
| 5938 | case SENSOR_HV7131B: | 5938 | case SENSOR_HV7131B: |
| 5939 | case SENSOR_HV7131R: | ||
| 5939 | case SENSOR_OV7620: | 5940 | case SENSOR_OV7620: |
| 5940 | case SENSOR_PAS202B: | 5941 | case SENSOR_PAS202B: |
| 5941 | case SENSOR_PO2030: | 5942 | case SENSOR_PO2030: |
| @@ -6108,11 +6109,13 @@ static void send_unknown(struct gspca_dev *gspca_dev, int sensor) | |||
| 6108 | reg_w(gspca_dev, 0x02, 0x003b); | 6109 | reg_w(gspca_dev, 0x02, 0x003b); |
| 6109 | reg_w(gspca_dev, 0x00, 0x0038); | 6110 | reg_w(gspca_dev, 0x00, 0x0038); |
| 6110 | break; | 6111 | break; |
| 6112 | case SENSOR_HV7131R: | ||
| 6111 | case SENSOR_PAS202B: | 6113 | case SENSOR_PAS202B: |
| 6112 | reg_w(gspca_dev, 0x03, 0x003b); | 6114 | reg_w(gspca_dev, 0x03, 0x003b); |
| 6113 | reg_w(gspca_dev, 0x0c, 0x003a); | 6115 | reg_w(gspca_dev, 0x0c, 0x003a); |
| 6114 | reg_w(gspca_dev, 0x0b, 0x0039); | 6116 | reg_w(gspca_dev, 0x0b, 0x0039); |
| 6115 | reg_w(gspca_dev, 0x0b, 0x0038); | 6117 | if (sensor == SENSOR_PAS202B) |
| 6118 | reg_w(gspca_dev, 0x0b, 0x0038); | ||
| 6116 | break; | 6119 | break; |
| 6117 | } | 6120 | } |
| 6118 | } | 6121 | } |
| @@ -6704,10 +6707,13 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 6704 | reg_w(gspca_dev, 0x02, 0x003b); | 6707 | reg_w(gspca_dev, 0x02, 0x003b); |
| 6705 | reg_w(gspca_dev, 0x00, 0x0038); | 6708 | reg_w(gspca_dev, 0x00, 0x0038); |
| 6706 | break; | 6709 | break; |
| 6710 | case SENSOR_HV7131R: | ||
| 6707 | case SENSOR_PAS202B: | 6711 | case SENSOR_PAS202B: |
| 6708 | reg_w(gspca_dev, 0x03, 0x003b); | 6712 | reg_w(gspca_dev, 0x03, 0x003b); |
| 6709 | reg_w(gspca_dev, 0x0c, 0x003a); | 6713 | reg_w(gspca_dev, 0x0c, 0x003a); |
| 6710 | reg_w(gspca_dev, 0x0b, 0x0039); | 6714 | reg_w(gspca_dev, 0x0b, 0x0039); |
| 6715 | if (sd->sensor == SENSOR_HV7131R) | ||
| 6716 | reg_w(gspca_dev, 0x50, ZC3XX_R11D_GLOBALGAIN); | ||
| 6711 | break; | 6717 | break; |
| 6712 | } | 6718 | } |
| 6713 | 6719 | ||
| @@ -6720,6 +6726,7 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 6720 | break; | 6726 | break; |
| 6721 | case SENSOR_PAS202B: | 6727 | case SENSOR_PAS202B: |
| 6722 | case SENSOR_GC0305: | 6728 | case SENSOR_GC0305: |
| 6729 | case SENSOR_HV7131R: | ||
| 6723 | case SENSOR_TAS5130C: | 6730 | case SENSOR_TAS5130C: |
| 6724 | reg_r(gspca_dev, 0x0008); | 6731 | reg_r(gspca_dev, 0x0008); |
| 6725 | /* fall thru */ | 6732 | /* fall thru */ |
| @@ -6760,6 +6767,12 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 6760 | /* ms-win + */ | 6767 | /* ms-win + */ |
| 6761 | reg_w(gspca_dev, 0x40, 0x0117); | 6768 | reg_w(gspca_dev, 0x40, 0x0117); |
| 6762 | break; | 6769 | break; |
| 6770 | case SENSOR_HV7131R: | ||
| 6771 | i2c_write(gspca_dev, 0x25, 0x04, 0x00); /* exposure */ | ||
| 6772 | i2c_write(gspca_dev, 0x26, 0x93, 0x00); | ||
| 6773 | i2c_write(gspca_dev, 0x27, 0xe0, 0x00); | ||
| 6774 | reg_w(gspca_dev, 0x00, ZC3XX_R1A7_CALCGLOBALMEAN); | ||
| 6775 | break; | ||
| 6763 | case SENSOR_GC0305: | 6776 | case SENSOR_GC0305: |
| 6764 | case SENSOR_TAS5130C: | 6777 | case SENSOR_TAS5130C: |
| 6765 | reg_w(gspca_dev, 0x09, 0x01ad); /* (from win traces) */ | 6778 | reg_w(gspca_dev, 0x09, 0x01ad); /* (from win traces) */ |
| @@ -6808,9 +6821,17 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
| 6808 | { | 6821 | { |
| 6809 | struct sd *sd = (struct sd *) gspca_dev; | 6822 | struct sd *sd = (struct sd *) gspca_dev; |
| 6810 | 6823 | ||
| 6811 | if (data[0] == 0xff && data[1] == 0xd8) { /* start of frame */ | 6824 | /* check the JPEG end of frame */ |
| 6825 | if (len >= 3 | ||
| 6826 | && data[len - 3] == 0xff && data[len - 2] == 0xd9) { | ||
| 6827 | /*fixme: what does the last byte mean?*/ | ||
| 6812 | gspca_frame_add(gspca_dev, LAST_PACKET, | 6828 | gspca_frame_add(gspca_dev, LAST_PACKET, |
| 6813 | NULL, 0); | 6829 | data, len - 1); |
| 6830 | return; | ||
| 6831 | } | ||
| 6832 | |||
| 6833 | /* check the JPEG start of a frame */ | ||
| 6834 | if (data[0] == 0xff && data[1] == 0xd8) { | ||
| 6814 | /* put the JPEG header in the new frame */ | 6835 | /* put the JPEG header in the new frame */ |
| 6815 | gspca_frame_add(gspca_dev, FIRST_PACKET, | 6836 | gspca_frame_add(gspca_dev, FIRST_PACKET, |
| 6816 | sd->jpeg_hdr, JPEG_HDR_SZ); | 6837 | sd->jpeg_hdr, JPEG_HDR_SZ); |
diff --git a/drivers/media/video/hdpvr/hdpvr-core.c b/drivers/media/video/hdpvr/hdpvr-core.c index a6572e5ae36..a27d93b503a 100644 --- a/drivers/media/video/hdpvr/hdpvr-core.c +++ b/drivers/media/video/hdpvr/hdpvr-core.c | |||
| @@ -283,6 +283,7 @@ static int hdpvr_probe(struct usb_interface *interface, | |||
| 283 | struct hdpvr_device *dev; | 283 | struct hdpvr_device *dev; |
| 284 | struct usb_host_interface *iface_desc; | 284 | struct usb_host_interface *iface_desc; |
| 285 | struct usb_endpoint_descriptor *endpoint; | 285 | struct usb_endpoint_descriptor *endpoint; |
| 286 | struct i2c_client *client; | ||
| 286 | size_t buffer_size; | 287 | size_t buffer_size; |
| 287 | int i; | 288 | int i; |
| 288 | int retval = -ENOMEM; | 289 | int retval = -ENOMEM; |
| @@ -381,13 +382,21 @@ static int hdpvr_probe(struct usb_interface *interface, | |||
| 381 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) | 382 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) |
| 382 | retval = hdpvr_register_i2c_adapter(dev); | 383 | retval = hdpvr_register_i2c_adapter(dev); |
| 383 | if (retval < 0) { | 384 | if (retval < 0) { |
| 384 | v4l2_err(&dev->v4l2_dev, "registering i2c adapter failed\n"); | 385 | v4l2_err(&dev->v4l2_dev, "i2c adapter register failed\n"); |
| 385 | goto error; | 386 | goto error; |
| 386 | } | 387 | } |
| 387 | 388 | ||
| 388 | retval = hdpvr_register_i2c_ir(dev); | 389 | client = hdpvr_register_ir_rx_i2c(dev); |
| 389 | if (retval < 0) | 390 | if (!client) { |
| 390 | v4l2_err(&dev->v4l2_dev, "registering i2c IR devices failed\n"); | 391 | v4l2_err(&dev->v4l2_dev, "i2c IR RX device register failed\n"); |
| 392 | goto reg_fail; | ||
| 393 | } | ||
| 394 | |||
| 395 | client = hdpvr_register_ir_tx_i2c(dev); | ||
| 396 | if (!client) { | ||
| 397 | v4l2_err(&dev->v4l2_dev, "i2c IR TX device register failed\n"); | ||
| 398 | goto reg_fail; | ||
| 399 | } | ||
| 391 | #endif | 400 | #endif |
| 392 | 401 | ||
| 393 | /* let the user know what node this device is now attached to */ | 402 | /* let the user know what node this device is now attached to */ |
| @@ -395,6 +404,10 @@ static int hdpvr_probe(struct usb_interface *interface, | |||
| 395 | video_device_node_name(dev->video_dev)); | 404 | video_device_node_name(dev->video_dev)); |
| 396 | return 0; | 405 | return 0; |
| 397 | 406 | ||
| 407 | reg_fail: | ||
| 408 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) | ||
| 409 | i2c_del_adapter(&dev->i2c_adapter); | ||
| 410 | #endif | ||
| 398 | error: | 411 | error: |
| 399 | if (dev) { | 412 | if (dev) { |
| 400 | /* Destroy single thread */ | 413 | /* Destroy single thread */ |
| @@ -424,6 +437,9 @@ static void hdpvr_disconnect(struct usb_interface *interface) | |||
| 424 | mutex_lock(&dev->io_mutex); | 437 | mutex_lock(&dev->io_mutex); |
| 425 | hdpvr_cancel_queue(dev); | 438 | hdpvr_cancel_queue(dev); |
| 426 | mutex_unlock(&dev->io_mutex); | 439 | mutex_unlock(&dev->io_mutex); |
| 440 | #if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE) | ||
| 441 | i2c_del_adapter(&dev->i2c_adapter); | ||
| 442 | #endif | ||
| 427 | video_unregister_device(dev->video_dev); | 443 | video_unregister_device(dev->video_dev); |
| 428 | atomic_dec(&dev_nr); | 444 | atomic_dec(&dev_nr); |
| 429 | } | 445 | } |
diff --git a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c index 89b71faeaac..e53fa55d56a 100644 --- a/drivers/media/video/hdpvr/hdpvr-i2c.c +++ b/drivers/media/video/hdpvr/hdpvr-i2c.c | |||
| @@ -31,26 +31,34 @@ | |||
| 31 | #define Z8F0811_IR_RX_I2C_ADDR 0x71 | 31 | #define Z8F0811_IR_RX_I2C_ADDR 0x71 |
| 32 | 32 | ||
| 33 | 33 | ||
| 34 | static struct i2c_board_info hdpvr_i2c_board_info = { | 34 | struct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev) |
| 35 | I2C_BOARD_INFO("ir_tx_z8f0811_hdpvr", Z8F0811_IR_TX_I2C_ADDR), | 35 | { |
| 36 | I2C_BOARD_INFO("ir_rx_z8f0811_hdpvr", Z8F0811_IR_RX_I2C_ADDR), | 36 | struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data; |
| 37 | }; | 37 | struct i2c_board_info hdpvr_ir_tx_i2c_board_info = { |
| 38 | I2C_BOARD_INFO("ir_tx_z8f0811_hdpvr", Z8F0811_IR_TX_I2C_ADDR), | ||
| 39 | }; | ||
| 40 | |||
| 41 | init_data->name = "HD-PVR"; | ||
| 42 | hdpvr_ir_tx_i2c_board_info.platform_data = init_data; | ||
| 38 | 43 | ||
| 39 | int hdpvr_register_i2c_ir(struct hdpvr_device *dev) | 44 | return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_tx_i2c_board_info); |
| 45 | } | ||
| 46 | |||
| 47 | struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev) | ||
| 40 | { | 48 | { |
| 41 | struct i2c_client *c; | ||
| 42 | struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data; | 49 | struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data; |
| 50 | struct i2c_board_info hdpvr_ir_rx_i2c_board_info = { | ||
| 51 | I2C_BOARD_INFO("ir_rx_z8f0811_hdpvr", Z8F0811_IR_RX_I2C_ADDR), | ||
| 52 | }; | ||
| 43 | 53 | ||
| 44 | /* Our default information for ir-kbd-i2c.c to use */ | 54 | /* Our default information for ir-kbd-i2c.c to use */ |
| 45 | init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW; | 55 | init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW; |
| 46 | init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | 56 | init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; |
| 47 | init_data->type = RC_TYPE_RC5; | 57 | init_data->type = RC_TYPE_RC5; |
| 48 | init_data->name = "HD PVR"; | 58 | init_data->name = "HD-PVR"; |
| 49 | hdpvr_i2c_board_info.platform_data = init_data; | 59 | hdpvr_ir_rx_i2c_board_info.platform_data = init_data; |
| 50 | |||
| 51 | c = i2c_new_device(&dev->i2c_adapter, &hdpvr_i2c_board_info); | ||
| 52 | 60 | ||
| 53 | return (c == NULL) ? -ENODEV : 0; | 61 | return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_rx_i2c_board_info); |
| 54 | } | 62 | } |
| 55 | 63 | ||
| 56 | static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus, | 64 | static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus, |
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h index ee74e3be9a6..072f23c570f 100644 --- a/drivers/media/video/hdpvr/hdpvr.h +++ b/drivers/media/video/hdpvr/hdpvr.h | |||
| @@ -313,7 +313,8 @@ int hdpvr_cancel_queue(struct hdpvr_device *dev); | |||
| 313 | /* i2c adapter registration */ | 313 | /* i2c adapter registration */ |
| 314 | int hdpvr_register_i2c_adapter(struct hdpvr_device *dev); | 314 | int hdpvr_register_i2c_adapter(struct hdpvr_device *dev); |
| 315 | 315 | ||
| 316 | int hdpvr_register_i2c_ir(struct hdpvr_device *dev); | 316 | struct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev); |
| 317 | struct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev); | ||
| 317 | 318 | ||
| 318 | /*========================================================================*/ | 319 | /*========================================================================*/ |
| 319 | /* buffer management */ | 320 | /* buffer management */ |
diff --git a/drivers/media/video/ir-kbd-i2c.c b/drivers/media/video/ir-kbd-i2c.c index d2b20ad383a..a221ad68b33 100644 --- a/drivers/media/video/ir-kbd-i2c.c +++ b/drivers/media/video/ir-kbd-i2c.c | |||
| @@ -128,6 +128,19 @@ static int get_key_haup(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | |||
| 128 | 128 | ||
| 129 | static int get_key_haup_xvr(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) | 129 | static int get_key_haup_xvr(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) |
| 130 | { | 130 | { |
| 131 | int ret; | ||
| 132 | unsigned char buf[1] = { 0 }; | ||
| 133 | |||
| 134 | /* | ||
| 135 | * This is the same apparent "are you ready?" poll command observed | ||
| 136 | * watching Windows driver traffic and implemented in lirc_zilog. With | ||
| 137 | * this added, we get far saner remote behavior with z8 chips on usb | ||
| 138 | * connected devices, even with the default polling interval of 100ms. | ||
| 139 | */ | ||
| 140 | ret = i2c_master_send(ir->c, buf, 1); | ||
| 141 | if (ret != 1) | ||
| 142 | return (ret < 0) ? ret : -EINVAL; | ||
| 143 | |||
| 131 | return get_key_haup_common (ir, ir_key, ir_raw, 6, 3); | 144 | return get_key_haup_common (ir, ir_key, ir_raw, 6, 3); |
| 132 | } | 145 | } |
| 133 | 146 | ||
diff --git a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c index ccc884948f3..451ecd485f9 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c +++ b/drivers/media/video/pvrusb2/pvrusb2-i2c-core.c | |||
| @@ -597,7 +597,6 @@ static void pvr2_i2c_register_ir(struct pvr2_hdw *hdw) | |||
| 597 | init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; | 597 | init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; |
| 598 | init_data->type = RC_TYPE_RC5; | 598 | init_data->type = RC_TYPE_RC5; |
| 599 | init_data->name = hdw->hdw_desc->description; | 599 | init_data->name = hdw->hdw_desc->description; |
| 600 | init_data->polling_interval = 260; /* ms From lirc_zilog */ | ||
| 601 | /* IR Receiver */ | 600 | /* IR Receiver */ |
| 602 | info.addr = 0x71; | 601 | info.addr = 0x71; |
| 603 | info.platform_data = init_data; | 602 | info.platform_data = init_data; |
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c index f35459d1f42..0db90922ee9 100644 --- a/drivers/media/video/saa7115.c +++ b/drivers/media/video/saa7115.c | |||
| @@ -1565,7 +1565,7 @@ static int saa711x_probe(struct i2c_client *client, | |||
| 1565 | chip_id = name[5]; | 1565 | chip_id = name[5]; |
| 1566 | 1566 | ||
| 1567 | /* Check whether this chip is part of the saa711x series */ | 1567 | /* Check whether this chip is part of the saa711x series */ |
| 1568 | if (memcmp(name, "1f711", 5)) { | 1568 | if (memcmp(name + 1, "f711", 4)) { |
| 1569 | v4l_dbg(1, debug, client, "chip found @ 0x%x (ID %s) does not match a known saa711x chip.\n", | 1569 | v4l_dbg(1, debug, client, "chip found @ 0x%x (ID %s) does not match a known saa711x chip.\n", |
| 1570 | client->addr << 1, name); | 1570 | client->addr << 1, name); |
| 1571 | return -ENODEV; | 1571 | return -ENODEV; |
diff --git a/drivers/staging/lirc/lirc_zilog.c b/drivers/staging/lirc/lirc_zilog.c index 3fe5f416019..0aad0d7a74a 100644 --- a/drivers/staging/lirc/lirc_zilog.c +++ b/drivers/staging/lirc/lirc_zilog.c | |||
| @@ -495,7 +495,7 @@ static int send_data_block(struct IR_tx *tx, unsigned char *data_block) | |||
| 495 | /* send boot data to the IR TX device */ | 495 | /* send boot data to the IR TX device */ |
| 496 | static int send_boot_data(struct IR_tx *tx) | 496 | static int send_boot_data(struct IR_tx *tx) |
| 497 | { | 497 | { |
| 498 | int ret; | 498 | int ret, i; |
| 499 | unsigned char buf[4]; | 499 | unsigned char buf[4]; |
| 500 | 500 | ||
| 501 | /* send the boot block */ | 501 | /* send the boot block */ |
| @@ -503,7 +503,7 @@ static int send_boot_data(struct IR_tx *tx) | |||
| 503 | if (ret != 0) | 503 | if (ret != 0) |
| 504 | return ret; | 504 | return ret; |
| 505 | 505 | ||
| 506 | /* kick it off? */ | 506 | /* Hit the go button to activate the new boot data */ |
| 507 | buf[0] = 0x00; | 507 | buf[0] = 0x00; |
| 508 | buf[1] = 0x20; | 508 | buf[1] = 0x20; |
| 509 | ret = i2c_master_send(tx->c, buf, 2); | 509 | ret = i2c_master_send(tx->c, buf, 2); |
| @@ -511,7 +511,19 @@ static int send_boot_data(struct IR_tx *tx) | |||
| 511 | zilog_error("i2c_master_send failed with %d\n", ret); | 511 | zilog_error("i2c_master_send failed with %d\n", ret); |
| 512 | return ret < 0 ? ret : -EFAULT; | 512 | return ret < 0 ? ret : -EFAULT; |
| 513 | } | 513 | } |
| 514 | ret = i2c_master_send(tx->c, buf, 1); | 514 | |
| 515 | /* | ||
| 516 | * Wait for zilog to settle after hitting go post boot block upload. | ||
| 517 | * Without this delay, the HD-PVR and HVR-1950 both return an -EIO | ||
| 518 | * upon attempting to get firmware revision, and tx probe thus fails. | ||
| 519 | */ | ||
| 520 | for (i = 0; i < 10; i++) { | ||
| 521 | ret = i2c_master_send(tx->c, buf, 1); | ||
| 522 | if (ret == 1) | ||
| 523 | break; | ||
| 524 | udelay(100); | ||
| 525 | } | ||
| 526 | |||
| 515 | if (ret != 1) { | 527 | if (ret != 1) { |
| 516 | zilog_error("i2c_master_send failed with %d\n", ret); | 528 | zilog_error("i2c_master_send failed with %d\n", ret); |
| 517 | return ret < 0 ? ret : -EFAULT; | 529 | return ret < 0 ? ret : -EFAULT; |
| @@ -523,8 +535,8 @@ static int send_boot_data(struct IR_tx *tx) | |||
| 523 | zilog_error("i2c_master_recv failed with %d\n", ret); | 535 | zilog_error("i2c_master_recv failed with %d\n", ret); |
| 524 | return 0; | 536 | return 0; |
| 525 | } | 537 | } |
| 526 | if (buf[0] != 0x80) { | 538 | if ((buf[0] != 0x80) && (buf[0] != 0xa0)) { |
| 527 | zilog_error("unexpected IR TX response: %02x\n", buf[0]); | 539 | zilog_error("unexpected IR TX init response: %02x\n", buf[0]); |
| 528 | return 0; | 540 | return 0; |
| 529 | } | 541 | } |
| 530 | zilog_notify("Zilog/Hauppauge IR blaster firmware version " | 542 | zilog_notify("Zilog/Hauppauge IR blaster firmware version " |
| @@ -827,7 +839,15 @@ static int send_code(struct IR_tx *tx, unsigned int code, unsigned int key) | |||
| 827 | zilog_error("i2c_master_send failed with %d\n", ret); | 839 | zilog_error("i2c_master_send failed with %d\n", ret); |
| 828 | return ret < 0 ? ret : -EFAULT; | 840 | return ret < 0 ? ret : -EFAULT; |
| 829 | } | 841 | } |
| 830 | ret = i2c_master_send(tx->c, buf, 1); | 842 | |
| 843 | /* Give the z8 a moment to process data block */ | ||
| 844 | for (i = 0; i < 10; i++) { | ||
| 845 | ret = i2c_master_send(tx->c, buf, 1); | ||
| 846 | if (ret == 1) | ||
| 847 | break; | ||
| 848 | udelay(100); | ||
| 849 | } | ||
| 850 | |||
| 831 | if (ret != 1) { | 851 | if (ret != 1) { |
| 832 | zilog_error("i2c_master_send failed with %d\n", ret); | 852 | zilog_error("i2c_master_send failed with %d\n", ret); |
| 833 | return ret < 0 ? ret : -EFAULT; | 853 | return ret < 0 ? ret : -EFAULT; |
