diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-11 12:25:21 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-11 12:25:21 -0500 |
| commit | 853041f0899177da7a47da3a09aa327a14ebd7bb (patch) | |
| tree | 0db5619b95dbb95aa9dfd3cdea5416d87b7590a6 | |
| parent | e892873c5d7431324d98dfd3ed1572a2948046be (diff) | |
| parent | 1d6782bda5c1fb2bca44af50647b45427d8ef4ec (diff) | |
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: (35 commits)
V4L/DVB (9516): cx18: Move DVB buffer transfer handling from irq handler to work_queue
V4L/DVB (9557): gspca: Small changes for the sensor HV7131B in zc3xx.
V4L/DVB (9556): gspca: Bad init sequence for sensor HV7131B in zc3xx.
V4L/DVB (9549): gspca: Fix a typo in one of gspca chips name.
V4L/DVB (9515): cx18: Use correct Mailbox IRQ Ack values and misc IRQ handling cleanup
V4L/DVB (9493): kconfig patch
V4L/DVB (9527): af9015: fix compile warnings
V4L/DVB (9524): af9013: fix bug in status reading
V4L/DVB (9511): cx18: Mark CX18_CPU_DE_RELEASE_MDL as a slow API call
V4L/DVB (9510): cx18: Fix write retries for registers that always change - part 2.
V4L/DVB (9506): ivtv/cx18: fix test whether modules should be loaded or not.
V4L/DVB (9499): cx88-mpeg: final fix for analogue only compilation + de-alloc fix
V4L/DVB (9496): cx88-blackbird: bugfix: cx88-blackbird-mpeg-users
V4L/DVB (9495): cx88-blackbird: bugfix: cx88-blackbird-poll-fix
V4L/DVB (9494): anysee: initialize anysee_usb_mutex statically
V4L/DVB (9492): unplug oops from dvb_frontend_init...
V4L/DVB (9486): ivtv/ivtvfb: no longer experimental
V4L/DVB (9485): ivtv: remove incorrect V4L1 & tvaudio dependency
V4L/DVB (9482): Documentation, especially regarding audio and informational links
V4L/DVB (9475): cx18: Disable write retries for registers that always change - part 1.
...
40 files changed, 509 insertions, 267 deletions
diff --git a/Documentation/feature-removal-schedule.txt b/Documentation/feature-removal-schedule.txt index 05d71b4b9430..c28a2ac88f9d 100644 --- a/Documentation/feature-removal-schedule.txt +++ b/Documentation/feature-removal-schedule.txt | |||
| @@ -56,30 +56,6 @@ Who: Mauro Carvalho Chehab <mchehab@infradead.org> | |||
| 56 | 56 | ||
| 57 | --------------------------- | 57 | --------------------------- |
| 58 | 58 | ||
| 59 | What: old tuner-3036 i2c driver | ||
| 60 | When: 2.6.28 | ||
| 61 | Why: This driver is for VERY old i2c-over-parallel port teletext receiver | ||
| 62 | boxes. Rather then spending effort on converting this driver to V4L2, | ||
| 63 | and since it is extremely unlikely that anyone still uses one of these | ||
| 64 | devices, it was decided to drop it. | ||
| 65 | Who: Hans Verkuil <hverkuil@xs4all.nl> | ||
| 66 | Mauro Carvalho Chehab <mchehab@infradead.org> | ||
| 67 | |||
| 68 | --------------------------- | ||
| 69 | |||
| 70 | What: V4L2 dpc7146 driver | ||
| 71 | When: 2.6.28 | ||
| 72 | Why: Old driver for the dpc7146 demonstration board that is no longer | ||
| 73 | relevant. The last time this was tested on actual hardware was | ||
| 74 | probably around 2002. Since this is a driver for a demonstration | ||
| 75 | board the decision was made to remove it rather than spending a | ||
| 76 | lot of effort continually updating this driver to stay in sync | ||
| 77 | with the latest internal V4L2 or I2C API. | ||
| 78 | Who: Hans Verkuil <hverkuil@xs4all.nl> | ||
| 79 | Mauro Carvalho Chehab <mchehab@infradead.org> | ||
| 80 | |||
| 81 | --------------------------- | ||
| 82 | |||
| 83 | What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl]) | 59 | What: PCMCIA control ioctl (needed for pcmcia-cs [cardmgr, cardctl]) |
| 84 | When: November 2005 | 60 | When: November 2005 |
| 85 | Files: drivers/pcmcia/: pcmcia_ioctl.c | 61 | Files: drivers/pcmcia/: pcmcia_ioctl.c |
diff --git a/Documentation/video4linux/README.cx88 b/Documentation/video4linux/README.cx88 index 06a33a4f52fd..166d5960b1a9 100644 --- a/Documentation/video4linux/README.cx88 +++ b/Documentation/video4linux/README.cx88 | |||
| @@ -27,8 +27,8 @@ audio | |||
| 27 | sound card) should be possible, but there is no code yet ... | 27 | sound card) should be possible, but there is no code yet ... |
| 28 | 28 | ||
| 29 | vbi | 29 | vbi |
| 30 | - some code present. Doesn't crash any more, but also doesn't | 30 | - Code present. Works for NTSC closed caption. PAL and other |
| 31 | work yet ... | 31 | TV norms may or may not work. |
| 32 | 32 | ||
| 33 | 33 | ||
| 34 | how to add support for new cards | 34 | how to add support for new cards |
diff --git a/Documentation/video4linux/si470x.txt b/Documentation/video4linux/si470x.txt new file mode 100644 index 000000000000..11c5fd22a332 --- /dev/null +++ b/Documentation/video4linux/si470x.txt | |||
| @@ -0,0 +1,118 @@ | |||
| 1 | Driver for USB radios for the Silicon Labs Si470x FM Radio Receivers | ||
| 2 | |||
| 3 | Copyright (c) 2008 Tobias Lorenz <tobias.lorenz@gmx.net> | ||
| 4 | |||
| 5 | |||
| 6 | Information from Silicon Labs | ||
| 7 | ============================= | ||
| 8 | Silicon Laboratories is the manufacturer of the radio ICs, that nowadays are the | ||
| 9 | most often used radio receivers in cell phones. Usually they are connected with | ||
| 10 | I2C. But SiLabs also provides a reference design, which integrates this IC, | ||
| 11 | together with a small microcontroller C8051F321, to form a USB radio. | ||
| 12 | Part of this reference design is also a radio application in binary and source | ||
| 13 | code. The software also contains an automatic firmware upgrade to the most | ||
| 14 | current version. Information on these can be downloaded here: | ||
| 15 | http://www.silabs.com/usbradio | ||
| 16 | |||
| 17 | |||
| 18 | Supported ICs | ||
| 19 | ============= | ||
| 20 | The following ICs have a very similar register set, so that they are or will be | ||
| 21 | supported somewhen by the driver: | ||
| 22 | - Si4700: FM radio receiver | ||
| 23 | - Si4701: FM radio receiver, RDS Support | ||
| 24 | - Si4702: FM radio receiver | ||
| 25 | - Si4703: FM radio receiver, RDS Support | ||
| 26 | - Si4704: FM radio receiver, no external antenna required | ||
| 27 | - Si4705: FM radio receiver, no external antenna required, RDS support, Dig I/O | ||
| 28 | - Si4706: Enhanced FM RDS/TMC radio receiver, no external antenna required, RDS | ||
| 29 | Support | ||
| 30 | - Si4707: Dedicated weather band radio receiver with SAME decoder, RDS Support | ||
| 31 | - Si4708: Smallest FM receivers | ||
| 32 | - Si4709: Smallest FM receivers, RDS Support | ||
| 33 | More information on these can be downloaded here: | ||
| 34 | http://www.silabs.com/products/mcu/Pages/USBFMRadioRD.aspx | ||
| 35 | |||
| 36 | |||
| 37 | Supported USB devices | ||
| 38 | ===================== | ||
| 39 | Currently the following USB radios (vendor:product) with the Silicon Labs si470x | ||
| 40 | chips are known to work: | ||
| 41 | - 10c4:818a: Silicon Labs USB FM Radio Reference Design | ||
| 42 | - 06e1:a155: ADS/Tech FM Radio Receiver (formerly Instant FM Music) (RDX-155-EF) | ||
| 43 | - 1b80:d700: KWorld USB FM Radio SnapMusic Mobile 700 (FM700) | ||
| 44 | |||
| 45 | |||
| 46 | Software | ||
| 47 | ======== | ||
| 48 | Testing is usually done with most application under Debian/testing: | ||
| 49 | - fmtools - Utility for managing FM tuner cards | ||
| 50 | - gnomeradio - FM-radio tuner for the GNOME desktop | ||
| 51 | - gradio - GTK FM radio tuner | ||
| 52 | - kradio - Comfortable Radio Application for KDE | ||
| 53 | - radio - ncurses-based radio application | ||
| 54 | |||
| 55 | There is also a library libv4l, which can be used. It's going to have a function | ||
| 56 | for frequency seeking, either by using hardware functionality as in radio-si470x | ||
| 57 | or by implementing a function as we currently have in every of the mentioned | ||
| 58 | programs. Somewhen the radio programs should make use of libv4l. | ||
| 59 | |||
| 60 | For processing RDS information, there is a project ongoing at: | ||
| 61 | http://rdsd.berlios.de/ | ||
| 62 | |||
| 63 | There is currently no project for making TMC sentences human readable. | ||
| 64 | |||
| 65 | |||
| 66 | Audio Listing | ||
| 67 | ============= | ||
| 68 | USB Audio is provided by the ALSA snd_usb_audio module. It is recommended to | ||
| 69 | also select SND_USB_AUDIO, as this is required to get sound from the radio. For | ||
| 70 | listing you have to redirect the sound, for example using one of the following | ||
| 71 | commands. | ||
| 72 | |||
| 73 | If you just want to test audio (very poor quality): | ||
| 74 | cat /dev/dsp1 > /dev/dsp | ||
| 75 | |||
| 76 | If you use OSS try: | ||
| 77 | sox -2 --endian little -r 96000 -t oss /dev/dsp1 -t oss /dev/dsp | ||
| 78 | |||
| 79 | If you use arts try: | ||
| 80 | arecord -D hw:1,0 -r96000 -c2 -f S16_LE | artsdsp aplay -B - | ||
| 81 | |||
| 82 | |||
| 83 | Module Parameters | ||
| 84 | ================= | ||
| 85 | After loading the module, you still have access to some of them in the sysfs | ||
| 86 | mount under /sys/module/radio_si470x/parameters. The contents of read-only files | ||
| 87 | (0444) are not updated, even if space, band and de are changed using private | ||
| 88 | video controls. The others are runtime changeable. | ||
| 89 | |||
| 90 | |||
| 91 | Errors | ||
| 92 | ====== | ||
| 93 | Increase tune_timeout, if you often get -EIO errors. | ||
| 94 | |||
| 95 | When timed out or band limit is reached, hw_freq_seek returns -EAGAIN. | ||
| 96 | |||
| 97 | If you get any errors from snd_usb_audio, please report them to the ALSA people. | ||
| 98 | |||
| 99 | |||
| 100 | Open Issues | ||
| 101 | =========== | ||
| 102 | V4L minor device allocation and parameter setting is not perfect. A solution is | ||
| 103 | currently under discussion. | ||
| 104 | |||
| 105 | There is an USB interface for downloading/uploading new firmware images. Support | ||
| 106 | for it can be implemented using the request_firmware interface. | ||
| 107 | |||
| 108 | There is a RDS interrupt mode. The driver is already using the same interface | ||
| 109 | for polling RDS information, but is currently not using the interrupt mode. | ||
| 110 | |||
| 111 | There is a LED interface, which can be used to override the LED control | ||
| 112 | programmed in the firmware. This can be made available using the LED support | ||
| 113 | functions in the kernel. | ||
| 114 | |||
| 115 | |||
| 116 | Other useful information and links | ||
| 117 | ================================== | ||
| 118 | http://www.silabs.com/usbradio | ||
diff --git a/MAINTAINERS b/MAINTAINERS index 7e6a17e1de09..53e78c83cc7a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1879,6 +1879,37 @@ M: linux-kernel@vger.kernel.org | |||
| 1879 | W: http://www.kernel.org/pub/linux/kernel/people/rml/hdaps/ | 1879 | W: http://www.kernel.org/pub/linux/kernel/people/rml/hdaps/ |
| 1880 | S: Maintained | 1880 | S: Maintained |
| 1881 | 1881 | ||
| 1882 | GSPCA FINEPIX SUBDRIVER | ||
| 1883 | P: Frank Zago | ||
| 1884 | M: frank@zago.net | ||
| 1885 | L: video4linux-list@redhat.com | ||
| 1886 | S: Maintained | ||
| 1887 | |||
| 1888 | GSPCA M5602 SUBDRIVER | ||
| 1889 | P: Erik Andren | ||
| 1890 | M: erik.andren@gmail.com | ||
| 1891 | L: video4linux-list@redhat.com | ||
| 1892 | S: Maintained | ||
| 1893 | |||
| 1894 | GSPCA PAC207 SONIXB SUBDRIVER | ||
| 1895 | P: Hans de Goede | ||
| 1896 | M: hdegoede@redhat.com | ||
| 1897 | L: video4linux-list@redhat.com | ||
| 1898 | S: Maintained | ||
| 1899 | |||
| 1900 | GSPCA T613 SUBDRIVER | ||
| 1901 | P: Leandro Costantino | ||
| 1902 | M: lcostantino@gmail.com | ||
| 1903 | L: video4linux-list@redhat.com | ||
| 1904 | S: Maintained | ||
| 1905 | |||
| 1906 | GSPCA USB WEBCAM DRIVER | ||
| 1907 | P: Jean-Francois Moine | ||
| 1908 | M: moinejf@free.fr | ||
| 1909 | W: http://moinejf.free.fr | ||
| 1910 | L: video4linux-list@redhat.com | ||
| 1911 | S: Maintained | ||
| 1912 | |||
| 1882 | HARDWARE MONITORING | 1913 | HARDWARE MONITORING |
| 1883 | L: lm-sensors@lm-sensors.org | 1914 | L: lm-sensors@lm-sensors.org |
| 1884 | W: http://www.lm-sensors.org/ | 1915 | W: http://www.lm-sensors.org/ |
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index 1903e7515650..d3671b4049c0 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
| @@ -1265,6 +1265,7 @@ static const struct hid_device_id hid_blacklist[] = { | |||
| 1265 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, | 1265 | { HID_USB_DEVICE(USB_VENDOR_ID_EZKEY, USB_DEVICE_ID_BTC_8193) }, |
| 1266 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, | 1266 | { HID_USB_DEVICE(USB_VENDOR_ID_GENERIC_13BA, USB_DEVICE_ID_GENERIC_13BA_KBD_MOUSE) }, |
| 1267 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, | 1267 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE) }, |
| 1268 | { HID_USB_DEVICE(USB_VENDOR_ID_KWORLD, USB_DEVICE_ID_KWORLD_RADIO_FM700) }, | ||
| 1268 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, | 1269 | { HID_USB_DEVICE(USB_VENDOR_ID_GYRATION, USB_DEVICE_ID_GYRATION_REMOTE_2) }, |
| 1269 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, | 1270 | { HID_USB_DEVICE(USB_VENDOR_ID_LABTEC, USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD) }, |
| 1270 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, | 1271 | { HID_USB_DEVICE(USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_MX3000_RECEIVER) }, |
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h index 5cc404291736..f05bcbbbb0d5 100644 --- a/drivers/hid/hid-ids.h +++ b/drivers/hid/hid-ids.h | |||
| @@ -253,6 +253,9 @@ | |||
| 253 | #define USB_VENDOR_ID_KBGEAR 0x084e | 253 | #define USB_VENDOR_ID_KBGEAR 0x084e |
| 254 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 | 254 | #define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001 |
| 255 | 255 | ||
| 256 | #define USB_VENDOR_ID_KWORLD 0x1b80 | ||
| 257 | #define USB_DEVICE_ID_KWORLD_RADIO_FM700 0xd700 | ||
| 258 | |||
| 256 | #define USB_VENDOR_ID_LABTEC 0x1020 | 259 | #define USB_VENDOR_ID_LABTEC 0x1020 |
| 257 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 | 260 | #define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006 |
| 258 | 261 | ||
diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 5689d1f1d444..8557bf12cfb4 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c | |||
| @@ -223,6 +223,8 @@ static void dvb_frontend_init(struct dvb_frontend *fe) | |||
| 223 | if (fe->ops.init) | 223 | if (fe->ops.init) |
| 224 | fe->ops.init(fe); | 224 | fe->ops.init(fe); |
| 225 | if (fe->ops.tuner_ops.init) { | 225 | if (fe->ops.tuner_ops.init) { |
| 226 | if (fe->ops.i2c_gate_ctrl) | ||
| 227 | fe->ops.i2c_gate_ctrl(fe, 1); | ||
| 226 | fe->ops.tuner_ops.init(fe); | 228 | fe->ops.tuner_ops.init(fe); |
| 227 | if (fe->ops.i2c_gate_ctrl) | 229 | if (fe->ops.i2c_gate_ctrl) |
| 228 | fe->ops.i2c_gate_ctrl(fe, 0); | 230 | fe->ops.i2c_gate_ctrl(fe, 0); |
diff --git a/drivers/media/dvb/dvb-usb/Kconfig b/drivers/media/dvb/dvb-usb/Kconfig index 3c13bcfa6385..62b68c291d99 100644 --- a/drivers/media/dvb/dvb-usb/Kconfig +++ b/drivers/media/dvb/dvb-usb/Kconfig | |||
| @@ -261,7 +261,7 @@ config DVB_USB_DW2102 | |||
| 261 | Say Y here to support the DvbWorld DVB-S/S2 USB2.0 receivers | 261 | Say Y here to support the DvbWorld DVB-S/S2 USB2.0 receivers |
| 262 | and the TeVii S650. | 262 | and the TeVii S650. |
| 263 | 263 | ||
| 264 | config DVB_USB_CINERGY_T2 | 264 | config DVB_USB_CINERGY_T2 |
| 265 | tristate "Terratec CinergyT2/qanu USB 2.0 DVB-T receiver" | 265 | tristate "Terratec CinergyT2/qanu USB 2.0 DVB-T receiver" |
| 266 | depends on DVB_USB | 266 | depends on DVB_USB |
| 267 | help | 267 | help |
| @@ -283,6 +283,7 @@ config DVB_USB_ANYSEE | |||
| 283 | config DVB_USB_DTV5100 | 283 | config DVB_USB_DTV5100 |
| 284 | tristate "AME DTV-5100 USB2.0 DVB-T support" | 284 | tristate "AME DTV-5100 USB2.0 DVB-T support" |
| 285 | depends on DVB_USB | 285 | depends on DVB_USB |
| 286 | select DVB_ZL10353 if !DVB_FE_CUSTOMISE | ||
| 286 | select MEDIA_TUNER_QT1010 if !DVB_FE_CUSTOMISE | 287 | select MEDIA_TUNER_QT1010 if !DVB_FE_CUSTOMISE |
| 287 | help | 288 | help |
| 288 | Say Y here to support the AME DTV-5100 USB2.0 DVB-T receiver. | 289 | Say Y here to support the AME DTV-5100 USB2.0 DVB-T receiver. |
diff --git a/drivers/media/dvb/dvb-usb/af9015.c b/drivers/media/dvb/dvb-usb/af9015.c index cb0829c038ce..847d8fdd9ec4 100644 --- a/drivers/media/dvb/dvb-usb/af9015.c +++ b/drivers/media/dvb/dvb-usb/af9015.c | |||
| @@ -31,13 +31,13 @@ | |||
| 31 | #include "mc44s80x.h" | 31 | #include "mc44s80x.h" |
| 32 | #endif | 32 | #endif |
| 33 | 33 | ||
| 34 | int dvb_usb_af9015_debug; | 34 | static int dvb_usb_af9015_debug; |
| 35 | module_param_named(debug, dvb_usb_af9015_debug, int, 0644); | 35 | module_param_named(debug, dvb_usb_af9015_debug, int, 0644); |
| 36 | MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS); | 36 | MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS); |
| 37 | int dvb_usb_af9015_remote; | 37 | static int dvb_usb_af9015_remote; |
| 38 | module_param_named(remote, dvb_usb_af9015_remote, int, 0644); | 38 | module_param_named(remote, dvb_usb_af9015_remote, int, 0644); |
| 39 | MODULE_PARM_DESC(remote, "select remote"); | 39 | MODULE_PARM_DESC(remote, "select remote"); |
| 40 | int dvb_usb_af9015_dual_mode; | 40 | static int dvb_usb_af9015_dual_mode; |
| 41 | module_param_named(dual_mode, dvb_usb_af9015_dual_mode, int, 0644); | 41 | module_param_named(dual_mode, dvb_usb_af9015_dual_mode, int, 0644); |
| 42 | MODULE_PARM_DESC(dual_mode, "enable dual mode"); | 42 | MODULE_PARM_DESC(dual_mode, "enable dual mode"); |
| 43 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 43 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
| @@ -46,7 +46,7 @@ static DEFINE_MUTEX(af9015_usb_mutex); | |||
| 46 | 46 | ||
| 47 | static struct af9015_config af9015_config; | 47 | static struct af9015_config af9015_config; |
| 48 | static struct dvb_usb_device_properties af9015_properties[2]; | 48 | static struct dvb_usb_device_properties af9015_properties[2]; |
| 49 | int af9015_properties_count = ARRAY_SIZE(af9015_properties); | 49 | static int af9015_properties_count = ARRAY_SIZE(af9015_properties); |
| 50 | 50 | ||
| 51 | static struct af9013_config af9015_af9013_config[] = { | 51 | static struct af9013_config af9015_af9013_config[] = { |
| 52 | { | 52 | { |
| @@ -549,7 +549,7 @@ static int af9015_eeprom_dump(struct dvb_usb_device *d) | |||
| 549 | return 0; | 549 | return 0; |
| 550 | } | 550 | } |
| 551 | 551 | ||
| 552 | int af9015_download_ir_table(struct dvb_usb_device *d) | 552 | static int af9015_download_ir_table(struct dvb_usb_device *d) |
| 553 | { | 553 | { |
| 554 | int i, packets = 0, ret; | 554 | int i, packets = 0, ret; |
| 555 | u16 addr = 0x9a56; /* ir-table start address */ | 555 | u16 addr = 0x9a56; /* ir-table start address */ |
| @@ -999,7 +999,7 @@ static int af9015_rc_query(struct dvb_usb_device *d, u32 *event, int *state) | |||
| 999 | } | 999 | } |
| 1000 | 1000 | ||
| 1001 | /* init 2nd I2C adapter */ | 1001 | /* init 2nd I2C adapter */ |
| 1002 | int af9015_i2c_init(struct dvb_usb_device *d) | 1002 | static int af9015_i2c_init(struct dvb_usb_device *d) |
| 1003 | { | 1003 | { |
| 1004 | int ret; | 1004 | int ret; |
| 1005 | struct af9015_state *state = d->priv; | 1005 | struct af9015_state *state = d->priv; |
| @@ -1419,7 +1419,7 @@ static int af9015_usb_probe(struct usb_interface *intf, | |||
| 1419 | return ret; | 1419 | return ret; |
| 1420 | } | 1420 | } |
| 1421 | 1421 | ||
| 1422 | void af9015_i2c_exit(struct dvb_usb_device *d) | 1422 | static void af9015_i2c_exit(struct dvb_usb_device *d) |
| 1423 | { | 1423 | { |
| 1424 | struct af9015_state *state = d->priv; | 1424 | struct af9015_state *state = d->priv; |
| 1425 | deb_info("%s: \n", __func__); | 1425 | deb_info("%s: \n", __func__); |
diff --git a/drivers/media/dvb/dvb-usb/af9015.h b/drivers/media/dvb/dvb-usb/af9015.h index 882e8a4b3681..6c3c97293316 100644 --- a/drivers/media/dvb/dvb-usb/af9015.h +++ b/drivers/media/dvb/dvb-usb/af9015.h | |||
| @@ -27,7 +27,6 @@ | |||
| 27 | #define DVB_USB_LOG_PREFIX "af9015" | 27 | #define DVB_USB_LOG_PREFIX "af9015" |
| 28 | #include "dvb-usb.h" | 28 | #include "dvb-usb.h" |
| 29 | 29 | ||
| 30 | extern int dvb_usb_af9015_debug; | ||
| 31 | #define deb_info(args...) dprintk(dvb_usb_af9015_debug, 0x01, args) | 30 | #define deb_info(args...) dprintk(dvb_usb_af9015_debug, 0x01, args) |
| 32 | #define deb_rc(args...) dprintk(dvb_usb_af9015_debug, 0x02, args) | 31 | #define deb_rc(args...) dprintk(dvb_usb_af9015_debug, 0x02, args) |
| 33 | #define deb_xfer(args...) dprintk(dvb_usb_af9015_debug, 0x04, args) | 32 | #define deb_xfer(args...) dprintk(dvb_usb_af9015_debug, 0x04, args) |
diff --git a/drivers/media/dvb/dvb-usb/anysee.c b/drivers/media/dvb/dvb-usb/anysee.c index c786359fba03..cd2edbcaa097 100644 --- a/drivers/media/dvb/dvb-usb/anysee.c +++ b/drivers/media/dvb/dvb-usb/anysee.c | |||
| @@ -46,7 +46,7 @@ module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644); | |||
| 46 | MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)"); | 46 | MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)"); |
| 47 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); | 47 | DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); |
| 48 | 48 | ||
| 49 | static struct mutex anysee_usb_mutex; | 49 | static DEFINE_MUTEX(anysee_usb_mutex); |
| 50 | 50 | ||
| 51 | static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen, | 51 | static int anysee_ctrl_msg(struct dvb_usb_device *d, u8 *sbuf, u8 slen, |
| 52 | u8 *rbuf, u8 rlen) | 52 | u8 *rbuf, u8 rlen) |
| @@ -456,8 +456,6 @@ static int anysee_probe(struct usb_interface *intf, | |||
| 456 | struct usb_host_interface *alt; | 456 | struct usb_host_interface *alt; |
| 457 | int ret; | 457 | int ret; |
| 458 | 458 | ||
| 459 | mutex_init(&anysee_usb_mutex); | ||
| 460 | |||
| 461 | /* There is one interface with two alternate settings. | 459 | /* There is one interface with two alternate settings. |
| 462 | Alternate setting 0 is for bulk transfer. | 460 | Alternate setting 0 is for bulk transfer. |
| 463 | Alternate setting 1 is for isochronous transfer. | 461 | Alternate setting 1 is for isochronous transfer. |
diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-urb.c b/drivers/media/dvb/dvb-usb/dvb-usb-urb.c index 5cef12a07f72..6fe71c6745eb 100644 --- a/drivers/media/dvb/dvb-usb/dvb-usb-urb.c +++ b/drivers/media/dvb/dvb-usb/dvb-usb-urb.c | |||
| @@ -13,14 +13,14 @@ int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, | |||
| 13 | { | 13 | { |
| 14 | int actlen,ret = -ENOMEM; | 14 | int actlen,ret = -ENOMEM; |
| 15 | 15 | ||
| 16 | if (!d || wbuf == NULL || wlen == 0) | ||
| 17 | return -EINVAL; | ||
| 18 | |||
| 16 | if (d->props.generic_bulk_ctrl_endpoint == 0) { | 19 | if (d->props.generic_bulk_ctrl_endpoint == 0) { |
| 17 | err("endpoint for generic control not specified."); | 20 | err("endpoint for generic control not specified."); |
| 18 | return -EINVAL; | 21 | return -EINVAL; |
| 19 | } | 22 | } |
| 20 | 23 | ||
| 21 | if (wbuf == NULL || wlen == 0) | ||
| 22 | return -EINVAL; | ||
| 23 | |||
| 24 | if ((ret = mutex_lock_interruptible(&d->usb_mutex))) | 24 | if ((ret = mutex_lock_interruptible(&d->usb_mutex))) |
| 25 | return ret; | 25 | return ret; |
| 26 | 26 | ||
diff --git a/drivers/media/dvb/frontends/af9013.c b/drivers/media/dvb/frontends/af9013.c index 21c1060cf10e..692b68a9e73b 100644 --- a/drivers/media/dvb/frontends/af9013.c +++ b/drivers/media/dvb/frontends/af9013.c | |||
| @@ -1187,7 +1187,7 @@ static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
| 1187 | if (tmp) | 1187 | if (tmp) |
| 1188 | *status |= FE_HAS_SYNC | FE_HAS_LOCK; | 1188 | *status |= FE_HAS_SYNC | FE_HAS_LOCK; |
| 1189 | 1189 | ||
| 1190 | if (!*status & FE_HAS_SIGNAL) { | 1190 | if (!(*status & FE_HAS_SIGNAL)) { |
| 1191 | /* AGC lock */ | 1191 | /* AGC lock */ |
| 1192 | ret = af9013_read_reg_bits(state, 0xd1a0, 6, 1, &tmp); | 1192 | ret = af9013_read_reg_bits(state, 0xd1a0, 6, 1, &tmp); |
| 1193 | if (ret) | 1193 | if (ret) |
| @@ -1196,7 +1196,7 @@ static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
| 1196 | *status |= FE_HAS_SIGNAL; | 1196 | *status |= FE_HAS_SIGNAL; |
| 1197 | } | 1197 | } |
| 1198 | 1198 | ||
| 1199 | if (!*status & FE_HAS_CARRIER) { | 1199 | if (!(*status & FE_HAS_CARRIER)) { |
| 1200 | /* CFO lock */ | 1200 | /* CFO lock */ |
| 1201 | ret = af9013_read_reg_bits(state, 0xd333, 7, 1, &tmp); | 1201 | ret = af9013_read_reg_bits(state, 0xd333, 7, 1, &tmp); |
| 1202 | if (ret) | 1202 | if (ret) |
| @@ -1205,7 +1205,7 @@ static int af9013_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
| 1205 | *status |= FE_HAS_CARRIER; | 1205 | *status |= FE_HAS_CARRIER; |
| 1206 | } | 1206 | } |
| 1207 | 1207 | ||
| 1208 | if (!*status & FE_HAS_CARRIER) { | 1208 | if (!(*status & FE_HAS_CARRIER)) { |
| 1209 | /* SFOE lock */ | 1209 | /* SFOE lock */ |
| 1210 | ret = af9013_read_reg_bits(state, 0xd334, 6, 1, &tmp); | 1210 | ret = af9013_read_reg_bits(state, 0xd334, 6, 1, &tmp); |
| 1211 | if (ret) | 1211 | if (ret) |
diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index 04cd7c04bdde..5189c4eb439f 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig | |||
| @@ -355,6 +355,20 @@ config USB_SI470X | |||
| 355 | tristate "Silicon Labs Si470x FM Radio Receiver support" | 355 | tristate "Silicon Labs Si470x FM Radio Receiver support" |
| 356 | depends on USB && VIDEO_V4L2 | 356 | depends on USB && VIDEO_V4L2 |
| 357 | ---help--- | 357 | ---help--- |
| 358 | This is a driver for USB devices with the Silicon Labs SI470x | ||
| 359 | chip. Currently these devices are known to work: | ||
| 360 | - 10c4:818a: Silicon Labs USB FM Radio Reference Design | ||
| 361 | - 06e1:a155: ADS/Tech FM Radio Receiver (formerly Instant FM Music) | ||
| 362 | - 1b80:d700: KWorld USB FM Radio SnapMusic Mobile 700 (FM700) | ||
| 363 | |||
| 364 | Sound is provided by the ALSA USB Audio/MIDI driver. Therefore | ||
| 365 | if you don't want to use the device solely for RDS receiving, | ||
| 366 | it is recommended to also select SND_USB_AUDIO. | ||
| 367 | |||
| 368 | Please have a look at the documentation, especially on how | ||
| 369 | to redirect the audio stream from the radio to your sound device: | ||
| 370 | Documentation/video4linux/si470x.txt | ||
| 371 | |||
| 358 | Say Y here if you want to connect this type of radio to your | 372 | Say Y here if you want to connect this type of radio to your |
| 359 | computer's USB port. | 373 | computer's USB port. |
| 360 | 374 | ||
diff --git a/drivers/media/radio/radio-si470x.c b/drivers/media/radio/radio-si470x.c index 5920cd306975..3e1830293de5 100644 --- a/drivers/media/radio/radio-si470x.c +++ b/drivers/media/radio/radio-si470x.c | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | * Driver for USB radios for the Silicon Labs Si470x FM Radio Receivers: | 4 | * Driver for USB radios for the Silicon Labs Si470x FM Radio Receivers: |
| 5 | * - Silicon Labs USB FM Radio Reference Design | 5 | * - Silicon Labs USB FM Radio Reference Design |
| 6 | * - ADS/Tech FM Radio Receiver (formerly Instant FM Music) (RDX-155-EF) | 6 | * - ADS/Tech FM Radio Receiver (formerly Instant FM Music) (RDX-155-EF) |
| 7 | * - KWorld USB FM Radio SnapMusic Mobile 700 (FM700) | ||
| 7 | * | 8 | * |
| 8 | * Copyright (c) 2008 Tobias Lorenz <tobias.lorenz@gmx.net> | 9 | * Copyright (c) 2008 Tobias Lorenz <tobias.lorenz@gmx.net> |
| 9 | * | 10 | * |
| @@ -24,19 +25,6 @@ | |||
| 24 | 25 | ||
| 25 | 26 | ||
| 26 | /* | 27 | /* |
| 27 | * User Notes: | ||
| 28 | * - USB Audio is provided by the alsa snd_usb_audio module. | ||
| 29 | * For listing you have to redirect the sound, for example using: | ||
| 30 | * arecord -D hw:1,0 -r96000 -c2 -f S16_LE | artsdsp aplay -B - | ||
| 31 | * - regarding module parameters in /sys/module/radio_si470x/parameters: | ||
| 32 | * the contents of read-only files (0444) are not updated, even if | ||
| 33 | * space, band and de are changed using private video controls | ||
| 34 | * - increase tune_timeout, if you often get -EIO errors | ||
| 35 | * - hw_freq_seek returns -EAGAIN, when timed out or band limit is reached | ||
| 36 | */ | ||
| 37 | |||
| 38 | |||
| 39 | /* | ||
| 40 | * History: | 28 | * History: |
| 41 | * 2008-01-12 Tobias Lorenz <tobias.lorenz@gmx.net> | 29 | * 2008-01-12 Tobias Lorenz <tobias.lorenz@gmx.net> |
| 42 | * Version 1.0.0 | 30 | * Version 1.0.0 |
| @@ -105,6 +93,9 @@ | |||
| 105 | * - afc indication | 93 | * - afc indication |
| 106 | * - more safety checks, let si470x_get_freq return errno | 94 | * - more safety checks, let si470x_get_freq return errno |
| 107 | * - vidioc behavior corrected according to v4l2 spec | 95 | * - vidioc behavior corrected according to v4l2 spec |
| 96 | * 2008-10-20 Alexey Klimov <klimov.linux@gmail.com> | ||
| 97 | * - add support for KWorld USB FM Radio FM700 | ||
| 98 | * - blacklisted KWorld radio in hid-core.c and hid-ids.h | ||
| 108 | * | 99 | * |
| 109 | * ToDo: | 100 | * ToDo: |
| 110 | * - add firmware download/update support | 101 | * - add firmware download/update support |
| @@ -145,6 +136,8 @@ static struct usb_device_id si470x_usb_driver_id_table[] = { | |||
| 145 | { USB_DEVICE_AND_INTERFACE_INFO(0x10c4, 0x818a, USB_CLASS_HID, 0, 0) }, | 136 | { USB_DEVICE_AND_INTERFACE_INFO(0x10c4, 0x818a, USB_CLASS_HID, 0, 0) }, |
| 146 | /* ADS/Tech FM Radio Receiver (formerly Instant FM Music) */ | 137 | /* ADS/Tech FM Radio Receiver (formerly Instant FM Music) */ |
| 147 | { USB_DEVICE_AND_INTERFACE_INFO(0x06e1, 0xa155, USB_CLASS_HID, 0, 0) }, | 138 | { USB_DEVICE_AND_INTERFACE_INFO(0x06e1, 0xa155, USB_CLASS_HID, 0, 0) }, |
| 139 | /* KWorld USB FM Radio SnapMusic Mobile 700 (FM700) */ | ||
| 140 | { USB_DEVICE_AND_INTERFACE_INFO(0x1b80, 0xd700, USB_CLASS_HID, 0, 0) }, | ||
| 148 | /* Terminating entry */ | 141 | /* Terminating entry */ |
| 149 | { } | 142 | { } |
| 150 | }; | 143 | }; |
diff --git a/drivers/media/video/cafe_ccic.c b/drivers/media/video/cafe_ccic.c index a8c068e1de1c..1740b9ebdcef 100644 --- a/drivers/media/video/cafe_ccic.c +++ b/drivers/media/video/cafe_ccic.c | |||
| @@ -1476,12 +1476,9 @@ static int cafe_v4l_open(struct inode *inode, struct file *filp) | |||
| 1476 | { | 1476 | { |
| 1477 | struct cafe_camera *cam; | 1477 | struct cafe_camera *cam; |
| 1478 | 1478 | ||
| 1479 | lock_kernel(); | ||
| 1480 | cam = cafe_find_dev(iminor(inode)); | 1479 | cam = cafe_find_dev(iminor(inode)); |
| 1481 | if (cam == NULL) { | 1480 | if (cam == NULL) |
| 1482 | unlock_kernel(); | ||
| 1483 | return -ENODEV; | 1481 | return -ENODEV; |
| 1484 | } | ||
| 1485 | filp->private_data = cam; | 1482 | filp->private_data = cam; |
| 1486 | 1483 | ||
| 1487 | mutex_lock(&cam->s_mutex); | 1484 | mutex_lock(&cam->s_mutex); |
| @@ -1493,7 +1490,6 @@ static int cafe_v4l_open(struct inode *inode, struct file *filp) | |||
| 1493 | } | 1490 | } |
| 1494 | (cam->users)++; | 1491 | (cam->users)++; |
| 1495 | mutex_unlock(&cam->s_mutex); | 1492 | mutex_unlock(&cam->s_mutex); |
| 1496 | unlock_kernel(); | ||
| 1497 | return 0; | 1493 | return 0; |
| 1498 | } | 1494 | } |
| 1499 | 1495 | ||
diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c index bd5d9de5a008..e6ca4012b5f0 100644 --- a/drivers/media/video/compat_ioctl32.c +++ b/drivers/media/video/compat_ioctl32.c | |||
| @@ -867,6 +867,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 867 | case VIDIOC_STREAMON32: | 867 | case VIDIOC_STREAMON32: |
| 868 | case VIDIOC_STREAMOFF32: | 868 | case VIDIOC_STREAMOFF32: |
| 869 | case VIDIOC_G_PARM: | 869 | case VIDIOC_G_PARM: |
| 870 | case VIDIOC_S_PARM: | ||
| 870 | case VIDIOC_G_STD: | 871 | case VIDIOC_G_STD: |
| 871 | case VIDIOC_S_STD: | 872 | case VIDIOC_S_STD: |
| 872 | case VIDIOC_G_TUNER: | 873 | case VIDIOC_G_TUNER: |
| @@ -885,6 +886,8 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg) | |||
| 885 | case VIDIOC_S_INPUT32: | 886 | case VIDIOC_S_INPUT32: |
| 886 | case VIDIOC_TRY_FMT32: | 887 | case VIDIOC_TRY_FMT32: |
| 887 | case VIDIOC_S_HW_FREQ_SEEK: | 888 | case VIDIOC_S_HW_FREQ_SEEK: |
| 889 | case VIDIOC_ENUM_FRAMESIZES: | ||
| 890 | case VIDIOC_ENUM_FRAMEINTERVALS: | ||
| 888 | ret = do_video_ioctl(file, cmd, arg); | 891 | ret = do_video_ioctl(file, cmd, arg); |
| 889 | break; | 892 | break; |
| 890 | 893 | ||
diff --git a/drivers/media/video/cx18/cx18-driver.c b/drivers/media/video/cx18/cx18-driver.c index 7a1a7830a6b3..7874d9790a51 100644 --- a/drivers/media/video/cx18/cx18-driver.c +++ b/drivers/media/video/cx18/cx18-driver.c | |||
| @@ -448,7 +448,14 @@ static int __devinit cx18_init_struct1(struct cx18 *cx) | |||
| 448 | mutex_init(&cx->gpio_lock); | 448 | mutex_init(&cx->gpio_lock); |
| 449 | 449 | ||
| 450 | spin_lock_init(&cx->lock); | 450 | spin_lock_init(&cx->lock); |
| 451 | spin_lock_init(&cx->dma_reg_lock); | 451 | |
| 452 | cx->work_queue = create_singlethread_workqueue(cx->name); | ||
| 453 | if (cx->work_queue == NULL) { | ||
| 454 | CX18_ERR("Could not create work queue\n"); | ||
| 455 | return -1; | ||
| 456 | } | ||
| 457 | |||
| 458 | INIT_WORK(&cx->work, cx18_work_handler); | ||
| 452 | 459 | ||
| 453 | /* start counting open_id at 1 */ | 460 | /* start counting open_id at 1 */ |
| 454 | cx->open_id = 1; | 461 | cx->open_id = 1; |
| @@ -581,10 +588,10 @@ static void cx18_load_and_init_modules(struct cx18 *cx) | |||
| 581 | 588 | ||
| 582 | #ifdef MODULE | 589 | #ifdef MODULE |
| 583 | /* load modules */ | 590 | /* load modules */ |
| 584 | #ifndef CONFIG_MEDIA_TUNER | 591 | #ifdef CONFIG_MEDIA_TUNER_MODULE |
| 585 | hw = cx18_request_module(cx, hw, "tuner", CX18_HW_TUNER); | 592 | hw = cx18_request_module(cx, hw, "tuner", CX18_HW_TUNER); |
| 586 | #endif | 593 | #endif |
| 587 | #ifndef CONFIG_VIDEO_CS5345 | 594 | #ifdef CONFIG_VIDEO_CS5345_MODULE |
| 588 | hw = cx18_request_module(cx, hw, "cs5345", CX18_HW_CS5345); | 595 | hw = cx18_request_module(cx, hw, "cs5345", CX18_HW_CS5345); |
| 589 | #endif | 596 | #endif |
| 590 | #endif | 597 | #endif |
| @@ -832,6 +839,7 @@ free_map: | |||
| 832 | free_mem: | 839 | free_mem: |
| 833 | release_mem_region(cx->base_addr, CX18_MEM_SIZE); | 840 | release_mem_region(cx->base_addr, CX18_MEM_SIZE); |
| 834 | free_workqueue: | 841 | free_workqueue: |
| 842 | destroy_workqueue(cx->work_queue); | ||
| 835 | err: | 843 | err: |
| 836 | if (retval == 0) | 844 | if (retval == 0) |
| 837 | retval = -ENODEV; | 845 | retval = -ENODEV; |
| @@ -932,6 +940,9 @@ static void cx18_remove(struct pci_dev *pci_dev) | |||
| 932 | 940 | ||
| 933 | cx18_halt_firmware(cx); | 941 | cx18_halt_firmware(cx); |
| 934 | 942 | ||
| 943 | flush_workqueue(cx->work_queue); | ||
| 944 | destroy_workqueue(cx->work_queue); | ||
| 945 | |||
| 935 | cx18_streams_cleanup(cx, 1); | 946 | cx18_streams_cleanup(cx, 1); |
| 936 | 947 | ||
| 937 | exit_cx18_i2c(cx); | 948 | exit_cx18_i2c(cx); |
diff --git a/drivers/media/video/cx18/cx18-driver.h b/drivers/media/video/cx18/cx18-driver.h index a4b1708fafe7..bbdd5f25041d 100644 --- a/drivers/media/video/cx18/cx18-driver.h +++ b/drivers/media/video/cx18/cx18-driver.h | |||
| @@ -199,12 +199,15 @@ struct cx18_options { | |||
| 199 | #define CX18_F_S_APPL_IO 8 /* this stream is used read/written by an application */ | 199 | #define CX18_F_S_APPL_IO 8 /* this stream is used read/written by an application */ |
| 200 | 200 | ||
| 201 | /* per-cx18, i_flags */ | 201 | /* per-cx18, i_flags */ |
| 202 | #define CX18_F_I_LOADED_FW 0 /* Loaded the firmware the first time */ | 202 | #define CX18_F_I_LOADED_FW 0 /* Loaded firmware 1st time */ |
| 203 | #define CX18_F_I_EOS 4 /* End of encoder stream reached */ | 203 | #define CX18_F_I_EOS 4 /* End of encoder stream */ |
| 204 | #define CX18_F_I_RADIO_USER 5 /* The radio tuner is selected */ | 204 | #define CX18_F_I_RADIO_USER 5 /* radio tuner is selected */ |
| 205 | #define CX18_F_I_ENC_PAUSED 13 /* the encoder is paused */ | 205 | #define CX18_F_I_ENC_PAUSED 13 /* the encoder is paused */ |
| 206 | #define CX18_F_I_INITED 21 /* set after first open */ | 206 | #define CX18_F_I_HAVE_WORK 15 /* there is work to be done */ |
| 207 | #define CX18_F_I_FAILED 22 /* set if first open failed */ | 207 | #define CX18_F_I_WORK_HANDLER_DVB 18 /* work to be done for DVB */ |
| 208 | #define CX18_F_I_INITED 21 /* set after first open */ | ||
| 209 | #define CX18_F_I_FAILED 22 /* set if first open failed */ | ||
| 210 | #define CX18_F_I_WORK_INITED 23 /* worker thread initialized */ | ||
| 208 | 211 | ||
| 209 | /* These are the VBI types as they appear in the embedded VBI private packets. */ | 212 | /* These are the VBI types as they appear in the embedded VBI private packets. */ |
| 210 | #define CX18_SLICED_TYPE_TELETEXT_B (1) | 213 | #define CX18_SLICED_TYPE_TELETEXT_B (1) |
| @@ -402,8 +405,6 @@ struct cx18 { | |||
| 402 | spinlock_t lock; /* lock access to this struct */ | 405 | spinlock_t lock; /* lock access to this struct */ |
| 403 | int search_pack_header; | 406 | int search_pack_header; |
| 404 | 407 | ||
| 405 | spinlock_t dma_reg_lock; /* lock access to DMA engine registers */ | ||
| 406 | |||
| 407 | int open_id; /* incremented each time an open occurs, used as | 408 | int open_id; /* incremented each time an open occurs, used as |
| 408 | unique ID. Starts at 1, so 0 can be used as | 409 | unique ID. Starts at 1, so 0 can be used as |
| 409 | uninitialized value in the stream->id. */ | 410 | uninitialized value in the stream->id. */ |
| @@ -433,6 +434,9 @@ struct cx18 { | |||
| 433 | /* when the current DMA is finished this queue is woken up */ | 434 | /* when the current DMA is finished this queue is woken up */ |
| 434 | wait_queue_head_t dma_waitq; | 435 | wait_queue_head_t dma_waitq; |
| 435 | 436 | ||
| 437 | struct workqueue_struct *work_queue; | ||
| 438 | struct work_struct work; | ||
| 439 | |||
| 436 | /* i2c */ | 440 | /* i2c */ |
| 437 | struct i2c_adapter i2c_adap[2]; | 441 | struct i2c_adapter i2c_adap[2]; |
| 438 | struct i2c_algo_bit_data i2c_algo[2]; | 442 | struct i2c_algo_bit_data i2c_algo[2]; |
diff --git a/drivers/media/video/cx18/cx18-dvb.c b/drivers/media/video/cx18/cx18-dvb.c index afc694e7bdb2..4542e2e5e3d7 100644 --- a/drivers/media/video/cx18/cx18-dvb.c +++ b/drivers/media/video/cx18/cx18-dvb.c | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | #include "cx18-dvb.h" | 23 | #include "cx18-dvb.h" |
| 24 | #include "cx18-io.h" | 24 | #include "cx18-io.h" |
| 25 | #include "cx18-streams.h" | 25 | #include "cx18-streams.h" |
| 26 | #include "cx18-queue.h" | ||
| 27 | #include "cx18-scb.h" | ||
| 26 | #include "cx18-cards.h" | 28 | #include "cx18-cards.h" |
| 27 | #include "s5h1409.h" | 29 | #include "s5h1409.h" |
| 28 | #include "mxl5005s.h" | 30 | #include "mxl5005s.h" |
| @@ -300,3 +302,24 @@ static int dvb_register(struct cx18_stream *stream) | |||
| 300 | 302 | ||
| 301 | return ret; | 303 | return ret; |
| 302 | } | 304 | } |
| 305 | |||
| 306 | void cx18_dvb_work_handler(struct cx18 *cx) | ||
| 307 | { | ||
| 308 | struct cx18_buffer *buf; | ||
| 309 | struct cx18_stream *s = &cx->streams[CX18_ENC_STREAM_TYPE_TS]; | ||
| 310 | |||
| 311 | while ((buf = cx18_dequeue(s, &s->q_full)) != NULL) { | ||
| 312 | if (s->dvb.enabled) | ||
| 313 | dvb_dmx_swfilter(&s->dvb.demux, buf->buf, | ||
| 314 | buf->bytesused); | ||
| 315 | |||
| 316 | cx18_enqueue(s, buf, &s->q_free); | ||
| 317 | cx18_buf_sync_for_device(s, buf); | ||
| 318 | if (s->handle == CX18_INVALID_TASK_HANDLE) /* FIXME: improve */ | ||
| 319 | continue; | ||
| 320 | |||
| 321 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, s->handle, | ||
| 322 | (void __iomem *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem, | ||
| 323 | 1, buf->id, s->buf_size); | ||
| 324 | } | ||
| 325 | } | ||
diff --git a/drivers/media/video/cx18/cx18-dvb.h b/drivers/media/video/cx18/cx18-dvb.h index bf8d8f6f5455..bbdcefc87f28 100644 --- a/drivers/media/video/cx18/cx18-dvb.h +++ b/drivers/media/video/cx18/cx18-dvb.h | |||
| @@ -23,3 +23,4 @@ | |||
| 23 | 23 | ||
| 24 | int cx18_dvb_register(struct cx18_stream *stream); | 24 | int cx18_dvb_register(struct cx18_stream *stream); |
| 25 | void cx18_dvb_unregister(struct cx18_stream *stream); | 25 | void cx18_dvb_unregister(struct cx18_stream *stream); |
| 26 | void cx18_dvb_work_handler(struct cx18 *cx); | ||
diff --git a/drivers/media/video/cx18/cx18-io.c b/drivers/media/video/cx18/cx18-io.c index 700ab9439c16..220fae8d4ad7 100644 --- a/drivers/media/video/cx18/cx18-io.c +++ b/drivers/media/video/cx18/cx18-io.c | |||
| @@ -88,6 +88,19 @@ void cx18_writel_retry(struct cx18 *cx, u32 val, void __iomem *addr) | |||
| 88 | cx18_log_write_retries(cx, i, addr); | 88 | cx18_log_write_retries(cx, i, addr); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | void _cx18_writel_expect(struct cx18 *cx, u32 val, void __iomem *addr, | ||
| 92 | u32 eval, u32 mask) | ||
| 93 | { | ||
| 94 | int i; | ||
| 95 | eval &= mask; | ||
| 96 | for (i = 0; i < CX18_MAX_MMIO_RETRIES; i++) { | ||
| 97 | cx18_writel_noretry(cx, val, addr); | ||
| 98 | if (eval == (cx18_readl_noretry(cx, addr) & mask)) | ||
| 99 | break; | ||
| 100 | } | ||
| 101 | cx18_log_write_retries(cx, i, addr); | ||
| 102 | } | ||
| 103 | |||
| 91 | void cx18_writew_retry(struct cx18 *cx, u16 val, void __iomem *addr) | 104 | void cx18_writew_retry(struct cx18 *cx, u16 val, void __iomem *addr) |
| 92 | { | 105 | { |
| 93 | int i; | 106 | int i; |
| @@ -218,7 +231,7 @@ void cx18_memset_io(struct cx18 *cx, void __iomem *addr, int val, size_t count) | |||
| 218 | void cx18_sw1_irq_enable(struct cx18 *cx, u32 val) | 231 | void cx18_sw1_irq_enable(struct cx18 *cx, u32 val) |
| 219 | { | 232 | { |
| 220 | u32 r; | 233 | u32 r; |
| 221 | cx18_write_reg(cx, val, SW1_INT_STATUS); | 234 | cx18_write_reg_expect(cx, val, SW1_INT_STATUS, ~val, val); |
| 222 | r = cx18_read_reg(cx, SW1_INT_ENABLE_PCI); | 235 | r = cx18_read_reg(cx, SW1_INT_ENABLE_PCI); |
| 223 | cx18_write_reg(cx, r | val, SW1_INT_ENABLE_PCI); | 236 | cx18_write_reg(cx, r | val, SW1_INT_ENABLE_PCI); |
| 224 | } | 237 | } |
| @@ -233,7 +246,7 @@ void cx18_sw1_irq_disable(struct cx18 *cx, u32 val) | |||
| 233 | void cx18_sw2_irq_enable(struct cx18 *cx, u32 val) | 246 | void cx18_sw2_irq_enable(struct cx18 *cx, u32 val) |
| 234 | { | 247 | { |
| 235 | u32 r; | 248 | u32 r; |
| 236 | cx18_write_reg(cx, val, SW2_INT_STATUS); | 249 | cx18_write_reg_expect(cx, val, SW2_INT_STATUS, ~val, val); |
| 237 | r = cx18_read_reg(cx, SW2_INT_ENABLE_PCI); | 250 | r = cx18_read_reg(cx, SW2_INT_ENABLE_PCI); |
| 238 | cx18_write_reg(cx, r | val, SW2_INT_ENABLE_PCI); | 251 | cx18_write_reg(cx, r | val, SW2_INT_ENABLE_PCI); |
| 239 | } | 252 | } |
diff --git a/drivers/media/video/cx18/cx18-io.h b/drivers/media/video/cx18/cx18-io.h index 287a5e8bf67b..425244453ea7 100644 --- a/drivers/media/video/cx18/cx18-io.h +++ b/drivers/media/video/cx18/cx18-io.h | |||
| @@ -133,6 +133,8 @@ static inline void cx18_writel(struct cx18 *cx, u32 val, void __iomem *addr) | |||
| 133 | cx18_writel_noretry(cx, val, addr); | 133 | cx18_writel_noretry(cx, val, addr); |
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | void _cx18_writel_expect(struct cx18 *cx, u32 val, void __iomem *addr, | ||
| 137 | u32 eval, u32 mask); | ||
| 136 | 138 | ||
| 137 | static inline | 139 | static inline |
| 138 | void cx18_writew_noretry(struct cx18 *cx, u16 val, void __iomem *addr) | 140 | void cx18_writew_noretry(struct cx18 *cx, u16 val, void __iomem *addr) |
| @@ -271,6 +273,21 @@ static inline void cx18_write_reg(struct cx18 *cx, u32 val, u32 reg) | |||
| 271 | cx18_write_reg_noretry(cx, val, reg); | 273 | cx18_write_reg_noretry(cx, val, reg); |
| 272 | } | 274 | } |
| 273 | 275 | ||
| 276 | static inline void _cx18_write_reg_expect(struct cx18 *cx, u32 val, u32 reg, | ||
| 277 | u32 eval, u32 mask) | ||
| 278 | { | ||
| 279 | _cx18_writel_expect(cx, val, cx->reg_mem + reg, eval, mask); | ||
| 280 | } | ||
| 281 | |||
| 282 | static inline void cx18_write_reg_expect(struct cx18 *cx, u32 val, u32 reg, | ||
| 283 | u32 eval, u32 mask) | ||
| 284 | { | ||
| 285 | if (cx18_retry_mmio) | ||
| 286 | _cx18_write_reg_expect(cx, val, reg, eval, mask); | ||
| 287 | else | ||
| 288 | cx18_write_reg_noretry(cx, val, reg); | ||
| 289 | } | ||
| 290 | |||
| 274 | 291 | ||
| 275 | static inline u32 cx18_read_reg_noretry(struct cx18 *cx, u32 reg) | 292 | static inline u32 cx18_read_reg_noretry(struct cx18 *cx, u32 reg) |
| 276 | { | 293 | { |
diff --git a/drivers/media/video/cx18/cx18-irq.c b/drivers/media/video/cx18/cx18-irq.c index 360330f5463f..5fbfbd0f1493 100644 --- a/drivers/media/video/cx18/cx18-irq.c +++ b/drivers/media/video/cx18/cx18-irq.c | |||
| @@ -29,8 +29,20 @@ | |||
| 29 | #include "cx18-mailbox.h" | 29 | #include "cx18-mailbox.h" |
| 30 | #include "cx18-vbi.h" | 30 | #include "cx18-vbi.h" |
| 31 | #include "cx18-scb.h" | 31 | #include "cx18-scb.h" |
| 32 | #include "cx18-dvb.h" | ||
| 32 | 33 | ||
| 33 | #define DMA_MAGIC_COOKIE 0x000001fe | 34 | void cx18_work_handler(struct work_struct *work) |
| 35 | { | ||
| 36 | struct cx18 *cx = container_of(work, struct cx18, work); | ||
| 37 | if (test_and_clear_bit(CX18_F_I_WORK_INITED, &cx->i_flags)) { | ||
| 38 | struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; | ||
| 39 | /* This thread must use the FIFO scheduler as it | ||
| 40 | * is realtime sensitive. */ | ||
| 41 | sched_setscheduler(current, SCHED_FIFO, ¶m); | ||
| 42 | } | ||
| 43 | if (test_and_clear_bit(CX18_F_I_WORK_HANDLER_DVB, &cx->i_flags)) | ||
| 44 | cx18_dvb_work_handler(cx); | ||
| 45 | } | ||
| 34 | 46 | ||
| 35 | static void epu_dma_done(struct cx18 *cx, struct cx18_mailbox *mb) | 47 | static void epu_dma_done(struct cx18 *cx, struct cx18_mailbox *mb) |
| 36 | { | 48 | { |
| @@ -67,17 +79,11 @@ static void epu_dma_done(struct cx18 *cx, struct cx18_mailbox *mb) | |||
| 67 | if (buf) { | 79 | if (buf) { |
| 68 | cx18_buf_sync_for_cpu(s, buf); | 80 | cx18_buf_sync_for_cpu(s, buf); |
| 69 | if (s->type == CX18_ENC_STREAM_TYPE_TS && s->dvb.enabled) { | 81 | if (s->type == CX18_ENC_STREAM_TYPE_TS && s->dvb.enabled) { |
| 70 | /* process the buffer here */ | 82 | CX18_DEBUG_HI_DMA("TS recv bytesused = %d\n", |
| 71 | CX18_DEBUG_HI_DMA("TS recv and sent bytesused=%d\n", | ||
| 72 | buf->bytesused); | ||
| 73 | |||
| 74 | dvb_dmx_swfilter(&s->dvb.demux, buf->buf, | ||
| 75 | buf->bytesused); | 83 | buf->bytesused); |
| 76 | 84 | ||
| 77 | cx18_buf_sync_for_device(s, buf); | 85 | set_bit(CX18_F_I_WORK_HANDLER_DVB, &cx->i_flags); |
| 78 | cx18_vapi(cx, CX18_CPU_DE_SET_MDL, 5, s->handle, | 86 | set_bit(CX18_F_I_HAVE_WORK, &cx->i_flags); |
| 79 | (void __iomem *)&cx->scb->cpu_mdl[buf->id] - cx->enc_mem, | ||
| 80 | 1, buf->id, s->buf_size); | ||
| 81 | } else | 87 | } else |
| 82 | set_bit(CX18_F_B_NEED_BUF_SWAP, &buf->b_flags); | 88 | set_bit(CX18_F_B_NEED_BUF_SWAP, &buf->b_flags); |
| 83 | } else { | 89 | } else { |
| @@ -109,7 +115,7 @@ static void epu_debug(struct cx18 *cx, struct cx18_mailbox *mb) | |||
| 109 | CX18_INFO("FW version: %s\n", p - 1); | 115 | CX18_INFO("FW version: %s\n", p - 1); |
| 110 | } | 116 | } |
| 111 | 117 | ||
| 112 | static void hpu_cmd(struct cx18 *cx, u32 sw1) | 118 | static void epu_cmd(struct cx18 *cx, u32 sw1) |
| 113 | { | 119 | { |
| 114 | struct cx18_mailbox mb; | 120 | struct cx18_mailbox mb; |
| 115 | 121 | ||
| @@ -125,12 +131,31 @@ static void hpu_cmd(struct cx18 *cx, u32 sw1) | |||
| 125 | epu_debug(cx, &mb); | 131 | epu_debug(cx, &mb); |
| 126 | break; | 132 | break; |
| 127 | default: | 133 | default: |
| 128 | CX18_WARN("Unexpected mailbox command %08x\n", mb.cmd); | 134 | CX18_WARN("Unknown CPU_TO_EPU mailbox command %#08x\n", |
| 135 | mb.cmd); | ||
| 129 | break; | 136 | break; |
| 130 | } | 137 | } |
| 131 | } | 138 | } |
| 132 | if (sw1 & (IRQ_APU_TO_EPU | IRQ_HPU_TO_EPU)) | 139 | |
| 133 | CX18_WARN("Unexpected interrupt %08x\n", sw1); | 140 | if (sw1 & IRQ_APU_TO_EPU) { |
| 141 | cx18_memcpy_fromio(cx, &mb, &cx->scb->apu2epu_mb, sizeof(mb)); | ||
| 142 | CX18_WARN("Unknown APU_TO_EPU mailbox command %#08x\n", mb.cmd); | ||
| 143 | } | ||
| 144 | |||
| 145 | if (sw1 & IRQ_HPU_TO_EPU) { | ||
| 146 | cx18_memcpy_fromio(cx, &mb, &cx->scb->hpu2epu_mb, sizeof(mb)); | ||
| 147 | CX18_WARN("Unknown HPU_TO_EPU mailbox command %#08x\n", mb.cmd); | ||
| 148 | } | ||
| 149 | } | ||
| 150 | |||
| 151 | static void xpu_ack(struct cx18 *cx, u32 sw2) | ||
| 152 | { | ||
| 153 | if (sw2 & IRQ_CPU_TO_EPU_ACK) | ||
| 154 | wake_up(&cx->mb_cpu_waitq); | ||
| 155 | if (sw2 & IRQ_APU_TO_EPU_ACK) | ||
| 156 | wake_up(&cx->mb_apu_waitq); | ||
| 157 | if (sw2 & IRQ_HPU_TO_EPU_ACK) | ||
| 158 | wake_up(&cx->mb_hpu_waitq); | ||
| 134 | } | 159 | } |
| 135 | 160 | ||
| 136 | irqreturn_t cx18_irq_handler(int irq, void *dev_id) | 161 | irqreturn_t cx18_irq_handler(int irq, void *dev_id) |
| @@ -140,43 +165,36 @@ irqreturn_t cx18_irq_handler(int irq, void *dev_id) | |||
| 140 | u32 sw2, sw2_mask; | 165 | u32 sw2, sw2_mask; |
| 141 | u32 hw2, hw2_mask; | 166 | u32 hw2, hw2_mask; |
| 142 | 167 | ||
| 143 | spin_lock(&cx->dma_reg_lock); | 168 | sw1_mask = cx18_read_reg(cx, SW1_INT_ENABLE_PCI); |
| 144 | 169 | sw1 = cx18_read_reg(cx, SW1_INT_STATUS) & sw1_mask; | |
| 170 | sw2_mask = cx18_read_reg(cx, SW2_INT_ENABLE_PCI); | ||
| 171 | sw2 = cx18_read_reg(cx, SW2_INT_STATUS) & sw2_mask; | ||
| 145 | hw2_mask = cx18_read_reg(cx, HW2_INT_MASK5_PCI); | 172 | hw2_mask = cx18_read_reg(cx, HW2_INT_MASK5_PCI); |
| 146 | hw2 = cx18_read_reg(cx, HW2_INT_CLR_STATUS) & hw2_mask; | 173 | hw2 = cx18_read_reg(cx, HW2_INT_CLR_STATUS) & hw2_mask; |
| 147 | sw2_mask = cx18_read_reg(cx, SW2_INT_ENABLE_PCI) | IRQ_EPU_TO_HPU_ACK; | ||
| 148 | sw2 = cx18_read_reg(cx, SW2_INT_STATUS) & sw2_mask; | ||
| 149 | sw1_mask = cx18_read_reg(cx, SW1_INT_ENABLE_PCI) | IRQ_EPU_TO_HPU; | ||
| 150 | sw1 = cx18_read_reg(cx, SW1_INT_STATUS) & sw1_mask; | ||
| 151 | 174 | ||
| 152 | cx18_write_reg(cx, sw2&sw2_mask, SW2_INT_STATUS); | 175 | if (sw1) |
| 153 | cx18_write_reg(cx, sw1&sw1_mask, SW1_INT_STATUS); | 176 | cx18_write_reg_expect(cx, sw1, SW1_INT_STATUS, ~sw1, sw1); |
| 154 | cx18_write_reg(cx, hw2&hw2_mask, HW2_INT_CLR_STATUS); | 177 | if (sw2) |
| 178 | cx18_write_reg_expect(cx, sw2, SW2_INT_STATUS, ~sw2, sw2); | ||
| 179 | if (hw2) | ||
| 180 | cx18_write_reg_expect(cx, hw2, HW2_INT_CLR_STATUS, ~hw2, hw2); | ||
| 155 | 181 | ||
| 156 | if (sw1 || sw2 || hw2) | 182 | if (sw1 || sw2 || hw2) |
| 157 | CX18_DEBUG_HI_IRQ("SW1: %x SW2: %x HW2: %x\n", sw1, sw2, hw2); | 183 | CX18_DEBUG_HI_IRQ("SW1: %x SW2: %x HW2: %x\n", sw1, sw2, hw2); |
| 158 | 184 | ||
| 159 | /* To do: interrupt-based I2C handling | 185 | /* To do: interrupt-based I2C handling |
| 160 | if (hw2 & 0x00c00000) { | 186 | if (hw2 & (HW2_I2C1_INT|HW2_I2C2_INT)) { |
| 161 | } | 187 | } |
| 162 | */ | 188 | */ |
| 163 | 189 | ||
| 164 | if (sw2) { | 190 | if (sw2) |
| 165 | if (sw2 & (cx18_readl(cx, &cx->scb->cpu2hpu_irq_ack) | | 191 | xpu_ack(cx, sw2); |
| 166 | cx18_readl(cx, &cx->scb->cpu2epu_irq_ack))) | ||
| 167 | wake_up(&cx->mb_cpu_waitq); | ||
| 168 | if (sw2 & (cx18_readl(cx, &cx->scb->apu2hpu_irq_ack) | | ||
| 169 | cx18_readl(cx, &cx->scb->apu2epu_irq_ack))) | ||
| 170 | wake_up(&cx->mb_apu_waitq); | ||
| 171 | if (sw2 & cx18_readl(cx, &cx->scb->epu2hpu_irq_ack)) | ||
| 172 | wake_up(&cx->mb_epu_waitq); | ||
| 173 | if (sw2 & cx18_readl(cx, &cx->scb->hpu2epu_irq_ack)) | ||
| 174 | wake_up(&cx->mb_hpu_waitq); | ||
| 175 | } | ||
| 176 | 192 | ||
| 177 | if (sw1) | 193 | if (sw1) |
| 178 | hpu_cmd(cx, sw1); | 194 | epu_cmd(cx, sw1); |
| 179 | spin_unlock(&cx->dma_reg_lock); | 195 | |
| 196 | if (test_and_clear_bit(CX18_F_I_HAVE_WORK, &cx->i_flags)) | ||
| 197 | queue_work(cx->work_queue, &cx->work); | ||
| 180 | 198 | ||
| 181 | return (hw2 | sw1 | sw2) ? IRQ_HANDLED : IRQ_NONE; | 199 | return (sw1 || sw2 || hw2) ? IRQ_HANDLED : IRQ_NONE; |
| 182 | } | 200 | } |
diff --git a/drivers/media/video/cx18/cx18-irq.h b/drivers/media/video/cx18/cx18-irq.h index 379f704f5cba..6173ca3bc9e4 100644 --- a/drivers/media/video/cx18/cx18-irq.h +++ b/drivers/media/video/cx18/cx18-irq.h | |||
| @@ -32,6 +32,4 @@ | |||
| 32 | 32 | ||
| 33 | irqreturn_t cx18_irq_handler(int irq, void *dev_id); | 33 | irqreturn_t cx18_irq_handler(int irq, void *dev_id); |
| 34 | 34 | ||
| 35 | void cx18_irq_work_handler(struct work_struct *work); | 35 | void cx18_work_handler(struct work_struct *work); |
| 36 | void cx18_dma_stream_dec_prepare(struct cx18_stream *s, u32 offset, int lock); | ||
| 37 | void cx18_unfinished_dma(unsigned long arg); | ||
diff --git a/drivers/media/video/cx18/cx18-mailbox.c b/drivers/media/video/cx18/cx18-mailbox.c index 9d18dd22de76..acff7dfb60df 100644 --- a/drivers/media/video/cx18/cx18-mailbox.c +++ b/drivers/media/video/cx18/cx18-mailbox.c | |||
| @@ -83,7 +83,7 @@ static const struct cx18_api_info api_info[] = { | |||
| 83 | API_ENTRY(CPU, CX18_CPU_DE_SET_MDL_ACK, 0), | 83 | API_ENTRY(CPU, CX18_CPU_DE_SET_MDL_ACK, 0), |
| 84 | API_ENTRY(CPU, CX18_CPU_DE_SET_MDL, API_FAST), | 84 | API_ENTRY(CPU, CX18_CPU_DE_SET_MDL, API_FAST), |
| 85 | API_ENTRY(CPU, CX18_APU_RESETAI, API_FAST), | 85 | API_ENTRY(CPU, CX18_APU_RESETAI, API_FAST), |
| 86 | API_ENTRY(CPU, CX18_CPU_DE_RELEASE_MDL, 0), | 86 | API_ENTRY(CPU, CX18_CPU_DE_RELEASE_MDL, API_SLOW), |
| 87 | API_ENTRY(0, 0, 0), | 87 | API_ENTRY(0, 0, 0), |
| 88 | }; | 88 | }; |
| 89 | 89 | ||
| @@ -176,7 +176,7 @@ long cx18_mb_ack(struct cx18 *cx, const struct cx18_mailbox *mb) | |||
| 176 | 176 | ||
| 177 | cx18_setup_page(cx, SCB_OFFSET); | 177 | cx18_setup_page(cx, SCB_OFFSET); |
| 178 | cx18_write_sync(cx, mb->request, &ack_mb->ack); | 178 | cx18_write_sync(cx, mb->request, &ack_mb->ack); |
| 179 | cx18_write_reg(cx, ack_irq, SW2_INT_SET); | 179 | cx18_write_reg_expect(cx, ack_irq, SW2_INT_SET, ack_irq, ack_irq); |
| 180 | return 0; | 180 | return 0; |
| 181 | } | 181 | } |
| 182 | 182 | ||
| @@ -225,7 +225,7 @@ static int cx18_api_call(struct cx18 *cx, u32 cmd, int args, u32 data[]) | |||
| 225 | } | 225 | } |
| 226 | if (info->flags & API_FAST) | 226 | if (info->flags & API_FAST) |
| 227 | timeout /= 2; | 227 | timeout /= 2; |
| 228 | cx18_write_reg(cx, irq, SW1_INT_SET); | 228 | cx18_write_reg_expect(cx, irq, SW1_INT_SET, irq, irq); |
| 229 | 229 | ||
| 230 | while (!sig && cx18_readl(cx, &mb->ack) != cx18_readl(cx, &mb->request) | 230 | while (!sig && cx18_readl(cx, &mb->ack) != cx18_readl(cx, &mb->request) |
| 231 | && cnt < 660) { | 231 | && cnt < 660) { |
diff --git a/drivers/media/video/cx18/cx18-queue.c b/drivers/media/video/cx18/cx18-queue.c index a33ba04a2686..174682c2582f 100644 --- a/drivers/media/video/cx18/cx18-queue.c +++ b/drivers/media/video/cx18/cx18-queue.c | |||
| @@ -88,15 +88,13 @@ struct cx18_buffer *cx18_queue_get_buf_irq(struct cx18_stream *s, u32 id, | |||
| 88 | 88 | ||
| 89 | if (buf->id != id) | 89 | if (buf->id != id) |
| 90 | continue; | 90 | continue; |
| 91 | |||
| 91 | buf->bytesused = bytesused; | 92 | buf->bytesused = bytesused; |
| 92 | /* the transport buffers are handled differently, | 93 | atomic_dec(&s->q_free.buffers); |
| 93 | they are not moved to the full queue */ | 94 | atomic_inc(&s->q_full.buffers); |
| 94 | if (s->type != CX18_ENC_STREAM_TYPE_TS) { | 95 | s->q_full.bytesused += buf->bytesused; |
| 95 | atomic_dec(&s->q_free.buffers); | 96 | list_move_tail(&buf->list, &s->q_full.list); |
| 96 | atomic_inc(&s->q_full.buffers); | 97 | |
| 97 | s->q_full.bytesused += buf->bytesused; | ||
| 98 | list_move_tail(&buf->list, &s->q_full.list); | ||
| 99 | } | ||
| 100 | spin_unlock(&s->qlock); | 98 | spin_unlock(&s->qlock); |
| 101 | return buf; | 99 | return buf; |
| 102 | } | 100 | } |
diff --git a/drivers/media/video/cx18/cx18-scb.h b/drivers/media/video/cx18/cx18-scb.h index 86b4cb15d163..594713bbed68 100644 --- a/drivers/media/video/cx18/cx18-scb.h +++ b/drivers/media/video/cx18/cx18-scb.h | |||
| @@ -128,22 +128,22 @@ struct cx18_scb { | |||
| 128 | u32 apu2cpu_irq; | 128 | u32 apu2cpu_irq; |
| 129 | /* Value to write to register SW2 register set (0xC7003140) after the | 129 | /* Value to write to register SW2 register set (0xC7003140) after the |
| 130 | command is cleared */ | 130 | command is cleared */ |
| 131 | u32 apu2cpu_irq_ack; | 131 | u32 cpu2apu_irq_ack; |
| 132 | u32 reserved2[13]; | 132 | u32 reserved2[13]; |
| 133 | 133 | ||
| 134 | u32 hpu2cpu_mb_offset; | 134 | u32 hpu2cpu_mb_offset; |
| 135 | u32 hpu2cpu_irq; | 135 | u32 hpu2cpu_irq; |
| 136 | u32 hpu2cpu_irq_ack; | 136 | u32 cpu2hpu_irq_ack; |
| 137 | u32 reserved3[13]; | 137 | u32 reserved3[13]; |
| 138 | 138 | ||
| 139 | u32 ppu2cpu_mb_offset; | 139 | u32 ppu2cpu_mb_offset; |
| 140 | u32 ppu2cpu_irq; | 140 | u32 ppu2cpu_irq; |
| 141 | u32 ppu2cpu_irq_ack; | 141 | u32 cpu2ppu_irq_ack; |
| 142 | u32 reserved4[13]; | 142 | u32 reserved4[13]; |
| 143 | 143 | ||
| 144 | u32 epu2cpu_mb_offset; | 144 | u32 epu2cpu_mb_offset; |
| 145 | u32 epu2cpu_irq; | 145 | u32 epu2cpu_irq; |
| 146 | u32 epu2cpu_irq_ack; | 146 | u32 cpu2epu_irq_ack; |
| 147 | u32 reserved5[13]; | 147 | u32 reserved5[13]; |
| 148 | u32 reserved6[8]; | 148 | u32 reserved6[8]; |
| 149 | 149 | ||
| @@ -153,22 +153,22 @@ struct cx18_scb { | |||
| 153 | u32 reserved11[7]; | 153 | u32 reserved11[7]; |
| 154 | u32 cpu2apu_mb_offset; | 154 | u32 cpu2apu_mb_offset; |
| 155 | u32 cpu2apu_irq; | 155 | u32 cpu2apu_irq; |
| 156 | u32 cpu2apu_irq_ack; | 156 | u32 apu2cpu_irq_ack; |
| 157 | u32 reserved12[13]; | 157 | u32 reserved12[13]; |
| 158 | 158 | ||
| 159 | u32 hpu2apu_mb_offset; | 159 | u32 hpu2apu_mb_offset; |
| 160 | u32 hpu2apu_irq; | 160 | u32 hpu2apu_irq; |
| 161 | u32 hpu2apu_irq_ack; | 161 | u32 apu2hpu_irq_ack; |
| 162 | u32 reserved13[13]; | 162 | u32 reserved13[13]; |
| 163 | 163 | ||
| 164 | u32 ppu2apu_mb_offset; | 164 | u32 ppu2apu_mb_offset; |
| 165 | u32 ppu2apu_irq; | 165 | u32 ppu2apu_irq; |
| 166 | u32 ppu2apu_irq_ack; | 166 | u32 apu2ppu_irq_ack; |
| 167 | u32 reserved14[13]; | 167 | u32 reserved14[13]; |
| 168 | 168 | ||
| 169 | u32 epu2apu_mb_offset; | 169 | u32 epu2apu_mb_offset; |
| 170 | u32 epu2apu_irq; | 170 | u32 epu2apu_irq; |
| 171 | u32 epu2apu_irq_ack; | 171 | u32 apu2epu_irq_ack; |
| 172 | u32 reserved15[13]; | 172 | u32 reserved15[13]; |
| 173 | u32 reserved16[8]; | 173 | u32 reserved16[8]; |
| 174 | 174 | ||
| @@ -178,22 +178,22 @@ struct cx18_scb { | |||
| 178 | u32 reserved21[7]; | 178 | u32 reserved21[7]; |
| 179 | u32 cpu2hpu_mb_offset; | 179 | u32 cpu2hpu_mb_offset; |
| 180 | u32 cpu2hpu_irq; | 180 | u32 cpu2hpu_irq; |
| 181 | u32 cpu2hpu_irq_ack; | 181 | u32 hpu2cpu_irq_ack; |
| 182 | u32 reserved22[13]; | 182 | u32 reserved22[13]; |
| 183 | 183 | ||
| 184 | u32 apu2hpu_mb_offset; | 184 | u32 apu2hpu_mb_offset; |
| 185 | u32 apu2hpu_irq; | 185 | u32 apu2hpu_irq; |
| 186 | u32 apu2hpu_irq_ack; | 186 | u32 hpu2apu_irq_ack; |
| 187 | u32 reserved23[13]; | 187 | u32 reserved23[13]; |
| 188 | 188 | ||
| 189 | u32 ppu2hpu_mb_offset; | 189 | u32 ppu2hpu_mb_offset; |
| 190 | u32 ppu2hpu_irq; | 190 | u32 ppu2hpu_irq; |
| 191 | u32 ppu2hpu_irq_ack; | 191 | u32 hpu2ppu_irq_ack; |
| 192 | u32 reserved24[13]; | 192 | u32 reserved24[13]; |
| 193 | 193 | ||
| 194 | u32 epu2hpu_mb_offset; | 194 | u32 epu2hpu_mb_offset; |
| 195 | u32 epu2hpu_irq; | 195 | u32 epu2hpu_irq; |
| 196 | u32 epu2hpu_irq_ack; | 196 | u32 hpu2epu_irq_ack; |
| 197 | u32 reserved25[13]; | 197 | u32 reserved25[13]; |
| 198 | u32 reserved26[8]; | 198 | u32 reserved26[8]; |
| 199 | 199 | ||
| @@ -203,22 +203,22 @@ struct cx18_scb { | |||
| 203 | u32 reserved31[7]; | 203 | u32 reserved31[7]; |
| 204 | u32 cpu2ppu_mb_offset; | 204 | u32 cpu2ppu_mb_offset; |
| 205 | u32 cpu2ppu_irq; | 205 | u32 cpu2ppu_irq; |
| 206 | u32 cpu2ppu_irq_ack; | 206 | u32 ppu2cpu_irq_ack; |
| 207 | u32 reserved32[13]; | 207 | u32 reserved32[13]; |
| 208 | 208 | ||
| 209 | u32 apu2ppu_mb_offset; | 209 | u32 apu2ppu_mb_offset; |
| 210 | u32 apu2ppu_irq; | 210 | u32 apu2ppu_irq; |
| 211 | u32 apu2ppu_irq_ack; | 211 | u32 ppu2apu_irq_ack; |
| 212 | u32 reserved33[13]; | 212 | u32 reserved33[13]; |
| 213 | 213 | ||
| 214 | u32 hpu2ppu_mb_offset; | 214 | u32 hpu2ppu_mb_offset; |
| 215 | u32 hpu2ppu_irq; | 215 | u32 hpu2ppu_irq; |
| 216 | u32 hpu2ppu_irq_ack; | 216 | u32 ppu2hpu_irq_ack; |
| 217 | u32 reserved34[13]; | 217 | u32 reserved34[13]; |
| 218 | 218 | ||
| 219 | u32 epu2ppu_mb_offset; | 219 | u32 epu2ppu_mb_offset; |
| 220 | u32 epu2ppu_irq; | 220 | u32 epu2ppu_irq; |
| 221 | u32 epu2ppu_irq_ack; | 221 | u32 ppu2epu_irq_ack; |
| 222 | u32 reserved35[13]; | 222 | u32 reserved35[13]; |
| 223 | u32 reserved36[8]; | 223 | u32 reserved36[8]; |
| 224 | 224 | ||
| @@ -228,22 +228,22 @@ struct cx18_scb { | |||
| 228 | u32 reserved41[7]; | 228 | u32 reserved41[7]; |
| 229 | u32 cpu2epu_mb_offset; | 229 | u32 cpu2epu_mb_offset; |
| 230 | u32 cpu2epu_irq; | 230 | u32 cpu2epu_irq; |
| 231 | u32 cpu2epu_irq_ack; | 231 | u32 epu2cpu_irq_ack; |
| 232 | u32 reserved42[13]; | 232 | u32 reserved42[13]; |
| 233 | 233 | ||
| 234 | u32 apu2epu_mb_offset; | 234 | u32 apu2epu_mb_offset; |
| 235 | u32 apu2epu_irq; | 235 | u32 apu2epu_irq; |
| 236 | u32 apu2epu_irq_ack; | 236 | u32 epu2apu_irq_ack; |
| 237 | u32 reserved43[13]; | 237 | u32 reserved43[13]; |
| 238 | 238 | ||
| 239 | u32 hpu2epu_mb_offset; | 239 | u32 hpu2epu_mb_offset; |
| 240 | u32 hpu2epu_irq; | 240 | u32 hpu2epu_irq; |
| 241 | u32 hpu2epu_irq_ack; | 241 | u32 epu2hpu_irq_ack; |
| 242 | u32 reserved44[13]; | 242 | u32 reserved44[13]; |
| 243 | 243 | ||
| 244 | u32 ppu2epu_mb_offset; | 244 | u32 ppu2epu_mb_offset; |
| 245 | u32 ppu2epu_irq; | 245 | u32 ppu2epu_irq; |
| 246 | u32 ppu2epu_irq_ack; | 246 | u32 epu2ppu_irq_ack; |
| 247 | u32 reserved45[13]; | 247 | u32 reserved45[13]; |
| 248 | u32 reserved46[8]; | 248 | u32 reserved46[8]; |
| 249 | 249 | ||
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c index 078be6319556..d3ae5b4dfca7 100644 --- a/drivers/media/video/cx88/cx88-blackbird.c +++ b/drivers/media/video/cx88/cx88-blackbird.c | |||
| @@ -1078,7 +1078,7 @@ static int mpeg_open(struct inode *inode, struct file *file) | |||
| 1078 | } | 1078 | } |
| 1079 | } | 1079 | } |
| 1080 | 1080 | ||
| 1081 | if (blackbird_initialize_codec(dev) < 0) { | 1081 | if (!atomic_read(&dev->core->mpeg_users) && blackbird_initialize_codec(dev) < 0) { |
| 1082 | if (drv) | 1082 | if (drv) |
| 1083 | drv->request_release(drv); | 1083 | drv->request_release(drv); |
| 1084 | unlock_kernel(); | 1084 | unlock_kernel(); |
| @@ -1109,6 +1109,8 @@ static int mpeg_open(struct inode *inode, struct file *file) | |||
| 1109 | fh->mpegq.field); | 1109 | fh->mpegq.field); |
| 1110 | unlock_kernel(); | 1110 | unlock_kernel(); |
| 1111 | 1111 | ||
| 1112 | atomic_inc(&dev->core->mpeg_users); | ||
| 1113 | |||
| 1112 | return 0; | 1114 | return 0; |
| 1113 | } | 1115 | } |
| 1114 | 1116 | ||
| @@ -1118,7 +1120,7 @@ static int mpeg_release(struct inode *inode, struct file *file) | |||
| 1118 | struct cx8802_dev *dev = fh->dev; | 1120 | struct cx8802_dev *dev = fh->dev; |
| 1119 | struct cx8802_driver *drv = NULL; | 1121 | struct cx8802_driver *drv = NULL; |
| 1120 | 1122 | ||
| 1121 | if (dev->mpeg_active) | 1123 | if (dev->mpeg_active && atomic_read(&dev->core->mpeg_users) == 1) |
| 1122 | blackbird_stop_codec(dev); | 1124 | blackbird_stop_codec(dev); |
| 1123 | 1125 | ||
| 1124 | cx8802_cancel_buffers(fh->dev); | 1126 | cx8802_cancel_buffers(fh->dev); |
| @@ -1138,6 +1140,8 @@ static int mpeg_release(struct inode *inode, struct file *file) | |||
| 1138 | if (drv) | 1140 | if (drv) |
| 1139 | drv->request_release(drv); | 1141 | drv->request_release(drv); |
| 1140 | 1142 | ||
| 1143 | atomic_dec(&dev->core->mpeg_users); | ||
| 1144 | |||
| 1141 | return 0; | 1145 | return 0; |
| 1142 | } | 1146 | } |
| 1143 | 1147 | ||
| @@ -1158,6 +1162,10 @@ static unsigned int | |||
| 1158 | mpeg_poll(struct file *file, struct poll_table_struct *wait) | 1162 | mpeg_poll(struct file *file, struct poll_table_struct *wait) |
| 1159 | { | 1163 | { |
| 1160 | struct cx8802_fh *fh = file->private_data; | 1164 | struct cx8802_fh *fh = file->private_data; |
| 1165 | struct cx8802_dev *dev = fh->dev; | ||
| 1166 | |||
| 1167 | if (!dev->mpeg_active) | ||
| 1168 | blackbird_start_codec(file, fh); | ||
| 1161 | 1169 | ||
| 1162 | return videobuf_poll_stream(file, &fh->mpegq, wait); | 1170 | return videobuf_poll_stream(file, &fh->mpegq, wait); |
| 1163 | } | 1171 | } |
diff --git a/drivers/media/video/cx88/cx88-dvb.c b/drivers/media/video/cx88/cx88-dvb.c index cf6c30d4e545..309ca5e68063 100644 --- a/drivers/media/video/cx88/cx88-dvb.c +++ b/drivers/media/video/cx88/cx88-dvb.c | |||
| @@ -598,6 +598,11 @@ static int dvb_register(struct cx8802_dev *dev) | |||
| 598 | struct videobuf_dvb_frontend *fe0, *fe1 = NULL; | 598 | struct videobuf_dvb_frontend *fe0, *fe1 = NULL; |
| 599 | int mfe_shared = 0; /* bus not shared by default */ | 599 | int mfe_shared = 0; /* bus not shared by default */ |
| 600 | 600 | ||
| 601 | if (0 != core->i2c_rc) { | ||
| 602 | printk(KERN_ERR "%s/2: no i2c-bus available, cannot attach dvb drivers\n", core->name); | ||
| 603 | goto frontend_detach; | ||
| 604 | } | ||
| 605 | |||
| 601 | /* Get the first frontend */ | 606 | /* Get the first frontend */ |
| 602 | fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1); | 607 | fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1); |
| 603 | if (!fe0) | 608 | if (!fe0) |
diff --git a/drivers/media/video/cx88/cx88-mpeg.c b/drivers/media/video/cx88/cx88-mpeg.c index a1c435b4b1cd..3ebdcd1d83f8 100644 --- a/drivers/media/video/cx88/cx88-mpeg.c +++ b/drivers/media/video/cx88/cx88-mpeg.c | |||
| @@ -769,10 +769,6 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev, | |||
| 769 | struct cx8802_dev *dev; | 769 | struct cx8802_dev *dev; |
| 770 | struct cx88_core *core; | 770 | struct cx88_core *core; |
| 771 | int err; | 771 | int err; |
| 772 | #if defined(CONFIG_VIDEO_CX88_DVB) || defined(CONFIG_VIDEO_CX88_DVB_MODULE) | ||
| 773 | struct videobuf_dvb_frontend *demod; | ||
| 774 | int i; | ||
| 775 | #endif | ||
| 776 | 772 | ||
| 777 | /* general setup */ | 773 | /* general setup */ |
| 778 | core = cx88_core_get(pci_dev); | 774 | core = cx88_core_get(pci_dev); |
| @@ -803,15 +799,21 @@ static int __devinit cx8802_probe(struct pci_dev *pci_dev, | |||
| 803 | mutex_init(&dev->frontends.lock); | 799 | mutex_init(&dev->frontends.lock); |
| 804 | INIT_LIST_HEAD(&dev->frontends.felist); | 800 | INIT_LIST_HEAD(&dev->frontends.felist); |
| 805 | 801 | ||
| 806 | if (core->board.num_frontends) | 802 | if (core->board.num_frontends) { |
| 807 | printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__, core->board.num_frontends); | 803 | struct videobuf_dvb_frontend *fe; |
| 808 | 804 | int i; | |
| 809 | for (i = 1; i <= core->board.num_frontends; i++) { | 805 | |
| 810 | demod = videobuf_dvb_alloc_frontend(&dev->frontends, i); | 806 | printk(KERN_INFO "%s() allocating %d frontend(s)\n", __func__, |
| 811 | if(demod == NULL) { | 807 | core->board.num_frontends); |
| 812 | printk(KERN_ERR "%s() failed to alloc\n", __func__); | 808 | for (i = 1; i <= core->board.num_frontends; i++) { |
| 813 | err = -ENOMEM; | 809 | fe = videobuf_dvb_alloc_frontend(&dev->frontends, i); |
| 814 | goto fail_free; | 810 | if(fe == NULL) { |
| 811 | printk(KERN_ERR "%s() failed to alloc\n", | ||
| 812 | __func__); | ||
| 813 | videobuf_dvb_dealloc_frontends(&dev->frontends); | ||
| 814 | err = -ENOMEM; | ||
| 815 | goto fail_free; | ||
| 816 | } | ||
| 815 | } | 817 | } |
| 816 | } | 818 | } |
| 817 | #endif | 819 | #endif |
diff --git a/drivers/media/video/cx88/cx88-video.c b/drivers/media/video/cx88/cx88-video.c index 61265fd04d56..b96ce991d968 100644 --- a/drivers/media/video/cx88/cx88-video.c +++ b/drivers/media/video/cx88/cx88-video.c | |||
| @@ -1216,8 +1216,12 @@ static int vidioc_streamon(struct file *file, void *priv, enum v4l2_buf_type i) | |||
| 1216 | struct cx8800_fh *fh = priv; | 1216 | struct cx8800_fh *fh = priv; |
| 1217 | struct cx8800_dev *dev = fh->dev; | 1217 | struct cx8800_dev *dev = fh->dev; |
| 1218 | 1218 | ||
| 1219 | if (unlikely(fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)) | 1219 | /* We should remember that this driver also supports teletext, */ |
| 1220 | /* so we have to test if the v4l2_buf_type is VBI capture data. */ | ||
| 1221 | if (unlikely((fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) && | ||
| 1222 | (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE))) | ||
| 1220 | return -EINVAL; | 1223 | return -EINVAL; |
| 1224 | |||
| 1221 | if (unlikely(i != fh->type)) | 1225 | if (unlikely(i != fh->type)) |
| 1222 | return -EINVAL; | 1226 | return -EINVAL; |
| 1223 | 1227 | ||
| @@ -1232,8 +1236,10 @@ static int vidioc_streamoff(struct file *file, void *priv, enum v4l2_buf_type i) | |||
| 1232 | struct cx8800_dev *dev = fh->dev; | 1236 | struct cx8800_dev *dev = fh->dev; |
| 1233 | int err, res; | 1237 | int err, res; |
| 1234 | 1238 | ||
| 1235 | if (fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | 1239 | if ((fh->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) && |
| 1240 | (fh->type != V4L2_BUF_TYPE_VBI_CAPTURE)) | ||
| 1236 | return -EINVAL; | 1241 | return -EINVAL; |
| 1242 | |||
| 1237 | if (i != fh->type) | 1243 | if (i != fh->type) |
| 1238 | return -EINVAL; | 1244 | return -EINVAL; |
| 1239 | 1245 | ||
diff --git a/drivers/media/video/cx88/cx88.h b/drivers/media/video/cx88/cx88.h index 76207c2856b7..f4240965be32 100644 --- a/drivers/media/video/cx88/cx88.h +++ b/drivers/media/video/cx88/cx88.h | |||
| @@ -352,6 +352,7 @@ struct cx88_core { | |||
| 352 | /* various v4l controls */ | 352 | /* various v4l controls */ |
| 353 | u32 freq; | 353 | u32 freq; |
| 354 | atomic_t users; | 354 | atomic_t users; |
| 355 | atomic_t mpeg_users; | ||
| 355 | 356 | ||
| 356 | /* cx88-video needs to access cx8802 for hybrid tuner pll access. */ | 357 | /* cx88-video needs to access cx8802 for hybrid tuner pll access. */ |
| 357 | struct cx8802_dev *dvbdev; | 358 | struct cx8802_dev *dvbdev; |
diff --git a/drivers/media/video/gspca/Kconfig b/drivers/media/video/gspca/Kconfig index 4d0817471c9f..6b557c057fac 100644 --- a/drivers/media/video/gspca/Kconfig +++ b/drivers/media/video/gspca/Kconfig | |||
| @@ -3,16 +3,16 @@ menuconfig USB_GSPCA | |||
| 3 | depends on VIDEO_V4L2 | 3 | depends on VIDEO_V4L2 |
| 4 | default m | 4 | default m |
| 5 | ---help--- | 5 | ---help--- |
| 6 | Say Y here if you want to enable selecting webcams based | 6 | Say Y here if you want to enable selecting webcams based |
| 7 | on the GSPCA framework. | 7 | on the GSPCA framework. |
| 8 | 8 | ||
| 9 | See <file:Documentation/video4linux/gspca.txt> for more info. | 9 | See <file:Documentation/video4linux/gspca.txt> for more info. |
| 10 | 10 | ||
| 11 | This driver uses the Video For Linux API. You must say Y or M to | 11 | This driver uses the Video For Linux API. You must say Y or M to |
| 12 | "Video For Linux" to use this driver. | 12 | "Video For Linux" to use this driver. |
| 13 | 13 | ||
| 14 | To compile this driver as modules, choose M here: the | 14 | To compile this driver as modules, choose M here: the |
| 15 | modules will be called gspca_main. | 15 | modules will be called gspca_main. |
| 16 | 16 | ||
| 17 | 17 | ||
| 18 | if USB_GSPCA && VIDEO_V4L2 | 18 | if USB_GSPCA && VIDEO_V4L2 |
| @@ -23,190 +23,190 @@ config USB_GSPCA_CONEX | |||
| 23 | tristate "Conexant Camera Driver" | 23 | tristate "Conexant Camera Driver" |
| 24 | depends on VIDEO_V4L2 && USB_GSPCA | 24 | depends on VIDEO_V4L2 && USB_GSPCA |
| 25 | help | 25 | help |
| 26 | Say Y here if you want support for cameras based on the Conexant chip. | 26 | Say Y here if you want support for cameras based on the Conexant chip. |
| 27 | 27 | ||
| 28 | To compile this driver as a module, choose M here: the | 28 | To compile this driver as a module, choose M here: the |
| 29 | module will be called gspca_conex. | 29 | module will be called gspca_conex. |
| 30 | 30 | ||
| 31 | config USB_GSPCA_ETOMS | 31 | config USB_GSPCA_ETOMS |
| 32 | tristate "Etoms USB Camera Driver" | 32 | tristate "Etoms USB Camera Driver" |
| 33 | depends on VIDEO_V4L2 && USB_GSPCA | 33 | depends on VIDEO_V4L2 && USB_GSPCA |
| 34 | help | 34 | help |
| 35 | Say Y here if you want support for cameras based on the Etoms chip. | 35 | Say Y here if you want support for cameras based on the Etoms chip. |
| 36 | 36 | ||
| 37 | To compile this driver as a module, choose M here: the | 37 | To compile this driver as a module, choose M here: the |
| 38 | module will be called gspca_etoms. | 38 | module will be called gspca_etoms. |
| 39 | 39 | ||
| 40 | config USB_GSPCA_FINEPIX | 40 | config USB_GSPCA_FINEPIX |
| 41 | tristate "Fujifilm FinePix USB V4L2 driver" | 41 | tristate "Fujifilm FinePix USB V4L2 driver" |
| 42 | depends on VIDEO_V4L2 && USB_GSPCA | 42 | depends on VIDEO_V4L2 && USB_GSPCA |
| 43 | help | 43 | help |
| 44 | Say Y here if you want support for cameras based on the FinePix chip. | 44 | Say Y here if you want support for cameras based on the FinePix chip. |
| 45 | 45 | ||
| 46 | To compile this driver as a module, choose M here: the | 46 | To compile this driver as a module, choose M here: the |
| 47 | module will be called gspca_finepix. | 47 | module will be called gspca_finepix. |
| 48 | 48 | ||
| 49 | config USB_GSPCA_MARS | 49 | config USB_GSPCA_MARS |
| 50 | tristate "Mars USB Camera Driver" | 50 | tristate "Mars USB Camera Driver" |
| 51 | depends on VIDEO_V4L2 && USB_GSPCA | 51 | depends on VIDEO_V4L2 && USB_GSPCA |
| 52 | help | 52 | help |
| 53 | Say Y here if you want support for cameras based on the Mars chip. | 53 | Say Y here if you want support for cameras based on the Mars chip. |
| 54 | 54 | ||
| 55 | To compile this driver as a module, choose M here: the | 55 | To compile this driver as a module, choose M here: the |
| 56 | module will be called gspca_mars. | 56 | module will be called gspca_mars. |
| 57 | 57 | ||
| 58 | config USB_GSPCA_OV519 | 58 | config USB_GSPCA_OV519 |
| 59 | tristate "OV519 USB Camera Driver" | 59 | tristate "OV519 USB Camera Driver" |
| 60 | depends on VIDEO_V4L2 && USB_GSPCA | 60 | depends on VIDEO_V4L2 && USB_GSPCA |
| 61 | help | 61 | help |
| 62 | Say Y here if you want support for cameras based on the OV519 chip. | 62 | Say Y here if you want support for cameras based on the OV519 chip. |
| 63 | 63 | ||
| 64 | To compile this driver as a module, choose M here: the | 64 | To compile this driver as a module, choose M here: the |
| 65 | module will be called gspca_ov519. | 65 | module will be called gspca_ov519. |
| 66 | 66 | ||
| 67 | config USB_GSPCA_PAC207 | 67 | config USB_GSPCA_PAC207 |
| 68 | tristate "Pixart PAC207 USB Camera Driver" | 68 | tristate "Pixart PAC207 USB Camera Driver" |
| 69 | depends on VIDEO_V4L2 && USB_GSPCA | 69 | depends on VIDEO_V4L2 && USB_GSPCA |
| 70 | help | 70 | help |
| 71 | Say Y here if you want support for cameras based on the PAC207 chip. | 71 | Say Y here if you want support for cameras based on the PAC207 chip. |
| 72 | 72 | ||
| 73 | To compile this driver as a module, choose M here: the | 73 | To compile this driver as a module, choose M here: the |
| 74 | module will be called gspca_pac207. | 74 | module will be called gspca_pac207. |
| 75 | 75 | ||
| 76 | config USB_GSPCA_PAC7311 | 76 | config USB_GSPCA_PAC7311 |
| 77 | tristate "Pixart PAC7311 USB Camera Driver" | 77 | tristate "Pixart PAC7311 USB Camera Driver" |
| 78 | depends on VIDEO_V4L2 && USB_GSPCA | 78 | depends on VIDEO_V4L2 && USB_GSPCA |
| 79 | help | 79 | help |
| 80 | Say Y here if you want support for cameras based on the PAC7311 chip. | 80 | Say Y here if you want support for cameras based on the PAC7311 chip. |
| 81 | 81 | ||
| 82 | To compile this driver as a module, choose M here: the | 82 | To compile this driver as a module, choose M here: the |
| 83 | module will be called gspca_pac7311. | 83 | module will be called gspca_pac7311. |
| 84 | 84 | ||
| 85 | config USB_GSPCA_SONIXB | 85 | config USB_GSPCA_SONIXB |
| 86 | tristate "SN9C102 USB Camera Driver" | 86 | tristate "SN9C102 USB Camera Driver" |
| 87 | depends on VIDEO_V4L2 && USB_GSPCA | 87 | depends on VIDEO_V4L2 && USB_GSPCA |
| 88 | help | 88 | help |
| 89 | Say Y here if you want support for cameras based on the SONIXB chip. | 89 | Say Y here if you want support for cameras based on the SONIXB chip. |
| 90 | 90 | ||
| 91 | To compile this driver as a module, choose M here: the | 91 | To compile this driver as a module, choose M here: the |
| 92 | module will be called gspca_sonixb. | 92 | module will be called gspca_sonixb. |
| 93 | 93 | ||
| 94 | config USB_GSPCA_SONIXJ | 94 | config USB_GSPCA_SONIXJ |
| 95 | tristate "SONIX JPEG USB Camera Driver" | 95 | tristate "SONIX JPEG USB Camera Driver" |
| 96 | depends on VIDEO_V4L2 && USB_GSPCA | 96 | depends on VIDEO_V4L2 && USB_GSPCA |
| 97 | help | 97 | help |
| 98 | Say Y here if you want support for cameras based on the SONIXJ chip. | 98 | Say Y here if you want support for cameras based on the SONIXJ chip. |
| 99 | 99 | ||
| 100 | To compile this driver as a module, choose M here: the | 100 | To compile this driver as a module, choose M here: the |
| 101 | module will be called gspca_sonixj | 101 | module will be called gspca_sonixj |
| 102 | 102 | ||
| 103 | config USB_GSPCA_SPCA500 | 103 | config USB_GSPCA_SPCA500 |
| 104 | tristate "SPCA500 USB Camera Driver" | 104 | tristate "SPCA500 USB Camera Driver" |
| 105 | depends on VIDEO_V4L2 && USB_GSPCA | 105 | depends on VIDEO_V4L2 && USB_GSPCA |
| 106 | help | 106 | help |
| 107 | Say Y here if you want support for cameras based on the SPCA500 chip. | 107 | Say Y here if you want support for cameras based on the SPCA500 chip. |
| 108 | 108 | ||
| 109 | To compile this driver as a module, choose M here: the | 109 | To compile this driver as a module, choose M here: the |
| 110 | module will be called gspca_spca500. | 110 | module will be called gspca_spca500. |
| 111 | 111 | ||
| 112 | config USB_GSPCA_SPCA501 | 112 | config USB_GSPCA_SPCA501 |
| 113 | tristate "SPCA501 USB Camera Driver" | 113 | tristate "SPCA501 USB Camera Driver" |
| 114 | depends on VIDEO_V4L2 && USB_GSPCA | 114 | depends on VIDEO_V4L2 && USB_GSPCA |
| 115 | help | 115 | help |
| 116 | Say Y here if you want support for cameras based on the SPCA501 chip. | 116 | Say Y here if you want support for cameras based on the SPCA501 chip. |
| 117 | 117 | ||
| 118 | To compile this driver as a module, choose M here: the | 118 | To compile this driver as a module, choose M here: the |
| 119 | module will be called gspca_spca501. | 119 | module will be called gspca_spca501. |
| 120 | 120 | ||
| 121 | config USB_GSPCA_SPCA505 | 121 | config USB_GSPCA_SPCA505 |
| 122 | tristate "SPCA505 USB Camera Driver" | 122 | tristate "SPCA505 USB Camera Driver" |
| 123 | depends on VIDEO_V4L2 && USB_GSPCA | 123 | depends on VIDEO_V4L2 && USB_GSPCA |
| 124 | help | 124 | help |
| 125 | Say Y here if you want support for cameras based on the SPCA505 chip. | 125 | Say Y here if you want support for cameras based on the SPCA505 chip. |
| 126 | 126 | ||
| 127 | To compile this driver as a module, choose M here: the | 127 | To compile this driver as a module, choose M here: the |
| 128 | module will be called gspca_spca505. | 128 | module will be called gspca_spca505. |
| 129 | 129 | ||
| 130 | config USB_GSPCA_SPCA506 | 130 | config USB_GSPCA_SPCA506 |
| 131 | tristate "SPCA506 USB Camera Driver" | 131 | tristate "SPCA506 USB Camera Driver" |
| 132 | depends on VIDEO_V4L2 && USB_GSPCA | 132 | depends on VIDEO_V4L2 && USB_GSPCA |
| 133 | help | 133 | help |
| 134 | Say Y here if you want support for cameras based on the SPCA506 chip. | 134 | Say Y here if you want support for cameras based on the SPCA506 chip. |
| 135 | 135 | ||
| 136 | To compile this driver as a module, choose M here: the | 136 | To compile this driver as a module, choose M here: the |
| 137 | module will be called gspca_spca506. | 137 | module will be called gspca_spca506. |
| 138 | 138 | ||
| 139 | config USB_GSPCA_SPCA508 | 139 | config USB_GSPCA_SPCA508 |
| 140 | tristate "SPCA508 USB Camera Driver" | 140 | tristate "SPCA508 USB Camera Driver" |
| 141 | depends on VIDEO_V4L2 && USB_GSPCA | 141 | depends on VIDEO_V4L2 && USB_GSPCA |
| 142 | help | 142 | help |
| 143 | Say Y here if you want support for cameras based on the SPCA508 chip. | 143 | Say Y here if you want support for cameras based on the SPCA508 chip. |
| 144 | 144 | ||
| 145 | To compile this driver as a module, choose M here: the | 145 | To compile this driver as a module, choose M here: the |
| 146 | module will be called gspca_spca508. | 146 | module will be called gspca_spca508. |
| 147 | 147 | ||
| 148 | config USB_GSPCA_SPCA561 | 148 | config USB_GSPCA_SPCA561 |
| 149 | tristate "SPCA561 USB Camera Driver" | 149 | tristate "SPCA561 USB Camera Driver" |
| 150 | depends on VIDEO_V4L2 && USB_GSPCA | 150 | depends on VIDEO_V4L2 && USB_GSPCA |
| 151 | help | 151 | help |
| 152 | Say Y here if you want support for cameras based on the SPCA561 chip. | 152 | Say Y here if you want support for cameras based on the SPCA561 chip. |
| 153 | 153 | ||
| 154 | To compile this driver as a module, choose M here: the | 154 | To compile this driver as a module, choose M here: the |
| 155 | module will be called gspca_spca561. | 155 | module will be called gspca_spca561. |
| 156 | 156 | ||
| 157 | config USB_GSPCA_STK014 | 157 | config USB_GSPCA_STK014 |
| 158 | tristate "Syntek DV4000 (STK014) USB Camera Driver" | 158 | tristate "Syntek DV4000 (STK014) USB Camera Driver" |
| 159 | depends on VIDEO_V4L2 && USB_GSPCA | 159 | depends on VIDEO_V4L2 && USB_GSPCA |
| 160 | help | 160 | help |
| 161 | Say Y here if you want support for cameras based on the STK014 chip. | 161 | Say Y here if you want support for cameras based on the STK014 chip. |
| 162 | 162 | ||
| 163 | To compile this driver as a module, choose M here: the | 163 | To compile this driver as a module, choose M here: the |
| 164 | module will be called gspca_stk014. | 164 | module will be called gspca_stk014. |
| 165 | 165 | ||
| 166 | config USB_GSPCA_SUNPLUS | 166 | config USB_GSPCA_SUNPLUS |
| 167 | tristate "SUNPLUS USB Camera Driver" | 167 | tristate "SUNPLUS USB Camera Driver" |
| 168 | depends on VIDEO_V4L2 && USB_GSPCA | 168 | depends on VIDEO_V4L2 && USB_GSPCA |
| 169 | help | 169 | help |
| 170 | Say Y here if you want support for cameras based on the Sunplus | 170 | Say Y here if you want support for cameras based on the Sunplus |
| 171 | SPCA504(abc) SPCA533 SPCA536 chips. | 171 | SPCA504(abc) SPCA533 SPCA536 chips. |
| 172 | 172 | ||
| 173 | To compile this driver as a module, choose M here: the | 173 | To compile this driver as a module, choose M here: the |
| 174 | module will be called gspca_spca5xx. | 174 | module will be called gspca_spca5xx. |
| 175 | 175 | ||
| 176 | config USB_GSPCA_T613 | 176 | config USB_GSPCA_T613 |
| 177 | tristate "T613 (JPEG Compliance) USB Camera Driver" | 177 | tristate "T613 (JPEG Compliance) USB Camera Driver" |
| 178 | depends on VIDEO_V4L2 && USB_GSPCA | 178 | depends on VIDEO_V4L2 && USB_GSPCA |
| 179 | help | 179 | help |
| 180 | Say Y here if you want support for cameras based on the T613 chip. | 180 | Say Y here if you want support for cameras based on the T613 chip. |
| 181 | 181 | ||
| 182 | To compile this driver as a module, choose M here: the | 182 | To compile this driver as a module, choose M here: the |
| 183 | module will be called gspca_t613. | 183 | module will be called gspca_t613. |
| 184 | 184 | ||
| 185 | config USB_GSPCA_TV8532 | 185 | config USB_GSPCA_TV8532 |
| 186 | tristate "TV8532 USB Camera Driver" | 186 | tristate "TV8532 USB Camera Driver" |
| 187 | depends on VIDEO_V4L2 && USB_GSPCA | 187 | depends on VIDEO_V4L2 && USB_GSPCA |
| 188 | help | 188 | help |
| 189 | Say Y here if you want support for cameras based on the TV8531 chip. | 189 | Say Y here if you want support for cameras based on the TV8531 chip. |
| 190 | 190 | ||
| 191 | To compile this driver as a module, choose M here: the | 191 | To compile this driver as a module, choose M here: the |
| 192 | module will be called gspca_tv8532. | 192 | module will be called gspca_tv8532. |
| 193 | 193 | ||
| 194 | config USB_GSPCA_VC032X | 194 | config USB_GSPCA_VC032X |
| 195 | tristate "VC032X USB Camera Driver" | 195 | tristate "VC032X USB Camera Driver" |
| 196 | depends on VIDEO_V4L2 && USB_GSPCA | 196 | depends on VIDEO_V4L2 && USB_GSPCA |
| 197 | help | 197 | help |
| 198 | Say Y here if you want support for cameras based on the VC032X chip. | 198 | Say Y here if you want support for cameras based on the VC032X chip. |
| 199 | 199 | ||
| 200 | To compile this driver as a module, choose M here: the | 200 | To compile this driver as a module, choose M here: the |
| 201 | module will be called gspca_vc032x. | 201 | module will be called gspca_vc032x. |
| 202 | 202 | ||
| 203 | config USB_GSPCA_ZC3XX | 203 | config USB_GSPCA_ZC3XX |
| 204 | tristate "VC3xx USB Camera Driver" | 204 | tristate "ZC3XX USB Camera Driver" |
| 205 | depends on VIDEO_V4L2 && USB_GSPCA | 205 | depends on VIDEO_V4L2 && USB_GSPCA |
| 206 | help | 206 | help |
| 207 | Say Y here if you want support for cameras based on the ZC3XX chip. | 207 | Say Y here if you want support for cameras based on the ZC3XX chip. |
| 208 | 208 | ||
| 209 | To compile this driver as a module, choose M here: the | 209 | To compile this driver as a module, choose M here: the |
| 210 | module will be called gspca_zc3xx. | 210 | module will be called gspca_zc3xx. |
| 211 | 211 | ||
| 212 | endif | 212 | endif |
diff --git a/drivers/media/video/gspca/zc3xx.c b/drivers/media/video/gspca/zc3xx.c index d0a4451dc46f..8b3101d347c3 100644 --- a/drivers/media/video/gspca/zc3xx.c +++ b/drivers/media/video/gspca/zc3xx.c | |||
| @@ -2266,7 +2266,7 @@ static const struct usb_action hdcs2020b_NoFliker[] = { | |||
| 2266 | {} | 2266 | {} |
| 2267 | }; | 2267 | }; |
| 2268 | 2268 | ||
| 2269 | static const struct usb_action hv7131bxx_Initial[] = { | 2269 | static const struct usb_action hv7131bxx_Initial[] = { /* 320x240 */ |
| 2270 | {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, | 2270 | {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, |
| 2271 | {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, | 2271 | {0xa0, 0x10, ZC3XX_R002_CLOCKSELECT}, |
| 2272 | {0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT}, | 2272 | {0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT}, |
| @@ -2290,7 +2290,7 @@ static const struct usb_action hv7131bxx_Initial[] = { | |||
| 2290 | {0xaa, 0x14, 0x0001}, | 2290 | {0xaa, 0x14, 0x0001}, |
| 2291 | {0xaa, 0x15, 0x00e8}, | 2291 | {0xaa, 0x15, 0x00e8}, |
| 2292 | {0xaa, 0x16, 0x0002}, | 2292 | {0xaa, 0x16, 0x0002}, |
| 2293 | {0xaa, 0x17, 0x0086}, | 2293 | {0xaa, 0x17, 0x0086}, /* 00,17,88,aa */ |
| 2294 | {0xaa, 0x31, 0x0038}, | 2294 | {0xaa, 0x31, 0x0038}, |
| 2295 | {0xaa, 0x32, 0x0038}, | 2295 | {0xaa, 0x32, 0x0038}, |
| 2296 | {0xaa, 0x33, 0x0038}, | 2296 | {0xaa, 0x33, 0x0038}, |
| @@ -2309,7 +2309,7 @@ static const struct usb_action hv7131bxx_Initial[] = { | |||
| 2309 | {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, | 2309 | {0xa0, 0x13, ZC3XX_R1CB_SHARPNESS05}, |
| 2310 | {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, | 2310 | {0xa0, 0x08, ZC3XX_R250_DEADPIXELSMODE}, |
| 2311 | {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, | 2311 | {0xa0, 0x08, ZC3XX_R301_EEPROMACCESS}, |
| 2312 | {0xaa, 0x02, 0x0080}, /* {0xaa, 0x02, 0x0090}; */ | 2312 | {0xaa, 0x02, 0x0090}, /* 00,02,80,aa */ |
| 2313 | {0xa1, 0x01, 0x0002}, | 2313 | {0xa1, 0x01, 0x0002}, |
| 2314 | {0xa0, 0x00, ZC3XX_R092_I2CADDRESSSELECT}, | 2314 | {0xa0, 0x00, ZC3XX_R092_I2CADDRESSSELECT}, |
| 2315 | {0xa0, 0x02, ZC3XX_R090_I2CCOMMAND}, | 2315 | {0xa0, 0x02, ZC3XX_R090_I2CCOMMAND}, |
| @@ -2374,7 +2374,7 @@ static const struct usb_action hv7131bxx_Initial[] = { | |||
| 2374 | {} | 2374 | {} |
| 2375 | }; | 2375 | }; |
| 2376 | 2376 | ||
| 2377 | static const struct usb_action hv7131bxx_InitialScale[] = { | 2377 | static const struct usb_action hv7131bxx_InitialScale[] = { /* 640x480*/ |
| 2378 | {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, | 2378 | {0xa0, 0x01, ZC3XX_R000_SYSTEMCONTROL}, |
| 2379 | {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT}, | 2379 | {0xa0, 0x00, ZC3XX_R002_CLOCKSELECT}, |
| 2380 | {0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT}, | 2380 | {0xa0, 0x00, ZC3XX_R010_CMOSSENSORSELECT}, |
| @@ -6388,6 +6388,8 @@ static void setbrightness(struct gspca_dev *gspca_dev) | |||
| 6388 | /*fixme: is it really write to 011d and 018d for all other sensors? */ | 6388 | /*fixme: is it really write to 011d and 018d for all other sensors? */ |
| 6389 | brightness = sd->brightness; | 6389 | brightness = sd->brightness; |
| 6390 | reg_w(gspca_dev->dev, brightness, 0x011d); | 6390 | reg_w(gspca_dev->dev, brightness, 0x011d); |
| 6391 | if (sd->sensor == SENSOR_HV7131B) | ||
| 6392 | return; | ||
| 6391 | if (brightness < 0x70) | 6393 | if (brightness < 0x70) |
| 6392 | brightness += 0x10; | 6394 | brightness += 0x10; |
| 6393 | else | 6395 | else |
| @@ -6529,6 +6531,7 @@ static void setquality(struct gspca_dev *gspca_dev) | |||
| 6529 | 6531 | ||
| 6530 | switch (sd->sensor) { | 6532 | switch (sd->sensor) { |
| 6531 | case SENSOR_GC0305: | 6533 | case SENSOR_GC0305: |
| 6534 | case SENSOR_HV7131B: | ||
| 6532 | case SENSOR_OV7620: | 6535 | case SENSOR_OV7620: |
| 6533 | case SENSOR_PO2030: | 6536 | case SENSOR_PO2030: |
| 6534 | return; | 6537 | return; |
| @@ -7209,7 +7212,6 @@ static int sd_start(struct gspca_dev *gspca_dev) | |||
| 7209 | mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; | 7212 | mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv; |
| 7210 | zc3_init = init_tb[(int) sd->sensor][mode]; | 7213 | zc3_init = init_tb[(int) sd->sensor][mode]; |
| 7211 | switch (sd->sensor) { | 7214 | switch (sd->sensor) { |
| 7212 | case SENSOR_HV7131B: | ||
| 7213 | case SENSOR_HV7131C: | 7215 | case SENSOR_HV7131C: |
| 7214 | zcxx_probeSensor(gspca_dev); | 7216 | zcxx_probeSensor(gspca_dev); |
| 7215 | break; | 7217 | break; |
diff --git a/drivers/media/video/ivtv/Kconfig b/drivers/media/video/ivtv/Kconfig index 0069898bddab..c46bfb1569e3 100644 --- a/drivers/media/video/ivtv/Kconfig +++ b/drivers/media/video/ivtv/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config VIDEO_IVTV | 1 | config VIDEO_IVTV |
| 2 | tristate "Conexant cx23416/cx23415 MPEG encoder/decoder support" | 2 | tristate "Conexant cx23416/cx23415 MPEG encoder/decoder support" |
| 3 | depends on VIDEO_V4L1 && VIDEO_V4L2 && PCI && I2C && EXPERIMENTAL | 3 | depends on VIDEO_V4L2 && PCI && I2C |
| 4 | depends on INPUT # due to VIDEO_IR | 4 | depends on INPUT # due to VIDEO_IR |
| 5 | select I2C_ALGOBIT | 5 | select I2C_ALGOBIT |
| 6 | select VIDEO_IR | 6 | select VIDEO_IR |
| @@ -12,7 +12,6 @@ config VIDEO_IVTV | |||
| 12 | select VIDEO_SAA711X | 12 | select VIDEO_SAA711X |
| 13 | select VIDEO_SAA717X | 13 | select VIDEO_SAA717X |
| 14 | select VIDEO_SAA7127 | 14 | select VIDEO_SAA7127 |
| 15 | select VIDEO_TVAUDIO | ||
| 16 | select VIDEO_CS53L32A | 15 | select VIDEO_CS53L32A |
| 17 | select VIDEO_M52790 | 16 | select VIDEO_M52790 |
| 18 | select VIDEO_WM8775 | 17 | select VIDEO_WM8775 |
| @@ -32,7 +31,7 @@ config VIDEO_IVTV | |||
| 32 | 31 | ||
| 33 | config VIDEO_FB_IVTV | 32 | config VIDEO_FB_IVTV |
| 34 | tristate "Conexant cx23415 framebuffer support" | 33 | tristate "Conexant cx23415 framebuffer support" |
| 35 | depends on VIDEO_IVTV && FB && EXPERIMENTAL | 34 | depends on VIDEO_IVTV && FB |
| 36 | select FB_CFB_FILLRECT | 35 | select FB_CFB_FILLRECT |
| 37 | select FB_CFB_COPYAREA | 36 | select FB_CFB_COPYAREA |
| 38 | select FB_CFB_IMAGEBLIT | 37 | select FB_CFB_IMAGEBLIT |
diff --git a/drivers/media/video/ivtv/ivtv-driver.c b/drivers/media/video/ivtv/ivtv-driver.c index d36485023b68..b69cc1d55e5b 100644 --- a/drivers/media/video/ivtv/ivtv-driver.c +++ b/drivers/media/video/ivtv/ivtv-driver.c | |||
| @@ -875,43 +875,43 @@ static void ivtv_load_and_init_modules(struct ivtv *itv) | |||
| 875 | 875 | ||
| 876 | #ifdef MODULE | 876 | #ifdef MODULE |
| 877 | /* load modules */ | 877 | /* load modules */ |
| 878 | #ifndef CONFIG_MEDIA_TUNER | 878 | #ifdef CONFIG_MEDIA_TUNER_MODULE |
| 879 | hw = ivtv_request_module(itv, hw, "tuner", IVTV_HW_TUNER); | 879 | hw = ivtv_request_module(itv, hw, "tuner", IVTV_HW_TUNER); |
| 880 | #endif | 880 | #endif |
| 881 | #ifndef CONFIG_VIDEO_CX25840 | 881 | #ifdef CONFIG_VIDEO_CX25840_MODULE |
| 882 | hw = ivtv_request_module(itv, hw, "cx25840", IVTV_HW_CX25840); | 882 | hw = ivtv_request_module(itv, hw, "cx25840", IVTV_HW_CX25840); |
| 883 | #endif | 883 | #endif |
| 884 | #ifndef CONFIG_VIDEO_SAA711X | 884 | #ifdef CONFIG_VIDEO_SAA711X_MODULE |
| 885 | hw = ivtv_request_module(itv, hw, "saa7115", IVTV_HW_SAA711X); | 885 | hw = ivtv_request_module(itv, hw, "saa7115", IVTV_HW_SAA711X); |
| 886 | #endif | 886 | #endif |
| 887 | #ifndef CONFIG_VIDEO_SAA7127 | 887 | #ifdef CONFIG_VIDEO_SAA7127_MODULE |
| 888 | hw = ivtv_request_module(itv, hw, "saa7127", IVTV_HW_SAA7127); | 888 | hw = ivtv_request_module(itv, hw, "saa7127", IVTV_HW_SAA7127); |
| 889 | #endif | 889 | #endif |
| 890 | #ifndef CONFIG_VIDEO_SAA717X | 890 | #ifdef CONFIG_VIDEO_SAA717X_MODULE |
| 891 | hw = ivtv_request_module(itv, hw, "saa717x", IVTV_HW_SAA717X); | 891 | hw = ivtv_request_module(itv, hw, "saa717x", IVTV_HW_SAA717X); |
| 892 | #endif | 892 | #endif |
| 893 | #ifndef CONFIG_VIDEO_UPD64031A | 893 | #ifdef CONFIG_VIDEO_UPD64031A_MODULE |
| 894 | hw = ivtv_request_module(itv, hw, "upd64031a", IVTV_HW_UPD64031A); | 894 | hw = ivtv_request_module(itv, hw, "upd64031a", IVTV_HW_UPD64031A); |
| 895 | #endif | 895 | #endif |
| 896 | #ifndef CONFIG_VIDEO_UPD64083 | 896 | #ifdef CONFIG_VIDEO_UPD64083_MODULE |
| 897 | hw = ivtv_request_module(itv, hw, "upd64083", IVTV_HW_UPD6408X); | 897 | hw = ivtv_request_module(itv, hw, "upd64083", IVTV_HW_UPD6408X); |
| 898 | #endif | 898 | #endif |
| 899 | #ifndef CONFIG_VIDEO_MSP3400 | 899 | #ifdef CONFIG_VIDEO_MSP3400_MODULE |
| 900 | hw = ivtv_request_module(itv, hw, "msp3400", IVTV_HW_MSP34XX); | 900 | hw = ivtv_request_module(itv, hw, "msp3400", IVTV_HW_MSP34XX); |
| 901 | #endif | 901 | #endif |
| 902 | #ifndef CONFIG_VIDEO_VP27SMPX | 902 | #ifdef CONFIG_VIDEO_VP27SMPX_MODULE |
| 903 | hw = ivtv_request_module(itv, hw, "vp27smpx", IVTV_HW_VP27SMPX); | 903 | hw = ivtv_request_module(itv, hw, "vp27smpx", IVTV_HW_VP27SMPX); |
| 904 | #endif | 904 | #endif |
| 905 | #ifndef CONFIG_VIDEO_WM8775 | 905 | #ifdef CONFIG_VIDEO_WM8775_MODULE |
| 906 | hw = ivtv_request_module(itv, hw, "wm8775", IVTV_HW_WM8775); | 906 | hw = ivtv_request_module(itv, hw, "wm8775", IVTV_HW_WM8775); |
| 907 | #endif | 907 | #endif |
| 908 | #ifndef CONFIG_VIDEO_WM8739 | 908 | #ifdef CONFIG_VIDEO_WM8739_MODULE |
| 909 | hw = ivtv_request_module(itv, hw, "wm8739", IVTV_HW_WM8739); | 909 | hw = ivtv_request_module(itv, hw, "wm8739", IVTV_HW_WM8739); |
| 910 | #endif | 910 | #endif |
| 911 | #ifndef CONFIG_VIDEO_CS53L32A | 911 | #ifdef CONFIG_VIDEO_CS53L32A_MODULE |
| 912 | hw = ivtv_request_module(itv, hw, "cs53l32a", IVTV_HW_CS53L32A); | 912 | hw = ivtv_request_module(itv, hw, "cs53l32a", IVTV_HW_CS53L32A); |
| 913 | #endif | 913 | #endif |
| 914 | #ifndef CONFIG_VIDEO_M52790 | 914 | #ifdef CONFIG_VIDEO_M52790_MODULE |
| 915 | hw = ivtv_request_module(itv, hw, "m52790", IVTV_HW_M52790); | 915 | hw = ivtv_request_module(itv, hw, "m52790", IVTV_HW_M52790); |
| 916 | #endif | 916 | #endif |
| 917 | #endif | 917 | #endif |
diff --git a/drivers/media/video/saa7110.c b/drivers/media/video/saa7110.c index adf2ba79496a..37860698f782 100644 --- a/drivers/media/video/saa7110.c +++ b/drivers/media/video/saa7110.c | |||
| @@ -47,7 +47,7 @@ module_param(debug, int, 0); | |||
| 47 | MODULE_PARM_DESC(debug, "Debug level (0-1)"); | 47 | MODULE_PARM_DESC(debug, "Debug level (0-1)"); |
| 48 | 48 | ||
| 49 | #define SAA7110_MAX_INPUT 9 /* 6 CVBS, 3 SVHS */ | 49 | #define SAA7110_MAX_INPUT 9 /* 6 CVBS, 3 SVHS */ |
| 50 | #define SAA7110_MAX_OUTPUT 0 /* its a decoder only */ | 50 | #define SAA7110_MAX_OUTPUT 1 /* 1 YUV */ |
| 51 | 51 | ||
| 52 | #define SAA7110_NR_REG 0x35 | 52 | #define SAA7110_NR_REG 0x35 |
| 53 | 53 | ||
| @@ -327,7 +327,7 @@ saa7110_command (struct i2c_client *client, | |||
| 327 | 327 | ||
| 328 | case DECODER_SET_INPUT: | 328 | case DECODER_SET_INPUT: |
| 329 | v = *(int *) arg; | 329 | v = *(int *) arg; |
| 330 | if (v < 0 || v > SAA7110_MAX_INPUT) { | 330 | if (v < 0 || v >= SAA7110_MAX_INPUT) { |
| 331 | v4l_dbg(1, debug, client, "input=%d not available\n", v); | 331 | v4l_dbg(1, debug, client, "input=%d not available\n", v); |
| 332 | return -EINVAL; | 332 | return -EINVAL; |
| 333 | } | 333 | } |
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c index 249184452949..dfbe08a9ad9b 100644 --- a/drivers/media/video/saa7134/saa7134-core.c +++ b/drivers/media/video/saa7134/saa7134-core.c | |||
| @@ -941,7 +941,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev, | |||
| 941 | dev->name,(unsigned long long)pci_resource_start(pci_dev,0)); | 941 | dev->name,(unsigned long long)pci_resource_start(pci_dev,0)); |
| 942 | goto fail1; | 942 | goto fail1; |
| 943 | } | 943 | } |
| 944 | dev->lmmio = ioremap(pci_resource_start(pci_dev,0), 0x1000); | 944 | dev->lmmio = ioremap(pci_resource_start(pci_dev, 0), |
| 945 | pci_resource_len(pci_dev, 0)); | ||
| 945 | dev->bmmio = (__u8 __iomem *)dev->lmmio; | 946 | dev->bmmio = (__u8 __iomem *)dev->lmmio; |
| 946 | if (NULL == dev->lmmio) { | 947 | if (NULL == dev->lmmio) { |
| 947 | err = -EIO; | 948 | err = -EIO; |
diff --git a/drivers/media/video/usbvideo/ibmcam.c b/drivers/media/video/usbvideo/ibmcam.c index 28421d386f1e..c710bcd1df48 100644 --- a/drivers/media/video/usbvideo/ibmcam.c +++ b/drivers/media/video/usbvideo/ibmcam.c | |||
| @@ -3695,7 +3695,7 @@ static int ibmcam_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 3695 | unsigned char video_ep = 0; | 3695 | unsigned char video_ep = 0; |
| 3696 | 3696 | ||
| 3697 | if (debug >= 1) | 3697 | if (debug >= 1) |
| 3698 | dev_info(&uvd->dev->dev, "ibmcam_probe(%p,%u.)\n", intf, ifnum); | 3698 | dev_info(&dev->dev, "ibmcam_probe(%p,%u.)\n", intf, ifnum); |
| 3699 | 3699 | ||
| 3700 | /* We don't handle multi-config cameras */ | 3700 | /* We don't handle multi-config cameras */ |
| 3701 | if (dev->descriptor.bNumConfigurations != 1) | 3701 | if (dev->descriptor.bNumConfigurations != 1) |
| @@ -3746,7 +3746,7 @@ static int ibmcam_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 3746 | brand = "IBM PC Camera"; /* a.k.a. Xirlink C-It */ | 3746 | brand = "IBM PC Camera"; /* a.k.a. Xirlink C-It */ |
| 3747 | break; | 3747 | break; |
| 3748 | } | 3748 | } |
| 3749 | dev_info(&uvd->dev->dev, | 3749 | dev_info(&dev->dev, |
| 3750 | "%s USB camera found (model %d, rev. 0x%04x)\n", | 3750 | "%s USB camera found (model %d, rev. 0x%04x)\n", |
| 3751 | brand, model, le16_to_cpu(dev->descriptor.bcdDevice)); | 3751 | brand, model, le16_to_cpu(dev->descriptor.bcdDevice)); |
| 3752 | } while (0); | 3752 | } while (0); |
| @@ -3754,7 +3754,7 @@ static int ibmcam_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 3754 | /* Validate found interface: must have one ISO endpoint */ | 3754 | /* Validate found interface: must have one ISO endpoint */ |
| 3755 | nas = intf->num_altsetting; | 3755 | nas = intf->num_altsetting; |
| 3756 | if (debug > 0) | 3756 | if (debug > 0) |
| 3757 | dev_info(&uvd->dev->dev, "Number of alternate settings=%d.\n", | 3757 | dev_info(&dev->dev, "Number of alternate settings=%d.\n", |
| 3758 | nas); | 3758 | nas); |
| 3759 | if (nas < 2) { | 3759 | if (nas < 2) { |
| 3760 | err("Too few alternate settings for this camera!"); | 3760 | err("Too few alternate settings for this camera!"); |
| @@ -3799,7 +3799,7 @@ static int ibmcam_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 3799 | actInterface = i; | 3799 | actInterface = i; |
| 3800 | maxPS = le16_to_cpu(endpoint->wMaxPacketSize); | 3800 | maxPS = le16_to_cpu(endpoint->wMaxPacketSize); |
| 3801 | if (debug > 0) | 3801 | if (debug > 0) |
| 3802 | dev_info(&uvd->dev->dev, | 3802 | dev_info(&dev->dev, |
| 3803 | "Active setting=%d. " | 3803 | "Active setting=%d. " |
| 3804 | "maxPS=%d.\n", i, maxPS); | 3804 | "maxPS=%d.\n", i, maxPS); |
| 3805 | } else | 3805 | } else |
| @@ -3840,7 +3840,7 @@ static int ibmcam_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 3840 | RESTRICT_TO_RANGE(framerate, 0, 5); | 3840 | RESTRICT_TO_RANGE(framerate, 0, 5); |
| 3841 | break; | 3841 | break; |
| 3842 | default: | 3842 | default: |
| 3843 | dev_info(&uvd->dev->dev, "IBM camera: using 320x240\n"); | 3843 | dev_info(&dev->dev, "IBM camera: using 320x240\n"); |
| 3844 | size = SIZE_320x240; | 3844 | size = SIZE_320x240; |
| 3845 | /* No break here */ | 3845 | /* No break here */ |
| 3846 | case SIZE_320x240: | 3846 | case SIZE_320x240: |
| @@ -3869,7 +3869,7 @@ static int ibmcam_probe(struct usb_interface *intf, const struct usb_device_id * | |||
| 3869 | canvasY = 120; | 3869 | canvasY = 120; |
| 3870 | break; | 3870 | break; |
| 3871 | default: | 3871 | default: |
| 3872 | dev_info(&uvd->dev->dev, "IBM NetCamera: using 176x144\n"); | 3872 | dev_info(&dev->dev, "IBM NetCamera: using 176x144\n"); |
| 3873 | size = SIZE_176x144; | 3873 | size = SIZE_176x144; |
| 3874 | /* No break here */ | 3874 | /* No break here */ |
| 3875 | case SIZE_176x144: | 3875 | case SIZE_176x144: |
