Skip to content

Commit 0d81514

Browse files
committed
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: (25 commits) em28xx: remove backward compat macro added on a previous fix V4L/DVB (9748): em28xx: fix compile warning V4L/DVB (9743): em28xx: fix oops audio V4L/DVB (9742): em28xx-alsa: implement another locking schema V4L/DVB (9732): sms1xxx: use new firmware for Hauppauge WinTV MiniStick V4L/DVB (9691): gspca: Move the video device to a separate area. V4L/DVB (9690): gspca: Lock the subdrivers via module_get/put. V4L/DVB (9689): gspca: Memory leak when disconnect while streaming. V4L/DVB (9668): em28xx: fix a race condition with hald V4L/DVB (9664): af9015: don't reconnect device in USB-bus V4L/DVB (9647): em28xx: void having two concurrent control URB's V4L/DVB (9646): em28xx: avoid allocating/dealocating memory on every control urb V4L/DVB (9645): em28xx: Avoid memory leaks if registration fails V4L/DVB (9639): Make dib0700 remote control support work with firmware v1.20 V4L/DVB (9635): v4l: s2255drv fix firmware test on big-endian V4L/DVB (9634): Make sure the i2c gate is open before powering down tuner V4L/DVB (9632): make em28xx aux audio input work V4L/DVB (9631): Make s2api work for ATSC support V4L/DVB (9627): em28xx: Avoid i2c register error for boards without eeprom V4L/DVB (9608): Fix section mismatch warning for dm1105 during make ...
2 parents 9c84ba4 + a693b0c commit 0d81514

26 files changed

+410
-149
lines changed

drivers/media/dvb/dm1105/dm1105.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ static void dm1105dvb_dma_unmap(struct dm1105dvb *dm1105dvb)
376376
pci_free_consistent(dm1105dvb->pdev, 6*DM1105_DMA_BYTES, dm1105dvb->ts_buf, dm1105dvb->dma_addr);
377377
}
378378

379-
static void __devinit dm1105dvb_enable_irqs(struct dm1105dvb *dm1105dvb)
379+
static void dm1105dvb_enable_irqs(struct dm1105dvb *dm1105dvb)
380380
{
381381
outb(INTMAK_ALLMASK, dm_io_mem(DM1105_INTMAK));
382382
outb(1, dm_io_mem(DM1105_CR));

drivers/media/dvb/dvb-core/dvb_frontend.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,8 @@ static int dvb_frontend_thread(void *data)
585585
if (fe->ops.set_voltage)
586586
fe->ops.set_voltage(fe, SEC_VOLTAGE_OFF);
587587
if (fe->ops.tuner_ops.sleep) {
588+
if (fe->ops.i2c_gate_ctrl)
589+
fe->ops.i2c_gate_ctrl(fe, 1);
588590
fe->ops.tuner_ops.sleep(fe);
589591
if (fe->ops.i2c_gate_ctrl)
590592
fe->ops.i2c_gate_ctrl(fe, 0);
@@ -934,7 +936,8 @@ void dtv_property_dump(struct dtv_property *tvp)
934936
int is_legacy_delivery_system(fe_delivery_system_t s)
935937
{
936938
if((s == SYS_UNDEFINED) || (s == SYS_DVBC_ANNEX_AC) ||
937-
(s == SYS_DVBC_ANNEX_B) || (s == SYS_DVBT) || (s == SYS_DVBS))
939+
(s == SYS_DVBC_ANNEX_B) || (s == SYS_DVBT) || (s == SYS_DVBS) ||
940+
(s == SYS_ATSC))
938941
return 1;
939942

940943
return 0;

drivers/media/dvb/dvb-usb/af9015.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -681,12 +681,6 @@ static int af9015_download_firmware(struct usb_device *udev,
681681
goto error;
682682
}
683683

684-
/* firmware is running, reconnect device in the usb bus */
685-
req.cmd = RECONNECT_USB;
686-
ret = af9015_rw_udev(udev, &req);
687-
if (ret)
688-
err("reconnect failed: %d", ret);
689-
690684
error:
691685
return ret;
692686
}
@@ -1208,6 +1202,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
12081202
.usb_ctrl = DEVICE_SPECIFIC,
12091203
.download_firmware = af9015_download_firmware,
12101204
.firmware = "dvb-usb-af9015.fw",
1205+
.no_reconnect = 1,
12111206

12121207
.size_of_priv = sizeof(struct af9015_state), \
12131208

@@ -1306,6 +1301,7 @@ static struct dvb_usb_device_properties af9015_properties[] = {
13061301
.usb_ctrl = DEVICE_SPECIFIC,
13071302
.download_firmware = af9015_download_firmware,
13081303
.firmware = "dvb-usb-af9015.fw",
1304+
.no_reconnect = 1,
13091305

13101306
.size_of_priv = sizeof(struct af9015_state), \
13111307

drivers/media/dvb/dvb-usb/dib0700.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ extern int dvb_usb_dib0700_debug;
2222

2323
#define REQUEST_I2C_READ 0x2
2424
#define REQUEST_I2C_WRITE 0x3
25-
#define REQUEST_POLL_RC 0x4
25+
#define REQUEST_POLL_RC 0x4 /* deprecated in firmware v1.20 */
2626
#define REQUEST_JUMPRAM 0x8
2727
#define REQUEST_SET_CLOCK 0xB
2828
#define REQUEST_SET_GPIO 0xC
@@ -40,11 +40,14 @@ struct dib0700_state {
4040
u16 mt2060_if1[2];
4141
u8 rc_toggle;
4242
u8 rc_counter;
43+
u8 rc_func_version;
4344
u8 is_dib7000pc;
4445
u8 fw_use_new_i2c_api;
4546
u8 disable_streaming_master_mode;
4647
};
4748

49+
extern int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
50+
u32 *romversion, u32 *ramversion, u32 *fwtype);
4851
extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val);
4952
extern int dib0700_ctrl_clock(struct dvb_usb_device *d, u32 clk_MHz, u8 clock_out_gp3);
5053
extern int dib0700_ctrl_rd(struct dvb_usb_device *d, u8 *tx, u8 txlen, u8 *rx, u8 rxlen);

