2 saa6752hs - i2c-driver for the saa6752hs by Philips
4 Copyright (C) 2004 Andrew de Quincey
8 Copyright (C) 2008 Hans Verkuil <hverkuil@xs4all.nl>
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.
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.
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.
25 #include <linux/module.h>
26 #include <linux/kernel.h>
27 #include <linux/string.h>
28 #include <linux/timer.h>
29 #include <linux/delay.h>
30 #include <linux/errno.h>
31 #include <linux/slab.h>
32 #include <linux/poll.h>
33 #include <linux/i2c.h>
34 #include <linux/types.h>
35 #include <linux/videodev2.h>
36 #include <media/v4l2-common.h>
37 #include <media/v4l2-chip-ident.h>
38 #include <media/v4l2-i2c-drv-legacy.h>
39 #include <linux/init.h>
40 #include <linux/crc32.h>
42 #define MPEG_VIDEO_TARGET_BITRATE_MAX 27000
43 #define MPEG_VIDEO_MAX_BITRATE_MAX 27000
44 #define MPEG_TOTAL_TARGET_BITRATE_MAX 27000
45 #define MPEG_PID_MAX ((1 << 14) - 1)
47 /* Addresses to scan */
48 static unsigned short normal_i2c
[] = {0x20, I2C_CLIENT_END
};
52 MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder");
53 MODULE_AUTHOR("Andrew de Quincey");
54 MODULE_LICENSE("GPL");
56 enum saa6752hs_videoformat
{
57 SAA6752HS_VF_D1
= 0, /* standard D1 video format: 720x576 */
58 SAA6752HS_VF_2_3_D1
= 1,/* 2/3D1 video format: 480x576 */
59 SAA6752HS_VF_1_2_D1
= 2,/* 1/2D1 video format: 352x576 */
60 SAA6752HS_VF_SIF
= 3, /* SIF video format: 352x288 */
64 struct saa6752hs_mpeg_params
{
65 /* transport streams */
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
;
77 enum v4l2_mpeg_video_aspect vi_aspect
;
78 enum v4l2_mpeg_video_bitrate_mode vi_bitrate_mode
;
80 __u32 vi_bitrate_peak
;
83 static const struct v4l2_format v4l2_format_table
[] =
86 { .fmt
= { .pix
= { .width
= 720, .height
= 576 }}},
87 [SAA6752HS_VF_2_3_D1
] =
88 { .fmt
= { .pix
= { .width
= 480, .height
= 576 }}},
89 [SAA6752HS_VF_1_2_D1
] =
90 { .fmt
= { .pix
= { .width
= 352, .height
= 576 }}},
92 { .fmt
= { .pix
= { .width
= 352, .height
= 288 }}},
93 [SAA6752HS_VF_UNKNOWN
] =
94 { .fmt
= { .pix
= { .width
= 0, .height
= 0}}},
97 struct saa6752hs_state
{
101 struct saa6752hs_mpeg_params params
;
102 enum saa6752hs_videoformat video_format
;
103 v4l2_std_id standard
;
106 enum saa6752hs_command
{
107 SAA6752HS_COMMAND_RESET
= 0,
108 SAA6752HS_COMMAND_STOP
= 1,
109 SAA6752HS_COMMAND_START
= 2,
110 SAA6752HS_COMMAND_PAUSE
= 3,
111 SAA6752HS_COMMAND_RECONFIGURE
= 4,
112 SAA6752HS_COMMAND_SLEEP
= 5,
113 SAA6752HS_COMMAND_RECONFIGURE_FORCE
= 6,
115 SAA6752HS_COMMAND_MAX
118 /* ---------------------------------------------------------------------- */
121 0xc2, /* i2c register */
122 0x00, /* table number for encoder */
125 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid(0) */
126 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
128 0x00, /* PSI pointer to start of table */
131 0xb0, 0x0d, /* section_syntax_indicator(1), section_length(13) */
133 0x00, 0x01, /* transport_stream_id(1) */
135 0xc1, /* version_number(0), current_next_indicator(1) */
137 0x00, 0x00, /* section_number(0), last_section_number(0) */
139 0x00, 0x01, /* program_number(1) */
141 0xe0, 0x00, /* PMT PID */
143 0x00, 0x00, 0x00, 0x00 /* CRC32 */
147 0xc2, /* i2c register */
148 0x01, /* table number for encoder */
151 0x40, 0x00, /* transport_error_indicator(0), payload_unit_start(1), transport_priority(0), pid */
152 0x10, /* transport_scrambling_control(00), adaptation_field_control(01), continuity_counter(0) */
154 0x00, /* PSI pointer to start of table */
157 0xb0, 0x17, /* section_syntax_indicator(1), section_length(23) */
159 0x00, 0x01, /* program_number(1) */
161 0xc1, /* version_number(0), current_next_indicator(1) */
163 0x00, 0x00, /* section_number(0), last_section_number(0) */
165 0xe0, 0x00, /* PCR_PID */
167 0xf0, 0x00, /* program_info_length(0) */
169 0x02, 0xe0, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
170 0x04, 0xe0, 0x00, 0xf0, 0x00, /* audio stream type(4), pid */
172 0x00, 0x00, 0x00, 0x00 /* CRC32 */
175 static u8 PMT_AC3
[] = {
176 0xc2, /* i2c register */
177 0x01, /* table number for encoder(1) */
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) */
184 0x00, /* PSI pointer to start of table */
187 0xb0, 0x1a, /* section_syntax_indicator(1), section_length(26) */
189 0x00, 0x01, /* program_number(1) */
191 0xc1, /* version_number(0), current_next_indicator(1) */
193 0x00, 0x00, /* section_number(0), last_section_number(0) */
195 0xe1, 0x04, /* PCR_PID (0x0104) */
197 0xf0, 0x00, /* program_info_length(0) */
199 0x02, 0xe1, 0x00, 0xf0, 0x00, /* video stream type(2), pid */
200 0x06, 0xe1, 0x03, 0xf0, 0x03, /* audio stream type(6), pid */
202 0x01, /* Descriptor_length(1) */
203 0x00, /* component_type_flag(0), bsid_flag(0), mainid_flag(0), asvc_flag(0), reserved flags(0) */
205 0xED, 0xDE, 0x2D, 0xF3 /* CRC32 BE */
208 static struct saa6752hs_mpeg_params param_defaults
=
215 .vi_aspect
= V4L2_MPEG_VIDEO_ASPECT_4x3
,
217 .vi_bitrate_peak
= 6000,
218 .vi_bitrate_mode
= V4L2_MPEG_VIDEO_BITRATE_MODE_VBR
,
220 .au_encoding
= V4L2_MPEG_AUDIO_ENCODING_LAYER_2
,
221 .au_l2_bitrate
= V4L2_MPEG_AUDIO_L2_BITRATE_256K
,
222 .au_ac3_bitrate
= V4L2_MPEG_AUDIO_AC3_BITRATE_256K
,
225 /* ---------------------------------------------------------------------- */
227 static int saa6752hs_chip_command(struct i2c_client
*client
,
228 enum saa6752hs_command command
)
230 unsigned char buf
[3];
231 unsigned long timeout
;
234 /* execute the command */
236 case SAA6752HS_COMMAND_RESET
:
240 case SAA6752HS_COMMAND_STOP
:
244 case SAA6752HS_COMMAND_START
:
248 case SAA6752HS_COMMAND_PAUSE
:
252 case SAA6752HS_COMMAND_RECONFIGURE
:
256 case SAA6752HS_COMMAND_SLEEP
:
260 case SAA6752HS_COMMAND_RECONFIGURE_FORCE
:
268 /* set it and wait for it to be so */
269 i2c_master_send(client
, buf
, 1);
270 timeout
= jiffies
+ HZ
* 3;
272 /* get the current status */
274 i2c_master_send(client
, buf
, 1);
275 i2c_master_recv(client
, buf
, 1);
277 if (!(buf
[0] & 0x20))
279 if (time_after(jiffies
,timeout
)) {
287 /* delay a bit to let encoder settle */
294 static inline void set_reg8(struct i2c_client
*client
, uint8_t reg
, uint8_t val
)
300 i2c_master_send(client
, buf
, 2);
303 static inline void set_reg16(struct i2c_client
*client
, uint8_t reg
, uint16_t val
)
310 i2c_master_send(client
, buf
, 3);
313 static int saa6752hs_set_bitrate(struct i2c_client
*client
,
314 struct saa6752hs_state
*h
)
316 struct saa6752hs_mpeg_params
*params
= &h
->params
;
320 /* set the bitrate mode */
321 set_reg8(client
, 0x71,
322 params
->vi_bitrate_mode
!= V4L2_MPEG_VIDEO_BITRATE_MODE_VBR
);
324 /* set the video bitrate */
325 if (params
->vi_bitrate_mode
== V4L2_MPEG_VIDEO_BITRATE_MODE_VBR
) {
326 /* set the target bitrate */
327 set_reg16(client
, 0x80, params
->vi_bitrate
);
329 /* set the max bitrate */
330 set_reg16(client
, 0x81, params
->vi_bitrate_peak
);
331 tot_bitrate
= params
->vi_bitrate_peak
;
333 /* set the target bitrate (no max bitrate for CBR) */
334 set_reg16(client
, 0x81, params
->vi_bitrate
);
335 tot_bitrate
= params
->vi_bitrate
;
338 /* set the audio encoding */
339 set_reg8(client
, 0x93,
340 params
->au_encoding
== V4L2_MPEG_AUDIO_ENCODING_AC3
);
342 /* set the audio bitrate */
343 if (params
->au_encoding
== V4L2_MPEG_AUDIO_ENCODING_AC3
)
344 is_384k
= V4L2_MPEG_AUDIO_AC3_BITRATE_384K
== params
->au_ac3_bitrate
;
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;
350 /* Note: the total max bitrate is determined by adding the video and audio
351 bitrates together and also adding an extra 768kbit/s to stay on the
352 safe side. If more control should be required, then an extra MPEG control
355 if (tot_bitrate
> MPEG_TOTAL_TARGET_BITRATE_MAX
)
356 tot_bitrate
= MPEG_TOTAL_TARGET_BITRATE_MAX
;
358 /* set the total bitrate */
359 set_reg16(client
, 0xb1, tot_bitrate
);
363 static void saa6752hs_set_subsampling(struct i2c_client
*client
,
364 struct v4l2_format
*f
)
366 struct saa6752hs_state
*h
= i2c_get_clientdata(client
);
367 int dist_352
, dist_480
, dist_720
;
370 FIXME: translate and round width/height into EMPRESS
374 ---------------------------
375 SIF | 352x288 | 352x240
376 1/2 D1 | 352x576 | 352x480
377 2/3 D1 | 480x576 | 480x480
378 D1 | 720x576 | 720x480
381 dist_352
= abs(f
->fmt
.pix
.width
- 352);
382 dist_480
= abs(f
->fmt
.pix
.width
- 480);
383 dist_720
= abs(f
->fmt
.pix
.width
- 720);
384 if (dist_720
< dist_480
) {
385 f
->fmt
.pix
.width
= 720;
386 f
->fmt
.pix
.height
= 576;
387 h
->video_format
= SAA6752HS_VF_D1
;
389 else if (dist_480
< dist_352
) {
390 f
->fmt
.pix
.width
= 480;
391 f
->fmt
.pix
.height
= 576;
392 h
->video_format
= SAA6752HS_VF_2_3_D1
;
395 f
->fmt
.pix
.width
= 352;
396 if (abs(f
->fmt
.pix
.height
- 576) <
397 abs(f
->fmt
.pix
.height
- 288)) {
398 f
->fmt
.pix
.height
= 576;
399 h
->video_format
= SAA6752HS_VF_1_2_D1
;
402 f
->fmt
.pix
.height
= 288;
403 h
->video_format
= SAA6752HS_VF_SIF
;
409 static int handle_ctrl(int has_ac3
, struct saa6752hs_mpeg_params
*params
,
410 struct v4l2_ext_control
*ctrl
, unsigned int cmd
)
413 int set
= (cmd
== VIDIOC_S_EXT_CTRLS
);
417 case V4L2_CID_MPEG_STREAM_TYPE
:
418 old
= V4L2_MPEG_STREAM_TYPE_MPEG2_TS
;
419 if (set
&& new != old
)
423 case V4L2_CID_MPEG_STREAM_PID_PMT
:
424 old
= params
->ts_pid_pmt
;
425 if (set
&& new > MPEG_PID_MAX
)
427 if (new > MPEG_PID_MAX
)
429 params
->ts_pid_pmt
= new;
431 case V4L2_CID_MPEG_STREAM_PID_AUDIO
:
432 old
= params
->ts_pid_audio
;
433 if (set
&& new > MPEG_PID_MAX
)
435 if (new > MPEG_PID_MAX
)
437 params
->ts_pid_audio
= new;
439 case V4L2_CID_MPEG_STREAM_PID_VIDEO
:
440 old
= params
->ts_pid_video
;
441 if (set
&& new > MPEG_PID_MAX
)
443 if (new > MPEG_PID_MAX
)
445 params
->ts_pid_video
= new;
447 case V4L2_CID_MPEG_STREAM_PID_PCR
:
448 old
= params
->ts_pid_pcr
;
449 if (set
&& new > MPEG_PID_MAX
)
451 if (new > MPEG_PID_MAX
)
453 params
->ts_pid_pcr
= new;
455 case V4L2_CID_MPEG_AUDIO_ENCODING
:
456 old
= params
->au_encoding
;
457 if (set
&& new != V4L2_MPEG_AUDIO_ENCODING_LAYER_2
&&
458 (!has_ac3
|| new != V4L2_MPEG_AUDIO_ENCODING_AC3
))
462 case V4L2_CID_MPEG_AUDIO_L2_BITRATE
:
463 old
= params
->au_l2_bitrate
;
464 if (set
&& new != V4L2_MPEG_AUDIO_L2_BITRATE_256K
&&
465 new != V4L2_MPEG_AUDIO_L2_BITRATE_384K
)
467 if (new <= V4L2_MPEG_AUDIO_L2_BITRATE_256K
)
468 new = V4L2_MPEG_AUDIO_L2_BITRATE_256K
;
470 new = V4L2_MPEG_AUDIO_L2_BITRATE_384K
;
471 params
->au_l2_bitrate
= new;
473 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
:
476 old
= params
->au_ac3_bitrate
;
477 if (set
&& new != V4L2_MPEG_AUDIO_AC3_BITRATE_256K
&&
478 new != V4L2_MPEG_AUDIO_AC3_BITRATE_384K
)
480 if (new <= V4L2_MPEG_AUDIO_AC3_BITRATE_256K
)
481 new = V4L2_MPEG_AUDIO_AC3_BITRATE_256K
;
483 new = V4L2_MPEG_AUDIO_AC3_BITRATE_384K
;
484 params
->au_ac3_bitrate
= new;
486 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
:
487 old
= V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000
;
488 if (set
&& new != old
)
492 case V4L2_CID_MPEG_VIDEO_ENCODING
:
493 old
= V4L2_MPEG_VIDEO_ENCODING_MPEG_2
;
494 if (set
&& new != old
)
498 case V4L2_CID_MPEG_VIDEO_ASPECT
:
499 old
= params
->vi_aspect
;
500 if (set
&& new != V4L2_MPEG_VIDEO_ASPECT_16x9
&&
501 new != V4L2_MPEG_VIDEO_ASPECT_4x3
)
503 if (new != V4L2_MPEG_VIDEO_ASPECT_16x9
)
504 new = V4L2_MPEG_VIDEO_ASPECT_4x3
;
505 params
->vi_aspect
= new;
507 case V4L2_CID_MPEG_VIDEO_BITRATE
:
508 old
= params
->vi_bitrate
* 1000;
509 new = 1000 * (new / 1000);
510 if (set
&& new > MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000)
512 if (new > MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000)
513 new = MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000;
514 params
->vi_bitrate
= new / 1000;
516 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK
:
517 old
= params
->vi_bitrate_peak
* 1000;
518 new = 1000 * (new / 1000);
519 if (set
&& new > MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000)
521 if (new > MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000)
522 new = MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000;
523 params
->vi_bitrate_peak
= new / 1000;
525 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
526 old
= params
->vi_bitrate_mode
;
527 params
->vi_bitrate_mode
= new;
532 if (cmd
== VIDIOC_G_EXT_CTRLS
)
539 static int saa6752hs_qctrl(struct saa6752hs_state
*h
,
540 struct v4l2_queryctrl
*qctrl
)
542 struct saa6752hs_mpeg_params
*params
= &h
->params
;
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
);
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
);
559 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
:
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
);
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
);
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
);
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
);
585 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK
:
586 err
= v4l2_ctrl_query_fill_std(qctrl
);
588 params
->vi_bitrate_mode
==
589 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
)
590 qctrl
->flags
|= V4L2_CTRL_FLAG_INACTIVE
;
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
);
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
);
613 static int saa6752hs_qmenu(struct saa6752hs_state
*h
,
614 struct v4l2_querymenu
*qmenu
)
616 static const u32 mpeg_audio_encoding
[] = {
617 V4L2_MPEG_AUDIO_ENCODING_LAYER_2
,
618 V4L2_CTRL_MENU_IDS_END
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
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
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
635 struct v4l2_queryctrl qctrl
;
638 qctrl
.id
= qmenu
->id
;
639 err
= saa6752hs_qctrl(h
, &qctrl
);
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
:
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
);
656 return v4l2_ctrl_query_menu(qmenu
, &qctrl
, NULL
);
659 static int saa6752hs_init(struct i2c_client
*client
, u32 leading_null_bytes
)
661 unsigned char buf
[9], buf2
[4];
662 struct saa6752hs_state
*h
;
665 unsigned char localPAT
[256];
666 unsigned char localPMT
[256];
668 h
= i2c_get_clientdata(client
);
670 /* Set video format - must be done first as it resets other settings */
671 set_reg8(client
, 0x41, h
->video_format
);
673 /* Set number of lines in input signal */
674 set_reg8(client
, 0x40, (h
->standard
& V4L2_STD_525_60
) ? 1 : 0);
677 saa6752hs_set_bitrate(client
, h
);
679 /* Set GOP structure {3, 13} */
680 set_reg16(client
, 0x72, 0x030d);
682 /* Set minimum Q-scale {4} */
683 set_reg8(client
, 0x82, 0x04);
685 /* Set maximum Q-scale {12} */
686 set_reg8(client
, 0x83, 0x0c);
688 /* Set Output Protocol */
689 set_reg8(client
, 0xd0, 0x81);
691 /* Set video output stream format {TS} */
692 set_reg8(client
, 0xb0, 0x05);
694 /* Set leading null byte for TS */
695 set_reg16(client
, 0xf6, leading_null_bytes
);
698 memcpy(localPAT
, PAT
, sizeof(PAT
));
699 localPAT
[17] = 0xe0 | ((h
->params
.ts_pid_pmt
>> 8) & 0x0f);
700 localPAT
[18] = h
->params
.ts_pid_pmt
& 0xff;
701 crc
= crc32_be(~0, &localPAT
[7], sizeof(PAT
) - 7 - 4);
702 localPAT
[sizeof(PAT
) - 4] = (crc
>> 24) & 0xFF;
703 localPAT
[sizeof(PAT
) - 3] = (crc
>> 16) & 0xFF;
704 localPAT
[sizeof(PAT
) - 2] = (crc
>> 8) & 0xFF;
705 localPAT
[sizeof(PAT
) - 1] = crc
& 0xFF;
708 if (h
->params
.au_encoding
== V4L2_MPEG_AUDIO_ENCODING_AC3
) {
709 size
= sizeof(PMT_AC3
);
710 memcpy(localPMT
, PMT_AC3
, size
);
713 memcpy(localPMT
, PMT
, size
);
715 localPMT
[3] = 0x40 | ((h
->params
.ts_pid_pmt
>> 8) & 0x0f);
716 localPMT
[4] = h
->params
.ts_pid_pmt
& 0xff;
717 localPMT
[15] = 0xE0 | ((h
->params
.ts_pid_pcr
>> 8) & 0x0F);
718 localPMT
[16] = h
->params
.ts_pid_pcr
& 0xFF;
719 localPMT
[20] = 0xE0 | ((h
->params
.ts_pid_video
>> 8) & 0x0F);
720 localPMT
[21] = h
->params
.ts_pid_video
& 0xFF;
721 localPMT
[25] = 0xE0 | ((h
->params
.ts_pid_audio
>> 8) & 0x0F);
722 localPMT
[26] = h
->params
.ts_pid_audio
& 0xFF;
723 crc
= crc32_be(~0, &localPMT
[7], size
- 7 - 4);
724 localPMT
[size
- 4] = (crc
>> 24) & 0xFF;
725 localPMT
[size
- 3] = (crc
>> 16) & 0xFF;
726 localPMT
[size
- 2] = (crc
>> 8) & 0xFF;
727 localPMT
[size
- 1] = crc
& 0xFF;
730 set_reg16(client
, 0xc1, h
->params
.ts_pid_audio
);
733 set_reg16(client
, 0xc0, h
->params
.ts_pid_video
);
736 set_reg16(client
, 0xc4, h
->params
.ts_pid_pcr
);
739 i2c_master_send(client
, localPAT
, sizeof(PAT
));
740 i2c_master_send(client
, localPMT
, size
);
742 /* mute then unmute audio. This removes buzzing artefacts */
743 set_reg8(client
, 0xa4, 1);
744 set_reg8(client
, 0xa4, 0);
747 saa6752hs_chip_command(client
, SAA6752HS_COMMAND_START
);
749 /* readout current state */
755 i2c_master_send(client
, buf
, 5);
756 i2c_master_recv(client
, buf2
, 4);
758 /* change aspect ratio */
765 switch(h
->params
.vi_aspect
) {
766 case V4L2_MPEG_VIDEO_ASPECT_16x9
:
767 buf
[6] = buf2
[1] | 0x40;
769 case V4L2_MPEG_VIDEO_ASPECT_4x3
:
771 buf
[6] = buf2
[1] & 0xBF;
777 i2c_master_send(client
, buf
, 9);
783 saa6752hs_command(struct i2c_client
*client
, unsigned int cmd
, void *arg
)
785 struct saa6752hs_state
*h
= i2c_get_clientdata(client
);
786 struct v4l2_ext_controls
*ctrls
= arg
;
787 struct saa6752hs_mpeg_params params
;
792 case VIDIOC_INT_INIT
:
793 /* apply settings and start encoder */
794 saa6752hs_init(client
, *(u32
*)arg
);
796 case VIDIOC_S_EXT_CTRLS
:
797 if (ctrls
->ctrl_class
!= V4L2_CTRL_CLASS_MPEG
)
800 case VIDIOC_TRY_EXT_CTRLS
:
801 case VIDIOC_G_EXT_CTRLS
:
802 if (ctrls
->ctrl_class
!= V4L2_CTRL_CLASS_MPEG
)
805 for (i
= 0; i
< ctrls
->count
; i
++) {
806 err
= handle_ctrl(h
->has_ac3
, ¶ms
, ctrls
->controls
+ i
, cmd
);
808 ctrls
->error_idx
= i
;
814 case VIDIOC_QUERYCTRL
:
815 return saa6752hs_qctrl(h
, arg
);
816 case VIDIOC_QUERYMENU
:
817 return saa6752hs_qmenu(h
, arg
);
820 struct v4l2_format
*f
= arg
;
822 if (h
->video_format
== SAA6752HS_VF_UNKNOWN
)
823 h
->video_format
= SAA6752HS_VF_D1
;
825 v4l2_format_table
[h
->video_format
].fmt
.pix
.width
;
827 v4l2_format_table
[h
->video_format
].fmt
.pix
.height
;
832 struct v4l2_format
*f
= arg
;
834 saa6752hs_set_subsampling(client
, f
);
838 h
->standard
= *((v4l2_std_id
*) arg
);
841 case VIDIOC_G_CHIP_IDENT
:
842 return v4l2_chip_ident_i2c_client(client
,
843 arg
, h
->chip
, h
->revision
);
853 static int saa6752hs_probe(struct i2c_client
*client
,
854 const struct i2c_device_id
*id
)
856 struct saa6752hs_state
*h
= kzalloc(sizeof(*h
), GFP_KERNEL
);
860 v4l_info(client
, "chip found @ 0x%x (%s)\n",
861 client
->addr
<< 1, client
->adapter
->name
);
865 i2c_master_send(client
, &addr
, 1);
866 i2c_master_recv(client
, data
, sizeof(data
));
867 h
->chip
= V4L2_IDENT_SAA6752HS
;
868 h
->revision
= (data
[8] << 8) | data
[9];
870 if (h
->revision
== 0x0206) {
871 h
->chip
= V4L2_IDENT_SAA6752HS_AC3
;
873 v4l_info(client
, "support AC-3\n");
875 h
->params
= param_defaults
;
876 h
->standard
= 0; /* Assume 625 input lines */
878 i2c_set_clientdata(client
, h
);
882 static int saa6752hs_remove(struct i2c_client
*client
)
884 kfree(i2c_get_clientdata(client
));
888 static const struct i2c_device_id saa6752hs_id
[] = {
892 MODULE_DEVICE_TABLE(i2c
, saa6752hs_id
);
894 static struct v4l2_i2c_driver_data v4l2_i2c_data
= {
896 .driverid
= I2C_DRIVERID_SAA6752HS
,
897 .command
= saa6752hs_command
,
898 .probe
= saa6752hs_probe
,
899 .remove
= saa6752hs_remove
,
900 .id_table
= saa6752hs_id
,
904 * Overrides for Emacs so that we follow Linus's tabbing style.
905 * ---------------------------------------------------------------------------