diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-04 13:30:07 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-04 13:30:07 -0400 |
| commit | ab8e823515305a93715e71b81efcbe27c6ce0f59 (patch) | |
| tree | eb812c3886727e23feff7e275e3a7c7cbdd56f2f | |
| parent | 4d5e392c33820dc8861423bb1b8dae205ea0ad3d (diff) | |
| parent | e1634208b77872ac0884da6d92f0d46f9a61eaa7 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb
* master.kernel.org:/pub/scm/linux/kernel/git/mchehab/v4l-dvb:
V4L/DVB (4712): Fix warning when compiling on x86_i64
V4L/DVB (4711): Radio: No need to return void
V4L/DVB (4708): Add tveeprom support for Philips FM1236/FM1216ME MK5
V4L/DVB (4707): 4linux: complete conversion to hotplug safe PCI API
V4L/DVB (4706): Do not enable VIDEO_V4L2 unconditionally
V4L/DVB (4704): SAA713x: fixed compile warning in SECAM fixup
V4L/DVB (4703): Add support for the ASUS EUROPA2 OEM board
V4L/DVB (4702): Fix: set antenna input for DVB-T for Asus P7131 Dual hybrid
V4L/DVB (4701): Saa713x audio fixes
V4L/DVB (4676a): Remove Kconfig item for DiB7000M support
| -rw-r--r-- | Documentation/video4linux/CARDLIST.saa7134 | 1 | ||||
| -rw-r--r-- | drivers/media/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/media/dvb/dvb-usb/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/media/dvb/dvb-usb/usb-urb.c | 5 | ||||
| -rw-r--r-- | drivers/media/radio/radio-gemtek-pci.c | 2 | ||||
| -rw-r--r-- | drivers/media/video/saa7134/saa7134-cards.c | 35 | ||||
| -rw-r--r-- | drivers/media/video/saa7134/saa7134-dvb.c | 44 | ||||
| -rw-r--r-- | drivers/media/video/saa7134/saa7134-tvaudio.c | 93 | ||||
| -rw-r--r-- | drivers/media/video/saa7134/saa7134-video.c | 60 | ||||
| -rw-r--r-- | drivers/media/video/saa7134/saa7134.h | 2 | ||||
| -rw-r--r-- | drivers/media/video/tveeprom.c | 4 | ||||
| -rw-r--r-- | drivers/media/video/zoran_card.c | 10 | ||||
| -rw-r--r-- | drivers/media/video/zr36120.c | 21 |
13 files changed, 202 insertions, 77 deletions
diff --git a/Documentation/video4linux/CARDLIST.saa7134 b/Documentation/video4linux/CARDLIST.saa7134 index 6fb82ac3bef0..53ce6a39083c 100644 --- a/Documentation/video4linux/CARDLIST.saa7134 +++ b/Documentation/video4linux/CARDLIST.saa7134 | |||
| @@ -98,3 +98,4 @@ | |||
| 98 | 97 -> LifeView FlyDVB-S /Acorp TV134DS [5168:0300,4e42:0300] | 98 | 97 -> LifeView FlyDVB-S /Acorp TV134DS [5168:0300,4e42:0300] |
| 99 | 98 -> Proteus Pro 2309 [0919:2003] | 99 | 98 -> Proteus Pro 2309 [0919:2003] |
| 100 | 99 -> AVerMedia TV Hybrid A16AR [1461:2c00] | 100 | 99 -> AVerMedia TV Hybrid A16AR [1461:2c00] |
| 101 | 100 -> Asus Europa2 OEM [1043:4860] | ||
diff --git a/drivers/media/Kconfig b/drivers/media/Kconfig index ed4aa4e7912c..9f7e1fe8c97e 100644 --- a/drivers/media/Kconfig +++ b/drivers/media/Kconfig | |||
| @@ -54,6 +54,7 @@ config VIDEO_V4L1_COMPAT | |||
| 54 | 54 | ||
| 55 | config VIDEO_V4L2 | 55 | config VIDEO_V4L2 |
| 56 | bool | 56 | bool |
| 57 | depends on VIDEO_DEV | ||
| 57 | default y | 58 | default y |
| 58 | 59 | ||
| 59 | source "drivers/media/video/Kconfig" | 60 | source "drivers/media/video/Kconfig" |
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index 67cefdd2334a..2cc5caa26a0a 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
| @@ -69,7 +69,6 @@ config DVB_USB_DIBUSB_MC | |||
| 69 | config DVB_USB_DIB0700 | 69 | config DVB_USB_DIB0700 |
| 70 | tristate "DiBcom DiB0700 USB DVB devices (see help for supported devices)" | 70 | tristate "DiBcom DiB0700 USB DVB devices (see help for supported devices)" |
| 71 | depends on DVB_USB | 71 | depends on DVB_USB |
| 72 | select DVB_DIB7000M | ||
| 73 | select DVB_DIB3000MC | 72 | select DVB_DIB3000MC |
| 74 | select DVB_TUNER_MT2060 | 73 | select DVB_TUNER_MT2060 |
| 75 | help | 74 | help |
diff --git a/drivers/media/dvb/dvb-usb/usb-urb.c b/drivers/media/dvb/dvb-usb/usb-urb.c index 8728cf347a71..572b2d9aa66a 100644 --- a/drivers/media/dvb/dvb-usb/usb-urb.c +++ b/drivers/media/dvb/dvb-usb/usb-urb.c | |||
| @@ -122,8 +122,9 @@ static int usb_allocate_stream_buffers(struct usb_data_stream *stream, int num, | |||
| 122 | usb_free_stream_buffers(stream); | 122 | usb_free_stream_buffers(stream); |
| 123 | return -ENOMEM; | 123 | return -ENOMEM; |
| 124 | } | 124 | } |
| 125 | deb_mem("buffer %d: %p (dma: %u)\n", | 125 | deb_mem("buffer %d: %p (dma: %Lu)\n", |
| 126 | stream->buf_num, stream->buf_list[stream->buf_num], stream->dma_addr[stream->buf_num]); | 126 | stream->buf_num, |
| 127 | stream->buf_list[stream->buf_num], (long long)stream->dma_addr[stream->buf_num]); | ||
| 127 | memset(stream->buf_list[stream->buf_num],0,size); | 128 | memset(stream->buf_list[stream->buf_num],0,size); |
| 128 | stream->state |= USB_STATE_URB_BUF; | 129 | stream->state |= USB_STATE_URB_BUF; |
| 129 | } | 130 | } |
diff --git a/drivers/media/radio/radio-gemtek-pci.c b/drivers/media/radio/radio-gemtek-pci.c index cfab57d6bc4a..eb14106f66fa 100644 --- a/drivers/media/radio/radio-gemtek-pci.c +++ b/drivers/media/radio/radio-gemtek-pci.c | |||
| @@ -449,7 +449,7 @@ static int __init gemtek_pci_init_module( void ) | |||
| 449 | 449 | ||
| 450 | static void __exit gemtek_pci_cleanup_module( void ) | 450 | static void __exit gemtek_pci_cleanup_module( void ) |
| 451 | { | 451 | { |
| 452 | return pci_unregister_driver( &gemtek_pci_driver ); | 452 | pci_unregister_driver(&gemtek_pci_driver); |
| 453 | } | 453 | } |
| 454 | 454 | ||
| 455 | MODULE_AUTHOR( "Vladimir Shebordaev <vshebordaev@mail.ru>" ); | 455 | MODULE_AUTHOR( "Vladimir Shebordaev <vshebordaev@mail.ru>" ); |
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c index fe3c83ca3de3..c9d8e3b9cc37 100644 --- a/drivers/media/video/saa7134/saa7134-cards.c +++ b/drivers/media/video/saa7134/saa7134-cards.c | |||
| @@ -2994,6 +2994,34 @@ struct saa7134_board saa7134_boards[] = { | |||
| 2994 | .amux = LINE1, | 2994 | .amux = LINE1, |
| 2995 | }, | 2995 | }, |
| 2996 | }, | 2996 | }, |
| 2997 | [SAA7134_BOARD_ASUS_EUROPA2_HYBRID] = { | ||
| 2998 | .name = "Asus Europa2 OEM", | ||
| 2999 | .audio_clock = 0x00187de7, | ||
| 3000 | .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3, | ||
| 3001 | .radio_type = UNSET, | ||
| 3002 | .tuner_addr = ADDR_UNSET, | ||
| 3003 | .radio_addr = ADDR_UNSET, | ||
| 3004 | .tda9887_conf = TDA9887_PRESENT| TDA9887_PORT1_ACTIVE | TDA9887_PORT2_ACTIVE, | ||
| 3005 | .mpeg = SAA7134_MPEG_DVB, | ||
| 3006 | .inputs = {{ | ||
| 3007 | .name = name_tv, | ||
| 3008 | .vmux = 3, | ||
| 3009 | .amux = TV, | ||
| 3010 | .tv = 1, | ||
| 3011 | },{ | ||
| 3012 | .name = name_comp1, | ||
| 3013 | .vmux = 4, | ||
| 3014 | .amux = LINE2, | ||
| 3015 | },{ | ||
| 3016 | .name = name_svideo, | ||
| 3017 | .vmux = 8, | ||
| 3018 | .amux = LINE2, | ||
| 3019 | }}, | ||
| 3020 | .radio = { | ||
| 3021 | .name = name_radio, | ||
| 3022 | .amux = LINE1, | ||
| 3023 | }, | ||
| 3024 | }, | ||
| 2997 | }; | 3025 | }; |
| 2998 | 3026 | ||
| 2999 | const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); | 3027 | const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); |
| @@ -3597,6 +3625,12 @@ struct pci_device_id saa7134_pci_tbl[] = { | |||
| 3597 | .subdevice = 0x2c00, | 3625 | .subdevice = 0x2c00, |
| 3598 | .driver_data = SAA7134_BOARD_AVERMEDIA_A16AR, | 3626 | .driver_data = SAA7134_BOARD_AVERMEDIA_A16AR, |
| 3599 | },{ | 3627 | },{ |
| 3628 | .vendor = PCI_VENDOR_ID_PHILIPS, | ||
| 3629 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | ||
| 3630 | .subvendor = 0x1043, | ||
| 3631 | .subdevice = 0x4860, | ||
| 3632 | .driver_data = SAA7134_BOARD_ASUS_EUROPA2_HYBRID, | ||
| 3633 | },{ | ||
| 3600 | /* --- boards without eeprom + subsystem ID --- */ | 3634 | /* --- boards without eeprom + subsystem ID --- */ |
| 3601 | .vendor = PCI_VENDOR_ID_PHILIPS, | 3635 | .vendor = PCI_VENDOR_ID_PHILIPS, |
| 3602 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, | 3636 | .device = PCI_DEVICE_ID_PHILIPS_SAA7134, |
| @@ -3871,6 +3905,7 @@ int saa7134_board_init2(struct saa7134_dev *dev) | |||
| 3871 | break; | 3905 | break; |
| 3872 | case SAA7134_BOARD_PHILIPS_EUROPA: | 3906 | case SAA7134_BOARD_PHILIPS_EUROPA: |
| 3873 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: | 3907 | case SAA7134_BOARD_VIDEOMATE_DVBT_300: |
| 3908 | case SAA7134_BOARD_ASUS_EUROPA2_HYBRID: | ||
| 3874 | /* The Philips EUROPA based hybrid boards have the tuner connected through | 3909 | /* The Philips EUROPA based hybrid boards have the tuner connected through |
| 3875 | * the channel decoder. We have to make it transparent to find it | 3910 | * the channel decoder. We have to make it transparent to find it |
| 3876 | */ | 3911 | */ |
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c index fb741fa465a5..1ba53b525ad2 100644 --- a/drivers/media/video/saa7134/saa7134-dvb.c +++ b/drivers/media/video/saa7134/saa7134-dvb.c | |||
| @@ -874,6 +874,34 @@ static struct tda1004x_config philips_tiger_config = { | |||
| 874 | 874 | ||
| 875 | /* ------------------------------------------------------------------ */ | 875 | /* ------------------------------------------------------------------ */ |
| 876 | 876 | ||
| 877 | static int asus_p7131_dual_tuner_init(struct dvb_frontend *fe) | ||
| 878 | { | ||
| 879 | struct saa7134_dev *dev = fe->dvb->priv; | ||
| 880 | static u8 data[] = { 0x3c, 0x33, 0x6a}; | ||
| 881 | struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | ||
| 882 | |||
| 883 | if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) | ||
| 884 | return -EIO; | ||
| 885 | /* make sure the DVB-T antenna input is set */ | ||
| 886 | saa_setl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0200000); | ||
| 887 | return 0; | ||
| 888 | } | ||
| 889 | |||
| 890 | static int asus_p7131_dual_tuner_sleep(struct dvb_frontend *fe) | ||
| 891 | { | ||
| 892 | struct saa7134_dev *dev = fe->dvb->priv; | ||
| 893 | static u8 data[] = { 0x3c, 0x33, 0x68}; | ||
| 894 | struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)}; | ||
| 895 | |||
| 896 | i2c_transfer(&dev->i2c_adap, &msg, 1); | ||
| 897 | philips_tda827xa_tuner_sleep( 0x61, fe); | ||
| 898 | /* reset antenna inputs for analog usage */ | ||
| 899 | saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0200000); | ||
| 900 | return 0; | ||
| 901 | } | ||
| 902 | |||
| 903 | /* ------------------------------------------------------------------ */ | ||
| 904 | |||
| 877 | static int lifeview_trio_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) | 905 | static int lifeview_trio_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params) |
| 878 | { | 906 | { |
| 879 | int ret; | 907 | int ret; |
| @@ -1148,8 +1176,8 @@ static int dvb_init(struct saa7134_dev *dev) | |||
| 1148 | &philips_tiger_config, | 1176 | &philips_tiger_config, |
| 1149 | &dev->i2c_adap); | 1177 | &dev->i2c_adap); |
| 1150 | if (dev->dvb.frontend) { | 1178 | if (dev->dvb.frontend) { |
| 1151 | dev->dvb.frontend->ops.tuner_ops.init = philips_tiger_tuner_init; | 1179 | dev->dvb.frontend->ops.tuner_ops.init = asus_p7131_dual_tuner_init; |
| 1152 | dev->dvb.frontend->ops.tuner_ops.sleep = philips_tiger_tuner_sleep; | 1180 | dev->dvb.frontend->ops.tuner_ops.sleep = asus_p7131_dual_tuner_sleep; |
| 1153 | dev->dvb.frontend->ops.tuner_ops.set_params = philips_tiger_tuner_set_params; | 1181 | dev->dvb.frontend->ops.tuner_ops.set_params = philips_tiger_tuner_set_params; |
| 1154 | } | 1182 | } |
| 1155 | break; | 1183 | break; |
| @@ -1240,6 +1268,18 @@ static int dvb_init(struct saa7134_dev *dev) | |||
| 1240 | } | 1268 | } |
| 1241 | } | 1269 | } |
| 1242 | break; | 1270 | break; |
| 1271 | case SAA7134_BOARD_ASUS_EUROPA2_HYBRID: | ||
| 1272 | dev->dvb.frontend = tda10046_attach(&medion_cardbus, | ||
| 1273 | &dev->i2c_adap); | ||
| 1274 | if (dev->dvb.frontend) { | ||
| 1275 | dev->original_demod_sleep = dev->dvb.frontend->ops.sleep; | ||
| 1276 | dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep; | ||
| 1277 | dev->dvb.frontend->ops.tuner_ops.init = philips_fmd1216_tuner_init; | ||
| 1278 | dev->dvb.frontend->ops.tuner_ops.sleep = philips_fmd1216_tuner_sleep; | ||
| 1279 | dev->dvb.frontend->ops.tuner_ops.set_params = philips_fmd1216_tuner_set_params; | ||
| 1280 | } | ||
| 1281 | break; | ||
| 1282 | |||
| 1243 | default: | 1283 | default: |
| 1244 | printk("%s: Huh? unknown DVB card?\n",dev->name); | 1284 | printk("%s: Huh? unknown DVB card?\n",dev->name); |
| 1245 | break; | 1285 | break; |
diff --git a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c index d31220d20495..dd759d6d8d25 100644 --- a/drivers/media/video/saa7134/saa7134-tvaudio.c +++ b/drivers/media/video/saa7134/saa7134-tvaudio.c | |||
| @@ -72,12 +72,12 @@ static struct mainscan { | |||
| 72 | int carr; | 72 | int carr; |
| 73 | } mainscan[] = { | 73 | } mainscan[] = { |
| 74 | { | 74 | { |
| 75 | .name = "M", | 75 | .name = "MN", |
| 76 | .std = V4L2_STD_NTSC | V4L2_STD_PAL_M, | 76 | .std = V4L2_STD_MN, |
| 77 | .carr = 4500, | 77 | .carr = 4500, |
| 78 | },{ | 78 | },{ |
| 79 | .name = "BG", | 79 | .name = "BGH", |
| 80 | .std = V4L2_STD_PAL_BG, | 80 | .std = V4L2_STD_B | V4L2_STD_GH, |
| 81 | .carr = 5500, | 81 | .carr = 5500, |
| 82 | },{ | 82 | },{ |
| 83 | .name = "I", | 83 | .name = "I", |
| @@ -85,7 +85,7 @@ static struct mainscan { | |||
| 85 | .carr = 6000, | 85 | .carr = 6000, |
| 86 | },{ | 86 | },{ |
| 87 | .name = "DKL", | 87 | .name = "DKL", |
| 88 | .std = V4L2_STD_PAL_DK | V4L2_STD_SECAM, | 88 | .std = V4L2_STD_DK | V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC, |
| 89 | .carr = 6500, | 89 | .carr = 6500, |
| 90 | } | 90 | } |
| 91 | }; | 91 | }; |
| @@ -93,76 +93,70 @@ static struct mainscan { | |||
| 93 | static struct saa7134_tvaudio tvaudio[] = { | 93 | static struct saa7134_tvaudio tvaudio[] = { |
| 94 | { | 94 | { |
| 95 | .name = "PAL-B/G FM-stereo", | 95 | .name = "PAL-B/G FM-stereo", |
| 96 | .std = V4L2_STD_PAL, | 96 | .std = V4L2_STD_PAL_BG, |
| 97 | .mode = TVAUDIO_FM_BG_STEREO, | 97 | .mode = TVAUDIO_FM_BG_STEREO, |
| 98 | .carr1 = 5500, | 98 | .carr1 = 5500, |
| 99 | .carr2 = 5742, | 99 | .carr2 = 5742, |
| 100 | },{ | 100 | },{ |
| 101 | .name = "PAL-D/K1 FM-stereo", | 101 | .name = "PAL-D/K1 FM-stereo", |
| 102 | .std = V4L2_STD_PAL, | 102 | .std = V4L2_STD_PAL_DK, |
| 103 | .carr1 = 6500, | 103 | .carr1 = 6500, |
| 104 | .carr2 = 6258, | 104 | .carr2 = 6258, |
| 105 | .mode = TVAUDIO_FM_BG_STEREO, | 105 | .mode = TVAUDIO_FM_BG_STEREO, |
| 106 | },{ | 106 | },{ |
| 107 | .name = "PAL-D/K2 FM-stereo", | 107 | .name = "PAL-D/K2 FM-stereo", |
| 108 | .std = V4L2_STD_PAL, | 108 | .std = V4L2_STD_PAL_DK, |
| 109 | .carr1 = 6500, | 109 | .carr1 = 6500, |
| 110 | .carr2 = 6742, | 110 | .carr2 = 6742, |
| 111 | .mode = TVAUDIO_FM_BG_STEREO, | 111 | .mode = TVAUDIO_FM_BG_STEREO, |
| 112 | },{ | 112 | },{ |
| 113 | .name = "PAL-D/K3 FM-stereo", | 113 | .name = "PAL-D/K3 FM-stereo", |
| 114 | .std = V4L2_STD_PAL, | 114 | .std = V4L2_STD_PAL_DK, |
| 115 | .carr1 = 6500, | 115 | .carr1 = 6500, |
| 116 | .carr2 = 5742, | 116 | .carr2 = 5742, |
| 117 | .mode = TVAUDIO_FM_BG_STEREO, | 117 | .mode = TVAUDIO_FM_BG_STEREO, |
| 118 | },{ | 118 | },{ |
| 119 | .name = "PAL-B/G NICAM", | 119 | .name = "PAL-B/G NICAM", |
| 120 | .std = V4L2_STD_PAL, | 120 | .std = V4L2_STD_PAL_BG, |
| 121 | .carr1 = 5500, | 121 | .carr1 = 5500, |
| 122 | .carr2 = 5850, | 122 | .carr2 = 5850, |
| 123 | .mode = TVAUDIO_NICAM_FM, | 123 | .mode = TVAUDIO_NICAM_FM, |
| 124 | },{ | 124 | },{ |
| 125 | .name = "PAL-I NICAM", | 125 | .name = "PAL-I NICAM", |
| 126 | .std = V4L2_STD_PAL, | 126 | .std = V4L2_STD_PAL_I, |
| 127 | .carr1 = 6000, | 127 | .carr1 = 6000, |
| 128 | .carr2 = 6552, | 128 | .carr2 = 6552, |
| 129 | .mode = TVAUDIO_NICAM_FM, | 129 | .mode = TVAUDIO_NICAM_FM, |
| 130 | },{ | 130 | },{ |
| 131 | .name = "PAL-D/K NICAM", | 131 | .name = "PAL-D/K NICAM", |
| 132 | .std = V4L2_STD_PAL, | 132 | .std = V4L2_STD_PAL_DK, |
| 133 | .carr1 = 6500, | 133 | .carr1 = 6500, |
| 134 | .carr2 = 5850, | 134 | .carr2 = 5850, |
| 135 | .mode = TVAUDIO_NICAM_FM, | 135 | .mode = TVAUDIO_NICAM_FM, |
| 136 | },{ | 136 | },{ |
| 137 | .name = "SECAM-L NICAM", | 137 | .name = "SECAM-L NICAM", |
| 138 | .std = V4L2_STD_SECAM, | 138 | .std = V4L2_STD_SECAM_L, |
| 139 | .carr1 = 6500, | 139 | .carr1 = 6500, |
| 140 | .carr2 = 5850, | 140 | .carr2 = 5850, |
| 141 | .mode = TVAUDIO_NICAM_AM, | 141 | .mode = TVAUDIO_NICAM_AM, |
| 142 | },{ | 142 | },{ |
| 143 | .name = "SECAM-L MONO", | 143 | .name = "SECAM-D/K NICAM", |
| 144 | .std = V4L2_STD_SECAM, | 144 | .std = V4L2_STD_SECAM_DK, |
| 145 | .carr1 = 6500, | 145 | .carr1 = 6500, |
| 146 | .carr2 = -1, | 146 | .carr2 = 5850, |
| 147 | .mode = TVAUDIO_AM_MONO, | 147 | .mode = TVAUDIO_NICAM_FM, |
| 148 | },{ | 148 | },{ |
| 149 | .name = "SECAM-D/K", | 149 | .name = "NTSC-A2 FM-stereo", |
| 150 | .std = V4L2_STD_SECAM, | 150 | .std = V4L2_STD_NTSC, |
| 151 | .carr1 = 6500, | 151 | .carr1 = 4500, |
| 152 | .carr2 = -1, | 152 | .carr2 = 4724, |
| 153 | .mode = TVAUDIO_FM_MONO, | 153 | .mode = TVAUDIO_FM_K_STEREO, |
| 154 | },{ | 154 | },{ |
| 155 | .name = "NTSC-M", | 155 | .name = "NTSC-M", |
| 156 | .std = V4L2_STD_NTSC, | 156 | .std = V4L2_STD_NTSC, |
| 157 | .carr1 = 4500, | 157 | .carr1 = 4500, |
| 158 | .carr2 = -1, | 158 | .carr2 = -1, |
| 159 | .mode = TVAUDIO_FM_MONO, | 159 | .mode = TVAUDIO_FM_MONO, |
| 160 | },{ | ||
| 161 | .name = "NTSC-A2 FM-stereo", | ||
| 162 | .std = V4L2_STD_NTSC, | ||
| 163 | .carr1 = 4500, | ||
| 164 | .carr2 = 4724, | ||
| 165 | .mode = TVAUDIO_FM_K_STEREO, | ||
| 166 | } | 160 | } |
| 167 | }; | 161 | }; |
| 168 | #define TVAUDIO (sizeof(tvaudio)/sizeof(struct saa7134_tvaudio)) | 162 | #define TVAUDIO (sizeof(tvaudio)/sizeof(struct saa7134_tvaudio)) |
| @@ -340,12 +334,6 @@ static void tvaudio_setmode(struct saa7134_dev *dev, | |||
| 340 | saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa1); | 334 | saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa1); |
| 341 | saa_writeb(SAA7134_NICAM_CONFIG, 0x00); | 335 | saa_writeb(SAA7134_NICAM_CONFIG, 0x00); |
| 342 | break; | 336 | break; |
| 343 | case TVAUDIO_AM_MONO: | ||
| 344 | saa_writeb(SAA7134_DEMODULATOR, 0x12); | ||
| 345 | saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x00); | ||
| 346 | saa_writeb(SAA7134_FM_DEEMPHASIS, 0x44); | ||
| 347 | saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa0); | ||
| 348 | break; | ||
| 349 | case TVAUDIO_FM_SAT_STEREO: | 337 | case TVAUDIO_FM_SAT_STEREO: |
| 350 | /* not implemented (yet) */ | 338 | /* not implemented (yet) */ |
| 351 | break; | 339 | break; |
| @@ -390,7 +378,6 @@ static int tvaudio_checkcarrier(struct saa7134_dev *dev, struct mainscan *scan) | |||
| 390 | } | 378 | } |
| 391 | printk("\n"); | 379 | printk("\n"); |
| 392 | } | 380 | } |
| 393 | |||
| 394 | if (dev->tvnorm->id & scan->std) { | 381 | if (dev->tvnorm->id & scan->std) { |
| 395 | tvaudio_setcarrier(dev,scan->carr-90,scan->carr-90); | 382 | tvaudio_setcarrier(dev,scan->carr-90,scan->carr-90); |
| 396 | saa_readl(SAA7134_LEVEL_READOUT1 >> 2); | 383 | saa_readl(SAA7134_LEVEL_READOUT1 >> 2); |
| @@ -426,7 +413,6 @@ static int tvaudio_getstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *au | |||
| 426 | 413 | ||
| 427 | switch (audio->mode) { | 414 | switch (audio->mode) { |
| 428 | case TVAUDIO_FM_MONO: | 415 | case TVAUDIO_FM_MONO: |
| 429 | case TVAUDIO_AM_MONO: | ||
| 430 | return V4L2_TUNER_SUB_MONO; | 416 | return V4L2_TUNER_SUB_MONO; |
| 431 | case TVAUDIO_FM_K_STEREO: | 417 | case TVAUDIO_FM_K_STEREO: |
| 432 | case TVAUDIO_FM_BG_STEREO: | 418 | case TVAUDIO_FM_BG_STEREO: |
| @@ -495,7 +481,6 @@ static int tvaudio_setstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *au | |||
| 495 | 481 | ||
| 496 | switch (audio->mode) { | 482 | switch (audio->mode) { |
| 497 | case TVAUDIO_FM_MONO: | 483 | case TVAUDIO_FM_MONO: |
| 498 | case TVAUDIO_AM_MONO: | ||
| 499 | /* nothing to do ... */ | 484 | /* nothing to do ... */ |
| 500 | break; | 485 | break; |
| 501 | case TVAUDIO_FM_K_STEREO: | 486 | case TVAUDIO_FM_K_STEREO: |
| @@ -556,6 +541,7 @@ static int tvaudio_thread(void *data) | |||
| 556 | 541 | ||
| 557 | if (1 == nscan) { | 542 | if (1 == nscan) { |
| 558 | /* only one candidate -- skip scan ;) */ | 543 | /* only one candidate -- skip scan ;) */ |
| 544 | dprintk("only one main carrier candidate - skipping scan\n"); | ||
| 559 | max1 = 12345; | 545 | max1 = 12345; |
| 560 | carrier = default_carrier; | 546 | carrier = default_carrier; |
| 561 | } else { | 547 | } else { |
| @@ -603,7 +589,6 @@ static int tvaudio_thread(void *data) | |||
| 603 | dev->automute = 0; | 589 | dev->automute = 0; |
| 604 | saa_andorb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0x30, 0x00); | 590 | saa_andorb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0x30, 0x00); |
| 605 | saa7134_tvaudio_setmute(dev); | 591 | saa7134_tvaudio_setmute(dev); |
| 606 | |||
| 607 | /* find the exact tv audio norm */ | 592 | /* find the exact tv audio norm */ |
| 608 | for (audio = UNSET, i = 0; i < TVAUDIO; i++) { | 593 | for (audio = UNSET, i = 0; i < TVAUDIO; i++) { |
| 609 | if (dev->tvnorm->id != UNSET && | 594 | if (dev->tvnorm->id != UNSET && |
| @@ -611,7 +596,7 @@ static int tvaudio_thread(void *data) | |||
| 611 | continue; | 596 | continue; |
| 612 | if (tvaudio[i].carr1 != carrier) | 597 | if (tvaudio[i].carr1 != carrier) |
| 613 | continue; | 598 | continue; |
| 614 | 599 | /* Note: at least the primary carrier is right here */ | |
| 615 | if (UNSET == audio) | 600 | if (UNSET == audio) |
| 616 | audio = i; | 601 | audio = i; |
| 617 | tvaudio_setmode(dev,&tvaudio[i],"trying"); | 602 | tvaudio_setmode(dev,&tvaudio[i],"trying"); |
| @@ -626,6 +611,7 @@ static int tvaudio_thread(void *data) | |||
| 626 | if (UNSET == audio) | 611 | if (UNSET == audio) |
| 627 | continue; | 612 | continue; |
| 628 | tvaudio_setmode(dev,&tvaudio[audio],"using"); | 613 | tvaudio_setmode(dev,&tvaudio[audio],"using"); |
| 614 | |||
| 629 | tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO); | 615 | tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO); |
| 630 | dev->tvaudio = &tvaudio[audio]; | 616 | dev->tvaudio = &tvaudio[audio]; |
| 631 | 617 | ||
| @@ -750,7 +736,6 @@ static int mute_input_7133(struct saa7134_dev *dev) | |||
| 750 | int mask; | 736 | int mask; |
| 751 | struct saa7134_input *in; | 737 | struct saa7134_input *in; |
| 752 | 738 | ||
| 753 | /* Hac 0506 route OSS sound simultanously */ | ||
| 754 | xbarin = 0x03; | 739 | xbarin = 0x03; |
| 755 | switch (dev->input->amux) { | 740 | switch (dev->input->amux) { |
| 756 | case TV: | 741 | case TV: |
| @@ -834,18 +819,16 @@ static int tvaudio_thread_ddep(void *data) | |||
| 834 | } else { | 819 | } else { |
| 835 | /* (let chip) scan for sound carrier */ | 820 | /* (let chip) scan for sound carrier */ |
| 836 | norms = 0; | 821 | norms = 0; |
| 837 | if (dev->tvnorm->id & V4L2_STD_PAL) { | 822 | if (dev->tvnorm->id & (V4L2_STD_B | V4L2_STD_GH)) |
| 838 | dprintk("PAL scan\n"); | 823 | norms |= 0x04; |
| 839 | norms |= 0x2c; /* B/G + D/K + I */ | 824 | if (dev->tvnorm->id & V4L2_STD_PAL_I) |
| 840 | } | 825 | norms |= 0x20; |
| 841 | if (dev->tvnorm->id & V4L2_STD_NTSC) { | 826 | if (dev->tvnorm->id & V4L2_STD_DK) |
| 842 | dprintk("NTSC scan\n"); | 827 | norms |= 0x08; |
| 843 | norms |= 0x40; /* M */ | 828 | if (dev->tvnorm->id & V4L2_STD_MN) |
| 844 | } | 829 | norms |= 0x40; |
| 845 | if (dev->tvnorm->id & V4L2_STD_SECAM) { | 830 | if (dev->tvnorm->id & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) |
| 846 | dprintk("SECAM scan\n"); | 831 | norms |= 0x10; |
| 847 | norms |= 0x18; /* L + D/K */ | ||
| 848 | } | ||
| 849 | if (0 == norms) | 832 | if (0 == norms) |
| 850 | norms = 0x7c; /* all */ | 833 | norms = 0x7c; /* all */ |
| 851 | dprintk("scanning:%s%s%s%s%s\n", | 834 | dprintk("scanning:%s%s%s%s%s\n", |
| @@ -1034,7 +1017,11 @@ int saa7134_tvaudio_fini(struct saa7134_dev *dev) | |||
| 1034 | 1017 | ||
| 1035 | int saa7134_tvaudio_do_scan(struct saa7134_dev *dev) | 1018 | int saa7134_tvaudio_do_scan(struct saa7134_dev *dev) |
| 1036 | { | 1019 | { |
| 1037 | if (dev->thread.pid >= 0) { | 1020 | if (dev->input->amux != TV) { |
| 1021 | dprintk("sound IF not in use, skipping scan\n"); | ||
| 1022 | dev->automute = 0; | ||
| 1023 | saa7134_tvaudio_setmute(dev); | ||
| 1024 | } else if (dev->thread.pid >= 0) { | ||
| 1038 | dev->thread.mode = UNSET; | 1025 | dev->thread.mode = UNSET; |
| 1039 | dev->thread.scan2++; | 1026 | dev->thread.scan2++; |
| 1040 | wake_up_interruptible(&dev->thread.wq); | 1027 | wake_up_interruptible(&dev->thread.wq); |
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c index 2c171af9a9f2..203302f21827 100644 --- a/drivers/media/video/saa7134/saa7134-video.c +++ b/drivers/media/video/saa7134/saa7134-video.c | |||
| @@ -43,12 +43,16 @@ static unsigned int gbuffers = 8; | |||
| 43 | static unsigned int noninterlaced = 1; | 43 | static unsigned int noninterlaced = 1; |
| 44 | static unsigned int gbufsize = 720*576*4; | 44 | static unsigned int gbufsize = 720*576*4; |
| 45 | static unsigned int gbufsize_max = 720*576*4; | 45 | static unsigned int gbufsize_max = 720*576*4; |
| 46 | static char secam[] = "--"; | ||
| 46 | module_param(video_debug, int, 0644); | 47 | module_param(video_debug, int, 0644); |
| 47 | MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); | 48 | MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); |
| 48 | module_param(gbuffers, int, 0444); | 49 | module_param(gbuffers, int, 0444); |
| 49 | MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); | 50 | MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); |
| 50 | module_param(noninterlaced, int, 0644); | 51 | module_param(noninterlaced, int, 0644); |
| 51 | MODULE_PARM_DESC(noninterlaced,"capture non interlaced video"); | 52 | MODULE_PARM_DESC(noninterlaced,"capture non interlaced video"); |
| 53 | module_param_string(secam, secam, sizeof(secam), 0644); | ||
| 54 | MODULE_PARM_DESC(secam, "force SECAM variant, either DK,L or Lc"); | ||
| 55 | |||
| 52 | 56 | ||
| 53 | #define dprintk(fmt, arg...) if (video_debug) \ | 57 | #define dprintk(fmt, arg...) if (video_debug) \ |
| 54 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) | 58 | printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) |
| @@ -279,7 +283,43 @@ static struct saa7134_tvnorm tvnorms[] = { | |||
| 279 | .id = V4L2_STD_SECAM, | 283 | .id = V4L2_STD_SECAM, |
| 280 | NORM_625_50, | 284 | NORM_625_50, |
| 281 | 285 | ||
| 282 | .sync_control = 0x18, /* old: 0x58, */ | 286 | .sync_control = 0x18, |
| 287 | .luma_control = 0x1b, | ||
| 288 | .chroma_ctrl1 = 0xd1, | ||
| 289 | .chroma_gain = 0x80, | ||
| 290 | .chroma_ctrl2 = 0x00, | ||
| 291 | .vgate_misc = 0x1c, | ||
| 292 | |||
| 293 | },{ | ||
| 294 | .name = "SECAM-DK", | ||
| 295 | .id = V4L2_STD_SECAM_DK, | ||
| 296 | NORM_625_50, | ||
| 297 | |||
| 298 | .sync_control = 0x18, | ||
| 299 | .luma_control = 0x1b, | ||
| 300 | .chroma_ctrl1 = 0xd1, | ||
| 301 | .chroma_gain = 0x80, | ||
| 302 | .chroma_ctrl2 = 0x00, | ||
| 303 | .vgate_misc = 0x1c, | ||
| 304 | |||
| 305 | },{ | ||
| 306 | .name = "SECAM-L", | ||
| 307 | .id = V4L2_STD_SECAM_L, | ||
| 308 | NORM_625_50, | ||
| 309 | |||
| 310 | .sync_control = 0x18, | ||
| 311 | .luma_control = 0x1b, | ||
| 312 | .chroma_ctrl1 = 0xd1, | ||
| 313 | .chroma_gain = 0x80, | ||
| 314 | .chroma_ctrl2 = 0x00, | ||
| 315 | .vgate_misc = 0x1c, | ||
| 316 | |||
| 317 | },{ | ||
| 318 | .name = "SECAM-Lc", | ||
| 319 | .id = V4L2_STD_SECAM_LC, | ||
| 320 | NORM_625_50, | ||
| 321 | |||
| 322 | .sync_control = 0x18, | ||
| 283 | .luma_control = 0x1b, | 323 | .luma_control = 0x1b, |
| 284 | .chroma_ctrl1 = 0xd1, | 324 | .chroma_ctrl1 = 0xd1, |
| 285 | .chroma_gain = 0x80, | 325 | .chroma_gain = 0x80, |
| @@ -1769,6 +1809,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
| 1769 | { | 1809 | { |
| 1770 | v4l2_std_id *id = arg; | 1810 | v4l2_std_id *id = arg; |
| 1771 | unsigned int i; | 1811 | unsigned int i; |
| 1812 | v4l2_std_id fixup; | ||
| 1772 | 1813 | ||
| 1773 | for (i = 0; i < TVNORMS; i++) | 1814 | for (i = 0; i < TVNORMS; i++) |
| 1774 | if (*id == tvnorms[i].id) | 1815 | if (*id == tvnorms[i].id) |
| @@ -1779,7 +1820,22 @@ static int video_do_ioctl(struct inode *inode, struct file *file, | |||
| 1779 | break; | 1820 | break; |
| 1780 | if (i == TVNORMS) | 1821 | if (i == TVNORMS) |
| 1781 | return -EINVAL; | 1822 | return -EINVAL; |
| 1782 | 1823 | if ((*id & V4L2_STD_SECAM) && (secam[0] != '-')) { | |
| 1824 | if (secam[0] == 'L' || secam[0] == 'l') { | ||
| 1825 | if (secam[1] == 'C' || secam[1] == 'c') | ||
| 1826 | fixup = V4L2_STD_SECAM_LC; | ||
| 1827 | else | ||
| 1828 | fixup = V4L2_STD_SECAM_L; | ||
| 1829 | } else { | ||
| 1830 | if (secam[0] == 'D' || secam[0] == 'd') | ||
| 1831 | fixup = V4L2_STD_SECAM_DK; | ||
| 1832 | else | ||
| 1833 | fixup = V4L2_STD_SECAM; | ||
| 1834 | } | ||
| 1835 | for (i = 0; i < TVNORMS; i++) | ||
| 1836 | if (fixup == tvnorms[i].id) | ||
| 1837 | break; | ||
| 1838 | } | ||
| 1783 | mutex_lock(&dev->lock); | 1839 | mutex_lock(&dev->lock); |
| 1784 | if (res_check(fh, RESOURCE_OVERLAY)) { | 1840 | if (res_check(fh, RESOURCE_OVERLAY)) { |
| 1785 | spin_lock_irqsave(&dev->slock,flags); | 1841 | spin_lock_irqsave(&dev->slock,flags); |
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h index 701a90942108..7cf96b430250 100644 --- a/drivers/media/video/saa7134/saa7134.h +++ b/drivers/media/video/saa7134/saa7134.h | |||
| @@ -61,7 +61,6 @@ enum saa7134_tvaudio_mode { | |||
| 61 | TVAUDIO_FM_K_STEREO = 4, | 61 | TVAUDIO_FM_K_STEREO = 4, |
| 62 | TVAUDIO_NICAM_AM = 5, | 62 | TVAUDIO_NICAM_AM = 5, |
| 63 | TVAUDIO_NICAM_FM = 6, | 63 | TVAUDIO_NICAM_FM = 6, |
| 64 | TVAUDIO_AM_MONO = 7 | ||
| 65 | }; | 64 | }; |
| 66 | 65 | ||
| 67 | enum saa7134_audio_in { | 66 | enum saa7134_audio_in { |
| @@ -227,6 +226,7 @@ struct saa7134_format { | |||
| 227 | #define SAA7134_BOARD_FLYDVBS_LR300 97 | 226 | #define SAA7134_BOARD_FLYDVBS_LR300 97 |
| 228 | #define SAA7134_BOARD_PROTEUS_2309 98 | 227 | #define SAA7134_BOARD_PROTEUS_2309 98 |
| 229 | #define SAA7134_BOARD_AVERMEDIA_A16AR 99 | 228 | #define SAA7134_BOARD_AVERMEDIA_A16AR 99 |
| 229 | #define SAA7134_BOARD_ASUS_EUROPA2_HYBRID 100 | ||
| 230 | 230 | ||
| 231 | #define SAA7134_MAXBOARDS 8 | 231 | #define SAA7134_MAXBOARDS 8 |
| 232 | #define SAA7134_INPUT_MAX 8 | 232 | #define SAA7134_INPUT_MAX 8 |
diff --git a/drivers/media/video/tveeprom.c b/drivers/media/video/tveeprom.c index cd1502ac9560..e6baaee038bf 100644 --- a/drivers/media/video/tveeprom.c +++ b/drivers/media/video/tveeprom.c | |||
| @@ -222,8 +222,8 @@ hauppauge_tuner[] = | |||
| 222 | { TUNER_TCL_2002MB, "TCL M2523_3DB_E"}, | 222 | { TUNER_TCL_2002MB, "TCL M2523_3DB_E"}, |
| 223 | { TUNER_ABSENT, "Philips 8275A"}, | 223 | { TUNER_ABSENT, "Philips 8275A"}, |
| 224 | { TUNER_ABSENT, "Microtune MT2060"}, | 224 | { TUNER_ABSENT, "Microtune MT2060"}, |
| 225 | { TUNER_ABSENT, "Philips FM1236 MK5"}, | 225 | { TUNER_PHILIPS_FM1236_MK3, "Philips FM1236 MK5"}, |
| 226 | { TUNER_ABSENT, "Philips FM1216ME MK5"}, | 226 | { TUNER_PHILIPS_FM1216ME_MK3, "Philips FM1216ME MK5"}, |
| 227 | { TUNER_ABSENT, "TCL M2523_3DI_E"}, | 227 | { TUNER_ABSENT, "TCL M2523_3DI_E"}, |
| 228 | { TUNER_ABSENT, "Samsung THPD5222FG30A"}, | 228 | { TUNER_ABSENT, "Samsung THPD5222FG30A"}, |
| 229 | /* 120-129 */ | 229 | /* 120-129 */ |
diff --git a/drivers/media/video/zoran_card.c b/drivers/media/video/zoran_card.c index 9f21d0ba0f0f..653822ce391c 100644 --- a/drivers/media/video/zoran_card.c +++ b/drivers/media/video/zoran_card.c | |||
| @@ -1278,9 +1278,7 @@ find_zr36057 (void) | |||
| 1278 | 1278 | ||
| 1279 | zoran_num = 0; | 1279 | zoran_num = 0; |
| 1280 | while (zoran_num < BUZ_MAX && | 1280 | while (zoran_num < BUZ_MAX && |
| 1281 | (dev = | 1281 | (dev = pci_get_device(PCI_VENDOR_ID_ZORAN, PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) { |
| 1282 | pci_find_device(PCI_VENDOR_ID_ZORAN, | ||
| 1283 | PCI_DEVICE_ID_ZORAN_36057, dev)) != NULL) { | ||
| 1284 | card_num = card[zoran_num]; | 1282 | card_num = card[zoran_num]; |
| 1285 | zr = &zoran[zoran_num]; | 1283 | zr = &zoran[zoran_num]; |
| 1286 | memset(zr, 0, sizeof(struct zoran)); // Just in case if previous cycle failed | 1284 | memset(zr, 0, sizeof(struct zoran)); // Just in case if previous cycle failed |
| @@ -1541,7 +1539,8 @@ find_zr36057 (void) | |||
| 1541 | goto zr_detach_vfe; | 1539 | goto zr_detach_vfe; |
| 1542 | } | 1540 | } |
| 1543 | } | 1541 | } |
| 1544 | 1542 | /* Success so keep the pci_dev referenced */ | |
| 1543 | pci_dev_get(zr->pci_dev); | ||
| 1545 | zoran_num++; | 1544 | zoran_num++; |
| 1546 | continue; | 1545 | continue; |
| 1547 | 1546 | ||
| @@ -1563,6 +1562,9 @@ find_zr36057 (void) | |||
| 1563 | iounmap(zr->zr36057_mem); | 1562 | iounmap(zr->zr36057_mem); |
| 1564 | continue; | 1563 | continue; |
| 1565 | } | 1564 | } |
| 1565 | if (dev) /* Clean up ref count on early exit */ | ||
| 1566 | pci_dev_put(dev); | ||
| 1567 | |||
| 1566 | if (zoran_num == 0) { | 1568 | if (zoran_num == 0) { |
| 1567 | dprintk(1, KERN_INFO "No known MJPEG cards found.\n"); | 1569 | dprintk(1, KERN_INFO "No known MJPEG cards found.\n"); |
| 1568 | } | 1570 | } |
diff --git a/drivers/media/video/zr36120.c b/drivers/media/video/zr36120.c index 9240638a0134..b5ffe53c40d8 100644 --- a/drivers/media/video/zr36120.c +++ b/drivers/media/video/zr36120.c | |||
| @@ -1840,16 +1840,16 @@ int __init find_zoran(void) | |||
| 1840 | struct zoran *ztv; | 1840 | struct zoran *ztv; |
| 1841 | struct pci_dev *dev = NULL; | 1841 | struct pci_dev *dev = NULL; |
| 1842 | unsigned char revision; | 1842 | unsigned char revision; |
| 1843 | int zoran_num=0; | 1843 | int zoran_num = 0; |
| 1844 | 1844 | ||
| 1845 | while ((dev = pci_find_device(PCI_VENDOR_ID_ZORAN,PCI_DEVICE_ID_ZORAN_36120, dev))) | 1845 | while ((dev = pci_get_device(PCI_VENDOR_ID_ZORAN,PCI_DEVICE_ID_ZORAN_36120, dev))) |
| 1846 | { | 1846 | { |
| 1847 | /* Ok, a ZR36120/ZR36125 found! */ | 1847 | /* Ok, a ZR36120/ZR36125 found! */ |
| 1848 | ztv = &zorans[zoran_num]; | 1848 | ztv = &zorans[zoran_num]; |
| 1849 | ztv->dev = dev; | 1849 | ztv->dev = dev; |
| 1850 | 1850 | ||
| 1851 | if (pci_enable_device(dev)) | 1851 | if (pci_enable_device(dev)) |
| 1852 | return -EIO; | 1852 | continue; |
| 1853 | 1853 | ||
| 1854 | pci_read_config_byte(dev, PCI_CLASS_REVISION, &revision); | 1854 | pci_read_config_byte(dev, PCI_CLASS_REVISION, &revision); |
| 1855 | printk(KERN_INFO "zoran: Zoran %x (rev %d) ", | 1855 | printk(KERN_INFO "zoran: Zoran %x (rev %d) ", |
| @@ -1867,17 +1867,18 @@ int __init find_zoran(void) | |||
| 1867 | { | 1867 | { |
| 1868 | iounmap(ztv->zoran_mem); | 1868 | iounmap(ztv->zoran_mem); |
| 1869 | printk(KERN_ERR "zoran: Bad irq number or handler\n"); | 1869 | printk(KERN_ERR "zoran: Bad irq number or handler\n"); |
| 1870 | return -EINVAL; | 1870 | continue; |
| 1871 | } | 1871 | } |
| 1872 | if (result==-EBUSY) | 1872 | if (result==-EBUSY) |
| 1873 | printk(KERN_ERR "zoran: IRQ %d busy, change your PnP config in BIOS\n",dev->irq); | 1873 | printk(KERN_ERR "zoran: IRQ %d busy, change your PnP config in BIOS\n",dev->irq); |
| 1874 | if (result < 0) { | 1874 | if (result < 0) { |
| 1875 | iounmap(ztv->zoran_mem); | 1875 | iounmap(ztv->zoran_mem); |
| 1876 | return result; | 1876 | continue; |
| 1877 | } | 1877 | } |
| 1878 | /* Enable bus-mastering */ | 1878 | /* Enable bus-mastering */ |
| 1879 | pci_set_master(dev); | 1879 | pci_set_master(dev); |
| 1880 | 1880 | /* Keep a reference */ | |
| 1881 | pci_dev_get(dev); | ||
| 1881 | zoran_num++; | 1882 | zoran_num++; |
| 1882 | } | 1883 | } |
| 1883 | if(zoran_num) | 1884 | if(zoran_num) |
| @@ -2041,6 +2042,9 @@ void release_zoran(int max) | |||
| 2041 | if (ztv->zoran_mem) | 2042 | if (ztv->zoran_mem) |
| 2042 | iounmap(ztv->zoran_mem); | 2043 | iounmap(ztv->zoran_mem); |
| 2043 | 2044 | ||
| 2045 | /* Drop PCI device */ | ||
| 2046 | pci_dev_put(ztv->dev); | ||
| 2047 | |||
| 2044 | video_unregister_device(&ztv->video_dev); | 2048 | video_unregister_device(&ztv->video_dev); |
| 2045 | video_unregister_device(&ztv->vbi_dev); | 2049 | video_unregister_device(&ztv->vbi_dev); |
| 2046 | } | 2050 | } |
| @@ -2057,13 +2061,12 @@ int __init zr36120_init(void) | |||
| 2057 | 2061 | ||
| 2058 | handle_chipset(); | 2062 | handle_chipset(); |
| 2059 | zoran_cards = find_zoran(); | 2063 | zoran_cards = find_zoran(); |
| 2060 | if (zoran_cards<0) | 2064 | if (zoran_cards <= 0) |
| 2061 | /* no cards found, no need for a driver */ | ||
| 2062 | return -EIO; | 2065 | return -EIO; |
| 2063 | 2066 | ||
| 2064 | /* initialize Zorans */ | 2067 | /* initialize Zorans */ |
| 2065 | for (card=0; card<zoran_cards; card++) { | 2068 | for (card=0; card<zoran_cards; card++) { |
| 2066 | if (init_zoran(card)<0) { | 2069 | if (init_zoran(card) < 0) { |
| 2067 | /* only release the zorans we have registered */ | 2070 | /* only release the zorans we have registered */ |
| 2068 | release_zoran(card); | 2071 | release_zoran(card); |
| 2069 | return -EIO; | 2072 | return -EIO; |
