ALSA: oxygen: Allocate resources with device-managed APIs
authorTakashi Iwai <tiwai@suse.de>
Thu, 15 Jul 2021 07:59:05 +0000 (09:59 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 19 Jul 2021 14:17:04 +0000 (16:17 +0200)
This patch converts the resource management in PCI oxygen drivers with
devres as a clean up.  Each manual resource management is converted
with the corresponding devres helper, and the page allocations are
done with the devres helper.

This should give no user-visible functional changes.

Link: https://lore.kernel.org/r/20210715075941.23332-44-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/oxygen/oxygen.c
sound/pci/oxygen/oxygen.h
sound/pci/oxygen/oxygen_lib.c
sound/pci/oxygen/se6x.c
sound/pci/oxygen/virtuoso.c

index e335c4b..c346f42 100644 (file)
@@ -854,7 +854,6 @@ static struct pci_driver oxygen_driver = {
        .name = KBUILD_MODNAME,
        .id_table = oxygen_ids,
        .probe = generic_oxygen_probe,
-       .remove = oxygen_pci_remove,
 #ifdef CONFIG_PM_SLEEP
        .driver = {
                .pm = &oxygen_pci_pm,
index 06bf7e5..0cae640 100644 (file)
@@ -161,7 +161,6 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
                                      const struct pci_device_id *id
                                     )
                    );
-void oxygen_pci_remove(struct pci_dev *pci);
 #ifdef CONFIG_PM_SLEEP
 extern const struct dev_pm_ops oxygen_pci_pm;
 #endif
index afc6dd3..4fb3f24 100644 (file)
@@ -570,15 +570,10 @@ static void oxygen_card_free(struct snd_card *card)
        struct oxygen *chip = card->private_data;
 
        oxygen_shutdown(chip);
-       if (chip->irq >= 0)
-               free_irq(chip->irq, chip);
        flush_work(&chip->spdif_input_bits_work);
        flush_work(&chip->gpio_work);
        chip->model.cleanup(chip);
-       kfree(chip->model_data);
        mutex_destroy(&chip->mutex);
-       pci_release_regions(chip->pci);
-       pci_disable_device(chip->pci);
 }
 
 int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
@@ -594,8 +589,8 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
        const struct pci_device_id *pci_id;
        int err;
 
-       err = snd_card_new(&pci->dev, index, id, owner,
-                          sizeof(*chip), &card);
+       err = snd_devm_card_new(&pci->dev, index, id, owner,
+                               sizeof(*chip), &card);
        if (err < 0)
                return err;
 
@@ -610,41 +605,38 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
        INIT_WORK(&chip->gpio_work, oxygen_gpio_changed);
        init_waitqueue_head(&chip->ac97_waitqueue);
 
-       err = pci_enable_device(pci);
+       err = pcim_enable_device(pci);
        if (err < 0)
-               goto err_card;
+               return err;
 
        err = pci_request_regions(pci, DRIVER);
        if (err < 0) {
                dev_err(card->dev, "cannot reserve PCI resources\n");
-               goto err_pci_enable;
+               return err;
        }
 
        if (!(pci_resource_flags(pci, 0) & IORESOURCE_IO) ||
            pci_resource_len(pci, 0) < OXYGEN_IO_SIZE) {
                dev_err(card->dev, "invalid PCI I/O range\n");
-               err = -ENXIO;
-               goto err_pci_regions;
+               return -ENXIO;
        }
        chip->addr = pci_resource_start(pci, 0);
 
        pci_id = oxygen_search_pci_id(chip, ids);
-       if (!pci_id) {
-               err = -ENODEV;
-               goto err_pci_regions;
-       }
+       if (!pci_id)
+               return -ENODEV;
+
        oxygen_restore_eeprom(chip, pci_id);
        err = get_model(chip, pci_id);
        if (err < 0)
-               goto err_pci_regions;
+               return err;
 
        if (chip->model.model_data_size) {
-               chip->model_data = kzalloc(chip->model.model_data_size,
-                                          GFP_KERNEL);
-               if (!chip->model_data) {
-                       err = -ENOMEM;
-                       goto err_pci_regions;
-               }
+               chip->model_data = devm_kzalloc(&pci->dev,
+                                               chip->model.model_data_size,
+                                               GFP_KERNEL);
+               if (!chip->model_data)
+                       return -ENOMEM;
        }
 
        pci_set_master(pci);
@@ -654,11 +646,11 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
        oxygen_init(chip);
        chip->model.init(chip);
 
-       err = request_irq(pci->irq, oxygen_interrupt, IRQF_SHARED,
-                         KBUILD_MODNAME, chip);
+       err = devm_request_irq(&pci->dev, pci->irq, oxygen_interrupt,
+                              IRQF_SHARED, KBUILD_MODNAME, chip);
        if (err < 0) {
                dev_err(card->dev, "cannot grab interrupt %d\n", pci->irq);
-               goto err_card;
+               return err;
        }
        chip->irq = pci->irq;
        card->sync_irq = chip->irq;
@@ -672,11 +664,11 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
 
        err = oxygen_pcm_init(chip);
        if (err < 0)
-               goto err_card;
+               return err;
 
        err = oxygen_mixer_init(chip);
        if (err < 0)
-               goto err_card;
+               return err;
 
        if (chip->model.device_config & (MIDI_OUTPUT | MIDI_INPUT)) {
                unsigned int info_flags =
@@ -689,7 +681,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
                                          chip->addr + OXYGEN_MPU401,
                                          info_flags, -1, &chip->midi);
                if (err < 0)
-                       goto err_card;
+                       return err;
        }
 
        oxygen_proc_init(chip);
@@ -704,27 +696,13 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
 
        err = snd_card_register(card);
        if (err < 0)
-               goto err_card;
+               return err;
 
        pci_set_drvdata(pci, card);
        return 0;
-
-err_pci_regions:
-       pci_release_regions(pci);
-err_pci_enable:
-       pci_disable_device(pci);
-err_card:
-       snd_card_free(card);
-       return err;
 }
 EXPORT_SYMBOL(oxygen_pci_probe);
 
-void oxygen_pci_remove(struct pci_dev *pci)
-{
-       snd_card_free(pci_get_drvdata(pci));
-}
-EXPORT_SYMBOL(oxygen_pci_remove);
-
 #ifdef CONFIG_PM_SLEEP
 static int oxygen_pci_suspend(struct device *dev)
 {
index 434f885..17650a5 100644 (file)
@@ -137,7 +137,6 @@ static struct pci_driver se6x_driver = {
        .name = KBUILD_MODNAME,
        .id_table = se6x_ids,
        .probe = se6x_probe,
-       .remove = oxygen_pci_remove,
 #ifdef CONFIG_PM_SLEEP
        .driver = {
                .pm = &oxygen_pci_pm,
index baa3244..2e40513 100644 (file)
@@ -82,7 +82,6 @@ static struct pci_driver xonar_driver = {
        .name = KBUILD_MODNAME,
        .id_table = xonar_ids,
        .probe = xonar_probe,
-       .remove = oxygen_pci_remove,
 #ifdef CONFIG_PM_SLEEP
        .driver = {
                .pm = &oxygen_pci_pm,