1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 <linux/init.h>
37#include <linux/crc32.h>
38#include <media/v4l2-device.h>
39#include <media/v4l2-ctrls.h>
40#include <media/v4l2-common.h>
41
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)
46
47
48MODULE_DESCRIPTION("device driver for saa6752hs MPEG2 encoder");
49MODULE_AUTHOR("Andrew de Quincey");
50MODULE_LICENSE("GPL");
51
52enum saa6752hs_videoformat {
53 SAA6752HS_VF_D1 = 0,
54 SAA6752HS_VF_2_3_D1 = 1,
55 SAA6752HS_VF_1_2_D1 = 2,
56 SAA6752HS_VF_SIF = 3,
57 SAA6752HS_VF_UNKNOWN,
58};
59
60struct saa6752hs_mpeg_params {
61
62 __u16 ts_pid_pmt;
63 __u16 ts_pid_audio;
64 __u16 ts_pid_video;
65 __u16 ts_pid_pcr;
66
67
68 enum v4l2_mpeg_audio_encoding au_encoding;
69 enum v4l2_mpeg_audio_l2_bitrate au_l2_bitrate;
70 enum v4l2_mpeg_audio_ac3_bitrate au_ac3_bitrate;
71
72
73 enum v4l2_mpeg_video_aspect vi_aspect;
74 enum v4l2_mpeg_video_bitrate_mode vi_bitrate_mode;
75 __u32 vi_bitrate;
76 __u32 vi_bitrate_peak;
77};
78
79static const struct v4l2_format v4l2_format_table[] =
80{
81 [SAA6752HS_VF_D1] =
82 { .fmt = { .pix = { .width = 720, .height = 576 }}},
83 [SAA6752HS_VF_2_3_D1] =
84 { .fmt = { .pix = { .width = 480, .height = 576 }}},
85 [SAA6752HS_VF_1_2_D1] =
86 { .fmt = { .pix = { .width = 352, .height = 576 }}},
87 [SAA6752HS_VF_SIF] =
88 { .fmt = { .pix = { .width = 352, .height = 288 }}},
89 [SAA6752HS_VF_UNKNOWN] =
90 { .fmt = { .pix = { .width = 0, .height = 0}}},
91};
92
93struct saa6752hs_state {
94 struct v4l2_subdev sd;
95 struct v4l2_ctrl_handler hdl;
96 struct {
97 struct v4l2_ctrl *video_bitrate_mode;
98 struct v4l2_ctrl *video_bitrate;
99 struct v4l2_ctrl *video_bitrate_peak;
100 };
101 u32 revision;
102 int has_ac3;
103 struct saa6752hs_mpeg_params params;
104 enum saa6752hs_videoformat video_format;
105 v4l2_std_id standard;
106};
107
108enum saa6752hs_command {
109 SAA6752HS_COMMAND_RESET = 0,
110 SAA6752HS_COMMAND_STOP = 1,
111 SAA6752HS_COMMAND_START = 2,
112 SAA6752HS_COMMAND_PAUSE = 3,
113 SAA6752HS_COMMAND_RECONFIGURE = 4,
114 SAA6752HS_COMMAND_SLEEP = 5,
115 SAA6752HS_COMMAND_RECONFIGURE_FORCE = 6,
116
117 SAA6752HS_COMMAND_MAX
118};
119
120static inline struct saa6752hs_state *to_state(struct v4l2_subdev *sd)
121{
122 return container_of(sd, struct saa6752hs_state, sd);
123}
124
125
126
127static const u8 PAT[] = {
128 0xc2,
129 0x00,
130
131 0x47,
132 0x40, 0x00,
133 0x10,
134
135 0x00,
136
137 0x00,
138 0xb0, 0x0d,
139
140 0x00, 0x01,
141
142 0xc1,
143
144 0x00, 0x00,
145
146 0x00, 0x01,
147
148 0xe0, 0x00,
149
150 0x00, 0x00, 0x00, 0x00
151};
152
153static const u8 PMT[] = {
154 0xc2,
155 0x01,
156
157 0x47,
158 0x40, 0x00,
159 0x10,
160
161 0x00,
162
163 0x02,
164 0xb0, 0x17,
165
166 0x00, 0x01,
167
168 0xc1,
169
170 0x00, 0x00,
171
172 0xe0, 0x00,
173
174 0xf0, 0x00,
175
176 0x02, 0xe0, 0x00, 0xf0, 0x00,
177 0x04, 0xe0, 0x00, 0xf0, 0x00,
178
179 0x00, 0x00, 0x00, 0x00
180};
181
182static const u8 PMT_AC3[] = {
183 0xc2,
184 0x01,
185 0x47,
186
187 0x40,
188 0x10,
189 0x10,
190
191 0x00,
192
193 0x02,
194 0xb0, 0x1a,
195
196 0x00, 0x01,
197
198 0xc1,
199
200 0x00, 0x00,
201
202 0xe1, 0x04,
203
204 0xf0, 0x00,
205
206 0x02, 0xe1, 0x00, 0xf0, 0x00,
207 0x06, 0xe1, 0x03, 0xf0, 0x03,
208 0x6a,
209 0x01,
210 0x00,
211
212 0xED, 0xDE, 0x2D, 0xF3
213};
214
215static const struct saa6752hs_mpeg_params param_defaults =
216{
217 .ts_pid_pmt = 16,
218 .ts_pid_video = 260,
219 .ts_pid_audio = 256,
220 .ts_pid_pcr = 259,
221
222 .vi_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3,
223 .vi_bitrate = 4000,
224 .vi_bitrate_peak = 6000,
225 .vi_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
226
227 .au_encoding = V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
228 .au_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_256K,
229 .au_ac3_bitrate = V4L2_MPEG_AUDIO_AC3_BITRATE_256K,
230};
231
232
233
234static int saa6752hs_chip_command(struct i2c_client *client,
235 enum saa6752hs_command command)
236{
237 unsigned char buf[3];
238 unsigned long timeout;
239 int status = 0;
240
241
242 switch(command) {
243 case SAA6752HS_COMMAND_RESET:
244 buf[0] = 0x00;
245 break;
246
247 case SAA6752HS_COMMAND_STOP:
248 buf[0] = 0x03;
249 break;
250
251 case SAA6752HS_COMMAND_START:
252 buf[0] = 0x02;
253 break;
254
255 case SAA6752HS_COMMAND_PAUSE:
256 buf[0] = 0x04;
257 break;
258
259 case SAA6752HS_COMMAND_RECONFIGURE:
260 buf[0] = 0x05;
261 break;
262
263 case SAA6752HS_COMMAND_SLEEP:
264 buf[0] = 0x06;
265 break;
266
267 case SAA6752HS_COMMAND_RECONFIGURE_FORCE:
268 buf[0] = 0x07;
269 break;
270
271 default:
272 return -EINVAL;
273 }
274
275
276 i2c_master_send(client, buf, 1);
277 timeout = jiffies + HZ * 3;
278 for (;;) {
279
280 buf[0] = 0x10;
281 i2c_master_send(client, buf, 1);
282 i2c_master_recv(client, buf, 1);
283
284 if (!(buf[0] & 0x20))
285 break;
286 if (time_after(jiffies,timeout)) {
287 status = -ETIMEDOUT;
288 break;
289 }
290
291 msleep(10);
292 }
293
294
295 msleep(50);
296
297 return status;
298}
299
300
301static inline void set_reg8(struct i2c_client *client, uint8_t reg, uint8_t val)
302{
303 u8 buf[2];
304
305 buf[0] = reg;
306 buf[1] = val;
307 i2c_master_send(client, buf, 2);
308}
309
310static inline void set_reg16(struct i2c_client *client, uint8_t reg, uint16_t val)
311{
312 u8 buf[3];
313
314 buf[0] = reg;
315 buf[1] = val >> 8;
316 buf[2] = val & 0xff;
317 i2c_master_send(client, buf, 3);
318}
319
320static int saa6752hs_set_bitrate(struct i2c_client *client,
321 struct saa6752hs_state *h)
322{
323 struct saa6752hs_mpeg_params *params = &h->params;
324 int tot_bitrate;
325 int is_384k;
326
327
328 set_reg8(client, 0x71,
329 params->vi_bitrate_mode != V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
330
331
332 if (params->vi_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) {
333
334 set_reg16(client, 0x80, params->vi_bitrate);
335
336
337 set_reg16(client, 0x81, params->vi_bitrate_peak);
338 tot_bitrate = params->vi_bitrate_peak;
339 } else {
340
341 set_reg16(client, 0x81, params->vi_bitrate);
342 tot_bitrate = params->vi_bitrate;
343 }
344
345
346 set_reg8(client, 0x93,
347 params->au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3);
348
349
350 if (params->au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3)
351 is_384k = V4L2_MPEG_AUDIO_AC3_BITRATE_384K == params->au_ac3_bitrate;
352 else
353 is_384k = V4L2_MPEG_AUDIO_L2_BITRATE_384K == params->au_l2_bitrate;
354 set_reg8(client, 0x94, is_384k);
355 tot_bitrate += is_384k ? 384 : 256;
356
357
358
359
360
361 tot_bitrate += 768;
362 if (tot_bitrate > MPEG_TOTAL_TARGET_BITRATE_MAX)
363 tot_bitrate = MPEG_TOTAL_TARGET_BITRATE_MAX;
364
365
366 set_reg16(client, 0xb1, tot_bitrate);
367 return 0;
368}
369
370static int saa6752hs_try_ctrl(struct v4l2_ctrl *ctrl)
371{
372 struct saa6752hs_state *h =
373 container_of(ctrl->handler, struct saa6752hs_state, hdl);
374
375 switch (ctrl->id) {
376 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
377
378 if (ctrl->val == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR &&
379 h->video_bitrate_peak->val < h->video_bitrate->val)
380 h->video_bitrate_peak->val = h->video_bitrate->val;
381 break;
382 }
383 return 0;
384}
385
386static int saa6752hs_s_ctrl(struct v4l2_ctrl *ctrl)
387{
388 struct saa6752hs_state *h =
389 container_of(ctrl->handler, struct saa6752hs_state, hdl);
390 struct saa6752hs_mpeg_params *params = &h->params;
391
392 switch (ctrl->id) {
393 case V4L2_CID_MPEG_STREAM_TYPE:
394 break;
395 case V4L2_CID_MPEG_STREAM_PID_PMT:
396 params->ts_pid_pmt = ctrl->val;
397 break;
398 case V4L2_CID_MPEG_STREAM_PID_AUDIO:
399 params->ts_pid_audio = ctrl->val;
400 break;
401 case V4L2_CID_MPEG_STREAM_PID_VIDEO:
402 params->ts_pid_video = ctrl->val;
403 break;
404 case V4L2_CID_MPEG_STREAM_PID_PCR:
405 params->ts_pid_pcr = ctrl->val;
406 break;
407 case V4L2_CID_MPEG_AUDIO_ENCODING:
408 params->au_encoding = ctrl->val;
409 break;
410 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
411 params->au_l2_bitrate = ctrl->val;
412 break;
413 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
414 params->au_ac3_bitrate = ctrl->val;
415 break;
416 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
417 break;
418 case V4L2_CID_MPEG_VIDEO_ENCODING:
419 break;
420 case V4L2_CID_MPEG_VIDEO_ASPECT:
421 params->vi_aspect = ctrl->val;
422 break;
423 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
424 params->vi_bitrate_mode = ctrl->val;
425 params->vi_bitrate = h->video_bitrate->val / 1000;
426 params->vi_bitrate_peak = h->video_bitrate_peak->val / 1000;
427 v4l2_ctrl_activate(h->video_bitrate_peak,
428 ctrl->val == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
429 break;
430 default:
431 return -EINVAL;
432 }
433 return 0;
434}
435
436static int saa6752hs_init(struct v4l2_subdev *sd, u32 leading_null_bytes)
437{
438 unsigned char buf[9], buf2[4];
439 struct saa6752hs_state *h = to_state(sd);
440 struct i2c_client *client = v4l2_get_subdevdata(sd);
441 unsigned size;
442 u32 crc;
443 unsigned char localPAT[256];
444 unsigned char localPMT[256];
445
446
447 set_reg8(client, 0x41, h->video_format);
448
449
450 set_reg8(client, 0x40, (h->standard & V4L2_STD_525_60) ? 1 : 0);
451
452
453 saa6752hs_set_bitrate(client, h);
454
455
456 set_reg16(client, 0x72, 0x030d);
457
458
459 set_reg8(client, 0x82, 0x04);
460
461
462 set_reg8(client, 0x83, 0x0c);
463
464
465 set_reg8(client, 0xd0, 0x81);
466
467
468 set_reg8(client, 0xb0, 0x05);
469
470
471 set_reg16(client, 0xf6, leading_null_bytes);
472
473
474 memcpy(localPAT, PAT, sizeof(PAT));
475 localPAT[17] = 0xe0 | ((h->params.ts_pid_pmt >> 8) & 0x0f);
476 localPAT[18] = h->params.ts_pid_pmt & 0xff;
477 crc = crc32_be(~0, &localPAT[7], sizeof(PAT) - 7 - 4);
478 localPAT[sizeof(PAT) - 4] = (crc >> 24) & 0xFF;
479 localPAT[sizeof(PAT) - 3] = (crc >> 16) & 0xFF;
480 localPAT[sizeof(PAT) - 2] = (crc >> 8) & 0xFF;
481 localPAT[sizeof(PAT) - 1] = crc & 0xFF;
482
483
484 if (h->params.au_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3) {
485 size = sizeof(PMT_AC3);
486 memcpy(localPMT, PMT_AC3, size);
487 } else {
488 size = sizeof(PMT);
489 memcpy(localPMT, PMT, size);
490 }
491 localPMT[3] = 0x40 | ((h->params.ts_pid_pmt >> 8) & 0x0f);
492 localPMT[4] = h->params.ts_pid_pmt & 0xff;
493 localPMT[15] = 0xE0 | ((h->params.ts_pid_pcr >> 8) & 0x0F);
494 localPMT[16] = h->params.ts_pid_pcr & 0xFF;
495 localPMT[20] = 0xE0 | ((h->params.ts_pid_video >> 8) & 0x0F);
496 localPMT[21] = h->params.ts_pid_video & 0xFF;
497 localPMT[25] = 0xE0 | ((h->params.ts_pid_audio >> 8) & 0x0F);
498 localPMT[26] = h->params.ts_pid_audio & 0xFF;
499 crc = crc32_be(~0, &localPMT[7], size - 7 - 4);
500 localPMT[size - 4] = (crc >> 24) & 0xFF;
501 localPMT[size - 3] = (crc >> 16) & 0xFF;
502 localPMT[size - 2] = (crc >> 8) & 0xFF;
503 localPMT[size - 1] = crc & 0xFF;
504
505
506 set_reg16(client, 0xc1, h->params.ts_pid_audio);
507
508
509 set_reg16(client, 0xc0, h->params.ts_pid_video);
510
511
512 set_reg16(client, 0xc4, h->params.ts_pid_pcr);
513
514
515 i2c_master_send(client, localPAT, sizeof(PAT));
516 i2c_master_send(client, localPMT, size);
517
518
519 set_reg8(client, 0xa4, 1);
520 set_reg8(client, 0xa4, 0);
521
522
523 saa6752hs_chip_command(client, SAA6752HS_COMMAND_START);
524
525
526 buf[0] = 0xE1;
527 buf[1] = 0xA7;
528 buf[2] = 0xFE;
529 buf[3] = 0x82;
530 buf[4] = 0xB0;
531 i2c_master_send(client, buf, 5);
532 i2c_master_recv(client, buf2, 4);
533
534
535 buf[0] = 0xE0;
536 buf[1] = 0xA7;
537 buf[2] = 0xFE;
538 buf[3] = 0x82;
539 buf[4] = 0xB0;
540 buf[5] = buf2[0];
541 switch (h->params.vi_aspect) {
542 case V4L2_MPEG_VIDEO_ASPECT_16x9:
543 buf[6] = buf2[1] | 0x40;
544 break;
545 case V4L2_MPEG_VIDEO_ASPECT_4x3:
546 default:
547 buf[6] = buf2[1] & 0xBF;
548 break;
549 }
550 buf[7] = buf2[2];
551 buf[8] = buf2[3];
552 i2c_master_send(client, buf, 9);
553
554 return 0;
555}
556
557static int saa6752hs_get_fmt(struct v4l2_subdev *sd,
558 struct v4l2_subdev_pad_config *cfg,
559 struct v4l2_subdev_format *format)
560{
561 struct v4l2_mbus_framefmt *f = &format->format;
562 struct saa6752hs_state *h = to_state(sd);
563
564 if (format->pad)
565 return -EINVAL;
566
567 if (h->video_format == SAA6752HS_VF_UNKNOWN)
568 h->video_format = SAA6752HS_VF_D1;
569 f->width = v4l2_format_table[h->video_format].fmt.pix.width;
570 f->height = v4l2_format_table[h->video_format].fmt.pix.height;
571 f->code = MEDIA_BUS_FMT_FIXED;
572 f->field = V4L2_FIELD_INTERLACED;
573 f->colorspace = V4L2_COLORSPACE_SMPTE170M;
574 return 0;
575}
576
577static int saa6752hs_set_fmt(struct v4l2_subdev *sd,
578 struct v4l2_subdev_pad_config *cfg,
579 struct v4l2_subdev_format *format)
580{
581 struct v4l2_mbus_framefmt *f = &format->format;
582 struct saa6752hs_state *h = to_state(sd);
583 int dist_352, dist_480, dist_720;
584
585 if (format->pad)
586 return -EINVAL;
587
588 f->code = MEDIA_BUS_FMT_FIXED;
589
590 dist_352 = abs(f->width - 352);
591 dist_480 = abs(f->width - 480);
592 dist_720 = abs(f->width - 720);
593 if (dist_720 < dist_480) {
594 f->width = 720;
595 f->height = 576;
596 } else if (dist_480 < dist_352) {
597 f->width = 480;
598 f->height = 576;
599 } else {
600 f->width = 352;
601 if (abs(f->height - 576) < abs(f->height - 288))
602 f->height = 576;
603 else
604 f->height = 288;
605 }
606 f->field = V4L2_FIELD_INTERLACED;
607 f->colorspace = V4L2_COLORSPACE_SMPTE170M;
608
609 if (format->which == V4L2_SUBDEV_FORMAT_TRY) {
610 cfg->try_fmt = *f;
611 return 0;
612 }
613
614
615
616
617
618
619
620
621
622
623
624
625
626 if (f->code != MEDIA_BUS_FMT_FIXED)
627 return -EINVAL;
628
629 if (f->width == 720)
630 h->video_format = SAA6752HS_VF_D1;
631 else if (f->width == 480)
632 h->video_format = SAA6752HS_VF_2_3_D1;
633 else if (f->height == 576)
634 h->video_format = SAA6752HS_VF_1_2_D1;
635 else
636 h->video_format = SAA6752HS_VF_SIF;
637 return 0;
638}
639
640static int saa6752hs_s_std(struct v4l2_subdev *sd, v4l2_std_id std)
641{
642 struct saa6752hs_state *h = to_state(sd);
643
644 h->standard = std;
645 return 0;
646}
647
648
649
650static const struct v4l2_ctrl_ops saa6752hs_ctrl_ops = {
651 .try_ctrl = saa6752hs_try_ctrl,
652 .s_ctrl = saa6752hs_s_ctrl,
653};
654
655static const struct v4l2_subdev_core_ops saa6752hs_core_ops = {
656 .init = saa6752hs_init,
657};
658
659static const struct v4l2_subdev_video_ops saa6752hs_video_ops = {
660 .s_std = saa6752hs_s_std,
661};
662
663static const struct v4l2_subdev_pad_ops saa6752hs_pad_ops = {
664 .get_fmt = saa6752hs_get_fmt,
665 .set_fmt = saa6752hs_set_fmt,
666};
667
668static const struct v4l2_subdev_ops saa6752hs_ops = {
669 .core = &saa6752hs_core_ops,
670 .video = &saa6752hs_video_ops,
671 .pad = &saa6752hs_pad_ops,
672};
673
674static int saa6752hs_probe(struct i2c_client *client,
675 const struct i2c_device_id *id)
676{
677 struct saa6752hs_state *h;
678 struct v4l2_subdev *sd;
679 struct v4l2_ctrl_handler *hdl;
680 u8 addr = 0x13;
681 u8 data[12];
682
683 v4l_info(client, "chip found @ 0x%x (%s)\n",
684 client->addr << 1, client->adapter->name);
685
686 h = devm_kzalloc(&client->dev, sizeof(*h), GFP_KERNEL);
687 if (h == NULL)
688 return -ENOMEM;
689 sd = &h->sd;
690 v4l2_i2c_subdev_init(sd, client, &saa6752hs_ops);
691
692 i2c_master_send(client, &addr, 1);
693 i2c_master_recv(client, data, sizeof(data));
694 h->revision = (data[8] << 8) | data[9];
695 h->has_ac3 = 0;
696 if (h->revision == 0x0206) {
697 h->has_ac3 = 1;
698 v4l_info(client, "supports AC-3\n");
699 }
700 h->params = param_defaults;
701
702 hdl = &h->hdl;
703 v4l2_ctrl_handler_init(hdl, 14);
704 v4l2_ctrl_new_std_menu(hdl, &saa6752hs_ctrl_ops,
705 V4L2_CID_MPEG_AUDIO_ENCODING,
706 h->has_ac3 ? V4L2_MPEG_AUDIO_ENCODING_AC3 :
707 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
708 0x0d, V4L2_MPEG_AUDIO_ENCODING_LAYER_2);
709
710 v4l2_ctrl_new_std_menu(hdl, &saa6752hs_ctrl_ops,
711 V4L2_CID_MPEG_AUDIO_L2_BITRATE,
712 V4L2_MPEG_AUDIO_L2_BITRATE_384K,
713 ~((1 << V4L2_MPEG_AUDIO_L2_BITRATE_256K) |
714 (1 << V4L2_MPEG_AUDIO_L2_BITRATE_384K)),
715 V4L2_MPEG_AUDIO_L2_BITRATE_256K);
716
717 if (h->has_ac3)
718 v4l2_ctrl_new_std_menu(hdl, &saa6752hs_ctrl_ops,
719 V4L2_CID_MPEG_AUDIO_AC3_BITRATE,
720 V4L2_MPEG_AUDIO_AC3_BITRATE_384K,
721 ~((1 << V4L2_MPEG_AUDIO_AC3_BITRATE_256K) |
722 (1 << V4L2_MPEG_AUDIO_AC3_BITRATE_384K)),
723 V4L2_MPEG_AUDIO_AC3_BITRATE_256K);
724
725 v4l2_ctrl_new_std_menu(hdl, &saa6752hs_ctrl_ops,
726 V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
727 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
728 ~(1 << V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000),
729 V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000);
730
731 v4l2_ctrl_new_std_menu(hdl, &saa6752hs_ctrl_ops,
732 V4L2_CID_MPEG_VIDEO_ENCODING,
733 V4L2_MPEG_VIDEO_ENCODING_MPEG_2,
734 ~(1 << V4L2_MPEG_VIDEO_ENCODING_MPEG_2),
735 V4L2_MPEG_VIDEO_ENCODING_MPEG_2);
736
737 v4l2_ctrl_new_std_menu(hdl, &saa6752hs_ctrl_ops,
738 V4L2_CID_MPEG_VIDEO_ASPECT,
739 V4L2_MPEG_VIDEO_ASPECT_16x9, 0x01,
740 V4L2_MPEG_VIDEO_ASPECT_4x3);
741
742 h->video_bitrate_peak = v4l2_ctrl_new_std(hdl, &saa6752hs_ctrl_ops,
743 V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
744 1000000, 27000000, 1000, 8000000);
745
746 v4l2_ctrl_new_std_menu(hdl, &saa6752hs_ctrl_ops,
747 V4L2_CID_MPEG_STREAM_TYPE,
748 V4L2_MPEG_STREAM_TYPE_MPEG2_TS,
749 ~(1 << V4L2_MPEG_STREAM_TYPE_MPEG2_TS),
750 V4L2_MPEG_STREAM_TYPE_MPEG2_TS);
751
752 h->video_bitrate_mode = v4l2_ctrl_new_std_menu(hdl, &saa6752hs_ctrl_ops,
753 V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
754 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 0,
755 V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
756 h->video_bitrate = v4l2_ctrl_new_std(hdl, &saa6752hs_ctrl_ops,
757 V4L2_CID_MPEG_VIDEO_BITRATE, 1000000, 27000000, 1000, 6000000);
758 v4l2_ctrl_new_std(hdl, &saa6752hs_ctrl_ops,
759 V4L2_CID_MPEG_STREAM_PID_PMT, 0, (1 << 14) - 1, 1, 16);
760 v4l2_ctrl_new_std(hdl, &saa6752hs_ctrl_ops,
761 V4L2_CID_MPEG_STREAM_PID_AUDIO, 0, (1 << 14) - 1, 1, 260);
762 v4l2_ctrl_new_std(hdl, &saa6752hs_ctrl_ops,
763 V4L2_CID_MPEG_STREAM_PID_VIDEO, 0, (1 << 14) - 1, 1, 256);
764 v4l2_ctrl_new_std(hdl, &saa6752hs_ctrl_ops,
765 V4L2_CID_MPEG_STREAM_PID_PCR, 0, (1 << 14) - 1, 1, 259);
766 sd->ctrl_handler = hdl;
767 if (hdl->error) {
768 int err = hdl->error;
769
770 v4l2_ctrl_handler_free(hdl);
771 return err;
772 }
773 v4l2_ctrl_cluster(3, &h->video_bitrate_mode);
774 v4l2_ctrl_handler_setup(hdl);
775 h->standard = 0;
776 return 0;
777}
778
779static int saa6752hs_remove(struct i2c_client *client)
780{
781 struct v4l2_subdev *sd = i2c_get_clientdata(client);
782
783 v4l2_device_unregister_subdev(sd);
784 v4l2_ctrl_handler_free(&to_state(sd)->hdl);
785 return 0;
786}
787
788static const struct i2c_device_id saa6752hs_id[] = {
789 { "saa6752hs", 0 },
790 { }
791};
792MODULE_DEVICE_TABLE(i2c, saa6752hs_id);
793
794static struct i2c_driver saa6752hs_driver = {
795 .driver = {
796 .name = "saa6752hs",
797 },
798 .probe = saa6752hs_probe,
799 .remove = saa6752hs_remove,
800 .id_table = saa6752hs_id,
801};
802
803module_i2c_driver(saa6752hs_driver);
804