drivers/media/dvb/dvb-usb/dib0700_core.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,22 @@ MODULE_PARM_DESC(dvb_usb_dib0700_ir_proto, "set ir protocol (0=NEC, 1=RC5 (defau
1919

2020
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
2121

22+
23+
int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion,
24+
u32 *romversion, u32 *ramversion, u32 *fwtype)
25+
{
26+
u8 b[16];
27+
int ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0),
28+
REQUEST_GET_VERSION,
29+
USB_TYPE_VENDOR | USB_DIR_IN, 0, 0,
30+
b, sizeof(b), USB_CTRL_GET_TIMEOUT);
31+
*hwversion = (b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3];
32+
*romversion = (b[4] << 24) | (b[5] << 16) | (b[6] << 8) | b[7];
33+
*ramversion = (b[8] << 24) | (b[9] << 16) | (b[10] << 8) | b[11];
34+
*fwtype = (b[12] << 24) | (b[13] << 16) | (b[14] << 8) | b[15];
35+
return ret;
36+
}
37+
2238
/* expecting rx buffer: request data[0] data[1] ... data[2] */
2339
static int dib0700_ctrl_wr(struct dvb_usb_device *d, u8 *tx, u8 txlen)
2440
{

drivers/media/dvb/dvb-usb/dib0700_devices.c

Lines changed: 138 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ static struct mt2060_config bristol_mt2060_config[2] = {
3838
}
3939
};
4040

