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