[alsa-devel] [PATCH] cs4236: detect chip in one pass

Takashi Iwai tiwai at suse.de
Mon Nov 2 11:20:26 CET 2009


At Sun, 1 Nov 2009 16:50:38 +0100,
Krzysztof Helt wrote:
> 
> From: Krzysztof Helt <krzysztof.h1 at wp.pl>
> 
> The cs4236 was two step detection with call to the snd_wss_free()
> between two steps. The snd_wss_free() did not free a sound device
> created in the snd_wss_create(). This caused an OOPS during module
> removal as the same sound device was released twice. The same OOPS
> happened if the cs4236 module loading failed.
> 
> Fix this by adapting the snd_cs4236_create() to correctly work with
> chips less capable then cs4236. The snd_cs4236_create() behaves the
> same as the snd_wss_create() if the chip is less capable than the cs4236.
> 
> Signed-off-by: Krzysztof Helt <krzysztof.h1 at wp.pl>
> ---
> This is the second version of the patch with added snd_device_free() call
> in error path.

Thanks.  The change looks good, but...

> @@ -281,83 +285,89 @@ int snd_cs4236_create(struct snd_card *card,
...
>  	err = snd_wss_create(card, port, cport,
>  			     irq, dma1, dma2, hardware, hwshare, &chip);
>  	if (err < 0)
>  		return err;
>  
> -	if (!(chip->hardware & WSS_HW_CS4236B_MASK)) {
> -		snd_printk(KERN_ERR "CS4236+: MODE3 and extended registers "
> -			   "not available, hardware=0x%x\n", chip->hardware);
> -		snd_device_free(card, chip);
> -		return -ENODEV;

I'd just return 0 here instead of error (with *rchip = chip, of course).
Then the code flow gets simpler and the patch becomes smaller.

Could you fix and repost?


thanks,

Takashi


More information about the Alsa-devel mailing list