41+
4142
static struct dibx000_agc_config bristol_dib3000p_mt2060_agc_config = {
4243
.band_caps = BAND_VHF | BAND_UHF,
4344
.setup = (1 << 8) | (5 << 5) | (0 << 4) | (0 << 3) | (0 << 2) | (2 << 0),
@@ -451,8 +452,13 @@ static u8 rc_request[] = { REQUEST_POLL_RC, 0 };
451452

452453
/* Number of keypresses to ignore before start repeating */
453454
#define RC_REPEAT_DELAY 2
455+
#define RC_REPEAT_DELAY_V1_20 5
454456

455-
static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
457+
458+
459+
/* Used by firmware versions < 1.20 (deprecated) */
460+
static int dib0700_rc_query_legacy(struct dvb_usb_device *d, u32 *event,
461+
int *state)
456462
{
457463
u8 key[4];
458464
int i;
@@ -529,6 +535,137 @@ static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
529535
return 0;
530536
}
531537

538+
/* This is the structure of the RC response packet starting in firmware 1.20 */
539+
struct dib0700_rc_response {
540+
u8 report_id;
541+
u8 data_state;
542+
u8 system_msb;
543+
u8 system_lsb;
544+
u8 data;
545+
u8 not_data;
546+
};
547+
548+
/* This supports the new IR response format for firmware v1.20 */
549+
static int dib0700_rc_query_v1_20(struct dvb_usb_device *d, u32 *event,
550+
int *state)
551+
{
552+
struct dvb_usb_rc_key *keymap = d->props.rc_key_map;
553+
struct dib0700_state *st = d->priv;
554+
struct dib0700_rc_response poll_reply;
555+
u8 buf[6];
556+
int i;
557+
int status;
558+
int actlen;
559+
int found = 0;
560+
561+
/* Set initial results in case we exit the function early */
562+
*event = 0;
563+
*state = REMOTE_NO_KEY_PRESSED;
564+
565+
/* Firmware v1.20 provides RC data via bulk endpoint 1 */
566+
status = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, 1), buf,
567+
sizeof(buf), &actlen, 50);
568+
if (status < 0) {
569+
/* No data available (meaning no key press) */
570+
return 0;
571+
}
572+
573+
if (actlen != sizeof(buf)) {
574+
/* We didn't get back the 6 byte message we expected */
575+
err("Unexpected RC response size [%d]", actlen);
576+
return -1;
577+
}
578+
579+
poll_reply.report_id = buf[0];
580+
poll_reply.data_state = buf[1];
581+
poll_reply.system_msb = buf[2];
582+
poll_reply.system_lsb = buf[3];
583+
poll_reply.data = buf[4];
584+
poll_reply.not_data = buf[5];
585+
586+
/*
587+
info("rid=%02x ds=%02x sm=%02x sl=%02x d=%02x nd=%02x\n",
588+
poll_reply.report_id, poll_reply.data_state,
589+
poll_reply.system_msb, poll_reply.system_lsb,
590+
poll_reply.data, poll_reply.not_data);
591+
*/
592+
593+
if ((poll_reply.data + poll_reply.not_data) != 0xff) {
594+
/* Key failed integrity check */
595+
err("key failed integrity check: %02x %02x %02x %02x",
596+
poll_reply.system_msb, poll_reply.system_lsb,
597+
poll_reply.data, poll_reply.not_data);
598+
return -1;
599+
}
600+
601+
/* Find the key in the map */
602+
for (i = 0; i < d->props.rc_key_map_size; i++) {
603+
if (keymap[i].custom == poll_reply.system_lsb &&
604+
keymap[i].data == poll_reply.data) {
605+
*event = keymap[i].event;
606+
found = 1;
607+
break;
608+
}
609+
}
610+
611+
if (found == 0) {
612+
err("Unknown remote controller key: %02x %02x %02x %02x",
613+
poll_reply.system_msb, poll_reply.system_lsb,
614+
poll_reply.data, poll_reply.not_data);
615+
d->last_event = 0;
616+
return 0;
617+
}
618+
619+
if (poll_reply.data_state == 1) {
620+
/* New key hit */
621+
st->rc_counter = 0;
622+
*event = keymap[i].event;
623+
*state = REMOTE_KEY_PRESSED;
624+
d->last_event = keymap[i].event;
625+
} else if (poll_reply.data_state == 2) {
626+
/* Key repeated */
627+
st->rc_counter++;
628+
629+
/* prevents unwanted double hits */
630+
if (st->rc_counter > RC_REPEAT_DELAY_V1_20) {
631+
*event = d->last_event;
632+
*state = REMOTE_KEY_PRESSED;
633+
st->rc_counter = RC_REPEAT_DELAY_V1_20;
634+
}
635+
} else {
636+
err("Unknown data state [%d]", poll_reply.data_state);
637+
}
638+
639+
return 0;
640+
}
641+
642+
static int dib0700_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
643+
{
644+
struct dib0700_state *st = d->priv;
645+
646+
/* Because some people may have improperly named firmware files,
647+
let's figure out whether to use the new firmware call or the legacy
648+
call based on the firmware version embedded in the file */
649+
if (st->rc_func_version == 0) {
650+
u32 hwver, romver, ramver, fwtype;
651+
int ret = dib0700_get_version(d, &hwver, &romver, &ramver,
652+
&fwtype);
653+
if (ret < 0) {
654+
err("Could not determine version info");
655+
return -1;
656+
}
657+
if (ramver < 0x10200)
658+
st->rc_func_version = 1;
659+
else
660+
st->rc_func_version = 2;
661+
}
662+
663+
if (st->rc_func_version == 2)
664+
return dib0700_rc_query_v1_20(d, event, state);
665+
else
666+
return dib0700_rc_query_legacy(d, event, state);
667+
}
668+
532669
static struct dvb_usb_rc_key dib0700_rc_keys[] = {
533670
/* Key codes for the tiny Pinnacle remote*/
534671
{ 0x07, 0x00, KEY_MUTE },

drivers/media/dvb/dvb-usb/usb-urb.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,17 +135,21 @@ stream->buf_list[stream->buf_num], (long long)stream->dma_addr[stream->buf_num])
135135

