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-device.h>
37 #include <media/v4l2-common.h>
38 #include <linux/init.h>
39 #include <linux/crc32.h>
41 #define MPEG_VIDEO_TARGET_BITRATE_MAX 27000
42 #define MPEG_VIDEO_MAX_BITRATE_MAX 27000
43 #define MPEG_TOTAL_TARGET_BITRATE_MAX 27000
44 #define MPEG_PID_MAX ((1 << 14) - 1)
47 MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder");
48 MODULE_AUTHOR("Andrew de Quincey");
49 MODULE_LICENSE("GPL");
51 enum saa6752hs_videoformat
{
52 SAA6752HS_VF_D1
= 0, /* standard D1 video format: 720x576 */
53 SAA6752HS_VF_2_3_D1
= 1,/* 2/3D1 video format: 480x576 */
54 SAA6752HS_VF_1_2_D1
= 2,/* 1/2D1 video format: 352x576 */
55 SAA6752HS_VF_SIF
= 3, /* SIF video format: 352x288 */
59 struct saa6752hs_mpeg_params
{
60 /* transport streams */
67 enum v4l2_mpeg_audio_encoding au_encoding
;
68 enum v4l2_mpeg_audio_l2_bitrate au_l2_bitrate
;
69 enum v4l2_mpeg_audio_ac3_bitrate au_ac3_bitrate
;
72 enum v4l2_mpeg_video_aspect vi_aspect
;
73 enum v4l2_mpeg_video_bitrate_mode vi_bitrate_mode
;
75 __u32 vi_bitrate_peak
;
78 static const struct v4l2_format v4l2_format_table
[] =
81 { .fmt
= { .pix
= { .width
= 720, .height
= 576 }}},
82 [SAA6752HS_VF_2_3_D1
] =
83 { .fmt
= { .pix
= { .width
= 480, .height
= 576 }}},
84 [SAA6752HS_VF_1_2_D1
] =
85 { .fmt
= { .pix
= { .width
= 352, .height
= 576 }}},
87 { .fmt
= { .pix
= { .width
= 352, .height
= 288 }}},
88 [SAA6752HS_VF_UNKNOWN
] =
89 { .fmt
= { .pix
= { .width
= 0, .height
= 0}}},
92 struct saa6752hs_state
{
93 struct v4l2_subdev sd
;
96 struct saa6752hs_mpeg_params params
;
97 enum saa6752hs_videoformat video_format
;
101 enum saa6752hs_command
{
102 SAA6752HS_COMMAND_RESET
= 0,
103 SAA6752HS_COMMAND_STOP
= 1,
104 SAA6752HS_COMMAND_START
= 2,
105 SAA6752HS_COMMAND_PAUSE
= 3,
106 SAA6752HS_COMMAND_RECONFIGURE
= 4,
107 SAA6752HS_COMMAND_SLEEP
= 5,
108 SAA6752HS_COMMAND_RECONFIGURE_FORCE
= 6,
110 SAA6752HS_COMMAND_MAX
113 static inline struct saa6752hs_state
*to_state(struct v4l2_subdev
*sd
)
115 return container_of(sd
, struct saa6752hs_state
, sd
);
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
);
364 static int get_ctrl(int has_ac3
, struct saa6752hs_mpeg_params
*params
,
365 struct v4l2_ext_control
*ctrl
)
368 case V4L2_CID_MPEG_STREAM_TYPE
:
369 ctrl
->value
= V4L2_MPEG_STREAM_TYPE_MPEG2_TS
;
371 case V4L2_CID_MPEG_STREAM_PID_PMT
:
372 ctrl
->value
= params
->ts_pid_pmt
;
374 case V4L2_CID_MPEG_STREAM_PID_AUDIO
:
375 ctrl
->value
= params
->ts_pid_audio
;
377 case V4L2_CID_MPEG_STREAM_PID_VIDEO
:
378 ctrl
->value
= params
->ts_pid_video
;
380 case V4L2_CID_MPEG_STREAM_PID_PCR
:
381 ctrl
->value
= params
->ts_pid_pcr
;
383 case V4L2_CID_MPEG_AUDIO_ENCODING
:
384 ctrl
->value
= params
->au_encoding
;
386 case V4L2_CID_MPEG_AUDIO_L2_BITRATE
:
387 ctrl
->value
= params
->au_l2_bitrate
;
389 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
:
392 ctrl
->value
= params
->au_ac3_bitrate
;
394 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
:
395 ctrl
->value
= V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000
;
397 case V4L2_CID_MPEG_VIDEO_ENCODING
:
398 ctrl
->value
= V4L2_MPEG_VIDEO_ENCODING_MPEG_2
;
400 case V4L2_CID_MPEG_VIDEO_ASPECT
:
401 ctrl
->value
= params
->vi_aspect
;
403 case V4L2_CID_MPEG_VIDEO_BITRATE
:
404 ctrl
->value
= params
->vi_bitrate
* 1000;
406 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK
:
407 ctrl
->value
= params
->vi_bitrate_peak
* 1000;
409 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
410 ctrl
->value
= params
->vi_bitrate_mode
;
418 static int handle_ctrl(int has_ac3
, struct saa6752hs_mpeg_params
*params
,
419 struct v4l2_ext_control
*ctrl
, int set
)
425 case V4L2_CID_MPEG_STREAM_TYPE
:
426 old
= V4L2_MPEG_STREAM_TYPE_MPEG2_TS
;
427 if (set
&& new != old
)
431 case V4L2_CID_MPEG_STREAM_PID_PMT
:
432 old
= params
->ts_pid_pmt
;
433 if (set
&& new > MPEG_PID_MAX
)
435 if (new > MPEG_PID_MAX
)
437 params
->ts_pid_pmt
= new;
439 case V4L2_CID_MPEG_STREAM_PID_AUDIO
:
440 old
= params
->ts_pid_audio
;
441 if (set
&& new > MPEG_PID_MAX
)
443 if (new > MPEG_PID_MAX
)
445 params
->ts_pid_audio
= new;
447 case V4L2_CID_MPEG_STREAM_PID_VIDEO
:
448 old
= params
->ts_pid_video
;
449 if (set
&& new > MPEG_PID_MAX
)
451 if (new > MPEG_PID_MAX
)
453 params
->ts_pid_video
= new;
455 case V4L2_CID_MPEG_STREAM_PID_PCR
:
456 old
= params
->ts_pid_pcr
;
457 if (set
&& new > MPEG_PID_MAX
)
459 if (new > MPEG_PID_MAX
)
461 params
->ts_pid_pcr
= new;
463 case V4L2_CID_MPEG_AUDIO_ENCODING
:
464 old
= params
->au_encoding
;
465 if (set
&& new != V4L2_MPEG_AUDIO_ENCODING_LAYER_2
&&
466 (!has_ac3
|| new != V4L2_MPEG_AUDIO_ENCODING_AC3
))
468 params
->au_encoding
= new;
470 case V4L2_CID_MPEG_AUDIO_L2_BITRATE
:
471 old
= params
->au_l2_bitrate
;
472 if (set
&& new != V4L2_MPEG_AUDIO_L2_BITRATE_256K
&&
473 new != V4L2_MPEG_AUDIO_L2_BITRATE_384K
)
475 if (new <= V4L2_MPEG_AUDIO_L2_BITRATE_256K
)
476 new = V4L2_MPEG_AUDIO_L2_BITRATE_256K
;
478 new = V4L2_MPEG_AUDIO_L2_BITRATE_384K
;
479 params
->au_l2_bitrate
= new;
481 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
:
484 old
= params
->au_ac3_bitrate
;
485 if (set
&& new != V4L2_MPEG_AUDIO_AC3_BITRATE_256K
&&
486 new != V4L2_MPEG_AUDIO_AC3_BITRATE_384K
)
488 if (new <= V4L2_MPEG_AUDIO_AC3_BITRATE_256K
)
489 new = V4L2_MPEG_AUDIO_AC3_BITRATE_256K
;
491 new = V4L2_MPEG_AUDIO_AC3_BITRATE_384K
;
492 params
->au_ac3_bitrate
= new;
494 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
:
495 old
= V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000
;
496 if (set
&& new != old
)
500 case V4L2_CID_MPEG_VIDEO_ENCODING
:
501 old
= V4L2_MPEG_VIDEO_ENCODING_MPEG_2
;
502 if (set
&& new != old
)
506 case V4L2_CID_MPEG_VIDEO_ASPECT
:
507 old
= params
->vi_aspect
;
508 if (set
&& new != V4L2_MPEG_VIDEO_ASPECT_16x9
&&
509 new != V4L2_MPEG_VIDEO_ASPECT_4x3
)
511 if (new != V4L2_MPEG_VIDEO_ASPECT_16x9
)
512 new = V4L2_MPEG_VIDEO_ASPECT_4x3
;
513 params
->vi_aspect
= new;
515 case V4L2_CID_MPEG_VIDEO_BITRATE
:
516 old
= params
->vi_bitrate
* 1000;
517 new = 1000 * (new / 1000);
518 if (set
&& new > MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000)
520 if (new > MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000)
521 new = MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000;
522 params
->vi_bitrate
= new / 1000;
524 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK
:
525 old
= params
->vi_bitrate_peak
* 1000;
526 new = 1000 * (new / 1000);
527 if (set
&& new > MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000)
529 if (new > MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000)
530 new = MPEG_VIDEO_TARGET_BITRATE_MAX
* 1000;
531 params
->vi_bitrate_peak
= new / 1000;
533 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
534 old
= params
->vi_bitrate_mode
;
535 params
->vi_bitrate_mode
= new;
545 static int saa6752hs_queryctrl(struct v4l2_subdev
*sd
, struct v4l2_queryctrl
*qctrl
)
547 struct saa6752hs_state
*h
= to_state(sd
);
548 struct saa6752hs_mpeg_params
*params
= &h
->params
;
552 case V4L2_CID_MPEG_AUDIO_ENCODING
:
553 return v4l2_ctrl_query_fill(qctrl
,
554 V4L2_MPEG_AUDIO_ENCODING_LAYER_2
,
555 h
->has_ac3
? V4L2_MPEG_AUDIO_ENCODING_AC3
:
556 V4L2_MPEG_AUDIO_ENCODING_LAYER_2
,
557 1, V4L2_MPEG_AUDIO_ENCODING_LAYER_2
);
559 case V4L2_CID_MPEG_AUDIO_L2_BITRATE
:
560 return v4l2_ctrl_query_fill(qctrl
,
561 V4L2_MPEG_AUDIO_L2_BITRATE_256K
,
562 V4L2_MPEG_AUDIO_L2_BITRATE_384K
, 1,
563 V4L2_MPEG_AUDIO_L2_BITRATE_256K
);
565 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
:
568 return v4l2_ctrl_query_fill(qctrl
,
569 V4L2_MPEG_AUDIO_AC3_BITRATE_256K
,
570 V4L2_MPEG_AUDIO_AC3_BITRATE_384K
, 1,
571 V4L2_MPEG_AUDIO_AC3_BITRATE_256K
);
573 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ
:
574 return v4l2_ctrl_query_fill(qctrl
,
575 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000
,
576 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000
, 1,
577 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000
);
579 case V4L2_CID_MPEG_VIDEO_ENCODING
:
580 return v4l2_ctrl_query_fill(qctrl
,
581 V4L2_MPEG_VIDEO_ENCODING_MPEG_2
,
582 V4L2_MPEG_VIDEO_ENCODING_MPEG_2
, 1,
583 V4L2_MPEG_VIDEO_ENCODING_MPEG_2
);
585 case V4L2_CID_MPEG_VIDEO_ASPECT
:
586 return v4l2_ctrl_query_fill(qctrl
,
587 V4L2_MPEG_VIDEO_ASPECT_4x3
,
588 V4L2_MPEG_VIDEO_ASPECT_16x9
, 1,
589 V4L2_MPEG_VIDEO_ASPECT_4x3
);
591 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK
:
592 err
= v4l2_ctrl_query_fill(qctrl
, 0, 27000000, 1, 8000000);
594 params
->vi_bitrate_mode
==
595 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
)
596 qctrl
->flags
|= V4L2_CTRL_FLAG_INACTIVE
;
599 case V4L2_CID_MPEG_STREAM_TYPE
:
600 return v4l2_ctrl_query_fill(qctrl
,
601 V4L2_MPEG_STREAM_TYPE_MPEG2_TS
,
602 V4L2_MPEG_STREAM_TYPE_MPEG2_TS
, 1,
603 V4L2_MPEG_STREAM_TYPE_MPEG2_TS
);
605 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE
:
606 return v4l2_ctrl_query_fill(qctrl
,
607 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR
,
608 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR
, 1,
609 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR
);
610 case V4L2_CID_MPEG_VIDEO_BITRATE
:
611 return v4l2_ctrl_query_fill(qctrl
, 0, 27000000, 1, 6000000);
612 case V4L2_CID_MPEG_STREAM_PID_PMT
:
613 return v4l2_ctrl_query_fill(qctrl
, 0, (1 << 14) - 1, 1, 16);
614 case V4L2_CID_MPEG_STREAM_PID_AUDIO
:
615 return v4l2_ctrl_query_fill(qctrl
, 0, (1 << 14) - 1, 1, 260);
616 case V4L2_CID_MPEG_STREAM_PID_VIDEO
:
617 return v4l2_ctrl_query_fill(qctrl
, 0, (1 << 14) - 1, 1, 256);
618 case V4L2_CID_MPEG_STREAM_PID_PCR
:
619 return v4l2_ctrl_query_fill(qctrl
, 0, (1 << 14) - 1, 1, 259);
627 static int saa6752hs_querymenu(struct v4l2_subdev
*sd
, struct v4l2_querymenu
*qmenu
)
629 static const u32 mpeg_audio_encoding
[] = {
630 V4L2_MPEG_AUDIO_ENCODING_LAYER_2
,
631 V4L2_CTRL_MENU_IDS_END
633 static const u32 mpeg_audio_ac3_encoding
[] = {
634 V4L2_MPEG_AUDIO_ENCODING_LAYER_2
,
635 V4L2_MPEG_AUDIO_ENCODING_AC3
,
636 V4L2_CTRL_MENU_IDS_END
638 static u32 mpeg_audio_l2_bitrate
[] = {
639 V4L2_MPEG_AUDIO_L2_BITRATE_256K
,
640 V4L2_MPEG_AUDIO_L2_BITRATE_384K
,
641 V4L2_CTRL_MENU_IDS_END
643 static u32 mpeg_audio_ac3_bitrate
[] = {
644 V4L2_MPEG_AUDIO_AC3_BITRATE_256K
,
645 V4L2_MPEG_AUDIO_AC3_BITRATE_384K
,
646 V4L2_CTRL_MENU_IDS_END
648 struct saa6752hs_state
*h
= to_state(sd
);
649 struct v4l2_queryctrl qctrl
;
652 qctrl
.id
= qmenu
->id
;
653 err
= saa6752hs_queryctrl(sd
, &qctrl
);
657 case V4L2_CID_MPEG_AUDIO_L2_BITRATE
:
658 return v4l2_ctrl_query_menu_valid_items(qmenu
,
659 mpeg_audio_l2_bitrate
);
660 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE
:
663 return v4l2_ctrl_query_menu_valid_items(qmenu
,
664 mpeg_audio_ac3_bitrate
);
665 case V4L2_CID_MPEG_AUDIO_ENCODING
:
666 return v4l2_ctrl_query_menu_valid_items(qmenu
,
667 h
->has_ac3
? mpeg_audio_ac3_encoding
:
668 mpeg_audio_encoding
);
670 return v4l2_ctrl_query_menu(qmenu
, &qctrl
, NULL
);
673 static int saa6752hs_init(struct v4l2_subdev
*sd
, u32 leading_null_bytes
)
675 unsigned char buf
[9], buf2
[4];
676 struct saa6752hs_state
*h
= to_state(sd
);
677 struct i2c_client
*client
= v4l2_get_subdevdata(sd
);
680 unsigned char localPAT
[256];
681 unsigned char localPMT
[256];
683 /* Set video format - must be done first as it resets other settings */
684 set_reg8(client
, 0x41, h
->video_format
);
686 /* Set number of lines in input signal */
687 set_reg8(client
, 0x40, (h
->standard
& V4L2_STD_525_60
) ? 1 : 0);
690 saa6752hs_set_bitrate(client
, h
);
692 /* Set GOP structure {3, 13} */
693 set_reg16(client
, 0x72, 0x030d);
695 /* Set minimum Q-scale {4} */
696 set_reg8(client
, 0x82, 0x04);
698 /* Set maximum Q-scale {12} */
699 set_reg8(client
, 0x83, 0x0c);
701 /* Set Output Protocol */
702 set_reg8(client
, 0xd0, 0x81);
704 /* Set video output stream format {TS} */
705 set_reg8(client
, 0xb0, 0x05);
707 /* Set leading null byte for TS */
708 set_reg16(client
, 0xf6, leading_null_bytes
);
711 memcpy(localPAT
, PAT
, sizeof(PAT
));
712 localPAT
[17] = 0xe0 | ((h
->params
.ts_pid_pmt
>> 8) & 0x0f);
713 localPAT
[18] = h
->params
.ts_pid_pmt
& 0xff;
714 crc
= crc32_be(~0, &localPAT
[7], sizeof(PAT
) - 7 - 4);
715 localPAT
[sizeof(PAT
) - 4] = (crc
>> 24) & 0xFF;
716 localPAT
[sizeof(PAT
) - 3] = (crc
>> 16) & 0xFF;
717 localPAT
[sizeof(PAT
) - 2] = (crc
>> 8) & 0xFF;
718 localPAT
[sizeof(PAT
) - 1] = crc
& 0xFF;
721 if (h
->params
.au_encoding
== V4L2_MPEG_AUDIO_ENCODING_AC3
) {
722 size
= sizeof(PMT_AC3
);
723 memcpy(localPMT
, PMT_AC3
, size
);
726 memcpy(localPMT
, PMT
, size
);
728 localPMT
[3] = 0x40 | ((h
->params
.ts_pid_pmt
>> 8) & 0x0f);
729 localPMT
[4] = h
->params
.ts_pid_pmt
& 0xff;
730 localPMT
[15] = 0xE0 | ((h
->params
.ts_pid_pcr
>> 8) & 0x0F);
731 localPMT
[16] = h
->params
.ts_pid_pcr
& 0xFF;
732 localPMT
[20] = 0xE0 | ((h
->params
.ts_pid_video
>> 8) & 0x0F);
733 localPMT
[21] = h
->params
.ts_pid_video
& 0xFF;
734 localPMT
[25] = 0xE0 | ((h
->params
.ts_pid_audio
>> 8) & 0x0F);
735 localPMT
[26] = h
->params
.ts_pid_audio
& 0xFF;
736 crc
= crc32_be(~0, &localPMT
[7], size
- 7 - 4);
737 localPMT
[size
- 4] = (crc
>> 24) & 0xFF;
738 localPMT
[size
- 3] = (crc
>> 16) & 0xFF;
739 localPMT
[size
- 2] = (crc
>> 8) & 0xFF;
740 localPMT
[size
- 1] = crc
& 0xFF;
743 set_reg16(client
, 0xc1, h
->params
.ts_pid_audio
);
746 set_reg16(client
, 0xc0, h
->params
.ts_pid_video
);
749 set_reg16(client
, 0xc4, h
->params
.ts_pid_pcr
);
752 i2c_master_send(client
, localPAT
, sizeof(PAT
));
753 i2c_master_send(client
, localPMT
, size
);
755 /* mute then unmute audio. This removes buzzing artefacts */
756 set_reg8(client
, 0xa4, 1);
757 set_reg8(client
, 0xa4, 0);
760 saa6752hs_chip_command(client
, SAA6752HS_COMMAND_START
);
762 /* readout current state */
768 i2c_master_send(client
, buf
, 5);
769 i2c_master_recv(client
, buf2
, 4);
771 /* change aspect ratio */
778 switch (h
->params
.vi_aspect
) {
779 case V4L2_MPEG_VIDEO_ASPECT_16x9
:
780 buf
[6] = buf2
[1] | 0x40;
782 case V4L2_MPEG_VIDEO_ASPECT_4x3
:
784 buf
[6] = buf2
[1] & 0xBF;
789 i2c_master_send(client
, buf
, 9);
794 static int saa6752hs_do_ext_ctrls(struct v4l2_subdev
*sd
, struct v4l2_ext_controls
*ctrls
, int set
)
796 struct saa6752hs_state
*h
= to_state(sd
);
797 struct saa6752hs_mpeg_params params
;
800 if (ctrls
->ctrl_class
!= V4L2_CTRL_CLASS_MPEG
)
804 for (i
= 0; i
< ctrls
->count
; i
++) {
805 int err
= handle_ctrl(h
->has_ac3
, ¶ms
, ctrls
->controls
+ i
, set
);
808 ctrls
->error_idx
= i
;
817 static int saa6752hs_s_ext_ctrls(struct v4l2_subdev
*sd
, struct v4l2_ext_controls
*ctrls
)
819 return saa6752hs_do_ext_ctrls(sd
, ctrls
, 1);
822 static int saa6752hs_try_ext_ctrls(struct v4l2_subdev
*sd
, struct v4l2_ext_controls
*ctrls
)
824 return saa6752hs_do_ext_ctrls(sd
, ctrls
, 0);
827 static int saa6752hs_g_ext_ctrls(struct v4l2_subdev
*sd
, struct v4l2_ext_controls
*ctrls
)
829 struct saa6752hs_state
*h
= to_state(sd
);
832 if (ctrls
->ctrl_class
!= V4L2_CTRL_CLASS_MPEG
)
835 for (i
= 0; i
< ctrls
->count
; i
++) {
836 int err
= get_ctrl(h
->has_ac3
, &h
->params
, ctrls
->controls
+ i
);
839 ctrls
->error_idx
= i
;
846 static int saa6752hs_g_mbus_fmt(struct v4l2_subdev
*sd
, struct v4l2_mbus_framefmt
*f
)
848 struct saa6752hs_state
*h
= to_state(sd
);
850 if (h
->video_format
== SAA6752HS_VF_UNKNOWN
)
851 h
->video_format
= SAA6752HS_VF_D1
;
852 f
->width
= v4l2_format_table
[h
->video_format
].fmt
.pix
.width
;
853 f
->height
= v4l2_format_table
[h
->video_format
].fmt
.pix
.height
;
854 f
->code
= V4L2_MBUS_FMT_FIXED
;
855 f
->field
= V4L2_FIELD_INTERLACED
;
856 f
->colorspace
= V4L2_COLORSPACE_SMPTE170M
;
860 static int saa6752hs_s_mbus_fmt(struct v4l2_subdev
*sd
, struct v4l2_mbus_framefmt
*f
)
862 struct saa6752hs_state
*h
= to_state(sd
);
863 int dist_352
, dist_480
, dist_720
;
865 if (f
->code
!= V4L2_MBUS_FMT_FIXED
)
869 FIXME: translate and round width/height into EMPRESS
873 ---------------------------
874 SIF | 352x288 | 352x240
875 1/2 D1 | 352x576 | 352x480
876 2/3 D1 | 480x576 | 480x480
877 D1 | 720x576 | 720x480
880 dist_352
= abs(f
->width
- 352);
881 dist_480
= abs(f
->width
- 480);
882 dist_720
= abs(f
->width
- 720);
883 if (dist_720
< dist_480
) {
886 h
->video_format
= SAA6752HS_VF_D1
;
887 } else if (dist_480
< dist_352
) {
890 h
->video_format
= SAA6752HS_VF_2_3_D1
;
893 if (abs(f
->height
- 576) <
894 abs(f
->height
- 288)) {
896 h
->video_format
= SAA6752HS_VF_1_2_D1
;
899 h
->video_format
= SAA6752HS_VF_SIF
;
902 f
->field
= V4L2_FIELD_INTERLACED
;
903 f
->colorspace
= V4L2_COLORSPACE_SMPTE170M
;
907 static int saa6752hs_s_std(struct v4l2_subdev
*sd
, v4l2_std_id std
)
909 struct saa6752hs_state
*h
= to_state(sd
);
915 /* ----------------------------------------------------------------------- */
917 static const struct v4l2_subdev_core_ops saa6752hs_core_ops
= {
918 .init
= saa6752hs_init
,
919 .queryctrl
= saa6752hs_queryctrl
,
920 .querymenu
= saa6752hs_querymenu
,
921 .g_ext_ctrls
= saa6752hs_g_ext_ctrls
,
922 .s_ext_ctrls
= saa6752hs_s_ext_ctrls
,
923 .try_ext_ctrls
= saa6752hs_try_ext_ctrls
,
924 .s_std
= saa6752hs_s_std
,
927 static const struct v4l2_subdev_video_ops saa6752hs_video_ops
= {
928 .s_mbus_fmt
= saa6752hs_s_mbus_fmt
,
929 .g_mbus_fmt
= saa6752hs_g_mbus_fmt
,
932 static const struct v4l2_subdev_ops saa6752hs_ops
= {
933 .core
= &saa6752hs_core_ops
,
934 .video
= &saa6752hs_video_ops
,
937 static int saa6752hs_probe(struct i2c_client
*client
,
938 const struct i2c_device_id
*id
)
940 struct saa6752hs_state
*h
= kzalloc(sizeof(*h
), GFP_KERNEL
);
941 struct v4l2_subdev
*sd
;
945 v4l_info(client
, "chip found @ 0x%x (%s)\n",
946 client
->addr
<< 1, client
->adapter
->name
);
950 v4l2_i2c_subdev_init(sd
, client
, &saa6752hs_ops
);
952 i2c_master_send(client
, &addr
, 1);
953 i2c_master_recv(client
, data
, sizeof(data
));
954 h
->revision
= (data
[8] << 8) | data
[9];
956 if (h
->revision
== 0x0206) {
958 v4l_info(client
, "support AC-3\n");
960 h
->params
= param_defaults
;
961 h
->standard
= 0; /* Assume 625 input lines */
965 static int saa6752hs_remove(struct i2c_client
*client
)
967 struct v4l2_subdev
*sd
= i2c_get_clientdata(client
);
969 v4l2_device_unregister_subdev(sd
);
974 static const struct i2c_device_id saa6752hs_id
[] = {
978 MODULE_DEVICE_TABLE(i2c
, saa6752hs_id
);
980 static struct i2c_driver saa6752hs_driver
= {
982 .owner
= THIS_MODULE
,
985 .probe
= saa6752hs_probe
,
986 .remove
= saa6752hs_remove
,
987 .id_table
= saa6752hs_id
,
990 module_i2c_driver(saa6752hs_driver
);
993 * Overrides for Emacs so that we follow Linus's tabbing style.
994 * ---------------------------------------------------------------------------