aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/saa7134/saa7134-alsa.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/saa7134/saa7134-alsa.c')
-rw-r--r--drivers/media/video/saa7134/saa7134-alsa.c242
1 files changed, 162 insertions, 80 deletions
diff --git a/drivers/media/video/saa7134/saa7134-alsa.c b/drivers/media/video/saa7134/saa7134-alsa.c
index 8b0b64a89874..d48c450ed77c 100644
--- a/drivers/media/video/saa7134/saa7134-alsa.c
+++ b/drivers/media/video/saa7134/saa7134-alsa.c
@@ -40,6 +40,7 @@ MODULE_PARM_DESC(debug,"enable debug messages [alsa]");
40 */ 40 */
41 41
42/* defaults */ 42/* defaults */
43#define MIXER_ADDR_UNSELECTED -1
43#define MIXER_ADDR_TVTUNER 0 44#define MIXER_ADDR_TVTUNER 0
44#define MIXER_ADDR_LINE1 1 45#define MIXER_ADDR_LINE1 1
45#define MIXER_ADDR_LINE2 2 46#define MIXER_ADDR_LINE2 2
@@ -68,7 +69,9 @@ typedef struct snd_card_saa7134 {
68 struct snd_card *card; 69 struct snd_card *card;
69 spinlock_t mixer_lock; 70 spinlock_t mixer_lock;
70 int mixer_volume[MIXER_ADDR_LAST+1][2]; 71 int mixer_volume[MIXER_ADDR_LAST+1][2];
71 int capture_source[MIXER_ADDR_LAST+1][2]; 72 int capture_source_addr;
73 int capture_source[2];
74 struct snd_kcontrol *capture_ctl[MIXER_ADDR_LAST+1];
72 struct pci_dev *pci; 75 struct pci_dev *pci;
73 struct saa7134_dev *dev; 76 struct saa7134_dev *dev;
74 77
@@ -314,6 +317,115 @@ static int dsp_buffer_free(struct saa7134_dev *dev)
314 return 0; 317 return 0;
315} 318}
316 319
320/*
321 * Setting the capture source and updating the ALSA controls
322 */
323static int snd_saa7134_capsrc_set(struct snd_kcontrol *kcontrol,
324 int left, int right, bool force_notify)
325{
326 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
327 int change = 0, addr = kcontrol->private_value;
328 int active, old_addr;
329 u32 anabar, xbarin;
330 int analog_io, rate;
331 struct saa7134_dev *dev;
332
333 dev = chip->dev;
334
335 spin_lock_irq(&chip->mixer_lock);
336
337 active = left != 0 || right != 0;
338 old_addr = chip->capture_source_addr;
339
340 /* The active capture source cannot be deactivated */
341 if (active) {
342 change = old_addr != addr ||
343 chip->capture_source[0] != left ||
344 chip->capture_source[1] != right;
345
346 chip->capture_source[0] = left;
347 chip->capture_source[1] = right;
348 chip->capture_source_addr = addr;
349 dev->dmasound.input = addr;
350 }
351 spin_unlock_irq(&chip->mixer_lock);
352
353 if (change) {
354 switch (dev->pci->device) {
355
356 case PCI_DEVICE_ID_PHILIPS_SAA7134:
357 switch (addr) {
358 case MIXER_ADDR_TVTUNER:
359 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL,
360 0xc0, 0xc0);
361 saa_andorb(SAA7134_SIF_SAMPLE_FREQ,
362 0x03, 0x00);
363 break;
364 case MIXER_ADDR_LINE1:
365 case MIXER_ADDR_LINE2:
366 analog_io = (MIXER_ADDR_LINE1 == addr) ?
367 0x00 : 0x08;
368 rate = (32000 == dev->dmasound.rate) ?
369 0x01 : 0x03;
370 saa_andorb(SAA7134_ANALOG_IO_SELECT,
371 0x08, analog_io);
372 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL,
373 0xc0, 0x80);
374 saa_andorb(SAA7134_SIF_SAMPLE_FREQ,
375 0x03, rate);
376 break;
377 }
378
379 break;
380 case PCI_DEVICE_ID_PHILIPS_SAA7133:
381 case PCI_DEVICE_ID_PHILIPS_SAA7135:
382 xbarin = 0x03; /* adc */
383 anabar = 0;
384 switch (addr) {
385 case MIXER_ADDR_TVTUNER:
386 xbarin = 0; /* Demodulator */
387 anabar = 2; /* DACs */
388 break;
389 case MIXER_ADDR_LINE1:
390 anabar = 0; /* aux1, aux1 */
391 break;
392 case MIXER_ADDR_LINE2:
393 anabar = 9; /* aux2, aux2 */
394 break;
395 }
396
397 /* output xbar always main channel */
398 saa_dsp_writel(dev, SAA7133_DIGITAL_OUTPUT_SEL1,
399 0xbbbb10);
400
401 if (left || right) {
402 /* We've got data, turn the input on */
403 saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1,
404 xbarin);
405 saa_writel(SAA7133_ANALOG_IO_SELECT, anabar);
406 } else {
407 saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1,
408 0);
409 saa_writel(SAA7133_ANALOG_IO_SELECT, 0);
410 }
411 break;
412 }
413 }
414
415 if (change) {
416 if (force_notify)
417 snd_ctl_notify(chip->card,
418 SNDRV_CTL_EVENT_MASK_VALUE,
419 &chip->capture_ctl[addr]->id);
420
421 if (old_addr != MIXER_ADDR_UNSELECTED && old_addr != addr)
422 snd_ctl_notify(chip->card,
423 SNDRV_CTL_EVENT_MASK_VALUE,
424 &chip->capture_ctl[old_addr]->id);
425 }
426
427 return change;
428}
317 429
318/* 430/*
319 * ALSA PCM preparation 431 * ALSA PCM preparation
@@ -401,6 +513,10 @@ static int snd_card_saa7134_capture_prepare(struct snd_pcm_substream * substream
401 513
402 dev->dmasound.rate = runtime->rate; 514 dev->dmasound.rate = runtime->rate;
403 515
516 /* Setup and update the card/ALSA controls */
517 snd_saa7134_capsrc_set(saa7134->capture_ctl[dev->dmasound.input], 1, 1,
518 true);
519
404 return 0; 520 return 0;
405 521
406} 522}
@@ -435,6 +551,16 @@ snd_card_saa7134_capture_pointer(struct snd_pcm_substream * substream)
435 551
436/* 552/*
437 * ALSA hardware capabilities definition 553 * ALSA hardware capabilities definition
554 *
555 * Report only 32kHz for ALSA:
556 *
557 * - SAA7133/35 uses DDEP (DemDec Easy Programming mode), which works in 32kHz
558 * only
559 * - SAA7134 for TV mode uses DemDec mode (32kHz)
560 * - Radio works in 32kHz only
561 * - When recording 48kHz from Line1/Line2, switching of capture source to TV
562 * means
563 * switching to 32kHz without any frequency translation
438 */ 564 */
439 565
440static struct snd_pcm_hardware snd_card_saa7134_capture = 566static struct snd_pcm_hardware snd_card_saa7134_capture =
@@ -448,9 +574,9 @@ static struct snd_pcm_hardware snd_card_saa7134_capture =
448 SNDRV_PCM_FMTBIT_U8 | \ 574 SNDRV_PCM_FMTBIT_U8 | \
449 SNDRV_PCM_FMTBIT_U16_LE | \ 575 SNDRV_PCM_FMTBIT_U16_LE | \
450 SNDRV_PCM_FMTBIT_U16_BE, 576 SNDRV_PCM_FMTBIT_U16_BE,
451 .rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000, 577 .rates = SNDRV_PCM_RATE_32000,
452 .rate_min = 32000, 578 .rate_min = 32000,
453 .rate_max = 48000, 579 .rate_max = 32000,
454 .channels_min = 1, 580 .channels_min = 1,
455 .channels_max = 2, 581 .channels_max = 2,
456 .buffer_bytes_max = (256*1024), 582 .buffer_bytes_max = (256*1024),
@@ -836,8 +962,13 @@ static int snd_saa7134_capsrc_get(struct snd_kcontrol * kcontrol,
836 int addr = kcontrol->private_value; 962 int addr = kcontrol->private_value;
837 963
838 spin_lock_irq(&chip->mixer_lock); 964 spin_lock_irq(&chip->mixer_lock);
839 ucontrol->value.integer.value[0] = chip->capture_source[addr][0]; 965 if (chip->capture_source_addr == addr) {
840 ucontrol->value.integer.value[1] = chip->capture_source[addr][1]; 966 ucontrol->value.integer.value[0] = chip->capture_source[0];
967 ucontrol->value.integer.value[1] = chip->capture_source[1];
968 } else {
969 ucontrol->value.integer.value[0] = 0;
970 ucontrol->value.integer.value[1] = 0;
971 }
841 spin_unlock_irq(&chip->mixer_lock); 972 spin_unlock_irq(&chip->mixer_lock);
842 973
843 return 0; 974 return 0;
@@ -846,87 +977,22 @@ static int snd_saa7134_capsrc_get(struct snd_kcontrol * kcontrol,
846static int snd_saa7134_capsrc_put(struct snd_kcontrol * kcontrol, 977static int snd_saa7134_capsrc_put(struct snd_kcontrol * kcontrol,
847 struct snd_ctl_elem_value * ucontrol) 978 struct snd_ctl_elem_value * ucontrol)
848{ 979{
849 snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
850 int change, addr = kcontrol->private_value;
851 int left, right; 980 int left, right;
852 u32 anabar, xbarin;
853 int analog_io, rate;
854 struct saa7134_dev *dev;
855
856 dev = chip->dev;
857
858 left = ucontrol->value.integer.value[0] & 1; 981 left = ucontrol->value.integer.value[0] & 1;
859 right = ucontrol->value.integer.value[1] & 1; 982 right = ucontrol->value.integer.value[1] & 1;
860 spin_lock_irq(&chip->mixer_lock);
861
862 change = chip->capture_source[addr][0] != left ||
863 chip->capture_source[addr][1] != right;
864 chip->capture_source[addr][0] = left;
865 chip->capture_source[addr][1] = right;
866 dev->dmasound.input=addr;
867 spin_unlock_irq(&chip->mixer_lock);
868
869
870 if (change) {
871 switch (dev->pci->device) {
872
873 case PCI_DEVICE_ID_PHILIPS_SAA7134:
874 switch (addr) {
875 case MIXER_ADDR_TVTUNER:
876 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0xc0);
877 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, 0x00);
878 break;
879 case MIXER_ADDR_LINE1:
880 case MIXER_ADDR_LINE2:
881 analog_io = (MIXER_ADDR_LINE1 == addr) ? 0x00 : 0x08;
882 rate = (32000 == dev->dmasound.rate) ? 0x01 : 0x03;
883 saa_andorb(SAA7134_ANALOG_IO_SELECT, 0x08, analog_io);
884 saa_andorb(SAA7134_AUDIO_FORMAT_CTRL, 0xc0, 0x80);
885 saa_andorb(SAA7134_SIF_SAMPLE_FREQ, 0x03, rate);
886 break;
887 }
888
889 break;
890 case PCI_DEVICE_ID_PHILIPS_SAA7133:
891 case PCI_DEVICE_ID_PHILIPS_SAA7135:
892 xbarin = 0x03; // adc
893 anabar = 0;
894 switch (addr) {
895 case MIXER_ADDR_TVTUNER:
896 xbarin = 0; // Demodulator
897 anabar = 2; // DACs
898 break;
899 case MIXER_ADDR_LINE1:
900 anabar = 0; // aux1, aux1
901 break;
902 case MIXER_ADDR_LINE2:
903 anabar = 9; // aux2, aux2
904 break;
905 }
906
907 /* output xbar always main channel */
908 saa_dsp_writel(dev, SAA7133_DIGITAL_OUTPUT_SEL1, 0xbbbb10);
909 983
910 if (left || right) { // We've got data, turn the input on 984 return snd_saa7134_capsrc_set(kcontrol, left, right, false);
911 saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1, xbarin);
912 saa_writel(SAA7133_ANALOG_IO_SELECT, anabar);
913 } else {
914 saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1, 0);
915 saa_writel(SAA7133_ANALOG_IO_SELECT, 0);
916 }
917 break;
918 }
919 }
920
921 return change;
922} 985}
923 986
924static struct snd_kcontrol_new snd_saa7134_controls[] = { 987static struct snd_kcontrol_new snd_saa7134_volume_controls[] = {
925SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER), 988SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER),
926SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER),
927SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1), 989SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1),
928SAA713x_CAPSRC("Line Capture Switch", 1, MIXER_ADDR_LINE1),
929SAA713x_VOLUME("Line Volume", 2, MIXER_ADDR_LINE2), 990SAA713x_VOLUME("Line Volume", 2, MIXER_ADDR_LINE2),
991};
992
993static struct snd_kcontrol_new snd_saa7134_capture_controls[] = {
994SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER),
995SAA713x_CAPSRC("Line Capture Switch", 1, MIXER_ADDR_LINE1),
930SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2), 996SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2),
931}; 997};
932 998
@@ -941,17 +1007,33 @@ SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2),
941static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip) 1007static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
942{ 1008{
943 struct snd_card *card = chip->card; 1009 struct snd_card *card = chip->card;
1010 struct snd_kcontrol *kcontrol;
944 unsigned int idx; 1011 unsigned int idx;
945 int err; 1012 int err, addr;
946 1013
947 if (snd_BUG_ON(!chip)) 1014 if (snd_BUG_ON(!chip))
948 return -EINVAL; 1015 return -EINVAL;
949 strcpy(card->mixername, "SAA7134 Mixer"); 1016 strcpy(card->mixername, "SAA7134 Mixer");
950 1017
951 for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_controls); idx++) { 1018 for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_volume_controls); idx++) {
952 if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_saa7134_controls[idx], chip))) < 0) 1019 kcontrol = snd_ctl_new1(&snd_saa7134_volume_controls[idx],
1020 chip);
1021 err = snd_ctl_add(card, kcontrol);
1022 if (err < 0)
953 return err; 1023 return err;
954 } 1024 }
1025
1026 for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_capture_controls); idx++) {
1027 kcontrol = snd_ctl_new1(&snd_saa7134_capture_controls[idx],
1028 chip);
1029 addr = snd_saa7134_capture_controls[idx].private_value;
1030 chip->capture_ctl[addr] = kcontrol;
1031 err = snd_ctl_add(card, kcontrol);
1032 if (err < 0)
1033 return err;
1034 }
1035
1036 chip->capture_source_addr = MIXER_ADDR_UNSELECTED;
955 return 0; 1037 return 0;
956} 1038}
957 1039