diff options
Diffstat (limited to 'sound/mips')
| -rw-r--r-- | sound/mips/ad1843.c | 2 | ||||
| -rw-r--r-- | sound/mips/au1x00.c | 232 | ||||
| -rw-r--r-- | sound/mips/hal2.c | 18 | ||||
| -rw-r--r-- | sound/mips/sgio2audio.c | 32 |
4 files changed, 156 insertions, 128 deletions
diff --git a/sound/mips/ad1843.c b/sound/mips/ad1843.c index c624510ec37..586907500ca 100644 --- a/sound/mips/ad1843.c +++ b/sound/mips/ad1843.c @@ -276,7 +276,7 @@ static void ad1843_write_multi(struct snd_ad1843 *ad1843, int argcount, ...) if (reg == -1) reg = fp->reg; else - BUG_ON(reg != fp->reg); + WARN_ON(reg != fp->reg); m = ((1 << fp->nbits) - 1) << fp->lo_bit; mask |= m; bits |= (value << fp->lo_bit) & m; diff --git a/sound/mips/au1x00.c b/sound/mips/au1x00.c index 3f3ec0bec06..fbcaa5434fd 100644 --- a/sound/mips/au1x00.c +++ b/sound/mips/au1x00.c @@ -37,6 +37,7 @@ #include <linux/ioport.h> #include <linux/interrupt.h> #include <linux/init.h> +#include <linux/platform_device.h> #include <linux/slab.h> #include <linux/module.h> #include <sound/core.h> @@ -98,6 +99,7 @@ struct snd_au1000 { struct snd_pcm *pcm; struct audio_stream *stream[2]; /* playback & capture */ + int dmaid[2]; /* tx(0)/rx(1) DMA ids */ }; /*--------------------------- Local Functions --------------------------------*/ @@ -439,7 +441,7 @@ static struct snd_pcm_ops snd_card_au1000_capture_ops = { .pointer = snd_au1000_pointer, }; -static int __devinit +static int snd_au1000_pcm_new(struct snd_au1000 *au1000) { struct snd_pcm *pcm; @@ -465,15 +467,17 @@ snd_au1000_pcm_new(struct snd_au1000 *au1000) spin_lock_init(&au1000->stream[CAPTURE]->dma_lock); flags = claim_dma_lock(); - if ((au1000->stream[PLAYBACK]->dma = request_au1000_dma(DMA_ID_AC97C_TX, + au1000->stream[PLAYBACK]->dma = request_au1000_dma(au1000->dmaid[0], "AC97 TX", au1000_dma_interrupt, 0, - au1000->stream[PLAYBACK])) < 0) { + au1000->stream[PLAYBACK]); + if (au1000->stream[PLAYBACK]->dma < 0) { release_dma_lock(flags); return -EBUSY; } - if ((au1000->stream[CAPTURE]->dma = request_au1000_dma(DMA_ID_AC97C_RX, + au1000->stream[CAPTURE]->dma = request_au1000_dma(au1000->dmaid[1], "AC97 RX", au1000_dma_interrupt, 0, - au1000->stream[CAPTURE])) < 0){ + au1000->stream[CAPTURE]); + if (au1000->stream[CAPTURE]->dma < 0){ release_dma_lock(flags); return -EBUSY; } @@ -552,69 +556,12 @@ get the interrupt driven case to work efficiently */ spin_unlock(&au1000->ac97_lock); } -static int __devinit -snd_au1000_ac97_new(struct snd_au1000 *au1000) -{ - int err; - struct snd_ac97_bus *pbus; - struct snd_ac97_template ac97; - static struct snd_ac97_bus_ops ops = { - .write = snd_au1000_ac97_write, - .read = snd_au1000_ac97_read, - }; - - if ((au1000->ac97_res_port = request_mem_region(CPHYSADDR(AC97C_CONFIG), - 0x100000, "Au1x00 AC97")) == NULL) { - snd_printk(KERN_ERR "ALSA AC97: can't grap AC97 port\n"); - return -EBUSY; - } - au1000->ac97_ioport = (struct au1000_ac97_reg *) - KSEG1ADDR(au1000->ac97_res_port->start); - - spin_lock_init(&au1000->ac97_lock); - - /* configure pins for AC'97 - TODO: move to board_setup.c */ - au_writel(au_readl(SYS_PINFUNC) & ~0x02, SYS_PINFUNC); - - /* Initialise Au1000's AC'97 Control Block */ - au1000->ac97_ioport->cntrl = AC97C_RS | AC97C_CE; - udelay(10); - au1000->ac97_ioport->cntrl = AC97C_CE; - udelay(10); - - /* Initialise External CODEC -- cold reset */ - au1000->ac97_ioport->config = AC97C_RESET; - udelay(10); - au1000->ac97_ioport->config = 0x0; - mdelay(5); - - /* Initialise AC97 middle-layer */ - if ((err = snd_ac97_bus(au1000->card, 0, &ops, au1000, &pbus)) < 0) - return err; - - memset(&ac97, 0, sizeof(ac97)); - ac97.private_data = au1000; - if ((err = snd_ac97_mixer(pbus, &ac97, &au1000->ac97)) < 0) - return err; - - return 0; -} - /*------------------------------ Setup / Destroy ----------------------------*/ -void -snd_au1000_free(struct snd_card *card) +static void snd_au1000_free(struct snd_card *card) { struct snd_au1000 *au1000 = card->private_data; - if (au1000->ac97_res_port) { - /* put internal AC97 block into reset */ - au1000->ac97_ioport->cntrl = AC97C_RS; - au1000->ac97_ioport = NULL; - release_and_free_resource(au1000->ac97_res_port); - } - if (au1000->stream[PLAYBACK]) { if (au1000->stream[PLAYBACK]->dma >= 0) free_au1000_dma(au1000->stream[PLAYBACK]->dma); @@ -626,71 +573,156 @@ snd_au1000_free(struct snd_card *card) free_au1000_dma(au1000->stream[CAPTURE]->dma); kfree(au1000->stream[CAPTURE]); } -} + if (au1000->ac97_res_port) { + /* put internal AC97 block into reset */ + if (au1000->ac97_ioport) { + au1000->ac97_ioport->cntrl = AC97C_RS; + iounmap(au1000->ac97_ioport); + au1000->ac97_ioport = NULL; + } + release_and_free_resource(au1000->ac97_res_port); + au1000->ac97_res_port = NULL; + } +} -static struct snd_card *au1000_card; +static struct snd_ac97_bus_ops ops = { + .write = snd_au1000_ac97_write, + .read = snd_au1000_ac97_read, +}; -static int __init -au1000_init(void) +static int au1000_ac97_probe(struct platform_device *pdev) { int err; + void __iomem *io; + struct resource *r; struct snd_card *card; struct snd_au1000 *au1000; + struct snd_ac97_bus *pbus; + struct snd_ac97_template ac97; - err = snd_card_create(-1, "AC97", THIS_MODULE, - sizeof(struct snd_au1000), &card); + err = snd_card_new(&pdev->dev, -1, "AC97", THIS_MODULE, + sizeof(struct snd_au1000), &card); if (err < 0) return err; - card->private_free = snd_au1000_free; au1000 = card->private_data; au1000->card = card; + spin_lock_init(&au1000->ac97_lock); - au1000->stream[PLAYBACK] = kmalloc(sizeof(struct audio_stream), GFP_KERNEL); - au1000->stream[CAPTURE ] = kmalloc(sizeof(struct audio_stream), GFP_KERNEL); - /* so that snd_au1000_free will work as intended */ - au1000->ac97_res_port = NULL; - if (au1000->stream[PLAYBACK]) - au1000->stream[PLAYBACK]->dma = -1; - if (au1000->stream[CAPTURE ]) - au1000->stream[CAPTURE ]->dma = -1; - - if (au1000->stream[PLAYBACK] == NULL || - au1000->stream[CAPTURE ] == NULL) { - snd_card_free(card); - return -ENOMEM; - } + /* from here on let ALSA call the special freeing function */ + card->private_free = snd_au1000_free; - if ((err = snd_au1000_ac97_new(au1000)) < 0 ) { - snd_card_free(card); - return err; + /* TX DMA ID */ + r = platform_get_resource(pdev, IORESOURCE_DMA, 0); + if (!r) { + err = -ENODEV; + snd_printk(KERN_INFO "no TX DMA platform resource!\n"); + goto out; } - - if ((err = snd_au1000_pcm_new(au1000)) < 0) { - snd_card_free(card); - return err; + au1000->dmaid[0] = r->start; + + /* RX DMA ID */ + r = platform_get_resource(pdev, IORESOURCE_DMA, 1); + if (!r) { + err = -ENODEV; + snd_printk(KERN_INFO "no RX DMA platform resource!\n"); + goto out; + } + au1000->dmaid[1] = r->start; + + au1000->stream[PLAYBACK] = kmalloc(sizeof(struct audio_stream), + GFP_KERNEL); + if (!au1000->stream[PLAYBACK]) + goto out; + au1000->stream[PLAYBACK]->dma = -1; + + au1000->stream[CAPTURE] = kmalloc(sizeof(struct audio_stream), + GFP_KERNEL); + if (!au1000->stream[CAPTURE]) + goto out; + au1000->stream[CAPTURE]->dma = -1; + + r = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!r) + goto out; + + err = -EBUSY; + au1000->ac97_res_port = request_mem_region(r->start, resource_size(r), + pdev->name); + if (!au1000->ac97_res_port) { + snd_printk(KERN_ERR "ALSA AC97: can't grab AC97 port\n"); + goto out; } + io = ioremap(r->start, resource_size(r)); + if (!io) + goto out; + + au1000->ac97_ioport = (struct au1000_ac97_reg *)io; + + /* configure pins for AC'97 + TODO: move to board_setup.c */ + au_writel(au_readl(SYS_PINFUNC) & ~0x02, SYS_PINFUNC); + + /* Initialise Au1000's AC'97 Control Block */ + au1000->ac97_ioport->cntrl = AC97C_RS | AC97C_CE; + udelay(10); + au1000->ac97_ioport->cntrl = AC97C_CE; + udelay(10); + + /* Initialise External CODEC -- cold reset */ + au1000->ac97_ioport->config = AC97C_RESET; + udelay(10); + au1000->ac97_ioport->config = 0x0; + mdelay(5); + + /* Initialise AC97 middle-layer */ + err = snd_ac97_bus(au1000->card, 0, &ops, au1000, &pbus); + if (err < 0) + goto out; + + memset(&ac97, 0, sizeof(ac97)); + ac97.private_data = au1000; + err = snd_ac97_mixer(pbus, &ac97, &au1000->ac97); + if (err < 0) + goto out; + + err = snd_au1000_pcm_new(au1000); + if (err < 0) + goto out; + strcpy(card->driver, "Au1000-AC97"); strcpy(card->shortname, "AMD Au1000-AC97"); sprintf(card->longname, "AMD Au1000--AC97 ALSA Driver"); - if ((err = snd_card_register(card)) < 0) { - snd_card_free(card); - return err; - } + err = snd_card_register(card); + if (err < 0) + goto out; printk(KERN_INFO "ALSA AC97: Driver Initialized\n"); - au1000_card = card; + + platform_set_drvdata(pdev, card); + return 0; + + out: + snd_card_free(card); + return err; } -static void __exit au1000_exit(void) +static int au1000_ac97_remove(struct platform_device *pdev) { - snd_card_free(au1000_card); + return snd_card_free(platform_get_drvdata(pdev)); } -module_init(au1000_init); -module_exit(au1000_exit); +struct platform_driver au1000_ac97c_driver = { + .driver = { + .name = "au1000-ac97c", + .owner = THIS_MODULE, + }, + .probe = au1000_ac97_probe, + .remove = au1000_ac97_remove, +}; +module_platform_driver(au1000_ac97c_driver); diff --git a/sound/mips/hal2.c b/sound/mips/hal2.c index 5f88d1f09ff..23441b9e614 100644 --- a/sound/mips/hal2.c +++ b/sound/mips/hal2.c @@ -260,7 +260,7 @@ static int hal2_gain_put(struct snd_kcontrol *kcontrol, return old != new; } -static struct snd_kcontrol_new hal2_ctrl_headphone __devinitdata = { +static struct snd_kcontrol_new hal2_ctrl_headphone = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Headphone Playback Volume", .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, @@ -270,7 +270,7 @@ static struct snd_kcontrol_new hal2_ctrl_headphone __devinitdata = { .put = hal2_gain_put, }; -static struct snd_kcontrol_new hal2_ctrl_mic __devinitdata = { +static struct snd_kcontrol_new hal2_ctrl_mic = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Mic Capture Volume", .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, @@ -280,7 +280,7 @@ static struct snd_kcontrol_new hal2_ctrl_mic __devinitdata = { .put = hal2_gain_put, }; -static int __devinit hal2_mixer_create(struct snd_hal2 *hal2) +static int hal2_mixer_create(struct snd_hal2 *hal2) { int err; @@ -733,7 +733,7 @@ static struct snd_pcm_ops hal2_capture_ops = { .ack = hal2_capture_ack, }; -static int __devinit hal2_pcm_create(struct snd_hal2 *hal2) +static int hal2_pcm_create(struct snd_hal2 *hal2) { struct snd_pcm *pcm; int err; @@ -874,13 +874,13 @@ static int hal2_create(struct snd_card *card, struct snd_hal2 **rchip) return 0; } -static int __devinit hal2_probe(struct platform_device *pdev) +static int hal2_probe(struct platform_device *pdev) { struct snd_card *card; struct snd_hal2 *chip; int err; - err = snd_card_create(index, id, THIS_MODULE, 0, &card); + err = snd_card_new(&pdev->dev, index, id, THIS_MODULE, 0, &card); if (err < 0) return err; @@ -889,7 +889,6 @@ static int __devinit hal2_probe(struct platform_device *pdev) snd_card_free(card); return err; } - snd_card_set_dev(card, &pdev->dev); err = hal2_pcm_create(chip); if (err < 0) { @@ -917,18 +916,17 @@ static int __devinit hal2_probe(struct platform_device *pdev) return 0; } -static int __devexit hal2_remove(struct platform_device *pdev) +static int hal2_remove(struct platform_device *pdev) { struct snd_card *card = platform_get_drvdata(pdev); snd_card_free(card); - platform_set_drvdata(pdev, NULL); return 0; } static struct platform_driver hal2_driver = { .probe = hal2_probe, - .remove = __devexit_p(hal2_remove), + .remove = hal2_remove, .driver = { .name = "sgihal2", .owner = THIS_MODULE, diff --git a/sound/mips/sgio2audio.c b/sound/mips/sgio2audio.c index ceaa593ea4e..04bb06c03ec 100644 --- a/sound/mips/sgio2audio.c +++ b/sound/mips/sgio2audio.c @@ -237,7 +237,7 @@ static int sgio2audio_source_put(struct snd_kcontrol *kcontrol, } /* dac1/pcm0 mixer control */ -static struct snd_kcontrol_new sgio2audio_ctrl_pcm0 __devinitdata = { +static struct snd_kcontrol_new sgio2audio_ctrl_pcm0 = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "PCM Playback Volume", .index = 0, @@ -249,7 +249,7 @@ static struct snd_kcontrol_new sgio2audio_ctrl_pcm0 __devinitdata = { }; /* dac2/pcm1 mixer control */ -static struct snd_kcontrol_new sgio2audio_ctrl_pcm1 __devinitdata = { +static struct snd_kcontrol_new sgio2audio_ctrl_pcm1 = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "PCM Playback Volume", .index = 1, @@ -261,7 +261,7 @@ static struct snd_kcontrol_new sgio2audio_ctrl_pcm1 __devinitdata = { }; /* record level mixer control */ -static struct snd_kcontrol_new sgio2audio_ctrl_reclevel __devinitdata = { +static struct snd_kcontrol_new sgio2audio_ctrl_reclevel = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Capture Volume", .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, @@ -272,7 +272,7 @@ static struct snd_kcontrol_new sgio2audio_ctrl_reclevel __devinitdata = { }; /* record level source control */ -static struct snd_kcontrol_new sgio2audio_ctrl_recsource __devinitdata = { +static struct snd_kcontrol_new sgio2audio_ctrl_recsource = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Capture Source", .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, @@ -282,7 +282,7 @@ static struct snd_kcontrol_new sgio2audio_ctrl_recsource __devinitdata = { }; /* line mixer control */ -static struct snd_kcontrol_new sgio2audio_ctrl_line __devinitdata = { +static struct snd_kcontrol_new sgio2audio_ctrl_line = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Line Playback Volume", .index = 0, @@ -294,7 +294,7 @@ static struct snd_kcontrol_new sgio2audio_ctrl_line __devinitdata = { }; /* cd mixer control */ -static struct snd_kcontrol_new sgio2audio_ctrl_cd __devinitdata = { +static struct snd_kcontrol_new sgio2audio_ctrl_cd = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Line Playback Volume", .index = 1, @@ -306,7 +306,7 @@ static struct snd_kcontrol_new sgio2audio_ctrl_cd __devinitdata = { }; /* mic mixer control */ -static struct snd_kcontrol_new sgio2audio_ctrl_mic __devinitdata = { +static struct snd_kcontrol_new sgio2audio_ctrl_mic = { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = "Mic Playback Volume", .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, @@ -317,7 +317,7 @@ static struct snd_kcontrol_new sgio2audio_ctrl_mic __devinitdata = { }; -static int __devinit snd_sgio2audio_new_mixer(struct snd_sgio2audio *chip) +static int snd_sgio2audio_new_mixer(struct snd_sgio2audio *chip) { int err; @@ -726,7 +726,7 @@ static struct snd_pcm_ops snd_sgio2audio_capture_ops = { */ /* create a pcm device */ -static int __devinit snd_sgio2audio_new_pcm(struct snd_sgio2audio *chip) +static int snd_sgio2audio_new_pcm(struct snd_sgio2audio *chip) { struct snd_pcm *pcm; int err; @@ -834,8 +834,8 @@ static struct snd_device_ops ops = { .dev_free = snd_sgio2audio_dev_free, }; -static int __devinit snd_sgio2audio_create(struct snd_card *card, - struct snd_sgio2audio **rchip) +static int snd_sgio2audio_create(struct snd_card *card, + struct snd_sgio2audio **rchip) { struct snd_sgio2audio *chip; int i, err; @@ -914,13 +914,13 @@ static int __devinit snd_sgio2audio_create(struct snd_card *card, return 0; } -static int __devinit snd_sgio2audio_probe(struct platform_device *pdev) +static int snd_sgio2audio_probe(struct platform_device *pdev) { struct snd_card *card; struct snd_sgio2audio *chip; int err; - err = snd_card_create(index, id, THIS_MODULE, 0, &card); + err = snd_card_new(&pdev->dev, index, id, THIS_MODULE, 0, &card); if (err < 0) return err; @@ -929,7 +929,6 @@ static int __devinit snd_sgio2audio_probe(struct platform_device *pdev) snd_card_free(card); return err; } - snd_card_set_dev(card, &pdev->dev); err = snd_sgio2audio_new_pcm(chip); if (err < 0) { @@ -958,18 +957,17 @@ static int __devinit snd_sgio2audio_probe(struct platform_device *pdev) return 0; } -static int __devexit snd_sgio2audio_remove(struct platform_device *pdev) +static int snd_sgio2audio_remove(struct platform_device *pdev) { struct snd_card *card = platform_get_drvdata(pdev); snd_card_free(card); - platform_set_drvdata(pdev, NULL); return 0; } static struct platform_driver sgio2audio_driver = { .probe = snd_sgio2audio_probe, - .remove = __devexit_p(snd_sgio2audio_remove), + .remove = snd_sgio2audio_remove, .driver = { .name = "sgio2audio", .owner = THIS_MODULE, |
