aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media
diff options
context:
space:
mode:
authorDevin Heitmueller <dheitmueller@kernellabs.com>2010-03-13 14:40:46 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-05-19 11:59:06 -0400
commitfdafc96c9162bdc58192a400bad5b850e185977d (patch)
tree809dc24d1d4f7a25ce4700a08e50135217478f4d /drivers/media
parent668293a06e3866a3aaa60c523ba4f8f19bfddba1 (diff)
V4L/DVB: ngene: properly support boards where channel 0 isn't a TS input
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>
Diffstat (limited to 'drivers/media')
-rw-r--r--drivers/media/dvb/ngene/ngene-core.c7
-rw-r--r--drivers/media/dvb/ngene/ngene.h1
2 files changed, 6 insertions, 2 deletions
diff --git a/drivers/media/dvb/ngene/ngene-core.c b/drivers/media/dvb/ngene/ngene-core.c
index c8c997059c40..34eaedf65eea 100644
--- a/drivers/media/dvb/ngene/ngene-core.c
+++ b/drivers/media/dvb/ngene/ngene-core.c
@@ -1750,7 +1750,7 @@ static int init_channel(struct ngene_channel *chan)
1750 if (io & (NGENE_IO_TSIN | NGENE_IO_TSOUT)) { 1750 if (io & (NGENE_IO_TSIN | NGENE_IO_TSOUT)) {
1751 if (nr >= STREAM_AUDIOIN1) 1751 if (nr >= STREAM_AUDIOIN1)
1752 chan->DataFormatFlags = DF_SWAP32; 1752 chan->DataFormatFlags = DF_SWAP32;
1753 if (nr == 0 || !one_adapter) { 1753 if (nr == 0 || !one_adapter || dev->first_adapter == NULL) {
1754 adapter = &dev->adapter[nr]; 1754 adapter = &dev->adapter[nr];
1755 ret = dvb_register_adapter(adapter, "nGene", 1755 ret = dvb_register_adapter(adapter, "nGene",
1756 THIS_MODULE, 1756 THIS_MODULE,
@@ -1758,8 +1758,10 @@ static int init_channel(struct ngene_channel *chan)
1758 adapter_nr); 1758 adapter_nr);
1759 if (ret < 0) 1759 if (ret < 0)
1760 return ret; 1760 return ret;
1761 if (dev->first_adapter == NULL)
1762 dev->first_adapter = adapter;
1761 } else { 1763 } else {
1762 adapter = &dev->adapter[0]; 1764 adapter = dev->first_adapter;
1763 } 1765 }
1764 1766
1765 ret = my_dvb_dmx_ts_card_init(dvbdemux, "SW demux", 1767 ret = my_dvb_dmx_ts_card_init(dvbdemux, "SW demux",
@@ -1796,6 +1798,7 @@ static int init_channels(struct ngene *dev)
1796 int i, j; 1798 int i, j;
1797 1799
1798 for (i = 0; i < MAX_STREAM; i++) { 1800 for (i = 0; i < MAX_STREAM; i++) {
1801 dev->channel[i].number = i;
1799 if (init_channel(&dev->channel[i]) < 0) { 1802 if (init_channel(&dev->channel[i]) < 0) {
1800 for (j = i - 1; j >= 0; j--) 1803 for (j = i - 1; j >= 0; j--)
1801 release_channel(&dev->channel[j]); 1804 release_channel(&dev->channel[j]);
diff --git a/drivers/media/dvb/ngene/ngene.h b/drivers/media/dvb/ngene/ngene.h
index a7eb29846310..ca3af5c6238f 100644
--- a/drivers/media/dvb/ngene/ngene.h
+++ b/drivers/media/dvb/ngene/ngene.h
@@ -752,6 +752,7 @@ struct ngene {
752 spinlock_t cmd_lock; 752 spinlock_t cmd_lock;
753 753
754 struct dvb_adapter adapter[MAX_STREAM]; 754 struct dvb_adapter adapter[MAX_STREAM];
755 struct dvb_adapter *first_adapter; /* "one_adapter" modprobe opt */
755 struct ngene_channel channel[MAX_STREAM]; 756 struct ngene_channel channel[MAX_STREAM];
756 757
757 struct ngene_info *card_info; 758 struct ngene_info *card_info;