Commit cf2fa660 authored by Linus Torvalds's avatar Linus Torvalds

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: (313 commits)
  V4L/DVB (9186): Added support for Prof 7300 DVB-S/S2 cards
  V4L/DVB (9185): S2API: Ensure we have a reasonable ROLLOFF default
  V4L/DVB (9184): cx24116: Change the default SNR units back to percentage by default.
  V4L/DVB (9183): S2API: Return error of the caller provides 0 commands.
  V4L/DVB (9182): S2API: Added support for DTV_HIERARCHY
  V4L/DVB (9181): S2API: Add support fot DTV_GUARD_INTERVAL and DTV_TRANSMISSION_MODE
  V4L/DVB (9180): S2API: Added support for DTV_CODE_RATE_HP/LP
  V4L/DVB (9179): S2API: frontend.h cleanup
  V4L/DVB (9178): cx24116: Add module parameter to return SNR as ESNO.
  V4L/DVB (9177): S2API: Change _8PSK / _16APSK to PSK_8 and APSK_16
  V4L/DVB (9176): Add support for DvbWorld USB cards with STV0288 demodulator.
  V4L/DVB (9175): Remove NULL pointer in stb6000 driver.
  V4L/DVB (9174): Allow custom inittab for ST STV0288 demodulator.
  V4L/DVB (9173): S2API: Remove the hardcoded command limit during validation
  V4L/DVB (9172): S2API: Bugfix related to DVB-S / DVB-S2 tuning for the legacy API.
  V4L/DVB (9171): S2API: Stop an OOPS if illegal commands are dumped in S2API.
  V4L/DVB (9170): cx24116: Sanity checking to data input via S2API to the cx24116 demod.
  V4L/DVB (9169): uvcvideo: Support two new Bison Electronics webcams.
  V4L/DVB (9168): Add support for MSI TV@nywhere Plus remote
  V4L/DVB: v4l2-dev: remove duplicated #include
  ...
