aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134
diff options
context:
space:
mode:
authorJames Bottomley <jejb@titanic.(none)>2005-11-10 09:29:07 -0500
committerJames Bottomley <jejb@titanic.(none)>2005-11-10 09:29:07 -0500
commit8a87a0b6313109d2fea87b1271d497c954ce2ca8 (patch)
tree1b7ae51ff681e27118590e9cab4bf0ce38f5d80e /drivers/media/video/saa7134
parente6a04466ba965875a6132700fabb2f2c0249c41a (diff)
parent3b44f137b9a846c5452d9e6e1271b79b1dbcc942 (diff)
Merge by hand (whitespace conflicts in libata.h)
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/media/video/saa7134')
-rw-r--r--drivers/media/video/saa7134/Kconfig68
-rw-r--r--drivers/media/video/saa7134/Makefile9
-rw-r--r--drivers/media/video/saa7134/saa6752hs.c187
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c1047
-rw-r--r--drivers/media/video/saa7134/saa7134-cards.c587
-rw-r--r--drivers/media/video/saa7134/saa7134-core.c120
-rw-r--r--drivers/media/video/saa7134/saa7134-dvb.c370
-rw-r--r--drivers/media/video/saa7134/saa7134-empress.c6
-rw-r--r--drivers/media/video/saa7134/saa7134-i2c.c28
-rw-r--r--drivers/media/video/saa7134/saa7134-input.c403
-rw-r--r--drivers/media/video/saa7134/saa7134-oss.c375
-rw-r--r--drivers/media/video/saa7134/saa7134-reg.h27
-rw-r--r--drivers/media/video/saa7134/saa7134-ts.c29
-rw-r--r--drivers/media/video/saa7134/saa7134-tvaudio.c23
-rw-r--r--drivers/media/video/saa7134/saa7134-video.c185
-rw-r--r--drivers/media/video/saa7134/saa7134.h62
16 files changed, 3013 insertions, 513 deletions
diff --git a/drivers/media/video/saa7134/Kconfig b/drivers/media/video/saa7134/Kconfig
new file mode 100644
index 000000000000..624e8808a517
--- /dev/null
+++ b/drivers/media/video/saa7134/Kconfig
@@ -0,0 +1,68 @@
1config VIDEO_SAA7134
2 tristate "Philips SAA7134 support"
3 depends on VIDEO_DEV && PCI && I2C && SOUND
4 select VIDEO_BUF
5 select VIDEO_IR
6 select VIDEO_TUNER
7 select CRC32
8 ---help---
9 This is a video4linux driver for Philips SAA713x based
10 TV cards.
11
12 To compile this driver as a module, choose M here: the
13 module will be called saa7134.
14
15config VIDEO_SAA7134_DVB
16 tristate "DVB/ATSC Support for saa7134 based TV cards"
17 depends on VIDEO_SAA7134 && DVB_CORE
18 select VIDEO_BUF_DVB
19 ---help---
20 This adds support for DVB cards based on the
21 Philips saa7134 chip.
22
23 To compile this driver as a module, choose M here: the
24 module will be called saa7134-dvb.
25
26 You must also select one or more DVB demodulators.
27 If you are unsure which you need, choose all of them.
28
29config VIDEO_SAA7134_DVB_ALL_FRONTENDS
30 bool "Build all supported frontends for saa7134 based TV cards"
31 default y
32 depends on VIDEO_SAA7134_DVB
33 select DVB_MT352
34 select DVB_TDA1004X
35 select DVB_NXT200X
36 ---help---
37 This builds saa7134-dvb with all currently supported frontend
38 demodulators. If you wish to tweak your configuration, and
39 only include support for the hardware that you need, choose N here.
40
41 If you are unsure, choose Y.
42
43config VIDEO_SAA7134_DVB_MT352
44 tristate "Zarlink MT352 DVB-T Support"
45 default m
46 depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
47 select DVB_MT352
48 ---help---
49 This adds DVB-T support for cards based on the
50 Philips saa7134 chip and the MT352 demodulator.
51
52config VIDEO_SAA7134_DVB_TDA1004X
53 tristate "Phillips TDA10045H/TDA10046H DVB-T Support"
54 default m
55 depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
56 select DVB_TDA1004X
57 ---help---
58 This adds DVB-T support for cards based on the
59 Philips saa7134 chip and the TDA10045H/TDA10046H demodulator.
60
61config VIDEO_SAA7134_DVB_NXT200X
62 tristate "NXT2002/NXT2004 ATSC Support"
63 default m
64 depends on VIDEO_SAA7134_DVB && !VIDEO_SAA7134_DVB_ALL_FRONTENDS
65 select DVB_NXT200X
66 ---help---
67 This adds ATSC 8VSB and QAM64/256 support for cards based on the
68 Philips saa7134 chip and the NXT2002/NXT2004 demodulator.
diff --git a/drivers/media/video/saa7134/Makefile b/drivers/media/video/saa7134/Makefile
index b778ffd94e65..e0b28f0533af 100644
--- a/drivers/media/video/saa7134/Makefile
+++ b/drivers/media/video/saa7134/Makefile
@@ -3,15 +3,22 @@ saa7134-objs := saa7134-cards.o saa7134-core.o saa7134-i2c.o \
3 saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o \ 3 saa7134-oss.o saa7134-ts.o saa7134-tvaudio.o \
4 saa7134-vbi.o saa7134-video.o saa7134-input.o 4 saa7134-vbi.o saa7134-video.o saa7134-input.o
5 5
6obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o saa6752hs.o 6obj-$(CONFIG_VIDEO_SAA7134) += saa7134.o saa7134-empress.o \
7 saa6752hs.o saa7134-alsa.o
7obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o 8obj-$(CONFIG_VIDEO_SAA7134_DVB) += saa7134-dvb.o
8 9
9EXTRA_CFLAGS += -I$(src)/.. 10EXTRA_CFLAGS += -I$(src)/..
10EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core 11EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/dvb-core
11EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends 12EXTRA_CFLAGS += -I$(srctree)/drivers/media/dvb/frontends
13ifneq ($(CONFIG_VIDEO_BUF_DVB),n)
14 EXTRA_CFLAGS += -DHAVE_VIDEO_BUF_DVB=1
15endif
12ifneq ($(CONFIG_DVB_MT352),n) 16ifneq ($(CONFIG_DVB_MT352),n)
13 EXTRA_CFLAGS += -DHAVE_MT352=1 17 EXTRA_CFLAGS += -DHAVE_MT352=1
14endif 18endif
15ifneq ($(CONFIG_DVB_TDA1004X),n) 19ifneq ($(CONFIG_DVB_TDA1004X),n)
16 EXTRA_CFLAGS += -DHAVE_TDA1004X=1 20 EXTRA_CFLAGS += -DHAVE_TDA1004X=1
17endif 21endif
22ifneq ($(CONFIG_DVB_NXT200X),n)
23 EXTRA_CFLAGS += -DHAVE_NXT200X=1
24endif
diff --git a/drivers/media/video/saa7134/saa6752hs.c b/drivers/media/video/saa7134/saa6752hs.c
index 382911c6ef22..cdd1ed9c8065 100644
--- a/drivers/media/video/saa7134/saa6752hs.c
+++ b/drivers/media/video/saa7134/saa6752hs.c
@@ -13,7 +13,6 @@
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/crc32.h> 14#include <linux/crc32.h>
15 15
16#include <media/id.h>
17 16
18#define MPEG_VIDEO_TARGET_BITRATE_MAX 27000 17#define MPEG_VIDEO_TARGET_BITRATE_MAX 27000
19#define MPEG_VIDEO_MAX_BITRATE_MAX 27000 18#define MPEG_VIDEO_MAX_BITRATE_MAX 27000
@@ -57,6 +56,7 @@ struct saa6752hs_state {
57 struct i2c_client client; 56 struct i2c_client client;
58 struct v4l2_mpeg_compression params; 57 struct v4l2_mpeg_compression params;
59 enum saa6752hs_videoformat video_format; 58 enum saa6752hs_videoformat video_format;
59 v4l2_std_id standard;
60}; 60};
61 61
62enum saa6752hs_command { 62enum saa6752hs_command {
@@ -74,58 +74,58 @@ enum saa6752hs_command {
74/* ---------------------------------------------------------------------- */ 74/* ---------------------------------------------------------------------- */
75 75
76static u8 PAT[] = { 76static u8 PAT[] = {
77 0xc2, // i2c register 77 0xc2, /* i2c register */
78 0x00, // table number for encoder 78 0x00, /* table number for encoder */
79 79
80 0x47, // sync 80 0x47, /* sync */
81 0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) 81 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) */
82 0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) 82 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
83 83
84 0x00, // PSI pointer to start of table 84 0x00, /* PSI pointer to start of table */
85 85
86 0x00, // tid(0) 86 0x00, /* tid(0) */
87 0xb0, 0x0d, // section_syntax_indicator(1), section_length(13) 87 0xb0, 0x0d, /* section_syntax_indicator(1), section_length(13) */
88 88
89 0x00, 0x01, // transport_stream_id(1) 89 0x00, 0x01, /* transport_stream_id(1) */
90 90
91 0xc1, // version_number(0), current_next_indicator(1) 91 0xc1, /* version_number(0), current_next_indicator(1) */
92 92
93 0x00, 0x00, // section_number(0), last_section_number(0) 93 0x00, 0x00, /* section_number(0), last_section_number(0) */
94 94
95 0x00, 0x01, // program_number(1) 95 0x00, 0x01, /* program_number(1) */
96 96
97 0xe0, 0x00, // PMT PID 97 0xe0, 0x00, /* PMT PID */
98 98
99 0x00, 0x00, 0x00, 0x00 // CRC32 99 0x00, 0x00, 0x00, 0x00 /* CRC32 */
100}; 100};
101 101
102static u8 PMT[] = { 102static u8 PMT[] = {
103 0xc2, // i2c register 103 0xc2, /* i2c register */
104 0x01, // table number for encoder 104 0x01, /* table number for encoder */
105 105
106 0x47, // sync 106 0x47, /* sync */
107 0x40, 0x00, // transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid 107 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid */
108 0x10, // transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) 108 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
109 109
110 0x00, // PSI pointer to start of table 110 0x00, /* PSI pointer to start of table */
111 111
112 0x02, // tid(2) 112 0x02, /* tid(2) */
113 0xb0, 0x17, // section_syntax_indicator(1), section_length(23) 113 0xb0, 0x17, /* section_syntax_indicator(1), section_length(23) */
114 114
115 0x00, 0x01, // program_number(1) 115 0x00, 0x01, /* program_number(1) */
116 116
117 0xc1, // version_number(0), current_next_indicator(1) 117 0xc1, /* version_number(0), current_next_indicator(1) */
118 118
119 0x00, 0x00, // section_number(0), last_section_number(0) 119 0x00, 0x00, /* section_number(0), last_section_number(0) */
120 120
121 0xe0, 0x00, // PCR_PID 121 0xe0, 0x00, /* PCR_PID */
122 122
123 0xf0, 0x00, // program_info_length(0) 123 0xf0, 0x00, /* program_info_length(0) */
124 124
125 0x02, 0xe0, 0x00, 0xf0, 0x00, // video stream type(2), pid 125 0x02, 0xe0, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
126 0x04, 0xe0, 0x00, 0xf0, 0x00, // audio stream type(4), pid 126 0x04, 0xe0, 0x00, 0xf0, 0x00, /* audio stream type(4), pid */
127 127
128 0x00, 0x00, 0x00, 0x00 // CRC32 128 0x00, 0x00, 0x00, 0x00 /* CRC32 */
129}; 129};
130 130
131static struct v4l2_mpeg_compression param_defaults = 131static struct v4l2_mpeg_compression param_defaults =
@@ -166,33 +166,33 @@ static int saa6752hs_chip_command(struct i2c_client* client,
166 unsigned long timeout; 166 unsigned long timeout;
167 int status = 0; 167 int status = 0;
168 168
169 // execute the command 169 /* execute the command */
170 switch(command) { 170 switch(command) {
171 case SAA6752HS_COMMAND_RESET: 171 case SAA6752HS_COMMAND_RESET:
172 buf[0] = 0x00; 172 buf[0] = 0x00;
173 break; 173 break;
174 174
175 case SAA6752HS_COMMAND_STOP: 175 case SAA6752HS_COMMAND_STOP:
176 buf[0] = 0x03; 176 buf[0] = 0x03;
177 break; 177 break;
178 178
179 case SAA6752HS_COMMAND_START: 179 case SAA6752HS_COMMAND_START:
180 buf[0] = 0x02; 180 buf[0] = 0x02;
181 break; 181 break;
182 182
183 case SAA6752HS_COMMAND_PAUSE: 183 case SAA6752HS_COMMAND_PAUSE:
184 buf[0] = 0x04; 184 buf[0] = 0x04;
185 break; 185 break;
186 186
187 case SAA6752HS_COMMAND_RECONFIGURE: 187 case SAA6752HS_COMMAND_RECONFIGURE:
188 buf[0] = 0x05; 188 buf[0] = 0x05;
189 break; 189 break;
190 190
191 case SAA6752HS_COMMAND_SLEEP: 191 case SAA6752HS_COMMAND_SLEEP:
192 buf[0] = 0x06; 192 buf[0] = 0x06;
193 break; 193 break;
194 194
195 case SAA6752HS_COMMAND_RECONFIGURE_FORCE: 195 case SAA6752HS_COMMAND_RECONFIGURE_FORCE:
196 buf[0] = 0x07; 196 buf[0] = 0x07;
197 break; 197 break;
198 198
@@ -200,13 +200,13 @@ static int saa6752hs_chip_command(struct i2c_client* client,
200 return -EINVAL; 200 return -EINVAL;
201 } 201 }
202 202
203 // set it and wait for it to be so 203 /* set it and wait for it to be so */
204 i2c_master_send(client, buf, 1); 204 i2c_master_send(client, buf, 1);
205 timeout = jiffies + HZ * 3; 205 timeout = jiffies + HZ * 3;
206 for (;;) { 206 for (;;) {
207 // get the current status 207 /* get the current status */
208 buf[0] = 0x10; 208 buf[0] = 0x10;
209 i2c_master_send(client, buf, 1); 209 i2c_master_send(client, buf, 1);
210 i2c_master_recv(client, buf, 1); 210 i2c_master_recv(client, buf, 1);
211 211
212 if (!(buf[0] & 0x20)) 212 if (!(buf[0] & 0x20))
@@ -216,61 +216,58 @@ static int saa6752hs_chip_command(struct i2c_client* client,
216 break; 216 break;
217 } 217 }
218 218
219 // wait a bit
220 msleep(10); 219 msleep(10);
221 } 220 }
222 221
223 // delay a bit to let encoder settle 222 /* delay a bit to let encoder settle */
224 msleep(50); 223 msleep(50);
225 224
226 // done 225 return status;
227 return status;
228} 226}
229 227
230 228
231static int saa6752hs_set_bitrate(struct i2c_client* client, 229static int saa6752hs_set_bitrate(struct i2c_client* client,
232 struct v4l2_mpeg_compression* params) 230 struct v4l2_mpeg_compression* params)
233{ 231{
234 u8 buf[3]; 232 u8 buf[3];
235 233
236 // set the bitrate mode 234 /* set the bitrate mode */
237 buf[0] = 0x71; 235 buf[0] = 0x71;
238 buf[1] = (params->vi_bitrate.mode == V4L2_BITRATE_VBR) ? 0 : 1; 236 buf[1] = (params->vi_bitrate.mode == V4L2_BITRATE_VBR) ? 0 : 1;
239 i2c_master_send(client, buf, 2); 237 i2c_master_send(client, buf, 2);
240 238
241 // set the video bitrate 239 /* set the video bitrate */
242 if (params->vi_bitrate.mode == V4L2_BITRATE_VBR) { 240 if (params->vi_bitrate.mode == V4L2_BITRATE_VBR) {
243 // set the target bitrate 241 /* set the target bitrate */
244 buf[0] = 0x80; 242 buf[0] = 0x80;
245 buf[1] = params->vi_bitrate.target >> 8; 243 buf[1] = params->vi_bitrate.target >> 8;
246 buf[2] = params->vi_bitrate.target & 0xff; 244 buf[2] = params->vi_bitrate.target & 0xff;
247 i2c_master_send(client, buf, 3); 245 i2c_master_send(client, buf, 3);
248 246
249 // set the max bitrate 247 /* set the max bitrate */
250 buf[0] = 0x81; 248 buf[0] = 0x81;
251 buf[1] = params->vi_bitrate.max >> 8; 249 buf[1] = params->vi_bitrate.max >> 8;
252 buf[2] = params->vi_bitrate.max & 0xff; 250 buf[2] = params->vi_bitrate.max & 0xff;
253 i2c_master_send(client, buf, 3); 251 i2c_master_send(client, buf, 3);
254 } else { 252 } else {
255 // set the target bitrate (no max bitrate for CBR) 253 /* set the target bitrate (no max bitrate for CBR) */
256 buf[0] = 0x81; 254 buf[0] = 0x81;
257 buf[1] = params->vi_bitrate.target >> 8; 255 buf[1] = params->vi_bitrate.target >> 8;
258 buf[2] = params->vi_bitrate.target & 0xff; 256 buf[2] = params->vi_bitrate.target & 0xff;
259 i2c_master_send(client, buf, 3); 257 i2c_master_send(client, buf, 3);
260 } 258 }
261 259
262 // set the audio bitrate 260 /* set the audio bitrate */
263 buf[0] = 0x94; 261 buf[0] = 0x94;
264 buf[1] = (256 == params->au_bitrate.target) ? 0 : 1; 262 buf[1] = (256 == params->au_bitrate.target) ? 0 : 1;
265 i2c_master_send(client, buf, 2); 263 i2c_master_send(client, buf, 2);
266 264
267 // set the total bitrate 265 /* set the total bitrate */
268 buf[0] = 0xb1; 266 buf[0] = 0xb1;
269 buf[1] = params->st_bitrate.target >> 8; 267 buf[1] = params->st_bitrate.target >> 8;
270 buf[2] = params->st_bitrate.target & 0xff; 268 buf[2] = params->st_bitrate.target & 0xff;
271 i2c_master_send(client, buf, 3); 269 i2c_master_send(client, buf, 3);
272 270
273 // return success
274 return 0; 271 return 0;
275} 272}
276 273
@@ -376,36 +373,43 @@ static int saa6752hs_init(struct i2c_client* client)
376 373
377 h = i2c_get_clientdata(client); 374 h = i2c_get_clientdata(client);
378 375
379 // Set video format - must be done first as it resets other settings 376 /* Set video format - must be done first as it resets other settings */
380 buf[0] = 0x41; 377 buf[0] = 0x41;
381 buf[1] = h->video_format; 378 buf[1] = h->video_format;
382 i2c_master_send(client, buf, 2); 379 i2c_master_send(client, buf, 2);
383 380
384 // set bitrate 381 /* Set number of lines in input signal */
385 saa6752hs_set_bitrate(client, &h->params); 382 buf[0] = 0x40;
383 buf[1] = 0x00;
384 if (h->standard & V4L2_STD_525_60)
385 buf[1] = 0x01;
386 i2c_master_send(client, buf, 2);
387
388 /* set bitrate */
389 saa6752hs_set_bitrate(client, &h->params);
386 390
387 // Set GOP structure {3, 13} 391 /* Set GOP structure {3, 13} */
388 buf[0] = 0x72; 392 buf[0] = 0x72;
389 buf[1] = 0x03; 393 buf[1] = 0x03;
390 buf[2] = 0x0D; 394 buf[2] = 0x0D;
391 i2c_master_send(client,buf,3); 395 i2c_master_send(client,buf,3);
392 396
393 // Set minimum Q-scale {4} 397 /* Set minimum Q-scale {4} */
394 buf[0] = 0x82; 398 buf[0] = 0x82;
395 buf[1] = 0x04; 399 buf[1] = 0x04;
396 i2c_master_send(client,buf,2); 400 i2c_master_send(client,buf,2);
397 401
398 // Set maximum Q-scale {12} 402 /* Set maximum Q-scale {12} */
399 buf[0] = 0x83; 403 buf[0] = 0x83;
400 buf[1] = 0x0C; 404 buf[1] = 0x0C;
401 i2c_master_send(client,buf,2); 405 i2c_master_send(client,buf,2);
402 406
403 // Set Output Protocol 407 /* Set Output Protocol */
404 buf[0] = 0xD0; 408 buf[0] = 0xD0;
405 buf[1] = 0x81; 409 buf[1] = 0x81;
406 i2c_master_send(client,buf,2); 410 i2c_master_send(client,buf,2);
407 411
408 // Set video output stream format {TS} 412 /* Set video output stream format {TS} */
409 buf[0] = 0xB0; 413 buf[0] = 0xB0;
410 buf[1] = 0x05; 414 buf[1] = 0x05;
411 i2c_master_send(client,buf,2); 415 i2c_master_send(client,buf,2);
@@ -421,9 +425,9 @@ static int saa6752hs_init(struct i2c_client* client)
421 localPAT[sizeof(PAT) - 1] = crc & 0xFF; 425 localPAT[sizeof(PAT) - 1] = crc & 0xFF;
422 426
423 /* compute PMT */ 427 /* compute PMT */
424 memcpy(localPMT, PMT, sizeof(PMT)); 428 memcpy(localPMT, PMT, sizeof(PMT));
425 localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f); 429 localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f);
426 localPMT[4] = h->params.ts_pid_pmt & 0xff; 430 localPMT[4] = h->params.ts_pid_pmt & 0xff;
427 localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F); 431 localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F);
428 localPMT[16] = h->params.ts_pid_pcr & 0xFF; 432 localPMT[16] = h->params.ts_pid_pcr & 0xFF;
429 localPMT[20] = 0xE0 | ((h->params.ts_pid_video >> 8) & 0x0F); 433 localPMT[20] = 0xE0 | ((h->params.ts_pid_video >> 8) & 0x0F);
@@ -436,39 +440,39 @@ static int saa6752hs_init(struct i2c_client* client)
436 localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF; 440 localPMT[sizeof(PMT) - 2] = (crc >> 8) & 0xFF;
437 localPMT[sizeof(PMT) - 1] = crc & 0xFF; 441 localPMT[sizeof(PMT) - 1] = crc & 0xFF;
438 442
439 // Set Audio PID 443 /* Set Audio PID */
440 buf[0] = 0xC1; 444 buf[0] = 0xC1;
441 buf[1] = (h->params.ts_pid_audio >> 8) & 0xFF; 445 buf[1] = (h->params.ts_pid_audio >> 8) & 0xFF;
442 buf[2] = h->params.ts_pid_audio & 0xFF; 446 buf[2] = h->params.ts_pid_audio & 0xFF;
443 i2c_master_send(client,buf,3); 447 i2c_master_send(client,buf,3);
444 448
445 // Set Video PID 449 /* Set Video PID */
446 buf[0] = 0xC0; 450 buf[0] = 0xC0;
447 buf[1] = (h->params.ts_pid_video >> 8) & 0xFF; 451 buf[1] = (h->params.ts_pid_video >> 8) & 0xFF;
448 buf[2] = h->params.ts_pid_video & 0xFF; 452 buf[2] = h->params.ts_pid_video & 0xFF;
449 i2c_master_send(client,buf,3); 453 i2c_master_send(client,buf,3);
450 454
451 // Set PCR PID 455 /* Set PCR PID */
452 buf[0] = 0xC4; 456 buf[0] = 0xC4;
453 buf[1] = (h->params.ts_pid_pcr >> 8) & 0xFF; 457 buf[1] = (h->params.ts_pid_pcr >> 8) & 0xFF;
454 buf[2] = h->params.ts_pid_pcr & 0xFF; 458 buf[2] = h->params.ts_pid_pcr & 0xFF;
455 i2c_master_send(client,buf,3); 459 i2c_master_send(client,buf,3);
456 460
457 // Send SI tables 461 /* Send SI tables */
458 i2c_master_send(client,localPAT,sizeof(PAT)); 462 i2c_master_send(client,localPAT,sizeof(PAT));
459 i2c_master_send(client,localPMT,sizeof(PMT)); 463 i2c_master_send(client,localPMT,sizeof(PMT));
460 464
461 // mute then unmute audio. This removes buzzing artefacts 465 /* mute then unmute audio. This removes buzzing artefacts */
462 buf[0] = 0xa4; 466 buf[0] = 0xa4;
463 buf[1] = 1; 467 buf[1] = 1;
464 i2c_master_send(client, buf, 2); 468 i2c_master_send(client, buf, 2);
465 buf[1] = 0; 469 buf[1] = 0;
466 i2c_master_send(client, buf, 2); 470 i2c_master_send(client, buf, 2);
467 471
468 // start it going 472 /* start it going */
469 saa6752hs_chip_command(client, SAA6752HS_COMMAND_START); 473 saa6752hs_chip_command(client, SAA6752HS_COMMAND_START);
470 474
471 // readout current state 475 /* readout current state */
472 buf[0] = 0xE1; 476 buf[0] = 0xE1;
473 buf[1] = 0xA7; 477 buf[1] = 0xA7;
474 buf[2] = 0xFE; 478 buf[2] = 0xFE;
@@ -477,7 +481,7 @@ static int saa6752hs_init(struct i2c_client* client)
477 i2c_master_send(client, buf, 5); 481 i2c_master_send(client, buf, 5);
478 i2c_master_recv(client, buf2, 4); 482 i2c_master_recv(client, buf2, 4);
479 483
480 // change aspect ratio 484 /* change aspect ratio */
481 buf[0] = 0xE0; 485 buf[0] = 0xE0;
482 buf[1] = 0xA7; 486 buf[1] = 0xA7;
483 buf[2] = 0xFE; 487 buf[2] = 0xFE;
@@ -498,7 +502,6 @@ static int saa6752hs_init(struct i2c_client* client)
498 buf[8] = buf2[3]; 502 buf[8] = buf2[3];
499 i2c_master_send(client, buf, 9); 503 i2c_master_send(client, buf, 9);
500 504
501 // return success
502 return 0; 505 return 0;
503} 506}
504 507
@@ -506,16 +509,19 @@ static int saa6752hs_attach(struct i2c_adapter *adap, int addr, int kind)
506{ 509{
507 struct saa6752hs_state *h; 510 struct saa6752hs_state *h;
508 511
509 printk("saa6752hs: chip found @ 0x%x\n", addr<<1); 512 printk("saa6752hs: chip found @ 0x%x\n", addr<<1);
510 513
511 if (NULL == (h = kmalloc(sizeof(*h), GFP_KERNEL))) 514 if (NULL == (h = kmalloc(sizeof(*h), GFP_KERNEL)))
512 return -ENOMEM; 515 return -ENOMEM;
513 memset(h,0,sizeof(*h)); 516 memset(h,0,sizeof(*h));
514 h->client = client_template; 517 h->client = client_template;
515 h->params = param_defaults; 518 h->params = param_defaults;
516 h->client.adapter = adap; 519 h->client.adapter = adap;
517 h->client.addr = addr; 520 h->client.addr = addr;
518 521
522 /* Assume 625 input lines */
523 h->standard = 0;
524
519 i2c_set_clientdata(&h->client, h); 525 i2c_set_clientdata(&h->client, h);
520 i2c_attach_client(&h->client); 526 i2c_attach_client(&h->client);
521 return 0; 527 return 0;
@@ -545,7 +551,7 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
545 struct v4l2_mpeg_compression *params = arg; 551 struct v4l2_mpeg_compression *params = arg;
546 int err = 0; 552 int err = 0;
547 553
548 switch (cmd) { 554 switch (cmd) {
549 case VIDIOC_S_MPEGCOMP: 555 case VIDIOC_S_MPEGCOMP:
550 if (NULL == params) { 556 if (NULL == params) {
551 /* apply settings and start encoder */ 557 /* apply settings and start encoder */
@@ -559,7 +565,7 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
559 break; 565 break;
560 case VIDIOC_G_FMT: 566 case VIDIOC_G_FMT:
561 { 567 {
562 struct v4l2_format *f = arg; 568 struct v4l2_format *f = arg;
563 569
564 if (h->video_format == SAA6752HS_VF_UNKNOWN) 570 if (h->video_format == SAA6752HS_VF_UNKNOWN)
565 h->video_format = SAA6752HS_VF_D1; 571 h->video_format = SAA6752HS_VF_D1;
@@ -576,6 +582,9 @@ saa6752hs_command(struct i2c_client *client, unsigned int cmd, void *arg)
576 saa6752hs_set_subsampling(client, f); 582 saa6752hs_set_subsampling(client, f);
577 break; 583 break;
578 } 584 }
585 case VIDIOC_S_STD:
586 h->standard = *((v4l2_std_id *) arg);
587 break;
579 default: 588 default:
580 /* nothing */ 589 /* nothing */
581 break; 590 break;
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
new file mode 100644
index 000000000000..4f3c42354329
--- /dev/null
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -0,0 +1,1047 @@
1/*
2 * SAA713x ALSA support for V4L
3 *
4 *
5 * Caveats:
6 * - Volume doesn't work (it's always at max)
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, version 2
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 */
22
23#include <sound/driver.h>
24#include <linux/init.h>
25#include <linux/slab.h>
26#include <linux/time.h>
27#include <linux/wait.h>
28#include <linux/moduleparam.h>
29#include <linux/module.h>
30#include <sound/core.h>
31#include <sound/control.h>
32#include <sound/pcm.h>
33#include <sound/initval.h>
34
35#include "saa7134.h"
36#include "saa7134-reg.h"
37
38static unsigned int debug = 0;
39module_param(debug, int, 0644);
40MODULE_PARM_DESC(debug,"enable debug messages [alsa]");
41
42/*
43 * Configuration macros
44 */
45
46/* defaults */
47#define MIXER_ADDR_TVTUNER 0
48#define MIXER_ADDR_LINE1 1
49#define MIXER_ADDR_LINE2 2
50#define MIXER_ADDR_LAST 2
51
52static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX; /* Index 0-MAX */
53static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR; /* ID for this card */
54static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
55
56module_param_array(index, int, NULL, 0444);
57MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s).");
58
59#define dprintk(fmt, arg...) if (debug) \
60 printk(KERN_DEBUG "%s/alsa: " fmt, dev->name , ## arg)
61
62/*
63 * Main chip structure
64 */
65typedef struct snd_card_saa7134 {
66 snd_card_t *card;
67 spinlock_t mixer_lock;
68 int mixer_volume[MIXER_ADDR_LAST+1][2];
69 int capture_source[MIXER_ADDR_LAST+1][2];
70 struct pci_dev *pci;
71 struct saa7134_dev *saadev;
72
73 unsigned long iobase;
74 int irq;
75
76 spinlock_t lock;
77} snd_card_saa7134_t;
78
79
80
81/*
82 * PCM structure
83 */
84
85typedef struct snd_card_saa7134_pcm {
86 struct saa7134_dev *saadev;
87
88 spinlock_t lock;
89 unsigned int pcm_size; /* buffer size */
90 unsigned int pcm_count; /* bytes per period */
91 unsigned int pcm_bps; /* bytes per second */
92 snd_pcm_substream_t *substream;
93} snd_card_saa7134_pcm_t;
94
95static snd_card_t *snd_saa7134_cards[SNDRV_CARDS];
96
97
98/*
99 * saa7134 DMA audio stop
100 *
101 * Called when the capture device is released or the buffer overflows
102 *
103 * - Copied verbatim from saa7134-oss's dsp_dma_stop. Can be dropped
104 * if we just share dsp_dma_stop and use it here
105 *
106 */
107
108static void saa7134_dma_stop(struct saa7134_dev *dev)
109
110{
111 dev->dmasound.dma_blk = -1;
112 dev->dmasound.dma_running = 0;
113 saa7134_set_dmabits(dev);
114}
115
116/*
117 * saa7134 DMA audio start
118 *
119 * Called when preparing the capture device for use
120 *
121 * - Copied verbatim from saa7134-oss's dsp_dma_start. Can be dropped
122 * if we just share dsp_dma_start and use it here
123 *
124 */
125
126static void saa7134_dma_start(struct saa7134_dev *dev)
127{
128 dev->dmasound.dma_blk = 0;
129 dev->dmasound.dma_running = 1;
130 saa7134_set_dmabits(dev);
131}
132
133/*
134 * saa7134 audio DMA IRQ handler
135 *
136 * Called whenever we get an SAA7134_IRQ_REPORT_DONE_RA3 interrupt
137 * Handles shifting between the 2 buffers, manages the read counters,
138 * and notifies ALSA when periods elapse
139 *
140 * - Mostly copied from saa7134-oss's saa7134_irq_oss_done.
141 *
142 */
143
144void saa7134_irq_alsa_done(struct saa7134_dev *dev, unsigned long status)
145{
146 int next_blk, reg = 0;
147
148 spin_lock(&dev->slock);
149 if (UNSET == dev->dmasound.dma_blk) {
150 dprintk("irq: recording stopped\n");
151 goto done;
152 }
153 if (0 != (status & 0x0f000000))
154 dprintk("irq: lost %ld\n", (status >> 24) & 0x0f);
155 if (0 == (status & 0x10000000)) {
156 /* odd */
157 if (0 == (dev->dmasound.dma_blk & 0x01))
158 reg = SAA7134_RS_BA1(6);
159 } else {
160 /* even */
161 if (1 == (dev->dmasound.dma_blk & 0x01))
162 reg = SAA7134_RS_BA2(6);
163 }
164 if (0 == reg) {
165 dprintk("irq: field oops [%s]\n",
166 (status & 0x10000000) ? "even" : "odd");
167 goto done;
168 }
169
170 if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) {
171 dprintk("irq: overrun [full=%d/%d] - Blocks in %d\n",dev->dmasound.read_count,
172 dev->dmasound.bufsize, dev->dmasound.blocks);
173 snd_pcm_stop(dev->dmasound.substream,SNDRV_PCM_STATE_XRUN);
174 saa7134_dma_stop(dev);
175 goto done;
176 }
177
178 /* next block addr */
179 next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks;
180 saa_writel(reg,next_blk * dev->dmasound.blksize);
181 if (debug > 2)
182 dprintk("irq: ok, %s, next_blk=%d, addr=%x, blocks=%u, size=%u, read=%u\n",
183 (status & 0x10000000) ? "even" : "odd ", next_blk,
184 next_blk * dev->dmasound.blksize, dev->dmasound.blocks, dev->dmasound.blksize, dev->dmasound.read_count);
185
186 /* update status & wake waiting readers */
187 dev->dmasound.dma_blk = (dev->dmasound.dma_blk + 1) % dev->dmasound.blocks;
188 dev->dmasound.read_count += dev->dmasound.blksize;
189
190 dev->dmasound.recording_on = reg;
191
192 if (dev->dmasound.read_count >= snd_pcm_lib_period_bytes(dev->dmasound.substream)) {
193 spin_unlock(&dev->slock);
194 snd_pcm_period_elapsed(dev->dmasound.substream);
195 spin_lock(&dev->slock);
196 }
197 done:
198 spin_unlock(&dev->slock);
199
200}
201
202/*
203 * IRQ request handler
204 *
205 * Runs along with saa7134's IRQ handler, discards anything that isn't
206 * DMA sound
207 *
208 */
209
210static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id, struct pt_regs *regs)
211{
212 struct saa7134_dev *dev = (struct saa7134_dev*) dev_id;
213 unsigned long report, status;
214 int loop, handled = 0;
215
216 for (loop = 0; loop < 10; loop++) {
217 report = saa_readl(SAA7134_IRQ_REPORT);
218 status = saa_readl(SAA7134_IRQ_STATUS);
219
220 if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
221 handled = 1;
222 saa_writel(SAA7134_IRQ_REPORT,report);
223 saa7134_irq_alsa_done(dev, status);
224 } else {
225 goto out;
226 }
227 }
228
229 if (loop == 10) {
230 dprintk("error! looping IRQ!");
231 }
232
233out:
234 return IRQ_RETVAL(handled);
235}
236
237/*
238 * ALSA capture trigger
239 *
240 * - One of the ALSA capture callbacks.
241 *
242 * Called whenever a capture is started or stopped. Must be defined,
243 * but there's nothing we want to do here
244 *
245 */
246
247static int snd_card_saa7134_capture_trigger(snd_pcm_substream_t * substream,
248 int cmd)
249{
250 snd_pcm_runtime_t *runtime = substream->runtime;
251 snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
252 struct saa7134_dev *dev=saapcm->saadev;
253 int err = 0;
254
255 spin_lock_irq(&dev->slock);
256 if (cmd == SNDRV_PCM_TRIGGER_START) {
257 /* start dma */
258 saa7134_dma_start(dev);
259 } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
260 /* stop dma */
261 saa7134_dma_stop(dev);
262 } else {
263 err = -EINVAL;
264 }
265 spin_unlock_irq(&dev->slock);
266
267 return err;
268}
269
270/*
271 * DMA buffer config
272 *
273 * Sets the values that will later be used as the size of the buffer,
274 * size of the fragments, and total number of fragments.
275 * Must be called during the preparation stage, before memory is
276 * allocated
277 *
278 * - Copied verbatim from saa7134-oss. Can be dropped
279 * if we just share dsp_buffer_conf from OSS.
280 */
281
282static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
283{
284 if (blksize < 0x100)
285 blksize = 0x100;
286 if (blksize > 0x10000)
287 blksize = 0x10000;
288
289 if (blocks < 2)
290 blocks = 2;
291 if ((blksize * blocks) > 1024*1024)
292 blocks = 1024*1024 / blksize;
293
294 dev->dmasound.blocks = blocks;
295 dev->dmasound.blksize = blksize;
296 dev->dmasound.bufsize = blksize * blocks;
297
298 dprintk("buffer config: %d blocks / %d bytes, %d kB total\n",
299 blocks,blksize,blksize * blocks / 1024);
300 return 0;
301}
302
303/*
304 * DMA buffer initialization
305 *
306 * Uses V4L functions to initialize the DMA. Shouldn't be necessary in
307 * ALSA, but I was unable to use ALSA's own DMA, and had to force the
308 * usage of V4L's
309 *
310 * - Copied verbatim from saa7134-oss. Can be dropped
311 * if we just share dsp_buffer_init from OSS.
312 */
313
314static int dsp_buffer_init(struct saa7134_dev *dev)
315{
316 int err;
317
318 if (!dev->dmasound.bufsize)
319 BUG();
320 videobuf_dma_init(&dev->dmasound.dma);
321 err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE,
322 (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT);
323 if (0 != err)
324 return err;
325 return 0;
326}
327
328/*
329 * ALSA PCM preparation
330 *
331 * - One of the ALSA capture callbacks.
332 *
333 * Called right after the capture device is opened, this function configures
334 * the buffer using the previously defined functions, allocates the memory,
335 * sets up the hardware registers, and then starts the DMA. When this function
336 * returns, the audio should be flowing.
337 *
338 */
339
340static int snd_card_saa7134_capture_prepare(snd_pcm_substream_t * substream)
341{
342 snd_pcm_runtime_t *runtime = substream->runtime;
343 int err, bswap, sign;
344 u32 fmt, control;
345 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
346 struct saa7134_dev *dev;
347 snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
348 unsigned int bps;
349 unsigned long size;
350 unsigned count;
351
352 size = snd_pcm_lib_buffer_bytes(substream);
353 count = snd_pcm_lib_period_bytes(substream);
354
355 saapcm->saadev->dmasound.substream = substream;
356 bps = runtime->rate * runtime->channels;
357 bps *= snd_pcm_format_width(runtime->format);
358 bps /= 8;
359 if (bps <= 0)
360 return -EINVAL;
361 saapcm->pcm_bps = bps;
362 saapcm->pcm_size = snd_pcm_lib_buffer_bytes(substream);
363 saapcm->pcm_count = snd_pcm_lib_period_bytes(substream);
364
365
366 dev=saa7134->saadev;
367
368 dsp_buffer_conf(dev,saapcm->pcm_count,(saapcm->pcm_size/saapcm->pcm_count));
369
370 err = dsp_buffer_init(dev);
371 if (0 != err)
372 goto fail2;
373
374 /* prepare buffer */
375 if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma)))
376 return err;
377 if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt)))
378 goto fail1;
379 if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt,
380 dev->dmasound.dma.sglist,
381 dev->dmasound.dma.sglen,
382 0)))
383 goto fail2;
384
385
386
387 switch (runtime->format) {
388 case SNDRV_PCM_FORMAT_U8:
389 case SNDRV_PCM_FORMAT_S8:
390 fmt = 0x00;
391 break;
392 case SNDRV_PCM_FORMAT_U16_LE:
393 case SNDRV_PCM_FORMAT_U16_BE:
394 case SNDRV_PCM_FORMAT_S16_LE:
395 case SNDRV_PCM_FORMAT_S16_BE:
396 fmt = 0x01;
397 break;
398 default:
399 err = -EINVAL;
400 return 1;
401 }
402
403 switch (runtime->format) {
404 case SNDRV_PCM_FORMAT_S8:
405 case SNDRV_PCM_FORMAT_S16_LE:
406 case SNDRV_PCM_FORMAT_S16_BE:
407 sign = 1;
408 break;
409 default:
410 sign = 0;
411 break;
412 }
413
414 switch (runtime->format) {
415 case SNDRV_PCM_FORMAT_U16_BE:
416 case SNDRV_PCM_FORMAT_S16_BE:
417 bswap = 1; break;
418 default:
419 bswap = 0; break;
420 }
421
422 switch (dev->pci->device) {
423 case PCI_DEVICE_ID_PHILIPS_SAA7134:
424 if (1 == runtime->channels)
425 fmt |= (1 << 3);
426 if (2 == runtime->channels)
427 fmt |= (3 << 3);
428 if (sign)
429 fmt |= 0x04;
430
431 fmt |= (MIXER_ADDR_TVTUNER == dev->dmasound.input) ? 0xc0 : 0x80;
432 saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->dmasound.blksize - 1) & 0x0000ff));
433 saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->dmasound.blksize - 1) & 0x00ff00) >> 8);
434 saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->dmasound.blksize - 1) & 0xff0000) >> 16);
435 saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt);
436
437 break;
438 case PCI_DEVICE_ID_PHILIPS_SAA7133:
439 case PCI_DEVICE_ID_PHILIPS_SAA7135:
440 if (1 == runtime->channels)
441 fmt |= (1 << 4);
442 if (2 == runtime->channels)
443 fmt |= (2 << 4);
444 if (!sign)
445 fmt |= 0x04;
446 saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1);
447 saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
448 //saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210);
449 break;
450 }
451
452 dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n",
453 runtime->format, runtime->channels, fmt,
454 bswap ? 'b' : '-');
455 /* dma: setup channel 6 (= AUDIO) */
456 control = SAA7134_RS_CONTROL_BURST_16 |
457 SAA7134_RS_CONTROL_ME |
458 (dev->dmasound.pt.dma >> 12);
459 if (bswap)
460 control |= SAA7134_RS_CONTROL_BSWAP;
461
462 /* I should be able to use runtime->dma_addr in the control
463 byte, but it doesn't work. So I allocate the DMA using the
464 V4L functions, and force ALSA to use that as the DMA area */
465
466 runtime->dma_area = dev->dmasound.dma.vmalloc;
467
468 saa_writel(SAA7134_RS_BA1(6),0);
469 saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize);
470 saa_writel(SAA7134_RS_PITCH(6),0);
471 saa_writel(SAA7134_RS_CONTROL(6),control);
472
473 dev->dmasound.rate = runtime->rate;
474
475 return 0;
476 fail2:
477 saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
478 fail1:
479 videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
480 return err;
481
482
483}
484
485/*
486 * ALSA pointer fetching
487 *
488 * - One of the ALSA capture callbacks.
489 *
490 * Called whenever a period elapses, it must return the current hardware
491 * position of the buffer.
492 * Also resets the read counter used to prevent overruns
493 *
494 */
495
496static snd_pcm_uframes_t snd_card_saa7134_capture_pointer(snd_pcm_substream_t * substream)
497{
498 snd_pcm_runtime_t *runtime = substream->runtime;
499 snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
500 struct saa7134_dev *dev=saapcm->saadev;
501
502
503
504 if (dev->dmasound.read_count) {
505 dev->dmasound.read_count -= snd_pcm_lib_period_bytes(substream);
506 dev->dmasound.read_offset += snd_pcm_lib_period_bytes(substream);
507 if (dev->dmasound.read_offset == dev->dmasound.bufsize)
508 dev->dmasound.read_offset = 0;
509 }
510
511 return bytes_to_frames(runtime, dev->dmasound.read_offset);
512}
513
514/*
515 * ALSA hardware capabilities definition
516 */
517
518static snd_pcm_hardware_t snd_card_saa7134_capture =
519{
520 .info = (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
521 SNDRV_PCM_INFO_BLOCK_TRANSFER |
522 SNDRV_PCM_INFO_MMAP_VALID),
523 .formats = SNDRV_PCM_FMTBIT_S16_LE | \
524 SNDRV_PCM_FMTBIT_S16_BE | \
525 SNDRV_PCM_FMTBIT_S8 | \
526 SNDRV_PCM_FMTBIT_U8 | \
527 SNDRV_PCM_FMTBIT_U16_LE | \
528 SNDRV_PCM_FMTBIT_U16_BE,
529 .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000,
530 .rate_min = 32000,
531 .rate_max = 48000,
532 .channels_min = 1,
533 .channels_max = 2,
534 .buffer_bytes_max = (256*1024),
535 .period_bytes_min = 64,
536 .period_bytes_max = (256*1024),
537 .periods_min = 2,
538 .periods_max = 1024,
539};
540
541static void snd_card_saa7134_runtime_free(snd_pcm_runtime_t *runtime)
542{
543 snd_card_saa7134_pcm_t *saapcm = runtime->private_data;
544
545 kfree(saapcm);
546}
547
548
549/*
550 * ALSA hardware params
551 *
552 * - One of the ALSA capture callbacks.
553 *
554 * Called on initialization, right before the PCM preparation
555 * Usually used in ALSA to allocate the DMA, but since we don't use the
556 * ALSA DMA it does nothing
557 *
558 */
559
560static int snd_card_saa7134_hw_params(snd_pcm_substream_t * substream,
561 snd_pcm_hw_params_t * hw_params)
562{
563
564 return 0;
565
566
567}
568
569/*
570 * ALSA hardware release
571 *
572 * - One of the ALSA capture callbacks.
573 *
574 * Called after closing the device, but before snd_card_saa7134_capture_close
575 * Usually used in ALSA to free the DMA, but since we don't use the
576 * ALSA DMA I'm almost sure this isn't necessary.
577 *
578 */
579
580static int snd_card_saa7134_hw_free(snd_pcm_substream_t * substream)
581{
582 return 0;
583}
584
585/*
586 * DMA buffer release
587 *
588 * Called after closing the device, during snd_card_saa7134_capture_close
589 *
590 */
591
592static int dsp_buffer_free(struct saa7134_dev *dev)
593{
594 if (!dev->dmasound.blksize)
595 BUG();
596
597 videobuf_dma_free(&dev->dmasound.dma);
598
599 dev->dmasound.blocks = 0;
600 dev->dmasound.blksize = 0;
601 dev->dmasound.bufsize = 0;
602
603 return 0;
604}
605
606/*
607 * ALSA capture finish
608 *
609 * - One of the ALSA capture callbacks.
610 *
611 * Called after closing the device. It stops the DMA audio and releases
612 * the buffers
613 *
614 */
615
616static int snd_card_saa7134_capture_close(snd_pcm_substream_t * substream)
617{
618 snd_card_saa7134_t *chip = snd_pcm_substream_chip(substream);
619 struct saa7134_dev *dev = chip->saadev;
620
621 /* unlock buffer */
622 saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
623 videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
624
625 dsp_buffer_free(dev);
626 return 0;
627}
628
629/*
630 * ALSA capture start
631 *
632 * - One of the ALSA capture callbacks.
633 *
634 * Called when opening the device. It creates and populates the PCM
635 * structure
636 *
637 */
638
639static int snd_card_saa7134_capture_open(snd_pcm_substream_t * substream)
640{
641 snd_pcm_runtime_t *runtime = substream->runtime;
642 snd_card_saa7134_pcm_t *saapcm;
643 snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
644 struct saa7134_dev *dev = saa7134->saadev;
645 int err;
646
647 down(&dev->dmasound.lock);
648
649 dev->dmasound.afmt = SNDRV_PCM_FORMAT_U8;
650 dev->dmasound.channels = 2;
651 dev->dmasound.read_count = 0;
652 dev->dmasound.read_offset = 0;
653
654 up(&dev->dmasound.lock);
655
656 saapcm = kzalloc(sizeof(*saapcm), GFP_KERNEL);
657 if (saapcm == NULL)
658 return -ENOMEM;
659 saapcm->saadev=saa7134->saadev;
660
661 spin_lock_init(&saapcm->lock);
662
663 saapcm->substream = substream;
664 runtime->private_data = saapcm;
665 runtime->private_free = snd_card_saa7134_runtime_free;
666 runtime->hw = snd_card_saa7134_capture;
667
668 if ((err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS)) < 0)
669 return err;
670
671 return 0;
672}
673
674/*
675 * ALSA capture callbacks definition
676 */
677
678static snd_pcm_ops_t snd_card_saa7134_capture_ops = {
679 .open = snd_card_saa7134_capture_open,
680 .close = snd_card_saa7134_capture_close,
681 .ioctl = snd_pcm_lib_ioctl,
682 .hw_params = snd_card_saa7134_hw_params,
683 .hw_free = snd_card_saa7134_hw_free,
684 .prepare = snd_card_saa7134_capture_prepare,
685 .trigger = snd_card_saa7134_capture_trigger,
686 .pointer = snd_card_saa7134_capture_pointer,
687};
688
689/*
690 * ALSA PCM setup
691 *
692 * Called when initializing the board. Sets up the name and hooks up
693 * the callbacks
694 *
695 */
696
697static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device)
698{
699 snd_pcm_t *pcm;
700 int err;
701
702 if ((err = snd_pcm_new(saa7134->card, "SAA7134 PCM", device, 0, 1, &pcm)) < 0)
703 return err;
704 snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_card_saa7134_capture_ops);
705 pcm->private_data = saa7134;
706 pcm->info_flags = 0;
707 strcpy(pcm->name, "SAA7134 PCM");
708 return 0;
709}
710
711#define SAA713x_VOLUME(xname, xindex, addr) \
712{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
713 .info = snd_saa7134_volume_info, \
714 .get = snd_saa7134_volume_get, .put = snd_saa7134_volume_put, \
715 .private_value = addr }
716
717static int snd_saa7134_volume_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
718{
719 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
720 uinfo->count = 2;
721 uinfo->value.integer.min = 0;
722 uinfo->value.integer.max = 20;
723 return 0;
724}
725
726static int snd_saa7134_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
727{
728 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
729 int addr = kcontrol->private_value;
730
731 ucontrol->value.integer.value[0] = chip->mixer_volume[addr][0];
732 ucontrol->value.integer.value[1] = chip->mixer_volume[addr][1];
733 return 0;
734}
735
736static int snd_saa7134_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
737{
738 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
739 unsigned long flags;
740 int change, addr = kcontrol->private_value;
741 int left, right;
742
743 left = ucontrol->value.integer.value[0];
744 if (left < 0)
745 left = 0;
746 if (left > 20)
747 left = 20;
748 right = ucontrol->value.integer.value[1];
749 if (right < 0)
750 right = 0;
751 if (right > 20)
752 right = 20;
753 spin_lock_irqsave(&chip->mixer_lock, flags);
754 change = chip->mixer_volume[addr][0] != left ||
755 chip->mixer_volume[addr][1] != right;
756 chip->mixer_volume[addr][0] = left;
757 chip->mixer_volume[addr][1] = right;
758 spin_unlock_irqrestore(&chip->mixer_lock, flags);
759 return change;
760}
761
762#define SAA713x_CAPSRC(xname, xindex, addr) \
763{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
764 .info = snd_saa7134_capsrc_info, \
765 .get = snd_saa7134_capsrc_get, .put = snd_saa7134_capsrc_put, \
766 .private_value = addr }
767
768static int snd_saa7134_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
769{
770 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
771 uinfo->count = 2;
772 uinfo->value.integer.min = 0;
773 uinfo->value.integer.max = 1;
774 return 0;
775}
776
777static int snd_saa7134_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
778{
779 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
780 unsigned long flags;
781 int addr = kcontrol->private_value;
782
783 spin_lock_irqsave(&chip->mixer_lock, flags);
784 ucontrol->value.integer.value[0] = chip->capture_source[addr][0];
785 ucontrol->value.integer.value[1] = chip->capture_source[addr][1];
786 spin_unlock_irqrestore(&chip->mixer_lock, flags);
787 return 0;
788}
789
790static int snd_saa7134_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
791{
792 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
793 unsigned long flags;
794 int change, addr = kcontrol->private_value;
795 int left, right;
796 u32 anabar, xbarin;
797 int analog_io, rate;
798 struct saa7134_dev *dev;
799
800 dev = chip->saadev;
801
802 left = ucontrol->value.integer.value[0] & 1;
803 right = ucontrol->value.integer.value[1] & 1;
804 spin_lock_irqsave(&chip->mixer_lock, flags);
805
806 change = chip->capture_source[addr][0] != left ||
807 chip->capture_source[addr][1] != right;
808 chip->capture_source[addr][0] = left;
809 chip->capture_source[addr][1] = right;
810 dev->dmasound.input=addr;
811 spin_unlock_irqrestore(&chip->mixer_lock, flags);
812
813
814 if (change) {
815 switch (dev->pci->device) {
816
817 case PCI_DEVICE_ID_PHILIPS_SAA7134:
818 switch (addr) {
819 case MIXER_ADDR_TVTUNER:
820 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0xc0);
821 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x00);
822 break;
823 case MIXER_ADDR_LINE1:
824 case MIXER_ADDR_LINE2:
825 analog_io = (MIXER_ADDR_LINE1 == addr) ? 0x00 : 0x08;
826 rate = (32000 == dev->dmasound.rate) ? 0x01 : 0x03;
827 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io);
828 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80);
829 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate);
830 break;
831 }
832
833 break;
834 case PCI_DEVICE_ID_PHILIPS_SAA7133:
835 case PCI_DEVICE_ID_PHILIPS_SAA7135:
836 xbarin = 0x03; // adc
837 anabar = 0;
838 switch (addr) {
839 case MIXER_ADDR_TVTUNER:
840 xbarin = 0; // Demodulator
841 anabar = 2; // DACs
842 break;
843 case MIXER_ADDR_LINE1:
844 anabar = 0; // aux1, aux1
845 break;
846 case MIXER_ADDR_LINE2:
847 anabar = 9; // aux2, aux2
848 break;
849 }
850
851 /* output xbar always main channel */
852 saa_dsp_writel(dev, SAA7133_DIGITAL_OUTPUT_SEL1, 0xbbbb10);
853
854 if (left || right) { // We've got data, turn the input on
855 saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1, xbarin);
856 saa_writel(SAA7133_ANALOG_IO_SELECT, anabar);
857 } else {
858 saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1, 0);
859 saa_writel(SAA7133_ANALOG_IO_SELECT, 0);
860 }
861 break;
862 }
863 }
864
865 return change;
866}
867
868static snd_kcontrol_new_t snd_saa7134_controls[] = {
869SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER),
870SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER),
871SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1),
872SAA713x_CAPSRC("Line Capture Switch", 1, MIXER_ADDR_LINE1),
873SAA713x_VOLUME("Line Volume", 2, MIXER_ADDR_LINE2),
874SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2),
875};
876
877/*
878 * ALSA mixer setup
879 *
880 * Called when initializing the board. Sets up the name and hooks up
881 * the callbacks
882 *
883 */
884
885static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
886{
887 snd_card_t *card = chip->card;
888 unsigned int idx;
889 int err;
890
891 snd_assert(chip != NULL, return -EINVAL);
892 strcpy(card->mixername, "SAA7134 Mixer");
893
894 for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_controls); idx++) {
895 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_saa7134_controls[idx], chip))) < 0)
896 return err;
897 }
898 return 0;
899}
900
901static int snd_saa7134_free(snd_card_saa7134_t *chip)
902{
903 return 0;
904}
905
906static int snd_saa7134_dev_free(snd_device_t *device)
907{
908 snd_card_saa7134_t *chip = device->device_data;
909 return snd_saa7134_free(chip);
910}
911
912/*
913 * ALSA initialization
914 *
915 * Called by saa7134-core, it creates the basic structures and registers
916 * the ALSA devices
917 *
918 */
919
920int alsa_card_saa7134_create (struct saa7134_dev *saadev)
921{
922 static int dev;
923
924 snd_card_t *card;
925 snd_card_saa7134_t *chip;
926 int err;
927 static snd_device_ops_t ops = {
928 .dev_free = snd_saa7134_dev_free,
929 };
930
931
932 if (dev >= SNDRV_CARDS)
933 return -ENODEV;
934 if (!enable[dev])
935 return -ENODEV;
936
937 card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
938
939 if (card == NULL)
940 return -ENOMEM;
941
942 strcpy(card->driver, "SAA7134");
943
944 /* Card "creation" */
945
946 chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
947 if (chip == NULL) {
948 return -ENOMEM;
949 }
950
951 spin_lock_init(&chip->lock);
952 spin_lock_init(&chip->mixer_lock);
953
954 chip->saadev = saadev;
955
956 chip->card = card;
957
958 chip->pci = saadev->pci;
959 chip->irq = saadev->pci->irq;
960 chip->iobase = pci_resource_start(saadev->pci, 0);
961
962 err = request_irq(saadev->pci->irq, saa7134_alsa_irq,
963 SA_SHIRQ | SA_INTERRUPT, saadev->name, saadev);
964
965 if (err < 0) {
966 printk(KERN_ERR "%s: can't get IRQ %d for ALSA\n",
967 saadev->name, saadev->pci->irq);
968 goto __nodev;
969 }
970
971 if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
972 goto __nodev;
973 }
974
975 if ((err = snd_card_saa7134_new_mixer(chip)) < 0)
976 goto __nodev;
977
978 if ((err = snd_card_saa7134_pcm(chip, 0)) < 0)
979 goto __nodev;
980
981 snd_card_set_dev(card, &chip->pci->dev);
982
983 /* End of "creation" */
984
985 strcpy(card->shortname, "SAA7134");
986 sprintf(card->longname, "%s at 0x%lx irq %d",
987 chip->saadev->name, chip->iobase, chip->irq);
988
989 if ((err = snd_card_register(card)) == 0) {
990 snd_saa7134_cards[dev] = card;
991 return 0;
992 }
993
994__nodev:
995 snd_card_free(card);
996 kfree(chip);
997 return err;
998}
999
1000/*
1001 * Module initializer
1002 *
1003 * Loops through present saa7134 cards, and assigns an ALSA device
1004 * to each one
1005 *
1006 */
1007
1008static int saa7134_alsa_init(void)
1009{
1010 struct saa7134_dev *saadev = NULL;
1011 struct list_head *list;
1012
1013 printk(KERN_INFO "saa7134 ALSA driver for DMA sound loaded\n");
1014
1015 list_for_each(list,&saa7134_devlist) {
1016 saadev = list_entry(list, struct saa7134_dev, devlist);
1017 alsa_card_saa7134_create(saadev);
1018 }
1019
1020 if (saadev == NULL)
1021 printk(KERN_INFO "saa7134 ALSA: no saa7134 cards found\n");
1022
1023 return 0;
1024
1025}
1026
1027/*
1028 * Module destructor
1029 */
1030
1031void saa7134_alsa_exit(void)
1032{
1033 int idx;
1034
1035 for (idx = 0; idx < SNDRV_CARDS; idx++) {
1036 snd_card_free(snd_saa7134_cards[idx]);
1037 }
1038
1039 printk(KERN_INFO "saa7134 ALSA driver for DMA sound unloaded\n");
1040
1041 return;
1042}
1043
1044module_init(saa7134_alsa_init);
1045module_exit(saa7134_alsa_exit);
1046MODULE_LICENSE("GPL");
1047MODULE_AUTHOR("Ricardo Cerqueira");
diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
index acc7a4335e23..663d03e5bc67 100644
--- a/drivers/media/video/saa7134/saa7134-cards.c
+++ b/drivers/media/video/saa7134/saa7134-cards.c
@@ -191,10 +191,14 @@ struct saa7134_board saa7134_boards[] = {
191 .amux = TV, 191 .amux = TV,
192 .tv = 1, 192 .tv = 1,
193 },{ 193 },{
194 .name = name_comp1, 194 .name = name_comp1, /* Composite signal on S-Video input */
195 .vmux = 0, 195 .vmux = 0,
196 .amux = LINE2, 196 .amux = LINE2,
197 },{ 197 },{
198 .name = name_comp2, /* Composite input */
199 .vmux = 3,
200 .amux = LINE2,
201 },{
198 .name = name_svideo, 202 .name = name_svideo,
199 .vmux = 8, 203 .vmux = 8,
200 .amux = LINE2, 204 .amux = LINE2,
@@ -2109,8 +2113,423 @@ struct saa7134_board saa7134_boards[] = {
2109 .gpio = 0x01, 2113 .gpio = 0x01,
2110 }, 2114 },
2111 }, 2115 },
2112}; 2116 [SAA7134_BOARD_BEHOLD_409FM] = {
2117 /* <http://tuner.beholder.ru>, Sergey <skiv@orel.ru> */
2118 .name = "Beholder BeholdTV 409 FM",
2119 .audio_clock = 0x00187de7,
2120 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
2121 .radio_type = UNSET,
2122 .tuner_addr = ADDR_UNSET,
2123 .radio_addr = ADDR_UNSET,
2124 .tda9887_conf = TDA9887_PRESENT,
2125 .inputs = {{
2126 .name = name_tv,
2127 .vmux = 3,
2128 .amux = TV,
2129 .tv = 1,
2130 },{
2131 .name = name_comp1,
2132 .vmux = 1,
2133 .amux = LINE1,
2134 },{
2135 .name = name_svideo,
2136 .vmux = 8,
2137 .amux = LINE1,
2138 }},
2139 .radio = {
2140 .name = name_radio,
2141 .amux = LINE2,
2142 },
2143 },
2144 [SAA7134_BOARD_GOTVIEW_7135] = {
2145 /* Mike Baikov <mike@baikov.com> */
2146 /* Andrey Cvetcov <ays14@yandex.ru> */
2147 .name = "GoTView 7135 PCI",
2148 .audio_clock = 0x00187de7,
2149 .tuner_type = TUNER_PHILIPS_FM1216ME_MK3,
2150 .radio_type = UNSET,
2151 .tuner_addr = ADDR_UNSET,
2152 .radio_addr = ADDR_UNSET,
2153 .tda9887_conf = TDA9887_PRESENT,
2154 .gpiomask = 0x00200003,
2155 .inputs = {{
2156 .name = name_tv,
2157 .vmux = 1,
2158 .amux = TV,
2159 .tv = 1,
2160 .gpio = 0x00200003,
2161 },{
2162 .name = name_tv_mono,
2163 .vmux = 1,
2164 .amux = LINE2,
2165 .gpio = 0x00200003,
2166 },{
2167 .name = name_comp1,
2168 .vmux = 3,
2169 .amux = LINE1,
2170 .gpio = 0x00200003,
2171 },{
2172 .name = name_svideo,
2173 .vmux = 8,
2174 .amux = LINE1,
2175 .gpio = 0x00200003,
2176 }},
2177 .radio = {
2178 .name = name_radio,
2179 .amux = LINE2,
2180 .gpio = 0x00200003,
2181 },
2182 .mute = {
2183 .name = name_mute,
2184 .amux = TV,
2185 .gpio = 0x00200003,
2186 },
2187 },
2188 [SAA7134_BOARD_PHILIPS_EUROPA] = {
2189 .name = "Philips EUROPA V3 reference design",
2190 .audio_clock = 0x00187de7,
2191 .tuner_type = TUNER_PHILIPS_TD1316,
2192 .radio_type = UNSET,
2193 .tuner_addr = 0x61,
2194 .radio_addr = ADDR_UNSET,
2195 .tda9887_conf = TDA9887_PRESENT,
2196 .mpeg = SAA7134_MPEG_DVB,
2197 .inputs = {{
2198 .name = name_tv,
2199 .vmux = 3,
2200 .amux = TV,
2201 .tv = 1,
2202 },{
2203 .name = name_comp1,
2204 .vmux = 0,
2205 .amux = LINE2,
2206 },{
2207 .name = name_svideo,
2208 .vmux = 8,
2209 .amux = LINE2,
2210 }},
2211 },
2212 [SAA7134_BOARD_VIDEOMATE_DVBT_300] = {
2213 .name = "Compro Videomate DVB-T300",
2214 .audio_clock = 0x00187de7,
2215 .tuner_type = TUNER_PHILIPS_TD1316,
2216 .radio_type = UNSET,
2217 .tuner_addr = 0x61,
2218 .radio_addr = ADDR_UNSET,
2219 .tda9887_conf = TDA9887_PRESENT,
2220 .mpeg = SAA7134_MPEG_DVB,
2221 .inputs = {{
2222 .name = name_tv,
2223 .vmux = 3,
2224 .amux = TV,
2225 .tv = 1,
2226 },{
2227 .name = name_comp1,
2228 .vmux = 1,
2229 .amux = LINE2,
2230 },{
2231 .name = name_svideo,
2232 .vmux = 8,
2233 .amux = LINE2,
2234 }},
2235 },
2236 [SAA7134_BOARD_VIDEOMATE_DVBT_200] = {
2237 .name = "Compro Videomate DVB-T200",
2238 .tuner_type = TUNER_ABSENT,
2239 .audio_clock = 0x00187de7,
2240 .radio_type = UNSET,
2241 .tuner_addr = ADDR_UNSET,
2242 .radio_addr = ADDR_UNSET,
2243 .mpeg = SAA7134_MPEG_DVB,
2244 .inputs = {{
2245 .name = name_comp1,
2246 .vmux = 0,
2247 .amux = LINE1,
2248 },{
2249 .name = name_svideo,
2250 .vmux = 8,
2251 .amux = LINE1,
2252 }},
2253 },
2254 [SAA7134_BOARD_RTD_VFG7350] = {
2255 .name = "RTD Embedded Technologies VFG7350",
2256 .audio_clock = 0x00200000,
2257 .tuner_type = TUNER_ABSENT,
2258 .radio_type = UNSET,
2259 .tuner_addr = ADDR_UNSET,
2260 .radio_addr = ADDR_UNSET,
2261 .inputs = {{
2262 .name = "Composite 0",
2263 .vmux = 0,
2264 .amux = LINE1,
2265 },{
2266 .name = "Composite 1",
2267 .vmux = 1,
2268 .amux = LINE2,
2269 },{
2270 .name = "Composite 2",
2271 .vmux = 2,
2272 .amux = LINE1,
2273 },{
2274 .name = "Composite 3",
2275 .vmux = 3,
2276 .amux = LINE2,
2277 },{
2278 .name = "S-Video 0",
2279 .vmux = 8,
2280 .amux = LINE1,
2281 },{
2282 .name = "S-Video 1",
2283 .vmux = 9,
2284 .amux = LINE2,
2285 }},
2286 .mpeg = SAA7134_MPEG_EMPRESS,
2287 .video_out = CCIR656,
2288 .vid_port_opts = ( SET_T_CODE_POLARITY_NON_INVERTED |
2289 SET_CLOCK_NOT_DELAYED |
2290 SET_CLOCK_INVERTED |
2291 SET_VSYNC_OFF ),
2292 },
2293 [SAA7134_BOARD_RTD_VFG7330] = {
2294 .name = "RTD Embedded Technologies VFG7330",
2295 .audio_clock = 0x00200000,
2296 .tuner_type = TUNER_ABSENT,
2297 .radio_type = UNSET,
2298 .tuner_addr = ADDR_UNSET,
2299 .radio_addr = ADDR_UNSET,
2300 .inputs = {{
2301 .name = "Composite 0",
2302 .vmux = 0,
2303 .amux = LINE1,
2304 },{
2305 .name = "Composite 1",
2306 .vmux = 1,
2307 .amux = LINE2,
2308 },{
2309 .name = "Composite 2",
2310 .vmux = 2,
2311 .amux = LINE1,
2312 },{
2313 .name = "Composite 3",
2314 .vmux = 3,
2315 .amux = LINE2,
2316 },{
2317 .name = "S-Video 0",
2318 .vmux = 8,
2319 .amux = LINE1,
2320 },{
2321 .name = "S-Video 1",
2322 .vmux = 9,
2323 .amux = LINE2,
2324 }},
2325 },
2326 [SAA7134_BOARD_FLYTVPLATINUM_MINI2] = {
2327 .name = "LifeView FlyTV Platinum Mini2",
2328 .audio_clock = 0x00200000,
2329 .tuner_type = TUNER_PHILIPS_TDA8290,
2330 .radio_type = UNSET,
2331 .tuner_addr = ADDR_UNSET,
2332 .radio_addr = ADDR_UNSET,
2113 2333
2334 .inputs = {{
2335 .name = name_tv,
2336 .vmux = 1,
2337 .amux = TV,
2338 .tv = 1,
2339 },{
2340 .name = name_comp1, /* Composite signal on S-Video input */
2341 .vmux = 0,
2342 .amux = LINE2,
2343 },{
2344 .name = name_comp2, /* Composite input */
2345 .vmux = 3,
2346 .amux = LINE2,
2347 },{
2348 .name = name_svideo,
2349 .vmux = 8,
2350 .amux = LINE2,
2351 }},
2352 },
2353 [SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180] = {
2354 /* Michael Krufky <mkrufky@m1k.net>
2355 * Uses Alps Electric TDHU2, containing NXT2004 ATSC Decoder
2356 * AFAIK, there is no analog demod, thus,
2357 * no support for analog television.
2358 */
2359 .name = "AVerMedia AVerTVHD MCE A180",
2360 .audio_clock = 0x00187de7,
2361 .tuner_type = TUNER_ABSENT,
2362 .radio_type = UNSET,
2363 .tuner_addr = ADDR_UNSET,
2364 .radio_addr = ADDR_UNSET,
2365 .mpeg = SAA7134_MPEG_DVB,
2366 .inputs = {{
2367 .name = name_comp1,
2368 .vmux = 3,
2369 .amux = LINE2,
2370 },{
2371 .name = name_svideo,
2372 .vmux = 8,
2373 .amux = LINE2,
2374 }},
2375 },
2376 [SAA7134_BOARD_MONSTERTV_MOBILE] = {
2377 .name = "SKNet MonsterTV Mobile",
2378 .audio_clock = 0x00187de7,
2379 .tuner_type = TUNER_PHILIPS_TDA8290,
2380 .radio_type = UNSET,
2381 .tuner_addr = ADDR_UNSET,
2382 .radio_addr = ADDR_UNSET,
2383
2384 .inputs = {{
2385 .name = name_tv,
2386 .vmux = 1,
2387 .amux = TV,
2388 .tv = 1,
2389 },{
2390 .name = name_comp1,
2391 .vmux = 3,
2392 .amux = LINE1,
2393 },{
2394 .name = name_svideo,
2395 .vmux = 6,
2396 .amux = LINE1,
2397 }},
2398 },
2399 [SAA7134_BOARD_PINNACLE_PCTV_110i] = {
2400 .name = "Pinnacle PCTV 110i (saa7133)",
2401 .audio_clock = 0x00187de7,
2402 .tuner_type = TUNER_PHILIPS_TDA8290,
2403 .radio_type = UNSET,
2404 .tuner_addr = ADDR_UNSET,
2405 .radio_addr = ADDR_UNSET,
2406 .gpiomask = 0x080200000,
2407 .inputs = {{
2408 .name = name_tv,
2409 .vmux = 4,
2410 .amux = TV,
2411 .tv = 1,
2412 },{
2413 .name = name_comp1,
2414 .vmux = 1,
2415 .amux = LINE2,
2416 },{
2417 .name = name_svideo,
2418 .vmux = 8,
2419 .amux = LINE2,
2420 }},
2421 .radio = {
2422 .name = name_radio,
2423 .amux = LINE1,
2424 },
2425 },
2426 [SAA7134_BOARD_ASUSTeK_P7131_DUAL] = {
2427 .name = "ASUSTeK P7131 Dual",
2428 .audio_clock = 0x00187de7,
2429 .tuner_type = TUNER_PHILIPS_TDA8290,
2430 .radio_type = UNSET,
2431 .tuner_addr = ADDR_UNSET,
2432 .radio_addr = ADDR_UNSET,
2433 .gpiomask = 1 << 21,
2434 .mpeg = SAA7134_MPEG_DVB,
2435 .inputs = {{
2436 .name = name_tv,
2437 .vmux = 1,
2438 .amux = TV,
2439 .tv = 1,
2440 },{
2441 .name = name_comp1,
2442 .vmux = 3,
2443 .amux = LINE2,
2444 },{
2445 .name = name_svideo,
2446 .vmux = 8,
2447 .amux = LINE2,
2448 }},
2449 .radio = {
2450 .name = name_radio,
2451 .amux = TV,
2452 .gpio = 0x0200000,
2453 },
2454 },
2455 [SAA7134_BOARD_SEDNA_PC_TV_CARDBUS] = {
2456 /* Paul Tom Zalac <pzalac@gmail.com> */
2457 /* Pavel Mihaylov <bin@bash.info> */
2458 .name = "Sedna/MuchTV PC TV Cardbus TV/Radio (ITO25 Rev:2B)",
2459 /* Sedna/MuchTV (OEM) Cardbus TV Tuner */
2460 .audio_clock = 0x00187de7,
2461 .tuner_type = TUNER_PHILIPS_TDA8290,
2462 .radio_type = UNSET,
2463 .tuner_addr = ADDR_UNSET,
2464 .radio_addr = ADDR_UNSET,
2465 .gpiomask = 0xe880c0,
2466 .inputs = {{
2467 .name = name_tv,
2468 .vmux = 3,
2469 .amux = TV,
2470 .tv = 1,
2471 },{
2472 .name = name_comp1,
2473 .vmux = 1,
2474 .amux = LINE1,
2475 },{
2476 .name = name_svideo,
2477 .vmux = 6,
2478 .amux = LINE1,
2479 }},
2480 .radio = {
2481 .name = name_radio,
2482 .amux = LINE2,
2483 },
2484 },
2485 [SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV] = {
2486 /* "Cyril Lacoux (Yack)" <clacoux@ifeelgood.org> */
2487 .name = "ASUS Digimatrix TV",
2488 .audio_clock = 0x00200000,
2489 .tuner_type = TUNER_PHILIPS_FQ1216ME,
2490 .tda9887_conf = TDA9887_PRESENT,
2491 .radio_type = UNSET,
2492 .tuner_addr = ADDR_UNSET,
2493 .radio_addr = ADDR_UNSET,
2494 .inputs = {{
2495 .name = name_tv,
2496 .vmux = 1,
2497 .amux = TV,
2498 .tv = 1,
2499 },{
2500 .name = name_comp1,
2501 .vmux = 3,
2502 .amux = LINE1,
2503 },{
2504 .name = name_svideo,
2505 .vmux = 8,
2506 .amux = LINE1,
2507 }},
2508 },
2509 [SAA7134_BOARD_PHILIPS_TIGER] = {
2510 .name = "Philips Tiger reference design",
2511 .audio_clock = 0x00187de7,
2512 .tuner_type = TUNER_PHILIPS_TDA8290,
2513 .radio_type = UNSET,
2514 .tuner_addr = ADDR_UNSET,
2515 .radio_addr = ADDR_UNSET,
2516 .mpeg = SAA7134_MPEG_DVB,
2517 .inputs = {{
2518 .name = name_tv,
2519 .vmux = 1,
2520 .amux = TV,
2521 .tv = 1,
2522 },{
2523 .name = name_comp1,
2524 .vmux = 3,
2525 .amux = LINE1,
2526 },{
2527 .name = name_svideo,
2528 .vmux = 8,
2529 .amux = LINE1,
2530 }},
2531 },
2532};
2114 2533
2115const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards); 2534const unsigned int saa7134_bcount = ARRAY_SIZE(saa7134_boards);
2116 2535
@@ -2145,19 +2564,19 @@ struct pci_device_id saa7134_pci_tbl[] = {
2145 },{ 2564 },{
2146 .vendor = PCI_VENDOR_ID_PHILIPS, 2565 .vendor = PCI_VENDOR_ID_PHILIPS,
2147 .device = PCI_DEVICE_ID_PHILIPS_SAA7134, 2566 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
2148 .subvendor = 0x153B, 2567 .subvendor = 0x153b,
2149 .subdevice = 0x1142, 2568 .subdevice = 0x1142,
2150 .driver_data = SAA7134_BOARD_CINERGY400, 2569 .driver_data = SAA7134_BOARD_CINERGY400,
2151 },{ 2570 },{
2152 .vendor = PCI_VENDOR_ID_PHILIPS, 2571 .vendor = PCI_VENDOR_ID_PHILIPS,
2153 .device = PCI_DEVICE_ID_PHILIPS_SAA7134, 2572 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
2154 .subvendor = 0x153B, 2573 .subvendor = 0x153b,
2155 .subdevice = 0x1143, 2574 .subdevice = 0x1143,
2156 .driver_data = SAA7134_BOARD_CINERGY600, 2575 .driver_data = SAA7134_BOARD_CINERGY600,
2157 },{ 2576 },{
2158 .vendor = PCI_VENDOR_ID_PHILIPS, 2577 .vendor = PCI_VENDOR_ID_PHILIPS,
2159 .device = PCI_DEVICE_ID_PHILIPS_SAA7134, 2578 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
2160 .subvendor = 0x153B, 2579 .subvendor = 0x153b,
2161 .subdevice = 0x1158, 2580 .subdevice = 0x1158,
2162 .driver_data = SAA7134_BOARD_CINERGY600_MK3, 2581 .driver_data = SAA7134_BOARD_CINERGY600_MK3,
2163 },{ 2582 },{
@@ -2193,6 +2612,18 @@ struct pci_device_id saa7134_pci_tbl[] = {
2193 },{ 2612 },{
2194 .vendor = PCI_VENDOR_ID_PHILIPS, 2613 .vendor = PCI_VENDOR_ID_PHILIPS,
2195 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 2614 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2615 .subvendor = 0x14c0,
2616 .subdevice = 0x1212, /* minipci, LR1212 */
2617 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI2,
2618 },{
2619 .vendor = PCI_VENDOR_ID_PHILIPS,
2620 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2621 .subvendor = 0x4e42,
2622 .subdevice = 0x0212, /* OEM minipci, LR212 */
2623 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_MINI,
2624 },{
2625 .vendor = PCI_VENDOR_ID_PHILIPS,
2626 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2196 .subvendor = 0x5168, /* Animation Technologies (LifeView) */ 2627 .subvendor = 0x5168, /* Animation Technologies (LifeView) */
2197 .subdevice = 0x0214, /* Standard PCI, LR214WF */ 2628 .subdevice = 0x0214, /* Standard PCI, LR214WF */
2198 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM, 2629 .driver_data = SAA7134_BOARD_FLYTVPLATINUM_FM,
@@ -2369,7 +2800,7 @@ struct pci_device_id saa7134_pci_tbl[] = {
2369 },{ 2800 },{
2370 .vendor = PCI_VENDOR_ID_PHILIPS, 2801 .vendor = PCI_VENDOR_ID_PHILIPS,
2371 .device = PCI_DEVICE_ID_PHILIPS_SAA7130, 2802 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
2372 .subvendor = 0x153B, 2803 .subvendor = 0x153b,
2373 .subdevice = 0x1152, 2804 .subdevice = 0x1152,
2374 .driver_data = SAA7134_BOARD_CINERGY200, 2805 .driver_data = SAA7134_BOARD_CINERGY200,
2375 },{ 2806 },{
@@ -2434,13 +2865,18 @@ struct pci_device_id saa7134_pci_tbl[] = {
2434 .subvendor = 0x1421, 2865 .subvendor = 0x1421,
2435 .subdevice = 0x0350, /* PCI version */ 2866 .subdevice = 0x0350, /* PCI version */
2436 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV, 2867 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV,
2437
2438 },{ 2868 },{
2439 .vendor = PCI_VENDOR_ID_PHILIPS, 2869 .vendor = PCI_VENDOR_ID_PHILIPS,
2440 .device = PCI_DEVICE_ID_PHILIPS_SAA7133, 2870 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2441 .subvendor = 0x1421, 2871 .subvendor = 0x1421,
2442 .subdevice = 0x0370, /* cardbus version */ 2872 .subdevice = 0x0370, /* cardbus version */
2443 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV, 2873 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV,
2874 },{
2875 .vendor = PCI_VENDOR_ID_PHILIPS,
2876 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2877 .subvendor = 0x1421,
2878 .subdevice = 0x1370, /* cardbus version */
2879 .driver_data = SAA7134_BOARD_ADS_INSTANT_TV,
2444 2880
2445 },{ /* Typhoon DVB-T Duo Digital/Analog Cardbus */ 2881 },{ /* Typhoon DVB-T Duo Digital/Analog Cardbus */
2446 .vendor = PCI_VENDOR_ID_PHILIPS, 2882 .vendor = PCI_VENDOR_ID_PHILIPS,
@@ -2459,9 +2895,81 @@ struct pci_device_id saa7134_pci_tbl[] = {
2459 .device = PCI_DEVICE_ID_PHILIPS_SAA7134, 2895 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
2460 .subvendor = 0x1043, 2896 .subvendor = 0x1043,
2461 .subdevice = 0x0210, /* mini pci PAL/SECAM version */ 2897 .subdevice = 0x0210, /* mini pci PAL/SECAM version */
2462 .driver_data = SAA7134_BOARD_FLYTV_DIGIMATRIX, 2898 .driver_data = SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV,
2463 2899
2464 },{ 2900 },{
2901 .vendor = PCI_VENDOR_ID_PHILIPS,
2902 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2903 .subvendor = 0x0000, /* It shouldn't break anything, since subdevice id seems unique */
2904 .subdevice = 0x4091,
2905 .driver_data = SAA7134_BOARD_BEHOLD_409FM,
2906 },{
2907 .vendor = PCI_VENDOR_ID_PHILIPS,
2908 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2909 .subvendor = 0x5456, /* GoTView */
2910 .subdevice = 0x7135,
2911 .driver_data = SAA7134_BOARD_GOTVIEW_7135,
2912 },{
2913 .vendor = PCI_VENDOR_ID_PHILIPS,
2914 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
2915 .subvendor = PCI_VENDOR_ID_PHILIPS,
2916 .subdevice = 0x2004,
2917 .driver_data = SAA7134_BOARD_PHILIPS_EUROPA,
2918 },{
2919 .vendor = PCI_VENDOR_ID_PHILIPS,
2920 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
2921 .subvendor = 0x185b,
2922 .subdevice = 0xc900,
2923 .driver_data = SAA7134_BOARD_VIDEOMATE_DVBT_300,
2924 },{
2925 .vendor = PCI_VENDOR_ID_PHILIPS,
2926 .device = PCI_DEVICE_ID_PHILIPS_SAA7130,
2927 .subvendor = 0x185b,
2928 .subdevice = 0xc901,
2929 .driver_data = SAA7134_BOARD_VIDEOMATE_DVBT_200,
2930 },{
2931 .vendor = PCI_VENDOR_ID_PHILIPS,
2932 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2933 .subvendor = 0x1435,
2934 .subdevice = 0x7350,
2935 .driver_data = SAA7134_BOARD_RTD_VFG7350,
2936 },{
2937 .vendor = PCI_VENDOR_ID_PHILIPS,
2938 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2939 .subvendor = 0x1435,
2940 .subdevice = 0x7330,
2941 .driver_data = SAA7134_BOARD_RTD_VFG7330,
2942 },{
2943 .vendor = PCI_VENDOR_ID_PHILIPS,
2944 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2945 .subvendor = 0x1461,
2946 .subdevice = 0x1044,
2947 .driver_data = SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180,
2948 },{
2949 .vendor = PCI_VENDOR_ID_PHILIPS,
2950 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2951 .subvendor = 0x1131,
2952 .subdevice = 0x4ee9,
2953 .driver_data = SAA7134_BOARD_MONSTERTV_MOBILE,
2954 },{
2955 .vendor = PCI_VENDOR_ID_PHILIPS,
2956 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2957 .subvendor = 0x11bd,
2958 .subdevice = 0x002e,
2959 .driver_data = SAA7134_BOARD_PINNACLE_PCTV_110i,
2960 },{
2961 .vendor = PCI_VENDOR_ID_PHILIPS,
2962 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2963 .subvendor = 0x1043,
2964 .subdevice = 0x4862,
2965 .driver_data = SAA7134_BOARD_ASUSTeK_P7131_DUAL,
2966 },{
2967 .vendor = PCI_VENDOR_ID_PHILIPS,
2968 .device = PCI_DEVICE_ID_PHILIPS_SAA7133,
2969 .subvendor = PCI_VENDOR_ID_PHILIPS,
2970 .subdevice = 0x2018,
2971 .driver_data = SAA7134_BOARD_PHILIPS_TIGER,
2972 },{
2465 /* --- boards without eeprom + subsystem ID --- */ 2973 /* --- boards without eeprom + subsystem ID --- */
2466 .vendor = PCI_VENDOR_ID_PHILIPS, 2974 .vendor = PCI_VENDOR_ID_PHILIPS,
2467 .device = PCI_DEVICE_ID_PHILIPS_SAA7134, 2975 .device = PCI_DEVICE_ID_PHILIPS_SAA7134,
@@ -2530,9 +3038,10 @@ int saa7134_board_init1(struct saa7134_dev *dev)
2530 switch (dev->board) { 3038 switch (dev->board) {
2531 case SAA7134_BOARD_FLYVIDEO2000: 3039 case SAA7134_BOARD_FLYVIDEO2000:
2532 case SAA7134_BOARD_FLYVIDEO3000: 3040 case SAA7134_BOARD_FLYVIDEO3000:
2533 dev->has_remote = 1; 3041 dev->has_remote = SAA7134_REMOTE_GPIO;
2534 board_flyvideo(dev); 3042 board_flyvideo(dev);
2535 break; 3043 break;
3044 case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
2536 case SAA7134_BOARD_FLYTVPLATINUM_FM: 3045 case SAA7134_BOARD_FLYTVPLATINUM_FM:
2537 case SAA7134_BOARD_CINERGY400: 3046 case SAA7134_BOARD_CINERGY400:
2538 case SAA7134_BOARD_CINERGY600: 3047 case SAA7134_BOARD_CINERGY600:
@@ -2550,10 +3059,16 @@ int saa7134_board_init1(struct saa7134_dev *dev)
2550/* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */ 3059/* case SAA7134_BOARD_SABRENT_SBTTVFM: */ /* not finished yet */
2551 case SAA7134_BOARD_VIDEOMATE_TV_PVR: 3060 case SAA7134_BOARD_VIDEOMATE_TV_PVR:
2552 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII: 3061 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:
3062 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
3063 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
2553 case SAA7134_BOARD_MANLI_MTV001: 3064 case SAA7134_BOARD_MANLI_MTV001:
2554 case SAA7134_BOARD_MANLI_MTV002: 3065 case SAA7134_BOARD_MANLI_MTV002:
3066 case SAA7134_BOARD_BEHOLD_409FM:
2555 case SAA7134_BOARD_AVACSSMARTTV: 3067 case SAA7134_BOARD_AVACSSMARTTV:
2556 dev->has_remote = 1; 3068 case SAA7134_BOARD_GOTVIEW_7135:
3069 case SAA7134_BOARD_KWORLD_TERMINATOR:
3070 case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS:
3071 dev->has_remote = SAA7134_REMOTE_GPIO;
2557 break; 3072 break;
2558 case SAA7134_BOARD_MD5044: 3073 case SAA7134_BOARD_MD5044:
2559 printk("%s: seems there are two different versions of the MD5044\n" 3074 printk("%s: seems there are two different versions of the MD5044\n"
@@ -2565,11 +3080,14 @@ int saa7134_board_init1(struct saa7134_dev *dev)
2565 /* power-up tuner chip */ 3080 /* power-up tuner chip */
2566 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000); 3081 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000);
2567 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000); 3082 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000000);
2568 msleep(1); 3083 case SAA7134_BOARD_MONSTERTV_MOBILE:
3084 /* power-up tuner chip */
3085 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, 0x00040000, 0x00040000);
3086 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0x00040000, 0x00000004);
2569 break; 3087 break;
2570 case SAA7134_BOARD_FLYDVBTDUO: 3088 case SAA7134_BOARD_FLYDVBTDUO:
2571 case SAA7134_BOARD_THYPHOON_DVBT_DUO_CARDBUS: 3089 case SAA7134_BOARD_THYPHOON_DVBT_DUO_CARDBUS:
2572 /* turn the fan on Hac: static for the time being */ 3090 /* turn the fan on */
2573 saa_writeb(SAA7134_GPIO_GPMODE3, 0x08); 3091 saa_writeb(SAA7134_GPIO_GPMODE3, 0x08);
2574 saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x06); 3092 saa_writeb(SAA7134_GPIO_GPSTATUS3, 0x06);
2575 break; 3093 break;
@@ -2579,6 +3097,22 @@ int saa7134_board_init1(struct saa7134_dev *dev)
2579 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff); 3097 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, 0xffffffff, 0xffffffff);
2580 msleep(1); 3098 msleep(1);
2581 break; 3099 break;
3100 case SAA7134_BOARD_RTD_VFG7350:
3101
3102 /*
3103 * Make sure Production Test Register at offset 0x1D1 is cleared
3104 * to take chip out of test mode. Clearing bit 4 (TST_EN_AOUT)
3105 * prevents pin 105 from remaining low; keeping pin 105 low
3106 * continually resets the SAA6752 chip.
3107 */
3108
3109 saa_writeb (SAA7134_PRODUCTION_TEST_MODE, 0x00);
3110 break;
3111 /* i2c remotes */
3112 case SAA7134_BOARD_PINNACLE_PCTV_110i:
3113 case SAA7134_BOARD_UPMOST_PURPLE_TV:
3114 dev->has_remote = SAA7134_REMOTE_I2C;
3115 break;
2582 } 3116 }
2583 return 0; 3117 return 0;
2584} 3118}
@@ -2613,7 +3147,7 @@ int saa7134_board_init2(struct saa7134_dev *dev)
2613 saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR, &tun_setup); 3147 saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR, &tun_setup);
2614 } 3148 }
2615 break; 3149 break;
2616case SAA7134_BOARD_MD7134: 3150 case SAA7134_BOARD_MD7134:
2617 { 3151 {
2618 struct tuner_setup tun_setup; 3152 struct tuner_setup tun_setup;
2619 u8 subaddr; 3153 u8 subaddr;
@@ -2680,6 +3214,33 @@ case SAA7134_BOARD_MD7134:
2680 saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup); 3214 saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup);
2681 } 3215 }
2682 break; 3216 break;
3217 case SAA7134_BOARD_PHILIPS_EUROPA:
3218 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
3219 /* The Philips EUROPA based hybrid boards have the tuner connected through
3220 * the channel decoder. We have to make it transparent to find it
3221 */
3222 {
3223 struct tuner_setup tun_setup;
3224 u8 data[] = { 0x07, 0x02};
3225 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
3226 i2c_transfer(&dev->i2c_adap, &msg, 1);
3227
3228 tun_setup.mode_mask = T_ANALOG_TV | T_DIGITAL_TV;
3229 tun_setup.type = dev->tuner_type;
3230 tun_setup.addr = dev->tuner_addr;
3231
3232 saa7134_i2c_call_clients (dev, TUNER_SET_TYPE_ADDR,&tun_setup);
3233 }
3234 break;
3235 case SAA7134_BOARD_PHILIPS_TIGER:
3236 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
3237 /* this is a hybrid board, initialize to analog mode */
3238 {
3239 u8 data[] = { 0x3c, 0x33, 0x68};
3240 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
3241 i2c_transfer(&dev->i2c_adap, &msg, 1);
3242 }
3243 break;
2683 } 3244 }
2684 return 0; 3245 return 0;
2685} 3246}
diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
index e5e36f3c6250..19b88744fb31 100644
--- a/drivers/media/video/saa7134/saa7134-core.c
+++ b/drivers/media/video/saa7134/saa7134-core.c
@@ -57,6 +57,10 @@ static unsigned int oss = 0;
57module_param(oss, int, 0444); 57module_param(oss, int, 0444);
58MODULE_PARM_DESC(oss,"register oss devices (default: no)"); 58MODULE_PARM_DESC(oss,"register oss devices (default: no)");
59 59
60static unsigned int alsa = 0;
61module_param(alsa, int, 0444);
62MODULE_PARM_DESC(alsa,"register alsa devices (default: no)");
63
60static unsigned int latency = UNSET; 64static unsigned int latency = UNSET;
61module_param(latency, int, 0444); 65module_param(latency, int, 0444);
62MODULE_PARM_DESC(latency,"pci latency timer"); 66MODULE_PARM_DESC(latency,"pci latency timer");
@@ -190,6 +194,7 @@ void saa7134_track_gpio(struct saa7134_dev *dev, char *msg)
190 194
191static int need_empress; 195static int need_empress;
192static int need_dvb; 196static int need_dvb;
197static int need_alsa;
193 198
194static int pending_call(struct notifier_block *self, unsigned long state, 199static int pending_call(struct notifier_block *self, unsigned long state,
195 void *module) 200 void *module)
@@ -197,10 +202,12 @@ static int pending_call(struct notifier_block *self, unsigned long state,
197 if (module != THIS_MODULE || state != MODULE_STATE_LIVE) 202 if (module != THIS_MODULE || state != MODULE_STATE_LIVE)
198 return NOTIFY_DONE; 203 return NOTIFY_DONE;
199 204
200 if (need_empress) 205 if (need_empress)
201 request_module("saa7134-empress"); 206 request_module("saa7134-empress");
202 if (need_dvb) 207 if (need_dvb)
203 request_module("saa7134-dvb"); 208 request_module("saa7134-dvb");
209 if (need_alsa)
210 request_module("saa7134-alsa");
204 return NOTIFY_DONE; 211 return NOTIFY_DONE;
205} 212}
206 213
@@ -275,8 +282,8 @@ unsigned long saa7134_buffer_base(struct saa7134_buf *buf)
275 282
276int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt) 283int saa7134_pgtable_alloc(struct pci_dev *pci, struct saa7134_pgtable *pt)
277{ 284{
278 __le32 *cpu; 285 __le32 *cpu;
279 dma_addr_t dma_addr; 286 dma_addr_t dma_addr;
280 287
281 cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr); 288 cpu = pci_alloc_consistent(pci, SAA7134_PGTABLE_SIZE, &dma_addr);
282 if (NULL == cpu) 289 if (NULL == cpu)
@@ -436,7 +443,7 @@ int saa7134_set_dmabits(struct saa7134_dev *dev)
436 ctrl |= SAA7134_MAIN_CTRL_TE0; 443 ctrl |= SAA7134_MAIN_CTRL_TE0;
437 irq |= SAA7134_IRQ1_INTE_RA0_1 | 444 irq |= SAA7134_IRQ1_INTE_RA0_1 |
438 SAA7134_IRQ1_INTE_RA0_0; 445 SAA7134_IRQ1_INTE_RA0_0;
439 cap = dev->video_q.curr->vb.field; 446 cap = dev->video_q.curr->vb.field;
440 } 447 }
441 448
442 /* video capture -- dma 1+2 (planar modes) */ 449 /* video capture -- dma 1+2 (planar modes) */
@@ -465,7 +472,7 @@ int saa7134_set_dmabits(struct saa7134_dev *dev)
465 } 472 }
466 473
467 /* audio capture -- dma 3 */ 474 /* audio capture -- dma 3 */
468 if (dev->oss.dma_running) { 475 if (dev->dmasound.dma_running) {
469 ctrl |= SAA7134_MAIN_CTRL_TE6; 476 ctrl |= SAA7134_MAIN_CTRL_TE6;
470 irq |= SAA7134_IRQ1_INTE_RA3_1 | 477 irq |= SAA7134_IRQ1_INTE_RA3_1 |
471 SAA7134_IRQ1_INTE_RA3_0; 478 SAA7134_IRQ1_INTE_RA3_0;
@@ -570,6 +577,17 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
570 dev->name); 577 dev->name);
571 goto out; 578 goto out;
572 } 579 }
580
581 /* If alsa support is active and we get a sound report, exit
582 and let the saa7134-alsa module deal with it */
583
584 if ((report & SAA7134_IRQ_REPORT_DONE_RA3) && alsa) {
585 if (irq_debug > 1)
586 printk(KERN_DEBUG "%s/irq: ignoring interrupt for ALSA\n",
587 dev->name);
588 goto out;
589 }
590
573 handled = 1; 591 handled = 1;
574 saa_writel(SAA7134_IRQ_REPORT,report); 592 saa_writel(SAA7134_IRQ_REPORT,report);
575 if (irq_debug) 593 if (irq_debug)
@@ -591,13 +609,17 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id, struct pt_regs *regs)
591 card_has_mpeg(dev)) 609 card_has_mpeg(dev))
592 saa7134_irq_ts_done(dev,status); 610 saa7134_irq_ts_done(dev,status);
593 611
594 if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) 612 if ((report & SAA7134_IRQ_REPORT_DONE_RA3)) {
595 saa7134_irq_oss_done(dev,status); 613 if (oss) {
614 saa7134_irq_oss_done(dev,status);
615 }
616 }
596 617
597 if ((report & (SAA7134_IRQ_REPORT_GPIO16 | 618 if ((report & (SAA7134_IRQ_REPORT_GPIO16 |
598 SAA7134_IRQ_REPORT_GPIO18)) && 619 SAA7134_IRQ_REPORT_GPIO18)) &&
599 dev->remote) 620 dev->remote)
600 saa7134_input_irq(dev); 621 saa7134_input_irq(dev);
622
601 } 623 }
602 624
603 if (10 == loop) { 625 if (10 == loop) {
@@ -636,7 +658,7 @@ static int saa7134_hwinit1(struct saa7134_dev *dev)
636 658
637 saa_writel(SAA7134_IRQ1, 0); 659 saa_writel(SAA7134_IRQ1, 0);
638 saa_writel(SAA7134_IRQ2, 0); 660 saa_writel(SAA7134_IRQ2, 0);
639 init_MUTEX(&dev->lock); 661 init_MUTEX(&dev->lock);
640 spin_lock_init(&dev->slock); 662 spin_lock_init(&dev->slock);
641 663
642 saa7134_track_gpio(dev,"pre-init"); 664 saa7134_track_gpio(dev,"pre-init");
@@ -646,14 +668,6 @@ static int saa7134_hwinit1(struct saa7134_dev *dev)
646 saa7134_ts_init1(dev); 668 saa7134_ts_init1(dev);
647 saa7134_input_init1(dev); 669 saa7134_input_init1(dev);
648 670
649 switch (dev->pci->device) {
650 case PCI_DEVICE_ID_PHILIPS_SAA7134:
651 case PCI_DEVICE_ID_PHILIPS_SAA7133:
652 case PCI_DEVICE_ID_PHILIPS_SAA7135:
653 saa7134_oss_init1(dev);
654 break;
655 }
656
657 /* RAM FIFO config */ 671 /* RAM FIFO config */
658 saa_writel(SAA7134_FIFO_SIZE, 0x08070503); 672 saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
659 saa_writel(SAA7134_THRESHOULD,0x02020202); 673 saa_writel(SAA7134_THRESHOULD,0x02020202);
@@ -668,6 +682,21 @@ static int saa7134_hwinit1(struct saa7134_dev *dev)
668 SAA7134_MAIN_CTRL_ESFE | 682 SAA7134_MAIN_CTRL_ESFE |
669 SAA7134_MAIN_CTRL_EBDAC); 683 SAA7134_MAIN_CTRL_EBDAC);
670 684
685 /*
686 * Initialize OSS _after_ enabling audio clock PLL and audio processing.
687 * OSS initialization writes to registers via the audio DSP; these
688 * writes will fail unless the audio clock has been started. At worst,
689 * audio will not work.
690 */
691
692 switch (dev->pci->device) {
693 case PCI_DEVICE_ID_PHILIPS_SAA7134:
694 case PCI_DEVICE_ID_PHILIPS_SAA7133:
695 case PCI_DEVICE_ID_PHILIPS_SAA7135:
696 saa7134_oss_init1(dev);
697 break;
698 }
699
671 /* enable peripheral devices */ 700 /* enable peripheral devices */
672 saa_writeb(SAA7134_SPECIAL_MODE, 0x01); 701 saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
673 702
@@ -687,7 +716,7 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
687 saa7134_tvaudio_init2(dev); 716 saa7134_tvaudio_init2(dev);
688 717
689 /* enable IRQ's */ 718 /* enable IRQ's */
690 irq2_mask = 719 irq2_mask =
691 SAA7134_IRQ2_INTE_DEC3 | 720 SAA7134_IRQ2_INTE_DEC3 |
692 SAA7134_IRQ2_INTE_DEC2 | 721 SAA7134_IRQ2_INTE_DEC2 |
693 SAA7134_IRQ2_INTE_DEC1 | 722 SAA7134_IRQ2_INTE_DEC1 |
@@ -695,10 +724,12 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
695 SAA7134_IRQ2_INTE_PE | 724 SAA7134_IRQ2_INTE_PE |
696 SAA7134_IRQ2_INTE_AR; 725 SAA7134_IRQ2_INTE_AR;
697 726
698 if (dev->has_remote) 727 if (dev->has_remote == SAA7134_REMOTE_GPIO)
699 irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18 | 728 irq2_mask |= (SAA7134_IRQ2_INTE_GPIO18 |
700 SAA7134_IRQ2_INTE_GPIO18A | 729 SAA7134_IRQ2_INTE_GPIO18A |
701 SAA7134_IRQ2_INTE_GPIO16 ); 730 SAA7134_IRQ2_INTE_GPIO16 );
731 else if (dev->has_remote == SAA7134_REMOTE_I2C)
732 request_module("ir-kbd-i2c");
702 733
703 saa_writel(SAA7134_IRQ1, 0); 734 saa_writel(SAA7134_IRQ1, 0);
704 saa_writel(SAA7134_IRQ2, irq2_mask); 735 saa_writel(SAA7134_IRQ2, irq2_mask);
@@ -872,8 +903,8 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
872 903
873 /* print pci info */ 904 /* print pci info */
874 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev); 905 pci_read_config_byte(pci_dev, PCI_CLASS_REVISION, &dev->pci_rev);
875 pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat); 906 pci_read_config_byte(pci_dev, PCI_LATENCY_TIMER, &dev->pci_lat);
876 printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, " 907 printk(KERN_INFO "%s: found at %s, rev: %d, irq: %d, "
877 "latency: %d, mmio: 0x%lx\n", dev->name, 908 "latency: %d, mmio: 0x%lx\n", dev->name,
878 pci_name(pci_dev), dev->pci_rev, pci_dev->irq, 909 pci_name(pci_dev), dev->pci_rev, pci_dev->irq,
879 dev->pci_lat,pci_resource_start(pci_dev,0)); 910 dev->pci_lat,pci_resource_start(pci_dev,0));
@@ -897,7 +928,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
897 dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf; 928 dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
898 if (UNSET != tuner[dev->nr]) 929 if (UNSET != tuner[dev->nr])
899 dev->tuner_type = tuner[dev->nr]; 930 dev->tuner_type = tuner[dev->nr];
900 printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n", 931 printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
901 dev->name,pci_dev->subsystem_vendor, 932 dev->name,pci_dev->subsystem_vendor,
902 pci_dev->subsystem_device,saa7134_boards[dev->board].name, 933 pci_dev->subsystem_device,saa7134_boards[dev->board].name,
903 dev->board, card[dev->nr] == dev->board ? 934 dev->board, card[dev->nr] == dev->board ?
@@ -947,14 +978,20 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
947 request_module("tuner"); 978 request_module("tuner");
948 if (dev->tda9887_conf) 979 if (dev->tda9887_conf)
949 request_module("tda9887"); 980 request_module("tda9887");
950 if (card_is_empress(dev)) { 981 if (card_is_empress(dev)) {
951 request_module("saa6752hs"); 982 request_module("saa6752hs");
952 request_module_depend("saa7134-empress",&need_empress); 983 request_module_depend("saa7134-empress",&need_empress);
953 } 984 }
954 985
955 if (card_is_dvb(dev)) 986 if (card_is_dvb(dev))
956 request_module_depend("saa7134-dvb",&need_dvb); 987 request_module_depend("saa7134-dvb",&need_dvb);
957 988
989 if (!oss && alsa) {
990 dprintk("Requesting ALSA module\n");
991 request_module_depend("saa7134-alsa",&need_alsa);
992 }
993
994
958 v4l2_prio_init(&dev->prio); 995 v4l2_prio_init(&dev->prio);
959 996
960 /* register v4l devices */ 997 /* register v4l devices */
@@ -993,22 +1030,22 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
993 case PCI_DEVICE_ID_PHILIPS_SAA7133: 1030 case PCI_DEVICE_ID_PHILIPS_SAA7133:
994 case PCI_DEVICE_ID_PHILIPS_SAA7135: 1031 case PCI_DEVICE_ID_PHILIPS_SAA7135:
995 if (oss) { 1032 if (oss) {
996 err = dev->oss.minor_dsp = 1033 err = dev->dmasound.minor_dsp =
997 register_sound_dsp(&saa7134_dsp_fops, 1034 register_sound_dsp(&saa7134_dsp_fops,
998 dsp_nr[dev->nr]); 1035 dsp_nr[dev->nr]);
999 if (err < 0) { 1036 if (err < 0) {
1000 goto fail4; 1037 goto fail4;
1001 } 1038 }
1002 printk(KERN_INFO "%s: registered device dsp%d\n", 1039 printk(KERN_INFO "%s: registered device dsp%d\n",
1003 dev->name,dev->oss.minor_dsp >> 4); 1040 dev->name,dev->dmasound.minor_dsp >> 4);
1004 1041
1005 err = dev->oss.minor_mixer = 1042 err = dev->dmasound.minor_mixer =
1006 register_sound_mixer(&saa7134_mixer_fops, 1043 register_sound_mixer(&saa7134_mixer_fops,
1007 mixer_nr[dev->nr]); 1044 mixer_nr[dev->nr]);
1008 if (err < 0) 1045 if (err < 0)
1009 goto fail5; 1046 goto fail5;
1010 printk(KERN_INFO "%s: registered device mixer%d\n", 1047 printk(KERN_INFO "%s: registered device mixer%d\n",
1011 dev->name,dev->oss.minor_mixer >> 4); 1048 dev->name,dev->dmasound.minor_mixer >> 4);
1012 } 1049 }
1013 break; 1050 break;
1014 } 1051 }
@@ -1035,7 +1072,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
1035 case PCI_DEVICE_ID_PHILIPS_SAA7133: 1072 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1036 case PCI_DEVICE_ID_PHILIPS_SAA7135: 1073 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1037 if (oss) 1074 if (oss)
1038 unregister_sound_dsp(dev->oss.minor_dsp); 1075 unregister_sound_dsp(dev->dmasound.minor_dsp);
1039 break; 1076 break;
1040 } 1077 }
1041 fail4: 1078 fail4:
@@ -1055,7 +1092,7 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
1055 1092
1056static void __devexit saa7134_finidev(struct pci_dev *pci_dev) 1093static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
1057{ 1094{
1058 struct saa7134_dev *dev = pci_get_drvdata(pci_dev); 1095 struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
1059 struct list_head *item; 1096 struct list_head *item;
1060 struct saa7134_mpeg_ops *mops; 1097 struct saa7134_mpeg_ops *mops;
1061 1098
@@ -1093,8 +1130,8 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
1093 case PCI_DEVICE_ID_PHILIPS_SAA7133: 1130 case PCI_DEVICE_ID_PHILIPS_SAA7133:
1094 case PCI_DEVICE_ID_PHILIPS_SAA7135: 1131 case PCI_DEVICE_ID_PHILIPS_SAA7135:
1095 if (oss) { 1132 if (oss) {
1096 unregister_sound_mixer(dev->oss.minor_mixer); 1133 unregister_sound_mixer(dev->dmasound.minor_mixer);
1097 unregister_sound_dsp(dev->oss.minor_dsp); 1134 unregister_sound_dsp(dev->dmasound.minor_dsp);
1098 } 1135 }
1099 break; 1136 break;
1100 } 1137 }
@@ -1149,10 +1186,10 @@ EXPORT_SYMBOL(saa7134_ts_unregister);
1149/* ----------------------------------------------------------- */ 1186/* ----------------------------------------------------------- */
1150 1187
1151static struct pci_driver saa7134_pci_driver = { 1188static struct pci_driver saa7134_pci_driver = {
1152 .name = "saa7134", 1189 .name = "saa7134",
1153 .id_table = saa7134_pci_tbl, 1190 .id_table = saa7134_pci_tbl,
1154 .probe = saa7134_initdev, 1191 .probe = saa7134_initdev,
1155 .remove = __devexit_p(saa7134_finidev), 1192 .remove = __devexit_p(saa7134_finidev),
1156}; 1193};
1157 1194
1158static int saa7134_init(void) 1195static int saa7134_init(void)
@@ -1188,6 +1225,13 @@ EXPORT_SYMBOL(saa7134_i2c_call_clients);
1188EXPORT_SYMBOL(saa7134_devlist); 1225EXPORT_SYMBOL(saa7134_devlist);
1189EXPORT_SYMBOL(saa7134_boards); 1226EXPORT_SYMBOL(saa7134_boards);
1190 1227
1228/* ----------------- For ALSA -------------------------------- */
1229
1230EXPORT_SYMBOL(saa7134_pgtable_free);
1231EXPORT_SYMBOL(saa7134_pgtable_build);
1232EXPORT_SYMBOL(saa7134_pgtable_alloc);
1233EXPORT_SYMBOL(saa7134_set_dmabits);
1234
1191/* ----------------------------------------------------------- */ 1235/* ----------------------------------------------------------- */
1192/* 1236/*
1193 * Local variables: 1237 * Local variables:
diff --git a/drivers/media/video/saa7134/saa7134-dvb.c b/drivers/media/video/saa7134/saa7134-dvb.c
index 639ae51a052d..e016480c3468 100644
--- a/drivers/media/video/saa7134/saa7134-dvb.c
+++ b/drivers/media/video/saa7134/saa7134-dvb.c
@@ -29,7 +29,6 @@
29#include <linux/kthread.h> 29#include <linux/kthread.h>
30#include <linux/suspend.h> 30#include <linux/suspend.h>
31 31
32
33#include "saa7134-reg.h" 32#include "saa7134-reg.h"
34#include "saa7134.h" 33#include "saa7134.h"
35 34
@@ -40,6 +39,10 @@
40#ifdef HAVE_TDA1004X 39#ifdef HAVE_TDA1004X
41# include "tda1004x.h" 40# include "tda1004x.h"
42#endif 41#endif
42#ifdef HAVE_NXT200X
43# include "nxt200x.h"
44# include "dvb-pll.h"
45#endif
43 46
44MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]"); 47MODULE_AUTHOR("Gerd Knorr <kraxel@bytesex.org> [SuSE Labs]");
45MODULE_LICENSE("GPL"); 48MODULE_LICENSE("GPL");
@@ -151,25 +154,12 @@ static struct mt352_config pinnacle_300i = {
151/* ------------------------------------------------------------------ */ 154/* ------------------------------------------------------------------ */
152 155
153#ifdef HAVE_TDA1004X 156#ifdef HAVE_TDA1004X
154static int philips_tu1216_pll_init(struct dvb_frontend *fe)
155{
156 struct saa7134_dev *dev = fe->dvb->priv;
157 static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab };
158 struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) };
159
160 /* setup PLL configuration */
161 if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
162 return -EIO;
163 msleep(1);
164 157
165 return 0; 158static int philips_tda6651_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
166}
167
168static int philips_tu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
169{ 159{
170 struct saa7134_dev *dev = fe->dvb->priv; 160 struct saa7134_dev *dev = fe->dvb->priv;
171 u8 tuner_buf[4]; 161 u8 tuner_buf[4];
172 struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tuner_buf,.len = 162 struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tuner_buf,.len =
173 sizeof(tuner_buf) }; 163 sizeof(tuner_buf) };
174 int tuner_frequency = 0; 164 int tuner_frequency = 0;
175 u8 band, cp, filter; 165 u8 band, cp, filter;
@@ -242,11 +232,36 @@ static int philips_tu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_p
242 232
243 if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1) 233 if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
244 return -EIO; 234 return -EIO;
235 msleep(1);
236 return 0;
237}
245 238
239static int philips_tda6651_pll_init(u8 addr, struct dvb_frontend *fe)
240{
241 struct saa7134_dev *dev = fe->dvb->priv;
242 static u8 tu1216_init[] = { 0x0b, 0xf5, 0x85, 0xab };
243 struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tu1216_init,.len = sizeof(tu1216_init) };
244
245 /* setup PLL configuration */
246 if (i2c_transfer(&dev->i2c_adap, &tuner_msg, 1) != 1)
247 return -EIO;
246 msleep(1); 248 msleep(1);
249
247 return 0; 250 return 0;
248} 251}
249 252
253/* ------------------------------------------------------------------ */
254
255static int philips_tu1216_pll_60_init(struct dvb_frontend *fe)
256{
257 return philips_tda6651_pll_init(0x60, fe);
258}
259
260static int philips_tu1216_pll_60_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
261{
262 return philips_tda6651_pll_set(0x60, fe, params);
263}
264
250static int philips_tu1216_request_firmware(struct dvb_frontend *fe, 265static int philips_tu1216_request_firmware(struct dvb_frontend *fe,
251 const struct firmware **fw, char *name) 266 const struct firmware **fw, char *name)
252{ 267{
@@ -254,22 +269,108 @@ static int philips_tu1216_request_firmware(struct dvb_frontend *fe,
254 return request_firmware(fw, name, &dev->pci->dev); 269 return request_firmware(fw, name, &dev->pci->dev);
255} 270}
256 271
257static struct tda1004x_config philips_tu1216_config = { 272static struct tda1004x_config philips_tu1216_60_config = {
273
274 .demod_address = 0x8,
275 .invert = 1,
276 .invert_oclk = 0,
277 .xtal_freq = TDA10046_XTAL_4M,
278 .agc_config = TDA10046_AGC_DEFAULT,
279 .if_freq = TDA10046_FREQ_3617,
280 .pll_init = philips_tu1216_pll_60_init,
281 .pll_set = philips_tu1216_pll_60_set,
282 .pll_sleep = NULL,
283 .request_firmware = philips_tu1216_request_firmware,
284};
285
286/* ------------------------------------------------------------------ */
287
288static int philips_tu1216_pll_61_init(struct dvb_frontend *fe)
289{
290 return philips_tda6651_pll_init(0x61, fe);
291}
292
293static int philips_tu1216_pll_61_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
294{
295 return philips_tda6651_pll_set(0x61, fe, params);
296}
297
298static struct tda1004x_config philips_tu1216_61_config = {
258 299
259 .demod_address = 0x8, 300 .demod_address = 0x8,
260 .invert = 1, 301 .invert = 1,
261 .invert_oclk = 1, 302 .invert_oclk = 0,
262 .xtal_freq = TDA10046_XTAL_4M, 303 .xtal_freq = TDA10046_XTAL_4M,
263 .agc_config = TDA10046_AGC_DEFAULT, 304 .agc_config = TDA10046_AGC_DEFAULT,
264 .if_freq = TDA10046_FREQ_3617, 305 .if_freq = TDA10046_FREQ_3617,
265 .pll_init = philips_tu1216_pll_init, 306 .pll_init = philips_tu1216_pll_61_init,
266 .pll_set = philips_tu1216_pll_set, 307 .pll_set = philips_tu1216_pll_61_set,
267 .pll_sleep = NULL, 308 .pll_sleep = NULL,
268 .request_firmware = philips_tu1216_request_firmware, 309 .request_firmware = philips_tu1216_request_firmware,
269}; 310};
270 311
271/* ------------------------------------------------------------------ */ 312/* ------------------------------------------------------------------ */
272 313
314static int philips_europa_pll_init(struct dvb_frontend *fe)
315{
316 struct saa7134_dev *dev = fe->dvb->priv;
317 static u8 msg[] = { 0x0b, 0xf5, 0x86, 0xab };
318 struct i2c_msg init_msg = {.addr = 0x61,.flags = 0,.buf = msg,.len = sizeof(msg) };
319
320 /* setup PLL configuration */
321 if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
322 return -EIO;
323 msleep(1);
324
325 /* switch the board to dvb mode */
326 init_msg.addr = 0x43;
327 init_msg.len = 0x02;
328 msg[0] = 0x00;
329 msg[1] = 0x40;
330 if (i2c_transfer(&dev->i2c_adap, &init_msg, 1) != 1)
331 return -EIO;
332
333 return 0;
334}
335
336static int philips_td1316_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
337{
338 return philips_tda6651_pll_set(0x61, fe, params);
339}
340
341static void philips_europa_analog(struct dvb_frontend *fe)
342{
343 struct saa7134_dev *dev = fe->dvb->priv;
344 /* this message actually turns the tuner back to analog mode */
345 static u8 msg[] = { 0x0b, 0xdc, 0x86, 0xa4 };
346 struct i2c_msg analog_msg = {.addr = 0x61,.flags = 0,.buf = msg,.len = sizeof(msg) };
347
348 i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
349 msleep(1);
350
351 /* switch the board to analog mode */
352 analog_msg.addr = 0x43;
353 analog_msg.len = 0x02;
354 msg[0] = 0x00;
355 msg[1] = 0x14;
356 i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
357}
358
359static struct tda1004x_config philips_europa_config = {
360
361 .demod_address = 0x8,
362 .invert = 0,
363 .invert_oclk = 0,
364 .xtal_freq = TDA10046_XTAL_4M,
365 .agc_config = TDA10046_AGC_IFO_AUTO_POS,
366 .if_freq = TDA10046_FREQ_052,
367 .pll_init = philips_europa_pll_init,
368 .pll_set = philips_td1316_pll_set,
369 .pll_sleep = philips_europa_analog,
370 .request_firmware = NULL,
371};
372
373/* ------------------------------------------------------------------ */
273 374
274static int philips_fmd1216_pll_init(struct dvb_frontend *fe) 375static int philips_fmd1216_pll_init(struct dvb_frontend *fe)
275{ 376{
@@ -382,7 +483,6 @@ static int philips_fmd1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_
382 return 0; 483 return 0;
383} 484}
384 485
385#ifdef HAVE_TDA1004X
386static struct tda1004x_config medion_cardbus = { 486static struct tda1004x_config medion_cardbus = {
387 .demod_address = 0x08, 487 .demod_address = 0x08,
388 .invert = 1, 488 .invert = 1,
@@ -395,7 +495,6 @@ static struct tda1004x_config medion_cardbus = {
395 .pll_sleep = philips_fmd1216_analog, 495 .pll_sleep = philips_fmd1216_analog,
396 .request_firmware = NULL, 496 .request_firmware = NULL,
397}; 497};
398#endif
399 498
400/* ------------------------------------------------------------------ */ 499/* ------------------------------------------------------------------ */
401 500
@@ -452,7 +551,7 @@ static int philips_tda827x_pll_set(struct dvb_frontend *fe, struct dvb_frontend_
452 u8 tuner_buf[14]; 551 u8 tuner_buf[14];
453 552
454 struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tuner_buf, 553 struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tuner_buf,
455 .len = sizeof(tuner_buf) }; 554 .len = sizeof(tuner_buf) };
456 int i, tuner_freq, if_freq; 555 int i, tuner_freq, if_freq;
457 u32 N; 556 u32 N;
458 switch (params->u.ofdm.bandwidth) { 557 switch (params->u.ofdm.bandwidth) {
@@ -511,7 +610,7 @@ static void philips_tda827x_pll_sleep(struct dvb_frontend *fe)
511 struct saa7134_dev *dev = fe->dvb->priv; 610 struct saa7134_dev *dev = fe->dvb->priv;
512 static u8 tda827x_sleep[] = { 0x30, 0xd0}; 611 static u8 tda827x_sleep[] = { 0x30, 0xd0};
513 struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tda827x_sleep, 612 struct i2c_msg tuner_msg = {.addr = 0x60,.flags = 0,.buf = tda827x_sleep,
514 .len = sizeof(tda827x_sleep) }; 613 .len = sizeof(tda827x_sleep) };
515 i2c_transfer(&dev->i2c_adap, &tuner_msg, 1); 614 i2c_transfer(&dev->i2c_adap, &tuner_msg, 1);
516} 615}
517 616
@@ -527,6 +626,202 @@ static struct tda1004x_config tda827x_lifeview_config = {
527 .pll_sleep = philips_tda827x_pll_sleep, 626 .pll_sleep = philips_tda827x_pll_sleep,
528 .request_firmware = NULL, 627 .request_firmware = NULL,
529}; 628};
629
630/* ------------------------------------------------------------------ */
631
632struct tda827xa_data {
633 u32 lomax;
634 u8 svco;
635 u8 spd;
636 u8 scr;
637 u8 sbs;
638 u8 gc3;
639};
640
641static struct tda827xa_data tda827xa_dvbt[] = {
642 { .lomax = 56875000, .svco = 3, .spd = 4, .scr = 0, .sbs = 0, .gc3 = 1},
643 { .lomax = 67250000, .svco = 0, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1},
644 { .lomax = 81250000, .svco = 1, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1},
645 { .lomax = 97500000, .svco = 2, .spd = 3, .scr = 0, .sbs = 0, .gc3 = 1},
646 { .lomax = 113750000, .svco = 3, .spd = 3, .scr = 0, .sbs = 1, .gc3 = 1},
647 { .lomax = 134500000, .svco = 0, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
648 { .lomax = 154000000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
649 { .lomax = 162500000, .svco = 1, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
650 { .lomax = 183000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 1, .gc3 = 1},
651 { .lomax = 195000000, .svco = 2, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1},
652 { .lomax = 227500000, .svco = 3, .spd = 2, .scr = 0, .sbs = 2, .gc3 = 1},
653 { .lomax = 269000000, .svco = 0, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1},
654 { .lomax = 290000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 2, .gc3 = 1},
655 { .lomax = 325000000, .svco = 1, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1},
656 { .lomax = 390000000, .svco = 2, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1},
657 { .lomax = 455000000, .svco = 3, .spd = 1, .scr = 0, .sbs = 3, .gc3 = 1},
658 { .lomax = 520000000, .svco = 0, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1},
659 { .lomax = 538000000, .svco = 0, .spd = 0, .scr = 1, .sbs = 3, .gc3 = 1},
660 { .lomax = 550000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 3, .gc3 = 1},
661 { .lomax = 620000000, .svco = 1, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
662 { .lomax = 650000000, .svco = 1, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
663 { .lomax = 700000000, .svco = 2, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
664 { .lomax = 780000000, .svco = 2, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
665 { .lomax = 820000000, .svco = 3, .spd = 0, .scr = 0, .sbs = 4, .gc3 = 0},
666 { .lomax = 870000000, .svco = 3, .spd = 0, .scr = 1, .sbs = 4, .gc3 = 0},
667 { .lomax = 911000000, .svco = 3, .spd = 0, .scr = 2, .sbs = 4, .gc3 = 0},
668 { .lomax = 0, .svco = 0, .spd = 0, .scr = 0, .sbs = 0, .gc3 = 0}};
669
670
671static int philips_tda827xa_pll_set(u8 addr, struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
672{
673 struct saa7134_dev *dev = fe->dvb->priv;
674 u8 tuner_buf[14];
675 unsigned char reg2[2];
676
677 struct i2c_msg msg = {.addr = addr,.flags = 0,.buf = tuner_buf};
678 int i, tuner_freq, if_freq;
679 u32 N;
680
681 switch (params->u.ofdm.bandwidth) {
682 case BANDWIDTH_6_MHZ:
683 if_freq = 4000000;
684 break;
685 case BANDWIDTH_7_MHZ:
686 if_freq = 4500000;
687 break;
688 default: /* 8 MHz or Auto */
689 if_freq = 5000000;
690 break;
691 }
692 tuner_freq = params->frequency + if_freq;
693
694 i = 0;
695 while (tda827xa_dvbt[i].lomax < tuner_freq) {
696 if(tda827xa_dvbt[i + 1].lomax == 0)
697 break;
698 i++;
699 }
700
701 N = ((tuner_freq + 31250) / 62500) << tda827xa_dvbt[i].spd;
702 tuner_buf[0] = 0; // subaddress
703 tuner_buf[1] = N >> 8;
704 tuner_buf[2] = N & 0xff;
705 tuner_buf[3] = 0;
706 tuner_buf[4] = 0x16;
707 tuner_buf[5] = (tda827xa_dvbt[i].spd << 5) + (tda827xa_dvbt[i].svco << 3) +
708 tda827xa_dvbt[i].sbs;
709 tuner_buf[6] = 0x4b + (tda827xa_dvbt[i].gc3 << 4);
710 tuner_buf[7] = 0x0c;
711 tuner_buf[8] = 0x06;
712 tuner_buf[9] = 0x24;
713 tuner_buf[10] = 0xff;
714 tuner_buf[11] = 0x60;
715 tuner_buf[12] = 0x00;
716 tuner_buf[13] = 0x39; // lpsel
717 msg.len = 14;
718 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
719 return -EIO;
720
721 msg.buf= reg2;
722 msg.len = 2;
723 reg2[0] = 0x60;
724 reg2[1] = 0x3c;
725 i2c_transfer(&dev->i2c_adap, &msg, 1);
726
727 reg2[0] = 0xa0;
728 reg2[1] = 0x40;
729 i2c_transfer(&dev->i2c_adap, &msg, 1);
730
731 msleep(2);
732 /* correct CP value */
733 reg2[0] = 0x30;
734 reg2[1] = 0x10 + tda827xa_dvbt[i].scr;
735 msg.len = 2;
736 i2c_transfer(&dev->i2c_adap, &msg, 1);
737
738 msleep(550);
739 reg2[0] = 0x50;
740 reg2[1] = 0x4f + (tda827xa_dvbt[i].gc3 << 4);
741 i2c_transfer(&dev->i2c_adap, &msg, 1);
742
743 return 0;
744
745}
746
747static void philips_tda827xa_pll_sleep(u8 addr, struct dvb_frontend *fe)
748{
749 struct saa7134_dev *dev = fe->dvb->priv;
750 static u8 tda827xa_sleep[] = { 0x30, 0x90};
751 struct i2c_msg tuner_msg = {.addr = addr,.flags = 0,.buf = tda827xa_sleep,
752 .len = sizeof(tda827xa_sleep) };
753 i2c_transfer(&dev->i2c_adap, &tuner_msg, 1);
754
755}
756
757/* ------------------------------------------------------------------ */
758
759static int philips_tiger_pll_set(struct dvb_frontend *fe, struct dvb_frontend_parameters *params)
760{
761 int ret;
762 struct saa7134_dev *dev = fe->dvb->priv;
763 static u8 tda8290_close[] = { 0x21, 0xc0};
764 static u8 tda8290_open[] = { 0x21, 0x80};
765 struct i2c_msg tda8290_msg = {.addr = 0x4b,.flags = 0, .len = 2};
766 /* close tda8290 i2c bridge */
767 tda8290_msg.buf = tda8290_close;
768 ret = i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1);
769 if (ret != 1)
770 return -EIO;
771 msleep(20);
772 ret = philips_tda827xa_pll_set(0x61, fe, params);
773 if (ret != 0)
774 return ret;
775 /* open tda8290 i2c bridge */
776 tda8290_msg.buf = tda8290_open;
777 i2c_transfer(&dev->i2c_adap, &tda8290_msg, 1);
778 return ret;
779};
780
781static int philips_tiger_dvb_mode(struct dvb_frontend *fe)
782{
783 struct saa7134_dev *dev = fe->dvb->priv;
784 static u8 data[] = { 0x3c, 0x33, 0x6a};
785 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
786
787 if (i2c_transfer(&dev->i2c_adap, &msg, 1) != 1)
788 return -EIO;
789 return 0;
790}
791
792static void philips_tiger_analog_mode(struct dvb_frontend *fe)
793{
794 struct saa7134_dev *dev = fe->dvb->priv;
795 static u8 data[] = { 0x3c, 0x33, 0x68};
796 struct i2c_msg msg = {.addr=0x08, .flags=0, .buf=data, .len = sizeof(data)};
797
798 i2c_transfer(&dev->i2c_adap, &msg, 1);
799 philips_tda827xa_pll_sleep( 0x61, fe);
800}
801
802static struct tda1004x_config philips_tiger_config = {
803 .demod_address = 0x08,
804 .invert = 1,
805 .invert_oclk = 0,
806 .xtal_freq = TDA10046_XTAL_16M,
807 .agc_config = TDA10046_AGC_TDA827X,
808 .if_freq = TDA10046_FREQ_045,
809 .pll_init = philips_tiger_dvb_mode,
810 .pll_set = philips_tiger_pll_set,
811 .pll_sleep = philips_tiger_analog_mode,
812 .request_firmware = NULL,
813};
814
815#endif
816
817/* ------------------------------------------------------------------ */
818
819#ifdef HAVE_NXT200X
820static struct nxt200x_config avertvhda180 = {
821 .demod_address = 0x0a,
822 .pll_address = 0x61,
823 .pll_desc = &dvb_pll_tdhu2,
824};
530#endif 825#endif
531 826
532/* ------------------------------------------------------------------ */ 827/* ------------------------------------------------------------------ */
@@ -558,7 +853,7 @@ static int dvb_init(struct saa7134_dev *dev)
558 &dev->i2c_adap); 853 &dev->i2c_adap);
559 break; 854 break;
560 case SAA7134_BOARD_PHILIPS_TOUGH: 855 case SAA7134_BOARD_PHILIPS_TOUGH:
561 dev->dvb.frontend = tda10046_attach(&philips_tu1216_config, 856 dev->dvb.frontend = tda10046_attach(&philips_tu1216_60_config,
562 &dev->i2c_adap); 857 &dev->i2c_adap);
563 break; 858 break;
564 case SAA7134_BOARD_FLYDVBTDUO: 859 case SAA7134_BOARD_FLYDVBTDUO:
@@ -569,6 +864,31 @@ static int dvb_init(struct saa7134_dev *dev)
569 dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config, 864 dev->dvb.frontend = tda10046_attach(&tda827x_lifeview_config,
570 &dev->i2c_adap); 865 &dev->i2c_adap);
571 break; 866 break;
867 case SAA7134_BOARD_PHILIPS_EUROPA:
868 dev->dvb.frontend = tda10046_attach(&philips_europa_config,
869 &dev->i2c_adap);
870 break;
871 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
872 dev->dvb.frontend = tda10046_attach(&philips_europa_config,
873 &dev->i2c_adap);
874 break;
875 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
876 dev->dvb.frontend = tda10046_attach(&philips_tu1216_61_config,
877 &dev->i2c_adap);
878 break;
879 case SAA7134_BOARD_PHILIPS_TIGER:
880 dev->dvb.frontend = tda10046_attach(&philips_tiger_config,
881 &dev->i2c_adap);
882 break;
883 case SAA7134_BOARD_ASUSTeK_P7131_DUAL:
884 dev->dvb.frontend = tda10046_attach(&philips_tiger_config,
885 &dev->i2c_adap);
886 break;
887#endif
888#ifdef HAVE_NXT200X
889 case SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180:
890 dev->dvb.frontend = nxt200x_attach(&avertvhda180, &dev->i2c_adap);
891 break;
572#endif 892#endif
573 default: 893 default:
574 printk("%s: Huh? unknown DVB card?\n",dev->name); 894 printk("%s: Huh? unknown DVB card?\n",dev->name);
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
index 77b627eb6483..e9ec69efb4c9 100644
--- a/drivers/media/video/saa7134/saa7134-empress.c
+++ b/drivers/media/video/saa7134/saa7134-empress.c
@@ -55,7 +55,7 @@ static void ts_reset_encoder(struct saa7134_dev* dev)
55 55
56 saa_writeb(SAA7134_SPECIAL_MODE, 0x00); 56 saa_writeb(SAA7134_SPECIAL_MODE, 0x00);
57 msleep(10); 57 msleep(10);
58 saa_writeb(SAA7134_SPECIAL_MODE, 0x01); 58 saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
59 msleep(100); 59 msleep(100);
60 dev->empress_started = 0; 60 dev->empress_started = 0;
61} 61}
@@ -65,7 +65,7 @@ static int ts_init_encoder(struct saa7134_dev* dev)
65 ts_reset_encoder(dev); 65 ts_reset_encoder(dev);
66 saa7134_i2c_call_clients(dev, VIDIOC_S_MPEGCOMP, NULL); 66 saa7134_i2c_call_clients(dev, VIDIOC_S_MPEGCOMP, NULL);
67 dev->empress_started = 1; 67 dev->empress_started = 1;
68 return 0; 68 return 0;
69} 69}
70 70
71/* ------------------------------------------------------------------ */ 71/* ------------------------------------------------------------------ */
@@ -169,7 +169,7 @@ static int ts_do_ioctl(struct inode *inode, struct file *file,
169 struct v4l2_capability *cap = arg; 169 struct v4l2_capability *cap = arg;
170 170
171 memset(cap,0,sizeof(*cap)); 171 memset(cap,0,sizeof(*cap));
172 strcpy(cap->driver, "saa7134"); 172 strcpy(cap->driver, "saa7134");
173 strlcpy(cap->card, saa7134_boards[dev->board].name, 173 strlcpy(cap->card, saa7134_boards[dev->board].name,
174 sizeof(cap->card)); 174 sizeof(cap->card));
175 sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); 175 sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci));
diff --git a/drivers/media/video/saa7134/saa7134-i2c.c b/drivers/media/video/saa7134/saa7134-i2c.c
index 711aa8e85fac..7575043f0874 100644
--- a/drivers/media/video/saa7134/saa7134-i2c.c
+++ b/drivers/media/video/saa7134/saa7134-i2c.c
@@ -239,7 +239,7 @@ static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap,
239 unsigned char data; 239 unsigned char data;
240 int addr,rc,i,byte; 240 int addr,rc,i,byte;
241 241
242 status = i2c_get_status(dev); 242 status = i2c_get_status(dev);
243 if (!i2c_is_idle(status)) 243 if (!i2c_is_idle(status))
244 if (!i2c_reset(dev)) 244 if (!i2c_reset(dev))
245 return -EIO; 245 return -EIO;
@@ -296,7 +296,7 @@ static int saa7134_i2c_xfer(struct i2c_adapter *i2c_adap,
296 rc = -EIO; 296 rc = -EIO;
297 if (!i2c_is_busy_wait(dev)) 297 if (!i2c_is_busy_wait(dev))
298 goto err; 298 goto err;
299 status = i2c_get_status(dev); 299 status = i2c_get_status(dev);
300 if (i2c_is_error(status)) 300 if (i2c_is_error(status))
301 goto err; 301 goto err;
302 /* ensure that the bus is idle for at least one bit slot */ 302 /* ensure that the bus is idle for at least one bit slot */
@@ -335,6 +335,20 @@ static int attach_inform(struct i2c_client *client)
335 d1printk( "%s i2c attach [addr=0x%x,client=%s]\n", 335 d1printk( "%s i2c attach [addr=0x%x,client=%s]\n",
336 client->driver->name, client->addr, client->name); 336 client->driver->name, client->addr, client->name);
337 337
338 /* Am I an i2c remote control? */
339
340 switch (client->addr) {
341 case 0x7a:
342 case 0x47:
343 {
344 struct IR_i2c *ir = i2c_get_clientdata(client);
345 d1printk("%s i2c IR detected (%s).\n",
346 client->driver->name,ir->phys);
347 saa7134_set_i2c_ir(dev,ir);
348 break;
349 }
350 }
351
338 if (!client->driver->command) 352 if (!client->driver->command)
339 return 0; 353 return 0;
340 354
@@ -348,12 +362,12 @@ static int attach_inform(struct i2c_client *client)
348 362
349 client->driver->command(client, TUNER_SET_TYPE_ADDR, &tun_setup); 363 client->driver->command(client, TUNER_SET_TYPE_ADDR, &tun_setup);
350 } 364 }
351 } 365 }
352 366
353 if (tuner != UNSET) { 367 if (tuner != UNSET) {
354 368
355 tun_setup.type = tuner; 369 tun_setup.type = tuner;
356 tun_setup.addr = saa7134_boards[dev->board].tuner_addr; 370 tun_setup.addr = saa7134_boards[dev->board].tuner_addr;
357 371
358 if ((tun_setup.addr == ADDR_UNSET)||(tun_setup.addr == client->addr)) { 372 if ((tun_setup.addr == ADDR_UNSET)||(tun_setup.addr == client->addr)) {
359 373
@@ -361,11 +375,11 @@ static int attach_inform(struct i2c_client *client)
361 375
362 client->driver->command(client,TUNER_SET_TYPE_ADDR, &tun_setup); 376 client->driver->command(client,TUNER_SET_TYPE_ADDR, &tun_setup);
363 } 377 }
364 } 378 }
365 379
366 client->driver->command(client, TDA9887_SET_CONFIG, &conf); 380 client->driver->command(client, TDA9887_SET_CONFIG, &conf);
367 381
368 return 0; 382 return 0;
369} 383}
370 384
371static struct i2c_algorithm saa7134_algo = { 385static struct i2c_algorithm saa7134_algo = {
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c
index 242cb235cf92..329accda6d45 100644
--- a/drivers/media/video/saa7134/saa7134-input.c
+++ b/drivers/media/video/saa7134/saa7134-input.c
@@ -39,6 +39,8 @@ MODULE_PARM_DESC(ir_debug,"enable debug messages [IR]");
39 39
40#define dprintk(fmt, arg...) if (ir_debug) \ 40#define dprintk(fmt, arg...) if (ir_debug) \
41 printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg) 41 printk(KERN_DEBUG "%s/ir: " fmt, dev->name , ## arg)
42#define i2cdprintk(fmt, arg...) if (ir_debug) \
43 printk(KERN_DEBUG "%s/ir: " fmt, ir->c.name , ## arg)
42 44
43/* ---------------------------------------------------------------------- */ 45/* ---------------------------------------------------------------------- */
44 46
@@ -114,24 +116,24 @@ static IR_KEYTAB_TYPE cinergy_codes[IR_KEYTAB_SIZE] = {
114/* Alfons Geser <a.geser@cox.net> 116/* Alfons Geser <a.geser@cox.net>
115 * updates from Job D. R. Borges <jobdrb@ig.com.br> */ 117 * updates from Job D. R. Borges <jobdrb@ig.com.br> */
116static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = { 118static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = {
117 [ 18 ] = KEY_POWER, 119 [ 18 ] = KEY_POWER,
118 [ 1 ] = KEY_TV, // DVR 120 [ 1 ] = KEY_TV, // DVR
119 [ 21 ] = KEY_DVD, // DVD 121 [ 21 ] = KEY_DVD, // DVD
120 [ 23 ] = KEY_AUDIO, // music 122 [ 23 ] = KEY_AUDIO, // music
121 // DVR mode / DVD mode / music mode 123 // DVR mode / DVD mode / music mode
122 124
123 [ 27 ] = KEY_MUTE, // mute 125 [ 27 ] = KEY_MUTE, // mute
124 [ 2 ] = KEY_LANGUAGE, // MTS/SAP / audio / autoseek 126 [ 2 ] = KEY_LANGUAGE, // MTS/SAP / audio / autoseek
125 [ 30 ] = KEY_SUBTITLE, // closed captioning / subtitle / seek 127 [ 30 ] = KEY_SUBTITLE, // closed captioning / subtitle / seek
126 [ 22 ] = KEY_ZOOM, // full screen 128 [ 22 ] = KEY_ZOOM, // full screen
127 [ 28 ] = KEY_VIDEO, // video source / eject / delall 129 [ 28 ] = KEY_VIDEO, // video source / eject / delall
128 [ 29 ] = KEY_RESTART, // playback / angle / del 130 [ 29 ] = KEY_RESTART, // playback / angle / del
129 [ 47 ] = KEY_SEARCH, // scan / menu / playlist 131 [ 47 ] = KEY_SEARCH, // scan / menu / playlist
130 [ 48 ] = KEY_CHANNEL, // CH surfing / bookmark / memo 132 [ 48 ] = KEY_CHANNEL, // CH surfing / bookmark / memo
131 133
132 [ 49 ] = KEY_HELP, // help 134 [ 49 ] = KEY_HELP, // help
133 [ 50 ] = KEY_MODE, // num/memo 135 [ 50 ] = KEY_MODE, // num/memo
134 [ 51 ] = KEY_ESC, // cancel 136 [ 51 ] = KEY_ESC, // cancel
135 137
136 [ 12 ] = KEY_UP, // up 138 [ 12 ] = KEY_UP, // up
137 [ 16 ] = KEY_DOWN, // down 139 [ 16 ] = KEY_DOWN, // down
@@ -148,24 +150,24 @@ static IR_KEYTAB_TYPE eztv_codes[IR_KEYTAB_SIZE] = {
148 [ 45 ] = KEY_PLAY, // play 150 [ 45 ] = KEY_PLAY, // play
149 [ 46 ] = KEY_SHUFFLE, // snapshot / shuffle 151 [ 46 ] = KEY_SHUFFLE, // snapshot / shuffle
150 152
151 [ 0 ] = KEY_KP0, 153 [ 0 ] = KEY_KP0,
152 [ 5 ] = KEY_KP1, 154 [ 5 ] = KEY_KP1,
153 [ 6 ] = KEY_KP2, 155 [ 6 ] = KEY_KP2,
154 [ 7 ] = KEY_KP3, 156 [ 7 ] = KEY_KP3,
155 [ 9 ] = KEY_KP4, 157 [ 9 ] = KEY_KP4,
156 [ 10 ] = KEY_KP5, 158 [ 10 ] = KEY_KP5,
157 [ 11 ] = KEY_KP6, 159 [ 11 ] = KEY_KP6,
158 [ 13 ] = KEY_KP7, 160 [ 13 ] = KEY_KP7,
159 [ 14 ] = KEY_KP8, 161 [ 14 ] = KEY_KP8,
160 [ 15 ] = KEY_KP9, 162 [ 15 ] = KEY_KP9,
161 163
162 [ 42 ] = KEY_VOLUMEUP, 164 [ 42 ] = KEY_VOLUMEUP,
163 [ 17 ] = KEY_VOLUMEDOWN, 165 [ 17 ] = KEY_VOLUMEDOWN,
164 [ 24 ] = KEY_CHANNELUP, // CH.tracking up 166 [ 24 ] = KEY_CHANNELUP, // CH.tracking up
165 [ 25 ] = KEY_CHANNELDOWN, // CH.tracking down 167 [ 25 ] = KEY_CHANNELDOWN, // CH.tracking down
166 168
167 [ 19 ] = KEY_KPENTER, // enter 169 [ 19 ] = KEY_KPENTER, // enter
168 [ 33 ] = KEY_KPDOT, // . (decimal dot) 170 [ 33 ] = KEY_KPDOT, // . (decimal dot)
169}; 171};
170 172
171static IR_KEYTAB_TYPE avacssmart_codes[IR_KEYTAB_SIZE] = { 173static IR_KEYTAB_TYPE avacssmart_codes[IR_KEYTAB_SIZE] = {
@@ -401,7 +403,183 @@ static IR_KEYTAB_TYPE manli_codes[IR_KEYTAB_SIZE] = {
401 403
402 // 0x1d unused ? 404 // 0x1d unused ?
403}; 405};
404/* ---------------------------------------------------------------------- */ 406
407
408/* Mike Baikov <mike@baikov.com> */
409static IR_KEYTAB_TYPE gotview7135_codes[IR_KEYTAB_SIZE] = {
410
411 [ 33 ] = KEY_POWER,
412 [ 105] = KEY_TV,
413 [ 51 ] = KEY_KP0,
414 [ 81 ] = KEY_KP1,
415 [ 49 ] = KEY_KP2,
416 [ 113] = KEY_KP3,
417 [ 59 ] = KEY_KP4,
418 [ 88 ] = KEY_KP5,
419 [ 65 ] = KEY_KP6,
420 [ 72 ] = KEY_KP7,
421 [ 48 ] = KEY_KP8,
422 [ 83 ] = KEY_KP9,
423 [ 115] = KEY_AGAIN, /* LOOP */
424 [ 10 ] = KEY_AUDIO,
425 [ 97 ] = KEY_PRINT, /* PREVIEW */
426 [ 122] = KEY_VIDEO,
427 [ 32 ] = KEY_CHANNELUP,
428 [ 64 ] = KEY_CHANNELDOWN,
429 [ 24 ] = KEY_VOLUMEDOWN,
430 [ 80 ] = KEY_VOLUMEUP,
431 [ 16 ] = KEY_MUTE,
432 [ 74 ] = KEY_SEARCH,
433 [ 123] = KEY_SHUFFLE, /* SNAPSHOT */
434 [ 34 ] = KEY_RECORD,
435 [ 98 ] = KEY_STOP,
436 [ 120] = KEY_PLAY,
437 [ 57 ] = KEY_REWIND,
438 [ 89 ] = KEY_PAUSE,
439 [ 25 ] = KEY_FORWARD,
440 [ 9 ] = KEY_ZOOM,
441
442 [ 82 ] = KEY_F21, /* LIVE TIMESHIFT */
443 [ 26 ] = KEY_F22, /* MIN TIMESHIFT */
444 [ 58 ] = KEY_F23, /* TIMESHIFT */
445 [ 112] = KEY_F24, /* NORMAL TIMESHIFT */
446};
447
448static IR_KEYTAB_TYPE ir_codes_purpletv[IR_KEYTAB_SIZE] = {
449 [ 0x3 ] = KEY_POWER,
450 [ 0x6f ] = KEY_MUTE,
451 [ 0x10 ] = KEY_BACKSPACE, /* Recall */
452
453 [ 0x11 ] = KEY_KP0,
454 [ 0x4 ] = KEY_KP1,
455 [ 0x5 ] = KEY_KP2,
456 [ 0x6 ] = KEY_KP3,
457 [ 0x8 ] = KEY_KP4,
458 [ 0x9 ] = KEY_KP5,
459 [ 0xa ] = KEY_KP6,
460 [ 0xc ] = KEY_KP7,
461 [ 0xd ] = KEY_KP8,
462 [ 0xe ] = KEY_KP9,
463 [ 0x12 ] = KEY_KPDOT, /* 100+ */
464
465 [ 0x7 ] = KEY_VOLUMEUP,
466 [ 0xb ] = KEY_VOLUMEDOWN,
467 [ 0x1a ] = KEY_KPPLUS,
468 [ 0x18 ] = KEY_KPMINUS,
469 [ 0x15 ] = KEY_UP,
470 [ 0x1d ] = KEY_DOWN,
471 [ 0xf ] = KEY_CHANNELUP,
472 [ 0x13 ] = KEY_CHANNELDOWN,
473 [ 0x48 ] = KEY_ZOOM,
474
475 [ 0x1b ] = KEY_VIDEO, /* Video source */
476 [ 0x49 ] = KEY_LANGUAGE, /* MTS Select */
477 [ 0x19 ] = KEY_SEARCH, /* Auto Scan */
478
479 [ 0x4b ] = KEY_RECORD,
480 [ 0x46 ] = KEY_PLAY,
481 [ 0x45 ] = KEY_PAUSE, /* Pause */
482 [ 0x44 ] = KEY_STOP,
483 [ 0x40 ] = KEY_FORWARD, /* Forward ? */
484 [ 0x42 ] = KEY_REWIND, /* Backward ? */
485
486};
487
488static IR_KEYTAB_TYPE ir_codes_pinnacle[IR_KEYTAB_SIZE] = {
489 [ 0x59 ] = KEY_MUTE,
490 [ 0x4a ] = KEY_POWER,
491
492 [ 0x18 ] = KEY_TEXT,
493 [ 0x26 ] = KEY_TV,
494 [ 0x3d ] = KEY_PRINT,
495
496 [ 0x48 ] = KEY_RED,
497 [ 0x04 ] = KEY_GREEN,
498 [ 0x11 ] = KEY_YELLOW,
499 [ 0x00 ] = KEY_BLUE,
500
501 [ 0x2d ] = KEY_VOLUMEUP,
502 [ 0x1e ] = KEY_VOLUMEDOWN,
503
504 [ 0x49 ] = KEY_MENU,
505
506 [ 0x16 ] = KEY_CHANNELUP,
507 [ 0x17 ] = KEY_CHANNELDOWN,
508
509 [ 0x20 ] = KEY_UP,
510 [ 0x21 ] = KEY_DOWN,
511 [ 0x22 ] = KEY_LEFT,
512 [ 0x23 ] = KEY_RIGHT,
513 [ 0x0d ] = KEY_SELECT,
514
515
516
517 [ 0x08 ] = KEY_BACK,
518 [ 0x07 ] = KEY_REFRESH,
519
520 [ 0x2f ] = KEY_ZOOM,
521 [ 0x29 ] = KEY_RECORD,
522
523 [ 0x4b ] = KEY_PAUSE,
524 [ 0x4d ] = KEY_REWIND,
525 [ 0x2e ] = KEY_PLAY,
526 [ 0x4e ] = KEY_FORWARD,
527 [ 0x53 ] = KEY_PREVIOUS,
528 [ 0x4c ] = KEY_STOP,
529 [ 0x54 ] = KEY_NEXT,
530
531 [ 0x69 ] = KEY_KP0,
532 [ 0x6a ] = KEY_KP1,
533 [ 0x6b ] = KEY_KP2,
534 [ 0x6c ] = KEY_KP3,
535 [ 0x6d ] = KEY_KP4,
536 [ 0x6e ] = KEY_KP5,
537 [ 0x6f ] = KEY_KP6,
538 [ 0x70 ] = KEY_KP7,
539 [ 0x71 ] = KEY_KP8,
540 [ 0x72 ] = KEY_KP9,
541
542 [ 0x74 ] = KEY_CHANNEL,
543 [ 0x0a ] = KEY_BACKSPACE,
544};
545
546/* Mapping for the 28 key remote control as seen at
547 http://www.sednacomputer.com/photo/cardbus-tv.jpg
548 Pavel Mihaylov <bin@bash.info> */
549static IR_KEYTAB_TYPE pctv_sedna_codes[IR_KEYTAB_SIZE] = {
550 [ 0 ] = KEY_KP0,
551 [ 1 ] = KEY_KP1,
552 [ 2 ] = KEY_KP2,
553 [ 3 ] = KEY_KP3,
554 [ 4 ] = KEY_KP4,
555 [ 5 ] = KEY_KP5,
556 [ 6 ] = KEY_KP6,
557 [ 7 ] = KEY_KP7,
558 [ 8 ] = KEY_KP8,
559 [ 9 ] = KEY_KP9,
560
561 [ 0x0a ] = KEY_AGAIN, /* Recall */
562 [ 0x0b ] = KEY_CHANNELUP,
563 [ 0x0c ] = KEY_VOLUMEUP,
564 [ 0x0d ] = KEY_MODE, /* Stereo */
565 [ 0x0e ] = KEY_STOP,
566 [ 0x0f ] = KEY_PREVIOUSSONG,
567 [ 0x10 ] = KEY_ZOOM,
568 [ 0x11 ] = KEY_TUNER, /* Source */
569 [ 0x12 ] = KEY_POWER,
570 [ 0x13 ] = KEY_MUTE,
571 [ 0x15 ] = KEY_CHANNELDOWN,
572 [ 0x18 ] = KEY_VOLUMEDOWN,
573 [ 0x19 ] = KEY_SHUFFLE, /* Snapshot */
574 [ 0x1a ] = KEY_NEXTSONG,
575 [ 0x1b ] = KEY_TEXT, /* Time Shift */
576 [ 0x1c ] = KEY_RADIO, /* FM Radio */
577 [ 0x1d ] = KEY_RECORD,
578 [ 0x1e ] = KEY_PAUSE,
579};
580
581
582/* -------------------- GPIO generic keycode builder -------------------- */
405 583
406static int build_key(struct saa7134_dev *dev) 584static int build_key(struct saa7134_dev *dev)
407{ 585{
@@ -413,13 +591,13 @@ static int build_key(struct saa7134_dev *dev)
413 saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN); 591 saa_setb(SAA7134_GPIO_GPMODE3,SAA7134_GPIO_GPRESCAN);
414 592
415 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2); 593 gpio = saa_readl(SAA7134_GPIO_GPSTATUS0 >> 2);
416 if (ir->polling) { 594 if (ir->polling) {
417 if (ir->last_gpio == gpio) 595 if (ir->last_gpio == gpio)
418 return 0; 596 return 0;
419 ir->last_gpio = gpio; 597 ir->last_gpio = gpio;
420 } 598 }
421 599
422 data = ir_extract_bits(gpio, ir->mask_keycode); 600 data = ir_extract_bits(gpio, ir->mask_keycode);
423 dprintk("build_key gpio=0x%x mask=0x%x data=%d\n", 601 dprintk("build_key gpio=0x%x mask=0x%x data=%d\n",
424 gpio, ir->mask_keycode, data); 602 gpio, ir->mask_keycode, data);
425 603
@@ -432,13 +610,87 @@ static int build_key(struct saa7134_dev *dev)
432 return 0; 610 return 0;
433} 611}
434 612
435/* ---------------------------------------------------------------------- */ 613/* --------------------- Chip specific I2C key builders ----------------- */
614
615static int get_key_purpletv(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
616{
617 unsigned char b;
618
619 /* poll IR chip */
620 if (1 != i2c_master_recv(&ir->c,&b,1)) {
621 i2cdprintk("read error\n");
622 return -EIO;
623 }
624
625 /* no button press */
626 if (b==0)
627 return 0;
628
629 /* repeating */
630 if (b & 0x80)
631 return 1;
632
633 *ir_key = b;
634 *ir_raw = b;
635 return 1;
636}
637
638/* The new pinnacle PCTV remote (with the colored buttons)
639 *
640 * Ricardo Cerqueira <v4l@cerqueira.org>
641 */
642
643static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
644{
645 unsigned char b[4];
646 unsigned int start = 0,parity = 0,code = 0;
647
648 /* poll IR chip */
649 if (4 != i2c_master_recv(&ir->c,b,4)) {
650 i2cdprintk("read error\n");
651 return -EIO;
652 }
653
654 for (start = 0; start<4; start++) {
655 if (b[start] == 0x80) {
656 code=b[(start+3)%4];
657 parity=b[(start+2)%4];
658 }
659 }
660
661 /* Empty Request */
662 if (parity==0)
663 return 0;
664
665 /* Repeating... */
666 if (ir->old == parity)
667 return 0;
668
669
670 ir->old = parity;
671
672 /* Reduce code value to fit inside IR_KEYTAB_SIZE
673 *
674 * this is the only value that results in 42 unique
675 * codes < 128
676 */
677
678 code %= 0x88;
679
680 *ir_raw = code;
681 *ir_key = code;
682
683 i2cdprintk("Pinnacle PCTV key %02x\n", code);
684
685 return 1;
686}
687
436 688
437void saa7134_input_irq(struct saa7134_dev *dev) 689void saa7134_input_irq(struct saa7134_dev *dev)
438{ 690{
439 struct saa7134_ir *ir = dev->remote; 691 struct saa7134_ir *ir = dev->remote;
440 692
441 if (!ir->polling) 693 if (!ir->polling)
442 build_key(dev); 694 build_key(dev);
443} 695}
444 696
@@ -464,7 +716,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
464 int polling = 0; 716 int polling = 0;
465 int ir_type = IR_TYPE_OTHER; 717 int ir_type = IR_TYPE_OTHER;
466 718
467 if (!dev->has_remote) 719 if (dev->has_remote != SAA7134_REMOTE_GPIO)
468 return -ENODEV; 720 return -ENODEV;
469 if (disable_ir) 721 if (disable_ir)
470 return -ENODEV; 722 return -ENODEV;
@@ -473,7 +725,8 @@ int saa7134_input_init1(struct saa7134_dev *dev)
473 switch (dev->board) { 725 switch (dev->board) {
474 case SAA7134_BOARD_FLYVIDEO2000: 726 case SAA7134_BOARD_FLYVIDEO2000:
475 case SAA7134_BOARD_FLYVIDEO3000: 727 case SAA7134_BOARD_FLYVIDEO3000:
476 case SAA7134_BOARD_FLYTVPLATINUM_FM: 728 case SAA7134_BOARD_FLYTVPLATINUM_FM:
729 case SAA7134_BOARD_FLYTVPLATINUM_MINI2:
477 ir_codes = flyvideo_codes; 730 ir_codes = flyvideo_codes;
478 mask_keycode = 0xEC00000; 731 mask_keycode = 0xEC00000;
479 mask_keydown = 0x0040000; 732 mask_keydown = 0x0040000;
@@ -514,14 +767,33 @@ int saa7134_input_init1(struct saa7134_dev *dev)
514 saa_setb(SAA7134_GPIO_GPMODE0, 0x4); 767 saa_setb(SAA7134_GPIO_GPMODE0, 0x4);
515 saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4); 768 saa_setb(SAA7134_GPIO_GPSTATUS0, 0x4);
516 break; 769 break;
770 case SAA7134_BOARD_KWORLD_TERMINATOR:
771 ir_codes = avacssmart_codes;
772 mask_keycode = 0x00001f;
773 mask_keyup = 0x000060;
774 polling = 50; // ms
775 break;
517 case SAA7134_BOARD_MANLI_MTV001: 776 case SAA7134_BOARD_MANLI_MTV001:
518 case SAA7134_BOARD_MANLI_MTV002: 777 case SAA7134_BOARD_MANLI_MTV002:
778 case SAA7134_BOARD_BEHOLD_409FM:
519 ir_codes = manli_codes; 779 ir_codes = manli_codes;
520 mask_keycode = 0x001f00; 780 mask_keycode = 0x001f00;
521 mask_keyup = 0x004000; 781 mask_keyup = 0x004000;
522 mask_keydown = 0x002000;
523 polling = 50; // ms 782 polling = 50; // ms
524 break; 783 break;
784 case SAA7134_BOARD_SEDNA_PC_TV_CARDBUS:
785 ir_codes = pctv_sedna_codes;
786 mask_keycode = 0x001f00;
787 mask_keyup = 0x004000;
788 polling = 50; // ms
789 break;
790 case SAA7134_BOARD_GOTVIEW_7135:
791 ir_codes = gotview7135_codes;
792 mask_keycode = 0x0003EC;
793 mask_keyup = 0x008000;
794 mask_keydown = 0x000010;
795 polling = 50; // ms
796 break;
525 case SAA7134_BOARD_VIDEOMATE_TV_PVR: 797 case SAA7134_BOARD_VIDEOMATE_TV_PVR:
526 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII: 798 case SAA7134_BOARD_VIDEOMATE_TV_GOLD_PLUSII:
527 ir_codes = videomate_tv_pvr_codes; 799 ir_codes = videomate_tv_pvr_codes;
@@ -529,6 +801,12 @@ int saa7134_input_init1(struct saa7134_dev *dev)
529 mask_keyup = 0x400000; 801 mask_keyup = 0x400000;
530 polling = 50; // ms 802 polling = 50; // ms
531 break; 803 break;
804 case SAA7134_BOARD_VIDEOMATE_DVBT_300:
805 case SAA7134_BOARD_VIDEOMATE_DVBT_200:
806 ir_codes = videomate_tv_pvr_codes;
807 mask_keycode = 0x003F00;
808 mask_keyup = 0x040000;
809 break;
532 } 810 }
533 if (NULL == ir_codes) { 811 if (NULL == ir_codes) {
534 printk("%s: Oops: IR config error [card=%d]\n", 812 printk("%s: Oops: IR config error [card=%d]\n",
@@ -548,7 +826,7 @@ int saa7134_input_init1(struct saa7134_dev *dev)
548 ir->mask_keycode = mask_keycode; 826 ir->mask_keycode = mask_keycode;
549 ir->mask_keydown = mask_keydown; 827 ir->mask_keydown = mask_keydown;
550 ir->mask_keyup = mask_keyup; 828 ir->mask_keyup = mask_keyup;
551 ir->polling = polling; 829 ir->polling = polling;
552 830
553 /* init input device */ 831 /* init input device */
554 snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)", 832 snprintf(ir->name, sizeof(ir->name), "saa7134 IR (%s)",
@@ -596,6 +874,31 @@ void saa7134_input_fini(struct saa7134_dev *dev)
596 dev->remote = NULL; 874 dev->remote = NULL;
597} 875}
598 876
877void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir)
878{
879 if (disable_ir) {
880 dprintk("Found supported i2c remote, but IR has been disabled\n");
881 ir->get_key=NULL;
882 return;
883 }
884
885 switch (dev->board) {
886 case SAA7134_BOARD_PINNACLE_PCTV_110i:
887 snprintf(ir->c.name, sizeof(ir->c.name), "Pinnacle PCTV");
888 ir->get_key = get_key_pinnacle;
889 ir->ir_codes = ir_codes_pinnacle;
890 break;
891 case SAA7134_BOARD_UPMOST_PURPLE_TV:
892 snprintf(ir->c.name, sizeof(ir->c.name), "Purple TV");
893 ir->get_key = get_key_purpletv;
894 ir->ir_codes = ir_codes_purpletv;
895 break;
896 default:
897 dprintk("Shouldn't get here: Unknown board %x for I2C IR?\n",dev->board);
898 break;
899 }
900
901}
599/* ---------------------------------------------------------------------- 902/* ----------------------------------------------------------------------
600 * Local variables: 903 * Local variables:
601 * c-basic-offset: 8 904 * c-basic-offset: 8
diff --git a/drivers/media/video/saa7134/saa7134-oss.c b/drivers/media/video/saa7134/saa7134-oss.c
index c20630c82f1c..fd53dfcc1644 100644
--- a/drivers/media/video/saa7134/saa7134-oss.c
+++ b/drivers/media/video/saa7134/saa7134-oss.c
@@ -44,6 +44,7 @@ MODULE_PARM_DESC(oss_rate,"sample rate (valid are: 32000,48000)");
44#define dprintk(fmt, arg...) if (oss_debug) \ 44#define dprintk(fmt, arg...) if (oss_debug) \
45 printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg) 45 printk(KERN_DEBUG "%s/oss: " fmt, dev->name , ## arg)
46 46
47
47/* ------------------------------------------------------------------ */ 48/* ------------------------------------------------------------------ */
48 49
49static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks) 50static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
@@ -58,12 +59,12 @@ static int dsp_buffer_conf(struct saa7134_dev *dev, int blksize, int blocks)
58 if ((blksize * blocks) > 1024*1024) 59 if ((blksize * blocks) > 1024*1024)
59 blocks = 1024*1024 / blksize; 60 blocks = 1024*1024 / blksize;
60 61
61 dev->oss.blocks = blocks; 62 dev->dmasound.blocks = blocks;
62 dev->oss.blksize = blksize; 63 dev->dmasound.blksize = blksize;
63 dev->oss.bufsize = blksize * blocks; 64 dev->dmasound.bufsize = blksize * blocks;
64 65
65 dprintk("buffer config: %d blocks / %d bytes, %d kB total\n", 66 dprintk("buffer config: %d blocks / %d bytes, %d kB total\n",
66 blocks,blksize,blksize * blocks / 1024); 67 blocks,blksize,blksize * blocks / 1024);
67 return 0; 68 return 0;
68} 69}
69 70
@@ -71,11 +72,11 @@ static int dsp_buffer_init(struct saa7134_dev *dev)
71{ 72{
72 int err; 73 int err;
73 74
74 if (!dev->oss.bufsize) 75 if (!dev->dmasound.bufsize)
75 BUG(); 76 BUG();
76 videobuf_dma_init(&dev->oss.dma); 77 videobuf_dma_init(&dev->dmasound.dma);
77 err = videobuf_dma_init_kernel(&dev->oss.dma, PCI_DMA_FROMDEVICE, 78 err = videobuf_dma_init_kernel(&dev->dmasound.dma, PCI_DMA_FROMDEVICE,
78 (dev->oss.bufsize + PAGE_SIZE) >> PAGE_SHIFT); 79 (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT);
79 if (0 != err) 80 if (0 != err)
80 return err; 81 return err;
81 return 0; 82 return 0;
@@ -83,26 +84,26 @@ static int dsp_buffer_init(struct saa7134_dev *dev)
83 84
84static int dsp_buffer_free(struct saa7134_dev *dev) 85static int dsp_buffer_free(struct saa7134_dev *dev)
85{ 86{
86 if (!dev->oss.blksize) 87 if (!dev->dmasound.blksize)
87 BUG(); 88 BUG();
88 videobuf_dma_free(&dev->oss.dma); 89 videobuf_dma_free(&dev->dmasound.dma);
89 dev->oss.blocks = 0; 90 dev->dmasound.blocks = 0;
90 dev->oss.blksize = 0; 91 dev->dmasound.blksize = 0;
91 dev->oss.bufsize = 0; 92 dev->dmasound.bufsize = 0;
92 return 0; 93 return 0;
93} 94}
94 95
95static void dsp_dma_start(struct saa7134_dev *dev) 96static void dsp_dma_start(struct saa7134_dev *dev)
96{ 97{
97 dev->oss.dma_blk = 0; 98 dev->dmasound.dma_blk = 0;
98 dev->oss.dma_running = 1; 99 dev->dmasound.dma_running = 1;
99 saa7134_set_dmabits(dev); 100 saa7134_set_dmabits(dev);
100} 101}
101 102
102static void dsp_dma_stop(struct saa7134_dev *dev) 103static void dsp_dma_stop(struct saa7134_dev *dev)
103{ 104{
104 dev->oss.dma_blk = -1; 105 dev->dmasound.dma_blk = -1;
105 dev->oss.dma_running = 0; 106 dev->dmasound.dma_running = 0;
106 saa7134_set_dmabits(dev); 107 saa7134_set_dmabits(dev);
107} 108}
108 109
@@ -113,18 +114,18 @@ static int dsp_rec_start(struct saa7134_dev *dev)
113 unsigned long flags; 114 unsigned long flags;
114 115
115 /* prepare buffer */ 116 /* prepare buffer */
116 if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->oss.dma))) 117 if (0 != (err = videobuf_dma_pci_map(dev->pci,&dev->dmasound.dma)))
117 return err; 118 return err;
118 if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->oss.pt))) 119 if (0 != (err = saa7134_pgtable_alloc(dev->pci,&dev->dmasound.pt)))
119 goto fail1; 120 goto fail1;
120 if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->oss.pt, 121 if (0 != (err = saa7134_pgtable_build(dev->pci,&dev->dmasound.pt,
121 dev->oss.dma.sglist, 122 dev->dmasound.dma.sglist,
122 dev->oss.dma.sglen, 123 dev->dmasound.dma.sglen,
123 0))) 124 0)))
124 goto fail2; 125 goto fail2;
125 126
126 /* sample format */ 127 /* sample format */
127 switch (dev->oss.afmt) { 128 switch (dev->dmasound.afmt) {
128 case AFMT_U8: 129 case AFMT_U8:
129 case AFMT_S8: fmt = 0x00; break; 130 case AFMT_S8: fmt = 0x00; break;
130 case AFMT_U16_LE: 131 case AFMT_U16_LE:
@@ -136,14 +137,14 @@ static int dsp_rec_start(struct saa7134_dev *dev)
136 goto fail2; 137 goto fail2;
137 } 138 }
138 139
139 switch (dev->oss.afmt) { 140 switch (dev->dmasound.afmt) {
140 case AFMT_S8: 141 case AFMT_S8:
141 case AFMT_S16_LE: 142 case AFMT_S16_LE:
142 case AFMT_S16_BE: sign = 1; break; 143 case AFMT_S16_BE: sign = 1; break;
143 default: sign = 0; break; 144 default: sign = 0; break;
144 } 145 }
145 146
146 switch (dev->oss.afmt) { 147 switch (dev->dmasound.afmt) {
147 case AFMT_U16_BE: 148 case AFMT_U16_BE:
148 case AFMT_S16_BE: bswap = 1; break; 149 case AFMT_S16_BE: bswap = 1; break;
149 default: bswap = 0; break; 150 default: bswap = 0; break;
@@ -151,58 +152,58 @@ static int dsp_rec_start(struct saa7134_dev *dev)
151 152
152 switch (dev->pci->device) { 153 switch (dev->pci->device) {
153 case PCI_DEVICE_ID_PHILIPS_SAA7134: 154 case PCI_DEVICE_ID_PHILIPS_SAA7134:
154 if (1 == dev->oss.channels) 155 if (1 == dev->dmasound.channels)
155 fmt |= (1 << 3); 156 fmt |= (1 << 3);
156 if (2 == dev->oss.channels) 157 if (2 == dev->dmasound.channels)
157 fmt |= (3 << 3); 158 fmt |= (3 << 3);
158 if (sign) 159 if (sign)
159 fmt |= 0x04; 160 fmt |= 0x04;
160 fmt |= (TV == dev->oss.input) ? 0xc0 : 0x80; 161 fmt |= (TV == dev->dmasound.input) ? 0xc0 : 0x80;
161 162
162 saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->oss.blksize - 1) & 0x0000ff)); 163 saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->dmasound.blksize - 1) & 0x0000ff));
163 saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->oss.blksize - 1) & 0x00ff00) >> 8); 164 saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->dmasound.blksize - 1) & 0x00ff00) >> 8);
164 saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->oss.blksize - 1) & 0xff0000) >> 16); 165 saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->dmasound.blksize - 1) & 0xff0000) >> 16);
165 saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt); 166 saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt);
166 167
167 break; 168 break;
168 case PCI_DEVICE_ID_PHILIPS_SAA7133: 169 case PCI_DEVICE_ID_PHILIPS_SAA7133:
169 case PCI_DEVICE_ID_PHILIPS_SAA7135: 170 case PCI_DEVICE_ID_PHILIPS_SAA7135:
170 if (1 == dev->oss.channels) 171 if (1 == dev->dmasound.channels)
171 fmt |= (1 << 4); 172 fmt |= (1 << 4);
172 if (2 == dev->oss.channels) 173 if (2 == dev->dmasound.channels)
173 fmt |= (2 << 4); 174 fmt |= (2 << 4);
174 if (!sign) 175 if (!sign)
175 fmt |= 0x04; 176 fmt |= 0x04;
176 saa_writel(0x588 >> 2, dev->oss.blksize -4); 177 saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -4);
177 saa_writel(0x58c >> 2, 0x543210 | (fmt << 24)); 178 saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
178 break; 179 break;
179 } 180 }
180 dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n", 181 dprintk("rec_start: afmt=%d ch=%d => fmt=0x%x swap=%c\n",
181 dev->oss.afmt, dev->oss.channels, fmt, 182 dev->dmasound.afmt, dev->dmasound.channels, fmt,
182 bswap ? 'b' : '-'); 183 bswap ? 'b' : '-');
183 184
184 /* dma: setup channel 6 (= AUDIO) */ 185 /* dma: setup channel 6 (= AUDIO) */
185 control = SAA7134_RS_CONTROL_BURST_16 | 186 control = SAA7134_RS_CONTROL_BURST_16 |
186 SAA7134_RS_CONTROL_ME | 187 SAA7134_RS_CONTROL_ME |
187 (dev->oss.pt.dma >> 12); 188 (dev->dmasound.pt.dma >> 12);
188 if (bswap) 189 if (bswap)
189 control |= SAA7134_RS_CONTROL_BSWAP; 190 control |= SAA7134_RS_CONTROL_BSWAP;
190 saa_writel(SAA7134_RS_BA1(6),0); 191 saa_writel(SAA7134_RS_BA1(6),0);
191 saa_writel(SAA7134_RS_BA2(6),dev->oss.blksize); 192 saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize);
192 saa_writel(SAA7134_RS_PITCH(6),0); 193 saa_writel(SAA7134_RS_PITCH(6),0);
193 saa_writel(SAA7134_RS_CONTROL(6),control); 194 saa_writel(SAA7134_RS_CONTROL(6),control);
194 195
195 /* start dma */ 196 /* start dma */
196 dev->oss.recording_on = 1; 197 dev->dmasound.recording_on = 1;
197 spin_lock_irqsave(&dev->slock,flags); 198 spin_lock_irqsave(&dev->slock,flags);
198 dsp_dma_start(dev); 199 dsp_dma_start(dev);
199 spin_unlock_irqrestore(&dev->slock,flags); 200 spin_unlock_irqrestore(&dev->slock,flags);
200 return 0; 201 return 0;
201 202
202 fail2: 203 fail2:
203 saa7134_pgtable_free(dev->pci,&dev->oss.pt); 204 saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
204 fail1: 205 fail1:
205 videobuf_dma_pci_unmap(dev->pci,&dev->oss.dma); 206 videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
206 return err; 207 return err;
207} 208}
208 209
@@ -210,17 +211,17 @@ static int dsp_rec_stop(struct saa7134_dev *dev)
210{ 211{
211 unsigned long flags; 212 unsigned long flags;
212 213
213 dprintk("rec_stop dma_blk=%d\n",dev->oss.dma_blk); 214 dprintk("rec_stop dma_blk=%d\n",dev->dmasound.dma_blk);
214 215
215 /* stop dma */ 216 /* stop dma */
216 dev->oss.recording_on = 0; 217 dev->dmasound.recording_on = 0;
217 spin_lock_irqsave(&dev->slock,flags); 218 spin_lock_irqsave(&dev->slock,flags);
218 dsp_dma_stop(dev); 219 dsp_dma_stop(dev);
219 spin_unlock_irqrestore(&dev->slock,flags); 220 spin_unlock_irqrestore(&dev->slock,flags);
220 221
221 /* unlock buffer */ 222 /* unlock buffer */
222 saa7134_pgtable_free(dev->pci,&dev->oss.pt); 223 saa7134_pgtable_free(dev->pci,&dev->dmasound.pt);
223 videobuf_dma_pci_unmap(dev->pci,&dev->oss.dma); 224 videobuf_dma_pci_unmap(dev->pci,&dev->dmasound.dma);
224 return 0; 225 return 0;
225} 226}
226 227
@@ -235,35 +236,35 @@ static int dsp_open(struct inode *inode, struct file *file)
235 236
236 list_for_each(list,&saa7134_devlist) { 237 list_for_each(list,&saa7134_devlist) {
237 h = list_entry(list, struct saa7134_dev, devlist); 238 h = list_entry(list, struct saa7134_dev, devlist);
238 if (h->oss.minor_dsp == minor) 239 if (h->dmasound.minor_dsp == minor)
239 dev = h; 240 dev = h;
240 } 241 }
241 if (NULL == dev) 242 if (NULL == dev)
242 return -ENODEV; 243 return -ENODEV;
243 244
244 down(&dev->oss.lock); 245 down(&dev->dmasound.lock);
245 err = -EBUSY; 246 err = -EBUSY;
246 if (dev->oss.users_dsp) 247 if (dev->dmasound.users_dsp)
247 goto fail1; 248 goto fail1;
248 dev->oss.users_dsp++; 249 dev->dmasound.users_dsp++;
249 file->private_data = dev; 250 file->private_data = dev;
250 251
251 dev->oss.afmt = AFMT_U8; 252 dev->dmasound.afmt = AFMT_U8;
252 dev->oss.channels = 1; 253 dev->dmasound.channels = 1;
253 dev->oss.read_count = 0; 254 dev->dmasound.read_count = 0;
254 dev->oss.read_offset = 0; 255 dev->dmasound.read_offset = 0;
255 dsp_buffer_conf(dev,PAGE_SIZE,64); 256 dsp_buffer_conf(dev,PAGE_SIZE,64);
256 err = dsp_buffer_init(dev); 257 err = dsp_buffer_init(dev);
257 if (0 != err) 258 if (0 != err)
258 goto fail2; 259 goto fail2;
259 260
260 up(&dev->oss.lock); 261 up(&dev->dmasound.lock);
261 return 0; 262 return 0;
262 263
263 fail2: 264 fail2:
264 dev->oss.users_dsp--; 265 dev->dmasound.users_dsp--;
265 fail1: 266 fail1:
266 up(&dev->oss.lock); 267 up(&dev->dmasound.lock);
267 return err; 268 return err;
268} 269}
269 270
@@ -271,13 +272,13 @@ static int dsp_release(struct inode *inode, struct file *file)
271{ 272{
272 struct saa7134_dev *dev = file->private_data; 273 struct saa7134_dev *dev = file->private_data;
273 274
274 down(&dev->oss.lock); 275 down(&dev->dmasound.lock);
275 if (dev->oss.recording_on) 276 if (dev->dmasound.recording_on)
276 dsp_rec_stop(dev); 277 dsp_rec_stop(dev);
277 dsp_buffer_free(dev); 278 dsp_buffer_free(dev);
278 dev->oss.users_dsp--; 279 dev->dmasound.users_dsp--;
279 file->private_data = NULL; 280 file->private_data = NULL;
280 up(&dev->oss.lock); 281 up(&dev->dmasound.lock);
281 return 0; 282 return 0;
282} 283}
283 284
@@ -290,12 +291,12 @@ static ssize_t dsp_read(struct file *file, char __user *buffer,
290 unsigned long flags; 291 unsigned long flags;
291 int err,ret = 0; 292 int err,ret = 0;
292 293
293 add_wait_queue(&dev->oss.wq, &wait); 294 add_wait_queue(&dev->dmasound.wq, &wait);
294 down(&dev->oss.lock); 295 down(&dev->dmasound.lock);
295 while (count > 0) { 296 while (count > 0) {
296 /* wait for data if needed */ 297 /* wait for data if needed */
297 if (0 == dev->oss.read_count) { 298 if (0 == dev->dmasound.read_count) {
298 if (!dev->oss.recording_on) { 299 if (!dev->dmasound.recording_on) {
299 err = dsp_rec_start(dev); 300 err = dsp_rec_start(dev);
300 if (err < 0) { 301 if (err < 0) {
301 if (0 == ret) 302 if (0 == ret)
@@ -303,8 +304,8 @@ static ssize_t dsp_read(struct file *file, char __user *buffer,
303 break; 304 break;
304 } 305 }
305 } 306 }
306 if (dev->oss.recording_on && 307 if (dev->dmasound.recording_on &&
307 !dev->oss.dma_running) { 308 !dev->dmasound.dma_running) {
308 /* recover from overruns */ 309 /* recover from overruns */
309 spin_lock_irqsave(&dev->slock,flags); 310 spin_lock_irqsave(&dev->slock,flags);
310 dsp_dma_start(dev); 311 dsp_dma_start(dev);
@@ -315,12 +316,12 @@ static ssize_t dsp_read(struct file *file, char __user *buffer,
315 ret = -EAGAIN; 316 ret = -EAGAIN;
316 break; 317 break;
317 } 318 }
318 up(&dev->oss.lock); 319 up(&dev->dmasound.lock);
319 set_current_state(TASK_INTERRUPTIBLE); 320 set_current_state(TASK_INTERRUPTIBLE);
320 if (0 == dev->oss.read_count) 321 if (0 == dev->dmasound.read_count)
321 schedule(); 322 schedule();
322 set_current_state(TASK_RUNNING); 323 set_current_state(TASK_RUNNING);
323 down(&dev->oss.lock); 324 down(&dev->dmasound.lock);
324 if (signal_pending(current)) { 325 if (signal_pending(current)) {
325 if (0 == ret) 326 if (0 == ret)
326 ret = -EINTR; 327 ret = -EINTR;
@@ -330,12 +331,12 @@ static ssize_t dsp_read(struct file *file, char __user *buffer,
330 331
331 /* copy data to userspace */ 332 /* copy data to userspace */
332 bytes = count; 333 bytes = count;
333 if (bytes > dev->oss.read_count) 334 if (bytes > dev->dmasound.read_count)
334 bytes = dev->oss.read_count; 335 bytes = dev->dmasound.read_count;
335 if (bytes > dev->oss.bufsize - dev->oss.read_offset) 336 if (bytes > dev->dmasound.bufsize - dev->dmasound.read_offset)
336 bytes = dev->oss.bufsize - dev->oss.read_offset; 337 bytes = dev->dmasound.bufsize - dev->dmasound.read_offset;
337 if (copy_to_user(buffer + ret, 338 if (copy_to_user(buffer + ret,
338 dev->oss.dma.vmalloc + dev->oss.read_offset, 339 dev->dmasound.dma.vmalloc + dev->dmasound.read_offset,
339 bytes)) { 340 bytes)) {
340 if (0 == ret) 341 if (0 == ret)
341 ret = -EFAULT; 342 ret = -EFAULT;
@@ -344,13 +345,13 @@ static ssize_t dsp_read(struct file *file, char __user *buffer,
344 345
345 ret += bytes; 346 ret += bytes;
346 count -= bytes; 347 count -= bytes;
347 dev->oss.read_count -= bytes; 348 dev->dmasound.read_count -= bytes;
348 dev->oss.read_offset += bytes; 349 dev->dmasound.read_offset += bytes;
349 if (dev->oss.read_offset == dev->oss.bufsize) 350 if (dev->dmasound.read_offset == dev->dmasound.bufsize)
350 dev->oss.read_offset = 0; 351 dev->dmasound.read_offset = 0;
351 } 352 }
352 up(&dev->oss.lock); 353 up(&dev->dmasound.lock);
353 remove_wait_queue(&dev->oss.wq, &wait); 354 remove_wait_queue(&dev->dmasound.wq, &wait);
354 return ret; 355 return ret;
355} 356}
356 357
@@ -370,53 +371,53 @@ static int dsp_ioctl(struct inode *inode, struct file *file,
370 371
371 if (oss_debug > 1) 372 if (oss_debug > 1)
372 saa7134_print_ioctl(dev->name,cmd); 373 saa7134_print_ioctl(dev->name,cmd);
373 switch (cmd) { 374 switch (cmd) {
374 case OSS_GETVERSION: 375 case OSS_GETVERSION:
375 return put_user(SOUND_VERSION, p); 376 return put_user(SOUND_VERSION, p);
376 case SNDCTL_DSP_GETCAPS: 377 case SNDCTL_DSP_GETCAPS:
377 return 0; 378 return 0;
378 379
379 case SNDCTL_DSP_SPEED: 380 case SNDCTL_DSP_SPEED:
380 if (get_user(val, p)) 381 if (get_user(val, p))
381 return -EFAULT; 382 return -EFAULT;
382 /* fall through */ 383 /* fall through */
383 case SOUND_PCM_READ_RATE: 384 case SOUND_PCM_READ_RATE:
384 return put_user(dev->oss.rate, p); 385 return put_user(dev->dmasound.rate, p);
385 386
386 case SNDCTL_DSP_STEREO: 387 case SNDCTL_DSP_STEREO:
387 if (get_user(val, p)) 388 if (get_user(val, p))
388 return -EFAULT; 389 return -EFAULT;
389 down(&dev->oss.lock); 390 down(&dev->dmasound.lock);
390 dev->oss.channels = val ? 2 : 1; 391 dev->dmasound.channels = val ? 2 : 1;
391 if (dev->oss.recording_on) { 392 if (dev->dmasound.recording_on) {
392 dsp_rec_stop(dev); 393 dsp_rec_stop(dev);
393 dsp_rec_start(dev); 394 dsp_rec_start(dev);
394 } 395 }
395 up(&dev->oss.lock); 396 up(&dev->dmasound.lock);
396 return put_user(dev->oss.channels-1, p); 397 return put_user(dev->dmasound.channels-1, p);
397 398
398 case SNDCTL_DSP_CHANNELS: 399 case SNDCTL_DSP_CHANNELS:
399 if (get_user(val, p)) 400 if (get_user(val, p))
400 return -EFAULT; 401 return -EFAULT;
401 if (val != 1 && val != 2) 402 if (val != 1 && val != 2)
402 return -EINVAL; 403 return -EINVAL;
403 down(&dev->oss.lock); 404 down(&dev->dmasound.lock);
404 dev->oss.channels = val; 405 dev->dmasound.channels = val;
405 if (dev->oss.recording_on) { 406 if (dev->dmasound.recording_on) {
406 dsp_rec_stop(dev); 407 dsp_rec_stop(dev);
407 dsp_rec_start(dev); 408 dsp_rec_start(dev);
408 } 409 }
409 up(&dev->oss.lock); 410 up(&dev->dmasound.lock);
410 /* fall through */ 411 /* fall through */
411 case SOUND_PCM_READ_CHANNELS: 412 case SOUND_PCM_READ_CHANNELS:
412 return put_user(dev->oss.channels, p); 413 return put_user(dev->dmasound.channels, p);
413 414
414 case SNDCTL_DSP_GETFMTS: /* Returns a mask */ 415 case SNDCTL_DSP_GETFMTS: /* Returns a mask */
415 return put_user(AFMT_U8 | AFMT_S8 | 416 return put_user(AFMT_U8 | AFMT_S8 |
416 AFMT_U16_LE | AFMT_U16_BE | 417 AFMT_U16_LE | AFMT_U16_BE |
417 AFMT_S16_LE | AFMT_S16_BE, p); 418 AFMT_S16_LE | AFMT_S16_BE, p);
418 419
419 case SNDCTL_DSP_SETFMT: /* Selects ONE fmt */ 420 case SNDCTL_DSP_SETFMT: /* Selects ONE fmt */
420 if (get_user(val, p)) 421 if (get_user(val, p))
421 return -EFAULT; 422 return -EFAULT;
422 switch (val) { 423 switch (val) {
@@ -429,20 +430,20 @@ static int dsp_ioctl(struct inode *inode, struct file *file,
429 case AFMT_U16_BE: 430 case AFMT_U16_BE:
430 case AFMT_S16_LE: 431 case AFMT_S16_LE:
431 case AFMT_S16_BE: 432 case AFMT_S16_BE:
432 down(&dev->oss.lock); 433 down(&dev->dmasound.lock);
433 dev->oss.afmt = val; 434 dev->dmasound.afmt = val;
434 if (dev->oss.recording_on) { 435 if (dev->dmasound.recording_on) {
435 dsp_rec_stop(dev); 436 dsp_rec_stop(dev);
436 dsp_rec_start(dev); 437 dsp_rec_start(dev);
437 } 438 }
438 up(&dev->oss.lock); 439 up(&dev->dmasound.lock);
439 return put_user(dev->oss.afmt, p); 440 return put_user(dev->dmasound.afmt, p);
440 default: 441 default:
441 return -EINVAL; 442 return -EINVAL;
442 } 443 }
443 444
444 case SOUND_PCM_READ_BITS: 445 case SOUND_PCM_READ_BITS:
445 switch (dev->oss.afmt) { 446 switch (dev->dmasound.afmt) {
446 case AFMT_U8: 447 case AFMT_U8:
447 case AFMT_S8: 448 case AFMT_S8:
448 return put_user(8, p); 449 return put_user(8, p);
@@ -455,23 +456,23 @@ static int dsp_ioctl(struct inode *inode, struct file *file,
455 return -EINVAL; 456 return -EINVAL;
456 } 457 }
457 458
458 case SNDCTL_DSP_NONBLOCK: 459 case SNDCTL_DSP_NONBLOCK:
459 file->f_flags |= O_NONBLOCK; 460 file->f_flags |= O_NONBLOCK;
460 return 0; 461 return 0;
461 462
462 case SNDCTL_DSP_RESET: 463 case SNDCTL_DSP_RESET:
463 down(&dev->oss.lock); 464 down(&dev->dmasound.lock);
464 if (dev->oss.recording_on) 465 if (dev->dmasound.recording_on)
465 dsp_rec_stop(dev); 466 dsp_rec_stop(dev);
466 up(&dev->oss.lock); 467 up(&dev->dmasound.lock);
467 return 0; 468 return 0;
468 case SNDCTL_DSP_GETBLKSIZE: 469 case SNDCTL_DSP_GETBLKSIZE:
469 return put_user(dev->oss.blksize, p); 470 return put_user(dev->dmasound.blksize, p);
470 471
471 case SNDCTL_DSP_SETFRAGMENT: 472 case SNDCTL_DSP_SETFRAGMENT:
472 if (get_user(val, p)) 473 if (get_user(val, p))
473 return -EFAULT; 474 return -EFAULT;
474 if (dev->oss.recording_on) 475 if (dev->dmasound.recording_on)
475 return -EBUSY; 476 return -EBUSY;
476 dsp_buffer_free(dev); 477 dsp_buffer_free(dev);
477 /* used to be arg >> 16 instead of val >> 16; fixed */ 478 /* used to be arg >> 16 instead of val >> 16; fixed */
@@ -479,16 +480,16 @@ static int dsp_ioctl(struct inode *inode, struct file *file,
479 dsp_buffer_init(dev); 480 dsp_buffer_init(dev);
480 return 0; 481 return 0;
481 482
482 case SNDCTL_DSP_SYNC: 483 case SNDCTL_DSP_SYNC:
483 /* NOP */ 484 /* NOP */
484 return 0; 485 return 0;
485 486
486 case SNDCTL_DSP_GETISPACE: 487 case SNDCTL_DSP_GETISPACE:
487 { 488 {
488 audio_buf_info info; 489 audio_buf_info info;
489 info.fragsize = dev->oss.blksize; 490 info.fragsize = dev->dmasound.blksize;
490 info.fragstotal = dev->oss.blocks; 491 info.fragstotal = dev->dmasound.blocks;
491 info.bytes = dev->oss.read_count; 492 info.bytes = dev->dmasound.read_count;
492 info.fragments = info.bytes / info.fragsize; 493 info.fragments = info.bytes / info.fragsize;
493 if (copy_to_user(argp, &info, sizeof(info))) 494 if (copy_to_user(argp, &info, sizeof(info)))
494 return -EFAULT; 495 return -EFAULT;
@@ -504,13 +505,13 @@ static unsigned int dsp_poll(struct file *file, struct poll_table_struct *wait)
504 struct saa7134_dev *dev = file->private_data; 505 struct saa7134_dev *dev = file->private_data;
505 unsigned int mask = 0; 506 unsigned int mask = 0;
506 507
507 poll_wait(file, &dev->oss.wq, wait); 508 poll_wait(file, &dev->dmasound.wq, wait);
508 509
509 if (0 == dev->oss.read_count) { 510 if (0 == dev->dmasound.read_count) {
510 down(&dev->oss.lock); 511 down(&dev->dmasound.lock);
511 if (!dev->oss.recording_on) 512 if (!dev->dmasound.recording_on)
512 dsp_rec_start(dev); 513 dsp_rec_start(dev);
513 up(&dev->oss.lock); 514 up(&dev->dmasound.lock);
514 } else 515 } else
515 mask |= (POLLIN | POLLRDNORM); 516 mask |= (POLLIN | POLLRDNORM);
516 return mask; 517 return mask;
@@ -534,7 +535,7 @@ mixer_recsrc_7134(struct saa7134_dev *dev)
534{ 535{
535 int analog_io,rate; 536 int analog_io,rate;
536 537
537 switch (dev->oss.input) { 538 switch (dev->dmasound.input) {
538 case TV: 539 case TV:
539 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0xc0); 540 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0xc0);
540 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x00); 541 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x00);
@@ -542,8 +543,8 @@ mixer_recsrc_7134(struct saa7134_dev *dev)
542 case LINE1: 543 case LINE1:
543 case LINE2: 544 case LINE2:
544 case LINE2_LEFT: 545 case LINE2_LEFT:
545 analog_io = (LINE1 == dev->oss.input) ? 0x00 : 0x08; 546 analog_io = (LINE1 == dev->dmasound.input) ? 0x00 : 0x08;
546 rate = (32000 == dev->oss.rate) ? 0x01 : 0x03; 547 rate = (32000 == dev->dmasound.rate) ? 0x01 : 0x03;
547 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io); 548 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io);
548 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80); 549 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80);
549 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate); 550 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate);
@@ -559,10 +560,10 @@ mixer_recsrc_7133(struct saa7134_dev *dev)
559 560
560 xbarin = 0x03; // adc 561 xbarin = 0x03; // adc
561 anabar = 0; 562 anabar = 0;
562 switch (dev->oss.input) { 563 switch (dev->dmasound.input) {
563 case TV: 564 case TV:
564 xbarin = 0; // Demodulator 565 xbarin = 0; // Demodulator
565 anabar = 2; // DACs 566 anabar = 2; // DACs
566 break; 567 break;
567 case LINE1: 568 case LINE1:
568 anabar = 0; // aux1, aux1 569 anabar = 0; // aux1, aux1
@@ -585,9 +586,9 @@ mixer_recsrc(struct saa7134_dev *dev, enum saa7134_audio_in src)
585{ 586{
586 static const char *iname[] = { "Oops", "TV", "LINE1", "LINE2" }; 587 static const char *iname[] = { "Oops", "TV", "LINE1", "LINE2" };
587 588
588 dev->oss.count++; 589 dev->dmasound.count++;
589 dev->oss.input = src; 590 dev->dmasound.input = src;
590 dprintk("mixer input = %s\n",iname[dev->oss.input]); 591 dprintk("mixer input = %s\n",iname[dev->dmasound.input]);
591 592
592 switch (dev->pci->device) { 593 switch (dev->pci->device) {
593 case PCI_DEVICE_ID_PHILIPS_SAA7134: 594 case PCI_DEVICE_ID_PHILIPS_SAA7134:
@@ -639,7 +640,7 @@ static int mixer_open(struct inode *inode, struct file *file)
639 640
640 list_for_each(list,&saa7134_devlist) { 641 list_for_each(list,&saa7134_devlist) {
641 h = list_entry(list, struct saa7134_dev, devlist); 642 h = list_entry(list, struct saa7134_dev, devlist);
642 if (h->oss.minor_mixer == minor) 643 if (h->dmasound.minor_mixer == minor)
643 dev = h; 644 dev = h;
644 } 645 }
645 if (NULL == dev) 646 if (NULL == dev)
@@ -666,28 +667,28 @@ static int mixer_ioctl(struct inode *inode, struct file *file,
666 667
667 if (oss_debug > 1) 668 if (oss_debug > 1)
668 saa7134_print_ioctl(dev->name,cmd); 669 saa7134_print_ioctl(dev->name,cmd);
669 switch (cmd) { 670 switch (cmd) {
670 case OSS_GETVERSION: 671 case OSS_GETVERSION:
671 return put_user(SOUND_VERSION, p); 672 return put_user(SOUND_VERSION, p);
672 case SOUND_MIXER_INFO: 673 case SOUND_MIXER_INFO:
673 { 674 {
674 mixer_info info; 675 mixer_info info;
675 memset(&info,0,sizeof(info)); 676 memset(&info,0,sizeof(info));
676 strlcpy(info.id, "TV audio", sizeof(info.id)); 677 strlcpy(info.id, "TV audio", sizeof(info.id));
677 strlcpy(info.name, dev->name, sizeof(info.name)); 678 strlcpy(info.name, dev->name, sizeof(info.name));
678 info.modify_counter = dev->oss.count; 679 info.modify_counter = dev->dmasound.count;
679 if (copy_to_user(argp, &info, sizeof(info))) 680 if (copy_to_user(argp, &info, sizeof(info)))
680 return -EFAULT; 681 return -EFAULT;
681 return 0; 682 return 0;
682 } 683 }
683 case SOUND_OLD_MIXER_INFO: 684 case SOUND_OLD_MIXER_INFO:
684 { 685 {
685 _old_mixer_info info; 686 _old_mixer_info info;
686 memset(&info,0,sizeof(info)); 687 memset(&info,0,sizeof(info));
687 strlcpy(info.id, "TV audio", sizeof(info.id)); 688 strlcpy(info.id, "TV audio", sizeof(info.id));
688 strlcpy(info.name, dev->name, sizeof(info.name)); 689 strlcpy(info.name, dev->name, sizeof(info.name));
689 if (copy_to_user(argp, &info, sizeof(info))) 690 if (copy_to_user(argp, &info, sizeof(info)))
690 return -EFAULT; 691 return -EFAULT;
691 return 0; 692 return 0;
692 } 693 }
693 case MIXER_READ(SOUND_MIXER_CAPS): 694 case MIXER_READ(SOUND_MIXER_CAPS):
@@ -697,26 +698,26 @@ static int mixer_ioctl(struct inode *inode, struct file *file,
697 case MIXER_READ(SOUND_MIXER_RECMASK): 698 case MIXER_READ(SOUND_MIXER_RECMASK):
698 case MIXER_READ(SOUND_MIXER_DEVMASK): 699 case MIXER_READ(SOUND_MIXER_DEVMASK):
699 val = SOUND_MASK_LINE1 | SOUND_MASK_LINE2; 700 val = SOUND_MASK_LINE1 | SOUND_MASK_LINE2;
700 if (32000 == dev->oss.rate) 701 if (32000 == dev->dmasound.rate)
701 val |= SOUND_MASK_VIDEO; 702 val |= SOUND_MASK_VIDEO;
702 return put_user(val, p); 703 return put_user(val, p);
703 704
704 case MIXER_WRITE(SOUND_MIXER_RECSRC): 705 case MIXER_WRITE(SOUND_MIXER_RECSRC):
705 if (get_user(val, p)) 706 if (get_user(val, p))
706 return -EFAULT; 707 return -EFAULT;
707 input = dev->oss.input; 708 input = dev->dmasound.input;
708 if (32000 == dev->oss.rate && 709 if (32000 == dev->dmasound.rate &&
709 val & SOUND_MASK_VIDEO && dev->oss.input != TV) 710 val & SOUND_MASK_VIDEO && dev->dmasound.input != TV)
710 input = TV; 711 input = TV;
711 if (val & SOUND_MASK_LINE1 && dev->oss.input != LINE1) 712 if (val & SOUND_MASK_LINE1 && dev->dmasound.input != LINE1)
712 input = LINE1; 713 input = LINE1;
713 if (val & SOUND_MASK_LINE2 && dev->oss.input != LINE2) 714 if (val & SOUND_MASK_LINE2 && dev->dmasound.input != LINE2)
714 input = LINE2; 715 input = LINE2;
715 if (input != dev->oss.input) 716 if (input != dev->dmasound.input)
716 mixer_recsrc(dev,input); 717 mixer_recsrc(dev,input);
717 /* fall throuth */ 718 /* fall throuth */
718 case MIXER_READ(SOUND_MIXER_RECSRC): 719 case MIXER_READ(SOUND_MIXER_RECSRC):
719 switch (dev->oss.input) { 720 switch (dev->dmasound.input) {
720 case TV: ret = SOUND_MASK_VIDEO; break; 721 case TV: ret = SOUND_MASK_VIDEO; break;
721 case LINE1: ret = SOUND_MASK_LINE1; break; 722 case LINE1: ret = SOUND_MASK_LINE1; break;
722 case LINE2: ret = SOUND_MASK_LINE2; break; 723 case LINE2: ret = SOUND_MASK_LINE2; break;
@@ -726,7 +727,7 @@ static int mixer_ioctl(struct inode *inode, struct file *file,
726 727
727 case MIXER_WRITE(SOUND_MIXER_VIDEO): 728 case MIXER_WRITE(SOUND_MIXER_VIDEO):
728 case MIXER_READ(SOUND_MIXER_VIDEO): 729 case MIXER_READ(SOUND_MIXER_VIDEO):
729 if (32000 != dev->oss.rate) 730 if (32000 != dev->dmasound.rate)
730 return -EINVAL; 731 return -EINVAL;
731 return put_user(100 | 100 << 8, p); 732 return put_user(100 | 100 << 8, p);
732 733
@@ -735,22 +736,22 @@ static int mixer_ioctl(struct inode *inode, struct file *file,
735 return -EFAULT; 736 return -EFAULT;
736 val &= 0xff; 737 val &= 0xff;
737 val = (val <= 50) ? 50 : 100; 738 val = (val <= 50) ? 50 : 100;
738 dev->oss.line1 = val; 739 dev->dmasound.line1 = val;
739 mixer_level(dev,LINE1,dev->oss.line1); 740 mixer_level(dev,LINE1,dev->dmasound.line1);
740 /* fall throuth */ 741 /* fall throuth */
741 case MIXER_READ(SOUND_MIXER_LINE1): 742 case MIXER_READ(SOUND_MIXER_LINE1):
742 return put_user(dev->oss.line1 | dev->oss.line1 << 8, p); 743 return put_user(dev->dmasound.line1 | dev->dmasound.line1 << 8, p);
743 744
744 case MIXER_WRITE(SOUND_MIXER_LINE2): 745 case MIXER_WRITE(SOUND_MIXER_LINE2):
745 if (get_user(val, p)) 746 if (get_user(val, p))
746 return -EFAULT; 747 return -EFAULT;
747 val &= 0xff; 748 val &= 0xff;
748 val = (val <= 50) ? 50 : 100; 749 val = (val <= 50) ? 50 : 100;
749 dev->oss.line2 = val; 750 dev->dmasound.line2 = val;
750 mixer_level(dev,LINE2,dev->oss.line2); 751 mixer_level(dev,LINE2,dev->dmasound.line2);
751 /* fall throuth */ 752 /* fall throuth */
752 case MIXER_READ(SOUND_MIXER_LINE2): 753 case MIXER_READ(SOUND_MIXER_LINE2):
753 return put_user(dev->oss.line2 | dev->oss.line2 << 8, p); 754 return put_user(dev->dmasound.line2 | dev->dmasound.line2 << 8, p);
754 755
755 default: 756 default:
756 return -EINVAL; 757 return -EINVAL;
@@ -770,8 +771,8 @@ struct file_operations saa7134_mixer_fops = {
770int saa7134_oss_init1(struct saa7134_dev *dev) 771int saa7134_oss_init1(struct saa7134_dev *dev)
771{ 772{
772 /* general */ 773 /* general */
773 init_MUTEX(&dev->oss.lock); 774 init_MUTEX(&dev->dmasound.lock);
774 init_waitqueue_head(&dev->oss.wq); 775 init_waitqueue_head(&dev->dmasound.wq);
775 776
776 switch (dev->pci->device) { 777 switch (dev->pci->device) {
777 case PCI_DEVICE_ID_PHILIPS_SAA7133: 778 case PCI_DEVICE_ID_PHILIPS_SAA7133:
@@ -783,17 +784,17 @@ int saa7134_oss_init1(struct saa7134_dev *dev)
783 } 784 }
784 785
785 /* dsp */ 786 /* dsp */
786 dev->oss.rate = 32000; 787 dev->dmasound.rate = 32000;
787 if (oss_rate) 788 if (oss_rate)
788 dev->oss.rate = oss_rate; 789 dev->dmasound.rate = oss_rate;
789 dev->oss.rate = (dev->oss.rate > 40000) ? 48000 : 32000; 790 dev->dmasound.rate = (dev->dmasound.rate > 40000) ? 48000 : 32000;
790 791
791 /* mixer */ 792 /* mixer */
792 dev->oss.line1 = 50; 793 dev->dmasound.line1 = 50;
793 dev->oss.line2 = 50; 794 dev->dmasound.line2 = 50;
794 mixer_level(dev,LINE1,dev->oss.line1); 795 mixer_level(dev,LINE1,dev->dmasound.line1);
795 mixer_level(dev,LINE2,dev->oss.line2); 796 mixer_level(dev,LINE2,dev->dmasound.line2);
796 mixer_recsrc(dev, (dev->oss.rate == 32000) ? TV : LINE2); 797 mixer_recsrc(dev, (dev->dmasound.rate == 32000) ? TV : LINE2);
797 798
798 return 0; 799 return 0;
799} 800}
@@ -809,7 +810,7 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status)
809 int next_blk, reg = 0; 810 int next_blk, reg = 0;
810 811
811 spin_lock(&dev->slock); 812 spin_lock(&dev->slock);
812 if (UNSET == dev->oss.dma_blk) { 813 if (UNSET == dev->dmasound.dma_blk) {
813 dprintk("irq: recording stopped\n"); 814 dprintk("irq: recording stopped\n");
814 goto done; 815 goto done;
815 } 816 }
@@ -817,11 +818,11 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status)
817 dprintk("irq: lost %ld\n", (status >> 24) & 0x0f); 818 dprintk("irq: lost %ld\n", (status >> 24) & 0x0f);
818 if (0 == (status & 0x10000000)) { 819 if (0 == (status & 0x10000000)) {
819 /* odd */ 820 /* odd */
820 if (0 == (dev->oss.dma_blk & 0x01)) 821 if (0 == (dev->dmasound.dma_blk & 0x01))
821 reg = SAA7134_RS_BA1(6); 822 reg = SAA7134_RS_BA1(6);
822 } else { 823 } else {
823 /* even */ 824 /* even */
824 if (1 == (dev->oss.dma_blk & 0x01)) 825 if (1 == (dev->dmasound.dma_blk & 0x01))
825 reg = SAA7134_RS_BA2(6); 826 reg = SAA7134_RS_BA2(6);
826 } 827 }
827 if (0 == reg) { 828 if (0 == reg) {
@@ -829,25 +830,25 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status)
829 (status & 0x10000000) ? "even" : "odd"); 830 (status & 0x10000000) ? "even" : "odd");
830 goto done; 831 goto done;
831 } 832 }
832 if (dev->oss.read_count >= dev->oss.blksize * (dev->oss.blocks-2)) { 833 if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) {
833 dprintk("irq: overrun [full=%d/%d]\n",dev->oss.read_count, 834 dprintk("irq: overrun [full=%d/%d]\n",dev->dmasound.read_count,
834 dev->oss.bufsize); 835 dev->dmasound.bufsize);
835 dsp_dma_stop(dev); 836 dsp_dma_stop(dev);
836 goto done; 837 goto done;
837 } 838 }
838 839
839 /* next block addr */ 840 /* next block addr */
840 next_blk = (dev->oss.dma_blk + 2) % dev->oss.blocks; 841 next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks;
841 saa_writel(reg,next_blk * dev->oss.blksize); 842 saa_writel(reg,next_blk * dev->dmasound.blksize);
842 if (oss_debug > 2) 843 if (oss_debug > 2)
843 dprintk("irq: ok, %s, next_blk=%d, addr=%x\n", 844 dprintk("irq: ok, %s, next_blk=%d, addr=%x\n",
844 (status & 0x10000000) ? "even" : "odd ", next_blk, 845 (status & 0x10000000) ? "even" : "odd ", next_blk,
845 next_blk * dev->oss.blksize); 846 next_blk * dev->dmasound.blksize);
846 847
847 /* update status & wake waiting readers */ 848 /* update status & wake waiting readers */
848 dev->oss.dma_blk = (dev->oss.dma_blk + 1) % dev->oss.blocks; 849 dev->dmasound.dma_blk = (dev->dmasound.dma_blk + 1) % dev->dmasound.blocks;
849 dev->oss.read_count += dev->oss.blksize; 850 dev->dmasound.read_count += dev->dmasound.blksize;
850 wake_up(&dev->oss.wq); 851 wake_up(&dev->dmasound.wq);
851 852
852 done: 853 done:
853 spin_unlock(&dev->slock); 854 spin_unlock(&dev->slock);
diff --git a/drivers/media/video/saa7134/saa7134-reg.h b/drivers/media/video/saa7134/saa7134-reg.h
index ae0c7a165390..ac6431ba4fc3 100644
--- a/drivers/media/video/saa7134/saa7134-reg.h
+++ b/drivers/media/video/saa7134/saa7134-reg.h
@@ -27,7 +27,7 @@
27 27
28/* DMA channels, n = 0 ... 6 */ 28/* DMA channels, n = 0 ... 6 */
29#define SAA7134_RS_BA1(n) ((0x200 >> 2) + 4*n) 29#define SAA7134_RS_BA1(n) ((0x200 >> 2) + 4*n)
30#define SAA7134_RS_BA2(n) ((0x204 >> 2) + 4*n) 30#define SAA7134_RS_BA2(n) ((0x204 >> 2) + 4*n)
31#define SAA7134_RS_PITCH(n) ((0x208 >> 2) + 4*n) 31#define SAA7134_RS_PITCH(n) ((0x208 >> 2) + 4*n)
32#define SAA7134_RS_CONTROL(n) ((0x20c >> 2) + 4*n) 32#define SAA7134_RS_CONTROL(n) ((0x20c >> 2) + 4*n)
33#define SAA7134_RS_CONTROL_WSWAP (0x01 << 25) 33#define SAA7134_RS_CONTROL_WSWAP (0x01 << 25)
@@ -43,16 +43,24 @@
43#define SAA7134_FIFO_SIZE (0x2a0 >> 2) 43#define SAA7134_FIFO_SIZE (0x2a0 >> 2)
44#define SAA7134_THRESHOULD (0x2a4 >> 2) 44#define SAA7134_THRESHOULD (0x2a4 >> 2)
45 45
46#define SAA7133_NUM_SAMPLES (0x588 >> 2)
47#define SAA7133_AUDIO_CHANNEL (0x58c >> 2)
48#define SAA7133_AUDIO_FORMAT (0x58f >> 2)
49#define SAA7133_DIGITAL_OUTPUT_SEL1 (0x46c >> 2)
50#define SAA7133_DIGITAL_OUTPUT_SEL2 (0x470 >> 2)
51#define SAA7133_DIGITAL_INPUT_XBAR1 (0x464 >> 2)
52#define SAA7133_ANALOG_IO_SELECT (0x594 >> 2)
53
46/* main control */ 54/* main control */
47#define SAA7134_MAIN_CTRL (0x2a8 >> 2) 55#define SAA7134_MAIN_CTRL (0x2a8 >> 2)
48#define SAA7134_MAIN_CTRL_VPLLE (1 << 15) 56#define SAA7134_MAIN_CTRL_VPLLE (1 << 15)
49#define SAA7134_MAIN_CTRL_APLLE (1 << 14) 57#define SAA7134_MAIN_CTRL_APLLE (1 << 14)
50#define SAA7134_MAIN_CTRL_EXOSC (1 << 13) 58#define SAA7134_MAIN_CTRL_EXOSC (1 << 13)
51#define SAA7134_MAIN_CTRL_EVFE1 (1 << 12) 59#define SAA7134_MAIN_CTRL_EVFE1 (1 << 12)
52#define SAA7134_MAIN_CTRL_EVFE2 (1 << 11) 60#define SAA7134_MAIN_CTRL_EVFE2 (1 << 11)
53#define SAA7134_MAIN_CTRL_ESFE (1 << 10) 61#define SAA7134_MAIN_CTRL_ESFE (1 << 10)
54#define SAA7134_MAIN_CTRL_EBADC (1 << 9) 62#define SAA7134_MAIN_CTRL_EBADC (1 << 9)
55#define SAA7134_MAIN_CTRL_EBDAC (1 << 8) 63#define SAA7134_MAIN_CTRL_EBDAC (1 << 8)
56#define SAA7134_MAIN_CTRL_TE6 (1 << 6) 64#define SAA7134_MAIN_CTRL_TE6 (1 << 6)
57#define SAA7134_MAIN_CTRL_TE5 (1 << 5) 65#define SAA7134_MAIN_CTRL_TE5 (1 << 5)
58#define SAA7134_MAIN_CTRL_TE4 (1 << 4) 66#define SAA7134_MAIN_CTRL_TE4 (1 << 4)
@@ -348,6 +356,7 @@
348 356
349/* test modes */ 357/* test modes */
350#define SAA7134_SPECIAL_MODE 0x1d0 358#define SAA7134_SPECIAL_MODE 0x1d0
359#define SAA7134_PRODUCTION_TEST_MODE 0x1d1
351 360
352/* audio -- saa7133 + saa7135 only */ 361/* audio -- saa7133 + saa7135 only */
353#define SAA7135_DSP_RWSTATE 0x580 362#define SAA7135_DSP_RWSTATE 0x580
diff --git a/drivers/media/video/saa7134/saa7134-ts.c b/drivers/media/video/saa7134/saa7134-ts.c
index 463885601ab4..470903e2f5e5 100644
--- a/drivers/media/video/saa7134/saa7134-ts.c
+++ b/drivers/media/video/saa7134/saa7134-ts.c
@@ -46,17 +46,11 @@ static int buffer_activate(struct saa7134_dev *dev,
46 struct saa7134_buf *buf, 46 struct saa7134_buf *buf,
47 struct saa7134_buf *next) 47 struct saa7134_buf *next)
48{ 48{
49 u32 control;
50 49
51 dprintk("buffer_activate [%p]",buf); 50 dprintk("buffer_activate [%p]",buf);
52 buf->vb.state = STATE_ACTIVE; 51 buf->vb.state = STATE_ACTIVE;
53 buf->top_seen = 0; 52 buf->top_seen = 0;
54 53
55 /* dma: setup channel 5 (= TS) */
56 control = SAA7134_RS_CONTROL_BURST_16 |
57 SAA7134_RS_CONTROL_ME |
58 (buf->pt->dma >> 12);
59
60 if (NULL == next) 54 if (NULL == next)
61 next = buf; 55 next = buf;
62 if (V4L2_FIELD_TOP == buf->vb.field) { 56 if (V4L2_FIELD_TOP == buf->vb.field) {
@@ -68,8 +62,6 @@ static int buffer_activate(struct saa7134_dev *dev,
68 saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(next)); 62 saa_writel(SAA7134_RS_BA1(5),saa7134_buffer_base(next));
69 saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(buf)); 63 saa_writel(SAA7134_RS_BA2(5),saa7134_buffer_base(buf));
70 } 64 }
71 saa_writel(SAA7134_RS_PITCH(5),TS_PACKET_SIZE);
72 saa_writel(SAA7134_RS_CONTROL(5),control);
73 65
74 /* start DMA */ 66 /* start DMA */
75 saa7134_set_dmabits(dev); 67 saa7134_set_dmabits(dev);
@@ -84,6 +76,7 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
84 struct saa7134_dev *dev = q->priv_data; 76 struct saa7134_dev *dev = q->priv_data;
85 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb); 77 struct saa7134_buf *buf = container_of(vb,struct saa7134_buf,vb);
86 unsigned int lines, llength, size; 78 unsigned int lines, llength, size;
79 u32 control;
87 int err; 80 int err;
88 81
89 dprintk("buffer_prepare [%p,%s]\n",buf,v4l2_field_names[field]); 82 dprintk("buffer_prepare [%p,%s]\n",buf,v4l2_field_names[field]);
@@ -115,6 +108,18 @@ static int buffer_prepare(struct videobuf_queue *q, struct videobuf_buffer *vb,
115 if (err) 108 if (err)
116 goto oops; 109 goto oops;
117 } 110 }
111
112 /* dma: setup channel 5 (= TS) */
113 control = SAA7134_RS_CONTROL_BURST_16 |
114 SAA7134_RS_CONTROL_ME |
115 (buf->pt->dma >> 12);
116
117 saa_writeb(SAA7134_TS_DMA0, ((lines-1)&0xff));
118 saa_writeb(SAA7134_TS_DMA1, (((lines-1)>>8)&0xff));
119 saa_writeb(SAA7134_TS_DMA2, ((((lines-1)>>16)&0x3f) | 0x00)); /* TSNOPIT=0, TSCOLAP=0 */
120 saa_writel(SAA7134_RS_PITCH(5),TS_PACKET_SIZE);
121 saa_writel(SAA7134_RS_CONTROL(5),control);
122
118 buf->vb.state = STATE_PREPARED; 123 buf->vb.state = STATE_PREPARED;
119 buf->activate = buffer_activate; 124 buf->activate = buffer_activate;
120 buf->vb.field = field; 125 buf->vb.field = field;
@@ -164,11 +169,11 @@ EXPORT_SYMBOL_GPL(saa7134_ts_qops);
164/* ----------------------------------------------------------- */ 169/* ----------------------------------------------------------- */
165/* exported stuff */ 170/* exported stuff */
166 171
167static unsigned int tsbufs = 4; 172static unsigned int tsbufs = 8;
168module_param(tsbufs, int, 0444); 173module_param(tsbufs, int, 0444);
169MODULE_PARM_DESC(tsbufs,"number of ts buffers, range 2-32"); 174MODULE_PARM_DESC(tsbufs,"number of ts buffers, range 2-32");
170 175
171static unsigned int ts_nr_packets = 30; 176static unsigned int ts_nr_packets = 64;
172module_param(ts_nr_packets, int, 0444); 177module_param(ts_nr_packets, int, 0444);
173MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)"); 178MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)");
174 179
@@ -220,10 +225,10 @@ void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status)
220 if (dev->ts_q.curr) { 225 if (dev->ts_q.curr) {
221 field = dev->ts_q.curr->vb.field; 226 field = dev->ts_q.curr->vb.field;
222 if (field == V4L2_FIELD_TOP) { 227 if (field == V4L2_FIELD_TOP) {
223 if ((status & 0x100000) != 0x100000) 228 if ((status & 0x100000) != 0x000000)
224 goto done; 229 goto done;
225 } else { 230 } else {
226 if ((status & 0x100000) != 0x000000) 231 if ((status & 0x100000) != 0x100000)
227 goto done; 232 goto done;
228 } 233 }
229 saa7134_buffer_finish(dev,&dev->ts_q,STATE_DONE); 234 saa7134_buffer_finish(dev,&dev->ts_q,STATE_DONE);
diff --git a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c
index 61a2d6b50eef..93268427750d 100644
--- a/drivers/media/video/saa7134/saa7134-tvaudio.c
+++ b/drivers/media/video/saa7134/saa7134-tvaudio.c
@@ -207,6 +207,10 @@ static void tvaudio_setcarrier(struct saa7134_dev *dev,
207 saa_writel(SAA7134_CARRIER2_FREQ0 >> 2, tvaudio_carr2reg(secondary)); 207 saa_writel(SAA7134_CARRIER2_FREQ0 >> 2, tvaudio_carr2reg(secondary));
208} 208}
209 209
210#define SAA7134_MUTE_MASK 0xbb
211#define SAA7134_MUTE_ANALOG 0x04
212#define SAA7134_MUTE_I2S 0x40
213
210static void mute_input_7134(struct saa7134_dev *dev) 214static void mute_input_7134(struct saa7134_dev *dev)
211{ 215{
212 unsigned int mute; 216 unsigned int mute;
@@ -241,7 +245,11 @@ static void mute_input_7134(struct saa7134_dev *dev)
241 245
242 if (PCI_DEVICE_ID_PHILIPS_SAA7134 == dev->pci->device) 246 if (PCI_DEVICE_ID_PHILIPS_SAA7134 == dev->pci->device)
243 /* 7134 mute */ 247 /* 7134 mute */
244 saa_writeb(SAA7134_AUDIO_MUTE_CTRL, mute ? 0xbf : 0xbb); 248 saa_writeb(SAA7134_AUDIO_MUTE_CTRL, mute ?
249 SAA7134_MUTE_MASK |
250 SAA7134_MUTE_ANALOG |
251 SAA7134_MUTE_I2S :
252 SAA7134_MUTE_MASK);
245 253
246 /* switch internal audio mux */ 254 /* switch internal audio mux */
247 switch (in->amux) { 255 switch (in->amux) {
@@ -753,17 +761,17 @@ static int mute_input_7133(struct saa7134_dev *dev)
753 761
754 762
755 /* switch gpio-connected external audio mux */ 763 /* switch gpio-connected external audio mux */
756 if (0 != card(dev).gpiomask) { 764 if (0 != card(dev).gpiomask) {
757 mask = card(dev).gpiomask; 765 mask = card(dev).gpiomask;
758 766
759 if (card(dev).mute.name && dev->ctl_mute) 767 if (card(dev).mute.name && dev->ctl_mute)
760 in = &card(dev).mute; 768 in = &card(dev).mute;
761 else 769 else
762 in = dev->input; 770 in = dev->input;
763 771
764 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, mask, mask); 772 saa_andorl(SAA7134_GPIO_GPMODE0 >> 2, mask, mask);
765 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, in->gpio); 773 saa_andorl(SAA7134_GPIO_GPSTATUS0 >> 2, mask, in->gpio);
766 saa7134_track_gpio(dev,in->name); 774 saa7134_track_gpio(dev,in->name);
767 } 775 }
768 776
769 return 0; 777 return 0;
@@ -1016,9 +1024,12 @@ int saa7134_tvaudio_do_scan(struct saa7134_dev *dev)
1016 return 0; 1024 return 0;
1017} 1025}
1018 1026
1027EXPORT_SYMBOL(saa_dsp_writel);
1028
1019/* ----------------------------------------------------------- */ 1029/* ----------------------------------------------------------- */
1020/* 1030/*
1021 * Local variables: 1031 * Local variables:
1022 * c-basic-offset: 8 1032 * c-basic-offset: 8
1023 * End: 1033 * End:
1024 */ 1034 */
1035
diff --git a/drivers/media/video/saa7134/saa7134-video.c b/drivers/media/video/saa7134/saa7134-video.c
index 35e5e85f669a..45c852df13ed 100644
--- a/drivers/media/video/saa7134/saa7134-video.c
+++ b/drivers/media/video/saa7134/saa7134-video.c
@@ -30,6 +30,9 @@
30#include "saa7134-reg.h" 30#include "saa7134-reg.h"
31#include "saa7134.h" 31#include "saa7134.h"
32 32
33/* Include V4L1 specific functions. Should be removed soon */
34#include <linux/videodev.h>
35
33/* ------------------------------------------------------------------ */ 36/* ------------------------------------------------------------------ */
34 37
35static unsigned int video_debug = 0; 38static unsigned int video_debug = 0;
@@ -48,6 +51,43 @@ MODULE_PARM_DESC(noninterlaced,"video input is noninterlaced");
48 printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) 51 printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg)
49 52
50/* ------------------------------------------------------------------ */ 53/* ------------------------------------------------------------------ */
54/* Defines for Video Output Port Register at address 0x191 */
55
56/* Bit 0: VIP code T bit polarity */
57
58#define VP_T_CODE_P_NON_INVERTED 0x00
59#define VP_T_CODE_P_INVERTED 0x01
60
61/* ------------------------------------------------------------------ */
62/* Defines for Video Output Port Register at address 0x195 */
63
64/* Bit 2: Video output clock delay control */
65
66#define VP_CLK_CTRL2_NOT_DELAYED 0x00
67#define VP_CLK_CTRL2_DELAYED 0x04
68
69/* Bit 1: Video output clock invert control */
70
71#define VP_CLK_CTRL1_NON_INVERTED 0x00
72#define VP_CLK_CTRL1_INVERTED 0x02
73
74/* ------------------------------------------------------------------ */
75/* Defines for Video Output Port Register at address 0x196 */
76
77/* Bits 2 to 0: VSYNC pin video vertical sync type */
78
79#define VP_VS_TYPE_MASK 0x07
80
81#define VP_VS_TYPE_OFF 0x00
82#define VP_VS_TYPE_V123 0x01
83#define VP_VS_TYPE_V_ITU 0x02
84#define VP_VS_TYPE_VGATE_L 0x03
85#define VP_VS_TYPE_RESERVED1 0x04
86#define VP_VS_TYPE_RESERVED2 0x05
87#define VP_VS_TYPE_F_ITU 0x06
88#define VP_VS_TYPE_SC_FID 0x07
89
90/* ------------------------------------------------------------------ */
51/* data structs for video */ 91/* data structs for video */
52 92
53static int video_out[][9] = { 93static int video_out[][9] = {
@@ -273,12 +313,12 @@ static struct saa7134_tvnorm tvnorms[] = {
273 313
274 .h_start = 0, 314 .h_start = 0,
275 .h_stop = 719, 315 .h_stop = 719,
276 .video_v_start = 23, 316 .video_v_start = 23,
277 .video_v_stop = 262, 317 .video_v_stop = 262,
278 .vbi_v_start_0 = 10, 318 .vbi_v_start_0 = 10,
279 .vbi_v_stop_0 = 21, 319 .vbi_v_stop_0 = 21,
280 .vbi_v_start_1 = 273, 320 .vbi_v_start_1 = 273,
281 .src_timing = 7, 321 .src_timing = 7,
282 322
283 .sync_control = 0x18, 323 .sync_control = 0x18,
284 .luma_control = 0x40, 324 .luma_control = 0x40,
@@ -622,7 +662,7 @@ static void set_size(struct saa7134_dev *dev, int task,
622 prescale = 1; 662 prescale = 1;
623 xscale = 1024 * dev->crop_current.width / prescale / width; 663 xscale = 1024 * dev->crop_current.width / prescale / width;
624 yscale = 512 * div * dev->crop_current.height / height; 664 yscale = 512 * div * dev->crop_current.height / height;
625 dprintk("prescale=%d xscale=%d yscale=%d\n",prescale,xscale,yscale); 665 dprintk("prescale=%d xscale=%d yscale=%d\n",prescale,xscale,yscale);
626 set_h_prescale(dev,task,prescale); 666 set_h_prescale(dev,task,prescale);
627 saa_writeb(SAA7134_H_SCALE_INC1(task), xscale & 0xff); 667 saa_writeb(SAA7134_H_SCALE_INC1(task), xscale & 0xff);
628 saa_writeb(SAA7134_H_SCALE_INC2(task), xscale >> 8); 668 saa_writeb(SAA7134_H_SCALE_INC2(task), xscale >> 8);
@@ -752,20 +792,20 @@ static int verify_preview(struct saa7134_dev *dev, struct v4l2_window *win)
752 maxh = dev->crop_current.height; 792 maxh = dev->crop_current.height;
753 793
754 if (V4L2_FIELD_ANY == field) { 794 if (V4L2_FIELD_ANY == field) {
755 field = (win->w.height > maxh/2) 795 field = (win->w.height > maxh/2)
756 ? V4L2_FIELD_INTERLACED 796 ? V4L2_FIELD_INTERLACED
757 : V4L2_FIELD_TOP; 797 : V4L2_FIELD_TOP;
758 } 798 }
759 switch (field) { 799 switch (field) {
760 case V4L2_FIELD_TOP: 800 case V4L2_FIELD_TOP:
761 case V4L2_FIELD_BOTTOM: 801 case V4L2_FIELD_BOTTOM:
762 maxh = maxh / 2; 802 maxh = maxh / 2;
763 break; 803 break;
764 case V4L2_FIELD_INTERLACED: 804 case V4L2_FIELD_INTERLACED:
765 break; 805 break;
766 default: 806 default:
767 return -EINVAL; 807 return -EINVAL;
768 } 808 }
769 809
770 win->field = field; 810 win->field = field;
771 if (win->w.width > maxw) 811 if (win->w.width > maxw)
@@ -1306,13 +1346,13 @@ video_poll(struct file *file, struct poll_table_struct *wait)
1306 if (res_locked(fh->dev,RESOURCE_VIDEO)) { 1346 if (res_locked(fh->dev,RESOURCE_VIDEO)) {
1307 up(&fh->cap.lock); 1347 up(&fh->cap.lock);
1308 return POLLERR; 1348 return POLLERR;
1309 } 1349 }
1310 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,fh->cap.field)) { 1350 if (0 != fh->cap.ops->buf_prepare(&fh->cap,fh->cap.read_buf,fh->cap.field)) {
1311 up(&fh->cap.lock); 1351 up(&fh->cap.lock);
1312 return POLLERR; 1352 return POLLERR;
1313 } 1353 }
1314 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf); 1354 fh->cap.ops->buf_queue(&fh->cap,fh->cap.read_buf);
1315 fh->cap.read_off = 0; 1355 fh->cap.read_off = 0;
1316 } 1356 }
1317 up(&fh->cap.lock); 1357 up(&fh->cap.lock);
1318 buf = fh->cap.read_buf; 1358 buf = fh->cap.read_buf;
@@ -1666,9 +1706,10 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
1666 case VIDIOC_QUERYCAP: 1706 case VIDIOC_QUERYCAP:
1667 { 1707 {
1668 struct v4l2_capability *cap = arg; 1708 struct v4l2_capability *cap = arg;
1709 unsigned int tuner_type = dev->tuner_type;
1669 1710
1670 memset(cap,0,sizeof(*cap)); 1711 memset(cap,0,sizeof(*cap));
1671 strcpy(cap->driver, "saa7134"); 1712 strcpy(cap->driver, "saa7134");
1672 strlcpy(cap->card, saa7134_boards[dev->board].name, 1713 strlcpy(cap->card, saa7134_boards[dev->board].name,
1673 sizeof(cap->card)); 1714 sizeof(cap->card));
1674 sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); 1715 sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci));
@@ -1677,9 +1718,13 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
1677 V4L2_CAP_VIDEO_CAPTURE | 1718 V4L2_CAP_VIDEO_CAPTURE |
1678 V4L2_CAP_VIDEO_OVERLAY | 1719 V4L2_CAP_VIDEO_OVERLAY |
1679 V4L2_CAP_VBI_CAPTURE | 1720 V4L2_CAP_VBI_CAPTURE |
1680 V4L2_CAP_TUNER |
1681 V4L2_CAP_READWRITE | 1721 V4L2_CAP_READWRITE |
1682 V4L2_CAP_STREAMING; 1722 V4L2_CAP_STREAMING |
1723 V4L2_CAP_TUNER;
1724
1725 if ((tuner_type == TUNER_ABSENT) || (tuner_type == UNSET))
1726 cap->capabilities &= ~V4L2_CAP_TUNER;
1727
1683 return 0; 1728 return 0;
1684 } 1729 }
1685 1730
@@ -1793,9 +1838,9 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
1793 crop->c.height = b->top - crop->c.top + b->height; 1838 crop->c.height = b->top - crop->c.top + b->height;
1794 1839
1795 if (crop->c.left < b->left) 1840 if (crop->c.left < b->left)
1796 crop->c.top = b->left; 1841 crop->c.left = b->left;
1797 if (crop->c.left > b->left + b->width) 1842 if (crop->c.left > b->left + b->width)
1798 crop->c.top = b->left + b->width; 1843 crop->c.left = b->left + b->width;
1799 if (crop->c.width > b->left - crop->c.left + b->width) 1844 if (crop->c.width > b->left - crop->c.left + b->width)
1800 crop->c.width = b->left - crop->c.left + b->width; 1845 crop->c.width = b->left - crop->c.left + b->width;
1801 1846
@@ -1817,6 +1862,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
1817 break; 1862 break;
1818 if (NULL != card_in(dev,n).name) { 1863 if (NULL != card_in(dev,n).name) {
1819 strcpy(t->name, "Television"); 1864 strcpy(t->name, "Television");
1865 t->type = V4L2_TUNER_ANALOG_TV;
1820 t->capability = V4L2_TUNER_CAP_NORM | 1866 t->capability = V4L2_TUNER_CAP_NORM |
1821 V4L2_TUNER_CAP_STEREO | 1867 V4L2_TUNER_CAP_STEREO |
1822 V4L2_TUNER_CAP_LANG1 | 1868 V4L2_TUNER_CAP_LANG1 |
@@ -1892,26 +1938,26 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
1892 } 1938 }
1893 case VIDIOC_S_AUDIO: 1939 case VIDIOC_S_AUDIO:
1894 return 0; 1940 return 0;
1895 case VIDIOC_G_PARM: 1941 case VIDIOC_G_PARM:
1896 { 1942 {
1897 struct v4l2_captureparm *parm = arg; 1943 struct v4l2_captureparm *parm = arg;
1898 memset(parm,0,sizeof(*parm)); 1944 memset(parm,0,sizeof(*parm));
1899 return 0; 1945 return 0;
1900 } 1946 }
1901 1947
1902 case VIDIOC_G_PRIORITY: 1948 case VIDIOC_G_PRIORITY:
1903 { 1949 {
1904 enum v4l2_priority *p = arg; 1950 enum v4l2_priority *p = arg;
1905 1951
1906 *p = v4l2_prio_max(&dev->prio); 1952 *p = v4l2_prio_max(&dev->prio);
1907 return 0; 1953 return 0;
1908 } 1954 }
1909 case VIDIOC_S_PRIORITY: 1955 case VIDIOC_S_PRIORITY:
1910 { 1956 {
1911 enum v4l2_priority *prio = arg; 1957 enum v4l2_priority *prio = arg;
1912 1958
1913 return v4l2_prio_change(&dev->prio, &fh->prio, *prio); 1959 return v4l2_prio_change(&dev->prio, &fh->prio, *prio);
1914 } 1960 }
1915 1961
1916 /* --- preview ioctls ---------------------------------------- */ 1962 /* --- preview ioctls ---------------------------------------- */
1917 case VIDIOC_ENUM_FMT: 1963 case VIDIOC_ENUM_FMT:
@@ -2018,7 +2064,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
2018 struct v4l2_format *f = arg; 2064 struct v4l2_format *f = arg;
2019 return saa7134_try_fmt(dev,fh,f); 2065 return saa7134_try_fmt(dev,fh,f);
2020 } 2066 }
2021 2067#ifdef HAVE_V4L1
2022 case VIDIOCGMBUF: 2068 case VIDIOCGMBUF:
2023 { 2069 {
2024 struct video_mbuf *mbuf = arg; 2070 struct video_mbuf *mbuf = arg;
@@ -2043,6 +2089,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
2043 } 2089 }
2044 return 0; 2090 return 0;
2045 } 2091 }
2092#endif
2046 case VIDIOC_REQBUFS: 2093 case VIDIOC_REQBUFS:
2047 return videobuf_reqbufs(saa7134_queue(fh),arg); 2094 return videobuf_reqbufs(saa7134_queue(fh),arg);
2048 2095
@@ -2060,7 +2107,7 @@ static int video_do_ioctl(struct inode *inode, struct file *file,
2060 { 2107 {
2061 int res = saa7134_resource(fh); 2108 int res = saa7134_resource(fh);
2062 2109
2063 if (!res_get(dev,fh,res)) 2110 if (!res_get(dev,fh,res))
2064 return -EBUSY; 2111 return -EBUSY;
2065 return videobuf_streamon(saa7134_queue(fh)); 2112 return videobuf_streamon(saa7134_queue(fh));
2066 } 2113 }
@@ -2102,7 +2149,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
2102 struct v4l2_capability *cap = arg; 2149 struct v4l2_capability *cap = arg;
2103 2150
2104 memset(cap,0,sizeof(*cap)); 2151 memset(cap,0,sizeof(*cap));
2105 strcpy(cap->driver, "saa7134"); 2152 strcpy(cap->driver, "saa7134");
2106 strlcpy(cap->card, saa7134_boards[dev->board].name, 2153 strlcpy(cap->card, saa7134_boards[dev->board].name,
2107 sizeof(cap->card)); 2154 sizeof(cap->card));
2108 sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci)); 2155 sprintf(cap->bus_info,"PCI:%s",pci_name(dev->pci));
@@ -2119,6 +2166,7 @@ static int radio_do_ioctl(struct inode *inode, struct file *file,
2119 2166
2120 memset(t,0,sizeof(*t)); 2167 memset(t,0,sizeof(*t));
2121 strcpy(t->name, "Radio"); 2168 strcpy(t->name, "Radio");
2169 t->type = V4L2_TUNER_RADIO;
2122 2170
2123 saa7134_i2c_call_clients(dev, VIDIOC_G_TUNER, t); 2171 saa7134_i2c_call_clients(dev, VIDIOC_G_TUNER, t);
2124 2172
@@ -2233,7 +2281,7 @@ struct video_device saa7134_video_template =
2233{ 2281{
2234 .name = "saa7134-video", 2282 .name = "saa7134-video",
2235 .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY| 2283 .type = VID_TYPE_CAPTURE|VID_TYPE_TUNER|VID_TYPE_OVERLAY|
2236 VID_TYPE_CLIPPING|VID_TYPE_SCALES, 2284 VID_TYPE_CLIPPING|VID_TYPE_SCALES,
2237 .hardware = 0, 2285 .hardware = 0,
2238 .fops = &video_fops, 2286 .fops = &video_fops,
2239 .minor = -1, 2287 .minor = -1,
@@ -2280,7 +2328,7 @@ int saa7134_video_init1(struct saa7134_dev *dev)
2280 dev->tda9887_conf |= TDA9887_AUTOMUTE; 2328 dev->tda9887_conf |= TDA9887_AUTOMUTE;
2281 dev->automute = 0; 2329 dev->automute = 0;
2282 2330
2283 INIT_LIST_HEAD(&dev->video_q.queue); 2331 INIT_LIST_HEAD(&dev->video_q.queue);
2284 init_timer(&dev->video_q.timeout); 2332 init_timer(&dev->video_q.timeout);
2285 dev->video_q.timeout.function = saa7134_buffer_timeout; 2333 dev->video_q.timeout.function = saa7134_buffer_timeout;
2286 dev->video_q.timeout.data = (unsigned long)(&dev->video_q); 2334 dev->video_q.timeout.data = (unsigned long)(&dev->video_q);
@@ -2289,13 +2337,28 @@ int saa7134_video_init1(struct saa7134_dev *dev)
2289 if (saa7134_boards[dev->board].video_out) { 2337 if (saa7134_boards[dev->board].video_out) {
2290 /* enable video output */ 2338 /* enable video output */
2291 int vo = saa7134_boards[dev->board].video_out; 2339 int vo = saa7134_boards[dev->board].video_out;
2340 int video_reg;
2341 unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts;
2292 saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]); 2342 saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]);
2293 saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_out[vo][1]); 2343 video_reg = video_out[vo][1];
2344 if (vid_port_opts & SET_T_CODE_POLARITY_NON_INVERTED)
2345 video_reg &= ~VP_T_CODE_P_INVERTED;
2346 saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_reg);
2294 saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]); 2347 saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]);
2295 saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]); 2348 saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]);
2296 saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]); 2349 saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]);
2297 saa_writeb(SAA7134_VIDEO_PORT_CTRL5, video_out[vo][5]); 2350 video_reg = video_out[vo][5];
2298 saa_writeb(SAA7134_VIDEO_PORT_CTRL6, video_out[vo][6]); 2351 if (vid_port_opts & SET_CLOCK_NOT_DELAYED)
2352 video_reg &= ~VP_CLK_CTRL2_DELAYED;
2353 if (vid_port_opts & SET_CLOCK_INVERTED)
2354 video_reg |= VP_CLK_CTRL1_INVERTED;
2355 saa_writeb(SAA7134_VIDEO_PORT_CTRL5, video_reg);
2356 video_reg = video_out[vo][6];
2357 if (vid_port_opts & SET_VSYNC_OFF) {
2358 video_reg &= ~VP_VS_TYPE_MASK;
2359 video_reg |= VP_VS_TYPE_OFF;
2360 }
2361 saa_writeb(SAA7134_VIDEO_PORT_CTRL6, video_reg);
2299 saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]); 2362 saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]);
2300 saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]); 2363 saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]);
2301 } 2364 }
diff --git a/drivers/media/video/saa7134/saa7134.h b/drivers/media/video/saa7134/saa7134.h
index 860b89530e2a..fb9727471661 100644
--- a/drivers/media/video/saa7134/saa7134.h
+++ b/drivers/media/video/saa7134/saa7134.h
@@ -24,16 +24,18 @@
24 24
25#include <linux/pci.h> 25#include <linux/pci.h>
26#include <linux/i2c.h> 26#include <linux/i2c.h>
27#include <linux/videodev.h> 27#include <linux/videodev2.h>
28#include <linux/kdev_t.h> 28#include <linux/kdev_t.h>
29#include <linux/input.h> 29#include <linux/input.h>
30#include <linux/notifier.h>
31#include <linux/delay.h>
30 32
31#include <asm/io.h> 33#include <asm/io.h>
32 34
33#include <media/tuner.h> 35#include <media/tuner.h>
34#include <media/audiochip.h> 36#include <media/audiochip.h>
35#include <media/id.h>
36#include <media/ir-common.h> 37#include <media/ir-common.h>
38#include <media/ir-kbd-i2c.h>
37#include <media/video-buf.h> 39#include <media/video-buf.h>
38#include <media/video-buf-dvb.h> 40#include <media/video-buf-dvb.h>
39 41
@@ -45,6 +47,10 @@
45#endif 47#endif
46#define UNSET (-1U) 48#define UNSET (-1U)
47 49
50#include <sound/driver.h>
51#include <sound/core.h>
52#include <sound/pcm.h>
53
48/* ----------------------------------------------------------- */ 54/* ----------------------------------------------------------- */
49/* enums */ 55/* enums */
50 56
@@ -187,10 +193,39 @@ struct saa7134_format {
187#define SAA7134_BOARD_FLYTV_DIGIMATRIX 64 193#define SAA7134_BOARD_FLYTV_DIGIMATRIX 64
188#define SAA7134_BOARD_KWORLD_TERMINATOR 65 194#define SAA7134_BOARD_KWORLD_TERMINATOR 65
189#define SAA7134_BOARD_YUAN_TUN900 66 195#define SAA7134_BOARD_YUAN_TUN900 66
196#define SAA7134_BOARD_BEHOLD_409FM 67
197#define SAA7134_BOARD_GOTVIEW_7135 68
198#define SAA7134_BOARD_PHILIPS_EUROPA 69
199#define SAA7134_BOARD_VIDEOMATE_DVBT_300 70
200#define SAA7134_BOARD_VIDEOMATE_DVBT_200 71
201#define SAA7134_BOARD_RTD_VFG7350 72
202#define SAA7134_BOARD_RTD_VFG7330 73
203#define SAA7134_BOARD_FLYTVPLATINUM_MINI2 74
204#define SAA7134_BOARD_AVERMEDIA_AVERTVHD_A180 75
205#define SAA7134_BOARD_MONSTERTV_MOBILE 76
206#define SAA7134_BOARD_PINNACLE_PCTV_110i 77
207#define SAA7134_BOARD_ASUSTeK_P7131_DUAL 78
208#define SAA7134_BOARD_SEDNA_PC_TV_CARDBUS 79
209#define SAA7134_BOARD_ASUSTEK_DIGIMATRIX_TV 80
210#define SAA7134_BOARD_PHILIPS_TIGER 81
190 211
191#define SAA7134_MAXBOARDS 8 212#define SAA7134_MAXBOARDS 8
192#define SAA7134_INPUT_MAX 8 213#define SAA7134_INPUT_MAX 8
193 214
215/* ----------------------------------------------------------- */
216/* Since we support 2 remote types, lets tell them apart */
217
218#define SAA7134_REMOTE_GPIO 1
219#define SAA7134_REMOTE_I2C 2
220
221/* ----------------------------------------------------------- */
222/* Video Output Port Register Initialization Options */
223
224#define SET_T_CODE_POLARITY_NON_INVERTED (1 << 0)
225#define SET_CLOCK_NOT_DELAYED (1 << 1)
226#define SET_CLOCK_INVERTED (1 << 2)
227#define SET_VSYNC_OFF (1 << 3)
228
194struct saa7134_input { 229struct saa7134_input {
195 char *name; 230 char *name;
196 unsigned int vmux; 231 unsigned int vmux;
@@ -226,6 +261,7 @@ struct saa7134_board {
226 /* peripheral I/O */ 261 /* peripheral I/O */
227 enum saa7134_video_out video_out; 262 enum saa7134_video_out video_out;
228 enum saa7134_mpeg_type mpeg; 263 enum saa7134_mpeg_type mpeg;
264 unsigned int vid_port_opts;
229}; 265};
230 266
231#define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name) 267#define card_has_radio(dev) (NULL != saa7134_boards[dev->board].radio.name)
@@ -319,9 +355,9 @@ struct saa7134_fh {
319 struct saa7134_pgtable pt_vbi; 355 struct saa7134_pgtable pt_vbi;
320}; 356};
321 357
322/* oss dsp status */ 358/* dmasound dsp status */
323struct saa7134_oss { 359struct saa7134_dmasound {
324 struct semaphore lock; 360 struct semaphore lock;
325 int minor_mixer; 361 int minor_mixer;
326 int minor_dsp; 362 int minor_dsp;
327 unsigned int users_dsp; 363 unsigned int users_dsp;
@@ -347,6 +383,7 @@ struct saa7134_oss {
347 unsigned int dma_blk; 383 unsigned int dma_blk;
348 unsigned int read_offset; 384 unsigned int read_offset;
349 unsigned int read_count; 385 unsigned int read_count;
386 snd_pcm_substream_t *substream;
350}; 387};
351 388
352/* IR input */ 389/* IR input */
@@ -358,9 +395,9 @@ struct saa7134_ir {
358 u32 mask_keycode; 395 u32 mask_keycode;
359 u32 mask_keydown; 396 u32 mask_keydown;
360 u32 mask_keyup; 397 u32 mask_keyup;
361 int polling; 398 int polling;
362 u32 last_gpio; 399 u32 last_gpio;
363 struct timer_list timer; 400 struct timer_list timer;
364}; 401};
365 402
366/* ts/mpeg status */ 403/* ts/mpeg status */
@@ -383,8 +420,8 @@ struct saa7134_mpeg_ops {
383/* global device status */ 420/* global device status */
384struct saa7134_dev { 421struct saa7134_dev {
385 struct list_head devlist; 422 struct list_head devlist;
386 struct semaphore lock; 423 struct semaphore lock;
387 spinlock_t slock; 424 spinlock_t slock;
388#ifdef VIDIOC_G_PRIORITY 425#ifdef VIDIOC_G_PRIORITY
389 struct v4l2_prio_state prio; 426 struct v4l2_prio_state prio;
390#endif 427#endif
@@ -394,7 +431,7 @@ struct saa7134_dev {
394 struct video_device *video_dev; 431 struct video_device *video_dev;
395 struct video_device *radio_dev; 432 struct video_device *radio_dev;
396 struct video_device *vbi_dev; 433 struct video_device *vbi_dev;
397 struct saa7134_oss oss; 434 struct saa7134_dmasound dmasound;
398 435
399 /* infrared remote */ 436 /* infrared remote */
400 int has_remote; 437 int has_remote;
@@ -421,7 +458,7 @@ struct saa7134_dev {
421 /* i2c i/o */ 458 /* i2c i/o */
422 struct i2c_adapter i2c_adap; 459 struct i2c_adapter i2c_adap;
423 struct i2c_client i2c_client; 460 struct i2c_client i2c_client;
424 unsigned char eedata[64]; 461 unsigned char eedata[128];
425 462
426 /* video overlay */ 463 /* video overlay */
427 struct v4l2_framebuffer ovbuf; 464 struct v4l2_framebuffer ovbuf;
@@ -626,6 +663,7 @@ void saa7134_irq_oss_done(struct saa7134_dev *dev, unsigned long status);
626int saa7134_input_init1(struct saa7134_dev *dev); 663int saa7134_input_init1(struct saa7134_dev *dev);
627void saa7134_input_fini(struct saa7134_dev *dev); 664void saa7134_input_fini(struct saa7134_dev *dev);
628void saa7134_input_irq(struct saa7134_dev *dev); 665void saa7134_input_irq(struct saa7134_dev *dev);
666void saa7134_set_i2c_ir(struct saa7134_dev *dev, struct IR_i2c *ir);
629 667
630/* 668/*
631 * Local variables: 669 * Local variables: