[alsa-devel] [PATCH 2/2] Add support for Cyrix/NatSemi Geode SC5530 (VSA1)
Takashi Iwai
tiwai at suse.de
Thu May 24 12:29:26 CEST 2007
Hi,
thanks for the patches. The first one looks OK.
I see minor coding style issues in the second patch.
At Wed, 23 May 2007 15:50:38 -0500,
Ash Willis wrote:
>
> diff -r 5c25d0e8819c -r c9be7b8611e7 pci/cs5530.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/pci/cs5530.c Thu May 24 02:24:57 2007 +0100
> @@ -0,0 +1,296 @@
> +static int __devinit snd_cs5530_create(struct snd_card *card,
> + struct pci_dev *pci,
> + struct snd_cs5530 **rchip)
> +{
> + struct snd_cs5530 *chip;
> + unsigned long sb_base;
> + u8 irq, dma8, dma16 = 0;
> + u16 map;
> + void __iomem *mem;
> + int err;
> +
> + static struct snd_device_ops ops = {
> + .dev_free = snd_cs5530_dev_free,
> + };
> + *rchip = NULL;
> +
> + if ((err = pci_enable_device(pci)) < 0)
> + return err;
Avoid the style "if ((err = xx) < 0)" in new codes as much as
possible. Just write:
err = pci_enable(pci);
if (err < 0)
return err;
Now the kernel coding style recommends this.
> + if ((err = pci_request_regions(pci, "CS5530")) < 0) {
> + kfree(chip);
> + pci_disable_device(pci);
> + return err;
> + }
Ditto.
> + chip->pci_base = pci_resource_start(pci, 0);
> +
> + mem = ioremap_nocache(chip->pci_base, pci_resource_len(pci, 0));
Check the return value from ioremap(), just to be sure.
> + map = readw(mem + 0x18);
> + iounmap(mem);
> +
> + /* Map bits
> + 0:1 * 0x20 + 0x200 = sb base
> + 2 sb enable
> + 3 adlib enable
> + 5 MPU enable 0x330
> + 6 MPU enable 0x300
> +
> + The other bits may be used internally so must be masked */
> +
> + sb_base = 0x220 + 0x20 * (map & 3);
> +
> + if (map & (1<<2))
> + printk(KERN_INFO "CS5530: XpressAudio at 0x%lx\n", sb_base);
> + else
> + {
> + printk(KERN_ERR "Could not find XpressAudio!\n");
> + snd_cs5530_free(chip);
> + return -ENODEV;
> + }
Coding style issue: Put "{' in the same line as "else".
Also, you can use goto as a single error handling point.
For example,
if (err < 0) {
some_error_message();
goto error;
}
...
return 0;
error:
snd_cs5530_free(chip);
return err;
}
This is a matter of taste, IMO, though.
> +
> + if (map & (1<<5))
> + printk(KERN_INFO "CS5530: MPU at 0x300\n");
> + else if (map & (1<<6))
> + printk(KERN_INFO "CS5530: MPU at 0x330\n");
> +
> + irq = snd_cs5530_mixer_read(sb_base, 0x80) & 0x0F;
> + dma8 = snd_cs5530_mixer_read(sb_base, 0x81);
> +
> + if (dma8 & 0x20)
> + dma16 = 5;
> + else if (dma8 & 0x40)
> + dma16 = 6;
> + else if (dma8 & 0x80)
> + dma16 = 7;
> + else
> + {
> + printk(KERN_ERR "CS5530: No 16bit DMA enabled\n");
> + snd_cs5530_free(chip);
> + return -ENODEV;
> + }
Ditto.
(BTW, is dma16 really necessary to be zero-initialized at beginning?)
> +
> + if (dma8 & 0x01)
> + dma8 = 0;
> + else if (dma8 & 02)
> + dma8 = 1;
> + else if (dma8 & 0x08)
> + dma8 = 3;
> + else
> + {
> + printk(KERN_ERR "CS5530: No 8bit DMA enabled\n");
> + snd_cs5530_free(chip);
> + return -ENODEV;
> + }
Ditto.
> +
> + if (irq & 1)
> + irq = 9;
> + else if (irq & 2)
> + irq = 5;
> + else if (irq & 4)
> + irq = 7;
> + else if (irq & 8)
> + irq = 10;
> + else
> + {
> + printk(KERN_ERR "CS5530: SoundBlaster IRQ not set\n");
> + snd_cs5530_free(chip);
> + return -ENODEV;
> + }
Ditto.
> + printk(KERN_INFO "CS5530: IRQ: %d DMA8: %d DMA16: %d\n", irq, dma8,
> + dma16);
> +
> + if ((err = snd_sbdsp_create(card, sb_base, irq, snd_sb16dsp_interrupt,
> + dma8, dma16, SB_HW_CS5530, &chip->sb)) < 0) {
> + printk(KERN_ERR "CS5530: Could not create SoundBlaster\n");
> + snd_cs5530_free(chip);
> + return err;
> + }
Split err.
> + if ((err = snd_sb16dsp_pcm(chip->sb, 0, &chip->sb->pcm)) < 0) {
> + printk(KERN_ERR "CS5530: Could not create PCM\n");
> + snd_cs5530_free(chip);
> + return err;
> + }
Split err.
> +
> + if ((err = snd_sbmixer_new(chip->sb)) < 0) {
> + printk(KERN_ERR "CS5530: Could not create Mixer\n");
> + snd_cs5530_free(chip);
> + return err;
> + }
Split err.
> + if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
> + snd_cs5530_free(chip);
> + return err;
> + }
Split err.
> + snd_card_set_dev(card, &pci->dev);
> + *rchip = chip;
> + return 0;
> +}
> +
> +static int __devinit snd_cs5530_probe(struct pci_dev *pci,
> + const struct pci_device_id *pci_id)
> +{
> + static int dev;
> + struct snd_card *card;
> + struct snd_cs5530 *chip = NULL;
> + int err;
> +
> + if (dev >= SNDRV_CARDS)
> + return -ENODEV;
> + if (!enable[dev]) {
> + dev++;
> + return -ENOENT;
> + }
> +
> + card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
> +
> + if (card == NULL)
> + return -ENOMEM;
> +
> + if ((err = snd_cs5530_create(card, pci, &chip)) < 0) {
> + snd_card_free(card);
> + return err;
> + }
Split err.
> + strcpy(card->driver, "CS5530");
> + strcpy(card->shortname, "CS5530 Audio");
> + sprintf(card->longname, "%s at 0x%lx", card->shortname, chip->pci_base);
> +
> + if ((err = snd_card_register(card)) < 0) {
> + snd_card_free(card);
> + return err;
> + }
Split err.
Is the driver confirmed to work with the recent kernel?
If yes, we can put cs5530.c to alsa-kernel so that it'll be merged to
the next linux kernel. alsa-driver tree still needs cs5530.c just
including alsa-kernel code, though.
Also, don't forget to add a description to ALSA-Configuration.txt.
Could you fix these issues and resend the patch?
Takashi
More information about the Alsa-devel
mailing list