V4L/DVB (4701): Saa713x audio fixes

This change fixes the following issues:
- resolve the SECAM D/K vs SECAM-L sound conflict
It is now possible to select the SECAM version either by the VIDEOIOC_S_STD
IO control or by the new secam= insmod option.
The driver now adapts its audio standard search list to the selected
standard.
- don't trigger a sound standard search when a LINE input is selected.

Signed-off-by: Hartmut Hackmann <hartmut.hackmann@t-online.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>

authored by Hartmut Hackmann and committed by Mauro Carvalho Chehab 17b10a73 39666962

+96 -57
+41 -54
drivers/media/video/saa7134/saa7134-tvaudio.c
··· 72 72 int carr; 73 73 } mainscan[] = { 74 74 { 75 - .name = "M", 76 - .std = V4L2_STD_NTSC | V4L2_STD_PAL_M, 75 + .name = "MN", 76 + .std = V4L2_STD_MN, 77 77 .carr = 4500, 78 78 },{ 79 - .name = "BG", 80 - .std = V4L2_STD_PAL_BG, 79 + .name = "BGH", 80 + .std = V4L2_STD_B | V4L2_STD_GH, 81 81 .carr = 5500, 82 82 },{ 83 83 .name = "I", ··· 85 85 .carr = 6000, 86 86 },{ 87 87 .name = "DKL", 88 - .std = V4L2_STD_PAL_DK | V4L2_STD_SECAM, 88 + .std = V4L2_STD_DK | V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC, 89 89 .carr = 6500, 90 90 } 91 91 }; ··· 93 93 static struct saa7134_tvaudio tvaudio[] = { 94 94 { 95 95 .name = "PAL-B/G FM-stereo", 96 - .std = V4L2_STD_PAL, 96 + .std = V4L2_STD_PAL_BG, 97 97 .mode = TVAUDIO_FM_BG_STEREO, 98 98 .carr1 = 5500, 99 99 .carr2 = 5742, 100 100 },{ 101 101 .name = "PAL-D/K1 FM-stereo", 102 - .std = V4L2_STD_PAL, 102 + .std = V4L2_STD_PAL_DK, 103 103 .carr1 = 6500, 104 104 .carr2 = 6258, 105 105 .mode = TVAUDIO_FM_BG_STEREO, 106 106 },{ 107 107 .name = "PAL-D/K2 FM-stereo", 108 - .std = V4L2_STD_PAL, 108 + .std = V4L2_STD_PAL_DK, 109 109 .carr1 = 6500, 110 110 .carr2 = 6742, 111 111 .mode = TVAUDIO_FM_BG_STEREO, 112 112 },{ 113 113 .name = "PAL-D/K3 FM-stereo", 114 - .std = V4L2_STD_PAL, 114 + .std = V4L2_STD_PAL_DK, 115 115 .carr1 = 6500, 116 116 .carr2 = 5742, 117 117 .mode = TVAUDIO_FM_BG_STEREO, 118 118 },{ 119 119 .name = "PAL-B/G NICAM", 120 - .std = V4L2_STD_PAL, 120 + .std = V4L2_STD_PAL_BG, 121 121 .carr1 = 5500, 122 122 .carr2 = 5850, 123 123 .mode = TVAUDIO_NICAM_FM, 124 124 },{ 125 125 .name = "PAL-I NICAM", 126 - .std = V4L2_STD_PAL, 126 + .std = V4L2_STD_PAL_I, 127 127 .carr1 = 6000, 128 128 .carr2 = 6552, 129 129 .mode = TVAUDIO_NICAM_FM, 130 130 },{ 131 131 .name = "PAL-D/K NICAM", 132 - .std = V4L2_STD_PAL, 132 + .std = V4L2_STD_PAL_DK, 133 133 .carr1 = 6500, 134 134 .carr2 = 5850, 135 135 .mode = TVAUDIO_NICAM_FM, 136 136 },{ 137 137 .name = "SECAM-L NICAM", 138 - .std = V4L2_STD_SECAM, 138 + .std = V4L2_STD_SECAM_L, 139 139 .carr1 = 6500, 140 140 .carr2 = 5850, 141 141 .mode = TVAUDIO_NICAM_AM, 142 142 },{ 143 - .name = "SECAM-L MONO", 144 - .std = V4L2_STD_SECAM, 143 + .name = "SECAM-D/K NICAM", 144 + .std = V4L2_STD_SECAM_DK, 145 145 .carr1 = 6500, 146 - .carr2 = -1, 147 - .mode = TVAUDIO_AM_MONO, 148 - },{ 149 - .name = "SECAM-D/K", 150 - .std = V4L2_STD_SECAM, 151 - .carr1 = 6500, 152 - .carr2 = -1, 153 - .mode = TVAUDIO_FM_MONO, 154 - },{ 155 - .name = "NTSC-M", 156 - .std = V4L2_STD_NTSC, 157 - .carr1 = 4500, 158 - .carr2 = -1, 159 - .mode = TVAUDIO_FM_MONO, 146 + .carr2 = 5850, 147 + .mode = TVAUDIO_NICAM_FM, 160 148 },{ 161 149 .name = "NTSC-A2 FM-stereo", 162 150 .std = V4L2_STD_NTSC, 163 151 .carr1 = 4500, 164 152 .carr2 = 4724, 165 153 .mode = TVAUDIO_FM_K_STEREO, 154 + },{ 155 + .name = "NTSC-M", 156 + .std = V4L2_STD_NTSC, 157 + .carr1 = 4500, 158 + .carr2 = -1, 159 + .mode = TVAUDIO_FM_MONO, 166 160 } 167 161 }; 168 162 #define TVAUDIO (sizeof(tvaudio)/sizeof(struct saa7134_tvaudio)) ··· 334 340 saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa1); 335 341 saa_writeb(SAA7134_NICAM_CONFIG, 0x00); 336 342 break; 337 - case TVAUDIO_AM_MONO: 338 - saa_writeb(SAA7134_DEMODULATOR, 0x12); 339 - saa_writeb(SAA7134_DCXO_IDENT_CTRL, 0x00); 340 - saa_writeb(SAA7134_FM_DEEMPHASIS, 0x44); 341 - saa_writeb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0xa0); 342 - break; 343 343 case TVAUDIO_FM_SAT_STEREO: 344 344 /* not implemented (yet) */ 345 345 break; ··· 378 390 } 379 391 printk("\n"); 380 392 } 381 - 382 393 if (dev->tvnorm->id & scan->std) { 383 394 tvaudio_setcarrier(dev,scan->carr-90,scan->carr-90); 384 395 saa_readl(SAA7134_LEVEL_READOUT1 >> 2); ··· 413 426 414 427 switch (audio->mode) { 415 428 case TVAUDIO_FM_MONO: 416 - case TVAUDIO_AM_MONO: 417 429 return V4L2_TUNER_SUB_MONO; 418 430 case TVAUDIO_FM_K_STEREO: 419 431 case TVAUDIO_FM_BG_STEREO: ··· 481 495 482 496 switch (audio->mode) { 483 497 case TVAUDIO_FM_MONO: 484 - case TVAUDIO_AM_MONO: 485 498 /* nothing to do ... */ 486 499 break; 487 500 case TVAUDIO_FM_K_STEREO: ··· 541 556 542 557 if (1 == nscan) { 543 558 /* only one candidate -- skip scan ;) */ 559 + dprintk("only one main carrier candidate - skipping scan\n"); 544 560 max1 = 12345; 545 561 carrier = default_carrier; 546 562 } else { ··· 589 603 dev->automute = 0; 590 604 saa_andorb(SAA7134_STEREO_DAC_OUTPUT_SELECT, 0x30, 0x00); 591 605 saa7134_tvaudio_setmute(dev); 592 - 593 606 /* find the exact tv audio norm */ 594 607 for (audio = UNSET, i = 0; i < TVAUDIO; i++) { 595 608 if (dev->tvnorm->id != UNSET && ··· 596 611 continue; 597 612 if (tvaudio[i].carr1 != carrier) 598 613 continue; 599 - 614 + /* Note: at least the primary carrier is right here */ 600 615 if (UNSET == audio) 601 616 audio = i; 602 617 tvaudio_setmode(dev,&tvaudio[i],"trying"); ··· 611 626 if (UNSET == audio) 612 627 continue; 613 628 tvaudio_setmode(dev,&tvaudio[audio],"using"); 629 + 614 630 tvaudio_setstereo(dev,&tvaudio[audio],V4L2_TUNER_MODE_MONO); 615 631 dev->tvaudio = &tvaudio[audio]; 616 632 ··· 736 750 int mask; 737 751 struct saa7134_input *in; 738 752 739 - /* Hac 0506 route OSS sound simultanously */ 740 753 xbarin = 0x03; 741 754 switch (dev->input->amux) { 742 755 case TV: ··· 819 834 } else { 820 835 /* (let chip) scan for sound carrier */ 821 836 norms = 0; 822 - if (dev->tvnorm->id & V4L2_STD_PAL) { 823 - dprintk("PAL scan\n"); 824 - norms |= 0x2c; /* B/G + D/K + I */ 825 - } 826 - if (dev->tvnorm->id & V4L2_STD_NTSC) { 827 - dprintk("NTSC scan\n"); 828 - norms |= 0x40; /* M */ 829 - } 830 - if (dev->tvnorm->id & V4L2_STD_SECAM) { 831 - dprintk("SECAM scan\n"); 832 - norms |= 0x18; /* L + D/K */ 833 - } 837 + if (dev->tvnorm->id & (V4L2_STD_B | V4L2_STD_GH)) 838 + norms |= 0x04; 839 + if (dev->tvnorm->id & V4L2_STD_PAL_I) 840 + norms |= 0x20; 841 + if (dev->tvnorm->id & V4L2_STD_DK) 842 + norms |= 0x08; 843 + if (dev->tvnorm->id & V4L2_STD_MN) 844 + norms |= 0x40; 845 + if (dev->tvnorm->id & (V4L2_STD_SECAM_L | V4L2_STD_SECAM_LC)) 846 + norms |= 0x10; 834 847 if (0 == norms) 835 848 norms = 0x7c; /* all */ 836 849 dprintk("scanning:%s%s%s%s%s\n", ··· 1017 1034 1018 1035 int saa7134_tvaudio_do_scan(struct saa7134_dev *dev) 1019 1036 { 1020 - if (dev->thread.pid >= 0) { 1037 + if (dev->input->amux != TV) { 1038 + dprintk("sound IF not in use, skipping scan\n"); 1039 + dev->automute = 0; 1040 + saa7134_tvaudio_setmute(dev); 1041 + } else if (dev->thread.pid >= 0) { 1021 1042 dev->thread.mode = UNSET; 1022 1043 dev->thread.scan2++; 1023 1044 wake_up_interruptible(&dev->thread.wq);
+55 -2
drivers/media/video/saa7134/saa7134-video.c
··· 43 43 static unsigned int noninterlaced = 1; 44 44 static unsigned int gbufsize = 720*576*4; 45 45 static unsigned int gbufsize_max = 720*576*4; 46 + static char secam[] = "--"; 46 47 module_param(video_debug, int, 0644); 47 48 MODULE_PARM_DESC(video_debug,"enable debug messages [video]"); 48 49 module_param(gbuffers, int, 0444); 49 50 MODULE_PARM_DESC(gbuffers,"number of capture buffers, range 2-32"); 50 51 module_param(noninterlaced, int, 0644); 51 52 MODULE_PARM_DESC(noninterlaced,"capture non interlaced video"); 53 + module_param_string(secam, secam, sizeof(secam), 0644); 54 + MODULE_PARM_DESC(secam, "force SECAM variant, either DK,L or Lc"); 55 + 52 56 53 57 #define dprintk(fmt, arg...) if (video_debug) \ 54 58 printk(KERN_DEBUG "%s/video: " fmt, dev->name , ## arg) ··· 283 279 .id = V4L2_STD_SECAM, 284 280 NORM_625_50, 285 281 286 - .sync_control = 0x18, /* old: 0x58, */ 282 + .sync_control = 0x18, 283 + .luma_control = 0x1b, 284 + .chroma_ctrl1 = 0xd1, 285 + .chroma_gain = 0x80, 286 + .chroma_ctrl2 = 0x00, 287 + .vgate_misc = 0x1c, 288 + 289 + },{ 290 + .name = "SECAM-DK", 291 + .id = V4L2_STD_SECAM_DK, 292 + NORM_625_50, 293 + 294 + .sync_control = 0x18, 295 + .luma_control = 0x1b, 296 + .chroma_ctrl1 = 0xd1, 297 + .chroma_gain = 0x80, 298 + .chroma_ctrl2 = 0x00, 299 + .vgate_misc = 0x1c, 300 + 301 + },{ 302 + .name = "SECAM-L", 303 + .id = V4L2_STD_SECAM_L, 304 + NORM_625_50, 305 + 306 + .sync_control = 0x18, 307 + .luma_control = 0x1b, 308 + .chroma_ctrl1 = 0xd1, 309 + .chroma_gain = 0x80, 310 + .chroma_ctrl2 = 0x00, 311 + .vgate_misc = 0x1c, 312 + 313 + },{ 314 + .name = "SECAM-Lc", 315 + .id = V4L2_STD_SECAM_LC, 316 + NORM_625_50, 317 + 318 + .sync_control = 0x18, 287 319 .luma_control = 0x1b, 288 320 .chroma_ctrl1 = 0xd1, 289 321 .chroma_gain = 0x80, ··· 1809 1769 { 1810 1770 v4l2_std_id *id = arg; 1811 1771 unsigned int i; 1772 + v4l2_std_id fixup; 1812 1773 1813 1774 for (i = 0; i < TVNORMS; i++) 1814 1775 if (*id == tvnorms[i].id) ··· 1820 1779 break; 1821 1780 if (i == TVNORMS) 1822 1781 return -EINVAL; 1823 - 1782 + if (*id & V4L2_STD_SECAM) { 1783 + if (secam[0] == 'L' || secam[0] == 'l') 1784 + if (secam[1] == 'C' || secam[1] == 'c') 1785 + fixup = V4L2_STD_SECAM_LC; 1786 + else 1787 + fixup = V4L2_STD_SECAM_L; 1788 + else 1789 + if (secam[0] == 'D' || secam[0] == 'd') 1790 + fixup = V4L2_STD_SECAM_DK; 1791 + for (i = 0; i < TVNORMS; i++) 1792 + if (fixup == tvnorms[i].id) 1793 + break; 1794 + } 1824 1795 mutex_lock(&dev->lock); 1825 1796 if (res_check(fh, RESOURCE_OVERLAY)) { 1826 1797 spin_lock_irqsave(&dev->slock,flags);
-1
drivers/media/video/saa7134/saa7134.h
··· 61 61 TVAUDIO_FM_K_STEREO = 4, 62 62 TVAUDIO_NICAM_AM = 5, 63 63 TVAUDIO_NICAM_FM = 6, 64 - TVAUDIO_AM_MONO = 7 65 64 }; 66 65 67 66 enum saa7134_audio_in {