Merge tag 'denywrite-for-5.15' of git://github.com/davidhildenbrand/linux
[linux-2.6-microblaze.git] / sound / pci / als4000.c
index 509f317..535eccd 100644 (file)
@@ -746,13 +746,15 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
 
        if (joystick_port[dev] == 1) { /* auto-detect */
                for (io_port = 0x200; io_port <= 0x218; io_port += 8) {
-                       r = request_region(io_port, 8, "ALS4000 gameport");
+                       r = devm_request_region(&acard->pci->dev, io_port, 8,
+                                               "ALS4000 gameport");
                        if (r)
                                break;
                }
        } else {
                io_port = joystick_port[dev];
-               r = request_region(io_port, 8, "ALS4000 gameport");
+               r = devm_request_region(&acard->pci->dev, io_port, 8,
+                                       "ALS4000 gameport");
        }
 
        if (!r) {
@@ -763,7 +765,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
        acard->gameport = gp = gameport_allocate_port();
        if (!gp) {
                dev_err(&acard->pci->dev, "cannot allocate memory for gameport\n");
-               release_and_free_resource(r);
                return -ENOMEM;
        }
 
@@ -771,7 +772,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
        gameport_set_phys(gp, "pci%s/gameport0", pci_name(acard->pci));
        gameport_set_dev_parent(gp, &acard->pci->dev);
        gp->io = io_port;
-       gameport_set_port_data(gp, r);
 
        /* Enable legacy joystick port */
        snd_als4000_set_addr(acard->iobase, 0, 0, 0, 1);
@@ -784,15 +784,11 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
 static void snd_als4000_free_gameport(struct snd_card_als4000 *acard)
 {
        if (acard->gameport) {
-               struct resource *r = gameport_get_port_data(acard->gameport);
-
                gameport_unregister_port(acard->gameport);
                acard->gameport = NULL;
 
                /* disable joystick */
                snd_als4000_set_addr(acard->iobase, 0, 0, 0, 0);
-
-               release_and_free_resource(r);
        }
 }
 #else
@@ -808,8 +804,6 @@ static void snd_card_als4000_free( struct snd_card *card )
        snd_als4k_gcr_write_addr(acard->iobase, ALS4K_GCR8C_MISC_CTRL, 0);
        /* free resources */
        snd_als4000_free_gameport(acard);
-       pci_release_regions(acard->pci);
-       pci_disable_device(acard->pci);
 }
 
 static int snd_card_als4000_probe(struct pci_dev *pci,
@@ -832,36 +826,30 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
        }
 
        /* enable PCI device */
-       err = pci_enable_device(pci);
+       err = pcim_enable_device(pci);
        if (err < 0)
                return err;
 
        /* check, if we can restrict PCI DMA transfers to 24 bits */
        if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) {
                dev_err(&pci->dev, "architecture does not support 24bit PCI busmaster DMA\n");
-               pci_disable_device(pci);
                return -ENXIO;
        }
 
        err = pci_request_regions(pci, "ALS4000");
-       if (err < 0) {
-               pci_disable_device(pci);
+       if (err < 0)
                return err;
-       }
        iobase = pci_resource_start(pci, 0);
 
        pci_read_config_word(pci, PCI_COMMAND, &word);
        pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO);
        pci_set_master(pci);
        
-       err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
-                          sizeof(*acard) /* private_data: acard */,
-                          &card);
-       if (err < 0) {
-               pci_release_regions(pci);
-               pci_disable_device(pci);
+       err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
+                               sizeof(*acard) /* private_data: acard */,
+                               &card);
+       if (err < 0)
                return err;
-       }
 
        acard = card->private_data;
        acard->pci = pci;
@@ -881,7 +869,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
                               SB_HW_ALS4000,
                               &chip);
        if (err < 0)
-               goto out_err;
+               return err;
        acard->chip = chip;
 
        chip->pci = pci;
@@ -902,7 +890,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
        if (err < 0) {
                dev_err(&pci->dev, "no MPU-401 device at 0x%lx?\n",
                                iobase + ALS4K_IOB_30_MIDI_DATA);
-               goto out_err;
+               return err;
        }
        /* FIXME: ALS4000 has interesting MPU401 configuration features
         * at ALS4K_CR1A_MPU401_UART_MODE_CONTROL
@@ -912,11 +900,11 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
 
        err = snd_als4000_pcm(chip, 0);
        if (err < 0)
-               goto out_err;
+               return err;
 
        err = snd_sbmixer_new(chip);
        if (err < 0)
-               goto out_err;
+               return err;
 
        if (snd_opl3_create(card,
                                iobase + ALS4K_IOB_10_ADLIB_ADDR0,
@@ -928,30 +916,18 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
        } else {
                err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
                if (err < 0)
-                       goto out_err;
+                       return err;
        }
 
        snd_als4000_create_gameport(acard, dev);
 
        err = snd_card_register(card);
        if (err < 0)
-               goto out_err;
+               return err;
 
        pci_set_drvdata(pci, card);
        dev++;
-       err = 0;
-       goto out;
-
-out_err:
-       snd_card_free(card);
-       
-out:
-       return err;
-}
-
-static void snd_card_als4000_remove(struct pci_dev *pci)
-{
-       snd_card_free(pci_get_drvdata(pci));
+       return 0;
 }
 
 #ifdef CONFIG_PM_SLEEP
@@ -996,7 +972,6 @@ static struct pci_driver als4000_driver = {
        .name = KBUILD_MODNAME,
        .id_table = snd_als4000_ids,
        .probe = snd_card_als4000_probe,
-       .remove = snd_card_als4000_remove,
        .driver = {
                .pm = SND_ALS4000_PM_OPS,
        },