All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Thomas Charbonnel <thomas@undata.org>
Cc: alsa-devel@lists.sourceforge.net
Subject: Re: Intel8x0 problems with rc1
Date: Tue, 02 Dec 2003 16:50:48 +0100	[thread overview]
Message-ID: <s5h3cc3dxrb.wl@alsa2.suse.de> (raw)
In-Reply-To: <3FCC9A49.3070300@undata.org>

[-- Attachment #1: Type: text/plain, Size: 426 bytes --]

At Tue, 02 Dec 2003 14:57:29 +0100,
Thomas Charbonnel wrote:
> 
> Takashi Iwai wrote :
> 
> > ok, then please check /proc/asound/card0/codec97#0/* files whether VRA
> > is properly set to 44100Hz during the playback.
> > 
> > 
> > Takashi
> > 
> > 
> 
> Bingo, it seems it's not, indeed :

please try the attached patch.
possibly this isn't a fix, but it will print debug messages while
probing and opening the pcm.


Takashi

[-- Attachment #2: Type: text/plain, Size: 8128 bytes --]

Index: alsa-kernel/include/ac97_codec.h
===================================================================
RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/include/ac97_codec.h,v
retrieving revision 1.35
diff -u -r1.35 ac97_codec.h
--- alsa-kernel/include/ac97_codec.h	20 Nov 2003 15:57:50 -0000	1.35
+++ alsa-kernel/include/ac97_codec.h	2 Dec 2003 15:38:37 -0000
@@ -345,7 +345,8 @@
 	ac97_bus_t *bus;
 	unsigned int stream: 1,	   	   /* stream type: 1 = capture */
 		     exclusive: 1,	   /* exclusive mode, don't override with other pcms */
-		     copy_flag: 1;	   /* lowlevel driver must fill all entries */
+		     copy_flag: 1,	   /* lowlevel driver must fill all entries */
+		     spdif: 1;		   /* spdif pcm */
 	unsigned short aslots;		   /* active slots */
 	unsigned int rates;		   /* available rates */
 	struct {
Index: alsa-kernel/pci/intel8x0.c
===================================================================
RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/pci/intel8x0.c,v
retrieving revision 1.102
diff -u -r1.102 intel8x0.c
--- alsa-kernel/pci/intel8x0.c	20 Nov 2003 15:57:50 -0000	1.102
+++ alsa-kernel/pci/intel8x0.c	2 Dec 2003 15:39:03 -0000
@@ -886,6 +886,7 @@
 static int snd_intel8x0_hw_params(snd_pcm_substream_t * substream,
 				  snd_pcm_hw_params_t * hw_params)
 {
+	intel8x0_t *chip = snd_pcm_substream_chip(substream);
 	ichdev_t *ichdev = get_ichdev(substream);
 	int err;
 
@@ -899,8 +900,12 @@
 	err = snd_ac97_pcm_open(ichdev->pcm, params_rate(hw_params),
 				params_channels(hw_params),
 				ichdev->pcm->r[0].slots);
-	if (err >= 0)
+	if (err >= 0) {
 		ichdev->pcm_open_flag = 1;
+		/* FIXME: hack to enable spdif support */
+		if (ichdev->ichd == ICHD_PCMOUT && chip->device_type == DEVICE_SIS)
+			snd_ac97_set_rate(ichdev->pcm->r[0].codec[0], AC97_SPDIF, params_rate(hw_params));
+	}
 	return err;
 }
 
@@ -963,9 +968,6 @@
 		snd_intel8x0_setup_multi_channels(chip, runtime->channels);
 		spin_unlock(&chip->reg_lock);
 	}
-	/* FIXME: hack to enable spdif support */
-	if (ichdev->ichd == ICHD_PCMOUT && chip->device_type == DEVICE_SIS)
-		snd_ac97_set_rate(ichdev->pcm->r[0].codec[0], AC97_SPDIF, runtime->rate);
 	snd_intel8x0_setup_periods(chip, ichdev);
 	return 0;
 }
@@ -1590,6 +1592,7 @@
 	/* S/PDIF PCM */
 	{
 		.exclusive = 1,
+		.spdif = 1,
 		.r = {	{
 				.slots = (1 << AC97_SLOT_SPDIF_LEFT2) |
 					 (1 << AC97_SLOT_SPDIF_RIGHT2)
Index: alsa-kernel/pci/ac97/ac97_pcm.c
===================================================================
RCS file: /suse/tiwai/cvs/alsa/alsa-kernel/pci/ac97/ac97_pcm.c,v
retrieving revision 1.7
diff -u -r1.7 ac97_pcm.c
--- alsa-kernel/pci/ac97/ac97_pcm.c	1 Dec 2003 12:52:48 -0000	1.7
+++ alsa-kernel/pci/ac97/ac97_pcm.c	2 Dec 2003 15:44:16 -0000
@@ -165,6 +165,8 @@
 		return 0xff;
 	if (slot > 11)
 		return 0xff;
+	if (pcm->spdif)
+		return AC97_SPDIF; /* pseudo register */
 	if (pcm->stream == SNDRV_PCM_STREAM_PLAYBACK)
 		return rate_reg_tables[dbl][pcm->r[dbl].rate_table[cidx]][slot - 3];
 	else
@@ -230,6 +232,8 @@
  * AC97_PCM_FRONT_DAC_RATE, AC97_PCM_LR_ADC_RATE.
  * AC97_PCM_SURR_DAC_RATE and AC97_PCM_LFE_DAC_RATE are accepted
  * if the codec supports them.
+ * AC97_SPDIF is accepted as a pseudo register to modify the SPDIF
+ * status bits.
  *
  * Returns zero if successful, or a negative error code on failure.
  */
@@ -257,6 +261,9 @@
 		if (! (ac97->scaps & AC97_SCAP_CENTER_LFE_DAC))
 			return -EINVAL;
 		break;
+	case AC97_SPDIF:
+		/* special case */
+		return set_spdif_rate(ac97, rate);
 	default:
 		return -EINVAL;
 	}
@@ -350,8 +357,7 @@
 	if (!ac97_is_audio(ac97))
 		return 0;
 	slots = (1<<AC97_SLOT_PCM_LEFT)|(1<<AC97_SLOT_PCM_RIGHT);
-	if (ac97->ext_id & AC97_EI_VRM)
-		slots |= (1<<AC97_SLOT_MIC);
+	slots |= (1<<AC97_SLOT_MIC);
 	return slots;
 }
 
@@ -412,16 +418,19 @@
 			continue;
 		avail_slots[0][i] = get_pslots(codec, &rate_table[0][i]);
 		avail_slots[1][i] = get_cslots(codec);
+		printk(KERN_DEBUG "checking codec %d, slots = 0x%x / 0x%x\n", i, avail_slots[0][i], avail_slots[1][i]);
 		if (!(codec->scaps & AC97_SCAP_INDEP_SDIN)) {
 			for (j = 0; j < i; j++) {
 				if (bus->codec[j])
 					avail_slots[1][i] &= ~avail_slots[1][j];
 			}
+			printk(KERN_DEBUG "-> capture slots = 0x%x\n", avail_slots[1][i]);
 		}
 	}
 	/* FIXME: add double rate allocation */
 	/* first step - exclusive devices */
 	for (i = 0; i < pcms_count; i++) {
+		printk(KERN_DEBUG "probing pcm %d\n", i);
 		pcm = &pcms[i];
 		rpcm = &rpcms[i];
 		/* low-level driver thinks that it's more clever */
@@ -431,6 +440,7 @@
 		}
 		rpcm->stream = pcm->stream;
 		rpcm->exclusive = pcm->exclusive;
+		rpcm->spdif = pcm->spdif;
 		rpcm->private_value = pcm->private_value;
 		rpcm->bus = bus;
 		rpcm->rates = ~0;
@@ -438,19 +448,23 @@
 		for (j = 0; j < 4 && slots; j++) {
 			if (!bus->codec[j])
 				continue;
+			printk(KERN_DEBUG ".. probing codec %d, slots = 0x%x\n", j, slots);
 			rates = ~0;
 			if (pcm->exclusive) {
 				/* exclusive access */
 				tmp = avail_slots[pcm->stream][j] & slots;
+				printk(KERN_DEBUG ".. tmp = 0x%x\n", tmp);
 				for (k = 0; k < i; k++) {
 					if (rpcm->stream == rpcms[k].stream)
 						tmp &= ~rpcms[k].r[0].rslots[j];
 				}
+				printk(KERN_DEBUG ".. tmp = 0x%x\n", tmp);
 				if (tmp) {
 					rpcm->r[0].rslots[j] = tmp;
 					rpcm->r[0].codec[j] = bus->codec[j];
 					rpcm->r[0].rate_table[j] = rate_table[pcm->stream][j];
 					rates = get_rates(rpcm, j, tmp, 0);
+					printk(KERN_DEBUG ".. rslots = 0x%x, rate_table = %d, rates = 0x%x\n", tmp, rpcm->r[0].rate_table[j], rates);
 					avail_slots[pcm->stream][j] &= ~tmp;
 				}
 			} else {
@@ -467,6 +481,7 @@
 			rpcm->r[0].slots |= tmp;
 			rpcm->rates &= rates;
 		}
+		printk(KERN_DEBUG "--> slots = 0x%x, rates = 0x%x\n", rpcm->r[0].slots, rpcm->rates);
 	}
 	bus->pcms_count = pcms_count;
 	bus->pcms = rpcms;
@@ -487,9 +502,11 @@
 {
 	ac97_bus_t *bus;
 	int i, cidx, r = 0, ok_flag;
-	unsigned short reg_ok = 0, reg_ok_new;
+	unsigned int reg_ok = 0;
 	unsigned char reg;
+	int err = 0;
 
+	printk(KERN_DEBUG "ac97_pcm_open: rate = %d, cfg = %d, slots = 0x%x\n", rate, cfg, slots);
 	if (rate > 48000)	/* FIXME: add support for double rate */
 		return -EINVAL;
 	bus = pcm->bus;
@@ -506,27 +523,23 @@
 	for (i = 3; i < 12; i++) {
 		if (!(slots & (1 << i)))
 			continue;
-		for (cidx = 0; cidx < 4; cidx++)
+		ok_flag = 0;
+		for (cidx = 0; cidx < 4; cidx++) {
 			if (bus->used_slots[pcm->stream][cidx] & (1 << i)) {
 				spin_unlock_irq(&pcm->bus->bus_lock);
-				return -EBUSY;
+				err = -EBUSY;
+				goto error;
 			}
-	}
-	for (i = 3; i < 12; i++) {
-		if (!(slots & (1 << i)))
-			continue;
-		ok_flag = 0;
-		for (cidx = 0; cidx < 4; cidx++)
 			if (pcm->r[r].rslots[cidx] & (1 << i)) {
 				bus->used_slots[pcm->stream][cidx] |= (1 << i);
 				ok_flag++;
 			}
+		}
 		if (!ok_flag) {
 			spin_unlock_irq(&pcm->bus->bus_lock);
 			snd_printk(KERN_ERR "cannot find configuration for AC97 slot %i\n", i);
-			pcm->aslots = slots;
-			snd_ac97_pcm_close(pcm);
-			return -EAGAIN;
+			err = -EAGAIN;
+			goto error;
 		}
 	}
 	spin_unlock_irq(&pcm->bus->bus_lock);
@@ -534,23 +547,29 @@
 		if (!(slots & (1 << i)))
 			continue;
 		for (cidx = 0; cidx < 4; cidx++) {
-			reg_ok_new = 0;
 			if (pcm->r[r].rslots[cidx] & (1 << i)) {
-				reg = get_slot_reg(pcm, cidx, i, 0);
+				reg = get_slot_reg(pcm, cidx, i, r);
 				if (reg == 0xff) {
 					snd_printk(KERN_ERR "invalid AC97 slot %i?\n", i);
 					continue;
 				}
 				if (reg_ok & (1 << (reg - AC97_PCM_FRONT_DAC_RATE)))
 					continue;
-				snd_ac97_set_rate(pcm->r[r].codec[cidx], reg, rate);
-				reg_ok_new |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE));
+				printk(KERN_DEBUG "setting ac97 reg 0x%x to rate %d\n", reg, rate);
+				err = snd_ac97_set_rate(pcm->r[r].codec[cidx], reg, rate);
+				if (err < 0)
+					snd_printk(KERN_ERR "error in snd_ac97_set_rate: cidx=%d, reg=0x%x, rate=%d\n, err=%d", cidx, reg, rate, err);
+				reg_ok |= (1 << (reg - AC97_PCM_FRONT_DAC_RATE));
 			}
-			reg_ok |= reg_ok_new;
 		}
 	}
 	pcm->aslots = slots;
 	return 0;
