V4L/DVB: ngene: properly support boards where channel 0 isn't a TS input
authorDevin Heitmueller <dheitmueller@kernellabs.com>
Sat, 13 Mar 2010 19:40:46 +0000 (16:40 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 19 May 2010 15:59:06 +0000 (12:59 -0300)
The current code assumes that channel zero is always a TS input, which would
result in an oops if the "one_adapter" modprobe option is 1 (which it is by
default) and the board in question has something else on channel zero (which
is the case for the Avermedia m780, which has it's analog input wired to UVI1)

The code now explicitly tracks the first adapter created and ensures that
other channels cannot accidentially be associated with a NULL adapter.

Also, eliminate what appears to be a typo where all of the channel parameters
are getting associated with stream zero's properties, which will work if you
happen to have a dual stream board with the exact same configuration, but if
they differ then the second stream is going to end up with the first stream's
configuration.

Signed-off-by: Devin Heitmueller <dheitmueller@kernellabs.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/ngene/ngene-core.c
drivers/media/dvb/ngene/ngene.h

index c8c997059c403527d28561c6fa1ab650be3fb91b..34eaedf65eea4538f0bcbe93beb59c18cf8c5b58 100644 (file)
@@ -1750,7 +1750,7 @@ static int init_channel(struct ngene_channel *chan)
        if (io & (NGENE_IO_TSIN | NGENE_IO_TSOUT)) {
                if (nr >= STREAM_AUDIOIN1)
                        chan->DataFormatFlags = DF_SWAP32;
-               if (nr == 0 || !one_adapter) {
+               if (nr == 0 || !one_adapter || dev->first_adapter == NULL) {
                        adapter = &dev->adapter[nr];
                        ret = dvb_register_adapter(adapter, "nGene",
                                                   THIS_MODULE,
@@ -1758,8 +1758,10 @@ static int init_channel(struct ngene_channel *chan)
                                                   adapter_nr);
                        if (ret < 0)
                                return ret;
+                       if (dev->first_adapter == NULL)
+                               dev->first_adapter = adapter;
                } else {
-                       adapter = &dev->adapter[0];
+                       adapter = dev->first_adapter;
                }
 
                ret = my_dvb_dmx_ts_card_init(dvbdemux, "SW demux",
@@ -1796,6 +1798,7 @@ static int init_channels(struct ngene *dev)
        int i, j;
 
        for (i = 0; i < MAX_STREAM; i++) {
+               dev->channel[i].number = i;
                if (init_channel(&dev->channel[i]) < 0) {
                        for (j = i - 1; j >= 0; j--)
                                release_channel(&dev->channel[j]);
index a7eb29846310187e63bc0df39747361cae9fffa5..ca3af5c6238fb786c6ba03ac3891a0dc51191ee2 100644 (file)
@@ -752,6 +752,7 @@ struct ngene {
        spinlock_t            cmd_lock;
 
        struct dvb_adapter    adapter[MAX_STREAM];
+       struct dvb_adapter    *first_adapter; /* "one_adapter" modprobe opt */
        struct ngene_channel  channel[MAX_STREAM];
 
        struct ngene_info    *card_info;