136136
static int usb_bulk_urb_init(struct usb_data_stream *stream)
137137
{
138-
int i;
138+
int i, j;
139139

140140
if ((i = usb_allocate_stream_buffers(stream,stream->props.count,
141141
stream->props.u.bulk.buffersize)) < 0)
142142
return i;
143143

144144
/* allocate the URBs */
145145
for (i = 0; i < stream->props.count; i++) {
146-
if ((stream->urb_list[i] = usb_alloc_urb(0,GFP_ATOMIC)) == NULL)
146+
stream->urb_list[i] = usb_alloc_urb(0, GFP_ATOMIC);
147+
if (!stream->urb_list[i]) {
148+
deb_mem("not enough memory for urb_alloc_urb!.\n");
149+
for (j = 0; j < i; j++)
150+
usb_free_urb(stream->urb_list[i]);
147151
return -ENOMEM;
148-
152+
}
149153
usb_fill_bulk_urb( stream->urb_list[i], stream->udev,
150154
usb_rcvbulkpipe(stream->udev,stream->props.endpoint),
151155
stream->buf_list[i],
@@ -170,9 +174,14 @@ static int usb_isoc_urb_init(struct usb_data_stream *stream)
170174
for (i = 0; i < stream->props.count; i++) {
171175
struct urb *urb;
172176
int frame_offset = 0;
173-
if ((stream->urb_list[i] =
174-
usb_alloc_urb(stream->props.u.isoc.framesperurb,GFP_ATOMIC)) == NULL)
177+
178+
stream->urb_list[i] = usb_alloc_urb(stream->props.u.isoc.framesperurb, GFP_ATOMIC);
179+
if (!stream->urb_list[i]) {
180+
deb_mem("not enough memory for urb_alloc_urb!\n");
181+
for (j = 0; j < i; j++)
182+
usb_free_urb(stream->urb_list[i]);
175183
return -ENOMEM;
184+
}
176185

177186
urb = stream->urb_list[i];
178187

drivers/media/dvb/siano/sms-cards.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ static struct sms_board sms_boards[] = {
9595
[SMS1XXX_BOARD_HAUPPAUGE_WINDHAM] = {
9696
.name = "Hauppauge WinTV MiniStick",
9797
.type = SMS_NOVA_B0,
98-
.fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-01.fw",
98+
.fw[DEVICE_MODE_DVBT_BDA] = "sms1xxx-hcw-55xxx-dvbt-02.fw",
9999
},
100100
};
101101

drivers/media/dvb/ttusb-budget/dvb-ttusb-budget.c

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -808,6 +808,12 @@ static int ttusb_alloc_iso_urbs(struct ttusb *ttusb)
808808
ISO_BUF_COUNT,
809809
&ttusb->iso_dma_handle);
810810

811+
if (!ttusb->iso_buffer) {
812+
dprintk("%s: pci_alloc_consistent - not enough memory\n",
813+
__func__);
814+
return -ENOMEM;
815+
}
816+
811817
memset(ttusb->iso_buffer, 0,
812818
ISO_FRAME_SIZE * FRAMES_PER_ISO_BUF * ISO_BUF_COUNT);
813819

@@ -1659,7 +1665,14 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i
16591665

16601666
ttusb_setup_interfaces(ttusb);
16611667

1662-
ttusb_alloc_iso_urbs(ttusb);
1668+
result = ttusb_alloc_iso_urbs(ttusb);
1669+
if (result < 0) {
1670+
dprintk("%s: ttusb_alloc_iso_urbs - failed\n", __func__);
1671+
mutex_unlock(&ttusb->semi2c);
1672+
kfree(ttusb);
1673+
return result;
1674+
}
1675+
16631676
if (ttusb_init_controller(ttusb))
16641677
printk("ttusb_init_controller: error\n");
16651678

drivers/media/dvb/ttusb-dec/ttusb_dec.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,6 +1157,12 @@ static int ttusb_dec_alloc_iso_urbs(struct ttusb_dec *dec)
11571157
ISO_BUF_COUNT),
11581158
&dec->iso_dma_handle);
11591159

1160+
if (!dec->iso_buffer) {
1161+
dprintk("%s: pci_alloc_consistent - not enough memory\n",
1162+
__func__);
1163+
return -ENOMEM;
1164+
}
1165+
11601166
memset(dec->iso_buffer, 0,
11611167
ISO_FRAME_SIZE * (FRAMES_PER_ISO_BUF * ISO_BUF_COUNT));
11621168

@@ -1254,6 +1260,7 @@ static int ttusb_dec_init_usb(struct ttusb_dec *dec)
12541260
dec->irq_buffer = usb_buffer_alloc(dec->udev,IRQ_PACKET_SIZE,
12551261
GFP_ATOMIC, &dec->irq_dma_handle);
12561262
if(!dec->irq_buffer) {
1263+
usb_free_urb(dec->irq_urb);
12571264
return -ENOMEM;
12581265
}
12591266
usb_fill_int_urb(dec->irq_urb, dec->udev,dec->irq_pipe,

0 commit comments

Comments
 (0)