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