aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134
diff options
context:
space:
mode:
authorJonathan Herman <hermanjl@cs.unc.edu>2013-01-22 10:38:37 -0500
committerJonathan Herman <hermanjl@cs.unc.edu>2013-01-22 10:38:37 -0500
commitfcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch)
treea57612d1888735a2ec7972891b68c1ac5ec8faea /drivers/media/video/saa7134
parent8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff)
Added missing tegra files.HEADmaster
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r--drivers/media/video/saa7134/Kconfig64
-rw-r--r--drivers/media/video/saa7134/Makefile16
-rw-r--r--drivers/media/video/saa7134/saa6752hs.c1023
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c1209
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c7889
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c1369
-rw-r--r--drivers/media/video/saa7134/saa7134-dvb.c1852
-rw-r--r--drivers/media/video/saa7134/saa7134-empress.c590
-rw-r--r--drivers/media/video/saa7134/saa7134-i2c.c423
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c972
-rw-r--r--drivers/media/video/saa7134/saa7134-reg.h378
-rw-r--r--drivers/media/video/saa7134/saa7134-ts.c327
-rw-r--r--drivers/media/video/saa7134/saa7134-tvaudio.c1076
-rw-r--r--drivers/media/video/saa7134/saa7134-vbi.c255
-rw-r--r--drivers/media/video/saa7134/saa7134-video.c2659
-rw-r--r--drivers/media/video/saa7134/saa7134.h852
16 files changed, 20954 insertions, 0 deletions
diff --git a/drivers/media/video/saa7134/Kconfig b/drivers/media/video/saa7134/Kconfig
new file mode 100644
index 00000000000..39fc0187a74
--- /dev/null
+++ b/drivers/media/video/saa7134/Kconfig
@@ -0,0 +1,64 @@
1config VIDEO_SAA7134
2 tristate "Philips SAA7134 support"
3 depends on VIDEO_DEV && PCI && I2C
4 select VIDEOBUF_DMA_SG
5 select VIDEO_TUNER
6 select VIDEO_TVEEPROM
7 select CRC32
8 select VIDEO_SAA6588 if VIDEO_HELPER_CHIPS_AUTO
9 ---help---
10 This is a video4linux driver for Philips SAA713x based
11 TV cards.
12
13 To compile this driver as a module, choose M here: the
14 module will be called saa7134.
15
16config VIDEO_SAA7134_ALSA
17 tristate "Philips SAA7134 DMA audio support"
18 depends on VIDEO_SAA7134 && SND
19 select SND_PCM
20 ---help---
21 This is a video4linux driver for direct (DMA) audio in
22 Philips SAA713x based TV cards using ALSA
23
24 To compile this driver as a module, choose M here: the
25 module will be called saa7134-alsa.
26
27config VIDEO_SAA7134_RC
28 bool "Philips SAA7134 Remote Controller support"
29 depends on RC_CORE
30 depends on VIDEO_SAA7134
31 depends on !(RC_CORE=m && VIDEO_SAA7134=y)
32 default y
33 ---help---
34 Enables Remote Controller support on saa7134 driver.
35
36config VIDEO_SAA7134_DVB
37 tristate "DVB/ATSC Support for saa7134 based TV cards"
38 depends on VIDEO_SAA7134 && DVB_CORE
39 select VIDEOBUF_DVB
40 select DVB_PLL if !DVB_FE_CUSTOMISE
41 select DVB_MT352 if !DVB_FE_CUSTOMISE
42 select DVB_TDA1004X if !DVB_FE_CUSTOMISE
43 select DVB_NXT200X if !DVB_FE_CUSTOMISE
44 select DVB_TDA10086 if !DVB_FE_CUSTOMISE
45 select DVB_TDA826X if !DVB_FE_CUSTOMISE
46 select DVB_ISL6421 if !DVB_FE_CUSTOMISE
47 select DVB_ISL6405 if !DVB_FE_CUSTOMISE
48 select MEDIA_TUNER_TDA827X if !MEDIA_TUNER_CUSTOMISE
49 select MEDIA_TUNER_SIMPLE if !MEDIA_TUNER_CUSTOMISE
50 select DVB_ZL10036 if !DVB_FE_CUSTOMISE
51 select DVB_MT312 if !DVB_FE_CUSTOMISE
52 select DVB_LNBP21 if !DVB_FE_CUSTOMISE
53 select DVB_ZL10353 if !DVB_FE_CUSTOMISE
54 select DVB_LGDT3305 if !DVB_FE_CUSTOMISE
55 select DVB_TDA10048 if !DVB_FE_CUSTOMISE
56 select MEDIA_TUNER_TDA18271 if !MEDIA_TUNER_CUSTOMISE
57 select MEDIA_TUNER_TDA8290 if !MEDIA_TUNER_CUSTOMISE
58 select DVB_ZL10039 if !DVB_FE_CUSTOMISE
59 ---help---
60 This adds support for DVB cards based on the
61 Philips saa7134 chip.
62
63 To compile this driver as a module, choose M here: the
64 module will be called saa7134-dvb.
diff --git a/drivers/media/video/saa7134/Makefile b/drivers/media/video/saa7134/Makefile
new file mode 100644
index 00000000000..8a5ff4d3cf1
--- /dev/null
+++ b/drivers/media/video/saa7134/Makefile
@@ -0,0 +1,16 @@
1
2saa7134-y := saa7134-cards.o saa7134-core.o saa7134-i2c.o
3saa7134-y += saa7134-ts.o saa7134-tvaudio.o saa7134-vbi.o
4saa7134-y += saa7134-video.o
5saa7134-$(CONFIG_VIDEO_SAA7134_RC) += saa7134-input.o
6
7obj-$(CONFIG_VIDEO_SAA7134) += saa6752hs.o saa7134.o saa7134-empress.o
8
9obj-$(CONFIG_VIDEO_SAA7134_ALSA) += saa7134-alsa.o
10
11obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o
12
13EXTRA_CFLAGS += -Idrivers/media/video
14EXTRA_CFLAGS += -Idrivers/media/common/tuners
15EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core
16EXTRA_CFLAGS += -Idrivers/media/dvb/frontends
diff --git a/drivers/media/video/saa7134/saa6752hs.c b/drivers/media/video/saa7134/saa6752hs.c
new file mode 100644
index 00000000000..f9f29cc93a8
--- /dev/null
+++ b/drivers/media/video/saa7134/saa6752hs.c
@@ -0,0 +1,1023 @@
1 /*
2 saa6752hs - i2c-driver for the saa6752hs by Philips
3
4 Copyright (C) 2004 Andrew de Quincey
5
6 AC-3 support:
7
8 Copyright (C) 2008 Hans Verkuil <hverkuil@xs4all.nl>
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License vs published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mvss Ave, Cambridge, MA 02139, USA.
23 */
24
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/string.h>
28#include <linux/timer.h>
29#include <linux/delay.h>
30#include <linux/errno.h>
31#include <linux/slab.h>
32#include <linux/poll.h>
33#include <linux/i2c.h>
34#include <linux/types.h>
35#include <linux/videodev2.h>
36#include <media/v4l2-device.h>
37#include <media/v4l2-common.h>
38#include <media/v4l2-chip-ident.h>
39#include <linux/init.h>
40#include <linux/crc32.h>
41
42#define MPEG_VIDEO_TARGET_BITRATE_MAX 27000
43#define MPEG_VIDEO_MAX_BITRATE_MAX 27000
44#define MPEG_TOTAL_TARGET_BITRATE_MAX 27000
45#define MPEG_PID_MAX ((1 << 14) - 1)
46
47
48MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder");
49MODULE_AUTHOR("Andrew de Quincey");
50MODULE_LICENSE("GPL");
51
52enum saa6752hs_videoformat {
53 SAA6752HS_VF_D1 = 0, /* standard D1 video format: 720x576 */
54 SAA6752HS_VF_2_3_D1 = 1,/* 2/3D1 video format: 480x576 */
55 SAA6752HS_VF_1_2_D1 = 2,/* 1/2D1 video format: 352x576 */
56 SAA6752HS_VF_SIF = 3, /* SIF video format: 352x288 */
57 SAA6752HS_VF_UNKNOWN,
58};
59
60struct saa6752hs_mpeg_params {
61 /* transport streams */
62 __u16 ts_pid_pmt;
63 __u16 ts_pid_audio;
64 __u16 ts_pid_video;
65 __u16 ts_pid_pcr;
66
67 /* audio */
68 enum v4l2_mpeg_audio_encoding au_encoding;
69 enum v4l2_mpeg_audio_l2_bitrate au_l2_bitrate;
70 enum v4l2_mpeg_audio_ac3_bitrate au_ac3_bitrate;
71
72 /* video */
73 enum v4l2_mpeg_video_aspect vi_aspect;
74 enum v4l2_mpeg_video_bitrate_mode vi_bitrate_mode;
75 __u32 vi_bitrate;
76 __u32 vi_bitrate_peak;
77};
78
79static const struct v4l2_format v4l2_format_table[] =
80{
81 [SAA6752HS_VF_D1] =
82 { .fmt = { .pix = { .width = 720, .height = 576 }}},
83 [SAA6752HS_VF_2_3_D1] =
84 { .fmt = { .pix = { .width = 480, .height = 576 }}},
85 [SAA6752HS_VF_1_2_D1] =
86 { .fmt = { .pix = { .width = 352, .height = 576 }}},
87 [SAA6752HS_VF_SIF] =
88 { .fmt = { .pix = { .width = 352, .height = 288 }}},
89 [SAA6752HS_VF_UNKNOWN] =
90 { .fmt = { .pix = { .width = 0, .height = 0}}},
91};
92
93struct saa6752hs_state {
94 struct v4l2_subdev sd;
95 int chip;
96 u32 revision;
97 int has_ac3;
98 struct saa6752hs_mpeg_params params;
99 enum saa6752hs_videoformat video_format;
100 v4l2_std_id standard;
101};
102
103enum saa6752hs_command {
104 SAA6752HS_COMMAND_RESET = 0,
105 SAA6752HS_COMMAND_STOP = 1,
106 SAA6752HS_COMMAND_START = 2,
107 SAA6752HS_COMMAND_PAUSE = 3,
108 SAA6752HS_COMMAND_RECONFIGURE = 4,
109 SAA6752HS_COMMAND_SLEEP = 5,
110 SAA6752HS_COMMAND_RECONFIGURE_FORCE = 6,
111
112 SAA6752HS_COMMAND_MAX
113};
114
115static inline struct saa6752hs_state *to_state(struct v4l2_subdev *sd)
116{
117 return container_of(sd, struct saa6752hs_state, sd);
118}
119
120/* ---------------------------------------------------------------------- */
121
122static u8 PAT[] = {
123 0xc2, /* i2c register */
124 0x00, /* table number for encoder */
125
126 0x47, /* sync */
127 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) */
128 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
129
130 0x00, /* PSI pointer to start of table */
131
132 0x00, /* tid(0) */
133 0xb0, 0x0d, /* section_syntax_indicator(1), section_length(13) */
134
135 0x00, 0x01, /* transport_stream_id(1) */
136
137 0xc1, /* version_number(0), current_next_indicator(1) */
138
139 0x00, 0x00, /* section_number(0), last_section_number(0) */
140
141 0x00, 0x01, /* program_number(1) */
142
143 0xe0, 0x00, /* PMT PID */
144
145 0x00, 0x00, 0x00, 0x00 /* CRC32 */
146};
147
148static u8 PMT[] = {
149 0xc2, /* i2c register */
150 0x01, /* table number for encoder */
151
152 0x47, /* sync */
153 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid */
154 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
155
156 0x00, /* PSI pointer to start of table */
157
158 0x02, /* tid(2) */
159 0xb0, 0x17, /* section_syntax_indicator(1), section_length(23) */
160
161 0x00, 0x01, /* program_number(1) */
162
163 0xc1, /* version_number(0), current_next_indicator(1) */
164
165 0x00, 0x00, /* section_number(0), last_section_number(0) */
166
167 0xe0, 0x00, /* PCR_PID */
168
169 0xf0, 0x00, /* program_info_length(0) */
170
171 0x02, 0xe0, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
172 0x04, 0xe0, 0x00, 0xf0, 0x00, /* audio stream type(4), pid */
173
174 0x00, 0x00, 0x00, 0x00 /* CRC32 */
175};
176
177static u8 PMT_AC3[] = {
178 0xc2, /* i2c register */
179 0x01, /* table number for encoder(1) */
180 0x47, /* sync */
181
182 0x40, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0) */
183 0x10, /* PMT PID (0x0010) */
184 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
185
186 0x00, /* PSI pointer to start of table */
187
188 0x02, /* TID (2) */
189 0xb0, 0x1a, /* section_syntax_indicator(1), section_length(26) */
190
191 0x00, 0x01, /* program_number(1) */
192
193 0xc1, /* version_number(0), current_next_indicator(1) */
194
195 0x00, 0x00, /* section_number(0), last_section_number(0) */
196
197 0xe1, 0x04, /* PCR_PID (0x0104) */
198
199 0xf0, 0x00, /* program_info_length(0) */
200
201 0x02, 0xe1, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
202 0x06, 0xe1, 0x03, 0xf0, 0x03, /* audio stream type(6), pid */
203 0x6a, /* AC3 */
204 0x01, /* Descriptor_length(1) */
205 0x00, /* component_type_flag(0), bsid_flag(0), mainid_flag(0), asvc_flag(0), reserved flags(0) */
206
207 0xED, 0xDE, 0x2D, 0xF3 /* CRC32 BE */
208};
209
210static struct saa6752hs_mpeg_params param_defaults =
211{
212 .ts_pid_pmt = 16,
213 .ts_pid_video = 260,
214 .ts_pid_audio = 256,
215 .ts_pid_pcr = 259,
216
217 .vi_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3,
218 .vi_bitrate = 4000,
219 .vi_bitrate_peak = 6000,
220 .vi_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
221
222 .au_encoding = V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
223 .au_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_256K,
224 .au_ac3_bitrate = V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
225};
226
227/* ---------------------------------------------------------------------- */
228
229static int saa6752hs_chip_command(struct i2c_client *client,
230 enum saa6752hs_command command)
231{
232 unsigned char buf[3];
233 unsigned long timeout;
234 int status = 0;
235
236 /* execute the command */
237 switch(command) {
238 case SAA6752HS_COMMAND_RESET:
239 buf[0] = 0x00;
240 break;
241
242 case SAA6752HS_COMMAND_STOP:
243 buf[0] = 0x03;
244 break;
245
246 case SAA6752HS_COMMAND_START:
247 buf[0] = 0x02;
248 break;
249
250 case SAA6752HS_COMMAND_PAUSE:
251 buf[0] = 0x04;
252 break;
253
254 case SAA6752HS_COMMAND_RECONFIGURE:
255 buf[0] = 0x05;
256 break;
257
258 case SAA6752HS_COMMAND_SLEEP:
259 buf[0] = 0x06;
260 break;
261
262 case SAA6752HS_COMMAND_RECONFIGURE_FORCE:
263 buf[0] = 0x07;
264 break;
265
266 default:
267 return -EINVAL;
268 }
269
270 /* set it and wait for it to be so */
271 i2c_master_send(client, buf, 1);
272 timeout = jiffies + HZ * 3;
273 for (;;) {
274 /* get the current status */
275 buf[0] = 0x10;
276 i2c_master_send(client, buf, 1);
277 i2c_master_recv(client, buf, 1);
278
279 if (!(buf[0] & 0x20))
280 break;
281 if (time_after(jiffies,timeout)) {
282 status = -ETIMEDOUT;
283 break;
284 }
285
286 msleep(10);
287 }
288
289 /* delay a bit to let encoder settle */
290 msleep(50);
291
292 return status;
293}
294
295
296static inline void set_reg8(struct i2c_client *client, uint8_t reg, uint8_t val)
297{
298 u8 buf[2];
299
300 buf[0] = reg;
301 buf[1] = val;
302 i2c_master_send(client, buf, 2);
303}
304
305static inline void set_reg16(struct i2c_client *client, uint8_t reg, uint16_t val)
306{
307 u8 buf[3];
308
309 buf[0] = reg;
310 buf[1] = val >> 8;
311 buf[2] = val & 0xff;
312 i2c_master_send(client, buf, 3);
313}
314
315static int saa6752hs_set_bitrate(struct i2c_client *client,
316 struct saa6752hs_state *h)
317{
318 struct saa6752hs_mpeg_params *params = &h->params;
319 int tot_bitrate;
320 int is_384k;
321
322 /* set the bitrate mode */
323 set_reg8(client, 0x71,
324 params->vi_bitrate_mode != V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
325
326 /* set the video bitrate */
327 if (params->vi_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) {
328 /* set the target bitrate */
329 set_reg16(client, 0x80, params->vi_bitrate);
330
331 /* set the max bitrate */
332 set_reg16(client, 0x81, params->vi_bitrate_peak);
333 tot_bitrate = params->vi_bitrate_peak;
334 } else {
335 /* set the target bitrate (no max bitrate for CBR) */
336 set_reg16(client, 0x81, params->vi_bitrate);
337 tot_bitrate = params->vi_bitrate;
338 }
339
340 /* set the audio encoding */
341 set_reg8(client, 0x93,
342 params->au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3);
343
344 /* set the audio bitrate */
345 if (params->au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3)
346 is_384k = V4L2_MPEG_AUDIO_AC3_BITRATE_384K == params->au_ac3_bitrate;
347 else
348 is_384k = V4L2_MPEG_AUDIO_L2_BITRATE_384K == params->au_l2_bitrate;
349 set_reg8(client, 0x94, is_384k);
350 tot_bitrate += is_384k ? 384 : 256;
351
352 /* Note: the total max bitrate is determined by adding the video and audio
353 bitrates together and also adding an extra 768kbit/s to stay on the
354 safe side. If more control should be required, then an extra MPEG control
355 should be added. */
356 tot_bitrate += 768;
357 if (tot_bitrate > MPEG_TOTAL_TARGET_BITRATE_MAX)
358 tot_bitrate = MPEG_TOTAL_TARGET_BITRATE_MAX;
359
360 /* set the total bitrate */
361 set_reg16(client, 0xb1, tot_bitrate);
362 return 0;
363}
364
365
366static int get_ctrl(int has_ac3, struct saa6752hs_mpeg_params *params,
367 struct v4l2_ext_control *ctrl)
368{
369 switch (ctrl->id) {
370 case V4L2_CID_MPEG_STREAM_TYPE:
371 ctrl->value = V4L2_MPEG_STREAM_TYPE_MPEG2_TS;
372 break;
373 case V4L2_CID_MPEG_STREAM_PID_PMT:
374 ctrl->value = params->ts_pid_pmt;
375 break;
376 case V4L2_CID_MPEG_STREAM_PID_AUDIO:
377 ctrl->value = params->ts_pid_audio;
378 break;
379 case V4L2_CID_MPEG_STREAM_PID_VIDEO:
380 ctrl->value = params->ts_pid_video;
381 break;
382 case V4L2_CID_MPEG_STREAM_PID_PCR:
383 ctrl->value = params->ts_pid_pcr;
384 break;
385 case V4L2_CID_MPEG_AUDIO_ENCODING:
386 ctrl->value = params->au_encoding;
387 break;
388 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
389 ctrl->value = params->au_l2_bitrate;
390 break;
391 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
392 if (!has_ac3)
393 return -EINVAL;
394 ctrl->value = params->au_ac3_bitrate;
395 break;
396 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
397 ctrl->value = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
398 break;
399 case V4L2_CID_MPEG_VIDEO_ENCODING:
400 ctrl->value = V4L2_MPEG_VIDEO_ENCODING_MPEG_2;
401 break;
402 case V4L2_CID_MPEG_VIDEO_ASPECT:
403 ctrl->value = params->vi_aspect;
404 break;
405 case V4L2_CID_MPEG_VIDEO_BITRATE:
406 ctrl->value = params->vi_bitrate * 1000;
407 break;
408 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
409 ctrl->value = params->vi_bitrate_peak * 1000;
410 break;
411 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
412 ctrl->value = params->vi_bitrate_mode;
413 break;
414 default:
415 return -EINVAL;
416 }
417 return 0;
418}
419
420static int handle_ctrl(int has_ac3, struct saa6752hs_mpeg_params *params,
421 struct v4l2_ext_control *ctrl, int set)
422{
423 int old = 0, new;
424
425 new = ctrl->value;
426 switch (ctrl->id) {
427 case V4L2_CID_MPEG_STREAM_TYPE:
428 old = V4L2_MPEG_STREAM_TYPE_MPEG2_TS;
429 if (set && new != old)
430 return -ERANGE;
431 new = old;
432 break;
433 case V4L2_CID_MPEG_STREAM_PID_PMT:
434 old = params->ts_pid_pmt;
435 if (set && new > MPEG_PID_MAX)
436 return -ERANGE;
437 if (new > MPEG_PID_MAX)
438 new = MPEG_PID_MAX;
439 params->ts_pid_pmt = new;
440 break;
441 case V4L2_CID_MPEG_STREAM_PID_AUDIO:
442 old = params->ts_pid_audio;
443 if (set && new > MPEG_PID_MAX)
444 return -ERANGE;
445 if (new > MPEG_PID_MAX)
446 new = MPEG_PID_MAX;
447 params->ts_pid_audio = new;
448 break;
449 case V4L2_CID_MPEG_STREAM_PID_VIDEO:
450 old = params->ts_pid_video;
451 if (set && new > MPEG_PID_MAX)
452 return -ERANGE;
453 if (new > MPEG_PID_MAX)
454 new = MPEG_PID_MAX;
455 params->ts_pid_video = new;
456 break;
457 case V4L2_CID_MPEG_STREAM_PID_PCR:
458 old = params->ts_pid_pcr;
459 if (set && new > MPEG_PID_MAX)
460 return -ERANGE;
461 if (new > MPEG_PID_MAX)
462 new = MPEG_PID_MAX;
463 params->ts_pid_pcr = new;
464 break;
465 case V4L2_CID_MPEG_AUDIO_ENCODING:
466 old = params->au_encoding;
467 if (set && new != V4L2_MPEG_AUDIO_ENCODING_LAYER_2 &&
468 (!has_ac3 || new != V4L2_MPEG_AUDIO_ENCODING_AC3))
469 return -ERANGE;
470 params->au_encoding = new;
471 break;
472 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
473 old = params->au_l2_bitrate;
474 if (set && new != V4L2_MPEG_AUDIO_L2_BITRATE_256K &&
475 new != V4L2_MPEG_AUDIO_L2_BITRATE_384K)
476 return -ERANGE;
477 if (new <= V4L2_MPEG_AUDIO_L2_BITRATE_256K)
478 new = V4L2_MPEG_AUDIO_L2_BITRATE_256K;
479 else
480 new = V4L2_MPEG_AUDIO_L2_BITRATE_384K;
481 params->au_l2_bitrate = new;
482 break;
483 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
484 if (!has_ac3)
485 return -EINVAL;
486 old = params->au_ac3_bitrate;
487 if (set && new != V4L2_MPEG_AUDIO_AC3_BITRATE_256K &&
488 new != V4L2_MPEG_AUDIO_AC3_BITRATE_384K)
489 return -ERANGE;
490 if (new <= V4L2_MPEG_AUDIO_AC3_BITRATE_256K)
491 new = V4L2_MPEG_AUDIO_AC3_BITRATE_256K;
492 else
493 new = V4L2_MPEG_AUDIO_AC3_BITRATE_384K;
494 params->au_ac3_bitrate = new;
495 break;
496 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
497 old = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
498 if (set && new != old)
499 return -ERANGE;
500 new = old;
501 break;
502 case V4L2_CID_MPEG_VIDEO_ENCODING:
503 old = V4L2_MPEG_VIDEO_ENCODING_MPEG_2;
504 if (set && new != old)
505 return -ERANGE;
506 new = old;
507 break;
508 case V4L2_CID_MPEG_VIDEO_ASPECT:
509 old = params->vi_aspect;
510 if (set && new != V4L2_MPEG_VIDEO_ASPECT_16x9 &&
511 new != V4L2_MPEG_VIDEO_ASPECT_4x3)
512 return -ERANGE;
513 if (new != V4L2_MPEG_VIDEO_ASPECT_16x9)
514 new = V4L2_MPEG_VIDEO_ASPECT_4x3;
515 params->vi_aspect = new;
516 break;
517 case V4L2_CID_MPEG_VIDEO_BITRATE:
518 old = params->vi_bitrate * 1000;
519 new = 1000 * (new / 1000);
520 if (set && new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000)
521 return -ERANGE;
522 if (new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000)
523 new = MPEG_VIDEO_TARGET_BITRATE_MAX * 1000;
524 params->vi_bitrate = new / 1000;
525 break;
526 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
527 old = params->vi_bitrate_peak * 1000;
528 new = 1000 * (new / 1000);
529 if (set && new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000)
530 return -ERANGE;
531 if (new > MPEG_VIDEO_TARGET_BITRATE_MAX * 1000)
532 new = MPEG_VIDEO_TARGET_BITRATE_MAX * 1000;
533 params->vi_bitrate_peak = new / 1000;
534 break;
535 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
536 old = params->vi_bitrate_mode;
537 params->vi_bitrate_mode = new;
538 break;
539 default:
540 return -EINVAL;
541 }
542 ctrl->value = new;
543 return 0;
544}
545
546
547static int saa6752hs_queryctrl(struct v4l2_subdev *sd, struct v4l2_queryctrl *qctrl)
548{
549 struct saa6752hs_state *h = to_state(sd);
550 struct saa6752hs_mpeg_params *params = &h->params;
551 int err;
552
553 switch (qctrl->id) {
554 case V4L2_CID_MPEG_AUDIO_ENCODING:
555 return v4l2_ctrl_query_fill(qctrl,
556 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
557 h->has_ac3 ? V4L2_MPEG_AUDIO_ENCODING_AC3 :
558 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
559 1, V4L2_MPEG_AUDIO_ENCODING_LAYER_2);
560
561 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
562 return v4l2_ctrl_query_fill(qctrl,
563 V4L2_MPEG_AUDIO_L2_BITRATE_256K,
564 V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1,
565 V4L2_MPEG_AUDIO_L2_BITRATE_256K);
566
567 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
568 if (!h->has_ac3)
569 return -EINVAL;
570 return v4l2_ctrl_query_fill(qctrl,
571 V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
572 V4L2_MPEG_AUDIO_AC3_BITRATE_384K, 1,
573 V4L2_MPEG_AUDIO_AC3_BITRATE_256K);
574
575 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
576 return v4l2_ctrl_query_fill(qctrl,
577 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
578 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000, 1,
579 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000);
580
581 case V4L2_CID_MPEG_VIDEO_ENCODING:
582 return v4l2_ctrl_query_fill(qctrl,
583 V4L2_MPEG_VIDEO_ENCODING_MPEG_2,
584 V4L2_MPEG_VIDEO_ENCODING_MPEG_2, 1,
585 V4L2_MPEG_VIDEO_ENCODING_MPEG_2);
586
587 case V4L2_CID_MPEG_VIDEO_ASPECT:
588 return v4l2_ctrl_query_fill(qctrl,
589 V4L2_MPEG_VIDEO_ASPECT_4x3,
590 V4L2_MPEG_VIDEO_ASPECT_16x9, 1,
591 V4L2_MPEG_VIDEO_ASPECT_4x3);
592
593 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
594 err = v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 8000000);
595 if (err == 0 &&
596 params->vi_bitrate_mode ==
597 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
598 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
599 return err;
600
601 case V4L2_CID_MPEG_STREAM_TYPE:
602 return v4l2_ctrl_query_fill(qctrl,
603 V4L2_MPEG_STREAM_TYPE_MPEG2_TS,
604 V4L2_MPEG_STREAM_TYPE_MPEG2_TS, 1,
605 V4L2_MPEG_STREAM_TYPE_MPEG2_TS);
606
607 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
608 return v4l2_ctrl_query_fill(qctrl,
609 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
610 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 1,
611 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
612 case V4L2_CID_MPEG_VIDEO_BITRATE:
613 return v4l2_ctrl_query_fill(qctrl, 0, 27000000, 1, 6000000);
614 case V4L2_CID_MPEG_STREAM_PID_PMT:
615 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 16);
616 case V4L2_CID_MPEG_STREAM_PID_AUDIO:
617 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 260);
618 case V4L2_CID_MPEG_STREAM_PID_VIDEO:
619 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 256);
620 case V4L2_CID_MPEG_STREAM_PID_PCR:
621 return v4l2_ctrl_query_fill(qctrl, 0, (1 << 14) - 1, 1, 259);
622
623 default:
624 break;
625 }
626 return -EINVAL;
627}
628
629static int saa6752hs_querymenu(struct v4l2_subdev *sd, struct v4l2_querymenu *qmenu)
630{
631 static const u32 mpeg_audio_encoding[] = {
632 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
633 V4L2_CTRL_MENU_IDS_END
634 };
635 static const u32 mpeg_audio_ac3_encoding[] = {
636 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
637 V4L2_MPEG_AUDIO_ENCODING_AC3,
638 V4L2_CTRL_MENU_IDS_END
639 };
640 static u32 mpeg_audio_l2_bitrate[] = {
641 V4L2_MPEG_AUDIO_L2_BITRATE_256K,
642 V4L2_MPEG_AUDIO_L2_BITRATE_384K,
643 V4L2_CTRL_MENU_IDS_END
644 };
645 static u32 mpeg_audio_ac3_bitrate[] = {
646 V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
647 V4L2_MPEG_AUDIO_AC3_BITRATE_384K,
648 V4L2_CTRL_MENU_IDS_END
649 };
650 struct saa6752hs_state *h = to_state(sd);
651 struct v4l2_queryctrl qctrl;
652 int err;
653
654 qctrl.id = qmenu->id;
655 err = saa6752hs_queryctrl(sd, &qctrl);
656 if (err)
657 return err;
658 switch (qmenu->id) {
659 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
660 return v4l2_ctrl_query_menu_valid_items(qmenu,
661 mpeg_audio_l2_bitrate);
662 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
663 if (!h->has_ac3)
664 return -EINVAL;
665 return v4l2_ctrl_query_menu_valid_items(qmenu,
666 mpeg_audio_ac3_bitrate);
667 case V4L2_CID_MPEG_AUDIO_ENCODING:
668 return v4l2_ctrl_query_menu_valid_items(qmenu,
669 h->has_ac3 ? mpeg_audio_ac3_encoding :
670 mpeg_audio_encoding);
671 }
672 return v4l2_ctrl_query_menu(qmenu, &qctrl, NULL);
673}
674
675static int saa6752hs_init(struct v4l2_subdev *sd, u32 leading_null_bytes)
676{
677 unsigned char buf[9], buf2[4];
678 struct saa6752hs_state *h = to_state(sd);
679 struct i2c_client *client = v4l2_get_subdevdata(sd);
680 unsigned size;
681 u32 crc;
682 unsigned char localPAT[256];
683 unsigned char localPMT[256];
684
685 /* Set video format - must be done first as it resets other settings */
686 set_reg8(client, 0x41, h->video_format);
687
688 /* Set number of lines in input signal */
689 set_reg8(client, 0x40, (h->standard & V4L2_STD_525_60) ? 1 : 0);
690
691 /* set bitrate */
692 saa6752hs_set_bitrate(client, h);
693
694 /* Set GOP structure {3, 13} */
695 set_reg16(client, 0x72, 0x030d);
696
697 /* Set minimum Q-scale {4} */
698 set_reg8(client, 0x82, 0x04);
699
700 /* Set maximum Q-scale {12} */
701 set_reg8(client, 0x83, 0x0c);
702
703 /* Set Output Protocol */
704 set_reg8(client, 0xd0, 0x81);
705
706 /* Set video output stream format {TS} */
707 set_reg8(client, 0xb0, 0x05);
708
709 /* Set leading null byte for TS */
710 set_reg16(client, 0xf6, leading_null_bytes);
711
712 /* compute PAT */
713 memcpy(localPAT, PAT, sizeof(PAT));
714 localPAT[17] = 0xe0 | ((h->params.ts_pid_pmt >> 8) & 0x0f);
715 localPAT[18] = h->params.ts_pid_pmt & 0xff;
716 crc = crc32_be(~0, &localPAT[7], sizeof(PAT) - 7 - 4);
717 localPAT[sizeof(PAT) - 4] = (crc >> 24) & 0xFF;
718 localPAT[sizeof(PAT) - 3] = (crc >> 16) & 0xFF;
719 localPAT[sizeof(PAT) - 2] = (crc >> 8) & 0xFF;
720 localPAT[sizeof(PAT) - 1] = crc & 0xFF;
721
722 /* compute PMT */
723 if (h->params.au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3) {
724 size = sizeof(PMT_AC3);
725 memcpy(localPMT, PMT_AC3, size);
726 } else {
727 size = sizeof(PMT);
728 memcpy(localPMT, PMT, size);
729 }
730 localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f);
731 localPMT[4] = h->params.ts_pid_pmt & 0xff;
732 localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F);
733 localPMT[16] = h->params.ts_pid_pcr & 0xFF;
734 localPMT[20] = 0xE0 | ((h->params.ts_pid_video >> 8) & 0x0F);
735 localPMT[21] = h->params.ts_pid_video & 0xFF;
736 localPMT[25] = 0xE0 | ((h->params.ts_pid_audio >> 8) & 0x0F);
737 localPMT[26] = h->params.ts_pid_audio & 0xFF;
738 crc = crc32_be(~0, &localPMT[7], size - 7 - 4);
739 localPMT[size - 4] = (crc >> 24) & 0xFF;
740 localPMT[size - 3] = (crc >> 16) & 0xFF;
741 localPMT[size - 2] = (crc >> 8) & 0xFF;
742 localPMT[size - 1] = crc & 0xFF;
743
744 /* Set Audio PID */
745 set_reg16(client, 0xc1, h->params.ts_pid_audio);
746
747 /* Set Video PID */
748 set_reg16(client, 0xc0, h->params.ts_pid_video);
749
750 /* Set PCR PID */
751 set_reg16(client, 0xc4, h->params.ts_pid_pcr);
752
753 /* Send SI tables */
754 i2c_master_send(client, localPAT, sizeof(PAT));
755 i2c_master_send(client, localPMT, size);
756
757 /* mute then unmute audio. This removes buzzing artefacts */
758 set_reg8(client, 0xa4, 1);
759 set_reg8(client, 0xa4, 0);
760
761 /* start it going */
762 saa6752hs_chip_command(client, SAA6752HS_COMMAND_START);
763
764 /* readout current state */
765 buf[0] = 0xE1;
766 buf[1] = 0xA7;
767 buf[2] = 0xFE;
768 buf[3] = 0x82;
769 buf[4] = 0xB0;
770 i2c_master_send(client, buf, 5);
771 i2c_master_recv(client, buf2, 4);
772
773 /* change aspect ratio */
774 buf[0] = 0xE0;
775 buf[1] = 0xA7;
776 buf[2] = 0xFE;
777 buf[3] = 0x82;
778 buf[4] = 0xB0;
779 buf[5] = buf2[0];
780 switch (h->params.vi_aspect) {
781 case V4L2_MPEG_VIDEO_ASPECT_16x9:
782 buf[6] = buf2[1] | 0x40;
783 break;
784 case V4L2_MPEG_VIDEO_ASPECT_4x3:
785 default:
786 buf[6] = buf2[1] & 0xBF;
787 break;
788 }
789 buf[7] = buf2[2];
790 buf[8] = buf2[3];
791 i2c_master_send(client, buf, 9);
792
793 return 0;
794}
795
796static int saa6752hs_do_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls, int set)
797{
798 struct saa6752hs_state *h = to_state(sd);
799 struct saa6752hs_mpeg_params params;
800 int i;
801
802 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
803 return -EINVAL;
804
805 params = h->params;
806 for (i = 0; i < ctrls->count; i++) {
807 int err = handle_ctrl(h->has_ac3, &params, ctrls->controls + i, set);
808
809 if (err) {
810 ctrls->error_idx = i;
811 return err;
812 }
813 }
814 if (set)
815 h->params = params;
816 return 0;
817}
818
819static int saa6752hs_s_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
820{
821 return saa6752hs_do_ext_ctrls(sd, ctrls, 1);
822}
823
824static int saa6752hs_try_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
825{
826 return saa6752hs_do_ext_ctrls(sd, ctrls, 0);
827}
828
829static int saa6752hs_g_ext_ctrls(struct v4l2_subdev *sd, struct v4l2_ext_controls *ctrls)
830{
831 struct saa6752hs_state *h = to_state(sd);
832 int i;
833
834 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
835 return -EINVAL;
836
837 for (i = 0; i < ctrls->count; i++) {
838 int err = get_ctrl(h->has_ac3, &h->params, ctrls->controls + i);
839
840 if (err) {
841 ctrls->error_idx = i;
842 return err;
843 }
844 }
845 return 0;
846}
847
848static int saa6752hs_g_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f)
849{
850 struct saa6752hs_state *h = to_state(sd);
851
852 if (h->video_format == SAA6752HS_VF_UNKNOWN)
853 h->video_format = SAA6752HS_VF_D1;
854 f->width = v4l2_format_table[h->video_format].fmt.pix.width;
855 f->height = v4l2_format_table[h->video_format].fmt.pix.height;
856 f->code = V4L2_MBUS_FMT_FIXED;
857 f->field = V4L2_FIELD_INTERLACED;
858 f->colorspace = V4L2_COLORSPACE_SMPTE170M;
859 return 0;
860}
861
862static int saa6752hs_s_mbus_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *f)
863{
864 struct saa6752hs_state *h = to_state(sd);
865 int dist_352, dist_480, dist_720;
866
867 if (f->code != V4L2_MBUS_FMT_FIXED)
868 return -EINVAL;
869
870 /*
871 FIXME: translate and round width/height into EMPRESS
872 subsample type:
873
874 type | PAL | NTSC
875 ---------------------------
876 SIF | 352x288 | 352x240
877 1/2 D1 | 352x576 | 352x480
878 2/3 D1 | 480x576 | 480x480
879 D1 | 720x576 | 720x480
880 */
881
882 dist_352 = abs(f->width - 352);
883 dist_480 = abs(f->width - 480);
884 dist_720 = abs(f->width - 720);
885 if (dist_720 < dist_480) {
886 f->width = 720;
887 f->height = 576;
888 h->video_format = SAA6752HS_VF_D1;
889 } else if (dist_480 < dist_352) {
890 f->width = 480;
891 f->height = 576;
892 h->video_format = SAA6752HS_VF_2_3_D1;
893 } else {
894 f->width = 352;
895 if (abs(f->height - 576) <
896 abs(f->height - 288)) {
897 f->height = 576;
898 h->video_format = SAA6752HS_VF_1_2_D1;
899 } else {
900 f->height = 288;
901 h->video_format = SAA6752HS_VF_SIF;
902 }
903 }
904 f->field = V4L2_FIELD_INTERLACED;
905 f->colorspace = V4L2_COLORSPACE_SMPTE170M;
906 return 0;
907}
908
909static int saa6752hs_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
910{
911 struct saa6752hs_state *h = to_state(sd);
912
913 h->standard = std;
914 return 0;
915}
916
917static int saa6752hs_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
918{
919 struct i2c_client *client = v4l2_get_subdevdata(sd);
920 struct saa6752hs_state *h = to_state(sd);
921
922 return v4l2_chip_ident_i2c_client(client,
923 chip, h->chip, h->revision);
924}
925
926/* ----------------------------------------------------------------------- */
927
928static const struct v4l2_subdev_core_ops saa6752hs_core_ops = {
929 .g_chip_ident = saa6752hs_g_chip_ident,
930 .init = saa6752hs_init,
931 .queryctrl = saa6752hs_queryctrl,
932 .querymenu = saa6752hs_querymenu,
933 .g_ext_ctrls = saa6752hs_g_ext_ctrls,
934 .s_ext_ctrls = saa6752hs_s_ext_ctrls,
935 .try_ext_ctrls = saa6752hs_try_ext_ctrls,
936 .s_std = saa6752hs_s_std,
937};
938
939static const struct v4l2_subdev_video_ops saa6752hs_video_ops = {
940 .s_mbus_fmt = saa6752hs_s_mbus_fmt,
941 .g_mbus_fmt = saa6752hs_g_mbus_fmt,
942};
943
944static const struct v4l2_subdev_ops saa6752hs_ops = {
945 .core = &saa6752hs_core_ops,
946 .video = &saa6752hs_video_ops,
947};
948
949static int saa6752hs_probe(struct i2c_client *client,
950 const struct i2c_device_id *id)
951{
952 struct saa6752hs_state *h = kzalloc(sizeof(*h), GFP_KERNEL);
953 struct v4l2_subdev *sd;
954 u8 addr = 0x13;
955 u8 data[12];
956
957 v4l_info(client, "chip found @ 0x%x (%s)\n",
958 client->addr << 1, client->adapter->name);
959 if (h == NULL)
960 return -ENOMEM;
961 sd = &h->sd;
962 v4l2_i2c_subdev_init(sd, client, &saa6752hs_ops);
963
964 i2c_master_send(client, &addr, 1);
965 i2c_master_recv(client, data, sizeof(data));
966 h->chip = V4L2_IDENT_SAA6752HS;
967 h->revision = (data[8] << 8) | data[9];
968 h->has_ac3 = 0;
969 if (h->revision == 0x0206) {
970 h->chip = V4L2_IDENT_SAA6752HS_AC3;
971 h->has_ac3 = 1;
972 v4l_info(client, "support AC-3\n");
973 }
974 h->params = param_defaults;
975 h->standard = 0; /* Assume 625 input lines */
976 return 0;
977}
978
979static int saa6752hs_remove(struct i2c_client *client)
980{
981 struct v4l2_subdev *sd = i2c_get_clientdata(client);
982
983 v4l2_device_unregister_subdev(sd);
984 kfree(to_state(sd));
985 return 0;
986}
987
988static const struct i2c_device_id saa6752hs_id[] = {
989 { "saa6752hs", 0 },
990 { }
991};
992MODULE_DEVICE_TABLE(i2c, saa6752hs_id);
993
994static struct i2c_driver saa6752hs_driver = {
995 .driver = {
996 .owner = THIS_MODULE,
997 .name = "saa6752hs",
998 },
999 .probe = saa6752hs_probe,
1000 .remove = saa6752hs_remove,
1001 .id_table = saa6752hs_id,
1002};
1003
1004static __init int init_saa6752hs(void)
1005{
1006 return i2c_add_driver(&saa6752hs_driver);
1007}
1008
1009static __exit void exit_saa6752hs(void)
1010{
1011 i2c_del_driver(&saa6752hs_driver);
1012}
1013
1014module_init(init_saa6752hs);
1015module_exit(exit_saa6752hs);
1016
1017/*
1018 * Overrides for Emacs so that we follow Linus's tabbing style.
1019 * ---------------------------------------------------------------------------
1020 * Local variables:
1021 * c-basic-offset: 8
1022 * End:
1023 */
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
new file mode 100644
index 00000000000..10460fd3ce3
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -0,0 +1,1209 @@
1/*
2 * SAA713x ALSA support for V4L
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, version 2
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 *
17 */
18
19#include <linux/init.h>
20#include <linux/slab.h>
21#include <linux/time.h>
22#include <linux/wait.h>
23#include <linux/module.h>
24#include <sound/core.h>
25#include <sound/control.h>
26#include <sound/pcm.h>
27#include <sound/pcm_params.h>
28#include <sound/initval.h>
29#include <linux/interrupt.h>
30
31#include "saa7134.h"
32#include "saa7134-reg.h"
33
34static unsigned int debug;
35module_param(debug, int, 0644);
36MODULE_PARM_DESC(debug,"enable debug messages [alsa]");
37
38/*
39 * Configuration macros
40 */
41
42/* defaults */
43#define MIXER_ADDR_UNSELECTED -1
44#define MIXER_ADDR_TVTUNER 0
45#define MIXER_ADDR_LINE1 1
46#define MIXER_ADDR_LINE2 2
47#define MIXER_ADDR_LAST 2
48
49
50static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
51static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
52static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 1};
53
54module_param_array(index, int, NULL, 0444);
55module_param_array(enable, int, NULL, 0444);
56MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s).");
57MODULE_PARM_DESC(enable, "Enable (or not) the SAA7134 capture interface(s).");
58
59#define dprintk(fmt, arg...) if (debug) \
60 printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ##arg)
61
62
63
64/*
65 * Main chip structure
66 */
67
68typedef struct snd_card_saa7134 {
69 struct snd_card *card;
70 spinlock_t mixer_lock;
71 int mixer_volume[MIXER_ADDR_LAST+1][2];
72 int capture_source_addr;
73 int capture_source[2];
74 struct snd_kcontrol *capture_ctl[MIXER_ADDR_LAST+1];
75 struct pci_dev *pci;
76 struct saa7134_dev *dev;
77
78 unsigned long iobase;
79 s16 irq;
80 u16 mute_was_on;
81
82 spinlock_t lock;
83} snd_card_saa7134_t;
84
85
86/*
87 * PCM structure
88 */
89
90typedef struct snd_card_saa7134_pcm {
91 struct saa7134_dev *dev;
92
93 spinlock_t lock;
94
95 struct snd_pcm_substream *substream;
96} snd_card_saa7134_pcm_t;
97
98static struct snd_card *snd_saa7134_cards[SNDRV_CARDS];
99
100
101/*
102 * saa7134 DMA audio stop
103 *
104 * Called when the capture device is released or the buffer overflows
105 *
106 * - Copied verbatim from saa7134-oss's dsp_dma_stop.
107 *
108 */
109
110static void saa7134_dma_stop(struct saa7134_dev *dev)
111{
112 dev->dmasound.dma_blk = -1;
113 dev->dmasound.dma_running = 0;
114 saa7134_set_dmabits(dev);
115}
116
117/*
118 * saa7134 DMA audio start
119 *
120 * Called when preparing the capture device for use
121 *
122 * - Copied verbatim from saa7134-oss's dsp_dma_start.
123 *
124 */
125
126static void saa7134_dma_start(struct saa7134_dev *dev)
127{
128 dev->dmasound.dma_blk = 0;
129 dev->dmasound.dma_running = 1;
130 saa7134_set_dmabits(dev);
131}
132
133/*
134 * saa7134 audio DMA IRQ handler
135 *
136 * Called whenever we get an SAA7134_IRQ_REPORT_DONE_RA3 interrupt
137 * Handles shifting between the 2 buffers, manages the read counters,
138 * and notifies ALSA when periods elapse
139 *
140 * - Mostly copied from saa7134-oss's saa7134_irq_oss_done.
141 *
142 */
143
144static void saa7134_irq_alsa_done(struct saa7134_dev *dev,
145 unsigned long status)
146{
147 int next_blk, reg = 0;
148
149 spin_lock(&dev->slock);
150 if (UNSET == dev->dmasound.dma_blk) {
151 dprintk("irq: recording stopped\n");
152 goto done;
153 }
154 if (0 != (status & 0x0f000000))
155 dprintk("irq: lost %ld\n", (status >> 24) & 0x0f);
156 if (0 == (status & 0x10000000)) {
157 /* odd */
158 if (0 == (dev->dmasound.dma_blk & 0x01))
159 reg = SAA7134_RS_BA1(6);
160 } else {
161 /* even */
162 if (1 == (dev->dmasound.dma_blk & 0x01))
163 reg = SAA7134_RS_BA2(6);
164 }
165 if (0 == reg) {
166 dprintk("irq: field oops [%s]\n",
167 (status & 0x10000000) ? "even" : "odd");
168 goto done;
169 }
170
171 if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) {
172 dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->dmasound.read_count,
173 dev->dmasound.bufsize, dev->dmasound.blocks);
174 spin_unlock(&dev->slock);
175 snd_pcm_stop(dev->dmasound.substream,SNDRV_PCM_STATE_XRUN);
176 return;
177 }
178
179 /* next block addr */
180 next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks;
181 saa_writel(reg,next_blk * dev->dmasound.blksize);
182 if (debug > 2)
183 dprintk("irq: ok, %s, next_blk=%d, addr=%x, blocks=%u, size=%u, read=%u\n",
184 (status & 0x10000000) ? "even" : "odd ", next_blk,
185 next_blk * dev->dmasound.blksize, dev->dmasound.blocks, dev->dmasound.blksize, dev->dmasound.read_count);
186
187 /* update status & wake waiting readers */
188 dev->dmasound.dma_blk = (dev->dmasound.dma_blk + 1) % dev->dmasound.blocks;
189 dev->dmasound.read_count += dev->dmasound.blksize;
190
191 dev->dmasound.recording_on = reg;
192
193 if (dev->dmasound.read_count >= snd_pcm_lib_period_bytes(dev->dmasound.substream)) {
194 spin_unlock(&dev->slock);
195 snd_pcm_period_elapsed(dev->dmasound.substream);
196 spin_lock(&dev->slock);
197 }
198
199 done:
200 spin_unlock(&dev->slock);
201
202}
203
204/*
205 * IRQ request handler
206 *
207 * Runs along with saa7134's IRQ handler, discards anything that isn't
208 * DMA sound
209 *
210 */
211
212static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id)
213{
214 struct saa7134_dmasound *dmasound = dev_id;
215 struct saa7134_dev *dev = dmasound->priv_data;
216
217 unsigned long report, status;
218 int loop, handled = 0;
219
220 for (loop = 0; loop < 10; loop++) {
221 report = saa_readl(SAA7134_IRQ_REPORT);
222 status = saa_readl(SAA7134_IRQ_STATUS);
223
224 if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
225 handled = 1;
226 saa_writel(SAA7134_IRQ_REPORT,
227 SAA7134_IRQ_REPORT_DONE_RA3);
228 saa7134_irq_alsa_done(dev, status);
229 } else {
230 goto out;
231 }
232 }
233
234 if (loop == 10) {
235 dprintk("error! looping IRQ!");
236 }
237
238out:
239 return IRQ_RETVAL(handled);
240}
241
242/*
243 * ALSA capture trigger
244 *
245 * - One of the ALSA capture callbacks.
246 *
247 * Called whenever a capture is started or stopped. Must be defined,
248 * but there's nothing we want to do here
249 *
250 */
251
252static int snd_card_saa7134_capture_trigger(struct snd_pcm_substream * substream,
253 int cmd)
254{
255 struct snd_pcm_runtime *runtime = substream->runtime;
256 snd_card_saa7134_pcm_t *pcm = runtime->private_data;
257 struct saa7134_dev *dev=pcm->dev;
258 int err = 0;
259
260 spin_lock(&dev->slock);
261 if (cmd == SNDRV_PCM_TRIGGER_START) {
262 /* start dma */
263 saa7134_dma_start(dev);
264 } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
265 /* stop dma */
266 saa7134_dma_stop(dev);
267 } else {
268 err = -EINVAL;
269 }
270 spin_unlock(&dev->slock);
271
272 return err;
273}
274
275/*
276 * DMA buffer initialization
277 *
278 * Uses V4L functions to initialize the DMA. Shouldn't be necessary in
279 * ALSA, but I was unable to use ALSA's own DMA, and had to force the
280 * usage of V4L's
281 *
282 * - Copied verbatim from saa7134-oss.
283 *
284 */
285
286static int dsp_buffer_init(struct saa7134_dev *dev)
287{
288 int err;
289
290 BUG_ON(!dev->dmasound.bufsize);
291
292 videobuf_dma_init(&dev->dmasound.dma);
293 err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE,
294 (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT);
295 if (0 != err)
296 return err;
297 return 0;
298}
299
300/*
301 * DMA buffer release
302 *
303 * Called after closing the device, during snd_card_saa7134_capture_close
304 *
305 */
306
307static int dsp_buffer_free(struct saa7134_dev *dev)
308{
309 BUG_ON(!dev->dmasound.blksize);
310
311 videobuf_dma_free(&dev->dmasound.dma);
312
313 dev->dmasound.blocks = 0;
314 dev->dmasound.blksize = 0;
315 dev->dmasound.bufsize = 0;
316
317 return 0;
318}
319
320/*
321 * Setting the capture source and updating the ALSA controls
322 */
323static int snd_saa7134_capsrc_set(struct snd_kcontrol *kcontrol,
324 int left, int right, bool force_notify)
325{
326 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
327 int change = 0, addr = kcontrol->private_value;
328 int active, old_addr;
329 u32 anabar, xbarin;
330 int analog_io, rate;
331 struct saa7134_dev *dev;
332
333 dev = chip->dev;
334
335 spin_lock_irq(&chip->mixer_lock);
336
337 active = left != 0 || right != 0;
338 old_addr = chip->capture_source_addr;
339
340 /* The active capture source cannot be deactivated */
341 if (active) {
342 change = old_addr != addr ||
343 chip->capture_source[0] != left ||
344 chip->capture_source[1] != right;
345
346 chip->capture_source[0] = left;
347 chip->capture_source[1] = right;
348 chip->capture_source_addr = addr;
349 dev->dmasound.input = addr;
350 }
351 spin_unlock_irq(&chip->mixer_lock);
352
353 if (change) {
354 switch (dev->pci->device) {
355
356 case PCI_DEVICE_ID_PHILIPS_SAA7134:
357 switch (addr) {
358 case MIXER_ADDR_TVTUNER:
359 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL,
360 0xc0, 0xc0);
361 saa_andorb(SAA7134_SIF_SAMPLE_FREQ,
362 0x03, 0x00);
363 break;
364 case MIXER_ADDR_LINE1:
365 case MIXER_ADDR_LINE2:
366 analog_io = (MIXER_ADDR_LINE1 == addr) ?
367 0x00 : 0x08;
368 rate = (32000 == dev->dmasound.rate) ?
369 0x01 : 0x03;
370 saa_andorb(SAA7134_ANALOG_IO_SELECT,
371 0x08, analog_io);
372 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL,
373 0xc0, 0x80);
374 saa_andorb(SAA7134_SIF_SAMPLE_FREQ,
375 0x03, rate);
376 break;
377 }
378
379 break;
380 case PCI_DEVICE_ID_PHILIPS_SAA7133:
381 case PCI_DEVICE_ID_PHILIPS_SAA7135:
382 xbarin = 0x03; /* adc */
383 anabar = 0;
384 switch (addr) {
385 case MIXER_ADDR_TVTUNER:
386 xbarin = 0; /* Demodulator */
387 anabar = 2; /* DACs */
388 break;
389 case MIXER_ADDR_LINE1:
390 anabar = 0; /* aux1, aux1 */
391 break;
392 case MIXER_ADDR_LINE2:
393 anabar = 9; /* aux2, aux2 */
394 break;
395 }
396
397 /* output xbar always main channel */
398 saa_dsp_writel(dev, SAA7133_DIGITAL_OUTPUT_SEL1,
399 0xbbbb10);
400
401 if (left || right) {
402 /* We've got data, turn the input on */
403 saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1,
404 xbarin);
405 saa_writel(SAA7133_ANALOG_IO_SELECT, anabar);
406 } else {
407 saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1,
408 0);
409 saa_writel(SAA7133_ANALOG_IO_SELECT, 0);
410 }
411 break;
412 }
413 }
414
415 if (change) {
416 if (force_notify)
417 snd_ctl_notify(chip->card,
418 SNDRV_CTL_EVENT_MASK_VALUE,
419 &chip->capture_ctl[addr]->id);
420
421 if (old_addr != MIXER_ADDR_UNSELECTED && old_addr != addr)
422 snd_ctl_notify(chip->card,
423 SNDRV_CTL_EVENT_MASK_VALUE,
424 &chip->capture_ctl[old_addr]->id);
425 }
426
427 return change;
428}
429
430/*
431 * ALSA PCM preparation
432 *
433 * - One of the ALSA capture callbacks.
434 *
435 * Called right after the capture device is opened, this function configures
436 * the buffer using the previously defined functions, allocates the memory,
437 * sets up the hardware registers, and then starts the DMA. When this function
438 * returns, the audio should be flowing.
439 *
440 */
441
442static int snd_card_saa7134_capture_prepare(struct snd_pcm_substream * substream)
443{
444 struct snd_pcm_runtime *runtime = substream->runtime;
445 int bswap, sign;
446 u32 fmt, control;
447 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
448 struct saa7134_dev *dev;
449 snd_card_saa7134_pcm_t *pcm = runtime->private_data;
450
451 pcm->dev->dmasound.substream = substream;
452
453 dev = saa7134->dev;
454
455 if (snd_pcm_format_width(runtime->format) == 8)
456 fmt = 0x00;
457 else
458 fmt = 0x01;
459
460 if (snd_pcm_format_signed(runtime->format))
461 sign = 1;
462 else
463 sign = 0;
464
465 if (snd_pcm_format_big_endian(runtime->format))
466 bswap = 1;
467 else
468 bswap = 0;
469
470 switch (dev->pci->device) {
471 case PCI_DEVICE_ID_PHILIPS_SAA7134:
472 if (1 == runtime->channels)
473 fmt |= (1 << 3);
474 if (2 == runtime->channels)
475 fmt |= (3 << 3);
476 if (sign)
477 fmt |= 0x04;
478
479 fmt |= (MIXER_ADDR_TVTUNER == dev->dmasound.input) ? 0xc0 : 0x80;
480 saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->dmasound.blksize - 1) & 0x0000ff));
481 saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->dmasound.blksize - 1) & 0x00ff00) >> 8);
482 saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->dmasound.blksize - 1) & 0xff0000) >> 16);
483 saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt);
484
485 break;
486 case PCI_DEVICE_ID_PHILIPS_SAA7133:
487 case PCI_DEVICE_ID_PHILIPS_SAA7135:
488 if (1 == runtime->channels)
489 fmt |= (1 << 4);
490 if (2 == runtime->channels)
491 fmt |= (2 << 4);
492 if (!sign)
493 fmt |= 0x04;
494 saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1);
495 saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
496 break;
497 }
498
499 dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n",
500 runtime->format, runtime->channels, fmt,
501 bswap ? 'b' : '-');
502 /* dma: setup channel 6 (= AUDIO) */
503 control = SAA7134_RS_CONTROL_BURST_16 |
504 SAA7134_RS_CONTROL_ME |
505 (dev->dmasound.pt.dma >> 12);
506 if (bswap)
507 control |= SAA7134_RS_CONTROL_BSWAP;
508
509 saa_writel(SAA7134_RS_BA1(6),0);
510 saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize);
511 saa_writel(SAA7134_RS_PITCH(6),0);
512 saa_writel(SAA7134_RS_CONTROL(6),control);
513
514 dev->dmasound.rate = runtime->rate;
515
516 /* Setup and update the card/ALSA controls */
517 snd_saa7134_capsrc_set(saa7134->capture_ctl[dev->dmasound.input], 1, 1,
518 true);
519
520 return 0;
521
522}
523
524/*
525 * ALSA pointer fetching
526 *
527 * - One of the ALSA capture callbacks.
528 *
529 * Called whenever a period elapses, it must return the current hardware
530 * position of the buffer.
531 * Also resets the read counter used to prevent overruns
532 *
533 */
534
535static snd_pcm_uframes_t
536snd_card_saa7134_capture_pointer(struct snd_pcm_substream * substream)
537{
538 struct snd_pcm_runtime *runtime = substream->runtime;
539 snd_card_saa7134_pcm_t *pcm = runtime->private_data;
540 struct saa7134_dev *dev=pcm->dev;
541
542 if (dev->dmasound.read_count) {
543 dev->dmasound.read_count -= snd_pcm_lib_period_bytes(substream);
544 dev->dmasound.read_offset += snd_pcm_lib_period_bytes(substream);
545 if (dev->dmasound.read_offset == dev->dmasound.bufsize)
546 dev->dmasound.read_offset = 0;
547 }
548
549 return bytes_to_frames(runtime, dev->dmasound.read_offset);
550}
551
552/*
553 * ALSA hardware capabilities definition
554 *
555 * Report only 32kHz for ALSA:
556 *
557 * - SAA7133/35 uses DDEP (DemDec Easy Programming mode), which works in 32kHz
558 * only
559 * - SAA7134 for TV mode uses DemDec mode (32kHz)
560 * - Radio works in 32kHz only
561 * - When recording 48kHz from Line1/Line2, switching of capture source to TV
562 * means
563 * switching to 32kHz without any frequency translation
564 */
565
566static struct snd_pcm_hardware snd_card_saa7134_capture =
567{
568 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
569 SNDRV_PCM_INFO_BLOCK_TRANSFER |
570 SNDRV_PCM_INFO_MMAP_VALID),
571 .formats = SNDRV_PCM_FMTBIT_S16_LE | \
572 SNDRV_PCM_FMTBIT_S16_BE | \
573 SNDRV_PCM_FMTBIT_S8 | \
574 SNDRV_PCM_FMTBIT_U8 | \
575 SNDRV_PCM_FMTBIT_U16_LE | \
576 SNDRV_PCM_FMTBIT_U16_BE,
577 .rates = SNDRV_PCM_RATE_32000,
578 .rate_min = 32000,
579 .rate_max = 32000,
580 .channels_min = 1,
581 .channels_max = 2,
582 .buffer_bytes_max = (256*1024),
583 .period_bytes_min = 64,
584 .period_bytes_max = (256*1024),
585 .periods_min = 4,
586 .periods_max = 1024,
587};
588
589static void snd_card_saa7134_runtime_free(struct snd_pcm_runtime *runtime)
590{
591 snd_card_saa7134_pcm_t *pcm = runtime->private_data;
592
593 kfree(pcm);
594}
595
596
597/*
598 * ALSA hardware params
599 *
600 * - One of the ALSA capture callbacks.
601 *
602 * Called on initialization, right before the PCM preparation
603 *
604 */
605
606static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
607 struct snd_pcm_hw_params * hw_params)
608{
609 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
610 struct saa7134_dev *dev;
611 unsigned int period_size, periods;
612 int err;
613
614 period_size = params_period_bytes(hw_params);
615 periods = params_periods(hw_params);
616
617 if (period_size < 0x100 || period_size > 0x10000)
618 return -EINVAL;
619 if (periods < 4)
620 return -EINVAL;
621 if (period_size * periods > 1024 * 1024)
622 return -EINVAL;
623
624 dev = saa7134->dev;
625
626 if (dev->dmasound.blocks == periods &&
627 dev->dmasound.blksize == period_size)
628 return 0;
629
630 /* release the old buffer */
631 if (substream->runtime->dma_area) {
632 saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
633 videobuf_dma_unmap(&dev->pci->dev, &dev->dmasound.dma);
634 dsp_buffer_free(dev);
635 substream->runtime->dma_area = NULL;
636 }
637 dev->dmasound.blocks = periods;
638 dev->dmasound.blksize = period_size;
639 dev->dmasound.bufsize = period_size * periods;
640
641 err = dsp_buffer_init(dev);
642 if (0 != err) {
643 dev->dmasound.blocks = 0;
644 dev->dmasound.blksize = 0;
645 dev->dmasound.bufsize = 0;
646 return err;
647 }
648
649 if (0 != (err = videobuf_dma_map(&dev->pci->dev, &dev->dmasound.dma))) {
650 dsp_buffer_free(dev);
651 return err;
652 }
653 if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt))) {
654 videobuf_dma_unmap(&dev->pci->dev, &dev->dmasound.dma);
655 dsp_buffer_free(dev);
656 return err;
657 }
658 if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt,
659 dev->dmasound.dma.sglist,
660 dev->dmasound.dma.sglen,
661 0))) {
662 saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
663 videobuf_dma_unmap(&dev->pci->dev, &dev->dmasound.dma);
664 dsp_buffer_free(dev);
665 return err;
666 }
667
668 /* I should be able to use runtime->dma_addr in the control
669 byte, but it doesn't work. So I allocate the DMA using the
670 V4L functions, and force ALSA to use that as the DMA area */
671
672 substream->runtime->dma_area = dev->dmasound.dma.vaddr;
673 substream->runtime->dma_bytes = dev->dmasound.bufsize;
674 substream->runtime->dma_addr = 0;
675
676 return 0;
677
678}
679
680/*
681 * ALSA hardware release
682 *
683 * - One of the ALSA capture callbacks.
684 *
685 * Called after closing the device, but before snd_card_saa7134_capture_close
686 * It stops the DMA audio and releases the buffers.
687 *
688 */
689
690static int snd_card_saa7134_hw_free(struct snd_pcm_substream * substream)
691{
692 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
693 struct saa7134_dev *dev;
694
695 dev = saa7134->dev;
696
697 if (substream->runtime->dma_area) {
698 saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
699 videobuf_dma_unmap(&dev->pci->dev, &dev->dmasound.dma);
700 dsp_buffer_free(dev);
701 substream->runtime->dma_area = NULL;
702 }
703
704 return 0;
705}
706
707/*
708 * ALSA capture finish
709 *
710 * - One of the ALSA capture callbacks.
711 *
712 * Called after closing the device.
713 *
714 */
715
716static int snd_card_saa7134_capture_close(struct snd_pcm_substream * substream)
717{
718 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
719 struct saa7134_dev *dev = saa7134->dev;
720
721 if (saa7134->mute_was_on) {
722 dev->ctl_mute = 1;
723 saa7134_tvaudio_setmute(dev);
724 }
725 return 0;
726}
727
728/*
729 * ALSA capture start
730 *
731 * - One of the ALSA capture callbacks.
732 *
733 * Called when opening the device. It creates and populates the PCM
734 * structure
735 *
736 */
737
738static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream)
739{
740 struct snd_pcm_runtime *runtime = substream->runtime;
741 snd_card_saa7134_pcm_t *pcm;
742 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
743 struct saa7134_dev *dev;
744 int amux, err;
745
746 if (!saa7134) {
747 printk(KERN_ERR "BUG: saa7134 can't find device struct."
748 " Can't proceed with open\n");
749 return -ENODEV;
750 }
751 dev = saa7134->dev;
752 mutex_lock(&dev->dmasound.lock);
753
754 dev->dmasound.read_count = 0;
755 dev->dmasound.read_offset = 0;
756
757 amux = dev->input->amux;
758 if ((amux < 1) || (amux > 3))
759 amux = 1;
760 dev->dmasound.input = amux - 1;
761
762 mutex_unlock(&dev->dmasound.lock);
763
764 pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
765 if (pcm == NULL)
766 return -ENOMEM;
767
768 pcm->dev=saa7134->dev;
769
770 spin_lock_init(&pcm->lock);
771
772 pcm->substream = substream;
773 runtime->private_data = pcm;
774 runtime->private_free = snd_card_saa7134_runtime_free;
775 runtime->hw = snd_card_saa7134_capture;
776
777 if (dev->ctl_mute != 0) {
778 saa7134->mute_was_on = 1;
779 dev->ctl_mute = 0;
780 saa7134_tvaudio_setmute(dev);
781 }
782
783 err = snd_pcm_hw_constraint_integer(runtime,
784 SNDRV_PCM_HW_PARAM_PERIODS);
785 if (err < 0)
786 return err;
787
788 err = snd_pcm_hw_constraint_step(runtime, 0,
789 SNDRV_PCM_HW_PARAM_PERIODS, 2);
790 if (err < 0)
791 return err;
792
793 return 0;
794}
795
796/*
797 * page callback (needed for mmap)
798 */
799
800static struct page *snd_card_saa7134_page(struct snd_pcm_substream *substream,
801 unsigned long offset)
802{
803 void *pageptr = substream->runtime->dma_area + offset;
804 return vmalloc_to_page(pageptr);
805}
806
807/*
808 * ALSA capture callbacks definition
809 */
810
811static struct snd_pcm_ops snd_card_saa7134_capture_ops = {
812 .open = snd_card_saa7134_capture_open,
813 .close = snd_card_saa7134_capture_close,
814 .ioctl = snd_pcm_lib_ioctl,
815 .hw_params = snd_card_saa7134_hw_params,
816 .hw_free = snd_card_saa7134_hw_free,
817 .prepare = snd_card_saa7134_capture_prepare,
818 .trigger = snd_card_saa7134_capture_trigger,
819 .pointer = snd_card_saa7134_capture_pointer,
820 .page = snd_card_saa7134_page,
821};
822
823/*
824 * ALSA PCM setup
825 *
826 * Called when initializing the board. Sets up the name and hooks up
827 * the callbacks
828 *
829 */
830
831static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device)
832{
833 struct snd_pcm *pcm;
834 int err;
835
836 if ((err = snd_pcm_new(saa7134->card, "SAA7134 PCM", device, 0, 1, &pcm)) < 0)
837 return err;
838 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_card_saa7134_capture_ops);
839 pcm->private_data = saa7134;
840 pcm->info_flags = 0;
841 strcpy(pcm->name, "SAA7134 PCM");
842 return 0;
843}
844
845#define SAA713x_VOLUME(xname, xindex, addr) \
846{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
847 .info = snd_saa7134_volume_info, \
848 .get = snd_saa7134_volume_get, .put = snd_saa7134_volume_put, \
849 .private_value = addr }
850
851static int snd_saa7134_volume_info(struct snd_kcontrol * kcontrol,
852 struct snd_ctl_elem_info * uinfo)
853{
854 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
855 uinfo->count = 2;
856 uinfo->value.integer.min = 0;
857 uinfo->value.integer.max = 20;
858 return 0;
859}
860
861static int snd_saa7134_volume_get(struct snd_kcontrol * kcontrol,
862 struct snd_ctl_elem_value * ucontrol)
863{
864 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
865 int addr = kcontrol->private_value;
866
867 ucontrol->value.integer.value[0] = chip->mixer_volume[addr][0];
868 ucontrol->value.integer.value[1] = chip->mixer_volume[addr][1];
869 return 0;
870}
871
872static int snd_saa7134_volume_put(struct snd_kcontrol * kcontrol,
873 struct snd_ctl_elem_value * ucontrol)
874{
875 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
876 struct saa7134_dev *dev = chip->dev;
877
878 int change, addr = kcontrol->private_value;
879 int left, right;
880
881 left = ucontrol->value.integer.value[0];
882 if (left < 0)
883 left = 0;
884 if (left > 20)
885 left = 20;
886 right = ucontrol->value.integer.value[1];
887 if (right < 0)
888 right = 0;
889 if (right > 20)
890 right = 20;
891 spin_lock_irq(&chip->mixer_lock);
892 change = 0;
893 if (chip->mixer_volume[addr][0] != left) {
894 change = 1;
895 right = left;
896 }
897 if (chip->mixer_volume[addr][1] != right) {
898 change = 1;
899 left = right;
900 }
901 if (change) {
902 switch (dev->pci->device) {
903 case PCI_DEVICE_ID_PHILIPS_SAA7134:
904 switch (addr) {
905 case MIXER_ADDR_TVTUNER:
906 left = 20;
907 break;
908 case MIXER_ADDR_LINE1:
909 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x10,
910 (left > 10) ? 0x00 : 0x10);
911 break;
912 case MIXER_ADDR_LINE2:
913 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x20,
914 (left > 10) ? 0x00 : 0x20);
915 break;
916 }
917 break;
918 case PCI_DEVICE_ID_PHILIPS_SAA7133:
919 case PCI_DEVICE_ID_PHILIPS_SAA7135:
920 switch (addr) {
921 case MIXER_ADDR_TVTUNER:
922 left = 20;
923 break;
924 case MIXER_ADDR_LINE1:
925 saa_andorb(0x0594, 0x10,
926 (left > 10) ? 0x00 : 0x10);
927 break;
928 case MIXER_ADDR_LINE2:
929 saa_andorb(0x0594, 0x20,
930 (left > 10) ? 0x00 : 0x20);
931 break;
932 }
933 break;
934 }
935 chip->mixer_volume[addr][0] = left;
936 chip->mixer_volume[addr][1] = right;
937 }
938 spin_unlock_irq(&chip->mixer_lock);
939 return change;
940}
941
942#define SAA713x_CAPSRC(xname, xindex, addr) \
943{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
944 .info = snd_saa7134_capsrc_info, \
945 .get = snd_saa7134_capsrc_get, .put = snd_saa7134_capsrc_put, \
946 .private_value = addr }
947
948static int snd_saa7134_capsrc_info(struct snd_kcontrol * kcontrol,
949 struct snd_ctl_elem_info * uinfo)
950{
951 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
952 uinfo->count = 2;
953 uinfo->value.integer.min = 0;
954 uinfo->value.integer.max = 1;
955 return 0;
956}
957
958static int snd_saa7134_capsrc_get(struct snd_kcontrol * kcontrol,
959 struct snd_ctl_elem_value * ucontrol)
960{
961 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
962 int addr = kcontrol->private_value;
963
964 spin_lock_irq(&chip->mixer_lock);
965 if (chip->capture_source_addr == addr) {
966 ucontrol->value.integer.value[0] = chip->capture_source[0];
967 ucontrol->value.integer.value[1] = chip->capture_source[1];
968 } else {
969 ucontrol->value.integer.value[0] = 0;
970 ucontrol->value.integer.value[1] = 0;
971 }
972 spin_unlock_irq(&chip->mixer_lock);
973
974 return 0;
975}
976
977static int snd_saa7134_capsrc_put(struct snd_kcontrol * kcontrol,
978 struct snd_ctl_elem_value * ucontrol)
979{
980 int left, right;
981 left = ucontrol->value.integer.value[0] & 1;
982 right = ucontrol->value.integer.value[1] & 1;
983
984 return snd_saa7134_capsrc_set(kcontrol, left, right, false);
985}
986
987static struct snd_kcontrol_new snd_saa7134_volume_controls[] = {
988SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER),
989SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1),
990SAA713x_VOLUME("Line Volume", 2, MIXER_ADDR_LINE2),
991};
992
993static struct snd_kcontrol_new snd_saa7134_capture_controls[] = {
994SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER),
995SAA713x_CAPSRC("Line Capture Switch", 1, MIXER_ADDR_LINE1),
996SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2),
997};
998
999/*
1000 * ALSA mixer setup
1001 *
1002 * Called when initializing the board. Sets up the name and hooks up
1003 * the callbacks
1004 *
1005 */
1006
1007static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
1008{
1009 struct snd_card *card = chip->card;
1010 struct snd_kcontrol *kcontrol;
1011 unsigned int idx;
1012 int err, addr;
1013
1014 strcpy(card->mixername, "SAA7134 Mixer");
1015
1016 for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_volume_controls); idx++) {
1017 kcontrol = snd_ctl_new1(&snd_saa7134_volume_controls[idx],
1018 chip);
1019 err = snd_ctl_add(card, kcontrol);
1020 if (err < 0)
1021 return err;
1022 }
1023
1024 for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_capture_controls); idx++) {
1025 kcontrol = snd_ctl_new1(&snd_saa7134_capture_controls[idx],
1026 chip);
1027 addr = snd_saa7134_capture_controls[idx].private_value;
1028 chip->capture_ctl[addr] = kcontrol;
1029 err = snd_ctl_add(card, kcontrol);
1030 if (err < 0)
1031 return err;
1032 }
1033
1034 chip->capture_source_addr = MIXER_ADDR_UNSELECTED;
1035 return 0;
1036}
1037
1038static void snd_saa7134_free(struct snd_card * card)
1039{
1040 snd_card_saa7134_t *chip = card->private_data;
1041
1042 if (chip->dev->dmasound.priv_data == NULL)
1043 return;
1044
1045 if (chip->irq >= 0)
1046 free_irq(chip->irq, &chip->dev->dmasound);
1047
1048 chip->dev->dmasound.priv_data = NULL;
1049
1050}
1051
1052/*
1053 * ALSA initialization
1054 *
1055 * Called by the init routine, once for each saa7134 device present,
1056 * it creates the basic structures and registers the ALSA devices
1057 *
1058 */
1059
1060static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)
1061{
1062
1063 struct snd_card *card;
1064 snd_card_saa7134_t *chip;
1065 int err;
1066
1067
1068 if (devnum >= SNDRV_CARDS)
1069 return -ENODEV;
1070 if (!enable[devnum])
1071 return -ENODEV;
1072
1073 err = snd_card_create(index[devnum], id[devnum], THIS_MODULE,
1074 sizeof(snd_card_saa7134_t), &card);
1075 if (err < 0)
1076 return err;
1077
1078 strcpy(card->driver, "SAA7134");
1079
1080 /* Card "creation" */
1081
1082 card->private_free = snd_saa7134_free;
1083 chip = card->private_data;
1084
1085 spin_lock_init(&chip->lock);
1086 spin_lock_init(&chip->mixer_lock);
1087
1088 chip->dev = dev;
1089
1090 chip->card = card;
1091
1092 chip->pci = dev->pci;
1093 chip->iobase = pci_resource_start(dev->pci, 0);
1094
1095
1096 err = request_irq(dev->pci->irq, saa7134_alsa_irq,
1097 IRQF_SHARED | IRQF_DISABLED, dev->name,
1098 (void*) &dev->dmasound);
1099
1100 if (err < 0) {
1101 printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n",
1102 dev->name, dev->pci->irq);
1103 goto __nodev;
1104 }
1105
1106 chip->irq = dev->pci->irq;
1107
1108 mutex_init(&dev->dmasound.lock);
1109
1110 if ((err = snd_card_saa7134_new_mixer(chip)) < 0)
1111 goto __nodev;
1112
1113 if ((err = snd_card_saa7134_pcm(chip, 0)) < 0)
1114 goto __nodev;
1115
1116 snd_card_set_dev(card, &chip->pci->dev);
1117
1118 /* End of "creation" */
1119
1120 strcpy(card->shortname, "SAA7134");
1121 sprintf(card->longname, "%s at 0x%lx irq %d",
1122 chip->dev->name, chip->iobase, chip->irq);
1123
1124 printk(KERN_INFO "%s/alsa: %s registered as card %d\n",dev->name,card->longname,index[devnum]);
1125
1126 if ((err = snd_card_register(card)) == 0) {
1127 snd_saa7134_cards[devnum] = card;
1128 return 0;
1129 }
1130
1131__nodev:
1132 snd_card_free(card);
1133 return err;
1134}
1135
1136
1137static int alsa_device_init(struct saa7134_dev *dev)
1138{
1139 dev->dmasound.priv_data = dev;
1140 alsa_card_saa7134_create(dev,dev->nr);
1141 return 1;
1142}
1143
1144static int alsa_device_exit(struct saa7134_dev *dev)
1145{
1146
1147 snd_card_free(snd_saa7134_cards[dev->nr]);
1148 snd_saa7134_cards[dev->nr] = NULL;
1149 return 1;
1150}
1151
1152/*
1153 * Module initializer
1154 *
1155 * Loops through present saa7134 cards, and assigns an ALSA device
1156 * to each one
1157 *
1158 */
1159
1160static int saa7134_alsa_init(void)
1161{
1162 struct saa7134_dev *dev = NULL;
1163 struct list_head *list;
1164
1165 saa7134_dmasound_init = alsa_device_init;
1166 saa7134_dmasound_exit = alsa_device_exit;
1167
1168 printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");
1169
1170 list_for_each(list,&saa7134_devlist) {
1171 dev = list_entry(list, struct saa7134_dev, devlist);
1172 if (dev->pci->device == PCI_DEVICE_ID_PHILIPS_SAA7130)
1173 printk(KERN_INFO "%s/alsa: %s doesn't support digital audio\n",
1174 dev->name, saa7134_boards[dev->board].name);
1175 else
1176 alsa_device_init(dev);
1177 }
1178
1179 if (dev == NULL)
1180 printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n");
1181
1182 return 0;
1183
1184}
1185
1186/*
1187 * Module destructor
1188 */
1189
1190static void saa7134_alsa_exit(void)
1191{
1192 int idx;
1193
1194 for (idx = 0; idx < SNDRV_CARDS; idx++) {
1195 snd_card_free(snd_saa7134_cards[idx]);
1196 }
1197
1198 saa7134_dmasound_init = NULL;
1199 saa7134_dmasound_exit = NULL;
1200 printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
1201
1202 return;
1203}
1204
1205/* We initialize this late, to make sure the sound system is up and running */
1206late_initcall(saa7134_alsa_init);
1207module_exit(saa7134_alsa_exit);
1208MODULE_LICENSE("GPL");
1209MODULE_AUTHOR("Ricardo Cerqueira");
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
new file mode 100644
index 00000000000..0f9fb99adeb
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -0,0 +1,7889 @@
1/*
2 *
3 * device driver for philips saa7134 based TV cards
4 * card-specific stuff.
5 *
6 * (c) 2001-04 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/module.h>
25#include <linux/i2c.h>
26#include <linux/i2c-algo-bit.h>
27
28#include "saa7134-reg.h"
29#include "saa7134.h"
30#include "tuner-xc2028.h"
31#include <media/v4l2-common.h>
32#include <media/tveeprom.h>
33#include "tea5767.h"
34#include "tda18271.h"
35#include "xc5000.h"
36
37/* commly used strings */
38static char name_mute[] = "mute";
39static char name_radio[] = "Radio";
40static char name_tv[] = "Television";
41static char name_tv_mono[] = "TV (mono only)";
42static char name_comp[] = "Composite";
43static char name_comp1[] = "Composite1";
44static char name_comp2[] = "Composite2";
45static char name_comp3[] = "Composite3";
46static char name_comp4[] = "Composite4";
47static char name_svideo[] = "S-Video";
48
49/* ------------------------------------------------------------------ */
50/* board config info */
51
52/* If radio_type !=UNSET, radio_addr should be specified
53 */
54
55struct saa7134_board saa7134_boards[] = {
56 [SAA7134_BOARD_UNKNOWN] = {
57 .name = "UNKNOWN/GENERIC",
58 .audio_clock = 0x00187de7,
59 .tuner_type = TUNER_ABSENT,
60 .radio_type = UNSET,
61 .tuner_addr = ADDR_UNSET,
62 .radio_addr = ADDR_UNSET,
63
64 .inputs = {{
65 .name = "default",
66 .vmux = 0,
67 .amux = LINE1,
68 }},
69 },
70 [SAA7134_BOARD_PROTEUS_PRO] = {
71 /* /me */
72 .name = "Proteus Pro [philips reference design]",
73 .audio_clock = 0x00187de7,
74 .tuner_type = TUNER_PHILIPS_PAL,
75 .radio_type = UNSET,
76 .tuner_addr = ADDR_UNSET,
77 .radio_addr = ADDR_UNSET,
78
79 .inputs = {{
80 .name = name_comp1,
81 .vmux = 0,
82 .amux = LINE1,
83 },{
84 .name = name_tv,
85 .vmux = 1,
86 .amux = TV,
87 .tv = 1,
88 },{
89 .name = name_tv_mono,
90 .vmux = 1,
91 .amux = LINE2,
92 .tv = 1,
93 }},
94 .radio = {
95 .name = name_radio,
96 .amux = LINE2,
97 },
98 },
99 [SAA7134_BOARD_FLYVIDEO3000] = {
100 /* "Marco d'Itri" <md@Linux.IT> */
101 .name = "LifeView FlyVIDEO3000",
102 .audio_clock = 0x00200000,
103 .tuner_type = TUNER_PHILIPS_PAL,
104 .radio_type = UNSET,
105 .tuner_addr = ADDR_UNSET,
106 .radio_addr = ADDR_UNSET,
107
108 .gpiomask = 0xe000,
109 .inputs = {{
110 .name = name_tv,
111 .vmux = 1,
112 .amux = TV,
113 .gpio = 0x8000,
114 .tv = 1,
115 },{
116 .name = name_tv_mono,
117 .vmux = 1,
118 .amux = LINE2,
119 .gpio = 0x0000,
120 .tv = 1,
121 },{
122 .name = name_comp1,
123 .vmux = 0,
124 .amux = LINE2,
125 .gpio = 0x4000,
126 },{
127 .name = name_comp2,
128 .vmux = 3,
129 .amux = LINE2,
130 .gpio = 0x4000,
131 },{
132 .name = name_svideo,
133 .vmux = 8,
134 .amux = LINE2,
135 .gpio = 0x4000,
136 }},
137 .radio = {
138 .name = name_radio,
139 .amux = LINE2,
140 .gpio = 0x2000,
141 },
142 .mute = {
143 .name = name_mute,
144 .amux = TV,
145 .gpio = 0x8000,
146 },
147 },
148 [SAA7134_BOARD_FLYVIDEO2000] = {
149 /* "TC Wan" <tcwan@cs.usm.my> */
150 .name = "LifeView/Typhoon FlyVIDEO2000",
151 .audio_clock = 0x00200000,
152 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
153 .radio_type = UNSET,
154 .tuner_addr = ADDR_UNSET,
155 .radio_addr = ADDR_UNSET,
156
157 .gpiomask = 0xe000,
158 .inputs = {{
159 .name = name_tv,
160 .vmux = 1,
161 .amux = LINE2,
162 .gpio = 0x0000,
163 .tv = 1,
164 },{
165 .name = name_comp1,
166 .vmux = 0,
167 .amux = LINE2,
168 .gpio = 0x4000,
169 },{
170 .name = name_comp2,
171 .vmux = 3,
172 .amux = LINE2,
173 .gpio = 0x4000,
174 },{
175 .name = name_svideo,
176 .vmux = 8,
177 .amux = LINE2,
178 .gpio = 0x4000,
179 }},
180 .radio = {
181 .name = name_radio,
182 .amux = LINE2,
183 .gpio = 0x2000,
184 },
185 .mute = {
186 .name = name_mute,
187 .amux = LINE2,
188 .gpio = 0x8000,
189 },
190 },
191 [SAA7134_BOARD_FLYTVPLATINUM_MINI] = {
192 /* "Arnaud Quette" <aquette@free.fr> */
193 .name = "LifeView FlyTV Platinum Mini",
194 .audio_clock = 0x00200000,
195 .tuner_type = TUNER_PHILIPS_TDA8290,
196 .radio_type = UNSET,
197 .tuner_addr = ADDR_UNSET,
198 .radio_addr = ADDR_UNSET,
199
200 .inputs = {{
201 .name = name_tv,
202 .vmux = 1,
203 .amux = TV,
204 .tv = 1,
205 },{
206 .name = name_comp1, /* Composite signal on S-Video input */
207 .vmux = 0,
208 .amux = LINE2,
209 },{
210 .name = name_comp2, /* Composite input */
211 .vmux = 3,
212 .amux = LINE2,
213 },{
214 .name = name_svideo,
215 .vmux = 8,
216 .amux = LINE2,
217 }},
218 },
219 [SAA7134_BOARD_FLYTVPLATINUM_FM] = {
220 /* LifeView FlyTV Platinum FM (LR214WF) */
221 /* "Peter Missel <peter.missel@onlinehome.de> */
222 .name = "LifeView FlyTV Platinum FM / Gold",
223 .audio_clock = 0x00200000,
224 .tuner_type = TUNER_PHILIPS_TDA8290,
225 .radio_type = UNSET,
226 .tuner_addr = ADDR_UNSET,
227 .radio_addr = ADDR_UNSET,
228
229 .gpiomask = 0x1E000, /* Set GP16 and unused 15,14,13 to Output */
230 .inputs = {{
231 .name = name_tv,
232 .vmux = 1,
233 .amux = TV,
234 .gpio = 0x10000, /* GP16=1 selects TV input */
235 .tv = 1,
236 },{
237/* .name = name_tv_mono,
238 .vmux = 1,
239 .amux = LINE2,
240 .gpio = 0x0000,
241 .tv = 1,
242 },{
243*/ .name = name_comp1, /* Composite signal on S-Video input */
244 .vmux = 0,
245 .amux = LINE2,
246/* .gpio = 0x4000, */
247 },{
248 .name = name_comp2, /* Composite input */
249 .vmux = 3,
250 .amux = LINE2,
251/* .gpio = 0x4000, */
252 },{
253 .name = name_svideo, /* S-Video signal on S-Video input */
254 .vmux = 8,
255 .amux = LINE2,
256/* .gpio = 0x4000, */
257 }},
258 .radio = {
259 .name = name_radio,
260 .amux = TV,
261 .gpio = 0x00000, /* GP16=0 selects FM radio antenna */
262 },
263 .mute = {
264 .name = name_mute,
265 .amux = TV,
266 .gpio = 0x10000,
267 },
268 },
269 [SAA7134_BOARD_ROVERMEDIA_LINK_PRO_FM] = {
270 /* RoverMedia TV Link Pro FM (LR138 REV:I) */
271 /* Eugene Yudin <Eugene.Yudin@gmail.com> */
272 .name = "RoverMedia TV Link Pro FM",
273 .audio_clock = 0x00200000,
274 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, /* TCL MFPE05 2 */
275 .radio_type = UNSET,
276 .tuner_addr = ADDR_UNSET,
277 .radio_addr = ADDR_UNSET,
278 .tda9887_conf = TDA9887_PRESENT,
279 .gpiomask = 0xe000,
280 .inputs = { {
281 .name = name_tv,
282 .vmux = 1,
283 .amux = TV,
284 .gpio = 0x8000,
285 .tv = 1,
286 }, {
287 .name = name_tv_mono,
288 .vmux = 1,
289 .amux = LINE2,
290 .gpio = 0x0000,
291 .tv = 1,
292 }, {
293 .name = name_comp1,
294 .vmux = 0,
295 .amux = LINE2,
296 .gpio = 0x4000,
297 }, {
298 .name = name_comp2,
299 .vmux = 3,
300 .amux = LINE2,
301 .gpio = 0x4000,
302 }, {
303 .name = name_svideo,
304 .vmux = 8,
305 .amux = LINE2,
306 .gpio = 0x4000,
307 } },
308 .radio = {
309 .name = name_radio,
310 .amux = LINE2,
311 .gpio = 0x2000,
312 },
313 .mute = {
314 .name = name_mute,
315 .amux = TV,
316 .gpio = 0x8000,
317 },
318 },
319 [SAA7134_BOARD_EMPRESS] = {
320 /* "Gert Vervoort" <gert.vervoort@philips.com> */
321 .name = "EMPRESS",
322 .audio_clock = 0x00187de7,
323 .tuner_type = TUNER_PHILIPS_PAL,
324 .radio_type = UNSET,
325 .tuner_addr = ADDR_UNSET,
326 .radio_addr = ADDR_UNSET,
327 .empress_addr = 0x20,
328
329 .inputs = {{
330 .name = name_comp1,
331 .vmux = 0,
332 .amux = LINE1,
333 },{
334 .name = name_svideo,
335 .vmux = 8,
336 .amux = LINE1,
337 },{
338 .name = name_tv,
339 .vmux = 1,
340 .amux = LINE2,
341 .tv = 1,
342 }},
343 .radio = {
344 .name = name_radio,
345 .amux = LINE2,
346 },
347 .mpeg = SAA7134_MPEG_EMPRESS,
348 .video_out = CCIR656,
349 },
350 [SAA7134_BOARD_MONSTERTV] = {
351 /* "K.Ohta" <alpha292@bremen.or.jp> */
352 .name = "SKNet Monster TV",
353 .audio_clock = 0x00187de7,
354 .tuner_type = TUNER_PHILIPS_NTSC_M,
355 .radio_type = UNSET,
356 .tuner_addr = ADDR_UNSET,
357 .radio_addr = ADDR_UNSET,
358
359 .inputs = {{
360 .name = name_tv,
361 .vmux = 1,
362 .amux = TV,
363 .tv = 1,
364 },{
365 .name = name_comp1,
366 .vmux = 0,
367 .amux = LINE1,
368 },{
369 .name = name_svideo,
370 .vmux = 8,
371 .amux = LINE1,
372 }},
373 .radio = {
374 .name = name_radio,
375 .amux = LINE2,
376 },
377 },
378 [SAA7134_BOARD_MD9717] = {
379 .name = "Tevion MD 9717",
380 .audio_clock = 0x00200000,
381 .tuner_type = TUNER_PHILIPS_PAL,
382 .radio_type = UNSET,
383 .tuner_addr = ADDR_UNSET,
384 .radio_addr = ADDR_UNSET,
385 .inputs = {{
386 .name = name_tv,
387 .vmux = 1,
388 .amux = TV,
389 .tv = 1,
390 },{
391 /* workaround for problems with normal TV sound */
392 .name = name_tv_mono,
393 .vmux = 1,
394 .amux = LINE2,
395 .tv = 1,
396 },{
397 .name = name_comp1,
398 .vmux = 0,
399 .amux = LINE1,
400 },{
401 .name = name_comp2,
402 .vmux = 3,
403 .amux = LINE1,
404 },{
405 .name = name_svideo,
406 .vmux = 8,
407 .amux = LINE1,
408 }},
409 .radio = {
410 .name = name_radio,
411 .amux = LINE2,
412 },
413 .mute = {
414 .name = name_mute,
415 .amux = TV,
416 },
417 },
418 [SAA7134_BOARD_TVSTATION_RDS] = {
419 /* Typhoon TV Tuner RDS: Art.Nr. 50694 */
420 .name = "KNC One TV-Station RDS / Typhoon TV Tuner RDS",
421 .audio_clock = 0x00200000,
422 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
423 .radio_type = UNSET,
424 .tuner_addr = ADDR_UNSET,
425 .radio_addr = ADDR_UNSET,
426 .tda9887_conf = TDA9887_PRESENT,
427 .inputs = {{
428 .name = name_tv,
429 .vmux = 1,
430 .amux = TV,
431 .tv = 1,
432 },{
433 .name = name_tv_mono,
434 .vmux = 1,
435 .amux = LINE2,
436 .tv = 1,
437 },{
438
439 .name = name_svideo,
440 .vmux = 8,
441 .amux = LINE1,
442 },{
443 .name = name_comp1,
444 .vmux = 3,
445 .amux = LINE1,
446 },{
447
448 .name = "CVid over SVid",
449 .vmux = 0,
450 .amux = LINE1,
451 }},
452 .radio = {
453 .name = name_radio,
454 .amux = LINE2,
455 },
456 },
457 [SAA7134_BOARD_TVSTATION_DVR] = {
458 .name = "KNC One TV-Station DVR",
459 .audio_clock = 0x00200000,
460 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
461 .radio_type = UNSET,
462 .tuner_addr = ADDR_UNSET,
463 .radio_addr = ADDR_UNSET,
464 .empress_addr = 0x20,
465 .tda9887_conf = TDA9887_PRESENT,
466 .gpiomask = 0x820000,
467 .inputs = {{
468 .name = name_tv,
469 .vmux = 1,
470 .amux = TV,
471 .tv = 1,
472 .gpio = 0x20000,
473 },{
474 .name = name_svideo,
475 .vmux = 8,
476 .amux = LINE1,
477 .gpio = 0x20000,
478 },{
479 .name = name_comp1,
480 .vmux = 3,
481 .amux = LINE1,
482 .gpio = 0x20000,
483 }},
484 .radio = {
485 .name = name_radio,
486 .amux = LINE2,
487 .gpio = 0x20000,
488 },
489 .mpeg = SAA7134_MPEG_EMPRESS,
490 .video_out = CCIR656,
491 },
492 [SAA7134_BOARD_CINERGY400] = {
493 .name = "Terratec Cinergy 400 TV",
494 .audio_clock = 0x00200000,
495 .tuner_type = TUNER_PHILIPS_PAL,
496 .radio_type = UNSET,
497 .tuner_addr = ADDR_UNSET,
498 .radio_addr = ADDR_UNSET,
499 .inputs = {{
500 .name = name_tv,
501 .vmux = 1,
502 .amux = TV,
503 .tv = 1,
504 },{
505 .name = name_comp1,
506 .vmux = 4,
507 .amux = LINE1,
508 },{
509 .name = name_svideo,
510 .vmux = 8,
511 .amux = LINE1,
512 },{
513 .name = name_comp2, /* CVideo over SVideo Connector */
514 .vmux = 0,
515 .amux = LINE1,
516 }}
517 },
518 [SAA7134_BOARD_MD5044] = {
519 .name = "Medion 5044",
520 .audio_clock = 0x00187de7, /* was: 0x00200000, */
521 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
522 .radio_type = UNSET,
523 .tuner_addr = ADDR_UNSET,
524 .radio_addr = ADDR_UNSET,
525 .tda9887_conf = TDA9887_PRESENT,
526 .inputs = {{
527 .name = name_tv,
528 .vmux = 1,
529 .amux = TV,
530 .tv = 1,
531 },{
532 /* workaround for problems with normal TV sound */
533 .name = name_tv_mono,
534 .vmux = 1,
535 .amux = LINE2,
536 .tv = 1,
537 },{
538 .name = name_comp1,
539 .vmux = 0,
540 .amux = LINE2,
541 },{
542 .name = name_comp2,
543 .vmux = 3,
544 .amux = LINE2,
545 },{
546 .name = name_svideo,
547 .vmux = 8,
548 .amux = LINE2,
549 }},
550 .radio = {
551 .name = name_radio,
552 .amux = LINE2,
553 },
554 },
555 [SAA7134_BOARD_KWORLD] = {
556 .name = "Kworld/KuroutoShikou SAA7130-TVPCI",
557 .audio_clock = 0x00187de7,
558 .tuner_type = TUNER_PHILIPS_NTSC_M,
559 .radio_type = UNSET,
560 .tuner_addr = ADDR_UNSET,
561 .radio_addr = ADDR_UNSET,
562 .inputs = {{
563 .name = name_svideo,
564 .vmux = 8,
565 .amux = LINE1,
566 },{
567 .name = name_comp1,
568 .vmux = 3,
569 .amux = LINE1,
570 },{
571 .name = name_tv,
572 .vmux = 1,
573 .amux = LINE2,
574 .tv = 1,
575 }},
576 },
577 [SAA7134_BOARD_CINERGY600] = {
578 .name = "Terratec Cinergy 600 TV",
579 .audio_clock = 0x00200000,
580 .tuner_type = TUNER_PHILIPS_PAL,
581 .radio_type = UNSET,
582 .tuner_addr = ADDR_UNSET,
583 .radio_addr = ADDR_UNSET,
584 .tda9887_conf = TDA9887_PRESENT,
585 .inputs = {{
586 .name = name_tv,
587 .vmux = 1,
588 .amux = TV,
589 .tv = 1,
590 },{
591 .name = name_comp1,
592 .vmux = 4,
593 .amux = LINE1,
594 },{
595 .name = name_svideo,
596 .vmux = 8,
597 .amux = LINE1,
598 },{
599 .name = name_comp2, /* CVideo over SVideo Connector */
600 .vmux = 0,
601 .amux = LINE1,
602 }},
603 .radio = {
604 .name = name_radio,
605 .amux = LINE2,
606 },
607 },
608 [SAA7134_BOARD_MD7134] = {
609 .name = "Medion 7134",
610 .audio_clock = 0x00187de7,
611 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
612 .radio_type = UNSET,
613 .tuner_addr = ADDR_UNSET,
614 .radio_addr = ADDR_UNSET,
615 .tda9887_conf = TDA9887_PRESENT,
616 .mpeg = SAA7134_MPEG_DVB,
617 .inputs = {{
618 .name = name_tv,
619 .vmux = 1,
620 .amux = TV,
621 .tv = 1,
622 },{
623 .name = name_comp1,
624 .vmux = 0,
625 .amux = LINE1,
626 },{
627 .name = name_svideo,
628 .vmux = 8,
629 .amux = LINE1,
630 }},
631 .radio = {
632 .name = name_radio,
633 .amux = LINE2,
634 },
635 .mute = {
636 .name = name_mute,
637 .amux = TV,
638 },
639 },
640 [SAA7134_BOARD_TYPHOON_90031] = {
641 /* aka Typhoon "TV+Radio", Art.Nr 90031 */
642 /* Tom Zoerner <tomzo at users sourceforge net> */
643 .name = "Typhoon TV+Radio 90031",
644 .audio_clock = 0x00200000,
645 .tuner_type = TUNER_PHILIPS_PAL,
646 .radio_type = UNSET,
647 .tuner_addr = ADDR_UNSET,
648 .radio_addr = ADDR_UNSET,
649 .tda9887_conf = TDA9887_PRESENT,
650 .inputs = {{
651 .name = name_tv,
652 .vmux = 1,
653 .amux = TV,
654 .tv = 1,
655 },{
656 .name = name_comp1,
657 .vmux = 3,
658 .amux = LINE1,
659 },{
660 .name = name_svideo,
661 .vmux = 8,
662 .amux = LINE1,
663 }},
664 .radio = {
665 .name = name_radio,
666 .amux = LINE2,
667 },
668 },
669 [SAA7134_BOARD_ELSA] = {
670 .name = "ELSA EX-VISION 300TV",
671 .audio_clock = 0x00187de7,
672 .tuner_type = TUNER_HITACHI_NTSC,
673 .radio_type = UNSET,
674 .tuner_addr = ADDR_UNSET,
675 .radio_addr = ADDR_UNSET,
676 .inputs = {{
677 .name = name_svideo,
678 .vmux = 8,
679 .amux = LINE1,
680 },{
681 .name = name_comp1,
682 .vmux = 0,
683 .amux = LINE1,
684 },{
685 .name = name_tv,
686 .vmux = 4,
687 .amux = LINE2,
688 .tv = 1,
689 }},
690 },
691 [SAA7134_BOARD_ELSA_500TV] = {
692 .name = "ELSA EX-VISION 500TV",
693 .audio_clock = 0x00187de7,
694 .tuner_type = TUNER_HITACHI_NTSC,
695 .radio_type = UNSET,
696 .tuner_addr = ADDR_UNSET,
697 .radio_addr = ADDR_UNSET,
698 .inputs = {{
699 .name = name_svideo,
700 .vmux = 7,
701 .amux = LINE1,
702 },{
703 .name = name_tv,
704 .vmux = 8,
705 .amux = TV,
706 .tv = 1,
707 },{
708 .name = name_tv_mono,
709 .vmux = 8,
710 .amux = LINE2,
711 .tv = 1,
712 }},
713 },
714 [SAA7134_BOARD_ELSA_700TV] = {
715 .name = "ELSA EX-VISION 700TV",
716 .audio_clock = 0x00187de7,
717 .tuner_type = TUNER_HITACHI_NTSC,
718 .radio_type = UNSET,
719 .tuner_addr = ADDR_UNSET,
720 .radio_addr = ADDR_UNSET,
721 .inputs = {{
722 .name = name_tv,
723 .vmux = 4,
724 .amux = LINE2,
725 .tv = 1,
726 },{
727 .name = name_comp1,
728 .vmux = 6,
729 .amux = LINE1,
730 },{
731 .name = name_svideo,
732 .vmux = 7,
733 .amux = LINE1,
734 }},
735 .mute = {
736 .name = name_mute,
737 .amux = TV,
738 },
739 },
740 [SAA7134_BOARD_ASUSTeK_TVFM7134] = {
741 .name = "ASUS TV-FM 7134",
742 .audio_clock = 0x00187de7,
743 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
744 .radio_type = UNSET,
745 .tuner_addr = ADDR_UNSET,
746 .radio_addr = ADDR_UNSET,
747 .tda9887_conf = TDA9887_PRESENT,
748 .inputs = {{
749 .name = name_tv,
750 .vmux = 1,
751 .amux = TV,
752 .tv = 1,
753 },{
754 .name = name_comp1,
755 .vmux = 4,
756 .amux = LINE2,
757 },{
758 .name = name_svideo,
759 .vmux = 6,
760 .amux = LINE2,
761 }},
762 .radio = {
763 .name = name_radio,
764 .amux = LINE1,
765 },
766 },
767 [SAA7134_BOARD_ASUSTeK_TVFM7135] = {
768 .name = "ASUS TV-FM 7135",
769 .audio_clock = 0x00187de7,
770 .tuner_type = TUNER_PHILIPS_TDA8290,
771 .radio_type = UNSET,
772 .tuner_addr = ADDR_UNSET,
773 .radio_addr = ADDR_UNSET,
774 .gpiomask = 0x200000,
775 .inputs = {{
776 .name = name_tv,
777 .vmux = 1,
778 .amux = TV,
779 .gpio = 0x0000,
780 .tv = 1,
781 },{
782 .name = name_comp1,
783 .vmux = 4,
784 .amux = LINE2,
785 .gpio = 0x0000,
786 },{
787 .name = name_svideo,
788 .vmux = 6,
789 .amux = LINE2,
790 .gpio = 0x0000,
791 }},
792 .radio = {
793 .name = name_radio,
794 .amux = TV,
795 .gpio = 0x200000,
796 },
797 .mute = {
798 .name = name_mute,
799 .gpio = 0x0000,
800 },
801
802 },
803 [SAA7134_BOARD_VA1000POWER] = {
804 .name = "AOPEN VA1000 POWER",
805 .audio_clock = 0x00187de7,
806 .tuner_type = TUNER_PHILIPS_NTSC,
807 .radio_type = UNSET,
808 .tuner_addr = ADDR_UNSET,
809 .radio_addr = ADDR_UNSET,
810 .inputs = {{
811 .name = name_svideo,
812 .vmux = 8,
813 .amux = LINE1,
814 },{
815 .name = name_comp1,
816 .vmux = 3,
817 .amux = LINE1,
818 },{
819 .name = name_tv,
820 .vmux = 1,
821 .amux = LINE2,
822 .tv = 1,
823 }},
824 },
825 [SAA7134_BOARD_10MOONSTVMASTER] = {
826 /* "lilicheng" <llc@linuxfans.org> */
827 .name = "10MOONS PCI TV CAPTURE CARD",
828 .audio_clock = 0x00200000,
829 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
830 .radio_type = UNSET,
831 .tuner_addr = ADDR_UNSET,
832 .radio_addr = ADDR_UNSET,
833 .gpiomask = 0xe000,
834 .inputs = {{
835 .name = name_tv,
836 .vmux = 1,
837 .amux = LINE2,
838 .gpio = 0x0000,
839 .tv = 1,
840 },{
841 .name = name_comp1,
842 .vmux = 0,
843 .amux = LINE2,
844 .gpio = 0x4000,
845 },{
846 .name = name_comp2,
847 .vmux = 3,
848 .amux = LINE2,
849 .gpio = 0x4000,
850 },{
851 .name = name_svideo,
852 .vmux = 8,
853 .amux = LINE2,
854 .gpio = 0x4000,
855 }},
856 .radio = {
857 .name = name_radio,
858 .amux = LINE2,
859 .gpio = 0x2000,
860 },
861 .mute = {
862 .name = name_mute,
863 .amux = LINE2,
864 .gpio = 0x8000,
865 },
866 },
867 [SAA7134_BOARD_BMK_MPEX_NOTUNER] = {
868 /* "Andrew de Quincey" <adq@lidskialf.net> */
869 .name = "BMK MPEX No Tuner",
870 .audio_clock = 0x200000,
871 .tuner_type = TUNER_ABSENT,
872 .radio_type = UNSET,
873 .tuner_addr = ADDR_UNSET,
874 .radio_addr = ADDR_UNSET,
875 .empress_addr = 0x20,
876 .inputs = {{
877 .name = name_comp1,
878 .vmux = 4,
879 .amux = LINE1,
880 },{
881 .name = name_comp2,
882 .vmux = 3,
883 .amux = LINE1,
884 },{
885 .name = name_comp3,
886 .vmux = 0,
887 .amux = LINE1,
888 },{
889 .name = name_comp4,
890 .vmux = 1,
891 .amux = LINE1,
892 },{
893 .name = name_svideo,
894 .vmux = 8,
895 .amux = LINE1,
896 }},
897 .mpeg = SAA7134_MPEG_EMPRESS,
898 .video_out = CCIR656,
899 },
900 [SAA7134_BOARD_VIDEOMATE_TV] = {
901 .name = "Compro VideoMate TV",
902 .audio_clock = 0x00187de7,
903 .tuner_type = TUNER_PHILIPS_NTSC_M,
904 .radio_type = UNSET,
905 .tuner_addr = ADDR_UNSET,
906 .radio_addr = ADDR_UNSET,
907 .inputs = {{
908 .name = name_svideo,
909 .vmux = 8,
910 .amux = LINE1,
911 },{
912 .name = name_comp1,
913 .vmux = 3,
914 .amux = LINE1,
915 },{
916 .name = name_tv,
917 .vmux = 1,
918 .amux = LINE2,
919 .tv = 1,
920 }},
921 },
922 [SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUS] = {
923 .name = "Compro VideoMate TV Gold+",
924 .audio_clock = 0x00187de7,
925 .tuner_type = TUNER_PHILIPS_NTSC_M,
926 .gpiomask = 0x800c0000,
927 .radio_type = UNSET,
928 .tuner_addr = ADDR_UNSET,
929 .radio_addr = ADDR_UNSET,
930 .inputs = {{
931 .name = name_svideo,
932 .vmux = 8,
933 .amux = LINE1,
934 .gpio = 0x06c00012,
935 },{
936 .name = name_comp1,
937 .vmux = 3,
938 .amux = LINE1,
939 .gpio = 0x0ac20012,
940 },{
941 .name = name_tv,
942 .vmux = 1,
943 .amux = LINE2,
944 .gpio = 0x08c20012,
945 .tv = 1,
946 }}, /* radio and probably mute is missing */
947 },
948 [SAA7134_BOARD_CRONOS_PLUS] = {
949 /*
950 gpio pins:
951 0 .. 3 BASE_ID
952 4 .. 7 PROTECT_ID
953 8 .. 11 USER_OUT
954 12 .. 13 USER_IN
955 14 .. 15 VIDIN_SEL
956 */
957 .name = "Matrox CronosPlus",
958 .tuner_type = TUNER_ABSENT,
959 .radio_type = UNSET,
960 .tuner_addr = ADDR_UNSET,
961 .radio_addr = ADDR_UNSET,
962 .gpiomask = 0xcf00,
963 .inputs = {{
964 .name = name_comp1,
965 .vmux = 0,
966 .gpio = 2 << 14,
967 },{
968 .name = name_comp2,
969 .vmux = 0,
970 .gpio = 1 << 14,
971 },{
972 .name = name_comp3,
973 .vmux = 0,
974 .gpio = 0 << 14,
975 },{
976 .name = name_comp4,
977 .vmux = 0,
978 .gpio = 3 << 14,
979 },{
980 .name = name_svideo,
981 .vmux = 8,
982 .gpio = 2 << 14,
983 }},
984 },
985 [SAA7134_BOARD_MD2819] = {
986 .name = "AverMedia M156 / Medion 2819",
987 .audio_clock = 0x00187de7,
988 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
989 .radio_type = UNSET,
990 .tuner_addr = ADDR_UNSET,
991 .radio_addr = ADDR_UNSET,
992 .tda9887_conf = TDA9887_PRESENT,
993 .gpiomask = 0x03,
994 .inputs = {{
995 .name = name_tv,
996 .vmux = 1,
997 .amux = TV,
998 .tv = 1,
999 .gpio = 0x00,
1000 }, {
1001 .name = name_comp1,
1002 .vmux = 3,
1003 .amux = LINE1,
1004 .gpio = 0x02,
1005 }, {
1006 .name = name_comp2,
1007 .vmux = 0,
1008 .amux = LINE1,
1009 .gpio = 0x02,
1010 }, {
1011 .name = name_svideo,
1012 .vmux = 8,
1013 .amux = LINE1,
1014 .gpio = 0x02,
1015 } },
1016 .radio = {
1017 .name = name_radio,
1018 .amux = LINE1,
1019 .gpio = 0x01,
1020 },
1021 .mute = {
1022 .name = name_mute,
1023 .amux = TV,
1024 .gpio = 0x00,
1025 },
1026 },
1027 [SAA7134_BOARD_BMK_MPEX_TUNER] = {
1028 /* "Greg Wickham <greg.wickham@grangenet.net> */
1029 .name = "BMK MPEX Tuner",
1030 .audio_clock = 0x200000,
1031 .tuner_type = TUNER_PHILIPS_PAL,
1032 .radio_type = UNSET,
1033 .tuner_addr = ADDR_UNSET,
1034 .radio_addr = ADDR_UNSET,
1035 .empress_addr = 0x20,
1036 .inputs = {{
1037 .name = name_comp1,
1038 .vmux = 1,
1039 .amux = LINE1,
1040 },{
1041 .name = name_svideo,
1042 .vmux = 8,
1043 .amux = LINE1,
1044 },{
1045 .name = name_tv,
1046 .vmux = 3,
1047 .amux = TV,
1048 .tv = 1,
1049 }},
1050 .mpeg = SAA7134_MPEG_EMPRESS,
1051 .video_out = CCIR656,
1052 },
1053 [SAA7134_BOARD_ASUSTEK_TVFM7133] = {
1054 .name = "ASUS TV-FM 7133",
1055 .audio_clock = 0x00187de7,
1056 /* probably wrong, the 7133 one is the NTSC version ...
1057 * .tuner_type = TUNER_PHILIPS_FM1236_MK3 */
1058 .tuner_type = TUNER_LG_NTSC_NEW_TAPC,
1059 .radio_type = UNSET,
1060 .tuner_addr = ADDR_UNSET,
1061 .radio_addr = ADDR_UNSET,
1062 .tda9887_conf = TDA9887_PRESENT,
1063 .inputs = {{
1064 .name = name_tv,
1065 .vmux = 1,
1066 .amux = TV,
1067 .tv = 1,
1068
1069 },{
1070 .name = name_comp1,
1071 .vmux = 4,
1072 .amux = LINE2,
1073 },{
1074 .name = name_svideo,
1075 .vmux = 6,
1076 .amux = LINE2,
1077 }},
1078 .radio = {
1079 .name = name_radio,
1080 .amux = LINE1,
1081 },
1082 },
1083 [SAA7134_BOARD_PINNACLE_PCTV_STEREO] = {
1084 .name = "Pinnacle PCTV Stereo (saa7134)",
1085 .audio_clock = 0x00187de7,
1086 .tuner_type = TUNER_MT2032,
1087 .radio_type = UNSET,
1088 .tuner_addr = ADDR_UNSET,
1089 .radio_addr = ADDR_UNSET,
1090 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER | TDA9887_PORT2_INACTIVE,
1091 .inputs = {{
1092 .name = name_tv,
1093 .vmux = 3,
1094 .amux = TV,
1095 .tv = 1,
1096 },{
1097 .name = name_comp1,
1098 .vmux = 0,
1099 .amux = LINE2,
1100 },{
1101 .name = name_comp2,
1102 .vmux = 1,
1103 .amux = LINE2,
1104 },{
1105 .name = name_svideo,
1106 .vmux = 8,
1107 .amux = LINE2,
1108 }},
1109 },
1110 [SAA7134_BOARD_MANLI_MTV002] = {
1111 /* Ognjen Nastic <ognjen@logosoft.ba> */
1112 .name = "Manli MuchTV M-TV002",
1113 .audio_clock = 0x00200000,
1114 .tuner_type = TUNER_PHILIPS_PAL,
1115 .radio_type = UNSET,
1116 .tuner_addr = ADDR_UNSET,
1117 .radio_addr = ADDR_UNSET,
1118 .inputs = {{
1119 .name = name_svideo,
1120 .vmux = 8,
1121 .amux = LINE1,
1122 },{
1123 .name = name_comp1,
1124 .vmux = 1,
1125 .amux = LINE1,
1126 },{
1127 .name = name_tv,
1128 .vmux = 3,
1129 .amux = LINE2,
1130 .tv = 1,
1131 }},
1132 .radio = {
1133 .name = name_radio,
1134 .amux = LINE2,
1135 },
1136 },
1137 [SAA7134_BOARD_MANLI_MTV001] = {
1138 /* Ognjen Nastic <ognjen@logosoft.ba> UNTESTED */
1139 .name = "Manli MuchTV M-TV001",
1140 .audio_clock = 0x00200000,
1141 .tuner_type = TUNER_PHILIPS_PAL,
1142 .radio_type = UNSET,
1143 .tuner_addr = ADDR_UNSET,
1144 .radio_addr = ADDR_UNSET,
1145 .inputs = {{
1146 .name = name_svideo,
1147 .vmux = 8,
1148 .amux = LINE1,
1149 },{
1150 .name = name_comp1,
1151 .vmux = 1,
1152 .amux = LINE1,
1153 },{
1154 .name = name_tv,
1155 .vmux = 3,
1156 .amux = LINE2,
1157 .tv = 1,
1158 }},
1159 .mute = {
1160 .name = name_mute,
1161 .amux = LINE1,
1162 },
1163 },
1164 [SAA7134_BOARD_TG3000TV] = {
1165 /* TransGear 3000TV */
1166 .name = "Nagase Sangyo TransGear 3000TV",
1167 .audio_clock = 0x00187de7,
1168 .tuner_type = TUNER_PHILIPS_NTSC_M,
1169 .radio_type = UNSET,
1170 .tuner_addr = ADDR_UNSET,
1171 .radio_addr = ADDR_UNSET,
1172 .inputs = {{
1173 .name = name_tv,
1174 .vmux = 1,
1175 .amux = LINE2,
1176 .tv = 1,
1177 },{
1178 .name = name_comp1,
1179 .vmux = 3,
1180 .amux = LINE2,
1181 },{
1182 .name = name_svideo,
1183 .vmux = 8,
1184 .amux = LINE2,
1185 }},
1186 },
1187 [SAA7134_BOARD_ECS_TVP3XP] = {
1188 .name = "Elitegroup ECS TVP3XP FM1216 Tuner Card(PAL-BG,FM) ",
1189 .audio_clock = 0x187de7, /* xtal 32.1 MHz */
1190 .tuner_type = TUNER_PHILIPS_PAL,
1191 .radio_type = UNSET,
1192 .tuner_addr = ADDR_UNSET,
1193 .radio_addr = ADDR_UNSET,
1194 .inputs = {{
1195 .name = name_tv,
1196 .vmux = 1,
1197 .amux = TV,
1198 .tv = 1,
1199 },{
1200 .name = name_tv_mono,
1201 .vmux = 1,
1202 .amux = LINE2,
1203 .tv = 1,
1204 },{
1205 .name = name_comp1,
1206 .vmux = 3,
1207 .amux = LINE1,
1208 },{
1209 .name = name_svideo,
1210 .vmux = 8,
1211 .amux = LINE1,
1212 },{
1213 .name = "CVid over SVid",
1214 .vmux = 0,
1215 .amux = LINE1,
1216 }},
1217 .radio = {
1218 .name = name_radio,
1219 .amux = LINE2,
1220 },
1221 },
1222 [SAA7134_BOARD_ECS_TVP3XP_4CB5] = {
1223 .name = "Elitegroup ECS TVP3XP FM1236 Tuner Card (NTSC,FM)",
1224 .audio_clock = 0x187de7,
1225 .tuner_type = TUNER_PHILIPS_NTSC,
1226 .radio_type = UNSET,
1227 .tuner_addr = ADDR_UNSET,
1228 .radio_addr = ADDR_UNSET,
1229 .inputs = {{
1230 .name = name_tv,
1231 .vmux = 1,
1232 .amux = TV,
1233 .tv = 1,
1234 },{
1235 .name = name_tv_mono,
1236 .vmux = 1,
1237 .amux = LINE2,
1238 .tv = 1,
1239 },{
1240 .name = name_comp1,
1241 .vmux = 3,
1242 .amux = LINE1,
1243 },{
1244 .name = name_svideo,
1245 .vmux = 8,
1246 .amux = LINE1,
1247 },{
1248 .name = "CVid over SVid",
1249 .vmux = 0,
1250 .amux = LINE1,
1251 }},
1252 .radio = {
1253 .name = name_radio,
1254 .amux = LINE2,
1255 },
1256 },
1257 [SAA7134_BOARD_ECS_TVP3XP_4CB6] = {
1258 /* Barry Scott <barry.scott@onelan.co.uk> */
1259 .name = "Elitegroup ECS TVP3XP FM1246 Tuner Card (PAL,FM)",
1260 .audio_clock = 0x187de7,
1261 .tuner_type = TUNER_PHILIPS_PAL_I,
1262 .radio_type = UNSET,
1263 .tuner_addr = ADDR_UNSET,
1264 .radio_addr = ADDR_UNSET,
1265 .inputs = {{
1266 .name = name_tv,
1267 .vmux = 1,
1268 .amux = TV,
1269 .tv = 1,
1270 },{
1271 .name = name_tv_mono,
1272 .vmux = 1,
1273 .amux = LINE2,
1274 .tv = 1,
1275 },{
1276 .name = name_comp1,
1277 .vmux = 3,
1278 .amux = LINE1,
1279 },{
1280 .name = name_svideo,
1281 .vmux = 8,
1282 .amux = LINE1,
1283 },{
1284 .name = "CVid over SVid",
1285 .vmux = 0,
1286 .amux = LINE1,
1287 }},
1288 .radio = {
1289 .name = name_radio,
1290 .amux = LINE2,
1291 },
1292 },
1293 [SAA7134_BOARD_AVACSSMARTTV] = {
1294 /* Roman Pszonczenko <romka@kolos.math.uni.lodz.pl> */
1295 .name = "AVACS SmartTV",
1296 .audio_clock = 0x00187de7,
1297 .tuner_type = TUNER_PHILIPS_PAL,
1298 .radio_type = UNSET,
1299 .tuner_addr = ADDR_UNSET,
1300 .radio_addr = ADDR_UNSET,
1301 .inputs = {{
1302 .name = name_tv,
1303 .vmux = 1,
1304 .amux = TV,
1305 .tv = 1,
1306 },{
1307 .name = name_tv_mono,
1308 .vmux = 1,
1309 .amux = LINE2,
1310 .tv = 1,
1311 },{
1312 .name = name_comp1,
1313 .vmux = 0,
1314 .amux = LINE2,
1315 },{
1316 .name = name_comp2,
1317 .vmux = 3,
1318 .amux = LINE2,
1319 },{
1320 .name = name_svideo,
1321 .vmux = 8,
1322 .amux = LINE2,
1323 }},
1324 .radio = {
1325 .name = name_radio,
1326 .amux = LINE2,
1327 .gpio = 0x200000,
1328 },
1329 },
1330 [SAA7134_BOARD_AVERMEDIA_DVD_EZMAKER] = {
1331 /* Michael Smith <msmith@cbnco.com> */
1332 .name = "AVerMedia DVD EZMaker",
1333 .audio_clock = 0x00187de7,
1334 .tuner_type = TUNER_ABSENT,
1335 .radio_type = UNSET,
1336 .tuner_addr = ADDR_UNSET,
1337 .radio_addr = ADDR_UNSET,
1338 .inputs = {{
1339 .name = name_comp1,
1340 .vmux = 3,
1341 },{
1342 .name = name_svideo,
1343 .vmux = 8,
1344 }},
1345 },
1346 [SAA7134_BOARD_AVERMEDIA_M103] = {
1347 /* Massimo Piccioni <dafastidio@libero.it> */
1348 .name = "AVerMedia MiniPCI DVB-T Hybrid M103",
1349 .audio_clock = 0x187de7,
1350 .tuner_type = TUNER_XC2028,
1351 .radio_type = UNSET,
1352 .tuner_addr = ADDR_UNSET,
1353 .radio_addr = ADDR_UNSET,
1354 .mpeg = SAA7134_MPEG_DVB,
1355 .inputs = {{
1356 .name = name_tv,
1357 .vmux = 1,
1358 .amux = TV,
1359 .tv = 1,
1360 } },
1361 },
1362 [SAA7134_BOARD_NOVAC_PRIMETV7133] = {
1363 /* toshii@netbsd.org */
1364 .name = "Noval Prime TV 7133",
1365 .audio_clock = 0x00200000,
1366 .tuner_type = TUNER_ALPS_TSBH1_NTSC,
1367 .radio_type = UNSET,
1368 .tuner_addr = ADDR_UNSET,
1369 .radio_addr = ADDR_UNSET,
1370 .inputs = {{
1371 .name = name_comp1,
1372 .vmux = 3,
1373 },{
1374 .name = name_tv,
1375 .vmux = 1,
1376 .amux = TV,
1377 .tv = 1,
1378 },{
1379 .name = name_svideo,
1380 .vmux = 8,
1381 }},
1382 },
1383 [SAA7134_BOARD_AVERMEDIA_STUDIO_305] = {
1384 .name = "AverMedia AverTV Studio 305",
1385 .audio_clock = 0x00187de7,
1386 .tuner_type = TUNER_PHILIPS_FM1256_IH3,
1387 .radio_type = UNSET,
1388 .tuner_addr = ADDR_UNSET,
1389 .radio_addr = ADDR_UNSET,
1390 .tda9887_conf = TDA9887_PRESENT,
1391 .inputs = {{
1392 .name = name_tv,
1393 .vmux = 1,
1394 .amux = LINE2,
1395 .tv = 1,
1396 },{
1397 .name = name_comp1,
1398 .vmux = 0,
1399 .amux = LINE2,
1400 },{
1401 .name = name_comp2,
1402 .vmux = 3,
1403 .amux = LINE2,
1404 },{
1405 .name = name_svideo,
1406 .vmux = 8,
1407 .amux = LINE2,
1408 }},
1409 .radio = {
1410 .name = name_radio,
1411 .amux = LINE2,
1412 },
1413 .mute = {
1414 .name = name_mute,
1415 .amux = LINE1,
1416 },
1417 },
1418 [SAA7134_BOARD_AVERMEDIA_STUDIO_505] = {
1419 /* Vasiliy Temnikov <vaka@newmail.ru> */
1420 .name = "AverMedia AverTV Studio 505",
1421 .audio_clock = 0x00187de7,
1422 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
1423 .radio_type = UNSET,
1424 .tuner_addr = ADDR_UNSET,
1425 .radio_addr = ADDR_UNSET,
1426 .tda9887_conf = TDA9887_PRESENT,
1427 .inputs = { {
1428 .name = name_tv,
1429 .vmux = 1,
1430 .amux = LINE2,
1431 .tv = 1,
1432 }, {
1433 .name = name_comp1,
1434 .vmux = 0,
1435 .amux = LINE2,
1436 }, {
1437 .name = name_comp2,
1438 .vmux = 3,
1439 .amux = LINE2,
1440 },{
1441 .name = name_svideo,
1442 .vmux = 8,
1443 .amux = LINE2,
1444 } },
1445 .radio = {
1446 .name = name_radio,
1447 .amux = LINE2,
1448 },
1449 .mute = {
1450 .name = name_mute,
1451 .amux = LINE1,
1452 },
1453 },
1454 [SAA7134_BOARD_UPMOST_PURPLE_TV] = {
1455 .name = "UPMOST PURPLE TV",
1456 .audio_clock = 0x00187de7,
1457 .tuner_type = TUNER_PHILIPS_FM1236_MK3,
1458 .radio_type = UNSET,
1459 .tuner_addr = ADDR_UNSET,
1460 .radio_addr = ADDR_UNSET,
1461 .tda9887_conf = TDA9887_PRESENT,
1462 .inputs = {{
1463 .name = name_tv,
1464 .vmux = 7,
1465 .amux = TV,
1466 .tv = 1,
1467 },{
1468 .name = name_svideo,
1469 .vmux = 7,
1470 .amux = LINE1,
1471 }},
1472 },
1473 [SAA7134_BOARD_ITEMS_MTV005] = {
1474 /* Norman Jonas <normanjonas@arcor.de> */
1475 .name = "Items MuchTV Plus / IT-005",
1476 .audio_clock = 0x00187de7,
1477 .tuner_type = TUNER_PHILIPS_PAL,
1478 .radio_type = UNSET,
1479 .tuner_addr = ADDR_UNSET,
1480 .radio_addr = ADDR_UNSET,
1481 .inputs = {{
1482 .name = name_tv,
1483 .vmux = 3,
1484 .amux = TV,
1485 .tv = 1,
1486 },{
1487 .name = name_comp1,
1488 .vmux = 1,
1489 .amux = LINE1,
1490 },{
1491 .name = name_svideo,
1492 .vmux = 8,
1493 .amux = LINE1,
1494 }},
1495 .radio = {
1496 .name = name_radio,
1497 .amux = LINE2,
1498 },
1499 },
1500 [SAA7134_BOARD_CINERGY200] = {
1501 .name = "Terratec Cinergy 200 TV",
1502 .audio_clock = 0x00200000,
1503 .tuner_type = TUNER_PHILIPS_PAL,
1504 .radio_type = UNSET,
1505 .tuner_addr = ADDR_UNSET,
1506 .radio_addr = ADDR_UNSET,
1507 .inputs = {{
1508 .name = name_tv,
1509 .vmux = 1,
1510 .amux = LINE2,
1511 .tv = 1,
1512 },{
1513 .name = name_comp1,
1514 .vmux = 4,
1515 .amux = LINE1,
1516 },{
1517 .name = name_svideo,
1518 .vmux = 8,
1519 .amux = LINE1,
1520 },{
1521 .name = name_comp2, /* CVideo over SVideo Connector */
1522 .vmux = 0,
1523 .amux = LINE1,
1524 }},
1525 .mute = {
1526 .name = name_mute,
1527 .amux = LINE2,
1528 },
1529 },
1530 [SAA7134_BOARD_VIDEOMATE_TV_PVR] = {
1531 /* Alain St-Denis <alain@topaze.homeip.net> */
1532 .name = "Compro VideoMate TV PVR/FM",
1533 .audio_clock = 0x00187de7,
1534 .tuner_type = TUNER_PHILIPS_NTSC_M,
1535 .radio_type = UNSET,
1536 .tuner_addr = ADDR_UNSET,
1537 .radio_addr = ADDR_UNSET,
1538 .gpiomask = 0x808c0080,
1539 .inputs = {{
1540 .name = name_svideo,
1541 .vmux = 8,
1542 .amux = LINE1,
1543 .gpio = 0x00080,
1544 },{
1545 .name = name_comp1,
1546 .vmux = 3,
1547 .amux = LINE1,
1548 .gpio = 0x00080,
1549 },{
1550 .name = name_tv,
1551 .vmux = 1,
1552 .amux = LINE2_LEFT,
1553 .tv = 1,
1554 .gpio = 0x00080,
1555 }},
1556 .radio = {
1557 .name = name_radio,
1558 .amux = LINE2,
1559 .gpio = 0x80000,
1560 },
1561 .mute = {
1562 .name = name_mute,
1563 .amux = LINE2,
1564 .gpio = 0x40000,
1565 },
1566 },
1567 [SAA7134_BOARD_SABRENT_SBTTVFM] = {
1568 /* Michael Rodriguez-Torrent <mrtorrent@asu.edu> */
1569 .name = "Sabrent SBT-TVFM (saa7130)",
1570 .audio_clock = 0x00187de7,
1571 .tuner_type = TUNER_PHILIPS_NTSC_M,
1572 .radio_type = UNSET,
1573 .tuner_addr = ADDR_UNSET,
1574 .radio_addr = ADDR_UNSET,
1575 .inputs = {{
1576 .name = name_comp1,
1577 .vmux = 1,
1578 .amux = LINE1,
1579 },{
1580 .name = name_tv,
1581 .vmux = 3,
1582 .amux = LINE2,
1583 .tv = 1,
1584 },{
1585 .name = name_svideo,
1586 .vmux = 8,
1587 .amux = LINE1,
1588 }},
1589 .radio = {
1590 .name = name_radio,
1591 .amux = LINE2,
1592 },
1593 },
1594 [SAA7134_BOARD_ZOLID_XPERT_TV7134] = {
1595 /* Helge Jensen <helge.jensen@slog.dk> */
1596 .name = ":Zolid Xpert TV7134",
1597 .audio_clock = 0x00187de7,
1598 .tuner_type = TUNER_PHILIPS_NTSC,
1599 .radio_type = UNSET,
1600 .tuner_addr = ADDR_UNSET,
1601 .radio_addr = ADDR_UNSET,
1602 .inputs = {{
1603 .name = name_svideo,
1604 .vmux = 8,
1605 .amux = LINE1,
1606 },{
1607 .name = name_comp1,
1608 .vmux = 3,
1609 .amux = LINE1,
1610 },{
1611 .name = name_tv,
1612 .vmux = 1,
1613 .amux = LINE2,
1614 .tv = 1,
1615 }},
1616 },
1617 [SAA7134_BOARD_EMPIRE_PCI_TV_RADIO_LE] = {
1618 /* "Matteo Az" <matte.az@nospam.libero.it> ;-) */
1619 .name = "Empire PCI TV-Radio LE",
1620 .audio_clock = 0x00187de7,
1621 .tuner_type = TUNER_PHILIPS_PAL,
1622 .radio_type = UNSET,
1623 .tuner_addr = ADDR_UNSET,
1624 .radio_addr = ADDR_UNSET,
1625 .gpiomask = 0x4000,
1626 .inputs = {{
1627 .name = name_tv_mono,
1628 .vmux = 1,
1629 .amux = LINE2,
1630 .gpio = 0x8000,
1631 .tv = 1,
1632 },{
1633 .name = name_comp1,
1634 .vmux = 3,
1635 .amux = LINE1,
1636 .gpio = 0x8000,
1637 },{
1638 .name = name_svideo,
1639 .vmux = 6,
1640 .amux = LINE1,
1641 .gpio = 0x8000,
1642 }},
1643 .radio = {
1644 .name = name_radio,
1645 .amux = LINE1,
1646 .gpio = 0x8000,
1647 },
1648 .mute = {
1649 .name = name_mute,
1650 .amux = TV,
1651 .gpio =0x8000,
1652 }
1653 },
1654 [SAA7134_BOARD_AVERMEDIA_STUDIO_307] = {
1655 /*
1656 Nickolay V. Shmyrev <nshmyrev@yandex.ru>
1657 Lots of thanks to Andrey Zolotarev <zolotarev_andrey@mail.ru>
1658 */
1659 .name = "Avermedia AVerTV Studio 307",
1660 .audio_clock = 0x00187de7,
1661 .tuner_type = TUNER_PHILIPS_FM1256_IH3,
1662 .radio_type = UNSET,
1663 .tuner_addr = ADDR_UNSET,
1664 .radio_addr = ADDR_UNSET,
1665 .tda9887_conf = TDA9887_PRESENT,
1666 .gpiomask = 0x03,
1667 .inputs = {{
1668 .name = name_tv,
1669 .vmux = 1,
1670 .amux = TV,
1671 .tv = 1,
1672 .gpio = 0x00,
1673 },{
1674 .name = name_comp,
1675 .vmux = 3,
1676 .amux = LINE1,
1677 .gpio = 0x02,
1678 },{
1679 .name = name_svideo,
1680 .vmux = 8,
1681 .amux = LINE1,
1682 .gpio = 0x02,
1683 }},
1684 .radio = {
1685 .name = name_radio,
1686 .amux = LINE1,
1687 .gpio = 0x01,
1688 },
1689 .mute = {
1690 .name = name_mute,
1691 .amux = LINE1,
1692 .gpio = 0x00,
1693 },
1694 },
1695 [SAA7134_BOARD_AVERMEDIA_GO_007_FM] = {
1696 .name = "Avermedia AVerTV GO 007 FM",
1697 .audio_clock = 0x00187de7,
1698 .tuner_type = TUNER_PHILIPS_TDA8290,
1699 .radio_type = UNSET,
1700 .tuner_addr = ADDR_UNSET,
1701 .radio_addr = ADDR_UNSET,
1702 .gpiomask = 0x00300003,
1703 /* .gpiomask = 0x8c240003, */
1704 .inputs = {{
1705 .name = name_tv,
1706 .vmux = 1,
1707 .amux = TV,
1708 .tv = 1,
1709 .gpio = 0x01,
1710 },{
1711 .name = name_comp1,
1712 .vmux = 0,
1713 .amux = LINE1,
1714 .gpio = 0x02,
1715 },{
1716 .name = name_svideo,
1717 .vmux = 6,
1718 .amux = LINE1,
1719 .gpio = 0x02,
1720 }},
1721 .radio = {
1722 .name = name_radio,
1723 .amux = TV,
1724 .gpio = 0x00300001,
1725 },
1726 .mute = {
1727 .name = name_mute,
1728 .amux = TV,
1729 .gpio = 0x01,
1730 },
1731 },
1732 [SAA7134_BOARD_AVERMEDIA_CARDBUS] = {
1733 /* Kees.Blom@cwi.nl */
1734 .name = "AVerMedia Cardbus TV/Radio (E500)",
1735 .audio_clock = 0x187de7,
1736 .tuner_type = TUNER_PHILIPS_TDA8290,
1737 .radio_type = UNSET,
1738 .tuner_addr = ADDR_UNSET,
1739 .radio_addr = ADDR_UNSET,
1740 .inputs = {{
1741 .name = name_tv,
1742 .vmux = 1,
1743 .amux = TV,
1744 .tv = 1,
1745 },{
1746 .name = name_comp1,
1747 .vmux = 3,
1748 .amux = LINE2,
1749 },{
1750 .name = name_svideo,
1751 .vmux = 8,
1752 .amux = LINE1,
1753 }},
1754 .radio = {
1755 .name = name_radio,
1756 .amux = LINE1,
1757 },
1758 },
1759 [SAA7134_BOARD_AVERMEDIA_CARDBUS_501] = {
1760 /* Oldrich Jedlicka <oldium.pro@seznam.cz> */
1761 .name = "AVerMedia Cardbus TV/Radio (E501R)",
1762 .audio_clock = 0x187de7,
1763 .tuner_type = TUNER_ALPS_TSBE5_PAL,
1764 .radio_type = TUNER_TEA5767,
1765 .tuner_addr = 0x61,
1766 .radio_addr = 0x60,
1767 .tda9887_conf = TDA9887_PRESENT,
1768 .gpiomask = 0x08000000,
1769 .inputs = { {
1770 .name = name_tv,
1771 .vmux = 1,
1772 .amux = TV,
1773 .tv = 1,
1774 .gpio = 0x08000000,
1775 }, {
1776 .name = name_comp1,
1777 .vmux = 3,
1778 .amux = LINE1,
1779 .gpio = 0x08000000,
1780 }, {
1781 .name = name_svideo,
1782 .vmux = 8,
1783 .amux = LINE1,
1784 .gpio = 0x08000000,
1785 } },
1786 .radio = {
1787 .name = name_radio,
1788 .amux = LINE2,
1789 .gpio = 0x00000000,
1790 },
1791 },
1792 [SAA7134_BOARD_CINERGY400_CARDBUS] = {
1793 .name = "Terratec Cinergy 400 mobile",
1794 .audio_clock = 0x187de7,
1795 .tuner_type = TUNER_ALPS_TSBE5_PAL,
1796 .radio_type = UNSET,
1797 .tuner_addr = ADDR_UNSET,
1798 .radio_addr = ADDR_UNSET,
1799 .tda9887_conf = TDA9887_PRESENT,
1800 .inputs = {{
1801 .name = name_tv,
1802 .vmux = 1,
1803 .amux = TV,
1804 .tv = 1,
1805 },{
1806 .name = name_tv_mono,
1807 .vmux = 1,
1808 .amux = LINE2,
1809 .tv = 1,
1810 },{
1811 .name = name_comp1,
1812 .vmux = 3,
1813 .amux = LINE1,
1814 },{
1815 .name = name_svideo,
1816 .vmux = 8,
1817 .amux = LINE1,
1818 }},
1819 },
1820 [SAA7134_BOARD_CINERGY600_MK3] = {
1821 .name = "Terratec Cinergy 600 TV MK3",
1822 .audio_clock = 0x00200000,
1823 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
1824 .radio_type = UNSET,
1825 .tuner_addr = ADDR_UNSET,
1826 .radio_addr = ADDR_UNSET,
1827 .rds_addr = 0x10,
1828 .tda9887_conf = TDA9887_PRESENT,
1829 .inputs = {{
1830 .name = name_tv,
1831 .vmux = 1,
1832 .amux = TV,
1833 .tv = 1,
1834 },{
1835 .name = name_comp1,
1836 .vmux = 4,
1837 .amux = LINE1,
1838 },{
1839 .name = name_svideo,
1840 .vmux = 8,
1841 .amux = LINE1,
1842 },{
1843 .name = name_comp2, /* CVideo over SVideo Connector */
1844 .vmux = 0,
1845 .amux = LINE1,
1846 }},
1847 .radio = {
1848 .name = name_radio,
1849 .amux = LINE2,
1850 },
1851 },
1852 [SAA7134_BOARD_VIDEOMATE_GOLD_PLUS] = {
1853 /* Dylan Walkden <dylan_walkden@hotmail.com> */
1854 .name = "Compro VideoMate Gold+ Pal",
1855 .audio_clock = 0x00187de7,
1856 .tuner_type = TUNER_PHILIPS_PAL,
1857 .radio_type = UNSET,
1858 .tuner_addr = ADDR_UNSET,
1859 .radio_addr = ADDR_UNSET,
1860 .gpiomask = 0x1ce780,
1861 .inputs = {{
1862 .name = name_svideo,
1863 .vmux = 0, /* CVideo over SVideo Connector - ok? */
1864 .amux = LINE1,
1865 .gpio = 0x008080,
1866 },{
1867 .name = name_comp1,
1868 .vmux = 3,
1869 .amux = LINE1,
1870 .gpio = 0x008080,
1871 },{
1872 .name = name_tv,
1873 .vmux = 1,
1874 .amux = TV,
1875 .tv = 1,
1876 .gpio = 0x008080,
1877 }},
1878 .radio = {
1879 .name = name_radio,
1880 .amux = LINE2,
1881 .gpio = 0x80000,
1882 },
1883 .mute = {
1884 .name = name_mute,
1885 .amux = LINE2,
1886 .gpio = 0x0c8000,
1887 },
1888 },
1889 [SAA7134_BOARD_PINNACLE_300I_DVBT_PAL] = {
1890 .name = "Pinnacle PCTV 300i DVB-T + PAL",
1891 .audio_clock = 0x00187de7,
1892 .tuner_type = TUNER_MT2032,
1893 .radio_type = UNSET,
1894 .tuner_addr = ADDR_UNSET,
1895 .radio_addr = ADDR_UNSET,
1896 .tda9887_conf = TDA9887_PRESENT | TDA9887_INTERCARRIER | TDA9887_PORT2_INACTIVE,
1897 .mpeg = SAA7134_MPEG_DVB,
1898 .inputs = {{
1899 .name = name_tv,
1900 .vmux = 3,
1901 .amux = TV,
1902 .tv = 1,
1903 },{
1904 .name = name_comp1,
1905 .vmux = 0,
1906 .amux = LINE2,
1907 },{
1908 .name = name_comp2,
1909 .vmux = 1,
1910 .amux = LINE2,
1911 },{
1912 .name = name_svideo,
1913 .vmux = 8,
1914 .amux = LINE2,
1915 }},
1916 },
1917 [SAA7134_BOARD_PROVIDEO_PV952] = {
1918 /* andreas.kretschmer@web.de */
1919 .name = "ProVideo PV952",
1920 .audio_clock = 0x00187de7,
1921 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
1922 .radio_type = UNSET,
1923 .tuner_addr = ADDR_UNSET,
1924 .radio_addr = ADDR_UNSET,
1925 .tda9887_conf = TDA9887_PRESENT,
1926 .inputs = {{
1927 .name = name_comp1,
1928 .vmux = 0,
1929 .amux = LINE1,
1930 },{
1931 .name = name_tv,
1932 .vmux = 1,
1933 .amux = TV,
1934 .tv = 1,
1935 },{
1936 .name = name_tv_mono,
1937 .vmux = 1,
1938 .amux = LINE2,
1939 .tv = 1,
1940 }},
1941 .radio = {
1942 .name = name_radio,
1943 .amux = LINE2,
1944 },
1945 },
1946 [SAA7134_BOARD_AVERMEDIA_305] = {
1947 /* much like the "studio" version but without radio
1948 * and another tuner (sirspiritus@yandex.ru) */
1949 .name = "AverMedia AverTV/305",
1950 .audio_clock = 0x00187de7,
1951 .tuner_type = TUNER_PHILIPS_FQ1216ME,
1952 .radio_type = UNSET,
1953 .tuner_addr = ADDR_UNSET,
1954 .radio_addr = ADDR_UNSET,
1955 .tda9887_conf = TDA9887_PRESENT,
1956 .inputs = {{
1957 .name = name_tv,
1958 .vmux = 1,
1959 .amux = LINE2,
1960 .tv = 1,
1961 },{
1962 .name = name_comp1,
1963 .vmux = 0,
1964 .amux = LINE2,
1965 },{
1966 .name = name_comp2,
1967 .vmux = 3,
1968 .amux = LINE2,
1969 },{
1970 .name = name_svideo,
1971 .vmux = 8,
1972 .amux = LINE2,
1973 }},
1974 .mute = {
1975 .name = name_mute,
1976 .amux = LINE1,
1977 },
1978 },
1979 [SAA7134_BOARD_FLYDVBTDUO] = {
1980 /* LifeView FlyDVB-T DUO */
1981 /* "Nico Sabbi <nsabbi@tiscali.it> Hartmut Hackmann hartmut.hackmann@t-online.de*/
1982 .name = "LifeView FlyDVB-T DUO / MSI TV@nywhere Duo",
1983 .audio_clock = 0x00200000,
1984 .tuner_type = TUNER_PHILIPS_TDA8290,
1985 .radio_type = UNSET,
1986 .tuner_addr = ADDR_UNSET,
1987 .radio_addr = ADDR_UNSET,
1988 .gpiomask = 0x00200000,
1989 .mpeg = SAA7134_MPEG_DVB,
1990 .inputs = {{
1991 .name = name_tv,
1992 .vmux = 1,
1993 .amux = TV,
1994 .gpio = 0x200000, /* GPIO21=High for TV input */
1995 .tv = 1,
1996 },{
1997 .name = name_comp1, /* Composite signal on S-Video input */
1998 .vmux = 0,
1999 .amux = LINE2,
2000 },{
2001 .name = name_comp2, /* Composite input */
2002 .vmux = 3,
2003 .amux = LINE2,
2004 },{
2005 .name = name_svideo, /* S-Video signal on S-Video input */
2006 .vmux = 8,
2007 .amux = LINE2,
2008 }},
2009 .radio = {
2010 .name = name_radio,
2011 .amux = TV,
2012 .gpio = 0x000000, /* GPIO21=Low for FM radio antenna */
2013 },
2014 },
2015 [SAA7134_BOARD_PHILIPS_TOUGH] = {
2016 .name = "Philips TOUGH DVB-T reference design",
2017 .tuner_type = TUNER_ABSENT,
2018 .audio_clock = 0x00187de7,
2019 .radio_type = UNSET,
2020 .tuner_addr = ADDR_UNSET,
2021 .radio_addr = ADDR_UNSET,
2022 .mpeg = SAA7134_MPEG_DVB,
2023 .inputs = {{
2024 .name = name_comp1,
2025 .vmux = 0,
2026 .amux = LINE1,
2027 },{
2028 .name = name_svideo,
2029 .vmux = 8,
2030 .amux = LINE1,
2031 }},
2032 },
2033 [SAA7134_BOARD_AVERMEDIA_307] = {
2034 /*
2035 Davydov Vladimir <vladimir@iqmedia.com>
2036 */
2037 .name = "Avermedia AVerTV 307",
2038 .audio_clock = 0x00187de7,
2039 .tuner_type = TUNER_PHILIPS_FQ1216ME,
2040 .radio_type = UNSET,
2041 .tuner_addr = ADDR_UNSET,
2042 .radio_addr = ADDR_UNSET,
2043 .tda9887_conf = TDA9887_PRESENT,
2044 .inputs = {{
2045 .name = name_tv,
2046 .vmux = 1,
2047 .amux = TV,
2048 .tv = 1,
2049 },{
2050 .name = name_comp1,
2051 .vmux = 0,
2052 .amux = LINE1,
2053 },{
2054 .name = name_comp2,
2055 .vmux = 3,
2056 .amux = LINE1,
2057 },{
2058 .name = name_svideo,
2059 .vmux = 8,
2060 .amux = LINE1,
2061 }},
2062 },
2063 [SAA7134_BOARD_ADS_INSTANT_TV] = {
2064 .name = "ADS Tech Instant TV (saa7135)",
2065 .audio_clock = 0x00187de7,
2066 .tuner_type = TUNER_PHILIPS_TDA8290,
2067 .radio_type = UNSET,
2068 .tuner_addr = ADDR_UNSET,
2069 .radio_addr = ADDR_UNSET,
2070 .inputs = {{
2071 .name = name_tv,
2072 .vmux = 1,
2073 .amux = TV,
2074 .tv = 1,
2075 },{
2076 .name = name_comp1,
2077 .vmux = 3,
2078 .amux = LINE2,
2079 },{
2080 .name = name_svideo,
2081 .vmux = 8,
2082 .amux = LINE2,
2083 }},
2084 },
2085 [SAA7134_BOARD_KWORLD_VSTREAM_XPERT] = {
2086 .name = "Kworld/Tevion V-Stream Xpert TV PVR7134",
2087 .audio_clock = 0x00187de7,
2088 .tuner_type = TUNER_PHILIPS_PAL_I,
2089 .radio_type = UNSET,
2090 .tuner_addr = ADDR_UNSET,
2091 .radio_addr = ADDR_UNSET,
2092 .gpiomask = 0x0700,
2093 .inputs = {{
2094 .name = name_tv,
2095 .vmux = 1,
2096 .amux = TV,
2097 .tv = 1,
2098 .gpio = 0x000,
2099 },{
2100 .name = name_comp1,
2101 .vmux = 3,
2102 .amux = LINE1,
2103 .gpio = 0x200, /* gpio by DScaler */
2104 },{
2105 .name = name_svideo,
2106 .vmux = 0,
2107 .amux = LINE1,
2108 .gpio = 0x200,
2109 }},
2110 .radio = {
2111 .name = name_radio,
2112 .amux = LINE1,
2113 .gpio = 0x100,
2114 },
2115 .mute = {
2116 .name = name_mute,
2117 .amux = TV,
2118 .gpio = 0x000,
2119 },
2120 },
2121 [SAA7134_BOARD_FLYDVBT_DUO_CARDBUS] = {
2122 .name = "LifeView/Typhoon/Genius FlyDVB-T Duo Cardbus",
2123 .audio_clock = 0x00200000,
2124 .tuner_type = TUNER_PHILIPS_TDA8290,
2125 .radio_type = UNSET,
2126 .tuner_addr = ADDR_UNSET,
2127 .radio_addr = ADDR_UNSET,
2128 .mpeg = SAA7134_MPEG_DVB,
2129 .gpiomask = 0x00200000,
2130 .inputs = {{
2131 .name = name_tv,
2132 .vmux = 1,
2133 .amux = TV,
2134 .gpio = 0x200000, /* GPIO21=High for TV input */
2135 .tv = 1,
2136 },{
2137 .name = name_svideo, /* S-Video signal on S-Video input */
2138 .vmux = 8,
2139 .amux = LINE2,
2140 },{
2141 .name = name_comp1, /* Composite signal on S-Video input */
2142 .vmux = 0,
2143 .amux = LINE2,
2144 },{
2145 .name = name_comp2, /* Composite input */
2146 .vmux = 3,
2147 .amux = LINE2,
2148 }},
2149 .radio = {
2150 .name = name_radio,
2151 .amux = TV,
2152 .gpio = 0x000000, /* GPIO21=Low for FM radio antenna */
2153 },
2154 },
2155 [SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII] = {
2156 .name = "Compro VideoMate TV Gold+II",
2157 .audio_clock = 0x002187de7,
2158 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
2159 .radio_type = TUNER_TEA5767,
2160 .tuner_addr = 0x63,
2161 .radio_addr = 0x60,
2162 .gpiomask = 0x8c1880,
2163 .inputs = {{
2164 .name = name_svideo,
2165 .vmux = 0,
2166 .amux = LINE1,
2167 .gpio = 0x800800,
2168 },{
2169 .name = name_comp1,
2170 .vmux = 3,
2171 .amux = LINE1,
2172 .gpio = 0x801000,
2173 },{
2174 .name = name_tv,
2175 .vmux = 1,
2176 .amux = TV,
2177 .tv = 1,
2178 .gpio = 0x800000,
2179 }},
2180 .radio = {
2181 .name = name_radio,
2182 .amux = TV,
2183 .gpio = 0x880000,
2184 },
2185 .mute = {
2186 .name = name_mute,
2187 .amux = LINE2,
2188 .gpio = 0x840000,
2189 },
2190 },
2191 [SAA7134_BOARD_KWORLD_XPERT] = {
2192 /*
2193 FIXME:
2194 - Remote control doesn't initialize properly.
2195 - Audio volume starts muted,
2196 then gradually increases after channel change.
2197 - Overlay scaling problems (application error?)
2198 - Composite S-Video untested.
2199 From: Konrad Rzepecki <hannibal@megapolis.pl>
2200 */
2201 .name = "Kworld Xpert TV PVR7134",
2202 .audio_clock = 0x00187de7,
2203 .tuner_type = TUNER_TENA_9533_DI,
2204 .radio_type = TUNER_TEA5767,
2205 .tuner_addr = 0x61,
2206 .radio_addr = 0x60,
2207 .gpiomask = 0x0700,
2208 .inputs = {{
2209 .name = name_tv,
2210 .vmux = 1,
2211 .amux = TV,
2212 .tv = 1,
2213 .gpio = 0x000,
2214 },{
2215 .name = name_comp1,
2216 .vmux = 3,
2217 .amux = LINE1,
2218 .gpio = 0x200, /* gpio by DScaler */
2219 },{
2220 .name = name_svideo,
2221 .vmux = 0,
2222 .amux = LINE1,
2223 .gpio = 0x200,
2224 }},
2225 .radio = {
2226 .name = name_radio,
2227 .amux = LINE1,
2228 .gpio = 0x100,
2229 },
2230 .mute = {
2231 .name = name_mute,
2232 .amux = TV,
2233 .gpio = 0x000,
2234 },
2235 },
2236 [SAA7134_BOARD_FLYTV_DIGIMATRIX] = {
2237 .name = "FlyTV mini Asus Digimatrix",
2238 .audio_clock = 0x00200000,
2239 .tuner_type = TUNER_LG_TALN,
2240 .radio_type = UNSET,
2241 .tuner_addr = ADDR_UNSET,
2242 .radio_addr = ADDR_UNSET,
2243 .inputs = {{
2244 .name = name_tv,
2245 .vmux = 1,
2246 .amux = TV,
2247 .tv = 1,
2248 },{
2249 .name = name_tv_mono,
2250 .vmux = 1,
2251 .amux = LINE2,
2252 .tv = 1,
2253 },{
2254 .name = name_comp1,
2255 .vmux = 0,
2256 .amux = LINE2,
2257 },{
2258 .name = name_comp2,
2259 .vmux = 3,
2260 .amux = LINE2,
2261 },{
2262 .name = name_svideo,
2263 .vmux = 8,
2264 .amux = LINE2,
2265 }},
2266 .radio = {
2267 .name = name_radio, /* radio unconfirmed */
2268 .amux = LINE2,
2269 },
2270 },
2271 [SAA7134_BOARD_KWORLD_TERMINATOR] = {
2272 /* Kworld V-Stream Studio TV Terminator */
2273 /* "James Webb <jrwebb@qwest.net> */
2274 .name = "V-Stream Studio TV Terminator",
2275 .audio_clock = 0x00187de7,
2276 .tuner_type = TUNER_PHILIPS_TDA8290,
2277 .radio_type = UNSET,
2278 .tuner_addr = ADDR_UNSET,
2279 .radio_addr = ADDR_UNSET,
2280 .gpiomask = 1 << 21,
2281 .inputs = {{
2282 .name = name_tv,
2283 .vmux = 1,
2284 .amux = TV,
2285 .gpio = 0x0000000,
2286 .tv = 1,
2287 },{
2288 .name = name_comp1, /* Composite input */
2289 .vmux = 3,
2290 .amux = LINE2,
2291 .gpio = 0x0000000,
2292 },{
2293 .name = name_svideo, /* S-Video input */
2294 .vmux = 8,
2295 .amux = LINE2,
2296 .gpio = 0x0000000,
2297 }},
2298 .radio = {
2299 .name = name_radio,
2300 .amux = TV,
2301 .gpio = 0x0200000,
2302 },
2303 },
2304 [SAA7134_BOARD_YUAN_TUN900] = {
2305 /* FIXME:
2306 * S-Video and composite sources untested.
2307 * Radio not working.
2308 * Remote control not yet implemented.
2309 * From : codemaster@webgeeks.be */
2310 .name = "Yuan TUN-900 (saa7135)",
2311 .audio_clock = 0x00187de7,
2312 .tuner_type = TUNER_PHILIPS_TDA8290,
2313 .radio_type = UNSET,
2314 .tuner_addr= ADDR_UNSET,
2315 .radio_addr= ADDR_UNSET,
2316 .gpiomask = 0x00010003,
2317 .inputs = {{
2318 .name = name_tv,
2319 .vmux = 1,
2320 .amux = TV,
2321 .tv = 1,
2322 .gpio = 0x01,
2323 },{
2324 .name = name_comp1,
2325 .vmux = 0,
2326 .amux = LINE2,
2327 .gpio = 0x02,
2328 },{
2329 .name = name_svideo,
2330 .vmux = 6,
2331 .amux = LINE2,
2332 .gpio = 0x02,
2333 }},
2334 .radio = {
2335 .name = name_radio,
2336 .amux = LINE1,
2337 .gpio = 0x00010003,
2338 },
2339 .mute = {
2340 .name = name_mute,
2341 .amux = TV,
2342 .gpio = 0x01,
2343 },
2344 },
2345 [SAA7134_BOARD_BEHOLD_409FM] = {
2346 /* <http://tuner.beholder.ru>, Sergey <skiv@orel.ru> */
2347 /* Beholder Intl. Ltd. 2008 */
2348 /*Dmitry Belimov <d.belimov@gmail.com> */
2349 .name = "Beholder BeholdTV 409 FM",
2350 .audio_clock = 0x00187de7,
2351 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
2352 .radio_type = UNSET,
2353 .tuner_addr = ADDR_UNSET,
2354 .radio_addr = ADDR_UNSET,
2355 .tda9887_conf = TDA9887_PRESENT,
2356 .gpiomask = 0x00008000,
2357 .inputs = {{
2358 .name = name_tv,
2359 .vmux = 3,
2360 .amux = TV,
2361 .tv = 1,
2362 },{
2363 .name = name_comp1,
2364 .vmux = 1,
2365 .amux = LINE1,
2366 },{
2367 .name = name_svideo,
2368 .vmux = 8,
2369 .amux = LINE1,
2370 }},
2371 .radio = {
2372 .name = name_radio,
2373 .amux = LINE2,
2374 },
2375 },
2376 [SAA7134_BOARD_GOTVIEW_7135] = {
2377 /* Mike Baikov <mike@baikov.com> */
2378 /* Andrey Cvetcov <ays14@yandex.ru> */
2379 .name = "GoTView 7135 PCI",
2380 .audio_clock = 0x00187de7,
2381 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
2382 .radio_type = UNSET,
2383 .tuner_addr = ADDR_UNSET,
2384 .radio_addr = ADDR_UNSET,
2385 .tda9887_conf = TDA9887_PRESENT,
2386 .gpiomask = 0x00200003,
2387 .inputs = {{
2388 .name = name_tv,
2389 .vmux = 1,
2390 .amux = TV,
2391 .tv = 1,
2392 .gpio = 0x00200003,
2393 },{
2394 .name = name_tv_mono,
2395 .vmux = 1,
2396 .amux = LINE2,
2397 .gpio = 0x00200003,
2398 },{
2399 .name = name_comp1,
2400 .vmux = 3,
2401 .amux = LINE1,
2402 .gpio = 0x00200003,
2403 },{
2404 .name = name_svideo,
2405 .vmux = 8,
2406 .amux = LINE1,
2407 .gpio = 0x00200003,
2408 }},
2409 .radio = {
2410 .name = name_radio,
2411 .amux = LINE2,
2412 .gpio = 0x00200003,
2413 },
2414 .mute = {
2415 .name = name_mute,
2416 .amux = TV,
2417 .gpio = 0x00200003,
2418 },
2419 },
2420 [SAA7134_BOARD_PHILIPS_EUROPA] = {
2421 .name = "Philips EUROPA V3 reference design",
2422 .audio_clock = 0x00187de7,
2423 .tuner_type = TUNER_PHILIPS_TD1316,
2424 .radio_type = UNSET,
2425 .tuner_addr = 0x61,
2426 .radio_addr = ADDR_UNSET,
2427 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE,
2428 .mpeg = SAA7134_MPEG_DVB,
2429 .inputs = {{
2430 .name = name_tv,
2431 .vmux = 3,
2432 .amux = TV,
2433 .tv = 1,
2434 },{
2435 .name = name_comp1,
2436 .vmux = 0,
2437 .amux = LINE2,
2438 },{
2439 .name = name_svideo,
2440 .vmux = 8,
2441 .amux = LINE2,
2442 }},
2443 },
2444 [SAA7134_BOARD_VIDEOMATE_DVBT_300] = {
2445 .name = "Compro Videomate DVB-T300",
2446 .audio_clock = 0x00187de7,
2447 .tuner_type = TUNER_PHILIPS_TD1316,
2448 .radio_type = UNSET,
2449 .tuner_addr = 0x61,
2450 .radio_addr = ADDR_UNSET,
2451 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE,
2452 .mpeg = SAA7134_MPEG_DVB,
2453 .inputs = {{
2454 .name = name_tv,
2455 .vmux = 3,
2456 .amux = TV,
2457 .tv = 1,
2458 },{
2459 .name = name_comp1,
2460 .vmux = 1,
2461 .amux = LINE2,
2462 },{
2463 .name = name_svideo,
2464 .vmux = 8,
2465 .amux = LINE2,
2466 }},
2467 },
2468 [SAA7134_BOARD_VIDEOMATE_DVBT_200] = {
2469 .name = "Compro Videomate DVB-T200",
2470 .tuner_type = TUNER_ABSENT,
2471 .audio_clock = 0x00187de7,
2472 .radio_type = UNSET,
2473 .tuner_addr = ADDR_UNSET,
2474 .radio_addr = ADDR_UNSET,
2475 .mpeg = SAA7134_MPEG_DVB,
2476 .inputs = {{
2477 .name = name_comp1,
2478 .vmux = 0,
2479 .amux = LINE1,
2480 },{
2481 .name = name_svideo,
2482 .vmux = 8,
2483 .amux = LINE1,
2484 }},
2485 },
2486 [SAA7134_BOARD_RTD_VFG7350] = {
2487 .name = "RTD Embedded Technologies VFG7350",
2488 .audio_clock = 0x00200000,
2489 .tuner_type = TUNER_ABSENT,
2490 .radio_type = UNSET,
2491 .tuner_addr = ADDR_UNSET,
2492 .radio_addr = ADDR_UNSET,
2493 .empress_addr = 0x21,
2494 .inputs = {{
2495 .name = "Composite 0",
2496 .vmux = 0,
2497 .amux = LINE1,
2498 },{
2499 .name = "Composite 1",
2500 .vmux = 1,
2501 .amux = LINE2,
2502 },{
2503 .name = "Composite 2",
2504 .vmux = 2,
2505 .amux = LINE1,
2506 },{
2507 .name = "Composite 3",
2508 .vmux = 3,
2509 .amux = LINE2,
2510 },{
2511 .name = "S-Video 0",
2512 .vmux = 8,
2513 .amux = LINE1,
2514 },{
2515 .name = "S-Video 1",
2516 .vmux = 9,
2517 .amux = LINE2,
2518 }},
2519 .mpeg = SAA7134_MPEG_EMPRESS,
2520 .video_out = CCIR656,
2521 .vid_port_opts = ( SET_T_CODE_POLARITY_NON_INVERTED |
2522 SET_CLOCK_NOT_DELAYED |
2523 SET_CLOCK_INVERTED |
2524 SET_VSYNC_OFF ),
2525 },
2526 [SAA7134_BOARD_RTD_VFG7330] = {
2527 .name = "RTD Embedded Technologies VFG7330",
2528 .audio_clock = 0x00200000,
2529 .tuner_type = TUNER_ABSENT,
2530 .radio_type = UNSET,
2531 .tuner_addr = ADDR_UNSET,
2532 .radio_addr = ADDR_UNSET,
2533 .inputs = {{
2534 .name = "Composite 0",
2535 .vmux = 0,
2536 .amux = LINE1,
2537 },{
2538 .name = "Composite 1",
2539 .vmux = 1,
2540 .amux = LINE2,
2541 },{
2542 .name = "Composite 2",
2543 .vmux = 2,
2544 .amux = LINE1,
2545 },{
2546 .name = "Composite 3",
2547 .vmux = 3,
2548 .amux = LINE2,
2549 },{
2550 .name = "S-Video 0",
2551 .vmux = 8,
2552 .amux = LINE1,
2553 },{
2554 .name = "S-Video 1",
2555 .vmux = 9,
2556 .amux = LINE2,
2557 }},
2558 },
2559 [SAA7134_BOARD_FLYTVPLATINUM_MINI2] = {
2560 .name = "LifeView FlyTV Platinum Mini2",
2561 .audio_clock = 0x00200000,
2562 .tuner_type = TUNER_PHILIPS_TDA8290,
2563 .radio_type = UNSET,
2564 .tuner_addr = ADDR_UNSET,
2565 .radio_addr = ADDR_UNSET,
2566
2567 .inputs = {{
2568 .name = name_tv,
2569 .vmux = 1,
2570 .amux = TV,
2571 .tv = 1,
2572 },{
2573 .name = name_comp1, /* Composite signal on S-Video input */
2574 .vmux = 0,
2575 .amux = LINE2,
2576 },{
2577 .name = name_comp2, /* Composite input */
2578 .vmux = 3,
2579 .amux = LINE2,
2580 },{
2581 .name = name_svideo,
2582 .vmux = 8,
2583 .amux = LINE2,
2584 }},
2585 },
2586 [SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180] = {
2587 /* Michael Krufky <mkrufky@m1k.net>
2588 * Uses Alps Electric TDHU2, containing NXT2004 ATSC Decoder
2589 * AFAIK, there is no analog demod, thus,
2590 * no support for analog television.
2591 */
2592 .name = "AVerMedia AVerTVHD MCE A180",
2593 .audio_clock = 0x00187de7,
2594 .tuner_type = TUNER_ABSENT,
2595 .radio_type = UNSET,
2596 .tuner_addr = ADDR_UNSET,
2597 .radio_addr = ADDR_UNSET,
2598 .mpeg = SAA7134_MPEG_DVB,
2599 .inputs = {{
2600 .name = name_comp1,
2601 .vmux = 3,
2602 .amux = LINE2,
2603 },{
2604 .name = name_svideo,
2605 .vmux = 8,
2606 .amux = LINE2,
2607 }},
2608 },
2609 [SAA7134_BOARD_MONSTERTV_MOBILE] = {
2610 .name = "SKNet MonsterTV Mobile",
2611 .audio_clock = 0x00187de7,
2612 .tuner_type = TUNER_PHILIPS_TDA8290,
2613 .radio_type = UNSET,
2614 .tuner_addr = ADDR_UNSET,
2615 .radio_addr = ADDR_UNSET,
2616
2617 .inputs = {{
2618 .name = name_tv,
2619 .vmux = 1,
2620 .amux = TV,
2621 .tv = 1,
2622 },{
2623 .name = name_comp1,
2624 .vmux = 3,
2625 .amux = LINE1,
2626 },{
2627 .name = name_svideo,
2628 .vmux = 6,
2629 .amux = LINE1,
2630 }},
2631 },
2632 [SAA7134_BOARD_PINNACLE_PCTV_110i] = {
2633 .name = "Pinnacle PCTV 40i/50i/110i (saa7133)",
2634 .audio_clock = 0x00187de7,
2635 .tuner_type = TUNER_PHILIPS_TDA8290,
2636 .radio_type = UNSET,
2637 .tuner_addr = ADDR_UNSET,
2638 .radio_addr = ADDR_UNSET,
2639 .gpiomask = 0x080200000,
2640 .inputs = { {
2641 .name = name_tv,
2642 .vmux = 4,
2643 .amux = TV,
2644 .tv = 1,
2645 }, {
2646 .name = name_comp1,
2647 .vmux = 1,
2648 .amux = LINE2,
2649 }, {
2650 .name = name_comp2,
2651 .vmux = 0,
2652 .amux = LINE2,
2653 }, {
2654 .name = name_svideo,
2655 .vmux = 8,
2656 .amux = LINE2,
2657 } },
2658 .radio = {
2659 .name = name_radio,
2660 .amux = TV,
2661 .gpio = 0x0200000,
2662 },
2663 },
2664 [SAA7134_BOARD_ASUSTeK_P7131_DUAL] = {
2665 .name = "ASUSTeK P7131 Dual",
2666 .audio_clock = 0x00187de7,
2667 .tuner_type = TUNER_PHILIPS_TDA8290,
2668 .radio_type = UNSET,
2669 .tuner_addr = ADDR_UNSET,
2670 .radio_addr = ADDR_UNSET,
2671 .gpiomask = 1 << 21,
2672 .mpeg = SAA7134_MPEG_DVB,
2673 .inputs = {{
2674 .name = name_tv,
2675 .vmux = 1,
2676 .amux = TV,
2677 .tv = 1,
2678 .gpio = 0x0000000,
2679 },{
2680 .name = name_comp1,
2681 .vmux = 3,
2682 .amux = LINE2,
2683 .gpio = 0x0200000,
2684 },{
2685 .name = name_comp2,
2686 .vmux = 0,
2687 .amux = LINE2,
2688 .gpio = 0x0200000,
2689 },{
2690 .name = name_svideo,
2691 .vmux = 8,
2692 .amux = LINE2,
2693 .gpio = 0x0200000,
2694 }},
2695 .radio = {
2696 .name = name_radio,
2697 .amux = TV,
2698 .gpio = 0x0200000,
2699 },
2700 },
2701 [SAA7134_BOARD_SEDNA_PC_TV_CARDBUS] = {
2702 /* Paul Tom Zalac <pzalac@gmail.com> */
2703 /* Pavel Mihaylov <bin@bash.info> */
2704 .name = "Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)",
2705 /* Sedna/MuchTV (OEM) Cardbus TV Tuner */
2706 .audio_clock = 0x00187de7,
2707 .tuner_type = TUNER_PHILIPS_TDA8290,
2708 .radio_type = UNSET,
2709 .tuner_addr = ADDR_UNSET,
2710 .radio_addr = ADDR_UNSET,
2711 .gpiomask = 0xe880c0,
2712 .inputs = {{
2713 .name = name_tv,
2714 .vmux = 3,
2715 .amux = TV,
2716 .tv = 1,
2717 },{
2718 .name = name_comp1,
2719 .vmux = 1,
2720 .amux = LINE1,
2721 },{
2722 .name = name_svideo,
2723 .vmux = 6,
2724 .amux = LINE1,
2725 }},
2726 .radio = {
2727 .name = name_radio,
2728 .amux = LINE2,
2729 },
2730 },
2731 [SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV] = {
2732 /* "Cyril Lacoux (Yack)" <clacoux@ifeelgood.org> */
2733 .name = "ASUS Digimatrix TV",
2734 .audio_clock = 0x00200000,
2735 .tuner_type = TUNER_PHILIPS_FQ1216ME,
2736 .tda9887_conf = TDA9887_PRESENT,
2737 .radio_type = UNSET,
2738 .tuner_addr = ADDR_UNSET,
2739 .radio_addr = ADDR_UNSET,
2740 .inputs = {{
2741 .name = name_tv,
2742 .vmux = 1,
2743 .amux = TV,
2744 .tv = 1,
2745 },{
2746 .name = name_comp1,
2747 .vmux = 3,
2748 .amux = LINE1,
2749 },{
2750 .name = name_svideo,
2751 .vmux = 8,
2752 .amux = LINE1,
2753 }},
2754 },
2755 [SAA7134_BOARD_PHILIPS_TIGER] = {
2756 .name = "Philips Tiger reference design",
2757 .audio_clock = 0x00187de7,
2758 .tuner_type = TUNER_PHILIPS_TDA8290,
2759 .radio_type = UNSET,
2760 .tuner_addr = ADDR_UNSET,
2761 .radio_addr = ADDR_UNSET,
2762 .tuner_config = 0,
2763 .mpeg = SAA7134_MPEG_DVB,
2764 .gpiomask = 0x0200000,
2765 .inputs = {{
2766 .name = name_tv,
2767 .vmux = 1,
2768 .amux = TV,
2769 .tv = 1,
2770 },{
2771 .name = name_comp1,
2772 .vmux = 3,
2773 .amux = LINE1,
2774 },{
2775 .name = name_svideo,
2776 .vmux = 8,
2777 .amux = LINE1,
2778 }},
2779 .radio = {
2780 .name = name_radio,
2781 .amux = TV,
2782 .gpio = 0x0200000,
2783 },
2784 },
2785 [SAA7134_BOARD_MSI_TVATANYWHERE_PLUS] = {
2786 .name = "MSI TV@Anywhere plus",
2787 .audio_clock = 0x00187de7,
2788 .tuner_type = TUNER_PHILIPS_TDA8290,
2789 .radio_type = UNSET,
2790 .tuner_addr = ADDR_UNSET,
2791 .radio_addr = ADDR_UNSET,
2792 .gpiomask = 1 << 21,
2793 .inputs = {{
2794 .name = name_tv,
2795 .vmux = 1,
2796 .amux = TV,
2797 .tv = 1,
2798 },{
2799 .name = name_comp1,
2800 .vmux = 3,
2801 .amux = LINE2, /* unconfirmed, taken from Philips driver */
2802 },{
2803 .name = name_comp2,
2804 .vmux = 0, /* untested, Composite over S-Video */
2805 .amux = LINE2,
2806 },{
2807 .name = name_svideo,
2808 .vmux = 8,
2809 .amux = LINE2,
2810 }},
2811 .radio = {
2812 .name = name_radio,
2813 .amux = TV,
2814 .gpio = 0x0200000,
2815 },
2816 },
2817 [SAA7134_BOARD_CINERGY250PCI] = {
2818 /* remote-control does not work. The signal about a
2819 key press comes in via gpio, but the key code
2820 doesn't. Neither does it have an i2c remote control
2821 interface. */
2822 .name = "Terratec Cinergy 250 PCI TV",
2823 .audio_clock = 0x00187de7,
2824 .tuner_type = TUNER_PHILIPS_TDA8290,
2825 .radio_type = UNSET,
2826 .tuner_addr = ADDR_UNSET,
2827 .radio_addr = ADDR_UNSET,
2828 .gpiomask = 0x80200000,
2829 .inputs = {{
2830 .name = name_tv,
2831 .vmux = 1,
2832 .amux = TV,
2833 .tv = 1,
2834 },{
2835 .name = name_svideo, /* NOT tested */
2836 .vmux = 8,
2837 .amux = LINE1,
2838 }},
2839 .radio = {
2840 .name = name_radio,
2841 .amux = TV,
2842 .gpio = 0x0200000,
2843 },
2844 },
2845 [SAA7134_BOARD_FLYDVB_TRIO] = {
2846 /* LifeView LR319 FlyDVB Trio */
2847 /* Peter Missel <peter.missel@onlinehome.de> */
2848 .name = "LifeView FlyDVB Trio",
2849 .audio_clock = 0x00200000,
2850 .tuner_type = TUNER_PHILIPS_TDA8290,
2851 .radio_type = UNSET,
2852 .tuner_addr = ADDR_UNSET,
2853 .radio_addr = ADDR_UNSET,
2854 .gpiomask = 0x00200000,
2855 .mpeg = SAA7134_MPEG_DVB,
2856 .inputs = {{
2857 .name = name_tv, /* Analog broadcast/cable TV */
2858 .vmux = 1,
2859 .amux = TV,
2860 .gpio = 0x200000, /* GPIO21=High for TV input */
2861 .tv = 1,
2862 },{
2863 .name = name_svideo, /* S-Video signal on S-Video input */
2864 .vmux = 8,
2865 .amux = LINE2,
2866 },{
2867 .name = name_comp1, /* Composite signal on S-Video input */
2868 .vmux = 0,
2869 .amux = LINE2,
2870 },{
2871 .name = name_comp2, /* Composite input */
2872 .vmux = 3,
2873 .amux = LINE2,
2874 }},
2875 .radio = {
2876 .name = name_radio,
2877 .amux = TV,
2878 .gpio = 0x000000, /* GPIO21=Low for FM radio antenna */
2879 },
2880 },
2881 [SAA7134_BOARD_AVERMEDIA_777] = {
2882 .name = "AverTV DVB-T 777",
2883 .audio_clock = 0x00187de7,
2884 .tuner_type = TUNER_ABSENT,
2885 .radio_type = UNSET,
2886 .tuner_addr = ADDR_UNSET,
2887 .radio_addr = ADDR_UNSET,
2888 .mpeg = SAA7134_MPEG_DVB,
2889 .inputs = {{
2890 .name = name_comp1,
2891 .vmux = 1,
2892 .amux = LINE1,
2893 },{
2894 .name = name_svideo,
2895 .vmux = 8,
2896 .amux = LINE1,
2897 }},
2898 },
2899 [SAA7134_BOARD_FLYDVBT_LR301] = {
2900 /* LifeView FlyDVB-T */
2901 /* Giampiero Giancipoli <gianci@libero.it> */
2902 .name = "LifeView FlyDVB-T / Genius VideoWonder DVB-T",
2903 .audio_clock = 0x00200000,
2904 .tuner_type = TUNER_ABSENT,
2905 .radio_type = UNSET,
2906 .tuner_addr = ADDR_UNSET,
2907 .radio_addr = ADDR_UNSET,
2908 .mpeg = SAA7134_MPEG_DVB,
2909 .inputs = {{
2910 .name = name_comp1, /* Composite input */
2911 .vmux = 3,
2912 .amux = LINE2,
2913 },{
2914 .name = name_svideo, /* S-Video signal on S-Video input */
2915 .vmux = 8,
2916 .amux = LINE2,
2917 }},
2918 },
2919 [SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331] = {
2920 .name = "ADS Instant TV Duo Cardbus PTV331",
2921 .audio_clock = 0x00200000,
2922 .tuner_type = TUNER_PHILIPS_TDA8290,
2923 .radio_type = UNSET,
2924 .tuner_addr = ADDR_UNSET,
2925 .radio_addr = ADDR_UNSET,
2926 .mpeg = SAA7134_MPEG_DVB,
2927 .gpiomask = 0x00600000, /* Bit 21 0=Radio, Bit 22 0=TV */
2928 .inputs = {{
2929 .name = name_tv,
2930 .vmux = 1,
2931 .amux = TV,
2932 .tv = 1,
2933 .gpio = 0x00200000,
2934 }},
2935 },
2936 [SAA7134_BOARD_TEVION_DVBT_220RF] = {
2937 .name = "Tevion/KWorld DVB-T 220RF",
2938 .audio_clock = 0x00187de7,
2939 .tuner_type = TUNER_PHILIPS_TDA8290,
2940 .radio_type = UNSET,
2941 .tuner_addr = ADDR_UNSET,
2942 .radio_addr = ADDR_UNSET,
2943 .mpeg = SAA7134_MPEG_DVB,
2944 .gpiomask = 1 << 21,
2945 .inputs = {{
2946 .name = name_tv,
2947 .vmux = 1,
2948 .amux = TV,
2949 .tv = 1,
2950 },{
2951 .name = name_comp1,
2952 .vmux = 3,
2953 .amux = LINE1,
2954 },{
2955 .name = name_comp2,
2956 .vmux = 0,
2957 .amux = LINE1,
2958 },{
2959 .name = name_svideo,
2960 .vmux = 8,
2961 .amux = LINE1,
2962 }},
2963 .radio = {
2964 .name = name_radio,
2965 .amux = TV,
2966 .gpio = 0x0200000,
2967 },
2968 },
2969 [SAA7134_BOARD_KWORLD_DVBT_210] = {
2970 .name = "KWorld DVB-T 210",
2971 .audio_clock = 0x00187de7,
2972 .tuner_type = TUNER_PHILIPS_TDA8290,
2973 .radio_type = UNSET,
2974 .tuner_addr = ADDR_UNSET,
2975 .radio_addr = ADDR_UNSET,
2976 .mpeg = SAA7134_MPEG_DVB,
2977 .gpiomask = 1 << 21,
2978 .inputs = {{
2979 .name = name_tv,
2980 .vmux = 1,
2981 .amux = TV,
2982 .tv = 1,
2983 },{
2984 .name = name_comp1,
2985 .vmux = 3,
2986 .amux = LINE1,
2987 },{
2988 .name = name_svideo,
2989 .vmux = 8,
2990 .amux = LINE1,
2991 }},
2992 .radio = {
2993 .name = name_radio,
2994 .amux = TV,
2995 .gpio = 0x0200000,
2996 },
2997 },
2998 [SAA7134_BOARD_KWORLD_ATSC110] = {
2999 .name = "Kworld ATSC110/115",
3000 .audio_clock = 0x00187de7,
3001 .tuner_type = TUNER_PHILIPS_TUV1236D,
3002 .radio_type = UNSET,
3003 .tuner_addr = ADDR_UNSET,
3004 .radio_addr = ADDR_UNSET,
3005 .tda9887_conf = TDA9887_PRESENT,
3006 .mpeg = SAA7134_MPEG_DVB,
3007 .inputs = {{
3008 .name = name_tv,
3009 .vmux = 1,
3010 .amux = TV,
3011 .tv = 1,
3012 },{
3013 .name = name_comp1,
3014 .vmux = 3,
3015 .amux = LINE2,
3016 },{
3017 .name = name_svideo,
3018 .vmux = 8,
3019 .amux = LINE2,
3020 }},
3021 },
3022 [SAA7134_BOARD_AVERMEDIA_A169_B] = {
3023 /* AVerMedia A169 */
3024 /* Rickard Osser <ricky@osser.se> */
3025 /* This card has two saa7134 chips on it,
3026 but only one of them is currently working. */
3027 .name = "AVerMedia A169 B",
3028 .audio_clock = 0x02187de7,
3029 .tuner_type = TUNER_LG_TALN,
3030 .radio_type = UNSET,
3031 .tuner_addr = ADDR_UNSET,
3032 .radio_addr = ADDR_UNSET,
3033 .tda9887_conf = TDA9887_PRESENT,
3034 .gpiomask = 0x0a60000,
3035 },
3036 [SAA7134_BOARD_AVERMEDIA_A169_B1] = {
3037 /* AVerMedia A169 */
3038 /* Rickard Osser <ricky@osser.se> */
3039 .name = "AVerMedia A169 B1",
3040 .audio_clock = 0x02187de7,
3041 .tuner_type = TUNER_LG_TALN,
3042 .radio_type = UNSET,
3043 .tuner_addr = ADDR_UNSET,
3044 .radio_addr = ADDR_UNSET,
3045 .tda9887_conf = TDA9887_PRESENT,
3046 .gpiomask = 0xca60000,
3047 .inputs = {{
3048 .name = name_tv,
3049 .vmux = 4,
3050 .amux = TV,
3051 .tv = 1,
3052 .gpio = 0x04a61000,
3053 },{
3054 .name = name_comp2, /* Composite SVIDEO (B/W if signal is carried with SVIDEO) */
3055 .vmux = 1,
3056 .amux = LINE2,
3057 },{
3058 .name = name_svideo,
3059 .vmux = 9, /* 9 is correct as S-VIDEO1 according to a169.inf! */
3060 .amux = LINE1,
3061 }},
3062 },
3063 [SAA7134_BOARD_MD7134_BRIDGE_2] = {
3064 /* The second saa7134 on this card only serves as DVB-S host bridge */
3065 .name = "Medion 7134 Bridge #2",
3066 .audio_clock = 0x00187de7,
3067 .radio_type = UNSET,
3068 .tuner_addr = ADDR_UNSET,
3069 .radio_addr = ADDR_UNSET,
3070 .mpeg = SAA7134_MPEG_DVB,
3071 },
3072 [SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS] = {
3073 .name = "LifeView FlyDVB-T Hybrid Cardbus/MSI TV @nywhere A/D NB",
3074 .audio_clock = 0x00200000,
3075 .tuner_type = TUNER_PHILIPS_TDA8290,
3076 .radio_type = UNSET,
3077 .tuner_addr = ADDR_UNSET,
3078 .radio_addr = ADDR_UNSET,
3079 .mpeg = SAA7134_MPEG_DVB,
3080 .gpiomask = 0x00600000, /* Bit 21 0=Radio, Bit 22 0=TV */
3081 .inputs = {{
3082 .name = name_tv,
3083 .vmux = 1,
3084 .amux = TV,
3085 .gpio = 0x200000, /* GPIO21=High for TV input */
3086 .tv = 1,
3087 },{
3088 .name = name_svideo, /* S-Video signal on S-Video input */
3089 .vmux = 8,
3090 .amux = LINE2,
3091 },{
3092 .name = name_comp1, /* Composite signal on S-Video input */
3093 .vmux = 0,
3094 .amux = LINE2,
3095 },{
3096 .name = name_comp2, /* Composite input */
3097 .vmux = 3,
3098 .amux = LINE2,
3099 }},
3100 .radio = {
3101 .name = name_radio,
3102 .amux = TV,
3103 .gpio = 0x000000, /* GPIO21=Low for FM radio antenna */
3104 },
3105 },
3106 [SAA7134_BOARD_FLYVIDEO3000_NTSC] = {
3107 /* "Zac Bowling" <zac@zacbowling.com> */
3108 .name = "LifeView FlyVIDEO3000 (NTSC)",
3109 .audio_clock = 0x00200000,
3110 .tuner_type = TUNER_PHILIPS_NTSC,
3111 .radio_type = UNSET,
3112 .tuner_addr = ADDR_UNSET,
3113 .radio_addr = ADDR_UNSET,
3114
3115 .gpiomask = 0xe000,
3116 .inputs = {{
3117 .name = name_tv,
3118 .vmux = 1,
3119 .amux = TV,
3120 .gpio = 0x8000,
3121 .tv = 1,
3122 },{
3123 .name = name_tv_mono,
3124 .vmux = 1,
3125 .amux = LINE2,
3126 .gpio = 0x0000,
3127 .tv = 1,
3128 },{
3129 .name = name_comp1,
3130 .vmux = 0,
3131 .amux = LINE2,
3132 .gpio = 0x4000,
3133 },{
3134 .name = name_comp2,
3135 .vmux = 3,
3136 .amux = LINE2,
3137 .gpio = 0x4000,
3138 },{
3139 .name = name_svideo,
3140 .vmux = 8,
3141 .amux = LINE2,
3142 .gpio = 0x4000,
3143 }},
3144 .radio = {
3145 .name = name_radio,
3146 .amux = LINE2,
3147 .gpio = 0x2000,
3148 },
3149 .mute = {
3150 .name = name_mute,
3151 .amux = TV,
3152 .gpio = 0x8000,
3153 },
3154 },
3155 [SAA7134_BOARD_MEDION_MD8800_QUADRO] = {
3156 .name = "Medion Md8800 Quadro",
3157 .audio_clock = 0x00187de7,
3158 .tuner_type = TUNER_PHILIPS_TDA8290,
3159 .radio_type = UNSET,
3160 .tuner_addr = ADDR_UNSET,
3161 .radio_addr = ADDR_UNSET,
3162 .mpeg = SAA7134_MPEG_DVB,
3163 .inputs = {{
3164 .name = name_tv,
3165 .vmux = 1,
3166 .amux = TV,
3167 .tv = 1,
3168 },{
3169 .name = name_comp1,
3170 .vmux = 0,
3171 .amux = LINE1,
3172 },{
3173 .name = name_svideo,
3174 .vmux = 8,
3175 .amux = LINE1,
3176 }},
3177 },
3178 [SAA7134_BOARD_FLYDVBS_LR300] = {
3179 /* LifeView FlyDVB-s */
3180 /* Igor M. Liplianin <liplianin@tut.by> */
3181 .name = "LifeView FlyDVB-S /Acorp TV134DS",
3182 .audio_clock = 0x00200000,
3183 .tuner_type = TUNER_ABSENT,
3184 .radio_type = UNSET,
3185 .tuner_addr = ADDR_UNSET,
3186 .radio_addr = ADDR_UNSET,
3187 .mpeg = SAA7134_MPEG_DVB,
3188 .inputs = {{
3189 .name = name_comp1, /* Composite input */
3190 .vmux = 3,
3191 .amux = LINE1,
3192 },{
3193 .name = name_svideo, /* S-Video signal on S-Video input */
3194 .vmux = 8,
3195 .amux = LINE1,
3196 }},
3197 },
3198 [SAA7134_BOARD_PROTEUS_2309] = {
3199 .name = "Proteus Pro 2309",
3200 .audio_clock = 0x00187de7,
3201 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
3202 .radio_type = UNSET,
3203 .tuner_addr = ADDR_UNSET,
3204 .radio_addr = ADDR_UNSET,
3205 .tda9887_conf = TDA9887_PRESENT,
3206 .inputs = {{
3207 .name = name_tv,
3208 .vmux = 1,
3209 .amux = LINE2,
3210 .tv = 1,
3211 },{
3212 .name = name_comp1,
3213 .vmux = 0,
3214 .amux = LINE2,
3215 },{
3216 .name = name_comp2,
3217 .vmux = 3,
3218 .amux = LINE2,
3219 },{
3220 .name = name_svideo,
3221 .vmux = 8,
3222 .amux = LINE2,
3223 }},
3224 .mute = {
3225 .name = name_mute,
3226 .amux = LINE1,
3227 },
3228 },
3229 [SAA7134_BOARD_AVERMEDIA_A16AR] = {
3230 /* Petr Baudis <pasky@ucw.cz> */
3231 .name = "AVerMedia TV Hybrid A16AR",
3232 .audio_clock = 0x187de7,
3233 .tuner_type = TUNER_PHILIPS_TD1316, /* untested */
3234 .radio_type = TUNER_TEA5767, /* untested */
3235 .tuner_addr = ADDR_UNSET,
3236 .radio_addr = 0x60,
3237 .tda9887_conf = TDA9887_PRESENT,
3238 .mpeg = SAA7134_MPEG_DVB,
3239 .inputs = {{
3240 .name = name_tv,
3241 .vmux = 1,
3242 .amux = TV,
3243 .tv = 1,
3244 },{
3245 .name = name_comp1,
3246 .vmux = 3,
3247 .amux = LINE2,
3248 },{
3249 .name = name_svideo,
3250 .vmux = 8,
3251 .amux = LINE1,
3252 }},
3253 .radio = {
3254 .name = name_radio,
3255 .amux = LINE1,
3256 },
3257 },
3258 [SAA7134_BOARD_ASUS_EUROPA2_HYBRID] = {
3259 .name = "Asus Europa2 OEM",
3260 .audio_clock = 0x00187de7,
3261 .tuner_type = TUNER_PHILIPS_FMD1216ME_MK3,
3262 .radio_type = UNSET,
3263 .tuner_addr = ADDR_UNSET,
3264 .radio_addr = ADDR_UNSET,
3265 .tda9887_conf = TDA9887_PRESENT| TDA9887_PORT1_ACTIVE | TDA9887_PORT2_ACTIVE,
3266 .mpeg = SAA7134_MPEG_DVB,
3267 .inputs = {{
3268 .name = name_tv,
3269 .vmux = 3,
3270 .amux = TV,
3271 .tv = 1,
3272 },{
3273 .name = name_comp1,
3274 .vmux = 4,
3275 .amux = LINE2,
3276 },{
3277 .name = name_svideo,
3278 .vmux = 8,
3279 .amux = LINE2,
3280 }},
3281 .radio = {
3282 .name = name_radio,
3283 .amux = LINE1,
3284 },
3285 },
3286 [SAA7134_BOARD_PINNACLE_PCTV_310i] = {
3287 .name = "Pinnacle PCTV 310i",
3288 .audio_clock = 0x00187de7,
3289 .tuner_type = TUNER_PHILIPS_TDA8290,
3290 .radio_type = UNSET,
3291 .tuner_addr = ADDR_UNSET,
3292 .radio_addr = ADDR_UNSET,
3293 .tuner_config = 1,
3294 .mpeg = SAA7134_MPEG_DVB,
3295 .gpiomask = 0x000200000,
3296 .inputs = {{
3297 .name = name_tv,
3298 .vmux = 4,
3299 .amux = TV,
3300 .tv = 1,
3301 },{
3302 .name = name_comp1,
3303 .vmux = 1,
3304 .amux = LINE2,
3305 },{
3306 .name = name_comp2,
3307 .vmux = 0,
3308 .amux = LINE2,
3309 },{
3310 .name = name_svideo,
3311 .vmux = 8,
3312 .amux = LINE2,
3313 }},
3314 .radio = {
3315 .name = name_radio,
3316 .amux = TV,
3317 .gpio = 0x0200000,
3318 },
3319 },
3320 [SAA7134_BOARD_AVERMEDIA_STUDIO_507] = {
3321 /* Mikhail Fedotov <mo_fedotov@mail.ru> */
3322 .name = "Avermedia AVerTV Studio 507",
3323 .audio_clock = 0x00187de7,
3324 .tuner_type = TUNER_PHILIPS_FM1256_IH3,
3325 .radio_type = UNSET,
3326 .tuner_addr = ADDR_UNSET,
3327 .radio_addr = ADDR_UNSET,
3328 .tda9887_conf = TDA9887_PRESENT,
3329 .gpiomask = 0x03,
3330 .inputs = {{
3331 .name = name_tv,
3332 .vmux = 1,
3333 .amux = TV,
3334 .tv = 1,
3335 .gpio = 0x00,
3336 },{
3337 .name = name_comp1,
3338 .vmux = 0,
3339 .amux = LINE2,
3340 .gpio = 0x00,
3341 },{
3342 .name = name_comp2,
3343 .vmux = 3,
3344 .amux = LINE2,
3345 .gpio = 0x00,
3346 },{
3347 .name = name_svideo,
3348 .vmux = 8,
3349 .amux = LINE2,
3350 .gpio = 0x00,
3351 }},
3352 .radio = {
3353 .name = name_radio,
3354 .amux = LINE2,
3355 .gpio = 0x01,
3356 },
3357 .mute = {
3358 .name = name_mute,
3359 .amux = LINE1,
3360 .gpio = 0x00,
3361 },
3362 },
3363 [SAA7134_BOARD_VIDEOMATE_DVBT_200A] = {
3364 /* Francis Barber <fedora@barber-family.id.au> */
3365 .name = "Compro Videomate DVB-T200A",
3366 .audio_clock = 0x00187de7,
3367 .tuner_type = TUNER_ABSENT,
3368 .radio_type = UNSET,
3369 .tuner_addr = ADDR_UNSET,
3370 .radio_addr = ADDR_UNSET,
3371 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE,
3372 .mpeg = SAA7134_MPEG_DVB,
3373 .inputs = {{
3374 .name = name_tv,
3375 .vmux = 3,
3376 .amux = TV,
3377 .tv = 1,
3378 },{
3379 .name = name_comp1,
3380 .vmux = 1,
3381 .amux = LINE2,
3382 },{
3383 .name = name_svideo,
3384 .vmux = 8,
3385 .amux = LINE2,
3386 }},
3387 },
3388 [SAA7134_BOARD_HAUPPAUGE_HVR1110] = {
3389 /* Thomas Genty <tomlohave@gmail.com> */
3390 /* David Bentham <db260179@hotmail.com> */
3391 .name = "Hauppauge WinTV-HVR1110 DVB-T/Hybrid",
3392 .audio_clock = 0x00187de7,
3393 .tuner_type = TUNER_PHILIPS_TDA8290,
3394 .radio_type = UNSET,
3395 .tuner_addr = ADDR_UNSET,
3396 .radio_addr = ADDR_UNSET,
3397 .tuner_config = 1,
3398 .mpeg = SAA7134_MPEG_DVB,
3399 .gpiomask = 0x0200100,
3400 .inputs = {{
3401 .name = name_tv,
3402 .vmux = 1,
3403 .amux = TV,
3404 .tv = 1,
3405 .gpio = 0x0000100,
3406 }, {
3407 .name = name_comp1,
3408 .vmux = 3,
3409 .amux = LINE1,
3410 }, {
3411 .name = name_svideo,
3412 .vmux = 8,
3413 .amux = LINE1,
3414 } },
3415 .radio = {
3416 .name = name_radio,
3417 .amux = TV,
3418 .gpio = 0x0200100,
3419 },
3420 },
3421 [SAA7134_BOARD_HAUPPAUGE_HVR1150] = {
3422 .name = "Hauppauge WinTV-HVR1150 ATSC/QAM-Hybrid",
3423 .audio_clock = 0x00187de7,
3424 .tuner_type = TUNER_PHILIPS_TDA8290,
3425 .radio_type = UNSET,
3426 .tuner_addr = ADDR_UNSET,
3427 .radio_addr = ADDR_UNSET,
3428 .tuner_config = 3,
3429 .mpeg = SAA7134_MPEG_DVB,
3430 .ts_type = SAA7134_MPEG_TS_SERIAL,
3431 .ts_force_val = 1,
3432 .gpiomask = 0x0800100, /* GPIO 21 is an INPUT */
3433 .inputs = {{
3434 .name = name_tv,
3435 .vmux = 1,
3436 .amux = TV,
3437 .tv = 1,
3438 .gpio = 0x0000100,
3439 }, {
3440 .name = name_comp1,
3441 .vmux = 3,
3442 .amux = LINE1,
3443 }, {
3444 .name = name_svideo,
3445 .vmux = 8,
3446 .amux = LINE1,
3447 } },
3448 .radio = {
3449 .name = name_radio,
3450 .amux = TV,
3451 .gpio = 0x0800100, /* GPIO 23 HI for FM */
3452 },
3453 },
3454 [SAA7134_BOARD_HAUPPAUGE_HVR1120] = {
3455 .name = "Hauppauge WinTV-HVR1120 DVB-T/Hybrid",
3456 .audio_clock = 0x00187de7,
3457 .tuner_type = TUNER_PHILIPS_TDA8290,
3458 .radio_type = UNSET,
3459 .tuner_addr = ADDR_UNSET,
3460 .radio_addr = ADDR_UNSET,
3461 .tuner_config = 3,
3462 .mpeg = SAA7134_MPEG_DVB,
3463 .ts_type = SAA7134_MPEG_TS_SERIAL,
3464 .gpiomask = 0x0800100, /* GPIO 21 is an INPUT */
3465 .inputs = {{
3466 .name = name_tv,
3467 .vmux = 1,
3468 .amux = TV,
3469 .tv = 1,
3470 .gpio = 0x0000100,
3471 }, {
3472 .name = name_comp1,
3473 .vmux = 3,
3474 .amux = LINE1,
3475 }, {
3476 .name = name_svideo,
3477 .vmux = 8,
3478 .amux = LINE1,
3479 } },
3480 .radio = {
3481 .name = name_radio,
3482 .amux = TV,
3483 .gpio = 0x0800100, /* GPIO 23 HI for FM */
3484 },
3485 },
3486 [SAA7134_BOARD_CINERGY_HT_PCMCIA] = {
3487 .name = "Terratec Cinergy HT PCMCIA",
3488 .audio_clock = 0x00187de7,
3489 .tuner_type = TUNER_PHILIPS_TDA8290,
3490 .radio_type = UNSET,
3491 .tuner_addr = ADDR_UNSET,
3492 .radio_addr = ADDR_UNSET,
3493 .mpeg = SAA7134_MPEG_DVB,
3494 .inputs = {{
3495 .name = name_tv,
3496 .vmux = 1,
3497 .amux = TV,
3498 .tv = 1,
3499 },{
3500 .name = name_comp1,
3501 .vmux = 0,
3502 .amux = LINE1,
3503 },{
3504 .name = name_svideo,
3505 .vmux = 6,
3506 .amux = LINE1,
3507 }},
3508 },
3509 [SAA7134_BOARD_ENCORE_ENLTV] = {
3510 /* Steven Walter <stevenrwalter@gmail.com>
3511 Juan Pablo Sormani <sorman@gmail.com> */
3512 .name = "Encore ENLTV",
3513 .audio_clock = 0x00200000,
3514 .tuner_type = TUNER_TNF_5335MF,
3515 .radio_type = UNSET,
3516 .tuner_addr = ADDR_UNSET,
3517 .radio_addr = ADDR_UNSET,
3518 .inputs = {{
3519 .name = name_tv,
3520 .vmux = 1,
3521 .amux = 3,
3522 .tv = 1,
3523 },{
3524 .name = name_tv_mono,
3525 .vmux = 7,
3526 .amux = 4,
3527 .tv = 1,
3528 },{
3529 .name = name_comp1,
3530 .vmux = 3,
3531 .amux = 2,
3532 },{
3533 .name = name_svideo,
3534 .vmux = 0,
3535 .amux = 2,
3536 }},
3537 .radio = {
3538 .name = name_radio,
3539 .amux = LINE2,
3540/* .gpio = 0x00300001,*/
3541 .gpio = 0x20000,
3542
3543 },
3544 .mute = {
3545 .name = name_mute,
3546 .amux = 0,
3547 },
3548 },
3549 [SAA7134_BOARD_ENCORE_ENLTV_FM] = {
3550 /* Juan Pablo Sormani <sorman@gmail.com> */
3551 .name = "Encore ENLTV-FM",
3552 .audio_clock = 0x00200000,
3553 .tuner_type = TUNER_PHILIPS_FCV1236D,
3554 .radio_type = UNSET,
3555 .tuner_addr = ADDR_UNSET,
3556 .radio_addr = ADDR_UNSET,
3557 .inputs = {{
3558 .name = name_tv,
3559 .vmux = 1,
3560 .amux = 3,
3561 .tv = 1,
3562 },{
3563 .name = name_tv_mono,
3564 .vmux = 7,
3565 .amux = 4,
3566 .tv = 1,
3567 },{
3568 .name = name_comp1,
3569 .vmux = 3,
3570 .amux = 2,
3571 },{
3572 .name = name_svideo,
3573 .vmux = 0,
3574 .amux = 2,
3575 }},
3576 .radio = {
3577 .name = name_radio,
3578 .amux = LINE2,
3579 .gpio = 0x20000,
3580
3581 },
3582 .mute = {
3583 .name = name_mute,
3584 .amux = 0,
3585 },
3586 },
3587 [SAA7134_BOARD_ENCORE_ENLTV_FM53] = {
3588 .name = "Encore ENLTV-FM v5.3",
3589 .audio_clock = 0x00200000,
3590 .tuner_type = TUNER_TNF_5335MF,
3591 .radio_type = UNSET,
3592 .tuner_addr = ADDR_UNSET,
3593 .radio_addr = ADDR_UNSET,
3594 .gpiomask = 0x7000,
3595 .inputs = { {
3596 .name = name_tv,
3597 .vmux = 1,
3598 .amux = 1,
3599 .tv = 1,
3600 .gpio = 0x50000,
3601 }, {
3602 .name = name_comp1,
3603 .vmux = 3,
3604 .amux = 2,
3605 .gpio = 0x2000,
3606 }, {
3607 .name = name_svideo,
3608 .vmux = 8,
3609 .amux = 2,
3610 .gpio = 0x2000,
3611 } },
3612 .radio = {
3613 .name = name_radio,
3614 .vmux = 1,
3615 .amux = 1,
3616 },
3617 .mute = {
3618 .name = name_mute,
3619 .gpio = 0xf000,
3620 .amux = 0,
3621 },
3622 },
3623 [SAA7134_BOARD_ENCORE_ENLTV_FM3] = {
3624 .name = "Encore ENLTV-FM 3",
3625 .audio_clock = 0x02187de7,
3626 .tuner_type = TUNER_TENA_TNF_5337,
3627 .radio_type = TUNER_TEA5767,
3628 .tuner_addr = 0x61,
3629 .radio_addr = 0x60,
3630 .inputs = { {
3631 .name = name_tv,
3632 .vmux = 1,
3633 .amux = LINE2,
3634 .tv = 1,
3635 }, {
3636 .name = name_comp1,
3637 .vmux = 3,
3638 .amux = LINE1,
3639 }, {
3640 .name = name_svideo,
3641 .vmux = 8,
3642 .amux = LINE1,
3643 } },
3644 .radio = {
3645 .name = name_radio,
3646 .vmux = 1,
3647 .amux = LINE1,
3648 },
3649 .mute = {
3650 .name = name_mute,
3651 .amux = LINE1,
3652 .gpio = 0x43000,
3653 },
3654 },
3655 [SAA7134_BOARD_CINERGY_HT_PCI] = {
3656 .name = "Terratec Cinergy HT PCI",
3657 .audio_clock = 0x00187de7,
3658 .tuner_type = TUNER_PHILIPS_TDA8290,
3659 .radio_type = UNSET,
3660 .tuner_addr = ADDR_UNSET,
3661 .radio_addr = ADDR_UNSET,
3662 .mpeg = SAA7134_MPEG_DVB,
3663 .inputs = {{
3664 .name = name_tv,
3665 .vmux = 1,
3666 .amux = TV,
3667 .tv = 1,
3668 },{
3669 .name = name_comp1,
3670 .vmux = 0,
3671 .amux = LINE1,
3672 },{
3673 .name = name_svideo,
3674 .vmux = 6,
3675 .amux = LINE1,
3676 }},
3677 },
3678 [SAA7134_BOARD_PHILIPS_TIGER_S] = {
3679 .name = "Philips Tiger - S Reference design",
3680 .audio_clock = 0x00187de7,
3681 .tuner_type = TUNER_PHILIPS_TDA8290,
3682 .radio_type = UNSET,
3683 .tuner_addr = ADDR_UNSET,
3684 .radio_addr = ADDR_UNSET,
3685 .tuner_config = 2,
3686 .mpeg = SAA7134_MPEG_DVB,
3687 .gpiomask = 0x0200000,
3688 .inputs = {{
3689 .name = name_tv,
3690 .vmux = 1,
3691 .amux = TV,
3692 .tv = 1,
3693 },{
3694 .name = name_comp1,
3695 .vmux = 3,
3696 .amux = LINE1,
3697 },{
3698 .name = name_svideo,
3699 .vmux = 8,
3700 .amux = LINE1,
3701 }},
3702 .radio = {
3703 .name = name_radio,
3704 .amux = TV,
3705 .gpio = 0x0200000,
3706 },
3707 },
3708 [SAA7134_BOARD_AVERMEDIA_M102] = {
3709 .name = "Avermedia M102",
3710 .audio_clock = 0x00187de7,
3711 .tuner_type = TUNER_PHILIPS_TDA8290,
3712 .radio_type = UNSET,
3713 .tuner_addr = ADDR_UNSET,
3714 .radio_addr = ADDR_UNSET,
3715 .gpiomask = 1<<21,
3716 .inputs = {{
3717 .name = name_tv,
3718 .vmux = 1,
3719 .amux = TV,
3720 .tv = 1,
3721 },{
3722 .name = name_comp1,
3723 .vmux = 0,
3724 .amux = LINE2,
3725 },{
3726 .name = name_svideo,
3727 .vmux = 6,
3728 .amux = LINE2,
3729 }},
3730 },
3731 [SAA7134_BOARD_ASUS_P7131_4871] = {
3732 .name = "ASUS P7131 4871",
3733 .audio_clock = 0x00187de7,
3734 .tuner_type = TUNER_PHILIPS_TDA8290,
3735 .radio_type = UNSET,
3736 .tuner_addr = ADDR_UNSET,
3737 .radio_addr = ADDR_UNSET,
3738 .tuner_config = 2,
3739 .mpeg = SAA7134_MPEG_DVB,
3740 .gpiomask = 0x0200000,
3741 .inputs = {{
3742 .name = name_tv,
3743 .vmux = 1,
3744 .amux = TV,
3745 .tv = 1,
3746 .gpio = 0x0200000,
3747 }},
3748 },
3749 [SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA] = {
3750 .name = "ASUSTeK P7131 Hybrid",
3751 .audio_clock = 0x00187de7,
3752 .tuner_type = TUNER_PHILIPS_TDA8290,
3753 .radio_type = UNSET,
3754 .tuner_addr = ADDR_UNSET,
3755 .radio_addr = ADDR_UNSET,
3756 .tuner_config = 2,
3757 .gpiomask = 1 << 21,
3758 .mpeg = SAA7134_MPEG_DVB,
3759 .inputs = {{
3760 .name = name_tv,
3761 .vmux = 1,
3762 .amux = TV,
3763 .tv = 1,
3764 .gpio = 0x0000000,
3765 },{
3766 .name = name_comp1,
3767 .vmux = 3,
3768 .amux = LINE2,
3769 .gpio = 0x0200000,
3770 },{
3771 .name = name_comp2,
3772 .vmux = 0,
3773 .amux = LINE2,
3774 .gpio = 0x0200000,
3775 },{
3776 .name = name_svideo,
3777 .vmux = 8,
3778 .amux = LINE2,
3779 .gpio = 0x0200000,
3780 }},
3781 .radio = {
3782 .name = name_radio,
3783 .amux = TV,
3784 .gpio = 0x0200000,
3785 },
3786 },
3787 [SAA7134_BOARD_ASUSTeK_P7131_ANALOG] = {
3788 .name = "ASUSTeK P7131 Analog",
3789 .audio_clock = 0x00187de7,
3790 .tuner_type = TUNER_PHILIPS_TDA8290,
3791 .radio_type = UNSET,
3792 .tuner_addr = ADDR_UNSET,
3793 .radio_addr = ADDR_UNSET,
3794 .gpiomask = 1 << 21,
3795 .inputs = {{
3796 .name = name_tv,
3797 .vmux = 1,
3798 .amux = TV,
3799 .tv = 1,
3800 .gpio = 0x0000000,
3801 }, {
3802 .name = name_comp1,
3803 .vmux = 3,
3804 .amux = LINE2,
3805 }, {
3806 .name = name_comp2,
3807 .vmux = 0,
3808 .amux = LINE2,
3809 }, {
3810 .name = name_svideo,
3811 .vmux = 8,
3812 .amux = LINE2,
3813 } },
3814 .radio = {
3815 .name = name_radio,
3816 .amux = TV,
3817 .gpio = 0x0200000,
3818 },
3819 },
3820 [SAA7134_BOARD_SABRENT_TV_PCB05] = {
3821 .name = "Sabrent PCMCIA TV-PCB05",
3822 .audio_clock = 0x00187de7,
3823 .tuner_type = TUNER_PHILIPS_TDA8290,
3824 .radio_type = UNSET,
3825 .tuner_addr = ADDR_UNSET,
3826 .radio_addr = ADDR_UNSET,
3827 .inputs = {{
3828 .name = name_tv,
3829 .vmux = 1,
3830 .amux = TV,
3831 .tv = 1,
3832 },{
3833 .name = name_comp1,
3834 .vmux = 3,
3835 .amux = LINE1,
3836 },{
3837 .name = name_comp2,
3838 .vmux = 0,
3839 .amux = LINE1,
3840 },{
3841 .name = name_svideo,
3842 .vmux = 8,
3843 .amux = LINE1,
3844 }},
3845 .mute = {
3846 .name = name_mute,
3847 .amux = TV,
3848 },
3849 },
3850 [SAA7134_BOARD_10MOONSTVMASTER3] = {
3851 /* Tony Wan <aloha_cn@hotmail.com> */
3852 .name = "10MOONS TM300 TV Card",
3853 .audio_clock = 0x00200000,
3854 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
3855 .radio_type = UNSET,
3856 .tuner_addr = ADDR_UNSET,
3857 .radio_addr = ADDR_UNSET,
3858 .gpiomask = 0x7000,
3859 .inputs = {{
3860 .name = name_tv,
3861 .vmux = 1,
3862 .amux = LINE2,
3863 .gpio = 0x0000,
3864 .tv = 1,
3865 },{
3866 .name = name_comp1,
3867 .vmux = 3,
3868 .amux = LINE1,
3869 .gpio = 0x2000,
3870 },{
3871 .name = name_svideo,
3872 .vmux = 8,
3873 .amux = LINE1,
3874 .gpio = 0x2000,
3875 }},
3876 .mute = {
3877 .name = name_mute,
3878 .amux = LINE2,
3879 .gpio = 0x3000,
3880 },
3881 },
3882 [SAA7134_BOARD_AVERMEDIA_SUPER_007] = {
3883 .name = "Avermedia Super 007",
3884 .audio_clock = 0x00187de7,
3885 .tuner_type = TUNER_PHILIPS_TDA8290,
3886 .radio_type = UNSET,
3887 .tuner_addr = ADDR_UNSET,
3888 .radio_addr = ADDR_UNSET,
3889 .tuner_config = 0,
3890 .mpeg = SAA7134_MPEG_DVB,
3891 .inputs = {{
3892 .name = name_tv, /* FIXME: analog tv untested */
3893 .vmux = 1,
3894 .amux = TV,
3895 .tv = 1,
3896 }},
3897 },
3898 [SAA7134_BOARD_AVERMEDIA_M135A] = {
3899 .name = "Avermedia PCI pure analog (M135A)",
3900 .audio_clock = 0x00187de7,
3901 .tuner_type = TUNER_PHILIPS_TDA8290,
3902 .radio_type = UNSET,
3903 .tuner_addr = ADDR_UNSET,
3904 .radio_addr = ADDR_UNSET,
3905 .tuner_config = 2,
3906 .gpiomask = 0x020200000,
3907 .inputs = {{
3908 .name = name_tv,
3909 .vmux = 1,
3910 .amux = TV,
3911 .tv = 1,
3912 }, {
3913 .name = name_comp1,
3914 .vmux = 3,
3915 .amux = LINE1,
3916 }, {
3917 .name = name_svideo,
3918 .vmux = 8,
3919 .amux = LINE1,
3920 } },
3921 .radio = {
3922 .name = name_radio,
3923 .amux = TV,
3924 .gpio = 0x00200000,
3925 },
3926 .mute = {
3927 .name = name_mute,
3928 .amux = TV,
3929 .gpio = 0x01,
3930 },
3931 },
3932 [SAA7134_BOARD_AVERMEDIA_M733A] = {
3933 .name = "Avermedia PCI M733A",
3934 .audio_clock = 0x00187de7,
3935 .tuner_type = TUNER_PHILIPS_TDA8290,
3936 .radio_type = UNSET,
3937 .tuner_addr = ADDR_UNSET,
3938 .radio_addr = ADDR_UNSET,
3939 .tuner_config = 0,
3940 .gpiomask = 0x020200000,
3941 .inputs = {{
3942 .name = name_tv,
3943 .vmux = 1,
3944 .amux = TV,
3945 .tv = 1,
3946 }, {
3947 .name = name_comp1,
3948 .vmux = 3,
3949 .amux = LINE1,
3950 }, {
3951 .name = name_svideo,
3952 .vmux = 8,
3953 .amux = LINE1,
3954 } },
3955 .radio = {
3956 .name = name_radio,
3957 .amux = TV,
3958 .gpio = 0x00200000,
3959 },
3960 .mute = {
3961 .name = name_mute,
3962 .amux = TV,
3963 .gpio = 0x01,
3964 },
3965 },
3966 [SAA7134_BOARD_BEHOLD_401] = {
3967 /* Beholder Intl. Ltd. 2008 */
3968 /*Dmitry Belimov <d.belimov@gmail.com> */
3969 .name = "Beholder BeholdTV 401",
3970 .audio_clock = 0x00187de7,
3971 .tuner_type = TUNER_PHILIPS_FQ1216ME,
3972 .radio_type = UNSET,
3973 .tuner_addr = ADDR_UNSET,
3974 .radio_addr = ADDR_UNSET,
3975 .gpiomask = 0x00008000,
3976 .inputs = {{
3977 .name = name_svideo,
3978 .vmux = 8,
3979 .amux = LINE1,
3980 },{
3981 .name = name_comp1,
3982 .vmux = 1,
3983 .amux = LINE1,
3984 },{
3985 .name = name_tv,
3986 .vmux = 3,
3987 .amux = LINE2,
3988 .tv = 1,
3989 }},
3990 .mute = {
3991 .name = name_mute,
3992 .amux = LINE1,
3993 },
3994 },
3995 [SAA7134_BOARD_BEHOLD_403] = {
3996 /* Beholder Intl. Ltd. 2008 */
3997 /*Dmitry Belimov <d.belimov@gmail.com> */
3998 .name = "Beholder BeholdTV 403",
3999 .audio_clock = 0x00187de7,
4000 .tuner_type = TUNER_PHILIPS_FQ1216ME,
4001 .radio_type = UNSET,
4002 .tuner_addr = ADDR_UNSET,
4003 .radio_addr = ADDR_UNSET,
4004 .gpiomask = 0x00008000,
4005 .inputs = {{
4006 .name = name_svideo,
4007 .vmux = 8,
4008 .amux = LINE1,
4009 },{
4010 .name = name_comp1,
4011 .vmux = 1,
4012 .amux = LINE1,
4013 },{
4014 .name = name_tv,
4015 .vmux = 3,
4016 .amux = LINE2,
4017 .tv = 1,
4018 }},
4019 },
4020 [SAA7134_BOARD_BEHOLD_403FM] = {
4021 /* Beholder Intl. Ltd. 2008 */
4022 /*Dmitry Belimov <d.belimov@gmail.com> */
4023 .name = "Beholder BeholdTV 403 FM",
4024 .audio_clock = 0x00187de7,
4025 .tuner_type = TUNER_PHILIPS_FQ1216ME,
4026 .radio_type = UNSET,
4027 .tuner_addr = ADDR_UNSET,
4028 .radio_addr = ADDR_UNSET,
4029 .gpiomask = 0x00008000,
4030 .inputs = {{
4031 .name = name_svideo,
4032 .vmux = 8,
4033 .amux = LINE1,
4034 },{
4035 .name = name_comp1,
4036 .vmux = 1,
4037 .amux = LINE1,
4038 },{
4039 .name = name_tv,
4040 .vmux = 3,
4041 .amux = LINE2,
4042 .tv = 1,
4043 }},
4044 .radio = {
4045 .name = name_radio,
4046 .amux = LINE2,
4047 },
4048 },
4049 [SAA7134_BOARD_BEHOLD_405] = {
4050 /* Beholder Intl. Ltd. 2008 */
4051 /*Dmitry Belimov <d.belimov@gmail.com> */
4052 .name = "Beholder BeholdTV 405",
4053 .audio_clock = 0x00187de7,
4054 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4055 .radio_type = UNSET,
4056 .tuner_addr = ADDR_UNSET,
4057 .radio_addr = ADDR_UNSET,
4058 .tda9887_conf = TDA9887_PRESENT,
4059 .gpiomask = 0x00008000,
4060 .inputs = {{
4061 .name = name_svideo,
4062 .vmux = 8,
4063 .amux = LINE1,
4064 },{
4065 .name = name_comp1,
4066 .vmux = 3,
4067 .amux = LINE1,
4068 },{
4069 .name = name_tv,
4070 .vmux = 3,
4071 .amux = LINE2,
4072 .tv = 1,
4073 }},
4074 },
4075 [SAA7134_BOARD_BEHOLD_405FM] = {
4076 /* Sergey <skiv@orel.ru> */
4077 /* Beholder Intl. Ltd. 2008 */
4078 /*Dmitry Belimov <d.belimov@gmail.com> */
4079 .name = "Beholder BeholdTV 405 FM",
4080 .audio_clock = 0x00187de7,
4081 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4082 .radio_type = UNSET,
4083 .tuner_addr = ADDR_UNSET,
4084 .radio_addr = ADDR_UNSET,
4085 .tda9887_conf = TDA9887_PRESENT,
4086 .gpiomask = 0x00008000,
4087 .inputs = {{
4088 .name = name_svideo,
4089 .vmux = 8,
4090 .amux = LINE1,
4091 },{
4092 .name = name_comp1,
4093 .vmux = 3,
4094 .amux = LINE1,
4095 },{
4096 .name = name_tv,
4097 .vmux = 3,
4098 .amux = LINE2,
4099 .tv = 1,
4100 }},
4101 .radio = {
4102 .name = name_radio,
4103 .amux = LINE2,
4104 },
4105 },
4106 [SAA7134_BOARD_BEHOLD_407] = {
4107 /* Beholder Intl. Ltd. 2008 */
4108 /*Dmitry Belimov <d.belimov@gmail.com> */
4109 .name = "Beholder BeholdTV 407",
4110 .audio_clock = 0x00187de7,
4111 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4112 .radio_type = UNSET,
4113 .tuner_addr = ADDR_UNSET,
4114 .radio_addr = ADDR_UNSET,
4115 .tda9887_conf = TDA9887_PRESENT,
4116 .gpiomask = 0x00008000,
4117 .inputs = {{
4118 .name = name_svideo,
4119 .vmux = 8,
4120 .amux = LINE1,
4121 .gpio = 0xc0c000,
4122 },{
4123 .name = name_comp1,
4124 .vmux = 1,
4125 .amux = LINE1,
4126 .gpio = 0xc0c000,
4127 },{
4128 .name = name_tv,
4129 .vmux = 3,
4130 .amux = TV,
4131 .tv = 1,
4132 .gpio = 0xc0c000,
4133 }},
4134 },
4135 [SAA7134_BOARD_BEHOLD_407FM] = {
4136 /* Beholder Intl. Ltd. 2008 */
4137 /*Dmitry Belimov <d.belimov@gmail.com> */
4138 .name = "Beholder BeholdTV 407 FM",
4139 .audio_clock = 0x00187de7,
4140 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4141 .radio_type = UNSET,
4142 .tuner_addr = ADDR_UNSET,
4143 .radio_addr = ADDR_UNSET,
4144 .tda9887_conf = TDA9887_PRESENT,
4145 .gpiomask = 0x00008000,
4146 .inputs = {{
4147 .name = name_svideo,
4148 .vmux = 8,
4149 .amux = LINE1,
4150 .gpio = 0xc0c000,
4151 },{
4152 .name = name_comp1,
4153 .vmux = 1,
4154 .amux = LINE1,
4155 .gpio = 0xc0c000,
4156 },{
4157 .name = name_tv,
4158 .vmux = 3,
4159 .amux = TV,
4160 .tv = 1,
4161 .gpio = 0xc0c000,
4162 }},
4163 .radio = {
4164 .name = name_radio,
4165 .amux = LINE2,
4166 .gpio = 0xc0c000,
4167 },
4168 },
4169 [SAA7134_BOARD_BEHOLD_409] = {
4170 /* Beholder Intl. Ltd. 2008 */
4171 /*Dmitry Belimov <d.belimov@gmail.com> */
4172 .name = "Beholder BeholdTV 409",
4173 .audio_clock = 0x00187de7,
4174 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4175 .radio_type = UNSET,
4176 .tuner_addr = ADDR_UNSET,
4177 .radio_addr = ADDR_UNSET,
4178 .tda9887_conf = TDA9887_PRESENT,
4179 .gpiomask = 0x00008000,
4180 .inputs = {{
4181 .name = name_tv,
4182 .vmux = 3,
4183 .amux = TV,
4184 .tv = 1,
4185 },{
4186 .name = name_comp1,
4187 .vmux = 1,
4188 .amux = LINE1,
4189 },{
4190 .name = name_svideo,
4191 .vmux = 8,
4192 .amux = LINE1,
4193 }},
4194 },
4195 [SAA7134_BOARD_BEHOLD_505FM] = {
4196 /* Beholder Intl. Ltd. 2008 */
4197 /*Dmitry Belimov <d.belimov@gmail.com> */
4198 .name = "Beholder BeholdTV 505 FM",
4199 .audio_clock = 0x00200000,
4200 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4201 .radio_type = UNSET,
4202 .tuner_addr = ADDR_UNSET,
4203 .radio_addr = ADDR_UNSET,
4204 .tda9887_conf = TDA9887_PRESENT,
4205 .gpiomask = 0x00008000,
4206 .inputs = {{
4207 .name = name_tv,
4208 .vmux = 3,
4209 .amux = LINE2,
4210 .tv = 1,
4211 }, {
4212 .name = name_comp1,
4213 .vmux = 1,
4214 .amux = LINE1,
4215 }, {
4216 .name = name_svideo,
4217 .vmux = 8,
4218 .amux = LINE1,
4219 } },
4220 .mute = {
4221 .name = name_mute,
4222 .amux = LINE1,
4223 },
4224 .radio = {
4225 .name = name_radio,
4226 .amux = LINE2,
4227 },
4228 },
4229 [SAA7134_BOARD_BEHOLD_505RDS_MK5] = {
4230 /* Beholder Intl. Ltd. 2008 */
4231 /*Dmitry Belimov <d.belimov@gmail.com> */
4232 .name = "Beholder BeholdTV 505 RDS",
4233 .audio_clock = 0x00200000,
4234 .tuner_type = TUNER_PHILIPS_FM1216MK5,
4235 .radio_type = UNSET,
4236 .tuner_addr = ADDR_UNSET,
4237 .radio_addr = ADDR_UNSET,
4238 .rds_addr = 0x10,
4239 .tda9887_conf = TDA9887_PRESENT,
4240 .gpiomask = 0x00008000,
4241 .inputs = {{
4242 .name = name_tv,
4243 .vmux = 3,
4244 .amux = LINE2,
4245 .tv = 1,
4246 },{
4247 .name = name_comp1,
4248 .vmux = 1,
4249 .amux = LINE1,
4250 },{
4251 .name = name_svideo,
4252 .vmux = 8,
4253 .amux = LINE1,
4254 }},
4255 .mute = {
4256 .name = name_mute,
4257 .amux = LINE1,
4258 },
4259 .radio = {
4260 .name = name_radio,
4261 .amux = LINE2,
4262 },
4263 },
4264 [SAA7134_BOARD_BEHOLD_507_9FM] = {
4265 /* Beholder Intl. Ltd. 2008 */
4266 /*Dmitry Belimov <d.belimov@gmail.com> */
4267 .name = "Beholder BeholdTV 507 FM / BeholdTV 509 FM",
4268 .audio_clock = 0x00187de7,
4269 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4270 .radio_type = UNSET,
4271 .tuner_addr = ADDR_UNSET,
4272 .radio_addr = ADDR_UNSET,
4273 .tda9887_conf = TDA9887_PRESENT,
4274 .gpiomask = 0x00008000,
4275 .inputs = {{
4276 .name = name_tv,
4277 .vmux = 3,
4278 .amux = TV,
4279 .tv = 1,
4280 },{
4281 .name = name_comp1,
4282 .vmux = 1,
4283 .amux = LINE1,
4284 },{
4285 .name = name_svideo,
4286 .vmux = 8,
4287 .amux = LINE1,
4288 }},
4289 .radio = {
4290 .name = name_radio,
4291 .amux = LINE2,
4292 },
4293 },
4294 [SAA7134_BOARD_BEHOLD_507RDS_MK5] = {
4295 /* Beholder Intl. Ltd. 2008 */
4296 /*Dmitry Belimov <d.belimov@gmail.com> */
4297 .name = "Beholder BeholdTV 507 RDS",
4298 .audio_clock = 0x00187de7,
4299 .tuner_type = TUNER_PHILIPS_FM1216MK5,
4300 .radio_type = UNSET,
4301 .tuner_addr = ADDR_UNSET,
4302 .radio_addr = ADDR_UNSET,
4303 .rds_addr = 0x10,
4304 .tda9887_conf = TDA9887_PRESENT,
4305 .gpiomask = 0x00008000,
4306 .inputs = {{
4307 .name = name_tv,
4308 .vmux = 3,
4309 .amux = TV,
4310 .tv = 1,
4311 }, {
4312 .name = name_comp1,
4313 .vmux = 1,
4314 .amux = LINE1,
4315 }, {
4316 .name = name_svideo,
4317 .vmux = 8,
4318 .amux = LINE1,
4319 } },
4320 .radio = {
4321 .name = name_radio,
4322 .amux = LINE2,
4323 },
4324 },
4325 [SAA7134_BOARD_BEHOLD_507RDS_MK3] = {
4326 /* Beholder Intl. Ltd. 2008 */
4327 /*Dmitry Belimov <d.belimov@gmail.com> */
4328 .name = "Beholder BeholdTV 507 RDS",
4329 .audio_clock = 0x00187de7,
4330 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4331 .radio_type = UNSET,
4332 .tuner_addr = ADDR_UNSET,
4333 .radio_addr = ADDR_UNSET,
4334 .rds_addr = 0x10,
4335 .tda9887_conf = TDA9887_PRESENT,
4336 .gpiomask = 0x00008000,
4337 .inputs = {{
4338 .name = name_tv,
4339 .vmux = 3,
4340 .amux = TV,
4341 .tv = 1,
4342 }, {
4343 .name = name_comp1,
4344 .vmux = 1,
4345 .amux = LINE1,
4346 }, {
4347 .name = name_svideo,
4348 .vmux = 8,
4349 .amux = LINE1,
4350 } },
4351 .radio = {
4352 .name = name_radio,
4353 .amux = LINE2,
4354 },
4355 },
4356 [SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM] = {
4357 /* Beholder Intl. Ltd. 2008 */
4358 /* Dmitry Belimov <d.belimov@gmail.com> */
4359 .name = "Beholder BeholdTV Columbus TV/FM",
4360 .audio_clock = 0x00187de7,
4361 .tuner_type = TUNER_ALPS_TSBE5_PAL,
4362 .radio_type = TUNER_TEA5767,
4363 .tuner_addr = 0xc2 >> 1,
4364 .radio_addr = 0xc0 >> 1,
4365 .tda9887_conf = TDA9887_PRESENT,
4366 .gpiomask = 0x000A8004,
4367 .inputs = {{
4368 .name = name_tv,
4369 .vmux = 3,
4370 .amux = TV,
4371 .tv = 1,
4372 .gpio = 0x000A8004,
4373 }, {
4374 .name = name_comp1,
4375 .vmux = 1,
4376 .amux = LINE1,
4377 .gpio = 0x000A8000,
4378 }, {
4379 .name = name_svideo,
4380 .vmux = 8,
4381 .amux = LINE1,
4382 .gpio = 0x000A8000,
4383 } },
4384 .radio = {
4385 .name = name_radio,
4386 .amux = LINE2,
4387 .gpio = 0x000A8000,
4388 },
4389 },
4390 [SAA7134_BOARD_BEHOLD_607FM_MK3] = {
4391 /* Andrey Melnikoff <temnota@kmv.ru> */
4392 .name = "Beholder BeholdTV 607 FM",
4393 .audio_clock = 0x00187de7,
4394 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4395 .radio_type = UNSET,
4396 .tuner_addr = ADDR_UNSET,
4397 .radio_addr = ADDR_UNSET,
4398 .tda9887_conf = TDA9887_PRESENT,
4399 .inputs = {{
4400 .name = name_tv,
4401 .vmux = 3,
4402 .amux = TV,
4403 .tv = 1,
4404 }, {
4405 .name = name_comp1,
4406 .vmux = 1,
4407 .amux = LINE1,
4408 }, {
4409 .name = name_svideo,
4410 .vmux = 8,
4411 .amux = LINE1,
4412 } },
4413 .radio = {
4414 .name = name_radio,
4415 .amux = LINE2,
4416 },
4417 },
4418 [SAA7134_BOARD_BEHOLD_609FM_MK3] = {
4419 /* Andrey Melnikoff <temnota@kmv.ru> */
4420 .name = "Beholder BeholdTV 609 FM",
4421 .audio_clock = 0x00187de7,
4422 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4423 .radio_type = UNSET,
4424 .tuner_addr = ADDR_UNSET,
4425 .radio_addr = ADDR_UNSET,
4426 .tda9887_conf = TDA9887_PRESENT,
4427 .inputs = {{
4428 .name = name_tv,
4429 .vmux = 3,
4430 .amux = TV,
4431 .tv = 1,
4432 }, {
4433 .name = name_comp1,
4434 .vmux = 1,
4435 .amux = LINE1,
4436 }, {
4437 .name = name_svideo,
4438 .vmux = 8,
4439 .amux = LINE1,
4440 } },
4441 .radio = {
4442 .name = name_radio,
4443 .amux = LINE2,
4444 },
4445 },
4446 [SAA7134_BOARD_BEHOLD_607FM_MK5] = {
4447 /* Andrey Melnikoff <temnota@kmv.ru> */
4448 .name = "Beholder BeholdTV 607 FM",
4449 .audio_clock = 0x00187de7,
4450 .tuner_type = TUNER_PHILIPS_FM1216MK5,
4451 .radio_type = UNSET,
4452 .tuner_addr = ADDR_UNSET,
4453 .radio_addr = ADDR_UNSET,
4454 .tda9887_conf = TDA9887_PRESENT,
4455 .inputs = {{
4456 .name = name_tv,
4457 .vmux = 3,
4458 .amux = TV,
4459 .tv = 1,
4460 }, {
4461 .name = name_comp1,
4462 .vmux = 1,
4463 .amux = LINE1,
4464 }, {
4465 .name = name_svideo,
4466 .vmux = 8,
4467 .amux = LINE1,
4468 } },
4469 .radio = {
4470 .name = name_radio,
4471 .amux = LINE2,
4472 },
4473 },
4474 [SAA7134_BOARD_BEHOLD_609FM_MK5] = {
4475 /* Andrey Melnikoff <temnota@kmv.ru> */
4476 .name = "Beholder BeholdTV 609 FM",
4477 .audio_clock = 0x00187de7,
4478 .tuner_type = TUNER_PHILIPS_FM1216MK5,
4479 .radio_type = UNSET,
4480 .tuner_addr = ADDR_UNSET,
4481 .radio_addr = ADDR_UNSET,
4482 .tda9887_conf = TDA9887_PRESENT,
4483 .inputs = {{
4484 .name = name_tv,
4485 .vmux = 3,
4486 .amux = TV,
4487 .tv = 1,
4488 }, {
4489 .name = name_comp1,
4490 .vmux = 1,
4491 .amux = LINE1,
4492 }, {
4493 .name = name_svideo,
4494 .vmux = 8,
4495 .amux = LINE1,
4496 } },
4497 .radio = {
4498 .name = name_radio,
4499 .amux = LINE2,
4500 },
4501 },
4502 [SAA7134_BOARD_BEHOLD_607RDS_MK3] = {
4503 /* Andrey Melnikoff <temnota@kmv.ru> */
4504 .name = "Beholder BeholdTV 607 RDS",
4505 .audio_clock = 0x00187de7,
4506 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4507 .radio_type = UNSET,
4508 .tuner_addr = ADDR_UNSET,
4509 .radio_addr = ADDR_UNSET,
4510 .rds_addr = 0x10,
4511 .tda9887_conf = TDA9887_PRESENT,
4512 .inputs = {{
4513 .name = name_tv,
4514 .vmux = 3,
4515 .amux = TV,
4516 .tv = 1,
4517 }, {
4518 .name = name_comp1,
4519 .vmux = 1,
4520 .amux = LINE1,
4521 }, {
4522 .name = name_svideo,
4523 .vmux = 8,
4524 .amux = LINE1,
4525 } },
4526 .radio = {
4527 .name = name_radio,
4528 .amux = LINE2,
4529 },
4530 },
4531 [SAA7134_BOARD_BEHOLD_609RDS_MK3] = {
4532 /* Andrey Melnikoff <temnota@kmv.ru> */
4533 .name = "Beholder BeholdTV 609 RDS",
4534 .audio_clock = 0x00187de7,
4535 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4536 .radio_type = UNSET,
4537 .tuner_addr = ADDR_UNSET,
4538 .radio_addr = ADDR_UNSET,
4539 .rds_addr = 0x10,
4540 .tda9887_conf = TDA9887_PRESENT,
4541 .inputs = {{
4542 .name = name_tv,
4543 .vmux = 3,
4544 .amux = TV,
4545 .tv = 1,
4546 }, {
4547 .name = name_comp1,
4548 .vmux = 1,
4549 .amux = LINE1,
4550 }, {
4551 .name = name_svideo,
4552 .vmux = 8,
4553 .amux = LINE1,
4554 } },
4555 .radio = {
4556 .name = name_radio,
4557 .amux = LINE2,
4558 },
4559 },
4560 [SAA7134_BOARD_BEHOLD_607RDS_MK5] = {
4561 /* Andrey Melnikoff <temnota@kmv.ru> */
4562 .name = "Beholder BeholdTV 607 RDS",
4563 .audio_clock = 0x00187de7,
4564 .tuner_type = TUNER_PHILIPS_FM1216MK5,
4565 .radio_type = UNSET,
4566 .tuner_addr = ADDR_UNSET,
4567 .radio_addr = ADDR_UNSET,
4568 .rds_addr = 0x10,
4569 .tda9887_conf = TDA9887_PRESENT,
4570 .inputs = {{
4571 .name = name_tv,
4572 .vmux = 3,
4573 .amux = TV,
4574 .tv = 1,
4575 }, {
4576 .name = name_comp1,
4577 .vmux = 1,
4578 .amux = LINE1,
4579 }, {
4580 .name = name_svideo,
4581 .vmux = 8,
4582 .amux = LINE1,
4583 } },
4584 .radio = {
4585 .name = name_radio,
4586 .amux = LINE2,
4587 },
4588 },
4589 [SAA7134_BOARD_BEHOLD_609RDS_MK5] = {
4590 /* Andrey Melnikoff <temnota@kmv.ru> */
4591 .name = "Beholder BeholdTV 609 RDS",
4592 .audio_clock = 0x00187de7,
4593 .tuner_type = TUNER_PHILIPS_FM1216MK5,
4594 .radio_type = UNSET,
4595 .tuner_addr = ADDR_UNSET,
4596 .radio_addr = ADDR_UNSET,
4597 .rds_addr = 0x10,
4598 .tda9887_conf = TDA9887_PRESENT,
4599 .inputs = {{
4600 .name = name_tv,
4601 .vmux = 3,
4602 .amux = TV,
4603 .tv = 1,
4604 },{
4605 .name = name_comp1,
4606 .vmux = 1,
4607 .amux = LINE1,
4608 },{
4609 .name = name_svideo,
4610 .vmux = 8,
4611 .amux = LINE1,
4612 }},
4613 .radio = {
4614 .name = name_radio,
4615 .amux = LINE2,
4616 },
4617 },
4618 [SAA7134_BOARD_BEHOLD_M6] = {
4619 /* Igor Kuznetsov <igk@igk.ru> */
4620 /* Andrey Melnikoff <temnota@kmv.ru> */
4621 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
4622 /* Alexey Osipov <lion-simba@pridelands.ru> */
4623 .name = "Beholder BeholdTV M6",
4624 .audio_clock = 0x00187de7,
4625 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4626 .radio_type = UNSET,
4627 .tuner_addr = ADDR_UNSET,
4628 .radio_addr = ADDR_UNSET,
4629 .empress_addr = 0x20,
4630 .tda9887_conf = TDA9887_PRESENT,
4631 .inputs = { {
4632 .name = name_tv,
4633 .vmux = 3,
4634 .amux = TV,
4635 .tv = 1,
4636 }, {
4637 .name = name_comp1,
4638 .vmux = 1,
4639 .amux = LINE1,
4640 }, {
4641 .name = name_svideo,
4642 .vmux = 8,
4643 .amux = LINE1,
4644 } },
4645 .radio = {
4646 .name = name_radio,
4647 .amux = LINE2,
4648 },
4649 .mpeg = SAA7134_MPEG_EMPRESS,
4650 .video_out = CCIR656,
4651 .vid_port_opts = (SET_T_CODE_POLARITY_NON_INVERTED |
4652 SET_CLOCK_NOT_DELAYED |
4653 SET_CLOCK_INVERTED |
4654 SET_VSYNC_OFF),
4655 },
4656 [SAA7134_BOARD_BEHOLD_M63] = {
4657 /* Igor Kuznetsov <igk@igk.ru> */
4658 /* Andrey Melnikoff <temnota@kmv.ru> */
4659 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
4660 .name = "Beholder BeholdTV M63",
4661 .audio_clock = 0x00187de7,
4662 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4663 .radio_type = UNSET,
4664 .tuner_addr = ADDR_UNSET,
4665 .radio_addr = ADDR_UNSET,
4666 .empress_addr = 0x20,
4667 .tda9887_conf = TDA9887_PRESENT,
4668 .inputs = { {
4669 .name = name_tv,
4670 .vmux = 3,
4671 .amux = TV,
4672 .tv = 1,
4673 }, {
4674 .name = name_comp1,
4675 .vmux = 1,
4676 .amux = LINE1,
4677 }, {
4678 .name = name_svideo,
4679 .vmux = 8,
4680 .amux = LINE1,
4681 } },
4682 .radio = {
4683 .name = name_radio,
4684 .amux = LINE2,
4685 },
4686 .mpeg = SAA7134_MPEG_EMPRESS,
4687 .video_out = CCIR656,
4688 .vid_port_opts = (SET_T_CODE_POLARITY_NON_INVERTED |
4689 SET_CLOCK_NOT_DELAYED |
4690 SET_CLOCK_INVERTED |
4691 SET_VSYNC_OFF),
4692 },
4693 [SAA7134_BOARD_BEHOLD_M6_EXTRA] = {
4694 /* Igor Kuznetsov <igk@igk.ru> */
4695 /* Andrey Melnikoff <temnota@kmv.ru> */
4696 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
4697 /* Alexey Osipov <lion-simba@pridelands.ru> */
4698 .name = "Beholder BeholdTV M6 Extra",
4699 .audio_clock = 0x00187de7,
4700 .tuner_type = TUNER_PHILIPS_FM1216MK5,
4701 .radio_type = UNSET,
4702 .tuner_addr = ADDR_UNSET,
4703 .radio_addr = ADDR_UNSET,
4704 .rds_addr = 0x10,
4705 .empress_addr = 0x20,
4706 .tda9887_conf = TDA9887_PRESENT,
4707 .inputs = { {
4708 .name = name_tv,
4709 .vmux = 3,
4710 .amux = TV,
4711 .tv = 1,
4712 }, {
4713 .name = name_comp1,
4714 .vmux = 1,
4715 .amux = LINE1,
4716 }, {
4717 .name = name_svideo,
4718 .vmux = 8,
4719 .amux = LINE1,
4720 } },
4721 .radio = {
4722 .name = name_radio,
4723 .amux = LINE2,
4724 },
4725 .mpeg = SAA7134_MPEG_EMPRESS,
4726 .video_out = CCIR656,
4727 .vid_port_opts = (SET_T_CODE_POLARITY_NON_INVERTED |
4728 SET_CLOCK_NOT_DELAYED |
4729 SET_CLOCK_INVERTED |
4730 SET_VSYNC_OFF),
4731 },
4732 [SAA7134_BOARD_TWINHAN_DTV_DVB_3056] = {
4733 .name = "Twinhan Hybrid DTV-DVB 3056 PCI",
4734 .audio_clock = 0x00187de7,
4735 .tuner_type = TUNER_PHILIPS_TDA8290,
4736 .radio_type = UNSET,
4737 .tuner_addr = ADDR_UNSET,
4738 .radio_addr = ADDR_UNSET,
4739 .tuner_config = 2,
4740 .mpeg = SAA7134_MPEG_DVB,
4741 .gpiomask = 0x0200000,
4742 .inputs = {{
4743 .name = name_tv,
4744 .vmux = 1,
4745 .amux = TV,
4746 .tv = 1,
4747 }, {
4748 .name = name_comp1,
4749 .vmux = 3,
4750 .amux = LINE1,
4751 }, {
4752 .name = name_svideo,
4753 .vmux = 8, /* untested */
4754 .amux = LINE1,
4755 } },
4756 .radio = {
4757 .name = name_radio,
4758 .amux = TV,
4759 .gpio = 0x0200000,
4760 },
4761 },
4762 [SAA7134_BOARD_GENIUS_TVGO_A11MCE] = {
4763 /* Adrian Pardini <pardo.bsso@gmail.com> */
4764 .name = "Genius TVGO AM11MCE",
4765 .audio_clock = 0x00200000,
4766 .tuner_type = TUNER_TNF_5335MF,
4767 .radio_type = UNSET,
4768 .tuner_addr = ADDR_UNSET,
4769 .radio_addr = ADDR_UNSET,
4770 .gpiomask = 0xf000,
4771 .inputs = {{
4772 .name = name_tv_mono,
4773 .vmux = 1,
4774 .amux = LINE2,
4775 .gpio = 0x0000,
4776 .tv = 1,
4777 }, {
4778 .name = name_comp1,
4779 .vmux = 3,
4780 .amux = LINE1,
4781 .gpio = 0x2000,
4782 .tv = 1
4783 }, {
4784 .name = name_svideo,
4785 .vmux = 8,
4786 .amux = LINE1,
4787 .gpio = 0x2000,
4788 } },
4789 .radio = {
4790 .name = name_radio,
4791 .amux = LINE2,
4792 .gpio = 0x1000,
4793 },
4794 .mute = {
4795 .name = name_mute,
4796 .amux = LINE2,
4797 .gpio = 0x6000,
4798 },
4799 },
4800 [SAA7134_BOARD_PHILIPS_SNAKE] = {
4801 .name = "NXP Snake DVB-S reference design",
4802 .audio_clock = 0x00200000,
4803 .tuner_type = TUNER_ABSENT,
4804 .radio_type = UNSET,
4805 .tuner_addr = ADDR_UNSET,
4806 .radio_addr = ADDR_UNSET,
4807 .mpeg = SAA7134_MPEG_DVB,
4808 .inputs = {{
4809 .name = name_comp1,
4810 .vmux = 3,
4811 .amux = LINE1,
4812 }, {
4813 .name = name_svideo,
4814 .vmux = 8,
4815 .amux = LINE1,
4816 } },
4817 },
4818 [SAA7134_BOARD_CREATIX_CTX953] = {
4819 .name = "Medion/Creatix CTX953 Hybrid",
4820 .audio_clock = 0x00187de7,
4821 .tuner_type = TUNER_PHILIPS_TDA8290,
4822 .radio_type = UNSET,
4823 .tuner_addr = ADDR_UNSET,
4824 .radio_addr = ADDR_UNSET,
4825 .tuner_config = 0,
4826 .mpeg = SAA7134_MPEG_DVB,
4827 .inputs = {{
4828 .name = name_tv,
4829 .vmux = 1,
4830 .amux = TV,
4831 .tv = 1,
4832 }, {
4833 .name = name_comp1,
4834 .vmux = 0,
4835 .amux = LINE1,
4836 }, {
4837 .name = name_svideo,
4838 .vmux = 8,
4839 .amux = LINE1,
4840 } },
4841 },
4842 [SAA7134_BOARD_MSI_TVANYWHERE_AD11] = {
4843 .name = "MSI TV@nywhere A/D v1.1",
4844 .audio_clock = 0x00187de7,
4845 .tuner_type = TUNER_PHILIPS_TDA8290,
4846 .radio_type = UNSET,
4847 .tuner_addr = ADDR_UNSET,
4848 .radio_addr = ADDR_UNSET,
4849 .tuner_config = 2,
4850 .mpeg = SAA7134_MPEG_DVB,
4851 .gpiomask = 0x0200000,
4852 .inputs = { {
4853 .name = name_tv,
4854 .vmux = 1,
4855 .amux = TV,
4856 .tv = 1,
4857 }, {
4858 .name = name_comp1,
4859 .vmux = 3,
4860 .amux = LINE1,
4861 }, {
4862 .name = name_svideo,
4863 .vmux = 8,
4864 .amux = LINE1,
4865 } },
4866 .radio = {
4867 .name = name_radio,
4868 .amux = TV,
4869 .gpio = 0x0200000,
4870 },
4871 },
4872 [SAA7134_BOARD_AVERMEDIA_CARDBUS_506] = {
4873 .name = "AVerMedia Cardbus TV/Radio (E506R)",
4874 .audio_clock = 0x187de7,
4875 .tuner_type = TUNER_XC2028,
4876 .radio_type = UNSET,
4877 .tuner_addr = ADDR_UNSET,
4878 .radio_addr = ADDR_UNSET,
4879 .mpeg = SAA7134_MPEG_DVB,
4880 .inputs = {{
4881 .name = name_tv,
4882 .vmux = 1,
4883 .amux = TV,
4884 .tv = 1,
4885 }, {
4886 .name = name_comp1,
4887 .vmux = 3,
4888 .amux = LINE1,
4889 }, {
4890 .name = name_svideo,
4891 .vmux = 8,
4892 .amux = LINE2,
4893 } },
4894 .radio = {
4895 .name = name_radio,
4896 .amux = TV,
4897 },
4898 },
4899 [SAA7134_BOARD_AVERMEDIA_A16D] = {
4900 .name = "AVerMedia Hybrid TV/Radio (A16D)",
4901 .audio_clock = 0x187de7,
4902 .tuner_type = TUNER_XC2028,
4903 .radio_type = UNSET,
4904 .tuner_addr = ADDR_UNSET,
4905 .radio_addr = ADDR_UNSET,
4906 .mpeg = SAA7134_MPEG_DVB,
4907 .inputs = {{
4908 .name = name_tv,
4909 .vmux = 1,
4910 .amux = TV,
4911 .tv = 1,
4912 }, {
4913 .name = name_svideo,
4914 .vmux = 8,
4915 .amux = LINE1,
4916 }, {
4917 .name = name_comp,
4918 .vmux = 0,
4919 .amux = LINE1,
4920 } },
4921 .radio = {
4922 .name = name_radio,
4923 .amux = TV,
4924 },
4925 },
4926 [SAA7134_BOARD_AVERMEDIA_M115] = {
4927 .name = "Avermedia M115",
4928 .audio_clock = 0x187de7,
4929 .tuner_type = TUNER_XC2028,
4930 .radio_type = UNSET,
4931 .tuner_addr = ADDR_UNSET,
4932 .radio_addr = ADDR_UNSET,
4933 .inputs = {{
4934 .name = name_tv,
4935 .vmux = 1,
4936 .amux = TV,
4937 .tv = 1,
4938 }, {
4939 .name = name_comp1,
4940 .vmux = 3,
4941 .amux = LINE1,
4942 }, {
4943 .name = name_svideo,
4944 .vmux = 8,
4945 .amux = LINE2,
4946 } },
4947 },
4948 [SAA7134_BOARD_VIDEOMATE_T750] = {
4949 /* John Newbigin <jn@it.swin.edu.au> */
4950 .name = "Compro VideoMate T750",
4951 .audio_clock = 0x00187de7,
4952 .tuner_type = TUNER_XC2028,
4953 .radio_type = UNSET,
4954 .tuner_addr = 0x61,
4955 .radio_addr = ADDR_UNSET,
4956 .mpeg = SAA7134_MPEG_DVB,
4957 .inputs = {{
4958 .name = name_tv,
4959 .vmux = 3,
4960 .amux = TV,
4961 .tv = 1,
4962 }, {
4963 .name = name_comp1,
4964 .vmux = 1,
4965 .amux = LINE2,
4966 }, {
4967 .name = name_svideo,
4968 .vmux = 8,
4969 .amux = LINE2,
4970 } },
4971 .radio = {
4972 .name = name_radio,
4973 .amux = TV,
4974 }
4975 },
4976 [SAA7134_BOARD_AVERMEDIA_A700_PRO] = {
4977 /* Matthias Schwarzott <zzam@gentoo.org> */
4978 .name = "Avermedia DVB-S Pro A700",
4979 .audio_clock = 0x00187de7,
4980 .tuner_type = TUNER_ABSENT,
4981 .radio_type = UNSET,
4982 .tuner_addr = ADDR_UNSET,
4983 .radio_addr = ADDR_UNSET,
4984 .mpeg = SAA7134_MPEG_DVB,
4985 .inputs = { {
4986 .name = name_comp,
4987 .vmux = 1,
4988 .amux = LINE1,
4989 }, {
4990 .name = name_svideo,
4991 .vmux = 6,
4992 .amux = LINE1,
4993 } },
4994 },
4995 [SAA7134_BOARD_AVERMEDIA_A700_HYBRID] = {
4996 /* Matthias Schwarzott <zzam@gentoo.org> */
4997 .name = "Avermedia DVB-S Hybrid+FM A700",
4998 .audio_clock = 0x00187de7,
4999 .tuner_type = TUNER_XC2028,
5000 .radio_type = UNSET,
5001 .tuner_addr = ADDR_UNSET,
5002 .radio_addr = ADDR_UNSET,
5003 .mpeg = SAA7134_MPEG_DVB,
5004 .inputs = { {
5005 .name = name_tv,
5006 .vmux = 4,
5007 .amux = TV,
5008 .tv = 1,
5009 }, {
5010 .name = name_comp,
5011 .vmux = 1,
5012 .amux = LINE1,
5013 }, {
5014 .name = name_svideo,
5015 .vmux = 6,
5016 .amux = LINE1,
5017 } },
5018 .radio = {
5019 .name = name_radio,
5020 .amux = TV,
5021 },
5022 },
5023 [SAA7134_BOARD_BEHOLD_H6] = {
5024 /* Igor Kuznetsov <igk@igk.ru> */
5025 .name = "Beholder BeholdTV H6",
5026 .audio_clock = 0x00187de7,
5027 .tuner_type = TUNER_PHILIPS_FMD1216MEX_MK3,
5028 .radio_type = UNSET,
5029 .tuner_addr = ADDR_UNSET,
5030 .radio_addr = ADDR_UNSET,
5031 .tda9887_conf = TDA9887_PRESENT,
5032 .mpeg = SAA7134_MPEG_DVB,
5033 .inputs = {{
5034 .name = name_tv,
5035 .vmux = 3,
5036 .amux = TV,
5037 .tv = 1,
5038 }, {
5039 .name = name_comp1,
5040 .vmux = 1,
5041 .amux = LINE1,
5042 }, {
5043 .name = name_svideo,
5044 .vmux = 8,
5045 .amux = LINE1,
5046 } },
5047 .radio = {
5048 .name = name_radio,
5049 .amux = LINE2,
5050 },
5051 },
5052 [SAA7134_BOARD_ASUSTeK_TIGER_3IN1] = {
5053 .name = "Asus Tiger 3in1",
5054 .audio_clock = 0x00187de7,
5055 .tuner_type = TUNER_PHILIPS_TDA8290,
5056 .radio_type = UNSET,
5057 .tuner_addr = ADDR_UNSET,
5058 .radio_addr = ADDR_UNSET,
5059 .tuner_config = 2,
5060 .gpiomask = 1 << 21,
5061 .mpeg = SAA7134_MPEG_DVB,
5062 .inputs = {{
5063 .name = name_tv,
5064 .vmux = 1,
5065 .amux = TV,
5066 .tv = 1,
5067 }, {
5068 .name = name_comp,
5069 .vmux = 0,
5070 .amux = LINE2,
5071 }, {
5072 .name = name_svideo,
5073 .vmux = 8,
5074 .amux = LINE2,
5075 } },
5076 .radio = {
5077 .name = name_radio,
5078 .amux = TV,
5079 .gpio = 0x0200000,
5080 },
5081 },
5082 [SAA7134_BOARD_REAL_ANGEL_220] = {
5083 .name = "Zogis Real Angel 220",
5084 .audio_clock = 0x00187de7,
5085 .tuner_type = TUNER_TNF_5335MF,
5086 .radio_type = UNSET,
5087 .tuner_addr = ADDR_UNSET,
5088 .radio_addr = ADDR_UNSET,
5089 .gpiomask = 0x801a8087,
5090 .inputs = { {
5091 .name = name_tv,
5092 .vmux = 3,
5093 .amux = LINE2,
5094 .tv = 1,
5095 .gpio = 0x624000,
5096 }, {
5097 .name = name_comp1,
5098 .vmux = 1,
5099 .amux = LINE1,
5100 .gpio = 0x624000,
5101 }, {
5102 .name = name_svideo,
5103 .vmux = 1,
5104 .amux = LINE1,
5105 .gpio = 0x624000,
5106 } },
5107 .radio = {
5108 .name = name_radio,
5109 .amux = LINE2,
5110 .gpio = 0x624001,
5111 },
5112 .mute = {
5113 .name = name_mute,
5114 .amux = TV,
5115 },
5116 },
5117 [SAA7134_BOARD_ADS_INSTANT_HDTV_PCI] = {
5118 .name = "ADS Tech Instant HDTV",
5119 .audio_clock = 0x00187de7,
5120 .tuner_type = TUNER_PHILIPS_TUV1236D,
5121 .radio_type = UNSET,
5122 .tuner_addr = ADDR_UNSET,
5123 .radio_addr = ADDR_UNSET,
5124 .tda9887_conf = TDA9887_PRESENT,
5125 .mpeg = SAA7134_MPEG_DVB,
5126 .inputs = { {
5127 .name = name_tv,
5128 .vmux = 1,
5129 .amux = TV,
5130 .tv = 1,
5131 }, {
5132 .name = name_comp,
5133 .vmux = 4,
5134 .amux = LINE1,
5135 }, {
5136 .name = name_svideo,
5137 .vmux = 8,
5138 .amux = LINE1,
5139 } },
5140 },
5141 [SAA7134_BOARD_ASUSTeK_TIGER] = {
5142 .name = "Asus Tiger Rev:1.00",
5143 .audio_clock = 0x00187de7,
5144 .tuner_type = TUNER_PHILIPS_TDA8290,
5145 .radio_type = UNSET,
5146 .tuner_addr = ADDR_UNSET,
5147 .radio_addr = ADDR_UNSET,
5148 .tuner_config = 0,
5149 .mpeg = SAA7134_MPEG_DVB,
5150 .gpiomask = 0x0200000,
5151 .inputs = { {
5152 .name = name_tv,
5153 .vmux = 1,
5154 .amux = TV,
5155 .tv = 1,
5156 }, {
5157 .name = name_comp1,
5158 .vmux = 3,
5159 .amux = LINE2,
5160 }, {
5161 .name = name_comp2,
5162 .vmux = 0,
5163 .amux = LINE2,
5164 }, {
5165 .name = name_svideo,
5166 .vmux = 8,
5167 .amux = LINE2,
5168 } },
5169 .radio = {
5170 .name = name_radio,
5171 .amux = TV,
5172 .gpio = 0x0200000,
5173 },
5174 },
5175 [SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG] = {
5176 .name = "Kworld Plus TV Analog Lite PCI",
5177 .audio_clock = 0x00187de7,
5178 .tuner_type = TUNER_YMEC_TVF_5533MF,
5179 .radio_type = TUNER_TEA5767,
5180 .tuner_addr = ADDR_UNSET,
5181 .radio_addr = 0x60,
5182 .gpiomask = 0x80000700,
5183 .inputs = { {
5184 .name = name_tv,
5185 .vmux = 1,
5186 .amux = LINE2,
5187 .tv = 1,
5188 .gpio = 0x100,
5189 }, {
5190 .name = name_comp1,
5191 .vmux = 3,
5192 .amux = LINE1,
5193 .gpio = 0x200,
5194 }, {
5195 .name = name_svideo,
5196 .vmux = 8,
5197 .amux = LINE1,
5198 .gpio = 0x200,
5199 } },
5200 .radio = {
5201 .name = name_radio,
5202 .vmux = 1,
5203 .amux = LINE1,
5204 .gpio = 0x100,
5205 },
5206 .mute = {
5207 .name = name_mute,
5208 .vmux = 8,
5209 .amux = 2,
5210 },
5211 },
5212 [SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG] = {
5213 .name = "Kworld PCI SBTVD/ISDB-T Full-Seg Hybrid",
5214 .audio_clock = 0x00187de7,
5215 .tuner_type = TUNER_PHILIPS_TDA8290,
5216 .tuner_addr = ADDR_UNSET,
5217 .radio_type = UNSET,
5218 .radio_addr = ADDR_UNSET,
5219 .gpiomask = 0x8e054000,
5220 .mpeg = SAA7134_MPEG_DVB,
5221 .ts_type = SAA7134_MPEG_TS_PARALLEL,
5222 .inputs = { {
5223 .name = name_tv,
5224 .vmux = 1,
5225 .amux = TV,
5226 .tv = 1,
5227#if 0 /* FIXME */
5228 }, {
5229 .name = name_comp1,
5230 .vmux = 3,
5231 .amux = LINE1,
5232 .gpio = 0x200,
5233 }, {
5234 .name = name_svideo,
5235 .vmux = 8,
5236 .amux = LINE1,
5237 .gpio = 0x200,
5238#endif
5239 } },
5240#if 0
5241 .radio = {
5242 .name = name_radio,
5243 .vmux = 1,
5244 .amux = LINE1,
5245 .gpio = 0x100,
5246 },
5247#endif
5248 .mute = {
5249 .name = name_mute,
5250 .vmux = 0,
5251 .amux = TV,
5252 },
5253 },
5254 [SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS] = {
5255 .name = "Avermedia AVerTV GO 007 FM Plus",
5256 .audio_clock = 0x00187de7,
5257 .tuner_type = TUNER_PHILIPS_TDA8290,
5258 .radio_type = UNSET,
5259 .tuner_addr = ADDR_UNSET,
5260 .radio_addr = ADDR_UNSET,
5261 .gpiomask = 0x00300003,
5262 /* .gpiomask = 0x8c240003, */
5263 .inputs = { {
5264 .name = name_tv,
5265 .vmux = 1,
5266 .amux = TV,
5267 .tv = 1,
5268 .gpio = 0x01,
5269 }, {
5270 .name = name_svideo,
5271 .vmux = 6,
5272 .amux = LINE1,
5273 .gpio = 0x02,
5274 } },
5275 .radio = {
5276 .name = name_radio,
5277 .amux = TV,
5278 .gpio = 0x00300001,
5279 },
5280 .mute = {
5281 .name = name_mute,
5282 .amux = TV,
5283 .gpio = 0x01,
5284 },
5285 },
5286 [SAA7134_BOARD_AVERMEDIA_STUDIO_507UA] = {
5287 /* Andy Shevchenko <andy@smile.org.ua> */
5288 .name = "Avermedia AVerTV Studio 507UA",
5289 .audio_clock = 0x00187de7,
5290 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, /* Should be MK5 */
5291 .radio_type = UNSET,
5292 .tuner_addr = ADDR_UNSET,
5293 .radio_addr = ADDR_UNSET,
5294 .tda9887_conf = TDA9887_PRESENT,
5295 .gpiomask = 0x03,
5296 .inputs = { {
5297 .name = name_tv,
5298 .vmux = 1,
5299 .amux = TV,
5300 .tv = 1,
5301 .gpio = 0x00,
5302 }, {
5303 .name = name_comp1,
5304 .vmux = 3,
5305 .amux = LINE1,
5306 .gpio = 0x00,
5307 }, {
5308 .name = name_svideo,
5309 .vmux = 8,
5310 .amux = LINE1,
5311 .gpio = 0x00,
5312 } },
5313 .radio = {
5314 .name = name_radio,
5315 .amux = LINE2,
5316 .gpio = 0x01,
5317 },
5318 .mute = {
5319 .name = name_mute,
5320 .amux = LINE1,
5321 .gpio = 0x00,
5322 },
5323 },
5324 [SAA7134_BOARD_VIDEOMATE_S350] = {
5325 /* Jan D. Louw <jd.louw@mweb.co.za */
5326 .name = "Compro VideoMate S350/S300",
5327 .audio_clock = 0x00187de7,
5328 .tuner_type = TUNER_ABSENT,
5329 .radio_type = UNSET,
5330 .tuner_addr = ADDR_UNSET,
5331 .radio_addr = ADDR_UNSET,
5332 .mpeg = SAA7134_MPEG_DVB,
5333 .inputs = { {
5334 .name = name_comp1,
5335 .vmux = 0,
5336 .amux = LINE1,
5337 }, {
5338 .name = name_svideo,
5339 .vmux = 8, /* Not tested */
5340 .amux = LINE1
5341 } },
5342 },
5343 [SAA7134_BOARD_BEHOLD_X7] = {
5344 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
5345 .name = "Beholder BeholdTV X7",
5346 .audio_clock = 0x00187de7,
5347 .tuner_type = TUNER_XC5000,
5348 .radio_type = UNSET,
5349 .tuner_addr = ADDR_UNSET,
5350 .radio_addr = ADDR_UNSET,
5351 .mpeg = SAA7134_MPEG_DVB,
5352 .inputs = { {
5353 .name = name_tv,
5354 .vmux = 2,
5355 .amux = TV,
5356 .tv = 1,
5357 }, {
5358 .name = name_comp1,
5359 .vmux = 0,
5360 .amux = LINE1,
5361 }, {
5362 .name = name_svideo,
5363 .vmux = 9,
5364 .amux = LINE1,
5365 } },
5366 .radio = {
5367 .name = name_radio,
5368 .amux = TV,
5369 },
5370 },
5371 [SAA7134_BOARD_ZOLID_HYBRID_PCI] = {
5372 .name = "Zolid Hybrid TV Tuner PCI",
5373 .audio_clock = 0x00187de7,
5374 .tuner_type = TUNER_PHILIPS_TDA8290,
5375 .radio_type = UNSET,
5376 .tuner_addr = ADDR_UNSET,
5377 .radio_addr = ADDR_UNSET,
5378 .tuner_config = 0,
5379 .mpeg = SAA7134_MPEG_DVB,
5380 .ts_type = SAA7134_MPEG_TS_PARALLEL,
5381 .inputs = {{
5382 .name = name_tv,
5383 .vmux = 1,
5384 .amux = TV,
5385 .tv = 1,
5386 } },
5387 .radio = { /* untested */
5388 .name = name_radio,
5389 .amux = TV,
5390 },
5391 },
5392 [SAA7134_BOARD_ASUS_EUROPA_HYBRID] = {
5393 .name = "Asus Europa Hybrid OEM",
5394 .audio_clock = 0x00187de7,
5395 .tuner_type = TUNER_PHILIPS_TD1316,
5396 .radio_type = UNSET,
5397 .tuner_addr = 0x61,
5398 .radio_addr = ADDR_UNSET,
5399 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE,
5400 .mpeg = SAA7134_MPEG_DVB,
5401 .inputs = { {
5402 .name = name_tv,
5403 .vmux = 3,
5404 .amux = TV,
5405 .tv = 1,
5406 }, {
5407 .name = name_comp1,
5408 .vmux = 4,
5409 .amux = LINE2,
5410 }, {
5411 .name = name_svideo,
5412 .vmux = 8,
5413 .amux = LINE2,
5414 } },
5415 },
5416 [SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S] = {
5417 .name = "Leadtek Winfast DTV1000S",
5418 .audio_clock = 0x00187de7,
5419 .tuner_type = TUNER_PHILIPS_TDA8290,
5420 .radio_type = UNSET,
5421 .tuner_addr = ADDR_UNSET,
5422 .radio_addr = ADDR_UNSET,
5423 .mpeg = SAA7134_MPEG_DVB,
5424 .inputs = { {
5425 .name = name_comp1,
5426 .vmux = 3,
5427 }, {
5428 .name = name_svideo,
5429 .vmux = 8,
5430 } },
5431 },
5432 [SAA7134_BOARD_BEHOLD_505RDS_MK3] = {
5433 /* Beholder Intl. Ltd. 2008 */
5434 /*Dmitry Belimov <d.belimov@gmail.com> */
5435 .name = "Beholder BeholdTV 505 RDS",
5436 .audio_clock = 0x00200000,
5437 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
5438 .radio_type = UNSET,
5439 .tuner_addr = ADDR_UNSET,
5440 .radio_addr = ADDR_UNSET,
5441 .rds_addr = 0x10,
5442 .tda9887_conf = TDA9887_PRESENT,
5443 .gpiomask = 0x00008000,
5444 .inputs = {{
5445 .name = name_tv,
5446 .vmux = 3,
5447 .amux = LINE2,
5448 .tv = 1,
5449 }, {
5450 .name = name_comp1,
5451 .vmux = 1,
5452 .amux = LINE1,
5453 }, {
5454 .name = name_svideo,
5455 .vmux = 8,
5456 .amux = LINE1,
5457 } },
5458 .mute = {
5459 .name = name_mute,
5460 .amux = LINE1,
5461 },
5462 .radio = {
5463 .name = name_radio,
5464 .amux = LINE2,
5465 },
5466 },
5467 [SAA7134_BOARD_HAWELL_HW_404M7] = {
5468 /* Hawell HW-404M7 & Hawell HW-808M7 */
5469 /* Bogoslovskiy Viktor <bogovic@bk.ru> */
5470 .name = "Hawell HW-404M7",
5471 .audio_clock = 0x00200000,
5472 .tuner_type = UNSET,
5473 .radio_type = UNSET,
5474 .tuner_addr = ADDR_UNSET,
5475 .radio_addr = ADDR_UNSET,
5476 .gpiomask = 0x389c00,
5477 .inputs = {{
5478 .name = name_comp1,
5479 .vmux = 3,
5480 .amux = LINE1,
5481 .gpio = 0x01fc00,
5482 } },
5483 },
5484 [SAA7134_BOARD_BEHOLD_H7] = {
5485 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
5486 .name = "Beholder BeholdTV H7",
5487 .audio_clock = 0x00187de7,
5488 .tuner_type = TUNER_XC5000,
5489 .radio_type = UNSET,
5490 .tuner_addr = ADDR_UNSET,
5491 .radio_addr = ADDR_UNSET,
5492 .mpeg = SAA7134_MPEG_DVB,
5493 .ts_type = SAA7134_MPEG_TS_PARALLEL,
5494 .inputs = { {
5495 .name = name_tv,
5496 .vmux = 2,
5497 .amux = TV,
5498 .tv = 1,
5499 }, {
5500 .name = name_comp1,
5501 .vmux = 0,
5502 .amux = LINE1,
5503 }, {
5504 .name = name_svideo,
5505 .vmux = 9,
5506 .amux = LINE1,
5507 } },
5508 .radio = {
5509 .name = name_radio,
5510 .amux = TV,
5511 },
5512 },
5513 [SAA7134_BOARD_BEHOLD_A7] = {
5514 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
5515 .name = "Beholder BeholdTV A7",
5516 .audio_clock = 0x00187de7,
5517 .tuner_type = TUNER_XC5000,
5518 .radio_type = UNSET,
5519 .tuner_addr = ADDR_UNSET,
5520 .radio_addr = ADDR_UNSET,
5521 .inputs = { {
5522 .name = name_tv,
5523 .vmux = 2,
5524 .amux = TV,
5525 .tv = 1,
5526 }, {
5527 .name = name_comp1,
5528 .vmux = 0,
5529 .amux = LINE1,
5530 }, {
5531 .name = name_svideo,
5532 .vmux = 9,
5533 .amux = LINE1,
5534 } },
5535 .radio = {
5536 .name = name_radio,
5537 .amux = TV,
5538 },
5539 },
5540 [SAA7134_BOARD_TECHNOTREND_BUDGET_T3000] = {
5541 .name = "TechoTrend TT-budget T-3000",
5542 .tuner_type = TUNER_PHILIPS_TD1316,
5543 .audio_clock = 0x00187de7,
5544 .radio_type = UNSET,
5545 .tuner_addr = 0x63,
5546 .radio_addr = ADDR_UNSET,
5547 .tda9887_conf = TDA9887_PRESENT | TDA9887_PORT1_ACTIVE,
5548 .mpeg = SAA7134_MPEG_DVB,
5549 .inputs = {{
5550 .name = name_tv,
5551 .vmux = 3,
5552 .amux = TV,
5553 .tv = 1,
5554 }, {
5555 .name = name_comp1,
5556 .vmux = 0,
5557 .amux = LINE2,
5558 }, {
5559 .name = name_svideo,
5560 .vmux = 8,
5561 .amux = LINE2,
5562 } },
5563 },
5564 [SAA7134_BOARD_VIDEOMATE_M1F] = {
5565 /* Pavel Osnova <pvosnova@gmail.com> */
5566 .name = "Compro VideoMate Vista M1F",
5567 .audio_clock = 0x00187de7,
5568 .tuner_type = TUNER_LG_PAL_NEW_TAPC,
5569 .radio_type = TUNER_TEA5767,
5570 .tuner_addr = ADDR_UNSET,
5571 .radio_addr = 0x60,
5572 .inputs = { {
5573 .name = name_tv,
5574 .vmux = 1,
5575 .amux = TV,
5576 .tv = 1,
5577 }, {
5578 .name = name_comp1,
5579 .vmux = 3,
5580 .amux = LINE2,
5581 }, {
5582 .name = name_svideo,
5583 .vmux = 8,
5584 .amux = LINE2,
5585 } },
5586 .radio = {
5587 .name = name_radio,
5588 .amux = LINE1,
5589 },
5590 .mute = {
5591 .name = name_mute,
5592 .amux = TV,
5593 },
5594 },
5595 [SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2] = {
5596 /* Timothy Lee <timothy.lee@siriushk.com> */
5597 .name = "MagicPro ProHDTV Pro2 DMB-TH/Hybrid",
5598 .audio_clock = 0x00187de7,
5599 .tuner_type = TUNER_PHILIPS_TDA8290,
5600 .radio_type = UNSET,
5601 .tuner_config = 3,
5602 .tuner_addr = ADDR_UNSET,
5603 .radio_addr = ADDR_UNSET,
5604 .gpiomask = 0x02050000,
5605 .mpeg = SAA7134_MPEG_DVB,
5606 .ts_type = SAA7134_MPEG_TS_PARALLEL,
5607 .inputs = { {
5608 .name = name_tv,
5609 .vmux = 1,
5610 .amux = TV,
5611 .tv = 1,
5612 .gpio = 0x00050000,
5613 }, {
5614 .name = name_comp1,
5615 .vmux = 3,
5616 .amux = LINE1,
5617 .gpio = 0x00050000,
5618 }, {
5619 .name = name_svideo,
5620 .vmux = 8,
5621 .amux = LINE1,
5622 .gpio = 0x00050000,
5623 } },
5624 .radio = {
5625 .name = name_radio,
5626 .amux = TV,
5627 .gpio = 0x00050000,
5628 },
5629 .mute = {
5630 .name = name_mute,
5631 .vmux = 0,
5632 .amux = TV,
5633 .gpio = 0x00050000,
5634 },
5635 },
5636 [SAA7134_BOARD_BEHOLD_501] = {
5637 /* Beholder Intl. Ltd. 2010 */
5638 /* Dmitry Belimov <d.belimov@gmail.com> */
5639 .name = "Beholder BeholdTV 501",
5640 .audio_clock = 0x00200000,
5641 .tuner_type = TUNER_ABSENT,
5642 .radio_type = UNSET,
5643 .tuner_addr = ADDR_UNSET,
5644 .radio_addr = ADDR_UNSET,
5645 .gpiomask = 0x00008000,
5646 .inputs = { {
5647 .name = name_tv,
5648 .vmux = 3,
5649 .amux = LINE2,
5650 .tv = 1,
5651 }, {
5652 .name = name_comp1,
5653 .vmux = 1,
5654 .amux = LINE1,
5655 }, {
5656 .name = name_svideo,
5657 .vmux = 8,
5658 .amux = LINE1,
5659 } },
5660 .mute = {
5661 .name = name_mute,
5662 .amux = LINE1,
5663 },
5664 },
5665 [SAA7134_BOARD_BEHOLD_503FM] = {
5666 /* Beholder Intl. Ltd. 2010 */
5667 /* Dmitry Belimov <d.belimov@gmail.com> */
5668 .name = "Beholder BeholdTV 503 FM",
5669 .audio_clock = 0x00200000,
5670 .tuner_type = TUNER_ABSENT,
5671 .radio_type = UNSET,
5672 .tuner_addr = ADDR_UNSET,
5673 .radio_addr = ADDR_UNSET,
5674 .gpiomask = 0x00008000,
5675 .inputs = { {
5676 .name = name_tv,
5677 .vmux = 3,
5678 .amux = LINE2,
5679 .tv = 1,
5680 }, {
5681 .name = name_comp1,
5682 .vmux = 1,
5683 .amux = LINE1,
5684 }, {
5685 .name = name_svideo,
5686 .vmux = 8,
5687 .amux = LINE1,
5688 } },
5689 .mute = {
5690 .name = name_mute,
5691 .amux = LINE1,
5692 },
5693 },
5694
5695};
5696
5697const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
5698
5699/* ------------------------------------------------------------------ */
5700/* PCI ids + subsystem IDs */
5701
5702struct pci_device_id saa7134_pci_tbl[] = {
5703 {
5704 .vendor = PCI_VENDOR_ID_PHILIPS,
5705 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5706 .subvendor = PCI_VENDOR_ID_PHILIPS,
5707 .subdevice = 0x2001,
5708 .driver_data = SAA7134_BOARD_PROTEUS_PRO,
5709 },{
5710 .vendor = PCI_VENDOR_ID_PHILIPS,
5711 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5712 .subvendor = PCI_VENDOR_ID_PHILIPS,
5713 .subdevice = 0x2001,
5714 .driver_data = SAA7134_BOARD_PROTEUS_PRO,
5715 },{
5716 .vendor = PCI_VENDOR_ID_PHILIPS,
5717 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5718 .subvendor = PCI_VENDOR_ID_PHILIPS,
5719 .subdevice = 0x6752,
5720 .driver_data = SAA7134_BOARD_EMPRESS,
5721 },{
5722 .vendor = PCI_VENDOR_ID_PHILIPS,
5723 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5724 .subvendor = 0x1131,
5725 .subdevice = 0x4e85,
5726 .driver_data = SAA7134_BOARD_MONSTERTV,
5727 },{
5728 .vendor = PCI_VENDOR_ID_PHILIPS,
5729 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5730 .subvendor = 0x153b,
5731 .subdevice = 0x1142,
5732 .driver_data = SAA7134_BOARD_CINERGY400,
5733 },{
5734 .vendor = PCI_VENDOR_ID_PHILIPS,
5735 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5736 .subvendor = 0x153b,
5737 .subdevice = 0x1143,
5738 .driver_data = SAA7134_BOARD_CINERGY600,
5739 },{
5740 .vendor = PCI_VENDOR_ID_PHILIPS,
5741 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5742 .subvendor = 0x153b,
5743 .subdevice = 0x1158,
5744 .driver_data = SAA7134_BOARD_CINERGY600_MK3,
5745 },{
5746 .vendor = PCI_VENDOR_ID_PHILIPS,
5747 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5748 .subvendor = 0x153b,
5749 .subdevice = 0x1162,
5750 .driver_data = SAA7134_BOARD_CINERGY400_CARDBUS,
5751 },{
5752 .vendor = PCI_VENDOR_ID_PHILIPS,
5753 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5754 .subvendor = 0x5169,
5755 .subdevice = 0x0138,
5756 .driver_data = SAA7134_BOARD_FLYVIDEO3000_NTSC,
5757 },{
5758 .vendor = PCI_VENDOR_ID_PHILIPS,
5759 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5760 .subvendor = 0x5168,
5761 .subdevice = 0x0138,
5762 .driver_data = SAA7134_BOARD_FLYVIDEO3000,
5763 },{
5764 .vendor = PCI_VENDOR_ID_PHILIPS,
5765 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5766 .subvendor = 0x4e42, /* "Typhoon PCI Capture TV Card" Art.No. 50673 */
5767 .subdevice = 0x0138,
5768 .driver_data = SAA7134_BOARD_FLYVIDEO3000,
5769 },{
5770 .vendor = PCI_VENDOR_ID_PHILIPS,
5771 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5772 .subvendor = 0x5168,
5773 .subdevice = 0x0138,
5774 .driver_data = SAA7134_BOARD_FLYVIDEO2000,
5775 },{
5776 .vendor = PCI_VENDOR_ID_PHILIPS,
5777 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5778 .subvendor = 0x4e42, /* Typhoon */
5779 .subdevice = 0x0138, /* LifeView FlyTV Prime30 OEM */
5780 .driver_data = SAA7134_BOARD_FLYVIDEO2000,
5781 },{
5782 .vendor = PCI_VENDOR_ID_PHILIPS,
5783 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5784 .subvendor = 0x5168,
5785 .subdevice = 0x0212, /* minipci, LR212 */
5786 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI,
5787 },{
5788 .vendor = PCI_VENDOR_ID_PHILIPS,
5789 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5790 .subvendor = 0x14c0,
5791 .subdevice = 0x1212, /* minipci, LR1212 */
5792 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI2,
5793 },{
5794 .vendor = PCI_VENDOR_ID_PHILIPS,
5795 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5796 .subvendor = 0x4e42,
5797 .subdevice = 0x0212, /* OEM minipci, LR212 */
5798 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI,
5799 },{
5800 .vendor = PCI_VENDOR_ID_PHILIPS,
5801 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5802 .subvendor = 0x5168, /* Animation Technologies (LifeView) */
5803 .subdevice = 0x0214, /* Standard PCI, LR214 Rev E and earlier (SAA7135) */
5804 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM,
5805 },{
5806 .vendor = PCI_VENDOR_ID_PHILIPS,
5807 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5808 .subvendor = 0x5168, /* Animation Technologies (LifeView) */
5809 .subdevice = 0x5214, /* Standard PCI, LR214 Rev F onwards (SAA7131) */
5810 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM,
5811 },{
5812 .vendor = PCI_VENDOR_ID_PHILIPS,
5813 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5814 .subvendor = 0x1489, /* KYE */
5815 .subdevice = 0x0214, /* Genius VideoWonder ProTV */
5816 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM, /* is an LR214WF actually */
5817 },{
5818 .vendor = PCI_VENDOR_ID_PHILIPS,
5819 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5820 .subvendor = 0x16be,
5821 .subdevice = 0x0003,
5822 .driver_data = SAA7134_BOARD_MD7134,
5823 },{
5824 .vendor = PCI_VENDOR_ID_PHILIPS,
5825 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5826 .subvendor = 0x16be, /* CTX946 analog TV, HW mpeg, DVB-T */
5827 .subdevice = 0x5000, /* only analog TV and DVB-T for now */
5828 .driver_data = SAA7134_BOARD_MD7134,
5829 }, {
5830 .vendor = PCI_VENDOR_ID_PHILIPS,
5831 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5832 .subvendor = 0x1048,
5833 .subdevice = 0x226b,
5834 .driver_data = SAA7134_BOARD_ELSA,
5835 },{
5836 .vendor = PCI_VENDOR_ID_PHILIPS,
5837 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5838 .subvendor = 0x1048,
5839 .subdevice = 0x226a,
5840 .driver_data = SAA7134_BOARD_ELSA_500TV,
5841 },{
5842 .vendor = PCI_VENDOR_ID_PHILIPS,
5843 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5844 .subvendor = 0x1048,
5845 .subdevice = 0x226c,
5846 .driver_data = SAA7134_BOARD_ELSA_700TV,
5847 },{
5848 .vendor = PCI_VENDOR_ID_PHILIPS,
5849 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5850 .subvendor = PCI_VENDOR_ID_ASUSTEK,
5851 .subdevice = 0x4842,
5852 .driver_data = SAA7134_BOARD_ASUSTeK_TVFM7134,
5853 },{
5854 .vendor = PCI_VENDOR_ID_PHILIPS,
5855 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5856 .subvendor = PCI_VENDOR_ID_ASUSTEK,
5857 .subdevice = 0x4845,
5858 .driver_data = SAA7134_BOARD_ASUSTeK_TVFM7135,
5859 },{
5860 .vendor = PCI_VENDOR_ID_PHILIPS,
5861 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5862 .subvendor = PCI_VENDOR_ID_ASUSTEK,
5863 .subdevice = 0x4830,
5864 .driver_data = SAA7134_BOARD_ASUSTeK_TVFM7134,
5865 },{
5866 .vendor = PCI_VENDOR_ID_PHILIPS,
5867 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5868 .subvendor = PCI_VENDOR_ID_ASUSTEK,
5869 .subdevice = 0x4843,
5870 .driver_data = SAA7134_BOARD_ASUSTEK_TVFM7133,
5871 },{
5872 .vendor = PCI_VENDOR_ID_PHILIPS,
5873 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5874 .subvendor = PCI_VENDOR_ID_ASUSTEK,
5875 .subdevice = 0x4840,
5876 .driver_data = SAA7134_BOARD_ASUSTeK_TVFM7134,
5877 },{
5878 .vendor = PCI_VENDOR_ID_PHILIPS,
5879 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5880 .subvendor = PCI_VENDOR_ID_PHILIPS,
5881 .subdevice = 0xfe01,
5882 .driver_data = SAA7134_BOARD_TVSTATION_RDS,
5883 },{
5884 .vendor = PCI_VENDOR_ID_PHILIPS,
5885 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5886 .subvendor = 0x1894,
5887 .subdevice = 0xfe01,
5888 .driver_data = SAA7134_BOARD_TVSTATION_RDS,
5889 },{
5890 .vendor = PCI_VENDOR_ID_PHILIPS,
5891 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5892 .subvendor = 0x1894,
5893 .subdevice = 0xa006,
5894 .driver_data = SAA7134_BOARD_TVSTATION_DVR,
5895 },{
5896 .vendor = PCI_VENDOR_ID_PHILIPS,
5897 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5898 .subvendor = 0x1131,
5899 .subdevice = 0x7133,
5900 .driver_data = SAA7134_BOARD_VA1000POWER,
5901 },{
5902 .vendor = PCI_VENDOR_ID_PHILIPS,
5903 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5904 .subvendor = PCI_VENDOR_ID_PHILIPS,
5905 .subdevice = 0x2001,
5906 .driver_data = SAA7134_BOARD_10MOONSTVMASTER,
5907 },{
5908 .vendor = PCI_VENDOR_ID_PHILIPS,
5909 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5910 .subvendor = 0x185b,
5911 .subdevice = 0xc100,
5912 .driver_data = SAA7134_BOARD_VIDEOMATE_TV,
5913 },{
5914 .vendor = PCI_VENDOR_ID_PHILIPS,
5915 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5916 .subvendor = 0x185b,
5917 .subdevice = 0xc100,
5918 .driver_data = SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUS,
5919 },{
5920 .vendor = PCI_VENDOR_ID_PHILIPS,
5921 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5922 .subvendor = PCI_VENDOR_ID_MATROX,
5923 .subdevice = 0x48d0,
5924 .driver_data = SAA7134_BOARD_CRONOS_PLUS,
5925 },{
5926 .vendor = PCI_VENDOR_ID_PHILIPS,
5927 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5928 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5929 .subdevice = 0xa70b,
5930 .driver_data = SAA7134_BOARD_MD2819,
5931 },{
5932 .vendor = PCI_VENDOR_ID_PHILIPS,
5933 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5934 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5935 .subdevice = 0xa7a1,
5936 .driver_data = SAA7134_BOARD_AVERMEDIA_A700_PRO,
5937 }, {
5938 .vendor = PCI_VENDOR_ID_PHILIPS,
5939 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5940 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5941 .subdevice = 0xa7a2,
5942 .driver_data = SAA7134_BOARD_AVERMEDIA_A700_HYBRID,
5943 }, {
5944 .vendor = PCI_VENDOR_ID_PHILIPS,
5945 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5946 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5947 .subdevice = 0x2115,
5948 .driver_data = SAA7134_BOARD_AVERMEDIA_STUDIO_305,
5949 },{
5950 .vendor = PCI_VENDOR_ID_PHILIPS,
5951 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5952 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5953 .subdevice = 0xa115,
5954 .driver_data = SAA7134_BOARD_AVERMEDIA_STUDIO_505,
5955 }, {
5956 .vendor = PCI_VENDOR_ID_PHILIPS,
5957 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5958 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5959 .subdevice = 0x2108,
5960 .driver_data = SAA7134_BOARD_AVERMEDIA_305,
5961 },{
5962 .vendor = PCI_VENDOR_ID_PHILIPS,
5963 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5964 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5965 .subdevice = 0x10ff,
5966 .driver_data = SAA7134_BOARD_AVERMEDIA_DVD_EZMAKER,
5967 },{
5968 /* AVerMedia CardBus */
5969 .vendor = PCI_VENDOR_ID_PHILIPS,
5970 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5971 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5972 .subdevice = 0xd6ee,
5973 .driver_data = SAA7134_BOARD_AVERMEDIA_CARDBUS,
5974 },{
5975 /* AVerMedia CardBus */
5976 .vendor = PCI_VENDOR_ID_PHILIPS,
5977 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5978 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5979 .subdevice = 0xb7e9,
5980 .driver_data = SAA7134_BOARD_AVERMEDIA_CARDBUS_501,
5981 }, {
5982 /* TransGear 3000TV */
5983 .vendor = PCI_VENDOR_ID_PHILIPS,
5984 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5985 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5986 .subdevice = 0x050c,
5987 .driver_data = SAA7134_BOARD_TG3000TV,
5988 },{
5989 .vendor = PCI_VENDOR_ID_PHILIPS,
5990 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5991 .subvendor = 0x11bd,
5992 .subdevice = 0x002b,
5993 .driver_data = SAA7134_BOARD_PINNACLE_PCTV_STEREO,
5994 },{
5995 .vendor = PCI_VENDOR_ID_PHILIPS,
5996 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
5997 .subvendor = 0x11bd,
5998 .subdevice = 0x002d,
5999 .driver_data = SAA7134_BOARD_PINNACLE_300I_DVBT_PAL,
6000 },{
6001 .vendor = PCI_VENDOR_ID_PHILIPS,
6002 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6003 .subvendor = 0x1019,
6004 .subdevice = 0x4cb4,
6005 .driver_data = SAA7134_BOARD_ECS_TVP3XP,
6006 },{
6007 .vendor = PCI_VENDOR_ID_PHILIPS,
6008 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6009 .subvendor = 0x1019,
6010 .subdevice = 0x4cb5,
6011 .driver_data = SAA7134_BOARD_ECS_TVP3XP_4CB5,
6012 },{
6013 .vendor = PCI_VENDOR_ID_PHILIPS,
6014 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6015 .subvendor = 0x1019,
6016 .subdevice = 0x4cb6,
6017 .driver_data = SAA7134_BOARD_ECS_TVP3XP_4CB6,
6018 },{
6019 .vendor = PCI_VENDOR_ID_PHILIPS,
6020 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6021 .subvendor = 0x12ab,
6022 .subdevice = 0x0800,
6023 .driver_data = SAA7134_BOARD_UPMOST_PURPLE_TV,
6024 },{
6025 .vendor = PCI_VENDOR_ID_PHILIPS,
6026 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6027 .subvendor = 0x153b,
6028 .subdevice = 0x1152,
6029 .driver_data = SAA7134_BOARD_CINERGY200,
6030 },{
6031 .vendor = PCI_VENDOR_ID_PHILIPS,
6032 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6033 .subvendor = 0x185b,
6034 .subdevice = 0xc100,
6035 .driver_data = SAA7134_BOARD_VIDEOMATE_TV_PVR,
6036 },{
6037 .vendor = PCI_VENDOR_ID_PHILIPS,
6038 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6039 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6040 .subdevice = 0x9715,
6041 .driver_data = SAA7134_BOARD_AVERMEDIA_STUDIO_307,
6042 },{
6043 .vendor = PCI_VENDOR_ID_PHILIPS,
6044 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6045 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6046 .subdevice = 0xa70a,
6047 .driver_data = SAA7134_BOARD_AVERMEDIA_307,
6048 },{
6049 .vendor = PCI_VENDOR_ID_PHILIPS,
6050 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6051 .subvendor = 0x185b,
6052 .subdevice = 0xc200,
6053 .driver_data = SAA7134_BOARD_VIDEOMATE_GOLD_PLUS,
6054 },{
6055 .vendor = PCI_VENDOR_ID_PHILIPS,
6056 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6057 .subvendor = 0x1540,
6058 .subdevice = 0x9524,
6059 .driver_data = SAA7134_BOARD_PROVIDEO_PV952,
6060
6061 },{
6062 .vendor = PCI_VENDOR_ID_PHILIPS,
6063 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6064 .subvendor = 0x5168,
6065 .subdevice = 0x0502, /* Cardbus version */
6066 .driver_data = SAA7134_BOARD_FLYDVBT_DUO_CARDBUS,
6067 },{
6068 .vendor = PCI_VENDOR_ID_PHILIPS,
6069 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6070 .subvendor = 0x5168,
6071 .subdevice = 0x0306, /* PCI version */
6072 .driver_data = SAA7134_BOARD_FLYDVBTDUO,
6073 },{
6074 .vendor = PCI_VENDOR_ID_PHILIPS,
6075 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6076 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6077 .subdevice = 0xf31f,
6078 .driver_data = SAA7134_BOARD_AVERMEDIA_GO_007_FM,
6079
6080 },{
6081 .vendor = PCI_VENDOR_ID_PHILIPS,
6082 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6083 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6084 .subdevice = 0xf11d,
6085 .driver_data = SAA7134_BOARD_AVERMEDIA_M135A,
6086 }, {
6087 .vendor = PCI_VENDOR_ID_PHILIPS,
6088 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6089 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6090 .subdevice = 0x4155,
6091 .driver_data = SAA7134_BOARD_AVERMEDIA_M733A,
6092 }, {
6093 .vendor = PCI_VENDOR_ID_PHILIPS,
6094 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6095 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6096 .subdevice = 0x4255,
6097 .driver_data = SAA7134_BOARD_AVERMEDIA_M733A,
6098 }, {
6099 .vendor = PCI_VENDOR_ID_PHILIPS,
6100 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6101 .subvendor = PCI_VENDOR_ID_PHILIPS,
6102 .subdevice = 0x2004,
6103 .driver_data = SAA7134_BOARD_PHILIPS_TOUGH,
6104 },{
6105 .vendor = PCI_VENDOR_ID_PHILIPS,
6106 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6107 .subvendor = 0x1421,
6108 .subdevice = 0x0350, /* PCI version */
6109 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV,
6110 },{
6111 .vendor = PCI_VENDOR_ID_PHILIPS,
6112 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6113 .subvendor = 0x1421,
6114 .subdevice = 0x0351, /* PCI version, new revision */
6115 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV,
6116 },{
6117 .vendor = PCI_VENDOR_ID_PHILIPS,
6118 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6119 .subvendor = 0x1421,
6120 .subdevice = 0x0370, /* cardbus version */
6121 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV,
6122 },{
6123 .vendor = PCI_VENDOR_ID_PHILIPS,
6124 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6125 .subvendor = 0x1421,
6126 .subdevice = 0x1370, /* cardbus version */
6127 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV,
6128
6129 },{
6130 .vendor = PCI_VENDOR_ID_PHILIPS,
6131 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6132 .subvendor = 0x4e42, /* Typhoon */
6133 .subdevice = 0x0502, /* LifeView LR502 OEM */
6134 .driver_data = SAA7134_BOARD_FLYDVBT_DUO_CARDBUS,
6135 },{
6136 .vendor = PCI_VENDOR_ID_PHILIPS,
6137 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6138 .subvendor = 0x1043,
6139 .subdevice = 0x0210, /* mini pci NTSC version */
6140 .driver_data = SAA7134_BOARD_FLYTV_DIGIMATRIX,
6141 },{
6142 .vendor = PCI_VENDOR_ID_PHILIPS,
6143 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6144 .subvendor = 0x1043,
6145 .subdevice = 0x0210, /* mini pci PAL/SECAM version */
6146 .driver_data = SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV,
6147
6148 },{
6149 .vendor = PCI_VENDOR_ID_PHILIPS,
6150 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6151 .subvendor = 0x0000, /* It shouldn't break anything, since subdevice id seems unique */
6152 .subdevice = 0x4091,
6153 .driver_data = SAA7134_BOARD_BEHOLD_409FM,
6154 },{
6155 .vendor = PCI_VENDOR_ID_PHILIPS,
6156 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6157 .subvendor = 0x5456, /* GoTView */
6158 .subdevice = 0x7135,
6159 .driver_data = SAA7134_BOARD_GOTVIEW_7135,
6160 },{
6161 .vendor = PCI_VENDOR_ID_PHILIPS,
6162 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6163 .subvendor = PCI_VENDOR_ID_PHILIPS,
6164 .subdevice = 0x2004,
6165 .driver_data = SAA7134_BOARD_PHILIPS_EUROPA,
6166 },{
6167 .vendor = PCI_VENDOR_ID_PHILIPS,
6168 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6169 .subvendor = 0x185b,
6170 .subdevice = 0xc900,
6171 .driver_data = SAA7134_BOARD_VIDEOMATE_DVBT_300,
6172 },{
6173 .vendor = PCI_VENDOR_ID_PHILIPS,
6174 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6175 .subvendor = 0x185b,
6176 .subdevice = 0xc901,
6177 .driver_data = SAA7134_BOARD_VIDEOMATE_DVBT_200,
6178 },{
6179 .vendor = PCI_VENDOR_ID_PHILIPS,
6180 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6181 .subvendor = 0x1435,
6182 .subdevice = 0x7350,
6183 .driver_data = SAA7134_BOARD_RTD_VFG7350,
6184 },{
6185 .vendor = PCI_VENDOR_ID_PHILIPS,
6186 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6187 .subvendor = 0x1435,
6188 .subdevice = 0x7330,
6189 .driver_data = SAA7134_BOARD_RTD_VFG7330,
6190 },{
6191 .vendor = PCI_VENDOR_ID_PHILIPS,
6192 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6193 .subvendor = 0x1461,
6194 .subdevice = 0x1044,
6195 .driver_data = SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180,
6196 },{
6197 .vendor = PCI_VENDOR_ID_PHILIPS,
6198 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6199 .subvendor = 0x1131,
6200 .subdevice = 0x4ee9,
6201 .driver_data = SAA7134_BOARD_MONSTERTV_MOBILE,
6202 },{
6203 .vendor = PCI_VENDOR_ID_PHILIPS,
6204 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6205 .subvendor = 0x11bd,
6206 .subdevice = 0x002e,
6207 .driver_data = SAA7134_BOARD_PINNACLE_PCTV_110i,
6208 },{
6209 .vendor = PCI_VENDOR_ID_PHILIPS,
6210 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6211 .subvendor = 0x1043,
6212 .subdevice = 0x4862,
6213 .driver_data = SAA7134_BOARD_ASUSTeK_P7131_DUAL,
6214 },{
6215 .vendor = PCI_VENDOR_ID_PHILIPS,
6216 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6217 .subvendor = PCI_VENDOR_ID_PHILIPS,
6218 .subdevice = 0x2018,
6219 .driver_data = SAA7134_BOARD_PHILIPS_TIGER,
6220 },{
6221 .vendor = PCI_VENDOR_ID_PHILIPS,
6222 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6223 .subvendor = 0x1462,
6224 .subdevice = 0x6231, /* tda8275a, ks003 IR */
6225 .driver_data = SAA7134_BOARD_MSI_TVATANYWHERE_PLUS,
6226 },{
6227 .vendor = PCI_VENDOR_ID_PHILIPS,
6228 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6229 .subvendor = 0x1462,
6230 .subdevice = 0x8624, /* tda8275, ks003 IR */
6231 .driver_data = SAA7134_BOARD_MSI_TVATANYWHERE_PLUS,
6232 },{
6233 .vendor = PCI_VENDOR_ID_PHILIPS,
6234 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6235 .subvendor = 0x153b,
6236 .subdevice = 0x1160,
6237 .driver_data = SAA7134_BOARD_CINERGY250PCI,
6238 },{
6239 .vendor = PCI_VENDOR_ID_PHILIPS,
6240 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, /* SAA 7131E */
6241 .subvendor = 0x5168,
6242 .subdevice = 0x0319,
6243 .driver_data = SAA7134_BOARD_FLYDVB_TRIO,
6244 },{
6245 .vendor = PCI_VENDOR_ID_PHILIPS,
6246 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6247 .subvendor = 0x1461,
6248 .subdevice = 0x2c05,
6249 .driver_data = SAA7134_BOARD_AVERMEDIA_777,
6250 },{
6251 .vendor = PCI_VENDOR_ID_PHILIPS,
6252 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6253 .subvendor = 0x5168,
6254 .subdevice = 0x0301,
6255 .driver_data = SAA7134_BOARD_FLYDVBT_LR301,
6256 },{
6257 .vendor = PCI_VENDOR_ID_PHILIPS,
6258 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6259 .subvendor = 0x0331,
6260 .subdevice = 0x1421,
6261 .driver_data = SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331,
6262 },{
6263 .vendor = PCI_VENDOR_ID_PHILIPS,
6264 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6265 .subvendor = 0x17de,
6266 .subdevice = 0x7201,
6267 .driver_data = SAA7134_BOARD_TEVION_DVBT_220RF,
6268 },{
6269 .vendor = PCI_VENDOR_ID_PHILIPS,
6270 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6271 .subvendor = 0x17de,
6272 .subdevice = 0x7250,
6273 .driver_data = SAA7134_BOARD_KWORLD_DVBT_210,
6274 },{
6275 .vendor = PCI_VENDOR_ID_PHILIPS,
6276 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, /* SAA7135HL */
6277 .subvendor = 0x17de,
6278 .subdevice = 0x7350,
6279 .driver_data = SAA7134_BOARD_KWORLD_ATSC110,
6280 },{
6281 .vendor = PCI_VENDOR_ID_PHILIPS,
6282 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, /* SAA7135HL */
6283 .subvendor = 0x17de,
6284 .subdevice = 0x7352,
6285 .driver_data = SAA7134_BOARD_KWORLD_ATSC110, /* ATSC 115 */
6286 },{
6287 .vendor = PCI_VENDOR_ID_PHILIPS,
6288 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6289 .subvendor = 0x1461,
6290 .subdevice = 0x7360,
6291 .driver_data = SAA7134_BOARD_AVERMEDIA_A169_B,
6292 },{
6293 .vendor = PCI_VENDOR_ID_PHILIPS,
6294 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6295 .subvendor = 0x1461,
6296 .subdevice = 0x6360,
6297 .driver_data = SAA7134_BOARD_AVERMEDIA_A169_B1,
6298 },{
6299 .vendor = PCI_VENDOR_ID_PHILIPS,
6300 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6301 .subvendor = 0x16be,
6302 .subdevice = 0x0005,
6303 .driver_data = SAA7134_BOARD_MD7134_BRIDGE_2,
6304 },{
6305 .vendor = PCI_VENDOR_ID_PHILIPS,
6306 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6307 .subvendor = 0x5168,
6308 .subdevice = 0x0300,
6309 .driver_data = SAA7134_BOARD_FLYDVBS_LR300,
6310 },{
6311 .vendor = PCI_VENDOR_ID_PHILIPS,
6312 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6313 .subvendor = 0x4e42,
6314 .subdevice = 0x0300,/* LR300 */
6315 .driver_data = SAA7134_BOARD_FLYDVBS_LR300,
6316 },{
6317 .vendor = PCI_VENDOR_ID_PHILIPS,
6318 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6319 .subvendor = 0x1489,
6320 .subdevice = 0x0301,
6321 .driver_data = SAA7134_BOARD_FLYDVBT_LR301,
6322 },{
6323 .vendor = PCI_VENDOR_ID_PHILIPS,
6324 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6325 .subvendor = 0x5168, /* Animation Technologies (LifeView) */
6326 .subdevice = 0x0304,
6327 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM,
6328 },{
6329 .vendor = PCI_VENDOR_ID_PHILIPS,
6330 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6331 .subvendor = 0x5168,
6332 .subdevice = 0x3306,
6333 .driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
6334 },{
6335 .vendor = PCI_VENDOR_ID_PHILIPS,
6336 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6337 .subvendor = 0x5168,
6338 .subdevice = 0x3502, /* whats the difference to 0x3306 ?*/
6339 .driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
6340 },{
6341 .vendor = PCI_VENDOR_ID_PHILIPS,
6342 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6343 .subvendor = 0x5168,
6344 .subdevice = 0x3307, /* FlyDVB-T Hybrid Mini PCI */
6345 .driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
6346 }, {
6347 .vendor = PCI_VENDOR_ID_PHILIPS,
6348 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6349 .subvendor = 0x16be,
6350 .subdevice = 0x0007,
6351 .driver_data = SAA7134_BOARD_MEDION_MD8800_QUADRO,
6352 },{
6353 .vendor = PCI_VENDOR_ID_PHILIPS,
6354 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6355 .subvendor = 0x16be,
6356 .subdevice = 0x0008,
6357 .driver_data = SAA7134_BOARD_MEDION_MD8800_QUADRO,
6358 },{
6359 .vendor = PCI_VENDOR_ID_PHILIPS,
6360 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6361 .subvendor = 0x16be,
6362 .subdevice = 0x000d, /* triple CTX948_V1.1.1 */
6363 .driver_data = SAA7134_BOARD_MEDION_MD8800_QUADRO,
6364 }, {
6365 .vendor = PCI_VENDOR_ID_PHILIPS,
6366 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6367 .subvendor = 0x1461,
6368 .subdevice = 0x2c05,
6369 .driver_data = SAA7134_BOARD_AVERMEDIA_777,
6370 },{
6371 .vendor = PCI_VENDOR_ID_PHILIPS,
6372 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6373 .subvendor = 0x1489,
6374 .subdevice = 0x0502, /* Cardbus version */
6375 .driver_data = SAA7134_BOARD_FLYDVBT_DUO_CARDBUS,
6376 },{
6377 .vendor = PCI_VENDOR_ID_PHILIPS,
6378 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6379 .subvendor = 0x0919, /* Philips Proteus PRO 2309 */
6380 .subdevice = 0x2003,
6381 .driver_data = SAA7134_BOARD_PROTEUS_2309,
6382 },{
6383 .vendor = PCI_VENDOR_ID_PHILIPS,
6384 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6385 .subvendor = 0x1461,
6386 .subdevice = 0x2c00,
6387 .driver_data = SAA7134_BOARD_AVERMEDIA_A16AR,
6388 },{
6389 .vendor = PCI_VENDOR_ID_PHILIPS,
6390 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6391 .subvendor = 0x1043,
6392 .subdevice = 0x4860,
6393 .driver_data = SAA7134_BOARD_ASUS_EUROPA2_HYBRID,
6394 },{
6395 .vendor = PCI_VENDOR_ID_PHILIPS,
6396 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6397 .subvendor = 0x11bd,
6398 .subdevice = 0x002f,
6399 .driver_data = SAA7134_BOARD_PINNACLE_PCTV_310i,
6400 },{
6401 .vendor = PCI_VENDOR_ID_PHILIPS,
6402 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6403 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6404 .subdevice = 0x9715,
6405 .driver_data = SAA7134_BOARD_AVERMEDIA_STUDIO_507,
6406 },{
6407 .vendor = PCI_VENDOR_ID_PHILIPS,
6408 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6409 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6410 .subdevice = 0xa11b,
6411 .driver_data = SAA7134_BOARD_AVERMEDIA_STUDIO_507UA,
6412 }, {
6413 .vendor = PCI_VENDOR_ID_PHILIPS,
6414 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6415 .subvendor = 0x1043,
6416 .subdevice = 0x4876,
6417 .driver_data = SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA,
6418 },{
6419 .vendor = PCI_VENDOR_ID_PHILIPS,
6420 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6421 .subvendor = 0x0070,
6422 .subdevice = 0x6700,
6423 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110,
6424 },{
6425 .vendor = PCI_VENDOR_ID_PHILIPS,
6426 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6427 .subvendor = 0x0070,
6428 .subdevice = 0x6701,
6429 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110,
6430 },{
6431 .vendor = PCI_VENDOR_ID_PHILIPS,
6432 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6433 .subvendor = 0x0070,
6434 .subdevice = 0x6702,
6435 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110,
6436 },{
6437 .vendor = PCI_VENDOR_ID_PHILIPS,
6438 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6439 .subvendor = 0x0070,
6440 .subdevice = 0x6703,
6441 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110,
6442 },{
6443 .vendor = PCI_VENDOR_ID_PHILIPS,
6444 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6445 .subvendor = 0x0070,
6446 .subdevice = 0x6704,
6447 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110,
6448 },{
6449 .vendor = PCI_VENDOR_ID_PHILIPS,
6450 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6451 .subvendor = 0x0070,
6452 .subdevice = 0x6705,
6453 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1110,
6454 },{
6455 .vendor = PCI_VENDOR_ID_PHILIPS,
6456 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6457 .subvendor = 0x0070,
6458 .subdevice = 0x6706,
6459 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1150,
6460 },{
6461 .vendor = PCI_VENDOR_ID_PHILIPS,
6462 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6463 .subvendor = 0x0070,
6464 .subdevice = 0x6707,
6465 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120,
6466 },{
6467 .vendor = PCI_VENDOR_ID_PHILIPS,
6468 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6469 .subvendor = 0x0070,
6470 .subdevice = 0x6708,
6471 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1150,
6472 },{
6473 .vendor = PCI_VENDOR_ID_PHILIPS,
6474 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6475 .subvendor = 0x0070,
6476 .subdevice = 0x6709,
6477 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120,
6478 },{
6479 .vendor = PCI_VENDOR_ID_PHILIPS,
6480 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6481 .subvendor = 0x0070,
6482 .subdevice = 0x670a,
6483 .driver_data = SAA7134_BOARD_HAUPPAUGE_HVR1120,
6484 },{
6485 .vendor = PCI_VENDOR_ID_PHILIPS,
6486 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6487 .subvendor = 0x153b,
6488 .subdevice = 0x1172,
6489 .driver_data = SAA7134_BOARD_CINERGY_HT_PCMCIA,
6490 },{
6491 .vendor = PCI_VENDOR_ID_PHILIPS,
6492 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6493 .subvendor = PCI_VENDOR_ID_PHILIPS,
6494 .subdevice = 0x2342,
6495 .driver_data = SAA7134_BOARD_ENCORE_ENLTV,
6496 },{
6497 .vendor = PCI_VENDOR_ID_PHILIPS,
6498 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6499 .subvendor = 0x1131,
6500 .subdevice = 0x2341,
6501 .driver_data = SAA7134_BOARD_ENCORE_ENLTV,
6502 },{
6503 .vendor = PCI_VENDOR_ID_PHILIPS,
6504 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6505 .subvendor = 0x3016,
6506 .subdevice = 0x2344,
6507 .driver_data = SAA7134_BOARD_ENCORE_ENLTV,
6508 },{
6509 .vendor = PCI_VENDOR_ID_PHILIPS,
6510 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6511 .subvendor = 0x1131,
6512 .subdevice = 0x230f,
6513 .driver_data = SAA7134_BOARD_ENCORE_ENLTV_FM,
6514 },{
6515 .vendor = PCI_VENDOR_ID_PHILIPS,
6516 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6517 .subvendor = 0x1a7f,
6518 .subdevice = 0x2008,
6519 .driver_data = SAA7134_BOARD_ENCORE_ENLTV_FM53,
6520 }, {
6521 .vendor = PCI_VENDOR_ID_PHILIPS,
6522 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6523 .subvendor = 0x1a7f,
6524 .subdevice = 0x2108,
6525 .driver_data = SAA7134_BOARD_ENCORE_ENLTV_FM3,
6526 }, {
6527 .vendor = PCI_VENDOR_ID_PHILIPS,
6528 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6529 .subvendor = 0x153b,
6530 .subdevice = 0x1175,
6531 .driver_data = SAA7134_BOARD_CINERGY_HT_PCI,
6532 },{
6533 .vendor = PCI_VENDOR_ID_PHILIPS,
6534 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6535 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6536 .subdevice = 0xf31e,
6537 .driver_data = SAA7134_BOARD_AVERMEDIA_M102,
6538 },{
6539 .vendor = PCI_VENDOR_ID_PHILIPS,
6540 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6541 .subvendor = 0x4E42, /* MSI */
6542 .subdevice = 0x0306, /* TV@nywhere DUO */
6543 .driver_data = SAA7134_BOARD_FLYDVBTDUO,
6544 },{
6545 .vendor = PCI_VENDOR_ID_PHILIPS,
6546 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6547 .subvendor = 0x1043,
6548 .subdevice = 0x4871,
6549 .driver_data = SAA7134_BOARD_ASUS_P7131_4871,
6550 },{
6551 .vendor = PCI_VENDOR_ID_PHILIPS,
6552 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6553 .subvendor = 0x1043,
6554 .subdevice = 0x4857, /* REV:1.00 */
6555 .driver_data = SAA7134_BOARD_ASUSTeK_TIGER,
6556 },{
6557 .vendor = PCI_VENDOR_ID_PHILIPS,
6558 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6559 .subvendor = 0x0919, /* SinoVideo PCI 2309 Proteus (7134) */
6560 .subdevice = 0x2003, /* OEM cardbus */
6561 .driver_data = SAA7134_BOARD_SABRENT_TV_PCB05,
6562 },{
6563 .vendor = PCI_VENDOR_ID_PHILIPS,
6564 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6565 .subvendor = PCI_VENDOR_ID_PHILIPS,
6566 .subdevice = 0x2304,
6567 .driver_data = SAA7134_BOARD_10MOONSTVMASTER3,
6568 },{
6569 .vendor = PCI_VENDOR_ID_PHILIPS,
6570 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6571 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6572 .subdevice = 0xf01d, /* AVerTV DVB-T Super 007 */
6573 .driver_data = SAA7134_BOARD_AVERMEDIA_SUPER_007,
6574 },{
6575 .vendor = PCI_VENDOR_ID_PHILIPS,
6576 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6577 .subvendor = 0x0000,
6578 .subdevice = 0x4016,
6579 .driver_data = SAA7134_BOARD_BEHOLD_401,
6580 },{
6581 .vendor = PCI_VENDOR_ID_PHILIPS,
6582 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6583 .subvendor = 0x0000,
6584 .subdevice = 0x4036,
6585 .driver_data = SAA7134_BOARD_BEHOLD_403,
6586 },{
6587 .vendor = PCI_VENDOR_ID_PHILIPS,
6588 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6589 .subvendor = 0x0000,
6590 .subdevice = 0x4037,
6591 .driver_data = SAA7134_BOARD_BEHOLD_403FM,
6592 },{
6593 .vendor = PCI_VENDOR_ID_PHILIPS,
6594 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6595 .subvendor = 0x0000,
6596 .subdevice = 0x4050,
6597 .driver_data = SAA7134_BOARD_BEHOLD_405,
6598 },{
6599 .vendor = PCI_VENDOR_ID_PHILIPS,
6600 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6601 .subvendor = 0x0000,
6602 .subdevice = 0x4051,
6603 .driver_data = SAA7134_BOARD_BEHOLD_405FM,
6604 },{
6605 .vendor = PCI_VENDOR_ID_PHILIPS,
6606 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6607 .subvendor = 0x0000,
6608 .subdevice = 0x4070,
6609 .driver_data = SAA7134_BOARD_BEHOLD_407,
6610 },{
6611 .vendor = PCI_VENDOR_ID_PHILIPS,
6612 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6613 .subvendor = 0x0000,
6614 .subdevice = 0x4071,
6615 .driver_data = SAA7134_BOARD_BEHOLD_407FM,
6616 },{
6617 .vendor = PCI_VENDOR_ID_PHILIPS,
6618 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6619 .subvendor = 0x0000,
6620 .subdevice = 0x4090,
6621 .driver_data = SAA7134_BOARD_BEHOLD_409,
6622 },{
6623 .vendor = PCI_VENDOR_ID_PHILIPS,
6624 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6625 .subvendor = 0x0000,
6626 .subdevice = 0x505B,
6627 .driver_data = SAA7134_BOARD_BEHOLD_505RDS_MK5,
6628 }, {
6629 .vendor = PCI_VENDOR_ID_PHILIPS,
6630 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6631 .subvendor = 0x0000,
6632 .subdevice = 0x5051,
6633 .driver_data = SAA7134_BOARD_BEHOLD_505RDS_MK3,
6634 },{
6635 .vendor = PCI_VENDOR_ID_PHILIPS,
6636 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6637 .subvendor = 0x5ace,
6638 .subdevice = 0x5050,
6639 .driver_data = SAA7134_BOARD_BEHOLD_505FM,
6640 },{
6641 .vendor = PCI_VENDOR_ID_PHILIPS,
6642 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6643 .subvendor = 0x0000,
6644 .subdevice = 0x5071,
6645 .driver_data = SAA7134_BOARD_BEHOLD_507RDS_MK3,
6646 },{
6647 .vendor = PCI_VENDOR_ID_PHILIPS,
6648 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6649 .subvendor = 0x0000,
6650 .subdevice = 0x507B,
6651 .driver_data = SAA7134_BOARD_BEHOLD_507RDS_MK5,
6652 },{
6653 .vendor = PCI_VENDOR_ID_PHILIPS,
6654 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6655 .subvendor = 0x5ace,
6656 .subdevice = 0x5070,
6657 .driver_data = SAA7134_BOARD_BEHOLD_507_9FM,
6658 },{
6659 .vendor = PCI_VENDOR_ID_PHILIPS,
6660 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6661 .subvendor = 0x5ace,
6662 .subdevice = 0x5090,
6663 .driver_data = SAA7134_BOARD_BEHOLD_507_9FM,
6664 },{
6665 .vendor = PCI_VENDOR_ID_PHILIPS,
6666 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6667 .subvendor = 0x0000,
6668 .subdevice = 0x5201,
6669 .driver_data = SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM,
6670 },{
6671 .vendor = PCI_VENDOR_ID_PHILIPS,
6672 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6673 .subvendor = 0x5ace,
6674 .subdevice = 0x6070,
6675 .driver_data = SAA7134_BOARD_BEHOLD_607FM_MK3,
6676 },{
6677 .vendor = PCI_VENDOR_ID_PHILIPS,
6678 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6679 .subvendor = 0x5ace,
6680 .subdevice = 0x6071,
6681 .driver_data = SAA7134_BOARD_BEHOLD_607FM_MK5,
6682 },{
6683 .vendor = PCI_VENDOR_ID_PHILIPS,
6684 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6685 .subvendor = 0x5ace,
6686 .subdevice = 0x6072,
6687 .driver_data = SAA7134_BOARD_BEHOLD_607RDS_MK3,
6688 },{
6689 .vendor = PCI_VENDOR_ID_PHILIPS,
6690 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6691 .subvendor = 0x5ace,
6692 .subdevice = 0x6073,
6693 .driver_data = SAA7134_BOARD_BEHOLD_607RDS_MK5,
6694 },{
6695 .vendor = PCI_VENDOR_ID_PHILIPS,
6696 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6697 .subvendor = 0x5ace,
6698 .subdevice = 0x6090,
6699 .driver_data = SAA7134_BOARD_BEHOLD_609FM_MK3,
6700 },{
6701 .vendor = PCI_VENDOR_ID_PHILIPS,
6702 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6703 .subvendor = 0x5ace,
6704 .subdevice = 0x6091,
6705 .driver_data = SAA7134_BOARD_BEHOLD_609FM_MK5,
6706 },{
6707 .vendor = PCI_VENDOR_ID_PHILIPS,
6708 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6709 .subvendor = 0x5ace,
6710 .subdevice = 0x6092,
6711 .driver_data = SAA7134_BOARD_BEHOLD_609RDS_MK3,
6712 },{
6713 .vendor = PCI_VENDOR_ID_PHILIPS,
6714 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6715 .subvendor = 0x5ace,
6716 .subdevice = 0x6093,
6717 .driver_data = SAA7134_BOARD_BEHOLD_609RDS_MK5,
6718 },{
6719 .vendor = PCI_VENDOR_ID_PHILIPS,
6720 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6721 .subvendor = 0x5ace,
6722 .subdevice = 0x6190,
6723 .driver_data = SAA7134_BOARD_BEHOLD_M6,
6724 },{
6725 .vendor = PCI_VENDOR_ID_PHILIPS,
6726 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6727 .subvendor = 0x5ace,
6728 .subdevice = 0x6193,
6729 .driver_data = SAA7134_BOARD_BEHOLD_M6_EXTRA,
6730 }, {
6731 .vendor = PCI_VENDOR_ID_PHILIPS,
6732 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6733 .subvendor = 0x5ace,
6734 .subdevice = 0x6191,
6735 .driver_data = SAA7134_BOARD_BEHOLD_M63,
6736 },{
6737 .vendor = PCI_VENDOR_ID_PHILIPS,
6738 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6739 .subvendor = 0x4e42,
6740 .subdevice = 0x3502,
6741 .driver_data = SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS,
6742 }, {
6743 .vendor = PCI_VENDOR_ID_PHILIPS,
6744 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6745 .subvendor = 0x1822, /*Twinhan Technology Co. Ltd*/
6746 .subdevice = 0x0022,
6747 .driver_data = SAA7134_BOARD_TWINHAN_DTV_DVB_3056,
6748 }, {
6749 .vendor = PCI_VENDOR_ID_PHILIPS,
6750 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6751 .subvendor = 0x16be,
6752 .subdevice = 0x0010, /* Medion version CTX953_V.1.4.3 */
6753 .driver_data = SAA7134_BOARD_CREATIX_CTX953,
6754 }, {
6755 .vendor = PCI_VENDOR_ID_PHILIPS,
6756 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6757 .subvendor = 0x1462, /* MSI */
6758 .subdevice = 0x8625, /* TV@nywhere A/D v1.1 */
6759 .driver_data = SAA7134_BOARD_MSI_TVANYWHERE_AD11,
6760 },{
6761 .vendor = PCI_VENDOR_ID_PHILIPS,
6762 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6763 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6764 .subdevice = 0xf436,
6765 .driver_data = SAA7134_BOARD_AVERMEDIA_CARDBUS_506,
6766 }, {
6767 .vendor = PCI_VENDOR_ID_PHILIPS,
6768 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6769 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6770 .subdevice = 0xf936,
6771 .driver_data = SAA7134_BOARD_AVERMEDIA_A16D,
6772 }, {
6773 .vendor = PCI_VENDOR_ID_PHILIPS,
6774 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6775 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6776 .subdevice = 0xa836,
6777 .driver_data = SAA7134_BOARD_AVERMEDIA_M115,
6778 }, {
6779 .vendor = PCI_VENDOR_ID_PHILIPS,
6780 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6781 .subvendor = 0x185b,
6782 .subdevice = 0xc900,
6783 .driver_data = SAA7134_BOARD_VIDEOMATE_T750,
6784 }, {
6785 .vendor = PCI_VENDOR_ID_PHILIPS,
6786 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, /* SAA7135HL */
6787 .subvendor = 0x1421,
6788 .subdevice = 0x0380,
6789 .driver_data = SAA7134_BOARD_ADS_INSTANT_HDTV_PCI,
6790 }, {
6791 .vendor = PCI_VENDOR_ID_PHILIPS,
6792 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6793 .subvendor = 0x5169,
6794 .subdevice = 0x1502,
6795 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI,
6796 }, {
6797 .vendor = PCI_VENDOR_ID_PHILIPS,
6798 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6799 .subvendor = 0x5ace,
6800 .subdevice = 0x6290,
6801 .driver_data = SAA7134_BOARD_BEHOLD_H6,
6802 }, {
6803 .vendor = PCI_VENDOR_ID_PHILIPS,
6804 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6805 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6806 .subdevice = 0xf636,
6807 .driver_data = SAA7134_BOARD_AVERMEDIA_M103,
6808 }, {
6809 .vendor = PCI_VENDOR_ID_PHILIPS,
6810 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6811 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6812 .subdevice = 0xf736,
6813 .driver_data = SAA7134_BOARD_AVERMEDIA_M103,
6814 }, {
6815 .vendor = PCI_VENDOR_ID_PHILIPS,
6816 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6817 .subvendor = 0x1043,
6818 .subdevice = 0x4878, /* REV:1.02G */
6819 .driver_data = SAA7134_BOARD_ASUSTeK_TIGER_3IN1,
6820 }, {
6821 .vendor = PCI_VENDOR_ID_PHILIPS,
6822 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6823 .subvendor = 0x17de,
6824 .subdevice = 0x7128,
6825 .driver_data = SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG,
6826 }, {
6827 .vendor = PCI_VENDOR_ID_PHILIPS,
6828 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6829 .subvendor = 0x17de,
6830 .subdevice = 0xb136,
6831 .driver_data = SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG,
6832 }, {
6833 .vendor = PCI_VENDOR_ID_PHILIPS,
6834 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6835 .subvendor = 0x1461, /* Avermedia Technologies Inc */
6836 .subdevice = 0xf31d,
6837 .driver_data = SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS,
6838 }, {
6839 .vendor = PCI_VENDOR_ID_PHILIPS,
6840 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6841 .subvendor = 0x185b,
6842 .subdevice = 0xc900,
6843 .driver_data = SAA7134_BOARD_VIDEOMATE_S350,
6844 }, {
6845 .vendor = PCI_VENDOR_ID_PHILIPS,
6846 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6847 .subvendor = 0x5ace, /* Beholder Intl. Ltd. */
6848 .subdevice = 0x7595,
6849 .driver_data = SAA7134_BOARD_BEHOLD_X7,
6850 }, {
6851 .vendor = PCI_VENDOR_ID_PHILIPS,
6852 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6853 .subvendor = 0x19d1, /* RoverMedia */
6854 .subdevice = 0x0138, /* LifeView FlyTV Prime30 OEM */
6855 .driver_data = SAA7134_BOARD_ROVERMEDIA_LINK_PRO_FM,
6856 }, {
6857 .vendor = PCI_VENDOR_ID_PHILIPS,
6858 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6859 .subvendor = PCI_VENDOR_ID_PHILIPS,
6860 .subdevice = 0x2004,
6861 .driver_data = SAA7134_BOARD_ZOLID_HYBRID_PCI,
6862 }, {
6863 .vendor = PCI_VENDOR_ID_PHILIPS,
6864 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6865 .subvendor = 0x1043,
6866 .subdevice = 0x4847,
6867 .driver_data = SAA7134_BOARD_ASUS_EUROPA_HYBRID,
6868 }, {
6869 .vendor = PCI_VENDOR_ID_PHILIPS,
6870 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6871 .subvendor = 0x107d,
6872 .subdevice = 0x6655,
6873 .driver_data = SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S,
6874 }, {
6875 .vendor = PCI_VENDOR_ID_PHILIPS,
6876 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6877 .subvendor = 0x13c2,
6878 .subdevice = 0x2804,
6879 .driver_data = SAA7134_BOARD_TECHNOTREND_BUDGET_T3000,
6880 }, {
6881 .vendor = PCI_VENDOR_ID_PHILIPS,
6882 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6883 .subvendor = 0x5ace, /* Beholder Intl. Ltd. */
6884 .subdevice = 0x7190,
6885 .driver_data = SAA7134_BOARD_BEHOLD_H7,
6886 }, {
6887 .vendor = PCI_VENDOR_ID_PHILIPS,
6888 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6889 .subvendor = 0x5ace, /* Beholder Intl. Ltd. */
6890 .subdevice = 0x7090,
6891 .driver_data = SAA7134_BOARD_BEHOLD_A7,
6892 }, {
6893 .vendor = PCI_VENDOR_ID_PHILIPS,
6894 .device = PCI_DEVICE_ID_PHILIPS_SAA7135,
6895 .subvendor = 0x185b,
6896 .subdevice = 0xc900,
6897 .driver_data = SAA7134_BOARD_VIDEOMATE_M1F,
6898 }, {
6899 .vendor = PCI_VENDOR_ID_PHILIPS,
6900 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6901 .subvendor = 0x5ace,
6902 .subdevice = 0x5030,
6903 .driver_data = SAA7134_BOARD_BEHOLD_503FM,
6904 }, {
6905 .vendor = PCI_VENDOR_ID_PHILIPS,
6906 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6907 .subvendor = 0x5ace,
6908 .subdevice = 0x5010,
6909 .driver_data = SAA7134_BOARD_BEHOLD_501,
6910 }, {
6911 .vendor = PCI_VENDOR_ID_PHILIPS,
6912 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6913 .subvendor = 0x17de,
6914 .subdevice = 0xd136,
6915 .driver_data = SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2,
6916 }, {
6917 /* --- boards without eeprom + subsystem ID --- */
6918 .vendor = PCI_VENDOR_ID_PHILIPS,
6919 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6920 .subvendor = PCI_VENDOR_ID_PHILIPS,
6921 .subdevice = 0,
6922 .driver_data = SAA7134_BOARD_NOAUTO,
6923 },{
6924 .vendor = PCI_VENDOR_ID_PHILIPS,
6925 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6926 .subvendor = PCI_VENDOR_ID_PHILIPS,
6927 .subdevice = 0,
6928 .driver_data = SAA7134_BOARD_NOAUTO,
6929 },{
6930 /* --- default catch --- */
6931 .vendor = PCI_VENDOR_ID_PHILIPS,
6932 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
6933 .subvendor = PCI_ANY_ID,
6934 .subdevice = PCI_ANY_ID,
6935 .driver_data = SAA7134_BOARD_UNKNOWN,
6936 },{
6937 .vendor = PCI_VENDOR_ID_PHILIPS,
6938 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
6939 .subvendor = PCI_ANY_ID,
6940 .subdevice = PCI_ANY_ID,
6941 .driver_data = SAA7134_BOARD_UNKNOWN,
6942 },{
6943 .vendor = PCI_VENDOR_ID_PHILIPS,
6944 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
6945 .subvendor = PCI_ANY_ID,
6946 .subdevice = PCI_ANY_ID,
6947 .driver_data = SAA7134_BOARD_UNKNOWN,
6948 },{
6949 .vendor = PCI_VENDOR_ID_PHILIPS,
6950 .device = PCI_DEVICE_ID_PHILIPS_SAA7135,
6951 .subvendor = PCI_ANY_ID,
6952 .subdevice = PCI_ANY_ID,
6953 .driver_data = SAA7134_BOARD_UNKNOWN,
6954 },{
6955 /* --- end of list --- */
6956 }
6957};
6958MODULE_DEVICE_TABLE(pci, saa7134_pci_tbl);
6959
6960/* ----------------------------------------------------------- */
6961/* flyvideo tweaks */
6962
6963
6964static void board_flyvideo(struct saa7134_dev *dev)
6965{
6966 printk("%s: there are different flyvideo cards with different tuners\n"
6967 "%s: out there, you might have to use the tuner=<nr> insmod\n"
6968 "%s: option to override the default value.\n",
6969 dev->name, dev->name, dev->name);
6970}
6971
6972static int saa7134_xc2028_callback(struct saa7134_dev *dev,
6973 int command, int arg)
6974{
6975 switch (command) {
6976 case XC2028_TUNER_RESET:
6977 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00000000);
6978 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00008000);
6979 switch (dev->board) {
6980 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
6981 case SAA7134_BOARD_AVERMEDIA_M103:
6982 saa7134_set_gpio(dev, 23, 0);
6983 msleep(10);
6984 saa7134_set_gpio(dev, 23, 1);
6985 break;
6986 case SAA7134_BOARD_AVERMEDIA_A16D:
6987 saa7134_set_gpio(dev, 21, 0);
6988 msleep(10);
6989 saa7134_set_gpio(dev, 21, 1);
6990 break;
6991 case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
6992 saa7134_set_gpio(dev, 18, 0);
6993 msleep(10);
6994 saa7134_set_gpio(dev, 18, 1);
6995 break;
6996 case SAA7134_BOARD_VIDEOMATE_T750:
6997 saa7134_set_gpio(dev, 20, 0);
6998 msleep(10);
6999 saa7134_set_gpio(dev, 20, 1);
7000 break;
7001 }
7002 return 0;
7003 }
7004 return -EINVAL;
7005}
7006
7007static int saa7134_xc5000_callback(struct saa7134_dev *dev,
7008 int command, int arg)
7009{
7010 switch (dev->board) {
7011 case SAA7134_BOARD_BEHOLD_X7:
7012 case SAA7134_BOARD_BEHOLD_H7:
7013 case SAA7134_BOARD_BEHOLD_A7:
7014 if (command == XC5000_TUNER_RESET) {
7015 /* Down and UP pheripherial RESET pin for reset all chips */
7016 saa_writeb(SAA7134_SPECIAL_MODE, 0x00);
7017 msleep(10);
7018 saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
7019 msleep(10);
7020 }
7021 break;
7022 default:
7023 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x06e20000, 0x06e20000);
7024 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x06a20000, 0x06a20000);
7025 saa_andorl(SAA7133_ANALOG_IO_SELECT >> 2, 0x02, 0x02);
7026 saa_andorl(SAA7134_ANALOG_IN_CTRL1 >> 2, 0x81, 0x81);
7027 saa_andorl(SAA7134_AUDIO_CLOCK0 >> 2, 0x03187de7, 0x03187de7);
7028 saa_andorl(SAA7134_AUDIO_PLL_CTRL >> 2, 0x03, 0x03);
7029 saa_andorl(SAA7134_AUDIO_CLOCKS_PER_FIELD0 >> 2,
7030 0x0001e000, 0x0001e000);
7031 break;
7032 }
7033 return 0;
7034}
7035
7036static int saa7134_tda8290_827x_callback(struct saa7134_dev *dev,
7037 int command, int arg)
7038{
7039 u8 sync_control;
7040
7041 switch (command) {
7042 case 0: /* switch LNA gain through GPIO 22*/
7043 saa7134_set_gpio(dev, 22, arg) ;
7044 break;
7045 case 1: /* vsync output at GPIO22. 50 / 60Hz */
7046 saa_andorb(SAA7134_VIDEO_PORT_CTRL3, 0x80, 0x80);
7047 saa_andorb(SAA7134_VIDEO_PORT_CTRL6, 0x0f, 0x03);
7048 if (arg == 1)
7049 sync_control = 11;
7050 else
7051 sync_control = 17;
7052 saa_writeb(SAA7134_VGATE_START, sync_control);
7053 saa_writeb(SAA7134_VGATE_STOP, sync_control + 1);
7054 saa_andorb(SAA7134_MISC_VGATE_MSB, 0x03, 0x00);
7055 break;
7056 default:
7057 return -EINVAL;
7058 }
7059
7060 return 0;
7061}
7062
7063static inline int saa7134_tda18271_hvr11x0_toggle_agc(struct saa7134_dev *dev,
7064 enum tda18271_mode mode)
7065{
7066 /* toggle AGC switch through GPIO 26 */
7067 switch (mode) {
7068 case TDA18271_ANALOG:
7069 saa7134_set_gpio(dev, 26, 0);
7070 break;
7071 case TDA18271_DIGITAL:
7072 saa7134_set_gpio(dev, 26, 1);
7073 break;
7074 default:
7075 return -EINVAL;
7076 }
7077 return 0;
7078}
7079
7080static inline int saa7134_kworld_sbtvd_toggle_agc(struct saa7134_dev *dev,
7081 enum tda18271_mode mode)
7082{
7083 /* toggle AGC switch through GPIO 27 */
7084 switch (mode) {
7085 case TDA18271_ANALOG:
7086 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x4000);
7087 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x4000);
7088 msleep(20);
7089 break;
7090 case TDA18271_DIGITAL:
7091 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x14000);
7092 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x14000);
7093 msleep(20);
7094 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x54000);
7095 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x54000);
7096 msleep(30);
7097 break;
7098 default:
7099 return -EINVAL;
7100 }
7101 return 0;
7102}
7103
7104static int saa7134_tda8290_18271_callback(struct saa7134_dev *dev,
7105 int command, int arg)
7106{
7107 int ret = 0;
7108
7109 switch (command) {
7110 case TDA18271_CALLBACK_CMD_AGC_ENABLE: /* 0 */
7111 switch (dev->board) {
7112 case SAA7134_BOARD_HAUPPAUGE_HVR1150:
7113 case SAA7134_BOARD_HAUPPAUGE_HVR1120:
7114 case SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2:
7115 ret = saa7134_tda18271_hvr11x0_toggle_agc(dev, arg);
7116 break;
7117 case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
7118 ret = saa7134_kworld_sbtvd_toggle_agc(dev, arg);
7119 break;
7120 default:
7121 break;
7122 }
7123 break;
7124 default:
7125 ret = -EINVAL;
7126 break;
7127 }
7128 return ret;
7129}
7130
7131static int saa7134_tda8290_callback(struct saa7134_dev *dev,
7132 int command, int arg)
7133{
7134 int ret;
7135
7136 switch (dev->board) {
7137 case SAA7134_BOARD_HAUPPAUGE_HVR1150:
7138 case SAA7134_BOARD_HAUPPAUGE_HVR1120:
7139 case SAA7134_BOARD_AVERMEDIA_M733A:
7140 case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
7141 case SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2:
7142 /* tda8290 + tda18271 */
7143 ret = saa7134_tda8290_18271_callback(dev, command, arg);
7144 break;
7145 default:
7146 /* tda8290 + tda827x */
7147 ret = saa7134_tda8290_827x_callback(dev, command, arg);
7148 break;
7149 }
7150 return ret;
7151}
7152
7153int saa7134_tuner_callback(void *priv, int component, int command, int arg)
7154{
7155 struct saa7134_dev *dev = priv;
7156
7157 if (dev != NULL) {
7158 switch (dev->tuner_type) {
7159 case TUNER_PHILIPS_TDA8290:
7160 return saa7134_tda8290_callback(dev, command, arg);
7161 case TUNER_XC2028:
7162 return saa7134_xc2028_callback(dev, command, arg);
7163 case TUNER_XC5000:
7164 return saa7134_xc5000_callback(dev, command, arg);
7165 }
7166 } else {
7167 printk(KERN_ERR "saa7134: Error - device struct undefined.\n");
7168 return -EINVAL;
7169 }
7170 return -EINVAL;
7171}
7172EXPORT_SYMBOL(saa7134_tuner_callback);
7173
7174/* ----------------------------------------------------------- */
7175
7176static void hauppauge_eeprom(struct saa7134_dev *dev, u8 *eeprom_data)
7177{
7178 struct tveeprom tv;
7179
7180 tveeprom_hauppauge_analog(&dev->i2c_client, &tv, eeprom_data);
7181
7182 /* Make sure we support the board model */
7183 switch (tv.model) {
7184 case 67019: /* WinTV-HVR1110 (Retail, IR Blaster, hybrid, FM, SVid/Comp, 3.5mm audio in) */
7185 case 67109: /* WinTV-HVR1000 (Retail, IR Receive, analog, no FM, SVid/Comp, 3.5mm audio in) */
7186 case 67201: /* WinTV-HVR1150 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */
7187 case 67301: /* WinTV-HVR1000 (Retail, IR Receive, analog, no FM, SVid/Comp, 3.5mm audio in) */
7188 case 67209: /* WinTV-HVR1110 (Retail, IR Receive, hybrid, FM, SVid/Comp, 3.5mm audio in) */
7189 case 67559: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */
7190 case 67569: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM) */
7191 case 67579: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM) */
7192 case 67589: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM, SVid/Comp, RCA aud) */
7193 case 67599: /* WinTV-HVR1110 (OEM, no IR, hybrid, no FM, SVid/Comp, RCA aud) */
7194 case 67651: /* WinTV-HVR1150 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */
7195 case 67659: /* WinTV-HVR1110 (OEM, no IR, hybrid, FM, SVid/Comp, RCA aud) */
7196 break;
7197 default:
7198 printk(KERN_WARNING "%s: warning: "
7199 "unknown hauppauge model #%d\n", dev->name, tv.model);
7200 break;
7201 }
7202
7203 printk(KERN_INFO "%s: hauppauge eeprom: model=%d\n",
7204 dev->name, tv.model);
7205}
7206
7207/* ----------------------------------------------------------- */
7208
7209int saa7134_board_init1(struct saa7134_dev *dev)
7210{
7211 /* Always print gpio, often manufacturers encode tuner type and other info. */
7212 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0);
7213 dev->gpio_value = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
7214 printk(KERN_INFO "%s: board init: gpio is %x\n", dev->name, dev->gpio_value);
7215
7216 switch (dev->board) {
7217 case SAA7134_BOARD_FLYVIDEO2000:
7218 case SAA7134_BOARD_FLYVIDEO3000:
7219 case SAA7134_BOARD_FLYVIDEO3000_NTSC:
7220 dev->has_remote = SAA7134_REMOTE_GPIO;
7221 board_flyvideo(dev);
7222 break;
7223 case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
7224 case SAA7134_BOARD_FLYTVPLATINUM_FM:
7225 case SAA7134_BOARD_CINERGY400:
7226 case SAA7134_BOARD_CINERGY600:
7227 case SAA7134_BOARD_CINERGY600_MK3:
7228 case SAA7134_BOARD_ECS_TVP3XP:
7229 case SAA7134_BOARD_ECS_TVP3XP_4CB5:
7230 case SAA7134_BOARD_ECS_TVP3XP_4CB6:
7231 case SAA7134_BOARD_MD2819:
7232 case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:
7233 case SAA7134_BOARD_KWORLD_XPERT:
7234 case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
7235 case SAA7134_BOARD_AVERMEDIA_STUDIO_505:
7236 case SAA7134_BOARD_AVERMEDIA_305:
7237 case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
7238 case SAA7134_BOARD_AVERMEDIA_307:
7239 case SAA7134_BOARD_AVERMEDIA_STUDIO_507:
7240 case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
7241 case SAA7134_BOARD_AVERMEDIA_777:
7242 case SAA7134_BOARD_AVERMEDIA_M135A:
7243/* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */
7244 case SAA7134_BOARD_VIDEOMATE_TV_PVR:
7245 case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS:
7246 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:
7247 case SAA7134_BOARD_VIDEOMATE_M1F:
7248 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
7249 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
7250 case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
7251 case SAA7134_BOARD_MANLI_MTV001:
7252 case SAA7134_BOARD_MANLI_MTV002:
7253 case SAA7134_BOARD_BEHOLD_409FM:
7254 case SAA7134_BOARD_AVACSSMARTTV:
7255 case SAA7134_BOARD_GOTVIEW_7135:
7256 case SAA7134_BOARD_KWORLD_TERMINATOR:
7257 case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS:
7258 case SAA7134_BOARD_FLYDVBT_LR301:
7259 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
7260 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
7261 case SAA7134_BOARD_ASUSTeK_P7131_ANALOG:
7262 case SAA7134_BOARD_FLYDVBTDUO:
7263 case SAA7134_BOARD_PROTEUS_2309:
7264 case SAA7134_BOARD_AVERMEDIA_A16AR:
7265 case SAA7134_BOARD_ENCORE_ENLTV:
7266 case SAA7134_BOARD_ENCORE_ENLTV_FM:
7267 case SAA7134_BOARD_ENCORE_ENLTV_FM53:
7268 case SAA7134_BOARD_ENCORE_ENLTV_FM3:
7269 case SAA7134_BOARD_10MOONSTVMASTER3:
7270 case SAA7134_BOARD_BEHOLD_401:
7271 case SAA7134_BOARD_BEHOLD_403:
7272 case SAA7134_BOARD_BEHOLD_403FM:
7273 case SAA7134_BOARD_BEHOLD_405:
7274 case SAA7134_BOARD_BEHOLD_405FM:
7275 case SAA7134_BOARD_BEHOLD_407:
7276 case SAA7134_BOARD_BEHOLD_407FM:
7277 case SAA7134_BOARD_BEHOLD_409:
7278 case SAA7134_BOARD_BEHOLD_505FM:
7279 case SAA7134_BOARD_BEHOLD_505RDS_MK5:
7280 case SAA7134_BOARD_BEHOLD_505RDS_MK3:
7281 case SAA7134_BOARD_BEHOLD_507_9FM:
7282 case SAA7134_BOARD_BEHOLD_507RDS_MK3:
7283 case SAA7134_BOARD_BEHOLD_507RDS_MK5:
7284 case SAA7134_BOARD_GENIUS_TVGO_A11MCE:
7285 case SAA7134_BOARD_REAL_ANGEL_220:
7286 case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG:
7287 case SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS:
7288 case SAA7134_BOARD_ROVERMEDIA_LINK_PRO_FM:
7289 case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S:
7290 dev->has_remote = SAA7134_REMOTE_GPIO;
7291 break;
7292 case SAA7134_BOARD_FLYDVBS_LR300:
7293 saa_writeb(SAA7134_GPIO_GPMODE3, 0x80);
7294 saa_writeb(SAA7134_GPIO_GPSTATUS2, 0x40);
7295 dev->has_remote = SAA7134_REMOTE_GPIO;
7296 break;
7297 case SAA7134_BOARD_MD5044:
7298 printk("%s: seems there are two different versions of the MD5044\n"
7299 "%s: (with the same ID) out there. If sound doesn't work for\n"
7300 "%s: you try the audio_clock_override=0x200000 insmod option.\n",
7301 dev->name,dev->name,dev->name);
7302 break;
7303 case SAA7134_BOARD_CINERGY400_CARDBUS:
7304 /* power-up tuner chip */
7305 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000);
7306 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000);
7307 break;
7308 case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
7309 /* this turns the remote control chip off to work around a bug in it */
7310 saa_writeb(SAA7134_GPIO_GPMODE1, 0x80);
7311 saa_writeb(SAA7134_GPIO_GPSTATUS1, 0x80);
7312 break;
7313 case SAA7134_BOARD_MONSTERTV_MOBILE:
7314 /* power-up tuner chip */
7315 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000);
7316 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000004);
7317 break;
7318 case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS:
7319 /* turn the fan on */
7320 saa_writeb(SAA7134_GPIO_GPMODE3, 0x08);
7321 saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x06);
7322 break;
7323 case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
7324 case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
7325 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x08000000, 0x08000000);
7326 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x08000000, 0x00000000);
7327 break;
7328 case SAA7134_BOARD_AVERMEDIA_CARDBUS:
7329 case SAA7134_BOARD_AVERMEDIA_M115:
7330 /* power-down tuner chip */
7331 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0);
7332 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0);
7333 msleep(10);
7334 /* power-up tuner chip */
7335 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0xffffffff, 0xffffffff);
7336 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff);
7337 msleep(10);
7338 break;
7339 case SAA7134_BOARD_AVERMEDIA_CARDBUS_501:
7340 /* power-down tuner chip */
7341 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x08400000, 0x08400000);
7342 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x08400000, 0);
7343 msleep(10);
7344 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x08400000, 0x08400000);
7345 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x08400000, 0x08400000);
7346 msleep(10);
7347 dev->has_remote = SAA7134_REMOTE_I2C;
7348 break;
7349 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
7350 saa7134_set_gpio(dev, 23, 0);
7351 msleep(10);
7352 saa7134_set_gpio(dev, 23, 1);
7353 dev->has_remote = SAA7134_REMOTE_I2C;
7354 break;
7355 case SAA7134_BOARD_AVERMEDIA_M103:
7356 saa7134_set_gpio(dev, 23, 0);
7357 msleep(10);
7358 saa7134_set_gpio(dev, 23, 1);
7359 break;
7360 case SAA7134_BOARD_AVERMEDIA_A16D:
7361 saa7134_set_gpio(dev, 21, 0);
7362 msleep(10);
7363 saa7134_set_gpio(dev, 21, 1);
7364 msleep(1);
7365 dev->has_remote = SAA7134_REMOTE_GPIO;
7366 break;
7367 case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM:
7368 /* power-down tuner chip */
7369 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x000A8004, 0x000A8004);
7370 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x000A8004, 0);
7371 msleep(10);
7372 /* power-up tuner chip */
7373 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x000A8004, 0x000A8004);
7374 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x000A8004, 0x000A8004);
7375 msleep(10);
7376 /* remote via GPIO */
7377 dev->has_remote = SAA7134_REMOTE_GPIO;
7378 break;
7379 case SAA7134_BOARD_RTD_VFG7350:
7380
7381 /*
7382 * Make sure Production Test Register at offset 0x1D1 is cleared
7383 * to take chip out of test mode. Clearing bit 4 (TST_EN_AOUT)
7384 * prevents pin 105 from remaining low; keeping pin 105 low
7385 * continually resets the SAA6752 chip.
7386 */
7387
7388 saa_writeb (SAA7134_PRODUCTION_TEST_MODE, 0x00);
7389 break;
7390 case SAA7134_BOARD_HAUPPAUGE_HVR1150:
7391 case SAA7134_BOARD_HAUPPAUGE_HVR1120:
7392 dev->has_remote = SAA7134_REMOTE_GPIO;
7393 /* GPIO 26 high for digital, low for analog */
7394 saa7134_set_gpio(dev, 26, 0);
7395 msleep(1);
7396
7397 saa7134_set_gpio(dev, 22, 0);
7398 msleep(10);
7399 saa7134_set_gpio(dev, 22, 1);
7400 break;
7401 /* i2c remotes */
7402 case SAA7134_BOARD_PINNACLE_PCTV_110i:
7403 case SAA7134_BOARD_PINNACLE_PCTV_310i:
7404 case SAA7134_BOARD_UPMOST_PURPLE_TV:
7405 case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS:
7406 case SAA7134_BOARD_HAUPPAUGE_HVR1110:
7407 case SAA7134_BOARD_BEHOLD_607FM_MK3:
7408 case SAA7134_BOARD_BEHOLD_607FM_MK5:
7409 case SAA7134_BOARD_BEHOLD_609FM_MK3:
7410 case SAA7134_BOARD_BEHOLD_609FM_MK5:
7411 case SAA7134_BOARD_BEHOLD_607RDS_MK3:
7412 case SAA7134_BOARD_BEHOLD_607RDS_MK5:
7413 case SAA7134_BOARD_BEHOLD_609RDS_MK3:
7414 case SAA7134_BOARD_BEHOLD_609RDS_MK5:
7415 case SAA7134_BOARD_BEHOLD_M6:
7416 case SAA7134_BOARD_BEHOLD_M63:
7417 case SAA7134_BOARD_BEHOLD_M6_EXTRA:
7418 case SAA7134_BOARD_BEHOLD_H6:
7419 case SAA7134_BOARD_BEHOLD_X7:
7420 case SAA7134_BOARD_BEHOLD_H7:
7421 case SAA7134_BOARD_BEHOLD_A7:
7422 dev->has_remote = SAA7134_REMOTE_I2C;
7423 break;
7424 case SAA7134_BOARD_AVERMEDIA_A169_B:
7425 printk("%s: %s: dual saa713x broadcast decoders\n"
7426 "%s: Sorry, none of the inputs to this chip are supported yet.\n"
7427 "%s: Dual decoder functionality is disabled for now, use the other chip.\n",
7428 dev->name,card(dev).name,dev->name,dev->name);
7429 break;
7430 case SAA7134_BOARD_AVERMEDIA_M102:
7431 /* enable tuner */
7432 dev->has_remote = SAA7134_REMOTE_GPIO;
7433 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x8c040007, 0x8c040007);
7434 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0c0007cd, 0x0c0007cd);
7435 break;
7436 case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
7437 case SAA7134_BOARD_AVERMEDIA_A700_PRO:
7438 /* write windows gpio values */
7439 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x80040100, 0x80040100);
7440 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x80040100, 0x00040100);
7441 break;
7442 case SAA7134_BOARD_VIDEOMATE_S350:
7443 dev->has_remote = SAA7134_REMOTE_GPIO;
7444 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x0000C000, 0x0000C000);
7445 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0000C000, 0x0000C000);
7446 break;
7447 case SAA7134_BOARD_AVERMEDIA_M733A:
7448 saa7134_set_gpio(dev, 1, 1);
7449 msleep(10);
7450 saa7134_set_gpio(dev, 1, 0);
7451 msleep(10);
7452 saa7134_set_gpio(dev, 1, 1);
7453 dev->has_remote = SAA7134_REMOTE_GPIO;
7454 break;
7455 case SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2:
7456 /* enable LGS-8G75 */
7457 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x0e050000, 0x0c050000);
7458 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x0e050000, 0x0c050000);
7459 break;
7460 case SAA7134_BOARD_VIDEOMATE_T750:
7461 /* enable the analog tuner */
7462 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00008000, 0x00008000);
7463 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00008000);
7464 break;
7465 }
7466 return 0;
7467}
7468
7469static void saa7134_tuner_setup(struct saa7134_dev *dev)
7470{
7471 struct tuner_setup tun_setup;
7472 unsigned int mode_mask = T_RADIO | T_ANALOG_TV;
7473
7474 memset(&tun_setup, 0, sizeof(tun_setup));
7475 tun_setup.tuner_callback = saa7134_tuner_callback;
7476
7477 if (saa7134_boards[dev->board].radio_type != UNSET) {
7478 tun_setup.type = saa7134_boards[dev->board].radio_type;
7479 tun_setup.addr = saa7134_boards[dev->board].radio_addr;
7480
7481 tun_setup.mode_mask = T_RADIO;
7482
7483 saa_call_all(dev, tuner, s_type_addr, &tun_setup);
7484 mode_mask &= ~T_RADIO;
7485 }
7486
7487 if ((dev->tuner_type != TUNER_ABSENT) && (dev->tuner_type != UNSET)) {
7488 tun_setup.type = dev->tuner_type;
7489 tun_setup.addr = dev->tuner_addr;
7490 tun_setup.config = saa7134_boards[dev->board].tuner_config;
7491 tun_setup.tuner_callback = saa7134_tuner_callback;
7492
7493 tun_setup.mode_mask = mode_mask;
7494
7495 saa_call_all(dev, tuner, s_type_addr, &tun_setup);
7496 }
7497
7498 if (dev->tda9887_conf) {
7499 struct v4l2_priv_tun_config tda9887_cfg;
7500
7501 tda9887_cfg.tuner = TUNER_TDA9887;
7502 tda9887_cfg.priv = &dev->tda9887_conf;
7503
7504 saa_call_all(dev, tuner, s_config, &tda9887_cfg);
7505 }
7506
7507 if (dev->tuner_type == TUNER_XC2028) {
7508 struct v4l2_priv_tun_config xc2028_cfg;
7509 struct xc2028_ctrl ctl;
7510
7511 memset(&xc2028_cfg, 0, sizeof(xc2028_cfg));
7512 memset(&ctl, 0, sizeof(ctl));
7513
7514 ctl.fname = XC2028_DEFAULT_FIRMWARE;
7515 ctl.max_len = 64;
7516
7517 switch (dev->board) {
7518 case SAA7134_BOARD_AVERMEDIA_A16D:
7519 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
7520 case SAA7134_BOARD_AVERMEDIA_M103:
7521 case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
7522 ctl.demod = XC3028_FE_ZARLINK456;
7523 break;
7524 default:
7525 ctl.demod = XC3028_FE_OREN538;
7526 ctl.mts = 1;
7527 }
7528
7529 xc2028_cfg.tuner = TUNER_XC2028;
7530 xc2028_cfg.priv = &ctl;
7531
7532 saa_call_all(dev, tuner, s_config, &xc2028_cfg);
7533 }
7534}
7535
7536/* stuff which needs working i2c */
7537int saa7134_board_init2(struct saa7134_dev *dev)
7538{
7539 unsigned char buf;
7540 int board;
7541
7542 /* Put here the code that enables the chips that are needed
7543 for analog mode and doesn't depend on the tuner attachment.
7544 It is also a good idea to get tuner type from eeprom, etc before
7545 initializing tuner, since we can avoid loading tuner driver
7546 on devices that has TUNER_ABSENT
7547 */
7548 switch (dev->board) {
7549 case SAA7134_BOARD_BMK_MPEX_NOTUNER:
7550 case SAA7134_BOARD_BMK_MPEX_TUNER:
7551 /* Checks if the device has a tuner at 0x60 addr
7552 If the device doesn't have a tuner, TUNER_ABSENT
7553 will be used at tuner_type, avoiding loading tuner
7554 without needing it
7555 */
7556 dev->i2c_client.addr = 0x60;
7557 board = (i2c_master_recv(&dev->i2c_client, &buf, 0) < 0)
7558 ? SAA7134_BOARD_BMK_MPEX_NOTUNER
7559 : SAA7134_BOARD_BMK_MPEX_TUNER;
7560 if (board == dev->board)
7561 break;
7562 dev->board = board;
7563 printk("%s: board type fixup: %s\n", dev->name,
7564 saa7134_boards[dev->board].name);
7565 dev->tuner_type = saa7134_boards[dev->board].tuner_type;
7566
7567 break;
7568 case SAA7134_BOARD_MD7134:
7569 {
7570 u8 subaddr;
7571 u8 data[3];
7572 int ret, tuner_t;
7573 struct i2c_msg msg[] = {{.addr=0x50, .flags=0, .buf=&subaddr, .len = 1},
7574 {.addr=0x50, .flags=I2C_M_RD, .buf=data, .len = 3}};
7575
7576 subaddr= 0x14;
7577 tuner_t = 0;
7578
7579 /* Retrieve device data from eeprom, checking for the
7580 proper tuner_type.
7581 */
7582 ret = i2c_transfer(&dev->i2c_adap, msg, 2);
7583 if (ret != 2) {
7584 printk(KERN_ERR "EEPROM read failure\n");
7585 } else if ((data[0] != 0) && (data[0] != 0xff)) {
7586 /* old config structure */
7587 subaddr = data[0] + 2;
7588 msg[1].len = 2;
7589 i2c_transfer(&dev->i2c_adap, msg, 2);
7590 tuner_t = (data[0] << 8) + data[1];
7591 switch (tuner_t){
7592 case 0x0103:
7593 dev->tuner_type = TUNER_PHILIPS_PAL;
7594 break;
7595 case 0x010C:
7596 dev->tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
7597 break;
7598 default:
7599 printk(KERN_ERR "%s Can't determine tuner type %x from EEPROM\n", dev->name, tuner_t);
7600 }
7601 } else if ((data[1] != 0) && (data[1] != 0xff)) {
7602 /* new config structure */
7603 subaddr = data[1] + 1;
7604 msg[1].len = 1;
7605 i2c_transfer(&dev->i2c_adap, msg, 2);
7606 subaddr = data[0] + 1;
7607 msg[1].len = 2;
7608 i2c_transfer(&dev->i2c_adap, msg, 2);
7609 tuner_t = (data[1] << 8) + data[0];
7610 switch (tuner_t) {
7611 case 0x0005:
7612 dev->tuner_type = TUNER_PHILIPS_FM1216ME_MK3;
7613 break;
7614 case 0x001d:
7615 dev->tuner_type = TUNER_PHILIPS_FMD1216ME_MK3;
7616 printk(KERN_INFO "%s Board has DVB-T\n", dev->name);
7617 break;
7618 default:
7619 printk(KERN_ERR "%s Can't determine tuner type %x from EEPROM\n", dev->name, tuner_t);
7620 }
7621 } else {
7622 printk(KERN_ERR "%s unexpected config structure\n", dev->name);
7623 }
7624
7625 printk(KERN_INFO "%s Tuner type is %d\n", dev->name, dev->tuner_type);
7626 break;
7627 }
7628 case SAA7134_BOARD_PHILIPS_EUROPA:
7629 if (dev->autodetected && (dev->eedata[0x41] == 0x1c)) {
7630 /* Reconfigure board as Snake reference design */
7631 dev->board = SAA7134_BOARD_PHILIPS_SNAKE;
7632 dev->tuner_type = saa7134_boards[dev->board].tuner_type;
7633 printk(KERN_INFO "%s: Reconfigured board as %s\n",
7634 dev->name, saa7134_boards[dev->board].name);
7635 break;
7636 }
7637 /* break intentionally omitted */
7638 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
7639 case SAA7134_BOARD_ASUS_EUROPA2_HYBRID:
7640 case SAA7134_BOARD_ASUS_EUROPA_HYBRID:
7641 case SAA7134_BOARD_TECHNOTREND_BUDGET_T3000:
7642 {
7643
7644 /* The Philips EUROPA based hybrid boards have the tuner
7645 connected through the channel decoder. We have to make it
7646 transparent to find it
7647 */
7648 u8 data[] = { 0x07, 0x02};
7649 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
7650 i2c_transfer(&dev->i2c_adap, &msg, 1);
7651
7652 break;
7653 }
7654 case SAA7134_BOARD_PHILIPS_TIGER:
7655 case SAA7134_BOARD_PHILIPS_TIGER_S:
7656 {
7657 u8 data[] = { 0x3c, 0x33, 0x60};
7658 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
7659 if (dev->autodetected && (dev->eedata[0x49] == 0x50)) {
7660 dev->board = SAA7134_BOARD_PHILIPS_TIGER_S;
7661 printk(KERN_INFO "%s: Reconfigured board as %s\n",
7662 dev->name, saa7134_boards[dev->board].name);
7663 }
7664 if (dev->board == SAA7134_BOARD_PHILIPS_TIGER_S) {
7665 dev->tuner_type = TUNER_PHILIPS_TDA8290;
7666
7667 data[2] = 0x68;
7668 i2c_transfer(&dev->i2c_adap, &msg, 1);
7669 break;
7670 }
7671 i2c_transfer(&dev->i2c_adap, &msg, 1);
7672 break;
7673 }
7674 case SAA7134_BOARD_ASUSTeK_TVFM7135:
7675 /* The card below is detected as card=53, but is different */
7676 if (dev->autodetected && (dev->eedata[0x27] == 0x03)) {
7677 dev->board = SAA7134_BOARD_ASUSTeK_P7131_ANALOG;
7678 printk(KERN_INFO "%s: P7131 analog only, using "
7679 "entry of %s\n",
7680 dev->name, saa7134_boards[dev->board].name);
7681
7682 /* IR init has already happened for other cards, so
7683 * we have to catch up. */
7684 dev->has_remote = SAA7134_REMOTE_GPIO;
7685 saa7134_input_init1(dev);
7686 }
7687 break;
7688 case SAA7134_BOARD_HAUPPAUGE_HVR1150:
7689 case SAA7134_BOARD_HAUPPAUGE_HVR1120:
7690 hauppauge_eeprom(dev, dev->eedata+0x80);
7691 break;
7692 case SAA7134_BOARD_HAUPPAUGE_HVR1110:
7693 hauppauge_eeprom(dev, dev->eedata+0x80);
7694 /* break intentionally omitted */
7695 case SAA7134_BOARD_PINNACLE_PCTV_310i:
7696 case SAA7134_BOARD_KWORLD_DVBT_210:
7697 case SAA7134_BOARD_TEVION_DVBT_220RF:
7698 case SAA7134_BOARD_ASUSTeK_TIGER:
7699 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
7700 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
7701 case SAA7134_BOARD_MEDION_MD8800_QUADRO:
7702 case SAA7134_BOARD_AVERMEDIA_SUPER_007:
7703 case SAA7134_BOARD_TWINHAN_DTV_DVB_3056:
7704 case SAA7134_BOARD_CREATIX_CTX953:
7705 {
7706 /* this is a hybrid board, initialize to analog mode
7707 * and configure firmware eeprom address
7708 */
7709 u8 data[] = { 0x3c, 0x33, 0x60};
7710 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
7711 i2c_transfer(&dev->i2c_adap, &msg, 1);
7712 break;
7713 }
7714 case SAA7134_BOARD_ASUSTeK_TIGER_3IN1:
7715 {
7716 u8 data[] = { 0x3c, 0x33, 0x60};
7717 struct i2c_msg msg = {.addr = 0x0b, .flags = 0, .buf = data,
7718 .len = sizeof(data)};
7719 i2c_transfer(&dev->i2c_adap, &msg, 1);
7720 break;
7721 }
7722 case SAA7134_BOARD_FLYDVB_TRIO:
7723 {
7724 u8 temp = 0;
7725 int rc;
7726 u8 data[] = { 0x3c, 0x33, 0x62};
7727 struct i2c_msg msg = {.addr=0x09, .flags=0, .buf=data, .len = sizeof(data)};
7728 i2c_transfer(&dev->i2c_adap, &msg, 1);
7729
7730 /*
7731 * send weak up message to pic16C505 chip
7732 * @ LifeView FlyDVB Trio
7733 */
7734 msg.buf = &temp;
7735 msg.addr = 0x0b;
7736 msg.len = 1;
7737 if (1 != i2c_transfer(&dev->i2c_adap, &msg, 1)) {
7738 printk(KERN_WARNING "%s: send wake up byte to pic16C505"
7739 "(IR chip) failed\n", dev->name);
7740 } else {
7741 msg.flags = I2C_M_RD;
7742 rc = i2c_transfer(&dev->i2c_adap, &msg, 1);
7743 printk(KERN_INFO "%s: probe IR chip @ i2c 0x%02x: %s\n",
7744 dev->name, msg.addr,
7745 (1 == rc) ? "yes" : "no");
7746 if (rc == 1)
7747 dev->has_remote = SAA7134_REMOTE_I2C;
7748 }
7749 break;
7750 }
7751 case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
7752 case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
7753 {
7754 /* initialize analog mode */
7755 u8 data[] = { 0x3c, 0x33, 0x6a};
7756 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
7757 i2c_transfer(&dev->i2c_adap, &msg, 1);
7758 break;
7759 }
7760 case SAA7134_BOARD_CINERGY_HT_PCMCIA:
7761 case SAA7134_BOARD_CINERGY_HT_PCI:
7762 {
7763 /* initialize analog mode */
7764 u8 data[] = { 0x3c, 0x33, 0x68};
7765 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
7766 i2c_transfer(&dev->i2c_adap, &msg, 1);
7767 break;
7768 }
7769 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
7770 case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
7771 /* The T200 and the T200A share the same pci id. Consequently,
7772 * we are going to query eeprom to try to find out which one we
7773 * are actually looking at. */
7774
7775 /* Don't do this if the board was specifically selected with an
7776 * insmod option or if we have the default configuration T200*/
7777 if (!dev->autodetected || (dev->eedata[0x41] == 0xd0))
7778 break;
7779 if (dev->eedata[0x41] == 0x02) {
7780 /* Reconfigure board as T200A */
7781 dev->board = SAA7134_BOARD_VIDEOMATE_DVBT_200A;
7782 dev->tuner_type = saa7134_boards[dev->board].tuner_type;
7783 dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
7784 printk(KERN_INFO "%s: Reconfigured board as %s\n",
7785 dev->name, saa7134_boards[dev->board].name);
7786 } else {
7787 printk(KERN_WARNING "%s: Unexpected tuner type info: %x in eeprom\n",
7788 dev->name, dev->eedata[0x41]);
7789 break;
7790 }
7791 break;
7792 case SAA7134_BOARD_ADS_INSTANT_HDTV_PCI:
7793 case SAA7134_BOARD_KWORLD_ATSC110:
7794 {
7795 struct i2c_msg msg = { .addr = 0x0a, .flags = 0 };
7796 int i;
7797 static u8 buffer[][2] = {
7798 { 0x10, 0x12 },
7799 { 0x13, 0x04 },
7800 { 0x16, 0x00 },
7801 { 0x14, 0x04 },
7802 { 0x17, 0x00 },
7803 };
7804
7805 for (i = 0; i < ARRAY_SIZE(buffer); i++) {
7806 msg.buf = &buffer[i][0];
7807 msg.len = ARRAY_SIZE(buffer[0]);
7808 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
7809 printk(KERN_WARNING
7810 "%s: Unable to enable tuner(%i).\n",
7811 dev->name, i);
7812 }
7813 break;
7814 }
7815 case SAA7134_BOARD_BEHOLD_H6:
7816 {
7817 u8 data[] = { 0x09, 0x9f, 0x86, 0x11};
7818 struct i2c_msg msg = {.addr = 0x61, .flags = 0, .buf = data,
7819 .len = sizeof(data)};
7820
7821 /* The tuner TUNER_PHILIPS_FMD1216MEX_MK3 after hardware */
7822 /* start has disabled IF and enabled DVB-T. When saa7134 */
7823 /* scan I2C devices it not detect IF tda9887 and can`t */
7824 /* watch TV without software reboot. For solve this problem */
7825 /* switch the tuner to analog TV mode manually. */
7826 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
7827 printk(KERN_WARNING
7828 "%s: Unable to enable IF of the tuner.\n",
7829 dev->name);
7830 break;
7831 }
7832 case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
7833 saa_writel(SAA7134_GPIO_GPMODE0 >> 2, 0x4000);
7834 saa_writel(SAA7134_GPIO_GPSTATUS0 >> 2, 0x4000);
7835
7836 saa7134_set_gpio(dev, 27, 0);
7837 break;
7838 } /* switch() */
7839
7840 /* initialize tuner */
7841 if (TUNER_ABSENT != dev->tuner_type) {
7842 int has_demod = (dev->tda9887_conf & TDA9887_PRESENT);
7843
7844 /* Note: radio tuner address is always filled in,
7845 so we do not need to probe for a radio tuner device. */
7846 if (dev->radio_type != UNSET)
7847 v4l2_i2c_new_subdev(&dev->v4l2_dev,
7848 &dev->i2c_adap, "tuner",
7849 dev->radio_addr, NULL);
7850 if (has_demod)
7851 v4l2_i2c_new_subdev(&dev->v4l2_dev,
7852 &dev->i2c_adap, "tuner",
7853 0, v4l2_i2c_tuner_addrs(ADDRS_DEMOD));
7854 if (dev->tuner_addr == ADDR_UNSET) {
7855 enum v4l2_i2c_tuner_type type =
7856 has_demod ? ADDRS_TV_WITH_DEMOD : ADDRS_TV;
7857
7858 v4l2_i2c_new_subdev(&dev->v4l2_dev,
7859 &dev->i2c_adap, "tuner",
7860 0, v4l2_i2c_tuner_addrs(type));
7861 } else {
7862 v4l2_i2c_new_subdev(&dev->v4l2_dev,
7863 &dev->i2c_adap, "tuner",
7864 dev->tuner_addr, NULL);
7865 }
7866 }
7867
7868 saa7134_tuner_setup(dev);
7869
7870 switch (dev->board) {
7871 case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM:
7872 case SAA7134_BOARD_AVERMEDIA_CARDBUS_501:
7873 {
7874 struct v4l2_priv_tun_config tea5767_cfg;
7875 struct tea5767_ctrl ctl;
7876
7877 dev->i2c_client.addr = 0xC0;
7878 /* set TEA5767(analog FM) defines */
7879 memset(&ctl, 0, sizeof(ctl));
7880 ctl.xtal_freq = TEA5767_HIGH_LO_13MHz;
7881 tea5767_cfg.tuner = TUNER_TEA5767;
7882 tea5767_cfg.priv = &ctl;
7883 saa_call_all(dev, tuner, s_config, &tea5767_cfg);
7884 break;
7885 }
7886 } /* switch() */
7887
7888 return 0;
7889}
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
new file mode 100644
index 00000000000..ca65cda3e10
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -0,0 +1,1369 @@
1/*
2 *
3 * device driver for philips saa7134 based TV cards
4 * driver core
5 *
6 * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/list.h>
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/slab.h>
28#include <linux/kmod.h>
29#include <linux/sound.h>
30#include <linux/interrupt.h>
31#include <linux/delay.h>
32#include <linux/mutex.h>
33#include <linux/dma-mapping.h>
34#include <linux/pm.h>
35
36#include "saa7134-reg.h"
37#include "saa7134.h"
38
39MODULE_DESCRIPTION("v4l2 driver module for saa7130/34 based TV cards");
40MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
41MODULE_LICENSE("GPL");
42MODULE_VERSION(SAA7134_VERSION);
43
44
45/* ------------------------------------------------------------------ */
46
47static unsigned int irq_debug;
48module_param(irq_debug, int, 0644);
49MODULE_PARM_DESC(irq_debug,"enable debug messages [IRQ handler]");
50
51static unsigned int core_debug;
52module_param(core_debug, int, 0644);
53MODULE_PARM_DESC(core_debug,"enable debug messages [core]");
54
55static unsigned int gpio_tracking;
56module_param(gpio_tracking, int, 0644);
57MODULE_PARM_DESC(gpio_tracking,"enable debug messages [gpio]");
58
59static unsigned int alsa = 1;
60module_param(alsa, int, 0644);
61MODULE_PARM_DESC(alsa,"enable/disable ALSA DMA sound [dmasound]");
62
63static unsigned int latency = UNSET;
64module_param(latency, int, 0444);
65MODULE_PARM_DESC(latency,"pci latency timer");
66
67int saa7134_no_overlay=-1;
68module_param_named(no_overlay, saa7134_no_overlay, int, 0444);
69MODULE_PARM_DESC(no_overlay,"allow override overlay default (0 disables, 1 enables)"
70 " [some VIA/SIS chipsets are known to have problem with overlay]");
71
72static unsigned int video_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
73static unsigned int vbi_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
74static unsigned int radio_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
75static unsigned int tuner[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
76static unsigned int card[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
77
78
79module_param_array(video_nr, int, NULL, 0444);
80module_param_array(vbi_nr, int, NULL, 0444);
81module_param_array(radio_nr, int, NULL, 0444);
82module_param_array(tuner, int, NULL, 0444);
83module_param_array(card, int, NULL, 0444);
84
85MODULE_PARM_DESC(video_nr, "video device number");
86MODULE_PARM_DESC(vbi_nr, "vbi device number");
87MODULE_PARM_DESC(radio_nr, "radio device number");
88MODULE_PARM_DESC(tuner, "tuner type");
89MODULE_PARM_DESC(card, "card type");
90
91DEFINE_MUTEX(saa7134_devlist_lock);
92EXPORT_SYMBOL(saa7134_devlist_lock);
93LIST_HEAD(saa7134_devlist);
94EXPORT_SYMBOL(saa7134_devlist);
95static LIST_HEAD(mops_list);
96static unsigned int saa7134_devcount;
97
98int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
99int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
100
101#define dprintk(fmt, arg...) if (core_debug) \
102 printk(KERN_DEBUG "%s/core: " fmt, dev->name , ## arg)
103
104void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
105{
106 unsigned long mode,status;
107
108 if (!gpio_tracking)
109 return;
110 /* rising SAA7134_GPIO_GPRESCAN reads the status */
111 saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,0);
112 saa_andorb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN,SAA7134_GPIO_GPRESCAN);
113 mode = saa_readl(SAA7134_GPIO_GPMODE0 >> 2) & 0xfffffff;
114 status = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & 0xfffffff;
115 printk(KERN_DEBUG
116 "%s: gpio: mode=0x%07lx in=0x%07lx out=0x%07lx [%s]\n",
117 dev->name, mode, (~mode) & status, mode & status, msg);
118}
119
120void saa7134_set_gpio(struct saa7134_dev *dev, int bit_no, int value)
121{
122 u32 index, bitval;
123
124 index = 1 << bit_no;
125 switch (value) {
126 case 0: /* static value */
127 case 1: dprintk("setting GPIO%d to static %d\n", bit_no, value);
128 /* turn sync mode off if necessary */
129 if (index & 0x00c00000)
130 saa_andorb(SAA7134_VIDEO_PORT_CTRL6, 0x0f, 0x00);
131 if (value)
132 bitval = index;
133 else
134 bitval = 0;
135 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, index, index);
136 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, index, bitval);
137 break;
138 case 3: /* tristate */
139 dprintk("setting GPIO%d to tristate\n", bit_no);
140 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, index, 0);
141 break;
142 }
143}
144
145/* ------------------------------------------------------------------ */
146
147
148/* ----------------------------------------------------------- */
149/* delayed request_module */
150
151#if defined(CONFIG_MODULES) && defined(MODULE)
152
153static void request_module_async(struct work_struct *work){
154 struct saa7134_dev* dev = container_of(work, struct saa7134_dev, request_module_wk);
155 if (card_is_empress(dev))
156 request_module("saa7134-empress");
157 if (card_is_dvb(dev))
158 request_module("saa7134-dvb");
159 if (alsa) {
160 if (dev->pci->device != PCI_DEVICE_ID_PHILIPS_SAA7130)
161 request_module("saa7134-alsa");
162 }
163}
164
165static void request_submodules(struct saa7134_dev *dev)
166{
167 INIT_WORK(&dev->request_module_wk, request_module_async);
168 schedule_work(&dev->request_module_wk);
169}
170
171static void flush_request_submodules(struct saa7134_dev *dev)
172{
173 flush_work_sync(&dev->request_module_wk);
174}
175
176#else
177#define request_submodules(dev)
178#define flush_request_submodules(dev)
179#endif /* CONFIG_MODULES */
180
181/* ------------------------------------------------------------------ */
182
183/* nr of (saa7134-)pages for the given buffer size */
184static int saa7134_buffer_pages(int size)
185{
186 size = PAGE_ALIGN(size);
187 size += PAGE_SIZE; /* for non-page-aligned buffers */
188 size /= 4096;
189 return size;
190}
191
192/* calc max # of buffers from size (must not exceed the 4MB virtual
193 * address space per DMA channel) */
194int saa7134_buffer_count(unsigned int size, unsigned int count)
195{
196 unsigned int maxcount;
197
198 maxcount = 1024 / saa7134_buffer_pages(size);
199 if (count > maxcount)
200 count = maxcount;
201 return count;
202}
203
204int saa7134_buffer_startpage(struct saa7134_buf *buf)
205{
206 return saa7134_buffer_pages(buf->vb.bsize) * buf->vb.i;
207}
208
209unsigned long saa7134_buffer_base(struct saa7134_buf *buf)
210{
211 unsigned long base;
212 struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
213
214 base = saa7134_buffer_startpage(buf) * 4096;
215 base += dma->sglist[0].offset;
216 return base;
217}
218
219/* ------------------------------------------------------------------ */
220
221int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt)
222{
223 __le32 *cpu;
224 dma_addr_t dma_addr = 0;
225
226 cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr);
227 if (NULL == cpu)
228 return -ENOMEM;
229 pt->size = SAA7134_PGTABLE_SIZE;
230 pt->cpu = cpu;
231 pt->dma = dma_addr;
232 return 0;
233}
234
235int saa7134_pgtable_build(struct pci_dev *pci, struct saa7134_pgtable *pt,
236 struct scatterlist *list, unsigned int length,
237 unsigned int startpage)
238{
239 __le32 *ptr;
240 unsigned int i,p;
241
242 BUG_ON(NULL == pt || NULL == pt->cpu);
243
244 ptr = pt->cpu + startpage;
245 for (i = 0; i < length; i++, list++)
246 for (p = 0; p * 4096 < list->length; p++, ptr++)
247 *ptr = cpu_to_le32(sg_dma_address(list) - list->offset);
248 return 0;
249}
250
251void saa7134_pgtable_free(struct pci_dev *pci, struct saa7134_pgtable *pt)
252{
253 if (NULL == pt->cpu)
254 return;
255 pci_free_consistent(pci, pt->size, pt->cpu, pt->dma);
256 pt->cpu = NULL;
257}
258
259/* ------------------------------------------------------------------ */
260
261void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf)
262{
263 struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
264 BUG_ON(in_interrupt());
265
266 videobuf_waiton(q, &buf->vb, 0, 0);
267 videobuf_dma_unmap(q->dev, dma);
268 videobuf_dma_free(dma);
269 buf->vb.state = VIDEOBUF_NEEDS_INIT;
270}
271
272/* ------------------------------------------------------------------ */
273
274int saa7134_buffer_queue(struct saa7134_dev *dev,
275 struct saa7134_dmaqueue *q,
276 struct saa7134_buf *buf)
277{
278 struct saa7134_buf *next = NULL;
279
280 assert_spin_locked(&dev->slock);
281 dprintk("buffer_queue %p\n",buf);
282 if (NULL == q->curr) {
283 if (!q->need_two) {
284 q->curr = buf;
285 buf->activate(dev,buf,NULL);
286 } else if (list_empty(&q->queue)) {
287 list_add_tail(&buf->vb.queue,&q->queue);
288 buf->vb.state = VIDEOBUF_QUEUED;
289 } else {
290 next = list_entry(q->queue.next,struct saa7134_buf,
291 vb.queue);
292 q->curr = buf;
293 buf->activate(dev,buf,next);
294 }
295 } else {
296 list_add_tail(&buf->vb.queue,&q->queue);
297 buf->vb.state = VIDEOBUF_QUEUED;
298 }
299 return 0;
300}
301
302void saa7134_buffer_finish(struct saa7134_dev *dev,
303 struct saa7134_dmaqueue *q,
304 unsigned int state)
305{
306 assert_spin_locked(&dev->slock);
307 dprintk("buffer_finish %p\n",q->curr);
308
309 /* finish current buffer */
310 q->curr->vb.state = state;
311 do_gettimeofday(&q->curr->vb.ts);
312 wake_up(&q->curr->vb.done);
313 q->curr = NULL;
314}
315
316void saa7134_buffer_next(struct saa7134_dev *dev,
317 struct saa7134_dmaqueue *q)
318{
319 struct saa7134_buf *buf,*next = NULL;
320
321 assert_spin_locked(&dev->slock);
322 BUG_ON(NULL != q->curr);
323
324 if (!list_empty(&q->queue)) {
325 /* activate next one from queue */
326 buf = list_entry(q->queue.next,struct saa7134_buf,vb.queue);
327 dprintk("buffer_next %p [prev=%p/next=%p]\n",
328 buf,q->queue.prev,q->queue.next);
329 list_del(&buf->vb.queue);
330 if (!list_empty(&q->queue))
331 next = list_entry(q->queue.next,struct saa7134_buf,
332 vb.queue);
333 q->curr = buf;
334 buf->activate(dev,buf,next);
335 dprintk("buffer_next #2 prev=%p/next=%p\n",
336 q->queue.prev,q->queue.next);
337 } else {
338 /* nothing to do -- just stop DMA */
339 dprintk("buffer_next %p\n",NULL);
340 saa7134_set_dmabits(dev);
341 del_timer(&q->timeout);
342
343 if (card_has_mpeg(dev))
344 if (dev->ts_started)
345 saa7134_ts_stop(dev);
346 }
347}
348
349void saa7134_buffer_timeout(unsigned long data)
350{
351 struct saa7134_dmaqueue *q = (struct saa7134_dmaqueue*)data;
352 struct saa7134_dev *dev = q->dev;
353 unsigned long flags;
354
355 spin_lock_irqsave(&dev->slock,flags);
356
357 /* try to reset the hardware (SWRST) */
358 saa_writeb(SAA7134_REGION_ENABLE, 0x00);
359 saa_writeb(SAA7134_REGION_ENABLE, 0x80);
360 saa_writeb(SAA7134_REGION_ENABLE, 0x00);
361
362 /* flag current buffer as failed,
363 try to start over with the next one. */
364 if (q->curr) {
365 dprintk("timeout on %p\n",q->curr);
366 saa7134_buffer_finish(dev,q,VIDEOBUF_ERROR);
367 }
368 saa7134_buffer_next(dev,q);
369 spin_unlock_irqrestore(&dev->slock,flags);
370}
371
372/* ------------------------------------------------------------------ */
373
374int saa7134_set_dmabits(struct saa7134_dev *dev)
375{
376 u32 split, task=0, ctrl=0, irq=0;
377 enum v4l2_field cap = V4L2_FIELD_ANY;
378 enum v4l2_field ov = V4L2_FIELD_ANY;
379
380 assert_spin_locked(&dev->slock);
381
382 if (dev->insuspend)
383 return 0;
384
385 /* video capture -- dma 0 + video task A */
386 if (dev->video_q.curr) {
387 task |= 0x01;
388 ctrl |= SAA7134_MAIN_CTRL_TE0;
389 irq |= SAA7134_IRQ1_INTE_RA0_1 |
390 SAA7134_IRQ1_INTE_RA0_0;
391 cap = dev->video_q.curr->vb.field;
392 }
393
394 /* video capture -- dma 1+2 (planar modes) */
395 if (dev->video_q.curr &&
396 dev->video_q.curr->fmt->planar) {
397 ctrl |= SAA7134_MAIN_CTRL_TE4 |
398 SAA7134_MAIN_CTRL_TE5;
399 }
400
401 /* screen overlay -- dma 0 + video task B */
402 if (dev->ovenable) {
403 task |= 0x10;
404 ctrl |= SAA7134_MAIN_CTRL_TE1;
405 ov = dev->ovfield;
406 }
407
408 /* vbi capture -- dma 0 + vbi task A+B */
409 if (dev->vbi_q.curr) {
410 task |= 0x22;
411 ctrl |= SAA7134_MAIN_CTRL_TE2 |
412 SAA7134_MAIN_CTRL_TE3;
413 irq |= SAA7134_IRQ1_INTE_RA0_7 |
414 SAA7134_IRQ1_INTE_RA0_6 |
415 SAA7134_IRQ1_INTE_RA0_5 |
416 SAA7134_IRQ1_INTE_RA0_4;
417 }
418
419 /* audio capture -- dma 3 */
420 if (dev->dmasound.dma_running) {
421 ctrl |= SAA7134_MAIN_CTRL_TE6;
422 irq |= SAA7134_IRQ1_INTE_RA3_1 |
423 SAA7134_IRQ1_INTE_RA3_0;
424 }
425
426 /* TS capture -- dma 5 */
427 if (dev->ts_q.curr) {
428 ctrl |= SAA7134_MAIN_CTRL_TE5;
429 irq |= SAA7134_IRQ1_INTE_RA2_1 |
430 SAA7134_IRQ1_INTE_RA2_0;
431 }
432
433 /* set task conditions + field handling */
434 if (V4L2_FIELD_HAS_BOTH(cap) || V4L2_FIELD_HAS_BOTH(ov) || cap == ov) {
435 /* default config -- use full frames */
436 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0d);
437 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0d);
438 saa_writeb(SAA7134_FIELD_HANDLING(TASK_A), 0x02);
439 saa_writeb(SAA7134_FIELD_HANDLING(TASK_B), 0x02);
440 split = 0;
441 } else {
442 /* split fields between tasks */
443 if (V4L2_FIELD_TOP == cap) {
444 /* odd A, even B, repeat */
445 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0d);
446 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0e);
447 } else {
448 /* odd B, even A, repeat */
449 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_A), 0x0e);
450 saa_writeb(SAA7134_TASK_CONDITIONS(TASK_B), 0x0d);
451 }
452 saa_writeb(SAA7134_FIELD_HANDLING(TASK_A), 0x01);
453 saa_writeb(SAA7134_FIELD_HANDLING(TASK_B), 0x01);
454 split = 1;
455 }
456
457 /* irqs */
458 saa_writeb(SAA7134_REGION_ENABLE, task);
459 saa_writel(SAA7134_IRQ1, irq);
460 saa_andorl(SAA7134_MAIN_CTRL,
461 SAA7134_MAIN_CTRL_TE0 |
462 SAA7134_MAIN_CTRL_TE1 |
463 SAA7134_MAIN_CTRL_TE2 |
464 SAA7134_MAIN_CTRL_TE3 |
465 SAA7134_MAIN_CTRL_TE4 |
466 SAA7134_MAIN_CTRL_TE5 |
467 SAA7134_MAIN_CTRL_TE6,
468 ctrl);
469 dprintk("dmabits: task=0x%02x ctrl=0x%02x irq=0x%x split=%s\n",
470 task, ctrl, irq, split ? "no" : "yes");
471
472 return 0;
473}
474
475/* ------------------------------------------------------------------ */
476/* IRQ handler + helpers */
477
478static char *irqbits[] = {
479 "DONE_RA0", "DONE_RA1", "DONE_RA2", "DONE_RA3",
480 "AR", "PE", "PWR_ON", "RDCAP", "INTL", "FIDT", "MMC",
481 "TRIG_ERR", "CONF_ERR", "LOAD_ERR",
482 "GPIO16", "GPIO18", "GPIO22", "GPIO23"
483};
484#define IRQBITS ARRAY_SIZE(irqbits)
485
486static void print_irqstatus(struct saa7134_dev *dev, int loop,
487 unsigned long report, unsigned long status)
488{
489 unsigned int i;
490
491 printk(KERN_DEBUG "%s/irq[%d,%ld]: r=0x%lx s=0x%02lx",
492 dev->name,loop,jiffies,report,status);
493 for (i = 0; i < IRQBITS; i++) {
494 if (!(report & (1 << i)))
495 continue;
496 printk(" %s",irqbits[i]);
497 }
498 if (report & SAA7134_IRQ_REPORT_DONE_RA0) {
499 printk(" | RA0=%s,%s,%s,%ld",
500 (status & 0x40) ? "vbi" : "video",
501 (status & 0x20) ? "b" : "a",
502 (status & 0x10) ? "odd" : "even",
503 (status & 0x0f));
504 }
505 printk("\n");
506}
507
508static irqreturn_t saa7134_irq(int irq, void *dev_id)
509{
510 struct saa7134_dev *dev = (struct saa7134_dev*) dev_id;
511 unsigned long report,status;
512 int loop, handled = 0;
513
514 if (dev->insuspend)
515 goto out;
516
517 for (loop = 0; loop < 10; loop++) {
518 report = saa_readl(SAA7134_IRQ_REPORT);
519 status = saa_readl(SAA7134_IRQ_STATUS);
520
521 /* If dmasound support is active and we get a sound report,
522 * mask out the report and let the saa7134-alsa module deal
523 * with it */
524 if ((report & SAA7134_IRQ_REPORT_DONE_RA3) &&
525 (dev->dmasound.priv_data != NULL) )
526 {
527 if (irq_debug > 1)
528 printk(KERN_DEBUG "%s/irq: preserving DMA sound interrupt\n",
529 dev->name);
530 report &= ~SAA7134_IRQ_REPORT_DONE_RA3;
531 }
532
533 if (0 == report) {
534 if (irq_debug > 1)
535 printk(KERN_DEBUG "%s/irq: no (more) work\n",
536 dev->name);
537 goto out;
538 }
539
540 handled = 1;
541 saa_writel(SAA7134_IRQ_REPORT,report);
542 if (irq_debug)
543 print_irqstatus(dev,loop,report,status);
544
545
546 if ((report & SAA7134_IRQ_REPORT_RDCAP) ||
547 (report & SAA7134_IRQ_REPORT_INTL))
548 saa7134_irq_video_signalchange(dev);
549
550
551 if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
552 (status & 0x60) == 0)
553 saa7134_irq_video_done(dev,status);
554
555 if ((report & SAA7134_IRQ_REPORT_DONE_RA0) &&
556 (status & 0x40) == 0x40)
557 saa7134_irq_vbi_done(dev,status);
558
559 if ((report & SAA7134_IRQ_REPORT_DONE_RA2) &&
560 card_has_mpeg(dev))
561 saa7134_irq_ts_done(dev,status);
562
563 if (report & SAA7134_IRQ_REPORT_GPIO16) {
564 switch (dev->has_remote) {
565 case SAA7134_REMOTE_GPIO:
566 if (!dev->remote)
567 break;
568 if (dev->remote->mask_keydown & 0x10000) {
569 saa7134_input_irq(dev);
570 }
571 break;
572
573 case SAA7134_REMOTE_I2C:
574 break; /* FIXME: invoke I2C get_key() */
575
576 default: /* GPIO16 not used by IR remote */
577 break;
578 }
579 }
580
581 if (report & SAA7134_IRQ_REPORT_GPIO18) {
582 switch (dev->has_remote) {
583 case SAA7134_REMOTE_GPIO:
584 if (!dev->remote)
585 break;
586 if ((dev->remote->mask_keydown & 0x40000) ||
587 (dev->remote->mask_keyup & 0x40000)) {
588 saa7134_input_irq(dev);
589 }
590 break;
591
592 case SAA7134_REMOTE_I2C:
593 break; /* FIXME: invoke I2C get_key() */
594
595 default: /* GPIO18 not used by IR remote */
596 break;
597 }
598 }
599 }
600
601 if (10 == loop) {
602 print_irqstatus(dev,loop,report,status);
603 if (report & SAA7134_IRQ_REPORT_PE) {
604 /* disable all parity error */
605 printk(KERN_WARNING "%s/irq: looping -- "
606 "clearing PE (parity error!) enable bit\n",dev->name);
607 saa_clearl(SAA7134_IRQ2,SAA7134_IRQ2_INTE_PE);
608 } else if (report & SAA7134_IRQ_REPORT_GPIO16) {
609 /* disable gpio16 IRQ */
610 printk(KERN_WARNING "%s/irq: looping -- "
611 "clearing GPIO16 enable bit\n",dev->name);
612 saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO16_P);
613 saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO16_N);
614 } else if (report & SAA7134_IRQ_REPORT_GPIO18) {
615 /* disable gpio18 IRQs */
616 printk(KERN_WARNING "%s/irq: looping -- "
617 "clearing GPIO18 enable bit\n",dev->name);
618 saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18_P);
619 saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18_N);
620 } else {
621 /* disable all irqs */
622 printk(KERN_WARNING "%s/irq: looping -- "
623 "clearing all enable bits\n",dev->name);
624 saa_writel(SAA7134_IRQ1,0);
625 saa_writel(SAA7134_IRQ2,0);
626 }
627 }
628
629 out:
630 return IRQ_RETVAL(handled);
631}
632
633/* ------------------------------------------------------------------ */
634
635/* early init (no i2c, no irq) */
636
637static int saa7134_hw_enable1(struct saa7134_dev *dev)
638{
639 /* RAM FIFO config */
640 saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
641 saa_writel(SAA7134_THRESHOULD, 0x02020202);
642
643 /* enable audio + video processing */
644 saa_writel(SAA7134_MAIN_CTRL,
645 SAA7134_MAIN_CTRL_VPLLE |
646 SAA7134_MAIN_CTRL_APLLE |
647 SAA7134_MAIN_CTRL_EXOSC |
648 SAA7134_MAIN_CTRL_EVFE1 |
649 SAA7134_MAIN_CTRL_EVFE2 |
650 SAA7134_MAIN_CTRL_ESFE |
651 SAA7134_MAIN_CTRL_EBDAC);
652
653 /*
654 * Initialize OSS _after_ enabling audio clock PLL and audio processing.
655 * OSS initialization writes to registers via the audio DSP; these
656 * writes will fail unless the audio clock has been started. At worst,
657 * audio will not work.
658 */
659
660 /* enable peripheral devices */
661 saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
662
663 /* set vertical line numbering start (vbi needs this) */
664 saa_writeb(SAA7134_SOURCE_TIMING2, 0x20);
665
666 return 0;
667}
668
669static int saa7134_hwinit1(struct saa7134_dev *dev)
670{
671 dprintk("hwinit1\n");
672
673 saa_writel(SAA7134_IRQ1, 0);
674 saa_writel(SAA7134_IRQ2, 0);
675
676 /* Clear any stale IRQ reports */
677 saa_writel(SAA7134_IRQ_REPORT, saa_readl(SAA7134_IRQ_REPORT));
678
679 mutex_init(&dev->lock);
680 spin_lock_init(&dev->slock);
681
682 saa7134_track_gpio(dev,"pre-init");
683 saa7134_video_init1(dev);
684 saa7134_vbi_init1(dev);
685 if (card_has_mpeg(dev))
686 saa7134_ts_init1(dev);
687 saa7134_input_init1(dev);
688
689 saa7134_hw_enable1(dev);
690
691 return 0;
692}
693
694/* late init (with i2c + irq) */
695static int saa7134_hw_enable2(struct saa7134_dev *dev)
696{
697
698 unsigned int irq2_mask;
699
700 /* enable IRQ's */
701 irq2_mask =
702 SAA7134_IRQ2_INTE_DEC3 |
703 SAA7134_IRQ2_INTE_DEC2 |
704 SAA7134_IRQ2_INTE_DEC1 |
705 SAA7134_IRQ2_INTE_DEC0 |
706 SAA7134_IRQ2_INTE_PE |
707 SAA7134_IRQ2_INTE_AR;
708
709 if (dev->has_remote == SAA7134_REMOTE_GPIO && dev->remote) {
710 if (dev->remote->mask_keydown & 0x10000)
711 irq2_mask |= SAA7134_IRQ2_INTE_GPIO16_N;
712 else { /* Allow enabling both IRQ edge triggers */
713 if (dev->remote->mask_keydown & 0x40000)
714 irq2_mask |= SAA7134_IRQ2_INTE_GPIO18_P;
715 if (dev->remote->mask_keyup & 0x40000)
716 irq2_mask |= SAA7134_IRQ2_INTE_GPIO18_N;
717 }
718 }
719
720 if (dev->has_remote == SAA7134_REMOTE_I2C) {
721 request_module("ir-kbd-i2c");
722 }
723
724 saa_writel(SAA7134_IRQ1, 0);
725 saa_writel(SAA7134_IRQ2, irq2_mask);
726
727 return 0;
728}
729
730static int saa7134_hwinit2(struct saa7134_dev *dev)
731{
732
733 dprintk("hwinit2\n");
734
735 saa7134_video_init2(dev);
736 saa7134_tvaudio_init2(dev);
737
738 saa7134_hw_enable2(dev);
739
740 return 0;
741}
742
743
744/* shutdown */
745static int saa7134_hwfini(struct saa7134_dev *dev)
746{
747 dprintk("hwfini\n");
748
749 if (card_has_mpeg(dev))
750 saa7134_ts_fini(dev);
751 saa7134_input_fini(dev);
752 saa7134_vbi_fini(dev);
753 saa7134_tvaudio_fini(dev);
754 return 0;
755}
756
757static void __devinit must_configure_manually(int has_eeprom)
758{
759 unsigned int i,p;
760
761 if (!has_eeprom)
762 printk(KERN_WARNING
763 "saa7134: <rant>\n"
764 "saa7134: Congratulations! Your TV card vendor saved a few\n"
765 "saa7134: cents for a eeprom, thus your pci board has no\n"
766 "saa7134: subsystem ID and I can't identify it automatically\n"
767 "saa7134: </rant>\n"
768 "saa7134: I feel better now. Ok, here are the good news:\n"
769 "saa7134: You can use the card=<nr> insmod option to specify\n"
770 "saa7134: which board do you have. The list:\n");
771 else
772 printk(KERN_WARNING
773 "saa7134: Board is currently unknown. You might try to use the card=<nr>\n"
774 "saa7134: insmod option to specify which board do you have, but this is\n"
775 "saa7134: somewhat risky, as might damage your card. It is better to ask\n"
776 "saa7134: for support at linux-media@vger.kernel.org.\n"
777 "saa7134: The supported cards are:\n");
778
779 for (i = 0; i < saa7134_bcount; i++) {
780 printk(KERN_WARNING "saa7134: card=%d -> %-40.40s",
781 i,saa7134_boards[i].name);
782 for (p = 0; saa7134_pci_tbl[p].driver_data; p++) {
783 if (saa7134_pci_tbl[p].driver_data != i)
784 continue;
785 printk(" %04x:%04x",
786 saa7134_pci_tbl[p].subvendor,
787 saa7134_pci_tbl[p].subdevice);
788 }
789 printk("\n");
790 }
791}
792
793static struct video_device *vdev_init(struct saa7134_dev *dev,
794 struct video_device *template,
795 char *type)
796{
797 struct video_device *vfd;
798
799 vfd = video_device_alloc();
800 if (NULL == vfd)
801 return NULL;
802 *vfd = *template;
803 vfd->v4l2_dev = &dev->v4l2_dev;
804 vfd->release = video_device_release;
805 vfd->debug = video_debug;
806 snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
807 dev->name, type, saa7134_boards[dev->board].name);
808 video_set_drvdata(vfd, dev);
809 return vfd;
810}
811
812static void saa7134_unregister_video(struct saa7134_dev *dev)
813{
814 if (dev->video_dev) {
815 if (video_is_registered(dev->video_dev))
816 video_unregister_device(dev->video_dev);
817 else
818 video_device_release(dev->video_dev);
819 dev->video_dev = NULL;
820 }
821 if (dev->vbi_dev) {
822 if (video_is_registered(dev->vbi_dev))
823 video_unregister_device(dev->vbi_dev);
824 else
825 video_device_release(dev->vbi_dev);
826 dev->vbi_dev = NULL;
827 }
828 if (dev->radio_dev) {
829 if (video_is_registered(dev->radio_dev))
830 video_unregister_device(dev->radio_dev);
831 else
832 video_device_release(dev->radio_dev);
833 dev->radio_dev = NULL;
834 }
835}
836
837static void mpeg_ops_attach(struct saa7134_mpeg_ops *ops,
838 struct saa7134_dev *dev)
839{
840 int err;
841
842 if (NULL != dev->mops)
843 return;
844 if (saa7134_boards[dev->board].mpeg != ops->type)
845 return;
846 err = ops->init(dev);
847 if (0 != err)
848 return;
849 dev->mops = ops;
850}
851
852static void mpeg_ops_detach(struct saa7134_mpeg_ops *ops,
853 struct saa7134_dev *dev)
854{
855 if (NULL == dev->mops)
856 return;
857 if (dev->mops != ops)
858 return;
859 dev->mops->fini(dev);
860 dev->mops = NULL;
861}
862
863static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
864 const struct pci_device_id *pci_id)
865{
866 struct saa7134_dev *dev;
867 struct saa7134_mpeg_ops *mops;
868 int err;
869
870 if (saa7134_devcount == SAA7134_MAXBOARDS)
871 return -ENOMEM;
872
873 dev = kzalloc(sizeof(*dev),GFP_KERNEL);
874 if (NULL == dev)
875 return -ENOMEM;
876
877 err = v4l2_device_register(&pci_dev->dev, &dev->v4l2_dev);
878 if (err)
879 goto fail0;
880
881 /* pci init */
882 dev->pci = pci_dev;
883 if (pci_enable_device(pci_dev)) {
884 err = -EIO;
885 goto fail1;
886 }
887
888 dev->nr = saa7134_devcount;
889 sprintf(dev->name,"saa%x[%d]",pci_dev->device,dev->nr);
890
891 /* pci quirks */
892 if (pci_pci_problems) {
893 if (pci_pci_problems & PCIPCI_TRITON)
894 printk(KERN_INFO "%s: quirk: PCIPCI_TRITON\n", dev->name);
895 if (pci_pci_problems & PCIPCI_NATOMA)
896 printk(KERN_INFO "%s: quirk: PCIPCI_NATOMA\n", dev->name);
897 if (pci_pci_problems & PCIPCI_VIAETBF)
898 printk(KERN_INFO "%s: quirk: PCIPCI_VIAETBF\n", dev->name);
899 if (pci_pci_problems & PCIPCI_VSFX)
900 printk(KERN_INFO "%s: quirk: PCIPCI_VSFX\n",dev->name);
901#ifdef PCIPCI_ALIMAGIK
902 if (pci_pci_problems & PCIPCI_ALIMAGIK) {
903 printk(KERN_INFO "%s: quirk: PCIPCI_ALIMAGIK -- latency fixup\n",
904 dev->name);
905 latency = 0x0A;
906 }
907#endif
908 if (pci_pci_problems & (PCIPCI_FAIL|PCIAGP_FAIL)) {
909 printk(KERN_INFO "%s: quirk: this driver and your "
910 "chipset may not work together"
911 " in overlay mode.\n",dev->name);
912 if (!saa7134_no_overlay) {
913 printk(KERN_INFO "%s: quirk: overlay "
914 "mode will be disabled.\n",
915 dev->name);
916 saa7134_no_overlay = 1;
917 } else {
918 printk(KERN_INFO "%s: quirk: overlay "
919 "mode will be forced. Use this"
920 " option at your own risk.\n",
921 dev->name);
922 }
923 }
924 }
925 if (UNSET != latency) {
926 printk(KERN_INFO "%s: setting pci latency timer to %d\n",
927 dev->name,latency);
928 pci_write_config_byte(pci_dev, PCI_LATENCY_TIMER, latency);
929 }
930
931 /* print pci info */
932 dev->pci_rev = pci_dev->revision;
933 pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
934 printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, "
935 "latency: %d, mmio: 0x%llx\n", dev->name,
936 pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
937 dev->pci_lat,(unsigned long long)pci_resource_start(pci_dev,0));
938 pci_set_master(pci_dev);
939 if (!pci_dma_supported(pci_dev, DMA_BIT_MASK(32))) {
940 printk("%s: Oops: no 32bit PCI DMA ???\n",dev->name);
941 err = -EIO;
942 goto fail1;
943 }
944
945 /* board config */
946 dev->board = pci_id->driver_data;
947 if (card[dev->nr] >= 0 &&
948 card[dev->nr] < saa7134_bcount)
949 dev->board = card[dev->nr];
950 if (SAA7134_BOARD_UNKNOWN == dev->board)
951 must_configure_manually(0);
952 else if (SAA7134_BOARD_NOAUTO == dev->board) {
953 must_configure_manually(1);
954 dev->board = SAA7134_BOARD_UNKNOWN;
955 }
956 dev->autodetected = card[dev->nr] != dev->board;
957 dev->tuner_type = saa7134_boards[dev->board].tuner_type;
958 dev->tuner_addr = saa7134_boards[dev->board].tuner_addr;
959 dev->radio_type = saa7134_boards[dev->board].radio_type;
960 dev->radio_addr = saa7134_boards[dev->board].radio_addr;
961 dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
962 if (UNSET != tuner[dev->nr])
963 dev->tuner_type = tuner[dev->nr];
964 printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
965 dev->name,pci_dev->subsystem_vendor,
966 pci_dev->subsystem_device,saa7134_boards[dev->board].name,
967 dev->board, dev->autodetected ?
968 "autodetected" : "insmod option");
969
970 /* get mmio */
971 if (!request_mem_region(pci_resource_start(pci_dev,0),
972 pci_resource_len(pci_dev,0),
973 dev->name)) {
974 err = -EBUSY;
975 printk(KERN_ERR "%s: can't get MMIO memory @ 0x%llx\n",
976 dev->name,(unsigned long long)pci_resource_start(pci_dev,0));
977 goto fail1;
978 }
979 dev->lmmio = ioremap(pci_resource_start(pci_dev, 0),
980 pci_resource_len(pci_dev, 0));
981 dev->bmmio = (__u8 __iomem *)dev->lmmio;
982 if (NULL == dev->lmmio) {
983 err = -EIO;
984 printk(KERN_ERR "%s: can't ioremap() MMIO memory\n",
985 dev->name);
986 goto fail2;
987 }
988
989 /* initialize hardware #1 */
990 saa7134_board_init1(dev);
991 saa7134_hwinit1(dev);
992
993 /* get irq */
994 err = request_irq(pci_dev->irq, saa7134_irq,
995 IRQF_SHARED | IRQF_DISABLED, dev->name, dev);
996 if (err < 0) {
997 printk(KERN_ERR "%s: can't get IRQ %d\n",
998 dev->name,pci_dev->irq);
999 goto fail3;
1000 }
1001
1002 /* wait a bit, register i2c bus */
1003 msleep(100);
1004 saa7134_i2c_register(dev);
1005 saa7134_board_init2(dev);
1006
1007 saa7134_hwinit2(dev);
1008
1009 /* load i2c helpers */
1010 if (card_is_empress(dev)) {
1011 struct v4l2_subdev *sd =
1012 v4l2_i2c_new_subdev(&dev->v4l2_dev, &dev->i2c_adap,
1013 "saa6752hs",
1014 saa7134_boards[dev->board].empress_addr, NULL);
1015
1016 if (sd)
1017 sd->grp_id = GRP_EMPRESS;
1018 }
1019
1020 if (saa7134_boards[dev->board].rds_addr) {
1021 struct v4l2_subdev *sd;
1022
1023 sd = v4l2_i2c_new_subdev(&dev->v4l2_dev,
1024 &dev->i2c_adap, "saa6588",
1025 0, I2C_ADDRS(saa7134_boards[dev->board].rds_addr));
1026 if (sd) {
1027 printk(KERN_INFO "%s: found RDS decoder\n", dev->name);
1028 dev->has_rds = 1;
1029 }
1030 }
1031
1032 v4l2_prio_init(&dev->prio);
1033
1034 mutex_lock(&saa7134_devlist_lock);
1035 list_for_each_entry(mops, &mops_list, next)
1036 mpeg_ops_attach(mops, dev);
1037 list_add_tail(&dev->devlist, &saa7134_devlist);
1038 mutex_unlock(&saa7134_devlist_lock);
1039
1040 /* check for signal */
1041 saa7134_irq_video_signalchange(dev);
1042
1043 if (TUNER_ABSENT != dev->tuner_type)
1044 saa_call_all(dev, core, s_power, 0);
1045
1046 /* register v4l devices */
1047 if (saa7134_no_overlay > 0)
1048 printk(KERN_INFO "%s: Overlay support disabled.\n", dev->name);
1049
1050 dev->video_dev = vdev_init(dev,&saa7134_video_template,"video");
1051 err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
1052 video_nr[dev->nr]);
1053 if (err < 0) {
1054 printk(KERN_INFO "%s: can't register video device\n",
1055 dev->name);
1056 goto fail4;
1057 }
1058 printk(KERN_INFO "%s: registered device %s [v4l2]\n",
1059 dev->name, video_device_node_name(dev->video_dev));
1060
1061 dev->vbi_dev = vdev_init(dev, &saa7134_video_template, "vbi");
1062
1063 err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
1064 vbi_nr[dev->nr]);
1065 if (err < 0)
1066 goto fail4;
1067 printk(KERN_INFO "%s: registered device %s\n",
1068 dev->name, video_device_node_name(dev->vbi_dev));
1069
1070 if (card_has_radio(dev)) {
1071 dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
1072 err = video_register_device(dev->radio_dev,VFL_TYPE_RADIO,
1073 radio_nr[dev->nr]);
1074 if (err < 0)
1075 goto fail4;
1076 printk(KERN_INFO "%s: registered device %s\n",
1077 dev->name, video_device_node_name(dev->radio_dev));
1078 }
1079
1080 /* everything worked */
1081 saa7134_devcount++;
1082
1083 if (saa7134_dmasound_init && !dev->dmasound.priv_data)
1084 saa7134_dmasound_init(dev);
1085
1086 request_submodules(dev);
1087 return 0;
1088
1089 fail4:
1090 saa7134_unregister_video(dev);
1091 saa7134_i2c_unregister(dev);
1092 free_irq(pci_dev->irq, dev);
1093 fail3:
1094 saa7134_hwfini(dev);
1095 iounmap(dev->lmmio);
1096 fail2:
1097 release_mem_region(pci_resource_start(pci_dev,0),
1098 pci_resource_len(pci_dev,0));
1099 fail1:
1100 v4l2_device_unregister(&dev->v4l2_dev);
1101 fail0:
1102 kfree(dev);
1103 return err;
1104}
1105
1106static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
1107{
1108 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
1109 struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev);
1110 struct saa7134_mpeg_ops *mops;
1111
1112 flush_request_submodules(dev);
1113
1114 /* Release DMA sound modules if present */
1115 if (saa7134_dmasound_exit && dev->dmasound.priv_data) {
1116 saa7134_dmasound_exit(dev);
1117 }
1118
1119 /* debugging ... */
1120 if (irq_debug) {
1121 u32 report = saa_readl(SAA7134_IRQ_REPORT);
1122 u32 status = saa_readl(SAA7134_IRQ_STATUS);
1123 print_irqstatus(dev,42,report,status);
1124 }
1125
1126 /* disable peripheral devices */
1127 saa_writeb(SAA7134_SPECIAL_MODE,0);
1128
1129 /* shutdown hardware */
1130 saa_writel(SAA7134_IRQ1,0);
1131 saa_writel(SAA7134_IRQ2,0);
1132 saa_writel(SAA7134_MAIN_CTRL,0);
1133
1134 /* shutdown subsystems */
1135 saa7134_hwfini(dev);
1136
1137 /* unregister */
1138 mutex_lock(&saa7134_devlist_lock);
1139 list_del(&dev->devlist);
1140 list_for_each_entry(mops, &mops_list, next)
1141 mpeg_ops_detach(mops, dev);
1142 mutex_unlock(&saa7134_devlist_lock);
1143 saa7134_devcount--;
1144
1145 saa7134_i2c_unregister(dev);
1146 saa7134_unregister_video(dev);
1147
1148
1149 /* the DMA sound modules should be unloaded before reaching
1150 this, but just in case they are still present... */
1151 if (dev->dmasound.priv_data != NULL) {
1152 free_irq(pci_dev->irq, &dev->dmasound);
1153 dev->dmasound.priv_data = NULL;
1154 }
1155
1156
1157 /* release resources */
1158 free_irq(pci_dev->irq, dev);
1159 iounmap(dev->lmmio);
1160 release_mem_region(pci_resource_start(pci_dev,0),
1161 pci_resource_len(pci_dev,0));
1162
1163
1164 v4l2_device_unregister(&dev->v4l2_dev);
1165
1166 /* free memory */
1167 kfree(dev);
1168}
1169
1170#ifdef CONFIG_PM
1171
1172/* resends a current buffer in queue after resume */
1173static int saa7134_buffer_requeue(struct saa7134_dev *dev,
1174 struct saa7134_dmaqueue *q)
1175{
1176 struct saa7134_buf *buf, *next;
1177
1178 assert_spin_locked(&dev->slock);
1179
1180 buf = q->curr;
1181 next = buf;
1182 dprintk("buffer_requeue\n");
1183
1184 if (!buf)
1185 return 0;
1186
1187 dprintk("buffer_requeue : resending active buffers \n");
1188
1189 if (!list_empty(&q->queue))
1190 next = list_entry(q->queue.next, struct saa7134_buf,
1191 vb.queue);
1192 buf->activate(dev, buf, next);
1193
1194 return 0;
1195}
1196
1197static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
1198{
1199 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
1200 struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev);
1201
1202 /* disable overlay - apps should enable it explicitly on resume*/
1203 dev->ovenable = 0;
1204
1205 /* Disable interrupts, DMA, and rest of the chip*/
1206 saa_writel(SAA7134_IRQ1, 0);
1207 saa_writel(SAA7134_IRQ2, 0);
1208 saa_writel(SAA7134_MAIN_CTRL, 0);
1209
1210 dev->insuspend = 1;
1211 synchronize_irq(pci_dev->irq);
1212
1213 /* ACK interrupts once more, just in case,
1214 since the IRQ handler won't ack them anymore*/
1215
1216 saa_writel(SAA7134_IRQ_REPORT, saa_readl(SAA7134_IRQ_REPORT));
1217
1218 /* Disable timeout timers - if we have active buffers, we will
1219 fill them on resume*/
1220
1221 del_timer(&dev->video_q.timeout);
1222 del_timer(&dev->vbi_q.timeout);
1223 del_timer(&dev->ts_q.timeout);
1224
1225 if (dev->remote)
1226 saa7134_ir_stop(dev);
1227
1228 pci_save_state(pci_dev);
1229 pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
1230
1231 return 0;
1232}
1233
1234static int saa7134_resume(struct pci_dev *pci_dev)
1235{
1236 struct v4l2_device *v4l2_dev = pci_get_drvdata(pci_dev);
1237 struct saa7134_dev *dev = container_of(v4l2_dev, struct saa7134_dev, v4l2_dev);
1238 unsigned long flags;
1239
1240 pci_set_power_state(pci_dev, PCI_D0);
1241 pci_restore_state(pci_dev);
1242
1243 /* Do things that are done in saa7134_initdev ,
1244 except of initializing memory structures.*/
1245
1246 saa7134_board_init1(dev);
1247
1248 /* saa7134_hwinit1 */
1249 if (saa7134_boards[dev->board].video_out)
1250 saa7134_videoport_init(dev);
1251 if (card_has_mpeg(dev))
1252 saa7134_ts_init_hw(dev);
1253 if (dev->remote)
1254 saa7134_ir_start(dev);
1255 saa7134_hw_enable1(dev);
1256
1257 msleep(100);
1258
1259 saa7134_board_init2(dev);
1260
1261 /*saa7134_hwinit2*/
1262 saa7134_set_tvnorm_hw(dev);
1263 saa7134_tvaudio_setmute(dev);
1264 saa7134_tvaudio_setvolume(dev, dev->ctl_volume);
1265 saa7134_tvaudio_init(dev);
1266 saa7134_tvaudio_do_scan(dev);
1267 saa7134_enable_i2s(dev);
1268 saa7134_hw_enable2(dev);
1269
1270 saa7134_irq_video_signalchange(dev);
1271
1272 /*resume unfinished buffer(s)*/
1273 spin_lock_irqsave(&dev->slock, flags);
1274 saa7134_buffer_requeue(dev, &dev->video_q);
1275 saa7134_buffer_requeue(dev, &dev->vbi_q);
1276 saa7134_buffer_requeue(dev, &dev->ts_q);
1277
1278 /* FIXME: Disable DMA audio sound - temporary till proper support
1279 is implemented*/
1280
1281 dev->dmasound.dma_running = 0;
1282
1283 /* start DMA now*/
1284 dev->insuspend = 0;
1285 smp_wmb();
1286 saa7134_set_dmabits(dev);
1287 spin_unlock_irqrestore(&dev->slock, flags);
1288
1289 return 0;
1290}
1291#endif
1292
1293/* ----------------------------------------------------------- */
1294
1295int saa7134_ts_register(struct saa7134_mpeg_ops *ops)
1296{
1297 struct saa7134_dev *dev;
1298
1299 mutex_lock(&saa7134_devlist_lock);
1300 list_for_each_entry(dev, &saa7134_devlist, devlist)
1301 mpeg_ops_attach(ops, dev);
1302 list_add_tail(&ops->next,&mops_list);
1303 mutex_unlock(&saa7134_devlist_lock);
1304 return 0;
1305}
1306
1307void saa7134_ts_unregister(struct saa7134_mpeg_ops *ops)
1308{
1309 struct saa7134_dev *dev;
1310
1311 mutex_lock(&saa7134_devlist_lock);
1312 list_del(&ops->next);
1313 list_for_each_entry(dev, &saa7134_devlist, devlist)
1314 mpeg_ops_detach(ops, dev);
1315 mutex_unlock(&saa7134_devlist_lock);
1316}
1317
1318EXPORT_SYMBOL(saa7134_ts_register);
1319EXPORT_SYMBOL(saa7134_ts_unregister);
1320
1321/* ----------------------------------------------------------- */
1322
1323static struct pci_driver saa7134_pci_driver = {
1324 .name = "saa7134",
1325 .id_table = saa7134_pci_tbl,
1326 .probe = saa7134_initdev,
1327 .remove = __devexit_p(saa7134_finidev),
1328#ifdef CONFIG_PM
1329 .suspend = saa7134_suspend,
1330 .resume = saa7134_resume
1331#endif
1332};
1333
1334static int __init saa7134_init(void)
1335{
1336 INIT_LIST_HEAD(&saa7134_devlist);
1337 printk(KERN_INFO "saa7130/34: v4l2 driver version %s loaded\n",
1338 SAA7134_VERSION);
1339 return pci_register_driver(&saa7134_pci_driver);
1340}
1341
1342static void __exit saa7134_fini(void)
1343{
1344 pci_unregister_driver(&saa7134_pci_driver);
1345}
1346
1347module_init(saa7134_init);
1348module_exit(saa7134_fini);
1349
1350/* ----------------------------------------------------------- */
1351
1352EXPORT_SYMBOL(saa7134_set_gpio);
1353EXPORT_SYMBOL(saa7134_boards);
1354
1355/* ----------------- for the DMA sound modules --------------- */
1356
1357EXPORT_SYMBOL(saa7134_dmasound_init);
1358EXPORT_SYMBOL(saa7134_dmasound_exit);
1359EXPORT_SYMBOL(saa7134_pgtable_free);
1360EXPORT_SYMBOL(saa7134_pgtable_build);
1361EXPORT_SYMBOL(saa7134_pgtable_alloc);
1362EXPORT_SYMBOL(saa7134_set_dmabits);
1363
1364/* ----------------------------------------------------------- */
1365/*
1366 * Local variables:
1367 * c-basic-offset: 8
1368 * End:
1369 */
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c
new file mode 100644
index 00000000000..1e4ef166988
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-dvb.c
@@ -0,0 +1,1852 @@
1/*
2 *
3 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
4 *
5 * Extended 3 / 2005 by Hartmut Hackmann to support various
6 * cards with the tda10046 DVB-T channel decoder
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/list.h>
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/delay.h>
28#include <linux/kthread.h>
29#include <linux/suspend.h>
30
31#include "saa7134-reg.h"
32#include "saa7134.h"
33#include <media/v4l2-common.h>
34#include "dvb-pll.h"
35#include <dvb_frontend.h>
36
37#include "mt352.h"
38#include "mt352_priv.h" /* FIXME */
39#include "tda1004x.h"
40#include "nxt200x.h"
41#include "tuner-xc2028.h"
42#include "xc5000.h"
43
44#include "tda10086.h"
45#include "tda826x.h"
46#include "tda827x.h"
47#include "isl6421.h"
48#include "isl6405.h"
49#include "lnbp21.h"
50#include "tuner-simple.h"
51#include "tda10048.h"
52#include "tda18271.h"
53#include "lgdt3305.h"
54#include "tda8290.h"
55#include "mb86a20s.h"
56#include "lgs8gxx.h"
57
58#include "zl10353.h"
59#include "qt1010.h"
60
61#include "zl10036.h"
62#include "zl10039.h"
63#include "mt312.h"
64
65MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
66MODULE_LICENSE("GPL");
67
68static unsigned int antenna_pwr;
69
70module_param(antenna_pwr, int, 0444);
71MODULE_PARM_DESC(antenna_pwr,"enable antenna power (Pinnacle 300i)");
72
73static int use_frontend;
74module_param(use_frontend, int, 0644);
75MODULE_PARM_DESC(use_frontend,"for cards with multiple frontends (0: terrestrial, 1: satellite)");
76
77static int debug;
78module_param(debug, int, 0644);
79MODULE_PARM_DESC(debug, "Turn on/off module debugging (default:off).");
80
81DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
82
83#define dprintk(fmt, arg...) do { if (debug) \
84 printk(KERN_DEBUG "%s/dvb: " fmt, dev->name , ## arg); } while(0)
85
86/* Print a warning */
87#define wprintk(fmt, arg...) \
88 printk(KERN_WARNING "%s/dvb: " fmt, dev->name, ## arg)
89
90/* ------------------------------------------------------------------
91 * mt352 based DVB-T cards
92 */
93
94static int pinnacle_antenna_pwr(struct saa7134_dev *dev, int on)
95{
96 u32 ok;
97
98 if (!on) {
99 saa_setl(SAA7134_GPIO_GPMODE0 >> 2, (1 << 26));
100 saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 26));
101 return 0;
102 }
103
104 saa_setl(SAA7134_GPIO_GPMODE0 >> 2, (1 << 26));
105 saa_setl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 26));
106 udelay(10);
107
108 saa_setl(SAA7134_GPIO_GPMODE0 >> 2, (1 << 28));
109 saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 28));
110 udelay(10);
111 saa_setl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 28));
112 udelay(10);
113 ok = saa_readl(SAA7134_GPIO_GPSTATUS0) & (1 << 27);
114 dprintk("%s %s\n", __func__, ok ? "on" : "off");
115
116 if (!ok)
117 saa_clearl(SAA7134_GPIO_GPSTATUS0 >> 2, (1 << 26));
118 return ok;
119}
120
121static int mt352_pinnacle_init(struct dvb_frontend* fe)
122{
123 static u8 clock_config [] = { CLOCK_CTL, 0x3d, 0x28 };
124 static u8 reset [] = { RESET, 0x80 };
125 static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
126 static u8 agc_cfg [] = { AGC_TARGET, 0x28, 0xa0 };
127 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x31 };
128 static u8 fsm_ctl_cfg[] = { 0x7b, 0x04 };
129 static u8 gpp_ctl_cfg [] = { GPP_CTL, 0x0f };
130 static u8 scan_ctl_cfg [] = { SCAN_CTL, 0x0d };
131 static u8 irq_cfg [] = { INTERRUPT_EN_0, 0x00, 0x00, 0x00, 0x00 };
132 struct saa7134_dev *dev= fe->dvb->priv;
133
134 dprintk("%s called\n", __func__);
135
136 mt352_write(fe, clock_config, sizeof(clock_config));
137 udelay(200);
138 mt352_write(fe, reset, sizeof(reset));
139 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
140 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
141 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
142 mt352_write(fe, gpp_ctl_cfg, sizeof(gpp_ctl_cfg));
143
144 mt352_write(fe, fsm_ctl_cfg, sizeof(fsm_ctl_cfg));
145 mt352_write(fe, scan_ctl_cfg, sizeof(scan_ctl_cfg));
146 mt352_write(fe, irq_cfg, sizeof(irq_cfg));
147
148 return 0;
149}
150
151static int mt352_aver777_init(struct dvb_frontend* fe)
152{
153 static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x2d };
154 static u8 reset [] = { RESET, 0x80 };
155 static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
156 static u8 agc_cfg [] = { AGC_TARGET, 0x28, 0xa0 };
157 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 };
158
159 mt352_write(fe, clock_config, sizeof(clock_config));
160 udelay(200);
161 mt352_write(fe, reset, sizeof(reset));
162 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
163 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
164 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
165
166 return 0;
167}
168
169static int mt352_avermedia_xc3028_init(struct dvb_frontend *fe)
170{
171 static u8 clock_config [] = { CLOCK_CTL, 0x38, 0x2d };
172 static u8 reset [] = { RESET, 0x80 };
173 static u8 adc_ctl_1_cfg [] = { ADC_CTL_1, 0x40 };
174 static u8 agc_cfg [] = { AGC_TARGET, 0xe };
175 static u8 capt_range_cfg[] = { CAPT_RANGE, 0x33 };
176
177 mt352_write(fe, clock_config, sizeof(clock_config));
178 udelay(200);
179 mt352_write(fe, reset, sizeof(reset));
180 mt352_write(fe, adc_ctl_1_cfg, sizeof(adc_ctl_1_cfg));
181 mt352_write(fe, agc_cfg, sizeof(agc_cfg));
182 mt352_write(fe, capt_range_cfg, sizeof(capt_range_cfg));
183 return 0;
184}
185
186static int mt352_pinnacle_tuner_set_params(struct dvb_frontend* fe,
187 struct dvb_frontend_parameters* params)
188{
189 u8 off[] = { 0x00, 0xf1};
190 u8 on[] = { 0x00, 0x71};
191 struct i2c_msg msg = {.addr=0x43, .flags=0, .buf=off, .len = sizeof(off)};
192
193 struct saa7134_dev *dev = fe->dvb->priv;
194 struct v4l2_frequency f;
195
196 /* set frequency (mt2050) */
197 f.tuner = 0;
198 f.type = V4L2_TUNER_DIGITAL_TV;
199 f.frequency = params->frequency / 1000 * 16 / 1000;
200 if (fe->ops.i2c_gate_ctrl)
201 fe->ops.i2c_gate_ctrl(fe, 1);
202 i2c_transfer(&dev->i2c_adap, &msg, 1);
203 saa_call_all(dev, tuner, s_frequency, &f);
204 msg.buf = on;
205 if (fe->ops.i2c_gate_ctrl)
206 fe->ops.i2c_gate_ctrl(fe, 1);
207 i2c_transfer(&dev->i2c_adap, &msg, 1);
208
209 pinnacle_antenna_pwr(dev, antenna_pwr);
210
211 /* mt352 setup */
212 return mt352_pinnacle_init(fe);
213}
214
215static struct mt352_config pinnacle_300i = {
216 .demod_address = 0x3c >> 1,
217 .adc_clock = 20333,
218 .if2 = 36150,
219 .no_tuner = 1,
220 .demod_init = mt352_pinnacle_init,
221};
222
223static struct mt352_config avermedia_777 = {
224 .demod_address = 0xf,
225 .demod_init = mt352_aver777_init,
226};
227
228static struct mt352_config avermedia_xc3028_mt352_dev = {
229 .demod_address = (0x1e >> 1),
230 .no_tuner = 1,
231 .demod_init = mt352_avermedia_xc3028_init,
232};
233
234static struct tda18271_std_map mb86a20s_tda18271_std_map = {
235 .dvbt_6 = { .if_freq = 3300, .agc_mode = 3, .std = 4,
236 .if_lvl = 7, .rfagc_top = 0x37, },
237};
238
239static struct tda18271_config kworld_tda18271_config = {
240 .std_map = &mb86a20s_tda18271_std_map,
241 .gate = TDA18271_GATE_DIGITAL,
242 .config = 3, /* Use tuner callback for AGC */
243
244};
245
246static const struct mb86a20s_config kworld_mb86a20s_config = {
247 .demod_address = 0x10,
248};
249
250static int kworld_sbtvd_gate_ctrl(struct dvb_frontend* fe, int enable)
251{
252 struct saa7134_dev *dev = fe->dvb->priv;
253
254 unsigned char initmsg[] = {0x45, 0x97};
255 unsigned char msg_enable[] = {0x45, 0xc1};
256 unsigned char msg_disable[] = {0x45, 0x81};
257 struct i2c_msg msg = {.addr = 0x4b, .flags = 0, .buf = initmsg, .len = 2};
258
259 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) {
260 wprintk("could not access the I2C gate\n");
261 return -EIO;
262 }
263 if (enable)
264 msg.buf = msg_enable;
265 else
266 msg.buf = msg_disable;
267 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1) {
268 wprintk("could not access the I2C gate\n");
269 return -EIO;
270 }
271 msleep(20);
272 return 0;
273}
274
275/* ==================================================================
276 * tda1004x based DVB-T cards, helper functions
277 */
278
279static int philips_tda1004x_request_firmware(struct dvb_frontend *fe,
280 const struct firmware **fw, char *name)
281{
282 struct saa7134_dev *dev = fe->dvb->priv;
283 return request_firmware(fw, name, &dev->pci->dev);
284}
285
286/* ------------------------------------------------------------------
287 * these tuners are tu1216, td1316(a)
288 */
289
290static int philips_tda6651_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
291{
292 struct saa7134_dev *dev = fe->dvb->priv;
293 struct tda1004x_state *state = fe->demodulator_priv;
294 u8 addr = state->config->tuner_address;
295 u8 tuner_buf[4];
296 struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tuner_buf,.len =
297 sizeof(tuner_buf) };
298 int tuner_frequency = 0;
299 u8 band, cp, filter;
300
301 /* determine charge pump */
302 tuner_frequency = params->frequency + 36166000;
303 if (tuner_frequency < 87000000)
304 return -EINVAL;
305 else if (tuner_frequency < 130000000)
306 cp = 3;
307 else if (tuner_frequency < 160000000)
308 cp = 5;
309 else if (tuner_frequency < 200000000)
310 cp = 6;
311 else if (tuner_frequency < 290000000)
312 cp = 3;
313 else if (tuner_frequency < 420000000)
314 cp = 5;
315 else if (tuner_frequency < 480000000)
316 cp = 6;
317 else if (tuner_frequency < 620000000)
318 cp = 3;
319 else if (tuner_frequency < 830000000)
320 cp = 5;
321 else if (tuner_frequency < 895000000)
322 cp = 7;
323 else
324 return -EINVAL;
325
326 /* determine band */
327 if (params->frequency < 49000000)
328 return -EINVAL;
329 else if (params->frequency < 161000000)
330 band = 1;
331 else if (params->frequency < 444000000)
332 band = 2;
333 else if (params->frequency < 861000000)
334 band = 4;
335 else
336 return -EINVAL;
337
338 /* setup PLL filter */
339 switch (params->u.ofdm.bandwidth) {
340 case BANDWIDTH_6_MHZ:
341 filter = 0;
342 break;
343
344 case BANDWIDTH_7_MHZ:
345 filter = 0;
346 break;
347
348 case BANDWIDTH_8_MHZ:
349 filter = 1;
350 break;
351
352 default:
353 return -EINVAL;
354 }
355
356 /* calculate divisor
357 * ((36166000+((1000000/6)/2)) + Finput)/(1000000/6)
358 */
359 tuner_frequency = (((params->frequency / 1000) * 6) + 217496) / 1000;
360
361 /* setup tuner buffer */
362 tuner_buf[0] = (tuner_frequency >> 8) & 0x7f;
363 tuner_buf[1] = tuner_frequency & 0xff;
364 tuner_buf[2] = 0xca;
365 tuner_buf[3] = (cp << 5) | (filter << 3) | band;
366
367 if (fe->ops.i2c_gate_ctrl)
368 fe->ops.i2c_gate_ctrl(fe, 1);
369 if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) {
370 wprintk("could not write to tuner at addr: 0x%02x\n",
371 addr << 1);
372 return -EIO;
373 }
374 msleep(1);
375 return 0;
376}
377
378static int philips_tu1216_init(struct dvb_frontend *fe)
379{
380 struct saa7134_dev *dev = fe->dvb->priv;
381 struct tda1004x_state *state = fe->demodulator_priv;
382 u8 addr = state->config->tuner_address;
383 static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab };
384 struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) };
385
386 /* setup PLL configuration */
387 if (fe->ops.i2c_gate_ctrl)
388 fe->ops.i2c_gate_ctrl(fe, 1);
389 if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
390 return -EIO;
391 msleep(1);
392
393 return 0;
394}
395
396/* ------------------------------------------------------------------ */
397
398static struct tda1004x_config philips_tu1216_60_config = {
399 .demod_address = 0x8,
400 .invert = 1,
401 .invert_oclk = 0,
402 .xtal_freq = TDA10046_XTAL_4M,
403 .agc_config = TDA10046_AGC_DEFAULT,
404 .if_freq = TDA10046_FREQ_3617,
405 .tuner_address = 0x60,
406 .request_firmware = philips_tda1004x_request_firmware
407};
408
409static struct tda1004x_config philips_tu1216_61_config = {
410
411 .demod_address = 0x8,
412 .invert = 1,
413 .invert_oclk = 0,
414 .xtal_freq = TDA10046_XTAL_4M,
415 .agc_config = TDA10046_AGC_DEFAULT,
416 .if_freq = TDA10046_FREQ_3617,
417 .tuner_address = 0x61,
418 .request_firmware = philips_tda1004x_request_firmware
419};
420
421/* ------------------------------------------------------------------ */
422
423static int philips_td1316_tuner_init(struct dvb_frontend *fe)
424{
425 struct saa7134_dev *dev = fe->dvb->priv;
426 struct tda1004x_state *state = fe->demodulator_priv;
427 u8 addr = state->config->tuner_address;
428 static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab };
429 struct i2c_msg init_msg = {.addr = addr,.flags = 0,.buf = msg,.len = sizeof(msg) };
430
431 /* setup PLL configuration */
432 if (fe->ops.i2c_gate_ctrl)
433 fe->ops.i2c_gate_ctrl(fe, 1);
434 if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
435 return -EIO;
436 return 0;
437}
438
439static int philips_td1316_tuner_set_params(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
440{
441 return philips_tda6651_pll_set(fe, params);
442}
443
444static int philips_td1316_tuner_sleep(struct dvb_frontend *fe)
445{
446 struct saa7134_dev *dev = fe->dvb->priv;
447 struct tda1004x_state *state = fe->demodulator_priv;
448 u8 addr = state->config->tuner_address;
449 static u8 msg[] = { 0x0b, 0xdc, 0x86, 0xa4 };
450 struct i2c_msg analog_msg = {.addr = addr,.flags = 0,.buf = msg,.len = sizeof(msg) };
451
452 /* switch the tuner to analog mode */
453 if (fe->ops.i2c_gate_ctrl)
454 fe->ops.i2c_gate_ctrl(fe, 1);
455 if (i2c_transfer(&dev->i2c_adap, &analog_msg, 1) != 1)
456 return -EIO;
457 return 0;
458}
459
460/* ------------------------------------------------------------------ */
461
462static int philips_europa_tuner_init(struct dvb_frontend *fe)
463{
464 struct saa7134_dev *dev = fe->dvb->priv;
465 static u8 msg[] = { 0x00, 0x40};
466 struct i2c_msg init_msg = {.addr = 0x43,.flags = 0,.buf = msg,.len = sizeof(msg) };
467
468
469 if (philips_td1316_tuner_init(fe))
470 return -EIO;
471 msleep(1);
472 if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
473 return -EIO;
474
475 return 0;
476}
477
478static int philips_europa_tuner_sleep(struct dvb_frontend *fe)
479{
480 struct saa7134_dev *dev = fe->dvb->priv;
481
482 static u8 msg[] = { 0x00, 0x14 };
483 struct i2c_msg analog_msg = {.addr = 0x43,.flags = 0,.buf = msg,.len = sizeof(msg) };
484
485 if (philips_td1316_tuner_sleep(fe))
486 return -EIO;
487
488 /* switch the board to analog mode */
489 if (fe->ops.i2c_gate_ctrl)
490 fe->ops.i2c_gate_ctrl(fe, 1);
491 i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
492 return 0;
493}
494
495static int philips_europa_demod_sleep(struct dvb_frontend *fe)
496{
497 struct saa7134_dev *dev = fe->dvb->priv;
498
499 if (dev->original_demod_sleep)
500 dev->original_demod_sleep(fe);
501 fe->ops.i2c_gate_ctrl(fe, 1);
502 return 0;
503}
504
505static struct tda1004x_config philips_europa_config = {
506
507 .demod_address = 0x8,
508 .invert = 0,
509 .invert_oclk = 0,
510 .xtal_freq = TDA10046_XTAL_4M,
511 .agc_config = TDA10046_AGC_IFO_AUTO_POS,
512 .if_freq = TDA10046_FREQ_052,
513 .tuner_address = 0x61,
514 .request_firmware = philips_tda1004x_request_firmware
515};
516
517static struct tda1004x_config medion_cardbus = {
518 .demod_address = 0x08,
519 .invert = 1,
520 .invert_oclk = 0,
521 .xtal_freq = TDA10046_XTAL_16M,
522 .agc_config = TDA10046_AGC_IFO_AUTO_NEG,
523 .if_freq = TDA10046_FREQ_3613,
524 .tuner_address = 0x61,
525 .request_firmware = philips_tda1004x_request_firmware
526};
527
528static struct tda1004x_config technotrend_budget_t3000_config = {
529 .demod_address = 0x8,
530 .invert = 1,
531 .invert_oclk = 0,
532 .xtal_freq = TDA10046_XTAL_4M,
533 .agc_config = TDA10046_AGC_DEFAULT,
534 .if_freq = TDA10046_FREQ_3617,
535 .tuner_address = 0x63,
536 .request_firmware = philips_tda1004x_request_firmware
537};
538
539/* ------------------------------------------------------------------
540 * tda 1004x based cards with philips silicon tuner
541 */
542
543static int tda8290_i2c_gate_ctrl( struct dvb_frontend* fe, int enable)
544{
545 struct tda1004x_state *state = fe->demodulator_priv;
546
547 u8 addr = state->config->i2c_gate;
548 static u8 tda8290_close[] = { 0x21, 0xc0};
549 static u8 tda8290_open[] = { 0x21, 0x80};
550 struct i2c_msg tda8290_msg = {.addr = addr,.flags = 0, .len = 2};
551 if (enable) {
552 tda8290_msg.buf = tda8290_close;
553 } else {
554 tda8290_msg.buf = tda8290_open;
555 }
556 if (i2c_transfer(state->i2c, &tda8290_msg, 1) != 1) {
557 struct saa7134_dev *dev = fe->dvb->priv;
558 wprintk("could not access tda8290 I2C gate\n");
559 return -EIO;
560 }
561 msleep(20);
562 return 0;
563}
564
565static int philips_tda827x_tuner_init(struct dvb_frontend *fe)
566{
567 struct saa7134_dev *dev = fe->dvb->priv;
568 struct tda1004x_state *state = fe->demodulator_priv;
569
570 switch (state->config->antenna_switch) {
571 case 0: break;
572 case 1: dprintk("setting GPIO21 to 0 (TV antenna?)\n");
573 saa7134_set_gpio(dev, 21, 0);
574 break;
575 case 2: dprintk("setting GPIO21 to 1 (Radio antenna?)\n");
576 saa7134_set_gpio(dev, 21, 1);
577 break;
578 }
579 return 0;
580}
581
582static int philips_tda827x_tuner_sleep(struct dvb_frontend *fe)
583{
584 struct saa7134_dev *dev = fe->dvb->priv;
585 struct tda1004x_state *state = fe->demodulator_priv;
586
587 switch (state->config->antenna_switch) {
588 case 0: break;
589 case 1: dprintk("setting GPIO21 to 1 (Radio antenna?)\n");
590 saa7134_set_gpio(dev, 21, 1);
591 break;
592 case 2: dprintk("setting GPIO21 to 0 (TV antenna?)\n");
593 saa7134_set_gpio(dev, 21, 0);
594 break;
595 }
596 return 0;
597}
598
599static int configure_tda827x_fe(struct saa7134_dev *dev,
600 struct tda1004x_config *cdec_conf,
601 struct tda827x_config *tuner_conf)
602{
603 struct videobuf_dvb_frontend *fe0;
604
605 /* Get the first frontend */
606 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
607
608 fe0->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap);
609 if (fe0->dvb.frontend) {
610 if (cdec_conf->i2c_gate)
611 fe0->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
612 if (dvb_attach(tda827x_attach, fe0->dvb.frontend,
613 cdec_conf->tuner_address,
614 &dev->i2c_adap, tuner_conf))
615 return 0;
616
617 wprintk("no tda827x tuner found at addr: %02x\n",
618 cdec_conf->tuner_address);
619 }
620 return -EINVAL;
621}
622
623/* ------------------------------------------------------------------ */
624
625static struct tda827x_config tda827x_cfg_0 = {
626 .init = philips_tda827x_tuner_init,
627 .sleep = philips_tda827x_tuner_sleep,
628 .config = 0,
629 .switch_addr = 0
630};
631
632static struct tda827x_config tda827x_cfg_1 = {
633 .init = philips_tda827x_tuner_init,
634 .sleep = philips_tda827x_tuner_sleep,
635 .config = 1,
636 .switch_addr = 0x4b
637};
638
639static struct tda827x_config tda827x_cfg_2 = {
640 .init = philips_tda827x_tuner_init,
641 .sleep = philips_tda827x_tuner_sleep,
642 .config = 2,
643 .switch_addr = 0x4b
644};
645
646static struct tda827x_config tda827x_cfg_2_sw42 = {
647 .init = philips_tda827x_tuner_init,
648 .sleep = philips_tda827x_tuner_sleep,
649 .config = 2,
650 .switch_addr = 0x42
651};
652
653/* ------------------------------------------------------------------ */
654
655static struct tda1004x_config tda827x_lifeview_config = {
656 .demod_address = 0x08,
657 .invert = 1,
658 .invert_oclk = 0,
659 .xtal_freq = TDA10046_XTAL_16M,
660 .agc_config = TDA10046_AGC_TDA827X,
661 .gpio_config = TDA10046_GP11_I,
662 .if_freq = TDA10046_FREQ_045,
663 .tuner_address = 0x60,
664 .request_firmware = philips_tda1004x_request_firmware
665};
666
667static struct tda1004x_config philips_tiger_config = {
668 .demod_address = 0x08,
669 .invert = 1,
670 .invert_oclk = 0,
671 .xtal_freq = TDA10046_XTAL_16M,
672 .agc_config = TDA10046_AGC_TDA827X,
673 .gpio_config = TDA10046_GP11_I,
674 .if_freq = TDA10046_FREQ_045,
675 .i2c_gate = 0x4b,
676 .tuner_address = 0x61,
677 .antenna_switch= 1,
678 .request_firmware = philips_tda1004x_request_firmware
679};
680
681static struct tda1004x_config cinergy_ht_config = {
682 .demod_address = 0x08,
683 .invert = 1,
684 .invert_oclk = 0,
685 .xtal_freq = TDA10046_XTAL_16M,
686 .agc_config = TDA10046_AGC_TDA827X,
687 .gpio_config = TDA10046_GP01_I,
688 .if_freq = TDA10046_FREQ_045,
689 .i2c_gate = 0x4b,
690 .tuner_address = 0x61,
691 .request_firmware = philips_tda1004x_request_firmware
692};
693
694static struct tda1004x_config cinergy_ht_pci_config = {
695 .demod_address = 0x08,
696 .invert = 1,
697 .invert_oclk = 0,
698 .xtal_freq = TDA10046_XTAL_16M,
699 .agc_config = TDA10046_AGC_TDA827X,
700 .gpio_config = TDA10046_GP01_I,
701 .if_freq = TDA10046_FREQ_045,
702 .i2c_gate = 0x4b,
703 .tuner_address = 0x60,
704 .request_firmware = philips_tda1004x_request_firmware
705};
706
707static struct tda1004x_config philips_tiger_s_config = {
708 .demod_address = 0x08,
709 .invert = 1,
710 .invert_oclk = 0,
711 .xtal_freq = TDA10046_XTAL_16M,
712 .agc_config = TDA10046_AGC_TDA827X,
713 .gpio_config = TDA10046_GP01_I,
714 .if_freq = TDA10046_FREQ_045,
715 .i2c_gate = 0x4b,
716 .tuner_address = 0x61,
717 .antenna_switch= 1,
718 .request_firmware = philips_tda1004x_request_firmware
719};
720
721static struct tda1004x_config pinnacle_pctv_310i_config = {
722 .demod_address = 0x08,
723 .invert = 1,
724 .invert_oclk = 0,
725 .xtal_freq = TDA10046_XTAL_16M,
726 .agc_config = TDA10046_AGC_TDA827X,
727 .gpio_config = TDA10046_GP11_I,
728 .if_freq = TDA10046_FREQ_045,
729 .i2c_gate = 0x4b,
730 .tuner_address = 0x61,
731 .request_firmware = philips_tda1004x_request_firmware
732};
733
734static struct tda1004x_config hauppauge_hvr_1110_config = {
735 .demod_address = 0x08,
736 .invert = 1,
737 .invert_oclk = 0,
738 .xtal_freq = TDA10046_XTAL_16M,
739 .agc_config = TDA10046_AGC_TDA827X,
740 .gpio_config = TDA10046_GP11_I,
741 .if_freq = TDA10046_FREQ_045,
742 .i2c_gate = 0x4b,
743 .tuner_address = 0x61,
744 .request_firmware = philips_tda1004x_request_firmware
745};
746
747static struct tda1004x_config asus_p7131_dual_config = {
748 .demod_address = 0x08,
749 .invert = 1,
750 .invert_oclk = 0,
751 .xtal_freq = TDA10046_XTAL_16M,
752 .agc_config = TDA10046_AGC_TDA827X,
753 .gpio_config = TDA10046_GP11_I,
754 .if_freq = TDA10046_FREQ_045,
755 .i2c_gate = 0x4b,
756 .tuner_address = 0x61,
757 .antenna_switch= 2,
758 .request_firmware = philips_tda1004x_request_firmware
759};
760
761static struct tda1004x_config lifeview_trio_config = {
762 .demod_address = 0x09,
763 .invert = 1,
764 .invert_oclk = 0,
765 .xtal_freq = TDA10046_XTAL_16M,
766 .agc_config = TDA10046_AGC_TDA827X,
767 .gpio_config = TDA10046_GP00_I,
768 .if_freq = TDA10046_FREQ_045,
769 .tuner_address = 0x60,
770 .request_firmware = philips_tda1004x_request_firmware
771};
772
773static struct tda1004x_config tevion_dvbt220rf_config = {
774 .demod_address = 0x08,
775 .invert = 1,
776 .invert_oclk = 0,
777 .xtal_freq = TDA10046_XTAL_16M,
778 .agc_config = TDA10046_AGC_TDA827X,
779 .gpio_config = TDA10046_GP11_I,
780 .if_freq = TDA10046_FREQ_045,
781 .tuner_address = 0x60,
782 .request_firmware = philips_tda1004x_request_firmware
783};
784
785static struct tda1004x_config md8800_dvbt_config = {
786 .demod_address = 0x08,
787 .invert = 1,
788 .invert_oclk = 0,
789 .xtal_freq = TDA10046_XTAL_16M,
790 .agc_config = TDA10046_AGC_TDA827X,
791 .gpio_config = TDA10046_GP01_I,
792 .if_freq = TDA10046_FREQ_045,
793 .i2c_gate = 0x4b,
794 .tuner_address = 0x60,
795 .request_firmware = philips_tda1004x_request_firmware
796};
797
798static struct tda1004x_config asus_p7131_4871_config = {
799 .demod_address = 0x08,
800 .invert = 1,
801 .invert_oclk = 0,
802 .xtal_freq = TDA10046_XTAL_16M,
803 .agc_config = TDA10046_AGC_TDA827X,
804 .gpio_config = TDA10046_GP01_I,
805 .if_freq = TDA10046_FREQ_045,
806 .i2c_gate = 0x4b,
807 .tuner_address = 0x61,
808 .antenna_switch= 2,
809 .request_firmware = philips_tda1004x_request_firmware
810};
811
812static struct tda1004x_config asus_p7131_hybrid_lna_config = {
813 .demod_address = 0x08,
814 .invert = 1,
815 .invert_oclk = 0,
816 .xtal_freq = TDA10046_XTAL_16M,
817 .agc_config = TDA10046_AGC_TDA827X,
818 .gpio_config = TDA10046_GP11_I,
819 .if_freq = TDA10046_FREQ_045,
820 .i2c_gate = 0x4b,
821 .tuner_address = 0x61,
822 .antenna_switch= 2,
823 .request_firmware = philips_tda1004x_request_firmware
824};
825
826static struct tda1004x_config kworld_dvb_t_210_config = {
827 .demod_address = 0x08,
828 .invert = 1,
829 .invert_oclk = 0,
830 .xtal_freq = TDA10046_XTAL_16M,
831 .agc_config = TDA10046_AGC_TDA827X,
832 .gpio_config = TDA10046_GP11_I,
833 .if_freq = TDA10046_FREQ_045,
834 .i2c_gate = 0x4b,
835 .tuner_address = 0x61,
836 .antenna_switch= 1,
837 .request_firmware = philips_tda1004x_request_firmware
838};
839
840static struct tda1004x_config avermedia_super_007_config = {
841 .demod_address = 0x08,
842 .invert = 1,
843 .invert_oclk = 0,
844 .xtal_freq = TDA10046_XTAL_16M,
845 .agc_config = TDA10046_AGC_TDA827X,
846 .gpio_config = TDA10046_GP01_I,
847 .if_freq = TDA10046_FREQ_045,
848 .i2c_gate = 0x4b,
849 .tuner_address = 0x60,
850 .antenna_switch= 1,
851 .request_firmware = philips_tda1004x_request_firmware
852};
853
854static struct tda1004x_config twinhan_dtv_dvb_3056_config = {
855 .demod_address = 0x08,
856 .invert = 1,
857 .invert_oclk = 0,
858 .xtal_freq = TDA10046_XTAL_16M,
859 .agc_config = TDA10046_AGC_TDA827X,
860 .gpio_config = TDA10046_GP01_I,
861 .if_freq = TDA10046_FREQ_045,
862 .i2c_gate = 0x42,
863 .tuner_address = 0x61,
864 .antenna_switch = 1,
865 .request_firmware = philips_tda1004x_request_firmware
866};
867
868static struct tda1004x_config asus_tiger_3in1_config = {
869 .demod_address = 0x0b,
870 .invert = 1,
871 .invert_oclk = 0,
872 .xtal_freq = TDA10046_XTAL_16M,
873 .agc_config = TDA10046_AGC_TDA827X,
874 .gpio_config = TDA10046_GP11_I,
875 .if_freq = TDA10046_FREQ_045,
876 .i2c_gate = 0x4b,
877 .tuner_address = 0x61,
878 .antenna_switch = 1,
879 .request_firmware = philips_tda1004x_request_firmware
880};
881
882/* ------------------------------------------------------------------
883 * special case: this card uses saa713x GPIO22 for the mode switch
884 */
885
886static int ads_duo_tuner_init(struct dvb_frontend *fe)
887{
888 struct saa7134_dev *dev = fe->dvb->priv;
889 philips_tda827x_tuner_init(fe);
890 /* route TDA8275a AGC input to the channel decoder */
891 saa7134_set_gpio(dev, 22, 1);
892 return 0;
893}
894
895static int ads_duo_tuner_sleep(struct dvb_frontend *fe)
896{
897 struct saa7134_dev *dev = fe->dvb->priv;
898 /* route TDA8275a AGC input to the analog IF chip*/
899 saa7134_set_gpio(dev, 22, 0);
900 philips_tda827x_tuner_sleep(fe);
901 return 0;
902}
903
904static struct tda827x_config ads_duo_cfg = {
905 .init = ads_duo_tuner_init,
906 .sleep = ads_duo_tuner_sleep,
907 .config = 0
908};
909
910static struct tda1004x_config ads_tech_duo_config = {
911 .demod_address = 0x08,
912 .invert = 1,
913 .invert_oclk = 0,
914 .xtal_freq = TDA10046_XTAL_16M,
915 .agc_config = TDA10046_AGC_TDA827X,
916 .gpio_config = TDA10046_GP00_I,
917 .if_freq = TDA10046_FREQ_045,
918 .tuner_address = 0x61,
919 .request_firmware = philips_tda1004x_request_firmware
920};
921
922static struct zl10353_config behold_h6_config = {
923 .demod_address = 0x1e>>1,
924 .no_tuner = 1,
925 .parallel_ts = 1,
926 .disable_i2c_gate_ctrl = 1,
927};
928
929static struct xc5000_config behold_x7_tunerconfig = {
930 .i2c_address = 0xc2>>1,
931 .if_khz = 4560,
932 .radio_input = XC5000_RADIO_FM1,
933};
934
935static struct zl10353_config behold_x7_config = {
936 .demod_address = 0x1e>>1,
937 .if2 = 45600,
938 .no_tuner = 1,
939 .parallel_ts = 1,
940 .disable_i2c_gate_ctrl = 1,
941};
942
943static struct zl10353_config videomate_t750_zl10353_config = {
944 .demod_address = 0x0f,
945 .no_tuner = 1,
946 .parallel_ts = 1,
947 .disable_i2c_gate_ctrl = 1,
948};
949
950static struct qt1010_config videomate_t750_qt1010_config = {
951 .i2c_address = 0x62
952};
953
954
955/* ==================================================================
956 * tda10086 based DVB-S cards, helper functions
957 */
958
959static struct tda10086_config flydvbs = {
960 .demod_address = 0x0e,
961 .invert = 0,
962 .diseqc_tone = 0,
963 .xtal_freq = TDA10086_XTAL_16M,
964};
965
966static struct tda10086_config sd1878_4m = {
967 .demod_address = 0x0e,
968 .invert = 0,
969 .diseqc_tone = 0,
970 .xtal_freq = TDA10086_XTAL_4M,
971};
972
973/* ------------------------------------------------------------------
974 * special case: lnb supply is connected to the gated i2c
975 */
976
977static int md8800_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
978{
979 int res = -EIO;
980 struct saa7134_dev *dev = fe->dvb->priv;
981 if (fe->ops.i2c_gate_ctrl) {
982 fe->ops.i2c_gate_ctrl(fe, 1);
983 if (dev->original_set_voltage)
984 res = dev->original_set_voltage(fe, voltage);
985 fe->ops.i2c_gate_ctrl(fe, 0);
986 }
987 return res;
988};
989
990static int md8800_set_high_voltage(struct dvb_frontend *fe, long arg)
991{
992 int res = -EIO;
993 struct saa7134_dev *dev = fe->dvb->priv;
994 if (fe->ops.i2c_gate_ctrl) {
995 fe->ops.i2c_gate_ctrl(fe, 1);
996 if (dev->original_set_high_voltage)
997 res = dev->original_set_high_voltage(fe, arg);
998 fe->ops.i2c_gate_ctrl(fe, 0);
999 }
1000 return res;
1001};
1002
1003static int md8800_set_voltage2(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
1004{
1005 struct saa7134_dev *dev = fe->dvb->priv;
1006 u8 wbuf[2] = { 0x1f, 00 };
1007 u8 rbuf;
1008 struct i2c_msg msg[] = { { .addr = 0x08, .flags = 0, .buf = wbuf, .len = 1 },
1009 { .addr = 0x08, .flags = I2C_M_RD, .buf = &rbuf, .len = 1 } };
1010
1011 if (i2c_transfer(&dev->i2c_adap, msg, 2) != 2)
1012 return -EIO;
1013 /* NOTE: this assumes that gpo1 is used, it might be bit 5 (gpo2) */
1014 if (voltage == SEC_VOLTAGE_18)
1015 wbuf[1] = rbuf | 0x10;
1016 else
1017 wbuf[1] = rbuf & 0xef;
1018 msg[0].len = 2;
1019 i2c_transfer(&dev->i2c_adap, msg, 1);
1020 return 0;
1021}
1022
1023static int md8800_set_high_voltage2(struct dvb_frontend *fe, long arg)
1024{
1025 struct saa7134_dev *dev = fe->dvb->priv;
1026 wprintk("%s: sorry can't set high LNB supply voltage from here\n", __func__);
1027 return -EIO;
1028}
1029
1030/* ==================================================================
1031 * nxt200x based ATSC cards, helper functions
1032 */
1033
1034static struct nxt200x_config avertvhda180 = {
1035 .demod_address = 0x0a,
1036};
1037
1038static struct nxt200x_config kworldatsc110 = {
1039 .demod_address = 0x0a,
1040};
1041
1042/* ------------------------------------------------------------------ */
1043
1044static struct mt312_config avertv_a700_mt312 = {
1045 .demod_address = 0x0e,
1046 .voltage_inverted = 1,
1047};
1048
1049static struct zl10036_config avertv_a700_tuner = {
1050 .tuner_address = 0x60,
1051};
1052
1053static struct mt312_config zl10313_compro_s350_config = {
1054 .demod_address = 0x0e,
1055};
1056
1057static struct lgdt3305_config hcw_lgdt3305_config = {
1058 .i2c_addr = 0x0e,
1059 .mpeg_mode = LGDT3305_MPEG_SERIAL,
1060 .tpclk_edge = LGDT3305_TPCLK_RISING_EDGE,
1061 .tpvalid_polarity = LGDT3305_TP_VALID_HIGH,
1062 .deny_i2c_rptr = 1,
1063 .spectral_inversion = 1,
1064 .qam_if_khz = 4000,
1065 .vsb_if_khz = 3250,
1066};
1067
1068static struct tda10048_config hcw_tda10048_config = {
1069 .demod_address = 0x10 >> 1,
1070 .output_mode = TDA10048_SERIAL_OUTPUT,
1071 .fwbulkwritelen = TDA10048_BULKWRITE_200,
1072 .inversion = TDA10048_INVERSION_ON,
1073 .dtv6_if_freq_khz = TDA10048_IF_3300,
1074 .dtv7_if_freq_khz = TDA10048_IF_3500,
1075 .dtv8_if_freq_khz = TDA10048_IF_4000,
1076 .clk_freq_khz = TDA10048_CLK_16000,
1077 .disable_gate_access = 1,
1078};
1079
1080static struct tda18271_std_map hauppauge_tda18271_std_map = {
1081 .atsc_6 = { .if_freq = 3250, .agc_mode = 3, .std = 4,
1082 .if_lvl = 1, .rfagc_top = 0x58, },
1083 .qam_6 = { .if_freq = 4000, .agc_mode = 3, .std = 5,
1084 .if_lvl = 1, .rfagc_top = 0x58, },
1085};
1086
1087static struct tda18271_config hcw_tda18271_config = {
1088 .std_map = &hauppauge_tda18271_std_map,
1089 .gate = TDA18271_GATE_ANALOG,
1090 .config = 3,
1091 .output_opt = TDA18271_OUTPUT_LT_OFF,
1092};
1093
1094static struct tda829x_config tda829x_no_probe = {
1095 .probe_tuner = TDA829X_DONT_PROBE,
1096};
1097
1098static struct tda10048_config zolid_tda10048_config = {
1099 .demod_address = 0x10 >> 1,
1100 .output_mode = TDA10048_PARALLEL_OUTPUT,
1101 .fwbulkwritelen = TDA10048_BULKWRITE_200,
1102 .inversion = TDA10048_INVERSION_ON,
1103 .dtv6_if_freq_khz = TDA10048_IF_3300,
1104 .dtv7_if_freq_khz = TDA10048_IF_3500,
1105 .dtv8_if_freq_khz = TDA10048_IF_4000,
1106 .clk_freq_khz = TDA10048_CLK_16000,
1107 .disable_gate_access = 1,
1108};
1109
1110static struct tda18271_config zolid_tda18271_config = {
1111 .gate = TDA18271_GATE_ANALOG,
1112};
1113
1114static struct tda10048_config dtv1000s_tda10048_config = {
1115 .demod_address = 0x10 >> 1,
1116 .output_mode = TDA10048_PARALLEL_OUTPUT,
1117 .fwbulkwritelen = TDA10048_BULKWRITE_200,
1118 .inversion = TDA10048_INVERSION_ON,
1119 .dtv6_if_freq_khz = TDA10048_IF_3300,
1120 .dtv7_if_freq_khz = TDA10048_IF_3800,
1121 .dtv8_if_freq_khz = TDA10048_IF_4300,
1122 .clk_freq_khz = TDA10048_CLK_16000,
1123 .disable_gate_access = 1,
1124};
1125
1126static struct tda18271_std_map dtv1000s_tda18271_std_map = {
1127 .dvbt_6 = { .if_freq = 3300, .agc_mode = 3, .std = 4,
1128 .if_lvl = 1, .rfagc_top = 0x37, },
1129 .dvbt_7 = { .if_freq = 3800, .agc_mode = 3, .std = 5,
1130 .if_lvl = 1, .rfagc_top = 0x37, },
1131 .dvbt_8 = { .if_freq = 4300, .agc_mode = 3, .std = 6,
1132 .if_lvl = 1, .rfagc_top = 0x37, },
1133};
1134
1135static struct tda18271_config dtv1000s_tda18271_config = {
1136 .std_map = &dtv1000s_tda18271_std_map,
1137 .gate = TDA18271_GATE_ANALOG,
1138};
1139
1140static struct lgs8gxx_config prohdtv_pro2_lgs8g75_config = {
1141 .prod = LGS8GXX_PROD_LGS8G75,
1142 .demod_address = 0x1d,
1143 .serial_ts = 0,
1144 .ts_clk_pol = 1,
1145 .ts_clk_gated = 0,
1146 .if_clk_freq = 30400, /* 30.4 MHz */
1147 .if_freq = 4000, /* 4.00 MHz */
1148 .if_neg_center = 0,
1149 .ext_adc = 0,
1150 .adc_signed = 1,
1151 .adc_vpp = 3, /* 2.0 Vpp */
1152 .if_neg_edge = 1,
1153};
1154
1155static struct tda18271_config prohdtv_pro2_tda18271_config = {
1156 .gate = TDA18271_GATE_ANALOG,
1157 .output_opt = TDA18271_OUTPUT_LT_OFF,
1158};
1159
1160/* ==================================================================
1161 * Core code
1162 */
1163
1164static int dvb_init(struct saa7134_dev *dev)
1165{
1166 int ret;
1167 int attach_xc3028 = 0;
1168 struct videobuf_dvb_frontend *fe0;
1169
1170 /* FIXME: add support for multi-frontend */
1171 mutex_init(&dev->frontends.lock);
1172 INIT_LIST_HEAD(&dev->frontends.felist);
1173
1174 printk(KERN_INFO "%s() allocating 1 frontend\n", __func__);
1175 fe0 = videobuf_dvb_alloc_frontend(&dev->frontends, 1);
1176 if (!fe0) {
1177 printk(KERN_ERR "%s() failed to alloc\n", __func__);
1178 return -ENOMEM;
1179 }
1180
1181 /* init struct videobuf_dvb */
1182 dev->ts.nr_bufs = 32;
1183 dev->ts.nr_packets = 32*4;
1184 fe0->dvb.name = dev->name;
1185 videobuf_queue_sg_init(&fe0->dvb.dvbq, &saa7134_ts_qops,
1186 &dev->pci->dev, &dev->slock,
1187 V4L2_BUF_TYPE_VIDEO_CAPTURE,
1188 V4L2_FIELD_ALTERNATE,
1189 sizeof(struct saa7134_buf),
1190 dev, NULL);
1191
1192 switch (dev->board) {
1193 case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
1194 dprintk("pinnacle 300i dvb setup\n");
1195 fe0->dvb.frontend = dvb_attach(mt352_attach, &pinnacle_300i,
1196 &dev->i2c_adap);
1197 if (fe0->dvb.frontend) {
1198 fe0->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params;
1199 }
1200 break;
1201 case SAA7134_BOARD_AVERMEDIA_777:
1202 case SAA7134_BOARD_AVERMEDIA_A16AR:
1203 dprintk("avertv 777 dvb setup\n");
1204 fe0->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777,
1205 &dev->i2c_adap);
1206 if (fe0->dvb.frontend) {
1207 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1208 &dev->i2c_adap, 0x61,
1209 TUNER_PHILIPS_TD1316);
1210 }
1211 break;
1212 case SAA7134_BOARD_AVERMEDIA_A16D:
1213 dprintk("AverMedia A16D dvb setup\n");
1214 fe0->dvb.frontend = dvb_attach(mt352_attach,
1215 &avermedia_xc3028_mt352_dev,
1216 &dev->i2c_adap);
1217 attach_xc3028 = 1;
1218 break;
1219 case SAA7134_BOARD_MD7134:
1220 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1221 &medion_cardbus,
1222 &dev->i2c_adap);
1223 if (fe0->dvb.frontend) {
1224 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1225 &dev->i2c_adap, medion_cardbus.tuner_address,
1226 TUNER_PHILIPS_FMD1216ME_MK3);
1227 }
1228 break;
1229 case SAA7134_BOARD_PHILIPS_TOUGH:
1230 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1231 &philips_tu1216_60_config,
1232 &dev->i2c_adap);
1233 if (fe0->dvb.frontend) {
1234 fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
1235 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
1236 }
1237 break;
1238 case SAA7134_BOARD_FLYDVBTDUO:
1239 case SAA7134_BOARD_FLYDVBT_DUO_CARDBUS:
1240 if (configure_tda827x_fe(dev, &tda827x_lifeview_config,
1241 &tda827x_cfg_0) < 0)
1242 goto dettach_frontend;
1243 break;
1244 case SAA7134_BOARD_PHILIPS_EUROPA:
1245 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
1246 case SAA7134_BOARD_ASUS_EUROPA_HYBRID:
1247 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1248 &philips_europa_config,
1249 &dev->i2c_adap);
1250 if (fe0->dvb.frontend) {
1251 dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1252 fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1253 fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
1254 fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
1255 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1256 }
1257 break;
1258 case SAA7134_BOARD_TECHNOTREND_BUDGET_T3000:
1259 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1260 &technotrend_budget_t3000_config,
1261 &dev->i2c_adap);
1262 if (fe0->dvb.frontend) {
1263 dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1264 fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1265 fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
1266 fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
1267 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1268 }
1269 break;
1270 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
1271 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1272 &philips_tu1216_61_config,
1273 &dev->i2c_adap);
1274 if (fe0->dvb.frontend) {
1275 fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
1276 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
1277 }
1278 break;
1279 case SAA7134_BOARD_KWORLD_DVBT_210:
1280 if (configure_tda827x_fe(dev, &kworld_dvb_t_210_config,
1281 &tda827x_cfg_2) < 0)
1282 goto dettach_frontend;
1283 break;
1284 case SAA7134_BOARD_HAUPPAUGE_HVR1120:
1285 fe0->dvb.frontend = dvb_attach(tda10048_attach,
1286 &hcw_tda10048_config,
1287 &dev->i2c_adap);
1288 if (fe0->dvb.frontend != NULL) {
1289 dvb_attach(tda829x_attach, fe0->dvb.frontend,
1290 &dev->i2c_adap, 0x4b,
1291 &tda829x_no_probe);
1292 dvb_attach(tda18271_attach, fe0->dvb.frontend,
1293 0x60, &dev->i2c_adap,
1294 &hcw_tda18271_config);
1295 }
1296 break;
1297 case SAA7134_BOARD_PHILIPS_TIGER:
1298 if (configure_tda827x_fe(dev, &philips_tiger_config,
1299 &tda827x_cfg_0) < 0)
1300 goto dettach_frontend;
1301 break;
1302 case SAA7134_BOARD_PINNACLE_PCTV_310i:
1303 if (configure_tda827x_fe(dev, &pinnacle_pctv_310i_config,
1304 &tda827x_cfg_1) < 0)
1305 goto dettach_frontend;
1306 break;
1307 case SAA7134_BOARD_HAUPPAUGE_HVR1110:
1308 if (configure_tda827x_fe(dev, &hauppauge_hvr_1110_config,
1309 &tda827x_cfg_1) < 0)
1310 goto dettach_frontend;
1311 break;
1312 case SAA7134_BOARD_HAUPPAUGE_HVR1150:
1313 fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
1314 &hcw_lgdt3305_config,
1315 &dev->i2c_adap);
1316 if (fe0->dvb.frontend) {
1317 dvb_attach(tda829x_attach, fe0->dvb.frontend,
1318 &dev->i2c_adap, 0x4b,
1319 &tda829x_no_probe);
1320 dvb_attach(tda18271_attach, fe0->dvb.frontend,
1321 0x60, &dev->i2c_adap,
1322 &hcw_tda18271_config);
1323 }
1324 break;
1325 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
1326 if (configure_tda827x_fe(dev, &asus_p7131_dual_config,
1327 &tda827x_cfg_0) < 0)
1328 goto dettach_frontend;
1329 break;
1330 case SAA7134_BOARD_FLYDVBT_LR301:
1331 if (configure_tda827x_fe(dev, &tda827x_lifeview_config,
1332 &tda827x_cfg_0) < 0)
1333 goto dettach_frontend;
1334 break;
1335 case SAA7134_BOARD_FLYDVB_TRIO:
1336 if (!use_frontend) { /* terrestrial */
1337 if (configure_tda827x_fe(dev, &lifeview_trio_config,
1338 &tda827x_cfg_0) < 0)
1339 goto dettach_frontend;
1340 } else { /* satellite */
1341 fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap);
1342 if (fe0->dvb.frontend) {
1343 if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x63,
1344 &dev->i2c_adap, 0) == NULL) {
1345 wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__);
1346 goto dettach_frontend;
1347 }
1348 if (dvb_attach(isl6421_attach, fe0->dvb.frontend, &dev->i2c_adap,
1349 0x08, 0, 0) == NULL) {
1350 wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__);
1351 goto dettach_frontend;
1352 }
1353 }
1354 }
1355 break;
1356 case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
1357 case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
1358 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1359 &ads_tech_duo_config,
1360 &dev->i2c_adap);
1361 if (fe0->dvb.frontend) {
1362 if (dvb_attach(tda827x_attach,fe0->dvb.frontend,
1363 ads_tech_duo_config.tuner_address, &dev->i2c_adap,
1364 &ads_duo_cfg) == NULL) {
1365 wprintk("no tda827x tuner found at addr: %02x\n",
1366 ads_tech_duo_config.tuner_address);
1367 goto dettach_frontend;
1368 }
1369 } else
1370 wprintk("failed to attach tda10046\n");
1371 break;
1372 case SAA7134_BOARD_TEVION_DVBT_220RF:
1373 if (configure_tda827x_fe(dev, &tevion_dvbt220rf_config,
1374 &tda827x_cfg_0) < 0)
1375 goto dettach_frontend;
1376 break;
1377 case SAA7134_BOARD_MEDION_MD8800_QUADRO:
1378 if (!use_frontend) { /* terrestrial */
1379 if (configure_tda827x_fe(dev, &md8800_dvbt_config,
1380 &tda827x_cfg_0) < 0)
1381 goto dettach_frontend;
1382 } else { /* satellite */
1383 fe0->dvb.frontend = dvb_attach(tda10086_attach,
1384 &flydvbs, &dev->i2c_adap);
1385 if (fe0->dvb.frontend) {
1386 struct dvb_frontend *fe = fe0->dvb.frontend;
1387 u8 dev_id = dev->eedata[2];
1388 u8 data = 0xc4;
1389 struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1};
1390
1391 if (dvb_attach(tda826x_attach, fe0->dvb.frontend,
1392 0x60, &dev->i2c_adap, 0) == NULL) {
1393 wprintk("%s: Medion Quadro, no tda826x "
1394 "found !\n", __func__);
1395 goto dettach_frontend;
1396 }
1397 if (dev_id != 0x08) {
1398 /* we need to open the i2c gate (we know it exists) */
1399 fe->ops.i2c_gate_ctrl(fe, 1);
1400 if (dvb_attach(isl6405_attach, fe,
1401 &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1402 wprintk("%s: Medion Quadro, no ISL6405 "
1403 "found !\n", __func__);
1404 goto dettach_frontend;
1405 }
1406 if (dev_id == 0x07) {
1407 /* fire up the 2nd section of the LNB supply since
1408 we can't do this from the other section */
1409 msg.buf = &data;
1410 i2c_transfer(&dev->i2c_adap, &msg, 1);
1411 }
1412 fe->ops.i2c_gate_ctrl(fe, 0);
1413 dev->original_set_voltage = fe->ops.set_voltage;
1414 fe->ops.set_voltage = md8800_set_voltage;
1415 dev->original_set_high_voltage = fe->ops.enable_high_lnb_voltage;
1416 fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
1417 } else {
1418 fe->ops.set_voltage = md8800_set_voltage2;
1419 fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage2;
1420 }
1421 }
1422 }
1423 break;
1424 case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
1425 fe0->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180,
1426 &dev->i2c_adap);
1427 if (fe0->dvb.frontend)
1428 dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x61,
1429 NULL, DVB_PLL_TDHU2);
1430 break;
1431 case SAA7134_BOARD_ADS_INSTANT_HDTV_PCI:
1432 case SAA7134_BOARD_KWORLD_ATSC110:
1433 fe0->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110,
1434 &dev->i2c_adap);
1435 if (fe0->dvb.frontend)
1436 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1437 &dev->i2c_adap, 0x61,
1438 TUNER_PHILIPS_TUV1236D);
1439 break;
1440 case SAA7134_BOARD_FLYDVBS_LR300:
1441 fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
1442 &dev->i2c_adap);
1443 if (fe0->dvb.frontend) {
1444 if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
1445 &dev->i2c_adap, 0) == NULL) {
1446 wprintk("%s: No tda826x found!\n", __func__);
1447 goto dettach_frontend;
1448 }
1449 if (dvb_attach(isl6421_attach, fe0->dvb.frontend,
1450 &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1451 wprintk("%s: No ISL6421 found!\n", __func__);
1452 goto dettach_frontend;
1453 }
1454 }
1455 break;
1456 case SAA7134_BOARD_ASUS_EUROPA2_HYBRID:
1457 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1458 &medion_cardbus,
1459 &dev->i2c_adap);
1460 if (fe0->dvb.frontend) {
1461 dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1462 fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1463
1464 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1465 &dev->i2c_adap, medion_cardbus.tuner_address,
1466 TUNER_PHILIPS_FMD1216ME_MK3);
1467 }
1468 break;
1469 case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
1470 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1471 &philips_europa_config,
1472 &dev->i2c_adap);
1473 if (fe0->dvb.frontend) {
1474 fe0->dvb.frontend->ops.tuner_ops.init = philips_td1316_tuner_init;
1475 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1476 }
1477 break;
1478 case SAA7134_BOARD_CINERGY_HT_PCMCIA:
1479 if (configure_tda827x_fe(dev, &cinergy_ht_config,
1480 &tda827x_cfg_0) < 0)
1481 goto dettach_frontend;
1482 break;
1483 case SAA7134_BOARD_CINERGY_HT_PCI:
1484 if (configure_tda827x_fe(dev, &cinergy_ht_pci_config,
1485 &tda827x_cfg_0) < 0)
1486 goto dettach_frontend;
1487 break;
1488 case SAA7134_BOARD_PHILIPS_TIGER_S:
1489 if (configure_tda827x_fe(dev, &philips_tiger_s_config,
1490 &tda827x_cfg_2) < 0)
1491 goto dettach_frontend;
1492 break;
1493 case SAA7134_BOARD_ASUS_P7131_4871:
1494 if (configure_tda827x_fe(dev, &asus_p7131_4871_config,
1495 &tda827x_cfg_2) < 0)
1496 goto dettach_frontend;
1497 break;
1498 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
1499 if (configure_tda827x_fe(dev, &asus_p7131_hybrid_lna_config,
1500 &tda827x_cfg_2) < 0)
1501 goto dettach_frontend;
1502 break;
1503 case SAA7134_BOARD_AVERMEDIA_SUPER_007:
1504 if (configure_tda827x_fe(dev, &avermedia_super_007_config,
1505 &tda827x_cfg_0) < 0)
1506 goto dettach_frontend;
1507 break;
1508 case SAA7134_BOARD_TWINHAN_DTV_DVB_3056:
1509 if (configure_tda827x_fe(dev, &twinhan_dtv_dvb_3056_config,
1510 &tda827x_cfg_2_sw42) < 0)
1511 goto dettach_frontend;
1512 break;
1513 case SAA7134_BOARD_PHILIPS_SNAKE:
1514 fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
1515 &dev->i2c_adap);
1516 if (fe0->dvb.frontend) {
1517 if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
1518 &dev->i2c_adap, 0) == NULL) {
1519 wprintk("%s: No tda826x found!\n", __func__);
1520 goto dettach_frontend;
1521 }
1522 if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1523 &dev->i2c_adap, 0, 0) == NULL) {
1524 wprintk("%s: No lnbp21 found!\n", __func__);
1525 goto dettach_frontend;
1526 }
1527 }
1528 break;
1529 case SAA7134_BOARD_CREATIX_CTX953:
1530 if (configure_tda827x_fe(dev, &md8800_dvbt_config,
1531 &tda827x_cfg_0) < 0)
1532 goto dettach_frontend;
1533 break;
1534 case SAA7134_BOARD_MSI_TVANYWHERE_AD11:
1535 if (configure_tda827x_fe(dev, &philips_tiger_s_config,
1536 &tda827x_cfg_2) < 0)
1537 goto dettach_frontend;
1538 break;
1539 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
1540 dprintk("AverMedia E506R dvb setup\n");
1541 saa7134_set_gpio(dev, 25, 0);
1542 msleep(10);
1543 saa7134_set_gpio(dev, 25, 1);
1544 fe0->dvb.frontend = dvb_attach(mt352_attach,
1545 &avermedia_xc3028_mt352_dev,
1546 &dev->i2c_adap);
1547 attach_xc3028 = 1;
1548 break;
1549 case SAA7134_BOARD_MD7134_BRIDGE_2:
1550 fe0->dvb.frontend = dvb_attach(tda10086_attach,
1551 &sd1878_4m, &dev->i2c_adap);
1552 if (fe0->dvb.frontend) {
1553 struct dvb_frontend *fe;
1554 if (dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
1555 &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) {
1556 wprintk("%s: MD7134 DVB-S, no SD1878 "
1557 "found !\n", __func__);
1558 goto dettach_frontend;
1559 }
1560 /* we need to open the i2c gate (we know it exists) */
1561 fe = fe0->dvb.frontend;
1562 fe->ops.i2c_gate_ctrl(fe, 1);
1563 if (dvb_attach(isl6405_attach, fe,
1564 &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1565 wprintk("%s: MD7134 DVB-S, no ISL6405 "
1566 "found !\n", __func__);
1567 goto dettach_frontend;
1568 }
1569 fe->ops.i2c_gate_ctrl(fe, 0);
1570 dev->original_set_voltage = fe->ops.set_voltage;
1571 fe->ops.set_voltage = md8800_set_voltage;
1572 dev->original_set_high_voltage = fe->ops.enable_high_lnb_voltage;
1573 fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
1574 }
1575 break;
1576 case SAA7134_BOARD_AVERMEDIA_M103:
1577 saa7134_set_gpio(dev, 25, 0);
1578 msleep(10);
1579 saa7134_set_gpio(dev, 25, 1);
1580 fe0->dvb.frontend = dvb_attach(mt352_attach,
1581 &avermedia_xc3028_mt352_dev,
1582 &dev->i2c_adap);
1583 attach_xc3028 = 1;
1584 break;
1585 case SAA7134_BOARD_ASUSTeK_TIGER_3IN1:
1586 if (!use_frontend) { /* terrestrial */
1587 if (configure_tda827x_fe(dev, &asus_tiger_3in1_config,
1588 &tda827x_cfg_2) < 0)
1589 goto dettach_frontend;
1590 } else { /* satellite */
1591 fe0->dvb.frontend = dvb_attach(tda10086_attach,
1592 &flydvbs, &dev->i2c_adap);
1593 if (fe0->dvb.frontend) {
1594 if (dvb_attach(tda826x_attach,
1595 fe0->dvb.frontend, 0x60,
1596 &dev->i2c_adap, 0) == NULL) {
1597 wprintk("%s: Asus Tiger 3in1, no "
1598 "tda826x found!\n", __func__);
1599 goto dettach_frontend;
1600 }
1601 if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1602 &dev->i2c_adap, 0, 0) == NULL) {
1603 wprintk("%s: Asus Tiger 3in1, no lnbp21"
1604 " found!\n", __func__);
1605 goto dettach_frontend;
1606 }
1607 }
1608 }
1609 break;
1610 case SAA7134_BOARD_ASUSTeK_TIGER:
1611 if (configure_tda827x_fe(dev, &philips_tiger_config,
1612 &tda827x_cfg_0) < 0)
1613 goto dettach_frontend;
1614 break;
1615 case SAA7134_BOARD_BEHOLD_H6:
1616 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1617 &behold_h6_config,
1618 &dev->i2c_adap);
1619 if (fe0->dvb.frontend) {
1620 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1621 &dev->i2c_adap, 0x61,
1622 TUNER_PHILIPS_FMD1216MEX_MK3);
1623 }
1624 break;
1625 case SAA7134_BOARD_BEHOLD_X7:
1626 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1627 &behold_x7_config,
1628 &dev->i2c_adap);
1629 if (fe0->dvb.frontend) {
1630 dvb_attach(xc5000_attach, fe0->dvb.frontend,
1631 &dev->i2c_adap, &behold_x7_tunerconfig);
1632 }
1633 break;
1634 case SAA7134_BOARD_BEHOLD_H7:
1635 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1636 &behold_x7_config,
1637 &dev->i2c_adap);
1638 if (fe0->dvb.frontend) {
1639 dvb_attach(xc5000_attach, fe0->dvb.frontend,
1640 &dev->i2c_adap, &behold_x7_tunerconfig);
1641 }
1642 break;
1643 case SAA7134_BOARD_AVERMEDIA_A700_PRO:
1644 case SAA7134_BOARD_AVERMEDIA_A700_HYBRID:
1645 /* Zarlink ZL10313 */
1646 fe0->dvb.frontend = dvb_attach(mt312_attach,
1647 &avertv_a700_mt312, &dev->i2c_adap);
1648 if (fe0->dvb.frontend) {
1649 if (dvb_attach(zl10036_attach, fe0->dvb.frontend,
1650 &avertv_a700_tuner, &dev->i2c_adap) == NULL) {
1651 wprintk("%s: No zl10036 found!\n",
1652 __func__);
1653 }
1654 }
1655 break;
1656 case SAA7134_BOARD_VIDEOMATE_S350:
1657 fe0->dvb.frontend = dvb_attach(mt312_attach,
1658 &zl10313_compro_s350_config, &dev->i2c_adap);
1659 if (fe0->dvb.frontend)
1660 if (dvb_attach(zl10039_attach, fe0->dvb.frontend,
1661 0x60, &dev->i2c_adap) == NULL)
1662 wprintk("%s: No zl10039 found!\n",
1663 __func__);
1664
1665 break;
1666 case SAA7134_BOARD_VIDEOMATE_T750:
1667 fe0->dvb.frontend = dvb_attach(zl10353_attach,
1668 &videomate_t750_zl10353_config,
1669 &dev->i2c_adap);
1670 if (fe0->dvb.frontend != NULL) {
1671 if (dvb_attach(qt1010_attach,
1672 fe0->dvb.frontend,
1673 &dev->i2c_adap,
1674 &videomate_t750_qt1010_config) == NULL)
1675 wprintk("error attaching QT1010\n");
1676 }
1677 break;
1678 case SAA7134_BOARD_ZOLID_HYBRID_PCI:
1679 fe0->dvb.frontend = dvb_attach(tda10048_attach,
1680 &zolid_tda10048_config,
1681 &dev->i2c_adap);
1682 if (fe0->dvb.frontend != NULL) {
1683 dvb_attach(tda829x_attach, fe0->dvb.frontend,
1684 &dev->i2c_adap, 0x4b,
1685 &tda829x_no_probe);
1686 dvb_attach(tda18271_attach, fe0->dvb.frontend,
1687 0x60, &dev->i2c_adap,
1688 &zolid_tda18271_config);
1689 }
1690 break;
1691 case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S:
1692 fe0->dvb.frontend = dvb_attach(tda10048_attach,
1693 &dtv1000s_tda10048_config,
1694 &dev->i2c_adap);
1695 if (fe0->dvb.frontend != NULL) {
1696 dvb_attach(tda829x_attach, fe0->dvb.frontend,
1697 &dev->i2c_adap, 0x4b,
1698 &tda829x_no_probe);
1699 dvb_attach(tda18271_attach, fe0->dvb.frontend,
1700 0x60, &dev->i2c_adap,
1701 &dtv1000s_tda18271_config);
1702 }
1703 break;
1704 case SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG:
1705 /* Switch to digital mode */
1706 saa7134_tuner_callback(dev, 0,
1707 TDA18271_CALLBACK_CMD_AGC_ENABLE, 1);
1708 fe0->dvb.frontend = dvb_attach(mb86a20s_attach,
1709 &kworld_mb86a20s_config,
1710 &dev->i2c_adap);
1711 if (fe0->dvb.frontend != NULL) {
1712 dvb_attach(tda829x_attach, fe0->dvb.frontend,
1713 &dev->i2c_adap, 0x4b,
1714 &tda829x_no_probe);
1715 dvb_attach(tda18271_attach, fe0->dvb.frontend,
1716 0x60, &dev->i2c_adap,
1717 &kworld_tda18271_config);
1718 fe0->dvb.frontend->ops.i2c_gate_ctrl = kworld_sbtvd_gate_ctrl;
1719 }
1720
1721 /* mb86a20s need to use the I2C gateway */
1722 break;
1723 case SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2:
1724 fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
1725 &prohdtv_pro2_lgs8g75_config,
1726 &dev->i2c_adap);
1727 if (fe0->dvb.frontend != NULL) {
1728 dvb_attach(tda829x_attach, fe0->dvb.frontend,
1729 &dev->i2c_adap, 0x4b,
1730 &tda829x_no_probe);
1731 dvb_attach(tda18271_attach, fe0->dvb.frontend,
1732 0x60, &dev->i2c_adap,
1733 &prohdtv_pro2_tda18271_config);
1734 }
1735 break;
1736 default:
1737 wprintk("Huh? unknown DVB card?\n");
1738 break;
1739 }
1740
1741 if (attach_xc3028) {
1742 struct dvb_frontend *fe;
1743 struct xc2028_config cfg = {
1744 .i2c_adap = &dev->i2c_adap,
1745 .i2c_addr = 0x61,
1746 };
1747
1748 if (!fe0->dvb.frontend)
1749 goto dettach_frontend;
1750
1751 fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
1752 if (!fe) {
1753 printk(KERN_ERR "%s/2: xc3028 attach failed\n",
1754 dev->name);
1755 goto dettach_frontend;
1756 }
1757 }
1758
1759 if (NULL == fe0->dvb.frontend) {
1760 printk(KERN_ERR "%s/dvb: frontend initialization failed\n", dev->name);
1761 goto dettach_frontend;
1762 }
1763 /* define general-purpose callback pointer */
1764 fe0->dvb.frontend->callback = saa7134_tuner_callback;
1765
1766 /* register everything else */
1767 ret = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1768 &dev->pci->dev, adapter_nr, 0, NULL);
1769
1770 /* this sequence is necessary to make the tda1004x load its firmware
1771 * and to enter analog mode of hybrid boards
1772 */
1773 if (!ret) {
1774 if (fe0->dvb.frontend->ops.init)
1775 fe0->dvb.frontend->ops.init(fe0->dvb.frontend);
1776 if (fe0->dvb.frontend->ops.sleep)
1777 fe0->dvb.frontend->ops.sleep(fe0->dvb.frontend);
1778 if (fe0->dvb.frontend->ops.tuner_ops.sleep)
1779 fe0->dvb.frontend->ops.tuner_ops.sleep(fe0->dvb.frontend);
1780 }
1781 return ret;
1782
1783dettach_frontend:
1784 videobuf_dvb_dealloc_frontends(&dev->frontends);
1785 return -EINVAL;
1786}
1787
1788static int dvb_fini(struct saa7134_dev *dev)
1789{
1790 struct videobuf_dvb_frontend *fe0;
1791
1792 /* Get the first frontend */
1793 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
1794 if (!fe0)
1795 return -EINVAL;
1796
1797 /* FIXME: I suspect that this code is bogus, since the entry for
1798 Pinnacle 300I DVB-T PAL already defines the proper init to allow
1799 the detection of mt2032 (TDA9887_PORT2_INACTIVE)
1800 */
1801 if (dev->board == SAA7134_BOARD_PINNACLE_300I_DVBT_PAL) {
1802 struct v4l2_priv_tun_config tda9887_cfg;
1803 static int on = TDA9887_PRESENT | TDA9887_PORT2_INACTIVE;
1804
1805 tda9887_cfg.tuner = TUNER_TDA9887;
1806 tda9887_cfg.priv = &on;
1807
1808 /* otherwise we don't detect the tuner on next insmod */
1809 saa_call_all(dev, tuner, s_config, &tda9887_cfg);
1810 } else if (dev->board == SAA7134_BOARD_MEDION_MD8800_QUADRO) {
1811 if ((dev->eedata[2] == 0x07) && use_frontend) {
1812 /* turn off the 2nd lnb supply */
1813 u8 data = 0x80;
1814 struct i2c_msg msg = {.addr = 0x08, .buf = &data, .flags = 0, .len = 1};
1815 struct dvb_frontend *fe;
1816 fe = fe0->dvb.frontend;
1817 if (fe->ops.i2c_gate_ctrl) {
1818 fe->ops.i2c_gate_ctrl(fe, 1);
1819 i2c_transfer(&dev->i2c_adap, &msg, 1);
1820 fe->ops.i2c_gate_ctrl(fe, 0);
1821 }
1822 }
1823 }
1824 videobuf_dvb_unregister_bus(&dev->frontends);
1825 return 0;
1826}
1827
1828static struct saa7134_mpeg_ops dvb_ops = {
1829 .type = SAA7134_MPEG_DVB,
1830 .init = dvb_init,
1831 .fini = dvb_fini,
1832};
1833
1834static int __init dvb_register(void)
1835{
1836 return saa7134_ts_register(&dvb_ops);
1837}
1838
1839static void __exit dvb_unregister(void)
1840{
1841 saa7134_ts_unregister(&dvb_ops);
1842}
1843
1844module_init(dvb_register);
1845module_exit(dvb_unregister);
1846
1847/* ------------------------------------------------------------------ */
1848/*
1849 * Local variables:
1850 * c-basic-offset: 8
1851 * End:
1852 */
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
new file mode 100644
index 00000000000..dde361a9194
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-empress.c
@@ -0,0 +1,590 @@
1/*
2 *
3 * (c) 2004 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19
20#include <linux/init.h>
21#include <linux/list.h>
22#include <linux/module.h>
23#include <linux/kernel.h>
24#include <linux/delay.h>
25
26#include "saa7134-reg.h"
27#include "saa7134.h"
28
29#include <media/saa6752hs.h>
30#include <media/v4l2-common.h>
31#include <media/v4l2-chip-ident.h>
32
33/* ------------------------------------------------------------------ */
34
35MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
36MODULE_LICENSE("GPL");
37
38static unsigned int empress_nr[] = {[0 ... (SAA7134_MAXBOARDS - 1)] = UNSET };
39
40module_param_array(empress_nr, int, NULL, 0444);
41MODULE_PARM_DESC(empress_nr,"ts device number");
42
43static unsigned int debug;
44module_param(debug, int, 0644);
45MODULE_PARM_DESC(debug,"enable debug messages");
46
47#define dprintk(fmt, arg...) if (debug) \
48 printk(KERN_DEBUG "%s/empress: " fmt, dev->name , ## arg)
49
50/* ------------------------------------------------------------------ */
51
52static void ts_reset_encoder(struct saa7134_dev* dev)
53{
54 if (!dev->empress_started)
55 return;
56
57 saa_writeb(SAA7134_SPECIAL_MODE, 0x00);
58 msleep(10);
59 saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
60 msleep(100);
61 dev->empress_started = 0;
62}
63
64static int ts_init_encoder(struct saa7134_dev* dev)
65{
66 u32 leading_null_bytes = 0;
67
68 /* If more cards start to need this, then this
69 should probably be added to the card definitions. */
70 switch (dev->board) {
71 case SAA7134_BOARD_BEHOLD_M6:
72 case SAA7134_BOARD_BEHOLD_M63:
73 case SAA7134_BOARD_BEHOLD_M6_EXTRA:
74 leading_null_bytes = 1;
75 break;
76 }
77 ts_reset_encoder(dev);
78 saa_call_all(dev, core, init, leading_null_bytes);
79 dev->empress_started = 1;
80 return 0;
81}
82
83/* ------------------------------------------------------------------ */
84
85static int ts_open(struct file *file)
86{
87 struct video_device *vdev = video_devdata(file);
88 struct saa7134_dev *dev = video_drvdata(file);
89 int err;
90
91 dprintk("open dev=%s\n", video_device_node_name(vdev));
92 err = -EBUSY;
93 if (!mutex_trylock(&dev->empress_tsq.vb_lock))
94 return err;
95 if (atomic_read(&dev->empress_users))
96 goto done;
97
98 /* Unmute audio */
99 saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
100 saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6));
101
102 atomic_inc(&dev->empress_users);
103 file->private_data = dev;
104 err = 0;
105
106done:
107 mutex_unlock(&dev->empress_tsq.vb_lock);
108 return err;
109}
110
111static int ts_release(struct file *file)
112{
113 struct saa7134_dev *dev = file->private_data;
114
115 videobuf_stop(&dev->empress_tsq);
116 videobuf_mmap_free(&dev->empress_tsq);
117
118 /* stop the encoder */
119 ts_reset_encoder(dev);
120
121 /* Mute audio */
122 saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
123 saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6));
124
125 atomic_dec(&dev->empress_users);
126
127 return 0;
128}
129
130static ssize_t
131ts_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
132{
133 struct saa7134_dev *dev = file->private_data;
134
135 if (!dev->empress_started)
136 ts_init_encoder(dev);
137
138 return videobuf_read_stream(&dev->empress_tsq,
139 data, count, ppos, 0,
140 file->f_flags & O_NONBLOCK);
141}
142
143static unsigned int
144ts_poll(struct file *file, struct poll_table_struct *wait)
145{
146 struct saa7134_dev *dev = file->private_data;
147
148 return videobuf_poll_stream(file, &dev->empress_tsq, wait);
149}
150
151
152static int
153ts_mmap(struct file *file, struct vm_area_struct * vma)
154{
155 struct saa7134_dev *dev = file->private_data;
156
157 return videobuf_mmap_mapper(&dev->empress_tsq, vma);
158}
159
160/*
161 * This function is _not_ called directly, but from
162 * video_generic_ioctl (and maybe others). userspace
163 * copying is done already, arg is a kernel pointer.
164 */
165
166static int empress_querycap(struct file *file, void *priv,
167 struct v4l2_capability *cap)
168{
169 struct saa7134_dev *dev = file->private_data;
170
171 strcpy(cap->driver, "saa7134");
172 strlcpy(cap->card, saa7134_boards[dev->board].name,
173 sizeof(cap->card));
174 sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
175 cap->capabilities =
176 V4L2_CAP_VIDEO_CAPTURE |
177 V4L2_CAP_READWRITE |
178 V4L2_CAP_STREAMING;
179 return 0;
180}
181
182static int empress_enum_input(struct file *file, void *priv,
183 struct v4l2_input *i)
184{
185 if (i->index != 0)
186 return -EINVAL;
187
188 i->type = V4L2_INPUT_TYPE_CAMERA;
189 strcpy(i->name, "CCIR656");
190
191 return 0;
192}
193
194static int empress_g_input(struct file *file, void *priv, unsigned int *i)
195{
196 *i = 0;
197 return 0;
198}
199
200static int empress_s_input(struct file *file, void *priv, unsigned int i)
201{
202 if (i != 0)
203 return -EINVAL;
204
205 return 0;
206}
207
208static int empress_enum_fmt_vid_cap(struct file *file, void *priv,
209 struct v4l2_fmtdesc *f)
210{
211 if (f->index != 0)
212 return -EINVAL;
213
214 strlcpy(f->description, "MPEG TS", sizeof(f->description));
215 f->pixelformat = V4L2_PIX_FMT_MPEG;
216
217 return 0;
218}
219
220static int empress_g_fmt_vid_cap(struct file *file, void *priv,
221 struct v4l2_format *f)
222{
223 struct saa7134_dev *dev = file->private_data;
224 struct v4l2_mbus_framefmt mbus_fmt;
225
226 saa_call_all(dev, video, g_mbus_fmt, &mbus_fmt);
227
228 v4l2_fill_pix_format(&f->fmt.pix, &mbus_fmt);
229 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
230 f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
231
232 return 0;
233}
234
235static int empress_s_fmt_vid_cap(struct file *file, void *priv,
236 struct v4l2_format *f)
237{
238 struct saa7134_dev *dev = file->private_data;
239 struct v4l2_mbus_framefmt mbus_fmt;
240
241 v4l2_fill_mbus_format(&mbus_fmt, &f->fmt.pix, V4L2_MBUS_FMT_FIXED);
242 saa_call_all(dev, video, s_mbus_fmt, &mbus_fmt);
243 v4l2_fill_pix_format(&f->fmt.pix, &mbus_fmt);
244
245 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
246 f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
247
248 return 0;
249}
250
251static int empress_try_fmt_vid_cap(struct file *file, void *priv,
252 struct v4l2_format *f)
253{
254 struct saa7134_dev *dev = file->private_data;
255
256 f->fmt.pix.pixelformat = V4L2_PIX_FMT_MPEG;
257 f->fmt.pix.sizeimage = TS_PACKET_SIZE * dev->ts.nr_packets;
258
259 return 0;
260}
261
262static int empress_reqbufs(struct file *file, void *priv,
263 struct v4l2_requestbuffers *p)
264{
265 struct saa7134_dev *dev = file->private_data;
266
267 return videobuf_reqbufs(&dev->empress_tsq, p);
268}
269
270static int empress_querybuf(struct file *file, void *priv,
271 struct v4l2_buffer *b)
272{
273 struct saa7134_dev *dev = file->private_data;
274
275 return videobuf_querybuf(&dev->empress_tsq, b);
276}
277
278static int empress_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
279{
280 struct saa7134_dev *dev = file->private_data;
281
282 return videobuf_qbuf(&dev->empress_tsq, b);
283}
284
285static int empress_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
286{
287 struct saa7134_dev *dev = file->private_data;
288
289 return videobuf_dqbuf(&dev->empress_tsq, b,
290 file->f_flags & O_NONBLOCK);
291}
292
293static int empress_streamon(struct file *file, void *priv,
294 enum v4l2_buf_type type)
295{
296 struct saa7134_dev *dev = file->private_data;
297
298 return videobuf_streamon(&dev->empress_tsq);
299}
300
301static int empress_streamoff(struct file *file, void *priv,
302 enum v4l2_buf_type type)
303{
304 struct saa7134_dev *dev = file->private_data;
305
306 return videobuf_streamoff(&dev->empress_tsq);
307}
308
309static int empress_s_ext_ctrls(struct file *file, void *priv,
310 struct v4l2_ext_controls *ctrls)
311{
312 struct saa7134_dev *dev = file->private_data;
313 int err;
314
315 /* count == 0 is abused in saa6752hs.c, so that special
316 case is handled here explicitly. */
317 if (ctrls->count == 0)
318 return 0;
319
320 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
321 return -EINVAL;
322
323 err = saa_call_empress(dev, core, s_ext_ctrls, ctrls);
324 ts_init_encoder(dev);
325
326 return err;
327}
328
329static int empress_g_ext_ctrls(struct file *file, void *priv,
330 struct v4l2_ext_controls *ctrls)
331{
332 struct saa7134_dev *dev = file->private_data;
333
334 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
335 return -EINVAL;
336 return saa_call_empress(dev, core, g_ext_ctrls, ctrls);
337}
338
339static int empress_g_ctrl(struct file *file, void *priv,
340 struct v4l2_control *c)
341{
342 struct saa7134_dev *dev = file->private_data;
343
344 return saa7134_g_ctrl_internal(dev, NULL, c);
345}
346
347static int empress_s_ctrl(struct file *file, void *priv,
348 struct v4l2_control *c)
349{
350 struct saa7134_dev *dev = file->private_data;
351
352 return saa7134_s_ctrl_internal(dev, NULL, c);
353}
354
355static int empress_queryctrl(struct file *file, void *priv,
356 struct v4l2_queryctrl *c)
357{
358 /* Must be sorted from low to high control ID! */
359 static const u32 user_ctrls[] = {
360 V4L2_CID_USER_CLASS,
361 V4L2_CID_BRIGHTNESS,
362 V4L2_CID_CONTRAST,
363 V4L2_CID_SATURATION,
364 V4L2_CID_HUE,
365 V4L2_CID_AUDIO_VOLUME,
366 V4L2_CID_AUDIO_MUTE,
367 V4L2_CID_HFLIP,
368 0
369 };
370
371 /* Must be sorted from low to high control ID! */
372 static const u32 mpeg_ctrls[] = {
373 V4L2_CID_MPEG_CLASS,
374 V4L2_CID_MPEG_STREAM_TYPE,
375 V4L2_CID_MPEG_STREAM_PID_PMT,
376 V4L2_CID_MPEG_STREAM_PID_AUDIO,
377 V4L2_CID_MPEG_STREAM_PID_VIDEO,
378 V4L2_CID_MPEG_STREAM_PID_PCR,
379 V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
380 V4L2_CID_MPEG_AUDIO_ENCODING,
381 V4L2_CID_MPEG_AUDIO_L2_BITRATE,
382 V4L2_CID_MPEG_VIDEO_ENCODING,
383 V4L2_CID_MPEG_VIDEO_ASPECT,
384 V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
385 V4L2_CID_MPEG_VIDEO_BITRATE,
386 V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
387 0
388 };
389 static const u32 *ctrl_classes[] = {
390 user_ctrls,
391 mpeg_ctrls,
392 NULL
393 };
394 struct saa7134_dev *dev = file->private_data;
395
396 c->id = v4l2_ctrl_next(ctrl_classes, c->id);
397 if (c->id == 0)
398 return -EINVAL;
399 if (c->id == V4L2_CID_USER_CLASS || c->id == V4L2_CID_MPEG_CLASS)
400 return v4l2_ctrl_query_fill(c, 0, 0, 0, 0);
401 if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
402 return saa7134_queryctrl(file, priv, c);
403 return saa_call_empress(dev, core, queryctrl, c);
404}
405
406static int empress_querymenu(struct file *file, void *priv,
407 struct v4l2_querymenu *c)
408{
409 struct saa7134_dev *dev = file->private_data;
410
411 if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
412 return -EINVAL;
413 return saa_call_empress(dev, core, querymenu, c);
414}
415
416static int empress_g_chip_ident(struct file *file, void *fh,
417 struct v4l2_dbg_chip_ident *chip)
418{
419 struct saa7134_dev *dev = file->private_data;
420
421 chip->ident = V4L2_IDENT_NONE;
422 chip->revision = 0;
423 if (chip->match.type == V4L2_CHIP_MATCH_I2C_DRIVER &&
424 !strcmp(chip->match.name, "saa6752hs"))
425 return saa_call_empress(dev, core, g_chip_ident, chip);
426 if (chip->match.type == V4L2_CHIP_MATCH_I2C_ADDR)
427 return saa_call_empress(dev, core, g_chip_ident, chip);
428 return -EINVAL;
429}
430
431static int empress_s_std(struct file *file, void *priv, v4l2_std_id *id)
432{
433 struct saa7134_dev *dev = file->private_data;
434
435 return saa7134_s_std_internal(dev, NULL, id);
436}
437
438static int empress_g_std(struct file *file, void *priv, v4l2_std_id *id)
439{
440 struct saa7134_dev *dev = file->private_data;
441
442 *id = dev->tvnorm->id;
443 return 0;
444}
445
446static const struct v4l2_file_operations ts_fops =
447{
448 .owner = THIS_MODULE,
449 .open = ts_open,
450 .release = ts_release,
451 .read = ts_read,
452 .poll = ts_poll,
453 .mmap = ts_mmap,
454 .ioctl = video_ioctl2,
455};
456
457static const struct v4l2_ioctl_ops ts_ioctl_ops = {
458 .vidioc_querycap = empress_querycap,
459 .vidioc_enum_fmt_vid_cap = empress_enum_fmt_vid_cap,
460 .vidioc_try_fmt_vid_cap = empress_try_fmt_vid_cap,
461 .vidioc_s_fmt_vid_cap = empress_s_fmt_vid_cap,
462 .vidioc_g_fmt_vid_cap = empress_g_fmt_vid_cap,
463 .vidioc_reqbufs = empress_reqbufs,
464 .vidioc_querybuf = empress_querybuf,
465 .vidioc_qbuf = empress_qbuf,
466 .vidioc_dqbuf = empress_dqbuf,
467 .vidioc_streamon = empress_streamon,
468 .vidioc_streamoff = empress_streamoff,
469 .vidioc_s_ext_ctrls = empress_s_ext_ctrls,
470 .vidioc_g_ext_ctrls = empress_g_ext_ctrls,
471 .vidioc_enum_input = empress_enum_input,
472 .vidioc_g_input = empress_g_input,
473 .vidioc_s_input = empress_s_input,
474 .vidioc_queryctrl = empress_queryctrl,
475 .vidioc_querymenu = empress_querymenu,
476 .vidioc_g_ctrl = empress_g_ctrl,
477 .vidioc_s_ctrl = empress_s_ctrl,
478 .vidioc_g_chip_ident = empress_g_chip_ident,
479 .vidioc_s_std = empress_s_std,
480 .vidioc_g_std = empress_g_std,
481};
482
483/* ----------------------------------------------------------- */
484
485static struct video_device saa7134_empress_template = {
486 .name = "saa7134-empress",
487 .fops = &ts_fops,
488 .ioctl_ops = &ts_ioctl_ops,
489
490 .tvnorms = SAA7134_NORMS,
491 .current_norm = V4L2_STD_PAL,
492};
493
494static void empress_signal_update(struct work_struct *work)
495{
496 struct saa7134_dev* dev =
497 container_of(work, struct saa7134_dev, empress_workqueue);
498
499 if (dev->nosignal) {
500 dprintk("no video signal\n");
501 } else {
502 dprintk("video signal acquired\n");
503 }
504}
505
506static void empress_signal_change(struct saa7134_dev *dev)
507{
508 schedule_work(&dev->empress_workqueue);
509}
510
511
512static int empress_init(struct saa7134_dev *dev)
513{
514 int err;
515
516 dprintk("%s: %s\n",dev->name,__func__);
517 dev->empress_dev = video_device_alloc();
518 if (NULL == dev->empress_dev)
519 return -ENOMEM;
520 *(dev->empress_dev) = saa7134_empress_template;
521 dev->empress_dev->parent = &dev->pci->dev;
522 dev->empress_dev->release = video_device_release;
523 snprintf(dev->empress_dev->name, sizeof(dev->empress_dev->name),
524 "%s empress (%s)", dev->name,
525 saa7134_boards[dev->board].name);
526
527 INIT_WORK(&dev->empress_workqueue, empress_signal_update);
528
529 video_set_drvdata(dev->empress_dev, dev);
530 err = video_register_device(dev->empress_dev,VFL_TYPE_GRABBER,
531 empress_nr[dev->nr]);
532 if (err < 0) {
533 printk(KERN_INFO "%s: can't register video device\n",
534 dev->name);
535 video_device_release(dev->empress_dev);
536 dev->empress_dev = NULL;
537 return err;
538 }
539 printk(KERN_INFO "%s: registered device %s [mpeg]\n",
540 dev->name, video_device_node_name(dev->empress_dev));
541
542 videobuf_queue_sg_init(&dev->empress_tsq, &saa7134_ts_qops,
543 &dev->pci->dev, &dev->slock,
544 V4L2_BUF_TYPE_VIDEO_CAPTURE,
545 V4L2_FIELD_ALTERNATE,
546 sizeof(struct saa7134_buf),
547 dev, NULL);
548
549 empress_signal_update(&dev->empress_workqueue);
550 return 0;
551}
552
553static int empress_fini(struct saa7134_dev *dev)
554{
555 dprintk("%s: %s\n",dev->name,__func__);
556
557 if (NULL == dev->empress_dev)
558 return 0;
559 flush_work_sync(&dev->empress_workqueue);
560 video_unregister_device(dev->empress_dev);
561 dev->empress_dev = NULL;
562 return 0;
563}
564
565static struct saa7134_mpeg_ops empress_ops = {
566 .type = SAA7134_MPEG_EMPRESS,
567 .init = empress_init,
568 .fini = empress_fini,
569 .signal_change = empress_signal_change,
570};
571
572static int __init empress_register(void)
573{
574 return saa7134_ts_register(&empress_ops);
575}
576
577static void __exit empress_unregister(void)
578{
579 saa7134_ts_unregister(&empress_ops);
580}
581
582module_init(empress_register);
583module_exit(empress_unregister);
584
585/* ----------------------------------------------------------- */
586/*
587 * Local variables:
588 * c-basic-offset: 8
589 * End:
590 */
diff --git a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c
new file mode 100644
index 00000000000..2d3f6d265bb
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-i2c.c
@@ -0,0 +1,423 @@
1/*
2 *
3 * device driver for philips saa7134 based TV cards
4 * i2c interface support
5 *
6 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/list.h>
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/delay.h>
28
29#include "saa7134-reg.h"
30#include "saa7134.h"
31#include <media/v4l2-common.h>
32
33/* ----------------------------------------------------------- */
34
35static unsigned int i2c_debug;
36module_param(i2c_debug, int, 0644);
37MODULE_PARM_DESC(i2c_debug,"enable debug messages [i2c]");
38
39static unsigned int i2c_scan;
40module_param(i2c_scan, int, 0444);
41MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time");
42
43#define d1printk if (1 == i2c_debug) printk
44#define d2printk if (2 == i2c_debug) printk
45
46#define I2C_WAIT_DELAY 32
47#define I2C_WAIT_RETRY 16
48
49/* ----------------------------------------------------------- */
50
51static char *str_i2c_status[] = {
52 "IDLE", "DONE_STOP", "BUSY", "TO_SCL", "TO_ARB", "DONE_WRITE",
53 "DONE_READ", "DONE_WRITE_TO", "DONE_READ_TO", "NO_DEVICE",
54 "NO_ACKN", "BUS_ERR", "ARB_LOST", "SEQ_ERR", "ST_ERR", "SW_ERR"
55};
56
57enum i2c_status {
58 IDLE = 0, // no I2C command pending
59 DONE_STOP = 1, // I2C command done and STOP executed
60 BUSY = 2, // executing I2C command
61 TO_SCL = 3, // executing I2C command, time out on clock stretching
62 TO_ARB = 4, // time out on arbitration trial, still trying
63 DONE_WRITE = 5, // I2C command done and awaiting next write command
64 DONE_READ = 6, // I2C command done and awaiting next read command
65 DONE_WRITE_TO = 7, // see 5, and time out on status echo
66 DONE_READ_TO = 8, // see 6, and time out on status echo
67 NO_DEVICE = 9, // no acknowledge on device slave address
68 NO_ACKN = 10, // no acknowledge after data byte transfer
69 BUS_ERR = 11, // bus error
70 ARB_LOST = 12, // arbitration lost during transfer
71 SEQ_ERR = 13, // erroneous programming sequence
72 ST_ERR = 14, // wrong status echoing
73 SW_ERR = 15 // software error
74};
75
76static char *str_i2c_attr[] = {
77 "NOP", "STOP", "CONTINUE", "START"
78};
79
80enum i2c_attr {
81 NOP = 0, // no operation on I2C bus
82 STOP = 1, // stop condition, no associated byte transfer
83 CONTINUE = 2, // continue with byte transfer
84 START = 3 // start condition with byte transfer
85};
86
87static inline enum i2c_status i2c_get_status(struct saa7134_dev *dev)
88{
89 enum i2c_status status;
90
91 status = saa_readb(SAA7134_I2C_ATTR_STATUS) & 0x0f;
92 d2printk(KERN_DEBUG "%s: i2c stat <= %s\n",dev->name,
93 str_i2c_status[status]);
94 return status;
95}
96
97static inline void i2c_set_status(struct saa7134_dev *dev,
98 enum i2c_status status)
99{
100 d2printk(KERN_DEBUG "%s: i2c stat => %s\n",dev->name,
101 str_i2c_status[status]);
102 saa_andorb(SAA7134_I2C_ATTR_STATUS,0x0f,status);
103}
104
105static inline void i2c_set_attr(struct saa7134_dev *dev, enum i2c_attr attr)
106{
107 d2printk(KERN_DEBUG "%s: i2c attr => %s\n",dev->name,
108 str_i2c_attr[attr]);
109 saa_andorb(SAA7134_I2C_ATTR_STATUS,0xc0,attr << 6);
110}
111
112static inline int i2c_is_error(enum i2c_status status)
113{
114 switch (status) {
115 case NO_DEVICE:
116 case NO_ACKN:
117 case BUS_ERR:
118 case ARB_LOST:
119 case SEQ_ERR:
120 case ST_ERR:
121 return true;
122 default:
123 return false;
124 }
125}
126
127static inline int i2c_is_idle(enum i2c_status status)
128{
129 switch (status) {
130 case IDLE:
131 case DONE_STOP:
132 return true;
133 default:
134 return false;
135 }
136}
137
138static inline int i2c_is_busy(enum i2c_status status)
139{
140 switch (status) {
141 case BUSY:
142 case TO_SCL:
143 case TO_ARB:
144 return true;
145 default:
146 return false;
147 }
148}
149
150static int i2c_is_busy_wait(struct saa7134_dev *dev)
151{
152 enum i2c_status status;
153 int count;
154
155 for (count = 0; count < I2C_WAIT_RETRY; count++) {
156 status = i2c_get_status(dev);
157 if (!i2c_is_busy(status))
158 break;
159 saa_wait(I2C_WAIT_DELAY);
160 }
161 if (I2C_WAIT_RETRY == count)
162 return false;
163 return true;
164}
165
166static int i2c_reset(struct saa7134_dev *dev)
167{
168 enum i2c_status status;
169 int count;
170
171 d2printk(KERN_DEBUG "%s: i2c reset\n",dev->name);
172 status = i2c_get_status(dev);
173 if (!i2c_is_error(status))
174 return true;
175 i2c_set_status(dev,status);
176
177 for (count = 0; count < I2C_WAIT_RETRY; count++) {
178 status = i2c_get_status(dev);
179 if (!i2c_is_error(status))
180 break;
181 udelay(I2C_WAIT_DELAY);
182 }
183 if (I2C_WAIT_RETRY == count)
184 return false;
185
186 if (!i2c_is_idle(status))
187 return false;
188
189 i2c_set_attr(dev,NOP);
190 return true;
191}
192
193static inline int i2c_send_byte(struct saa7134_dev *dev,
194 enum i2c_attr attr,
195 unsigned char data)
196{
197 enum i2c_status status;
198 __u32 dword;
199
200 /* have to write both attr + data in one 32bit word */
201 dword = saa_readl(SAA7134_I2C_ATTR_STATUS >> 2);
202 dword &= 0x0f;
203 dword |= (attr << 6);
204 dword |= ((__u32)data << 8);
205 dword |= 0x00 << 16; /* 100 kHz */
206// dword |= 0x40 << 16; /* 400 kHz */
207 dword |= 0xf0 << 24;
208 saa_writel(SAA7134_I2C_ATTR_STATUS >> 2, dword);
209 d2printk(KERN_DEBUG "%s: i2c data => 0x%x\n",dev->name,data);
210
211 if (!i2c_is_busy_wait(dev))
212 return -EIO;
213 status = i2c_get_status(dev);
214 if (i2c_is_error(status))
215 return -EIO;
216 return 0;
217}
218
219static inline int i2c_recv_byte(struct saa7134_dev *dev)
220{
221 enum i2c_status status;
222 unsigned char data;
223
224 i2c_set_attr(dev,CONTINUE);
225 if (!i2c_is_busy_wait(dev))
226 return -EIO;
227 status = i2c_get_status(dev);
228 if (i2c_is_error(status))
229 return -EIO;
230 data = saa_readb(SAA7134_I2C_DATA);
231 d2printk(KERN_DEBUG "%s: i2c data <= 0x%x\n",dev->name,data);
232 return data;
233}
234
235static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap,
236 struct i2c_msg *msgs, int num)
237{
238 struct saa7134_dev *dev = i2c_adap->algo_data;
239 enum i2c_status status;
240 unsigned char data;
241 int addr,rc,i,byte;
242
243 status = i2c_get_status(dev);
244 if (!i2c_is_idle(status))
245 if (!i2c_reset(dev))
246 return -EIO;
247
248 d2printk("start xfer\n");
249 d1printk(KERN_DEBUG "%s: i2c xfer:",dev->name);
250 for (i = 0; i < num; i++) {
251 if (!(msgs[i].flags & I2C_M_NOSTART) || 0 == i) {
252 /* send address */
253 d2printk("send address\n");
254 addr = msgs[i].addr << 1;
255 if (msgs[i].flags & I2C_M_RD)
256 addr |= 1;
257 if (i > 0 && msgs[i].flags & I2C_M_RD && msgs[i].addr != 0x40) {
258 /* workaround for a saa7134 i2c bug
259 * needed to talk to the mt352 demux
260 * thanks to pinnacle for the hint */
261 int quirk = 0xfe;
262 d1printk(" [%02x quirk]",quirk);
263 i2c_send_byte(dev,START,quirk);
264 i2c_recv_byte(dev);
265 }
266 d1printk(" < %02x", addr);
267 rc = i2c_send_byte(dev,START,addr);
268 if (rc < 0)
269 goto err;
270 }
271 if (msgs[i].flags & I2C_M_RD) {
272 /* read bytes */
273 d2printk("read bytes\n");
274 for (byte = 0; byte < msgs[i].len; byte++) {
275 d1printk(" =");
276 rc = i2c_recv_byte(dev);
277 if (rc < 0)
278 goto err;
279 d1printk("%02x", rc);
280 msgs[i].buf[byte] = rc;
281 }
282 } else {
283 /* write bytes */
284 d2printk("write bytes\n");
285 for (byte = 0; byte < msgs[i].len; byte++) {
286 data = msgs[i].buf[byte];
287 d1printk(" %02x", data);
288 rc = i2c_send_byte(dev,CONTINUE,data);
289 if (rc < 0)
290 goto err;
291 }
292 }
293 }
294 d2printk("xfer done\n");
295 d1printk(" >");
296 i2c_set_attr(dev,STOP);
297 rc = -EIO;
298 if (!i2c_is_busy_wait(dev))
299 goto err;
300 status = i2c_get_status(dev);
301 if (i2c_is_error(status))
302 goto err;
303 /* ensure that the bus is idle for at least one bit slot */
304 msleep(1);
305
306 d1printk("\n");
307 return num;
308 err:
309 if (1 == i2c_debug) {
310 status = i2c_get_status(dev);
311 printk(" ERROR: %s\n",str_i2c_status[status]);
312 }
313 return rc;
314}
315
316/* ----------------------------------------------------------- */
317
318static u32 functionality(struct i2c_adapter *adap)
319{
320 return I2C_FUNC_SMBUS_EMUL;
321}
322
323static struct i2c_algorithm saa7134_algo = {
324 .master_xfer = saa7134_i2c_xfer,
325 .functionality = functionality,
326};
327
328static struct i2c_adapter saa7134_adap_template = {
329 .owner = THIS_MODULE,
330 .name = "saa7134",
331 .algo = &saa7134_algo,
332};
333
334static struct i2c_client saa7134_client_template = {
335 .name = "saa7134 internal",
336};
337
338/* ----------------------------------------------------------- */
339
340static int
341saa7134_i2c_eeprom(struct saa7134_dev *dev, unsigned char *eedata, int len)
342{
343 unsigned char buf;
344 int i,err;
345
346 dev->i2c_client.addr = 0xa0 >> 1;
347 buf = 0;
348 if (1 != (err = i2c_master_send(&dev->i2c_client,&buf,1))) {
349 printk(KERN_INFO "%s: Huh, no eeprom present (err=%d)?\n",
350 dev->name,err);
351 return -1;
352 }
353 if (len != (err = i2c_master_recv(&dev->i2c_client,eedata,len))) {
354 printk(KERN_WARNING "%s: i2c eeprom read error (err=%d)\n",
355 dev->name,err);
356 return -1;
357 }
358 for (i = 0; i < len; i++) {
359 if (0 == (i % 16))
360 printk(KERN_INFO "%s: i2c eeprom %02x:",dev->name,i);
361 printk(" %02x",eedata[i]);
362 if (15 == (i % 16))
363 printk("\n");
364 }
365 return 0;
366}
367
368static char *i2c_devs[128] = {
369 [ 0x20 ] = "mpeg encoder (saa6752hs)",
370 [ 0xa0 >> 1 ] = "eeprom",
371 [ 0xc0 >> 1 ] = "tuner (analog)",
372 [ 0x86 >> 1 ] = "tda9887",
373 [ 0x5a >> 1 ] = "remote control",
374};
375
376static void do_i2c_scan(char *name, struct i2c_client *c)
377{
378 unsigned char buf;
379 int i,rc;
380
381 for (i = 0; i < ARRAY_SIZE(i2c_devs); i++) {
382 c->addr = i;
383 rc = i2c_master_recv(c,&buf,0);
384 if (rc < 0)
385 continue;
386 printk("%s: i2c scan: found device @ 0x%x [%s]\n",
387 name, i << 1, i2c_devs[i] ? i2c_devs[i] : "???");
388 }
389}
390
391int saa7134_i2c_register(struct saa7134_dev *dev)
392{
393 dev->i2c_adap = saa7134_adap_template;
394 dev->i2c_adap.dev.parent = &dev->pci->dev;
395 strcpy(dev->i2c_adap.name,dev->name);
396 dev->i2c_adap.algo_data = dev;
397 i2c_set_adapdata(&dev->i2c_adap, &dev->v4l2_dev);
398 i2c_add_adapter(&dev->i2c_adap);
399
400 dev->i2c_client = saa7134_client_template;
401 dev->i2c_client.adapter = &dev->i2c_adap;
402
403 saa7134_i2c_eeprom(dev,dev->eedata,sizeof(dev->eedata));
404 if (i2c_scan)
405 do_i2c_scan(dev->name,&dev->i2c_client);
406
407 /* Instantiate the IR receiver device, if present */
408 saa7134_probe_i2c_ir(dev);
409 return 0;
410}
411
412int saa7134_i2c_unregister(struct saa7134_dev *dev)
413{
414 i2c_del_adapter(&dev->i2c_adap);
415 return 0;
416}
417
418/* ----------------------------------------------------------- */
419/*
420 * Local variables:
421 * c-basic-offset: 8
422 * End:
423 */
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
new file mode 100644
index 00000000000..d4ee24bf692
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -0,0 +1,972 @@
1/*
2 *
3 * handle saa7134 IR remotes via linux kernel input layer.
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 *
19 */
20
21#include <linux/module.h>
22#include <linux/init.h>
23#include <linux/delay.h>
24#include <linux/interrupt.h>
25#include <linux/slab.h>
26
27#include "saa7134-reg.h"
28#include "saa7134.h"
29
30#define MODULE_NAME "saa7134"
31
32static unsigned int disable_ir;
33module_param(disable_ir, int, 0444);
34MODULE_PARM_DESC(disable_ir,"disable infrared remote support");
35
36static unsigned int ir_debug;
37module_param(ir_debug, int, 0644);
38MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]");
39
40static int pinnacle_remote;
41module_param(pinnacle_remote, int, 0644); /* Choose Pinnacle PCTV remote */
42MODULE_PARM_DESC(pinnacle_remote, "Specify Pinnacle PCTV remote: 0=coloured, 1=grey (defaults to 0)");
43
44#define dprintk(fmt, arg...) if (ir_debug) \
45 printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg)
46#define i2cdprintk(fmt, arg...) if (ir_debug) \
47 printk(KERN_DEBUG "%s/ir: " fmt, ir->name , ## arg)
48
49/* Helper function for raw decoding at GPIO16 or GPIO18 */
50static int saa7134_raw_decode_irq(struct saa7134_dev *dev);
51
52/* -------------------- GPIO generic keycode builder -------------------- */
53
54static int build_key(struct saa7134_dev *dev)
55{
56 struct saa7134_card_ir *ir = dev->remote;
57 u32 gpio, data;
58
59 /* here comes the additional handshake steps for some cards */
60 switch (dev->board) {
61 case SAA7134_BOARD_GOTVIEW_7135:
62 saa_setb(SAA7134_GPIO_GPSTATUS1, 0x80);
63 saa_clearb(SAA7134_GPIO_GPSTATUS1, 0x80);
64 break;
65 }
66 /* rising SAA7134_GPIO_GPRESCAN reads the status */
67 saa_clearb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
68 saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
69
70 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
71 if (ir->polling) {
72 if (ir->last_gpio == gpio)
73 return 0;
74 ir->last_gpio = gpio;
75 }
76
77 data = ir_extract_bits(gpio, ir->mask_keycode);
78 dprintk("build_key gpio=0x%x mask=0x%x data=%d\n",
79 gpio, ir->mask_keycode, data);
80
81 switch (dev->board) {
82 case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG:
83 if (data == ir->mask_keycode)
84 rc_keyup(ir->dev);
85 else
86 rc_keydown_notimeout(ir->dev, data, 0);
87 return 0;
88 }
89
90 if (ir->polling) {
91 if ((ir->mask_keydown && (0 != (gpio & ir->mask_keydown))) ||
92 (ir->mask_keyup && (0 == (gpio & ir->mask_keyup)))) {
93 rc_keydown_notimeout(ir->dev, data, 0);
94 } else {
95 rc_keyup(ir->dev);
96 }
97 }
98 else { /* IRQ driven mode - handle key press and release in one go */
99 if ((ir->mask_keydown && (0 != (gpio & ir->mask_keydown))) ||
100 (ir->mask_keyup && (0 == (gpio & ir->mask_keyup)))) {
101 rc_keydown_notimeout(ir->dev, data, 0);
102 rc_keyup(ir->dev);
103 }
104 }
105
106 return 0;
107}
108
109/* --------------------- Chip specific I2C key builders ----------------- */
110
111static int get_key_flydvb_trio(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
112{
113 int gpio;
114 int attempt = 0;
115 unsigned char b;
116
117 /* We need this to access GPI Used by the saa_readl macro. */
118 struct saa7134_dev *dev = ir->c->adapter->algo_data;
119
120 if (dev == NULL) {
121 i2cdprintk("get_key_flydvb_trio: "
122 "ir->c->adapter->algo_data is NULL!\n");
123 return -EIO;
124 }
125
126 /* rising SAA7134_GPIGPRESCAN reads the status */
127 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
128 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
129
130 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
131
132 if (0x40000 & ~gpio)
133 return 0; /* No button press */
134
135 /* No button press - only before first key pressed */
136 if (b == 0xFF)
137 return 0;
138
139 /* poll IR chip */
140 /* weak up the IR chip */
141 b = 0;
142
143 while (1 != i2c_master_send(ir->c, &b, 1)) {
144 if ((attempt++) < 10) {
145 /*
146 * wait a bit for next attempt -
147 * I don't know how make it better
148 */
149 msleep(10);
150 continue;
151 }
152 i2cdprintk("send wake up byte to pic16C505 (IR chip)"
153 "failed %dx\n", attempt);
154 return -EIO;
155 }
156 if (1 != i2c_master_recv(ir->c, &b, 1)) {
157 i2cdprintk("read error\n");
158 return -EIO;
159 }
160
161 *ir_key = b;
162 *ir_raw = b;
163 return 1;
164}
165
166static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key,
167 u32 *ir_raw)
168{
169 unsigned char b;
170 int gpio;
171
172 /* <dev> is needed to access GPIO. Used by the saa_readl macro. */
173 struct saa7134_dev *dev = ir->c->adapter->algo_data;
174 if (dev == NULL) {
175 i2cdprintk("get_key_msi_tvanywhere_plus: "
176 "ir->c->adapter->algo_data is NULL!\n");
177 return -EIO;
178 }
179
180 /* rising SAA7134_GPIO_GPRESCAN reads the status */
181
182 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
183 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
184
185 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
186
187 /* GPIO&0x40 is pulsed low when a button is pressed. Don't do
188 I2C receive if gpio&0x40 is not low. */
189
190 if (gpio & 0x40)
191 return 0; /* No button press */
192
193 /* GPIO says there is a button press. Get it. */
194
195 if (1 != i2c_master_recv(ir->c, &b, 1)) {
196 i2cdprintk("read error\n");
197 return -EIO;
198 }
199
200 /* No button press */
201
202 if (b == 0xff)
203 return 0;
204
205 /* Button pressed */
206
207 dprintk("get_key_msi_tvanywhere_plus: Key = 0x%02X\n", b);
208 *ir_key = b;
209 *ir_raw = b;
210 return 1;
211}
212
213static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
214{
215 unsigned char b;
216
217 /* poll IR chip */
218 if (1 != i2c_master_recv(ir->c, &b, 1)) {
219 i2cdprintk("read error\n");
220 return -EIO;
221 }
222
223 /* no button press */
224 if (b==0)
225 return 0;
226
227 /* repeating */
228 if (b & 0x80)
229 return 1;
230
231 *ir_key = b;
232 *ir_raw = b;
233 return 1;
234}
235
236static int get_key_hvr1110(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
237{
238 unsigned char buf[5], cod4, code3, code4;
239
240 /* poll IR chip */
241 if (5 != i2c_master_recv(ir->c, buf, 5))
242 return -EIO;
243
244 cod4 = buf[4];
245 code4 = (cod4 >> 2);
246 code3 = buf[3];
247 if (code3 == 0)
248 /* no key pressed */
249 return 0;
250
251 /* return key */
252 *ir_key = code4;
253 *ir_raw = code4;
254 return 1;
255}
256
257
258static int get_key_beholdm6xx(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
259{
260 unsigned char data[12];
261 u32 gpio;
262
263 struct saa7134_dev *dev = ir->c->adapter->algo_data;
264
265 /* rising SAA7134_GPIO_GPRESCAN reads the status */
266 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
267 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
268
269 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
270
271 if (0x400000 & ~gpio)
272 return 0; /* No button press */
273
274 ir->c->addr = 0x5a >> 1;
275
276 if (12 != i2c_master_recv(ir->c, data, 12)) {
277 i2cdprintk("read error\n");
278 return -EIO;
279 }
280
281 if (data[9] != (unsigned char)(~data[8]))
282 return 0;
283
284 *ir_raw = ((data[10] << 16) | (data[11] << 8) | (data[9] << 0));
285 *ir_key = *ir_raw;
286
287 return 1;
288}
289
290/* Common (grey or coloured) pinnacle PCTV remote handling
291 *
292 */
293static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
294 int parity_offset, int marker, int code_modulo)
295{
296 unsigned char b[4];
297 unsigned int start = 0,parity = 0,code = 0;
298
299 /* poll IR chip */
300 if (4 != i2c_master_recv(ir->c, b, 4)) {
301 i2cdprintk("read error\n");
302 return -EIO;
303 }
304
305 for (start = 0; start < ARRAY_SIZE(b); start++) {
306 if (b[start] == marker) {
307 code=b[(start+parity_offset + 1) % 4];
308 parity=b[(start+parity_offset) % 4];
309 }
310 }
311
312 /* Empty Request */
313 if (parity == 0)
314 return 0;
315
316 /* Repeating... */
317 if (ir->old == parity)
318 return 0;
319
320 ir->old = parity;
321
322 /* drop special codes when a key is held down a long time for the grey controller
323 In this case, the second bit of the code is asserted */
324 if (marker == 0xfe && (code & 0x40))
325 return 0;
326
327 code %= code_modulo;
328
329 *ir_raw = code;
330 *ir_key = code;
331
332 i2cdprintk("Pinnacle PCTV key %02x\n", code);
333
334 return 1;
335}
336
337/* The grey pinnacle PCTV remote
338 *
339 * There are one issue with this remote:
340 * - I2c packet does not change when the same key is pressed quickly. The workaround
341 * is to hold down each key for about half a second, so that another code is generated
342 * in the i2c packet, and the function can distinguish key presses.
343 *
344 * Sylvain Pasche <sylvain.pasche@gmail.com>
345 */
346static int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
347{
348
349 return get_key_pinnacle(ir, ir_key, ir_raw, 1, 0xfe, 0xff);
350}
351
352
353/* The new pinnacle PCTV remote (with the colored buttons)
354 *
355 * Ricardo Cerqueira <v4l@cerqueira.org>
356 */
357static int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
358{
359 /* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE
360 *
361 * this is the only value that results in 42 unique
362 * codes < 128
363 */
364
365 return get_key_pinnacle(ir, ir_key, ir_raw, 2, 0x80, 0x88);
366}
367
368void saa7134_input_irq(struct saa7134_dev *dev)
369{
370 struct saa7134_card_ir *ir;
371
372 if (!dev || !dev->remote)
373 return;
374
375 ir = dev->remote;
376 if (!ir->running)
377 return;
378
379 if (!ir->polling && !ir->raw_decode) {
380 build_key(dev);
381 } else if (ir->raw_decode) {
382 saa7134_raw_decode_irq(dev);
383 }
384}
385
386static void saa7134_input_timer(unsigned long data)
387{
388 struct saa7134_dev *dev = (struct saa7134_dev *)data;
389 struct saa7134_card_ir *ir = dev->remote;
390
391 build_key(dev);
392 mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling));
393}
394
395static void ir_raw_decode_timer_end(unsigned long data)
396{
397 struct saa7134_dev *dev = (struct saa7134_dev *)data;
398 struct saa7134_card_ir *ir = dev->remote;
399
400 ir_raw_event_handle(dev->remote->dev);
401
402 ir->active = false;
403}
404
405static int __saa7134_ir_start(void *priv)
406{
407 struct saa7134_dev *dev = priv;
408 struct saa7134_card_ir *ir;
409
410 if (!dev || !dev->remote)
411 return -EINVAL;
412
413 ir = dev->remote;
414 if (ir->running)
415 return 0;
416
417 /* Moved here from saa7134_input_init1() because the latter
418 * is not called on device resume */
419 switch (dev->board) {
420 case SAA7134_BOARD_MD2819:
421 case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:
422 case SAA7134_BOARD_AVERMEDIA_305:
423 case SAA7134_BOARD_AVERMEDIA_307:
424 case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
425 case SAA7134_BOARD_AVERMEDIA_STUDIO_505:
426 case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
427 case SAA7134_BOARD_AVERMEDIA_STUDIO_507:
428 case SAA7134_BOARD_AVERMEDIA_STUDIO_507UA:
429 case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
430 case SAA7134_BOARD_AVERMEDIA_M102:
431 case SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS:
432 /* Without this we won't receive key up events */
433 saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
434 saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
435 break;
436 case SAA7134_BOARD_AVERMEDIA_777:
437 case SAA7134_BOARD_AVERMEDIA_A16AR:
438 /* Without this we won't receive key up events */
439 saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
440 saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
441 break;
442 case SAA7134_BOARD_AVERMEDIA_A16D:
443 /* Without this we won't receive key up events */
444 saa_setb(SAA7134_GPIO_GPMODE1, 0x1);
445 saa_setb(SAA7134_GPIO_GPSTATUS1, 0x1);
446 break;
447 case SAA7134_BOARD_GOTVIEW_7135:
448 saa_setb(SAA7134_GPIO_GPMODE1, 0x80);
449 break;
450 }
451
452 ir->running = true;
453 ir->active = false;
454
455 if (ir->polling) {
456 setup_timer(&ir->timer, saa7134_input_timer,
457 (unsigned long)dev);
458 ir->timer.expires = jiffies + HZ;
459 add_timer(&ir->timer);
460 } else if (ir->raw_decode) {
461 /* set timer_end for code completion */
462 setup_timer(&ir->timer, ir_raw_decode_timer_end,
463 (unsigned long)dev);
464 }
465
466 return 0;
467}
468
469static void __saa7134_ir_stop(void *priv)
470{
471 struct saa7134_dev *dev = priv;
472 struct saa7134_card_ir *ir;
473
474 if (!dev || !dev->remote)
475 return;
476
477 ir = dev->remote;
478 if (!ir->running)
479 return;
480
481 if (ir->polling || ir->raw_decode)
482 del_timer_sync(&ir->timer);
483
484 ir->active = false;
485 ir->running = false;
486
487 return;
488}
489
490int saa7134_ir_start(struct saa7134_dev *dev)
491{
492 if (dev->remote->users)
493 return __saa7134_ir_start(dev);
494
495 return 0;
496}
497
498void saa7134_ir_stop(struct saa7134_dev *dev)
499{
500 if (dev->remote->users)
501 __saa7134_ir_stop(dev);
502}
503
504static int saa7134_ir_open(struct rc_dev *rc)
505{
506 struct saa7134_dev *dev = rc->priv;
507
508 dev->remote->users++;
509 return __saa7134_ir_start(dev);
510}
511
512static void saa7134_ir_close(struct rc_dev *rc)
513{
514 struct saa7134_dev *dev = rc->priv;
515
516 dev->remote->users--;
517 if (!dev->remote->users)
518 __saa7134_ir_stop(dev);
519}
520
521int saa7134_input_init1(struct saa7134_dev *dev)
522{
523 struct saa7134_card_ir *ir;
524 struct rc_dev *rc;
525 char *ir_codes = NULL;
526 u32 mask_keycode = 0;
527 u32 mask_keydown = 0;
528 u32 mask_keyup = 0;
529 unsigned polling = 0;
530 bool raw_decode = false;
531 int err;
532
533 if (dev->has_remote != SAA7134_REMOTE_GPIO)
534 return -ENODEV;
535 if (disable_ir)
536 return -ENODEV;
537
538 /* detect & configure */
539 switch (dev->board) {
540 case SAA7134_BOARD_FLYVIDEO2000:
541 case SAA7134_BOARD_FLYVIDEO3000:
542 case SAA7134_BOARD_FLYTVPLATINUM_FM:
543 case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
544 case SAA7134_BOARD_ROVERMEDIA_LINK_PRO_FM:
545 ir_codes = RC_MAP_FLYVIDEO;
546 mask_keycode = 0xEC00000;
547 mask_keydown = 0x0040000;
548 break;
549 case SAA7134_BOARD_CINERGY400:
550 case SAA7134_BOARD_CINERGY600:
551 case SAA7134_BOARD_CINERGY600_MK3:
552 ir_codes = RC_MAP_CINERGY;
553 mask_keycode = 0x00003f;
554 mask_keyup = 0x040000;
555 break;
556 case SAA7134_BOARD_ECS_TVP3XP:
557 case SAA7134_BOARD_ECS_TVP3XP_4CB5:
558 ir_codes = RC_MAP_EZTV;
559 mask_keycode = 0x00017c;
560 mask_keyup = 0x000002;
561 polling = 50; // ms
562 break;
563 case SAA7134_BOARD_KWORLD_XPERT:
564 case SAA7134_BOARD_AVACSSMARTTV:
565 ir_codes = RC_MAP_PIXELVIEW;
566 mask_keycode = 0x00001F;
567 mask_keyup = 0x000020;
568 polling = 50; // ms
569 break;
570 case SAA7134_BOARD_MD2819:
571 case SAA7134_BOARD_KWORLD_VSTREAM_XPERT:
572 case SAA7134_BOARD_AVERMEDIA_305:
573 case SAA7134_BOARD_AVERMEDIA_307:
574 case SAA7134_BOARD_AVERMEDIA_STUDIO_305:
575 case SAA7134_BOARD_AVERMEDIA_STUDIO_505:
576 case SAA7134_BOARD_AVERMEDIA_STUDIO_307:
577 case SAA7134_BOARD_AVERMEDIA_STUDIO_507:
578 case SAA7134_BOARD_AVERMEDIA_STUDIO_507UA:
579 case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
580 case SAA7134_BOARD_AVERMEDIA_M102:
581 case SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS:
582 ir_codes = RC_MAP_AVERMEDIA;
583 mask_keycode = 0x0007C8;
584 mask_keydown = 0x000010;
585 polling = 50; // ms
586 /* GPIO stuff moved to __saa7134_ir_start() */
587 break;
588 case SAA7134_BOARD_AVERMEDIA_M135A:
589 ir_codes = RC_MAP_AVERMEDIA_M135A;
590 mask_keydown = 0x0040000; /* Enable GPIO18 line on both edges */
591 mask_keyup = 0x0040000;
592 mask_keycode = 0xffff;
593 raw_decode = true;
594 break;
595 case SAA7134_BOARD_AVERMEDIA_M733A:
596 ir_codes = RC_MAP_AVERMEDIA_M733A_RM_K6;
597 mask_keydown = 0x0040000;
598 mask_keyup = 0x0040000;
599 mask_keycode = 0xffff;
600 raw_decode = true;
601 break;
602 case SAA7134_BOARD_AVERMEDIA_777:
603 case SAA7134_BOARD_AVERMEDIA_A16AR:
604 ir_codes = RC_MAP_AVERMEDIA;
605 mask_keycode = 0x02F200;
606 mask_keydown = 0x000400;
607 polling = 50; // ms
608 /* GPIO stuff moved to __saa7134_ir_start() */
609 break;
610 case SAA7134_BOARD_AVERMEDIA_A16D:
611 ir_codes = RC_MAP_AVERMEDIA_A16D;
612 mask_keycode = 0x02F200;
613 mask_keydown = 0x000400;
614 polling = 50; /* ms */
615 /* GPIO stuff moved to __saa7134_ir_start() */
616 break;
617 case SAA7134_BOARD_KWORLD_TERMINATOR:
618 ir_codes = RC_MAP_PIXELVIEW;
619 mask_keycode = 0x00001f;
620 mask_keyup = 0x000060;
621 polling = 50; // ms
622 break;
623 case SAA7134_BOARD_MANLI_MTV001:
624 case SAA7134_BOARD_MANLI_MTV002:
625 ir_codes = RC_MAP_MANLI;
626 mask_keycode = 0x001f00;
627 mask_keyup = 0x004000;
628 polling = 50; /* ms */
629 break;
630 case SAA7134_BOARD_BEHOLD_409FM:
631 case SAA7134_BOARD_BEHOLD_401:
632 case SAA7134_BOARD_BEHOLD_403:
633 case SAA7134_BOARD_BEHOLD_403FM:
634 case SAA7134_BOARD_BEHOLD_405:
635 case SAA7134_BOARD_BEHOLD_405FM:
636 case SAA7134_BOARD_BEHOLD_407:
637 case SAA7134_BOARD_BEHOLD_407FM:
638 case SAA7134_BOARD_BEHOLD_409:
639 case SAA7134_BOARD_BEHOLD_505FM:
640 case SAA7134_BOARD_BEHOLD_505RDS_MK5:
641 case SAA7134_BOARD_BEHOLD_505RDS_MK3:
642 case SAA7134_BOARD_BEHOLD_507_9FM:
643 case SAA7134_BOARD_BEHOLD_507RDS_MK3:
644 case SAA7134_BOARD_BEHOLD_507RDS_MK5:
645 ir_codes = RC_MAP_MANLI;
646 mask_keycode = 0x003f00;
647 mask_keyup = 0x004000;
648 polling = 50; /* ms */
649 break;
650 case SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM:
651 ir_codes = RC_MAP_BEHOLD_COLUMBUS;
652 mask_keycode = 0x003f00;
653 mask_keyup = 0x004000;
654 polling = 50; // ms
655 break;
656 case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS:
657 ir_codes = RC_MAP_PCTV_SEDNA;
658 mask_keycode = 0x001f00;
659 mask_keyup = 0x004000;
660 polling = 50; // ms
661 break;
662 case SAA7134_BOARD_GOTVIEW_7135:
663 ir_codes = RC_MAP_GOTVIEW7135;
664 mask_keycode = 0x0003CC;
665 mask_keydown = 0x000010;
666 polling = 5; /* ms */
667 /* GPIO stuff moved to __saa7134_ir_start() */
668 break;
669 case SAA7134_BOARD_VIDEOMATE_TV_PVR:
670 case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS:
671 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:
672 ir_codes = RC_MAP_VIDEOMATE_TV_PVR;
673 mask_keycode = 0x00003F;
674 mask_keyup = 0x400000;
675 polling = 50; // ms
676 break;
677 case SAA7134_BOARD_PROTEUS_2309:
678 ir_codes = RC_MAP_PROTEUS_2309;
679 mask_keycode = 0x00007F;
680 mask_keyup = 0x000080;
681 polling = 50; // ms
682 break;
683 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
684 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
685 ir_codes = RC_MAP_VIDEOMATE_TV_PVR;
686 mask_keycode = 0x003F00;
687 mask_keyup = 0x040000;
688 break;
689 case SAA7134_BOARD_FLYDVBS_LR300:
690 case SAA7134_BOARD_FLYDVBT_LR301:
691 case SAA7134_BOARD_FLYDVBTDUO:
692 ir_codes = RC_MAP_FLYDVB;
693 mask_keycode = 0x0001F00;
694 mask_keydown = 0x0040000;
695 break;
696 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
697 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
698 case SAA7134_BOARD_ASUSTeK_P7131_ANALOG:
699 ir_codes = RC_MAP_ASUS_PC39;
700 mask_keydown = 0x0040000; /* Enable GPIO18 line on both edges */
701 mask_keyup = 0x0040000;
702 mask_keycode = 0xffff;
703 raw_decode = true;
704 break;
705 case SAA7134_BOARD_ENCORE_ENLTV:
706 case SAA7134_BOARD_ENCORE_ENLTV_FM:
707 ir_codes = RC_MAP_ENCORE_ENLTV;
708 mask_keycode = 0x00007f;
709 mask_keyup = 0x040000;
710 polling = 50; // ms
711 break;
712 case SAA7134_BOARD_ENCORE_ENLTV_FM53:
713 case SAA7134_BOARD_ENCORE_ENLTV_FM3:
714 ir_codes = RC_MAP_ENCORE_ENLTV_FM53;
715 mask_keydown = 0x0040000; /* Enable GPIO18 line on both edges */
716 mask_keyup = 0x0040000;
717 mask_keycode = 0xffff;
718 raw_decode = true;
719 break;
720 case SAA7134_BOARD_10MOONSTVMASTER3:
721 ir_codes = RC_MAP_ENCORE_ENLTV;
722 mask_keycode = 0x5f80000;
723 mask_keyup = 0x8000000;
724 polling = 50; //ms
725 break;
726 case SAA7134_BOARD_GENIUS_TVGO_A11MCE:
727 ir_codes = RC_MAP_GENIUS_TVGO_A11MCE;
728 mask_keycode = 0xff;
729 mask_keydown = 0xf00000;
730 polling = 50; /* ms */
731 break;
732 case SAA7134_BOARD_REAL_ANGEL_220:
733 ir_codes = RC_MAP_REAL_AUDIO_220_32_KEYS;
734 mask_keycode = 0x3f00;
735 mask_keyup = 0x4000;
736 polling = 50; /* ms */
737 break;
738 case SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG:
739 ir_codes = RC_MAP_KWORLD_PLUS_TV_ANALOG;
740 mask_keycode = 0x7f;
741 polling = 40; /* ms */
742 break;
743 case SAA7134_BOARD_VIDEOMATE_S350:
744 ir_codes = RC_MAP_VIDEOMATE_S350;
745 mask_keycode = 0x003f00;
746 mask_keydown = 0x040000;
747 break;
748 case SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S:
749 ir_codes = RC_MAP_WINFAST;
750 mask_keycode = 0x5f00;
751 mask_keyup = 0x020000;
752 polling = 50; /* ms */
753 break;
754 case SAA7134_BOARD_VIDEOMATE_M1F:
755 ir_codes = RC_MAP_VIDEOMATE_M1F;
756 mask_keycode = 0x0ff00;
757 mask_keyup = 0x040000;
758 break;
759 case SAA7134_BOARD_HAUPPAUGE_HVR1150:
760 case SAA7134_BOARD_HAUPPAUGE_HVR1120:
761 ir_codes = RC_MAP_HAUPPAUGE;
762 mask_keydown = 0x0040000; /* Enable GPIO18 line on both edges */
763 mask_keyup = 0x0040000;
764 mask_keycode = 0xffff;
765 raw_decode = true;
766 break;
767 }
768 if (NULL == ir_codes) {
769 printk("%s: Oops: IR config error [card=%d]\n",
770 dev->name, dev->board);
771 return -ENODEV;
772 }
773
774 ir = kzalloc(sizeof(*ir), GFP_KERNEL);
775 rc = rc_allocate_device();
776 if (!ir || !rc) {
777 err = -ENOMEM;
778 goto err_out_free;
779 }
780
781 ir->dev = rc;
782 dev->remote = ir;
783
784 /* init hardware-specific stuff */
785 ir->mask_keycode = mask_keycode;
786 ir->mask_keydown = mask_keydown;
787 ir->mask_keyup = mask_keyup;
788 ir->polling = polling;
789 ir->raw_decode = raw_decode;
790
791 /* init input device */
792 snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)",
793 saa7134_boards[dev->board].name);
794 snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0",
795 pci_name(dev->pci));
796
797 rc->priv = dev;
798 rc->open = saa7134_ir_open;
799 rc->close = saa7134_ir_close;
800 if (raw_decode)
801 rc->driver_type = RC_DRIVER_IR_RAW;
802
803 rc->input_name = ir->name;
804 rc->input_phys = ir->phys;
805 rc->input_id.bustype = BUS_PCI;
806 rc->input_id.version = 1;
807 if (dev->pci->subsystem_vendor) {
808 rc->input_id.vendor = dev->pci->subsystem_vendor;
809 rc->input_id.product = dev->pci->subsystem_device;
810 } else {
811 rc->input_id.vendor = dev->pci->vendor;
812 rc->input_id.product = dev->pci->device;
813 }
814 rc->dev.parent = &dev->pci->dev;
815 rc->map_name = ir_codes;
816 rc->driver_name = MODULE_NAME;
817
818 err = rc_register_device(rc);
819 if (err)
820 goto err_out_free;
821
822 return 0;
823
824err_out_free:
825 rc_free_device(rc);
826 dev->remote = NULL;
827 kfree(ir);
828 return err;
829}
830
831void saa7134_input_fini(struct saa7134_dev *dev)
832{
833 if (NULL == dev->remote)
834 return;
835
836 saa7134_ir_stop(dev);
837 rc_unregister_device(dev->remote->dev);
838 kfree(dev->remote);
839 dev->remote = NULL;
840}
841
842void saa7134_probe_i2c_ir(struct saa7134_dev *dev)
843{
844 struct i2c_board_info info;
845 struct i2c_msg msg_msi = {
846 .addr = 0x50,
847 .flags = I2C_M_RD,
848 .len = 0,
849 .buf = NULL,
850 };
851 int rc;
852
853 if (disable_ir) {
854 dprintk("IR has been disabled, not probing for i2c remote\n");
855 return;
856 }
857
858 memset(&info, 0, sizeof(struct i2c_board_info));
859 memset(&dev->init_data, 0, sizeof(dev->init_data));
860 strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
861
862 switch (dev->board) {
863 case SAA7134_BOARD_PINNACLE_PCTV_110i:
864 case SAA7134_BOARD_PINNACLE_PCTV_310i:
865 dev->init_data.name = "Pinnacle PCTV";
866 if (pinnacle_remote == 0) {
867 dev->init_data.get_key = get_key_pinnacle_color;
868 dev->init_data.ir_codes = RC_MAP_PINNACLE_COLOR;
869 info.addr = 0x47;
870 } else {
871 dev->init_data.get_key = get_key_pinnacle_grey;
872 dev->init_data.ir_codes = RC_MAP_PINNACLE_GREY;
873 info.addr = 0x47;
874 }
875 break;
876 case SAA7134_BOARD_UPMOST_PURPLE_TV:
877 dev->init_data.name = "Purple TV";
878 dev->init_data.get_key = get_key_purpletv;
879 dev->init_data.ir_codes = RC_MAP_PURPLETV;
880 info.addr = 0x7a;
881 break;
882 case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS:
883 dev->init_data.name = "MSI TV@nywhere Plus";
884 dev->init_data.get_key = get_key_msi_tvanywhere_plus;
885 dev->init_data.ir_codes = RC_MAP_MSI_TVANYWHERE_PLUS;
886 /*
887 * MSI TV@nyware Plus requires more frequent polling
888 * otherwise it will miss some keypresses
889 */
890 dev->init_data.polling_interval = 50;
891 info.addr = 0x30;
892 /* MSI TV@nywhere Plus controller doesn't seem to
893 respond to probes unless we read something from
894 an existing device. Weird...
895 REVISIT: might no longer be needed */
896 rc = i2c_transfer(&dev->i2c_adap, &msg_msi, 1);
897 dprintk("probe 0x%02x @ %s: %s\n",
898 msg_msi.addr, dev->i2c_adap.name,
899 (1 == rc) ? "yes" : "no");
900 break;
901 case SAA7134_BOARD_HAUPPAUGE_HVR1110:
902 dev->init_data.name = "HVR 1110";
903 dev->init_data.get_key = get_key_hvr1110;
904 dev->init_data.ir_codes = RC_MAP_HAUPPAUGE;
905 info.addr = 0x71;
906 break;
907 case SAA7134_BOARD_BEHOLD_607FM_MK3:
908 case SAA7134_BOARD_BEHOLD_607FM_MK5:
909 case SAA7134_BOARD_BEHOLD_609FM_MK3:
910 case SAA7134_BOARD_BEHOLD_609FM_MK5:
911 case SAA7134_BOARD_BEHOLD_607RDS_MK3:
912 case SAA7134_BOARD_BEHOLD_607RDS_MK5:
913 case SAA7134_BOARD_BEHOLD_609RDS_MK3:
914 case SAA7134_BOARD_BEHOLD_609RDS_MK5:
915 case SAA7134_BOARD_BEHOLD_M6:
916 case SAA7134_BOARD_BEHOLD_M63:
917 case SAA7134_BOARD_BEHOLD_M6_EXTRA:
918 case SAA7134_BOARD_BEHOLD_H6:
919 case SAA7134_BOARD_BEHOLD_X7:
920 case SAA7134_BOARD_BEHOLD_H7:
921 case SAA7134_BOARD_BEHOLD_A7:
922 dev->init_data.name = "BeholdTV";
923 dev->init_data.get_key = get_key_beholdm6xx;
924 dev->init_data.ir_codes = RC_MAP_BEHOLD;
925 dev->init_data.type = RC_TYPE_NEC;
926 info.addr = 0x2d;
927 break;
928 case SAA7134_BOARD_AVERMEDIA_CARDBUS_501:
929 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
930 info.addr = 0x40;
931 break;
932 case SAA7134_BOARD_FLYDVB_TRIO:
933 dev->init_data.name = "FlyDVB Trio";
934 dev->init_data.get_key = get_key_flydvb_trio;
935 dev->init_data.ir_codes = RC_MAP_FLYDVB;
936 info.addr = 0x0b;
937 break;
938 default:
939 dprintk("No I2C IR support for board %x\n", dev->board);
940 return;
941 }
942
943 if (dev->init_data.name)
944 info.platform_data = &dev->init_data;
945 i2c_new_device(&dev->i2c_adap, &info);
946}
947
948static int saa7134_raw_decode_irq(struct saa7134_dev *dev)
949{
950 struct saa7134_card_ir *ir = dev->remote;
951 unsigned long timeout;
952 int space;
953
954 /* Generate initial event */
955 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
956 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
957 space = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & ir->mask_keydown;
958 ir_raw_event_store_edge(dev->remote->dev, space ? IR_SPACE : IR_PULSE);
959
960 /*
961 * Wait 15 ms from the start of the first IR event before processing
962 * the event. This time is enough for NEC protocol. May need adjustments
963 * to work with other protocols.
964 */
965 if (!ir->active) {
966 timeout = jiffies + msecs_to_jiffies(15);
967 mod_timer(&ir->timer, timeout);
968 ir->active = true;
969 }
970
971 return 1;
972}
diff --git a/drivers/media/video/saa7134/saa7134-reg.h b/drivers/media/video/saa7134/saa7134-reg.h
new file mode 100644
index 00000000000..e7e0af101fa
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-reg.h
@@ -0,0 +1,378 @@
1/*
2 *
3 * philips saa7134 registers
4 */
5
6/* ------------------------------------------------------------------ */
7/*
8 * PCI ID's
9 */
10#ifndef PCI_DEVICE_ID_PHILIPS_SAA7130
11# define PCI_DEVICE_ID_PHILIPS_SAA7130 0x7130
12#endif
13#ifndef PCI_DEVICE_ID_PHILIPS_SAA7133
14# define PCI_DEVICE_ID_PHILIPS_SAA7133 0x7133
15#endif
16#ifndef PCI_DEVICE_ID_PHILIPS_SAA7134
17# define PCI_DEVICE_ID_PHILIPS_SAA7134 0x7134
18#endif
19#ifndef PCI_DEVICE_ID_PHILIPS_SAA7135
20# define PCI_DEVICE_ID_PHILIPS_SAA7135 0x7135
21#endif
22
23/* ------------------------------------------------------------------ */
24/*
25 * registers -- 32 bit
26 */
27
28/* DMA channels, n = 0 ... 6 */
29#define SAA7134_RS_BA1(n) ((0x200 >> 2) + 4*n)
30#define SAA7134_RS_BA2(n) ((0x204 >> 2) + 4*n)
31#define SAA7134_RS_PITCH(n) ((0x208 >> 2) + 4*n)
32#define SAA7134_RS_CONTROL(n) ((0x20c >> 2) + 4*n)
33#define SAA7134_RS_CONTROL_WSWAP (0x01 << 25)
34#define SAA7134_RS_CONTROL_BSWAP (0x01 << 24)
35#define SAA7134_RS_CONTROL_BURST_2 (0x01 << 21)
36#define SAA7134_RS_CONTROL_BURST_4 (0x02 << 21)
37#define SAA7134_RS_CONTROL_BURST_8 (0x03 << 21)
38#define SAA7134_RS_CONTROL_BURST_16 (0x04 << 21)
39#define SAA7134_RS_CONTROL_BURST_32 (0x05 << 21)
40#define SAA7134_RS_CONTROL_BURST_64 (0x06 << 21)
41#define SAA7134_RS_CONTROL_BURST_MAX (0x07 << 21)
42#define SAA7134_RS_CONTROL_ME (0x01 << 20)
43#define SAA7134_FIFO_SIZE (0x2a0 >> 2)
44#define SAA7134_THRESHOULD (0x2a4 >> 2)
45
46#define SAA7133_NUM_SAMPLES (0x588 >> 2)
47#define SAA7133_AUDIO_CHANNEL (0x58c >> 2)
48#define SAA7133_AUDIO_FORMAT (0x58f >> 2)
49#define SAA7133_DIGITAL_OUTPUT_SEL1 (0x46c >> 2)
50#define SAA7133_DIGITAL_OUTPUT_SEL2 (0x470 >> 2)
51#define SAA7133_DIGITAL_INPUT_XBAR1 (0x464 >> 2)
52#define SAA7133_ANALOG_IO_SELECT (0x594 >> 2)
53
54/* main control */
55#define SAA7134_MAIN_CTRL (0x2a8 >> 2)
56#define SAA7134_MAIN_CTRL_VPLLE (1 << 15)
57#define SAA7134_MAIN_CTRL_APLLE (1 << 14)
58#define SAA7134_MAIN_CTRL_EXOSC (1 << 13)
59#define SAA7134_MAIN_CTRL_EVFE1 (1 << 12)
60#define SAA7134_MAIN_CTRL_EVFE2 (1 << 11)
61#define SAA7134_MAIN_CTRL_ESFE (1 << 10)
62#define SAA7134_MAIN_CTRL_EBADC (1 << 9)
63#define SAA7134_MAIN_CTRL_EBDAC (1 << 8)
64#define SAA7134_MAIN_CTRL_TE6 (1 << 6)
65#define SAA7134_MAIN_CTRL_TE5 (1 << 5)
66#define SAA7134_MAIN_CTRL_TE4 (1 << 4)
67#define SAA7134_MAIN_CTRL_TE3 (1 << 3)
68#define SAA7134_MAIN_CTRL_TE2 (1 << 2)
69#define SAA7134_MAIN_CTRL_TE1 (1 << 1)
70#define SAA7134_MAIN_CTRL_TE0 (1 << 0)
71
72/* DMA status */
73#define SAA7134_DMA_STATUS (0x2ac >> 2)
74
75/* audio / video status */
76#define SAA7134_AV_STATUS (0x2c0 >> 2)
77#define SAA7134_AV_STATUS_STEREO (1 << 17)
78#define SAA7134_AV_STATUS_DUAL (1 << 16)
79#define SAA7134_AV_STATUS_PILOT (1 << 15)
80#define SAA7134_AV_STATUS_SMB (1 << 14)
81#define SAA7134_AV_STATUS_DMB (1 << 13)
82#define SAA7134_AV_STATUS_VDSP (1 << 12)
83#define SAA7134_AV_STATUS_IIC_STATUS (3 << 10)
84#define SAA7134_AV_STATUS_MVM (7 << 7)
85#define SAA7134_AV_STATUS_FIDT (1 << 6)
86#define SAA7134_AV_STATUS_INTL (1 << 5)
87#define SAA7134_AV_STATUS_RDCAP (1 << 4)
88#define SAA7134_AV_STATUS_PWR_ON (1 << 3)
89#define SAA7134_AV_STATUS_LOAD_ERR (1 << 2)
90#define SAA7134_AV_STATUS_TRIG_ERR (1 << 1)
91#define SAA7134_AV_STATUS_CONF_ERR (1 << 0)
92
93/* interrupt */
94#define SAA7134_IRQ1 (0x2c4 >> 2)
95#define SAA7134_IRQ1_INTE_RA3_1 (1 << 25)
96#define SAA7134_IRQ1_INTE_RA3_0 (1 << 24)
97#define SAA7134_IRQ1_INTE_RA2_3 (1 << 19)
98#define SAA7134_IRQ1_INTE_RA2_2 (1 << 18)
99#define SAA7134_IRQ1_INTE_RA2_1 (1 << 17)
100#define SAA7134_IRQ1_INTE_RA2_0 (1 << 16)
101#define SAA7134_IRQ1_INTE_RA1_3 (1 << 11)
102#define SAA7134_IRQ1_INTE_RA1_2 (1 << 10)
103#define SAA7134_IRQ1_INTE_RA1_1 (1 << 9)
104#define SAA7134_IRQ1_INTE_RA1_0 (1 << 8)
105#define SAA7134_IRQ1_INTE_RA0_7 (1 << 7)
106#define SAA7134_IRQ1_INTE_RA0_6 (1 << 6)
107#define SAA7134_IRQ1_INTE_RA0_5 (1 << 5)
108#define SAA7134_IRQ1_INTE_RA0_4 (1 << 4)
109#define SAA7134_IRQ1_INTE_RA0_3 (1 << 3)
110#define SAA7134_IRQ1_INTE_RA0_2 (1 << 2)
111#define SAA7134_IRQ1_INTE_RA0_1 (1 << 1)
112#define SAA7134_IRQ1_INTE_RA0_0 (1 << 0)
113
114#define SAA7134_IRQ2 (0x2c8 >> 2)
115#define SAA7134_IRQ2_INTE_GPIO23_N (1 << 17) /* negative edge */
116#define SAA7134_IRQ2_INTE_GPIO23_P (1 << 16) /* positive edge */
117#define SAA7134_IRQ2_INTE_GPIO22_N (1 << 15) /* negative edge */
118#define SAA7134_IRQ2_INTE_GPIO22_P (1 << 14) /* positive edge */
119#define SAA7134_IRQ2_INTE_GPIO18_N (1 << 13) /* negative edge */
120#define SAA7134_IRQ2_INTE_GPIO18_P (1 << 12) /* positive edge */
121#define SAA7134_IRQ2_INTE_GPIO16_N (1 << 11) /* negative edge */
122#define SAA7134_IRQ2_INTE_GPIO16_P (1 << 10) /* positive edge */
123#define SAA7134_IRQ2_INTE_SC2 (1 << 9)
124#define SAA7134_IRQ2_INTE_SC1 (1 << 8)
125#define SAA7134_IRQ2_INTE_SC0 (1 << 7)
126#define SAA7134_IRQ2_INTE_DEC4 (1 << 6)
127#define SAA7134_IRQ2_INTE_DEC3 (1 << 5)
128#define SAA7134_IRQ2_INTE_DEC2 (1 << 4)
129#define SAA7134_IRQ2_INTE_DEC1 (1 << 3)
130#define SAA7134_IRQ2_INTE_DEC0 (1 << 2)
131#define SAA7134_IRQ2_INTE_PE (1 << 1)
132#define SAA7134_IRQ2_INTE_AR (1 << 0)
133
134#define SAA7134_IRQ_REPORT (0x2cc >> 2)
135#define SAA7134_IRQ_REPORT_GPIO23 (1 << 17)
136#define SAA7134_IRQ_REPORT_GPIO22 (1 << 16)
137#define SAA7134_IRQ_REPORT_GPIO18 (1 << 15)
138#define SAA7134_IRQ_REPORT_GPIO16 (1 << 14)
139#define SAA7134_IRQ_REPORT_LOAD_ERR (1 << 13)
140#define SAA7134_IRQ_REPORT_CONF_ERR (1 << 12)
141#define SAA7134_IRQ_REPORT_TRIG_ERR (1 << 11)
142#define SAA7134_IRQ_REPORT_MMC (1 << 10)
143#define SAA7134_IRQ_REPORT_FIDT (1 << 9)
144#define SAA7134_IRQ_REPORT_INTL (1 << 8)
145#define SAA7134_IRQ_REPORT_RDCAP (1 << 7)
146#define SAA7134_IRQ_REPORT_PWR_ON (1 << 6)
147#define SAA7134_IRQ_REPORT_PE (1 << 5)
148#define SAA7134_IRQ_REPORT_AR (1 << 4)
149#define SAA7134_IRQ_REPORT_DONE_RA3 (1 << 3)
150#define SAA7134_IRQ_REPORT_DONE_RA2 (1 << 2)
151#define SAA7134_IRQ_REPORT_DONE_RA1 (1 << 1)
152#define SAA7134_IRQ_REPORT_DONE_RA0 (1 << 0)
153#define SAA7134_IRQ_STATUS (0x2d0 >> 2)
154
155
156/* ------------------------------------------------------------------ */
157/*
158 * registers -- 8 bit
159 */
160
161/* video decoder */
162#define SAA7134_INCR_DELAY 0x101
163#define SAA7134_ANALOG_IN_CTRL1 0x102
164#define SAA7134_ANALOG_IN_CTRL2 0x103
165#define SAA7134_ANALOG_IN_CTRL3 0x104
166#define SAA7134_ANALOG_IN_CTRL4 0x105
167#define SAA7134_HSYNC_START 0x106
168#define SAA7134_HSYNC_STOP 0x107
169#define SAA7134_SYNC_CTRL 0x108
170#define SAA7134_LUMA_CTRL 0x109
171#define SAA7134_DEC_LUMA_BRIGHT 0x10a
172#define SAA7134_DEC_LUMA_CONTRAST 0x10b
173#define SAA7134_DEC_CHROMA_SATURATION 0x10c
174#define SAA7134_DEC_CHROMA_HUE 0x10d
175#define SAA7134_CHROMA_CTRL1 0x10e
176#define SAA7134_CHROMA_GAIN 0x10f
177#define SAA7134_CHROMA_CTRL2 0x110
178#define SAA7134_MODE_DELAY_CTRL 0x111
179
180#define SAA7134_ANALOG_ADC 0x114
181#define SAA7134_VGATE_START 0x115
182#define SAA7134_VGATE_STOP 0x116
183#define SAA7134_MISC_VGATE_MSB 0x117
184#define SAA7134_RAW_DATA_GAIN 0x118
185#define SAA7134_RAW_DATA_OFFSET 0x119
186#define SAA7134_STATUS_VIDEO1 0x11e
187#define SAA7134_STATUS_VIDEO2 0x11f
188
189/* video scaler */
190#define SAA7134_SOURCE_TIMING1 0x000
191#define SAA7134_SOURCE_TIMING2 0x001
192#define SAA7134_REGION_ENABLE 0x004
193#define SAA7134_SCALER_STATUS0 0x006
194#define SAA7134_SCALER_STATUS1 0x007
195#define SAA7134_START_GREEN 0x00c
196#define SAA7134_START_BLUE 0x00d
197#define SAA7134_START_RED 0x00e
198#define SAA7134_GREEN_PATH(x) (0x010 +x)
199#define SAA7134_BLUE_PATH(x) (0x020 +x)
200#define SAA7134_RED_PATH(x) (0x030 +x)
201
202#define TASK_A 0x040
203#define TASK_B 0x080
204#define SAA7134_TASK_CONDITIONS(t) (0x000 +t)
205#define SAA7134_FIELD_HANDLING(t) (0x001 +t)
206#define SAA7134_DATA_PATH(t) (0x002 +t)
207#define SAA7134_VBI_H_START1(t) (0x004 +t)
208#define SAA7134_VBI_H_START2(t) (0x005 +t)
209#define SAA7134_VBI_H_STOP1(t) (0x006 +t)
210#define SAA7134_VBI_H_STOP2(t) (0x007 +t)
211#define SAA7134_VBI_V_START1(t) (0x008 +t)
212#define SAA7134_VBI_V_START2(t) (0x009 +t)
213#define SAA7134_VBI_V_STOP1(t) (0x00a +t)
214#define SAA7134_VBI_V_STOP2(t) (0x00b +t)
215#define SAA7134_VBI_H_LEN1(t) (0x00c +t)
216#define SAA7134_VBI_H_LEN2(t) (0x00d +t)
217#define SAA7134_VBI_V_LEN1(t) (0x00e +t)
218#define SAA7134_VBI_V_LEN2(t) (0x00f +t)
219
220#define SAA7134_VIDEO_H_START1(t) (0x014 +t)
221#define SAA7134_VIDEO_H_START2(t) (0x015 +t)
222#define SAA7134_VIDEO_H_STOP1(t) (0x016 +t)
223#define SAA7134_VIDEO_H_STOP2(t) (0x017 +t)
224#define SAA7134_VIDEO_V_START1(t) (0x018 +t)
225#define SAA7134_VIDEO_V_START2(t) (0x019 +t)
226#define SAA7134_VIDEO_V_STOP1(t) (0x01a +t)
227#define SAA7134_VIDEO_V_STOP2(t) (0x01b +t)
228#define SAA7134_VIDEO_PIXELS1(t) (0x01c +t)
229#define SAA7134_VIDEO_PIXELS2(t) (0x01d +t)
230#define SAA7134_VIDEO_LINES1(t) (0x01e +t)
231#define SAA7134_VIDEO_LINES2(t) (0x01f +t)
232
233#define SAA7134_H_PRESCALE(t) (0x020 +t)
234#define SAA7134_ACC_LENGTH(t) (0x021 +t)
235#define SAA7134_LEVEL_CTRL(t) (0x022 +t)
236#define SAA7134_FIR_PREFILTER_CTRL(t) (0x023 +t)
237#define SAA7134_LUMA_BRIGHT(t) (0x024 +t)
238#define SAA7134_LUMA_CONTRAST(t) (0x025 +t)
239#define SAA7134_CHROMA_SATURATION(t) (0x026 +t)
240#define SAA7134_VBI_H_SCALE_INC1(t) (0x028 +t)
241#define SAA7134_VBI_H_SCALE_INC2(t) (0x029 +t)
242#define SAA7134_VBI_PHASE_OFFSET_LUMA(t) (0x02a +t)
243#define SAA7134_VBI_PHASE_OFFSET_CHROMA(t) (0x02b +t)
244#define SAA7134_H_SCALE_INC1(t) (0x02c +t)
245#define SAA7134_H_SCALE_INC2(t) (0x02d +t)
246#define SAA7134_H_PHASE_OFF_LUMA(t) (0x02e +t)
247#define SAA7134_H_PHASE_OFF_CHROMA(t) (0x02f +t)
248#define SAA7134_V_SCALE_RATIO1(t) (0x030 +t)
249#define SAA7134_V_SCALE_RATIO2(t) (0x031 +t)
250#define SAA7134_V_FILTER(t) (0x032 +t)
251#define SAA7134_V_PHASE_OFFSET0(t) (0x034 +t)
252#define SAA7134_V_PHASE_OFFSET1(t) (0x035 +t)
253#define SAA7134_V_PHASE_OFFSET2(t) (0x036 +t)
254#define SAA7134_V_PHASE_OFFSET3(t) (0x037 +t)
255
256/* clipping & dma */
257#define SAA7134_OFMT_VIDEO_A 0x300
258#define SAA7134_OFMT_DATA_A 0x301
259#define SAA7134_OFMT_VIDEO_B 0x302
260#define SAA7134_OFMT_DATA_B 0x303
261#define SAA7134_ALPHA_NOCLIP 0x304
262#define SAA7134_ALPHA_CLIP 0x305
263#define SAA7134_UV_PIXEL 0x308
264#define SAA7134_CLIP_RED 0x309
265#define SAA7134_CLIP_GREEN 0x30a
266#define SAA7134_CLIP_BLUE 0x30b
267
268/* i2c bus */
269#define SAA7134_I2C_ATTR_STATUS 0x180
270#define SAA7134_I2C_DATA 0x181
271#define SAA7134_I2C_CLOCK_SELECT 0x182
272#define SAA7134_I2C_TIMER 0x183
273
274/* audio */
275#define SAA7134_NICAM_ADD_DATA1 0x140
276#define SAA7134_NICAM_ADD_DATA2 0x141
277#define SAA7134_NICAM_STATUS 0x142
278#define SAA7134_AUDIO_STATUS 0x143
279#define SAA7134_NICAM_ERROR_COUNT 0x144
280#define SAA7134_IDENT_SIF 0x145
281#define SAA7134_LEVEL_READOUT1 0x146
282#define SAA7134_LEVEL_READOUT2 0x147
283#define SAA7134_NICAM_ERROR_LOW 0x148
284#define SAA7134_NICAM_ERROR_HIGH 0x149
285#define SAA7134_DCXO_IDENT_CTRL 0x14a
286#define SAA7134_DEMODULATOR 0x14b
287#define SAA7134_AGC_GAIN_SELECT 0x14c
288#define SAA7134_CARRIER1_FREQ0 0x150
289#define SAA7134_CARRIER1_FREQ1 0x151
290#define SAA7134_CARRIER1_FREQ2 0x152
291#define SAA7134_CARRIER2_FREQ0 0x154
292#define SAA7134_CARRIER2_FREQ1 0x155
293#define SAA7134_CARRIER2_FREQ2 0x156
294#define SAA7134_NUM_SAMPLES0 0x158
295#define SAA7134_NUM_SAMPLES1 0x159
296#define SAA7134_NUM_SAMPLES2 0x15a
297#define SAA7134_AUDIO_FORMAT_CTRL 0x15b
298#define SAA7134_MONITOR_SELECT 0x160
299#define SAA7134_FM_DEEMPHASIS 0x161
300#define SAA7134_FM_DEMATRIX 0x162
301#define SAA7134_CHANNEL1_LEVEL 0x163
302#define SAA7134_CHANNEL2_LEVEL 0x164
303#define SAA7134_NICAM_CONFIG 0x165
304#define SAA7134_NICAM_LEVEL_ADJUST 0x166
305#define SAA7134_STEREO_DAC_OUTPUT_SELECT 0x167
306#define SAA7134_I2S_OUTPUT_FORMAT 0x168
307#define SAA7134_I2S_OUTPUT_SELECT 0x169
308#define SAA7134_I2S_OUTPUT_LEVEL 0x16a
309#define SAA7134_DSP_OUTPUT_SELECT 0x16b
310#define SAA7134_AUDIO_MUTE_CTRL 0x16c
311#define SAA7134_SIF_SAMPLE_FREQ 0x16d
312#define SAA7134_ANALOG_IO_SELECT 0x16e
313#define SAA7134_AUDIO_CLOCK0 0x170
314#define SAA7134_AUDIO_CLOCK1 0x171
315#define SAA7134_AUDIO_CLOCK2 0x172
316#define SAA7134_AUDIO_PLL_CTRL 0x173
317#define SAA7134_AUDIO_CLOCKS_PER_FIELD0 0x174
318#define SAA7134_AUDIO_CLOCKS_PER_FIELD1 0x175
319#define SAA7134_AUDIO_CLOCKS_PER_FIELD2 0x176
320
321/* video port output */
322#define SAA7134_VIDEO_PORT_CTRL0 0x190
323#define SAA7134_VIDEO_PORT_CTRL1 0x191
324#define SAA7134_VIDEO_PORT_CTRL2 0x192
325#define SAA7134_VIDEO_PORT_CTRL3 0x193
326#define SAA7134_VIDEO_PORT_CTRL4 0x194
327#define SAA7134_VIDEO_PORT_CTRL5 0x195
328#define SAA7134_VIDEO_PORT_CTRL6 0x196
329#define SAA7134_VIDEO_PORT_CTRL7 0x197
330#define SAA7134_VIDEO_PORT_CTRL8 0x198
331
332/* transport stream interface */
333#define SAA7134_TS_PARALLEL 0x1a0
334#define SAA7134_TS_PARALLEL_SERIAL 0x1a1
335#define SAA7134_TS_SERIAL0 0x1a2
336#define SAA7134_TS_SERIAL1 0x1a3
337#define SAA7134_TS_DMA0 0x1a4
338#define SAA7134_TS_DMA1 0x1a5
339#define SAA7134_TS_DMA2 0x1a6
340
341/* GPIO Controls */
342#define SAA7134_GPIO_GPRESCAN 0x80
343#define SAA7134_GPIO_27_25 0x0E
344
345#define SAA7134_GPIO_GPMODE0 0x1B0
346#define SAA7134_GPIO_GPMODE1 0x1B1
347#define SAA7134_GPIO_GPMODE2 0x1B2
348#define SAA7134_GPIO_GPMODE3 0x1B3
349#define SAA7134_GPIO_GPSTATUS0 0x1B4
350#define SAA7134_GPIO_GPSTATUS1 0x1B5
351#define SAA7134_GPIO_GPSTATUS2 0x1B6
352#define SAA7134_GPIO_GPSTATUS3 0x1B7
353
354/* I2S output */
355#define SAA7134_I2S_AUDIO_OUTPUT 0x1c0
356
357/* test modes */
358#define SAA7134_SPECIAL_MODE 0x1d0
359#define SAA7134_PRODUCTION_TEST_MODE 0x1d1
360
361/* audio -- saa7133 + saa7135 only */
362#define SAA7135_DSP_RWSTATE 0x580
363#define SAA7135_DSP_RWSTATE_ERR (1 << 3)
364#define SAA7135_DSP_RWSTATE_IDA (1 << 2)
365#define SAA7135_DSP_RWSTATE_RDB (1 << 1)
366#define SAA7135_DSP_RWSTATE_WRR (1 << 0)
367
368#define SAA7135_DSP_RWCLEAR 0x586
369#define SAA7135_DSP_RWCLEAR_RERR 1
370
371#define SAA7133_I2S_AUDIO_CONTROL 0x591
372/* ------------------------------------------------------------------ */
373/*
374 * Local variables:
375 * c-basic-offset: 8
376 * End:
377 */
378
diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c
new file mode 100644
index 00000000000..2e3f4b412d8
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-ts.c
@@ -0,0 +1,327 @@
1/*
2 *
3 * device driver for philips saa7134 based TV cards
4 * video4linux video interface
5 *
6 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/list.h>
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/delay.h>
28
29#include "saa7134-reg.h"
30#include "saa7134.h"
31
32/* ------------------------------------------------------------------ */
33
34static unsigned int ts_debug;
35module_param(ts_debug, int, 0644);
36MODULE_PARM_DESC(ts_debug,"enable debug messages [ts]");
37
38#define dprintk(fmt, arg...) if (ts_debug) \
39 printk(KERN_DEBUG "%s/ts: " fmt, dev->name , ## arg)
40
41/* ------------------------------------------------------------------ */
42
43static int buffer_activate(struct saa7134_dev *dev,
44 struct saa7134_buf *buf,
45 struct saa7134_buf *next)
46{
47
48 dprintk("buffer_activate [%p]",buf);
49 buf->vb.state = VIDEOBUF_ACTIVE;
50 buf->top_seen = 0;
51
52 if (NULL == next)
53 next = buf;
54 if (V4L2_FIELD_TOP == buf->vb.field) {
55 dprintk("- [top] buf=%p next=%p\n",buf,next);
56 saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(buf));
57 saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(next));
58 } else {
59 dprintk("- [bottom] buf=%p next=%p\n",buf,next);
60 saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(next));
61 saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(buf));
62 }
63
64 /* start DMA */
65 saa7134_set_dmabits(dev);
66
67 mod_timer(&dev->ts_q.timeout, jiffies+TS_BUFFER_TIMEOUT);
68
69 if (!dev->ts_started)
70 saa7134_ts_start(dev);
71
72 return 0;
73}
74
75static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
76 enum v4l2_field field)
77{
78 struct saa7134_dev *dev = q->priv_data;
79 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
80 unsigned int lines, llength, size;
81 int err;
82
83 dprintk("buffer_prepare [%p,%s]\n",buf,v4l2_field_names[field]);
84
85 llength = TS_PACKET_SIZE;
86 lines = dev->ts.nr_packets;
87
88 size = lines * llength;
89 if (0 != buf->vb.baddr && buf->vb.bsize < size)
90 return -EINVAL;
91
92 if (buf->vb.size != size) {
93 saa7134_dma_free(q,buf);
94 }
95
96 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
97
98 struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
99
100 dprintk("buffer_prepare: needs_init\n");
101
102 buf->vb.width = llength;
103 buf->vb.height = lines;
104 buf->vb.size = size;
105 buf->pt = &dev->ts.pt_ts;
106
107 err = videobuf_iolock(q,&buf->vb,NULL);
108 if (err)
109 goto oops;
110 err = saa7134_pgtable_build(dev->pci,buf->pt,
111 dma->sglist,
112 dma->sglen,
113 saa7134_buffer_startpage(buf));
114 if (err)
115 goto oops;
116 }
117
118 buf->vb.state = VIDEOBUF_PREPARED;
119 buf->activate = buffer_activate;
120 buf->vb.field = field;
121 return 0;
122
123 oops:
124 saa7134_dma_free(q,buf);
125 return err;
126}
127
128static int
129buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
130{
131 struct saa7134_dev *dev = q->priv_data;
132
133 *size = TS_PACKET_SIZE * dev->ts.nr_packets;
134 if (0 == *count)
135 *count = dev->ts.nr_bufs;
136 *count = saa7134_buffer_count(*size,*count);
137
138 return 0;
139}
140
141static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
142{
143 struct saa7134_dev *dev = q->priv_data;
144 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
145
146 saa7134_buffer_queue(dev,&dev->ts_q,buf);
147}
148
149static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
150{
151 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
152 struct saa7134_dev *dev = q->priv_data;
153
154 if (dev->ts_started)
155 saa7134_ts_stop(dev);
156
157 saa7134_dma_free(q,buf);
158}
159
160struct videobuf_queue_ops saa7134_ts_qops = {
161 .buf_setup = buffer_setup,
162 .buf_prepare = buffer_prepare,
163 .buf_queue = buffer_queue,
164 .buf_release = buffer_release,
165};
166EXPORT_SYMBOL_GPL(saa7134_ts_qops);
167
168/* ----------------------------------------------------------- */
169/* exported stuff */
170
171static unsigned int tsbufs = 8;
172module_param(tsbufs, int, 0444);
173MODULE_PARM_DESC(tsbufs, "number of ts buffers for read/write IO, range 2-32");
174
175static unsigned int ts_nr_packets = 64;
176module_param(ts_nr_packets, int, 0444);
177MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)");
178
179int saa7134_ts_init_hw(struct saa7134_dev *dev)
180{
181 /* deactivate TS softreset */
182 saa_writeb(SAA7134_TS_SERIAL1, 0x00);
183 /* TSSOP high active, TSVAL high active, TSLOCK ignored */
184 saa_writeb(SAA7134_TS_PARALLEL, 0x6c);
185 saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1));
186 saa_writeb(SAA7134_TS_DMA0, ((dev->ts.nr_packets-1)&0xff));
187 saa_writeb(SAA7134_TS_DMA1, (((dev->ts.nr_packets-1)>>8)&0xff));
188 /* TSNOPIT=0, TSCOLAP=0 */
189 saa_writeb(SAA7134_TS_DMA2,
190 ((((dev->ts.nr_packets-1)>>16)&0x3f) | 0x00));
191
192 return 0;
193}
194
195int saa7134_ts_init1(struct saa7134_dev *dev)
196{
197 /* sanitycheck insmod options */
198 if (tsbufs < 2)
199 tsbufs = 2;
200 if (tsbufs > VIDEO_MAX_FRAME)
201 tsbufs = VIDEO_MAX_FRAME;
202 if (ts_nr_packets < 4)
203 ts_nr_packets = 4;
204 if (ts_nr_packets > 312)
205 ts_nr_packets = 312;
206 dev->ts.nr_bufs = tsbufs;
207 dev->ts.nr_packets = ts_nr_packets;
208
209 INIT_LIST_HEAD(&dev->ts_q.queue);
210 init_timer(&dev->ts_q.timeout);
211 dev->ts_q.timeout.function = saa7134_buffer_timeout;
212 dev->ts_q.timeout.data = (unsigned long)(&dev->ts_q);
213 dev->ts_q.dev = dev;
214 dev->ts_q.need_two = 1;
215 dev->ts_started = 0;
216 saa7134_pgtable_alloc(dev->pci,&dev->ts.pt_ts);
217
218 /* init TS hw */
219 saa7134_ts_init_hw(dev);
220
221 return 0;
222}
223
224/* Function for stop TS */
225int saa7134_ts_stop(struct saa7134_dev *dev)
226{
227 dprintk("TS stop\n");
228
229 BUG_ON(!dev->ts_started);
230
231 /* Stop TS stream */
232 switch (saa7134_boards[dev->board].ts_type) {
233 case SAA7134_MPEG_TS_PARALLEL:
234 saa_writeb(SAA7134_TS_PARALLEL, 0x6c);
235 dev->ts_started = 0;
236 break;
237 case SAA7134_MPEG_TS_SERIAL:
238 saa_writeb(SAA7134_TS_SERIAL0, 0x40);
239 dev->ts_started = 0;
240 break;
241 }
242 return 0;
243}
244
245/* Function for start TS */
246int saa7134_ts_start(struct saa7134_dev *dev)
247{
248 dprintk("TS start\n");
249
250 BUG_ON(dev->ts_started);
251
252 /* dma: setup channel 5 (= TS) */
253 saa_writeb(SAA7134_TS_DMA0, (dev->ts.nr_packets - 1) & 0xff);
254 saa_writeb(SAA7134_TS_DMA1,
255 ((dev->ts.nr_packets - 1) >> 8) & 0xff);
256 /* TSNOPIT=0, TSCOLAP=0 */
257 saa_writeb(SAA7134_TS_DMA2,
258 (((dev->ts.nr_packets - 1) >> 16) & 0x3f) | 0x00);
259 saa_writel(SAA7134_RS_PITCH(5), TS_PACKET_SIZE);
260 saa_writel(SAA7134_RS_CONTROL(5), SAA7134_RS_CONTROL_BURST_16 |
261 SAA7134_RS_CONTROL_ME |
262 (dev->ts.pt_ts.dma >> 12));
263
264 /* reset hardware TS buffers */
265 saa_writeb(SAA7134_TS_SERIAL1, 0x00);
266 saa_writeb(SAA7134_TS_SERIAL1, 0x03);
267 saa_writeb(SAA7134_TS_SERIAL1, 0x00);
268 saa_writeb(SAA7134_TS_SERIAL1, 0x01);
269
270 /* TS clock non-inverted */
271 saa_writeb(SAA7134_TS_SERIAL1, 0x00);
272
273 /* Start TS stream */
274 switch (saa7134_boards[dev->board].ts_type) {
275 case SAA7134_MPEG_TS_PARALLEL:
276 saa_writeb(SAA7134_TS_SERIAL0, 0x40);
277 saa_writeb(SAA7134_TS_PARALLEL, 0xec |
278 (saa7134_boards[dev->board].ts_force_val << 4));
279 break;
280 case SAA7134_MPEG_TS_SERIAL:
281 saa_writeb(SAA7134_TS_SERIAL0, 0xd8);
282 saa_writeb(SAA7134_TS_PARALLEL, 0x6c |
283 (saa7134_boards[dev->board].ts_force_val << 4));
284 saa_writeb(SAA7134_TS_PARALLEL_SERIAL, 0xbc);
285 saa_writeb(SAA7134_TS_SERIAL1, 0x02);
286 break;
287 }
288
289 dev->ts_started = 1;
290
291 return 0;
292}
293
294int saa7134_ts_fini(struct saa7134_dev *dev)
295{
296 saa7134_pgtable_free(dev->pci,&dev->ts.pt_ts);
297 return 0;
298}
299
300void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status)
301{
302 enum v4l2_field field;
303
304 spin_lock(&dev->slock);
305 if (dev->ts_q.curr) {
306 field = dev->ts_q.curr->vb.field;
307 if (field == V4L2_FIELD_TOP) {
308 if ((status & 0x100000) != 0x000000)
309 goto done;
310 } else {
311 if ((status & 0x100000) != 0x100000)
312 goto done;
313 }
314 saa7134_buffer_finish(dev,&dev->ts_q,VIDEOBUF_DONE);
315 }
316 saa7134_buffer_next(dev,&dev->ts_q);
317
318 done:
319 spin_unlock(&dev->slock);
320}
321
322/* ----------------------------------------------------------- */
323/*
324 * Local variables:
325 * c-basic-offset: 8
326 * End:
327 */
diff --git a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c
new file mode 100644
index 00000000000..57e646bb48b
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-tvaudio.c
@@ -0,0 +1,1076 @@
1/*
2 *
3 * device driver for philips saa7134 based TV cards
4 * tv audio decoder (fm stereo, nicam, ...)
5 *
6 * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/list.h>
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/kthread.h>
28#include <linux/delay.h>
29#include <linux/freezer.h>
30#include <asm/div64.h>
31
32#include "saa7134-reg.h"
33#include "saa7134.h"
34
35/* ------------------------------------------------------------------ */
36
37static unsigned int audio_debug;
38module_param(audio_debug, int, 0644);
39MODULE_PARM_DESC(audio_debug,"enable debug messages [tv audio]");
40
41static unsigned int audio_ddep;
42module_param(audio_ddep, int, 0644);
43MODULE_PARM_DESC(audio_ddep,"audio ddep overwrite");
44
45static int audio_clock_override = UNSET;
46module_param(audio_clock_override, int, 0644);
47
48static int audio_clock_tweak;
49module_param(audio_clock_tweak, int, 0644);
50MODULE_PARM_DESC(audio_clock_tweak, "Audio clock tick fine tuning for cards with audio crystal that's slightly off (range [-1024 .. 1024])");
51
52#define dprintk(fmt, arg...) if (audio_debug) \
53 printk(KERN_DEBUG "%s/audio: " fmt, dev->name , ## arg)
54#define d2printk(fmt, arg...) if (audio_debug > 1) \
55 printk(KERN_DEBUG "%s/audio: " fmt, dev->name, ## arg)
56
57#define print_regb(reg) printk("%s: reg 0x%03x [%-16s]: 0x%02x\n", \
58 dev->name,(SAA7134_##reg),(#reg),saa_readb((SAA7134_##reg)))
59
60/* msecs */
61#define SCAN_INITIAL_DELAY 1000
62#define SCAN_SAMPLE_DELAY 200
63#define SCAN_SUBCARRIER_DELAY 2000
64
65/* ------------------------------------------------------------------ */
66/* saa7134 code */
67
68static struct mainscan {
69 char *name;
70 v4l2_std_id std;
71 int carr;
72} mainscan[] = {
73 {
74 .name = "MN",
75 .std = V4L2_STD_MN,
76 .carr = 4500,
77 },{
78 .name = "BGH",
79 .std = V4L2_STD_B | V4L2_STD_GH,
80 .carr = 5500,
81 },{
82 .name = "I",
83 .std = V4L2_STD_PAL_I,
84 .carr = 6000,
85 },{
86 .name = "DKL",
87 .std = V4L2_STD_DK | V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC,
88 .carr = 6500,
89 }
90};
91
92static struct saa7134_tvaudio tvaudio[] = {
93 {
94 .name = "PAL-B/G FM-stereo",
95 .std = V4L2_STD_PAL_BG,
96 .mode = TVAUDIO_FM_BG_STEREO,
97 .carr1 = 5500,
98 .carr2 = 5742,
99 },{
100 .name = "PAL-D/K1 FM-stereo",
101 .std = V4L2_STD_PAL_DK,
102 .carr1 = 6500,
103 .carr2 = 6258,
104 .mode = TVAUDIO_FM_BG_STEREO,
105 },{
106 .name = "PAL-D/K2 FM-stereo",
107 .std = V4L2_STD_PAL_DK,
108 .carr1 = 6500,
109 .carr2 = 6742,
110 .mode = TVAUDIO_FM_BG_STEREO,
111 },{
112 .name = "PAL-D/K3 FM-stereo",
113 .std = V4L2_STD_PAL_DK,
114 .carr1 = 6500,
115 .carr2 = 5742,
116 .mode = TVAUDIO_FM_BG_STEREO,
117 },{
118 .name = "PAL-B/G NICAM",
119 .std = V4L2_STD_PAL_BG,
120 .carr1 = 5500,
121 .carr2 = 5850,
122 .mode = TVAUDIO_NICAM_FM,
123 },{
124 .name = "PAL-I NICAM",
125 .std = V4L2_STD_PAL_I,
126 .carr1 = 6000,
127 .carr2 = 6552,
128 .mode = TVAUDIO_NICAM_FM,
129 },{
130 .name = "PAL-D/K NICAM",
131 .std = V4L2_STD_PAL_DK,
132 .carr1 = 6500,
133 .carr2 = 5850,
134 .mode = TVAUDIO_NICAM_FM,
135 },{
136 .name = "SECAM-L NICAM",
137 .std = V4L2_STD_SECAM_L,
138 .carr1 = 6500,
139 .carr2 = 5850,
140 .mode = TVAUDIO_NICAM_AM,
141 },{
142 .name = "SECAM-D/K NICAM",
143 .std = V4L2_STD_SECAM_DK,
144 .carr1 = 6500,
145 .carr2 = 5850,
146 .mode = TVAUDIO_NICAM_FM,
147 },{
148 .name = "NTSC-A2 FM-stereo",
149 .std = V4L2_STD_NTSC,
150 .carr1 = 4500,
151 .carr2 = 4724,
152 .mode = TVAUDIO_FM_K_STEREO,
153 },{
154 .name = "NTSC-M",
155 .std = V4L2_STD_NTSC,
156 .carr1 = 4500,
157 .carr2 = -1,
158 .mode = TVAUDIO_FM_MONO,
159 }
160};
161#define TVAUDIO ARRAY_SIZE(tvaudio)
162
163/* ------------------------------------------------------------------ */
164
165static u32 tvaudio_carr2reg(u32 carrier)
166{
167 u64 a = carrier;
168
169 a <<= 24;
170 do_div(a,12288);
171 return a;
172}
173
174static void tvaudio_setcarrier(struct saa7134_dev *dev,
175 int primary, int secondary)
176{
177 if (-1 == secondary)
178 secondary = primary;
179 saa_writel(SAA7134_CARRIER1_FREQ0 >> 2, tvaudio_carr2reg(primary));
180 saa_writel(SAA7134_CARRIER2_FREQ0 >> 2, tvaudio_carr2reg(secondary));
181}
182
183#define SAA7134_MUTE_MASK 0xbb
184#define SAA7134_MUTE_ANALOG 0x04
185#define SAA7134_MUTE_I2S 0x40
186
187static void mute_input_7134(struct saa7134_dev *dev)
188{
189 unsigned int mute;
190 struct saa7134_input *in;
191 int ausel=0, ics=0, ocs=0;
192 int mask;
193
194 /* look what is to do ... */
195 in = dev->input;
196 mute = (dev->ctl_mute ||
197 (dev->automute && (&card(dev).radio) != in));
198 if (card(dev).mute.name) {
199 /*
200 * 7130 - we'll mute using some unconnected audio input
201 * 7134 - we'll probably should switch external mux with gpio
202 */
203 if (mute)
204 in = &card(dev).mute;
205 }
206
207 if (dev->hw_mute == mute &&
208 dev->hw_input == in && !dev->insuspend) {
209 dprintk("mute/input: nothing to do [mute=%d,input=%s]\n",
210 mute,in->name);
211 return;
212 }
213
214 dprintk("ctl_mute=%d automute=%d input=%s => mute=%d input=%s\n",
215 dev->ctl_mute,dev->automute,dev->input->name,mute,in->name);
216 dev->hw_mute = mute;
217 dev->hw_input = in;
218
219 if (PCI_DEVICE_ID_PHILIPS_SAA7134 == dev->pci->device)
220 /* 7134 mute */
221 saa_writeb(SAA7134_AUDIO_MUTE_CTRL, mute ?
222 SAA7134_MUTE_MASK |
223 SAA7134_MUTE_ANALOG |
224 SAA7134_MUTE_I2S :
225 SAA7134_MUTE_MASK);
226
227 /* switch internal audio mux */
228 switch (in->amux) {
229 case TV: ausel=0xc0; ics=0x00; ocs=0x02; break;
230 case LINE1: ausel=0x80; ics=0x00; ocs=0x00; break;
231 case LINE2: ausel=0x80; ics=0x08; ocs=0x01; break;
232 case LINE2_LEFT: ausel=0x80; ics=0x08; ocs=0x05; break;
233 }
234 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, ausel);
235 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, ics);
236 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, ocs);
237 // for oss, we need to change the clock configuration
238 if (in->amux == TV)
239 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x00);
240 else
241 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x01);
242
243 /* switch gpio-connected external audio mux */
244 if (0 == card(dev).gpiomask)
245 return;
246
247 mask = card(dev).gpiomask;
248 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, mask, mask);
249 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, in->gpio);
250 saa7134_track_gpio(dev,in->name);
251}
252
253static void tvaudio_setmode(struct saa7134_dev *dev,
254 struct saa7134_tvaudio *audio,
255 char *note)
256{
257 int acpf, tweak = 0;
258
259 if (dev->tvnorm->id == V4L2_STD_NTSC) {
260 acpf = 0x19066;
261 } else {
262 acpf = 0x1e000;
263 }
264 if (audio_clock_tweak > -1024 && audio_clock_tweak < 1024)
265 tweak = audio_clock_tweak;
266
267 if (note)
268 dprintk("tvaudio_setmode: %s %s [%d.%03d/%d.%03d MHz] acpf=%d%+d\n",
269 note,audio->name,
270 audio->carr1 / 1000, audio->carr1 % 1000,
271 audio->carr2 / 1000, audio->carr2 % 1000,
272 acpf, tweak);
273
274 acpf += tweak;
275 saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD0, (acpf & 0x0000ff) >> 0);
276 saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD1, (acpf & 0x00ff00) >> 8);
277 saa_writeb(SAA7134_AUDIO_CLOCKS_PER_FIELD2, (acpf & 0x030000) >> 16);
278 tvaudio_setcarrier(dev,audio->carr1,audio->carr2);
279
280 switch (audio->mode) {
281 case TVAUDIO_FM_MONO:
282 case TVAUDIO_FM_BG_STEREO:
283 saa_writeb(SAA7134_DEMODULATOR, 0x00);
284 saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x00);
285 saa_writeb(SAA7134_FM_DEEMPHASIS, 0x22);
286 saa_writeb(SAA7134_FM_DEMATRIX, 0x80);
287 saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa0);
288 break;
289 case TVAUDIO_FM_K_STEREO:
290 saa_writeb(SAA7134_DEMODULATOR, 0x00);
291 saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x01);
292 saa_writeb(SAA7134_FM_DEEMPHASIS, 0x22);
293 saa_writeb(SAA7134_FM_DEMATRIX, 0x80);
294 saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa0);
295 break;
296 case TVAUDIO_NICAM_FM:
297 saa_writeb(SAA7134_DEMODULATOR, 0x10);
298 saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x00);
299 saa_writeb(SAA7134_FM_DEEMPHASIS, 0x44);
300 saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa1);
301 saa_writeb(SAA7134_NICAM_CONFIG, 0x00);
302 break;
303 case TVAUDIO_NICAM_AM:
304 saa_writeb(SAA7134_DEMODULATOR, 0x12);
305 saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x00);
306 saa_writeb(SAA7134_FM_DEEMPHASIS, 0x44);
307 saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa1);
308 saa_writeb(SAA7134_NICAM_CONFIG, 0x00);
309 break;
310 case TVAUDIO_FM_SAT_STEREO:
311 /* not implemented (yet) */
312 break;
313 }
314}
315
316static int tvaudio_sleep(struct saa7134_dev *dev, int timeout)
317{
318 if (dev->thread.scan1 == dev->thread.scan2 &&
319 !kthread_should_stop()) {
320 if (timeout < 0) {
321 set_current_state(TASK_INTERRUPTIBLE);
322 schedule();
323 } else {
324 schedule_timeout_interruptible
325 (msecs_to_jiffies(timeout));
326 }
327 }
328 return dev->thread.scan1 != dev->thread.scan2;
329}
330
331static int tvaudio_checkcarrier(struct saa7134_dev *dev, struct mainscan *scan)
332{
333 __s32 left,right,value;
334
335 if (audio_debug > 1) {
336 int i;
337 dprintk("debug %d:",scan->carr);
338 for (i = -150; i <= 150; i += 30) {
339 tvaudio_setcarrier(dev,scan->carr+i,scan->carr+i);
340 saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
341 if (tvaudio_sleep(dev,SCAN_SAMPLE_DELAY))
342 return -1;
343 value = saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
344 if (0 == i)
345 printk(" # %6d # ",value >> 16);
346 else
347 printk(" %6d",value >> 16);
348 }
349 printk("\n");
350 }
351 if (dev->tvnorm->id & scan->std) {
352 tvaudio_setcarrier(dev,scan->carr-90,scan->carr-90);
353 saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
354 if (tvaudio_sleep(dev,SCAN_SAMPLE_DELAY))
355 return -1;
356 left = saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
357
358 tvaudio_setcarrier(dev,scan->carr+90,scan->carr+90);
359 saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
360 if (tvaudio_sleep(dev,SCAN_SAMPLE_DELAY))
361 return -1;
362 right = saa_readl(SAA7134_LEVEL_READOUT1 >> 2);
363
364 left >>= 16;
365 right >>= 16;
366 value = left > right ? left - right : right - left;
367 dprintk("scanning %d.%03d MHz [%4s] => dc is %5d [%d/%d]\n",
368 scan->carr / 1000, scan->carr % 1000,
369 scan->name, value, left, right);
370 } else {
371 value = 0;
372 dprintk("skipping %d.%03d MHz [%4s]\n",
373 scan->carr / 1000, scan->carr % 1000, scan->name);
374 }
375 return value;
376}
377
378
379static int tvaudio_getstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *audio)
380{
381 __u32 idp, nicam, nicam_status;
382 int retval = -1;
383
384 switch (audio->mode) {
385 case TVAUDIO_FM_MONO:
386 return V4L2_TUNER_SUB_MONO;
387 case TVAUDIO_FM_K_STEREO:
388 case TVAUDIO_FM_BG_STEREO:
389 idp = (saa_readb(SAA7134_IDENT_SIF) & 0xe0) >> 5;
390 dprintk("getstereo: fm/stereo: idp=0x%x\n",idp);
391 if (0x03 == (idp & 0x03))
392 retval = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
393 else if (0x05 == (idp & 0x05))
394 retval = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
395 else if (0x01 == (idp & 0x01))
396 retval = V4L2_TUNER_SUB_MONO;
397 break;
398 case TVAUDIO_FM_SAT_STEREO:
399 /* not implemented (yet) */
400 break;
401 case TVAUDIO_NICAM_FM:
402 case TVAUDIO_NICAM_AM:
403 nicam = saa_readb(SAA7134_AUDIO_STATUS);
404 dprintk("getstereo: nicam=0x%x\n",nicam);
405 if (nicam & 0x1) {
406 nicam_status = saa_readb(SAA7134_NICAM_STATUS);
407 dprintk("getstereo: nicam_status=0x%x\n", nicam_status);
408
409 switch (nicam_status & 0x03) {
410 case 0x01:
411 retval = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
412 break;
413 case 0x02:
414 retval = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
415 break;
416 default:
417 retval = V4L2_TUNER_SUB_MONO;
418 }
419 } else {
420 /* No nicam detected */
421 }
422 break;
423 }
424 if (retval != -1)
425 dprintk("found audio subchannels:%s%s%s%s\n",
426 (retval & V4L2_TUNER_SUB_MONO) ? " mono" : "",
427 (retval & V4L2_TUNER_SUB_STEREO) ? " stereo" : "",
428 (retval & V4L2_TUNER_SUB_LANG1) ? " lang1" : "",
429 (retval & V4L2_TUNER_SUB_LANG2) ? " lang2" : "");
430 return retval;
431}
432
433static int tvaudio_setstereo(struct saa7134_dev *dev, struct saa7134_tvaudio *audio,
434 u32 mode)
435{
436 static char *name[] = {
437 [ V4L2_TUNER_MODE_MONO ] = "mono",
438 [ V4L2_TUNER_MODE_STEREO ] = "stereo",
439 [ V4L2_TUNER_MODE_LANG1 ] = "lang1",
440 [ V4L2_TUNER_MODE_LANG2 ] = "lang2",
441 [ V4L2_TUNER_MODE_LANG1_LANG2 ] = "lang1+lang2",
442 };
443 static u32 fm[] = {
444 [ V4L2_TUNER_MODE_MONO ] = 0x00, /* ch1 */
445 [ V4L2_TUNER_MODE_STEREO ] = 0x80, /* auto */
446 [ V4L2_TUNER_MODE_LANG1 ] = 0x00, /* ch1 */
447 [ V4L2_TUNER_MODE_LANG2 ] = 0x01, /* ch2 */
448 [ V4L2_TUNER_MODE_LANG1_LANG2 ] = 0x80, /* auto */
449 };
450 u32 reg;
451
452 switch (audio->mode) {
453 case TVAUDIO_FM_MONO:
454 /* nothing to do ... */
455 break;
456 case TVAUDIO_FM_K_STEREO:
457 case TVAUDIO_FM_BG_STEREO:
458 case TVAUDIO_NICAM_AM:
459 case TVAUDIO_NICAM_FM:
460 dprintk("setstereo [fm] => %s\n",
461 name[ mode % ARRAY_SIZE(name) ]);
462 reg = fm[ mode % ARRAY_SIZE(fm) ];
463 saa_writeb(SAA7134_FM_DEMATRIX, reg);
464 break;
465 case TVAUDIO_FM_SAT_STEREO:
466 /* Not implemented */
467 break;
468 }
469 return 0;
470}
471
472static int tvaudio_thread(void *data)
473{
474 struct saa7134_dev *dev = data;
475 int carr_vals[ARRAY_SIZE(mainscan)];
476 unsigned int i, audio, nscan;
477 int max1,max2,carrier,rx,mode,lastmode,default_carrier;
478
479 set_freezable();
480
481 for (;;) {
482 tvaudio_sleep(dev,-1);
483 if (kthread_should_stop())
484 goto done;
485
486 restart:
487 try_to_freeze();
488
489 dev->thread.scan1 = dev->thread.scan2;
490 dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1);
491 dev->tvaudio = NULL;
492
493 saa_writeb(SAA7134_MONITOR_SELECT, 0xa0);
494 saa_writeb(SAA7134_FM_DEMATRIX, 0x80);
495
496 if (dev->ctl_automute)
497 dev->automute = 1;
498
499 mute_input_7134(dev);
500
501 /* give the tuner some time */
502 if (tvaudio_sleep(dev,SCAN_INITIAL_DELAY))
503 goto restart;
504
505 max1 = 0;
506 max2 = 0;
507 nscan = 0;
508 carrier = 0;
509 default_carrier = 0;
510 for (i = 0; i < ARRAY_SIZE(mainscan); i++) {
511 if (!(dev->tvnorm->id & mainscan[i].std))
512 continue;
513 if (!default_carrier)
514 default_carrier = mainscan[i].carr;
515 nscan++;
516 }
517
518 if (1 == nscan) {
519 /* only one candidate -- skip scan ;) */
520 dprintk("only one main carrier candidate - skipping scan\n");
521 max1 = 12345;
522 carrier = default_carrier;
523 } else {
524 /* scan for the main carrier */
525 saa_writeb(SAA7134_MONITOR_SELECT,0x00);
526 tvaudio_setmode(dev,&tvaudio[0],NULL);
527 for (i = 0; i < ARRAY_SIZE(mainscan); i++) {
528 carr_vals[i] = tvaudio_checkcarrier(dev, mainscan+i);
529 if (dev->thread.scan1 != dev->thread.scan2)
530 goto restart;
531 }
532 for (max1 = 0, max2 = 0, i = 0; i < ARRAY_SIZE(mainscan); i++) {
533 if (max1 < carr_vals[i]) {
534 max2 = max1;
535 max1 = carr_vals[i];
536 carrier = mainscan[i].carr;
537 } else if (max2 < carr_vals[i]) {
538 max2 = carr_vals[i];
539 }
540 }
541 }
542
543 if (0 != carrier && max1 > 2000 && max1 > max2*3) {
544 /* found good carrier */
545 dprintk("found %s main sound carrier @ %d.%03d MHz [%d/%d]\n",
546 dev->tvnorm->name, carrier/1000, carrier%1000,
547 max1, max2);
548 dev->last_carrier = carrier;
549
550 } else if (0 != dev->last_carrier) {
551 /* no carrier -- try last detected one as fallback */
552 carrier = dev->last_carrier;
553 dprintk("audio carrier scan failed, "
554 "using %d.%03d MHz [last detected]\n",
555 carrier/1000, carrier%1000);
556
557 } else {
558 /* no carrier + no fallback -- use default */
559 carrier = default_carrier;
560 dprintk("audio carrier scan failed, "
561 "using %d.%03d MHz [default]\n",
562 carrier/1000, carrier%1000);
563 }
564 tvaudio_setcarrier(dev,carrier,carrier);
565 dev->automute = 0;
566 saa_andorb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0x30, 0x00);
567 saa7134_tvaudio_setmute(dev);
568 /* find the exact tv audio norm */
569 for (audio = UNSET, i = 0; i < TVAUDIO; i++) {
570 if (dev->tvnorm->id != UNSET &&
571 !(dev->tvnorm->id & tvaudio[i].std))
572 continue;
573 if (tvaudio[i].carr1 != carrier)
574 continue;
575 /* Note: at least the primary carrier is right here */
576 if (UNSET == audio)
577 audio = i;
578 tvaudio_setmode(dev,&tvaudio[i],"trying");
579 if (tvaudio_sleep(dev,SCAN_SUBCARRIER_DELAY))
580 goto restart;
581 if (-1 != tvaudio_getstereo(dev,&tvaudio[i])) {
582 audio = i;
583 break;
584 }
585 }
586 saa_andorb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0x30, 0x30);
587 if (UNSET == audio)
588 continue;
589 tvaudio_setmode(dev,&tvaudio[audio],"using");
590
591 tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO);
592 dev->tvaudio = &tvaudio[audio];
593
594 lastmode = 42;
595 for (;;) {
596
597 try_to_freeze();
598
599 if (tvaudio_sleep(dev,5000))
600 goto restart;
601 if (kthread_should_stop())
602 break;
603 if (UNSET == dev->thread.mode) {
604 rx = tvaudio_getstereo(dev,&tvaudio[i]);
605 mode = saa7134_tvaudio_rx2mode(rx);
606 } else {
607 mode = dev->thread.mode;
608 }
609 if (lastmode != mode) {
610 tvaudio_setstereo(dev,&tvaudio[audio],mode);
611 lastmode = mode;
612 }
613 }
614 }
615
616 done:
617 dev->thread.stopped = 1;
618 return 0;
619}
620
621/* ------------------------------------------------------------------ */
622/* saa7133 / saa7135 code */
623
624static char *stdres[0x20] = {
625 [0x00] = "no standard detected",
626 [0x01] = "B/G (in progress)",
627 [0x02] = "D/K (in progress)",
628 [0x03] = "M (in progress)",
629
630 [0x04] = "B/G A2",
631 [0x05] = "B/G NICAM",
632 [0x06] = "D/K A2 (1)",
633 [0x07] = "D/K A2 (2)",
634 [0x08] = "D/K A2 (3)",
635 [0x09] = "D/K NICAM",
636 [0x0a] = "L NICAM",
637 [0x0b] = "I NICAM",
638
639 [0x0c] = "M Korea",
640 [0x0d] = "M BTSC ",
641 [0x0e] = "M EIAJ",
642
643 [0x0f] = "FM radio / IF 10.7 / 50 deemp",
644 [0x10] = "FM radio / IF 10.7 / 75 deemp",
645 [0x11] = "FM radio / IF sel / 50 deemp",
646 [0x12] = "FM radio / IF sel / 75 deemp",
647
648 [0x13 ... 0x1e ] = "unknown",
649 [0x1f] = "??? [in progress]",
650};
651
652#define DSP_RETRY 32
653#define DSP_DELAY 16
654#define SAA7135_DSP_RWCLEAR_RERR 1
655
656static inline int saa_dsp_reset_error_bit(struct saa7134_dev *dev)
657{
658 int state = saa_readb(SAA7135_DSP_RWSTATE);
659 if (unlikely(state & SAA7135_DSP_RWSTATE_ERR)) {
660 d2printk("%s: resetting error bit\n", dev->name);
661 saa_writeb(SAA7135_DSP_RWCLEAR, SAA7135_DSP_RWCLEAR_RERR);
662 }
663 return 0;
664}
665
666static inline int saa_dsp_wait_bit(struct saa7134_dev *dev, int bit)
667{
668 int state, count = DSP_RETRY;
669
670 state = saa_readb(SAA7135_DSP_RWSTATE);
671 if (unlikely(state & SAA7135_DSP_RWSTATE_ERR)) {
672 printk(KERN_WARNING "%s: dsp access error\n", dev->name);
673 saa_dsp_reset_error_bit(dev);
674 return -EIO;
675 }
676 while (0 == (state & bit)) {
677 if (unlikely(0 == count)) {
678 printk("%s: dsp access wait timeout [bit=%s]\n",
679 dev->name,
680 (bit & SAA7135_DSP_RWSTATE_WRR) ? "WRR" :
681 (bit & SAA7135_DSP_RWSTATE_RDB) ? "RDB" :
682 (bit & SAA7135_DSP_RWSTATE_IDA) ? "IDA" :
683 "???");
684 return -EIO;
685 }
686 saa_wait(DSP_DELAY);
687 state = saa_readb(SAA7135_DSP_RWSTATE);
688 count--;
689 }
690 return 0;
691}
692
693
694int saa_dsp_writel(struct saa7134_dev *dev, int reg, u32 value)
695{
696 int err;
697
698 d2printk("dsp write reg 0x%x = 0x%06x\n",reg<<2,value);
699 err = saa_dsp_wait_bit(dev,SAA7135_DSP_RWSTATE_WRR);
700 if (err < 0)
701 return err;
702 saa_writel(reg,value);
703 err = saa_dsp_wait_bit(dev,SAA7135_DSP_RWSTATE_WRR);
704 if (err < 0)
705 return err;
706 return 0;
707}
708
709static int getstereo_7133(struct saa7134_dev *dev)
710{
711 int retval = V4L2_TUNER_SUB_MONO;
712 u32 value;
713
714 value = saa_readl(0x528 >> 2);
715 if (value & 0x20)
716 retval = V4L2_TUNER_SUB_MONO | V4L2_TUNER_SUB_STEREO;
717 if (value & 0x40)
718 retval = V4L2_TUNER_SUB_LANG1 | V4L2_TUNER_SUB_LANG2;
719 return retval;
720}
721
722static int mute_input_7133(struct saa7134_dev *dev)
723{
724 u32 reg = 0;
725 u32 xbarin, xbarout;
726 int mask;
727 struct saa7134_input *in;
728
729 xbarin = 0x03;
730 switch (dev->input->amux) {
731 case TV:
732 reg = 0x02;
733 xbarin = 0;
734 break;
735 case LINE1:
736 reg = 0x00;
737 break;
738 case LINE2:
739 case LINE2_LEFT:
740 reg = 0x09;
741 break;
742 }
743 saa_dsp_writel(dev, 0x464 >> 2, xbarin);
744 if (dev->ctl_mute) {
745 reg = 0x07;
746 xbarout = 0xbbbbbb;
747 } else
748 xbarout = 0xbbbb10;
749 saa_dsp_writel(dev, 0x46c >> 2, xbarout);
750
751 saa_writel(0x594 >> 2, reg);
752
753
754 /* switch gpio-connected external audio mux */
755 if (0 != card(dev).gpiomask) {
756 mask = card(dev).gpiomask;
757
758 if (card(dev).mute.name && dev->ctl_mute)
759 in = &card(dev).mute;
760 else
761 in = dev->input;
762
763 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, mask, mask);
764 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, in->gpio);
765 saa7134_track_gpio(dev,in->name);
766 }
767
768 return 0;
769}
770
771static int tvaudio_thread_ddep(void *data)
772{
773 struct saa7134_dev *dev = data;
774 u32 value, norms;
775
776 set_freezable();
777 for (;;) {
778 tvaudio_sleep(dev,-1);
779 if (kthread_should_stop())
780 goto done;
781 restart:
782 try_to_freeze();
783
784 dev->thread.scan1 = dev->thread.scan2;
785 dprintk("tvaudio thread scan start [%d]\n",dev->thread.scan1);
786
787 if (audio_ddep >= 0x04 && audio_ddep <= 0x0e) {
788 /* insmod option override */
789 norms = (audio_ddep << 2) | 0x01;
790 dprintk("ddep override: %s\n",stdres[audio_ddep]);
791 } else if (&card(dev).radio == dev->input) {
792 dprintk("FM Radio\n");
793 if (dev->tuner_type == TUNER_PHILIPS_TDA8290) {
794 norms = (0x11 << 2) | 0x01;
795 saa_dsp_writel(dev, 0x42c >> 2, 0x729555);
796 } else {
797 norms = (0x0f << 2) | 0x01;
798 }
799 } else {
800 /* (let chip) scan for sound carrier */
801 norms = 0;
802 if (dev->tvnorm->id & (V4L2_STD_B | V4L2_STD_GH))
803 norms |= 0x04;
804 if (dev->tvnorm->id & V4L2_STD_PAL_I)
805 norms |= 0x20;
806 if (dev->tvnorm->id & V4L2_STD_DK)
807 norms |= 0x08;
808 if (dev->tvnorm->id & V4L2_STD_MN)
809 norms |= 0x40;
810 if (dev->tvnorm->id & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC))
811 norms |= 0x10;
812 if (0 == norms)
813 norms = 0x7c; /* all */
814 dprintk("scanning:%s%s%s%s%s\n",
815 (norms & 0x04) ? " B/G" : "",
816 (norms & 0x08) ? " D/K" : "",
817 (norms & 0x10) ? " L/L'" : "",
818 (norms & 0x20) ? " I" : "",
819 (norms & 0x40) ? " M" : "");
820 }
821
822 /* kick automatic standard detection */
823 saa_dsp_writel(dev, 0x454 >> 2, 0);
824 saa_dsp_writel(dev, 0x454 >> 2, norms | 0x80);
825
826 /* setup crossbars */
827 saa_dsp_writel(dev, 0x464 >> 2, 0x000000);
828 saa_dsp_writel(dev, 0x470 >> 2, 0x101010);
829
830 if (tvaudio_sleep(dev,3000))
831 goto restart;
832 value = saa_readl(0x528 >> 2) & 0xffffff;
833
834 dprintk("tvaudio thread status: 0x%x [%s%s%s]\n",
835 value, stdres[value & 0x1f],
836 (value & 0x000020) ? ",stereo" : "",
837 (value & 0x000040) ? ",dual" : "");
838 dprintk("detailed status: "
839 "%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s\n",
840 (value & 0x000080) ? " A2/EIAJ pilot tone " : "",
841 (value & 0x000100) ? " A2/EIAJ dual " : "",
842 (value & 0x000200) ? " A2/EIAJ stereo " : "",
843 (value & 0x000400) ? " A2/EIAJ noise mute " : "",
844
845 (value & 0x000800) ? " BTSC/FM radio pilot " : "",
846 (value & 0x001000) ? " SAP carrier " : "",
847 (value & 0x002000) ? " BTSC stereo noise mute " : "",
848 (value & 0x004000) ? " SAP noise mute " : "",
849 (value & 0x008000) ? " VDSP " : "",
850
851 (value & 0x010000) ? " NICST " : "",
852 (value & 0x020000) ? " NICDU " : "",
853 (value & 0x040000) ? " NICAM muted " : "",
854 (value & 0x080000) ? " NICAM reserve sound " : "",
855
856 (value & 0x100000) ? " init done " : "");
857 }
858
859 done:
860 dev->thread.stopped = 1;
861 return 0;
862}
863
864/* ------------------------------------------------------------------ */
865/* common stuff + external entry points */
866
867void saa7134_enable_i2s(struct saa7134_dev *dev)
868{
869 int i2s_format;
870
871 if (!card_is_empress(dev))
872 return;
873
874 if (dev->pci->device == PCI_DEVICE_ID_PHILIPS_SAA7130)
875 return;
876
877 /* configure GPIO for out */
878 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x0E000000, 0x00000000);
879
880 switch (dev->pci->device) {
881 case PCI_DEVICE_ID_PHILIPS_SAA7133:
882 case PCI_DEVICE_ID_PHILIPS_SAA7135:
883 /* Set I2S format (SONY)  */
884 saa_writeb(SAA7133_I2S_AUDIO_CONTROL, 0x00);
885 /* Start I2S */
886 saa_writeb(SAA7134_I2S_AUDIO_OUTPUT, 0x11);
887 break;
888
889 case PCI_DEVICE_ID_PHILIPS_SAA7134:
890 i2s_format = (dev->input->amux == TV) ? 0x00 : 0x01;
891
892 /* enable I2S audio output for the mpeg encoder */
893 saa_writeb(SAA7134_I2S_OUTPUT_SELECT, 0x80);
894 saa_writeb(SAA7134_I2S_OUTPUT_FORMAT, i2s_format);
895 saa_writeb(SAA7134_I2S_OUTPUT_LEVEL, 0x0F);
896 saa_writeb(SAA7134_I2S_AUDIO_OUTPUT, 0x01);
897
898 default:
899 break;
900 }
901}
902
903int saa7134_tvaudio_rx2mode(u32 rx)
904{
905 u32 mode;
906
907 mode = V4L2_TUNER_MODE_MONO;
908 if (rx & V4L2_TUNER_SUB_STEREO)
909 mode = V4L2_TUNER_MODE_STEREO;
910 else if (rx & V4L2_TUNER_SUB_LANG1)
911 mode = V4L2_TUNER_MODE_LANG1;
912 else if (rx & V4L2_TUNER_SUB_LANG2)
913 mode = V4L2_TUNER_MODE_LANG2;
914 return mode;
915}
916
917void saa7134_tvaudio_setmute(struct saa7134_dev *dev)
918{
919 switch (dev->pci->device) {
920 case PCI_DEVICE_ID_PHILIPS_SAA7130:
921 case PCI_DEVICE_ID_PHILIPS_SAA7134:
922 mute_input_7134(dev);
923 break;
924 case PCI_DEVICE_ID_PHILIPS_SAA7133:
925 case PCI_DEVICE_ID_PHILIPS_SAA7135:
926 mute_input_7133(dev);
927 break;
928 }
929}
930
931void saa7134_tvaudio_setinput(struct saa7134_dev *dev,
932 struct saa7134_input *in)
933{
934 dev->input = in;
935 switch (dev->pci->device) {
936 case PCI_DEVICE_ID_PHILIPS_SAA7130:
937 case PCI_DEVICE_ID_PHILIPS_SAA7134:
938 mute_input_7134(dev);
939 break;
940 case PCI_DEVICE_ID_PHILIPS_SAA7133:
941 case PCI_DEVICE_ID_PHILIPS_SAA7135:
942 mute_input_7133(dev);
943 break;
944 }
945 saa7134_enable_i2s(dev);
946}
947
948void saa7134_tvaudio_setvolume(struct saa7134_dev *dev, int level)
949{
950 switch (dev->pci->device) {
951 case PCI_DEVICE_ID_PHILIPS_SAA7134:
952 saa_writeb(SAA7134_CHANNEL1_LEVEL, level & 0x1f);
953 saa_writeb(SAA7134_CHANNEL2_LEVEL, level & 0x1f);
954 saa_writeb(SAA7134_NICAM_LEVEL_ADJUST, level & 0x1f);
955 break;
956 }
957}
958
959int saa7134_tvaudio_getstereo(struct saa7134_dev *dev)
960{
961 int retval = V4L2_TUNER_SUB_MONO;
962
963 switch (dev->pci->device) {
964 case PCI_DEVICE_ID_PHILIPS_SAA7134:
965 if (dev->tvaudio)
966 retval = tvaudio_getstereo(dev,dev->tvaudio);
967 break;
968 case PCI_DEVICE_ID_PHILIPS_SAA7133:
969 case PCI_DEVICE_ID_PHILIPS_SAA7135:
970 retval = getstereo_7133(dev);
971 break;
972 }
973 return retval;
974}
975
976void saa7134_tvaudio_init(struct saa7134_dev *dev)
977{
978 int clock = saa7134_boards[dev->board].audio_clock;
979
980 if (UNSET != audio_clock_override)
981 clock = audio_clock_override;
982
983 switch (dev->pci->device) {
984 case PCI_DEVICE_ID_PHILIPS_SAA7134:
985 /* init all audio registers */
986 saa_writeb(SAA7134_AUDIO_PLL_CTRL, 0x00);
987 if (need_resched())
988 schedule();
989 else
990 udelay(10);
991
992 saa_writeb(SAA7134_AUDIO_CLOCK0, clock & 0xff);
993 saa_writeb(SAA7134_AUDIO_CLOCK1, (clock >> 8) & 0xff);
994 saa_writeb(SAA7134_AUDIO_CLOCK2, (clock >> 16) & 0xff);
995 /* frame locked audio is mandatory for NICAM */
996 saa_writeb(SAA7134_AUDIO_PLL_CTRL, 0x01);
997 saa_writeb(SAA7134_NICAM_ERROR_LOW, 0x14);
998 saa_writeb(SAA7134_NICAM_ERROR_HIGH, 0x50);
999 break;
1000 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1001 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1002 saa_writel(0x598 >> 2, clock);
1003 saa_dsp_writel(dev, 0x474 >> 2, 0x00);
1004 saa_dsp_writel(dev, 0x450 >> 2, 0x00);
1005 }
1006}
1007
1008int saa7134_tvaudio_init2(struct saa7134_dev *dev)
1009{
1010 int (*my_thread)(void *data) = NULL;
1011
1012 switch (dev->pci->device) {
1013 case PCI_DEVICE_ID_PHILIPS_SAA7134:
1014 my_thread = tvaudio_thread;
1015 break;
1016 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1017 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1018 my_thread = tvaudio_thread_ddep;
1019 break;
1020 }
1021
1022 dev->thread.thread = NULL;
1023 if (my_thread) {
1024 saa7134_tvaudio_init(dev);
1025 /* start tvaudio thread */
1026 dev->thread.thread = kthread_run(my_thread, dev, "%s", dev->name);
1027 if (IS_ERR(dev->thread.thread)) {
1028 printk(KERN_WARNING "%s: kernel_thread() failed\n",
1029 dev->name);
1030 /* XXX: missing error handling here */
1031 }
1032 saa7134_tvaudio_do_scan(dev);
1033 }
1034
1035 saa7134_enable_i2s(dev);
1036 return 0;
1037}
1038
1039int saa7134_tvaudio_fini(struct saa7134_dev *dev)
1040{
1041 /* shutdown tvaudio thread */
1042 if (dev->thread.thread && !dev->thread.stopped)
1043 kthread_stop(dev->thread.thread);
1044
1045 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x07, 0x00); /* LINE1 */
1046 return 0;
1047}
1048
1049int saa7134_tvaudio_do_scan(struct saa7134_dev *dev)
1050{
1051 if (dev->input->amux != TV) {
1052 dprintk("sound IF not in use, skipping scan\n");
1053 dev->automute = 0;
1054 saa7134_tvaudio_setmute(dev);
1055 } else if (dev->thread.thread) {
1056 dev->thread.mode = UNSET;
1057 dev->thread.scan2++;
1058
1059 if (!dev->insuspend && !dev->thread.stopped)
1060 wake_up_process(dev->thread.thread);
1061 } else {
1062 dev->automute = 0;
1063 saa7134_tvaudio_setmute(dev);
1064 }
1065 return 0;
1066}
1067
1068EXPORT_SYMBOL(saa_dsp_writel);
1069EXPORT_SYMBOL(saa7134_tvaudio_setmute);
1070
1071/* ----------------------------------------------------------- */
1072/*
1073 * Local variables:
1074 * c-basic-offset: 8
1075 * End:
1076 */
diff --git a/drivers/media/video/saa7134/saa7134-vbi.c b/drivers/media/video/saa7134/saa7134-vbi.c
new file mode 100644
index 00000000000..e9aa94b807f
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-vbi.c
@@ -0,0 +1,255 @@
1/*
2 *
3 * device driver for philips saa7134 based TV cards
4 * video4linux video interface
5 *
6 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/list.h>
25#include <linux/module.h>
26#include <linux/kernel.h>
27
28#include "saa7134-reg.h"
29#include "saa7134.h"
30
31/* ------------------------------------------------------------------ */
32
33static unsigned int vbi_debug;
34module_param(vbi_debug, int, 0644);
35MODULE_PARM_DESC(vbi_debug,"enable debug messages [vbi]");
36
37static unsigned int vbibufs = 4;
38module_param(vbibufs, int, 0444);
39MODULE_PARM_DESC(vbibufs,"number of vbi buffers, range 2-32");
40
41#define dprintk(fmt, arg...) if (vbi_debug) \
42 printk(KERN_DEBUG "%s/vbi: " fmt, dev->name , ## arg)
43
44/* ------------------------------------------------------------------ */
45
46#define VBI_LINE_COUNT 16
47#define VBI_LINE_LENGTH 2048
48#define VBI_SCALE 0x200
49
50static void task_init(struct saa7134_dev *dev, struct saa7134_buf *buf,
51 int task)
52{
53 struct saa7134_tvnorm *norm = dev->tvnorm;
54
55 /* setup video scaler */
56 saa_writeb(SAA7134_VBI_H_START1(task), norm->h_start & 0xff);
57 saa_writeb(SAA7134_VBI_H_START2(task), norm->h_start >> 8);
58 saa_writeb(SAA7134_VBI_H_STOP1(task), norm->h_stop & 0xff);
59 saa_writeb(SAA7134_VBI_H_STOP2(task), norm->h_stop >> 8);
60 saa_writeb(SAA7134_VBI_V_START1(task), norm->vbi_v_start_0 & 0xff);
61 saa_writeb(SAA7134_VBI_V_START2(task), norm->vbi_v_start_0 >> 8);
62 saa_writeb(SAA7134_VBI_V_STOP1(task), norm->vbi_v_stop_0 & 0xff);
63 saa_writeb(SAA7134_VBI_V_STOP2(task), norm->vbi_v_stop_0 >> 8);
64
65 saa_writeb(SAA7134_VBI_H_SCALE_INC1(task), VBI_SCALE & 0xff);
66 saa_writeb(SAA7134_VBI_H_SCALE_INC2(task), VBI_SCALE >> 8);
67 saa_writeb(SAA7134_VBI_PHASE_OFFSET_LUMA(task), 0x00);
68 saa_writeb(SAA7134_VBI_PHASE_OFFSET_CHROMA(task), 0x00);
69
70 saa_writeb(SAA7134_VBI_H_LEN1(task), buf->vb.width & 0xff);
71 saa_writeb(SAA7134_VBI_H_LEN2(task), buf->vb.width >> 8);
72 saa_writeb(SAA7134_VBI_V_LEN1(task), buf->vb.height & 0xff);
73 saa_writeb(SAA7134_VBI_V_LEN2(task), buf->vb.height >> 8);
74
75 saa_andorb(SAA7134_DATA_PATH(task), 0xc0, 0x00);
76}
77
78/* ------------------------------------------------------------------ */
79
80static int buffer_activate(struct saa7134_dev *dev,
81 struct saa7134_buf *buf,
82 struct saa7134_buf *next)
83{
84 unsigned long control,base;
85
86 dprintk("buffer_activate [%p]\n",buf);
87 buf->vb.state = VIDEOBUF_ACTIVE;
88 buf->top_seen = 0;
89
90 task_init(dev,buf,TASK_A);
91 task_init(dev,buf,TASK_B);
92 saa_writeb(SAA7134_OFMT_DATA_A, 0x06);
93 saa_writeb(SAA7134_OFMT_DATA_B, 0x06);
94
95 /* DMA: setup channel 2+3 (= VBI Task A+B) */
96 base = saa7134_buffer_base(buf);
97 control = SAA7134_RS_CONTROL_BURST_16 |
98 SAA7134_RS_CONTROL_ME |
99 (buf->pt->dma >> 12);
100 saa_writel(SAA7134_RS_BA1(2),base);
101 saa_writel(SAA7134_RS_BA2(2),base + buf->vb.size/2);
102 saa_writel(SAA7134_RS_PITCH(2),buf->vb.width);
103 saa_writel(SAA7134_RS_CONTROL(2),control);
104 saa_writel(SAA7134_RS_BA1(3),base);
105 saa_writel(SAA7134_RS_BA2(3),base + buf->vb.size/2);
106 saa_writel(SAA7134_RS_PITCH(3),buf->vb.width);
107 saa_writel(SAA7134_RS_CONTROL(3),control);
108
109 /* start DMA */
110 saa7134_set_dmabits(dev);
111 mod_timer(&dev->vbi_q.timeout, jiffies+BUFFER_TIMEOUT);
112
113 return 0;
114}
115
116static int buffer_prepare(struct videobuf_queue *q,
117 struct videobuf_buffer *vb,
118 enum v4l2_field field)
119{
120 struct saa7134_fh *fh = q->priv_data;
121 struct saa7134_dev *dev = fh->dev;
122 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
123 struct saa7134_tvnorm *norm = dev->tvnorm;
124 unsigned int lines, llength, size;
125 int err;
126
127 lines = norm->vbi_v_stop_0 - norm->vbi_v_start_0 +1;
128 if (lines > VBI_LINE_COUNT)
129 lines = VBI_LINE_COUNT;
130 llength = VBI_LINE_LENGTH;
131 size = lines * llength * 2;
132 if (0 != buf->vb.baddr && buf->vb.bsize < size)
133 return -EINVAL;
134
135 if (buf->vb.size != size)
136 saa7134_dma_free(q,buf);
137
138 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
139 struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
140
141 buf->vb.width = llength;
142 buf->vb.height = lines;
143 buf->vb.size = size;
144 buf->pt = &fh->pt_vbi;
145
146 err = videobuf_iolock(q,&buf->vb,NULL);
147 if (err)
148 goto oops;
149 err = saa7134_pgtable_build(dev->pci,buf->pt,
150 dma->sglist,
151 dma->sglen,
152 saa7134_buffer_startpage(buf));
153 if (err)
154 goto oops;
155 }
156 buf->vb.state = VIDEOBUF_PREPARED;
157 buf->activate = buffer_activate;
158 buf->vb.field = field;
159 return 0;
160
161 oops:
162 saa7134_dma_free(q,buf);
163 return err;
164}
165
166static int
167buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
168{
169 struct saa7134_fh *fh = q->priv_data;
170 struct saa7134_dev *dev = fh->dev;
171 int llength,lines;
172
173 lines = dev->tvnorm->vbi_v_stop_0 - dev->tvnorm->vbi_v_start_0 +1;
174 llength = VBI_LINE_LENGTH;
175 *size = lines * llength * 2;
176 if (0 == *count)
177 *count = vbibufs;
178 *count = saa7134_buffer_count(*size,*count);
179 return 0;
180}
181
182static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
183{
184 struct saa7134_fh *fh = q->priv_data;
185 struct saa7134_dev *dev = fh->dev;
186 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
187
188 saa7134_buffer_queue(dev,&dev->vbi_q,buf);
189}
190
191static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
192{
193 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
194
195 saa7134_dma_free(q,buf);
196}
197
198struct videobuf_queue_ops saa7134_vbi_qops = {
199 .buf_setup = buffer_setup,
200 .buf_prepare = buffer_prepare,
201 .buf_queue = buffer_queue,
202 .buf_release = buffer_release,
203};
204
205/* ------------------------------------------------------------------ */
206
207int saa7134_vbi_init1(struct saa7134_dev *dev)
208{
209 INIT_LIST_HEAD(&dev->vbi_q.queue);
210 init_timer(&dev->vbi_q.timeout);
211 dev->vbi_q.timeout.function = saa7134_buffer_timeout;
212 dev->vbi_q.timeout.data = (unsigned long)(&dev->vbi_q);
213 dev->vbi_q.dev = dev;
214
215 if (vbibufs < 2)
216 vbibufs = 2;
217 if (vbibufs > VIDEO_MAX_FRAME)
218 vbibufs = VIDEO_MAX_FRAME;
219 return 0;
220}
221
222int saa7134_vbi_fini(struct saa7134_dev *dev)
223{
224 /* nothing */
225 return 0;
226}
227
228void saa7134_irq_vbi_done(struct saa7134_dev *dev, unsigned long status)
229{
230 spin_lock(&dev->slock);
231 if (dev->vbi_q.curr) {
232 dev->vbi_fieldcount++;
233 /* make sure we have seen both fields */
234 if ((status & 0x10) == 0x00) {
235 dev->vbi_q.curr->top_seen = 1;
236 goto done;
237 }
238 if (!dev->vbi_q.curr->top_seen)
239 goto done;
240
241 dev->vbi_q.curr->vb.field_count = dev->vbi_fieldcount;
242 saa7134_buffer_finish(dev,&dev->vbi_q,VIDEOBUF_DONE);
243 }
244 saa7134_buffer_next(dev,&dev->vbi_q);
245
246 done:
247 spin_unlock(&dev->slock);
248}
249
250/* ----------------------------------------------------------- */
251/*
252 * Local variables:
253 * c-basic-offset: 8
254 * End:
255 */
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c
new file mode 100644
index 00000000000..9cf7914f6f9
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-video.c
@@ -0,0 +1,2659 @@
1/*
2 *
3 * device driver for philips saa7134 based TV cards
4 * video4linux video interface
5 *
6 * (c) 2001-03 Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23#include <linux/init.h>
24#include <linux/list.h>
25#include <linux/module.h>
26#include <linux/kernel.h>
27#include <linux/slab.h>
28#include <linux/sort.h>
29
30#include "saa7134-reg.h"
31#include "saa7134.h"
32#include <media/v4l2-common.h>
33#include <media/saa6588.h>
34
35/* ------------------------------------------------------------------ */
36
37unsigned int video_debug;
38static unsigned int gbuffers = 8;
39static unsigned int noninterlaced; /* 0 */
40static unsigned int gbufsize = 720*576*4;
41static unsigned int gbufsize_max = 720*576*4;
42static char secam[] = "--";
43module_param(video_debug, int, 0644);
44MODULE_PARM_DESC(video_debug,"enable debug messages [video]");
45module_param(gbuffers, int, 0444);
46MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32");
47module_param(noninterlaced, int, 0644);
48MODULE_PARM_DESC(noninterlaced,"capture non interlaced video");
49module_param_string(secam, secam, sizeof(secam), 0644);
50MODULE_PARM_DESC(secam, "force SECAM variant, either DK,L or Lc");
51
52
53#define dprintk(fmt, arg...) if (video_debug&0x04) \
54 printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)
55
56/* ------------------------------------------------------------------ */
57/* Defines for Video Output Port Register at address 0x191 */
58
59/* Bit 0: VIP code T bit polarity */
60
61#define VP_T_CODE_P_NON_INVERTED 0x00
62#define VP_T_CODE_P_INVERTED 0x01
63
64/* ------------------------------------------------------------------ */
65/* Defines for Video Output Port Register at address 0x195 */
66
67/* Bit 2: Video output clock delay control */
68
69#define VP_CLK_CTRL2_NOT_DELAYED 0x00
70#define VP_CLK_CTRL2_DELAYED 0x04
71
72/* Bit 1: Video output clock invert control */
73
74#define VP_CLK_CTRL1_NON_INVERTED 0x00
75#define VP_CLK_CTRL1_INVERTED 0x02
76
77/* ------------------------------------------------------------------ */
78/* Defines for Video Output Port Register at address 0x196 */
79
80/* Bits 2 to 0: VSYNC pin video vertical sync type */
81
82#define VP_VS_TYPE_MASK 0x07
83
84#define VP_VS_TYPE_OFF 0x00
85#define VP_VS_TYPE_V123 0x01
86#define VP_VS_TYPE_V_ITU 0x02
87#define VP_VS_TYPE_VGATE_L 0x03
88#define VP_VS_TYPE_RESERVED1 0x04
89#define VP_VS_TYPE_RESERVED2 0x05
90#define VP_VS_TYPE_F_ITU 0x06
91#define VP_VS_TYPE_SC_FID 0x07
92
93/* ------------------------------------------------------------------ */
94/* data structs for video */
95
96static int video_out[][9] = {
97 [CCIR656] = { 0x00, 0xb1, 0x00, 0xa1, 0x00, 0x04, 0x06, 0x00, 0x00 },
98};
99
100static struct saa7134_format formats[] = {
101 {
102 .name = "8 bpp gray",
103 .fourcc = V4L2_PIX_FMT_GREY,
104 .depth = 8,
105 .pm = 0x06,
106 },{
107 .name = "15 bpp RGB, le",
108 .fourcc = V4L2_PIX_FMT_RGB555,
109 .depth = 16,
110 .pm = 0x13 | 0x80,
111 },{
112 .name = "15 bpp RGB, be",
113 .fourcc = V4L2_PIX_FMT_RGB555X,
114 .depth = 16,
115 .pm = 0x13 | 0x80,
116 .bswap = 1,
117 },{
118 .name = "16 bpp RGB, le",
119 .fourcc = V4L2_PIX_FMT_RGB565,
120 .depth = 16,
121 .pm = 0x10 | 0x80,
122 },{
123 .name = "16 bpp RGB, be",
124 .fourcc = V4L2_PIX_FMT_RGB565X,
125 .depth = 16,
126 .pm = 0x10 | 0x80,
127 .bswap = 1,
128 },{
129 .name = "24 bpp RGB, le",
130 .fourcc = V4L2_PIX_FMT_BGR24,
131 .depth = 24,
132 .pm = 0x11,
133 },{
134 .name = "24 bpp RGB, be",
135 .fourcc = V4L2_PIX_FMT_RGB24,
136 .depth = 24,
137 .pm = 0x11,
138 .bswap = 1,
139 },{
140 .name = "32 bpp RGB, le",
141 .fourcc = V4L2_PIX_FMT_BGR32,
142 .depth = 32,
143 .pm = 0x12,
144 },{
145 .name = "32 bpp RGB, be",
146 .fourcc = V4L2_PIX_FMT_RGB32,
147 .depth = 32,
148 .pm = 0x12,
149 .bswap = 1,
150 .wswap = 1,
151 },{
152 .name = "4:2:2 packed, YUYV",
153 .fourcc = V4L2_PIX_FMT_YUYV,
154 .depth = 16,
155 .pm = 0x00,
156 .bswap = 1,
157 .yuv = 1,
158 },{
159 .name = "4:2:2 packed, UYVY",
160 .fourcc = V4L2_PIX_FMT_UYVY,
161 .depth = 16,
162 .pm = 0x00,
163 .yuv = 1,
164 },{
165 .name = "4:2:2 planar, Y-Cb-Cr",
166 .fourcc = V4L2_PIX_FMT_YUV422P,
167 .depth = 16,
168 .pm = 0x09,
169 .yuv = 1,
170 .planar = 1,
171 .hshift = 1,
172 .vshift = 0,
173 },{
174 .name = "4:2:0 planar, Y-Cb-Cr",
175 .fourcc = V4L2_PIX_FMT_YUV420,
176 .depth = 12,
177 .pm = 0x0a,
178 .yuv = 1,
179 .planar = 1,
180 .hshift = 1,
181 .vshift = 1,
182 },{
183 .name = "4:2:0 planar, Y-Cb-Cr",
184 .fourcc = V4L2_PIX_FMT_YVU420,
185 .depth = 12,
186 .pm = 0x0a,
187 .yuv = 1,
188 .planar = 1,
189 .uvswap = 1,
190 .hshift = 1,
191 .vshift = 1,
192 }
193};
194#define FORMATS ARRAY_SIZE(formats)
195
196#define NORM_625_50 \
197 .h_start = 0, \
198 .h_stop = 719, \
199 .video_v_start = 24, \
200 .video_v_stop = 311, \
201 .vbi_v_start_0 = 7, \
202 .vbi_v_stop_0 = 22, \
203 .vbi_v_start_1 = 319, \
204 .src_timing = 4
205
206#define NORM_525_60 \
207 .h_start = 0, \
208 .h_stop = 719, \
209 .video_v_start = 23, \
210 .video_v_stop = 262, \
211 .vbi_v_start_0 = 10, \
212 .vbi_v_stop_0 = 21, \
213 .vbi_v_start_1 = 273, \
214 .src_timing = 7
215
216static struct saa7134_tvnorm tvnorms[] = {
217 {
218 .name = "PAL", /* autodetect */
219 .id = V4L2_STD_PAL,
220 NORM_625_50,
221
222 .sync_control = 0x18,
223 .luma_control = 0x40,
224 .chroma_ctrl1 = 0x81,
225 .chroma_gain = 0x2a,
226 .chroma_ctrl2 = 0x06,
227 .vgate_misc = 0x1c,
228
229 },{
230 .name = "PAL-BG",
231 .id = V4L2_STD_PAL_BG,
232 NORM_625_50,
233
234 .sync_control = 0x18,
235 .luma_control = 0x40,
236 .chroma_ctrl1 = 0x81,
237 .chroma_gain = 0x2a,
238 .chroma_ctrl2 = 0x06,
239 .vgate_misc = 0x1c,
240
241 },{
242 .name = "PAL-I",
243 .id = V4L2_STD_PAL_I,
244 NORM_625_50,
245
246 .sync_control = 0x18,
247 .luma_control = 0x40,
248 .chroma_ctrl1 = 0x81,
249 .chroma_gain = 0x2a,
250 .chroma_ctrl2 = 0x06,
251 .vgate_misc = 0x1c,
252
253 },{
254 .name = "PAL-DK",
255 .id = V4L2_STD_PAL_DK,
256 NORM_625_50,
257
258 .sync_control = 0x18,
259 .luma_control = 0x40,
260 .chroma_ctrl1 = 0x81,
261 .chroma_gain = 0x2a,
262 .chroma_ctrl2 = 0x06,
263 .vgate_misc = 0x1c,
264
265 },{
266 .name = "NTSC",
267 .id = V4L2_STD_NTSC,
268 NORM_525_60,
269
270 .sync_control = 0x59,
271 .luma_control = 0x40,
272 .chroma_ctrl1 = 0x89,
273 .chroma_gain = 0x2a,
274 .chroma_ctrl2 = 0x0e,
275 .vgate_misc = 0x18,
276
277 },{
278 .name = "SECAM",
279 .id = V4L2_STD_SECAM,
280 NORM_625_50,
281
282 .sync_control = 0x18,
283 .luma_control = 0x1b,
284 .chroma_ctrl1 = 0xd1,
285 .chroma_gain = 0x80,
286 .chroma_ctrl2 = 0x00,
287 .vgate_misc = 0x1c,
288
289 },{
290 .name = "SECAM-DK",
291 .id = V4L2_STD_SECAM_DK,
292 NORM_625_50,
293
294 .sync_control = 0x18,
295 .luma_control = 0x1b,
296 .chroma_ctrl1 = 0xd1,
297 .chroma_gain = 0x80,
298 .chroma_ctrl2 = 0x00,
299 .vgate_misc = 0x1c,
300
301 },{
302 .name = "SECAM-L",
303 .id = V4L2_STD_SECAM_L,
304 NORM_625_50,
305
306 .sync_control = 0x18,
307 .luma_control = 0x1b,
308 .chroma_ctrl1 = 0xd1,
309 .chroma_gain = 0x80,
310 .chroma_ctrl2 = 0x00,
311 .vgate_misc = 0x1c,
312
313 },{
314 .name = "SECAM-Lc",
315 .id = V4L2_STD_SECAM_LC,
316 NORM_625_50,
317
318 .sync_control = 0x18,
319 .luma_control = 0x1b,
320 .chroma_ctrl1 = 0xd1,
321 .chroma_gain = 0x80,
322 .chroma_ctrl2 = 0x00,
323 .vgate_misc = 0x1c,
324
325 },{
326 .name = "PAL-M",
327 .id = V4L2_STD_PAL_M,
328 NORM_525_60,
329
330 .sync_control = 0x59,
331 .luma_control = 0x40,
332 .chroma_ctrl1 = 0xb9,
333 .chroma_gain = 0x2a,
334 .chroma_ctrl2 = 0x0e,
335 .vgate_misc = 0x18,
336
337 },{
338 .name = "PAL-Nc",
339 .id = V4L2_STD_PAL_Nc,
340 NORM_625_50,
341
342 .sync_control = 0x18,
343 .luma_control = 0x40,
344 .chroma_ctrl1 = 0xa1,
345 .chroma_gain = 0x2a,
346 .chroma_ctrl2 = 0x06,
347 .vgate_misc = 0x1c,
348
349 },{
350 .name = "PAL-60",
351 .id = V4L2_STD_PAL_60,
352
353 .h_start = 0,
354 .h_stop = 719,
355 .video_v_start = 23,
356 .video_v_stop = 262,
357 .vbi_v_start_0 = 10,
358 .vbi_v_stop_0 = 21,
359 .vbi_v_start_1 = 273,
360 .src_timing = 7,
361
362 .sync_control = 0x18,
363 .luma_control = 0x40,
364 .chroma_ctrl1 = 0x81,
365 .chroma_gain = 0x2a,
366 .chroma_ctrl2 = 0x06,
367 .vgate_misc = 0x1c,
368 }
369};
370#define TVNORMS ARRAY_SIZE(tvnorms)
371
372#define V4L2_CID_PRIVATE_INVERT (V4L2_CID_PRIVATE_BASE + 0)
373#define V4L2_CID_PRIVATE_Y_ODD (V4L2_CID_PRIVATE_BASE + 1)
374#define V4L2_CID_PRIVATE_Y_EVEN (V4L2_CID_PRIVATE_BASE + 2)
375#define V4L2_CID_PRIVATE_AUTOMUTE (V4L2_CID_PRIVATE_BASE + 3)
376#define V4L2_CID_PRIVATE_LASTP1 (V4L2_CID_PRIVATE_BASE + 4)
377
378static const struct v4l2_queryctrl no_ctrl = {
379 .name = "42",
380 .flags = V4L2_CTRL_FLAG_DISABLED,
381};
382static const struct v4l2_queryctrl video_ctrls[] = {
383 /* --- video --- */
384 {
385 .id = V4L2_CID_BRIGHTNESS,
386 .name = "Brightness",
387 .minimum = 0,
388 .maximum = 255,
389 .step = 1,
390 .default_value = 128,
391 .type = V4L2_CTRL_TYPE_INTEGER,
392 },{
393 .id = V4L2_CID_CONTRAST,
394 .name = "Contrast",
395 .minimum = 0,
396 .maximum = 127,
397 .step = 1,
398 .default_value = 68,
399 .type = V4L2_CTRL_TYPE_INTEGER,
400 },{
401 .id = V4L2_CID_SATURATION,
402 .name = "Saturation",
403 .minimum = 0,
404 .maximum = 127,
405 .step = 1,
406 .default_value = 64,
407 .type = V4L2_CTRL_TYPE_INTEGER,
408 },{
409 .id = V4L2_CID_HUE,
410 .name = "Hue",
411 .minimum = -128,
412 .maximum = 127,
413 .step = 1,
414 .default_value = 0,
415 .type = V4L2_CTRL_TYPE_INTEGER,
416 },{
417 .id = V4L2_CID_HFLIP,
418 .name = "Mirror",
419 .minimum = 0,
420 .maximum = 1,
421 .type = V4L2_CTRL_TYPE_BOOLEAN,
422 },
423 /* --- audio --- */
424 {
425 .id = V4L2_CID_AUDIO_MUTE,
426 .name = "Mute",
427 .minimum = 0,
428 .maximum = 1,
429 .type = V4L2_CTRL_TYPE_BOOLEAN,
430 },{
431 .id = V4L2_CID_AUDIO_VOLUME,
432 .name = "Volume",
433 .minimum = -15,
434 .maximum = 15,
435 .step = 1,
436 .default_value = 0,
437 .type = V4L2_CTRL_TYPE_INTEGER,
438 },
439 /* --- private --- */
440 {
441 .id = V4L2_CID_PRIVATE_INVERT,
442 .name = "Invert",
443 .minimum = 0,
444 .maximum = 1,
445 .type = V4L2_CTRL_TYPE_BOOLEAN,
446 },{
447 .id = V4L2_CID_PRIVATE_Y_ODD,
448 .name = "y offset odd field",
449 .minimum = 0,
450 .maximum = 128,
451 .step = 1,
452 .default_value = 0,
453 .type = V4L2_CTRL_TYPE_INTEGER,
454 },{
455 .id = V4L2_CID_PRIVATE_Y_EVEN,
456 .name = "y offset even field",
457 .minimum = 0,
458 .maximum = 128,
459 .step = 1,
460 .default_value = 0,
461 .type = V4L2_CTRL_TYPE_INTEGER,
462 },{
463 .id = V4L2_CID_PRIVATE_AUTOMUTE,
464 .name = "automute",
465 .minimum = 0,
466 .maximum = 1,
467 .default_value = 1,
468 .type = V4L2_CTRL_TYPE_BOOLEAN,
469 }
470};
471static const unsigned int CTRLS = ARRAY_SIZE(video_ctrls);
472
473static const struct v4l2_queryctrl* ctrl_by_id(unsigned int id)
474{
475 unsigned int i;
476
477 for (i = 0; i < CTRLS; i++)
478 if (video_ctrls[i].id == id)
479 return video_ctrls+i;
480 return NULL;
481}
482
483static struct saa7134_format* format_by_fourcc(unsigned int fourcc)
484{
485 unsigned int i;
486
487 for (i = 0; i < FORMATS; i++)
488 if (formats[i].fourcc == fourcc)
489 return formats+i;
490 return NULL;
491}
492
493/* ----------------------------------------------------------------------- */
494/* resource management */
495
496static int res_get(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int bit)
497{
498 if (fh->resources & bit)
499 /* have it already allocated */
500 return 1;
501
502 /* is it free? */
503 mutex_lock(&dev->lock);
504 if (dev->resources & bit) {
505 /* no, someone else uses it */
506 mutex_unlock(&dev->lock);
507 return 0;
508 }
509 /* it's free, grab it */
510 fh->resources |= bit;
511 dev->resources |= bit;
512 dprintk("res: get %d\n",bit);
513 mutex_unlock(&dev->lock);
514 return 1;
515}
516
517static int res_check(struct saa7134_fh *fh, unsigned int bit)
518{
519 return (fh->resources & bit);
520}
521
522static int res_locked(struct saa7134_dev *dev, unsigned int bit)
523{
524 return (dev->resources & bit);
525}
526
527static
528void res_free(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int bits)
529{
530 BUG_ON((fh->resources & bits) != bits);
531
532 mutex_lock(&dev->lock);
533 fh->resources &= ~bits;
534 dev->resources &= ~bits;
535 dprintk("res: put %d\n",bits);
536 mutex_unlock(&dev->lock);
537}
538
539/* ------------------------------------------------------------------ */
540
541static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
542{
543 dprintk("set tv norm = %s\n",norm->name);
544 dev->tvnorm = norm;
545
546 /* setup cropping */
547 dev->crop_bounds.left = norm->h_start;
548 dev->crop_defrect.left = norm->h_start;
549 dev->crop_bounds.width = norm->h_stop - norm->h_start +1;
550 dev->crop_defrect.width = norm->h_stop - norm->h_start +1;
551
552 dev->crop_bounds.top = (norm->vbi_v_stop_0+1)*2;
553 dev->crop_defrect.top = norm->video_v_start*2;
554 dev->crop_bounds.height = ((norm->id & V4L2_STD_525_60) ? 524 : 624)
555 - dev->crop_bounds.top;
556 dev->crop_defrect.height = (norm->video_v_stop - norm->video_v_start +1)*2;
557
558 dev->crop_current = dev->crop_defrect;
559
560 saa7134_set_tvnorm_hw(dev);
561}
562
563static void video_mux(struct saa7134_dev *dev, int input)
564{
565 dprintk("video input = %d [%s]\n", input, card_in(dev, input).name);
566 dev->ctl_input = input;
567 set_tvnorm(dev, dev->tvnorm);
568 saa7134_tvaudio_setinput(dev, &card_in(dev, input));
569}
570
571
572static void saa7134_set_decoder(struct saa7134_dev *dev)
573{
574 int luma_control, sync_control, mux;
575
576 struct saa7134_tvnorm *norm = dev->tvnorm;
577 mux = card_in(dev, dev->ctl_input).vmux;
578
579 luma_control = norm->luma_control;
580 sync_control = norm->sync_control;
581
582 if (mux > 5)
583 luma_control |= 0x80; /* svideo */
584 if (noninterlaced || dev->nosignal)
585 sync_control |= 0x20;
586
587 /* setup video decoder */
588 saa_writeb(SAA7134_INCR_DELAY, 0x08);
589 saa_writeb(SAA7134_ANALOG_IN_CTRL1, 0xc0 | mux);
590 saa_writeb(SAA7134_ANALOG_IN_CTRL2, 0x00);
591
592 saa_writeb(SAA7134_ANALOG_IN_CTRL3, 0x90);
593 saa_writeb(SAA7134_ANALOG_IN_CTRL4, 0x90);
594 saa_writeb(SAA7134_HSYNC_START, 0xeb);
595 saa_writeb(SAA7134_HSYNC_STOP, 0xe0);
596 saa_writeb(SAA7134_SOURCE_TIMING1, norm->src_timing);
597
598 saa_writeb(SAA7134_SYNC_CTRL, sync_control);
599 saa_writeb(SAA7134_LUMA_CTRL, luma_control);
600 saa_writeb(SAA7134_DEC_LUMA_BRIGHT, dev->ctl_bright);
601
602 saa_writeb(SAA7134_DEC_LUMA_CONTRAST,
603 dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast);
604
605 saa_writeb(SAA7134_DEC_CHROMA_SATURATION,
606 dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation);
607
608 saa_writeb(SAA7134_DEC_CHROMA_HUE, dev->ctl_hue);
609 saa_writeb(SAA7134_CHROMA_CTRL1, norm->chroma_ctrl1);
610 saa_writeb(SAA7134_CHROMA_GAIN, norm->chroma_gain);
611
612 saa_writeb(SAA7134_CHROMA_CTRL2, norm->chroma_ctrl2);
613 saa_writeb(SAA7134_MODE_DELAY_CTRL, 0x00);
614
615 saa_writeb(SAA7134_ANALOG_ADC, 0x01);
616 saa_writeb(SAA7134_VGATE_START, 0x11);
617 saa_writeb(SAA7134_VGATE_STOP, 0xfe);
618 saa_writeb(SAA7134_MISC_VGATE_MSB, norm->vgate_misc);
619 saa_writeb(SAA7134_RAW_DATA_GAIN, 0x40);
620 saa_writeb(SAA7134_RAW_DATA_OFFSET, 0x80);
621}
622
623void saa7134_set_tvnorm_hw(struct saa7134_dev *dev)
624{
625 saa7134_set_decoder(dev);
626
627 if (card_in(dev, dev->ctl_input).tv)
628 saa_call_all(dev, core, s_std, dev->tvnorm->id);
629 /* Set the correct norm for the saa6752hs. This function
630 does nothing if there is no saa6752hs. */
631 saa_call_empress(dev, core, s_std, dev->tvnorm->id);
632}
633
634static void set_h_prescale(struct saa7134_dev *dev, int task, int prescale)
635{
636 static const struct {
637 int xpsc;
638 int xacl;
639 int xc2_1;
640 int xdcg;
641 int vpfy;
642 } vals[] = {
643 /* XPSC XACL XC2_1 XDCG VPFY */
644 { 1, 0, 0, 0, 0 },
645 { 2, 2, 1, 2, 2 },
646 { 3, 4, 1, 3, 2 },
647 { 4, 8, 1, 4, 2 },
648 { 5, 8, 1, 4, 2 },
649 { 6, 8, 1, 4, 3 },
650 { 7, 8, 1, 4, 3 },
651 { 8, 15, 0, 4, 3 },
652 { 9, 15, 0, 4, 3 },
653 { 10, 16, 1, 5, 3 },
654 };
655 static const int count = ARRAY_SIZE(vals);
656 int i;
657
658 for (i = 0; i < count; i++)
659 if (vals[i].xpsc == prescale)
660 break;
661 if (i == count)
662 return;
663
664 saa_writeb(SAA7134_H_PRESCALE(task), vals[i].xpsc);
665 saa_writeb(SAA7134_ACC_LENGTH(task), vals[i].xacl);
666 saa_writeb(SAA7134_LEVEL_CTRL(task),
667 (vals[i].xc2_1 << 3) | (vals[i].xdcg));
668 saa_andorb(SAA7134_FIR_PREFILTER_CTRL(task), 0x0f,
669 (vals[i].vpfy << 2) | vals[i].vpfy);
670}
671
672static void set_v_scale(struct saa7134_dev *dev, int task, int yscale)
673{
674 int val,mirror;
675
676 saa_writeb(SAA7134_V_SCALE_RATIO1(task), yscale & 0xff);
677 saa_writeb(SAA7134_V_SCALE_RATIO2(task), yscale >> 8);
678
679 mirror = (dev->ctl_mirror) ? 0x02 : 0x00;
680 if (yscale < 2048) {
681 /* LPI */
682 dprintk("yscale LPI yscale=%d\n",yscale);
683 saa_writeb(SAA7134_V_FILTER(task), 0x00 | mirror);
684 saa_writeb(SAA7134_LUMA_CONTRAST(task), 0x40);
685 saa_writeb(SAA7134_CHROMA_SATURATION(task), 0x40);
686 } else {
687 /* ACM */
688 val = 0x40 * 1024 / yscale;
689 dprintk("yscale ACM yscale=%d val=0x%x\n",yscale,val);
690 saa_writeb(SAA7134_V_FILTER(task), 0x01 | mirror);
691 saa_writeb(SAA7134_LUMA_CONTRAST(task), val);
692 saa_writeb(SAA7134_CHROMA_SATURATION(task), val);
693 }
694 saa_writeb(SAA7134_LUMA_BRIGHT(task), 0x80);
695}
696
697static void set_size(struct saa7134_dev *dev, int task,
698 int width, int height, int interlace)
699{
700 int prescale,xscale,yscale,y_even,y_odd;
701 int h_start, h_stop, v_start, v_stop;
702 int div = interlace ? 2 : 1;
703
704 /* setup video scaler */
705 h_start = dev->crop_current.left;
706 v_start = dev->crop_current.top/2;
707 h_stop = (dev->crop_current.left + dev->crop_current.width -1);
708 v_stop = (dev->crop_current.top + dev->crop_current.height -1)/2;
709
710 saa_writeb(SAA7134_VIDEO_H_START1(task), h_start & 0xff);
711 saa_writeb(SAA7134_VIDEO_H_START2(task), h_start >> 8);
712 saa_writeb(SAA7134_VIDEO_H_STOP1(task), h_stop & 0xff);
713 saa_writeb(SAA7134_VIDEO_H_STOP2(task), h_stop >> 8);
714 saa_writeb(SAA7134_VIDEO_V_START1(task), v_start & 0xff);
715 saa_writeb(SAA7134_VIDEO_V_START2(task), v_start >> 8);
716 saa_writeb(SAA7134_VIDEO_V_STOP1(task), v_stop & 0xff);
717 saa_writeb(SAA7134_VIDEO_V_STOP2(task), v_stop >> 8);
718
719 prescale = dev->crop_current.width / width;
720 if (0 == prescale)
721 prescale = 1;
722 xscale = 1024 * dev->crop_current.width / prescale / width;
723 yscale = 512 * div * dev->crop_current.height / height;
724 dprintk("prescale=%d xscale=%d yscale=%d\n",prescale,xscale,yscale);
725 set_h_prescale(dev,task,prescale);
726 saa_writeb(SAA7134_H_SCALE_INC1(task), xscale & 0xff);
727 saa_writeb(SAA7134_H_SCALE_INC2(task), xscale >> 8);
728 set_v_scale(dev,task,yscale);
729
730 saa_writeb(SAA7134_VIDEO_PIXELS1(task), width & 0xff);
731 saa_writeb(SAA7134_VIDEO_PIXELS2(task), width >> 8);
732 saa_writeb(SAA7134_VIDEO_LINES1(task), height/div & 0xff);
733 saa_writeb(SAA7134_VIDEO_LINES2(task), height/div >> 8);
734
735 /* deinterlace y offsets */
736 y_odd = dev->ctl_y_odd;
737 y_even = dev->ctl_y_even;
738 saa_writeb(SAA7134_V_PHASE_OFFSET0(task), y_odd);
739 saa_writeb(SAA7134_V_PHASE_OFFSET1(task), y_even);
740 saa_writeb(SAA7134_V_PHASE_OFFSET2(task), y_odd);
741 saa_writeb(SAA7134_V_PHASE_OFFSET3(task), y_even);
742}
743
744/* ------------------------------------------------------------------ */
745
746struct cliplist {
747 __u16 position;
748 __u8 enable;
749 __u8 disable;
750};
751
752static void set_cliplist(struct saa7134_dev *dev, int reg,
753 struct cliplist *cl, int entries, char *name)
754{
755 __u8 winbits = 0;
756 int i;
757
758 for (i = 0; i < entries; i++) {
759 winbits |= cl[i].enable;
760 winbits &= ~cl[i].disable;
761 if (i < 15 && cl[i].position == cl[i+1].position)
762 continue;
763 saa_writeb(reg + 0, winbits);
764 saa_writeb(reg + 2, cl[i].position & 0xff);
765 saa_writeb(reg + 3, cl[i].position >> 8);
766 dprintk("clip: %s winbits=%02x pos=%d\n",
767 name,winbits,cl[i].position);
768 reg += 8;
769 }
770 for (; reg < 0x400; reg += 8) {
771 saa_writeb(reg+ 0, 0);
772 saa_writeb(reg + 1, 0);
773 saa_writeb(reg + 2, 0);
774 saa_writeb(reg + 3, 0);
775 }
776}
777
778static int clip_range(int val)
779{
780 if (val < 0)
781 val = 0;
782 return val;
783}
784
785/* Sort into smallest position first order */
786static int cliplist_cmp(const void *a, const void *b)
787{
788 const struct cliplist *cla = a;
789 const struct cliplist *clb = b;
790 if (cla->position < clb->position)
791 return -1;
792 if (cla->position > clb->position)
793 return 1;
794 return 0;
795}
796
797static int setup_clipping(struct saa7134_dev *dev, struct v4l2_clip *clips,
798 int nclips, int interlace)
799{
800 struct cliplist col[16], row[16];
801 int cols = 0, rows = 0, i;
802 int div = interlace ? 2 : 1;
803
804 memset(col, 0, sizeof(col));
805 memset(row, 0, sizeof(row));
806 for (i = 0; i < nclips && i < 8; i++) {
807 col[cols].position = clip_range(clips[i].c.left);
808 col[cols].enable = (1 << i);
809 cols++;
810 col[cols].position = clip_range(clips[i].c.left+clips[i].c.width);
811 col[cols].disable = (1 << i);
812 cols++;
813 row[rows].position = clip_range(clips[i].c.top / div);
814 row[rows].enable = (1 << i);
815 rows++;
816 row[rows].position = clip_range((clips[i].c.top + clips[i].c.height)
817 / div);
818 row[rows].disable = (1 << i);
819 rows++;
820 }
821 sort(col, cols, sizeof col[0], cliplist_cmp, NULL);
822 sort(row, rows, sizeof row[0], cliplist_cmp, NULL);
823 set_cliplist(dev,0x380,col,cols,"cols");
824 set_cliplist(dev,0x384,row,rows,"rows");
825 return 0;
826}
827
828static int verify_preview(struct saa7134_dev *dev, struct v4l2_window *win)
829{
830 enum v4l2_field field;
831 int maxw, maxh;
832
833 if (NULL == dev->ovbuf.base)
834 return -EINVAL;
835 if (NULL == dev->ovfmt)
836 return -EINVAL;
837 if (win->w.width < 48 || win->w.height < 32)
838 return -EINVAL;
839 if (win->clipcount > 2048)
840 return -EINVAL;
841
842 field = win->field;
843 maxw = dev->crop_current.width;
844 maxh = dev->crop_current.height;
845
846 if (V4L2_FIELD_ANY == field) {
847 field = (win->w.height > maxh/2)
848 ? V4L2_FIELD_INTERLACED
849 : V4L2_FIELD_TOP;
850 }
851 switch (field) {
852 case V4L2_FIELD_TOP:
853 case V4L2_FIELD_BOTTOM:
854 maxh = maxh / 2;
855 break;
856 case V4L2_FIELD_INTERLACED:
857 break;
858 default:
859 return -EINVAL;
860 }
861
862 win->field = field;
863 if (win->w.width > maxw)
864 win->w.width = maxw;
865 if (win->w.height > maxh)
866 win->w.height = maxh;
867 return 0;
868}
869
870static int start_preview(struct saa7134_dev *dev, struct saa7134_fh *fh)
871{
872 unsigned long base,control,bpl;
873 int err;
874
875 err = verify_preview(dev,&fh->win);
876 if (0 != err)
877 return err;
878
879 dev->ovfield = fh->win.field;
880 dprintk("start_preview %dx%d+%d+%d %s field=%s\n",
881 fh->win.w.width,fh->win.w.height,
882 fh->win.w.left,fh->win.w.top,
883 dev->ovfmt->name,v4l2_field_names[dev->ovfield]);
884
885 /* setup window + clipping */
886 set_size(dev,TASK_B,fh->win.w.width,fh->win.w.height,
887 V4L2_FIELD_HAS_BOTH(dev->ovfield));
888 setup_clipping(dev,fh->clips,fh->nclips,
889 V4L2_FIELD_HAS_BOTH(dev->ovfield));
890 if (dev->ovfmt->yuv)
891 saa_andorb(SAA7134_DATA_PATH(TASK_B), 0x3f, 0x03);
892 else
893 saa_andorb(SAA7134_DATA_PATH(TASK_B), 0x3f, 0x01);
894 saa_writeb(SAA7134_OFMT_VIDEO_B, dev->ovfmt->pm | 0x20);
895
896 /* dma: setup channel 1 (= Video Task B) */
897 base = (unsigned long)dev->ovbuf.base;
898 base += dev->ovbuf.fmt.bytesperline * fh->win.w.top;
899 base += dev->ovfmt->depth/8 * fh->win.w.left;
900 bpl = dev->ovbuf.fmt.bytesperline;
901 control = SAA7134_RS_CONTROL_BURST_16;
902 if (dev->ovfmt->bswap)
903 control |= SAA7134_RS_CONTROL_BSWAP;
904 if (dev->ovfmt->wswap)
905 control |= SAA7134_RS_CONTROL_WSWAP;
906 if (V4L2_FIELD_HAS_BOTH(dev->ovfield)) {
907 saa_writel(SAA7134_RS_BA1(1),base);
908 saa_writel(SAA7134_RS_BA2(1),base+bpl);
909 saa_writel(SAA7134_RS_PITCH(1),bpl*2);
910 saa_writel(SAA7134_RS_CONTROL(1),control);
911 } else {
912 saa_writel(SAA7134_RS_BA1(1),base);
913 saa_writel(SAA7134_RS_BA2(1),base);
914 saa_writel(SAA7134_RS_PITCH(1),bpl);
915 saa_writel(SAA7134_RS_CONTROL(1),control);
916 }
917
918 /* start dma */
919 dev->ovenable = 1;
920 saa7134_set_dmabits(dev);
921
922 return 0;
923}
924
925static int stop_preview(struct saa7134_dev *dev, struct saa7134_fh *fh)
926{
927 dev->ovenable = 0;
928 saa7134_set_dmabits(dev);
929 return 0;
930}
931
932/* ------------------------------------------------------------------ */
933
934static int buffer_activate(struct saa7134_dev *dev,
935 struct saa7134_buf *buf,
936 struct saa7134_buf *next)
937{
938 unsigned long base,control,bpl;
939 unsigned long bpl_uv,lines_uv,base2,base3,tmp; /* planar */
940
941 dprintk("buffer_activate buf=%p\n",buf);
942 buf->vb.state = VIDEOBUF_ACTIVE;
943 buf->top_seen = 0;
944
945 set_size(dev,TASK_A,buf->vb.width,buf->vb.height,
946 V4L2_FIELD_HAS_BOTH(buf->vb.field));
947 if (buf->fmt->yuv)
948 saa_andorb(SAA7134_DATA_PATH(TASK_A), 0x3f, 0x03);
949 else
950 saa_andorb(SAA7134_DATA_PATH(TASK_A), 0x3f, 0x01);
951 saa_writeb(SAA7134_OFMT_VIDEO_A, buf->fmt->pm);
952
953 /* DMA: setup channel 0 (= Video Task A0) */
954 base = saa7134_buffer_base(buf);
955 if (buf->fmt->planar)
956 bpl = buf->vb.width;
957 else
958 bpl = (buf->vb.width * buf->fmt->depth) / 8;
959 control = SAA7134_RS_CONTROL_BURST_16 |
960 SAA7134_RS_CONTROL_ME |
961 (buf->pt->dma >> 12);
962 if (buf->fmt->bswap)
963 control |= SAA7134_RS_CONTROL_BSWAP;
964 if (buf->fmt->wswap)
965 control |= SAA7134_RS_CONTROL_WSWAP;
966 if (V4L2_FIELD_HAS_BOTH(buf->vb.field)) {
967 /* interlaced */
968 saa_writel(SAA7134_RS_BA1(0),base);
969 saa_writel(SAA7134_RS_BA2(0),base+bpl);
970 saa_writel(SAA7134_RS_PITCH(0),bpl*2);
971 } else {
972 /* non-interlaced */
973 saa_writel(SAA7134_RS_BA1(0),base);
974 saa_writel(SAA7134_RS_BA2(0),base);
975 saa_writel(SAA7134_RS_PITCH(0),bpl);
976 }
977 saa_writel(SAA7134_RS_CONTROL(0),control);
978
979 if (buf->fmt->planar) {
980 /* DMA: setup channel 4+5 (= planar task A) */
981 bpl_uv = bpl >> buf->fmt->hshift;
982 lines_uv = buf->vb.height >> buf->fmt->vshift;
983 base2 = base + bpl * buf->vb.height;
984 base3 = base2 + bpl_uv * lines_uv;
985 if (buf->fmt->uvswap)
986 tmp = base2, base2 = base3, base3 = tmp;
987 dprintk("uv: bpl=%ld lines=%ld base2/3=%ld/%ld\n",
988 bpl_uv,lines_uv,base2,base3);
989 if (V4L2_FIELD_HAS_BOTH(buf->vb.field)) {
990 /* interlaced */
991 saa_writel(SAA7134_RS_BA1(4),base2);
992 saa_writel(SAA7134_RS_BA2(4),base2+bpl_uv);
993 saa_writel(SAA7134_RS_PITCH(4),bpl_uv*2);
994 saa_writel(SAA7134_RS_BA1(5),base3);
995 saa_writel(SAA7134_RS_BA2(5),base3+bpl_uv);
996 saa_writel(SAA7134_RS_PITCH(5),bpl_uv*2);
997 } else {
998 /* non-interlaced */
999 saa_writel(SAA7134_RS_BA1(4),base2);
1000 saa_writel(SAA7134_RS_BA2(4),base2);
1001 saa_writel(SAA7134_RS_PITCH(4),bpl_uv);
1002 saa_writel(SAA7134_RS_BA1(5),base3);
1003 saa_writel(SAA7134_RS_BA2(5),base3);
1004 saa_writel(SAA7134_RS_PITCH(5),bpl_uv);
1005 }
1006 saa_writel(SAA7134_RS_CONTROL(4),control);
1007 saa_writel(SAA7134_RS_CONTROL(5),control);
1008 }
1009
1010 /* start DMA */
1011 saa7134_set_dmabits(dev);
1012 mod_timer(&dev->video_q.timeout, jiffies+BUFFER_TIMEOUT);
1013 return 0;
1014}
1015
1016static int buffer_prepare(struct videobuf_queue *q,
1017 struct videobuf_buffer *vb,
1018 enum v4l2_field field)
1019{
1020 struct saa7134_fh *fh = q->priv_data;
1021 struct saa7134_dev *dev = fh->dev;
1022 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
1023 unsigned int size;
1024 int err;
1025
1026 /* sanity checks */
1027 if (NULL == fh->fmt)
1028 return -EINVAL;
1029 if (fh->width < 48 ||
1030 fh->height < 32 ||
1031 fh->width/4 > dev->crop_current.width ||
1032 fh->height/4 > dev->crop_current.height ||
1033 fh->width > dev->crop_bounds.width ||
1034 fh->height > dev->crop_bounds.height)
1035 return -EINVAL;
1036 size = (fh->width * fh->height * fh->fmt->depth) >> 3;
1037 if (0 != buf->vb.baddr && buf->vb.bsize < size)
1038 return -EINVAL;
1039
1040 dprintk("buffer_prepare [%d,size=%dx%d,bytes=%d,fields=%s,%s]\n",
1041 vb->i,fh->width,fh->height,size,v4l2_field_names[field],
1042 fh->fmt->name);
1043 if (buf->vb.width != fh->width ||
1044 buf->vb.height != fh->height ||
1045 buf->vb.size != size ||
1046 buf->vb.field != field ||
1047 buf->fmt != fh->fmt) {
1048 saa7134_dma_free(q,buf);
1049 }
1050
1051 if (VIDEOBUF_NEEDS_INIT == buf->vb.state) {
1052 struct videobuf_dmabuf *dma=videobuf_to_dma(&buf->vb);
1053
1054 buf->vb.width = fh->width;
1055 buf->vb.height = fh->height;
1056 buf->vb.size = size;
1057 buf->vb.field = field;
1058 buf->fmt = fh->fmt;
1059 buf->pt = &fh->pt_cap;
1060 dev->video_q.curr = NULL;
1061
1062 err = videobuf_iolock(q,&buf->vb,&dev->ovbuf);
1063 if (err)
1064 goto oops;
1065 err = saa7134_pgtable_build(dev->pci,buf->pt,
1066 dma->sglist,
1067 dma->sglen,
1068 saa7134_buffer_startpage(buf));
1069 if (err)
1070 goto oops;
1071 }
1072 buf->vb.state = VIDEOBUF_PREPARED;
1073 buf->activate = buffer_activate;
1074 return 0;
1075
1076 oops:
1077 saa7134_dma_free(q,buf);
1078 return err;
1079}
1080
1081static int
1082buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
1083{
1084 struct saa7134_fh *fh = q->priv_data;
1085
1086 *size = fh->fmt->depth * fh->width * fh->height >> 3;
1087 if (0 == *count)
1088 *count = gbuffers;
1089 *count = saa7134_buffer_count(*size,*count);
1090 return 0;
1091}
1092
1093static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
1094{
1095 struct saa7134_fh *fh = q->priv_data;
1096 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
1097
1098 saa7134_buffer_queue(fh->dev,&fh->dev->video_q,buf);
1099}
1100
1101static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
1102{
1103 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
1104
1105 saa7134_dma_free(q,buf);
1106}
1107
1108static struct videobuf_queue_ops video_qops = {
1109 .buf_setup = buffer_setup,
1110 .buf_prepare = buffer_prepare,
1111 .buf_queue = buffer_queue,
1112 .buf_release = buffer_release,
1113};
1114
1115/* ------------------------------------------------------------------ */
1116
1117int saa7134_g_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c)
1118{
1119 const struct v4l2_queryctrl* ctrl;
1120
1121 ctrl = ctrl_by_id(c->id);
1122 if (NULL == ctrl)
1123 return -EINVAL;
1124 switch (c->id) {
1125 case V4L2_CID_BRIGHTNESS:
1126 c->value = dev->ctl_bright;
1127 break;
1128 case V4L2_CID_HUE:
1129 c->value = dev->ctl_hue;
1130 break;
1131 case V4L2_CID_CONTRAST:
1132 c->value = dev->ctl_contrast;
1133 break;
1134 case V4L2_CID_SATURATION:
1135 c->value = dev->ctl_saturation;
1136 break;
1137 case V4L2_CID_AUDIO_MUTE:
1138 c->value = dev->ctl_mute;
1139 break;
1140 case V4L2_CID_AUDIO_VOLUME:
1141 c->value = dev->ctl_volume;
1142 break;
1143 case V4L2_CID_PRIVATE_INVERT:
1144 c->value = dev->ctl_invert;
1145 break;
1146 case V4L2_CID_HFLIP:
1147 c->value = dev->ctl_mirror;
1148 break;
1149 case V4L2_CID_PRIVATE_Y_EVEN:
1150 c->value = dev->ctl_y_even;
1151 break;
1152 case V4L2_CID_PRIVATE_Y_ODD:
1153 c->value = dev->ctl_y_odd;
1154 break;
1155 case V4L2_CID_PRIVATE_AUTOMUTE:
1156 c->value = dev->ctl_automute;
1157 break;
1158 default:
1159 return -EINVAL;
1160 }
1161 return 0;
1162}
1163EXPORT_SYMBOL_GPL(saa7134_g_ctrl_internal);
1164
1165static int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c)
1166{
1167 struct saa7134_fh *fh = priv;
1168
1169 return saa7134_g_ctrl_internal(fh->dev, fh, c);
1170}
1171
1172int saa7134_s_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c)
1173{
1174 const struct v4l2_queryctrl* ctrl;
1175 unsigned long flags;
1176 int restart_overlay = 0;
1177 int err;
1178
1179 /* When called from the empress code fh == NULL.
1180 That needs to be fixed somehow, but for now this is
1181 good enough. */
1182 if (fh) {
1183 err = v4l2_prio_check(&dev->prio, fh->prio);
1184 if (0 != err)
1185 return err;
1186 }
1187 err = -EINVAL;
1188
1189 mutex_lock(&dev->lock);
1190
1191 ctrl = ctrl_by_id(c->id);
1192 if (NULL == ctrl)
1193 goto error;
1194
1195 dprintk("set_control name=%s val=%d\n",ctrl->name,c->value);
1196 switch (ctrl->type) {
1197 case V4L2_CTRL_TYPE_BOOLEAN:
1198 case V4L2_CTRL_TYPE_MENU:
1199 case V4L2_CTRL_TYPE_INTEGER:
1200 if (c->value < ctrl->minimum)
1201 c->value = ctrl->minimum;
1202 if (c->value > ctrl->maximum)
1203 c->value = ctrl->maximum;
1204 break;
1205 default:
1206 /* nothing */;
1207 };
1208 switch (c->id) {
1209 case V4L2_CID_BRIGHTNESS:
1210 dev->ctl_bright = c->value;
1211 saa_writeb(SAA7134_DEC_LUMA_BRIGHT, dev->ctl_bright);
1212 break;
1213 case V4L2_CID_HUE:
1214 dev->ctl_hue = c->value;
1215 saa_writeb(SAA7134_DEC_CHROMA_HUE, dev->ctl_hue);
1216 break;
1217 case V4L2_CID_CONTRAST:
1218 dev->ctl_contrast = c->value;
1219 saa_writeb(SAA7134_DEC_LUMA_CONTRAST,
1220 dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast);
1221 break;
1222 case V4L2_CID_SATURATION:
1223 dev->ctl_saturation = c->value;
1224 saa_writeb(SAA7134_DEC_CHROMA_SATURATION,
1225 dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation);
1226 break;
1227 case V4L2_CID_AUDIO_MUTE:
1228 dev->ctl_mute = c->value;
1229 saa7134_tvaudio_setmute(dev);
1230 break;
1231 case V4L2_CID_AUDIO_VOLUME:
1232 dev->ctl_volume = c->value;
1233 saa7134_tvaudio_setvolume(dev,dev->ctl_volume);
1234 break;
1235 case V4L2_CID_PRIVATE_INVERT:
1236 dev->ctl_invert = c->value;
1237 saa_writeb(SAA7134_DEC_LUMA_CONTRAST,
1238 dev->ctl_invert ? -dev->ctl_contrast : dev->ctl_contrast);
1239 saa_writeb(SAA7134_DEC_CHROMA_SATURATION,
1240 dev->ctl_invert ? -dev->ctl_saturation : dev->ctl_saturation);
1241 break;
1242 case V4L2_CID_HFLIP:
1243 dev->ctl_mirror = c->value;
1244 restart_overlay = 1;
1245 break;
1246 case V4L2_CID_PRIVATE_Y_EVEN:
1247 dev->ctl_y_even = c->value;
1248 restart_overlay = 1;
1249 break;
1250 case V4L2_CID_PRIVATE_Y_ODD:
1251 dev->ctl_y_odd = c->value;
1252 restart_overlay = 1;
1253 break;
1254 case V4L2_CID_PRIVATE_AUTOMUTE:
1255 {
1256 struct v4l2_priv_tun_config tda9887_cfg;
1257
1258 tda9887_cfg.tuner = TUNER_TDA9887;
1259 tda9887_cfg.priv = &dev->tda9887_conf;
1260
1261 dev->ctl_automute = c->value;
1262 if (dev->tda9887_conf) {
1263 if (dev->ctl_automute)
1264 dev->tda9887_conf |= TDA9887_AUTOMUTE;
1265 else
1266 dev->tda9887_conf &= ~TDA9887_AUTOMUTE;
1267
1268 saa_call_all(dev, tuner, s_config, &tda9887_cfg);
1269 }
1270 break;
1271 }
1272 default:
1273 goto error;
1274 }
1275 if (restart_overlay && fh && res_check(fh, RESOURCE_OVERLAY)) {
1276 spin_lock_irqsave(&dev->slock,flags);
1277 stop_preview(dev,fh);
1278 start_preview(dev,fh);
1279 spin_unlock_irqrestore(&dev->slock,flags);
1280 }
1281 err = 0;
1282
1283error:
1284 mutex_unlock(&dev->lock);
1285 return err;
1286}
1287EXPORT_SYMBOL_GPL(saa7134_s_ctrl_internal);
1288
1289static int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c)
1290{
1291 struct saa7134_fh *fh = f;
1292
1293 return saa7134_s_ctrl_internal(fh->dev, fh, c);
1294}
1295
1296/* ------------------------------------------------------------------ */
1297
1298static struct videobuf_queue* saa7134_queue(struct saa7134_fh *fh)
1299{
1300 struct videobuf_queue* q = NULL;
1301
1302 switch (fh->type) {
1303 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1304 q = &fh->cap;
1305 break;
1306 case V4L2_BUF_TYPE_VBI_CAPTURE:
1307 q = &fh->vbi;
1308 break;
1309 default:
1310 BUG();
1311 }
1312 return q;
1313}
1314
1315static int saa7134_resource(struct saa7134_fh *fh)
1316{
1317 if (fh->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
1318 return RESOURCE_VIDEO;
1319
1320 if (fh->type == V4L2_BUF_TYPE_VBI_CAPTURE)
1321 return RESOURCE_VBI;
1322
1323 BUG();
1324 return 0;
1325}
1326
1327static int video_open(struct file *file)
1328{
1329 struct video_device *vdev = video_devdata(file);
1330 struct saa7134_dev *dev = video_drvdata(file);
1331 struct saa7134_fh *fh;
1332 enum v4l2_buf_type type = 0;
1333 int radio = 0;
1334
1335 switch (vdev->vfl_type) {
1336 case VFL_TYPE_GRABBER:
1337 type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1338 break;
1339 case VFL_TYPE_VBI:
1340 type = V4L2_BUF_TYPE_VBI_CAPTURE;
1341 break;
1342 case VFL_TYPE_RADIO:
1343 radio = 1;
1344 break;
1345 }
1346
1347 dprintk("open dev=%s radio=%d type=%s\n", video_device_node_name(vdev),
1348 radio, v4l2_type_names[type]);
1349
1350 /* allocate + initialize per filehandle data */
1351 fh = kzalloc(sizeof(*fh),GFP_KERNEL);
1352 if (NULL == fh)
1353 return -ENOMEM;
1354
1355 file->private_data = fh;
1356 fh->dev = dev;
1357 fh->radio = radio;
1358 fh->type = type;
1359 fh->fmt = format_by_fourcc(V4L2_PIX_FMT_BGR24);
1360 fh->width = 720;
1361 fh->height = 576;
1362 v4l2_prio_open(&dev->prio, &fh->prio);
1363
1364 videobuf_queue_sg_init(&fh->cap, &video_qops,
1365 &dev->pci->dev, &dev->slock,
1366 V4L2_BUF_TYPE_VIDEO_CAPTURE,
1367 V4L2_FIELD_INTERLACED,
1368 sizeof(struct saa7134_buf),
1369 fh, NULL);
1370 videobuf_queue_sg_init(&fh->vbi, &saa7134_vbi_qops,
1371 &dev->pci->dev, &dev->slock,
1372 V4L2_BUF_TYPE_VBI_CAPTURE,
1373 V4L2_FIELD_SEQ_TB,
1374 sizeof(struct saa7134_buf),
1375 fh, NULL);
1376 saa7134_pgtable_alloc(dev->pci,&fh->pt_cap);
1377 saa7134_pgtable_alloc(dev->pci,&fh->pt_vbi);
1378
1379 if (fh->radio) {
1380 /* switch to radio mode */
1381 saa7134_tvaudio_setinput(dev,&card(dev).radio);
1382 saa_call_all(dev, tuner, s_radio);
1383 } else {
1384 /* switch to video/vbi mode */
1385 video_mux(dev,dev->ctl_input);
1386 }
1387 return 0;
1388}
1389
1390static ssize_t
1391video_read(struct file *file, char __user *data, size_t count, loff_t *ppos)
1392{
1393 struct saa7134_fh *fh = file->private_data;
1394
1395 switch (fh->type) {
1396 case V4L2_BUF_TYPE_VIDEO_CAPTURE:
1397 if (res_locked(fh->dev,RESOURCE_VIDEO))
1398 return -EBUSY;
1399 return videobuf_read_one(saa7134_queue(fh),
1400 data, count, ppos,
1401 file->f_flags & O_NONBLOCK);
1402 case V4L2_BUF_TYPE_VBI_CAPTURE:
1403 if (!res_get(fh->dev,fh,RESOURCE_VBI))
1404 return -EBUSY;
1405 return videobuf_read_stream(saa7134_queue(fh),
1406 data, count, ppos, 1,
1407 file->f_flags & O_NONBLOCK);
1408 break;
1409 default:
1410 BUG();
1411 return 0;
1412 }
1413}
1414
1415static unsigned int
1416video_poll(struct file *file, struct poll_table_struct *wait)
1417{
1418 struct saa7134_fh *fh = file->private_data;
1419 struct videobuf_buffer *buf = NULL;
1420 unsigned int rc = 0;
1421
1422 if (V4L2_BUF_TYPE_VBI_CAPTURE == fh->type)
1423 return videobuf_poll_stream(file, &fh->vbi, wait);
1424
1425 if (res_check(fh,RESOURCE_VIDEO)) {
1426 mutex_lock(&fh->cap.vb_lock);
1427 if (!list_empty(&fh->cap.stream))
1428 buf = list_entry(fh->cap.stream.next, struct videobuf_buffer, stream);
1429 } else {
1430 mutex_lock(&fh->cap.vb_lock);
1431 if (UNSET == fh->cap.read_off) {
1432 /* need to capture a new frame */
1433 if (res_locked(fh->dev,RESOURCE_VIDEO))
1434 goto err;
1435 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,fh->cap.field))
1436 goto err;
1437 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
1438 fh->cap.read_off = 0;
1439 }
1440 buf = fh->cap.read_buf;
1441 }
1442
1443 if (!buf)
1444 goto err;
1445
1446 poll_wait(file, &buf->done, wait);
1447 if (buf->state == VIDEOBUF_DONE ||
1448 buf->state == VIDEOBUF_ERROR)
1449 rc = POLLIN|POLLRDNORM;
1450 mutex_unlock(&fh->cap.vb_lock);
1451 return rc;
1452
1453err:
1454 mutex_unlock(&fh->cap.vb_lock);
1455 return POLLERR;
1456}
1457
1458static int video_release(struct file *file)
1459{
1460 struct saa7134_fh *fh = file->private_data;
1461 struct saa7134_dev *dev = fh->dev;
1462 struct saa6588_command cmd;
1463 unsigned long flags;
1464
1465 /* turn off overlay */
1466 if (res_check(fh, RESOURCE_OVERLAY)) {
1467 spin_lock_irqsave(&dev->slock,flags);
1468 stop_preview(dev,fh);
1469 spin_unlock_irqrestore(&dev->slock,flags);
1470 res_free(dev,fh,RESOURCE_OVERLAY);
1471 }
1472
1473 /* stop video capture */
1474 if (res_check(fh, RESOURCE_VIDEO)) {
1475 videobuf_streamoff(&fh->cap);
1476 res_free(dev,fh,RESOURCE_VIDEO);
1477 }
1478 if (fh->cap.read_buf) {
1479 buffer_release(&fh->cap,fh->cap.read_buf);
1480 kfree(fh->cap.read_buf);
1481 }
1482
1483 /* stop vbi capture */
1484 if (res_check(fh, RESOURCE_VBI)) {
1485 videobuf_stop(&fh->vbi);
1486 res_free(dev,fh,RESOURCE_VBI);
1487 }
1488
1489 /* ts-capture will not work in planar mode, so turn it off Hac: 04.05*/
1490 saa_andorb(SAA7134_OFMT_VIDEO_A, 0x1f, 0);
1491 saa_andorb(SAA7134_OFMT_VIDEO_B, 0x1f, 0);
1492 saa_andorb(SAA7134_OFMT_DATA_A, 0x1f, 0);
1493 saa_andorb(SAA7134_OFMT_DATA_B, 0x1f, 0);
1494
1495 saa_call_all(dev, core, s_power, 0);
1496 if (fh->radio)
1497 saa_call_all(dev, core, ioctl, SAA6588_CMD_CLOSE, &cmd);
1498
1499 /* free stuff */
1500 videobuf_mmap_free(&fh->cap);
1501 videobuf_mmap_free(&fh->vbi);
1502 saa7134_pgtable_free(dev->pci,&fh->pt_cap);
1503 saa7134_pgtable_free(dev->pci,&fh->pt_vbi);
1504
1505 v4l2_prio_close(&dev->prio, fh->prio);
1506 file->private_data = NULL;
1507 kfree(fh);
1508 return 0;
1509}
1510
1511static int video_mmap(struct file *file, struct vm_area_struct * vma)
1512{
1513 struct saa7134_fh *fh = file->private_data;
1514
1515 return videobuf_mmap_mapper(saa7134_queue(fh), vma);
1516}
1517
1518static ssize_t radio_read(struct file *file, char __user *data,
1519 size_t count, loff_t *ppos)
1520{
1521 struct saa7134_fh *fh = file->private_data;
1522 struct saa7134_dev *dev = fh->dev;
1523 struct saa6588_command cmd;
1524
1525 cmd.block_count = count/3;
1526 cmd.buffer = data;
1527 cmd.instance = file;
1528 cmd.result = -ENODEV;
1529
1530 saa_call_all(dev, core, ioctl, SAA6588_CMD_READ, &cmd);
1531
1532 return cmd.result;
1533}
1534
1535static unsigned int radio_poll(struct file *file, poll_table *wait)
1536{
1537 struct saa7134_fh *fh = file->private_data;
1538 struct saa7134_dev *dev = fh->dev;
1539 struct saa6588_command cmd;
1540
1541 cmd.instance = file;
1542 cmd.event_list = wait;
1543 cmd.result = -ENODEV;
1544 saa_call_all(dev, core, ioctl, SAA6588_CMD_POLL, &cmd);
1545
1546 return cmd.result;
1547}
1548
1549/* ------------------------------------------------------------------ */
1550
1551static int saa7134_try_get_set_fmt_vbi_cap(struct file *file, void *priv,
1552 struct v4l2_format *f)
1553{
1554 struct saa7134_fh *fh = priv;
1555 struct saa7134_dev *dev = fh->dev;
1556 struct saa7134_tvnorm *norm = dev->tvnorm;
1557
1558 f->fmt.vbi.sampling_rate = 6750000 * 4;
1559 f->fmt.vbi.samples_per_line = 2048 /* VBI_LINE_LENGTH */;
1560 f->fmt.vbi.sample_format = V4L2_PIX_FMT_GREY;
1561 f->fmt.vbi.offset = 64 * 4;
1562 f->fmt.vbi.start[0] = norm->vbi_v_start_0;
1563 f->fmt.vbi.count[0] = norm->vbi_v_stop_0 - norm->vbi_v_start_0 +1;
1564 f->fmt.vbi.start[1] = norm->vbi_v_start_1;
1565 f->fmt.vbi.count[1] = f->fmt.vbi.count[0];
1566 f->fmt.vbi.flags = 0; /* VBI_UNSYNC VBI_INTERLACED */
1567
1568 return 0;
1569}
1570
1571static int saa7134_g_fmt_vid_cap(struct file *file, void *priv,
1572 struct v4l2_format *f)
1573{
1574 struct saa7134_fh *fh = priv;
1575
1576 f->fmt.pix.width = fh->width;
1577 f->fmt.pix.height = fh->height;
1578 f->fmt.pix.field = fh->cap.field;
1579 f->fmt.pix.pixelformat = fh->fmt->fourcc;
1580 f->fmt.pix.bytesperline =
1581 (f->fmt.pix.width * fh->fmt->depth) >> 3;
1582 f->fmt.pix.sizeimage =
1583 f->fmt.pix.height * f->fmt.pix.bytesperline;
1584 return 0;
1585}
1586
1587static int saa7134_g_fmt_vid_overlay(struct file *file, void *priv,
1588 struct v4l2_format *f)
1589{
1590 struct saa7134_fh *fh = priv;
1591
1592 if (saa7134_no_overlay > 0) {
1593 printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
1594 return -EINVAL;
1595 }
1596 f->fmt.win = fh->win;
1597
1598 return 0;
1599}
1600
1601static int saa7134_try_fmt_vid_cap(struct file *file, void *priv,
1602 struct v4l2_format *f)
1603{
1604 struct saa7134_fh *fh = priv;
1605 struct saa7134_dev *dev = fh->dev;
1606 struct saa7134_format *fmt;
1607 enum v4l2_field field;
1608 unsigned int maxw, maxh;
1609
1610 fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1611 if (NULL == fmt)
1612 return -EINVAL;
1613
1614 field = f->fmt.pix.field;
1615 maxw = min(dev->crop_current.width*4, dev->crop_bounds.width);
1616 maxh = min(dev->crop_current.height*4, dev->crop_bounds.height);
1617
1618 if (V4L2_FIELD_ANY == field) {
1619 field = (f->fmt.pix.height > maxh/2)
1620 ? V4L2_FIELD_INTERLACED
1621 : V4L2_FIELD_BOTTOM;
1622 }
1623 switch (field) {
1624 case V4L2_FIELD_TOP:
1625 case V4L2_FIELD_BOTTOM:
1626 maxh = maxh / 2;
1627 break;
1628 case V4L2_FIELD_INTERLACED:
1629 break;
1630 default:
1631 return -EINVAL;
1632 }
1633
1634 f->fmt.pix.field = field;
1635 if (f->fmt.pix.width < 48)
1636 f->fmt.pix.width = 48;
1637 if (f->fmt.pix.height < 32)
1638 f->fmt.pix.height = 32;
1639 if (f->fmt.pix.width > maxw)
1640 f->fmt.pix.width = maxw;
1641 if (f->fmt.pix.height > maxh)
1642 f->fmt.pix.height = maxh;
1643 f->fmt.pix.width &= ~0x03;
1644 f->fmt.pix.bytesperline =
1645 (f->fmt.pix.width * fmt->depth) >> 3;
1646 f->fmt.pix.sizeimage =
1647 f->fmt.pix.height * f->fmt.pix.bytesperline;
1648
1649 return 0;
1650}
1651
1652static int saa7134_try_fmt_vid_overlay(struct file *file, void *priv,
1653 struct v4l2_format *f)
1654{
1655 struct saa7134_fh *fh = priv;
1656 struct saa7134_dev *dev = fh->dev;
1657
1658 if (saa7134_no_overlay > 0) {
1659 printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
1660 return -EINVAL;
1661 }
1662
1663 return verify_preview(dev, &f->fmt.win);
1664}
1665
1666static int saa7134_s_fmt_vid_cap(struct file *file, void *priv,
1667 struct v4l2_format *f)
1668{
1669 struct saa7134_fh *fh = priv;
1670 int err;
1671
1672 err = saa7134_try_fmt_vid_cap(file, priv, f);
1673 if (0 != err)
1674 return err;
1675
1676 fh->fmt = format_by_fourcc(f->fmt.pix.pixelformat);
1677 fh->width = f->fmt.pix.width;
1678 fh->height = f->fmt.pix.height;
1679 fh->cap.field = f->fmt.pix.field;
1680 return 0;
1681}
1682
1683static int saa7134_s_fmt_vid_overlay(struct file *file, void *priv,
1684 struct v4l2_format *f)
1685{
1686 struct saa7134_fh *fh = priv;
1687 struct saa7134_dev *dev = fh->dev;
1688 int err;
1689 unsigned long flags;
1690
1691 if (saa7134_no_overlay > 0) {
1692 printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
1693 return -EINVAL;
1694 }
1695 err = verify_preview(dev, &f->fmt.win);
1696 if (0 != err)
1697 return err;
1698
1699 mutex_lock(&dev->lock);
1700
1701 fh->win = f->fmt.win;
1702 fh->nclips = f->fmt.win.clipcount;
1703
1704 if (fh->nclips > 8)
1705 fh->nclips = 8;
1706
1707 if (copy_from_user(fh->clips, f->fmt.win.clips,
1708 sizeof(struct v4l2_clip)*fh->nclips)) {
1709 mutex_unlock(&dev->lock);
1710 return -EFAULT;
1711 }
1712
1713 if (res_check(fh, RESOURCE_OVERLAY)) {
1714 spin_lock_irqsave(&dev->slock, flags);
1715 stop_preview(dev, fh);
1716 start_preview(dev, fh);
1717 spin_unlock_irqrestore(&dev->slock, flags);
1718 }
1719
1720 mutex_unlock(&dev->lock);
1721 return 0;
1722}
1723
1724int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c)
1725{
1726 const struct v4l2_queryctrl *ctrl;
1727
1728 if ((c->id < V4L2_CID_BASE ||
1729 c->id >= V4L2_CID_LASTP1) &&
1730 (c->id < V4L2_CID_PRIVATE_BASE ||
1731 c->id >= V4L2_CID_PRIVATE_LASTP1))
1732 return -EINVAL;
1733 ctrl = ctrl_by_id(c->id);
1734 *c = (NULL != ctrl) ? *ctrl : no_ctrl;
1735 return 0;
1736}
1737EXPORT_SYMBOL_GPL(saa7134_queryctrl);
1738
1739static int saa7134_enum_input(struct file *file, void *priv,
1740 struct v4l2_input *i)
1741{
1742 struct saa7134_fh *fh = priv;
1743 struct saa7134_dev *dev = fh->dev;
1744 unsigned int n;
1745
1746 n = i->index;
1747 if (n >= SAA7134_INPUT_MAX)
1748 return -EINVAL;
1749 if (NULL == card_in(dev, i->index).name)
1750 return -EINVAL;
1751 i->index = n;
1752 i->type = V4L2_INPUT_TYPE_CAMERA;
1753 strcpy(i->name, card_in(dev, n).name);
1754 if (card_in(dev, n).tv)
1755 i->type = V4L2_INPUT_TYPE_TUNER;
1756 i->audioset = 1;
1757 if (n == dev->ctl_input) {
1758 int v1 = saa_readb(SAA7134_STATUS_VIDEO1);
1759 int v2 = saa_readb(SAA7134_STATUS_VIDEO2);
1760
1761 if (0 != (v1 & 0x40))
1762 i->status |= V4L2_IN_ST_NO_H_LOCK;
1763 if (0 != (v2 & 0x40))
1764 i->status |= V4L2_IN_ST_NO_SYNC;
1765 if (0 != (v2 & 0x0e))
1766 i->status |= V4L2_IN_ST_MACROVISION;
1767 }
1768 i->std = SAA7134_NORMS;
1769 return 0;
1770}
1771
1772static int saa7134_g_input(struct file *file, void *priv, unsigned int *i)
1773{
1774 struct saa7134_fh *fh = priv;
1775 struct saa7134_dev *dev = fh->dev;
1776
1777 *i = dev->ctl_input;
1778 return 0;
1779}
1780
1781static int saa7134_s_input(struct file *file, void *priv, unsigned int i)
1782{
1783 struct saa7134_fh *fh = priv;
1784 struct saa7134_dev *dev = fh->dev;
1785 int err;
1786
1787 err = v4l2_prio_check(&dev->prio, fh->prio);
1788 if (0 != err)
1789 return err;
1790
1791 if (i >= SAA7134_INPUT_MAX)
1792 return -EINVAL;
1793 if (NULL == card_in(dev, i).name)
1794 return -EINVAL;
1795 mutex_lock(&dev->lock);
1796 video_mux(dev, i);
1797 mutex_unlock(&dev->lock);
1798 return 0;
1799}
1800
1801static int saa7134_querycap(struct file *file, void *priv,
1802 struct v4l2_capability *cap)
1803{
1804 struct saa7134_fh *fh = priv;
1805 struct saa7134_dev *dev = fh->dev;
1806
1807 unsigned int tuner_type = dev->tuner_type;
1808
1809 strcpy(cap->driver, "saa7134");
1810 strlcpy(cap->card, saa7134_boards[dev->board].name,
1811 sizeof(cap->card));
1812 sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
1813 cap->capabilities =
1814 V4L2_CAP_VIDEO_CAPTURE |
1815 V4L2_CAP_VBI_CAPTURE |
1816 V4L2_CAP_READWRITE |
1817 V4L2_CAP_STREAMING |
1818 V4L2_CAP_TUNER;
1819 if (dev->has_rds)
1820 cap->capabilities |= V4L2_CAP_RDS_CAPTURE;
1821 if (saa7134_no_overlay <= 0)
1822 cap->capabilities |= V4L2_CAP_VIDEO_OVERLAY;
1823
1824 if ((tuner_type == TUNER_ABSENT) || (tuner_type == UNSET))
1825 cap->capabilities &= ~V4L2_CAP_TUNER;
1826 return 0;
1827}
1828
1829int saa7134_s_std_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, v4l2_std_id *id)
1830{
1831 unsigned long flags;
1832 unsigned int i;
1833 v4l2_std_id fixup;
1834 int err;
1835
1836 /* When called from the empress code fh == NULL.
1837 That needs to be fixed somehow, but for now this is
1838 good enough. */
1839 if (fh) {
1840 err = v4l2_prio_check(&dev->prio, fh->prio);
1841 if (0 != err)
1842 return err;
1843 } else if (res_locked(dev, RESOURCE_OVERLAY)) {
1844 /* Don't change the std from the mpeg device
1845 if overlay is active. */
1846 return -EBUSY;
1847 }
1848
1849 for (i = 0; i < TVNORMS; i++)
1850 if (*id == tvnorms[i].id)
1851 break;
1852
1853 if (i == TVNORMS)
1854 for (i = 0; i < TVNORMS; i++)
1855 if (*id & tvnorms[i].id)
1856 break;
1857 if (i == TVNORMS)
1858 return -EINVAL;
1859
1860 if ((*id & V4L2_STD_SECAM) && (secam[0] != '-')) {
1861 if (secam[0] == 'L' || secam[0] == 'l') {
1862 if (secam[1] == 'C' || secam[1] == 'c')
1863 fixup = V4L2_STD_SECAM_LC;
1864 else
1865 fixup = V4L2_STD_SECAM_L;
1866 } else {
1867 if (secam[0] == 'D' || secam[0] == 'd')
1868 fixup = V4L2_STD_SECAM_DK;
1869 else
1870 fixup = V4L2_STD_SECAM;
1871 }
1872 for (i = 0; i < TVNORMS; i++) {
1873 if (fixup == tvnorms[i].id)
1874 break;
1875 }
1876 if (i == TVNORMS)
1877 return -EINVAL;
1878 }
1879
1880 *id = tvnorms[i].id;
1881
1882 mutex_lock(&dev->lock);
1883 if (fh && res_check(fh, RESOURCE_OVERLAY)) {
1884 spin_lock_irqsave(&dev->slock, flags);
1885 stop_preview(dev, fh);
1886 spin_unlock_irqrestore(&dev->slock, flags);
1887
1888 set_tvnorm(dev, &tvnorms[i]);
1889
1890 spin_lock_irqsave(&dev->slock, flags);
1891 start_preview(dev, fh);
1892 spin_unlock_irqrestore(&dev->slock, flags);
1893 } else
1894 set_tvnorm(dev, &tvnorms[i]);
1895
1896 saa7134_tvaudio_do_scan(dev);
1897 mutex_unlock(&dev->lock);
1898 return 0;
1899}
1900EXPORT_SYMBOL_GPL(saa7134_s_std_internal);
1901
1902static int saa7134_s_std(struct file *file, void *priv, v4l2_std_id *id)
1903{
1904 struct saa7134_fh *fh = priv;
1905
1906 return saa7134_s_std_internal(fh->dev, fh, id);
1907}
1908
1909static int saa7134_g_std(struct file *file, void *priv, v4l2_std_id *id)
1910{
1911 struct saa7134_fh *fh = priv;
1912 struct saa7134_dev *dev = fh->dev;
1913
1914 *id = dev->tvnorm->id;
1915 return 0;
1916}
1917
1918static int saa7134_cropcap(struct file *file, void *priv,
1919 struct v4l2_cropcap *cap)
1920{
1921 struct saa7134_fh *fh = priv;
1922 struct saa7134_dev *dev = fh->dev;
1923
1924 if (cap->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1925 cap->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
1926 return -EINVAL;
1927 cap->bounds = dev->crop_bounds;
1928 cap->defrect = dev->crop_defrect;
1929 cap->pixelaspect.numerator = 1;
1930 cap->pixelaspect.denominator = 1;
1931 if (dev->tvnorm->id & V4L2_STD_525_60) {
1932 cap->pixelaspect.numerator = 11;
1933 cap->pixelaspect.denominator = 10;
1934 }
1935 if (dev->tvnorm->id & V4L2_STD_625_50) {
1936 cap->pixelaspect.numerator = 54;
1937 cap->pixelaspect.denominator = 59;
1938 }
1939 return 0;
1940}
1941
1942static int saa7134_g_crop(struct file *file, void *f, struct v4l2_crop *crop)
1943{
1944 struct saa7134_fh *fh = f;
1945 struct saa7134_dev *dev = fh->dev;
1946
1947 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1948 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
1949 return -EINVAL;
1950 crop->c = dev->crop_current;
1951 return 0;
1952}
1953
1954static int saa7134_s_crop(struct file *file, void *f, struct v4l2_crop *crop)
1955{
1956 struct saa7134_fh *fh = f;
1957 struct saa7134_dev *dev = fh->dev;
1958 struct v4l2_rect *b = &dev->crop_bounds;
1959
1960 if (crop->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
1961 crop->type != V4L2_BUF_TYPE_VIDEO_OVERLAY)
1962 return -EINVAL;
1963 if (crop->c.height < 0)
1964 return -EINVAL;
1965 if (crop->c.width < 0)
1966 return -EINVAL;
1967
1968 if (res_locked(fh->dev, RESOURCE_OVERLAY))
1969 return -EBUSY;
1970 if (res_locked(fh->dev, RESOURCE_VIDEO))
1971 return -EBUSY;
1972
1973 if (crop->c.top < b->top)
1974 crop->c.top = b->top;
1975 if (crop->c.top > b->top + b->height)
1976 crop->c.top = b->top + b->height;
1977 if (crop->c.height > b->top - crop->c.top + b->height)
1978 crop->c.height = b->top - crop->c.top + b->height;
1979
1980 if (crop->c.left < b->left)
1981 crop->c.left = b->left;
1982 if (crop->c.left > b->left + b->width)
1983 crop->c.left = b->left + b->width;
1984 if (crop->c.width > b->left - crop->c.left + b->width)
1985 crop->c.width = b->left - crop->c.left + b->width;
1986
1987 dev->crop_current = crop->c;
1988 return 0;
1989}
1990
1991static int saa7134_g_tuner(struct file *file, void *priv,
1992 struct v4l2_tuner *t)
1993{
1994 struct saa7134_fh *fh = priv;
1995 struct saa7134_dev *dev = fh->dev;
1996 int n;
1997
1998 if (0 != t->index)
1999 return -EINVAL;
2000 memset(t, 0, sizeof(*t));
2001 for (n = 0; n < SAA7134_INPUT_MAX; n++) {
2002 if (card_in(dev, n).tv)
2003 break;
2004 }
2005 if (n == SAA7134_INPUT_MAX)
2006 return -EINVAL;
2007 if (NULL != card_in(dev, n).name) {
2008 strcpy(t->name, "Television");
2009 t->type = V4L2_TUNER_ANALOG_TV;
2010 t->capability = V4L2_TUNER_CAP_NORM |
2011 V4L2_TUNER_CAP_STEREO |
2012 V4L2_TUNER_CAP_LANG1 |
2013 V4L2_TUNER_CAP_LANG2;
2014 t->rangehigh = 0xffffffffUL;
2015 t->rxsubchans = saa7134_tvaudio_getstereo(dev);
2016 t->audmode = saa7134_tvaudio_rx2mode(t->rxsubchans);
2017 }
2018 if (0 != (saa_readb(SAA7134_STATUS_VIDEO1) & 0x03))
2019 t->signal = 0xffff;
2020 return 0;
2021}
2022
2023static int saa7134_s_tuner(struct file *file, void *priv,
2024 struct v4l2_tuner *t)
2025{
2026 struct saa7134_fh *fh = priv;
2027 struct saa7134_dev *dev = fh->dev;
2028 int rx, mode, err;
2029
2030 err = v4l2_prio_check(&dev->prio, fh->prio);
2031 if (0 != err)
2032 return err;
2033
2034 mode = dev->thread.mode;
2035 if (UNSET == mode) {
2036 rx = saa7134_tvaudio_getstereo(dev);
2037 mode = saa7134_tvaudio_rx2mode(t->rxsubchans);
2038 }
2039 if (mode != t->audmode)
2040 dev->thread.mode = t->audmode;
2041
2042 return 0;
2043}
2044
2045static int saa7134_g_frequency(struct file *file, void *priv,
2046 struct v4l2_frequency *f)
2047{
2048 struct saa7134_fh *fh = priv;
2049 struct saa7134_dev *dev = fh->dev;
2050
2051 f->type = fh->radio ? V4L2_TUNER_RADIO : V4L2_TUNER_ANALOG_TV;
2052 f->frequency = dev->ctl_freq;
2053
2054 return 0;
2055}
2056
2057static int saa7134_s_frequency(struct file *file, void *priv,
2058 struct v4l2_frequency *f)
2059{
2060 struct saa7134_fh *fh = priv;
2061 struct saa7134_dev *dev = fh->dev;
2062 int err;
2063
2064 err = v4l2_prio_check(&dev->prio, fh->prio);
2065 if (0 != err)
2066 return err;
2067
2068 if (0 != f->tuner)
2069 return -EINVAL;
2070 if (0 == fh->radio && V4L2_TUNER_ANALOG_TV != f->type)
2071 return -EINVAL;
2072 if (1 == fh->radio && V4L2_TUNER_RADIO != f->type)
2073 return -EINVAL;
2074 mutex_lock(&dev->lock);
2075 dev->ctl_freq = f->frequency;
2076
2077 saa_call_all(dev, tuner, s_frequency, f);
2078
2079 saa7134_tvaudio_do_scan(dev);
2080 mutex_unlock(&dev->lock);
2081 return 0;
2082}
2083
2084static int saa7134_g_audio(struct file *file, void *priv, struct v4l2_audio *a)
2085{
2086 strcpy(a->name, "audio");
2087 return 0;
2088}
2089
2090static int saa7134_s_audio(struct file *file, void *priv, struct v4l2_audio *a)
2091{
2092 return 0;
2093}
2094
2095static int saa7134_g_priority(struct file *file, void *f, enum v4l2_priority *p)
2096{
2097 struct saa7134_fh *fh = f;
2098 struct saa7134_dev *dev = fh->dev;
2099
2100 *p = v4l2_prio_max(&dev->prio);
2101 return 0;
2102}
2103
2104static int saa7134_s_priority(struct file *file, void *f,
2105 enum v4l2_priority prio)
2106{
2107 struct saa7134_fh *fh = f;
2108 struct saa7134_dev *dev = fh->dev;
2109
2110 return v4l2_prio_change(&dev->prio, &fh->prio, prio);
2111}
2112
2113static int saa7134_enum_fmt_vid_cap(struct file *file, void *priv,
2114 struct v4l2_fmtdesc *f)
2115{
2116 if (f->index >= FORMATS)
2117 return -EINVAL;
2118
2119 strlcpy(f->description, formats[f->index].name,
2120 sizeof(f->description));
2121
2122 f->pixelformat = formats[f->index].fourcc;
2123
2124 return 0;
2125}
2126
2127static int saa7134_enum_fmt_vid_overlay(struct file *file, void *priv,
2128 struct v4l2_fmtdesc *f)
2129{
2130 if (saa7134_no_overlay > 0) {
2131 printk(KERN_ERR "V4L2_BUF_TYPE_VIDEO_OVERLAY: no_overlay\n");
2132 return -EINVAL;
2133 }
2134
2135 if ((f->index >= FORMATS) || formats[f->index].planar)
2136 return -EINVAL;
2137
2138 strlcpy(f->description, formats[f->index].name,
2139 sizeof(f->description));
2140
2141 f->pixelformat = formats[f->index].fourcc;
2142
2143 return 0;
2144}
2145
2146static int saa7134_g_fbuf(struct file *file, void *f,
2147 struct v4l2_framebuffer *fb)
2148{
2149 struct saa7134_fh *fh = f;
2150 struct saa7134_dev *dev = fh->dev;
2151
2152 *fb = dev->ovbuf;
2153 fb->capability = V4L2_FBUF_CAP_LIST_CLIPPING;
2154
2155 return 0;
2156}
2157
2158static int saa7134_s_fbuf(struct file *file, void *f,
2159 struct v4l2_framebuffer *fb)
2160{
2161 struct saa7134_fh *fh = f;
2162 struct saa7134_dev *dev = fh->dev;
2163 struct saa7134_format *fmt;
2164
2165 if (!capable(CAP_SYS_ADMIN) &&
2166 !capable(CAP_SYS_RAWIO))
2167 return -EPERM;
2168
2169 /* check args */
2170 fmt = format_by_fourcc(fb->fmt.pixelformat);
2171 if (NULL == fmt)
2172 return -EINVAL;
2173
2174 /* ok, accept it */
2175 dev->ovbuf = *fb;
2176 dev->ovfmt = fmt;
2177 if (0 == dev->ovbuf.fmt.bytesperline)
2178 dev->ovbuf.fmt.bytesperline =
2179 dev->ovbuf.fmt.width*fmt->depth/8;
2180 return 0;
2181}
2182
2183static int saa7134_overlay(struct file *file, void *f, unsigned int on)
2184{
2185 struct saa7134_fh *fh = f;
2186 struct saa7134_dev *dev = fh->dev;
2187 unsigned long flags;
2188
2189 if (on) {
2190 if (saa7134_no_overlay > 0) {
2191 dprintk("no_overlay\n");
2192 return -EINVAL;
2193 }
2194
2195 if (!res_get(dev, fh, RESOURCE_OVERLAY))
2196 return -EBUSY;
2197 spin_lock_irqsave(&dev->slock, flags);
2198 start_preview(dev, fh);
2199 spin_unlock_irqrestore(&dev->slock, flags);
2200 }
2201 if (!on) {
2202 if (!res_check(fh, RESOURCE_OVERLAY))
2203 return -EINVAL;
2204 spin_lock_irqsave(&dev->slock, flags);
2205 stop_preview(dev, fh);
2206 spin_unlock_irqrestore(&dev->slock, flags);
2207 res_free(dev, fh, RESOURCE_OVERLAY);
2208 }
2209 return 0;
2210}
2211
2212static int saa7134_reqbufs(struct file *file, void *priv,
2213 struct v4l2_requestbuffers *p)
2214{
2215 struct saa7134_fh *fh = priv;
2216 return videobuf_reqbufs(saa7134_queue(fh), p);
2217}
2218
2219static int saa7134_querybuf(struct file *file, void *priv,
2220 struct v4l2_buffer *b)
2221{
2222 struct saa7134_fh *fh = priv;
2223 return videobuf_querybuf(saa7134_queue(fh), b);
2224}
2225
2226static int saa7134_qbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2227{
2228 struct saa7134_fh *fh = priv;
2229 return videobuf_qbuf(saa7134_queue(fh), b);
2230}
2231
2232static int saa7134_dqbuf(struct file *file, void *priv, struct v4l2_buffer *b)
2233{
2234 struct saa7134_fh *fh = priv;
2235 return videobuf_dqbuf(saa7134_queue(fh), b,
2236 file->f_flags & O_NONBLOCK);
2237}
2238
2239static int saa7134_streamon(struct file *file, void *priv,
2240 enum v4l2_buf_type type)
2241{
2242 struct saa7134_fh *fh = priv;
2243 struct saa7134_dev *dev = fh->dev;
2244 int res = saa7134_resource(fh);
2245
2246 if (!res_get(dev, fh, res))
2247 return -EBUSY;
2248
2249 return videobuf_streamon(saa7134_queue(fh));
2250}
2251
2252static int saa7134_streamoff(struct file *file, void *priv,
2253 enum v4l2_buf_type type)
2254{
2255 int err;
2256 struct saa7134_fh *fh = priv;
2257 struct saa7134_dev *dev = fh->dev;
2258 int res = saa7134_resource(fh);
2259
2260 err = videobuf_streamoff(saa7134_queue(fh));
2261 if (err < 0)
2262 return err;
2263 res_free(dev, fh, res);
2264 return 0;
2265}
2266
2267static int saa7134_g_parm(struct file *file, void *fh,
2268 struct v4l2_streamparm *parm)
2269{
2270 return 0;
2271}
2272
2273#ifdef CONFIG_VIDEO_ADV_DEBUG
2274static int vidioc_g_register (struct file *file, void *priv,
2275 struct v4l2_dbg_register *reg)
2276{
2277 struct saa7134_fh *fh = priv;
2278 struct saa7134_dev *dev = fh->dev;
2279
2280 if (!v4l2_chip_match_host(&reg->match))
2281 return -EINVAL;
2282 reg->val = saa_readb(reg->reg);
2283 reg->size = 1;
2284 return 0;
2285}
2286
2287static int vidioc_s_register (struct file *file, void *priv,
2288 struct v4l2_dbg_register *reg)
2289{
2290 struct saa7134_fh *fh = priv;
2291 struct saa7134_dev *dev = fh->dev;
2292
2293 if (!v4l2_chip_match_host(&reg->match))
2294 return -EINVAL;
2295 saa_writeb(reg->reg&0xffffff, reg->val);
2296 return 0;
2297}
2298#endif
2299
2300static int radio_querycap(struct file *file, void *priv,
2301 struct v4l2_capability *cap)
2302{
2303 struct saa7134_fh *fh = file->private_data;
2304 struct saa7134_dev *dev = fh->dev;
2305
2306 strcpy(cap->driver, "saa7134");
2307 strlcpy(cap->card, saa7134_boards[dev->board].name, sizeof(cap->card));
2308 sprintf(cap->bus_info, "PCI:%s", pci_name(dev->pci));
2309 cap->capabilities = V4L2_CAP_TUNER;
2310 return 0;
2311}
2312
2313static int radio_g_tuner(struct file *file, void *priv,
2314 struct v4l2_tuner *t)
2315{
2316 struct saa7134_fh *fh = file->private_data;
2317 struct saa7134_dev *dev = fh->dev;
2318
2319 if (0 != t->index)
2320 return -EINVAL;
2321
2322 memset(t, 0, sizeof(*t));
2323 strcpy(t->name, "Radio");
2324 t->type = V4L2_TUNER_RADIO;
2325
2326 saa_call_all(dev, tuner, g_tuner, t);
2327 if (dev->input->amux == TV) {
2328 t->signal = 0xf800 - ((saa_readb(0x581) & 0x1f) << 11);
2329 t->rxsubchans = (saa_readb(0x529) & 0x08) ?
2330 V4L2_TUNER_SUB_STEREO : V4L2_TUNER_SUB_MONO;
2331 }
2332 return 0;
2333}
2334static int radio_s_tuner(struct file *file, void *priv,
2335 struct v4l2_tuner *t)
2336{
2337 struct saa7134_fh *fh = file->private_data;
2338 struct saa7134_dev *dev = fh->dev;
2339
2340 if (0 != t->index)
2341 return -EINVAL;
2342
2343 saa_call_all(dev, tuner, s_tuner, t);
2344 return 0;
2345}
2346
2347static int radio_enum_input(struct file *file, void *priv,
2348 struct v4l2_input *i)
2349{
2350 if (i->index != 0)
2351 return -EINVAL;
2352
2353 strcpy(i->name, "Radio");
2354 i->type = V4L2_INPUT_TYPE_TUNER;
2355
2356 return 0;
2357}
2358
2359static int radio_g_input(struct file *filp, void *priv, unsigned int *i)
2360{
2361 *i = 0;
2362 return 0;
2363}
2364
2365static int radio_g_audio(struct file *file, void *priv,
2366 struct v4l2_audio *a)
2367{
2368 memset(a, 0, sizeof(*a));
2369 strcpy(a->name, "Radio");
2370 return 0;
2371}
2372
2373static int radio_s_audio(struct file *file, void *priv,
2374 struct v4l2_audio *a)
2375{
2376 return 0;
2377}
2378
2379static int radio_s_input(struct file *filp, void *priv, unsigned int i)
2380{
2381 return 0;
2382}
2383
2384static int radio_s_std(struct file *file, void *fh, v4l2_std_id *norm)
2385{
2386 return 0;
2387}
2388
2389static int radio_queryctrl(struct file *file, void *priv,
2390 struct v4l2_queryctrl *c)
2391{
2392 const struct v4l2_queryctrl *ctrl;
2393
2394 if (c->id < V4L2_CID_BASE ||
2395 c->id >= V4L2_CID_LASTP1)
2396 return -EINVAL;
2397 if (c->id == V4L2_CID_AUDIO_MUTE) {
2398 ctrl = ctrl_by_id(c->id);
2399 *c = *ctrl;
2400 } else
2401 *c = no_ctrl;
2402 return 0;
2403}
2404
2405static const struct v4l2_file_operations video_fops =
2406{
2407 .owner = THIS_MODULE,
2408 .open = video_open,
2409 .release = video_release,
2410 .read = video_read,
2411 .poll = video_poll,
2412 .mmap = video_mmap,
2413 .ioctl = video_ioctl2,
2414};
2415
2416static const struct v4l2_ioctl_ops video_ioctl_ops = {
2417 .vidioc_querycap = saa7134_querycap,
2418 .vidioc_enum_fmt_vid_cap = saa7134_enum_fmt_vid_cap,
2419 .vidioc_g_fmt_vid_cap = saa7134_g_fmt_vid_cap,
2420 .vidioc_try_fmt_vid_cap = saa7134_try_fmt_vid_cap,
2421 .vidioc_s_fmt_vid_cap = saa7134_s_fmt_vid_cap,
2422 .vidioc_enum_fmt_vid_overlay = saa7134_enum_fmt_vid_overlay,
2423 .vidioc_g_fmt_vid_overlay = saa7134_g_fmt_vid_overlay,
2424 .vidioc_try_fmt_vid_overlay = saa7134_try_fmt_vid_overlay,
2425 .vidioc_s_fmt_vid_overlay = saa7134_s_fmt_vid_overlay,
2426 .vidioc_g_fmt_vbi_cap = saa7134_try_get_set_fmt_vbi_cap,
2427 .vidioc_try_fmt_vbi_cap = saa7134_try_get_set_fmt_vbi_cap,
2428 .vidioc_s_fmt_vbi_cap = saa7134_try_get_set_fmt_vbi_cap,
2429 .vidioc_g_audio = saa7134_g_audio,
2430 .vidioc_s_audio = saa7134_s_audio,
2431 .vidioc_cropcap = saa7134_cropcap,
2432 .vidioc_reqbufs = saa7134_reqbufs,
2433 .vidioc_querybuf = saa7134_querybuf,
2434 .vidioc_qbuf = saa7134_qbuf,
2435 .vidioc_dqbuf = saa7134_dqbuf,
2436 .vidioc_s_std = saa7134_s_std,
2437 .vidioc_g_std = saa7134_g_std,
2438 .vidioc_enum_input = saa7134_enum_input,
2439 .vidioc_g_input = saa7134_g_input,
2440 .vidioc_s_input = saa7134_s_input,
2441 .vidioc_queryctrl = saa7134_queryctrl,
2442 .vidioc_g_ctrl = saa7134_g_ctrl,
2443 .vidioc_s_ctrl = saa7134_s_ctrl,
2444 .vidioc_streamon = saa7134_streamon,
2445 .vidioc_streamoff = saa7134_streamoff,
2446 .vidioc_g_tuner = saa7134_g_tuner,
2447 .vidioc_s_tuner = saa7134_s_tuner,
2448 .vidioc_g_crop = saa7134_g_crop,
2449 .vidioc_s_crop = saa7134_s_crop,
2450 .vidioc_g_fbuf = saa7134_g_fbuf,
2451 .vidioc_s_fbuf = saa7134_s_fbuf,
2452 .vidioc_overlay = saa7134_overlay,
2453 .vidioc_g_priority = saa7134_g_priority,
2454 .vidioc_s_priority = saa7134_s_priority,
2455 .vidioc_g_parm = saa7134_g_parm,
2456 .vidioc_g_frequency = saa7134_g_frequency,
2457 .vidioc_s_frequency = saa7134_s_frequency,
2458#ifdef CONFIG_VIDEO_ADV_DEBUG
2459 .vidioc_g_register = vidioc_g_register,
2460 .vidioc_s_register = vidioc_s_register,
2461#endif
2462};
2463
2464static const struct v4l2_file_operations radio_fops = {
2465 .owner = THIS_MODULE,
2466 .open = video_open,
2467 .read = radio_read,
2468 .release = video_release,
2469 .ioctl = video_ioctl2,
2470 .poll = radio_poll,
2471};
2472
2473static const struct v4l2_ioctl_ops radio_ioctl_ops = {
2474 .vidioc_querycap = radio_querycap,
2475 .vidioc_g_tuner = radio_g_tuner,
2476 .vidioc_enum_input = radio_enum_input,
2477 .vidioc_g_audio = radio_g_audio,
2478 .vidioc_s_tuner = radio_s_tuner,
2479 .vidioc_s_audio = radio_s_audio,
2480 .vidioc_s_input = radio_s_input,
2481 .vidioc_s_std = radio_s_std,
2482 .vidioc_queryctrl = radio_queryctrl,
2483 .vidioc_g_input = radio_g_input,
2484 .vidioc_g_ctrl = saa7134_g_ctrl,
2485 .vidioc_s_ctrl = saa7134_s_ctrl,
2486 .vidioc_g_frequency = saa7134_g_frequency,
2487 .vidioc_s_frequency = saa7134_s_frequency,
2488};
2489
2490/* ----------------------------------------------------------- */
2491/* exported stuff */
2492
2493struct video_device saa7134_video_template = {
2494 .name = "saa7134-video",
2495 .fops = &video_fops,
2496 .ioctl_ops = &video_ioctl_ops,
2497 .tvnorms = SAA7134_NORMS,
2498 .current_norm = V4L2_STD_PAL,
2499};
2500
2501struct video_device saa7134_radio_template = {
2502 .name = "saa7134-radio",
2503 .fops = &radio_fops,
2504 .ioctl_ops = &radio_ioctl_ops,
2505};
2506
2507int saa7134_video_init1(struct saa7134_dev *dev)
2508{
2509 /* sanitycheck insmod options */
2510 if (gbuffers < 2 || gbuffers > VIDEO_MAX_FRAME)
2511 gbuffers = 2;
2512 if (gbufsize < 0 || gbufsize > gbufsize_max)
2513 gbufsize = gbufsize_max;
2514 gbufsize = (gbufsize + PAGE_SIZE - 1) & PAGE_MASK;
2515
2516 /* put some sensible defaults into the data structures ... */
2517 dev->ctl_bright = ctrl_by_id(V4L2_CID_BRIGHTNESS)->default_value;
2518 dev->ctl_contrast = ctrl_by_id(V4L2_CID_CONTRAST)->default_value;
2519 dev->ctl_hue = ctrl_by_id(V4L2_CID_HUE)->default_value;
2520 dev->ctl_saturation = ctrl_by_id(V4L2_CID_SATURATION)->default_value;
2521 dev->ctl_volume = ctrl_by_id(V4L2_CID_AUDIO_VOLUME)->default_value;
2522 dev->ctl_mute = 1; // ctrl_by_id(V4L2_CID_AUDIO_MUTE)->default_value;
2523 dev->ctl_invert = ctrl_by_id(V4L2_CID_PRIVATE_INVERT)->default_value;
2524 dev->ctl_automute = ctrl_by_id(V4L2_CID_PRIVATE_AUTOMUTE)->default_value;
2525
2526 if (dev->tda9887_conf && dev->ctl_automute)
2527 dev->tda9887_conf |= TDA9887_AUTOMUTE;
2528 dev->automute = 0;
2529
2530 INIT_LIST_HEAD(&dev->video_q.queue);
2531 init_timer(&dev->video_q.timeout);
2532 dev->video_q.timeout.function = saa7134_buffer_timeout;
2533 dev->video_q.timeout.data = (unsigned long)(&dev->video_q);
2534 dev->video_q.dev = dev;
2535
2536 if (saa7134_boards[dev->board].video_out)
2537 saa7134_videoport_init(dev);
2538
2539 return 0;
2540}
2541
2542int saa7134_videoport_init(struct saa7134_dev *dev)
2543{
2544 /* enable video output */
2545 int vo = saa7134_boards[dev->board].video_out;
2546 int video_reg;
2547 unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts;
2548
2549 /* Configure videoport */
2550 saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]);
2551 video_reg = video_out[vo][1];
2552 if (vid_port_opts & SET_T_CODE_POLARITY_NON_INVERTED)
2553 video_reg &= ~VP_T_CODE_P_INVERTED;
2554 saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_reg);
2555 saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]);
2556 saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]);
2557 video_reg = video_out[vo][5];
2558 if (vid_port_opts & SET_CLOCK_NOT_DELAYED)
2559 video_reg &= ~VP_CLK_CTRL2_DELAYED;
2560 if (vid_port_opts & SET_CLOCK_INVERTED)
2561 video_reg |= VP_CLK_CTRL1_INVERTED;
2562 saa_writeb(SAA7134_VIDEO_PORT_CTRL5, video_reg);
2563 video_reg = video_out[vo][6];
2564 if (vid_port_opts & SET_VSYNC_OFF) {
2565 video_reg &= ~VP_VS_TYPE_MASK;
2566 video_reg |= VP_VS_TYPE_OFF;
2567 }
2568 saa_writeb(SAA7134_VIDEO_PORT_CTRL6, video_reg);
2569 saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]);
2570 saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]);
2571
2572 /* Start videoport */
2573 saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]);
2574
2575 return 0;
2576}
2577
2578int saa7134_video_init2(struct saa7134_dev *dev)
2579{
2580 /* init video hw */
2581 set_tvnorm(dev,&tvnorms[0]);
2582 video_mux(dev,0);
2583 saa7134_tvaudio_setmute(dev);
2584 saa7134_tvaudio_setvolume(dev,dev->ctl_volume);
2585 return 0;
2586}
2587
2588void saa7134_irq_video_signalchange(struct saa7134_dev *dev)
2589{
2590 static const char *st[] = {
2591 "(no signal)", "NTSC", "PAL", "SECAM" };
2592 u32 st1,st2;
2593
2594 st1 = saa_readb(SAA7134_STATUS_VIDEO1);
2595 st2 = saa_readb(SAA7134_STATUS_VIDEO2);
2596 dprintk("DCSDT: pll: %s, sync: %s, norm: %s\n",
2597 (st1 & 0x40) ? "not locked" : "locked",
2598 (st2 & 0x40) ? "no" : "yes",
2599 st[st1 & 0x03]);
2600 dev->nosignal = (st1 & 0x40) || (st2 & 0x40) || !(st2 & 0x1);
2601
2602 if (dev->nosignal) {
2603 /* no video signal -> mute audio */
2604 if (dev->ctl_automute)
2605 dev->automute = 1;
2606 saa7134_tvaudio_setmute(dev);
2607 } else {
2608 /* wake up tvaudio audio carrier scan thread */
2609 saa7134_tvaudio_do_scan(dev);
2610 }
2611
2612 if ((st2 & 0x80) && !noninterlaced && !dev->nosignal)
2613 saa_clearb(SAA7134_SYNC_CTRL, 0x20);
2614 else
2615 saa_setb(SAA7134_SYNC_CTRL, 0x20);
2616
2617 if (dev->mops && dev->mops->signal_change)
2618 dev->mops->signal_change(dev);
2619}
2620
2621
2622void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status)
2623{
2624 enum v4l2_field field;
2625
2626 spin_lock(&dev->slock);
2627 if (dev->video_q.curr) {
2628 dev->video_fieldcount++;
2629 field = dev->video_q.curr->vb.field;
2630 if (V4L2_FIELD_HAS_BOTH(field)) {
2631 /* make sure we have seen both fields */
2632 if ((status & 0x10) == 0x00) {
2633 dev->video_q.curr->top_seen = 1;
2634 goto done;
2635 }
2636 if (!dev->video_q.curr->top_seen)
2637 goto done;
2638 } else if (field == V4L2_FIELD_TOP) {
2639 if ((status & 0x10) != 0x10)
2640 goto done;
2641 } else if (field == V4L2_FIELD_BOTTOM) {
2642 if ((status & 0x10) != 0x00)
2643 goto done;
2644 }
2645 dev->video_q.curr->vb.field_count = dev->video_fieldcount;
2646 saa7134_buffer_finish(dev,&dev->video_q,VIDEOBUF_DONE);
2647 }
2648 saa7134_buffer_next(dev,&dev->video_q);
2649
2650 done:
2651 spin_unlock(&dev->slock);
2652}
2653
2654/* ----------------------------------------------------------- */
2655/*
2656 * Local variables:
2657 * c-basic-offset: 8
2658 * End:
2659 */
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
new file mode 100644
index 00000000000..bc8d6bba8ee
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -0,0 +1,852 @@
1/*
2 *
3 * v4l2 device driver for philips saa7134 based TV cards
4 *
5 * (c) 2001,02 Gerd Knorr <kraxel@bytesex.org>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#define SAA7134_VERSION "0, 2, 17"
23
24#include <linux/pci.h>
25#include <linux/i2c.h>
26#include <linux/videodev2.h>
27#include <linux/kdev_t.h>
28#include <linux/input.h>
29#include <linux/notifier.h>
30#include <linux/delay.h>
31#include <linux/mutex.h>
32
33#include <asm/io.h>
34
35#include <media/v4l2-common.h>
36#include <media/v4l2-ioctl.h>
37#include <media/v4l2-device.h>
38#include <media/tuner.h>
39#include <media/rc-core.h>
40#include <media/ir-kbd-i2c.h>
41#include <media/videobuf-dma-sg.h>
42#include <sound/core.h>
43#include <sound/pcm.h>
44#if defined(CONFIG_VIDEO_SAA7134_DVB) || defined(CONFIG_VIDEO_SAA7134_DVB_MODULE)
45#include <media/videobuf-dvb.h>
46#endif
47
48#define UNSET (-1U)
49
50/* ----------------------------------------------------------- */
51/* enums */
52
53enum saa7134_tvaudio_mode {
54 TVAUDIO_FM_MONO = 1,
55 TVAUDIO_FM_BG_STEREO = 2,
56 TVAUDIO_FM_SAT_STEREO = 3,
57 TVAUDIO_FM_K_STEREO = 4,
58 TVAUDIO_NICAM_AM = 5,
59 TVAUDIO_NICAM_FM = 6,
60};
61
62enum saa7134_audio_in {
63 TV = 1,
64 LINE1 = 2,
65 LINE2 = 3,
66 LINE2_LEFT,
67};
68
69enum saa7134_video_out {
70 CCIR656 = 1,
71};
72
73/* ----------------------------------------------------------- */
74/* static data */
75
76struct saa7134_tvnorm {
77 char *name;
78 v4l2_std_id id;
79
80 /* video decoder */
81 unsigned int sync_control;
82 unsigned int luma_control;
83 unsigned int chroma_ctrl1;
84 unsigned int chroma_gain;
85 unsigned int chroma_ctrl2;
86 unsigned int vgate_misc;
87
88 /* video scaler */
89 unsigned int h_start;
90 unsigned int h_stop;
91 unsigned int video_v_start;
92 unsigned int video_v_stop;
93 unsigned int vbi_v_start_0;
94 unsigned int vbi_v_stop_0;
95 unsigned int src_timing;
96 unsigned int vbi_v_start_1;
97};
98
99struct saa7134_tvaudio {
100 char *name;
101 v4l2_std_id std;
102 enum saa7134_tvaudio_mode mode;
103 int carr1;
104 int carr2;
105};
106
107struct saa7134_format {
108 char *name;
109 unsigned int fourcc;
110 unsigned int depth;
111 unsigned int pm;
112 unsigned int vshift; /* vertical downsampling (for planar yuv) */
113 unsigned int hshift; /* horizontal downsampling (for planar yuv) */
114 unsigned int bswap:1;
115 unsigned int wswap:1;
116 unsigned int yuv:1;
117 unsigned int planar:1;
118 unsigned int uvswap:1;
119};
120
121struct saa7134_card_ir {
122 struct rc_dev *dev;
123
124 char name[32];
125 char phys[32];
126 unsigned users;
127
128 u32 polling;
129 u32 last_gpio;
130 u32 mask_keycode, mask_keydown, mask_keyup;
131
132 bool running;
133 bool active;
134
135 struct timer_list timer;
136
137 /* IR core raw decoding */
138 u32 raw_decode;
139};
140
141/* ----------------------------------------------------------- */
142/* card configuration */
143
144#define SAA7134_BOARD_NOAUTO UNSET
145#define SAA7134_BOARD_UNKNOWN 0
146#define SAA7134_BOARD_PROTEUS_PRO 1
147#define SAA7134_BOARD_FLYVIDEO3000 2
148#define SAA7134_BOARD_FLYVIDEO2000 3
149#define SAA7134_BOARD_EMPRESS 4
150#define SAA7134_BOARD_MONSTERTV 5
151#define SAA7134_BOARD_MD9717 6
152#define SAA7134_BOARD_TVSTATION_RDS 7
153#define SAA7134_BOARD_CINERGY400 8
154#define SAA7134_BOARD_MD5044 9
155#define SAA7134_BOARD_KWORLD 10
156#define SAA7134_BOARD_CINERGY600 11
157#define SAA7134_BOARD_MD7134 12
158#define SAA7134_BOARD_TYPHOON_90031 13
159#define SAA7134_BOARD_ELSA 14
160#define SAA7134_BOARD_ELSA_500TV 15
161#define SAA7134_BOARD_ASUSTeK_TVFM7134 16
162#define SAA7134_BOARD_VA1000POWER 17
163#define SAA7134_BOARD_BMK_MPEX_NOTUNER 18
164#define SAA7134_BOARD_VIDEOMATE_TV 19
165#define SAA7134_BOARD_CRONOS_PLUS 20
166#define SAA7134_BOARD_10MOONSTVMASTER 21
167#define SAA7134_BOARD_MD2819 22
168#define SAA7134_BOARD_BMK_MPEX_TUNER 23
169#define SAA7134_BOARD_TVSTATION_DVR 24
170#define SAA7134_BOARD_ASUSTEK_TVFM7133 25
171#define SAA7134_BOARD_PINNACLE_PCTV_STEREO 26
172#define SAA7134_BOARD_MANLI_MTV002 27
173#define SAA7134_BOARD_MANLI_MTV001 28
174#define SAA7134_BOARD_TG3000TV 29
175#define SAA7134_BOARD_ECS_TVP3XP 30
176#define SAA7134_BOARD_ECS_TVP3XP_4CB5 31
177#define SAA7134_BOARD_AVACSSMARTTV 32
178#define SAA7134_BOARD_AVERMEDIA_DVD_EZMAKER 33
179#define SAA7134_BOARD_NOVAC_PRIMETV7133 34
180#define SAA7134_BOARD_AVERMEDIA_STUDIO_305 35
181#define SAA7134_BOARD_UPMOST_PURPLE_TV 36
182#define SAA7134_BOARD_ITEMS_MTV005 37
183#define SAA7134_BOARD_CINERGY200 38
184#define SAA7134_BOARD_FLYTVPLATINUM_MINI 39
185#define SAA7134_BOARD_VIDEOMATE_TV_PVR 40
186#define SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUS 41
187#define SAA7134_BOARD_SABRENT_SBTTVFM 42
188#define SAA7134_BOARD_ZOLID_XPERT_TV7134 43
189#define SAA7134_BOARD_EMPIRE_PCI_TV_RADIO_LE 44
190#define SAA7134_BOARD_AVERMEDIA_STUDIO_307 45
191#define SAA7134_BOARD_AVERMEDIA_CARDBUS 46
192#define SAA7134_BOARD_CINERGY400_CARDBUS 47
193#define SAA7134_BOARD_CINERGY600_MK3 48
194#define SAA7134_BOARD_VIDEOMATE_GOLD_PLUS 49
195#define SAA7134_BOARD_PINNACLE_300I_DVBT_PAL 50
196#define SAA7134_BOARD_PROVIDEO_PV952 51
197#define SAA7134_BOARD_AVERMEDIA_305 52
198#define SAA7134_BOARD_ASUSTeK_TVFM7135 53
199#define SAA7134_BOARD_FLYTVPLATINUM_FM 54
200#define SAA7134_BOARD_FLYDVBTDUO 55
201#define SAA7134_BOARD_AVERMEDIA_307 56
202#define SAA7134_BOARD_AVERMEDIA_GO_007_FM 57
203#define SAA7134_BOARD_ADS_INSTANT_TV 58
204#define SAA7134_BOARD_KWORLD_VSTREAM_XPERT 59
205#define SAA7134_BOARD_FLYDVBT_DUO_CARDBUS 60
206#define SAA7134_BOARD_PHILIPS_TOUGH 61
207#define SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII 62
208#define SAA7134_BOARD_KWORLD_XPERT 63
209#define SAA7134_BOARD_FLYTV_DIGIMATRIX 64
210#define SAA7134_BOARD_KWORLD_TERMINATOR 65
211#define SAA7134_BOARD_YUAN_TUN900 66
212#define SAA7134_BOARD_BEHOLD_409FM 67
213#define SAA7134_BOARD_GOTVIEW_7135 68
214#define SAA7134_BOARD_PHILIPS_EUROPA 69
215#define SAA7134_BOARD_VIDEOMATE_DVBT_300 70
216#define SAA7134_BOARD_VIDEOMATE_DVBT_200 71
217#define SAA7134_BOARD_RTD_VFG7350 72
218#define SAA7134_BOARD_RTD_VFG7330 73
219#define SAA7134_BOARD_FLYTVPLATINUM_MINI2 74
220#define SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180 75
221#define SAA7134_BOARD_MONSTERTV_MOBILE 76
222#define SAA7134_BOARD_PINNACLE_PCTV_110i 77
223#define SAA7134_BOARD_ASUSTeK_P7131_DUAL 78
224#define SAA7134_BOARD_SEDNA_PC_TV_CARDBUS 79
225#define SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV 80
226#define SAA7134_BOARD_PHILIPS_TIGER 81
227#define SAA7134_BOARD_MSI_TVATANYWHERE_PLUS 82
228#define SAA7134_BOARD_CINERGY250PCI 83
229#define SAA7134_BOARD_FLYDVB_TRIO 84
230#define SAA7134_BOARD_AVERMEDIA_777 85
231#define SAA7134_BOARD_FLYDVBT_LR301 86
232#define SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331 87
233#define SAA7134_BOARD_TEVION_DVBT_220RF 88
234#define SAA7134_BOARD_ELSA_700TV 89
235#define SAA7134_BOARD_KWORLD_ATSC110 90
236#define SAA7134_BOARD_AVERMEDIA_A169_B 91
237#define SAA7134_BOARD_AVERMEDIA_A169_B1 92
238#define SAA7134_BOARD_MD7134_BRIDGE_2 93
239#define SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS 94
240#define SAA7134_BOARD_FLYVIDEO3000_NTSC 95
241#define SAA7134_BOARD_MEDION_MD8800_QUADRO 96
242#define SAA7134_BOARD_FLYDVBS_LR300 97
243#define SAA7134_BOARD_PROTEUS_2309 98
244#define SAA7134_BOARD_AVERMEDIA_A16AR 99
245#define SAA7134_BOARD_ASUS_EUROPA2_HYBRID 100
246#define SAA7134_BOARD_PINNACLE_PCTV_310i 101
247#define SAA7134_BOARD_AVERMEDIA_STUDIO_507 102
248#define SAA7134_BOARD_VIDEOMATE_DVBT_200A 103
249#define SAA7134_BOARD_HAUPPAUGE_HVR1110 104
250#define SAA7134_BOARD_CINERGY_HT_PCMCIA 105
251#define SAA7134_BOARD_ENCORE_ENLTV 106
252#define SAA7134_BOARD_ENCORE_ENLTV_FM 107
253#define SAA7134_BOARD_CINERGY_HT_PCI 108
254#define SAA7134_BOARD_PHILIPS_TIGER_S 109
255#define SAA7134_BOARD_AVERMEDIA_M102 110
256#define SAA7134_BOARD_ASUS_P7131_4871 111
257#define SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA 112
258#define SAA7134_BOARD_ECS_TVP3XP_4CB6 113
259#define SAA7134_BOARD_KWORLD_DVBT_210 114
260#define SAA7134_BOARD_SABRENT_TV_PCB05 115
261#define SAA7134_BOARD_10MOONSTVMASTER3 116
262#define SAA7134_BOARD_AVERMEDIA_SUPER_007 117
263#define SAA7134_BOARD_BEHOLD_401 118
264#define SAA7134_BOARD_BEHOLD_403 119
265#define SAA7134_BOARD_BEHOLD_403FM 120
266#define SAA7134_BOARD_BEHOLD_405 121
267#define SAA7134_BOARD_BEHOLD_405FM 122
268#define SAA7134_BOARD_BEHOLD_407 123
269#define SAA7134_BOARD_BEHOLD_407FM 124
270#define SAA7134_BOARD_BEHOLD_409 125
271#define SAA7134_BOARD_BEHOLD_505FM 126
272#define SAA7134_BOARD_BEHOLD_507_9FM 127
273#define SAA7134_BOARD_BEHOLD_COLUMBUS_TVFM 128
274#define SAA7134_BOARD_BEHOLD_607FM_MK3 129
275#define SAA7134_BOARD_BEHOLD_M6 130
276#define SAA7134_BOARD_TWINHAN_DTV_DVB_3056 131
277#define SAA7134_BOARD_GENIUS_TVGO_A11MCE 132
278#define SAA7134_BOARD_PHILIPS_SNAKE 133
279#define SAA7134_BOARD_CREATIX_CTX953 134
280#define SAA7134_BOARD_MSI_TVANYWHERE_AD11 135
281#define SAA7134_BOARD_AVERMEDIA_CARDBUS_506 136
282#define SAA7134_BOARD_AVERMEDIA_A16D 137
283#define SAA7134_BOARD_AVERMEDIA_M115 138
284#define SAA7134_BOARD_VIDEOMATE_T750 139
285#define SAA7134_BOARD_AVERMEDIA_A700_PRO 140
286#define SAA7134_BOARD_AVERMEDIA_A700_HYBRID 141
287#define SAA7134_BOARD_BEHOLD_H6 142
288#define SAA7134_BOARD_BEHOLD_M63 143
289#define SAA7134_BOARD_BEHOLD_M6_EXTRA 144
290#define SAA7134_BOARD_AVERMEDIA_M103 145
291#define SAA7134_BOARD_ASUSTeK_P7131_ANALOG 146
292#define SAA7134_BOARD_ASUSTeK_TIGER_3IN1 147
293#define SAA7134_BOARD_ENCORE_ENLTV_FM53 148
294#define SAA7134_BOARD_AVERMEDIA_M135A 149
295#define SAA7134_BOARD_REAL_ANGEL_220 150
296#define SAA7134_BOARD_ADS_INSTANT_HDTV_PCI 151
297#define SAA7134_BOARD_ASUSTeK_TIGER 152
298#define SAA7134_BOARD_KWORLD_PLUS_TV_ANALOG 153
299#define SAA7134_BOARD_AVERMEDIA_GO_007_FM_PLUS 154
300#define SAA7134_BOARD_HAUPPAUGE_HVR1150 155
301#define SAA7134_BOARD_HAUPPAUGE_HVR1120 156
302#define SAA7134_BOARD_AVERMEDIA_STUDIO_507UA 157
303#define SAA7134_BOARD_AVERMEDIA_CARDBUS_501 158
304#define SAA7134_BOARD_BEHOLD_505RDS_MK5 159
305#define SAA7134_BOARD_BEHOLD_507RDS_MK3 160
306#define SAA7134_BOARD_BEHOLD_507RDS_MK5 161
307#define SAA7134_BOARD_BEHOLD_607FM_MK5 162
308#define SAA7134_BOARD_BEHOLD_609FM_MK3 163
309#define SAA7134_BOARD_BEHOLD_609FM_MK5 164
310#define SAA7134_BOARD_BEHOLD_607RDS_MK3 165
311#define SAA7134_BOARD_BEHOLD_607RDS_MK5 166
312#define SAA7134_BOARD_BEHOLD_609RDS_MK3 167
313#define SAA7134_BOARD_BEHOLD_609RDS_MK5 168
314#define SAA7134_BOARD_VIDEOMATE_S350 169
315#define SAA7134_BOARD_AVERMEDIA_STUDIO_505 170
316#define SAA7134_BOARD_BEHOLD_X7 171
317#define SAA7134_BOARD_ROVERMEDIA_LINK_PRO_FM 172
318#define SAA7134_BOARD_ZOLID_HYBRID_PCI 173
319#define SAA7134_BOARD_ASUS_EUROPA_HYBRID 174
320#define SAA7134_BOARD_LEADTEK_WINFAST_DTV1000S 175
321#define SAA7134_BOARD_BEHOLD_505RDS_MK3 176
322#define SAA7134_BOARD_HAWELL_HW_404M7 177
323#define SAA7134_BOARD_BEHOLD_H7 178
324#define SAA7134_BOARD_BEHOLD_A7 179
325#define SAA7134_BOARD_AVERMEDIA_M733A 180
326#define SAA7134_BOARD_TECHNOTREND_BUDGET_T3000 181
327#define SAA7134_BOARD_KWORLD_PCI_SBTVD_FULLSEG 182
328#define SAA7134_BOARD_VIDEOMATE_M1F 183
329#define SAA7134_BOARD_ENCORE_ENLTV_FM3 184
330#define SAA7134_BOARD_MAGICPRO_PROHDTV_PRO2 185
331#define SAA7134_BOARD_BEHOLD_501 186
332#define SAA7134_BOARD_BEHOLD_503FM 187
333
334#define SAA7134_MAXBOARDS 32
335#define SAA7134_INPUT_MAX 8
336
337/* ----------------------------------------------------------- */
338/* Since we support 2 remote types, lets tell them apart */
339
340#define SAA7134_REMOTE_GPIO 1
341#define SAA7134_REMOTE_I2C 2
342
343/* ----------------------------------------------------------- */
344/* Video Output Port Register Initialization Options */
345
346#define SET_T_CODE_POLARITY_NON_INVERTED (1 << 0)
347#define SET_CLOCK_NOT_DELAYED (1 << 1)
348#define SET_CLOCK_INVERTED (1 << 2)
349#define SET_VSYNC_OFF (1 << 3)
350
351struct saa7134_input {
352 char *name;
353 unsigned int vmux;
354 enum saa7134_audio_in amux;
355 unsigned int gpio;
356 unsigned int tv:1;
357};
358
359enum saa7134_mpeg_type {
360 SAA7134_MPEG_UNUSED,
361 SAA7134_MPEG_EMPRESS,
362 SAA7134_MPEG_DVB,
363};
364
365enum saa7134_mpeg_ts_type {
366 SAA7134_MPEG_TS_PARALLEL = 0,
367 SAA7134_MPEG_TS_SERIAL,
368};
369
370struct saa7134_board {
371 char *name;
372 unsigned int audio_clock;
373
374 /* input switching */
375 unsigned int gpiomask;
376 struct saa7134_input inputs[SAA7134_INPUT_MAX];
377 struct saa7134_input radio;
378 struct saa7134_input mute;
379
380 /* i2c chip info */
381 unsigned int tuner_type;
382 unsigned int radio_type;
383 unsigned char tuner_addr;
384 unsigned char radio_addr;
385 unsigned char empress_addr;
386 unsigned char rds_addr;
387
388 unsigned int tda9887_conf;
389 unsigned int tuner_config;
390
391 /* peripheral I/O */
392 enum saa7134_video_out video_out;
393 enum saa7134_mpeg_type mpeg;
394 enum saa7134_mpeg_ts_type ts_type;
395 unsigned int vid_port_opts;
396 unsigned int ts_force_val:1;
397};
398
399#define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name)
400#define card_is_empress(dev) (SAA7134_MPEG_EMPRESS == saa7134_boards[dev->board].mpeg)
401#define card_is_dvb(dev) (SAA7134_MPEG_DVB == saa7134_boards[dev->board].mpeg)
402#define card_has_mpeg(dev) (SAA7134_MPEG_UNUSED != saa7134_boards[dev->board].mpeg)
403#define card(dev) (saa7134_boards[dev->board])
404#define card_in(dev,n) (saa7134_boards[dev->board].inputs[n])
405
406/* ----------------------------------------------------------- */
407/* device / file handle status */
408
409#define RESOURCE_OVERLAY 1
410#define RESOURCE_VIDEO 2
411#define RESOURCE_VBI 4
412
413#define INTERLACE_AUTO 0
414#define INTERLACE_ON 1
415#define INTERLACE_OFF 2
416
417#define BUFFER_TIMEOUT msecs_to_jiffies(500) /* 0.5 seconds */
418#define TS_BUFFER_TIMEOUT msecs_to_jiffies(1000) /* 1 second */
419
420struct saa7134_dev;
421struct saa7134_dma;
422
423/* saa7134 page table */
424struct saa7134_pgtable {
425 unsigned int size;
426 __le32 *cpu;
427 dma_addr_t dma;
428};
429
430/* tvaudio thread status */
431struct saa7134_thread {
432 struct task_struct *thread;
433 unsigned int scan1;
434 unsigned int scan2;
435 unsigned int mode;
436 unsigned int stopped;
437};
438
439/* buffer for one video/vbi/ts frame */
440struct saa7134_buf {
441 /* common v4l buffer stuff -- must be first */
442 struct videobuf_buffer vb;
443
444 /* saa7134 specific */
445 struct saa7134_format *fmt;
446 unsigned int top_seen;
447 int (*activate)(struct saa7134_dev *dev,
448 struct saa7134_buf *buf,
449 struct saa7134_buf *next);
450
451 /* page tables */
452 struct saa7134_pgtable *pt;
453};
454
455struct saa7134_dmaqueue {
456 struct saa7134_dev *dev;
457 struct saa7134_buf *curr;
458 struct list_head queue;
459 struct timer_list timeout;
460 unsigned int need_two;
461};
462
463/* video filehandle status */
464struct saa7134_fh {
465 struct saa7134_dev *dev;
466 unsigned int radio;
467 enum v4l2_buf_type type;
468 unsigned int resources;
469 enum v4l2_priority prio;
470
471 /* video overlay */
472 struct v4l2_window win;
473 struct v4l2_clip clips[8];
474 unsigned int nclips;
475
476 /* video capture */
477 struct saa7134_format *fmt;
478 unsigned int width,height;
479 struct videobuf_queue cap;
480 struct saa7134_pgtable pt_cap;
481
482 /* vbi capture */
483 struct videobuf_queue vbi;
484 struct saa7134_pgtable pt_vbi;
485};
486
487/* dmasound dsp status */
488struct saa7134_dmasound {
489 struct mutex lock;
490 int minor_mixer;
491 int minor_dsp;
492 unsigned int users_dsp;
493
494 /* mixer */
495 enum saa7134_audio_in input;
496 unsigned int count;
497 unsigned int line1;
498 unsigned int line2;
499
500 /* dsp */
501 unsigned int afmt;
502 unsigned int rate;
503 unsigned int channels;
504 unsigned int recording_on;
505 unsigned int dma_running;
506 unsigned int blocks;
507 unsigned int blksize;
508 unsigned int bufsize;
509 struct saa7134_pgtable pt;
510 struct videobuf_dmabuf dma;
511 unsigned int dma_blk;
512 unsigned int read_offset;
513 unsigned int read_count;
514 void * priv_data;
515 struct snd_pcm_substream *substream;
516};
517
518/* ts/mpeg status */
519struct saa7134_ts {
520 /* TS capture */
521 struct saa7134_pgtable pt_ts;
522 int nr_packets;
523 int nr_bufs;
524};
525
526/* ts/mpeg ops */
527struct saa7134_mpeg_ops {
528 enum saa7134_mpeg_type type;
529 struct list_head next;
530 int (*init)(struct saa7134_dev *dev);
531 int (*fini)(struct saa7134_dev *dev);
532 void (*signal_change)(struct saa7134_dev *dev);
533};
534
535/* global device status */
536struct saa7134_dev {
537 struct list_head devlist;
538 struct mutex lock;
539 spinlock_t slock;
540 struct v4l2_prio_state prio;
541 struct v4l2_device v4l2_dev;
542 /* workstruct for loading modules */
543 struct work_struct request_module_wk;
544
545 /* insmod option/autodetected */
546 int autodetected;
547
548 /* various device info */
549 unsigned int resources;
550 struct video_device *video_dev;
551 struct video_device *radio_dev;
552 struct video_device *vbi_dev;
553 struct saa7134_dmasound dmasound;
554
555 /* infrared remote */
556 int has_remote;
557 struct saa7134_card_ir *remote;
558
559 /* pci i/o */
560 char name[32];
561 int nr;
562 struct pci_dev *pci;
563 unsigned char pci_rev,pci_lat;
564 __u32 __iomem *lmmio;
565 __u8 __iomem *bmmio;
566
567 /* config info */
568 unsigned int board;
569 unsigned int tuner_type;
570 unsigned int radio_type;
571 unsigned char tuner_addr;
572 unsigned char radio_addr;
573
574 unsigned int tda9887_conf;
575 unsigned int gpio_value;
576
577 /* i2c i/o */
578 struct i2c_adapter i2c_adap;
579 struct i2c_client i2c_client;
580 unsigned char eedata[256];
581 int has_rds;
582
583 /* video overlay */
584 struct v4l2_framebuffer ovbuf;
585 struct saa7134_format *ovfmt;
586 unsigned int ovenable;
587 enum v4l2_field ovfield;
588
589 /* video+ts+vbi capture */
590 struct saa7134_dmaqueue video_q;
591 struct saa7134_dmaqueue vbi_q;
592 unsigned int video_fieldcount;
593 unsigned int vbi_fieldcount;
594
595 /* various v4l controls */
596 struct saa7134_tvnorm *tvnorm; /* video */
597 struct saa7134_tvaudio *tvaudio;
598 unsigned int ctl_input;
599 int ctl_bright;
600 int ctl_contrast;
601 int ctl_hue;
602 int ctl_saturation;
603 int ctl_freq;
604 int ctl_mute; /* audio */
605 int ctl_volume;
606 int ctl_invert; /* private */
607 int ctl_mirror;
608 int ctl_y_odd;
609 int ctl_y_even;
610 int ctl_automute;
611
612 /* crop */
613 struct v4l2_rect crop_bounds;
614 struct v4l2_rect crop_defrect;
615 struct v4l2_rect crop_current;
616
617 /* other global state info */
618 unsigned int automute;
619 struct saa7134_thread thread;
620 struct saa7134_input *input;
621 struct saa7134_input *hw_input;
622 unsigned int hw_mute;
623 int last_carrier;
624 int nosignal;
625 unsigned int insuspend;
626
627 /* I2C keyboard data */
628 struct IR_i2c_init_data init_data;
629
630 /* SAA7134_MPEG_* */
631 struct saa7134_ts ts;
632 struct saa7134_dmaqueue ts_q;
633 int ts_started;
634 struct saa7134_mpeg_ops *mops;
635
636 /* SAA7134_MPEG_EMPRESS only */
637 struct video_device *empress_dev;
638 struct videobuf_queue empress_tsq;
639 atomic_t empress_users;
640 struct work_struct empress_workqueue;
641 int empress_started;
642
643#if defined(CONFIG_VIDEO_SAA7134_DVB) || defined(CONFIG_VIDEO_SAA7134_DVB_MODULE)
644 /* SAA7134_MPEG_DVB only */
645 struct videobuf_dvb_frontends frontends;
646 int (*original_demod_sleep)(struct dvb_frontend *fe);
647 int (*original_set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
648 int (*original_set_high_voltage)(struct dvb_frontend *fe, long arg);
649#endif
650 void (*gate_ctrl)(struct saa7134_dev *dev, int open);
651};
652
653/* ----------------------------------------------------------- */
654
655#define saa_readl(reg) readl(dev->lmmio + (reg))
656#define saa_writel(reg,value) writel((value), dev->lmmio + (reg));
657#define saa_andorl(reg,mask,value) \
658 writel((readl(dev->lmmio+(reg)) & ~(mask)) |\
659 ((value) & (mask)), dev->lmmio+(reg))
660#define saa_setl(reg,bit) saa_andorl((reg),(bit),(bit))
661#define saa_clearl(reg,bit) saa_andorl((reg),(bit),0)
662
663#define saa_readb(reg) readb(dev->bmmio + (reg))
664#define saa_writeb(reg,value) writeb((value), dev->bmmio + (reg));
665#define saa_andorb(reg,mask,value) \
666 writeb((readb(dev->bmmio+(reg)) & ~(mask)) |\
667 ((value) & (mask)), dev->bmmio+(reg))
668#define saa_setb(reg,bit) saa_andorb((reg),(bit),(bit))
669#define saa_clearb(reg,bit) saa_andorb((reg),(bit),0)
670
671#define saa_wait(us) { udelay(us); }
672
673#define SAA7134_NORMS (\
674 V4L2_STD_PAL | V4L2_STD_PAL_N | \
675 V4L2_STD_PAL_Nc | V4L2_STD_SECAM | \
676 V4L2_STD_NTSC | V4L2_STD_PAL_M | \
677 V4L2_STD_PAL_60)
678
679#define GRP_EMPRESS (1)
680#define saa_call_all(dev, o, f, args...) do { \
681 if (dev->gate_ctrl) \
682 dev->gate_ctrl(dev, 1); \
683 v4l2_device_call_all(&(dev)->v4l2_dev, 0, o, f , ##args); \
684 if (dev->gate_ctrl) \
685 dev->gate_ctrl(dev, 0); \
686} while (0)
687
688#define saa_call_empress(dev, o, f, args...) ({ \
689 long _rc; \
690 if (dev->gate_ctrl) \
691 dev->gate_ctrl(dev, 1); \
692 _rc = v4l2_device_call_until_err(&(dev)->v4l2_dev, \
693 GRP_EMPRESS, o, f , ##args); \
694 if (dev->gate_ctrl) \
695 dev->gate_ctrl(dev, 0); \
696 _rc; \
697})
698
699/* ----------------------------------------------------------- */
700/* saa7134-core.c */
701
702extern struct list_head saa7134_devlist;
703extern struct mutex saa7134_devlist_lock;
704extern int saa7134_no_overlay;
705
706void saa7134_track_gpio(struct saa7134_dev *dev, char *msg);
707void saa7134_set_gpio(struct saa7134_dev *dev, int bit_no, int value);
708
709#define SAA7134_PGTABLE_SIZE 4096
710
711int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt);
712int saa7134_pgtable_build(struct pci_dev *pci, struct saa7134_pgtable *pt,
713 struct scatterlist *list, unsigned int length,
714 unsigned int startpage);
715void saa7134_pgtable_free(struct pci_dev *pci, struct saa7134_pgtable *pt);
716
717int saa7134_buffer_count(unsigned int size, unsigned int count);
718int saa7134_buffer_startpage(struct saa7134_buf *buf);
719unsigned long saa7134_buffer_base(struct saa7134_buf *buf);
720
721int saa7134_buffer_queue(struct saa7134_dev *dev, struct saa7134_dmaqueue *q,
722 struct saa7134_buf *buf);
723void saa7134_buffer_finish(struct saa7134_dev *dev, struct saa7134_dmaqueue *q,
724 unsigned int state);
725void saa7134_buffer_next(struct saa7134_dev *dev, struct saa7134_dmaqueue *q);
726void saa7134_buffer_timeout(unsigned long data);
727void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf);
728
729int saa7134_set_dmabits(struct saa7134_dev *dev);
730
731extern int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
732extern int (*saa7134_dmasound_exit)(struct saa7134_dev *dev);
733
734
735/* ----------------------------------------------------------- */
736/* saa7134-cards.c */
737
738extern struct saa7134_board saa7134_boards[];
739extern const unsigned int saa7134_bcount;
740extern struct pci_device_id __devinitdata saa7134_pci_tbl[];
741
742extern int saa7134_board_init1(struct saa7134_dev *dev);
743extern int saa7134_board_init2(struct saa7134_dev *dev);
744int saa7134_tuner_callback(void *priv, int component, int command, int arg);
745
746
747/* ----------------------------------------------------------- */
748/* saa7134-i2c.c */
749
750int saa7134_i2c_register(struct saa7134_dev *dev);
751int saa7134_i2c_unregister(struct saa7134_dev *dev);
752
753
754/* ----------------------------------------------------------- */
755/* saa7134-video.c */
756
757extern unsigned int video_debug;
758extern struct video_device saa7134_video_template;
759extern struct video_device saa7134_radio_template;
760
761int saa7134_s_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c);
762int saa7134_g_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c);
763int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c);
764int saa7134_s_std_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, v4l2_std_id *id);
765
766int saa7134_videoport_init(struct saa7134_dev *dev);
767void saa7134_set_tvnorm_hw(struct saa7134_dev *dev);
768
769int saa7134_video_init1(struct saa7134_dev *dev);
770int saa7134_video_init2(struct saa7134_dev *dev);
771void saa7134_irq_video_signalchange(struct saa7134_dev *dev);
772void saa7134_irq_video_done(struct saa7134_dev *dev, unsigned long status);
773
774
775/* ----------------------------------------------------------- */
776/* saa7134-ts.c */
777
778#define TS_PACKET_SIZE 188 /* TS packets 188 bytes */
779
780extern struct videobuf_queue_ops saa7134_ts_qops;
781
782int saa7134_ts_init1(struct saa7134_dev *dev);
783int saa7134_ts_fini(struct saa7134_dev *dev);
784void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status);
785
786int saa7134_ts_register(struct saa7134_mpeg_ops *ops);
787void saa7134_ts_unregister(struct saa7134_mpeg_ops *ops);
788
789int saa7134_ts_init_hw(struct saa7134_dev *dev);
790
791int saa7134_ts_start(struct saa7134_dev *dev);
792int saa7134_ts_stop(struct saa7134_dev *dev);
793
794/* ----------------------------------------------------------- */
795/* saa7134-vbi.c */
796
797extern struct videobuf_queue_ops saa7134_vbi_qops;
798extern struct video_device saa7134_vbi_template;
799
800int saa7134_vbi_init1(struct saa7134_dev *dev);
801int saa7134_vbi_fini(struct saa7134_dev *dev);
802void saa7134_irq_vbi_done(struct saa7134_dev *dev, unsigned long status);
803
804
805/* ----------------------------------------------------------- */
806/* saa7134-tvaudio.c */
807
808int saa7134_tvaudio_rx2mode(u32 rx);
809
810void saa7134_tvaudio_setmute(struct saa7134_dev *dev);
811void saa7134_tvaudio_setinput(struct saa7134_dev *dev,
812 struct saa7134_input *in);
813void saa7134_tvaudio_setvolume(struct saa7134_dev *dev, int level);
814int saa7134_tvaudio_getstereo(struct saa7134_dev *dev);
815
816void saa7134_tvaudio_init(struct saa7134_dev *dev);
817int saa7134_tvaudio_init2(struct saa7134_dev *dev);
818int saa7134_tvaudio_fini(struct saa7134_dev *dev);
819int saa7134_tvaudio_do_scan(struct saa7134_dev *dev);
820
821int saa_dsp_writel(struct saa7134_dev *dev, int reg, u32 value);
822
823void saa7134_enable_i2s(struct saa7134_dev *dev);
824
825/* ----------------------------------------------------------- */
826/* saa7134-oss.c */
827
828extern const struct file_operations saa7134_dsp_fops;
829extern const struct file_operations saa7134_mixer_fops;
830
831int saa7134_oss_init1(struct saa7134_dev *dev);
832int saa7134_oss_fini(struct saa7134_dev *dev);
833void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status);
834
835/* ----------------------------------------------------------- */
836/* saa7134-input.c */
837
838#if defined(CONFIG_VIDEO_SAA7134_RC)
839int saa7134_input_init1(struct saa7134_dev *dev);
840void saa7134_input_fini(struct saa7134_dev *dev);
841void saa7134_input_irq(struct saa7134_dev *dev);
842void saa7134_probe_i2c_ir(struct saa7134_dev *dev);
843int saa7134_ir_start(struct saa7134_dev *dev);
844void saa7134_ir_stop(struct saa7134_dev *dev);
845#else
846#define saa7134_input_init1(dev) (0)
847#define saa7134_input_fini(dev) (0)
848#define saa7134_input_irq(dev) (0)
849#define saa7134_probe_i2c_ir(dev) (0)
850#define saa7134_ir_start(dev) (0)
851#define saa7134_ir_stop(dev) (0)
852#endif