Changeset 717 for GPL/trunk/alsa-kernel/pci/ca0106
- Timestamp:
- Aug 7, 2022, 6:11:12 PM (3 years ago)
- Location:
- GPL/trunk
- Files:
-
- 3 edited
-
. (modified) (1 prop)
-
alsa-kernel/pci/ca0106/ca0106.h (modified) (2 diffs)
-
alsa-kernel/pci/ca0106/ca0106_main.c (modified) (15 diffs)
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/ca0106/ca0106.h
r679 r717 668 668 669 669 unsigned long port; 670 struct resource *res_port;671 670 int irq; 672 671 … … 689 688 int capture_mic_line_in; 690 689 691 struct snd_dma_buffer buffer;690 struct snd_dma_buffer *buffer; 692 691 693 692 struct snd_ca_midi midi; -
GPL/trunk/alsa-kernel/pci/ca0106/ca0106_main.c
r703 r717 723 723 struct snd_ca0106_pcm *epcm = runtime->private_data; 724 724 int channel = epcm->channel_id; 725 u32 *table_base = (u32 *)(emu->buffer .area+(8*16*channel));725 u32 *table_base = (u32 *)(emu->buffer->area+(8*16*channel)); 726 726 u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); 727 727 u32 hcfg_mask = HCFG_PLAYBACK_S32_LE; … … 751 751 dev_dbg(emu->card->dev, 752 752 "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", 753 emu->buffer .addr, emu->buffer.area, emu->buffer.bytes);753 emu->buffer->addr, emu->buffer->area, emu->buffer->bytes); 754 754 #endif /* debug */ 755 755 /* Rate can be set per channel. */ … … 801 801 snd_ca0106_ptr_write(emu, 0x71, 0, reg71); 802 802 803 /* FIXME: Check emu->buffer .size before actually writing to it. */803 /* FIXME: Check emu->buffer->size before actually writing to it. */ 804 804 for(i=0; i < runtime->periods; i++) { 805 805 table_base[i*2] = runtime->dma_addr + (i * period_size_bytes); … … 807 807 } 808 808 809 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_ADDR, channel, emu->buffer .addr+(8*16*channel));809 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_ADDR, channel, emu->buffer->addr+(8*16*channel)); 810 810 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_SIZE, channel, (runtime->periods - 1) << 19); 811 811 snd_ca0106_ptr_write(emu, PLAYBACK_LIST_PTR, channel, 0); … … 858 858 dev_dbg(emu->card->dev, 859 859 "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", 860 emu->buffer .addr, emu->buffer.area, emu->buffer.bytes);860 emu->buffer->addr, emu->buffer->area, emu->buffer->bytes); 861 861 #endif /* debug */ 862 862 /* reg71 controls ADC rate. */ … … 1188 1188 static void ca0106_stop_chip(struct snd_ca0106 *chip); 1189 1189 1190 static int snd_ca0106_free(struct snd_ca0106 *chip) 1191 { 1192 if (chip->res_port != NULL) { 1193 /* avoid access to already used hardware */ 1194 ca0106_stop_chip(chip); 1195 } 1196 if (chip->irq >= 0) 1197 free_irq(chip->irq, chip); 1198 // release the data 1199 #if 1 1200 if (chip->buffer.area) 1201 snd_dma_free_pages(&chip->buffer); 1202 #endif 1203 1204 // release the i/o port 1205 release_and_free_resource(chip->res_port); 1206 1207 pci_disable_device(chip->pci); 1208 kfree(chip); 1209 return 0; 1210 } 1211 1212 static int snd_ca0106_dev_free(struct snd_device *device) 1213 { 1214 struct snd_ca0106 *chip = device->device_data; 1215 return snd_ca0106_free(chip); 1190 static void snd_ca0106_free(struct snd_card *card) 1191 { 1192 struct snd_ca0106 *chip = card->private_data; 1193 1194 ca0106_stop_chip(chip); 1216 1195 } 1217 1196 … … 1599 1578 1600 1579 static int snd_ca0106_create(int dev, struct snd_card *card, 1601 struct pci_dev *pci, 1602 struct snd_ca0106 **rchip) 1603 { 1604 struct snd_ca0106 *chip; 1580 struct pci_dev *pci) 1581 { 1582 struct snd_ca0106 *chip = card->private_data; 1605 1583 const struct snd_ca0106_details *c; 1606 1584 int err; 1607 static const struct snd_device_ops ops = { 1608 .dev_free = snd_ca0106_dev_free, 1609 }; 1610 1611 *rchip = NULL; 1612 1613 err = pci_enable_device(pci); 1585 1586 err = pcim_enable_device(pci); 1614 1587 if (err < 0) 1615 1588 return err; 1616 1589 if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(32))) { 1617 1590 dev_err(card->dev, "error to set 32bit mask DMA\n"); 1618 pci_disable_device(pci);1619 1591 return -ENXIO; 1620 }1621 1622 chip = kzalloc(sizeof(*chip), GFP_KERNEL);1623 if (chip == NULL) {1624 pci_disable_device(pci);1625 return -ENOMEM;1626 1592 } 1627 1593 … … 1632 1598 spin_lock_init(&chip->emu_lock); 1633 1599 1600 err = pci_request_regions(pci, "snd_ca0106"); 1601 if (err < 0) 1602 return err; 1634 1603 chip->port = pci_resource_start(pci, 0); 1635 chip->res_port = request_region(chip->port, 0x20, "snd_ca0106"); 1636 if (!chip->res_port) { 1637 snd_ca0106_free(chip); 1638 dev_err(card->dev, "cannot allocate the port\n"); 1639 return -EBUSY; 1640 } 1641 1642 if (request_irq(pci->irq, snd_ca0106_interrupt, 1643 IRQF_SHARED, KBUILD_MODNAME, chip)) { 1644 snd_ca0106_free(chip); 1604 1605 if (devm_request_irq(&pci->dev, pci->irq, snd_ca0106_interrupt, 1606 IRQF_SHARED, KBUILD_MODNAME, chip)) { 1645 1607 dev_err(card->dev, "cannot grab irq\n"); 1646 1608 return -EBUSY; … … 1650 1612 1651 1613 /* This stores the periods table. */ 1652 if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, 1653 1024, &chip->buffer) < 0) { 1654 snd_ca0106_free(chip); 1614 chip->buffer = snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, 1024); 1615 if (!chip->buffer) 1655 1616 return -ENOMEM; 1656 }1657 1658 1617 pci_set_master(pci); 1659 1618 /* read serial */ … … 1683 1642 1684 1643 ca0106_init_chip(chip, 0); 1685 1686 err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);1687 if (err < 0) {1688 snd_ca0106_free(chip);1689 return err;1690 }1691 *rchip = chip;1692 1644 return 0; 1693 1645 } … … 1777 1729 1778 1730 1779 static int snd_ca0106_probe(struct pci_dev *pci,1780 const struct pci_device_id *pci_id)1731 static int __snd_ca0106_probe(struct pci_dev *pci, 1732 const struct pci_device_id *pci_id) 1781 1733 { 1782 1734 static int dev; … … 1792 1744 } 1793 1745 1794 err = snd_ card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,1795 0, &card);1746 err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, 1747 sizeof(*chip), &card); 1796 1748 if (err < 0) 1797 1749 return err; 1798 1799 err = snd_ca0106_create(dev, card, pci, &chip); 1750 chip = card->private_data; 1751 1752 err = snd_ca0106_create(dev, card, pci); 1800 1753 if (err < 0) 1801 goto error;1802 card->private_ data = chip;1754 return err; 1755 card->private_free = snd_ca0106_free; 1803 1756 1804 1757 for (i = 0; i < 4; i++) { 1805 1758 err = snd_ca0106_pcm(chip, i); 1806 1759 if (err < 0) 1807 goto error;1760 return err; 1808 1761 } 1809 1762 … … 1812 1765 err = snd_ca0106_ac97(chip); 1813 1766 if (err < 0) 1814 goto error;1767 return err; 1815 1768 } 1816 1769 err = snd_ca0106_mixer(chip); 1817 1770 if (err < 0) 1818 goto error;1771 return err; 1819 1772 1820 1773 dev_dbg(card->dev, "probe for MIDI channel A ..."); 1821 1774 err = snd_ca0106_midi(chip, CA0106_MIDI_CHAN_A); 1822 1775 if (err < 0) 1823 goto error;1776 return err; 1824 1777 dev_dbg(card->dev, " done.\n"); 1825 1778 … … 1830 1783 err = snd_card_register(card); 1831 1784 if (err < 0) 1832 goto error;1785 return err; 1833 1786 1834 1787 pci_set_drvdata(pci, card); 1835 1788 dev++; 1836 1789 return 0; 1837 1838 error: 1839 snd_card_free(card); 1840 return err; 1841 } 1842 1843 static void snd_ca0106_remove(struct pci_dev *pci) 1844 { 1845 snd_card_free(pci_get_drvdata(pci)); 1790 } 1791 1792 static int snd_ca0106_probe(struct pci_dev *pci, 1793 const struct pci_device_id *pci_id) 1794 { 1795 return snd_card_free_on_error(&pci->dev, __snd_ca0106_probe(pci, pci_id)); 1846 1796 } 1847 1797 … … 1899 1849 .id_table = snd_ca0106_ids, 1900 1850 .probe = snd_ca0106_probe, 1901 .remove = snd_ca0106_remove,1902 1851 .driver = { 1903 1852 .pm = SND_CA0106_PM_OPS,
Note:
See TracChangeset
for help on using the changeset viewer.
