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

ALSA: sc6000: Allocate resources with device-managed APIs

This patch converts the resource management in ISA als100 driver with
devres as a clean up. Each manual resource management is converted
with the corresponding devres helper. The cleanup code was moved from
the remove callback to card->private_free, and then the remove
callback became superfluous and dropped.

This should give no user-visible functional changes.

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

+26 -47
+26 -47
sound/isa/sc6000.c
··· 529 529 return 1; 530 530 } 531 531 532 + static void snd_sc6000_free(struct snd_card *card) 533 + { 534 + char __iomem **vport = card->private_data; 535 + 536 + if (*vport) 537 + sc6000_setup_board(*vport, 0); 538 + } 539 + 532 540 static int snd_sc6000_probe(struct device *devptr, unsigned int dev) 533 541 { 534 542 static const int possible_irqs[] = { 5, 7, 9, 10, 11, -1 }; ··· 551 543 char __iomem *vmss_port; 552 544 553 545 554 - err = snd_card_new(devptr, index[dev], id[dev], THIS_MODULE, 555 - sizeof(vport), &card); 546 + err = snd_devm_card_new(devptr, index[dev], id[dev], THIS_MODULE, 547 + sizeof(vport), &card); 556 548 if (err < 0) 557 549 return err; 558 550 ··· 561 553 xirq = snd_legacy_find_free_irq(possible_irqs); 562 554 if (xirq < 0) { 563 555 snd_printk(KERN_ERR PFX "unable to find a free IRQ\n"); 564 - err = -EBUSY; 565 - goto err_exit; 556 + return -EBUSY; 566 557 } 567 558 } 568 559 ··· 569 562 xdma = snd_legacy_find_free_dma(possible_dmas); 570 563 if (xdma < 0) { 571 564 snd_printk(KERN_ERR PFX "unable to find a free DMA\n"); 572 - err = -EBUSY; 573 - goto err_exit; 565 + return -EBUSY; 574 566 } 575 567 } 576 568 577 - if (!request_region(port[dev], 0x10, DRV_NAME)) { 569 + if (!devm_request_region(devptr, port[dev], 0x10, DRV_NAME)) { 578 570 snd_printk(KERN_ERR PFX 579 571 "I/O port region is already in use.\n"); 580 - err = -EBUSY; 581 - goto err_exit; 572 + return -EBUSY; 582 573 } 583 574 *vport = devm_ioport_map(devptr, port[dev], 0x10); 584 575 if (*vport == NULL) { 585 576 snd_printk(KERN_ERR PFX 586 577 "I/O port cannot be iomapped.\n"); 587 - err = -EBUSY; 588 - goto err_unmap1; 578 + return -EBUSY; 589 579 } 590 580 591 581 /* to make it marked as used */ 592 - if (!request_region(mss_port[dev], 4, DRV_NAME)) { 582 + if (!devm_request_region(devptr, mss_port[dev], 4, DRV_NAME)) { 593 583 snd_printk(KERN_ERR PFX 594 584 "SC-6000 port I/O port region is already in use.\n"); 595 - err = -EBUSY; 596 - goto err_unmap1; 585 + return -EBUSY; 597 586 } 598 587 vmss_port = devm_ioport_map(devptr, mss_port[dev], 4); 599 588 if (!vmss_port) { 600 589 snd_printk(KERN_ERR PFX 601 590 "MSS port I/O cannot be iomapped.\n"); 602 - err = -EBUSY; 603 - goto err_unmap2; 591 + return -EBUSY; 604 592 } 605 593 606 594 snd_printd("Initializing BASE[0x%lx] IRQ[%d] DMA[%d] MIRQ[%d]\n", ··· 604 602 605 603 err = sc6000_init_board(*vport, vmss_port, dev); 606 604 if (err < 0) 607 - goto err_unmap2; 605 + return err; 606 + card->private_free = snd_sc6000_free; 608 607 609 608 err = snd_wss_create(card, mss_port[dev] + 4, -1, xirq, xdma, -1, 610 609 WSS_HW_DETECT, 0, &chip); 611 610 if (err < 0) 612 - goto err_unmap2; 611 + return err; 613 612 614 613 err = snd_wss_pcm(chip, 0); 615 614 if (err < 0) { 616 615 snd_printk(KERN_ERR PFX 617 616 "error creating new WSS PCM device\n"); 618 - goto err_unmap2; 617 + return err; 619 618 } 620 619 err = snd_wss_mixer(chip); 621 620 if (err < 0) { 622 621 snd_printk(KERN_ERR PFX "error creating new WSS mixer\n"); 623 - goto err_unmap2; 622 + return err; 624 623 } 625 624 err = snd_sc6000_mixer(chip); 626 625 if (err < 0) { 627 626 snd_printk(KERN_ERR PFX "the mixer rewrite failed\n"); 628 - goto err_unmap2; 627 + return err; 629 628 } 630 629 if (snd_opl3_create(card, 631 630 0x388, 0x388 + 2, ··· 636 633 } else { 637 634 err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); 638 635 if (err < 0) 639 - goto err_unmap2; 636 + return err; 640 637 } 641 638 642 639 if (mpu_port[dev] != SNDRV_AUTO_PORT) { ··· 657 654 658 655 err = snd_card_register(card); 659 656 if (err < 0) 660 - goto err_unmap2; 657 + return err; 661 658 662 659 dev_set_drvdata(devptr, card); 663 660 return 0; 664 - 665 - err_unmap2: 666 - sc6000_setup_board(*vport, 0); 667 - release_region(mss_port[dev], 4); 668 - err_unmap1: 669 - release_region(port[dev], 0x10); 670 - err_exit: 671 - snd_card_free(card); 672 - return err; 673 - } 674 - 675 - static void snd_sc6000_remove(struct device *devptr, unsigned int dev) 676 - { 677 - struct snd_card *card = dev_get_drvdata(devptr); 678 - char __iomem **vport = card->private_data; 679 - 680 - if (sc6000_setup_board(*vport, 0) < 0) 681 - snd_printk(KERN_WARNING "sc6000_setup_board failed on exit!\n"); 682 - 683 - release_region(port[dev], 0x10); 684 - release_region(mss_port[dev], 4); 685 - 686 - snd_card_free(card); 687 661 } 688 662 689 663 static struct isa_driver snd_sc6000_driver = { 690 664 .match = snd_sc6000_match, 691 665 .probe = snd_sc6000_probe, 692 - .remove = snd_sc6000_remove, 693 666 /* FIXME: suspend/resume */ 694 667 .driver = { 695 668 .name = DRV_NAME,