aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r--drivers/media/video/saa7134/Kconfig2
-rw-r--r--drivers/media/video/saa7134/saa6752hs.c491
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c17
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c445
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c85
-rw-r--r--drivers/media/video/saa7134/saa7134-dvb.c266
-rw-r--r--drivers/media/video/saa7134/saa7134-empress.c185
-rw-r--r--drivers/media/video/saa7134/saa7134-i2c.c13
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c291
-rw-r--r--drivers/media/video/saa7134/saa7134-reg.h1
-rw-r--r--drivers/media/video/saa7134/saa7134-ts.c56
-rw-r--r--drivers/media/video/saa7134/saa7134-tvaudio.c35
-rw-r--r--drivers/media/video/saa7134/saa7134-video.c239
-rw-r--r--drivers/media/video/saa7134/saa7134.h34
14 files changed, 1680 insertions, 480 deletions
diff --git a/drivers/media/video/saa7134/Kconfig b/drivers/media/video/saa7134/Kconfig
index 83f076abce35..7021bbf5897b 100644
--- a/drivers/media/video/saa7134/Kconfig
+++ b/drivers/media/video/saa7134/Kconfig
@@ -27,9 +27,7 @@ config VIDEO_SAA7134_ALSA
27config VIDEO_SAA7134_DVB 27config VIDEO_SAA7134_DVB
28 tristate "DVB/ATSC Support for saa7134 based TV cards" 28 tristate "DVB/ATSC Support for saa7134 based TV cards"
29 depends on VIDEO_SAA7134 && DVB_CORE 29 depends on VIDEO_SAA7134 && DVB_CORE
30 depends on HOTPLUG # due to FW_LOADER
31 select VIDEOBUF_DVB 30 select VIDEOBUF_DVB
32 select FW_LOADER
33 select DVB_PLL if !DVB_FE_CUSTOMISE 31 select DVB_PLL if !DVB_FE_CUSTOMISE
34 select DVB_MT352 if !DVB_FE_CUSTOMISE 32 select DVB_MT352 if !DVB_FE_CUSTOMISE
35 select DVB_TDA1004X if !DVB_FE_CUSTOMISE 33 select DVB_TDA1004X if !DVB_FE_CUSTOMISE
diff --git a/drivers/media/video/saa7134/saa6752hs.c b/drivers/media/video/saa7134/saa6752hs.c
index 002e70a33a4f..1fb6eccdade3 100644
--- a/drivers/media/video/saa7134/saa6752hs.c
+++ b/drivers/media/video/saa7134/saa6752hs.c
@@ -1,3 +1,27 @@
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
1#include <linux/module.h> 25#include <linux/module.h>
2#include <linux/kernel.h> 26#include <linux/kernel.h>
3#include <linux/string.h> 27#include <linux/string.h>
@@ -10,10 +34,11 @@
10#include <linux/types.h> 34#include <linux/types.h>
11#include <linux/videodev2.h> 35#include <linux/videodev2.h>
12#include <media/v4l2-common.h> 36#include <media/v4l2-common.h>
37#include <media/v4l2-chip-ident.h>
38#include <media/v4l2-i2c-drv-legacy.h>
13#include <linux/init.h> 39#include <linux/init.h>
14#include <linux/crc32.h> 40#include <linux/crc32.h>
15 41
16
17#define MPEG_VIDEO_TARGET_BITRATE_MAX 27000 42#define MPEG_VIDEO_TARGET_BITRATE_MAX 27000
18#define MPEG_VIDEO_MAX_BITRATE_MAX 27000 43#define MPEG_VIDEO_MAX_BITRATE_MAX 27000
19#define MPEG_TOTAL_TARGET_BITRATE_MAX 27000 44#define MPEG_TOTAL_TARGET_BITRATE_MAX 27000
@@ -21,15 +46,13 @@
21 46
22/* Addresses to scan */ 47/* Addresses to scan */
23static unsigned short normal_i2c[] = {0x20, I2C_CLIENT_END}; 48static unsigned short normal_i2c[] = {0x20, I2C_CLIENT_END};
49
24I2C_CLIENT_INSMOD; 50I2C_CLIENT_INSMOD;
25 51
26MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder"); 52MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder");
27MODULE_AUTHOR("Andrew de Quincey"); 53MODULE_AUTHOR("Andrew de Quincey");
28MODULE_LICENSE("GPL"); 54MODULE_LICENSE("GPL");
29 55
30static struct i2c_driver driver;
31static struct i2c_client client_template;
32
33enum saa6752hs_videoformat { 56enum saa6752hs_videoformat {
34 SAA6752HS_VF_D1 = 0, /* standard D1 video format: 720x576 */ 57 SAA6752HS_VF_D1 = 0, /* standard D1 video format: 720x576 */
35 SAA6752HS_VF_2_3_D1 = 1,/* 2/3D1 video format: 480x576 */ 58 SAA6752HS_VF_2_3_D1 = 1,/* 2/3D1 video format: 480x576 */
@@ -46,7 +69,9 @@ struct saa6752hs_mpeg_params {
46 __u16 ts_pid_pcr; 69 __u16 ts_pid_pcr;
47 70
48 /* audio */ 71 /* audio */
49 enum v4l2_mpeg_audio_l2_bitrate au_l2_bitrate; 72 enum v4l2_mpeg_audio_encoding au_encoding;
73 enum v4l2_mpeg_audio_l2_bitrate au_l2_bitrate;
74 enum v4l2_mpeg_audio_ac3_bitrate au_ac3_bitrate;
50 75
51 /* video */ 76 /* video */
52 enum v4l2_mpeg_video_aspect vi_aspect; 77 enum v4l2_mpeg_video_aspect vi_aspect;
@@ -70,7 +95,9 @@ static const struct v4l2_format v4l2_format_table[] =
70}; 95};
71 96
72struct saa6752hs_state { 97struct saa6752hs_state {
73 struct i2c_client client; 98 int chip;
99 u32 revision;
100 int has_ac3;
74 struct saa6752hs_mpeg_params params; 101 struct saa6752hs_mpeg_params params;
75 enum saa6752hs_videoformat video_format; 102 enum saa6752hs_videoformat video_format;
76 v4l2_std_id standard; 103 v4l2_std_id standard;
@@ -145,6 +172,39 @@ static u8 PMT[] = {
145 0x00, 0x00, 0x00, 0x00 /* CRC32 */ 172 0x00, 0x00, 0x00, 0x00 /* CRC32 */
146}; 173};
147 174
175static u8 PMT_AC3[] = {
176 0xc2, /* i2c register */
177 0x01, /* table number for encoder(1) */
178 0x47, /* sync */
179
180 0x40, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0) */
181 0x10, /* PMT PID (0x0010) */
182 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
183
184 0x00, /* PSI pointer to start of table */
185
186 0x02, /* TID (2) */
187 0xb0, 0x1a, /* section_syntax_indicator(1), section_length(26) */
188
189 0x00, 0x01, /* program_number(1) */
190
191 0xc1, /* version_number(0), current_next_indicator(1) */
192
193 0x00, 0x00, /* section_number(0), last_section_number(0) */
194
195 0xe1, 0x04, /* PCR_PID (0x0104) */
196
197 0xf0, 0x00, /* program_info_length(0) */
198
199 0x02, 0xe1, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
200 0x06, 0xe1, 0x03, 0xf0, 0x03, /* audio stream type(6), pid */
201 0x6a, /* AC3 */
202 0x01, /* Descriptor_length(1) */
203 0x00, /* component_type_flag(0), bsid_flag(0), mainid_flag(0), asvc_flag(0), reserved flags(0) */
204
205 0xED, 0xDE, 0x2D, 0xF3 /* CRC32 BE */
206};
207
148static struct saa6752hs_mpeg_params param_defaults = 208static struct saa6752hs_mpeg_params param_defaults =
149{ 209{
150 .ts_pid_pmt = 16, 210 .ts_pid_pmt = 16,
@@ -157,12 +217,14 @@ static struct saa6752hs_mpeg_params param_defaults =
157 .vi_bitrate_peak = 6000, 217 .vi_bitrate_peak = 6000,
158 .vi_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR, 218 .vi_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
159 219
220 .au_encoding = V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
160 .au_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_256K, 221 .au_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_256K,
222 .au_ac3_bitrate = V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
161}; 223};
162 224
163/* ---------------------------------------------------------------------- */ 225/* ---------------------------------------------------------------------- */
164 226
165static int saa6752hs_chip_command(struct i2c_client* client, 227static int saa6752hs_chip_command(struct i2c_client *client,
166 enum saa6752hs_command command) 228 enum saa6752hs_command command)
167{ 229{
168 unsigned char buf[3]; 230 unsigned char buf[3];
@@ -229,45 +291,61 @@ static int saa6752hs_chip_command(struct i2c_client* client,
229} 291}
230 292
231 293
232static int saa6752hs_set_bitrate(struct i2c_client* client, 294static inline void set_reg8(struct i2c_client *client, uint8_t reg, uint8_t val)
233 struct saa6752hs_mpeg_params* params) 295{
296 u8 buf[2];
297
298 buf[0] = reg;
299 buf[1] = val;
300 i2c_master_send(client, buf, 2);
301}
302
303static inline void set_reg16(struct i2c_client *client, uint8_t reg, uint16_t val)
234{ 304{
235 u8 buf[3]; 305 u8 buf[3];
306
307 buf[0] = reg;
308 buf[1] = val >> 8;
309 buf[2] = val & 0xff;
310 i2c_master_send(client, buf, 3);
311}
312
313static int saa6752hs_set_bitrate(struct i2c_client *client,
314 struct saa6752hs_state *h)
315{
316 struct saa6752hs_mpeg_params *params = &h->params;
236 int tot_bitrate; 317 int tot_bitrate;
318 int is_384k;
237 319
238 /* set the bitrate mode */ 320 /* set the bitrate mode */
239 buf[0] = 0x71; 321 set_reg8(client, 0x71,
240 buf[1] = (params->vi_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) ? 0 : 1; 322 params->vi_bitrate_mode != V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
241 i2c_master_send(client, buf, 2);
242 323
243 /* set the video bitrate */ 324 /* set the video bitrate */
244 if (params->vi_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) { 325 if (params->vi_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) {
245 /* set the target bitrate */ 326 /* set the target bitrate */
246 buf[0] = 0x80; 327 set_reg16(client, 0x80, params->vi_bitrate);
247 buf[1] = params->vi_bitrate >> 8;
248 buf[2] = params->vi_bitrate & 0xff;
249 i2c_master_send(client, buf, 3);
250 328
251 /* set the max bitrate */ 329 /* set the max bitrate */
252 buf[0] = 0x81; 330 set_reg16(client, 0x81, params->vi_bitrate_peak);
253 buf[1] = params->vi_bitrate_peak >> 8;
254 buf[2] = params->vi_bitrate_peak & 0xff;
255 i2c_master_send(client, buf, 3);
256 tot_bitrate = params->vi_bitrate_peak; 331 tot_bitrate = params->vi_bitrate_peak;
257 } else { 332 } else {
258 /* set the target bitrate (no max bitrate for CBR) */ 333 /* set the target bitrate (no max bitrate for CBR) */
259 buf[0] = 0x81; 334 set_reg16(client, 0x81, params->vi_bitrate);
260 buf[1] = params->vi_bitrate >> 8;
261 buf[2] = params->vi_bitrate & 0xff;
262 i2c_master_send(client, buf, 3);
263 tot_bitrate = params->vi_bitrate; 335 tot_bitrate = params->vi_bitrate;
264 } 336 }
265 337
338 /* set the audio encoding */
339 set_reg8(client, 0x93,
340 params->au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3);
341
266 /* set the audio bitrate */ 342 /* set the audio bitrate */
267 buf[0] = 0x94; 343 if (params->au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3)
268 buf[1] = (V4L2_MPEG_AUDIO_L2_BITRATE_256K == params->au_l2_bitrate) ? 0 : 1; 344 is_384k = V4L2_MPEG_AUDIO_AC3_BITRATE_384K == params->au_ac3_bitrate;
269 i2c_master_send(client, buf, 2); 345 else
270 tot_bitrate += (V4L2_MPEG_AUDIO_L2_BITRATE_256K == params->au_l2_bitrate) ? 256 : 384; 346 is_384k = V4L2_MPEG_AUDIO_L2_BITRATE_384K == params->au_l2_bitrate;
347 set_reg8(client, 0x94, is_384k);
348 tot_bitrate += is_384k ? 384 : 256;
271 349
272 /* Note: the total max bitrate is determined by adding the video and audio 350 /* Note: the total max bitrate is determined by adding the video and audio
273 bitrates together and also adding an extra 768kbit/s to stay on the 351 bitrates together and also adding an extra 768kbit/s to stay on the
@@ -278,16 +356,12 @@ static int saa6752hs_set_bitrate(struct i2c_client* client,
278 tot_bitrate = MPEG_TOTAL_TARGET_BITRATE_MAX; 356 tot_bitrate = MPEG_TOTAL_TARGET_BITRATE_MAX;
279 357
280 /* set the total bitrate */ 358 /* set the total bitrate */
281 buf[0] = 0xb1; 359 set_reg16(client, 0xb1, tot_bitrate);
282 buf[1] = tot_bitrate >> 8;
283 buf[2] = tot_bitrate & 0xff;
284 i2c_master_send(client, buf, 3);
285
286 return 0; 360 return 0;
287} 361}
288 362
289static void saa6752hs_set_subsampling(struct i2c_client* client, 363static void saa6752hs_set_subsampling(struct i2c_client *client,
290 struct v4l2_format* f) 364 struct v4l2_format *f)
291{ 365{
292 struct saa6752hs_state *h = i2c_get_clientdata(client); 366 struct saa6752hs_state *h = i2c_get_clientdata(client);
293 int dist_352, dist_480, dist_720; 367 int dist_352, dist_480, dist_720;
@@ -332,7 +406,7 @@ static void saa6752hs_set_subsampling(struct i2c_client* client,
332} 406}
333 407
334 408
335static int handle_ctrl(struct saa6752hs_mpeg_params *params, 409static int handle_ctrl(int has_ac3, struct saa6752hs_mpeg_params *params,
336 struct v4l2_ext_control *ctrl, unsigned int cmd) 410 struct v4l2_ext_control *ctrl, unsigned int cmd)
337{ 411{
338 int old = 0, new; 412 int old = 0, new;
@@ -379,8 +453,9 @@ static int handle_ctrl(struct saa6752hs_mpeg_params *params,
379 params->ts_pid_pcr = new; 453 params->ts_pid_pcr = new;
380 break; 454 break;
381 case V4L2_CID_MPEG_AUDIO_ENCODING: 455 case V4L2_CID_MPEG_AUDIO_ENCODING:
382 old = V4L2_MPEG_AUDIO_ENCODING_LAYER_2; 456 old = params->au_encoding;
383 if (set && new != old) 457 if (set && new != V4L2_MPEG_AUDIO_ENCODING_LAYER_2 &&
458 (!has_ac3 || new != V4L2_MPEG_AUDIO_ENCODING_AC3))
384 return -ERANGE; 459 return -ERANGE;
385 new = old; 460 new = old;
386 break; 461 break;
@@ -395,6 +470,19 @@ static int handle_ctrl(struct saa6752hs_mpeg_params *params,
395 new = V4L2_MPEG_AUDIO_L2_BITRATE_384K; 470 new = V4L2_MPEG_AUDIO_L2_BITRATE_384K;
396 params->au_l2_bitrate = new; 471 params->au_l2_bitrate = new;
397 break; 472 break;
473 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
474 if (!has_ac3)
475 return -EINVAL;
476 old = params->au_ac3_bitrate;
477 if (set && new != V4L2_MPEG_AUDIO_AC3_BITRATE_256K &&
478 new != V4L2_MPEG_AUDIO_AC3_BITRATE_384K)
479 return -ERANGE;
480 if (new <= V4L2_MPEG_AUDIO_AC3_BITRATE_256K)
481 new = V4L2_MPEG_AUDIO_AC3_BITRATE_256K;
482 else
483 new = V4L2_MPEG_AUDIO_AC3_BITRATE_384K;
484 params->au_ac3_bitrate = new;
485 break;
398 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ: 486 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
399 old = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000; 487 old = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000;
400 if (set && new != old) 488 if (set && new != old)
@@ -448,10 +536,131 @@ static int handle_ctrl(struct saa6752hs_mpeg_params *params,
448 return 0; 536 return 0;
449} 537}
450 538
451static int saa6752hs_init(struct i2c_client* client) 539static int saa6752hs_qctrl(struct saa6752hs_state *h,
540 struct v4l2_queryctrl *qctrl)
541{
542 struct saa6752hs_mpeg_params *params = &h->params;
543 int err;
544
545 switch (qctrl->id) {
546 case V4L2_CID_MPEG_AUDIO_ENCODING:
547 return v4l2_ctrl_query_fill(qctrl,
548 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
549 h->has_ac3 ? V4L2_MPEG_AUDIO_ENCODING_AC3 :
550 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
551 1, V4L2_MPEG_AUDIO_ENCODING_LAYER_2);
552
553 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
554 return v4l2_ctrl_query_fill(qctrl,
555 V4L2_MPEG_AUDIO_L2_BITRATE_256K,
556 V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1,
557 V4L2_MPEG_AUDIO_L2_BITRATE_256K);
558
559 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
560 if (!h->has_ac3)
561 return -EINVAL;
562 return v4l2_ctrl_query_fill(qctrl,
563 V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
564 V4L2_MPEG_AUDIO_AC3_BITRATE_384K, 1,
565 V4L2_MPEG_AUDIO_AC3_BITRATE_256K);
566
567 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
568 return v4l2_ctrl_query_fill(qctrl,
569 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
570 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000, 1,
571 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000);
572
573 case V4L2_CID_MPEG_VIDEO_ENCODING:
574 return v4l2_ctrl_query_fill(qctrl,
575 V4L2_MPEG_VIDEO_ENCODING_MPEG_2,
576 V4L2_MPEG_VIDEO_ENCODING_MPEG_2, 1,
577 V4L2_MPEG_VIDEO_ENCODING_MPEG_2);
578
579 case V4L2_CID_MPEG_VIDEO_ASPECT:
580 return v4l2_ctrl_query_fill(qctrl,
581 V4L2_MPEG_VIDEO_ASPECT_4x3,
582 V4L2_MPEG_VIDEO_ASPECT_16x9, 1,
583 V4L2_MPEG_VIDEO_ASPECT_4x3);
584
585 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
586 err = v4l2_ctrl_query_fill_std(qctrl);
587 if (err == 0 &&
588 params->vi_bitrate_mode ==
589 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
590 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
591 return err;
592
593 case V4L2_CID_MPEG_STREAM_TYPE:
594 return v4l2_ctrl_query_fill(qctrl,
595 V4L2_MPEG_STREAM_TYPE_MPEG2_TS,
596 V4L2_MPEG_STREAM_TYPE_MPEG2_TS, 1,
597 V4L2_MPEG_STREAM_TYPE_MPEG2_TS);
598
599 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
600 case V4L2_CID_MPEG_VIDEO_BITRATE:
601 case V4L2_CID_MPEG_STREAM_PID_PMT:
602 case V4L2_CID_MPEG_STREAM_PID_AUDIO:
603 case V4L2_CID_MPEG_STREAM_PID_VIDEO:
604 case V4L2_CID_MPEG_STREAM_PID_PCR:
605 return v4l2_ctrl_query_fill_std(qctrl);
606
607 default:
608 break;
609 }
610 return -EINVAL;
611}
612
613static int saa6752hs_qmenu(struct saa6752hs_state *h,
614 struct v4l2_querymenu *qmenu)
615{
616 static const u32 mpeg_audio_encoding[] = {
617 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
618 V4L2_CTRL_MENU_IDS_END
619 };
620 static const u32 mpeg_audio_ac3_encoding[] = {
621 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
622 V4L2_MPEG_AUDIO_ENCODING_AC3,
623 V4L2_CTRL_MENU_IDS_END
624 };
625 static u32 mpeg_audio_l2_bitrate[] = {
626 V4L2_MPEG_AUDIO_L2_BITRATE_256K,
627 V4L2_MPEG_AUDIO_L2_BITRATE_384K,
628 V4L2_CTRL_MENU_IDS_END
629 };
630 static u32 mpeg_audio_ac3_bitrate[] = {
631 V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
632 V4L2_MPEG_AUDIO_AC3_BITRATE_384K,
633 V4L2_CTRL_MENU_IDS_END
634 };
635 struct v4l2_queryctrl qctrl;
636 int err;
637
638 qctrl.id = qmenu->id;
639 err = saa6752hs_qctrl(h, &qctrl);
640 if (err)
641 return err;
642 switch (qmenu->id) {
643 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
644 return v4l2_ctrl_query_menu_valid_items(qmenu,
645 mpeg_audio_l2_bitrate);
646 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
647 if (!h->has_ac3)
648 return -EINVAL;
649 return v4l2_ctrl_query_menu_valid_items(qmenu,
650 mpeg_audio_ac3_bitrate);
651 case V4L2_CID_MPEG_AUDIO_ENCODING:
652 return v4l2_ctrl_query_menu_valid_items(qmenu,
653 h->has_ac3 ? mpeg_audio_ac3_encoding :
654 mpeg_audio_encoding);
655 }
656 return v4l2_ctrl_query_menu(qmenu, &qctrl, NULL);
657}
658
659static int saa6752hs_init(struct i2c_client *client, u32 leading_null_bytes)
452{ 660{
453 unsigned char buf[9], buf2[4]; 661 unsigned char buf[9], buf2[4];
454 struct saa6752hs_state *h; 662 struct saa6752hs_state *h;
663 unsigned size;
455 u32 crc; 664 u32 crc;
456 unsigned char localPAT[256]; 665 unsigned char localPAT[256];
457 unsigned char localPMT[256]; 666 unsigned char localPMT[256];
@@ -459,45 +668,31 @@ static int saa6752hs_init(struct i2c_client* client)
459 h = i2c_get_clientdata(client); 668 h = i2c_get_clientdata(client);
460 669
461 /* Set video format - must be done first as it resets other settings */ 670 /* Set video format - must be done first as it resets other settings */
462 buf[0] = 0x41; 671 set_reg8(client, 0x41, h->video_format);
463 buf[1] = h->video_format;
464 i2c_master_send(client, buf, 2);
465 672
466 /* Set number of lines in input signal */ 673 /* Set number of lines in input signal */
467 buf[0] = 0x40; 674 set_reg8(client, 0x40, (h->standard & V4L2_STD_525_60) ? 1 : 0);
468 buf[1] = 0x00;
469 if (h->standard & V4L2_STD_525_60)
470 buf[1] = 0x01;
471 i2c_master_send(client, buf, 2);
472 675
473 /* set bitrate */ 676 /* set bitrate */
474 saa6752hs_set_bitrate(client, &h->params); 677 saa6752hs_set_bitrate(client, h);
475 678
476 /* Set GOP structure {3, 13} */ 679 /* Set GOP structure {3, 13} */
477 buf[0] = 0x72; 680 set_reg16(client, 0x72, 0x030d);
478 buf[1] = 0x03;
479 buf[2] = 0x0D;
480 i2c_master_send(client,buf,3);
481 681
482 /* Set minimum Q-scale {4} */ 682 /* Set minimum Q-scale {4} */
483 buf[0] = 0x82; 683 set_reg8(client, 0x82, 0x04);
484 buf[1] = 0x04;
485 i2c_master_send(client,buf,2);
486 684
487 /* Set maximum Q-scale {12} */ 685 /* Set maximum Q-scale {12} */
488 buf[0] = 0x83; 686 set_reg8(client, 0x83, 0x0c);
489 buf[1] = 0x0C;
490 i2c_master_send(client,buf,2);
491 687
492 /* Set Output Protocol */ 688 /* Set Output Protocol */
493 buf[0] = 0xD0; 689 set_reg8(client, 0xd0, 0x81);
494 buf[1] = 0x81;
495 i2c_master_send(client,buf,2);
496 690
497 /* Set video output stream format {TS} */ 691 /* Set video output stream format {TS} */
498 buf[0] = 0xB0; 692 set_reg8(client, 0xb0, 0x05);
499 buf[1] = 0x05; 693
500 i2c_master_send(client,buf,2); 694 /* Set leading null byte for TS */
695 set_reg16(client, 0xf6, leading_null_bytes);
501 696
502 /* compute PAT */ 697 /* compute PAT */
503 memcpy(localPAT, PAT, sizeof(PAT)); 698 memcpy(localPAT, PAT, sizeof(PAT));
@@ -510,7 +705,13 @@ static int saa6752hs_init(struct i2c_client* client)
510 localPAT[sizeof(PAT) - 1] = crc & 0xFF; 705 localPAT[sizeof(PAT) - 1] = crc & 0xFF;
511 706
512 /* compute PMT */ 707 /* compute PMT */
513 memcpy(localPMT, PMT, sizeof(PMT)); 708 if (h->params.au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3) {
709 size = sizeof(PMT_AC3);
710 memcpy(localPMT, PMT_AC3, size);
711 } else {
712 size = sizeof(PMT);
713 memcpy(localPMT, PMT, size);
714 }
514 localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f); 715 localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f);
515 localPMT[4] = h->params.ts_pid_pmt & 0xff; 716 localPMT[4] = h->params.ts_pid_pmt & 0xff;
516 localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F); 717 localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F);
@@ -519,40 +720,28 @@ static int saa6752hs_init(struct i2c_client* client)
519 localPMT[21] = h->params.ts_pid_video & 0xFF; 720 localPMT[21] = h->params.ts_pid_video & 0xFF;
520 localPMT[25] = 0xE0 | ((h->params.ts_pid_audio >> 8) & 0x0F); 721 localPMT[25] = 0xE0 | ((h->params.ts_pid_audio >> 8) & 0x0F);
521 localPMT[26] = h->params.ts_pid_audio & 0xFF; 722 localPMT[26] = h->params.ts_pid_audio & 0xFF;
522 crc = crc32_be(~0, &localPMT[7], sizeof(PMT) - 7 - 4); 723 crc = crc32_be(~0, &localPMT[7], size - 7 - 4);
523 localPMT[sizeof(PMT) - 4] = (crc >> 24) & 0xFF; 724 localPMT[size - 4] = (crc >> 24) & 0xFF;
524 localPMT[sizeof(PMT) - 3] = (crc >> 16) & 0xFF; 725 localPMT[size - 3] = (crc >> 16) & 0xFF;
525 localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF; 726 localPMT[size - 2] = (crc >> 8) & 0xFF;
526 localPMT[sizeof(PMT) - 1] = crc & 0xFF; 727 localPMT[size - 1] = crc & 0xFF;
527 728
528 /* Set Audio PID */ 729 /* Set Audio PID */
529 buf[0] = 0xC1; 730 set_reg16(client, 0xc1, h->params.ts_pid_audio);
530 buf[1] = (h->params.ts_pid_audio >> 8) & 0xFF;
531 buf[2] = h->params.ts_pid_audio & 0xFF;
532 i2c_master_send(client,buf,3);
533 731
534 /* Set Video PID */ 732 /* Set Video PID */
535 buf[0] = 0xC0; 733 set_reg16(client, 0xc0, h->params.ts_pid_video);
536 buf[1] = (h->params.ts_pid_video >> 8) & 0xFF;
537 buf[2] = h->params.ts_pid_video & 0xFF;
538 i2c_master_send(client,buf,3);
539 734
540 /* Set PCR PID */ 735 /* Set PCR PID */
541 buf[0] = 0xC4; 736 set_reg16(client, 0xc4, h->params.ts_pid_pcr);
542 buf[1] = (h->params.ts_pid_pcr >> 8) & 0xFF;
543 buf[2] = h->params.ts_pid_pcr & 0xFF;
544 i2c_master_send(client,buf,3);
545 737
546 /* Send SI tables */ 738 /* Send SI tables */
547 i2c_master_send(client,localPAT,sizeof(PAT)); 739 i2c_master_send(client, localPAT, sizeof(PAT));
548 i2c_master_send(client,localPMT,sizeof(PMT)); 740 i2c_master_send(client, localPMT, size);
549 741
550 /* mute then unmute audio. This removes buzzing artefacts */ 742 /* mute then unmute audio. This removes buzzing artefacts */
551 buf[0] = 0xa4; 743 set_reg8(client, 0xa4, 1);
552 buf[1] = 1; 744 set_reg8(client, 0xa4, 0);
553 i2c_master_send(client, buf, 2);
554 buf[1] = 0;
555 i2c_master_send(client, buf, 2);
556 745
557 /* start it going */ 746 /* start it going */
558 saa6752hs_chip_command(client, SAA6752HS_COMMAND_START); 747 saa6752hs_chip_command(client, SAA6752HS_COMMAND_START);
@@ -590,46 +779,6 @@ static int saa6752hs_init(struct i2c_client* client)
590 return 0; 779 return 0;
591} 780}
592 781
593static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind)
594{
595 struct saa6752hs_state *h;
596
597
598 if (NULL == (h = kzalloc(sizeof(*h), GFP_KERNEL)))
599 return -ENOMEM;
600 h->client = client_template;
601 h->params = param_defaults;
602 h->client.adapter = adap;
603 h->client.addr = addr;
604
605 /* Assume 625 input lines */
606 h->standard = 0;
607
608 i2c_set_clientdata(&h->client, h);
609 i2c_attach_client(&h->client);
610
611 v4l_info(&h->client,"saa6752hs: chip found @ 0x%x\n", addr<<1);
612
613 return 0;
614}
615
616static int saa6752hs_probe(struct i2c_adapter *adap)
617{
618 if (adap->class & I2C_CLASS_TV_ANALOG)
619 return i2c_probe(adap, &addr_data, saa6752hs_attach);
620 return 0;
621}
622
623static int saa6752hs_detach(struct i2c_client *client)
624{
625 struct saa6752hs_state *h;
626
627 h = i2c_get_clientdata(client);
628 i2c_detach_client(client);
629 kfree(h);
630 return 0;
631}
632
633static int 782static int
634saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg) 783saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
635{ 784{
@@ -640,14 +789,13 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
640 int i; 789 int i;
641 790
642 switch (cmd) { 791 switch (cmd) {
792 case VIDIOC_INT_INIT:
793 /* apply settings and start encoder */
794 saa6752hs_init(client, *(u32 *)arg);
795 break;
643 case VIDIOC_S_EXT_CTRLS: 796 case VIDIOC_S_EXT_CTRLS:
644 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) 797 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
645 return -EINVAL; 798 return -EINVAL;
646 if (ctrls->count == 0) {
647 /* apply settings and start encoder */
648 saa6752hs_init(client);
649 break;
650 }
651 /* fall through */ 799 /* fall through */
652 case VIDIOC_TRY_EXT_CTRLS: 800 case VIDIOC_TRY_EXT_CTRLS:
653 case VIDIOC_G_EXT_CTRLS: 801 case VIDIOC_G_EXT_CTRLS:
@@ -655,13 +803,18 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
655 return -EINVAL; 803 return -EINVAL;
656 params = h->params; 804 params = h->params;
657 for (i = 0; i < ctrls->count; i++) { 805 for (i = 0; i < ctrls->count; i++) {
658 if ((err = handle_ctrl(&params, ctrls->controls + i, cmd))) { 806 err = handle_ctrl(h->has_ac3, &params, ctrls->controls + i, cmd);
807 if (err) {
659 ctrls->error_idx = i; 808 ctrls->error_idx = i;
660 return err; 809 return err;
661 } 810 }
662 } 811 }
663 h->params = params; 812 h->params = params;
664 break; 813 break;
814 case VIDIOC_QUERYCTRL:
815 return saa6752hs_qctrl(h, arg);
816 case VIDIOC_QUERYMENU:
817 return saa6752hs_qmenu(h, arg);
665 case VIDIOC_G_FMT: 818 case VIDIOC_G_FMT:
666 { 819 {
667 struct v4l2_format *f = arg; 820 struct v4l2_format *f = arg;
@@ -684,6 +837,11 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
684 case VIDIOC_S_STD: 837 case VIDIOC_S_STD:
685 h->standard = *((v4l2_std_id *) arg); 838 h->standard = *((v4l2_std_id *) arg);
686 break; 839 break;
840
841 case VIDIOC_G_CHIP_IDENT:
842 return v4l2_chip_ident_i2c_client(client,
843 arg, h->chip, h->revision);
844
687 default: 845 default:
688 /* nothing */ 846 /* nothing */
689 break; 847 break;
@@ -692,36 +850,55 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
692 return err; 850 return err;
693} 851}
694 852
695/* ----------------------------------------------------------------------- */ 853static int saa6752hs_probe(struct i2c_client *client,
854 const struct i2c_device_id *id)
855{
856 struct saa6752hs_state *h = kzalloc(sizeof(*h), GFP_KERNEL);
857 u8 addr = 0x13;
858 u8 data[12];
696 859
697static struct i2c_driver driver = { 860 v4l_info(client, "chip found @ 0x%x (%s)\n",
698 .driver = { 861 client->addr << 1, client->adapter->name);
699 .name = "saa6752hs", 862 if (h == NULL)
700 }, 863 return -ENOMEM;
701 .id = I2C_DRIVERID_SAA6752HS,
702 .attach_adapter = saa6752hs_probe,
703 .detach_client = saa6752hs_detach,
704 .command = saa6752hs_command,
705};
706 864
707static struct i2c_client client_template = 865 i2c_master_send(client, &addr, 1);
708{ 866 i2c_master_recv(client, data, sizeof(data));
709 .name = "saa6752hs", 867 h->chip = V4L2_IDENT_SAA6752HS;
710 .driver = &driver, 868 h->revision = (data[8] << 8) | data[9];
711}; 869 h->has_ac3 = 0;
870 if (h->revision == 0x0206) {
871 h->chip = V4L2_IDENT_SAA6752HS_AC3;
872 h->has_ac3 = 1;
873 v4l_info(client, "support AC-3\n");
874 }
875 h->params = param_defaults;
876 h->standard = 0; /* Assume 625 input lines */
712 877
713static int __init saa6752hs_init_module(void) 878 i2c_set_clientdata(client, h);
714{ 879 return 0;
715 return i2c_add_driver(&driver);
716} 880}
717 881
718static void __exit saa6752hs_cleanup_module(void) 882static int saa6752hs_remove(struct i2c_client *client)
719{ 883{
720 i2c_del_driver(&driver); 884 kfree(i2c_get_clientdata(client));
885 return 0;
721} 886}
722 887
723module_init(saa6752hs_init_module); 888static const struct i2c_device_id saa6752hs_id[] = {
724module_exit(saa6752hs_cleanup_module); 889 { "saa6752hs", 0 },
890 { }
891};
892MODULE_DEVICE_TABLE(i2c, saa6752hs_id);
893
894static struct v4l2_i2c_driver_data v4l2_i2c_data = {
895 .name = "saa6752hs",
896 .driverid = I2C_DRIVERID_SAA6752HS,
897 .command = saa6752hs_command,
898 .probe = saa6752hs_probe,
899 .remove = saa6752hs_remove,
900 .id_table = saa6752hs_id,
901};
725 902
726/* 903/*
727 * Overrides for Emacs so that we follow Linus's tabbing style. 904 * Overrides for Emacs so that we follow Linus's tabbing style.
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
index f118de6e3672..26194a0ce927 100644
--- a/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -80,7 +80,6 @@ typedef struct snd_card_saa7134 {
80} snd_card_saa7134_t; 80} snd_card_saa7134_t;
81 81
82 82
83
84/* 83/*
85 * PCM structure 84 * PCM structure
86 */ 85 */
@@ -489,10 +488,12 @@ static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
489 period_size = params_period_bytes(hw_params); 488 period_size = params_period_bytes(hw_params);
490 periods = params_periods(hw_params); 489 periods = params_periods(hw_params);
491 490
492 snd_assert(period_size >= 0x100 && period_size <= 0x10000, 491 if (period_size < 0x100 || period_size > 0x10000)
493 return -EINVAL); 492 return -EINVAL;
494 snd_assert(periods >= 4, return -EINVAL); 493 if (periods < 4)
495 snd_assert(period_size * periods <= 1024 * 1024, return -EINVAL); 494 return -EINVAL;
495 if (period_size * periods > 1024 * 1024)
496 return -EINVAL;
496 497
497 dev = saa7134->dev; 498 dev = saa7134->dev;
498 499
@@ -943,7 +944,8 @@ static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
943 unsigned int idx; 944 unsigned int idx;
944 int err; 945 int err;
945 946
946 snd_assert(chip != NULL, return -EINVAL); 947 if (snd_BUG_ON(!chip))
948 return -EINVAL;
947 strcpy(card->mixername, "SAA7134 Mixer"); 949 strcpy(card->mixername, "SAA7134 Mixer");
948 950
949 for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_controls); idx++) { 951 for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_controls); idx++) {
@@ -1121,6 +1123,3 @@ late_initcall(saa7134_alsa_init);
1121module_exit(saa7134_alsa_exit); 1123module_exit(saa7134_alsa_exit);
1122MODULE_LICENSE("GPL"); 1124MODULE_LICENSE("GPL");
1123MODULE_AUTHOR("Ricardo Cerqueira"); 1125MODULE_AUTHOR("Ricardo Cerqueira");
1124
1125
1126
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index 2618cfa592e7..ddc5402c5fb0 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -1287,6 +1287,22 @@ struct saa7134_board saa7134_boards[] = {
1287 .vmux = 8, 1287 .vmux = 8,
1288 }}, 1288 }},
1289 }, 1289 },
1290 [SAA7134_BOARD_AVERMEDIA_M103] = {
1291 /* Massimo Piccioni <dafastidio@libero.it> */
1292 .name = "AVerMedia MiniPCI DVB-T Hybrid M103",
1293 .audio_clock = 0x187de7,
1294 .tuner_type = TUNER_XC2028,
1295 .radio_type = UNSET,
1296 .tuner_addr = ADDR_UNSET,
1297 .radio_addr = ADDR_UNSET,
1298 .mpeg = SAA7134_MPEG_DVB,
1299 .inputs = {{
1300 .name = name_tv,
1301 .vmux = 1,
1302 .amux = TV,
1303 .tv = 1,
1304 } },
1305 },
1290 [SAA7134_BOARD_NOVAC_PRIMETV7133] = { 1306 [SAA7134_BOARD_NOVAC_PRIMETV7133] = {
1291 /* toshii@netbsd.org */ 1307 /* toshii@netbsd.org */
1292 .name = "Noval Prime TV 7133", 1308 .name = "Noval Prime TV 7133",
@@ -3244,6 +3260,7 @@ struct saa7134_board saa7134_boards[] = {
3244 }, 3260 },
3245 [SAA7134_BOARD_HAUPPAUGE_HVR1110] = { 3261 [SAA7134_BOARD_HAUPPAUGE_HVR1110] = {
3246 /* Thomas Genty <tomlohave@gmail.com> */ 3262 /* Thomas Genty <tomlohave@gmail.com> */
3263 /* David Bentham <db260179@hotmail.com> */
3247 .name = "Hauppauge WinTV-HVR1110 DVB-T/Hybrid", 3264 .name = "Hauppauge WinTV-HVR1110 DVB-T/Hybrid",
3248 .audio_clock = 0x00187de7, 3265 .audio_clock = 0x00187de7,
3249 .tuner_type = TUNER_PHILIPS_TDA8290, 3266 .tuner_type = TUNER_PHILIPS_TDA8290,
@@ -3252,23 +3269,26 @@ struct saa7134_board saa7134_boards[] = {
3252 .radio_addr = ADDR_UNSET, 3269 .radio_addr = ADDR_UNSET,
3253 .tuner_config = 1, 3270 .tuner_config = 1,
3254 .mpeg = SAA7134_MPEG_DVB, 3271 .mpeg = SAA7134_MPEG_DVB,
3272 .gpiomask = 0x0200100,
3255 .inputs = {{ 3273 .inputs = {{
3256 .name = name_tv, 3274 .name = name_tv,
3257 .vmux = 1, 3275 .vmux = 1,
3258 .amux = TV, 3276 .amux = TV,
3259 .tv = 1, 3277 .tv = 1,
3260 },{ 3278 .gpio = 0x0000100,
3261 .name = name_comp1, 3279 }, {
3262 .vmux = 3, 3280 .name = name_comp1,
3263 .amux = LINE2, /* FIXME: audio doesn't work on svideo/composite */ 3281 .vmux = 3,
3264 },{ 3282 .amux = LINE1,
3265 .name = name_svideo, 3283 }, {
3266 .vmux = 8, 3284 .name = name_svideo,
3267 .amux = LINE2, /* FIXME: audio doesn't work on svideo/composite */ 3285 .vmux = 8,
3268 }}, 3286 .amux = LINE1,
3287 } },
3269 .radio = { 3288 .radio = {
3270 .name = name_radio, 3289 .name = name_radio,
3271 .amux = TV, 3290 .amux = TV,
3291 .gpio = 0x0200100,
3272 }, 3292 },
3273 }, 3293 },
3274 [SAA7134_BOARD_CINERGY_HT_PCMCIA] = { 3294 [SAA7134_BOARD_CINERGY_HT_PCMCIA] = {
@@ -3372,6 +3392,42 @@ struct saa7134_board saa7134_boards[] = {
3372 .amux = 0, 3392 .amux = 0,
3373 }, 3393 },
3374 }, 3394 },
3395 [SAA7134_BOARD_ENCORE_ENLTV_FM53] = {
3396 .name = "Encore ENLTV-FM v5.3",
3397 .audio_clock = 0x00200000,
3398 .tuner_type = TUNER_TNF_5335MF,
3399 .radio_type = UNSET,
3400 .tuner_addr = ADDR_UNSET,
3401 .radio_addr = ADDR_UNSET,
3402 .gpiomask = 0x7000,
3403 .inputs = { {
3404 .name = name_tv,
3405 .vmux = 1,
3406 .amux = 1,
3407 .tv = 1,
3408 .gpio = 0x50000,
3409 }, {
3410 .name = name_comp1,
3411 .vmux = 3,
3412 .amux = 2,
3413 .gpio = 0x2000,
3414 }, {
3415 .name = name_svideo,
3416 .vmux = 8,
3417 .amux = 2,
3418 .gpio = 0x2000,
3419 } },
3420 .radio = {
3421 .name = name_radio,
3422 .vmux = 1,
3423 .amux = 1,
3424 },
3425 .mute = {
3426 .name = name_mute,
3427 .gpio = 0xf000,
3428 .amux = 0,
3429 },
3430 },
3375 [SAA7134_BOARD_CINERGY_HT_PCI] = { 3431 [SAA7134_BOARD_CINERGY_HT_PCI] = {
3376 .name = "Terratec Cinergy HT PCI", 3432 .name = "Terratec Cinergy HT PCI",
3377 .audio_clock = 0x00187de7, 3433 .audio_clock = 0x00187de7,
@@ -3503,6 +3559,39 @@ struct saa7134_board saa7134_boards[] = {
3503 .amux = TV, 3559 .amux = TV,
3504 .gpio = 0x0200000, 3560 .gpio = 0x0200000,
3505 }, 3561 },
3562 },
3563 [SAA7134_BOARD_ASUSTeK_P7131_ANALOG] = {
3564 .name = "ASUSTeK P7131 Analog",
3565 .audio_clock = 0x00187de7,
3566 .tuner_type = TUNER_PHILIPS_TDA8290,
3567 .radio_type = UNSET,
3568 .tuner_addr = ADDR_UNSET,
3569 .radio_addr = ADDR_UNSET,
3570 .gpiomask = 1 << 21,
3571 .inputs = {{
3572 .name = name_tv,
3573 .vmux = 1,
3574 .amux = TV,
3575 .tv = 1,
3576 .gpio = 0x0000000,
3577 }, {
3578 .name = name_comp1,
3579 .vmux = 3,
3580 .amux = LINE2,
3581 }, {
3582 .name = name_comp2,
3583 .vmux = 0,
3584 .amux = LINE2,
3585 }, {
3586 .name = name_svideo,
3587 .vmux = 8,
3588 .amux = LINE2,
3589 } },
3590 .radio = {
3591 .name = name_radio,
3592 .amux = TV,
3593 .gpio = 0x0200000,
3594 },
3506 }, 3595 },
3507 [SAA7134_BOARD_SABRENT_TV_PCB05] = { 3596 [SAA7134_BOARD_SABRENT_TV_PCB05] = {
3508 .name = "Sabrent PCMCIA TV-PCB05", 3597 .name = "Sabrent PCMCIA TV-PCB05",
@@ -3582,6 +3671,40 @@ struct saa7134_board saa7134_boards[] = {
3582 .tv = 1, 3671 .tv = 1,
3583 }}, 3672 }},
3584 }, 3673 },
3674 [SAA7134_BOARD_AVERMEDIA_M135A] = {
3675 .name = "Avermedia PCI pure analog (M135A)",
3676 .audio_clock = 0x00187de7,
3677 .tuner_type = TUNER_PHILIPS_TDA8290,
3678 .radio_type = UNSET,
3679 .tuner_addr = ADDR_UNSET,
3680 .radio_addr = ADDR_UNSET,
3681 .tuner_config = 2,
3682 .gpiomask = 0x020200000,
3683 .inputs = {{
3684 .name = name_tv,
3685 .vmux = 1,
3686 .amux = TV,
3687 .tv = 1,
3688 }, {
3689 .name = name_comp1,
3690 .vmux = 3,
3691 .amux = LINE1,
3692 }, {
3693 .name = name_svideo,
3694 .vmux = 8,
3695 .amux = LINE1,
3696 } },
3697 .radio = {
3698 .name = name_radio,
3699 .amux = TV,
3700 .gpio = 0x00200000,
3701 },
3702 .mute = {
3703 .name = name_mute,
3704 .amux = TV,
3705 .gpio = 0x01,
3706 },
3707 },
3585 [SAA7134_BOARD_BEHOLD_401] = { 3708 [SAA7134_BOARD_BEHOLD_401] = {
3586 /* Beholder Intl. Ltd. 2008 */ 3709 /* Beholder Intl. Ltd. 2008 */
3587 /*Dmitry Belimov <d.belimov@gmail.com> */ 3710 /*Dmitry Belimov <d.belimov@gmail.com> */
@@ -3940,32 +4063,111 @@ struct saa7134_board saa7134_boards[] = {
3940 [SAA7134_BOARD_BEHOLD_M6] = { 4063 [SAA7134_BOARD_BEHOLD_M6] = {
3941 /* Igor Kuznetsov <igk@igk.ru> */ 4064 /* Igor Kuznetsov <igk@igk.ru> */
3942 /* Andrey Melnikoff <temnota@kmv.ru> */ 4065 /* Andrey Melnikoff <temnota@kmv.ru> */
3943 .name = "Beholder BeholdTV M6 / BeholdTV M6 Extra", 4066 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
4067 .name = "Beholder BeholdTV M6",
3944 .audio_clock = 0x00187de7, 4068 .audio_clock = 0x00187de7,
3945 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3, 4069 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
3946 .radio_type = UNSET, 4070 .radio_type = UNSET,
3947 .tuner_addr = ADDR_UNSET, 4071 .tuner_addr = ADDR_UNSET,
3948 .radio_addr = ADDR_UNSET, 4072 .radio_addr = ADDR_UNSET,
3949 .tda9887_conf = TDA9887_PRESENT, 4073 .tda9887_conf = TDA9887_PRESENT,
3950 .inputs = {{ 4074 .inputs = { {
3951 .name = name_tv, 4075 .name = name_tv,
3952 .vmux = 3, 4076 .vmux = 3,
3953 .amux = TV, 4077 .amux = TV,
3954 .tv = 1, 4078 .tv = 1,
3955 },{ 4079 }, {
3956 .name = name_comp1, 4080 .name = name_comp1,
3957 .vmux = 1, 4081 .vmux = 1,
3958 .amux = LINE1, 4082 .amux = LINE1,
3959 },{ 4083 }, {
3960 .name = name_svideo, 4084 .name = name_svideo,
3961 .vmux = 8, 4085 .vmux = 8,
3962 .amux = LINE1, 4086 .amux = LINE1,
3963 }}, 4087 } },
4088 .radio = {
4089 .name = name_radio,
4090 .amux = LINE2,
4091 },
4092 .mpeg = SAA7134_MPEG_EMPRESS,
4093 .video_out = CCIR656,
4094 .vid_port_opts = (SET_T_CODE_POLARITY_NON_INVERTED |
4095 SET_CLOCK_NOT_DELAYED |
4096 SET_CLOCK_INVERTED |
4097 SET_VSYNC_OFF),
4098 },
4099 [SAA7134_BOARD_BEHOLD_M63] = {
4100 /* Igor Kuznetsov <igk@igk.ru> */
4101 /* Andrey Melnikoff <temnota@kmv.ru> */
4102 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
4103 .name = "Beholder BeholdTV M63",
4104 .audio_clock = 0x00187de7,
4105 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4106 .radio_type = UNSET,
4107 .tuner_addr = ADDR_UNSET,
4108 .radio_addr = ADDR_UNSET,
4109 .tda9887_conf = TDA9887_PRESENT,
4110 .inputs = { {
4111 .name = name_tv,
4112 .vmux = 3,
4113 .amux = TV,
4114 .tv = 1,
4115 }, {
4116 .name = name_comp1,
4117 .vmux = 1,
4118 .amux = LINE1,
4119 }, {
4120 .name = name_svideo,
4121 .vmux = 8,
4122 .amux = LINE1,
4123 } },
4124 .radio = {
4125 .name = name_radio,
4126 .amux = LINE2,
4127 },
4128 .mpeg = SAA7134_MPEG_EMPRESS,
4129 .video_out = CCIR656,
4130 .vid_port_opts = (SET_T_CODE_POLARITY_NON_INVERTED |
4131 SET_CLOCK_NOT_DELAYED |
4132 SET_CLOCK_INVERTED |
4133 SET_VSYNC_OFF),
4134 },
4135 [SAA7134_BOARD_BEHOLD_M6_EXTRA] = {
4136 /* Igor Kuznetsov <igk@igk.ru> */
4137 /* Andrey Melnikoff <temnota@kmv.ru> */
4138 /* Beholder Intl. Ltd. Dmitry Belimov <d.belimov@gmail.com> */
4139 .name = "Beholder BeholdTV M6 Extra",
4140 .audio_clock = 0x00187de7,
4141 /* FIXME: Must be PHILIPS_FM1216ME_MK5*/
4142 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
4143 .radio_type = UNSET,
4144 .tuner_addr = ADDR_UNSET,
4145 .radio_addr = ADDR_UNSET,
4146 .tda9887_conf = TDA9887_PRESENT,
4147 .inputs = { {
4148 .name = name_tv,
4149 .vmux = 3,
4150 .amux = TV,
4151 .tv = 1,
4152 }, {
4153 .name = name_comp1,
4154 .vmux = 1,
4155 .amux = LINE1,
4156 }, {
4157 .name = name_svideo,
4158 .vmux = 8,
4159 .amux = LINE1,
4160 } },
3964 .radio = { 4161 .radio = {
3965 .name = name_radio, 4162 .name = name_radio,
3966 .amux = LINE2, 4163 .amux = LINE2,
3967 }, 4164 },
3968 .mpeg = SAA7134_MPEG_EMPRESS, 4165 .mpeg = SAA7134_MPEG_EMPRESS,
4166 .video_out = CCIR656,
4167 .vid_port_opts = (SET_T_CODE_POLARITY_NON_INVERTED |
4168 SET_CLOCK_NOT_DELAYED |
4169 SET_CLOCK_INVERTED |
4170 SET_VSYNC_OFF),
3969 }, 4171 },
3970 [SAA7134_BOARD_TWINHAN_DTV_DVB_3056] = { 4172 [SAA7134_BOARD_TWINHAN_DTV_DVB_3056] = {
3971 .name = "Twinhan Hybrid DTV-DVB 3056 PCI", 4173 .name = "Twinhan Hybrid DTV-DVB 3056 PCI",
@@ -4121,9 +4323,9 @@ struct saa7134_board saa7134_boards[] = {
4121 .amux = TV, 4323 .amux = TV,
4122 .tv = 1, 4324 .tv = 1,
4123 }, { 4325 }, {
4124 .name = name_comp1, 4326 .name = name_comp,
4125 .vmux = 3, 4327 .vmux = 0,
4126 .amux = LINE2, 4328 .amux = LINE1,
4127 }, { 4329 }, {
4128 .name = name_svideo, 4330 .name = name_svideo,
4129 .vmux = 8, 4331 .vmux = 8,
@@ -4141,6 +4343,7 @@ struct saa7134_board saa7134_boards[] = {
4141 .radio_type = UNSET, 4343 .radio_type = UNSET,
4142 .tuner_addr = ADDR_UNSET, 4344 .tuner_addr = ADDR_UNSET,
4143 .radio_addr = ADDR_UNSET, 4345 .radio_addr = ADDR_UNSET,
4346 .mpeg = SAA7134_MPEG_DVB,
4144 .inputs = {{ 4347 .inputs = {{
4145 .name = name_tv, 4348 .name = name_tv,
4146 .vmux = 1, 4349 .vmux = 1,
@@ -4150,6 +4353,10 @@ struct saa7134_board saa7134_boards[] = {
4150 .name = name_svideo, 4353 .name = name_svideo,
4151 .vmux = 8, 4354 .vmux = 8,
4152 .amux = LINE1, 4355 .amux = LINE1,
4356 }, {
4357 .name = name_comp,
4358 .vmux = 0,
4359 .amux = LINE1,
4153 } }, 4360 } },
4154 .radio = { 4361 .radio = {
4155 .name = name_radio, 4362 .name = name_radio,
@@ -4163,7 +4370,6 @@ struct saa7134_board saa7134_boards[] = {
4163 .radio_type = UNSET, 4370 .radio_type = UNSET,
4164 .tuner_addr = ADDR_UNSET, 4371 .tuner_addr = ADDR_UNSET,
4165 .radio_addr = ADDR_UNSET, 4372 .radio_addr = ADDR_UNSET,
4166 .mpeg = SAA7134_MPEG_DVB,
4167 .inputs = {{ 4373 .inputs = {{
4168 .name = name_tv, 4374 .name = name_tv,
4169 .vmux = 1, 4375 .vmux = 1,
@@ -4277,6 +4483,129 @@ struct saa7134_board saa7134_boards[] = {
4277 /* no DVB support for now */ 4483 /* no DVB support for now */
4278 /* .mpeg = SAA7134_MPEG_DVB, */ 4484 /* .mpeg = SAA7134_MPEG_DVB, */
4279 }, 4485 },
4486 [SAA7134_BOARD_ASUSTeK_TIGER_3IN1] = {
4487 .name = "Asus Tiger 3in1",
4488 .audio_clock = 0x00187de7,
4489 .tuner_type = TUNER_PHILIPS_TDA8290,
4490 .radio_type = UNSET,
4491 .tuner_addr = ADDR_UNSET,
4492 .radio_addr = ADDR_UNSET,
4493 .tuner_config = 2,
4494 .gpiomask = 1 << 21,
4495 .mpeg = SAA7134_MPEG_DVB,
4496 .inputs = {{
4497 .name = name_tv,
4498 .vmux = 1,
4499 .amux = TV,
4500 .tv = 1,
4501 }, {
4502 .name = name_comp,
4503 .vmux = 0,
4504 .amux = LINE2,
4505 }, {
4506 .name = name_svideo,
4507 .vmux = 8,
4508 .amux = LINE2,
4509 } },
4510 .radio = {
4511 .name = name_radio,
4512 .amux = TV,
4513 .gpio = 0x0200000,
4514 },
4515 },
4516 [SAA7134_BOARD_REAL_ANGEL_220] = {
4517 .name = "Zogis Real Angel 220",
4518 .audio_clock = 0x00187de7,
4519 .tuner_type = TUNER_TNF_5335MF,
4520 .radio_type = UNSET,
4521 .tuner_addr = ADDR_UNSET,
4522 .radio_addr = ADDR_UNSET,
4523 .gpiomask = 0x801a8087,
4524 .inputs = { {
4525 .name = name_tv,
4526 .vmux = 3,
4527 .amux = LINE2,
4528 .tv = 1,
4529 .gpio = 0x624000,
4530 }, {
4531 .name = name_comp1,
4532 .vmux = 1,
4533 .amux = LINE1,
4534 .gpio = 0x624000,
4535 }, {
4536 .name = name_svideo,
4537 .vmux = 1,
4538 .amux = LINE1,
4539 .gpio = 0x624000,
4540 } },
4541 .radio = {
4542 .name = name_radio,
4543 .amux = LINE2,
4544 .gpio = 0x624001,
4545 },
4546 .mute = {
4547 .name = name_mute,
4548 .amux = TV,
4549 },
4550 },
4551 [SAA7134_BOARD_ADS_INSTANT_HDTV_PCI] = {
4552 .name = "ADS Tech Instant HDTV",
4553 .audio_clock = 0x00187de7,
4554 .tuner_type = TUNER_PHILIPS_TUV1236D,
4555 .radio_type = UNSET,
4556 .tuner_addr = ADDR_UNSET,
4557 .radio_addr = ADDR_UNSET,
4558 .tda9887_conf = TDA9887_PRESENT,
4559 .mpeg = SAA7134_MPEG_DVB,
4560 .inputs = { {
4561 .name = name_tv,
4562 .vmux = 1,
4563 .amux = TV,
4564 .tv = 1,
4565 }, {
4566 .name = name_comp,
4567 .vmux = 4,
4568 .amux = LINE1,
4569 }, {
4570 .name = name_svideo,
4571 .vmux = 8,
4572 .amux = LINE1,
4573 } },
4574 },
4575 [SAA7134_BOARD_ASUSTeK_TIGER] = {
4576 .name = "Asus Tiger Rev:1.00",
4577 .audio_clock = 0x00187de7,
4578 .tuner_type = TUNER_PHILIPS_TDA8290,
4579 .radio_type = UNSET,
4580 .tuner_addr = ADDR_UNSET,
4581 .radio_addr = ADDR_UNSET,
4582 .tuner_config = 0,
4583 .mpeg = SAA7134_MPEG_DVB,
4584 .gpiomask = 0x0200000,
4585 .inputs = { {
4586 .name = name_tv,
4587 .vmux = 1,
4588 .amux = TV,
4589 .tv = 1,
4590 }, {
4591 .name = name_comp1,
4592 .vmux = 3,
4593 .amux = LINE2,
4594 }, {
4595 .name = name_comp2,
4596 .vmux = 0,
4597 .amux = LINE2,
4598 }, {
4599 .name = name_svideo,
4600 .vmux = 8,
4601 .amux = LINE2,
4602 } },
4603 .radio = {
4604 .name = name_radio,
4605 .amux = TV,
4606 .gpio = 0x0200000,
4607 },
4608 },
4280}; 4609};
4281 4610
4282const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); 4611const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
@@ -4645,6 +4974,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
4645 4974
4646 },{ 4975 },{
4647 .vendor = PCI_VENDOR_ID_PHILIPS, 4976 .vendor = PCI_VENDOR_ID_PHILIPS,
4977 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
4978 .subvendor = 0x1461, /* Avermedia Technologies Inc */
4979 .subdevice = 0xf11d,
4980 .driver_data = SAA7134_BOARD_AVERMEDIA_M135A,
4981 }, {
4982 .vendor = PCI_VENDOR_ID_PHILIPS,
4648 .device = PCI_DEVICE_ID_PHILIPS_SAA7130, 4983 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
4649 .subvendor = PCI_VENDOR_ID_PHILIPS, 4984 .subvendor = PCI_VENDOR_ID_PHILIPS,
4650 .subdevice = 0x2004, 4985 .subdevice = 0x2004,
@@ -5025,6 +5360,12 @@ struct pci_device_id saa7134_pci_tbl[] = {
5025 .driver_data = SAA7134_BOARD_ENCORE_ENLTV_FM, 5360 .driver_data = SAA7134_BOARD_ENCORE_ENLTV_FM,
5026 },{ 5361 },{
5027 .vendor = PCI_VENDOR_ID_PHILIPS, 5362 .vendor = PCI_VENDOR_ID_PHILIPS,
5363 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
5364 .subvendor = 0x1a7f,
5365 .subdevice = 0x2008,
5366 .driver_data = SAA7134_BOARD_ENCORE_ENLTV_FM53,
5367 }, {
5368 .vendor = PCI_VENDOR_ID_PHILIPS,
5028 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 5369 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5029 .subvendor = 0x153b, 5370 .subvendor = 0x153b,
5030 .subdevice = 0x1175, 5371 .subdevice = 0x1175,
@@ -5051,8 +5392,8 @@ struct pci_device_id saa7134_pci_tbl[] = {
5051 .vendor = PCI_VENDOR_ID_PHILIPS, 5392 .vendor = PCI_VENDOR_ID_PHILIPS,
5052 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 5393 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5053 .subvendor = 0x1043, 5394 .subvendor = 0x1043,
5054 .subdevice = 0x4857, 5395 .subdevice = 0x4857, /* REV:1.00 */
5055 .driver_data = SAA7134_BOARD_ASUSTeK_P7131_DUAL, 5396 .driver_data = SAA7134_BOARD_ASUSTeK_TIGER,
5056 },{ 5397 },{
5057 .vendor = PCI_VENDOR_ID_PHILIPS, 5398 .vendor = PCI_VENDOR_ID_PHILIPS,
5058 .device = PCI_DEVICE_ID_PHILIPS_SAA7134, 5399 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
@@ -5226,13 +5567,13 @@ struct pci_device_id saa7134_pci_tbl[] = {
5226 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 5567 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5227 .subvendor = 0x5ace, 5568 .subvendor = 0x5ace,
5228 .subdevice = 0x6193, 5569 .subdevice = 0x6193,
5229 .driver_data = SAA7134_BOARD_BEHOLD_M6, 5570 .driver_data = SAA7134_BOARD_BEHOLD_M6_EXTRA,
5230 }, { 5571 }, {
5231 .vendor = PCI_VENDOR_ID_PHILIPS, 5572 .vendor = PCI_VENDOR_ID_PHILIPS,
5232 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 5573 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5233 .subvendor = 0x5ace, 5574 .subvendor = 0x5ace,
5234 .subdevice = 0x6191, 5575 .subdevice = 0x6191,
5235 .driver_data = SAA7134_BOARD_BEHOLD_M6, 5576 .driver_data = SAA7134_BOARD_BEHOLD_M63,
5236 },{ 5577 },{
5237 .vendor = PCI_VENDOR_ID_PHILIPS, 5578 .vendor = PCI_VENDOR_ID_PHILIPS,
5238 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 5579 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
@@ -5283,11 +5624,35 @@ struct pci_device_id saa7134_pci_tbl[] = {
5283 .driver_data = SAA7134_BOARD_VIDEOMATE_T750, 5624 .driver_data = SAA7134_BOARD_VIDEOMATE_T750,
5284 }, { 5625 }, {
5285 .vendor = PCI_VENDOR_ID_PHILIPS, 5626 .vendor = PCI_VENDOR_ID_PHILIPS,
5627 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, /* SAA7135HL */
5628 .subvendor = 0x1421,
5629 .subdevice = 0x0380,
5630 .driver_data = SAA7134_BOARD_ADS_INSTANT_HDTV_PCI,
5631 }, {
5632 .vendor = PCI_VENDOR_ID_PHILIPS,
5633 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5634 .subvendor = 0x5169,
5635 .subdevice = 0x1502,
5636 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI,
5637 }, {
5638 .vendor = PCI_VENDOR_ID_PHILIPS,
5286 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 5639 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5287 .subvendor = 0x5ace, 5640 .subvendor = 0x5ace,
5288 .subdevice = 0x6290, 5641 .subdevice = 0x6290,
5289 .driver_data = SAA7134_BOARD_BEHOLD_H6, 5642 .driver_data = SAA7134_BOARD_BEHOLD_H6,
5290 }, { 5643 }, {
5644 .vendor = PCI_VENDOR_ID_PHILIPS,
5645 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5646 .subvendor = 0x1461, /* Avermedia Technologies Inc */
5647 .subdevice = 0xf636,
5648 .driver_data = SAA7134_BOARD_AVERMEDIA_M103,
5649 }, {
5650 .vendor = PCI_VENDOR_ID_PHILIPS,
5651 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
5652 .subvendor = 0x1043,
5653 .subdevice = 0x4878, /* REV:1.02G */
5654 .driver_data = SAA7134_BOARD_ASUSTeK_TIGER_3IN1,
5655 }, {
5291 /* --- boards without eeprom + subsystem ID --- */ 5656 /* --- boards without eeprom + subsystem ID --- */
5292 .vendor = PCI_VENDOR_ID_PHILIPS, 5657 .vendor = PCI_VENDOR_ID_PHILIPS,
5293 .device = PCI_DEVICE_ID_PHILIPS_SAA7134, 5658 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
@@ -5352,6 +5717,7 @@ static int saa7134_xc2028_callback(struct saa7134_dev *dev,
5352 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00008000); 5717 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00008000, 0x00008000);
5353 switch (dev->board) { 5718 switch (dev->board) {
5354 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: 5719 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
5720 case SAA7134_BOARD_AVERMEDIA_M103:
5355 saa7134_set_gpio(dev, 23, 0); 5721 saa7134_set_gpio(dev, 23, 0);
5356 msleep(10); 5722 msleep(10);
5357 saa7134_set_gpio(dev, 23, 1); 5723 saa7134_set_gpio(dev, 23, 1);
@@ -5395,7 +5761,7 @@ static int saa7134_tda8290_callback(struct saa7134_dev *dev,
5395 return 0; 5761 return 0;
5396} 5762}
5397 5763
5398int saa7134_tuner_callback(void *priv, int command, int arg) 5764int saa7134_tuner_callback(void *priv, int component, int command, int arg)
5399{ 5765{
5400 struct saa7134_dev *dev = priv; 5766 struct saa7134_dev *dev = priv;
5401 if (dev != NULL) { 5767 if (dev != NULL) {
@@ -5475,6 +5841,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
5475 case SAA7134_BOARD_AVERMEDIA_STUDIO_507: 5841 case SAA7134_BOARD_AVERMEDIA_STUDIO_507:
5476 case SAA7134_BOARD_AVERMEDIA_GO_007_FM: 5842 case SAA7134_BOARD_AVERMEDIA_GO_007_FM:
5477 case SAA7134_BOARD_AVERMEDIA_777: 5843 case SAA7134_BOARD_AVERMEDIA_777:
5844 case SAA7134_BOARD_AVERMEDIA_M135A:
5478/* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */ 5845/* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */
5479 case SAA7134_BOARD_VIDEOMATE_TV_PVR: 5846 case SAA7134_BOARD_VIDEOMATE_TV_PVR:
5480 case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS: 5847 case SAA7134_BOARD_VIDEOMATE_GOLD_PLUS:
@@ -5493,11 +5860,13 @@ int saa7134_board_init1(struct saa7134_dev *dev)
5493 case SAA7134_BOARD_FLYDVBT_LR301: 5860 case SAA7134_BOARD_FLYDVBT_LR301:
5494 case SAA7134_BOARD_ASUSTeK_P7131_DUAL: 5861 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
5495 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA: 5862 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
5863 case SAA7134_BOARD_ASUSTeK_P7131_ANALOG:
5496 case SAA7134_BOARD_FLYDVBTDUO: 5864 case SAA7134_BOARD_FLYDVBTDUO:
5497 case SAA7134_BOARD_PROTEUS_2309: 5865 case SAA7134_BOARD_PROTEUS_2309:
5498 case SAA7134_BOARD_AVERMEDIA_A16AR: 5866 case SAA7134_BOARD_AVERMEDIA_A16AR:
5499 case SAA7134_BOARD_ENCORE_ENLTV: 5867 case SAA7134_BOARD_ENCORE_ENLTV:
5500 case SAA7134_BOARD_ENCORE_ENLTV_FM: 5868 case SAA7134_BOARD_ENCORE_ENLTV_FM:
5869 case SAA7134_BOARD_ENCORE_ENLTV_FM53:
5501 case SAA7134_BOARD_10MOONSTVMASTER3: 5870 case SAA7134_BOARD_10MOONSTVMASTER3:
5502 case SAA7134_BOARD_BEHOLD_401: 5871 case SAA7134_BOARD_BEHOLD_401:
5503 case SAA7134_BOARD_BEHOLD_403: 5872 case SAA7134_BOARD_BEHOLD_403:
@@ -5510,6 +5879,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
5510 case SAA7134_BOARD_BEHOLD_505FM: 5879 case SAA7134_BOARD_BEHOLD_505FM:
5511 case SAA7134_BOARD_BEHOLD_507_9FM: 5880 case SAA7134_BOARD_BEHOLD_507_9FM:
5512 case SAA7134_BOARD_GENIUS_TVGO_A11MCE: 5881 case SAA7134_BOARD_GENIUS_TVGO_A11MCE:
5882 case SAA7134_BOARD_REAL_ANGEL_220:
5513 dev->has_remote = SAA7134_REMOTE_GPIO; 5883 dev->has_remote = SAA7134_REMOTE_GPIO;
5514 break; 5884 break;
5515 case SAA7134_BOARD_FLYDVBS_LR300: 5885 case SAA7134_BOARD_FLYDVBS_LR300:
@@ -5560,6 +5930,7 @@ int saa7134_board_init1(struct saa7134_dev *dev)
5560 msleep(10); 5930 msleep(10);
5561 break; 5931 break;
5562 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: 5932 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
5933 case SAA7134_BOARD_AVERMEDIA_M103:
5563 saa7134_set_gpio(dev, 23, 0); 5934 saa7134_set_gpio(dev, 23, 0);
5564 msleep(10); 5935 msleep(10);
5565 saa7134_set_gpio(dev, 23, 1); 5936 saa7134_set_gpio(dev, 23, 1);
@@ -5598,9 +5969,12 @@ int saa7134_board_init1(struct saa7134_dev *dev)
5598 case SAA7134_BOARD_PINNACLE_PCTV_110i: 5969 case SAA7134_BOARD_PINNACLE_PCTV_110i:
5599 case SAA7134_BOARD_PINNACLE_PCTV_310i: 5970 case SAA7134_BOARD_PINNACLE_PCTV_310i:
5600 case SAA7134_BOARD_UPMOST_PURPLE_TV: 5971 case SAA7134_BOARD_UPMOST_PURPLE_TV:
5972 case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS:
5601 case SAA7134_BOARD_HAUPPAUGE_HVR1110: 5973 case SAA7134_BOARD_HAUPPAUGE_HVR1110:
5602 case SAA7134_BOARD_BEHOLD_607_9FM: 5974 case SAA7134_BOARD_BEHOLD_607_9FM:
5603 case SAA7134_BOARD_BEHOLD_M6: 5975 case SAA7134_BOARD_BEHOLD_M6:
5976 case SAA7134_BOARD_BEHOLD_M63:
5977 case SAA7134_BOARD_BEHOLD_M6_EXTRA:
5604 dev->has_remote = SAA7134_REMOTE_I2C; 5978 dev->has_remote = SAA7134_REMOTE_I2C;
5605 break; 5979 break;
5606 case SAA7134_BOARD_AVERMEDIA_A169_B: 5980 case SAA7134_BOARD_AVERMEDIA_A169_B:
@@ -5683,6 +6057,7 @@ static void saa7134_tuner_setup(struct saa7134_dev *dev)
5683 switch (dev->board) { 6057 switch (dev->board) {
5684 case SAA7134_BOARD_AVERMEDIA_A16D: 6058 case SAA7134_BOARD_AVERMEDIA_A16D:
5685 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506: 6059 case SAA7134_BOARD_AVERMEDIA_CARDBUS_506:
6060 case SAA7134_BOARD_AVERMEDIA_M103:
5686 ctl.demod = XC3028_FE_ZARLINK456; 6061 ctl.demod = XC3028_FE_ZARLINK456;
5687 break; 6062 break;
5688 default: 6063 default:
@@ -5703,9 +6078,6 @@ int saa7134_board_init2(struct saa7134_dev *dev)
5703 unsigned char buf; 6078 unsigned char buf;
5704 int board; 6079 int board;
5705 6080
5706 dev->tuner_type = saa7134_boards[dev->board].tuner_type;
5707 dev->tuner_addr = saa7134_boards[dev->board].tuner_addr;
5708
5709 switch (dev->board) { 6081 switch (dev->board) {
5710 case SAA7134_BOARD_BMK_MPEX_NOTUNER: 6082 case SAA7134_BOARD_BMK_MPEX_NOTUNER:
5711 case SAA7134_BOARD_BMK_MPEX_TUNER: 6083 case SAA7134_BOARD_BMK_MPEX_TUNER:
@@ -5825,12 +6197,22 @@ int saa7134_board_init2(struct saa7134_dev *dev)
5825 i2c_transfer(&dev->i2c_adap, &msg, 1); 6197 i2c_transfer(&dev->i2c_adap, &msg, 1);
5826 break; 6198 break;
5827 } 6199 }
6200 case SAA7134_BOARD_ASUSTeK_TVFM7135:
6201 /* The card below is detected as card=53, but is different */
6202 if (dev->autodetected && (dev->eedata[0x27] == 0x03)) {
6203 dev->board = SAA7134_BOARD_ASUSTeK_P7131_ANALOG;
6204 printk(KERN_INFO "%s: P7131 analog only, using "
6205 "entry of %s\n",
6206 dev->name, saa7134_boards[dev->board].name);
6207 }
6208 break;
5828 case SAA7134_BOARD_HAUPPAUGE_HVR1110: 6209 case SAA7134_BOARD_HAUPPAUGE_HVR1110:
5829 hauppauge_eeprom(dev, dev->eedata+0x80); 6210 hauppauge_eeprom(dev, dev->eedata+0x80);
5830 /* break intentionally omitted */ 6211 /* break intentionally omitted */
5831 case SAA7134_BOARD_PINNACLE_PCTV_310i: 6212 case SAA7134_BOARD_PINNACLE_PCTV_310i:
5832 case SAA7134_BOARD_KWORLD_DVBT_210: 6213 case SAA7134_BOARD_KWORLD_DVBT_210:
5833 case SAA7134_BOARD_TEVION_DVBT_220RF: 6214 case SAA7134_BOARD_TEVION_DVBT_220RF:
6215 case SAA7134_BOARD_ASUSTeK_TIGER:
5834 case SAA7134_BOARD_ASUSTeK_P7131_DUAL: 6216 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
5835 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA: 6217 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
5836 case SAA7134_BOARD_MEDION_MD8800_QUADRO: 6218 case SAA7134_BOARD_MEDION_MD8800_QUADRO:
@@ -5846,6 +6228,14 @@ int saa7134_board_init2(struct saa7134_dev *dev)
5846 i2c_transfer(&dev->i2c_adap, &msg, 1); 6228 i2c_transfer(&dev->i2c_adap, &msg, 1);
5847 break; 6229 break;
5848 } 6230 }
6231 case SAA7134_BOARD_ASUSTeK_TIGER_3IN1:
6232 {
6233 u8 data[] = { 0x3c, 0x33, 0x60};
6234 struct i2c_msg msg = {.addr = 0x0b, .flags = 0, .buf = data,
6235 .len = sizeof(data)};
6236 i2c_transfer(&dev->i2c_adap, &msg, 1);
6237 break;
6238 }
5849 case SAA7134_BOARD_FLYDVB_TRIO: 6239 case SAA7134_BOARD_FLYDVB_TRIO:
5850 { 6240 {
5851 u8 data[] = { 0x3c, 0x33, 0x62}; 6241 u8 data[] = { 0x3c, 0x33, 0x62};
@@ -5871,6 +6261,7 @@ int saa7134_board_init2(struct saa7134_dev *dev)
5871 i2c_transfer(&dev->i2c_adap, &msg, 1); 6261 i2c_transfer(&dev->i2c_adap, &msg, 1);
5872 break; 6262 break;
5873 } 6263 }
6264 case SAA7134_BOARD_ADS_INSTANT_HDTV_PCI:
5874 case SAA7134_BOARD_KWORLD_ATSC110: 6265 case SAA7134_BOARD_KWORLD_ATSC110:
5875 { 6266 {
5876 /* enable tuner */ 6267 /* enable tuner */
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
index 2c19cd0113c8..249184452949 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -150,7 +150,6 @@ void saa7134_set_gpio(struct saa7134_dev *dev, int bit_no, int value)
150 150
151#if defined(CONFIG_MODULES) && defined(MODULE) 151#if defined(CONFIG_MODULES) && defined(MODULE)
152 152
153
154static void request_module_async(struct work_struct *work){ 153static void request_module_async(struct work_struct *work){
155 struct saa7134_dev* dev = container_of(work, struct saa7134_dev, request_module_wk); 154 struct saa7134_dev* dev = container_of(work, struct saa7134_dev, request_module_wk);
156 if (card_is_empress(dev)) 155 if (card_is_empress(dev))
@@ -216,7 +215,7 @@ unsigned long saa7134_buffer_base(struct saa7134_buf *buf)
216int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt) 215int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt)
217{ 216{
218 __le32 *cpu; 217 __le32 *cpu;
219 dma_addr_t dma_addr; 218 dma_addr_t dma_addr = 0;
220 219
221 cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr); 220 cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr);
222 if (NULL == cpu) 221 if (NULL == cpu)
@@ -360,32 +359,6 @@ void saa7134_buffer_timeout(unsigned long data)
360 spin_unlock_irqrestore(&dev->slock,flags); 359 spin_unlock_irqrestore(&dev->slock,flags);
361} 360}
362 361
363/* resends a current buffer in queue after resume */
364
365static int saa7134_buffer_requeue(struct saa7134_dev *dev,
366 struct saa7134_dmaqueue *q)
367{
368 struct saa7134_buf *buf, *next;
369
370 assert_spin_locked(&dev->slock);
371
372 buf = q->curr;
373 next = buf;
374 dprintk("buffer_requeue\n");
375
376 if (!buf)
377 return 0;
378
379 dprintk("buffer_requeue : resending active buffers \n");
380
381 if (!list_empty(&q->queue))
382 next = list_entry(q->queue.next, struct saa7134_buf,
383 vb.queue);
384 buf->activate(dev, buf, next);
385
386 return 0;
387}
388
389/* ------------------------------------------------------------------ */ 362/* ------------------------------------------------------------------ */
390 363
391int saa7134_set_dmabits(struct saa7134_dev *dev) 364int saa7134_set_dmabits(struct saa7134_dev *dev)
@@ -443,9 +416,7 @@ int saa7134_set_dmabits(struct saa7134_dev *dev)
443 /* TS capture -- dma 5 */ 416 /* TS capture -- dma 5 */
444 if (dev->ts_q.curr) { 417 if (dev->ts_q.curr) {
445 ctrl |= SAA7134_MAIN_CTRL_TE5; 418 ctrl |= SAA7134_MAIN_CTRL_TE5;
446 irq |= SAA7134_IRQ1_INTE_RA2_3 | 419 irq |= SAA7134_IRQ1_INTE_RA2_1 |
447 SAA7134_IRQ1_INTE_RA2_2 |
448 SAA7134_IRQ1_INTE_RA2_1 |
449 SAA7134_IRQ1_INTE_RA2_0; 420 SAA7134_IRQ1_INTE_RA2_0;
450 } 421 }
451 422
@@ -728,6 +699,10 @@ static int saa7134_hw_enable2(struct saa7134_dev *dev)
728 irq2_mask |= SAA7134_IRQ2_INTE_GPIO18A; 699 irq2_mask |= SAA7134_IRQ2_INTE_GPIO18A;
729 } 700 }
730 701
702 if (dev->has_remote == SAA7134_REMOTE_I2C) {
703 request_module("ir-kbd-i2c");
704 }
705
731 saa_writel(SAA7134_IRQ1, 0); 706 saa_writel(SAA7134_IRQ1, 0);
732 saa_writel(SAA7134_IRQ2, irq2_mask); 707 saa_writel(SAA7134_IRQ2, irq2_mask);
733 708
@@ -799,7 +774,7 @@ static struct video_device *vdev_init(struct saa7134_dev *dev,
799 return NULL; 774 return NULL;
800 *vfd = *template; 775 *vfd = *template;
801 vfd->minor = -1; 776 vfd->minor = -1;
802 vfd->dev = &dev->pci->dev; 777 vfd->parent = &dev->pci->dev;
803 vfd->release = video_device_release; 778 vfd->release = video_device_release;
804 vfd->debug = video_debug; 779 vfd->debug = video_debug;
805 snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)", 780 snprintf(vfd->name, sizeof(vfd->name), "%s %s (%s)",
@@ -946,11 +921,12 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
946 dev->board = SAA7134_BOARD_UNKNOWN; 921 dev->board = SAA7134_BOARD_UNKNOWN;
947 } 922 }
948 dev->autodetected = card[dev->nr] != dev->board; 923 dev->autodetected = card[dev->nr] != dev->board;
949 dev->tuner_type = saa7134_boards[dev->board].tuner_type; 924 dev->tuner_type = saa7134_boards[dev->board].tuner_type;
925 dev->tuner_addr = saa7134_boards[dev->board].tuner_addr;
950 dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf; 926 dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
951 if (UNSET != tuner[dev->nr]) 927 if (UNSET != tuner[dev->nr])
952 dev->tuner_type = tuner[dev->nr]; 928 dev->tuner_type = tuner[dev->nr];
953 printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n", 929 printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
954 dev->name,pci_dev->subsystem_vendor, 930 dev->name,pci_dev->subsystem_vendor,
955 pci_dev->subsystem_device,saa7134_boards[dev->board].name, 931 pci_dev->subsystem_device,saa7134_boards[dev->board].name,
956 dev->board, dev->autodetected ? 932 dev->board, dev->autodetected ?
@@ -1008,11 +984,9 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
1008 v4l2_prio_init(&dev->prio); 984 v4l2_prio_init(&dev->prio);
1009 985
1010 /* register v4l devices */ 986 /* register v4l devices */
1011 if (saa7134_no_overlay <= 0) { 987 if (saa7134_no_overlay > 0)
1012 saa7134_video_template.type |= VID_TYPE_OVERLAY; 988 printk(KERN_INFO "%s: Overlay support disabled.\n", dev->name);
1013 } else { 989
1014 printk("%s: Overlay support disabled.\n",dev->name);
1015 }
1016 dev->video_dev = vdev_init(dev,&saa7134_video_template,"video"); 990 dev->video_dev = vdev_init(dev,&saa7134_video_template,"video");
1017 err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER, 991 err = video_register_device(dev->video_dev,VFL_TYPE_GRABBER,
1018 video_nr[dev->nr]); 992 video_nr[dev->nr]);
@@ -1022,17 +996,16 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
1022 goto fail4; 996 goto fail4;
1023 } 997 }
1024 printk(KERN_INFO "%s: registered device video%d [v4l2]\n", 998 printk(KERN_INFO "%s: registered device video%d [v4l2]\n",
1025 dev->name,dev->video_dev->minor & 0x1f); 999 dev->name, dev->video_dev->num);
1026 1000
1027 dev->vbi_dev = vdev_init(dev, &saa7134_video_template, "vbi"); 1001 dev->vbi_dev = vdev_init(dev, &saa7134_video_template, "vbi");
1028 dev->vbi_dev->type = VID_TYPE_TUNER | VID_TYPE_TELETEXT;
1029 1002
1030 err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI, 1003 err = video_register_device(dev->vbi_dev,VFL_TYPE_VBI,
1031 vbi_nr[dev->nr]); 1004 vbi_nr[dev->nr]);
1032 if (err < 0) 1005 if (err < 0)
1033 goto fail4; 1006 goto fail4;
1034 printk(KERN_INFO "%s: registered device vbi%d\n", 1007 printk(KERN_INFO "%s: registered device vbi%d\n",
1035 dev->name,dev->vbi_dev->minor & 0x1f); 1008 dev->name, dev->vbi_dev->num);
1036 1009
1037 if (card_has_radio(dev)) { 1010 if (card_has_radio(dev)) {
1038 dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio"); 1011 dev->radio_dev = vdev_init(dev,&saa7134_radio_template,"radio");
@@ -1041,7 +1014,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
1041 if (err < 0) 1014 if (err < 0)
1042 goto fail4; 1015 goto fail4;
1043 printk(KERN_INFO "%s: registered device radio%d\n", 1016 printk(KERN_INFO "%s: registered device radio%d\n",
1044 dev->name,dev->radio_dev->minor & 0x1f); 1017 dev->name, dev->radio_dev->num);
1045 } 1018 }
1046 1019
1047 /* everything worked */ 1020 /* everything worked */
@@ -1142,6 +1115,32 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
1142} 1115}
1143 1116
1144#ifdef CONFIG_PM 1117#ifdef CONFIG_PM
1118
1119/* resends a current buffer in queue after resume */
1120static int saa7134_buffer_requeue(struct saa7134_dev *dev,
1121 struct saa7134_dmaqueue *q)
1122{
1123 struct saa7134_buf *buf, *next;
1124
1125 assert_spin_locked(&dev->slock);
1126
1127 buf = q->curr;
1128 next = buf;
1129 dprintk("buffer_requeue\n");
1130
1131 if (!buf)
1132 return 0;
1133
1134 dprintk("buffer_requeue : resending active buffers \n");
1135
1136 if (!list_empty(&q->queue))
1137 next = list_entry(q->queue.next, struct saa7134_buf,
1138 vb.queue);
1139 buf->activate(dev, buf, next);
1140
1141 return 0;
1142}
1143
1145static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state) 1144static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
1146{ 1145{
1147 1146
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c
index 341b101b0357..8c46115d4c79 100644
--- a/drivers/media/video/saa7134/saa7134-dvb.c
+++ b/drivers/media/video/saa7134/saa7134-dvb.c
@@ -535,11 +535,16 @@ static int configure_tda827x_fe(struct saa7134_dev *dev,
535 struct tda1004x_config *cdec_conf, 535 struct tda1004x_config *cdec_conf,
536 struct tda827x_config *tuner_conf) 536 struct tda827x_config *tuner_conf)
537{ 537{
538 dev->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap); 538 struct videobuf_dvb_frontend *fe0;
539 if (dev->dvb.frontend) { 539
540 /* Get the first frontend */
541 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
542
543 fe0->dvb.frontend = dvb_attach(tda10046_attach, cdec_conf, &dev->i2c_adap);
544 if (fe0->dvb.frontend) {
540 if (cdec_conf->i2c_gate) 545 if (cdec_conf->i2c_gate)
541 dev->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl; 546 fe0->dvb.frontend->ops.i2c_gate_ctrl = tda8290_i2c_gate_ctrl;
542 if (dvb_attach(tda827x_attach, dev->dvb.frontend, 547 if (dvb_attach(tda827x_attach, fe0->dvb.frontend,
543 cdec_conf->tuner_address, 548 cdec_conf->tuner_address,
544 &dev->i2c_adap, tuner_conf)) 549 &dev->i2c_adap, tuner_conf))
545 return 0; 550 return 0;
@@ -553,7 +558,6 @@ static int configure_tda827x_fe(struct saa7134_dev *dev,
553/* ------------------------------------------------------------------ */ 558/* ------------------------------------------------------------------ */
554 559
555static struct tda827x_config tda827x_cfg_0 = { 560static struct tda827x_config tda827x_cfg_0 = {
556 .tuner_callback = saa7134_tuner_callback,
557 .init = philips_tda827x_tuner_init, 561 .init = philips_tda827x_tuner_init,
558 .sleep = philips_tda827x_tuner_sleep, 562 .sleep = philips_tda827x_tuner_sleep,
559 .config = 0, 563 .config = 0,
@@ -561,7 +565,6 @@ static struct tda827x_config tda827x_cfg_0 = {
561}; 565};
562 566
563static struct tda827x_config tda827x_cfg_1 = { 567static struct tda827x_config tda827x_cfg_1 = {
564 .tuner_callback = saa7134_tuner_callback,
565 .init = philips_tda827x_tuner_init, 568 .init = philips_tda827x_tuner_init,
566 .sleep = philips_tda827x_tuner_sleep, 569 .sleep = philips_tda827x_tuner_sleep,
567 .config = 1, 570 .config = 1,
@@ -569,7 +572,6 @@ static struct tda827x_config tda827x_cfg_1 = {
569}; 572};
570 573
571static struct tda827x_config tda827x_cfg_2 = { 574static struct tda827x_config tda827x_cfg_2 = {
572 .tuner_callback = saa7134_tuner_callback,
573 .init = philips_tda827x_tuner_init, 575 .init = philips_tda827x_tuner_init,
574 .sleep = philips_tda827x_tuner_sleep, 576 .sleep = philips_tda827x_tuner_sleep,
575 .config = 2, 577 .config = 2,
@@ -577,7 +579,6 @@ static struct tda827x_config tda827x_cfg_2 = {
577}; 579};
578 580
579static struct tda827x_config tda827x_cfg_2_sw42 = { 581static struct tda827x_config tda827x_cfg_2_sw42 = {
580 .tuner_callback = saa7134_tuner_callback,
581 .init = philips_tda827x_tuner_init, 582 .init = philips_tda827x_tuner_init,
582 .sleep = philips_tda827x_tuner_sleep, 583 .sleep = philips_tda827x_tuner_sleep,
583 .config = 2, 584 .config = 2,
@@ -799,6 +800,20 @@ static struct tda1004x_config twinhan_dtv_dvb_3056_config = {
799 .request_firmware = philips_tda1004x_request_firmware 800 .request_firmware = philips_tda1004x_request_firmware
800}; 801};
801 802
803static struct tda1004x_config asus_tiger_3in1_config = {
804 .demod_address = 0x0b,
805 .invert = 1,
806 .invert_oclk = 0,
807 .xtal_freq = TDA10046_XTAL_16M,
808 .agc_config = TDA10046_AGC_TDA827X,
809 .gpio_config = TDA10046_GP11_I,
810 .if_freq = TDA10046_FREQ_045,
811 .i2c_gate = 0x4b,
812 .tuner_address = 0x61,
813 .antenna_switch = 1,
814 .request_firmware = philips_tda1004x_request_firmware
815};
816
802/* ------------------------------------------------------------------ 817/* ------------------------------------------------------------------
803 * special case: this card uses saa713x GPIO22 for the mode switch 818 * special case: this card uses saa713x GPIO22 for the mode switch
804 */ 819 */
@@ -822,7 +837,6 @@ static int ads_duo_tuner_sleep(struct dvb_frontend *fe)
822} 837}
823 838
824static struct tda827x_config ads_duo_cfg = { 839static struct tda827x_config ads_duo_cfg = {
825 .tuner_callback = saa7134_tuner_callback,
826 .init = ads_duo_tuner_init, 840 .init = ads_duo_tuner_init,
827 .sleep = ads_duo_tuner_sleep, 841 .sleep = ads_duo_tuner_sleep,
828 .config = 0 842 .config = 0
@@ -935,12 +949,30 @@ static int dvb_init(struct saa7134_dev *dev)
935{ 949{
936 int ret; 950 int ret;
937 int attach_xc3028 = 0; 951 int attach_xc3028 = 0;
952 struct videobuf_dvb_frontend *fe0;
953
954 /* FIXME: add support for multi-frontend */
955 mutex_init(&dev->frontends.lock);
956 INIT_LIST_HEAD(&dev->frontends.felist);
957 dev->frontends.active_fe_id = 0;
958
959 printk(KERN_INFO "%s() allocating 1 frontend\n", __func__);
960
961 if (videobuf_dvb_alloc_frontend(&dev->frontends, 1) == NULL) {
962 printk(KERN_ERR "%s() failed to alloc\n", __func__);
963 return -ENOMEM;
964 }
965
966 /* Get the first frontend */
967 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
968 if (!fe0)
969 return -EINVAL;
938 970
939 /* init struct videobuf_dvb */ 971 /* init struct videobuf_dvb */
940 dev->ts.nr_bufs = 32; 972 dev->ts.nr_bufs = 32;
941 dev->ts.nr_packets = 32*4; 973 dev->ts.nr_packets = 32*4;
942 dev->dvb.name = dev->name; 974 fe0->dvb.name = dev->name;
943 videobuf_queue_sg_init(&dev->dvb.dvbq, &saa7134_ts_qops, 975 videobuf_queue_sg_init(&fe0->dvb.dvbq, &saa7134_ts_qops,
944 &dev->pci->dev, &dev->slock, 976 &dev->pci->dev, &dev->slock,
945 V4L2_BUF_TYPE_VIDEO_CAPTURE, 977 V4L2_BUF_TYPE_VIDEO_CAPTURE,
946 V4L2_FIELD_ALTERNATE, 978 V4L2_FIELD_ALTERNATE,
@@ -950,47 +982,47 @@ static int dvb_init(struct saa7134_dev *dev)
950 switch (dev->board) { 982 switch (dev->board) {
951 case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL: 983 case SAA7134_BOARD_PINNACLE_300I_DVBT_PAL:
952 dprintk("pinnacle 300i dvb setup\n"); 984 dprintk("pinnacle 300i dvb setup\n");
953 dev->dvb.frontend = dvb_attach(mt352_attach, &pinnacle_300i, 985 fe0->dvb.frontend = dvb_attach(mt352_attach, &pinnacle_300i,
954 &dev->i2c_adap); 986 &dev->i2c_adap);
955 if (dev->dvb.frontend) { 987 if (fe0->dvb.frontend) {
956 dev->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params; 988 fe0->dvb.frontend->ops.tuner_ops.set_params = mt352_pinnacle_tuner_set_params;
957 } 989 }
958 break; 990 break;
959 case SAA7134_BOARD_AVERMEDIA_777: 991 case SAA7134_BOARD_AVERMEDIA_777:
960 case SAA7134_BOARD_AVERMEDIA_A16AR: 992 case SAA7134_BOARD_AVERMEDIA_A16AR:
961 dprintk("avertv 777 dvb setup\n"); 993 dprintk("avertv 777 dvb setup\n");
962 dev->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777, 994 fe0->dvb.frontend = dvb_attach(mt352_attach, &avermedia_777,
963 &dev->i2c_adap); 995 &dev->i2c_adap);
964 if (dev->dvb.frontend) { 996 if (fe0->dvb.frontend) {
965 dvb_attach(simple_tuner_attach, dev->dvb.frontend, 997 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
966 &dev->i2c_adap, 0x61, 998 &dev->i2c_adap, 0x61,
967 TUNER_PHILIPS_TD1316); 999 TUNER_PHILIPS_TD1316);
968 } 1000 }
969 break; 1001 break;
970 case SAA7134_BOARD_AVERMEDIA_A16D: 1002 case SAA7134_BOARD_AVERMEDIA_A16D:
971 dprintk("AverMedia A16D dvb setup\n"); 1003 dprintk("AverMedia A16D dvb setup\n");
972 dev->dvb.frontend = dvb_attach(mt352_attach, 1004 fe0->dvb.frontend = dvb_attach(mt352_attach,
973 &avermedia_xc3028_mt352_dev, 1005 &avermedia_xc3028_mt352_dev,
974 &dev->i2c_adap); 1006 &dev->i2c_adap);
975 attach_xc3028 = 1; 1007 attach_xc3028 = 1;
976 break; 1008 break;
977 case SAA7134_BOARD_MD7134: 1009 case SAA7134_BOARD_MD7134:
978 dev->dvb.frontend = dvb_attach(tda10046_attach, 1010 fe0->dvb.frontend = dvb_attach(tda10046_attach,
979 &medion_cardbus, 1011 &medion_cardbus,
980 &dev->i2c_adap); 1012 &dev->i2c_adap);
981 if (dev->dvb.frontend) { 1013 if (fe0->dvb.frontend) {
982 dvb_attach(simple_tuner_attach, dev->dvb.frontend, 1014 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
983 &dev->i2c_adap, medion_cardbus.tuner_address, 1015 &dev->i2c_adap, medion_cardbus.tuner_address,
984 TUNER_PHILIPS_FMD1216ME_MK3); 1016 TUNER_PHILIPS_FMD1216ME_MK3);
985 } 1017 }
986 break; 1018 break;
987 case SAA7134_BOARD_PHILIPS_TOUGH: 1019 case SAA7134_BOARD_PHILIPS_TOUGH:
988 dev->dvb.frontend = dvb_attach(tda10046_attach, 1020 fe0->dvb.frontend = dvb_attach(tda10046_attach,
989 &philips_tu1216_60_config, 1021 &philips_tu1216_60_config,
990 &dev->i2c_adap); 1022 &dev->i2c_adap);
991 if (dev->dvb.frontend) { 1023 if (fe0->dvb.frontend) {
992 dev->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init; 1024 fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
993 dev->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set; 1025 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
994 } 1026 }
995 break; 1027 break;
996 case SAA7134_BOARD_FLYDVBTDUO: 1028 case SAA7134_BOARD_FLYDVBTDUO:
@@ -1001,24 +1033,24 @@ static int dvb_init(struct saa7134_dev *dev)
1001 break; 1033 break;
1002 case SAA7134_BOARD_PHILIPS_EUROPA: 1034 case SAA7134_BOARD_PHILIPS_EUROPA:
1003 case SAA7134_BOARD_VIDEOMATE_DVBT_300: 1035 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
1004 dev->dvb.frontend = dvb_attach(tda10046_attach, 1036 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1005 &philips_europa_config, 1037 &philips_europa_config,
1006 &dev->i2c_adap); 1038 &dev->i2c_adap);
1007 if (dev->dvb.frontend) { 1039 if (fe0->dvb.frontend) {
1008 dev->original_demod_sleep = dev->dvb.frontend->ops.sleep; 1040 dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1009 dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep; 1041 fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1010 dev->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init; 1042 fe0->dvb.frontend->ops.tuner_ops.init = philips_europa_tuner_init;
1011 dev->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep; 1043 fe0->dvb.frontend->ops.tuner_ops.sleep = philips_europa_tuner_sleep;
1012 dev->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params; 1044 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1013 } 1045 }
1014 break; 1046 break;
1015 case SAA7134_BOARD_VIDEOMATE_DVBT_200: 1047 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
1016 dev->dvb.frontend = dvb_attach(tda10046_attach, 1048 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1017 &philips_tu1216_61_config, 1049 &philips_tu1216_61_config,
1018 &dev->i2c_adap); 1050 &dev->i2c_adap);
1019 if (dev->dvb.frontend) { 1051 if (fe0->dvb.frontend) {
1020 dev->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init; 1052 fe0->dvb.frontend->ops.tuner_ops.init = philips_tu1216_init;
1021 dev->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set; 1053 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_tda6651_pll_set;
1022 } 1054 }
1023 break; 1055 break;
1024 case SAA7134_BOARD_KWORLD_DVBT_210: 1056 case SAA7134_BOARD_KWORLD_DVBT_210:
@@ -1057,14 +1089,14 @@ static int dvb_init(struct saa7134_dev *dev)
1057 &tda827x_cfg_0) < 0) 1089 &tda827x_cfg_0) < 0)
1058 goto dettach_frontend; 1090 goto dettach_frontend;
1059 } else { /* satellite */ 1091 } else { /* satellite */
1060 dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap); 1092 fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, &dev->i2c_adap);
1061 if (dev->dvb.frontend) { 1093 if (fe0->dvb.frontend) {
1062 if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x63, 1094 if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x63,
1063 &dev->i2c_adap, 0) == NULL) { 1095 &dev->i2c_adap, 0) == NULL) {
1064 wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__); 1096 wprintk("%s: Lifeview Trio, No tda826x found!\n", __func__);
1065 goto dettach_frontend; 1097 goto dettach_frontend;
1066 } 1098 }
1067 if (dvb_attach(isl6421_attach, dev->dvb.frontend, &dev->i2c_adap, 1099 if (dvb_attach(isl6421_attach, fe0->dvb.frontend, &dev->i2c_adap,
1068 0x08, 0, 0) == NULL) { 1100 0x08, 0, 0) == NULL) {
1069 wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__); 1101 wprintk("%s: Lifeview Trio, No ISL6421 found!\n", __func__);
1070 goto dettach_frontend; 1102 goto dettach_frontend;
@@ -1074,11 +1106,11 @@ static int dvb_init(struct saa7134_dev *dev)
1074 break; 1106 break;
1075 case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331: 1107 case SAA7134_BOARD_ADS_DUO_CARDBUS_PTV331:
1076 case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS: 1108 case SAA7134_BOARD_FLYDVBT_HYBRID_CARDBUS:
1077 dev->dvb.frontend = dvb_attach(tda10046_attach, 1109 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1078 &ads_tech_duo_config, 1110 &ads_tech_duo_config,
1079 &dev->i2c_adap); 1111 &dev->i2c_adap);
1080 if (dev->dvb.frontend) { 1112 if (fe0->dvb.frontend) {
1081 if (dvb_attach(tda827x_attach,dev->dvb.frontend, 1113 if (dvb_attach(tda827x_attach,fe0->dvb.frontend,
1082 ads_tech_duo_config.tuner_address, &dev->i2c_adap, 1114 ads_tech_duo_config.tuner_address, &dev->i2c_adap,
1083 &ads_duo_cfg) == NULL) { 1115 &ads_duo_cfg) == NULL) {
1084 wprintk("no tda827x tuner found at addr: %02x\n", 1116 wprintk("no tda827x tuner found at addr: %02x\n",
@@ -1099,15 +1131,15 @@ static int dvb_init(struct saa7134_dev *dev)
1099 &tda827x_cfg_0) < 0) 1131 &tda827x_cfg_0) < 0)
1100 goto dettach_frontend; 1132 goto dettach_frontend;
1101 } else { /* satellite */ 1133 } else { /* satellite */
1102 dev->dvb.frontend = dvb_attach(tda10086_attach, 1134 fe0->dvb.frontend = dvb_attach(tda10086_attach,
1103 &flydvbs, &dev->i2c_adap); 1135 &flydvbs, &dev->i2c_adap);
1104 if (dev->dvb.frontend) { 1136 if (fe0->dvb.frontend) {
1105 struct dvb_frontend *fe = dev->dvb.frontend; 1137 struct dvb_frontend *fe = fe0->dvb.frontend;
1106 u8 dev_id = dev->eedata[2]; 1138 u8 dev_id = dev->eedata[2];
1107 u8 data = 0xc4; 1139 u8 data = 0xc4;
1108 struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1}; 1140 struct i2c_msg msg = {.addr = 0x08, .flags = 0, .len = 1};
1109 1141
1110 if (dvb_attach(tda826x_attach, dev->dvb.frontend, 1142 if (dvb_attach(tda826x_attach, fe0->dvb.frontend,
1111 0x60, &dev->i2c_adap, 0) == NULL) { 1143 0x60, &dev->i2c_adap, 0) == NULL) {
1112 wprintk("%s: Medion Quadro, no tda826x " 1144 wprintk("%s: Medion Quadro, no tda826x "
1113 "found !\n", __func__); 1145 "found !\n", __func__);
@@ -1141,30 +1173,31 @@ static int dvb_init(struct saa7134_dev *dev)
1141 } 1173 }
1142 break; 1174 break;
1143 case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180: 1175 case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
1144 dev->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180, 1176 fe0->dvb.frontend = dvb_attach(nxt200x_attach, &avertvhda180,
1145 &dev->i2c_adap); 1177 &dev->i2c_adap);
1146 if (dev->dvb.frontend) 1178 if (fe0->dvb.frontend)
1147 dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x61, 1179 dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x61,
1148 NULL, DVB_PLL_TDHU2); 1180 NULL, DVB_PLL_TDHU2);
1149 break; 1181 break;
1182 case SAA7134_BOARD_ADS_INSTANT_HDTV_PCI:
1150 case SAA7134_BOARD_KWORLD_ATSC110: 1183 case SAA7134_BOARD_KWORLD_ATSC110:
1151 dev->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110, 1184 fe0->dvb.frontend = dvb_attach(nxt200x_attach, &kworldatsc110,
1152 &dev->i2c_adap); 1185 &dev->i2c_adap);
1153 if (dev->dvb.frontend) 1186 if (fe0->dvb.frontend)
1154 dvb_attach(simple_tuner_attach, dev->dvb.frontend, 1187 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1155 &dev->i2c_adap, 0x61, 1188 &dev->i2c_adap, 0x61,
1156 TUNER_PHILIPS_TUV1236D); 1189 TUNER_PHILIPS_TUV1236D);
1157 break; 1190 break;
1158 case SAA7134_BOARD_FLYDVBS_LR300: 1191 case SAA7134_BOARD_FLYDVBS_LR300:
1159 dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, 1192 fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
1160 &dev->i2c_adap); 1193 &dev->i2c_adap);
1161 if (dev->dvb.frontend) { 1194 if (fe0->dvb.frontend) {
1162 if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, 1195 if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
1163 &dev->i2c_adap, 0) == NULL) { 1196 &dev->i2c_adap, 0) == NULL) {
1164 wprintk("%s: No tda826x found!\n", __func__); 1197 wprintk("%s: No tda826x found!\n", __func__);
1165 goto dettach_frontend; 1198 goto dettach_frontend;
1166 } 1199 }
1167 if (dvb_attach(isl6421_attach, dev->dvb.frontend, 1200 if (dvb_attach(isl6421_attach, fe0->dvb.frontend,
1168 &dev->i2c_adap, 0x08, 0, 0) == NULL) { 1201 &dev->i2c_adap, 0x08, 0, 0) == NULL) {
1169 wprintk("%s: No ISL6421 found!\n", __func__); 1202 wprintk("%s: No ISL6421 found!\n", __func__);
1170 goto dettach_frontend; 1203 goto dettach_frontend;
@@ -1172,25 +1205,25 @@ static int dvb_init(struct saa7134_dev *dev)
1172 } 1205 }
1173 break; 1206 break;
1174 case SAA7134_BOARD_ASUS_EUROPA2_HYBRID: 1207 case SAA7134_BOARD_ASUS_EUROPA2_HYBRID:
1175 dev->dvb.frontend = dvb_attach(tda10046_attach, 1208 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1176 &medion_cardbus, 1209 &medion_cardbus,
1177 &dev->i2c_adap); 1210 &dev->i2c_adap);
1178 if (dev->dvb.frontend) { 1211 if (fe0->dvb.frontend) {
1179 dev->original_demod_sleep = dev->dvb.frontend->ops.sleep; 1212 dev->original_demod_sleep = fe0->dvb.frontend->ops.sleep;
1180 dev->dvb.frontend->ops.sleep = philips_europa_demod_sleep; 1213 fe0->dvb.frontend->ops.sleep = philips_europa_demod_sleep;
1181 1214
1182 dvb_attach(simple_tuner_attach, dev->dvb.frontend, 1215 dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
1183 &dev->i2c_adap, medion_cardbus.tuner_address, 1216 &dev->i2c_adap, medion_cardbus.tuner_address,
1184 TUNER_PHILIPS_FMD1216ME_MK3); 1217 TUNER_PHILIPS_FMD1216ME_MK3);
1185 } 1218 }
1186 break; 1219 break;
1187 case SAA7134_BOARD_VIDEOMATE_DVBT_200A: 1220 case SAA7134_BOARD_VIDEOMATE_DVBT_200A:
1188 dev->dvb.frontend = dvb_attach(tda10046_attach, 1221 fe0->dvb.frontend = dvb_attach(tda10046_attach,
1189 &philips_europa_config, 1222 &philips_europa_config,
1190 &dev->i2c_adap); 1223 &dev->i2c_adap);
1191 if (dev->dvb.frontend) { 1224 if (fe0->dvb.frontend) {
1192 dev->dvb.frontend->ops.tuner_ops.init = philips_td1316_tuner_init; 1225 fe0->dvb.frontend->ops.tuner_ops.init = philips_td1316_tuner_init;
1193 dev->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params; 1226 fe0->dvb.frontend->ops.tuner_ops.set_params = philips_td1316_tuner_set_params;
1194 } 1227 }
1195 break; 1228 break;
1196 case SAA7134_BOARD_CINERGY_HT_PCMCIA: 1229 case SAA7134_BOARD_CINERGY_HT_PCMCIA:
@@ -1229,15 +1262,15 @@ static int dvb_init(struct saa7134_dev *dev)
1229 goto dettach_frontend; 1262 goto dettach_frontend;
1230 break; 1263 break;
1231 case SAA7134_BOARD_PHILIPS_SNAKE: 1264 case SAA7134_BOARD_PHILIPS_SNAKE:
1232 dev->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs, 1265 fe0->dvb.frontend = dvb_attach(tda10086_attach, &flydvbs,
1233 &dev->i2c_adap); 1266 &dev->i2c_adap);
1234 if (dev->dvb.frontend) { 1267 if (fe0->dvb.frontend) {
1235 if (dvb_attach(tda826x_attach, dev->dvb.frontend, 0x60, 1268 if (dvb_attach(tda826x_attach, fe0->dvb.frontend, 0x60,
1236 &dev->i2c_adap, 0) == NULL) { 1269 &dev->i2c_adap, 0) == NULL) {
1237 wprintk("%s: No tda826x found!\n", __func__); 1270 wprintk("%s: No tda826x found!\n", __func__);
1238 goto dettach_frontend; 1271 goto dettach_frontend;
1239 } 1272 }
1240 if (dvb_attach(lnbp21_attach, dev->dvb.frontend, 1273 if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1241 &dev->i2c_adap, 0, 0) == NULL) { 1274 &dev->i2c_adap, 0, 0) == NULL) {
1242 wprintk("%s: No lnbp21 found!\n", __func__); 1275 wprintk("%s: No lnbp21 found!\n", __func__);
1243 goto dettach_frontend; 1276 goto dettach_frontend;
@@ -1259,23 +1292,24 @@ static int dvb_init(struct saa7134_dev *dev)
1259 saa7134_set_gpio(dev, 25, 0); 1292 saa7134_set_gpio(dev, 25, 0);
1260 msleep(10); 1293 msleep(10);
1261 saa7134_set_gpio(dev, 25, 1); 1294 saa7134_set_gpio(dev, 25, 1);
1262 dev->dvb.frontend = dvb_attach(mt352_attach, 1295 fe0->dvb.frontend = dvb_attach(mt352_attach,
1263 &avermedia_xc3028_mt352_dev, 1296 &avermedia_xc3028_mt352_dev,
1264 &dev->i2c_adap); 1297 &dev->i2c_adap);
1265 attach_xc3028 = 1; 1298 attach_xc3028 = 1;
1299 break;
1266 case SAA7134_BOARD_MD7134_BRIDGE_2: 1300 case SAA7134_BOARD_MD7134_BRIDGE_2:
1267 dev->dvb.frontend = dvb_attach(tda10086_attach, 1301 fe0->dvb.frontend = dvb_attach(tda10086_attach,
1268 &sd1878_4m, &dev->i2c_adap); 1302 &sd1878_4m, &dev->i2c_adap);
1269 if (dev->dvb.frontend) { 1303 if (fe0->dvb.frontend) {
1270 struct dvb_frontend *fe; 1304 struct dvb_frontend *fe;
1271 if (dvb_attach(dvb_pll_attach, dev->dvb.frontend, 0x60, 1305 if (dvb_attach(dvb_pll_attach, fe0->dvb.frontend, 0x60,
1272 &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) { 1306 &dev->i2c_adap, DVB_PLL_PHILIPS_SD1878_TDA8261) == NULL) {
1273 wprintk("%s: MD7134 DVB-S, no SD1878 " 1307 wprintk("%s: MD7134 DVB-S, no SD1878 "
1274 "found !\n", __func__); 1308 "found !\n", __func__);
1275 goto dettach_frontend; 1309 goto dettach_frontend;
1276 } 1310 }
1277 /* we need to open the i2c gate (we know it exists) */ 1311 /* we need to open the i2c gate (we know it exists) */
1278 fe = dev->dvb.frontend; 1312 fe = fe0->dvb.frontend;
1279 fe->ops.i2c_gate_ctrl(fe, 1); 1313 fe->ops.i2c_gate_ctrl(fe, 1);
1280 if (dvb_attach(isl6405_attach, fe, 1314 if (dvb_attach(isl6405_attach, fe,
1281 &dev->i2c_adap, 0x08, 0, 0) == NULL) { 1315 &dev->i2c_adap, 0x08, 0, 0) == NULL) {
@@ -1290,6 +1324,45 @@ static int dvb_init(struct saa7134_dev *dev)
1290 fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage; 1324 fe->ops.enable_high_lnb_voltage = md8800_set_high_voltage;
1291 } 1325 }
1292 break; 1326 break;
1327 case SAA7134_BOARD_AVERMEDIA_M103:
1328 saa7134_set_gpio(dev, 25, 0);
1329 msleep(10);
1330 saa7134_set_gpio(dev, 25, 1);
1331 fe0->dvb.frontend = dvb_attach(mt352_attach,
1332 &avermedia_xc3028_mt352_dev,
1333 &dev->i2c_adap);
1334 attach_xc3028 = 1;
1335 break;
1336 case SAA7134_BOARD_ASUSTeK_TIGER_3IN1:
1337 if (!use_frontend) { /* terrestrial */
1338 if (configure_tda827x_fe(dev, &asus_tiger_3in1_config,
1339 &tda827x_cfg_2) < 0)
1340 goto dettach_frontend;
1341 } else { /* satellite */
1342 fe0->dvb.frontend = dvb_attach(tda10086_attach,
1343 &flydvbs, &dev->i2c_adap);
1344 if (fe0->dvb.frontend) {
1345 if (dvb_attach(tda826x_attach,
1346 fe0->dvb.frontend, 0x60,
1347 &dev->i2c_adap, 0) == NULL) {
1348 wprintk("%s: Asus Tiger 3in1, no "
1349 "tda826x found!\n", __func__);
1350 goto dettach_frontend;
1351 }
1352 if (dvb_attach(lnbp21_attach, fe0->dvb.frontend,
1353 &dev->i2c_adap, 0, 0) == NULL) {
1354 wprintk("%s: Asus Tiger 3in1, no lnbp21"
1355 " found!\n", __func__);
1356 goto dettach_frontend;
1357 }
1358 }
1359 }
1360 break;
1361 case SAA7134_BOARD_ASUSTeK_TIGER:
1362 if (configure_tda827x_fe(dev, &philips_tiger_config,
1363 &tda827x_cfg_0) < 0)
1364 goto dettach_frontend;
1365 break;
1293 default: 1366 default:
1294 wprintk("Huh? unknown DVB card?\n"); 1367 wprintk("Huh? unknown DVB card?\n");
1295 break; 1368 break;
@@ -1302,10 +1375,10 @@ static int dvb_init(struct saa7134_dev *dev)
1302 .i2c_addr = 0x61, 1375 .i2c_addr = 0x61,
1303 }; 1376 };
1304 1377
1305 if (!dev->dvb.frontend) 1378 if (!fe0->dvb.frontend)
1306 return -1; 1379 return -1;
1307 1380
1308 fe = dvb_attach(xc2028_attach, dev->dvb.frontend, &cfg); 1381 fe = dvb_attach(xc2028_attach, fe0->dvb.frontend, &cfg);
1309 if (!fe) { 1382 if (!fe) {
1310 printk(KERN_ERR "%s/2: xc3028 attach failed\n", 1383 printk(KERN_ERR "%s/2: xc3028 attach failed\n",
1311 dev->name); 1384 dev->name);
@@ -1313,38 +1386,47 @@ static int dvb_init(struct saa7134_dev *dev)
1313 } 1386 }
1314 } 1387 }
1315 1388
1316 if (NULL == dev->dvb.frontend) { 1389 if (NULL == fe0->dvb.frontend) {
1317 printk(KERN_ERR "%s/dvb: frontend initialization failed\n", dev->name); 1390 printk(KERN_ERR "%s/dvb: frontend initialization failed\n", dev->name);
1318 return -1; 1391 return -1;
1319 } 1392 }
1393 /* define general-purpose callback pointer */
1394 fe0->dvb.frontend->callback = saa7134_tuner_callback;
1320 1395
1321 /* register everything else */ 1396 /* register everything else */
1322 ret = videobuf_dvb_register(&dev->dvb, THIS_MODULE, dev, &dev->pci->dev, 1397 ret = videobuf_dvb_register_bus(&dev->frontends, THIS_MODULE, dev,
1323 adapter_nr); 1398 &dev->pci->dev, adapter_nr, 0);
1324 1399
1325 /* this sequence is necessary to make the tda1004x load its firmware 1400 /* this sequence is necessary to make the tda1004x load its firmware
1326 * and to enter analog mode of hybrid boards 1401 * and to enter analog mode of hybrid boards
1327 */ 1402 */
1328 if (!ret) { 1403 if (!ret) {
1329 if (dev->dvb.frontend->ops.init) 1404 if (fe0->dvb.frontend->ops.init)
1330 dev->dvb.frontend->ops.init(dev->dvb.frontend); 1405 fe0->dvb.frontend->ops.init(fe0->dvb.frontend);
1331 if (dev->dvb.frontend->ops.sleep) 1406 if (fe0->dvb.frontend->ops.sleep)
1332 dev->dvb.frontend->ops.sleep(dev->dvb.frontend); 1407 fe0->dvb.frontend->ops.sleep(fe0->dvb.frontend);
1333 if (dev->dvb.frontend->ops.tuner_ops.sleep) 1408 if (fe0->dvb.frontend->ops.tuner_ops.sleep)
1334 dev->dvb.frontend->ops.tuner_ops.sleep(dev->dvb.frontend); 1409 fe0->dvb.frontend->ops.tuner_ops.sleep(fe0->dvb.frontend);
1335 } 1410 }
1336 return ret; 1411 return ret;
1337 1412
1338dettach_frontend: 1413dettach_frontend:
1339 if (dev->dvb.frontend) 1414 if (fe0->dvb.frontend)
1340 dvb_frontend_detach(dev->dvb.frontend); 1415 dvb_frontend_detach(fe0->dvb.frontend);
1341 dev->dvb.frontend = NULL; 1416 fe0->dvb.frontend = NULL;
1342 1417
1343 return -1; 1418 return -1;
1344} 1419}
1345 1420
1346static int dvb_fini(struct saa7134_dev *dev) 1421static int dvb_fini(struct saa7134_dev *dev)
1347{ 1422{
1423 struct videobuf_dvb_frontend *fe0;
1424
1425 /* Get the first frontend */
1426 fe0 = videobuf_dvb_get_frontend(&dev->frontends, 1);
1427 if (!fe0)
1428 return -EINVAL;
1429
1348 /* FIXME: I suspect that this code is bogus, since the entry for 1430 /* FIXME: I suspect that this code is bogus, since the entry for
1349 Pinnacle 300I DVB-T PAL already defines the proper init to allow 1431 Pinnacle 300I DVB-T PAL already defines the proper init to allow
1350 the detection of mt2032 (TDA9887_PORT2_INACTIVE) 1432 the detection of mt2032 (TDA9887_PORT2_INACTIVE)
@@ -1364,7 +1446,7 @@ static int dvb_fini(struct saa7134_dev *dev)
1364 u8 data = 0x80; 1446 u8 data = 0x80;
1365 struct i2c_msg msg = {.addr = 0x08, .buf = &data, .flags = 0, .len = 1}; 1447 struct i2c_msg msg = {.addr = 0x08, .buf = &data, .flags = 0, .len = 1};
1366 struct dvb_frontend *fe; 1448 struct dvb_frontend *fe;
1367 fe = dev->dvb.frontend; 1449 fe = fe0->dvb.frontend;
1368 if (fe->ops.i2c_gate_ctrl) { 1450 if (fe->ops.i2c_gate_ctrl) {
1369 fe->ops.i2c_gate_ctrl(fe, 1); 1451 fe->ops.i2c_gate_ctrl(fe, 1);
1370 i2c_transfer(&dev->i2c_adap, &msg, 1); 1452 i2c_transfer(&dev->i2c_adap, &msg, 1);
@@ -1372,8 +1454,8 @@ static int dvb_fini(struct saa7134_dev *dev)
1372 } 1454 }
1373 } 1455 }
1374 } 1456 }
1375 if (dev->dvb.frontend) 1457 if (fe0->dvb.frontend)
1376 videobuf_dvb_unregister(&dev->dvb); 1458 videobuf_dvb_unregister_bus(&dev->frontends);
1377 return 0; 1459 return 0;
1378} 1460}
1379 1461
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
index 3ae71a340822..7f40511bcc04 100644
--- a/drivers/media/video/saa7134/saa7134-empress.c
+++ b/drivers/media/video/saa7134/saa7134-empress.c
@@ -29,6 +29,7 @@
29 29
30#include <media/saa6752hs.h> 30#include <media/saa6752hs.h>
31#include <media/v4l2-common.h> 31#include <media/v4l2-common.h>
32#include <media/v4l2-chip-ident.h>
32 33
33/* ------------------------------------------------------------------ */ 34/* ------------------------------------------------------------------ */
34 35
@@ -63,10 +64,19 @@ static void ts_reset_encoder(struct saa7134_dev* dev)
63 64
64static int ts_init_encoder(struct saa7134_dev* dev) 65static int ts_init_encoder(struct saa7134_dev* dev)
65{ 66{
66 struct v4l2_ext_controls ctrls = { V4L2_CTRL_CLASS_MPEG, 0 }; 67 u32 leading_null_bytes = 0;
67 68
69 /* If more cards start to need this, then this
70 should probably be added to the card definitions. */
71 switch (dev->board) {
72 case SAA7134_BOARD_BEHOLD_M6:
73 case SAA7134_BOARD_BEHOLD_M63:
74 case SAA7134_BOARD_BEHOLD_M6_EXTRA:
75 leading_null_bytes = 1;
76 break;
77 }
68 ts_reset_encoder(dev); 78 ts_reset_encoder(dev);
69 saa7134_i2c_call_clients(dev, VIDIOC_S_EXT_CTRLS, &ctrls); 79 saa7134_i2c_call_clients(dev, VIDIOC_INT_INIT, &leading_null_bytes);
70 dev->empress_started = 1; 80 dev->empress_started = 1;
71 return 0; 81 return 0;
72} 82}
@@ -79,9 +89,11 @@ static int ts_open(struct inode *inode, struct file *file)
79 struct saa7134_dev *dev; 89 struct saa7134_dev *dev;
80 int err; 90 int err;
81 91
92 lock_kernel();
82 list_for_each_entry(dev, &saa7134_devlist, devlist) 93 list_for_each_entry(dev, &saa7134_devlist, devlist)
83 if (dev->empress_dev && dev->empress_dev->minor == minor) 94 if (dev->empress_dev && dev->empress_dev->minor == minor)
84 goto found; 95 goto found;
96 unlock_kernel();
85 return -ENODEV; 97 return -ENODEV;
86 found: 98 found:
87 99
@@ -89,20 +101,21 @@ static int ts_open(struct inode *inode, struct file *file)
89 err = -EBUSY; 101 err = -EBUSY;
90 if (!mutex_trylock(&dev->empress_tsq.vb_lock)) 102 if (!mutex_trylock(&dev->empress_tsq.vb_lock))
91 goto done; 103 goto done;
92 if (dev->empress_users) 104 if (atomic_read(&dev->empress_users))
93 goto done_up; 105 goto done_up;
94 106
95 /* Unmute audio */ 107 /* Unmute audio */
96 saa_writeb(SAA7134_AUDIO_MUTE_CTRL, 108 saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
97 saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6)); 109 saa_readb(SAA7134_AUDIO_MUTE_CTRL) & ~(1 << 6));
98 110
99 dev->empress_users++; 111 atomic_inc(&dev->empress_users);
100 file->private_data = dev; 112 file->private_data = dev;
101 err = 0; 113 err = 0;
102 114
103done_up: 115done_up:
104 mutex_unlock(&dev->empress_tsq.vb_lock); 116 mutex_unlock(&dev->empress_tsq.vb_lock);
105done: 117done:
118 unlock_kernel();
106 return err; 119 return err;
107} 120}
108 121
@@ -110,8 +123,6 @@ static int ts_release(struct inode *inode, struct file *file)
110{ 123{
111 struct saa7134_dev *dev = file->private_data; 124 struct saa7134_dev *dev = file->private_data;
112 125
113 mutex_lock(&dev->empress_tsq.vb_lock);
114
115 videobuf_stop(&dev->empress_tsq); 126 videobuf_stop(&dev->empress_tsq);
116 videobuf_mmap_free(&dev->empress_tsq); 127 videobuf_mmap_free(&dev->empress_tsq);
117 128
@@ -122,9 +133,7 @@ static int ts_release(struct inode *inode, struct file *file)
122 saa_writeb(SAA7134_AUDIO_MUTE_CTRL, 133 saa_writeb(SAA7134_AUDIO_MUTE_CTRL,
123 saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6)); 134 saa_readb(SAA7134_AUDIO_MUTE_CTRL) | (1 << 6));
124 135
125 dev->empress_users--; 136 atomic_dec(&dev->empress_users);
126
127 mutex_unlock(&dev->empress_tsq.vb_lock);
128 137
129 return 0; 138 return 0;
130} 139}
@@ -208,7 +217,7 @@ static int empress_s_input(struct file *file, void *priv, unsigned int i)
208 return 0; 217 return 0;
209} 218}
210 219
211static int empress_enum_fmt_cap(struct file *file, void *priv, 220static int empress_enum_fmt_vid_cap(struct file *file, void *priv,
212 struct v4l2_fmtdesc *f) 221 struct v4l2_fmtdesc *f)
213{ 222{
214 if (f->index != 0) 223 if (f->index != 0)
@@ -220,7 +229,7 @@ static int empress_enum_fmt_cap(struct file *file, void *priv,
220 return 0; 229 return 0;
221} 230}
222 231
223static int empress_g_fmt_cap(struct file *file, void *priv, 232static int empress_g_fmt_vid_cap(struct file *file, void *priv,
224 struct v4l2_format *f) 233 struct v4l2_format *f)
225{ 234{
226 struct saa7134_dev *dev = file->private_data; 235 struct saa7134_dev *dev = file->private_data;
@@ -233,7 +242,7 @@ static int empress_g_fmt_cap(struct file *file, void *priv,
233 return 0; 242 return 0;
234} 243}
235 244
236static int empress_s_fmt_cap(struct file *file, void *priv, 245static int empress_s_fmt_vid_cap(struct file *file, void *priv,
237 struct v4l2_format *f) 246 struct v4l2_format *f)
238{ 247{
239 struct saa7134_dev *dev = file->private_data; 248 struct saa7134_dev *dev = file->private_data;
@@ -298,6 +307,7 @@ static int empress_s_ext_ctrls(struct file *file, void *priv,
298 struct v4l2_ext_controls *ctrls) 307 struct v4l2_ext_controls *ctrls)
299{ 308{
300 struct saa7134_dev *dev = file->private_data; 309 struct saa7134_dev *dev = file->private_data;
310 int err;
301 311
302 /* count == 0 is abused in saa6752hs.c, so that special 312 /* count == 0 is abused in saa6752hs.c, so that special
303 case is handled here explicitly. */ 313 case is handled here explicitly. */
@@ -307,10 +317,10 @@ static int empress_s_ext_ctrls(struct file *file, void *priv,
307 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) 317 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
308 return -EINVAL; 318 return -EINVAL;
309 319
310 saa7134_i2c_call_clients(dev, VIDIOC_S_EXT_CTRLS, ctrls); 320 err = saa7134_i2c_call_saa6752(dev, VIDIOC_S_EXT_CTRLS, ctrls);
311 ts_init_encoder(dev); 321 ts_init_encoder(dev);
312 322
313 return 0; 323 return err;
314} 324}
315 325
316static int empress_g_ext_ctrls(struct file *file, void *priv, 326static int empress_g_ext_ctrls(struct file *file, void *priv,
@@ -320,8 +330,110 @@ static int empress_g_ext_ctrls(struct file *file, void *priv,
320 330
321 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG) 331 if (ctrls->ctrl_class != V4L2_CTRL_CLASS_MPEG)
322 return -EINVAL; 332 return -EINVAL;
323 saa7134_i2c_call_clients(dev, VIDIOC_G_EXT_CTRLS, ctrls); 333 return saa7134_i2c_call_saa6752(dev, VIDIOC_G_EXT_CTRLS, ctrls);
334}
335
336static int empress_g_ctrl(struct file *file, void *priv,
337 struct v4l2_control *c)
338{
339 struct saa7134_dev *dev = file->private_data;
340
341 return saa7134_g_ctrl_internal(dev, NULL, c);
342}
343
344static int empress_s_ctrl(struct file *file, void *priv,
345 struct v4l2_control *c)
346{
347 struct saa7134_dev *dev = file->private_data;
348
349 return saa7134_s_ctrl_internal(dev, NULL, c);
350}
351
352static int empress_queryctrl(struct file *file, void *priv,
353 struct v4l2_queryctrl *c)
354{
355 static const u32 user_ctrls[] = {
356 V4L2_CID_USER_CLASS,
357 V4L2_CID_BRIGHTNESS,
358 V4L2_CID_CONTRAST,
359 V4L2_CID_SATURATION,
360 V4L2_CID_HUE,
361 V4L2_CID_AUDIO_VOLUME,
362 V4L2_CID_AUDIO_MUTE,
363 V4L2_CID_HFLIP,
364 0
365 };
366
367 static const u32 mpeg_ctrls[] = {
368 V4L2_CID_MPEG_CLASS,
369 V4L2_CID_MPEG_STREAM_TYPE,
370 V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
371 V4L2_CID_MPEG_AUDIO_ENCODING,
372 V4L2_CID_MPEG_AUDIO_L2_BITRATE,
373 V4L2_CID_MPEG_VIDEO_ENCODING,
374 V4L2_CID_MPEG_VIDEO_ASPECT,
375 V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
376 V4L2_CID_MPEG_VIDEO_BITRATE,
377 V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
378 0
379 };
380 static const u32 *ctrl_classes[] = {
381 user_ctrls,
382 mpeg_ctrls,
383 NULL
384 };
385 struct saa7134_dev *dev = file->private_data;
386
387 c->id = v4l2_ctrl_next(ctrl_classes, c->id);
388 if (c->id == 0)
389 return -EINVAL;
390 if (c->id == V4L2_CID_USER_CLASS || c->id == V4L2_CID_MPEG_CLASS)
391 return v4l2_ctrl_query_fill_std(c);
392 if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
393 return saa7134_queryctrl(file, priv, c);
394 return saa7134_i2c_call_saa6752(dev, VIDIOC_QUERYCTRL, c);
395}
396
397static int empress_querymenu(struct file *file, void *priv,
398 struct v4l2_querymenu *c)
399{
400 struct saa7134_dev *dev = file->private_data;
401
402 if (V4L2_CTRL_ID2CLASS(c->id) != V4L2_CTRL_CLASS_MPEG)
403 return -EINVAL;
404 return saa7134_i2c_call_saa6752(dev, VIDIOC_QUERYMENU, c);
405}
406
407static int empress_g_chip_ident(struct file *file, void *fh,
408 struct v4l2_chip_ident *chip)
409{
410 struct saa7134_dev *dev = file->private_data;
411
412 chip->ident = V4L2_IDENT_NONE;
413 chip->revision = 0;
414 if (dev->mpeg_i2c_client == NULL)
415 return -EINVAL;
416 if (chip->match_type == V4L2_CHIP_MATCH_I2C_DRIVER &&
417 chip->match_chip == I2C_DRIVERID_SAA6752HS)
418 return saa7134_i2c_call_saa6752(dev, VIDIOC_G_CHIP_IDENT, chip);
419 if (chip->match_type == V4L2_CHIP_MATCH_I2C_ADDR &&
420 chip->match_chip == dev->mpeg_i2c_client->addr)
421 return saa7134_i2c_call_saa6752(dev, VIDIOC_G_CHIP_IDENT, chip);
422 return -EINVAL;
423}
324 424
425static int empress_s_std(struct file *file, void *priv, v4l2_std_id *id)
426{
427 struct saa7134_dev *dev = file->private_data;
428
429 return saa7134_s_std_internal(dev, NULL, id);
430}
431
432static int empress_g_std(struct file *file, void *priv, v4l2_std_id *id)
433{
434 struct saa7134_dev *dev = file->private_data;
435
436 *id = dev->tvnorm->id;
325 return 0; 437 return 0;
326} 438}
327 439
@@ -337,20 +449,11 @@ static const struct file_operations ts_fops =
337 .llseek = no_llseek, 449 .llseek = no_llseek,
338}; 450};
339 451
340/* ----------------------------------------------------------- */ 452static const struct v4l2_ioctl_ops ts_ioctl_ops = {
341
342static struct video_device saa7134_empress_template =
343{
344 .name = "saa7134-empress",
345 .type = 0 /* FIXME */,
346 .type2 = 0 /* FIXME */,
347 .fops = &ts_fops,
348 .minor = -1,
349
350 .vidioc_querycap = empress_querycap, 453 .vidioc_querycap = empress_querycap,
351 .vidioc_enum_fmt_cap = empress_enum_fmt_cap, 454 .vidioc_enum_fmt_vid_cap = empress_enum_fmt_vid_cap,
352 .vidioc_s_fmt_cap = empress_s_fmt_cap, 455 .vidioc_s_fmt_vid_cap = empress_s_fmt_vid_cap,
353 .vidioc_g_fmt_cap = empress_g_fmt_cap, 456 .vidioc_g_fmt_vid_cap = empress_g_fmt_vid_cap,
354 .vidioc_reqbufs = empress_reqbufs, 457 .vidioc_reqbufs = empress_reqbufs,
355 .vidioc_querybuf = empress_querybuf, 458 .vidioc_querybuf = empress_querybuf,
356 .vidioc_qbuf = empress_qbuf, 459 .vidioc_qbuf = empress_qbuf,
@@ -362,10 +465,22 @@ static struct video_device saa7134_empress_template =
362 .vidioc_enum_input = empress_enum_input, 465 .vidioc_enum_input = empress_enum_input,
363 .vidioc_g_input = empress_g_input, 466 .vidioc_g_input = empress_g_input,
364 .vidioc_s_input = empress_s_input, 467 .vidioc_s_input = empress_s_input,
468 .vidioc_queryctrl = empress_queryctrl,
469 .vidioc_querymenu = empress_querymenu,
470 .vidioc_g_ctrl = empress_g_ctrl,
471 .vidioc_s_ctrl = empress_s_ctrl,
472 .vidioc_g_chip_ident = empress_g_chip_ident,
473 .vidioc_s_std = empress_s_std,
474 .vidioc_g_std = empress_g_std,
475};
476
477/* ----------------------------------------------------------- */
365 478
366 .vidioc_queryctrl = saa7134_queryctrl, 479static struct video_device saa7134_empress_template = {
367 .vidioc_g_ctrl = saa7134_g_ctrl, 480 .name = "saa7134-empress",
368 .vidioc_s_ctrl = saa7134_s_ctrl, 481 .fops = &ts_fops,
482 .minor = -1,
483 .ioctl_ops = &ts_ioctl_ops,
369 484
370 .tvnorms = SAA7134_NORMS, 485 .tvnorms = SAA7134_NORMS,
371 .current_norm = V4L2_STD_PAL, 486 .current_norm = V4L2_STD_PAL,
@@ -381,7 +496,7 @@ static void empress_signal_update(struct work_struct *work)
381 ts_reset_encoder(dev); 496 ts_reset_encoder(dev);
382 } else { 497 } else {
383 dprintk("video signal acquired\n"); 498 dprintk("video signal acquired\n");
384 if (dev->empress_users) 499 if (atomic_read(&dev->empress_users))
385 ts_init_encoder(dev); 500 ts_init_encoder(dev);
386 } 501 }
387} 502}
@@ -401,7 +516,7 @@ static int empress_init(struct saa7134_dev *dev)
401 if (NULL == dev->empress_dev) 516 if (NULL == dev->empress_dev)
402 return -ENOMEM; 517 return -ENOMEM;
403 *(dev->empress_dev) = saa7134_empress_template; 518 *(dev->empress_dev) = saa7134_empress_template;
404 dev->empress_dev->dev = &dev->pci->dev; 519 dev->empress_dev->parent = &dev->pci->dev;
405 dev->empress_dev->release = video_device_release; 520 dev->empress_dev->release = video_device_release;
406 snprintf(dev->empress_dev->name, sizeof(dev->empress_dev->name), 521 snprintf(dev->empress_dev->name, sizeof(dev->empress_dev->name),
407 "%s empress (%s)", dev->name, 522 "%s empress (%s)", dev->name,
@@ -419,7 +534,7 @@ static int empress_init(struct saa7134_dev *dev)
419 return err; 534 return err;
420 } 535 }
421 printk(KERN_INFO "%s: registered device video%d [mpeg]\n", 536 printk(KERN_INFO "%s: registered device video%d [mpeg]\n",
422 dev->name,dev->empress_dev->minor & 0x1f); 537 dev->name, dev->empress_dev->num);
423 538
424 videobuf_queue_sg_init(&dev->empress_tsq, &saa7134_ts_qops, 539 videobuf_queue_sg_init(&dev->empress_tsq, &saa7134_ts_qops,
425 &dev->pci->dev, &dev->slock, 540 &dev->pci->dev, &dev->slock,
diff --git a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c
index d8af3863f2d3..20c1b33caf7b 100644
--- a/drivers/media/video/saa7134/saa7134-i2c.c
+++ b/drivers/media/video/saa7134/saa7134-i2c.c
@@ -327,6 +327,8 @@ static int attach_inform(struct i2c_client *client)
327 327
328 d1printk( "%s i2c attach [addr=0x%x,client=%s]\n", 328 d1printk( "%s i2c attach [addr=0x%x,client=%s]\n",
329 client->driver->driver.name, client->addr, client->name); 329 client->driver->driver.name, client->addr, client->name);
330 if (client->addr == 0x20 && client->driver && client->driver->command)
331 dev->mpeg_i2c_client = client;
330 332
331 /* Am I an i2c remote control? */ 333 /* Am I an i2c remote control? */
332 334
@@ -335,6 +337,7 @@ static int attach_inform(struct i2c_client *client)
335 case 0x47: 337 case 0x47:
336 case 0x71: 338 case 0x71:
337 case 0x2d: 339 case 0x2d:
340 case 0x30:
338 { 341 {
339 struct IR_i2c *ir = i2c_get_clientdata(client); 342 struct IR_i2c *ir = i2c_get_clientdata(client);
340 d1printk("%s i2c IR detected (%s).\n", 343 d1printk("%s i2c IR detected (%s).\n",
@@ -425,6 +428,16 @@ void saa7134_i2c_call_clients(struct saa7134_dev *dev,
425 i2c_clients_command(&dev->i2c_adap, cmd, arg); 428 i2c_clients_command(&dev->i2c_adap, cmd, arg);
426} 429}
427 430
431int saa7134_i2c_call_saa6752(struct saa7134_dev *dev,
432 unsigned int cmd, void *arg)
433{
434 if (dev->mpeg_i2c_client == NULL)
435 return -EINVAL;
436 return dev->mpeg_i2c_client->driver->command(dev->mpeg_i2c_client,
437 cmd, arg);
438}
439EXPORT_SYMBOL_GPL(saa7134_i2c_call_saa6752);
440
428int saa7134_i2c_register(struct saa7134_dev *dev) 441int saa7134_i2c_register(struct saa7134_dev *dev)
429{ 442{
430 dev->i2c_adap = saa7134_adap_template; 443 dev->i2c_adap = saa7134_adap_template;
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
index 76e6501d238d..c53fd5f9f6b5 100644
--- a/drivers/media/video/saa7134/saa7134-input.c
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -62,8 +62,11 @@ MODULE_PARM_DESC(disable_other_ir, "disable full codes of "
62#define i2cdprintk(fmt, arg...) if (ir_debug) \ 62#define i2cdprintk(fmt, arg...) if (ir_debug) \
63 printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg) 63 printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg)
64 64
65/** rc5 functions */ 65/* Helper functions for RC5 and NEC decoding at GPIO16 or GPIO18 */
66static int saa7134_rc5_irq(struct saa7134_dev *dev); 66static int saa7134_rc5_irq(struct saa7134_dev *dev);
67static int saa7134_nec_irq(struct saa7134_dev *dev);
68static void nec_task(unsigned long data);
69static void saa7134_nec_timer(unsigned long data);
67 70
68/* -------------------- GPIO generic keycode builder -------------------- */ 71/* -------------------- GPIO generic keycode builder -------------------- */
69 72
@@ -115,6 +118,53 @@ static int build_key(struct saa7134_dev *dev)
115 118
116/* --------------------- Chip specific I2C key builders ----------------- */ 119/* --------------------- Chip specific I2C key builders ----------------- */
117 120
121static int get_key_msi_tvanywhere_plus(struct IR_i2c *ir, u32 *ir_key,
122 u32 *ir_raw)
123{
124 unsigned char b;
125 int gpio;
126
127 /* <dev> is needed to access GPIO. Used by the saa_readl macro. */
128 struct saa7134_dev *dev = ir->c.adapter->algo_data;
129 if (dev == NULL) {
130 dprintk("get_key_msi_tvanywhere_plus: "
131 "gir->c.adapter->algo_data is NULL!\n");
132 return -EIO;
133 }
134
135 /* rising SAA7134_GPIO_GPRESCAN reads the status */
136
137 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
138 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
139
140 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
141
142 /* GPIO&0x40 is pulsed low when a button is pressed. Don't do
143 I2C receive if gpio&0x40 is not low. */
144
145 if (gpio & 0x40)
146 return 0; /* No button press */
147
148 /* GPIO says there is a button press. Get it. */
149
150 if (1 != i2c_master_recv(&ir->c, &b, 1)) {
151 i2cdprintk("read error\n");
152 return -EIO;
153 }
154
155 /* No button press */
156
157 if (b == 0xff)
158 return 0;
159
160 /* Button pressed */
161
162 dprintk("get_key_msi_tvanywhere_plus: Key = 0x%02X\n", b);
163 *ir_key = b;
164 *ir_raw = b;
165 return 1;
166}
167
118static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw) 168static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
119{ 169{
120 unsigned char b; 170 unsigned char b;
@@ -198,11 +248,91 @@ static int get_key_beholdm6xx(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
198 return 1; 248 return 1;
199} 249}
200 250
251/* Common (grey or coloured) pinnacle PCTV remote handling
252 *
253 */
254static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
255 int parity_offset, int marker, int code_modulo)
256{
257 unsigned char b[4];
258 unsigned int start = 0,parity = 0,code = 0;
259
260 /* poll IR chip */
261 if (4 != i2c_master_recv(&ir->c, b, 4)) {
262 i2cdprintk("read error\n");
263 return -EIO;
264 }
265
266 for (start = 0; start < ARRAY_SIZE(b); start++) {
267 if (b[start] == marker) {
268 code=b[(start+parity_offset + 1) % 4];
269 parity=b[(start+parity_offset) % 4];
270 }
271 }
272
273 /* Empty Request */
274 if (parity == 0)
275 return 0;
276
277 /* Repeating... */
278 if (ir->old == parity)
279 return 0;
280
281 ir->old = parity;
282
283 /* drop special codes when a key is held down a long time for the grey controller
284 In this case, the second bit of the code is asserted */
285 if (marker == 0xfe && (code & 0x40))
286 return 0;
287
288 code %= code_modulo;
289
290 *ir_raw = code;
291 *ir_key = code;
292
293 i2cdprintk("Pinnacle PCTV key %02x\n", code);
294
295 return 1;
296}
297
298/* The grey pinnacle PCTV remote
299 *
300 * There are one issue with this remote:
301 * - I2c packet does not change when the same key is pressed quickly. The workaround
302 * is to hold down each key for about half a second, so that another code is generated
303 * in the i2c packet, and the function can distinguish key presses.
304 *
305 * Sylvain Pasche <sylvain.pasche@gmail.com>
306 */
307static int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
308{
309
310 return get_key_pinnacle(ir, ir_key, ir_raw, 1, 0xfe, 0xff);
311}
312
313
314/* The new pinnacle PCTV remote (with the colored buttons)
315 *
316 * Ricardo Cerqueira <v4l@cerqueira.org>
317 */
318static int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
319{
320 /* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE
321 *
322 * this is the only value that results in 42 unique
323 * codes < 128
324 */
325
326 return get_key_pinnacle(ir, ir_key, ir_raw, 2, 0x80, 0x88);
327}
328
201void saa7134_input_irq(struct saa7134_dev *dev) 329void saa7134_input_irq(struct saa7134_dev *dev)
202{ 330{
203 struct card_ir *ir = dev->remote; 331 struct card_ir *ir = dev->remote;
204 332
205 if (!ir->polling && !ir->rc5_gpio) { 333 if (ir->nec_gpio) {
334 saa7134_nec_irq(dev);
335 } else if (!ir->polling && !ir->rc5_gpio) {
206 build_key(dev); 336 build_key(dev);
207 } else if (ir->rc5_gpio) { 337 } else if (ir->rc5_gpio) {
208 saa7134_rc5_irq(dev); 338 saa7134_rc5_irq(dev);
@@ -238,6 +368,10 @@ void saa7134_ir_start(struct saa7134_dev *dev, struct card_ir *ir)
238 ir->addr = 0x17; 368 ir->addr = 0x17;
239 ir->rc5_key_timeout = ir_rc5_key_timeout; 369 ir->rc5_key_timeout = ir_rc5_key_timeout;
240 ir->rc5_remote_gap = ir_rc5_remote_gap; 370 ir->rc5_remote_gap = ir_rc5_remote_gap;
371 } else if (ir->nec_gpio) {
372 setup_timer(&ir->timer_keyup, saa7134_nec_timer,
373 (unsigned long)dev);
374 tasklet_init(&ir->tlet, nec_task, (unsigned long)dev);
241 } 375 }
242} 376}
243 377
@@ -257,6 +391,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
257 u32 mask_keyup = 0; 391 u32 mask_keyup = 0;
258 int polling = 0; 392 int polling = 0;
259 int rc5_gpio = 0; 393 int rc5_gpio = 0;
394 int nec_gpio = 0;
260 int ir_type = IR_TYPE_OTHER; 395 int ir_type = IR_TYPE_OTHER;
261 int err; 396 int err;
262 397
@@ -313,6 +448,12 @@ int saa7134_input_init1(struct saa7134_dev *dev)
313 saa_setb(SAA7134_GPIO_GPMODE0, 0x4); 448 saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
314 saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4); 449 saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
315 break; 450 break;
451 case SAA7134_BOARD_AVERMEDIA_M135A:
452 ir_codes = ir_codes_avermedia_m135a;
453 mask_keydown = 0x0040000;
454 mask_keycode = 0x00013f;
455 nec_gpio = 1;
456 break;
316 case SAA7134_BOARD_AVERMEDIA_777: 457 case SAA7134_BOARD_AVERMEDIA_777:
317 case SAA7134_BOARD_AVERMEDIA_A16AR: 458 case SAA7134_BOARD_AVERMEDIA_A16AR:
318 ir_codes = ir_codes_avermedia; 459 ir_codes = ir_codes_avermedia;
@@ -409,6 +550,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
409 break; 550 break;
410 case SAA7134_BOARD_ASUSTeK_P7131_DUAL: 551 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
411 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA: 552 case SAA7134_BOARD_ASUSTeK_P7131_HYBRID_LNA:
553 case SAA7134_BOARD_ASUSTeK_P7131_ANALOG:
412 ir_codes = ir_codes_asus_pc39; 554 ir_codes = ir_codes_asus_pc39;
413 mask_keydown = 0x0040000; 555 mask_keydown = 0x0040000;
414 rc5_gpio = 1; 556 rc5_gpio = 1;
@@ -420,6 +562,12 @@ int saa7134_input_init1(struct saa7134_dev *dev)
420 mask_keyup = 0x040000; 562 mask_keyup = 0x040000;
421 polling = 50; // ms 563 polling = 50; // ms
422 break; 564 break;
565 case SAA7134_BOARD_ENCORE_ENLTV_FM53:
566 ir_codes = ir_codes_encore_enltv_fm53;
567 mask_keydown = 0x0040000;
568 mask_keycode = 0x00007f;
569 nec_gpio = 1;
570 break;
423 case SAA7134_BOARD_10MOONSTVMASTER3: 571 case SAA7134_BOARD_10MOONSTVMASTER3:
424 ir_codes = ir_codes_encore_enltv; 572 ir_codes = ir_codes_encore_enltv;
425 mask_keycode = 0x5f80000; 573 mask_keycode = 0x5f80000;
@@ -432,6 +580,12 @@ int saa7134_input_init1(struct saa7134_dev *dev)
432 mask_keydown = 0xf00000; 580 mask_keydown = 0xf00000;
433 polling = 50; /* ms */ 581 polling = 50; /* ms */
434 break; 582 break;
583 case SAA7134_BOARD_REAL_ANGEL_220:
584 ir_codes = ir_codes_real_audio_220_32_keys;
585 mask_keycode = 0x3f00;
586 mask_keyup = 0x4000;
587 polling = 50; /* ms */
588 break;
435 } 589 }
436 if (NULL == ir_codes) { 590 if (NULL == ir_codes) {
437 printk("%s: Oops: IR config error [card=%d]\n", 591 printk("%s: Oops: IR config error [card=%d]\n",
@@ -454,6 +608,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
454 ir->mask_keyup = mask_keyup; 608 ir->mask_keyup = mask_keyup;
455 ir->polling = polling; 609 ir->polling = polling;
456 ir->rc5_gpio = rc5_gpio; 610 ir->rc5_gpio = rc5_gpio;
611 ir->nec_gpio = nec_gpio;
457 612
458 /* init input device */ 613 /* init input device */
459 snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)", 614 snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)",
@@ -533,6 +688,11 @@ void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir)
533 ir->get_key = get_key_purpletv; 688 ir->get_key = get_key_purpletv;
534 ir->ir_codes = ir_codes_purpletv; 689 ir->ir_codes = ir_codes_purpletv;
535 break; 690 break;
691 case SAA7134_BOARD_MSI_TVATANYWHERE_PLUS:
692 snprintf(ir->c.name, sizeof(ir->c.name), "MSI TV@nywhere Plus");
693 ir->get_key = get_key_msi_tvanywhere_plus;
694 ir->ir_codes = ir_codes_msi_tvanywhere_plus;
695 break;
536 case SAA7134_BOARD_HAUPPAUGE_HVR1110: 696 case SAA7134_BOARD_HAUPPAUGE_HVR1110:
537 snprintf(ir->c.name, sizeof(ir->c.name), "HVR 1110"); 697 snprintf(ir->c.name, sizeof(ir->c.name), "HVR 1110");
538 ir->get_key = get_key_hvr1110; 698 ir->get_key = get_key_hvr1110;
@@ -540,6 +700,8 @@ void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir)
540 break; 700 break;
541 case SAA7134_BOARD_BEHOLD_607_9FM: 701 case SAA7134_BOARD_BEHOLD_607_9FM:
542 case SAA7134_BOARD_BEHOLD_M6: 702 case SAA7134_BOARD_BEHOLD_M6:
703 case SAA7134_BOARD_BEHOLD_M63:
704 case SAA7134_BOARD_BEHOLD_M6_EXTRA:
543 case SAA7134_BOARD_BEHOLD_H6: 705 case SAA7134_BOARD_BEHOLD_H6:
544 snprintf(ir->c.name, sizeof(ir->c.name), "BeholdTV"); 706 snprintf(ir->c.name, sizeof(ir->c.name), "BeholdTV");
545 ir->get_key = get_key_beholdm6xx; 707 ir->get_key = get_key_beholdm6xx;
@@ -594,8 +756,125 @@ static int saa7134_rc5_irq(struct saa7134_dev *dev)
594 return 1; 756 return 1;
595} 757}
596 758
597/* ---------------------------------------------------------------------- 759
598 * Local variables: 760/* On NEC protocol, One has 2.25 ms, and zero has 1.125 ms
599 * c-basic-offset: 8 761 The first pulse (start) has 9 + 4.5 ms
600 * End:
601 */ 762 */
763
764static void saa7134_nec_timer(unsigned long data)
765{
766 struct saa7134_dev *dev = (struct saa7134_dev *) data;
767 struct card_ir *ir = dev->remote;
768
769 dprintk("Cancel key repeat\n");
770
771 ir_input_nokey(ir->dev, &ir->ir);
772}
773
774static void nec_task(unsigned long data)
775{
776 struct saa7134_dev *dev = (struct saa7134_dev *) data;
777 struct card_ir *ir;
778 struct timeval tv;
779 int count, pulse, oldpulse, gap;
780 u32 ircode = 0, not_code = 0;
781 int ngap = 0;
782
783 if (!data) {
784 printk(KERN_ERR "saa713x/ir: Can't recover dev struct\n");
785 /* GPIO will be kept disabled */
786 return;
787 }
788
789 ir = dev->remote;
790
791 /* rising SAA7134_GPIO_GPRESCAN reads the status */
792 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
793 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
794
795 oldpulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2) & ir->mask_keydown;
796 pulse = oldpulse;
797
798 do_gettimeofday(&tv);
799 ir->base_time = tv;
800
801 /* Decode NEC pulsecode. This code can take up to 76.5 ms to run.
802 Unfortunately, using IRQ to decode pulse didn't work, since it uses
803 a pulse train of 38KHz. This means one pulse on each 52 us
804 */
805 do {
806 /* Wait until the end of pulse/space or 5 ms */
807 for (count = 0; count < 500; count++) {
808 udelay(10);
809 /* rising SAA7134_GPIO_GPRESCAN reads the status */
810 saa_clearb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
811 saa_setb(SAA7134_GPIO_GPMODE3, SAA7134_GPIO_GPRESCAN);
812 pulse = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2)
813 & ir->mask_keydown;
814 if (pulse != oldpulse)
815 break;
816 }
817
818 do_gettimeofday(&tv);
819 gap = 1000000 * (tv.tv_sec - ir->base_time.tv_sec) +
820 tv.tv_usec - ir->base_time.tv_usec;
821
822 if (!pulse) {
823 /* Bit 0 has 560 us, while bit 1 has 1120 us.
824 Do something only if bit == 1
825 */
826 if (ngap && (gap > 560 + 280)) {
827 unsigned int shift = ngap - 1;
828
829 /* Address first, then command */
830 if (shift < 8) {
831 shift += 8;
832 ircode |= 1 << shift;
833 } else if (shift < 16) {
834 not_code |= 1 << shift;
835 } else if (shift < 24) {
836 shift -= 16;
837 ircode |= 1 << shift;
838 } else {
839 shift -= 24;
840 not_code |= 1 << shift;
841 }
842 }
843 ngap++;
844 }
845
846
847 ir->base_time = tv;
848
849 /* TIMEOUT - Long pulse */
850 if (gap >= 5000)
851 break;
852 oldpulse = pulse;
853 } while (ngap < 32);
854
855 if (ngap == 32) {
856 /* FIXME: should check if not_code == ~ircode */
857 ir->code = ir_extract_bits(ircode, ir->mask_keycode);
858
859 dprintk("scancode = 0x%02x (code = 0x%02x, notcode= 0x%02x)\n",
860 ir->code, ircode, not_code);
861
862 ir_input_keydown(ir->dev, &ir->ir, ir->code, ir->code);
863 } else
864 dprintk("Repeat last key\n");
865
866 /* Keep repeating the last key */
867 mod_timer(&ir->timer_keyup, jiffies + msecs_to_jiffies(150));
868
869 saa_setl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18);
870}
871
872static int saa7134_nec_irq(struct saa7134_dev *dev)
873{
874 struct card_ir *ir = dev->remote;
875
876 saa_clearl(SAA7134_IRQ2, SAA7134_IRQ2_INTE_GPIO18);
877 tasklet_schedule(&ir->tlet);
878
879 return 1;
880}
diff --git a/drivers/media/video/saa7134/saa7134-reg.h b/drivers/media/video/saa7134/saa7134-reg.h
index 86f5eefdb0f6..cf89d96d7295 100644
--- a/drivers/media/video/saa7134/saa7134-reg.h
+++ b/drivers/media/video/saa7134/saa7134-reg.h
@@ -368,6 +368,7 @@
368#define SAA7135_DSP_RWCLEAR 0x586 368#define SAA7135_DSP_RWCLEAR 0x586
369#define SAA7135_DSP_RWCLEAR_RERR 1 369#define SAA7135_DSP_RWCLEAR_RERR 1
370 370
371#define SAA7133_I2S_AUDIO_CONTROL 0x591
371/* ------------------------------------------------------------------ */ 372/* ------------------------------------------------------------------ */
372/* 373/*
373 * Local variables: 374 * Local variables:
diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c
index eae72fd60cec..ef55a59f0cda 100644
--- a/drivers/media/video/saa7134/saa7134-ts.c
+++ b/drivers/media/video/saa7134/saa7134-ts.c
@@ -66,11 +66,29 @@ static int buffer_activate(struct saa7134_dev *dev,
66 saa7134_set_dmabits(dev); 66 saa7134_set_dmabits(dev);
67 67
68 mod_timer(&dev->ts_q.timeout, jiffies+BUFFER_TIMEOUT); 68 mod_timer(&dev->ts_q.timeout, jiffies+BUFFER_TIMEOUT);
69
70 if (dev->ts_state == SAA7134_TS_BUFF_DONE) {
71 /* Clear TS cache */
72 dev->buff_cnt = 0;
73 saa_writeb(SAA7134_TS_SERIAL1, 0x00);
74 saa_writeb(SAA7134_TS_SERIAL1, 0x03);
75 saa_writeb(SAA7134_TS_SERIAL1, 0x00);
76 saa_writeb(SAA7134_TS_SERIAL1, 0x01);
77
78 /* TS clock non-inverted */
79 saa_writeb(SAA7134_TS_SERIAL1, 0x00);
80
81 /* Start TS stream */
82 saa_writeb(SAA7134_TS_SERIAL0, 0x40);
83 saa_writeb(SAA7134_TS_PARALLEL, 0xEC);
84 dev->ts_state = SAA7134_TS_STARTED;
85 }
86
69 return 0; 87 return 0;
70} 88}
71 89
72static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb, 90static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
73 enum v4l2_field field) 91 enum v4l2_field field)
74{ 92{
75 struct saa7134_dev *dev = q->priv_data; 93 struct saa7134_dev *dev = q->priv_data;
76 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); 94 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
@@ -110,16 +128,22 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
110 goto oops; 128 goto oops;
111 } 129 }
112 130
113 /* dma: setup channel 5 (= TS) */ 131 dev->buff_cnt++;
114 control = SAA7134_RS_CONTROL_BURST_16 | 132
115 SAA7134_RS_CONTROL_ME | 133 if (dev->buff_cnt == dev->ts.nr_bufs) {
116 (buf->pt->dma >> 12); 134 dev->ts_state = SAA7134_TS_BUFF_DONE;
117 135 /* dma: setup channel 5 (= TS) */
118 saa_writeb(SAA7134_TS_DMA0, ((lines-1)&0xff)); 136 control = SAA7134_RS_CONTROL_BURST_16 |
119 saa_writeb(SAA7134_TS_DMA1, (((lines-1)>>8)&0xff)); 137 SAA7134_RS_CONTROL_ME |
120 saa_writeb(SAA7134_TS_DMA2, ((((lines-1)>>16)&0x3f) | 0x00)); /* TSNOPIT=0, TSCOLAP=0 */ 138 (buf->pt->dma >> 12);
121 saa_writel(SAA7134_RS_PITCH(5),TS_PACKET_SIZE); 139
122 saa_writel(SAA7134_RS_CONTROL(5),control); 140 saa_writeb(SAA7134_TS_DMA0, (lines - 1) & 0xff);
141 saa_writeb(SAA7134_TS_DMA1, ((lines - 1) >> 8) & 0xff);
142 /* TSNOPIT=0, TSCOLAP=0 */
143 saa_writeb(SAA7134_TS_DMA2, (((lines - 1) >> 16) & 0x3f) | 0x00);
144 saa_writel(SAA7134_RS_PITCH(5), TS_PACKET_SIZE);
145 saa_writel(SAA7134_RS_CONTROL(5), control);
146 }
123 147
124 buf->vb.state = VIDEOBUF_PREPARED; 148 buf->vb.state = VIDEOBUF_PREPARED;
125 buf->activate = buffer_activate; 149 buf->activate = buffer_activate;
@@ -140,6 +164,8 @@ buffer_setup(struct videobuf_queue *q, unsigned int *count, unsigned int *size)
140 if (0 == *count) 164 if (0 == *count)
141 *count = dev->ts.nr_bufs; 165 *count = dev->ts.nr_bufs;
142 *count = saa7134_buffer_count(*size,*count); 166 *count = saa7134_buffer_count(*size,*count);
167 dev->buff_cnt = 0;
168 dev->ts_state = SAA7134_TS_STOPPED;
143 return 0; 169 return 0;
144} 170}
145 171
@@ -154,7 +180,13 @@ static void buffer_queue(struct videobuf_queue *q, struct videobuf_buffer *vb)
154static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb) 180static void buffer_release(struct videobuf_queue *q, struct videobuf_buffer *vb)
155{ 181{
156 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); 182 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
183 struct saa7134_dev *dev = q->priv_data;
157 184
185 if (dev->ts_state == SAA7134_TS_STARTED) {
186 /* Stop TS transport */
187 saa_writeb(SAA7134_TS_PARALLEL, 0x6c);
188 dev->ts_state = SAA7134_TS_STOPPED;
189 }
158 saa7134_dma_free(q,buf); 190 saa7134_dma_free(q,buf);
159} 191}
160 192
@@ -182,7 +214,7 @@ int saa7134_ts_init_hw(struct saa7134_dev *dev)
182 /* deactivate TS softreset */ 214 /* deactivate TS softreset */
183 saa_writeb(SAA7134_TS_SERIAL1, 0x00); 215 saa_writeb(SAA7134_TS_SERIAL1, 0x00);
184 /* TSSOP high active, TSVAL high active, TSLOCK ignored */ 216 /* TSSOP high active, TSVAL high active, TSLOCK ignored */
185 saa_writeb(SAA7134_TS_PARALLEL, 0xec); 217 saa_writeb(SAA7134_TS_PARALLEL, 0x6c);
186 saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1)); 218 saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1));
187 saa_writeb(SAA7134_TS_DMA0, ((dev->ts.nr_packets-1)&0xff)); 219 saa_writeb(SAA7134_TS_DMA0, ((dev->ts.nr_packets-1)&0xff));
188 saa_writeb(SAA7134_TS_DMA1, (((dev->ts.nr_packets-1)>>8)&0xff)); 220 saa_writeb(SAA7134_TS_DMA1, (((dev->ts.nr_packets-1)>>8)&0xff));
diff --git a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c
index 232af598d947..c5d0b44c179e 100644
--- a/drivers/media/video/saa7134/saa7134-tvaudio.c
+++ b/drivers/media/video/saa7134/saa7134-tvaudio.c
@@ -477,7 +477,6 @@ static int tvaudio_thread(void *data)
477 unsigned int i, audio, nscan; 477 unsigned int i, audio, nscan;
478 int max1,max2,carrier,rx,mode,lastmode,default_carrier; 478 int max1,max2,carrier,rx,mode,lastmode,default_carrier;
479 479
480
481 set_freezable(); 480 set_freezable();
482 481
483 for (;;) { 482 for (;;) {
@@ -775,7 +774,6 @@ static int tvaudio_thread_ddep(void *data)
775 struct saa7134_dev *dev = data; 774 struct saa7134_dev *dev = data;
776 u32 value, norms; 775 u32 value, norms;
777 776
778
779 set_freezable(); 777 set_freezable();
780 for (;;) { 778 for (;;) {
781 tvaudio_sleep(dev,-1); 779 tvaudio_sleep(dev,-1);
@@ -873,13 +871,34 @@ void saa7134_enable_i2s(struct saa7134_dev *dev)
873 871
874 if (!card_is_empress(dev)) 872 if (!card_is_empress(dev))
875 return; 873 return;
876 i2s_format = (dev->input->amux == TV) ? 0x00 : 0x01;
877 874
878 /* enable I2S audio output for the mpeg encoder */ 875 if (dev->pci->device == PCI_DEVICE_ID_PHILIPS_SAA7130)
879 saa_writeb(SAA7134_I2S_OUTPUT_SELECT, 0x80); 876 return;
880 saa_writeb(SAA7134_I2S_OUTPUT_FORMAT, i2s_format); 877
881 saa_writeb(SAA7134_I2S_OUTPUT_LEVEL, 0x0F); 878 /* configure GPIO for out */
882 saa_writeb(SAA7134_I2S_AUDIO_OUTPUT, 0x01); 879 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x0E000000, 0x00000000);
880
881 switch (dev->pci->device) {
882 case PCI_DEVICE_ID_PHILIPS_SAA7133:
883 case PCI_DEVICE_ID_PHILIPS_SAA7135:
884 /* Set I2S format (SONY)  */
885 saa_writeb(SAA7133_I2S_AUDIO_CONTROL, 0x00);
886 /* Start I2S */
887 saa_writeb(SAA7134_I2S_AUDIO_OUTPUT, 0x11);
888 break;
889
890 case PCI_DEVICE_ID_PHILIPS_SAA7134:
891 i2s_format = (dev->input->amux == TV) ? 0x00 : 0x01;
892
893 /* enable I2S audio output for the mpeg encoder */
894 saa_writeb(SAA7134_I2S_OUTPUT_SELECT, 0x80);
895 saa_writeb(SAA7134_I2S_OUTPUT_FORMAT, i2s_format);
896 saa_writeb(SAA7134_I2S_OUTPUT_LEVEL, 0x0F);
897 saa_writeb(SAA7134_I2S_AUDIO_OUTPUT, 0x01);
898
899 default:
900 break;
901 }
883} 902}
884 903
885int saa7134_tvaudio_rx2mode(u32 rx) 904int saa7134_tvaudio_rx2mode(u32 rx)
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c
index 48e1a01718ec..02bb6747a39c 100644
--- a/drivers/media/video/saa7134/saa7134-video.c
+++ b/drivers/media/video/saa7134/saa7134-video.c
@@ -628,6 +628,9 @@ void saa7134_set_tvnorm_hw(struct saa7134_dev *dev)
628 628
629 if (card_in(dev, dev->ctl_input).tv) 629 if (card_in(dev, dev->ctl_input).tv)
630 saa7134_i2c_call_clients(dev, VIDIOC_S_STD, &dev->tvnorm->id); 630 saa7134_i2c_call_clients(dev, VIDIOC_S_STD, &dev->tvnorm->id);
631 /* Set the correct norm for the saa6752hs. This function
632 does nothing if there is no saa6752hs. */
633 saa7134_i2c_call_saa6752(dev, VIDIOC_S_STD, &dev->tvnorm->id);
631} 634}
632 635
633static void set_h_prescale(struct saa7134_dev *dev, int task, int prescale) 636static void set_h_prescale(struct saa7134_dev *dev, int task, int prescale)
@@ -1112,10 +1115,8 @@ static struct videobuf_queue_ops video_qops = {
1112 1115
1113/* ------------------------------------------------------------------ */ 1116/* ------------------------------------------------------------------ */
1114 1117
1115int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c) 1118int saa7134_g_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c)
1116{ 1119{
1117 struct saa7134_fh *fh = priv;
1118 struct saa7134_dev *dev = fh->dev;
1119 const struct v4l2_queryctrl* ctrl; 1120 const struct v4l2_queryctrl* ctrl;
1120 1121
1121 ctrl = ctrl_by_id(c->id); 1122 ctrl = ctrl_by_id(c->id);
@@ -1160,20 +1161,31 @@ int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c)
1160 } 1161 }
1161 return 0; 1162 return 0;
1162} 1163}
1163EXPORT_SYMBOL_GPL(saa7134_g_ctrl); 1164EXPORT_SYMBOL_GPL(saa7134_g_ctrl_internal);
1165
1166static int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c)
1167{
1168 struct saa7134_fh *fh = priv;
1169
1170 return saa7134_g_ctrl_internal(fh->dev, fh, c);
1171}
1164 1172
1165int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c) 1173int saa7134_s_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c)
1166{ 1174{
1167 const struct v4l2_queryctrl* ctrl; 1175 const struct v4l2_queryctrl* ctrl;
1168 struct saa7134_fh *fh = f;
1169 struct saa7134_dev *dev = fh->dev;
1170 unsigned long flags; 1176 unsigned long flags;
1171 int restart_overlay = 0; 1177 int restart_overlay = 0;
1172 int err = -EINVAL; 1178 int err;
1173 1179
1174 err = v4l2_prio_check(&dev->prio, &fh->prio); 1180 /* When called from the empress code fh == NULL.
1175 if (0 != err) 1181 That needs to be fixed somehow, but for now this is
1176 return err; 1182 good enough. */
1183 if (fh) {
1184 err = v4l2_prio_check(&dev->prio, &fh->prio);
1185 if (0 != err)
1186 return err;
1187 }
1188 err = -EINVAL;
1177 1189
1178 mutex_lock(&dev->lock); 1190 mutex_lock(&dev->lock);
1179 1191
@@ -1274,7 +1286,14 @@ error:
1274 mutex_unlock(&dev->lock); 1286 mutex_unlock(&dev->lock);
1275 return err; 1287 return err;
1276} 1288}
1277EXPORT_SYMBOL_GPL(saa7134_s_ctrl); 1289EXPORT_SYMBOL_GPL(saa7134_s_ctrl_internal);
1290
1291static int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c)
1292{
1293 struct saa7134_fh *fh = f;
1294
1295 return saa7134_s_ctrl_internal(fh->dev, fh, c);
1296}
1278 1297
1279/* ------------------------------------------------------------------ */ 1298/* ------------------------------------------------------------------ */
1280 1299
@@ -1314,6 +1333,8 @@ static int video_open(struct inode *inode, struct file *file)
1314 struct saa7134_fh *fh; 1333 struct saa7134_fh *fh;
1315 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE; 1334 enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
1316 int radio = 0; 1335 int radio = 0;
1336
1337 lock_kernel();
1317 list_for_each_entry(dev, &saa7134_devlist, devlist) { 1338 list_for_each_entry(dev, &saa7134_devlist, devlist) {
1318 if (dev->video_dev && (dev->video_dev->minor == minor)) 1339 if (dev->video_dev && (dev->video_dev->minor == minor))
1319 goto found; 1340 goto found;
@@ -1326,6 +1347,7 @@ static int video_open(struct inode *inode, struct file *file)
1326 goto found; 1347 goto found;
1327 } 1348 }
1328 } 1349 }
1350 unlock_kernel();
1329 return -ENODEV; 1351 return -ENODEV;
1330 found: 1352 found:
1331 1353
@@ -1334,8 +1356,10 @@ static int video_open(struct inode *inode, struct file *file)
1334 1356
1335 /* allocate + initialize per filehandle data */ 1357 /* allocate + initialize per filehandle data */
1336 fh = kzalloc(sizeof(*fh),GFP_KERNEL); 1358 fh = kzalloc(sizeof(*fh),GFP_KERNEL);
1337 if (NULL == fh) 1359 if (NULL == fh) {
1360 unlock_kernel();
1338 return -ENOMEM; 1361 return -ENOMEM;
1362 }
1339 file->private_data = fh; 1363 file->private_data = fh;
1340 fh->dev = dev; 1364 fh->dev = dev;
1341 fh->radio = radio; 1365 fh->radio = radio;
@@ -1368,6 +1392,7 @@ static int video_open(struct inode *inode, struct file *file)
1368 /* switch to video/vbi mode */ 1392 /* switch to video/vbi mode */
1369 video_mux(dev,dev->ctl_input); 1393 video_mux(dev,dev->ctl_input);
1370 } 1394 }
1395 unlock_kernel();
1371 return 0; 1396 return 0;
1372} 1397}
1373 1398
@@ -1496,7 +1521,7 @@ static int video_mmap(struct file *file, struct vm_area_struct * vma)
1496 1521
1497/* ------------------------------------------------------------------ */ 1522/* ------------------------------------------------------------------ */
1498 1523
1499static int saa7134_try_get_set_fmt_vbi(struct file *file, void *priv, 1524static int saa7134_try_get_set_fmt_vbi_cap(struct file *file, void *priv,
1500 struct v4l2_format *f) 1525 struct v4l2_format *f)
1501{ 1526{
1502 struct saa7134_fh *fh = priv; 1527 struct saa7134_fh *fh = priv;
@@ -1516,7 +1541,7 @@ static int saa7134_try_get_set_fmt_vbi(struct file *file, void *priv,
1516 return 0; 1541 return 0;
1517} 1542}
1518 1543
1519static int saa7134_g_fmt_cap(struct file *file, void *priv, 1544static int saa7134_g_fmt_vid_cap(struct file *file, void *priv,
1520 struct v4l2_format *f) 1545 struct v4l2_format *f)
1521{ 1546{
1522 struct saa7134_fh *fh = priv; 1547 struct saa7134_fh *fh = priv;
@@ -1532,7 +1557,7 @@ static int saa7134_g_fmt_cap(struct file *file, void *priv,
1532 return 0; 1557 return 0;
1533} 1558}
1534 1559
1535static int saa7134_g_fmt_overlay(struct file *file, void *priv, 1560static int saa7134_g_fmt_vid_overlay(struct file *file, void *priv,
1536 struct v4l2_format *f) 1561 struct v4l2_format *f)
1537{ 1562{
1538 struct saa7134_fh *fh = priv; 1563 struct saa7134_fh *fh = priv;
@@ -1546,7 +1571,7 @@ static int saa7134_g_fmt_overlay(struct file *file, void *priv,
1546 return 0; 1571 return 0;
1547} 1572}
1548 1573
1549static int saa7134_try_fmt_cap(struct file *file, void *priv, 1574static int saa7134_try_fmt_vid_cap(struct file *file, void *priv,
1550 struct v4l2_format *f) 1575 struct v4l2_format *f)
1551{ 1576{
1552 struct saa7134_fh *fh = priv; 1577 struct saa7134_fh *fh = priv;
@@ -1597,7 +1622,7 @@ static int saa7134_try_fmt_cap(struct file *file, void *priv,
1597 return 0; 1622 return 0;
1598} 1623}
1599 1624
1600static int saa7134_try_fmt_overlay(struct file *file, void *priv, 1625static int saa7134_try_fmt_vid_overlay(struct file *file, void *priv,
1601 struct v4l2_format *f) 1626 struct v4l2_format *f)
1602{ 1627{
1603 struct saa7134_fh *fh = priv; 1628 struct saa7134_fh *fh = priv;
@@ -1611,13 +1636,13 @@ static int saa7134_try_fmt_overlay(struct file *file, void *priv,
1611 return verify_preview(dev, &f->fmt.win); 1636 return verify_preview(dev, &f->fmt.win);
1612} 1637}
1613 1638
1614static int saa7134_s_fmt_cap(struct file *file, void *priv, 1639static int saa7134_s_fmt_vid_cap(struct file *file, void *priv,
1615 struct v4l2_format *f) 1640 struct v4l2_format *f)
1616{ 1641{
1617 struct saa7134_fh *fh = priv; 1642 struct saa7134_fh *fh = priv;
1618 int err; 1643 int err;
1619 1644
1620 err = saa7134_try_fmt_cap(file, priv, f); 1645 err = saa7134_try_fmt_vid_cap(file, priv, f);
1621 if (0 != err) 1646 if (0 != err)
1622 return err; 1647 return err;
1623 1648
@@ -1628,7 +1653,7 @@ static int saa7134_s_fmt_cap(struct file *file, void *priv,
1628 return 0; 1653 return 0;
1629} 1654}
1630 1655
1631static int saa7134_s_fmt_overlay(struct file *file, void *priv, 1656static int saa7134_s_fmt_vid_overlay(struct file *file, void *priv,
1632 struct v4l2_format *f) 1657 struct v4l2_format *f)
1633{ 1658{
1634 struct saa7134_fh *fh = priv; 1659 struct saa7134_fh *fh = priv;
@@ -1774,18 +1799,25 @@ static int saa7134_querycap(struct file *file, void *priv,
1774 return 0; 1799 return 0;
1775} 1800}
1776 1801
1777static int saa7134_s_std(struct file *file, void *priv, v4l2_std_id *id) 1802int saa7134_s_std_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, v4l2_std_id *id)
1778{ 1803{
1779 struct saa7134_fh *fh = priv;
1780 struct saa7134_dev *dev = fh->dev;
1781 unsigned long flags; 1804 unsigned long flags;
1782 unsigned int i; 1805 unsigned int i;
1783 v4l2_std_id fixup; 1806 v4l2_std_id fixup;
1784 int err; 1807 int err;
1785 1808
1786 err = v4l2_prio_check(&dev->prio, &fh->prio); 1809 /* When called from the empress code fh == NULL.
1787 if (0 != err) 1810 That needs to be fixed somehow, but for now this is
1788 return err; 1811 good enough. */
1812 if (fh) {
1813 err = v4l2_prio_check(&dev->prio, &fh->prio);
1814 if (0 != err)
1815 return err;
1816 } else if (res_locked(dev, RESOURCE_OVERLAY)) {
1817 /* Don't change the std from the mpeg device
1818 if overlay is active. */
1819 return -EBUSY;
1820 }
1789 1821
1790 for (i = 0; i < TVNORMS; i++) 1822 for (i = 0; i < TVNORMS; i++)
1791 if (*id == tvnorms[i].id) 1823 if (*id == tvnorms[i].id)
@@ -1818,7 +1850,7 @@ static int saa7134_s_std(struct file *file, void *priv, v4l2_std_id *id)
1818 *id = tvnorms[i].id; 1850 *id = tvnorms[i].id;
1819 1851
1820 mutex_lock(&dev->lock); 1852 mutex_lock(&dev->lock);
1821 if (res_check(fh, RESOURCE_OVERLAY)) { 1853 if (fh && res_check(fh, RESOURCE_OVERLAY)) {
1822 spin_lock_irqsave(&dev->slock, flags); 1854 spin_lock_irqsave(&dev->slock, flags);
1823 stop_preview(dev, fh); 1855 stop_preview(dev, fh);
1824 spin_unlock_irqrestore(&dev->slock, flags); 1856 spin_unlock_irqrestore(&dev->slock, flags);
@@ -1835,6 +1867,23 @@ static int saa7134_s_std(struct file *file, void *priv, v4l2_std_id *id)
1835 mutex_unlock(&dev->lock); 1867 mutex_unlock(&dev->lock);
1836 return 0; 1868 return 0;
1837} 1869}
1870EXPORT_SYMBOL_GPL(saa7134_s_std_internal);
1871
1872static int saa7134_s_std(struct file *file, void *priv, v4l2_std_id *id)
1873{
1874 struct saa7134_fh *fh = priv;
1875
1876 return saa7134_s_std_internal(fh->dev, fh, id);
1877}
1878
1879static int saa7134_g_std(struct file *file, void *priv, v4l2_std_id *id)
1880{
1881 struct saa7134_fh *fh = priv;
1882 struct saa7134_dev *dev = fh->dev;
1883
1884 *id = dev->tvnorm->id;
1885 return 0;
1886}
1838 1887
1839static int saa7134_cropcap(struct file *file, void *priv, 1888static int saa7134_cropcap(struct file *file, void *priv,
1840 struct v4l2_cropcap *cap) 1889 struct v4l2_cropcap *cap)
@@ -2028,7 +2077,7 @@ static int saa7134_s_priority(struct file *file, void *f,
2028 return v4l2_prio_change(&dev->prio, &fh->prio, prio); 2077 return v4l2_prio_change(&dev->prio, &fh->prio, prio);
2029} 2078}
2030 2079
2031static int saa7134_enum_fmt_cap(struct file *file, void *priv, 2080static int saa7134_enum_fmt_vid_cap(struct file *file, void *priv,
2032 struct v4l2_fmtdesc *f) 2081 struct v4l2_fmtdesc *f)
2033{ 2082{
2034 if (f->index >= FORMATS) 2083 if (f->index >= FORMATS)
@@ -2042,7 +2091,7 @@ static int saa7134_enum_fmt_cap(struct file *file, void *priv,
2042 return 0; 2091 return 0;
2043} 2092}
2044 2093
2045static int saa7134_enum_fmt_overlay(struct file *file, void *priv, 2094static int saa7134_enum_fmt_vid_overlay(struct file *file, void *priv,
2046 struct v4l2_fmtdesc *f) 2095 struct v4l2_fmtdesc *f)
2047{ 2096{
2048 if (saa7134_no_overlay > 0) { 2097 if (saa7134_no_overlay > 0) {
@@ -2061,18 +2110,6 @@ static int saa7134_enum_fmt_overlay(struct file *file, void *priv,
2061 return 0; 2110 return 0;
2062} 2111}
2063 2112
2064static int saa7134_enum_fmt_vbi(struct file *file, void *priv,
2065 struct v4l2_fmtdesc *f)
2066{
2067 if (0 != f->index)
2068 return -EINVAL;
2069
2070 f->pixelformat = V4L2_PIX_FMT_GREY;
2071 strcpy(f->description, "vbi data");
2072
2073 return 0;
2074}
2075
2076static int saa7134_g_fbuf(struct file *file, void *f, 2113static int saa7134_g_fbuf(struct file *file, void *f,
2077 struct v4l2_framebuffer *fb) 2114 struct v4l2_framebuffer *fb)
2078{ 2115{
@@ -2208,6 +2245,32 @@ static int saa7134_g_parm(struct file *file, void *fh,
2208 return 0; 2245 return 0;
2209} 2246}
2210 2247
2248#ifdef CONFIG_VIDEO_ADV_DEBUG
2249static int vidioc_g_register (struct file *file, void *priv,
2250 struct v4l2_register *reg)
2251{
2252 struct saa7134_fh *fh = priv;
2253 struct saa7134_dev *dev = fh->dev;
2254
2255 if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
2256 return -EINVAL;
2257 reg->val = saa_readb(reg->reg);
2258 return 0;
2259}
2260
2261static int vidioc_s_register (struct file *file, void *priv,
2262 struct v4l2_register *reg)
2263{
2264 struct saa7134_fh *fh = priv;
2265 struct saa7134_dev *dev = fh->dev;
2266
2267 if (!v4l2_chip_match_host(reg->match_type, reg->match_chip))
2268 return -EINVAL;
2269 saa_writeb(reg->reg&0xffffff, reg->val);
2270 return 0;
2271}
2272#endif
2273
2211static int radio_querycap(struct file *file, void *priv, 2274static int radio_querycap(struct file *file, void *priv,
2212 struct v4l2_capability *cap) 2275 struct v4l2_capability *cap)
2213{ 2276{
@@ -2327,39 +2390,19 @@ static const struct file_operations video_fops =
2327 .llseek = no_llseek, 2390 .llseek = no_llseek,
2328}; 2391};
2329 2392
2330static const struct file_operations radio_fops = 2393static const struct v4l2_ioctl_ops video_ioctl_ops = {
2331{
2332 .owner = THIS_MODULE,
2333 .open = video_open,
2334 .release = video_release,
2335 .ioctl = video_ioctl2,
2336 .compat_ioctl = v4l_compat_ioctl32,
2337 .llseek = no_llseek,
2338};
2339
2340/* ----------------------------------------------------------- */
2341/* exported stuff */
2342
2343struct video_device saa7134_video_template =
2344{
2345 .name = "saa7134-video",
2346 .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER |
2347 VID_TYPE_CLIPPING|VID_TYPE_SCALES,
2348 .fops = &video_fops,
2349 .minor = -1,
2350 .vidioc_querycap = saa7134_querycap, 2394 .vidioc_querycap = saa7134_querycap,
2351 .vidioc_enum_fmt_cap = saa7134_enum_fmt_cap, 2395 .vidioc_enum_fmt_vid_cap = saa7134_enum_fmt_vid_cap,
2352 .vidioc_g_fmt_cap = saa7134_g_fmt_cap, 2396 .vidioc_g_fmt_vid_cap = saa7134_g_fmt_vid_cap,
2353 .vidioc_try_fmt_cap = saa7134_try_fmt_cap, 2397 .vidioc_try_fmt_vid_cap = saa7134_try_fmt_vid_cap,
2354 .vidioc_s_fmt_cap = saa7134_s_fmt_cap, 2398 .vidioc_s_fmt_vid_cap = saa7134_s_fmt_vid_cap,
2355 .vidioc_enum_fmt_overlay = saa7134_enum_fmt_overlay, 2399 .vidioc_enum_fmt_vid_overlay = saa7134_enum_fmt_vid_overlay,
2356 .vidioc_g_fmt_overlay = saa7134_g_fmt_overlay, 2400 .vidioc_g_fmt_vid_overlay = saa7134_g_fmt_vid_overlay,
2357 .vidioc_try_fmt_overlay = saa7134_try_fmt_overlay, 2401 .vidioc_try_fmt_vid_overlay = saa7134_try_fmt_vid_overlay,
2358 .vidioc_s_fmt_overlay = saa7134_s_fmt_overlay, 2402 .vidioc_s_fmt_vid_overlay = saa7134_s_fmt_vid_overlay,
2359 .vidioc_enum_fmt_vbi = saa7134_enum_fmt_vbi, 2403 .vidioc_g_fmt_vbi_cap = saa7134_try_get_set_fmt_vbi_cap,
2360 .vidioc_g_fmt_vbi = saa7134_try_get_set_fmt_vbi, 2404 .vidioc_try_fmt_vbi_cap = saa7134_try_get_set_fmt_vbi_cap,
2361 .vidioc_try_fmt_vbi = saa7134_try_get_set_fmt_vbi, 2405 .vidioc_s_fmt_vbi_cap = saa7134_try_get_set_fmt_vbi_cap,
2362 .vidioc_s_fmt_vbi = saa7134_try_get_set_fmt_vbi,
2363 .vidioc_g_audio = saa7134_g_audio, 2406 .vidioc_g_audio = saa7134_g_audio,
2364 .vidioc_s_audio = saa7134_s_audio, 2407 .vidioc_s_audio = saa7134_s_audio,
2365 .vidioc_cropcap = saa7134_cropcap, 2408 .vidioc_cropcap = saa7134_cropcap,
@@ -2368,6 +2411,7 @@ struct video_device saa7134_video_template =
2368 .vidioc_qbuf = saa7134_qbuf, 2411 .vidioc_qbuf = saa7134_qbuf,
2369 .vidioc_dqbuf = saa7134_dqbuf, 2412 .vidioc_dqbuf = saa7134_dqbuf,
2370 .vidioc_s_std = saa7134_s_std, 2413 .vidioc_s_std = saa7134_s_std,
2414 .vidioc_g_std = saa7134_g_std,
2371 .vidioc_enum_input = saa7134_enum_input, 2415 .vidioc_enum_input = saa7134_enum_input,
2372 .vidioc_g_input = saa7134_g_input, 2416 .vidioc_g_input = saa7134_g_input,
2373 .vidioc_s_input = saa7134_s_input, 2417 .vidioc_s_input = saa7134_s_input,
@@ -2391,16 +2435,22 @@ struct video_device saa7134_video_template =
2391 .vidioc_g_parm = saa7134_g_parm, 2435 .vidioc_g_parm = saa7134_g_parm,
2392 .vidioc_g_frequency = saa7134_g_frequency, 2436 .vidioc_g_frequency = saa7134_g_frequency,
2393 .vidioc_s_frequency = saa7134_s_frequency, 2437 .vidioc_s_frequency = saa7134_s_frequency,
2394 .tvnorms = SAA7134_NORMS, 2438#ifdef CONFIG_VIDEO_ADV_DEBUG
2395 .current_norm = V4L2_STD_PAL, 2439 .vidioc_g_register = vidioc_g_register,
2440 .vidioc_s_register = vidioc_s_register,
2441#endif
2396}; 2442};
2397 2443
2398struct video_device saa7134_radio_template = 2444static const struct file_operations radio_fops = {
2399{ 2445 .owner = THIS_MODULE,
2400 .name = "saa7134-radio", 2446 .open = video_open,
2401 .type = VID_TYPE_TUNER, 2447 .release = video_release,
2402 .fops = &radio_fops, 2448 .ioctl = video_ioctl2,
2403 .minor = -1, 2449 .compat_ioctl = v4l_compat_ioctl32,
2450 .llseek = no_llseek,
2451};
2452
2453static const struct v4l2_ioctl_ops radio_ioctl_ops = {
2404 .vidioc_querycap = radio_querycap, 2454 .vidioc_querycap = radio_querycap,
2405 .vidioc_g_tuner = radio_g_tuner, 2455 .vidioc_g_tuner = radio_g_tuner,
2406 .vidioc_enum_input = radio_enum_input, 2456 .vidioc_enum_input = radio_enum_input,
@@ -2417,6 +2467,25 @@ struct video_device saa7134_radio_template =
2417 .vidioc_s_frequency = saa7134_s_frequency, 2467 .vidioc_s_frequency = saa7134_s_frequency,
2418}; 2468};
2419 2469
2470/* ----------------------------------------------------------- */
2471/* exported stuff */
2472
2473struct video_device saa7134_video_template = {
2474 .name = "saa7134-video",
2475 .fops = &video_fops,
2476 .ioctl_ops = &video_ioctl_ops,
2477 .minor = -1,
2478 .tvnorms = SAA7134_NORMS,
2479 .current_norm = V4L2_STD_PAL,
2480};
2481
2482struct video_device saa7134_radio_template = {
2483 .name = "saa7134-radio",
2484 .fops = &radio_fops,
2485 .ioctl_ops = &radio_ioctl_ops,
2486 .minor = -1,
2487};
2488
2420int saa7134_video_init1(struct saa7134_dev *dev) 2489int saa7134_video_init1(struct saa7134_dev *dev)
2421{ 2490{
2422 /* sanitycheck insmod options */ 2491 /* sanitycheck insmod options */
@@ -2458,13 +2527,14 @@ int saa7134_videoport_init(struct saa7134_dev *dev)
2458 int vo = saa7134_boards[dev->board].video_out; 2527 int vo = saa7134_boards[dev->board].video_out;
2459 int video_reg; 2528 int video_reg;
2460 unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts; 2529 unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts;
2530
2531 /* Configure videoport */
2461 saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]); 2532 saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]);
2462 video_reg = video_out[vo][1]; 2533 video_reg = video_out[vo][1];
2463 if (vid_port_opts & SET_T_CODE_POLARITY_NON_INVERTED) 2534 if (vid_port_opts & SET_T_CODE_POLARITY_NON_INVERTED)
2464 video_reg &= ~VP_T_CODE_P_INVERTED; 2535 video_reg &= ~VP_T_CODE_P_INVERTED;
2465 saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_reg); 2536 saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_reg);
2466 saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]); 2537 saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]);
2467 saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]);
2468 saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]); 2538 saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]);
2469 video_reg = video_out[vo][5]; 2539 video_reg = video_out[vo][5];
2470 if (vid_port_opts & SET_CLOCK_NOT_DELAYED) 2540 if (vid_port_opts & SET_CLOCK_NOT_DELAYED)
@@ -2481,6 +2551,9 @@ int saa7134_videoport_init(struct saa7134_dev *dev)
2481 saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]); 2551 saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]);
2482 saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]); 2552 saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]);
2483 2553
2554 /* Start videoport */
2555 saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]);
2556
2484 return 0; 2557 return 0;
2485} 2558}
2486 2559
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
index 34ff0d4998f3..24096d6e1ef8 100644
--- a/drivers/media/video/saa7134/saa7134.h
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -34,6 +34,7 @@
34#include <asm/io.h> 34#include <asm/io.h>
35 35
36#include <media/v4l2-common.h> 36#include <media/v4l2-common.h>
37#include <media/v4l2-ioctl.h>
37#include <media/tuner.h> 38#include <media/tuner.h>
38#include <media/ir-common.h> 39#include <media/ir-common.h>
39#include <media/ir-kbd-i2c.h> 40#include <media/ir-kbd-i2c.h>
@@ -264,7 +265,16 @@ struct saa7134_format {
264#define SAA7134_BOARD_AVERMEDIA_A700_PRO 140 265#define SAA7134_BOARD_AVERMEDIA_A700_PRO 140
265#define SAA7134_BOARD_AVERMEDIA_A700_HYBRID 141 266#define SAA7134_BOARD_AVERMEDIA_A700_HYBRID 141
266#define SAA7134_BOARD_BEHOLD_H6 142 267#define SAA7134_BOARD_BEHOLD_H6 142
267 268#define SAA7134_BOARD_BEHOLD_M63 143
269#define SAA7134_BOARD_BEHOLD_M6_EXTRA 144
270#define SAA7134_BOARD_AVERMEDIA_M103 145
271#define SAA7134_BOARD_ASUSTeK_P7131_ANALOG 146
272#define SAA7134_BOARD_ASUSTeK_TIGER_3IN1 147
273#define SAA7134_BOARD_ENCORE_ENLTV_FM53 148
274#define SAA7134_BOARD_AVERMEDIA_M135A 149
275#define SAA7134_BOARD_REAL_ANGEL_220 150
276#define SAA7134_BOARD_ADS_INSTANT_HDTV_PCI 151
277#define SAA7134_BOARD_ASUSTeK_TIGER 152
268 278
269#define SAA7134_MAXBOARDS 8 279#define SAA7134_MAXBOARDS 8
270#define SAA7134_INPUT_MAX 8 280#define SAA7134_INPUT_MAX 8
@@ -458,6 +468,12 @@ struct saa7134_mpeg_ops {
458 void (*signal_change)(struct saa7134_dev *dev); 468 void (*signal_change)(struct saa7134_dev *dev);
459}; 469};
460 470
471enum saa7134_ts_status {
472 SAA7134_TS_STOPPED,
473 SAA7134_TS_BUFF_DONE,
474 SAA7134_TS_STARTED,
475};
476
461/* global device status */ 477/* global device status */
462struct saa7134_dev { 478struct saa7134_dev {
463 struct list_head devlist; 479 struct list_head devlist;
@@ -551,18 +567,21 @@ struct saa7134_dev {
551 /* SAA7134_MPEG_* */ 567 /* SAA7134_MPEG_* */
552 struct saa7134_ts ts; 568 struct saa7134_ts ts;
553 struct saa7134_dmaqueue ts_q; 569 struct saa7134_dmaqueue ts_q;
570 enum saa7134_ts_status ts_state;
571 unsigned int buff_cnt;
554 struct saa7134_mpeg_ops *mops; 572 struct saa7134_mpeg_ops *mops;
573 struct i2c_client *mpeg_i2c_client;
555 574
556 /* SAA7134_MPEG_EMPRESS only */ 575 /* SAA7134_MPEG_EMPRESS only */
557 struct video_device *empress_dev; 576 struct video_device *empress_dev;
558 struct videobuf_queue empress_tsq; 577 struct videobuf_queue empress_tsq;
559 unsigned int empress_users; 578 atomic_t empress_users;
560 struct work_struct empress_workqueue; 579 struct work_struct empress_workqueue;
561 int empress_started; 580 int empress_started;
562 581
563#if defined(CONFIG_VIDEO_SAA7134_DVB) || defined(CONFIG_VIDEO_SAA7134_DVB_MODULE) 582#if defined(CONFIG_VIDEO_SAA7134_DVB) || defined(CONFIG_VIDEO_SAA7134_DVB_MODULE)
564 /* SAA7134_MPEG_DVB only */ 583 /* SAA7134_MPEG_DVB only */
565 struct videobuf_dvb dvb; 584 struct videobuf_dvb_frontends frontends;
566 int (*original_demod_sleep)(struct dvb_frontend *fe); 585 int (*original_demod_sleep)(struct dvb_frontend *fe);
567 int (*original_set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage); 586 int (*original_set_voltage)(struct dvb_frontend *fe, fe_sec_voltage_t voltage);
568 int (*original_set_high_voltage)(struct dvb_frontend *fe, long arg); 587 int (*original_set_high_voltage)(struct dvb_frontend *fe, long arg);
@@ -639,7 +658,7 @@ extern struct pci_device_id __devinitdata saa7134_pci_tbl[];
639 658
640extern int saa7134_board_init1(struct saa7134_dev *dev); 659extern int saa7134_board_init1(struct saa7134_dev *dev);
641extern int saa7134_board_init2(struct saa7134_dev *dev); 660extern int saa7134_board_init2(struct saa7134_dev *dev);
642int saa7134_tuner_callback(void *priv, int command, int arg); 661int saa7134_tuner_callback(void *priv, int component, int command, int arg);
643 662
644 663
645/* ----------------------------------------------------------- */ 664/* ----------------------------------------------------------- */
@@ -649,6 +668,8 @@ int saa7134_i2c_register(struct saa7134_dev *dev);
649int saa7134_i2c_unregister(struct saa7134_dev *dev); 668int saa7134_i2c_unregister(struct saa7134_dev *dev);
650void saa7134_i2c_call_clients(struct saa7134_dev *dev, 669void saa7134_i2c_call_clients(struct saa7134_dev *dev,
651 unsigned int cmd, void *arg); 670 unsigned int cmd, void *arg);
671int saa7134_i2c_call_saa6752(struct saa7134_dev *dev,
672 unsigned int cmd, void *arg);
652 673
653 674
654/* ----------------------------------------------------------- */ 675/* ----------------------------------------------------------- */
@@ -658,9 +679,10 @@ extern unsigned int video_debug;
658extern struct video_device saa7134_video_template; 679extern struct video_device saa7134_video_template;
659extern struct video_device saa7134_radio_template; 680extern struct video_device saa7134_radio_template;
660 681
661int saa7134_g_ctrl(struct file *file, void *priv, struct v4l2_control *c); 682int saa7134_s_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c);
662int saa7134_s_ctrl(struct file *file, void *f, struct v4l2_control *c); 683int saa7134_g_ctrl_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, struct v4l2_control *c);
663int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c); 684int saa7134_queryctrl(struct file *file, void *priv, struct v4l2_queryctrl *c);
685int saa7134_s_std_internal(struct saa7134_dev *dev, struct saa7134_fh *fh, v4l2_std_id *id);
664 686
665int saa7134_videoport_init(struct saa7134_dev *dev); 687int saa7134_videoport_init(struct saa7134_dev *dev);
666void saa7134_set_tvnorm_hw(struct saa7134_dev *dev); 688void saa7134_set_tvnorm_hw(struct saa7134_dev *dev);