diff options
Diffstat (limited to 'sound/atmel')
| -rw-r--r-- | sound/atmel/abdac.c | 67 | ||||
| -rw-r--r-- | sound/atmel/ac97c.c | 117 |
2 files changed, 99 insertions, 85 deletions
diff --git a/sound/atmel/abdac.c b/sound/atmel/abdac.c index 4fa1dbd8ee8..edf2ca72d51 100644 --- a/sound/atmel/abdac.c +++ b/sound/atmel/abdac.c @@ -16,6 +16,7 @@ #include <linux/interrupt.h> #include <linux/module.h> #include <linux/platform_device.h> +#include <linux/types.h> #include <linux/io.h> #include <sound/core.h> @@ -308,7 +309,7 @@ static struct snd_pcm_ops atmel_abdac_ops = { .pointer = atmel_abdac_pointer, }; -static int __devinit atmel_abdac_pcm_new(struct atmel_abdac *dac) +static int atmel_abdac_pcm_new(struct atmel_abdac *dac) { struct snd_pcm_hardware hw = atmel_abdac_hw; struct snd_pcm *pcm; @@ -353,10 +354,11 @@ static int set_sample_rates(struct atmel_abdac *dac) /* we start at 192 kHz and work our way down to 5112 Hz */ while (new_rate >= RATE_MIN && index < (MAX_NUM_RATES + 1)) { new_rate = clk_round_rate(dac->sample_clk, 256 * new_rate); - if (new_rate < 0) + if (new_rate <= 0) break; /* make sure we are below the ABDAC clock */ - if (new_rate <= clk_get_rate(dac->pclk)) { + if (index < MAX_NUM_RATES && + new_rate <= clk_get_rate(dac->pclk)) { dac->rates[index] = new_rate / 256; index++; } @@ -385,7 +387,7 @@ static int set_sample_rates(struct atmel_abdac *dac) return retval; } -static int __devinit atmel_abdac_probe(struct platform_device *pdev) +static int atmel_abdac_probe(struct platform_device *pdev) { struct snd_card *card; struct atmel_abdac *dac; @@ -427,8 +429,9 @@ static int __devinit atmel_abdac_probe(struct platform_device *pdev) } clk_enable(pclk); - retval = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, - THIS_MODULE, sizeof(struct atmel_abdac), &card); + retval = snd_card_new(&pdev->dev, SNDRV_DEFAULT_IDX1, + SNDRV_DEFAULT_STR1, THIS_MODULE, + sizeof(struct atmel_abdac), &card); if (retval) { dev_dbg(&pdev->dev, "could not create sound card device\n"); goto out_put_sample_clk; @@ -451,6 +454,7 @@ static int __devinit atmel_abdac_probe(struct platform_device *pdev) dac->regs = ioremap(regs->start, resource_size(regs)); if (!dac->regs) { dev_dbg(&pdev->dev, "could not remap register memory\n"); + retval = -ENOMEM; goto out_free_card; } @@ -464,23 +468,30 @@ static int __devinit atmel_abdac_probe(struct platform_device *pdev) goto out_unmap_regs; } - snd_card_set_dev(card, &pdev->dev); - if (pdata->dws.dma_dev) { - struct dw_dma_slave *dws = &pdata->dws; dma_cap_mask_t mask; - dws->tx_reg = regs->start + DAC_DATA; - dma_cap_zero(mask); dma_cap_set(DMA_SLAVE, mask); - dac->dma.chan = dma_request_channel(mask, filter, dws); + dac->dma.chan = dma_request_channel(mask, filter, &pdata->dws); + if (dac->dma.chan) { + struct dma_slave_config dma_conf = { + .dst_addr = regs->start + DAC_DATA, + .dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES, + .src_maxburst = 1, + .dst_maxburst = 1, + .direction = DMA_MEM_TO_DEV, + .device_fc = false, + }; + + dmaengine_slave_config(dac->dma.chan, &dma_conf); + } } if (!pdata->dws.dma_dev || !dac->dma.chan) { dev_dbg(&pdev->dev, "DMA not available\n"); retval = -ENODEV; - goto out_unset_card_dev; + goto out_unmap_regs; } strcpy(card->driver, "Atmel ABDAC"); @@ -509,9 +520,6 @@ static int __devinit atmel_abdac_probe(struct platform_device *pdev) out_release_dma: dma_release_channel(dac->dma.chan); dac->dma.chan = NULL; -out_unset_card_dev: - snd_card_set_dev(card, NULL); - free_irq(irq, dac); out_unmap_regs: iounmap(dac->regs); out_free_card: @@ -524,10 +532,10 @@ out_put_pclk: return retval; } -#ifdef CONFIG_PM -static int atmel_abdac_suspend(struct platform_device *pdev, pm_message_t msg) +#ifdef CONFIG_PM_SLEEP +static int atmel_abdac_suspend(struct device *pdev) { - struct snd_card *card = platform_get_drvdata(pdev); + struct snd_card *card = dev_get_drvdata(pdev); struct atmel_abdac *dac = card->private_data; dw_dma_cyclic_stop(dac->dma.chan); @@ -537,9 +545,9 @@ static int atmel_abdac_suspend(struct platform_device *pdev, pm_message_t msg) return 0; } -static int atmel_abdac_resume(struct platform_device *pdev) +static int atmel_abdac_resume(struct device *pdev) { - struct snd_card *card = platform_get_drvdata(pdev); + struct snd_card *card = dev_get_drvdata(pdev); struct atmel_abdac *dac = card->private_data; clk_enable(dac->pclk); @@ -549,12 +557,14 @@ static int atmel_abdac_resume(struct platform_device *pdev) return 0; } + +static SIMPLE_DEV_PM_OPS(atmel_abdac_pm, atmel_abdac_suspend, atmel_abdac_resume); +#define ATMEL_ABDAC_PM_OPS &atmel_abdac_pm #else -#define atmel_abdac_suspend NULL -#define atmel_abdac_resume NULL +#define ATMEL_ABDAC_PM_OPS NULL #endif -static int __devexit atmel_abdac_remove(struct platform_device *pdev) +static int atmel_abdac_remove(struct platform_device *pdev) { struct snd_card *card = platform_get_drvdata(pdev); struct atmel_abdac *dac = get_dac(card); @@ -565,23 +575,20 @@ static int __devexit atmel_abdac_remove(struct platform_device *pdev) dma_release_channel(dac->dma.chan); dac->dma.chan = NULL; - snd_card_set_dev(card, NULL); iounmap(dac->regs); free_irq(dac->irq, dac); snd_card_free(card); - platform_set_drvdata(pdev, NULL); - return 0; } static struct platform_driver atmel_abdac_driver = { - .remove = __devexit_p(atmel_abdac_remove), + .remove = atmel_abdac_remove, .driver = { .name = "atmel_abdac", + .owner = THIS_MODULE, + .pm = ATMEL_ABDAC_PM_OPS, }, - .suspend = atmel_abdac_suspend, - .resume = atmel_abdac_resume, }; static int __init atmel_abdac_init(void) diff --git a/sound/atmel/ac97c.c b/sound/atmel/ac97c.c index 61dade69835..a04d23174dc 100644 --- a/sound/atmel/ac97c.c +++ b/sound/atmel/ac97c.c @@ -20,6 +20,7 @@ #include <linux/platform_device.h> #include <linux/mutex.h> #include <linux/gpio.h> +#include <linux/types.h> #include <linux/io.h> #include <sound/core.h> @@ -33,7 +34,6 @@ #include <linux/dw_dmac.h> #include <mach/cpu.h> -#include <mach/gpio.h> #ifdef CONFIG_ARCH_AT91 #include <mach/hardware.h> @@ -181,7 +181,7 @@ static int atmel_ac97c_playback_open(struct snd_pcm_substream *substream) runtime->hw.rate_max = chip->cur_rate; } if (chip->cur_format) - runtime->hw.formats = (1ULL << chip->cur_format); + runtime->hw.formats = pcm_format_to_bits(chip->cur_format); mutex_unlock(&opened_mutex); chip->playback_substream = substream; return 0; @@ -200,7 +200,7 @@ static int atmel_ac97c_capture_open(struct snd_pcm_substream *substream) runtime->hw.rate_max = chip->cur_rate; } if (chip->cur_format) - runtime->hw.formats = (1ULL << chip->cur_format); + runtime->hw.formats = pcm_format_to_bits(chip->cur_format); mutex_unlock(&opened_mutex); chip->capture_substream = substream; return 0; @@ -277,14 +277,9 @@ static int atmel_ac97c_capture_hw_params(struct snd_pcm_substream *substream, if (retval < 0) return retval; /* snd_pcm_lib_malloc_pages returns 1 if buffer is changed. */ - if (cpu_is_at32ap7000()) { - if (retval < 0) - return retval; - /* snd_pcm_lib_malloc_pages returns 1 if buffer is changed. */ - if (retval == 1) - if (test_and_clear_bit(DMA_RX_READY, &chip->flags)) - dw_dma_cyclic_free(chip->dma.rx_chan); - } + if (cpu_is_at32ap7000() && retval == 1) + if (test_and_clear_bit(DMA_RX_READY, &chip->flags)) + dw_dma_cyclic_free(chip->dma.rx_chan); /* Set restrictions to params. */ mutex_lock(&opened_mutex); @@ -732,7 +727,7 @@ static irqreturn_t atmel_ac97c_interrupt(int irq, void *dev) return retval; } -static struct ac97_pcm at91_ac97_pcm_defs[] __devinitdata = { +static struct ac97_pcm at91_ac97_pcm_defs[] = { /* Playback */ { .exclusive = 1, @@ -760,7 +755,7 @@ static struct ac97_pcm at91_ac97_pcm_defs[] __devinitdata = { }, }; -static int __devinit atmel_ac97c_pcm_new(struct atmel_ac97c *chip) +static int atmel_ac97c_pcm_new(struct atmel_ac97c *chip) { struct snd_pcm *pcm; struct snd_pcm_hardware hw = atmel_ac97c_hw; @@ -906,7 +901,7 @@ static void atmel_ac97c_reset(struct atmel_ac97c *chip) } } -static int __devinit atmel_ac97c_probe(struct platform_device *pdev) +static int atmel_ac97c_probe(struct platform_device *pdev) { struct snd_card *card; struct atmel_ac97c *chip; @@ -950,8 +945,9 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev) } clk_enable(pclk); - retval = snd_card_create(SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1, - THIS_MODULE, sizeof(struct atmel_ac97c), &card); + retval = snd_card_new(&pdev->dev, SNDRV_DEFAULT_IDX1, + SNDRV_DEFAULT_STR1, THIS_MODULE, + sizeof(struct atmel_ac97c), &card); if (retval) { dev_dbg(&pdev->dev, "could not create sound card device\n"); goto err_snd_card_new; @@ -979,6 +975,7 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev) if (!chip->regs) { dev_dbg(&pdev->dev, "could not remap register memory\n"); + retval = -ENOMEM; goto err_ioremap; } @@ -990,10 +987,10 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev) gpio_direction_output(pdata->reset_pin, 1); chip->reset_pin = pdata->reset_pin; } + } else { + chip->reset_pin = -EINVAL; } - snd_card_set_dev(card, &pdev->dev); - atmel_ac97c_reset(chip); /* Enable overrun interrupt from codec channel */ @@ -1014,16 +1011,28 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev) if (cpu_is_at32ap7000()) { if (pdata->rx_dws.dma_dev) { - struct dw_dma_slave *dws = &pdata->rx_dws; dma_cap_mask_t mask; - dws->rx_reg = regs->start + AC97C_CARHR + 2; - dma_cap_zero(mask); dma_cap_set(DMA_SLAVE, mask); chip->dma.rx_chan = dma_request_channel(mask, filter, - dws); + &pdata->rx_dws); + if (chip->dma.rx_chan) { + struct dma_slave_config dma_conf = { + .src_addr = regs->start + AC97C_CARHR + + 2, + .src_addr_width = + DMA_SLAVE_BUSWIDTH_2_BYTES, + .src_maxburst = 1, + .dst_maxburst = 1, + .direction = DMA_DEV_TO_MEM, + .device_fc = false, + }; + + dmaengine_slave_config(chip->dma.rx_chan, + &dma_conf); + } dev_info(&chip->pdev->dev, "using %s for DMA RX\n", dev_name(&chip->dma.rx_chan->dev->device)); @@ -1031,16 +1040,28 @@ static int __devinit atmel_ac97c_probe(struct platform_device *pdev) } if (pdata->tx_dws.dma_dev) { - struct dw_dma_slave *dws = &pdata->tx_dws; dma_cap_mask_t mask; - dws->tx_reg = regs->start + AC97C_CATHR + 2; - dma_cap_zero(mask); dma_cap_set(DMA_SLAVE, mask); chip->dma.tx_chan = dma_request_channel(mask, filter, - dws); + &pdata->tx_dws); + if (chip->dma.tx_chan) { + struct dma_slave_config dma_conf = { + .dst_addr = regs->start + AC97C_CATHR + + 2, + .dst_addr_width = + DMA_SLAVE_BUSWIDTH_2_BYTES, + .src_maxburst = 1, + .dst_maxburst = 1, + .direction = DMA_MEM_TO_DEV, + .device_fc = false, + }; + + dmaengine_slave_config(chip->dma.tx_chan, + &dma_conf); + } dev_info(&chip->pdev->dev, "using %s for DMA TX\n", dev_name(&chip->dma.tx_chan->dev->device)); @@ -1091,8 +1112,6 @@ err_dma: chip->dma.tx_chan = NULL; } err_ac97_bus: - snd_card_set_dev(card, NULL); - if (gpio_is_valid(chip->reset_pin)) gpio_free(chip->reset_pin); @@ -1107,10 +1126,10 @@ err_snd_card_new: return retval; } -#ifdef CONFIG_PM -static int atmel_ac97c_suspend(struct platform_device *pdev, pm_message_t msg) +#ifdef CONFIG_PM_SLEEP +static int atmel_ac97c_suspend(struct device *pdev) { - struct snd_card *card = platform_get_drvdata(pdev); + struct snd_card *card = dev_get_drvdata(pdev); struct atmel_ac97c *chip = card->private_data; if (cpu_is_at32ap7000()) { @@ -1124,9 +1143,9 @@ static int atmel_ac97c_suspend(struct platform_device *pdev, pm_message_t msg) return 0; } -static int atmel_ac97c_resume(struct platform_device *pdev) +static int atmel_ac97c_resume(struct device *pdev) { - struct snd_card *card = platform_get_drvdata(pdev); + struct snd_card *card = dev_get_drvdata(pdev); struct atmel_ac97c *chip = card->private_data; clk_enable(chip->pclk); @@ -1138,12 +1157,14 @@ static int atmel_ac97c_resume(struct platform_device *pdev) } return 0; } + +static SIMPLE_DEV_PM_OPS(atmel_ac97c_pm, atmel_ac97c_suspend, atmel_ac97c_resume); +#define ATMEL_AC97C_PM_OPS &atmel_ac97c_pm #else -#define atmel_ac97c_suspend NULL -#define atmel_ac97c_resume NULL +#define ATMEL_AC97C_PM_OPS NULL #endif -static int __devexit atmel_ac97c_remove(struct platform_device *pdev) +static int atmel_ac97c_remove(struct platform_device *pdev) { struct snd_card *card = platform_get_drvdata(pdev); struct atmel_ac97c *chip = get_chip(card); @@ -1171,35 +1192,21 @@ static int __devexit atmel_ac97c_remove(struct platform_device *pdev) chip->dma.tx_chan = NULL; } - snd_card_set_dev(card, NULL); snd_card_free(card); - platform_set_drvdata(pdev, NULL); - return 0; } static struct platform_driver atmel_ac97c_driver = { - .remove = __devexit_p(atmel_ac97c_remove), + .probe = atmel_ac97c_probe, + .remove = atmel_ac97c_remove, .driver = { .name = "atmel_ac97c", + .owner = THIS_MODULE, + .pm = ATMEL_AC97C_PM_OPS, }, - .suspend = atmel_ac97c_suspend, - .resume = atmel_ac97c_resume, }; - -static int __init atmel_ac97c_init(void) -{ - return platform_driver_probe(&atmel_ac97c_driver, - atmel_ac97c_probe); -} -module_init(atmel_ac97c_init); - -static void __exit atmel_ac97c_exit(void) -{ - platform_driver_unregister(&atmel_ac97c_driver); -} -module_exit(atmel_ac97c_exit); +module_platform_driver(atmel_ac97c_driver); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Driver for Atmel AC97 controller"); |
