Ignore:
Timestamp:
Aug 7, 2022, 6:11:12 PM (3 years ago)
Author:
David Azarewicz
Message:

Merge changes from next branch.

Location:
GPL/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • GPL/trunk

  • GPL/trunk/alsa-kernel/pci/es1938.c

    r703 r717  
    15571557#endif /* SUPPORT_JOYSTICK */
    15581558
    1559 static int snd_es1938_free(struct es1938 *chip)
    1560 {
     1559static void snd_es1938_free(struct snd_card *card)
     1560{
     1561        struct es1938 *chip = card->private_data;
     1562
    15611563        /* disable irqs */
    15621564        outb(0x00, SLIO_REG(chip, IRQCONTROL));
     
    15681570        if (chip->irq >= 0)
    15691571                free_irq(chip->irq, chip);
    1570         pci_release_regions(chip->pci);
    1571         pci_disable_device(chip->pci);
    1572         kfree(chip);
    1573         return 0;
    1574 }
    1575 
    1576 static int snd_es1938_dev_free(struct snd_device *device)
    1577 {
    1578         struct es1938 *chip = device->device_data;
    1579         return snd_es1938_free(chip);
    15801572}
    15811573
    15821574static int snd_es1938_create(struct snd_card *card,
    1583                              struct pci_dev *pci,
    1584                              struct es1938 **rchip)
    1585 {
    1586         struct es1938 *chip;
     1575                             struct pci_dev *pci)
     1576{
     1577        struct es1938 *chip = card->private_data;
    15871578        int err;
    1588         static const struct snd_device_ops ops = {
    1589                 .dev_free =     snd_es1938_dev_free,
    1590         };
    1591 
    1592         *rchip = NULL;
    15931579
    15941580        /* enable PCI device */
    1595         err = pci_enable_device(pci);
     1581        err = pcim_enable_device(pci);
    15961582        if (err < 0)
    15971583                return err;
     
    16001586                dev_err(card->dev,
    16011587                        "architecture does not support 24bit PCI busmaster DMA\n");
    1602                 pci_disable_device(pci);
    16031588                return -ENXIO;
    16041589        }
    16051590
    1606         chip = kzalloc(sizeof(*chip), GFP_KERNEL);
    1607         if (chip == NULL) {
    1608                 pci_disable_device(pci);
    1609                 return -ENOMEM;
    1610         }
    16111591        spin_lock_init(&chip->reg_lock);
    16121592        spin_lock_init(&chip->mixer_lock);
     
    16151595        chip->irq = -1;
    16161596        err = pci_request_regions(pci, "ESS Solo-1");
    1617         if (err < 0) {
    1618                 kfree(chip);
    1619                 pci_disable_device(pci);
     1597        if (err < 0)
    16201598                return err;
    1621         }
    16221599        chip->io_port = pci_resource_start(pci, 0);
    16231600        chip->sb_port = pci_resource_start(pci, 1);
     
    16251602        chip->mpu_port = pci_resource_start(pci, 3);
    16261603        chip->game_port = pci_resource_start(pci, 4);
     1604        /* still use non-managed irq handler as it's re-acquired at PM resume */
    16271605        if (request_irq(pci->irq, snd_es1938_interrupt, IRQF_SHARED,
    16281606                        KBUILD_MODNAME, chip)) {
    16291607                dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
    1630                 snd_es1938_free(chip);
    16311608                return -EBUSY;
    16321609        }
    16331610        chip->irq = pci->irq;
    16341611        card->sync_irq = chip->irq;
     1612        card->private_free = snd_es1938_free;
    16351613        dev_dbg(card->dev,
    16361614                "create: io: 0x%lx, sb: 0x%lx, vc: 0x%lx, mpu: 0x%lx, game: 0x%lx\n",
     
    16401618
    16411619        snd_es1938_chip_init(chip);
    1642 
    1643         err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
    1644         if (err < 0) {
    1645                 snd_es1938_free(chip);
    1646                 return err;
    1647         }
    1648 
    1649         *rchip = chip;
    16501620        return 0;
    16511621}
     
    17821752       
    17831753
    1784 static int snd_es1938_probe(struct pci_dev *pci,
    1785                             const struct pci_device_id *pci_id)
     1754static int __snd_es1938_probe(struct pci_dev *pci,
     1755                              const struct pci_device_id *pci_id)
    17861756{
    17871757        static int dev;
     
    17981768        }
    17991769
    1800         err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
    1801                            0, &card);
     1770        err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
     1771                                sizeof(*chip), &card);
    18021772        if (err < 0)
    18031773                return err;
    1804         for (idx = 0; idx < 5; idx++) {
     1774        chip = card->private_data;
     1775
     1776        for (idx = 0; idx < 5; idx++)
    18051777                if (pci_resource_start(pci, idx) == 0 ||
    1806                     !(pci_resource_flags(pci, idx) & IORESOURCE_IO)) {
    1807                         snd_card_free(card);
    1808                         return -ENODEV;
    1809                 }
    1810         }
    1811         err = snd_es1938_create(card, pci, &chip);
    1812         if (err < 0) {
    1813                 snd_card_free(card);
     1778                    !(pci_resource_flags(pci, idx) & IORESOURCE_IO))
     1779                        return -ENODEV;
     1780
     1781        err = snd_es1938_create(card, pci);
     1782        if (err < 0)
    18141783                return err;
    1815         }
    1816         card->private_data = chip;
    18171784
    18181785        strcpy(card->driver, "ES1938");
     
    18241791
    18251792        err = snd_es1938_new_pcm(chip, 0);
    1826         if (err < 0) {
    1827                 snd_card_free(card);
     1793        if (err < 0)
    18281794                return err;
    1829         }
    18301795        err = snd_es1938_mixer(chip);
    1831         if (err < 0) {
    1832                 snd_card_free(card);
     1796        if (err < 0)
    18331797                return err;
    1834         }
    18351798        if (snd_opl3_create(card,
    18361799                            SLSB_REG(chip, FMLOWADDR),
     
    18411804        } else {
    18421805                err = snd_opl3_timer_new(opl3, 0, 1);
    1843                 if (err < 0) {
    1844                         snd_card_free(card);
     1806                if (err < 0)
    18451807                        return err;
    1846                 }
    18471808                err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
    1848                 if (err < 0) {
    1849                         snd_card_free(card);
     1809                if (err < 0)
    18501810                        return err;
    1851                 }
    18521811        }
    18531812        if (snd_mpu401_uart_new(card, 0, MPU401_HW_MPU401,
     
    18651824
    18661825        err = snd_card_register(card);
    1867         if (err < 0) {
    1868                 snd_card_free(card);
     1826        if (err < 0)
    18691827                return err;
    1870         }
    18711828
    18721829        pci_set_drvdata(pci, card);
     
    18751832}
    18761833
    1877 static void snd_es1938_remove(struct pci_dev *pci)
    1878 {
    1879         snd_card_free(pci_get_drvdata(pci));
     1834static int snd_es1938_probe(struct pci_dev *pci,
     1835                            const struct pci_device_id *pci_id)
     1836{
     1837        return snd_card_free_on_error(&pci->dev, __snd_es1938_probe(pci, pci_id));
    18801838}
    18811839
     
    18841842        .id_table = snd_es1938_ids,
    18851843        .probe = snd_es1938_probe,
    1886         .remove = snd_es1938_remove,
    18871844        .driver = {
    18881845                .pm = ES1938_PM_OPS,
Note: See TracChangeset for help on using the changeset viewer.