[alsa-devel] [PATCH] hda_intel: Fixes distorted recording on US15W chipset
Takashi Iwai
tiwai at suse.de
Tue May 11 08:24:01 CEST 2010
At Mon, 10 May 2010 19:40:27 +0200,
Shahin Ghazinouri wrote:
>
> Hi,
>
> I've now verified the patch below works and it appears functionally identical.
OK, now applied. Thanks!
Takashi
> Regards,
> Shahin
>
> On 10 maj 2010, at 10.37, Takashi Iwai wrote:
> >
> > The changes look OK, but the code can be a bit more simplified.
> > Could you check whether the patch below works?
> >
> >
> > thanks,
> >
> > Takashi
> >
> > ---
> > diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
> > index 236b4ca..cad9b70 100644
> > --- a/sound/pci/hda/hda_intel.c
> > +++ b/sound/pci/hda/hda_intel.c
> > @@ -425,7 +425,7 @@ struct azx {
> > struct snd_dma_buffer posbuf;
> >
> > /* flags */
> > - int position_fix;
> > + int position_fix[2]; /* for both playback/capture streams */
> > int poll_count;
> > unsigned int running :1;
> > unsigned int initialized :1;
> > @@ -1306,8 +1306,10 @@ static int azx_setup_controller(struct azx *chip, struct azx_dev *azx_dev)
> > azx_sd_writel(azx_dev, SD_BDLPU, upper_32_bits(azx_dev->bdl.addr));
> >
> > /* enable the position buffer */
> > - if (chip->position_fix == POS_FIX_POSBUF ||
> > - chip->position_fix == POS_FIX_AUTO ||
> > + if (chip->position_fix[0] == POS_FIX_POSBUF ||
> > + chip->position_fix[0] == POS_FIX_AUTO ||
> > + chip->position_fix[1] == POS_FIX_POSBUF ||
> > + chip->position_fix[1] == POS_FIX_AUTO ||
> > chip->via_dmapos_patch) {
> > if (!(azx_readl(chip, DPLBASE) & ICH6_DPLBASE_ENABLE))
> > azx_writel(chip, DPLBASE,
> > @@ -1847,13 +1849,16 @@ static unsigned int azx_get_position(struct azx *chip,
> >
> > if (chip->via_dmapos_patch)
> > pos = azx_via_get_position(chip, azx_dev);
> > - else if (chip->position_fix == POS_FIX_POSBUF ||
> > - chip->position_fix == POS_FIX_AUTO) {
> > - /* use the position buffer */
> > - pos = le32_to_cpu(*azx_dev->posbuf);
> > - } else {
> > - /* read LPIB */
> > - pos = azx_sd_readl(azx_dev, SD_LPIB);
> > + else {
> > + int stream = azx_dev->substream->stream;
> > + if (chip->position_fix[stream] == POS_FIX_POSBUF ||
> > + chip->position_fix[stream] == POS_FIX_AUTO) {
> > + /* use the position buffer */
> > + pos = le32_to_cpu(*azx_dev->posbuf);
> > + } else {
> > + /* read LPIB */
> > + pos = azx_sd_readl(azx_dev, SD_LPIB);
> > + }
> > }
> > if (pos >= azx_dev->bufsize)
> > pos = 0;
> > @@ -1881,22 +1886,24 @@ static snd_pcm_uframes_t azx_pcm_pointer(struct snd_pcm_substream *substream)
> > static int azx_position_ok(struct azx *chip, struct azx_dev *azx_dev)
> > {
> > unsigned int pos;
> > + int stream;
> >
> > if (azx_dev->start_flag &&
> > time_before_eq(jiffies, azx_dev->start_jiffies))
> > return -1; /* bogus (too early) interrupt */
> > azx_dev->start_flag = 0;
> >
> > + stream = azx_dev->substream->stream;
> > pos = azx_get_position(chip, azx_dev);
> > - if (chip->position_fix == POS_FIX_AUTO) {
> > + if (chip->position_fix[stream] == POS_FIX_AUTO) {
> > if (!pos) {
> > printk(KERN_WARNING
> > "hda-intel: Invalid position buffer, "
> > "using LPIB read method instead.\n");
> > - chip->position_fix = POS_FIX_LPIB;
> > + chip->position_fix[stream] = POS_FIX_LPIB;
> > pos = azx_get_position(chip, azx_dev);
> > } else
> > - chip->position_fix = POS_FIX_POSBUF;
> > + chip->position_fix[stream] = POS_FIX_POSBUF;
> > }
> >
> > if (!bdl_pos_adj[chip->dev_index])
> > @@ -2435,7 +2442,8 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
> > chip->dev_index = dev;
> > INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work);
> >
> > - chip->position_fix = check_position_fix(chip, position_fix[dev]);
> > + chip->position_fix[0] = chip->position_fix[1] =
> > + check_position_fix(chip, position_fix[dev]);
> > check_probe_mask(chip, dev);
> >
> > chip->single_cmd = single_cmd;
> > _______________________________________________
> > Alsa-devel mailing list
> > Alsa-devel at alsa-project.org
> > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>
More information about the Alsa-devel
mailing list