diff options
Diffstat (limited to 'sound/mips')
| -rw-r--r-- | sound/mips/Kconfig | 7 | ||||
| -rw-r--r-- | sound/mips/ad1843.c | 2 | ||||
| -rw-r--r-- | sound/mips/au1x00.c | 237 | ||||
| -rw-r--r-- | sound/mips/hal2.c | 32 | ||||
| -rw-r--r-- | sound/mips/sgio2audio.c | 46 | 
5 files changed, 168 insertions, 156 deletions
diff --git a/sound/mips/Kconfig b/sound/mips/Kconfig index a9823fad85c..d2f615ab177 100644 --- a/sound/mips/Kconfig +++ b/sound/mips/Kconfig @@ -23,12 +23,15 @@ config SND_SGI_HAL2  config SND_AU1X00 -	tristate "Au1x00 AC97 Port Driver" -	depends on SOC_AU1000 || SOC_AU1100 || SOC_AU1500 +	tristate "Au1x00 AC97 Port Driver (DEPRECATED)" +	depends on MIPS_ALCHEMY  	select SND_PCM  	select SND_AC97_CODEC  	help  	  ALSA Sound driver for the Au1x00's AC97 port. +	  Newer drivers for ASoC are available, please do not use +	  this driver as it will be removed in the future. +  endif	# SND_MIPS 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 446cf974866..fbcaa5434fd 100644 --- a/sound/mips/au1x00.c +++ b/sound/mips/au1x00.c @@ -37,7 +37,9 @@  #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>  #include <sound/initval.h>  #include <sound/pcm.h> @@ -97,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 --------------------------------*/ @@ -438,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; @@ -464,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, -			"AC97 TX", au1000_dma_interrupt, IRQF_DISABLED, -			au1000->stream[PLAYBACK])) < 0) { +	au1000->stream[PLAYBACK]->dma = request_au1000_dma(au1000->dmaid[0], +			"AC97 TX", au1000_dma_interrupt, 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, -			"AC97 RX", au1000_dma_interrupt, IRQF_DISABLED, -			au1000->stream[CAPTURE])) < 0){ +	au1000->stream[CAPTURE]->dma = request_au1000_dma(au1000->dmaid[1], +			"AC97 RX", au1000_dma_interrupt, 0, +			au1000->stream[CAPTURE]); +	if (au1000->stream[CAPTURE]->dma < 0){  		release_dma_lock(flags);  		return -EBUSY;  	} @@ -551,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); @@ -625,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 453d343550a..23441b9e614 100644 --- a/sound/mips/hal2.c +++ b/sound/mips/hal2.c @@ -26,6 +26,7 @@  #include <linux/platform_device.h>  #include <linux/io.h>  #include <linux/slab.h> +#include <linux/module.h>  #include <asm/sgi/hpc3.h>  #include <asm/sgi/ip22.h> @@ -259,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, @@ -269,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, @@ -279,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; @@ -732,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; @@ -873,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; @@ -888,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) { @@ -916,33 +916,21 @@ 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,  	}  }; -static int __init alsa_card_hal2_init(void) -{ -	return platform_driver_register(&hal2_driver); -} - -static void __exit alsa_card_hal2_exit(void) -{ -	platform_driver_unregister(&hal2_driver); -} - -module_init(alsa_card_hal2_init); -module_exit(alsa_card_hal2_exit); +module_platform_driver(hal2_driver); diff --git a/sound/mips/sgio2audio.c b/sound/mips/sgio2audio.c index 717604c00f0..04bb06c03ec 100644 --- a/sound/mips/sgio2audio.c +++ b/sound/mips/sgio2audio.c @@ -30,6 +30,7 @@  #include <linux/platform_device.h>  #include <linux/io.h>  #include <linux/slab.h> +#include <linux/module.h>  #include <asm/ip32/ip32_ints.h>  #include <asm/ip32/mace.h> @@ -236,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, @@ -248,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, @@ -260,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, @@ -271,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, @@ -281,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, @@ -293,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, @@ -305,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, @@ -316,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; @@ -725,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; @@ -833,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; @@ -913,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; @@ -928,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) { @@ -957,33 +957,21 @@ 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,  	}  }; -static int __init alsa_card_sgio2audio_init(void) -{ -	return platform_driver_register(&sgio2audio_driver); -} - -static void __exit alsa_card_sgio2audio_exit(void) -{ -	platform_driver_unregister(&sgio2audio_driver); -} - -module_init(alsa_card_sgio2audio_init) -module_exit(alsa_card_sgio2audio_exit) +module_platform_driver(sgio2audio_driver);  | 