+
+ error:
+	pcm->aslots = slots;
+	snd_ac97_pcm_close(pcm);
+	return err;
 }
 
 /**

  reply	other threads:[~2003-12-02 15:50 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-12-01 18:15 Intel8x0 problems with rc1 Thomas Charbonnel
2003-12-01 18:30 ` Takashi Iwai
2003-12-01 18:50   ` Takashi Iwai
2003-12-02 12:00     ` Thomas Charbonnel
2003-12-02 12:12       ` Takashi Iwai
2003-12-02 13:57         ` Thomas Charbonnel
2003-12-02 15:50           ` Takashi Iwai [this message]
2003-12-02 22:46             ` Thomas Charbonnel
2003-12-03 13:48               ` Takashi Iwai
2003-12-03 14:47                 ` Thomas Charbonnel
2003-12-03 16:00                   ` Takashi Iwai
2003-12-03 16:41                     ` Jeremy Hall
2003-12-03 16:45                       ` Takashi Iwai
2003-12-03 16:54                         ` Jeremy Hall
2003-12-03 17:17                     ` Thomas Charbonnel
2003-12-01 19:09   ` Thomas Charbonnel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=s5h3cc3dxrb.wl@alsa2.suse.de \
    --to=tiwai@suse.de \
    --cc=alsa-devel@lists.sourceforge.net \
    --cc=thomas@undata.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.