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/cs4281.c

    r703 r717  
    12721272#endif /* IS_REACHABLE(CONFIG_GAMEPORT) */
    12731273
    1274 static int snd_cs4281_free(struct cs4281 *chip)
    1275 {
     1274static void snd_cs4281_free(struct snd_card *card)
     1275{
     1276        struct cs4281 *chip = card->private_data;
     1277
    12761278        snd_cs4281_free_gameport(chip);
    12771279
     
    12821284        /* Sound System Power Management - Turn Everything OFF */
    12831285        snd_cs4281_pokeBA0(chip, BA0_SSPM, 0);
    1284         /* PCI interface - D3 state */
    1285         pci_set_power_state(chip->pci, PCI_D3hot);
    1286 
    1287         if (chip->irq >= 0)
    1288                 free_irq(chip->irq, chip);
    1289         iounmap(chip->ba0);
    1290         iounmap(chip->ba1);
    1291         pci_release_regions(chip->pci);
    1292         pci_disable_device(chip->pci);
    1293 
    1294         kfree(chip);
    1295         return 0;
    1296 }
    1297 
    1298 static int snd_cs4281_dev_free(struct snd_device *device)
    1299 {
    1300         struct cs4281 *chip = device->device_data;
    1301         return snd_cs4281_free(chip);
    13021286}
    13031287
     
    13061290static int snd_cs4281_create(struct snd_card *card,
    13071291                             struct pci_dev *pci,
    1308                              struct cs4281 **rchip,
    13091292                             int dual_codec)
    13101293{
    1311         struct cs4281 *chip;
    1312         unsigned int tmp;
     1294        struct cs4281 *chip = card->private_data;
    13131295        int err;
    1314         static const struct snd_device_ops ops = {
    1315                 .dev_free =     snd_cs4281_dev_free,
    1316         };
    1317 
    1318         *rchip = NULL;
    1319         err = pci_enable_device(pci);
     1296
     1297        err = pcim_enable_device(pci);
    13201298        if (err < 0)
    13211299                return err;
    1322         chip = kzalloc(sizeof(*chip), GFP_KERNEL);
    1323         if (chip == NULL) {
    1324                 pci_disable_device(pci);
    1325                 return -ENOMEM;
    1326         }
    13271300        spin_lock_init(&chip->reg_lock);
    13281301        chip->card = card;
     
    13361309        chip->dual_codec = dual_codec;
    13371310
     1311#ifndef TARGET_OS2
     1312        err = pcim_iomap_regions(pci, 0x03, "CS4281"); /* 2 BARs */
     1313        if (err < 0)
     1314                return err;
     1315#else
    13381316        err = pci_request_regions(pci, "CS4281");
    13391317        if (err < 0) {
     
    13421320                return err;
    13431321        }
     1322#endif
    13441323        chip->ba0_addr = pci_resource_start(pci, 0);
    13451324        chip->ba1_addr = pci_resource_start(pci, 1);
    13461325
     1326#ifndef TARGET_OS2
     1327        chip->ba0 = pcim_iomap_table(pci)[0];
     1328        chip->ba1 = pcim_iomap_table(pci)[1];
     1329#else
    13471330        chip->ba0 = pci_ioremap_bar(pci, 0);
    13481331        chip->ba1 = pci_ioremap_bar(pci, 1);
    1349         if (!chip->ba0 || !chip->ba1) {
    1350                 snd_cs4281_free(chip);
    1351                 return -ENOMEM;
    1352         }
    1353        
    1354         if (request_irq(pci->irq, snd_cs4281_interrupt, IRQF_SHARED,
    1355                         KBUILD_MODNAME, chip)) {
     1332#endif
     1333        if (devm_request_irq(&pci->dev, pci->irq, snd_cs4281_interrupt,
     1334                             IRQF_SHARED, KBUILD_MODNAME, chip)) {
    13561335                dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq);
    1357                 snd_cs4281_free(chip);
    13581336                return -ENOMEM;
    13591337        }
    13601338        chip->irq = pci->irq;
    13611339        card->sync_irq = chip->irq;
    1362 
    1363         tmp = snd_cs4281_chip_init(chip);
    1364         if (tmp) {
    1365                 snd_cs4281_free(chip);
    1366                 return tmp;
    1367         }
    1368 
    1369         err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
    1370         if (err < 0) {
    1371                 snd_cs4281_free(chip);
     1340        card->private_free = snd_cs4281_free;
     1341
     1342        err = snd_cs4281_chip_init(chip);
     1343        if (err)
    13721344                return err;
    1373         }
    13741345
    13751346        snd_cs4281_proc_init(chip);
    1376 
    1377         *rchip = chip;
    13781347        return 0;
    13791348}
     
    18751844}
    18761845
    1877 static int snd_cs4281_probe(struct pci_dev *pci,
    1878                             const struct pci_device_id *pci_id)
     1846static int __snd_cs4281_probe(struct pci_dev *pci,
     1847                              const struct pci_device_id *pci_id)
    18791848{
    18801849        static int dev;
     
    18911860        }
    18921861
    1893         err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
    1894                            0, &card);
     1862        err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
     1863                                sizeof(*chip), &card);
    18951864        if (err < 0)
    18961865                return err;
    1897 
    1898         err = snd_cs4281_create(card, pci, &chip, dual_codec[dev]);
    1899         if (err < 0) {
    1900                 snd_card_free(card);
     1866        chip = card->private_data;
     1867
     1868        err = snd_cs4281_create(card, pci, dual_codec[dev]);
     1869        if (err < 0)
    19011870                return err;
    1902         }
    1903         card->private_data = chip;
    19041871
    19051872        err = snd_cs4281_mixer(chip);
    1906         if (err < 0) {
    1907                 snd_card_free(card);
     1873        if (err < 0)
    19081874                return err;
    1909         }
    19101875        err = snd_cs4281_pcm(chip, 0);
    1911         if (err < 0) {
    1912                 snd_card_free(card);
     1876        if (err < 0)
    19131877                return err;
    1914         }
    19151878        err = snd_cs4281_midi(chip, 0);
    1916         if (err < 0) {
    1917                 snd_card_free(card);
     1879        if (err < 0)
    19181880                return err;
    1919         }
    19201881        err = snd_opl3_new(card, OPL3_HW_OPL3_CS4281, &opl3);
    1921         if (err < 0) {
    1922                 snd_card_free(card);
     1882        if (err < 0)
    19231883                return err;
    1924         }
    19251884        opl3->private_data = chip;
    19261885        opl3->command = snd_cs4281_opl3_command;
    19271886        snd_opl3_init(opl3);
    19281887        err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
    1929         if (err < 0) {
    1930                 snd_card_free(card);
     1888        if (err < 0)
    19311889                return err;
    1932         }
    19331890        snd_cs4281_create_gameport(chip);
    19341891        strcpy(card->driver, "CS4281");
     
    19401897
    19411898        err = snd_card_register(card);
    1942         if (err < 0) {
    1943                 snd_card_free(card);
     1899        if (err < 0)
    19441900                return err;
    1945         }
    19461901
    19471902        pci_set_drvdata(pci, card);
     
    19501905}
    19511906
    1952 static void snd_cs4281_remove(struct pci_dev *pci)
    1953 {
    1954         snd_card_free(pci_get_drvdata(pci));
     1907static int snd_cs4281_probe(struct pci_dev *pci,
     1908                            const struct pci_device_id *pci_id)
     1909{
     1910        return snd_card_free_on_error(&pci->dev, __snd_cs4281_probe(pci, pci_id));
    19551911}
    19561912
     
    20582014        .id_table = snd_cs4281_ids,
    20592015        .probe = snd_cs4281_probe,
    2060         .remove = snd_cs4281_remove,
    20612016        .driver = {
    20622017                .pm = CS4281_PM_OPS,
Note: See TracChangeset for help on using the changeset viewer.