[alsa-devel] HDA: Enable chipset gcap usage

Takashi Iwai tiwai at suse.de
Mon Jan 7 11:59:13 CET 2008


At Thu, 03 Jan 2008 15:34:05 -0800,
Tobin Davis wrote:
> 
> Summary:  hda_intel.c use gcap register to determine number of streams
> supported by southbridge.
> 
> This patch removes hardcoded values for the number of streams supported
> by the southbridge in most chipsets, and reads these values from the
> chipset directly.  Most systems are hardwired for 4 streams in each
> direction, but newer chipsets change that capability.
> 
> 
> Signed off by Tobin Davis <tdavis at dsl-only.net>
> [2 hda-gcap.patch <text/x-patch; UTF-8 (7bit)>]
> diff -r 1227a1c12325 pci/hda/hda_intel.c
> --- a/pci/hda/hda_intel.c	Mon Dec 24 14:40:56 2007 +0100
> +++ b/pci/hda/hda_intel.c	Thu Jan 03 15:27:10 2008 -0800
> @@ -1709,12 +1709,13 @@ static int __devinit azx_create(struct s
>  {
>  	struct azx *chip;
>  	int err;
> +	unsigned short gcap;
>  	static struct snd_device_ops ops = {
>  		.dev_free = azx_dev_free,
>  	};
>  
>  	*rchip = NULL;
> -	
> +
>  	err = pci_enable_device(pci);
>  	if (err < 0)
>  		return err;
> @@ -1790,10 +1791,19 @@ static int __devinit azx_create(struct s
>  		chip->capture_index_offset = ATIHDMI_CAPTURE_INDEX;
>  		break;
>  	default:
> -		chip->playback_streams = ICH6_NUM_PLAYBACK;
> -		chip->capture_streams = ICH6_NUM_CAPTURE;
> -		chip->playback_index_offset = ICH6_PLAYBACK_INDEX;
> -		chip->capture_index_offset = ICH6_CAPTURE_INDEX;
> +		/* read number of streams from GCAP register instead of using
> +		 * hardcoded value
> +		 */
> +		gcap = azx_readw(chip, GCAP);
> +		if(!gcap) {
> +			snd_printk(KERN_ERR "Device has no streams \n");
> +			goto errout;
> +		};

I think it's safer to assign old ICH6_* values in this case (just to
be sure) after a warning message.

> +		chip->playback_streams = (gcap&(0xF<<12))>>12;
> +		chip->capture_streams = (gcap&(0xF<<8))>>8;
> +		chip->playback_index_offset = (gcap&(0xF<<12))>>12;
> +		chip->capture_index_offset = 0;
> +
>  		break;
>  	}
>  	chip->num_streams = chip->playback_streams + chip->capture_streams;

The patch has some coding style issues, for example, no space around
operators, etc.  Try to run $LINUX/scripts/checkpatch.pl, fix the
errors and the issue above, and please repost the patch again.

Thanks!


Takashi


More information about the Alsa-devel mailing list