Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

V4L/DVB (3584): Implement V4L2_TUNER_MODE_LANG1_LANG2 audio mode

Add a new audio mode V4L2_TUNER_MODE_LANG1_LANG2 (used by VIDIOC_G/S_TUNER).
This mode allows the user to select both languages of a bilingual transmission,
one language on the left, one on the right audio channel. If there is no
bilingual transmission, or it is not supported, then this mode should act like
V4L2_TUNER_MODE_STEREO.
This mode is introduced for PVR-like drivers where it is useful to be able to
record both languages of a bilingual broadcast.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

authored by

Hans Verkuil and committed by
Mauro Carvalho Chehab
301e22d6 2474ed44

+29 -5
+5
drivers/media/dvb/ttpci/av7110_v4l.c
··· 369 369 fm_matrix = 0x3001; // stereo 370 370 src = 0x0020; 371 371 break; 372 + case V4L2_TUNER_MODE_LANG1_LANG2: 373 + dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1_LANG2\n"); 374 + fm_matrix = 0x3000; // bilingual 375 + src = 0x0020; 376 + break; 372 377 case V4L2_TUNER_MODE_LANG1: 373 378 dprintk(2, "VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1\n"); 374 379 fm_matrix = 0x3000; // mono
+2 -1
drivers/media/video/bt8xx/bttv-driver.c
··· 1878 1878 bttv_call_i2c_clients(btv, VIDIOCGAUDIO, &va); 1879 1879 if (t->audmode == V4L2_TUNER_MODE_MONO) 1880 1880 va.mode = VIDEO_SOUND_MONO; 1881 - else if (t->audmode == V4L2_TUNER_MODE_STEREO) 1881 + else if (t->audmode == V4L2_TUNER_MODE_STEREO || 1882 + t->audmode == V4L2_TUNER_MODE_LANG1_LANG2) 1882 1883 va.mode = VIDEO_SOUND_STEREO; 1883 1884 else if (t->audmode == V4L2_TUNER_MODE_LANG1) 1884 1885 va.mode = VIDEO_SOUND_LANG1;
+3 -2
drivers/media/video/cx25840/cx25840-core.c
··· 810 810 bilingual -> lang1 */ 811 811 cx25840_and_or(client, 0x809, ~0xf, 0x00); 812 812 break; 813 + case V4L2_TUNER_MODE_STEREO: 813 814 case V4L2_TUNER_MODE_LANG1: 814 815 /* mono -> mono 815 816 stereo -> stereo 816 817 bilingual -> lang1 */ 817 818 cx25840_and_or(client, 0x809, ~0xf, 0x04); 818 819 break; 819 - case V4L2_TUNER_MODE_STEREO: 820 + case V4L2_TUNER_MODE_LANG1_LANG2: 820 821 /* mono -> mono 821 822 stereo -> stereo 822 823 bilingual -> lang1/lang2 */ ··· 825 824 break; 826 825 case V4L2_TUNER_MODE_LANG2: 827 826 /* mono -> mono 828 - stereo ->stereo 827 + stereo -> stereo 829 828 bilingual -> lang2 */ 830 829 cx25840_and_or(client, 0x809, ~0xf, 0x01); 831 830 break;
+3
drivers/media/video/cx88/cx88-tvaudio.c
··· 885 885 set_audio_standard_BTSC(core, 1, EN_BTSC_FORCE_SAP); 886 886 break; 887 887 case V4L2_TUNER_MODE_STEREO: 888 + case V4L2_TUNER_MODE_LANG1_LANG2: 888 889 set_audio_standard_BTSC(core, 0, EN_BTSC_FORCE_STEREO); 889 890 break; 890 891 } ··· 906 905 EN_NICAM_FORCE_MONO2); 907 906 break; 908 907 case V4L2_TUNER_MODE_STEREO: 908 + case V4L2_TUNER_MODE_LANG1_LANG2: 909 909 set_audio_standard_NICAM(core, 910 910 EN_NICAM_FORCE_STEREO); 911 911 break; ··· 928 926 EN_A2_FORCE_MONO2); 929 927 break; 930 928 case V4L2_TUNER_MODE_STEREO: 929 + case V4L2_TUNER_MODE_LANG1_LANG2: 931 930 set_audio_standard_A2(core, 932 931 EN_A2_FORCE_STEREO); 933 932 break;
+6 -2
drivers/media/video/msp3400-kthreads.c
··· 223 223 nor do they support stereo BTSC. */ 224 224 static void msp3400c_set_audmode(struct i2c_client *client) 225 225 { 226 - static char *strmode[] = { "mono", "stereo", "lang2", "lang1" }; 226 + static char *strmode[] = { "mono", "stereo", "lang2", "lang1", "lang1+lang2" }; 227 227 struct msp_state *state = i2c_get_clientdata(client); 228 - char *modestr = (state->audmode >= 0 && state->audmode < 4) ? 228 + char *modestr = (state->audmode >= 0 && state->audmode < 5) ? 229 229 strmode[state->audmode] : "unknown"; 230 230 int src = 0; /* channel source: FM/AM, nicam or SCART */ 231 231 ··· 250 250 case V4L2_TUNER_MODE_MONO: 251 251 case V4L2_TUNER_MODE_LANG1: 252 252 case V4L2_TUNER_MODE_LANG2: 253 + case V4L2_TUNER_MODE_LANG1_LANG2: 253 254 msp_write_dsp(client, 0x000e, 0x3000); 254 255 break; 255 256 } ··· 262 261 msp3400c_set_carrier(client, MSP_CARRIER(6.5), MSP_CARRIER(6.5)); 263 262 break; 264 263 case V4L2_TUNER_MODE_STEREO: 264 + case V4L2_TUNER_MODE_LANG1_LANG2: 265 265 msp3400c_set_carrier(client, MSP_CARRIER(7.2), MSP_CARRIER(7.02)); 266 266 break; 267 267 case V4L2_TUNER_MODE_LANG1: ··· 298 296 /* switch audio */ 299 297 switch (state->audmode) { 300 298 case V4L2_TUNER_MODE_STEREO: 299 + case V4L2_TUNER_MODE_LANG1_LANG2: 301 300 src |= 0x0020; 302 301 break; 303 302 case V4L2_TUNER_MODE_MONO: ··· 838 835 matrix = 0x10; 839 836 break; 840 837 case V4L2_TUNER_MODE_STEREO: 838 + case V4L2_TUNER_MODE_LANG1_LANG2: 841 839 default: 842 840 source = 1; /* stereo or A|B */ 843 841 matrix = 0x20;
+6
drivers/media/video/mxb.c
··· 790 790 DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_STEREO\n")); 791 791 break; 792 792 } 793 + case V4L2_TUNER_MODE_LANG1_LANG2: { 794 + mxb->cur_mode = V4L2_TUNER_MODE_LANG1_LANG2; 795 + byte = TDA9840_SET_BOTH; 796 + DEB_D(("VIDIOC_S_TUNER: V4L2_TUNER_MODE_LANG1_LANG2\n")); 797 + break; 798 + } 793 799 case V4L2_TUNER_MODE_LANG1: { 794 800 mxb->cur_mode = V4L2_TUNER_MODE_LANG1; 795 801 byte = TDA9840_SET_LANG1;
+2
drivers/media/video/saa7134/saa7134-tvaudio.c
··· 482 482 [ V4L2_TUNER_MODE_STEREO ] = "stereo", 483 483 [ V4L2_TUNER_MODE_LANG1 ] = "lang1", 484 484 [ V4L2_TUNER_MODE_LANG2 ] = "lang2", 485 + [ V4L2_TUNER_MODE_LANG1_LANG2 ] = "lang1+lang2", 485 486 }; 486 487 static u32 fm[] = { 487 488 [ V4L2_TUNER_MODE_MONO ] = 0x00, /* ch1 */ 488 489 [ V4L2_TUNER_MODE_STEREO ] = 0x80, /* auto */ 489 490 [ V4L2_TUNER_MODE_LANG1 ] = 0x00, /* ch1 */ 490 491 [ V4L2_TUNER_MODE_LANG2 ] = 0x01, /* ch2 */ 492 + [ V4L2_TUNER_MODE_LANG1_LANG2 ] = 0x80, /* auto */ 491 493 }; 492 494 u32 reg; 493 495
+1
drivers/media/video/tvaudio.c
··· 1733 1733 mode = VIDEO_SOUND_MONO; 1734 1734 break; 1735 1735 case V4L2_TUNER_MODE_STEREO: 1736 + case V4L2_TUNER_MODE_LANG1_LANG2: 1736 1737 mode = VIDEO_SOUND_STEREO; 1737 1738 break; 1738 1739 case V4L2_TUNER_MODE_LANG1:
+1
include/linux/videodev2.h
··· 883 883 #define V4L2_TUNER_MODE_LANG2 0x0002 884 884 #define V4L2_TUNER_MODE_SAP 0x0002 885 885 #define V4L2_TUNER_MODE_LANG1 0x0003 886 + #define V4L2_TUNER_MODE_LANG1_LANG2 0x0004 886 887 887 888 struct v4l2_frequency 888 889 {