[PATCH v2 39/79] ALSA: korg1212: Allocate resources with device-managed APIs
Nathan Chancellor
nathan at kernel.org
Tue Jul 20 21:41:51 CEST 2021
On Thu, Jul 15, 2021 at 09:59:01AM +0200, Takashi Iwai wrote:
> This patch converts the resource management in PCI korg1212 driver
> with devres as a clean up. Each manual resource management is
> converted with the corresponding devres helper, the page allocations
> are done with the devres helper, and the card object release is
> managed now via card->private_free instead of a lowlevel snd_device.
>
> This should give no user-visible functional changes.
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
> sound/pci/korg1212/korg1212.c | 211 +++++++++-------------------------
> 1 file changed, 55 insertions(+), 156 deletions(-)
>
> diff --git a/sound/pci/korg1212/korg1212.c b/sound/pci/korg1212/korg1212.c
> index 030e01b062e4..7872abbd4587 100644
> --- a/sound/pci/korg1212/korg1212.c
> +++ b/sound/pci/korg1212/korg1212.c
> @@ -320,10 +320,10 @@ struct snd_korg1212 {
> unsigned long inIRQ;
> void __iomem *iobase;
>
> - struct snd_dma_buffer dma_dsp;
> - struct snd_dma_buffer dma_play;
> - struct snd_dma_buffer dma_rec;
> - struct snd_dma_buffer dma_shared;
> + struct snd_dma_buffer *dma_dsp;
> + struct snd_dma_buffer *dma_play;
> + struct snd_dma_buffer *dma_rec;
> + struct snd_dma_buffer *dma_shared;
>
> u32 DataBufsSize;
>
> @@ -1200,8 +1200,8 @@ static int snd_korg1212_downloadDSPCode(struct snd_korg1212 *korg1212)
> snd_korg1212_setCardState(korg1212, K1212_STATE_DSP_IN_PROCESS);
>
> rc = snd_korg1212_Send1212Command(korg1212, K1212_DB_StartDSPDownload,
> - UpperWordSwap(korg1212->dma_dsp.addr),
> - 0, 0, 0);
> + UpperWordSwap(korg1212->dma_dsp->addr),
> + 0, 0, 0);
> if (rc)
> K1212_DEBUG_PRINTK("K1212_DEBUG: Start DSP Download RC = %d [%s]\n",
> rc, stateName[korg1212->cardState]);
> @@ -1382,7 +1382,7 @@ static int snd_korg1212_playback_open(struct snd_pcm_substream *substream)
> snd_korg1212_OpenCard(korg1212);
>
> runtime->hw = snd_korg1212_playback_info;
> - snd_pcm_set_runtime_buffer(substream, &korg1212->dma_play);
> + snd_pcm_set_runtime_buffer(substream, korg1212->dma_play);
>
> spin_lock_irqsave(&korg1212->lock, flags);
>
> @@ -1413,7 +1413,7 @@ static int snd_korg1212_capture_open(struct snd_pcm_substream *substream)
> snd_korg1212_OpenCard(korg1212);
>
> runtime->hw = snd_korg1212_capture_info;
> - snd_pcm_set_runtime_buffer(substream, &korg1212->dma_rec);
> + snd_pcm_set_runtime_buffer(substream, korg1212->dma_rec);
>
> spin_lock_irqsave(&korg1212->lock, flags);
>
> @@ -2080,71 +2080,16 @@ static void snd_korg1212_proc_init(struct snd_korg1212 *korg1212)
> snd_korg1212_proc_read);
> }
>
> -static int
> -snd_korg1212_free(struct snd_korg1212 *korg1212)
> +static void
> +snd_korg1212_free(struct snd_card *card)
> {
> - snd_korg1212_TurnOffIdleMonitor(korg1212);
> -
> - if (korg1212->irq >= 0) {
> - snd_korg1212_DisableCardInterrupts(korg1212);
> - free_irq(korg1212->irq, korg1212);
> - korg1212->irq = -1;
> - }
> -
> - if (korg1212->iobase != NULL) {
> - iounmap(korg1212->iobase);
> - korg1212->iobase = NULL;
> - }
> -
> - pci_release_regions(korg1212->pci);
> -
> - // ----------------------------------------------------
> - // free up memory resources used for the DSP download.
> - // ----------------------------------------------------
> - if (korg1212->dma_dsp.area) {
> - snd_dma_free_pages(&korg1212->dma_dsp);
> - korg1212->dma_dsp.area = NULL;
> - }
> -
> -#ifndef K1212_LARGEALLOC
> -
> - // ------------------------------------------------------
> - // free up memory resources used for the Play/Rec Buffers
> - // ------------------------------------------------------
> - if (korg1212->dma_play.area) {
> - snd_dma_free_pages(&korg1212->dma_play);
> - korg1212->dma_play.area = NULL;
> - }
> + struct snd_korg1212 *korg1212 = card->private_data;
>
> - if (korg1212->dma_rec.area) {
> - snd_dma_free_pages(&korg1212->dma_rec);
> - korg1212->dma_rec.area = NULL;
> - }
> -
> -#endif
> -
> - // ----------------------------------------------------
> - // free up memory resources used for the Shared Buffers
> - // ----------------------------------------------------
> - if (korg1212->dma_shared.area) {
> - snd_dma_free_pages(&korg1212->dma_shared);
> - korg1212->dma_shared.area = NULL;
> - }
> -
> - pci_disable_device(korg1212->pci);
> - kfree(korg1212);
> - return 0;
> -}
> -
> -static int snd_korg1212_dev_free(struct snd_device *device)
> -{
> - struct snd_korg1212 *korg1212 = device->device_data;
> - K1212_DEBUG_PRINTK("K1212_DEBUG: Freeing device\n");
> - return snd_korg1212_free(korg1212);
> + snd_korg1212_TurnOffIdleMonitor(korg1212);
> + snd_korg1212_DisableCardInterrupts(korg1212);
> }
>
> -static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci,
> - struct snd_korg1212 **rchip)
> +static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci)
>
> {
> int err, rc;
> @@ -2152,24 +2097,13 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci,
> unsigned iomem_size;
> __maybe_unused unsigned ioport_size;
> __maybe_unused unsigned iomem2_size;
> - struct snd_korg1212 * korg1212;
> + struct snd_korg1212 *korg1212 = card->private_data;
> const struct firmware *dsp_code;
>
> - static const struct snd_device_ops ops = {
> - .dev_free = snd_korg1212_dev_free,
> - };
> -
> - * rchip = NULL;
> - err = pci_enable_device(pci);
> + err = pcim_enable_device(pci);
> if (err < 0)
> return err;
>
> - korg1212 = kzalloc(sizeof(*korg1212), GFP_KERNEL);
> - if (korg1212 == NULL) {
> - pci_disable_device(pci);
> - return -ENOMEM;
> - }
> -
> korg1212->card = card;
> korg1212->pci = pci;
>
> @@ -2198,12 +2132,9 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci,
> for (i=0; i<kAudioChannels; i++)
> korg1212->volumePhase[i] = 0;
>
> - err = pci_request_regions(pci, "korg1212");
> - if (err < 0) {
> - kfree(korg1212);
> - pci_disable_device(pci);
> + err = pcim_iomap_regions_request_all(pci, 1 << 0, "korg1212");
> + if (err < 0)
> return err;
> - }
>
> korg1212->iomem = pci_resource_start(korg1212->pci, 0);
> korg1212->ioport = pci_resource_start(korg1212->pci, 1);
> @@ -2223,26 +2154,20 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci,
> korg1212->iomem2, iomem2_size,
> stateName[korg1212->cardState]);
>
> - korg1212->iobase = ioremap(korg1212->iomem, iomem_size);
> - if (!korg1212->iobase) {
> - snd_printk(KERN_ERR "korg1212: unable to remap memory region 0x%lx-0x%lx\n", korg1212->iomem,
> - korg1212->iomem + iomem_size - 1);
> - snd_korg1212_free(korg1212);
> - return -EBUSY;
> - }
> + korg1212->iobase = pcim_iomap_table(pci)[0];
>
> - err = request_irq(pci->irq, snd_korg1212_interrupt,
> + err = devm_request_irq(&pci->dev, pci->irq, snd_korg1212_interrupt,
> IRQF_SHARED,
> KBUILD_MODNAME, korg1212);
>
> if (err) {
> snd_printk(KERN_ERR "korg1212: unable to grab IRQ %d\n", pci->irq);
> - snd_korg1212_free(korg1212);
> return -EBUSY;
> }
>
> korg1212->irq = pci->irq;
> card->sync_irq = korg1212->irq;
> + card->private_free = snd_korg1212_free;
>
> pci_set_master(korg1212->pci);
>
> @@ -2281,41 +2206,36 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci,
> korg1212->idRegPtr,
> stateName[korg1212->cardState]);
>
> - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev,
> - sizeof(struct KorgSharedBuffer), &korg1212->dma_shared) < 0) {
> - snd_printk(KERN_ERR "korg1212: can not allocate shared buffer memory (%zd bytes)\n", sizeof(struct KorgSharedBuffer));
> - snd_korg1212_free(korg1212);
> - return -ENOMEM;
> - }
> - korg1212->sharedBufferPtr = (struct KorgSharedBuffer *)korg1212->dma_shared.area;
> - korg1212->sharedBufferPhy = korg1212->dma_shared.addr;
> + korg1212->dma_shared = snd_devm_alloc_pages(&pci->dev,
> + SNDRV_DMA_TYPE_DEV,
> + sizeof(struct KorgSharedBuffer));
> + if (!korg1212->dma_shared)
> + return -ENOMEM;
> + korg1212->sharedBufferPtr = (struct KorgSharedBuffer *)korg1212->dma_shared->area;
> + korg1212->sharedBufferPhy = korg1212->dma_shared->addr;
>
> K1212_DEBUG_PRINTK("K1212_DEBUG: Shared Buffer Area = 0x%p (0x%08lx), %d bytes\n", korg1212->sharedBufferPtr, korg1212->sharedBufferPhy, sizeof(struct KorgSharedBuffer));
>
> #ifndef K1212_LARGEALLOC
> -
> korg1212->DataBufsSize = sizeof(struct KorgAudioBuffer) * kNumBuffers;
> + korg1212->dma_play = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV,
> + korg1212->DataBufsSize);
> + if (!korg1212->dma_play)
> + return -ENOMEM;
>
> - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev,
> - korg1212->DataBufsSize, &korg1212->dma_play) < 0) {
> - snd_printk(KERN_ERR "korg1212: can not allocate play data buffer memory (%d bytes)\n", korg1212->DataBufsSize);
> - snd_korg1212_free(korg1212);
> - return -ENOMEM;
> - }
> - korg1212->playDataBufsPtr = (struct KorgAudioBuffer *)korg1212->dma_play.area;
> - korg1212->PlayDataPhy = korg1212->dma_play.addr;
> + korg1212->playDataBufsPtr = (struct KorgAudioBuffer *)korg1212->dma_play->area;
> + korg1212->PlayDataPhy = korg1212->dma_play->addr;
>
> K1212_DEBUG_PRINTK("K1212_DEBUG: Play Data Area = 0x%p (0x%08x), %d bytes\n",
> korg1212->playDataBufsPtr, korg1212->PlayDataPhy, korg1212->DataBufsSize);
>
> - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev,
> - korg1212->DataBufsSize, &korg1212->dma_rec) < 0) {
> - snd_printk(KERN_ERR "korg1212: can not allocate record data buffer memory (%d bytes)\n", korg1212->DataBufsSize);
> - snd_korg1212_free(korg1212);
> - return -ENOMEM;
> - }
> - korg1212->recordDataBufsPtr = (struct KorgAudioBuffer *)korg1212->dma_rec.area;
> - korg1212->RecDataPhy = korg1212->dma_rec.addr;
> + korg1212->dma_rec = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV,
> + korg1212->DataBufsSize);
> + if (!korg1212->dma_rec)
> + return -ENOMEM;
> +
> + korg1212->recordDataBufsPtr = (struct KorgAudioBuffer *)korg1212->dma_rec->area;
> + korg1212->RecDataPhy = korg1212->dma_rec->addr;
>
> K1212_DEBUG_PRINTK("K1212_DEBUG: Record Data Area = 0x%p (0x%08x), %d bytes\n",
> korg1212->recordDataBufsPtr, korg1212->RecDataPhy, korg1212->DataBufsSize);
> @@ -2336,26 +2256,22 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci,
> korg1212->AdatTimeCodePhy = korg1212->sharedBufferPhy +
> offsetof(struct KorgSharedBuffer, AdatTimeCode);
>
> + korg1212->dma_dsp = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV,
> + dsp_code->size);
> + if (!korg1212->dma_dsp)
> + return -ENOMEM;
> +
Should this section be moved below the next one?
sound/pci/korg1212/korg1212.c:2260:8: error: variable 'dsp_code' is uninitialized when used here [-Werror,-Wuninitialized]
dsp_code->size);
^~~~~~~~
sound/pci/korg1212/korg1212.c:2101:33: note: initialize the variable 'dsp_code' to silence this warning
const struct firmware *dsp_code;
^
= NULL
1 error generated.
> err = request_firmware(&dsp_code, "korg/k1212.dsp", &pci->dev);
> if (err < 0) {
> snd_printk(KERN_ERR "firmware not available\n");
> - snd_korg1212_free(korg1212);
> return err;
> }
>
> - if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev,
> - dsp_code->size, &korg1212->dma_dsp) < 0) {
> - snd_printk(KERN_ERR "korg1212: cannot allocate dsp code memory (%zd bytes)\n", dsp_code->size);
> - snd_korg1212_free(korg1212);
> - release_firmware(dsp_code);
> - return -ENOMEM;
> - }
> -
> K1212_DEBUG_PRINTK("K1212_DEBUG: DSP Code area = 0x%p (0x%08x) %d bytes [%s]\n",
> - korg1212->dma_dsp.area, korg1212->dma_dsp.addr, dsp_code->size,
> + korg1212->dma_dsp->area, korg1212->dma_dsp->addr, dsp_code->size,
> stateName[korg1212->cardState]);
>
> - memcpy(korg1212->dma_dsp.area, dsp_code->data, dsp_code->size);
> + memcpy(korg1212->dma_dsp->area, dsp_code->data, dsp_code->size);
>
> release_firmware(dsp_code);
>
> @@ -2364,12 +2280,6 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci,
> if (rc)
> K1212_DEBUG_PRINTK("K1212_DEBUG: Reboot Card - RC = %d [%s]\n", rc, stateName[korg1212->cardState]);
>
> - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, korg1212, &ops);
> - if (err < 0) {
> - snd_korg1212_free(korg1212);
> - return err;
> - }
> -
> snd_korg1212_EnableCardInterrupts(korg1212);
>
> mdelay(CARD_BOOT_DELAY_IN_MS);
> @@ -2411,10 +2321,8 @@ static int snd_korg1212_create(struct snd_card *card, struct pci_dev *pci,
> }
>
> snd_korg1212_proc_init(korg1212);
> -
> - * rchip = korg1212;
> - return 0;
>
> + return 0;
> }
>
> /*
> @@ -2437,16 +2345,15 @@ snd_korg1212_probe(struct pci_dev *pci,
> dev++;
> return -ENOENT;
> }
> - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
> - 0, &card);
> + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
> + sizeof(*korg1212), &card);
> if (err < 0)
> return err;
> + korg1212 = card->private_data;
>
> - err = snd_korg1212_create(card, pci, &korg1212);
> - if (err < 0) {
> - snd_card_free(card);
> + err = snd_korg1212_create(card, pci);
> + if (err < 0)
> return err;
> - }
>
> strcpy(card->driver, "korg1212");
> strcpy(card->shortname, "korg1212");
> @@ -2456,25 +2363,17 @@ snd_korg1212_probe(struct pci_dev *pci,
> K1212_DEBUG_PRINTK("K1212_DEBUG: %s\n", card->longname);
>
> err = snd_card_register(card);
> - if (err < 0) {
> - snd_card_free(card);
> + if (err < 0)
> return err;
> - }
> pci_set_drvdata(pci, card);
> dev++;
> return 0;
> }
>
> -static void snd_korg1212_remove(struct pci_dev *pci)
> -{
> - snd_card_free(pci_get_drvdata(pci));
> -}
> -
> static struct pci_driver korg1212_driver = {
> .name = KBUILD_MODNAME,
> .id_table = snd_korg1212_ids,
> .probe = snd_korg1212_probe,
> - .remove = snd_korg1212_remove,
> };
>
> module_pci_driver(korg1212_driver);
> --
> 2.26.2
More information about the Alsa-devel
mailing list