parents 4501a466 57f51dbc
...@@ -150,3 +150,4 @@ ...@@ -150,3 +150,4 @@
149 -> Typhoon TV-Tuner PCI (50684) 149 -> Typhoon TV-Tuner PCI (50684)
150 -> Geovision GV-600 [008a:763c] 150 -> Geovision GV-600 [008a:763c]
151 -> Kozumi KTV-01C 151 -> Kozumi KTV-01C
152 -> Encore ENL TV-FM-2 [1000:1801]
...@@ -9,3 +9,5 @@ ...@@ -9,3 +9,5 @@
8 -> Hauppauge WinTV-HVR1700 [0070:8101] 8 -> Hauppauge WinTV-HVR1700 [0070:8101]
9 -> Hauppauge WinTV-HVR1400 [0070:8010] 9 -> Hauppauge WinTV-HVR1400 [0070:8010]
10 -> DViCO FusionHDTV7 Dual Express [18ac:d618] 10 -> DViCO FusionHDTV7 Dual Express [18ac:d618]
11 -> DViCO FusionHDTV DVB-T Dual Express [18ac:db78]
12 -> Leadtek Winfast PxDVR3200 H [107d:6681]
...@@ -66,3 +66,11 @@ ...@@ -66,3 +66,11 @@
65 -> DViCO FusionHDTV 7 Gold [18ac:d610] 65 -> DViCO FusionHDTV 7 Gold [18ac:d610]
66 -> Prolink Pixelview MPEG 8000GT [1554:4935] 66 -> Prolink Pixelview MPEG 8000GT [1554:4935]
67 -> Kworld PlusTV HD PCI 120 (ATSC 120) [17de:08c1] 67 -> Kworld PlusTV HD PCI 120 (ATSC 120) [17de:08c1]
68 -> Hauppauge WinTV-HVR4000 DVB-S/S2/T/Hybrid [0070:6900,0070:6904,0070:6902]
69 -> Hauppauge WinTV-HVR4000(Lite) DVB-S/S2 [0070:6905,0070:6906]
70 -> TeVii S460 DVB-S/S2 [d460:9022]
71 -> Omicom SS4 DVB-S/S2 PCI [A044:2011]
72 -> TBS 8920 DVB-S/S2 [8920:8888]
73 -> TeVii S420 DVB-S [d420:9022]
74 -> Prolink Pixelview Global Extreme [1554:4976]
75 -> PROF 7300 DVB-S/S2 [B033:3033]
0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800] 0 -> Unknown EM2800 video grabber (em2800) [eb1a:2800]
1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2820,eb1a:2821,eb1a:2860,eb1a:2861,eb1a:2870,eb1a:2881,eb1a:2883] 1 -> Unknown EM2750/28xx video grabber (em2820/em2840) [eb1a:2820,eb1a:2860,eb1a:2861,eb1a:2870,eb1a:2881,eb1a:2883]
2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036] 2 -> Terratec Cinergy 250 USB (em2820/em2840) [0ccd:0036]
3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208] 3 -> Pinnacle PCTV USB 2 (em2820/em2840) [2304:0208]
4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200,2040:4201] 4 -> Hauppauge WinTV USB 2 (em2820/em2840) [2040:4200,2040:4201]
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
11 -> Terratec Hybrid XS (em2880) [0ccd:0042] 11 -> Terratec Hybrid XS (em2880) [0ccd:0042]
12 -> Kworld PVR TV 2800 RF (em2820/em2840) 12 -> Kworld PVR TV 2800 RF (em2820/em2840)
13 -> Terratec Prodigy XS (em2880) [0ccd:0047] 13 -> Terratec Prodigy XS (em2880) [0ccd:0047]
14 -> Pixelview Prolink PlayTV USB 2.0 (em2820/em2840) 14 -> Pixelview Prolink PlayTV USB 2.0 (em2820/em2840) [eb1a:2821]
15 -> V-Gear PocketTV (em2800) 15 -> V-Gear PocketTV (em2800)
16 -> Hauppauge WinTV HVR 950 (em2883) [2040:6513,2040:6517,2040:651b,2040:651f] 16 -> Hauppauge WinTV HVR 950 (em2883) [2040:6513,2040:6517,2040:651b,2040:651f]
17 -> Pinnacle PCTV HD Pro Stick (em2880) [2304:0227] 17 -> Pinnacle PCTV HD Pro Stick (em2880) [2304:0227]
......
...@@ -76,7 +76,7 @@ ...@@ -76,7 +76,7 @@
75 -> AVerMedia AVerTVHD MCE A180 [1461:1044] 75 -> AVerMedia AVerTVHD MCE A180 [1461:1044]
76 -> SKNet MonsterTV Mobile [1131:4ee9] 76 -> SKNet MonsterTV Mobile [1131:4ee9]
77 -> Pinnacle PCTV 40i/50i/110i (saa7133) [11bd:002e] 77 -> Pinnacle PCTV 40i/50i/110i (saa7133) [11bd:002e]
78 -> ASUSTeK P7131 Dual [1043:4862,1043:4857] 78 -> ASUSTeK P7131 Dual [1043:4862]
79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B) 79 -> Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)
80 -> ASUS Digimatrix TV [1043:0210] 80 -> ASUS Digimatrix TV [1043:0210]
81 -> Philips Tiger reference design [1131:2018] 81 -> Philips Tiger reference design [1131:2018]
...@@ -145,3 +145,9 @@ ...@@ -145,3 +145,9 @@
144 -> Beholder BeholdTV M6 Extra [5ace:6193] 144 -> Beholder BeholdTV M6 Extra [5ace:6193]
145 -> AVerMedia MiniPCI DVB-T Hybrid M103 [1461:f636] 145 -> AVerMedia MiniPCI DVB-T Hybrid M103 [1461:f636]
146 -> ASUSTeK P7131 Analog 146 -> ASUSTeK P7131 Analog
147 -> Asus Tiger 3in1 [1043:4878]
148 -> Encore ENLTV-FM v5.3 [1a7f:2008]
149 -> Avermedia PCI pure analog (M135A) [1461:f11d]
150 -> Zogis Real Angel 220
151 -> ADS Tech Instant HDTV [1421:0380]
152 -> Asus Tiger Rev:1.00 [1043:4857]
...@@ -74,3 +74,4 @@ tuner=72 - Thomson FE6600 ...@@ -74,3 +74,4 @@ tuner=72 - Thomson FE6600
tuner=73 - Samsung TCPG 6121P30A tuner=73 - Samsung TCPG 6121P30A
tuner=75 - Philips TEA5761 FM Radio tuner=75 - Philips TEA5761 FM Radio
tuner=76 - Xceive 5000 tuner tuner=76 - Xceive 5000 tuner
tuner=77 - TCL tuner MF02GIP-5N-E
...@@ -7,6 +7,7 @@ The modules are: ...@@ -7,6 +7,7 @@ The modules are:
xxxx vend:prod xxxx vend:prod
---- ----
spca501 0000:0000 MystFromOri Unknow Camera spca501 0000:0000 MystFromOri Unknow Camera
m5602 0402:5602 ALi Video Camera Controller
spca501 040a:0002 Kodak DVC-325 spca501 040a:0002 Kodak DVC-325
spca500 040a:0300 Kodak EZ200 spca500 040a:0300 Kodak EZ200
zc3xx 041e:041e Creative WebCam Live! zc3xx 041e:041e Creative WebCam Live!
...@@ -42,6 +43,7 @@ zc3xx 0458:7007 Genius VideoCam V2 ...@@ -42,6 +43,7 @@ zc3xx 0458:7007 Genius VideoCam V2
zc3xx 0458:700c Genius VideoCam V3 zc3xx 0458:700c Genius VideoCam V3
zc3xx 0458:700f Genius VideoCam Web V2 zc3xx 0458:700f Genius VideoCam Web V2
sonixj 0458:7025 Genius Eye 311Q sonixj 0458:7025 Genius Eye 311Q
sonixj 0458:702e Genius Slim 310 NB
sonixj 045e:00f5 MicroSoft VX3000 sonixj 045e:00f5 MicroSoft VX3000
sonixj 045e:00f7 MicroSoft VX1000 sonixj 045e:00f7 MicroSoft VX1000
ov519 045e:028c Micro$oft xbox cam ov519 045e:028c Micro$oft xbox cam
...@@ -81,7 +83,7 @@ spca561 046d:092b Labtec Webcam Plus ...@@ -81,7 +83,7 @@ spca561 046d:092b Labtec Webcam Plus
spca561 046d:092c Logitech QC chat Elch2 spca561 046d:092c Logitech QC chat Elch2
spca561 046d:092d Logitech QC Elch2 spca561 046d:092d Logitech QC Elch2
spca561 046d:092e Logitech QC Elch2 spca561 046d:092e Logitech QC Elch2
spca561 046d:092f Logitech QC Elch2 spca561 046d:092f Logitech QuickCam Express Plus
sunplus 046d:0960 Logitech ClickSmart 420 sunplus 046d:0960 Logitech ClickSmart 420
sunplus 0471:0322 Philips DMVC1300K sunplus 0471:0322 Philips DMVC1300K
zc3xx 0471:0325 Philips SPC 200 NC zc3xx 0471:0325 Philips SPC 200 NC
...@@ -96,6 +98,29 @@ sunplus 04a5:3003 Benq DC 1300 ...@@ -96,6 +98,29 @@ sunplus 04a5:3003 Benq DC 1300
sunplus 04a5:3008 Benq DC 1500 sunplus 04a5:3008 Benq DC 1500
sunplus 04a5:300a Benq DC 3410 sunplus 04a5:300a Benq DC 3410
spca500 04a5:300c Benq DC 1016 spca500 04a5:300c Benq DC 1016
finepix 04cb:0104 Fujifilm FinePix 4800
finepix 04cb:0109 Fujifilm FinePix A202
finepix 04cb:010b Fujifilm FinePix A203
finepix 04cb:010f Fujifilm FinePix A204
finepix 04cb:0111 Fujifilm FinePix A205
finepix 04cb:0113 Fujifilm FinePix A210
finepix 04cb:0115 Fujifilm FinePix A303
finepix 04cb:0117 Fujifilm FinePix A310
finepix 04cb:0119 Fujifilm FinePix F401
finepix 04cb:011b Fujifilm FinePix F402
finepix 04cb:011d Fujifilm FinePix F410
finepix 04cb:0121 Fujifilm FinePix F601
finepix 04cb:0123 Fujifilm FinePix F700
finepix 04cb:0125 Fujifilm FinePix M603
finepix 04cb:0127 Fujifilm FinePix S300
finepix 04cb:0129 Fujifilm FinePix S304
finepix 04cb:012b Fujifilm FinePix S500
finepix 04cb:012d Fujifilm FinePix S602
finepix 04cb:012f Fujifilm FinePix S700
finepix 04cb:0131 Fujifilm FinePix unknown model
finepix 04cb:013b Fujifilm FinePix unknown model
finepix 04cb:013d Fujifilm FinePix unknown model
finepix 04cb:013f Fujifilm FinePix F420
sunplus 04f1:1001 JVC GC A50 sunplus 04f1:1001 JVC GC A50
spca561 04fc:0561 Flexcam 100 spca561 04fc:0561 Flexcam 100
sunplus 04fc:500c Sunplus CA500C sunplus 04fc:500c Sunplus CA500C
...@@ -181,6 +206,7 @@ pac207 093a:2468 PAC207 ...@@ -181,6 +206,7 @@ pac207 093a:2468 PAC207
pac207 093a:2470 Genius GF112 pac207 093a:2470 Genius GF112
pac207 093a:2471 Genius VideoCam ge111 pac207 093a:2471 Genius VideoCam ge111
pac207 093a:2472 Genius VideoCam ge110 pac207 093a:2472 Genius VideoCam ge110
pac207 093a:2476 Genius e-Messenger 112
pac7311 093a:2600 PAC7311 Typhoon pac7311 093a:2600 PAC7311 Typhoon
pac7311 093a:2601 Philips SPC 610 NC pac7311 093a:2601 Philips SPC 610 NC
pac7311 093a:2603 PAC7312 pac7311 093a:2603 PAC7312
......
This document describes the ALi m5602 bridge connected
to the following supported sensors:
OmniVision OV9650,
Samsung s5k83a,
Samsung s5k4aa,
Micron mt9m111,
Pixel plus PO1030
This driver mimics the windows drivers, which have a braindead implementation sending bayer-encoded frames at VGA resolution.
In a perfect world we should be able to reprogram the m5602 and the connected sensor in hardware instead, supporting a range of resolutions and pixelformats
Anyway, have fun and please report any bugs to m560x-driver-devel@lists.sourceforge.net
Soc-Camera Subsystem
====================
Terminology
-----------
The following terms are used in this document:
- camera / camera device / camera sensor - a video-camera sensor chip, capable
of connecting to a variety of systems and interfaces, typically uses i2c for
control and configuration, and a parallel or a serial bus for data.
- camera host - an interface, to which a camera is connected. Typically a
specialised interface, present on many SoCs, e.g., PXA27x and PXA3xx, SuperH,
AVR32, i.MX27, i.MX31.
- camera host bus - a connection between a camera host and a camera. Can be
parallel or serial, consists of data and control lines, e.g., clock, vertical
and horizontal synchronization signals.
Purpose of the soc-camera subsystem
-----------------------------------
The soc-camera subsystem provides a unified API between camera host drivers and
camera sensor drivers. It implements a V4L2 interface to the user, currently
only the mmap method is supported.
This subsystem has been written to connect drivers for System-on-Chip (SoC)
video capture interfaces with drivers for CMOS camera sensor chips to enable
the reuse of sensor drivers with various hosts. The subsystem has been designed
to support multiple camera host interfaces and multiple cameras per interface,
although most applications have only one camera sensor.
Existing drivers
----------------
As of 2.6.27-rc4 there are two host drivers in the mainline: pxa_camera.c for
PXA27x SoCs and sh_mobile_ceu_camera.c for SuperH SoCs, and four sensor drivers:
mt9m001.c, mt9m111.c, mt9v022.c and a generic soc_camera_platform.c driver. This
list is not supposed to be updated, look for more examples in your tree.
Camera host API
---------------
A host camera driver is registered using the
soc_camera_host_register(struct soc_camera_host *);
function. The host object can be initialized as follows:
static struct soc_camera_host pxa_soc_camera_host = {
.drv_name = PXA_CAM_DRV_NAME,
.ops = &pxa_soc_camera_host_ops,
};
All camera host methods are passed in a struct soc_camera_host_ops:
static struct soc_camera_host_ops pxa_soc_camera_host_ops = {
.owner = THIS_MODULE,
.add = pxa_camera_add_device,
.remove = pxa_camera_remove_device,
.suspend = pxa_camera_suspend,
.resume = pxa_camera_resume,
.set_fmt_cap = pxa_camera_set_fmt_cap,
.try_fmt_cap = pxa_camera_try_fmt_cap,
.init_videobuf = pxa_camera_init_videobuf,
.reqbufs = pxa_camera_reqbufs,
.poll = pxa_camera_poll,
.querycap = pxa_camera_querycap,
.try_bus_param = pxa_camera_try_bus_param,
.set_bus_param = pxa_camera_set_bus_param,
};
.add and .remove methods are called when a sensor is attached to or detached
from the host, apart from performing host-internal tasks they shall also call
sensor driver's .init and .release methods respectively. .suspend and .resume
methods implement host's power-management functionality and its their
responsibility to call respective sensor's methods. .try_bus_param and
.set_bus_param are used to negotiate physical connection parameters between the
host and the sensor. .init_videobuf is called by soc-camera core when a
video-device is opened, further video-buffer management is implemented completely
by the specific camera host driver. The rest of the methods are called from
respective V4L2 operations.
Camera API
----------
Sensor drivers can use struct soc_camera_link, typically provided by the
platform, and used to specify to which camera host bus the sensor is connected,
and arbitrarily provide platform .power and .reset methods for the camera.
soc_camera_device_register() and soc_camera_device_unregister() functions are
used to add a sensor driver to or remove one from the system. The registration
function takes a pointer to struct soc_camera_device as the only parameter.
This struct can be initialized as follows:
/* link to driver operations */
icd->ops = &mt9m001_ops;
/* link to the underlying physical (e.g., i2c) device */
icd->control = &client->dev;
/* window geometry */
icd->x_min = 20;
icd->y_min = 12;
icd->x_current = 20;
icd->y_current = 12;
icd->width_min = 48;
icd->width_max = 1280;
icd->height_min = 32;
icd->height_max = 1024;
icd->y_skip_top = 1;
/* camera bus ID, typically obtained from platform data */
icd->iface = icl->bus_id;
struct soc_camera_ops provides .probe and .remove methods, which are called by
the soc-camera core, when a camera is matched against or removed from a camera
host bus, .init, .release, .suspend, and .resume are called from the camera host
driver as discussed above. Other members of this struct provide respective V4L2
functionality.
struct soc_camera_device also links to an array of struct soc_camera_data_format,
listing pixel formats, supported by the camera.
--
Author: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
...@@ -36,8 +36,6 @@ ...@@ -36,8 +36,6 @@
struct pxacamera_platform_data { struct pxacamera_platform_data {
int (*init)(struct device *); int (*init)(struct device *);
int (*power)(struct device *, int);
int (*reset)(struct device *, int);
unsigned long flags; unsigned long flags;
unsigned long mclk_10khz; unsigned long mclk_10khz;
......
...@@ -103,6 +103,56 @@ IR_KEYTAB_TYPE ir_codes_avermedia_dvbt[IR_KEYTAB_SIZE] = { ...@@ -103,6 +103,56 @@ IR_KEYTAB_TYPE ir_codes_avermedia_dvbt[IR_KEYTAB_SIZE] = {
EXPORT_SYMBOL_GPL(ir_codes_avermedia_dvbt); EXPORT_SYMBOL_GPL(ir_codes_avermedia_dvbt);
/* Mauro Carvalho Chehab <mchehab@infradead.org> */
IR_KEYTAB_TYPE ir_codes_avermedia_m135a[IR_KEYTAB_SIZE] = {
[0x00] = KEY_POWER2,
[0x2e] = KEY_DOT, /* '.' */
[0x01] = KEY_MODE, /* TV/FM */
[0x05] = KEY_1,
[0x06] = KEY_2,
[0x07] = KEY_3,
[0x09] = KEY_4,
[0x0a] = KEY_5,
[0x0b] = KEY_6,
[0x0d] = KEY_7,
[0x0e] = KEY_8,
[0x0f] = KEY_9,
[0x11] = KEY_0,
[0x13] = KEY_RIGHT, /* -> */
[0x12] = KEY_LEFT, /* <- */
[0x17] = KEY_SLEEP, /* Capturar Imagem */
[0x10] = KEY_SHUFFLE, /* Amostra */
/* FIXME: The keys bellow aren't ok */
[0x43] = KEY_CHANNELUP,
[0x42] = KEY_CHANNELDOWN,
[0x1f] = KEY_VOLUMEUP,
[0x1e] = KEY_VOLUMEDOWN,
[0x0c] = KEY_ENTER,
[0x14] = KEY_MUTE,
[0x08] = KEY_AUDIO,
[0x03] = KEY_TEXT,
[0x04] = KEY_EPG,
[0x2b] = KEY_TV2, /* TV2 */
[0x1d] = KEY_RED,
[0x1c] = KEY_YELLOW,
[0x41] = KEY_GREEN,
[0x40] = KEY_BLUE,
[0x1a] = KEY_PLAYPAUSE,
[0x19] = KEY_RECORD,
[0x18] = KEY_PLAY,
[0x1b] = KEY_STOP,
};
EXPORT_SYMBOL_GPL(ir_codes_avermedia_m135a);
/* Attila Kondoros <attila.kondoros@chello.hu> */ /* Attila Kondoros <attila.kondoros@chello.hu> */
IR_KEYTAB_TYPE ir_codes_apac_viewcomp[IR_KEYTAB_SIZE] = { IR_KEYTAB_TYPE ir_codes_apac_viewcomp[IR_KEYTAB_SIZE] = {
...@@ -467,7 +517,8 @@ EXPORT_SYMBOL_GPL(ir_codes_adstech_dvb_t_pci); ...@@ -467,7 +517,8 @@ EXPORT_SYMBOL_GPL(ir_codes_adstech_dvb_t_pci);
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
/* MSI TV@nywhere remote */ /* MSI TV@nywhere MASTER remote */
IR_KEYTAB_TYPE ir_codes_msi_tvanywhere[IR_KEYTAB_SIZE] = { IR_KEYTAB_TYPE ir_codes_msi_tvanywhere[IR_KEYTAB_SIZE] = {
/* Keys 0 to 9 */ /* Keys 0 to 9 */
[ 0x00 ] = KEY_0, [ 0x00 ] = KEY_0,
...@@ -501,6 +552,95 @@ EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere); ...@@ -501,6 +552,95 @@ EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere);
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
/*
Keycodes for remote on the MSI TV@nywhere Plus. The controller IC on the card
is marked "KS003". The controller is I2C at address 0x30, but does not seem
to respond to probes until a read is performed from a valid device.
I don't know why...
Note: This remote may be of similar or identical design to the
Pixelview remote (?). The raw codes and duplicate button codes
appear to be the same.
Henry Wong <henry@stuffedcow.net>
Some changes to formatting and keycodes by Mark Schultz <n9xmj@yahoo.com>
*/
IR_KEYTAB_TYPE ir_codes_msi_tvanywhere_plus[IR_KEYTAB_SIZE] = {
/* ---- Remote Button Layout ----
POWER SOURCE SCAN MUTE
TV/FM 1 2 3
|> 4 5 6
<| 7 8 9
^^UP 0 + RECALL
vvDN RECORD STOP PLAY
MINIMIZE ZOOM
CH+
VOL- VOL+
CH-
SNAPSHOT MTS
<< FUNC >> RESET
*/
[0x01] = KEY_KP1, /* 1 */
[0x0b] = KEY_KP2, /* 2 */
[0x1b] = KEY_KP3, /* 3 */
[0x05] = KEY_KP4, /* 4 */
[0x09] = KEY_KP5, /* 5 */
[0x15] = KEY_KP6, /* 6 */
[0x06] = KEY_KP7, /* 7 */
[0x0a] = KEY_KP8, /* 8 */
[0x12] = KEY_KP9, /* 9 */
[0x02] = KEY_KP0, /* 0 */
[0x10] = KEY_KPPLUS, /* + */
[0x13] = KEY_AGAIN, /* Recall */
[0x1e] = KEY_POWER, /* Power */
[0x07] = KEY_TUNER, /* Source */
[0x1c] = KEY_SEARCH, /* Scan */
[0x18] = KEY_MUTE, /* Mute */
[0x03] = KEY_RADIO, /* TV/FM */
/* The next four keys are duplicates that appear to send the
same IR code as Ch+, Ch-, >>, and << . The raw code assigned
to them is the actual code + 0x20 - they will never be
detected as such unless some way is discovered to distinguish
these buttons from those that have the same code. */
[0x3f] = KEY_RIGHT, /* |> and Ch+ */
[0x37] = KEY_LEFT, /* <| and Ch- */
[0x2c] = KEY_UP, /* ^^Up and >> */
[0x24] = KEY_DOWN, /* vvDn and << */
[0x00] = KEY_RECORD, /* Record */
[0x08] = KEY_STOP, /* Stop */
[0x11] = KEY_PLAY, /* Play */
[0x0f] = KEY_CLOSE, /* Minimize */
[0x19] = KEY_ZOOM, /* Zoom */
[0x1a] = KEY_SHUFFLE, /* Snapshot */
[0x0d] = KEY_LANGUAGE, /* MTS */
[0x14] = KEY_VOLUMEDOWN, /* Vol- */
[0x16] = KEY_VOLUMEUP, /* Vol+ */
[0x17] = KEY_CHANNELDOWN, /* Ch- */
[0x1f] = KEY_CHANNELUP, /* Ch+ */
[0x04] = KEY_REWIND, /* << */
[0x0e] = KEY_MENU, /* Function */
[0x0c] = KEY_FASTFORWARD, /* >> */
[0x1d] = KEY_RESTART, /* Reset */
};
EXPORT_SYMBOL_GPL(ir_codes_msi_tvanywhere_plus);
/* ---------------------------------------------------------------------- */
/* Cinergy 1400 DVB-T */ /* Cinergy 1400 DVB-T */
IR_KEYTAB_TYPE ir_codes_cinergy_1400[IR_KEYTAB_SIZE] = { IR_KEYTAB_TYPE ir_codes_cinergy_1400[IR_KEYTAB_SIZE] = {
[ 0x01 ] = KEY_POWER, [ 0x01 ] = KEY_POWER,
...@@ -1792,12 +1932,61 @@ IR_KEYTAB_TYPE ir_codes_encore_enltv[IR_KEYTAB_SIZE] = { ...@@ -1792,12 +1932,61 @@ IR_KEYTAB_TYPE ir_codes_encore_enltv[IR_KEYTAB_SIZE] = {
[ 0x41 ] = KEY_GREEN, /* AP2 */ [ 0x41 ] = KEY_GREEN, /* AP2 */
[ 0x47 ] = KEY_YELLOW, /* AP3 */ [ 0x47 ] = KEY_YELLOW, /* AP3 */
[ 0x57 ] = KEY_BLUE, /* AP4 */ [ 0x57 ] = KEY_BLUE, /* AP4 */
}; };
EXPORT_SYMBOL_GPL(ir_codes_encore_enltv); EXPORT_SYMBOL_GPL(ir_codes_encore_enltv);
/* Encore ENLTV2-FM - silver plastic - "Wand Media" written at the botton
Mauro Carvalho Chehab <mchehab@infradead.org> */
IR_KEYTAB_TYPE ir_codes_encore_enltv2[IR_KEYTAB_SIZE] = {
[0x4c] = KEY_POWER2,
[0x4a] = KEY_TUNER,
[0x40] = KEY_1,
[0x60] = KEY_2,
[0x50] = KEY_3,
[0x70] = KEY_4,
[0x48] = KEY_5,
[0x68] = KEY_6,
[0x58] = KEY_7,
[0x78] = KEY_8,
[0x44] = KEY_9,
[0x54] = KEY_0,
[0x64] = KEY_LAST, /* +100 */
[0x4e] = KEY_AGAIN, /* Recall */
[0x6c] = KEY_SWITCHVIDEOMODE, /* Video Source */
[0x5e] = KEY_MENU,
[0x56] = KEY_SCREEN,
[0x7a] = KEY_SETUP,
[0x46] = KEY_MUTE,
[0x5c] = KEY_MODE, /* Stereo */
[0x74] = KEY_INFO,
[0x7c] = KEY_CLEAR,
[0x55] = KEY_UP,
[0x49] = KEY_DOWN,
[0x7e] = KEY_LEFT,
[0x59] = KEY_RIGHT,
[0x6a] = KEY_ENTER,
[0x42] = KEY_VOLUMEUP,
[0x62] = KEY_VOLUMEDOWN,
[0x52] = KEY_CHANNELUP,
[0x72] = KEY_CHANNELDOWN,
[0x41] = KEY_RECORD,
[0x51] = KEY_SHUFFLE, /* Snapshot */
[0x75] = KEY_TIME, /* Timeshift */
[0x71] = KEY_TV2, /* PIP */
[0x45] = KEY_REWIND,
[0x6f] = KEY_PAUSE,
[0x7d] = KEY_FORWARD,
[0x79] = KEY_STOP,
};
EXPORT_SYMBOL_GPL(ir_codes_encore_enltv2);
/* for the Technotrend 1500 bundled remotes (grey and black): */ /* for the Technotrend 1500 bundled remotes (grey and black): */
IR_KEYTAB_TYPE ir_codes_tt_1500[IR_KEYTAB_SIZE] = { IR_KEYTAB_TYPE ir_codes_tt_1500[IR_KEYTAB_SIZE] = {
[ 0x01 ] = KEY_POWER, [ 0x01 ] = KEY_POWER,
...@@ -2239,3 +2428,86 @@ IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE] = { ...@@ -2239,3 +2428,86 @@ IR_KEYTAB_TYPE ir_codes_avermedia_a16d[IR_KEYTAB_SIZE] = {
[0x2a] = KEY_MENU, [0x2a] = KEY_MENU,
}; };
EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d); EXPORT_SYMBOL_GPL(ir_codes_avermedia_a16d);
/* Encore ENLTV-FM v5.3
Mauro Carvalho Chehab <mchehab@infradead.org>
*/
IR_KEYTAB_TYPE ir_codes_encore_enltv_fm53[IR_KEYTAB_SIZE] = {
[0x10] = KEY_POWER2,
[0x06] = KEY_MUTE,
[0x09] = KEY_1,
[0x1d] = KEY_2,
[0x1f] = KEY_3,
[0x19] = KEY_4,
[0x1b] = KEY_5,
[0x11] = KEY_6,
[0x17] = KEY_7,
[0x12] = KEY_8,
[0x16] = KEY_9,
[0x48] = KEY_0,
[0x04] = KEY_LIST, /* -/-- */
[0x40] = KEY_LAST, /* recall */
[0x02] = KEY_MODE, /* TV/AV */
[0x05] = KEY_SHUFFLE, /* SNAPSHOT */
[0x4c] = KEY_CHANNELUP, /* UP */
[0x00] = KEY_CHANNELDOWN, /* DOWN */
[0x0d] = KEY_VOLUMEUP, /* RIGHT */
[0x15] = KEY_VOLUMEDOWN, /* LEFT */
[0x49] = KEY_ENTER, /* OK */
[0x54] = KEY_RECORD,
[0x4d] = KEY_PLAY, /* pause */
[0x1e] = KEY_UP, /* video setting */
[0x0e] = KEY_RIGHT, /* <- */
[0x1a] = KEY_LEFT, /* -> */
[0x0a] = KEY_DOWN, /* video default */
[0x0c] = KEY_ZOOM, /* hide pannel */
[0x47] = KEY_SLEEP, /* shutdown */
};
EXPORT_SYMBOL_GPL(ir_codes_encore_enltv_fm53);
/* Zogis Real Audio 220 - 32 keys IR */
IR_KEYTAB_TYPE ir_codes_real_audio_220_32_keys[IR_KEYTAB_SIZE] = {
[0x1c] = KEY_RADIO,
[0x12] = KEY_POWER2,
[0x01] = KEY_1,
[0x02] = KEY_2,
[0x03] = KEY_3,
[0x04] = KEY_4,
[0x05] = KEY_5,
[0x06] = KEY_6,
[0x07] = KEY_7,
[0x08] = KEY_8,
[0x09] = KEY_9,
[0x00] = KEY_0,
[0x0c] = KEY_VOLUMEUP,
[0x18] = KEY_VOLUMEDOWN,
[0x0b] = KEY_CHANNELUP,
[0x15] = KEY_CHANNELDOWN,
[0x16] = KEY_ENTER,
[0x11] = KEY_LIST, /* Source */
[0x0d] = KEY_AUDIO, /* stereo */
[0x0f] = KEY_PREVIOUS, /* Prev */
[0x1b] = KEY_PAUSE, /* Timeshift */
[0x1a] = KEY_NEXT, /* Next */
[0x0e] = KEY_STOP,
[0x1f] = KEY_PLAY,
[0x1e] = KEY_PLAYPAUSE, /* Pause */
[0x1d] = KEY_RECORD,
[0x13] = KEY_MUTE,
[0x19] = KEY_SHUFFLE, /* Snapshot */
};
EXPORT_SYMBOL_GPL(ir_codes_real_audio_220_32_keys);
...@@ -234,7 +234,7 @@ void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt) ...@@ -234,7 +234,7 @@ void saa7146_pgtable_free(struct pci_dev *pci, struct saa7146_pgtable *pt)
int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt) int saa7146_pgtable_alloc(struct pci_dev *pci, struct saa7146_pgtable *pt)
{ {
__le32 *cpu; __le32 *cpu;
dma_addr_t dma_addr; dma_addr_t dma_addr = 0;
cpu = pci_alloc_consistent(pci, PAGE_SIZE, &dma_addr); cpu = pci_alloc_consistent(pci, PAGE_SIZE, &dma_addr);
if (NULL == cpu) { if (NULL == cpu) {
......
...@@ -533,7 +533,7 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev, ...@@ -533,7 +533,7 @@ int saa7146_register_device(struct video_device **vid, struct saa7146_dev* dev,
memcpy(vfd, &device_template, sizeof(struct video_device)); memcpy(vfd, &device_template, sizeof(struct video_device));
strlcpy(vfd->name, name, sizeof(vfd->name)); strlcpy(vfd->name, name, sizeof(vfd->name));
vfd->release = video_device_release; vfd->release = video_device_release;
vfd->priv = dev; video_set_drvdata(vfd, dev);
// fixme: -1 should be an insmod parameter *for the extension* (like "video_nr"); // fixme: -1 should be an insmod parameter *for the extension* (like "video_nr");
if (video_register_device(vfd, type, -1) < 0) { if (video_register_device(vfd, type, -1) < 0) {
......
...@@ -170,6 +170,9 @@ static int mt2060_set_params(struct dvb_frontend *fe, struct dvb_frontend_parame ...@@ -170,6 +170,9 @@ static int mt2060_set_params(struct dvb_frontend *fe, struct dvb_frontend_parame
b[0] = REG_LO1B1; b[0] = REG_LO1B1;
b[1] = 0xFF; b[1] = 0xFF;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
mt2060_writeregs(priv,b,2); mt2060_writeregs(priv,b,2);
freq = params->frequency / 1000; // Hz -> kHz freq = params->frequency / 1000; // Hz -> kHz
...@@ -233,6 +236,9 @@ static int mt2060_set_params(struct dvb_frontend *fe, struct dvb_frontend_parame ...@@ -233,6 +236,9 @@ static int mt2060_set_params(struct dvb_frontend *fe, struct dvb_frontend_parame
i++; i++;
} while (i<10); } while (i<10);
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */
return ret; return ret;
} }
...@@ -296,13 +302,35 @@ static int mt2060_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth) ...@@ -296,13 +302,35 @@ static int mt2060_get_bandwidth(struct dvb_frontend *fe, u32 *bandwidth)
static int mt2060_init(struct dvb_frontend *fe) static int mt2060_init(struct dvb_frontend *fe)
{ {
struct mt2060_priv *priv = fe->tuner_priv; struct mt2060_priv *priv = fe->tuner_priv;
return mt2060_writereg(priv, REG_VGAG, (priv->cfg->clock_out << 6) | 0x33); int ret;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
ret = mt2060_writereg(priv, REG_VGAG,
(priv->cfg->clock_out << 6) | 0x33);
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */
return ret;
} }
static int mt2060_sleep(struct dvb_frontend *fe) static int mt2060_sleep(struct dvb_frontend *fe)
{ {
struct mt2060_priv *priv = fe->tuner_priv; struct mt2060_priv *priv = fe->tuner_priv;
return mt2060_writereg(priv, REG_VGAG, (priv->cfg->clock_out << 6) | 0x30); int ret;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
ret = mt2060_writereg(priv, REG_VGAG,
(priv->cfg->clock_out << 6) | 0x30);
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */
return ret;
} }
static int mt2060_release(struct dvb_frontend *fe) static int mt2060_release(struct dvb_frontend *fe)
...@@ -344,6 +372,9 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter ...@@ -344,6 +372,9 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter
priv->i2c = i2c; priv->i2c = i2c;
priv->if1_freq = if1; priv->if1_freq = if1;
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 1); /* open i2c_gate */
if (mt2060_readreg(priv,REG_PART_REV,&id) != 0) { if (mt2060_readreg(priv,REG_PART_REV,&id) != 0) {
kfree(priv); kfree(priv);
return NULL; return NULL;
...@@ -360,6 +391,9 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter ...@@ -360,6 +391,9 @@ struct dvb_frontend * mt2060_attach(struct dvb_frontend *fe, struct i2c_adapter
mt2060_calibrate(priv); mt2060_calibrate(priv);
if (fe->ops.i2c_gate_ctrl)
fe->ops.i2c_gate_ctrl(fe, 0); /* close i2c_gate */
return fe; return fe;
} }
EXPORT_SYMBOL(mt2060_attach); EXPORT_SYMBOL(mt2060_attach);
......
...@@ -979,7 +979,6 @@ struct dvb_frontend *mxl5007t_attach(struct dvb_frontend *fe, ...@@ -979,7 +979,6 @@ struct dvb_frontend *mxl5007t_attach(struct dvb_frontend *fe,
switch (instance) { switch (instance) {
case 0: case 0:
goto fail; goto fail;
break;
case 1: case 1:
/* new tuner instance */ /* new tuner instance */
state->config = cfg; state->config = cfg;
......
...@@ -1155,7 +1155,6 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr, ...@@ -1155,7 +1155,6 @@ struct dvb_frontend *tda18271_attach(struct dvb_frontend *fe, u8 addr,
switch (instance) { switch (instance) {
case 0: case 0:
goto fail; goto fail;
break;
case 1: case 1:
/* new tuner instance */ /* new tuner instance */
priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO; priv->gate = (cfg) ? cfg->gate : TDA18271_GATE_AUTO;
......
...@@ -447,17 +447,19 @@ static void tda827xa_lna_gain(struct dvb_frontend *fe, int high, ...@@ -447,17 +447,19 @@ static void tda827xa_lna_gain(struct dvb_frontend *fe, int high,
else else
arg = 0; arg = 0;
} }
if (priv->cfg->tuner_callback) if (fe->callback)
priv->cfg->tuner_callback(priv->i2c_adap->algo_data, fe->callback(priv->i2c_adap->algo_data,
gp_func, arg); DVB_FRONTEND_COMPONENT_TUNER,
gp_func, arg);
buf[1] = high ? 0 : 1; buf[1] = high ? 0 : 1;
if (priv->cfg->config == 2) if (priv->cfg->config == 2)
buf[1] = high ? 1 : 0; buf[1] = high ? 1 : 0;
i2c_transfer(priv->i2c_adap, &msg, 1); i2c_transfer(priv->i2c_adap, &msg, 1);
break; break;
case 3: /* switch with GPIO of saa713x */ case 3: /* switch with GPIO of saa713x */
if (priv->cfg->tuner_callback) if (fe->callback)
priv->cfg->tuner_callback(priv->i2c_adap->algo_data, 0, high); fe->callback(priv->i2c_adap->algo_data,
DVB_FRONTEND_COMPONENT_TUNER, 0, high);
break; break;
} }
} }
......
...@@ -36,7 +36,6 @@ struct tda827x_config ...@@ -36,7 +36,6 @@ struct tda827x_config
/* interface to tda829x driver */ /* interface to tda829x driver */
unsigned int config; unsigned int config;
int switch_addr; int switch_addr;
int (*tuner_callback) (void *dev, int command, int arg);
void (*agcf)(struct dvb_frontend *fe); void (*agcf)(struct dvb_frontend *fe);
}; };
......
...@@ -672,10 +672,8 @@ struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe, ...@@ -672,10 +672,8 @@ struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
priv->i2c_props.addr = i2c_addr; priv->i2c_props.addr = i2c_addr;
priv->i2c_props.adap = i2c_adap; priv->i2c_props.adap = i2c_adap;
priv->i2c_props.name = "tda829x"; priv->i2c_props.name = "tda829x";
if (cfg) { if (cfg)
priv->cfg.config = cfg->lna_cfg; priv->cfg.config = cfg->lna_cfg;
priv->cfg.tuner_callback = cfg->tuner_callback;
}
if (tda8290_probe(&priv->i2c_props) == 0) { if (tda8290_probe(&priv->i2c_props) == 0) {
priv->ver = TDA8290; priv->ver = TDA8290;
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
struct tda829x_config { struct tda829x_config {
unsigned int lna_cfg; unsigned int lna_cfg;
int (*tuner_callback) (void *dev, int command, int arg);
unsigned int probe_tuner:1; unsigned int probe_tuner:1;
#define TDA829X_PROBE_TUNER 0 #define TDA829X_PROBE_TUNER 0
......
...@@ -686,7 +686,6 @@ struct dvb_frontend *tda9887_attach(struct dvb_frontend *fe, ...@@ -686,7 +686,6 @@ struct dvb_frontend *tda9887_attach(struct dvb_frontend *fe,
case 0: case 0:
mutex_unlock(&tda9887_list_mutex); mutex_unlock(&tda9887_list_mutex);
return NULL; return NULL;
break;
case 1: case 1:
fe->analog_demod_priv = priv; fe->analog_demod_priv = priv;
priv->mode = T_STANDBY; priv->mode = T_STANDBY;
......
...@@ -142,6 +142,7 @@ static inline int tuner_stereo(const int type, const int status) ...@@ -142,6 +142,7 @@ static inline int tuner_stereo(const int type, const int status)
case TUNER_PHILIPS_FM1236_MK3: case TUNER_PHILIPS_FM1236_MK3:
case TUNER_PHILIPS_FM1256_IH3: case TUNER_PHILIPS_FM1256_IH3:
case TUNER_LG_NTSC_TAPE: case TUNER_LG_NTSC_TAPE:
case TUNER_TCL_MF02GIP_5N:
return ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3); return ((status & TUNER_SIGNAL) == TUNER_STEREO_MK3);
default: default:
return status & TUNER_STEREO; return status & TUNER_STEREO;
...@@ -494,6 +495,7 @@ static int simple_radio_bandswitch(struct dvb_frontend *fe, u8 *buffer) ...@@ -494,6 +495,7 @@ static int simple_radio_bandswitch(struct dvb_frontend *fe, u8 *buffer)
case TUNER_PHILIPS_FMD1216ME_MK3: case TUNER_PHILIPS_FMD1216ME_MK3:
case TUNER_LG_NTSC_TAPE: case TUNER_LG_NTSC_TAPE:
case TUNER_PHILIPS_FM1256_IH3: case TUNER_PHILIPS_FM1256_IH3:
case TUNER_TCL_MF02GIP_5N:
buffer[3] = 0x19; buffer[3] = 0x19;
break; break;
case TUNER_TNF_5335MF: case TUNER_TNF_5335MF:
...@@ -1038,7 +1040,6 @@ struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe, ...@@ -1038,7 +1040,6 @@ struct dvb_frontend *simple_tuner_attach(struct dvb_frontend *fe,
case 0: case 0:
mutex_unlock(&tuner_simple_list_mutex); mutex_unlock(&tuner_simple_list_mutex);
return NULL; return NULL;
break;
case 1: case 1:
fe->tuner_priv = priv; fe->tuner_priv = priv;
......
...@@ -1216,6 +1216,23 @@ static struct tuner_params tuner_samsung_tcpg_6121p30a_params[] = { ...@@ -1216,6 +1216,23 @@ static struct tuner_params tuner_samsung_tcpg_6121p30a_params[] = {
}, },
}; };
/* ------------ TUNER_TCL_MF02GIP-5N-E - TCL MF02GIP-5N ------------ */
static struct tuner_range tuner_tcl_mf02gip_5n_ntsc_ranges[] = {
{ 16 * 172.00 /*MHz*/, 0x8e, 0x01, },
{ 16 * 448.00 /*MHz*/, 0x8e, 0x02, },
{ 16 * 999.99 , 0x8e, 0x04, },
};
static struct tuner_params tuner_tcl_mf02gip_5n_params[] = {
{
.type = TUNER_PARAM_TYPE_NTSC,
.ranges = tuner_tcl_mf02gip_5n_ntsc_ranges,
.count = ARRAY_SIZE(tuner_tcl_mf02gip_5n_ntsc_ranges),
.cb_first_if_lower_freq = 1,
},
};
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
struct tunertype tuners[] = { struct tunertype tuners[] = {
...@@ -1641,6 +1658,11 @@ struct tunertype tuners[] = { ...@@ -1641,6 +1658,11 @@ struct tunertype tuners[] = {
.name = "Xceive 5000 tuner", .name = "Xceive 5000 tuner",
/* see xc5000.c for details */ /* see xc5000.c for details */
}, },
[TUNER_TCL_MF02GIP_5N] = { /* TCL tuner MF02GIP-5N-E */
.name = "TCL tuner MF02GIP-5N-E",
.params = tuner_tcl_mf02gip_5n_params,
.count = ARRAY_SIZE(tuner_tcl_mf02gip_5n_params),
},
}; };
EXPORT_SYMBOL(tuners); EXPORT_SYMBOL(tuners);
......
...@@ -71,9 +71,6 @@ struct firmware_properties { ...@@ -71,9 +71,6 @@ struct firmware_properties {
struct xc2028_data { struct xc2028_data {
struct list_head hybrid_tuner_instance_list; struct list_head hybrid_tuner_instance_list;
struct tuner_i2c_props i2c_props; struct tuner_i2c_props i2c_props;
int (*tuner_callback) (void *dev,
int command, int arg);
void *video_dev;
__u32 frequency; __u32 frequency;
struct firmware_description *firm; struct firmware_description *firm;
...@@ -492,6 +489,23 @@ static int seek_firmware(struct dvb_frontend *fe, unsigned int type, ...@@ -492,6 +489,23 @@ static int seek_firmware(struct dvb_frontend *fe, unsigned int type,
return i; return i;
} }
static inline int do_tuner_callback(struct dvb_frontend *fe, int cmd, int arg)
{
struct xc2028_data *priv = fe->tuner_priv;
/* analog side (tuner-core) uses i2c_adap->algo_data.
* digital side is not guaranteed to have algo_data defined.
*
* digital side will always have fe->dvb defined.
* analog side (tuner-core) doesn't (yet) define fe->dvb.
*/
return (!fe->callback) ? -EINVAL :
fe->callback(((fe->dvb) && (fe->dvb->priv)) ?
fe->dvb->priv : priv->i2c_props.adap->algo_data,
DVB_FRONTEND_COMPONENT_TUNER, cmd, arg);
}
static int load_firmware(struct dvb_frontend *fe, unsigned int type, static int load_firmware(struct dvb_frontend *fe, unsigned int type,
v4l2_std_id *id) v4l2_std_id *id)
{ {
...@@ -530,8 +544,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type, ...@@ -530,8 +544,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type,
if (!size) { if (!size) {
/* Special callback command received */ /* Special callback command received */
rc = priv->tuner_callback(priv->video_dev, rc = do_tuner_callback(fe, XC2028_TUNER_RESET, 0);
XC2028_TUNER_RESET, 0);
if (rc < 0) { if (rc < 0) {
tuner_err("Error at RESET code %d\n", tuner_err("Error at RESET code %d\n",
(*p) & 0x7f); (*p) & 0x7f);
...@@ -542,8 +555,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type, ...@@ -542,8 +555,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type,
if (size >= 0xff00) { if (size >= 0xff00) {
switch (size) { switch (size) {
case 0xff00: case 0xff00:
rc = priv->tuner_callback(priv->video_dev, rc = do_tuner_callback(fe, XC2028_RESET_CLK, 0);
XC2028_RESET_CLK, 0);
if (rc < 0) { if (rc < 0) {
tuner_err("Error at RESET code %d\n", tuner_err("Error at RESET code %d\n",
(*p) & 0x7f); (*p) & 0x7f);
...@@ -715,8 +727,7 @@ static int check_firmware(struct dvb_frontend *fe, unsigned int type, ...@@ -715,8 +727,7 @@ static int check_firmware(struct dvb_frontend *fe, unsigned int type,
memset(&priv->cur_fw, 0, sizeof(priv->cur_fw)); memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));
/* Reset is needed before loading firmware */ /* Reset is needed before loading firmware */
rc = priv->tuner_callback(priv->video_dev, rc = do_tuner_callback(fe, XC2028_TUNER_RESET, 0);
XC2028_TUNER_RESET, 0);
if (rc < 0) if (rc < 0)
goto fail; goto fail;
...@@ -933,7 +944,7 @@ static int generic_set_freq(struct dvb_frontend *fe, u32 freq /* in HZ */, ...@@ -933,7 +944,7 @@ static int generic_set_freq(struct dvb_frontend *fe, u32 freq /* in HZ */,
The reset CLK is needed only with tm6000. The reset CLK is needed only with tm6000.
Driver should work fine even if this fails. Driver should work fine even if this fails.
*/ */
priv->tuner_callback(priv->video_dev, XC2028_RESET_CLK, 1); do_tuner_callback(fe, XC2028_RESET_CLK, 1);
msleep(10); msleep(10);
...@@ -1002,11 +1013,6 @@ static int xc2028_set_params(struct dvb_frontend *fe, ...@@ -1002,11 +1013,6 @@ static int xc2028_set_params(struct dvb_frontend *fe,
tuner_dbg("%s called\n", __func__); tuner_dbg("%s called\n", __func__);
if (priv->ctrl.d2633)
type |= D2633;
else
type |= D2620;
switch(fe->ops.info.type) { switch(fe->ops.info.type) {
case FE_OFDM: case FE_OFDM:
bw = p->u.ofdm.bandwidth; bw = p->u.ofdm.bandwidth;
...@@ -1021,10 +1027,8 @@ static int xc2028_set_params(struct dvb_frontend *fe, ...@@ -1021,10 +1027,8 @@ static int xc2028_set_params(struct dvb_frontend *fe,
break; break;
case FE_ATSC: case FE_ATSC:
bw = BANDWIDTH_6_MHZ; bw = BANDWIDTH_6_MHZ;
/* The only ATSC firmware (at least on v2.7) is D2633, /* The only ATSC firmware (at least on v2.7) is D2633 */
so overrides ctrl->d2633 */ type |= ATSC | D2633;
type |= ATSC| D2633;
type &= ~D2620;
break; break;
/* DVB-S is not supported */ /* DVB-S is not supported */
default: default:
...@@ -1057,6 +1061,28 @@ static int xc2028_set_params(struct dvb_frontend *fe, ...@@ -1057,6 +1061,28 @@ static int xc2028_set_params(struct dvb_frontend *fe,
tuner_err("error: bandwidth not supported.\n"); tuner_err("error: bandwidth not supported.\n");
}; };
/*
Selects between D2633 or D2620 firmware.
It doesn't make sense for ATSC, since it should be D2633 on all cases
*/
if (fe->ops.info.type != FE_ATSC) {
switch (priv->ctrl.type) {
case XC2028_D2633:
type |= D2633;
break;
case XC2028_D2620:
type |= D2620;
break;
case XC2028_AUTO:
default:
/* Zarlink seems to need D2633 */
if (priv->ctrl.demod == XC3028_FE_ZARLINK456)
type |= D2633;
else
type |= D2620;
}
}
/* All S-code tables need a 200kHz shift */ /* All S-code tables need a 200kHz shift */
if (priv->ctrl.demod) if (priv->ctrl.demod)
demod = priv->ctrl.demod + 200; demod = priv->ctrl.demod + 200;
...@@ -1177,20 +1203,10 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe, ...@@ -1177,20 +1203,10 @@ struct dvb_frontend *xc2028_attach(struct dvb_frontend *fe,
break; break;
case 1: case 1:
/* new tuner instance */ /* new tuner instance */
priv->tuner_callback = cfg->callback;
priv->ctrl.max_len = 13; priv->ctrl.max_len = 13;
mutex_init(&priv->lock); mutex_init(&priv->lock);
/* analog side (tuner-core) uses i2c_adap->algo_data.
* digital side is not guaranteed to have algo_data defined.
*
* digital side will always have fe->dvb defined.
* analog side (tuner-core) doesn't (yet) define fe->dvb.
*/
priv->video_dev = ((fe->dvb) && (fe->dvb->priv)) ?
fe->dvb->priv : cfg->i2c_adap->algo_data;
fe->tuner_priv = priv; fe->tuner_priv = priv;
break; break;
case 2: case 2:
......
...@@ -24,24 +24,28 @@ ...@@ -24,24 +24,28 @@
#define XC3028_FE_ZARLINK456 4560 #define XC3028_FE_ZARLINK456 4560
#define XC3028_FE_CHINA 5200 #define XC3028_FE_CHINA 5200
enum firmware_type {
XC2028_AUTO = 0, /* By default, auto-detects */
XC2028_D2633,
XC2028_D2620,
};
struct xc2028_ctrl { struct xc2028_ctrl {
char *fname; char *fname;
int max_len; int max_len;
unsigned int scode_table; unsigned int scode_table;
unsigned int mts :1; unsigned int mts :1;
unsigned int d2633 :1;
unsigned int input1:1; unsigned int input1:1;
unsigned int vhfbw7:1; unsigned int vhfbw7:1;
unsigned int uhfbw8:1; unsigned int uhfbw8:1;
unsigned int demod; unsigned int demod;
enum firmware_type type:2;
}; };
struct xc2028_config { struct xc2028_config {
struct i2c_adapter *i2c_adap; struct i2c_adapter *i2c_adap;
u8 i2c_addr; u8 i2c_addr;
void *video_dev;
struct xc2028_ctrl *ctrl; struct xc2028_ctrl *ctrl;
int (*callback) (void *dev, int command, int arg);
}; };
/* xc2028 commands for callback */ /* xc2028 commands for callback */
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
#include "dvb_frontend.h" #include "dvb_frontend.h"
#include "xc5000.h" #include "xc5000.h"
#include "xc5000_priv.h" #include "tuner-i2c.h"
static int debug; static int debug;
module_param(debug, int, 0644); module_param(debug, int, 0644);
...@@ -40,12 +40,26 @@ static int xc5000_load_fw_on_attach; ...@@ -40,12 +40,26 @@ static int xc5000_load_fw_on_attach;
module_param_named(init_fw, xc5000_load_fw_on_attach, int, 0644); module_param_named(init_fw, xc5000_load_fw_on_attach, int, 0644);
MODULE_PARM_DESC(init_fw, "Load firmware during driver initialization."); MODULE_PARM_DESC(init_fw, "Load firmware during driver initialization.");
static DEFINE_MUTEX(xc5000_list_mutex);
static LIST_HEAD(hybrid_tuner_instance_list);
#define dprintk(level,fmt, arg...) if (debug >= level) \ #define dprintk(level,fmt, arg...) if (debug >= level) \
printk(KERN_INFO "%s: " fmt, "xc5000", ## arg) printk(KERN_INFO "%s: " fmt, "xc5000", ## arg)
#define XC5000_DEFAULT_FIRMWARE "dvb-fe-xc5000-1.1.fw" #define XC5000_DEFAULT_FIRMWARE "dvb-fe-xc5000-1.1.fw"
#define XC5000_DEFAULT_FIRMWARE_SIZE 12332 #define XC5000_DEFAULT_FIRMWARE_SIZE 12332
struct xc5000_priv {
struct tuner_i2c_props i2c_props;
struct list_head hybrid_tuner_instance_list;
u32 if_khz;
u32 freq_hz;
u32 bandwidth;
u8 video_standard;
u8 rf_mode;
};
/* Misc Defines */ /* Misc Defines */
#define MAX_TV_STANDARD 23 #define MAX_TV_STANDARD 23
#define XC_MAX_I2C_WRITE_LENGTH 64 #define XC_MAX_I2C_WRITE_LENGTH 64
...@@ -216,9 +230,12 @@ static void xc5000_TunerReset(struct dvb_frontend *fe) ...@@ -216,9 +230,12 @@ static void xc5000_TunerReset(struct dvb_frontend *fe)
dprintk(1, "%s()\n", __func__); dprintk(1, "%s()\n", __func__);
if (priv->cfg->tuner_callback) { if (fe->callback) {
ret = priv->cfg->tuner_callback(priv->devptr, ret = fe->callback(((fe->dvb) && (fe->dvb->priv)) ?
XC5000_TUNER_RESET, 0); fe->dvb->priv :
priv->i2c_props.adap->algo_data,
DVB_FRONTEND_COMPONENT_TUNER,
XC5000_TUNER_RESET, 0);
if (ret) if (ret)
printk(KERN_ERR "xc5000: reset failed\n"); printk(KERN_ERR "xc5000: reset failed\n");
} else } else
...@@ -509,13 +526,13 @@ static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val) ...@@ -509,13 +526,13 @@ static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val)
u8 buf[2] = { reg >> 8, reg & 0xff }; u8 buf[2] = { reg >> 8, reg & 0xff };
u8 bval[2] = { 0, 0 }; u8 bval[2] = { 0, 0 };
struct i2c_msg msg[2] = { struct i2c_msg msg[2] = {
{ .addr = priv->cfg->i2c_address, { .addr = priv->i2c_props.addr,
.flags = 0, .buf = &buf[0], .len = 2 }, .flags = 0, .buf = &buf[0], .len = 2 },
{ .addr = priv->cfg->i2c_address, { .addr = priv->i2c_props.addr,
.flags = I2C_M_RD, .buf = &bval[0], .len = 2 }, .flags = I2C_M_RD, .buf = &bval[0], .len = 2 },
}; };
if (i2c_transfer(priv->i2c, msg, 2) != 2) { if (i2c_transfer(priv->i2c_props.adap, msg, 2) != 2) {
printk(KERN_WARNING "xc5000: I2C read failed\n"); printk(KERN_WARNING "xc5000: I2C read failed\n");
return -EREMOTEIO; return -EREMOTEIO;
} }
...@@ -526,10 +543,10 @@ static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val) ...@@ -526,10 +543,10 @@ static int xc5000_readreg(struct xc5000_priv *priv, u16 reg, u16 *val)
static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len) static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len)
{ {
struct i2c_msg msg = { .addr = priv->cfg->i2c_address, struct i2c_msg msg = { .addr = priv->i2c_props.addr,
.flags = 0, .buf = buf, .len = len }; .flags = 0, .buf = buf, .len = len };
if (i2c_transfer(priv->i2c, &msg, 1) != 1) { if (i2c_transfer(priv->i2c_props.adap, &msg, 1) != 1) {
printk(KERN_ERR "xc5000: I2C write failed (len=%i)\n", printk(KERN_ERR "xc5000: I2C write failed (len=%i)\n",
(int)len); (int)len);
return -EREMOTEIO; return -EREMOTEIO;
...@@ -539,10 +556,10 @@ static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len) ...@@ -539,10 +556,10 @@ static int xc5000_writeregs(struct xc5000_priv *priv, u8 *buf, u8 len)
static int xc5000_readregs(struct xc5000_priv *priv, u8 *buf, u8 len) static int xc5000_readregs(struct xc5000_priv *priv, u8 *buf, u8 len)
{ {
struct i2c_msg msg = { .addr = priv->cfg->i2c_address, struct i2c_msg msg = { .addr = priv->i2c_props.addr,
.flags = I2C_M_RD, .buf = buf, .len = len }; .flags = I2C_M_RD, .buf = buf, .len = len };
if (i2c_transfer(priv->i2c, &msg, 1) != 1) { if (i2c_transfer(priv->i2c_props.adap, &msg, 1) != 1) {
printk(KERN_ERR "xc5000 I2C read failed (len=%i)\n",(int)len); printk(KERN_ERR "xc5000 I2C read failed (len=%i)\n",(int)len);
return -EREMOTEIO; return -EREMOTEIO;
} }
...@@ -559,7 +576,7 @@ static int xc5000_fwupload(struct dvb_frontend* fe) ...@@ -559,7 +576,7 @@ static int xc5000_fwupload(struct dvb_frontend* fe)
printk(KERN_INFO "xc5000: waiting for firmware upload (%s)...\n", printk(KERN_INFO "xc5000: waiting for firmware upload (%s)...\n",
XC5000_DEFAULT_FIRMWARE); XC5000_DEFAULT_FIRMWARE);
ret = request_firmware(&fw, XC5000_DEFAULT_FIRMWARE, &priv->i2c->dev); ret = request_firmware(&fw, XC5000_DEFAULT_FIRMWARE, &priv->i2c_props.adap->dev);
if (ret) { if (ret) {
printk(KERN_ERR "xc5000: Upload failed. (file not found?)\n"); printk(KERN_ERR "xc5000: Upload failed. (file not found?)\n");
ret = XC_RESULT_RESET_FAILURE; ret = XC_RESULT_RESET_FAILURE;
...@@ -675,10 +692,10 @@ static int xc5000_set_params(struct dvb_frontend *fe, ...@@ -675,10 +692,10 @@ static int xc5000_set_params(struct dvb_frontend *fe,
return -EREMOTEIO; return -EREMOTEIO;
} }
ret = xc_set_IF_frequency(priv, priv->cfg->if_khz); ret = xc_set_IF_frequency(priv, priv->if_khz);
if (ret != XC_RESULT_SUCCESS) { if (ret != XC_RESULT_SUCCESS) {
printk(KERN_ERR "xc5000: xc_Set_IF_frequency(%d) failed\n", printk(KERN_ERR "xc5000: xc_Set_IF_frequency(%d) failed\n",
priv->cfg->if_khz); priv->if_khz);
return -EIO; return -EIO;
} }
...@@ -897,9 +914,19 @@ static int xc5000_init(struct dvb_frontend *fe) ...@@ -897,9 +914,19 @@ static int xc5000_init(struct dvb_frontend *fe)
static int xc5000_release(struct dvb_frontend *fe) static int xc5000_release(struct dvb_frontend *fe)
{ {
struct xc5000_priv *priv = fe->tuner_priv;
dprintk(1, "%s()\n", __func__); dprintk(1, "%s()\n", __func__);
kfree(fe->tuner_priv);
mutex_lock(&xc5000_list_mutex);
if (priv)
hybrid_tuner_release_state(priv);
mutex_unlock(&xc5000_list_mutex);
fe->tuner_priv = NULL; fe->tuner_priv = NULL;
return 0; return 0;
} }
...@@ -924,29 +951,43 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = { ...@@ -924,29 +951,43 @@ static const struct dvb_tuner_ops xc5000_tuner_ops = {
struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
struct i2c_adapter *i2c, struct i2c_adapter *i2c,
struct xc5000_config *cfg, void *devptr) struct xc5000_config *cfg)
{ {
struct xc5000_priv *priv = NULL; struct xc5000_priv *priv = NULL;
int instance;
u16 id = 0; u16 id = 0;
dprintk(1, "%s()\n", __func__); dprintk(1, "%s(%d-%04x)\n", __func__,
i2c ? i2c_adapter_id(i2c) : -1,
cfg ? cfg->i2c_address : -1);
priv = kzalloc(sizeof(struct xc5000_priv), GFP_KERNEL); mutex_lock(&xc5000_list_mutex);
if (priv == NULL)
return NULL;
priv->cfg = cfg; instance = hybrid_tuner_request_state(struct xc5000_priv, priv,
priv->bandwidth = BANDWIDTH_6_MHZ; hybrid_tuner_instance_list,
priv->i2c = i2c; i2c, cfg->i2c_address, "xc5000");
priv->devptr = devptr; switch (instance) {
case 0:
goto fail;
break;
case 1:
/* new tuner instance */
priv->bandwidth = BANDWIDTH_6_MHZ;
priv->if_khz = cfg->if_khz;
fe->tuner_priv = priv;
break;
default:
/* existing tuner instance */
fe->tuner_priv = priv;
break;
}
/* Check if firmware has been loaded. It is possible that another /* Check if firmware has been loaded. It is possible that another
instance of the driver has loaded the firmware. instance of the driver has loaded the firmware.
*/ */
if (xc5000_readreg(priv, XREG_PRODUCT_ID, &id) != 0) { if (xc5000_readreg(priv, XREG_PRODUCT_ID, &id) != 0)
kfree(priv); goto fail;
return NULL;
}
switch(id) { switch(id) {
case XC_PRODUCT_ID_FW_LOADED: case XC_PRODUCT_ID_FW_LOADED:
...@@ -967,19 +1008,23 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe, ...@@ -967,19 +1008,23 @@ struct dvb_frontend *xc5000_attach(struct dvb_frontend *fe,
printk(KERN_ERR printk(KERN_ERR
"xc5000: Device not found at addr 0x%02x (0x%x)\n", "xc5000: Device not found at addr 0x%02x (0x%x)\n",
cfg->i2c_address, id); cfg->i2c_address, id);
kfree(priv); goto fail;
return NULL;
} }
mutex_unlock(&xc5000_list_mutex);
memcpy(&fe->ops.tuner_ops, &xc5000_tuner_ops, memcpy(&fe->ops.tuner_ops, &xc5000_tuner_ops,
sizeof(struct dvb_tuner_ops)); sizeof(struct dvb_tuner_ops));
fe->tuner_priv = priv;
if (xc5000_load_fw_on_attach) if (xc5000_load_fw_on_attach)
xc5000_init(fe); xc5000_init(fe);
return fe; return fe;
fail:
mutex_unlock(&xc5000_list_mutex);
xc5000_release(fe);
return NULL;
} }
EXPORT_SYMBOL(xc5000_attach); EXPORT_SYMBOL(xc5000_attach);
......
...@@ -30,8 +30,6 @@ struct i2c_adapter; ...@@ -30,8 +30,6 @@ struct i2c_adapter;
struct xc5000_config { struct xc5000_config {
u8 i2c_address; u8 i2c_address;
u32 if_khz; u32 if_khz;
int (*tuner_callback) (void *priv, int command, int arg);
}; };
/* xc5000 callback command */ /* xc5000 callback command */
...@@ -49,13 +47,11 @@ struct xc5000_config { ...@@ -49,13 +47,11 @@ struct xc5000_config {
(defined(CONFIG_MEDIA_TUNER_XC5000_MODULE) && defined(MODULE)) (defined(CONFIG_MEDIA_TUNER_XC5000_MODULE) && defined(MODULE))
extern struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe, extern struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe,
struct i2c_adapter *i2c, struct i2c_adapter *i2c,
struct xc5000_config *cfg, struct xc5000_config *cfg);
void *devptr);
#else #else
static inline struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe, static inline struct dvb_frontend* xc5000_attach(struct dvb_frontend *fe,
struct i2c_adapter *i2c, struct i2c_adapter *i2c,
struct xc5000_config *cfg, struct xc5000_config *cfg)
void *devptr)
{ {
printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__); printk(KERN_WARNING "%s: driver disabled by Kconfig\n", __func__);
return NULL; return NULL;
......
/*
* Driver for Xceive XC5000 "QAM/8VSB single chip tuner"
*
* Copyright (c) 2007 Steven Toth <stoth@linuxtv.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
*
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef XC5000_PRIV_H
#define XC5000_PRIV_H
struct xc5000_priv {
struct xc5000_config *cfg;
struct i2c_adapter *i2c;
u32 freq_hz;
u32 bandwidth;
u8 video_standard;
u8 rf_mode;
void *devptr;
};
#endif
...@@ -20,7 +20,6 @@ comment "Supported USB Adapters" ...@@ -20,7 +20,6 @@ comment "Supported USB Adapters"
source "drivers/media/dvb/dvb-usb/Kconfig" source "drivers/media/dvb/dvb-usb/Kconfig"
source "drivers/media/dvb/ttusb-budget/Kconfig" source "drivers/media/dvb/ttusb-budget/Kconfig"
source "drivers/media/dvb/ttusb-dec/Kconfig" source "drivers/media/dvb/ttusb-dec/Kconfig"
source "drivers/media/dvb/cinergyT2/Kconfig"
source "drivers/media/dvb/siano/Kconfig" source "drivers/media/dvb/siano/Kconfig"
comment "Supported FlexCopII (B2C2) Adapters" comment "Supported FlexCopII (B2C2) Adapters"
...@@ -35,6 +34,10 @@ comment "Supported Pluto2 Adapters" ...@@ -35,6 +34,10 @@ comment "Supported Pluto2 Adapters"
depends on DVB_CORE && PCI && I2C depends on DVB_CORE && PCI && I2C
source "drivers/media/dvb/pluto2/Kconfig" source "drivers/media/dvb/pluto2/Kconfig"
comment "Supported SDMC DM1105 Adapters"
depends on DVB_CORE && PCI && I2C
source "drivers/media/dvb/dm1105/Kconfig"
comment "Supported DVB Frontends" comment "Supported DVB Frontends"
depends on DVB_CORE depends on DVB_CORE
source "drivers/media/dvb/frontends/Kconfig" source "drivers/media/dvb/frontends/Kconfig"
......
...@@ -2,4 +2,4 @@ ...@@ -2,4 +2,4 @@
# Makefile for the kernel multimedia device drivers. # Makefile for the kernel multimedia device drivers.
# #
obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ cinergyT2/ dvb-usb/ pluto2/ siano/ obj-y := dvb-core/ frontends/ ttpci/ ttusb-dec/ ttusb-budget/ b2c2/ bt8xx/ dvb-usb/ pluto2/ siano/ dm1105/
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
int flexcop_dma_allocate(struct pci_dev *pdev, struct flexcop_dma *dma, u32 size) int flexcop_dma_allocate(struct pci_dev *pdev, struct flexcop_dma *dma, u32 size)
{ {
u8 *tcpu; u8 *tcpu;
dma_addr_t tdma; dma_addr_t tdma = 0;
if (size % 2) { if (size % 2) {
err("dma buffersize has to be even."); err("dma buffersize has to be even.");
......
...@@ -702,7 +702,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type) ...@@ -702,7 +702,7 @@ static void frontend_init(struct dvb_bt8xx_card *card, u32 type)
} }
if (card->fe == NULL) if (card->fe == NULL)
printk("dvb-bt8xx: A frontend driver was not found for device %04x/%04x subsystem %04x/%04x\n", printk("dvb-bt8xx: A frontend driver was not found for device [%04x:%04x] subsystem [%04x:%04x]\n",
card->bt->dev->vendor, card->bt->dev->vendor,
card->bt->dev->device, card->bt->dev->device,
card->bt->dev->subsystem_vendor, card->bt->dev->subsystem_vendor,
......
config DVB_CINERGYT2
tristate "Terratec CinergyT2/qanu USB2 DVB-T receiver"
depends on DVB_CORE && USB && INPUT
help
Support for "TerraTec CinergyT2" USB2.0 Highspeed DVB Receivers
Say Y if you own such a device and want to use it.
config DVB_CINERGYT2_TUNING
bool "sophisticated fine-tuning for CinergyT2 cards"
depends on DVB_CINERGYT2
help
Here you can fine-tune some parameters of the CinergyT2 driver.
Normally you don't need to touch this, but in exotic setups you
may fine-tune your setup and adjust e.g. DMA buffer sizes for
a particular application.
config DVB_CINERGYT2_STREAM_URB_COUNT
int "Number of queued USB Request Blocks for Highspeed Stream Transfers"
depends on DVB_CINERGYT2_TUNING
default "32"
help
USB Request Blocks for Highspeed Stream transfers are scheduled in
a queue for the Host Controller.
Usually the default value is a safe choice.
You may increase this number if you are using this device in a
Server Environment with many high-traffic USB Highspeed devices
sharing the same USB bus.
config DVB_CINERGYT2_STREAM_BUF_SIZE
int "Size of URB Stream Buffers for Highspeed Transfers"
depends on DVB_CINERGYT2_TUNING
default "512"
help
Should be a multiple of native buffer size of 512 bytes.
Default value is a safe choice.
You may increase this number if you are using this device in a
Server Environment with many high-traffic USB Highspeed devices
sharing the same USB bus.
config DVB_CINERGYT2_QUERY_INTERVAL
int "Status update interval [milliseconds]"
depends on DVB_CINERGYT2_TUNING
default "250"
help
This is the interval for status readouts from the demodulator.
You may try lower values if you need more responsive signal quality
measurements.
Please keep in mind that these updates cause traffic on the tuner
control bus and thus may or may not affect reception sensitivity.
The default value should be a safe choice for common applications.
config DVB_CINERGYT2_ENABLE_RC_INPUT_DEVICE
bool "Register the onboard IR Remote Control Receiver as Input Device"
depends on DVB_CINERGYT2_TUNING
default y
help
Enable this option if you want to use the onboard Infrared Remote
Control Receiver as Linux-Input device.
Right now only the keycode table for the default Remote Control
delivered with the device is supported, please see the driver
source code to find out how to add support for other controls.
config DVB_CINERGYT2_RC_QUERY_INTERVAL
int "Infrared Remote Controller update interval [milliseconds]"
depends on DVB_CINERGYT2_TUNING && DVB_CINERGYT2_ENABLE_RC_INPUT_DEVICE
default "50"
help
If you have a very fast-repeating remote control you can try lower
values, for normal consumer receivers the default value should be
a safe choice.
obj-$(CONFIG_DVB_CINERGYT2) += cinergyT2.o
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/
This diff is collapsed.
config DVB_DM1105
tristate "SDMC DM1105 based PCI cards"
depends on DVB_CORE && PCI && I2C
select DVB_PLL if !DVB_FE_CUSTOMISE
select DVB_STV0299 if !DVB_FE_CUSTOMISE
select DVB_STV0288 if !DVB_FE_CUSTOMISE
select DVB_STB6000 if !DVB_FE_CUSTOMISE
select DVB_CX24116 if !DVB_FE_CUSTOMISE
select DVB_SI21XX if !DVB_FE_CUSTOMISE
help
Support for cards based on the SDMC DM1105 PCI chip like
DvbWorld 2002
Since these cards have no MPEG decoder onboard, they transmit
only compressed MPEG data over the PCI bus, so you need
an external software decoder to watch TV on your computer.
Say Y or M if you own such a device and want to use it.
obj-$(CONFIG_DVB_DM1105) += dm1105.o
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends
This diff is collapsed.
This diff is collapsed.
...@@ -169,6 +169,9 @@ struct dvb_frontend_ops { ...@@ -169,6 +169,9 @@ struct dvb_frontend_ops {
struct dvb_tuner_ops tuner_ops; struct dvb_tuner_ops tuner_ops;
struct analog_demod_ops analog_ops; struct analog_demod_ops analog_ops;
int (*set_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
int (*get_property)(struct dvb_frontend* fe, struct dtv_property* tvp);
}; };
#define MAX_EVENT 8 #define MAX_EVENT 8
...@@ -182,6 +185,32 @@ struct dvb_fe_events { ...@@ -182,6 +185,32 @@ struct dvb_fe_events {
struct mutex mtx; struct mutex mtx;
}; };
struct dtv_frontend_properties {
/* Cache State */
u32 state;
u32 frequency;
fe_modulation_t modulation;
fe_sec_voltage_t voltage;
fe_sec_tone_mode_t sectone;
fe_spectral_inversion_t inversion;
fe_code_rate_t fec_inner;
fe_transmit_mode_t transmission_mode;
u32 bandwidth_hz; /* 0 = AUTO */
fe_guard_interval_t guard_interval;
fe_hierarchy_t hierarchy;
u32 symbol_rate;
fe_code_rate_t code_rate_HP;
fe_code_rate_t code_rate_LP;
fe_pilot_t pilot;
fe_rolloff_t rolloff;
fe_delivery_system_t delivery_system;
};
struct dvb_frontend { struct dvb_frontend {
struct dvb_frontend_ops ops; struct dvb_frontend_ops ops;
struct dvb_adapter *dvb; struct dvb_adapter *dvb;
...@@ -190,6 +219,9 @@ struct dvb_frontend { ...@@ -190,6 +219,9 @@ struct dvb_frontend {
void *frontend_priv; void *frontend_priv;
void *sec_priv; void *sec_priv;
void *analog_demod_priv; void *analog_demod_priv;
struct dtv_frontend_properties dtv_property_cache;
#define DVB_FRONTEND_COMPONENT_TUNER 0
int (*callback)(void *adapter_priv, int component, int cmd, int arg);
}; };
extern int dvb_register_frontend(struct dvb_adapter *dvb, extern int dvb_register_frontend(struct dvb_adapter *dvb,
......
...@@ -72,9 +72,11 @@ config DVB_USB_DIB0700 ...@@ -72,9 +72,11 @@ config DVB_USB_DIB0700
select DVB_DIB7000P select DVB_DIB7000P
select DVB_DIB7000M select DVB_DIB7000M
select DVB_DIB3000MC select DVB_DIB3000MC
select DVB_S5H1411 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_MT2060 if !DVB_FE_CUSTOMISE select MEDIA_TUNER_MT2060 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_MT2266 if !DVB_FE_CUSTOMISE select MEDIA_TUNER_MT2266 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMISE select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_XC5000 if !DVB_FE_CUSTOMIZE
select DVB_TUNER_DIB0070 select DVB_TUNER_DIB0070
help help
Support for USB2.0/1.1 DVB receivers based on the DiB0700 USB bridge. The Support for USB2.0/1.1 DVB receivers based on the DiB0700 USB bridge. The
...@@ -108,6 +110,8 @@ config DVB_USB_CXUSB ...@@ -108,6 +110,8 @@ config DVB_USB_CXUSB
select MEDIA_TUNER_SIMPLE if !DVB_FE_CUSTOMISE select MEDIA_TUNER_SIMPLE if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMISE select MEDIA_TUNER_XC2028 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_MXL5005S if !DVB_FE_CUSTOMISE select MEDIA_TUNER_MXL5005S if !DVB_FE_CUSTOMISE
select DVB_DIB7000P if !DVB_FE_CUSTOMISE
select DVB_TUNER_DIB0070 if !DVB_FE_CUSTOMISE
help help
Say Y here to support the Conexant USB2.0 hybrid reference design. Say Y here to support the Conexant USB2.0 hybrid reference design.
Currently, only DVB and ATSC modes are supported, analog mode Currently, only DVB and ATSC modes are supported, analog mode
...@@ -245,12 +249,25 @@ config DVB_USB_AF9005_REMOTE ...@@ -245,12 +249,25 @@ config DVB_USB_AF9005_REMOTE
Afatech AF9005 based receiver. Afatech AF9005 based receiver.
config DVB_USB_DW2102 config DVB_USB_DW2102
tristate "DvbWorld 2102 DVB-S USB2.0 receiver" tristate "DvbWorld DVB-S/S2 USB2.0 support"
depends on DVB_USB depends on DVB_USB
select DVB_STV0299 if !DVB_FE_CUSTOMISE
select DVB_PLL if !DVB_FE_CUSTOMISE select DVB_PLL if !DVB_FE_CUSTOMISE
select DVB_STV0299 if !DVB_FE_CUSTOMISE
select DVB_STV0288 if !DVB_FE_CUSTOMISE
select DVB_STB6000 if !DVB_FE_CUSTOMISE
select DVB_CX24116 if !DVB_FE_CUSTOMISE
select DVB_SI21XX if !DVB_FE_CUSTOMISE
help help
Say Y here to support the DvbWorld 2102 DVB-S USB2.0 receiver. Say Y here to support the DvbWorld DVB-S/S2 USB2.0 receivers
and the TeVii S650.
config DVB_USB_CINERGY_T2
tristate "Terratec CinergyT2/qanu USB 2.0 DVB-T receiver"
depends on DVB_USB
help
Support for "TerraTec CinergyT2" USB2.0 Highspeed DVB Receivers
Say Y if you own such a device and want to use it.
config DVB_USB_ANYSEE config DVB_USB_ANYSEE
tristate "Anysee DVB-T/C USB2.0 support" tristate "Anysee DVB-T/C USB2.0 support"
...@@ -262,3 +279,22 @@ config DVB_USB_ANYSEE ...@@ -262,3 +279,22 @@ config DVB_USB_ANYSEE
help help
Say Y here to support the Anysee E30, Anysee E30 Plus or Say Y here to support the Anysee E30, Anysee E30 Plus or
Anysee E30 C Plus DVB USB2.0 receiver. Anysee E30 C Plus DVB USB2.0 receiver.
config DVB_USB_DTV5100
tristate "AME DTV-5100 USB2.0 DVB-T support"
depends on DVB_USB
select MEDIA_TUNER_QT1010 if !DVB_FE_CUSTOMISE
help
Say Y here to support the AME DTV-5100 USB2.0 DVB-T receiver.
config DVB_USB_AF9015
tristate "Afatech AF9015 DVB-T USB2.0 support"
depends on DVB_USB && EXPERIMENTAL
select DVB_AF9013
select DVB_PLL if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_MT2060 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_QT1010 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_TDA18271 if !DVB_FE_CUSTOMISE
select MEDIA_TUNER_MXL5005S if !DVB_FE_CUSTOMISE
help
Say Y here to support the Afatech AF9015 based DVB-T USB2.0 receiver
...@@ -67,6 +67,16 @@ obj-$(CONFIG_DVB_USB_ANYSEE) += dvb-usb-anysee.o ...@@ -67,6 +67,16 @@ obj-$(CONFIG_DVB_USB_ANYSEE) += dvb-usb-anysee.o
dvb-usb-dw2102-objs = dw2102.o dvb-usb-dw2102-objs = dw2102.o
obj-$(CONFIG_DVB_USB_DW2102) += dvb-usb-dw2102.o obj-$(CONFIG_DVB_USB_DW2102) += dvb-usb-dw2102.o
dvb-usb-dtv5100-objs = dtv5100.o
obj-$(CONFIG_DVB_USB_DTV5100) += dvb-usb-dtv5100.o
dvb-usb-af9015-objs = af9015.o
obj-$(CONFIG_DVB_USB_AF9015) += dvb-usb-af9015.o
dvb-usb-cinergyT2-objs = cinergyT2-core.o cinergyT2-fe.o
obj-$(CONFIG_DVB_USB_CINERGY_T2) += dvb-usb-cinergyT2.o
EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/ EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core/ -Idrivers/media/dvb/frontends/
# due to tuner-xc3028 # due to tuner-xc3028
EXTRA_CFLAGS += -Idrivers/media/common/tuners EXTRA_CFLAGS += -Idrivers/media/common/tuners
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
*/ */
#include "af9005.h" #include "af9005.h"
/* debug */ /* debug */
int dvb_usb_af9005_remote_debug; static int dvb_usb_af9005_remote_debug;
module_param_named(debug, dvb_usb_af9005_remote_debug, int, 0644); module_param_named(debug, dvb_usb_af9005_remote_debug, int, 0644);
MODULE_PARM_DESC(debug, MODULE_PARM_DESC(debug,
"enable (1) or disable (0) debug messages." "enable (1) or disable (0) debug messages."
......
...@@ -14,7 +14,7 @@ typedef struct { ...@@ -14,7 +14,7 @@ typedef struct {
u8 val; u8 val;
} RegDesc; } RegDesc;
RegDesc script[] = { static RegDesc script[] = {
{0xa180, 0x0, 0x8, 0xa}, {0xa180, 0x0, 0x8, 0xa},
{0xa181, 0x0, 0x8, 0xd7}, {0xa181, 0x0, 0x8, 0xd7},
{0xa182, 0x0, 0x8, 0xa3}, {0xa182, 0x0, 0x8, 0xa3},
......
...@@ -35,17 +35,17 @@ module_param_named(led, dvb_usb_af9005_led, bool, 0644); ...@@ -35,17 +35,17 @@ module_param_named(led, dvb_usb_af9005_led, bool, 0644);
MODULE_PARM_DESC(led, "enable led (default: 1)."); MODULE_PARM_DESC(led, "enable led (default: 1).");
/* eeprom dump */ /* eeprom dump */
int dvb_usb_af9005_dump_eeprom = 0; static int dvb_usb_af9005_dump_eeprom;
module_param_named(dump_eeprom, dvb_usb_af9005_dump_eeprom, int, 0); module_param_named(dump_eeprom, dvb_usb_af9005_dump_eeprom, int, 0);
MODULE_PARM_DESC(dump_eeprom, "dump contents of the eeprom."); MODULE_PARM_DESC(dump_eeprom, "dump contents of the eeprom.");
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
/* remote control decoder */ /* remote control decoder */
int (*rc_decode) (struct dvb_usb_device * d, u8 * data, int len, u32 * event, static int (*rc_decode) (struct dvb_usb_device *d, u8 *data, int len,
int *state); u32 *event, int *state);
void *rc_keys; static void *rc_keys;
int *rc_keys_size; static int *rc_keys_size;
u8 regmask[8] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; u8 regmask[8] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
...@@ -54,8 +54,8 @@ struct af9005_device_state { ...@@ -54,8 +54,8 @@ struct af9005_device_state {
int led_state; int led_state;
}; };
int af9005_usb_generic_rw(struct dvb_usb_device *d, u8 * wbuf, u16 wlen, static int af9005_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen,
u8 * rbuf, u16 rlen, int delay_ms) u8 *rbuf, u16 rlen, int delay_ms)
{ {
int actlen, ret = -ENOMEM; int actlen, ret = -ENOMEM;
...@@ -98,12 +98,7 @@ int af9005_usb_generic_rw(struct dvb_usb_device *d, u8 * wbuf, u16 wlen, ...@@ -98,12 +98,7 @@ int af9005_usb_generic_rw(struct dvb_usb_device *d, u8 * wbuf, u16 wlen,
return ret; return ret;
} }
int af9005_usb_generic_write(struct dvb_usb_device *d, u8 * buf, u16 len) static int af9005_generic_read_write(struct dvb_usb_device *d, u16 reg,
{
return af9005_usb_generic_rw(d, buf, len, NULL, 0, 0);
}
int af9005_generic_read_write(struct dvb_usb_device *d, u16 reg,
int readwrite, int type, u8 * values, int len) int readwrite, int type, u8 * values, int len)
{ {
struct af9005_device_state *st = d->priv; struct af9005_device_state *st = d->priv;
...@@ -765,7 +760,7 @@ static int af9005_boot_packet(struct usb_device *udev, int type, u8 * reply) ...@@ -765,7 +760,7 @@ static int af9005_boot_packet(struct usb_device *udev, int type, u8 * reply)
return 0; return 0;
} }
int af9005_download_firmware(struct usb_device *udev, const struct firmware *fw) static int af9005_download_firmware(struct usb_device *udev, const struct firmware *fw)
{ {
int i, packets, ret, act_len; int i, packets, ret, act_len;
......
This diff is collapsed.
This diff is collapsed.
...@@ -41,6 +41,9 @@ ...@@ -41,6 +41,9 @@
static int dvb_usb_anysee_debug; static int dvb_usb_anysee_debug;
module_param_named(debug, dvb_usb_anysee_debug, int, 0644); module_param_named(debug, dvb_usb_anysee_debug, int, 0644);
MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS); MODULE_PARM_DESC(debug, "set debugging level" DVB_USB_DEBUG_STATUS);
int dvb_usb_anysee_delsys;
module_param_named(delsys, dvb_usb_anysee_delsys, int, 0644);
MODULE_PARM_DESC(delsys, "select delivery mode (0=DVB-C, 1=DVB-T)");
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr); DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
static struct mutex anysee_usb_mutex; static struct mutex anysee_usb_mutex;
...@@ -178,14 +181,14 @@ static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, ...@@ -178,14 +181,14 @@ static int anysee_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
inc = 1; inc = 1;
} }
if (ret) if (ret)
return ret; break;
i += inc; i += inc;
} }
mutex_unlock(&d->i2c_mutex); mutex_unlock(&d->i2c_mutex);
return i; return ret ? ret : i;
} }
static u32 anysee_i2c_func(struct i2c_adapter *adapter) static u32 anysee_i2c_func(struct i2c_adapter *adapter)
...@@ -272,9 +275,11 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap) ...@@ -272,9 +275,11 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
model demod hw firmware model demod hw firmware
1. E30 MT352 02 0.2.1 1. E30 MT352 02 0.2.1
2. E30 ZL10353 02 0.2.1 2. E30 ZL10353 02 0.2.1
3. E30 Plus ZL10353 06 0.1.0 3. E30 Combo ZL10353 0f 0.1.2 DVB-T/C combo
4. E30C Plus TDA10023 0a 0.1.0 rev 0.2 4. E30 Plus ZL10353 06 0.1.0
4. E30C Plus TDA10023 0f 0.1.2 rev 0.4 5. E30C Plus TDA10023 0a 0.1.0 rev 0.2
E30C Plus TDA10023 0f 0.1.2 rev 0.4
E30 Combo TDA10023 0f 0.1.2 DVB-T/C combo
*/ */
/* Zarlink MT352 DVB-T demod inside of Samsung DNOS404ZH102A NIM */ /* Zarlink MT352 DVB-T demod inside of Samsung DNOS404ZH102A NIM */
...@@ -293,6 +298,21 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap) ...@@ -293,6 +298,21 @@ static int anysee_frontend_attach(struct dvb_usb_adapter *adap)
return 0; return 0;
} }
/* for E30 Combo Plus DVB-T demodulator */
if (dvb_usb_anysee_delsys) {
ret = anysee_write_reg(adap->dev, 0xb0, 0x01);
if (ret)
return ret;
/* Zarlink ZL10353 DVB-T demod */
adap->fe = dvb_attach(zl10353_attach, &anysee_zl10353_config,
&adap->dev->i2c_adap);
if (adap->fe != NULL) {
state->tuner = DVB_PLL_SAMSUNG_DTOS403IH102A;
return 0;
}
}
/* connect demod on IO port D for TDA10023 & ZL10353 */ /* connect demod on IO port D for TDA10023 & ZL10353 */
ret = anysee_write_reg(adap->dev, 0xb0, 0x25); ret = anysee_write_reg(adap->dev, 0xb0, 0x25);
if (ret) if (ret)
......
This diff is collapsed.
This diff is collapsed.
/*
* TerraTec Cinergy T2/qanu USB2 DVB-T adapter.
*
* Copyright (C) 2007 Tomi Orava (tomimo@ncircle.nullnet.fi)
*
* Based on the dvb-usb-framework code and the
* original Terratec Cinergy T2 driver by:
*
* Copyright (C) 2004 Daniel Mack <daniel@qanu.de> and
* Holger Waechtler <holger@qanu.de>
*
* Protocol Spec published on http://qanu.de/specs/terratec_cinergyT2.pdf
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#ifndef _DVB_USB_CINERGYT2_H_
#define _DVB_USB_CINERGYT2_H_
#include <linux/usb/input.h>
#define DVB_USB_LOG_PREFIX "cinergyT2"
#include "dvb-usb.h"
#define DRIVER_NAME "TerraTec/qanu USB2.0 Highspeed DVB-T Receiver"
extern int dvb_usb_cinergyt2_debug;
#define deb_info(args...) dprintk(dvb_usb_cinergyt2_debug, 0x001, args)
#define deb_xfer(args...) dprintk(dvb_usb_cinergyt2_debug, 0x002, args)
#define deb_pll(args...) dprintk(dvb_usb_cinergyt2_debug, 0x004, args)
#define deb_ts(args...) dprintk(dvb_usb_cinergyt2_debug, 0x008, args)
#define deb_err(args...) dprintk(dvb_usb_cinergyt2_debug, 0x010, args)
#define deb_rc(args...) dprintk(dvb_usb_cinergyt2_debug, 0x020, args)
#define deb_fw(args...) dprintk(dvb_usb_cinergyt2_debug, 0x040, args)
#define deb_mem(args...) dprintk(dvb_usb_cinergyt2_debug, 0x080, args)
#define deb_uxfer(args...) dprintk(dvb_usb_cinergyt2_debug, 0x100, args)
enum cinergyt2_ep1_cmd {
CINERGYT2_EP1_PID_TABLE_RESET = 0x01,
CINERGYT2_EP1_PID_SETUP = 0x02,
CINERGYT2_EP1_CONTROL_STREAM_TRANSFER = 0x03,
CINERGYT2_EP1_SET_TUNER_PARAMETERS = 0x04,
CINERGYT2_EP1_GET_TUNER_STATUS = 0x05,
CINERGYT2_EP1_START_SCAN = 0x06,
CINERGYT2_EP1_CONTINUE_SCAN = 0x07,
CINERGYT2_EP1_GET_RC_EVENTS = 0x08,
CINERGYT2_EP1_SLEEP_MODE = 0x09,
CINERGYT2_EP1_GET_FIRMWARE_VERSION = 0x0A
};
struct dvbt_get_status_msg {
uint32_t freq;
uint8_t bandwidth;
uint16_t tps;
uint8_t flags;
uint16_t gain;
uint8_t snr;
uint32_t viterbi_error_rate;
uint32_t rs_error_rate;
uint32_t uncorrected_block_count;
uint8_t lock_bits;
uint8_t prev_lock_bits;
} __attribute__((packed));
struct dvbt_set_parameters_msg {
uint8_t cmd;
uint32_t freq;
uint8_t bandwidth;
uint16_t tps;
uint8_t flags;
} __attribute__((packed));
extern struct dvb_frontend *cinergyt2_fe_attach(struct dvb_usb_device *d);
#endif /* _DVB_USB_CINERGYT2_H_ */
This diff is collapsed.
...@@ -31,6 +31,8 @@ extern int dvb_usb_dib0700_debug; ...@@ -31,6 +31,8 @@ extern int dvb_usb_dib0700_debug;
// 2 Byte: MPEG2 mode: 4MSB(1 = Master Mode, 0 = Slave Mode) 4LSB(Channel 1 = bit0, Channel 2 = bit1) // 2 Byte: MPEG2 mode: 4MSB(1 = Master Mode, 0 = Slave Mode) 4LSB(Channel 1 = bit0, Channel 2 = bit1)
// 2 Byte: Analog mode: 4MSB(0 = 625 lines, 1 = 525 lines) 4LSB( " " ) // 2 Byte: Analog mode: 4MSB(0 = 625 lines, 1 = 525 lines) 4LSB( " " )
#define REQUEST_SET_RC 0x11 #define REQUEST_SET_RC 0x11
#define REQUEST_NEW_I2C_READ 0x12
#define REQUEST_NEW_I2C_WRITE 0x13
#define REQUEST_GET_VERSION 0x15 #define REQUEST_GET_VERSION 0x15
struct dib0700_state { struct dib0700_state {
...@@ -39,6 +41,8 @@ struct dib0700_state { ...@@ -39,6 +41,8 @@ struct dib0700_state {
u8 rc_toggle; u8 rc_toggle;
u8 rc_counter; u8 rc_counter;
u8 is_dib7000pc; u8 is_dib7000pc;
u8 fw_use_new_i2c_api;
u8 disable_streaming_master_mode;
}; };
extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val); extern int dib0700_set_gpio(struct dvb_usb_device *, enum dib07x0_gpios gpio, u8 gpio_dir, u8 gpio_val);
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -4,6 +4,5 @@ ...@@ -4,6 +4,5 @@
#define DVB_USB_LOG_PREFIX "dw2102" #define DVB_USB_LOG_PREFIX "dw2102"
#include "dvb-usb.h" #include "dvb-usb.h"
extern int dvb_usb_dw2102_debug;
#define deb_xfer(args...) dprintk(dvb_usb_dw2102_debug, 0x02, args) #define deb_xfer(args...) dprintk(dvb_usb_dw2102_debug, 0x02, args)
#endif #endif
This diff is collapsed.
...@@ -48,3 +48,10 @@ obj-$(CONFIG_DVB_TUNER_ITD1000) += itd1000.o ...@@ -48,3 +48,10 @@ obj-$(CONFIG_DVB_TUNER_ITD1000) += itd1000.o
obj-$(CONFIG_DVB_AU8522) += au8522.o obj-$(CONFIG_DVB_AU8522) += au8522.o
obj-$(CONFIG_DVB_TDA10048) += tda10048.o obj-$(CONFIG_DVB_TDA10048) += tda10048.o
obj-$(CONFIG_DVB_S5H1411) += s5h1411.o obj-$(CONFIG_DVB_S5H1411) += s5h1411.o
obj-$(CONFIG_DVB_LGS8GL5) += lgs8gl5.o
obj-$(CONFIG_DVB_DUMMY_FE) += dvb_dummy_fe.o
obj-$(CONFIG_DVB_AF9013) += af9013.o
obj-$(CONFIG_DVB_CX24116) += cx24116.o
obj-$(CONFIG_DVB_SI21XX) += si21xx.o
obj-$(CONFIG_DVB_STV0288) += stv0288.o
obj-$(CONFIG_DVB_STB6000) += stb6000.o
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment