At Sun, 1 Nov 2009 16:50:38 +0100, Krzysztof Helt wrote: > > From: Krzysztof Helt <krzysztof.h1@xxxxx> > > 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@xxxxx> > --- > 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 _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel