Changeset 717 for GPL/trunk/alsa-kernel/pci/atiixp.c
- Timestamp:
- Aug 7, 2022, 6:11:12 PM (3 years ago)
- Location:
- GPL/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
GPL/trunk
- Property svn:mergeinfo changed
/GPL/branches/uniaud32-next merged: 710-716
- Property svn:mergeinfo changed
-
GPL/trunk/alsa-kernel/pci/atiixp.c
r703 r717 1541 1541 */ 1542 1542 1543 static int snd_atiixp_free(struct atiixp *chip) 1544 { 1545 if (chip->irq < 0) 1546 goto __hw_end; 1547 snd_atiixp_chip_stop(chip); 1548 1549 __hw_end: 1550 if (chip->irq >= 0) 1551 free_irq(chip->irq, chip); 1552 iounmap(chip->remap_addr); 1553 pci_release_regions(chip->pci); 1554 pci_disable_device(chip->pci); 1555 kfree(chip); 1556 return 0; 1557 } 1558 1559 static int snd_atiixp_dev_free(struct snd_device *device) 1560 { 1561 struct atiixp *chip = device->device_data; 1562 return snd_atiixp_free(chip); 1543 static void snd_atiixp_free(struct snd_card *card) 1544 { 1545 snd_atiixp_chip_stop(card->private_data); 1563 1546 } 1564 1547 … … 1566 1549 * constructor for chip instance 1567 1550 */ 1568 static int snd_atiixp_create(struct snd_card *card, 1569 struct pci_dev *pci, 1570 struct atiixp **r_chip) 1571 { 1572 static const struct snd_device_ops ops = { 1573 .dev_free = snd_atiixp_dev_free, 1574 }; 1575 struct atiixp *chip; 1551 static int snd_atiixp_init(struct snd_card *card, struct pci_dev *pci) 1552 { 1553 struct atiixp *chip = card->private_data; 1576 1554 int err; 1577 1555 1578 err = pci _enable_device(pci);1556 err = pcim_enable_device(pci); 1579 1557 if (err < 0) 1580 1558 return err; 1581 1582 chip = kzalloc(sizeof(*chip), GFP_KERNEL);1583 if (chip == NULL) {1584 pci_disable_device(pci);1585 return -ENOMEM;1586 }1587 1559 1588 1560 spin_lock_init(&chip->reg_lock); … … 1591 1563 chip->pci = pci; 1592 1564 chip->irq = -1; 1565 #ifndef TARGET_OS2 1566 err = pcim_iomap_regions(pci, 1 << 0, "ATI IXP AC97"); 1567 if (err < 0) 1568 return err; 1569 #else 1593 1570 err = pci_request_regions(pci, "ATI IXP AC97"); 1594 1571 if (err < 0) { … … 1597 1574 return err; 1598 1575 } 1576 #endif 1599 1577 chip->addr = pci_resource_start(pci, 0); 1578 #ifndef TARGET_OS2 1579 chip->remap_addr = pcim_iomap_table(pci)[0]; 1580 #else 1600 1581 chip->remap_addr = pci_ioremap_bar(pci, 0); 1601 if (chip->remap_addr == NULL) { 1602 dev_err(card->dev, "AC'97 space ioremap problem\n"); 1603 snd_atiixp_free(chip); 1604 return -EIO; 1605 } 1606 1607 if (request_irq(pci->irq, snd_atiixp_interrupt, IRQF_SHARED, 1608 KBUILD_MODNAME, chip)) { 1582 #endif 1583 if (devm_request_irq(&pci->dev, pci->irq, snd_atiixp_interrupt, 1584 IRQF_SHARED, KBUILD_MODNAME, chip)) { 1609 1585 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); 1610 snd_atiixp_free(chip);1611 1586 return -EBUSY; 1612 1587 } 1613 1588 chip->irq = pci->irq; 1614 1589 card->sync_irq = chip->irq; 1590 card->private_free = snd_atiixp_free; 1615 1591 pci_set_master(pci); 1616 1592 1617 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); 1618 if (err < 0) { 1619 snd_atiixp_free(chip); 1620 return err; 1621 } 1622 1623 *r_chip = chip; 1624 return 0; 1625 } 1626 1627 1628 static int snd_atiixp_probe(struct pci_dev *pci, 1629 const struct pci_device_id *pci_id) 1593 return 0; 1594 } 1595 1596 1597 static int __snd_atiixp_probe(struct pci_dev *pci, 1598 const struct pci_device_id *pci_id) 1630 1599 { 1631 1600 struct snd_card *card; … … 1633 1602 int err; 1634 1603 1635 err = snd_card_new(&pci->dev, index, id, THIS_MODULE, 0, &card); 1604 err = snd_devm_card_new(&pci->dev, index, id, THIS_MODULE, 1605 sizeof(*chip), &card); 1636 1606 if (err < 0) 1637 1607 return err; 1608 chip = card->private_data; 1638 1609 1639 1610 strcpy(card->driver, spdif_aclink ? "ATIIXP" : "ATIIXP-SPDMA"); 1640 1611 strcpy(card->shortname, "ATI IXP"); 1641 err = snd_atiixp_ create(card, pci, &chip);1612 err = snd_atiixp_init(card, pci); 1642 1613 if (err < 0) 1643 goto __error; 1644 card->private_data = chip; 1614 return err; 1645 1615 1646 1616 err = snd_atiixp_aclink_reset(chip); 1647 1617 if (err < 0) 1648 goto __error;1618 return err; 1649 1619 1650 1620 chip->spdif_over_aclink = spdif_aclink; … … 1652 1622 err = snd_atiixp_mixer_new(chip, ac97_clock, ac97_quirk); 1653 1623 if (err < 0) 1654 goto __error;1624 return err; 1655 1625 1656 1626 err = snd_atiixp_pcm_new(chip); 1657 1627 if (err < 0) 1658 goto __error;1628 return err; 1659 1629 1660 1630 snd_atiixp_proc_init(chip); … … 1674 1644 err = snd_card_register(card); 1675 1645 if (err < 0) 1676 goto __error;1646 return err; 1677 1647 1678 1648 pci_set_drvdata(pci, card); 1679 1649 return 0; 1680 1681 __error: 1682 snd_card_free(card); 1683 return err; 1684 } 1685 1686 static void snd_atiixp_remove(struct pci_dev *pci) 1687 { 1688 snd_card_free(pci_get_drvdata(pci)); 1650 } 1651 1652 static int snd_atiixp_probe(struct pci_dev *pci, 1653 const struct pci_device_id *pci_id) 1654 { 1655 return snd_card_free_on_error(&pci->dev, __snd_atiixp_probe(pci, pci_id)); 1689 1656 } 1690 1657 … … 1693 1660 .id_table = snd_atiixp_ids, 1694 1661 .probe = snd_atiixp_probe, 1695 .remove = snd_atiixp_remove,1696 1662 .driver = { 1697 1663 .pm = SND_ATIIXP_PM_OPS,
Note:
See TracChangeset
for help on using the changeset viewer.