Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: rme9652: Allocate resources with device-managed APIs

This patch converts the resource management in PCI rme9652 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.

Link: https://lore.kernel.org/r/20210715075941.23332-48-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>

+24 -61
+24 -61
sound/pci/rme9652/rme9652.c
··· 208 208 unsigned char ds_channels; 209 209 unsigned char ss_channels; /* different for hammerfall/hammerfall-light */ 210 210 211 - struct snd_dma_buffer playback_dma_buf; 212 - struct snd_dma_buffer capture_dma_buf; 211 + struct snd_dma_buffer *playback_dma_buf; 212 + struct snd_dma_buffer *capture_dma_buf; 213 213 214 214 unsigned char *capture_buffer; /* suitably aligned address */ 215 215 unsigned char *playback_buffer; /* suitably aligned address */ ··· 275 275 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 276 276 }; 277 277 278 - static int snd_hammerfall_get_buffer(struct pci_dev *pci, struct snd_dma_buffer *dmab, size_t size) 278 + static struct snd_dma_buffer * 279 + snd_hammerfall_get_buffer(struct pci_dev *pci, size_t size) 279 280 { 280 - return snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, size, dmab); 281 + return snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, size); 281 282 } 282 - 283 - static void snd_hammerfall_free_buffer(struct snd_dma_buffer *dmab, struct pci_dev *pci) 284 - { 285 - if (dmab->area) 286 - snd_dma_free_pages(dmab); 287 - } 288 - 289 283 290 284 static const struct pci_device_id snd_rme9652_ids[] = { 291 285 { ··· 1709 1715 snd_rme9652_proc_read); 1710 1716 } 1711 1717 1712 - static void snd_rme9652_free_buffers(struct snd_rme9652 *rme9652) 1718 + static void snd_rme9652_card_free(struct snd_card *card) 1713 1719 { 1714 - snd_hammerfall_free_buffer(&rme9652->capture_dma_buf, rme9652->pci); 1715 - snd_hammerfall_free_buffer(&rme9652->playback_dma_buf, rme9652->pci); 1716 - } 1720 + struct snd_rme9652 *rme9652 = (struct snd_rme9652 *) card->private_data; 1717 1721 1718 - static int snd_rme9652_free(struct snd_rme9652 *rme9652) 1719 - { 1720 1722 if (rme9652->irq >= 0) 1721 1723 rme9652_stop(rme9652); 1722 - snd_rme9652_free_buffers(rme9652); 1723 - 1724 - if (rme9652->irq >= 0) 1725 - free_irq(rme9652->irq, (void *)rme9652); 1726 - iounmap(rme9652->iobase); 1727 - if (rme9652->port) 1728 - pci_release_regions(rme9652->pci); 1729 - 1730 - if (pci_is_enabled(rme9652->pci)) 1731 - pci_disable_device(rme9652->pci); 1732 - return 0; 1733 1724 } 1734 1725 1735 1726 static int snd_rme9652_initialize_memory(struct snd_rme9652 *rme9652) 1736 1727 { 1737 1728 unsigned long pb_bus, cb_bus; 1738 1729 1739 - if (snd_hammerfall_get_buffer(rme9652->pci, &rme9652->capture_dma_buf, RME9652_DMA_AREA_BYTES) < 0 || 1740 - snd_hammerfall_get_buffer(rme9652->pci, &rme9652->playback_dma_buf, RME9652_DMA_AREA_BYTES) < 0) { 1741 - if (rme9652->capture_dma_buf.area) 1742 - snd_dma_free_pages(&rme9652->capture_dma_buf); 1730 + rme9652->capture_dma_buf = 1731 + snd_hammerfall_get_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES); 1732 + rme9652->playback_dma_buf = 1733 + snd_hammerfall_get_buffer(rme9652->pci, RME9652_DMA_AREA_BYTES); 1734 + if (!rme9652->capture_dma_buf || !rme9652->playback_dma_buf) { 1743 1735 dev_err(rme9652->card->dev, 1744 1736 "%s: no buffers available\n", rme9652->card_name); 1745 1737 return -ENOMEM; ··· 1733 1753 1734 1754 /* Align to bus-space 64K boundary */ 1735 1755 1736 - cb_bus = ALIGN(rme9652->capture_dma_buf.addr, 0x10000ul); 1737 - pb_bus = ALIGN(rme9652->playback_dma_buf.addr, 0x10000ul); 1756 + cb_bus = ALIGN(rme9652->capture_dma_buf->addr, 0x10000ul); 1757 + pb_bus = ALIGN(rme9652->playback_dma_buf->addr, 0x10000ul); 1738 1758 1739 1759 /* Tell the card where it is */ 1740 1760 1741 1761 rme9652_write(rme9652, RME9652_rec_buffer, cb_bus); 1742 1762 rme9652_write(rme9652, RME9652_play_buffer, pb_bus); 1743 1763 1744 - rme9652->capture_buffer = rme9652->capture_dma_buf.area + (cb_bus - rme9652->capture_dma_buf.addr); 1745 - rme9652->playback_buffer = rme9652->playback_dma_buf.area + (pb_bus - rme9652->playback_dma_buf.addr); 1764 + rme9652->capture_buffer = rme9652->capture_dma_buf->area + (cb_bus - rme9652->capture_dma_buf->addr); 1765 + rme9652->playback_buffer = rme9652->playback_dma_buf->area + (pb_bus - rme9652->playback_dma_buf->addr); 1746 1766 1747 1767 return 0; 1748 1768 } ··· 2432 2452 return -ENODEV; 2433 2453 } 2434 2454 2435 - err = pci_enable_device(pci); 2455 + err = pcim_enable_device(pci); 2436 2456 if (err < 0) 2437 2457 return err; 2438 2458 ··· 2442 2462 if (err < 0) 2443 2463 return err; 2444 2464 rme9652->port = pci_resource_start(pci, 0); 2445 - rme9652->iobase = ioremap(rme9652->port, RME9652_IO_EXTENT); 2465 + rme9652->iobase = devm_ioremap(&pci->dev, rme9652->port, RME9652_IO_EXTENT); 2446 2466 if (rme9652->iobase == NULL) { 2447 2467 dev_err(card->dev, "unable to remap region 0x%lx-0x%lx\n", 2448 2468 rme9652->port, rme9652->port + RME9652_IO_EXTENT - 1); 2449 2469 return -EBUSY; 2450 2470 } 2451 2471 2452 - if (request_irq(pci->irq, snd_rme9652_interrupt, IRQF_SHARED, 2453 - KBUILD_MODNAME, rme9652)) { 2472 + if (devm_request_irq(&pci->dev, pci->irq, snd_rme9652_interrupt, 2473 + IRQF_SHARED, KBUILD_MODNAME, rme9652)) { 2454 2474 dev_err(card->dev, "unable to request IRQ %d\n", pci->irq); 2455 2475 return -EBUSY; 2456 2476 } ··· 2542 2562 return 0; 2543 2563 } 2544 2564 2545 - static void snd_rme9652_card_free(struct snd_card *card) 2546 - { 2547 - struct snd_rme9652 *rme9652 = (struct snd_rme9652 *) card->private_data; 2548 - 2549 - if (rme9652) 2550 - snd_rme9652_free(rme9652); 2551 - } 2552 - 2553 2565 static int snd_rme9652_probe(struct pci_dev *pci, 2554 2566 const struct pci_device_id *pci_id) 2555 2567 { ··· 2557 2585 return -ENOENT; 2558 2586 } 2559 2587 2560 - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, 2561 - sizeof(struct snd_rme9652), &card); 2588 + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, 2589 + sizeof(struct snd_rme9652), &card); 2562 2590 2563 2591 if (err < 0) 2564 2592 return err; ··· 2569 2597 rme9652->pci = pci; 2570 2598 err = snd_rme9652_create(card, rme9652, precise_ptr[dev]); 2571 2599 if (err) 2572 - goto free_card; 2600 + return err; 2573 2601 2574 2602 strcpy(card->shortname, rme9652->card_name); 2575 2603 2576 2604 sprintf(card->longname, "%s at 0x%lx, irq %d", 2577 2605 card->shortname, rme9652->port, rme9652->irq); 2578 2606 err = snd_card_register(card); 2579 - if (err) { 2580 - free_card: 2581 - snd_card_free(card); 2607 + if (err) 2582 2608 return err; 2583 - } 2584 2609 pci_set_drvdata(pci, card); 2585 2610 dev++; 2586 2611 return 0; 2587 - } 2588 - 2589 - static void snd_rme9652_remove(struct pci_dev *pci) 2590 - { 2591 - snd_card_free(pci_get_drvdata(pci)); 2592 2612 } 2593 2613 2594 2614 static struct pci_driver rme9652_driver = { 2595 2615 .name = KBUILD_MODNAME, 2596 2616 .id_table = snd_rme9652_ids, 2597 2617 .probe = snd_rme9652_probe, 2598 - .remove = snd_rme9652_remove, 2599 2618 }; 2600 2619 2601 2620 module_pci_driver(rme9652_driver);