diff options
author | Hans Verkuil <hverkuil@xs4all.nl> | 2006-01-09 15:21:32 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@brturbo.com.br> | 2006-01-09 15:21:32 -0500 |
commit | 7560d7a4f9add362d60d4513033cf522c37adeea (patch) | |
tree | ca408b9b374f641373f57650bd5f462a64b810fe /drivers/media | |
parent | 3d7d027a9bf41437aa93baf14a1aada521ad9b12 (diff) |
V4L/DVB (3317): msp3400: use v4l2_std_id and determine chip capabilities.
- Replace old norm by the v4l2_std_id values.
- Add code to correctly detect the various capabilities of the
various msp chips. It's not yet used, that's going to be the next step.
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@brturbo.com.br>
Diffstat (limited to 'drivers/media')
-rw-r--r-- | drivers/media/video/msp3400-driver.c | 120 | ||||
-rw-r--r-- | drivers/media/video/msp3400-kthreads.c | 33 | ||||
-rw-r--r-- | drivers/media/video/msp3400.h | 23 |
3 files changed, 98 insertions, 78 deletions
diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c index fbd85120c331..0c2ab7e9d1cc 100644 --- a/drivers/media/video/msp3400-driver.c +++ b/drivers/media/video/msp3400-driver.c | |||
@@ -312,10 +312,16 @@ void msp_set_audio(struct i2c_client *client) | |||
312 | msp_write_dsp(client, 0x0003, treble); /* loudspeaker */ | 312 | msp_write_dsp(client, 0x0003, treble); /* loudspeaker */ |
313 | } | 313 | } |
314 | 314 | ||
315 | int msp_modus(struct i2c_client *client, int norm) | 315 | int msp_modus(struct i2c_client *client) |
316 | { | 316 | { |
317 | switch (norm) { | 317 | struct msp_state *state = i2c_get_clientdata(client); |
318 | case VIDEO_MODE_PAL: | 318 | |
319 | if (state->radio) { | ||
320 | v4l_dbg(1, client, "video mode selected to Radio\n"); | ||
321 | return 0x0003; | ||
322 | } | ||
323 | |||
324 | if (state->std & V4L2_STD_PAL) { | ||
319 | v4l_dbg(1, client, "video mode selected to PAL\n"); | 325 | v4l_dbg(1, client, "video mode selected to PAL\n"); |
320 | 326 | ||
321 | #if 1 | 327 | #if 1 |
@@ -325,37 +331,16 @@ int msp_modus(struct i2c_client *client, int norm) | |||
325 | /* previous value, try this if it breaks ... */ | 331 | /* previous value, try this if it breaks ... */ |
326 | return 0x1003; | 332 | return 0x1003; |
327 | #endif | 333 | #endif |
328 | case VIDEO_MODE_NTSC: /* BTSC */ | 334 | } |
335 | if (state->std & V4L2_STD_NTSC) { | ||
329 | v4l_dbg(1, client, "video mode selected to NTSC\n"); | 336 | v4l_dbg(1, client, "video mode selected to NTSC\n"); |
330 | return 0x2003; | 337 | return 0x2003; |
331 | case VIDEO_MODE_SECAM: | 338 | } |
339 | if (state->std & V4L2_STD_SECAM) { | ||
332 | v4l_dbg(1, client, "video mode selected to SECAM\n"); | 340 | v4l_dbg(1, client, "video mode selected to SECAM\n"); |
333 | return 0x0003; | 341 | return 0x0003; |
334 | case VIDEO_MODE_RADIO: | ||
335 | v4l_dbg(1, client, "video mode selected to Radio\n"); | ||
336 | return 0x0003; | ||
337 | case VIDEO_MODE_AUTO: | ||
338 | v4l_dbg(1, client, "video mode selected to Auto\n"); | ||
339 | return 0x2003; | ||
340 | default: | ||
341 | return 0x0003; | ||
342 | } | ||
343 | } | ||
344 | |||
345 | int msp_standard(int norm) | ||
346 | { | ||
347 | switch (norm) { | ||
348 | case VIDEO_MODE_PAL: | ||
349 | return 1; | ||
350 | case VIDEO_MODE_NTSC: /* BTSC */ | ||
351 | return 0x0020; | ||
352 | case VIDEO_MODE_SECAM: | ||
353 | return 1; | ||
354 | case VIDEO_MODE_RADIO: | ||
355 | return 0x0040; | ||
356 | default: | ||
357 | return 1; | ||
358 | } | 342 | } |
343 | return 0x0003; | ||
359 | } | 344 | } |
360 | 345 | ||
361 | /* ------------------------------------------------------------------------ */ | 346 | /* ------------------------------------------------------------------------ */ |
@@ -617,7 +602,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
617 | break; | 602 | break; |
618 | 603 | ||
619 | case AUDC_SET_RADIO: | 604 | case AUDC_SET_RADIO: |
620 | state->norm = VIDEO_MODE_RADIO; | 605 | state->radio = 1; |
621 | v4l_dbg(1, client, "switching to radio mode\n"); | 606 | v4l_dbg(1, client, "switching to radio mode\n"); |
622 | state->watch_stereo = 0; | 607 | state->watch_stereo = 0; |
623 | switch (state->opmode) { | 608 | switch (state->opmode) { |
@@ -673,7 +658,7 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
673 | state->treble = va->treble; | 658 | state->treble = va->treble; |
674 | msp_set_audio(client); | 659 | msp_set_audio(client); |
675 | 660 | ||
676 | if (va->mode != 0 && state->norm != VIDEO_MODE_RADIO) | 661 | if (va->mode != 0 && state->radio == 0) |
677 | msp_any_set_audmode(client, msp_mode_v4l1_to_v4l2(va->mode)); | 662 | msp_any_set_audmode(client, msp_mode_v4l1_to_v4l2(va->mode)); |
678 | break; | 663 | break; |
679 | } | 664 | } |
@@ -682,7 +667,13 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
682 | { | 667 | { |
683 | struct video_channel *vc = arg; | 668 | struct video_channel *vc = arg; |
684 | 669 | ||
685 | state->norm = vc->norm; | 670 | state->radio = 0; |
671 | if (vc->norm == VIDEO_MODE_PAL) | ||
672 | state->std = V4L2_STD_PAL; | ||
673 | else if (vc->norm == VIDEO_MODE_SECAM) | ||
674 | state->std = V4L2_STD_SECAM; | ||
675 | else | ||
676 | state->std = V4L2_STD_NTSC; | ||
686 | msp_wake_thread(client); | 677 | msp_wake_thread(client); |
687 | break; | 678 | break; |
688 | } | 679 | } |
@@ -709,15 +700,8 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
709 | { | 700 | { |
710 | v4l2_std_id *id = arg; | 701 | v4l2_std_id *id = arg; |
711 | 702 | ||
712 | /*FIXME: use V4L2 mode flags on msp3400 instead of V4L1*/ | 703 | state->std = *id; |
713 | if (*id & V4L2_STD_PAL) { | 704 | state->radio = 0; |
714 | state->norm = VIDEO_MODE_PAL; | ||
715 | } else if (*id & V4L2_STD_SECAM) { | ||
716 | state->norm = VIDEO_MODE_SECAM; | ||
717 | } else { | ||
718 | state->norm = VIDEO_MODE_NTSC; | ||
719 | } | ||
720 | |||
721 | msp_wake_thread(client); | 705 | msp_wake_thread(client); |
722 | return 0; | 706 | return 0; |
723 | } | 707 | } |
@@ -965,6 +949,11 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) | |||
965 | struct i2c_client *client; | 949 | struct i2c_client *client; |
966 | struct msp_state *state; | 950 | struct msp_state *state; |
967 | int (*thread_func)(void *data) = NULL; | 951 | int (*thread_func)(void *data) = NULL; |
952 | int msp_hard; | ||
953 | int msp_family; | ||
954 | int msp_revision; | ||
955 | int msp_product, msp_prod_hi, msp_prod_lo; | ||
956 | int msp_rom; | ||
968 | 957 | ||
969 | client = kmalloc(sizeof(*client), GFP_KERNEL); | 958 | client = kmalloc(sizeof(*client), GFP_KERNEL); |
970 | if (client == NULL) | 959 | if (client == NULL) |
@@ -989,7 +978,7 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) | |||
989 | i2c_set_clientdata(client, state); | 978 | i2c_set_clientdata(client, state); |
990 | 979 | ||
991 | memset(state, 0, sizeof(*state)); | 980 | memset(state, 0, sizeof(*state)); |
992 | state->norm = VIDEO_MODE_NTSC; | 981 | state->std = V4L2_STD_NTSC; |
993 | state->volume = 58880; /* 0db gain */ | 982 | state->volume = 58880; /* 0db gain */ |
994 | state->balance = 32768; /* 0db gain */ | 983 | state->balance = 32768; /* 0db gain */ |
995 | state->bass = 32768; | 984 | state->bass = 32768; |
@@ -1012,20 +1001,45 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) | |||
1012 | 1001 | ||
1013 | msp_set_audio(client); | 1002 | msp_set_audio(client); |
1014 | 1003 | ||
1015 | snprintf(client->name, sizeof(client->name), "MSP%c4%02d%c-%c%d", | 1004 | msp_family = ((state->rev1 >> 4) & 0x0f) + 3; |
1016 | ((state->rev1 >> 4) & 0x0f) + '3', | 1005 | msp_product = (state->rev2 >> 8) & 0xff; |
1017 | (state->rev2 >> 8) & 0xff, | 1006 | msp_prod_hi = msp_product / 10; |
1018 | (state->rev1 & 0x0f) + '@', | 1007 | msp_prod_lo = msp_product % 10; |
1019 | ((state->rev1 >> 8) & 0xff) + '@', | 1008 | msp_revision = (state->rev1 & 0x0f) + '@'; |
1020 | state->rev2 & 0x1f); | 1009 | msp_hard = ((state->rev1 >> 8) & 0xff) + '@'; |
1010 | msp_rom = state->rev2 & 0x1f; | ||
1011 | snprintf(client->name, sizeof(client->name), "MSP%d4%02d%c-%c%d", | ||
1012 | msp_family, msp_product, | ||
1013 | msp_revision, msp_hard, msp_rom); | ||
1014 | |||
1015 | /* Has NICAM support: all mspx41x and mspx45x products have NICAM */ | ||
1016 | state->has_nicam = msp_prod_hi == 1 || msp_prod_hi == 5; | ||
1017 | /* Has radio support: was added with revision G */ | ||
1018 | state->has_radio = msp_revision >= 'G'; | ||
1019 | /* Has headphones output: not for stripped down products */ | ||
1020 | state->has_headphones = msp_prod_lo < 5; | ||
1021 | /* Has scart4 input: not in pre D revisions, not in stripped D revs */ | ||
1022 | state->has_scart4 = msp_family >= 4 || (msp_revision >= 'D' && msp_prod_lo < 5); | ||
1023 | /* Has scart2 and scart3 inputs and scart2 output: not in stripped | ||
1024 | down products of the '3' family */ | ||
1025 | state->has_scart23_in_scart2_out = msp_family >= 4 || msp_prod_lo < 5; | ||
1026 | /* Has subwoofer output: not in pre-D revs and not in stripped down products */ | ||
1027 | state->has_subwoofer = msp_revision >= 'D' && msp_prod_lo < 5; | ||
1028 | /* Has soundprocessing (bass/treble/balance/loudness/equalizer): not in | ||
1029 | stripped down products */ | ||
1030 | state->has_sound_processing = msp_prod_lo < 7; | ||
1031 | /* Has Virtual Dolby Surround: only in msp34x1 */ | ||
1032 | state->has_virtual_dolby_surround = msp_revision == 'G' && msp_prod_lo == 1; | ||
1033 | /* Has Virtual Dolby Surround & Dolby Pro Logic: only in msp34x2 */ | ||
1034 | state->has_dolby_pro_logic = msp_revision == 'G' && msp_prod_lo == 2; | ||
1021 | 1035 | ||
1022 | state->opmode = opmode; | 1036 | state->opmode = opmode; |
1023 | if (state->opmode == OPMODE_AUTO) { | 1037 | if (state->opmode == OPMODE_AUTO) { |
1024 | /* MSP revision G and up have both autodetect and autoselect */ | 1038 | /* MSP revision G and up have both autodetect and autoselect */ |
1025 | if ((state->rev1 & 0x0f) >= 'G'-'@') | 1039 | if (msp_revision >= 'G') |
1026 | state->opmode = OPMODE_AUTOSELECT; | 1040 | state->opmode = OPMODE_AUTOSELECT; |
1027 | /* MSP revision D and up have autodetect */ | 1041 | /* MSP revision D and up have autodetect */ |
1028 | else if ((state->rev1 & 0x0f) >= 'D'-'@') | 1042 | else if (msp_revision >= 'D') |
1029 | state->opmode = OPMODE_AUTODETECT; | 1043 | state->opmode = OPMODE_AUTODETECT; |
1030 | else | 1044 | else |
1031 | state->opmode = OPMODE_MANUAL; | 1045 | state->opmode = OPMODE_MANUAL; |
@@ -1034,11 +1048,11 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) | |||
1034 | /* hello world :-) */ | 1048 | /* hello world :-) */ |
1035 | v4l_info(client, "%s found @ 0x%x (%s)\n", client->name, address << 1, adapter->name); | 1049 | v4l_info(client, "%s found @ 0x%x (%s)\n", client->name, address << 1, adapter->name); |
1036 | v4l_info(client, "%s ", client->name); | 1050 | v4l_info(client, "%s ", client->name); |
1037 | if (HAVE_NICAM(state) && HAVE_RADIO(state)) | 1051 | if (state->has_nicam && state->has_radio) |
1038 | printk("supports nicam and radio, "); | 1052 | printk("supports nicam and radio, "); |
1039 | else if (HAVE_NICAM(state)) | 1053 | else if (state->has_nicam) |
1040 | printk("supports nicam, "); | 1054 | printk("supports nicam, "); |
1041 | else if (HAVE_RADIO(state)) | 1055 | else if (state->has_radio) |
1042 | printk("supports radio, "); | 1056 | printk("supports radio, "); |
1043 | printk("mode is "); | 1057 | printk("mode is "); |
1044 | 1058 | ||
diff --git a/drivers/media/video/msp3400-kthreads.c b/drivers/media/video/msp3400-kthreads.c index 934f0d3b9138..4ecbf56b008e 100644 --- a/drivers/media/video/msp3400-kthreads.c +++ b/drivers/media/video/msp3400-kthreads.c | |||
@@ -203,7 +203,7 @@ void msp3400c_setmode(struct i2c_client *client, int type) | |||
203 | msp_write_dsp(client, 0x000a, msp3400c_init_data[type].dsp_src); | 203 | msp_write_dsp(client, 0x000a, msp3400c_init_data[type].dsp_src); |
204 | msp_write_dsp(client, 0x000e, msp3400c_init_data[type].dsp_matrix); | 204 | msp_write_dsp(client, 0x000e, msp3400c_init_data[type].dsp_matrix); |
205 | 205 | ||
206 | if (HAVE_NICAM(state)) { | 206 | if (state->has_nicam) { |
207 | /* nicam prescale */ | 207 | /* nicam prescale */ |
208 | msp_write_dsp(client, 0x0010, 0x5a00); /* was: 0x3000 */ | 208 | msp_write_dsp(client, 0x0010, 0x5a00); /* was: 0x3000 */ |
209 | } | 209 | } |
@@ -487,8 +487,7 @@ int msp3400c_thread(void *data) | |||
487 | if (kthread_should_stop()) | 487 | if (kthread_should_stop()) |
488 | break; | 488 | break; |
489 | 489 | ||
490 | if (VIDEO_MODE_RADIO == state->norm || | 490 | if (state->radio || MSP_MODE_EXTERN == state->mode) { |
491 | MSP_MODE_EXTERN == state->mode) { | ||
492 | /* no carrier scan, just unmute */ | 491 | /* no carrier scan, just unmute */ |
493 | v4l_dbg(1, client, "thread: no carrier scan\n"); | 492 | v4l_dbg(1, client, "thread: no carrier scan\n"); |
494 | msp_set_audio(client); | 493 | msp_set_audio(client); |
@@ -510,7 +509,7 @@ int msp3400c_thread(void *data) | |||
510 | cd = msp3400c_carrier_detect_main; | 509 | cd = msp3400c_carrier_detect_main; |
511 | count = ARRAY_SIZE(msp3400c_carrier_detect_main); | 510 | count = ARRAY_SIZE(msp3400c_carrier_detect_main); |
512 | 511 | ||
513 | if (amsound && (state->norm == VIDEO_MODE_SECAM)) { | 512 | if (amsound && (state->std & V4L2_STD_SECAM)) { |
514 | /* autodetect doesn't work well with AM ... */ | 513 | /* autodetect doesn't work well with AM ... */ |
515 | max1 = 3; | 514 | max1 = 3; |
516 | count = 0; | 515 | count = 0; |
@@ -547,7 +546,7 @@ int msp3400c_thread(void *data) | |||
547 | break; | 546 | break; |
548 | } | 547 | } |
549 | 548 | ||
550 | if (amsound && (state->norm == VIDEO_MODE_SECAM)) { | 549 | if (amsound && (state->std & V4L2_STD_SECAM)) { |
551 | /* autodetect doesn't work well with AM ... */ | 550 | /* autodetect doesn't work well with AM ... */ |
552 | cd = NULL; | 551 | cd = NULL; |
553 | count = 0; | 552 | count = 0; |
@@ -576,7 +575,7 @@ int msp3400c_thread(void *data) | |||
576 | state->nicam_on = 0; | 575 | state->nicam_on = 0; |
577 | msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); | 576 | msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); |
578 | state->watch_stereo = 1; | 577 | state->watch_stereo = 1; |
579 | } else if (max2 == 1 && HAVE_NICAM(state)) { | 578 | } else if (max2 == 1 && state->has_nicam) { |
580 | /* B/G NICAM */ | 579 | /* B/G NICAM */ |
581 | state->second = msp3400c_carrier_detect_55[max2].cdo; | 580 | state->second = msp3400c_carrier_detect_55[max2].cdo; |
582 | msp3400c_setmode(client, MSP_MODE_FM_NICAM1); | 581 | msp3400c_setmode(client, MSP_MODE_FM_NICAM1); |
@@ -603,8 +602,7 @@ int msp3400c_thread(void *data) | |||
603 | state->nicam_on = 0; | 602 | state->nicam_on = 0; |
604 | msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); | 603 | msp3400c_setstereo(client, V4L2_TUNER_MODE_MONO); |
605 | state->watch_stereo = 1; | 604 | state->watch_stereo = 1; |
606 | } else if (max2 == 0 && | 605 | } else if (max2 == 0 && (state->std & V4L2_STD_SECAM)) { |
607 | state->norm == VIDEO_MODE_SECAM) { | ||
608 | /* L NICAM or AM-mono */ | 606 | /* L NICAM or AM-mono */ |
609 | state->second = msp3400c_carrier_detect_65[max2].cdo; | 607 | state->second = msp3400c_carrier_detect_65[max2].cdo; |
610 | msp3400c_setmode(client, MSP_MODE_AM_NICAM); | 608 | msp3400c_setmode(client, MSP_MODE_AM_NICAM); |
@@ -614,7 +612,7 @@ int msp3400c_thread(void *data) | |||
614 | /* volume prescale for SCART (AM mono input) */ | 612 | /* volume prescale for SCART (AM mono input) */ |
615 | msp_write_dsp(client, 0x000d, 0x1900); | 613 | msp_write_dsp(client, 0x000d, 0x1900); |
616 | state->watch_stereo = 1; | 614 | state->watch_stereo = 1; |
617 | } else if (max2 == 0 && HAVE_NICAM(state)) { | 615 | } else if (max2 == 0 && state->has_nicam) { |
618 | /* D/K NICAM */ | 616 | /* D/K NICAM */ |
619 | state->second = msp3400c_carrier_detect_65[max2].cdo; | 617 | state->second = msp3400c_carrier_detect_65[max2].cdo; |
620 | msp3400c_setmode(client, MSP_MODE_FM_NICAM1); | 618 | msp3400c_setmode(client, MSP_MODE_FM_NICAM1); |
@@ -689,8 +687,8 @@ int msp3410d_thread(void *data) | |||
689 | goto restart; | 687 | goto restart; |
690 | 688 | ||
691 | /* start autodetect */ | 689 | /* start autodetect */ |
692 | mode = msp_modus(client, state->norm); | 690 | mode = msp_modus(client); |
693 | std = msp_standard(state->norm); | 691 | std = (state->std & V4L2_STD_NTSC) ? 0x20 : 1; |
694 | msp_write_dem(client, 0x30, mode); | 692 | msp_write_dem(client, 0x30, mode); |
695 | msp_write_dem(client, 0x20, std); | 693 | msp_write_dem(client, 0x20, std); |
696 | state->watch_stereo = 0; | 694 | state->watch_stereo = 0; |
@@ -723,7 +721,7 @@ int msp3410d_thread(void *data) | |||
723 | state->main = msp_modelist[i].main; | 721 | state->main = msp_modelist[i].main; |
724 | state->second = msp_modelist[i].second; | 722 | state->second = msp_modelist[i].second; |
725 | 723 | ||
726 | if (amsound && (state->norm == VIDEO_MODE_SECAM) && (val != 0x0009)) { | 724 | if (amsound && (state->std & V4L2_STD_SECAM) && (val != 0x0009)) { |
727 | /* autodetection has failed, let backup */ | 725 | /* autodetection has failed, let backup */ |
728 | v4l_dbg(1, client, "autodetection failed," | 726 | v4l_dbg(1, client, "autodetection failed," |
729 | " switching to backup mode: %s (0x%04x)\n", | 727 | " switching to backup mode: %s (0x%04x)\n", |
@@ -767,12 +765,12 @@ int msp3410d_thread(void *data) | |||
767 | msp3400c_setstereo(client,V4L2_TUNER_MODE_STEREO); | 765 | msp3400c_setstereo(client,V4L2_TUNER_MODE_STEREO); |
768 | break; | 766 | break; |
769 | case 0x0040: /* FM radio */ | 767 | case 0x0040: /* FM radio */ |
770 | state->mode = MSP_MODE_FM_RADIO; | 768 | state->mode = MSP_MODE_FM_RADIO; |
771 | state->rxsubchans = V4L2_TUNER_SUB_STEREO; | 769 | state->rxsubchans = V4L2_TUNER_SUB_STEREO; |
772 | state->audmode = V4L2_TUNER_MODE_STEREO; | 770 | state->audmode = V4L2_TUNER_MODE_STEREO; |
773 | state->nicam_on = 0; | 771 | state->nicam_on = 0; |
774 | state->watch_stereo = 0; | 772 | state->watch_stereo = 0; |
775 | /* not needed in theory if HAVE_RADIO(), but | 773 | /* not needed in theory if we have radio, but |
776 | short programming enables carrier mute */ | 774 | short programming enables carrier mute */ |
777 | msp3400c_setmode(client,MSP_MODE_FM_RADIO); | 775 | msp3400c_setmode(client,MSP_MODE_FM_RADIO); |
778 | msp3400c_setcarrier(client, MSP_CARRIER(10.7), | 776 | msp3400c_setcarrier(client, MSP_CARRIER(10.7), |
@@ -872,8 +870,11 @@ static int msp34xxg_reset(struct i2c_client *client) | |||
872 | msp_write_dem(client, 0x40, state->i2s_mode); | 870 | msp_write_dem(client, 0x40, state->i2s_mode); |
873 | 871 | ||
874 | /* step-by-step initialisation, as described in the manual */ | 872 | /* step-by-step initialisation, as described in the manual */ |
875 | modus = msp_modus(client, state->norm); | 873 | modus = msp_modus(client); |
876 | std = msp_standard(state->norm); | 874 | if (state->radio) |
875 | std = 0x40; | ||
876 | else | ||
877 | std = (state->std & V4L2_STD_NTSC) ? 0x20 : 1; | ||
877 | modus &= ~0x03; /* STATUS_CHANGE = 0 */ | 878 | modus &= ~0x03; /* STATUS_CHANGE = 0 */ |
878 | modus |= 0x01; /* AUTOMATIC_SOUND_DETECTION = 1 */ | 879 | modus |= 0x01; /* AUTOMATIC_SOUND_DETECTION = 1 */ |
879 | if (msp_write_dem(client, 0x30, modus)) | 880 | if (msp_write_dem(client, 0x30, modus)) |
diff --git a/drivers/media/video/msp3400.h b/drivers/media/video/msp3400.h index a88a22e37e64..70327506f895 100644 --- a/drivers/media/video/msp3400.h +++ b/drivers/media/video/msp3400.h | |||
@@ -57,10 +57,21 @@ extern int stereo_threshold; | |||
57 | 57 | ||
58 | struct msp_state { | 58 | struct msp_state { |
59 | int rev1, rev2; | 59 | int rev1, rev2; |
60 | 60 | int has_nicam; | |
61 | int has_radio; | ||
62 | int has_headphones; | ||
63 | int has_ntsc_jp_d_k3; | ||
64 | int has_scart4; | ||
65 | int has_scart23_in_scart2_out; | ||
66 | int has_subwoofer; | ||
67 | int has_sound_processing; | ||
68 | int has_virtual_dolby_surround; | ||
69 | int has_dolby_pro_logic; | ||
70 | |||
71 | int radio; | ||
61 | int opmode; | 72 | int opmode; |
62 | int mode; | 73 | int mode; |
63 | int norm; | 74 | v4l2_std_id std; |
64 | int stereo; | 75 | int stereo; |
65 | int nicam_on; | 76 | int nicam_on; |
66 | int acb; | 77 | int acb; |
@@ -85,11 +96,6 @@ struct msp_state { | |||
85 | int watch_stereo:1; | 96 | int watch_stereo:1; |
86 | }; | 97 | }; |
87 | 98 | ||
88 | #define VIDEO_MODE_RADIO 16 /* norm magic for radio mode */ | ||
89 | |||
90 | #define HAVE_NICAM(state) (((state->rev2 >> 8) & 0xff) != 0) | ||
91 | #define HAVE_RADIO(state) ((state->rev1 & 0x0f) >= 'G'-'@') | ||
92 | |||
93 | /* msp3400-driver.c */ | 99 | /* msp3400-driver.c */ |
94 | int msp_write_dem(struct i2c_client *client, int addr, int val); | 100 | int msp_write_dem(struct i2c_client *client, int addr, int val); |
95 | int msp_write_dsp(struct i2c_client *client, int addr, int val); | 101 | int msp_write_dsp(struct i2c_client *client, int addr, int val); |
@@ -99,8 +105,7 @@ int msp_reset(struct i2c_client *client); | |||
99 | void msp_set_scart(struct i2c_client *client, int in, int out); | 105 | void msp_set_scart(struct i2c_client *client, int in, int out); |
100 | void msp_set_mute(struct i2c_client *client); | 106 | void msp_set_mute(struct i2c_client *client); |
101 | void msp_set_audio(struct i2c_client *client); | 107 | void msp_set_audio(struct i2c_client *client); |
102 | int msp_modus(struct i2c_client *client, int norm); | 108 | int msp_modus(struct i2c_client *client); |
103 | int msp_standard(int norm); | ||
104 | int msp_sleep(struct msp_state *state, int timeout); | 109 | int msp_sleep(struct msp_state *state, int timeout); |
105 | 110 | ||
106 | /* msp3400-kthreads.c */ | 111 | /* msp3400-kthreads.c */ |