Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: emu10k1: Allocate resources with device-managed APIs

This patch converts the resource management in PCI emu10k1 driver with
devres as a clean up. Each manual resource management is converted
with the corresponding devres helper, the page allocations are done
with the devres helper, and the card object release is managed now via
card->private_free instead of a lowlevel snd_device.

This should give no user-visible functional changes.

Link: https://lore.kernel.org/r/20210715075941.23332-34-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>

+52 -131
+2 -4
include/sound/emu10k1.h
··· 1701 1701 struct snd_dma_buffer silent_page; /* silent page */ 1702 1702 struct snd_dma_buffer ptb_pages; /* page table pages */ 1703 1703 struct snd_dma_device p16v_dma_dev; 1704 - struct snd_dma_buffer p16v_buffer; 1704 + struct snd_dma_buffer *p16v_buffer; 1705 1705 1706 1706 struct snd_util_memhdr *memhdr; /* page allocation list */ 1707 1707 ··· 1796 1796 unsigned short extout_mask, 1797 1797 long max_cache_bytes, 1798 1798 int enable_ir, 1799 - uint subsystem, 1800 - struct snd_emu10k1 ** remu); 1799 + uint subsystem); 1801 1800 1802 1801 int snd_emu10k1_pcm(struct snd_emu10k1 *emu, int device); 1803 1802 int snd_emu10k1_pcm_mic(struct snd_emu10k1 *emu, int device); 1804 1803 int snd_emu10k1_pcm_efx(struct snd_emu10k1 *emu, int device); 1805 1804 int snd_p16v_pcm(struct snd_emu10k1 *emu, int device); 1806 - int snd_p16v_free(struct snd_emu10k1 * emu); 1807 1805 int snd_p16v_mixer(struct snd_emu10k1 * emu); 1808 1806 int snd_emu10k1_pcm_multi(struct snd_emu10k1 *emu, int device); 1809 1807 int snd_emu10k1_fx8010_pcm(struct snd_emu10k1 *emu, int device);
+21 -32
sound/pci/emu10k1/emu10k1.c
··· 99 99 return -ENOENT; 100 100 } 101 101 102 - err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, 103 - 0, &card); 102 + err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, 103 + sizeof(*emu), &card); 104 104 if (err < 0) 105 105 return err; 106 + emu = card->private_data; 107 + 106 108 if (max_buffer_size[dev] < 32) 107 109 max_buffer_size[dev] = 32; 108 110 else if (max_buffer_size[dev] > 1024) 109 111 max_buffer_size[dev] = 1024; 110 112 err = snd_emu10k1_create(card, pci, extin[dev], extout[dev], 111 113 (long)max_buffer_size[dev] * 1024 * 1024, 112 - enable_ir[dev], subsystem[dev], 113 - &emu); 114 + enable_ir[dev], subsystem[dev]); 114 115 if (err < 0) 115 - goto error; 116 - card->private_data = emu; 116 + return err; 117 117 emu->delay_pcm_irq = delay_pcm_irq[dev] & 0x1f; 118 118 err = snd_emu10k1_pcm(emu, 0); 119 119 if (err < 0) 120 - goto error; 120 + return err; 121 121 err = snd_emu10k1_pcm_mic(emu, 1); 122 122 if (err < 0) 123 - goto error; 123 + return err; 124 124 err = snd_emu10k1_pcm_efx(emu, 2); 125 125 if (err < 0) 126 - goto error; 126 + return err; 127 127 /* This stores the periods table. */ 128 128 if (emu->card_capabilities->ca0151_chip) { /* P16V */ 129 - err = snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, &pci->dev, 130 - 1024, &emu->p16v_buffer); 131 - if (err < 0) 132 - goto error; 129 + emu->p16v_buffer = 130 + snd_devm_alloc_pages(&pci->dev, SNDRV_DMA_TYPE_DEV, 1024); 131 + if (!emu->p16v_buffer) 132 + return -ENOMEM; 133 133 } 134 134 135 135 err = snd_emu10k1_mixer(emu, 0, 3); 136 136 if (err < 0) 137 - goto error; 137 + return err; 138 138 139 139 err = snd_emu10k1_timer(emu, 0); 140 140 if (err < 0) 141 - goto error; 141 + return err; 142 142 143 143 err = snd_emu10k1_pcm_multi(emu, 3); 144 144 if (err < 0) 145 - goto error; 145 + return err; 146 146 if (emu->card_capabilities->ca0151_chip) { /* P16V */ 147 147 err = snd_p16v_pcm(emu, 4); 148 148 if (err < 0) 149 - goto error; 149 + return err; 150 150 } 151 151 if (emu->audigy) { 152 152 err = snd_emu10k1_audigy_midi(emu); 153 153 if (err < 0) 154 - goto error; 154 + return err; 155 155 } else { 156 156 err = snd_emu10k1_midi(emu); 157 157 if (err < 0) 158 - goto error; 158 + return err; 159 159 } 160 160 err = snd_emu10k1_fx8010_new(emu, 0); 161 161 if (err < 0) 162 - goto error; 162 + return err; 163 163 #ifdef ENABLE_SYNTH 164 164 if (snd_seq_device_new(card, 1, SNDRV_SEQ_DEV_ID_EMU10K1_SYNTH, 165 165 sizeof(struct snd_emu10k1_synth_arg), &wave) < 0 || ··· 187 187 188 188 err = snd_card_register(card); 189 189 if (err < 0) 190 - goto error; 190 + return err; 191 191 192 192 if (emu->card_capabilities->emu_model) 193 193 schedule_delayed_work(&emu->emu1010.firmware_work, 0); ··· 195 195 pci_set_drvdata(pci, card); 196 196 dev++; 197 197 return 0; 198 - 199 - error: 200 - snd_card_free(card); 201 - return err; 202 198 } 203 - 204 - static void snd_card_emu10k1_remove(struct pci_dev *pci) 205 - { 206 - snd_card_free(pci_get_drvdata(pci)); 207 - } 208 - 209 199 210 200 #ifdef CONFIG_PM_SLEEP 211 201 static int snd_emu10k1_suspend(struct device *dev) ··· 253 263 .name = KBUILD_MODNAME, 254 264 .id_table = snd_emu10k1_ids, 255 265 .probe = snd_card_emu10k1_probe, 256 - .remove = snd_card_emu10k1_remove, 257 266 .driver = { 258 267 .pm = SND_EMU10K1_PM_OPS, 259 268 },
+25 -77
sound/pci/emu10k1/emu10k1_main.c
··· 1242 1242 static void free_pm_buffer(struct snd_emu10k1 *emu); 1243 1243 #endif 1244 1244 1245 - static int snd_emu10k1_free(struct snd_emu10k1 *emu) 1245 + static void snd_emu10k1_free(struct snd_card *card) 1246 1246 { 1247 + struct snd_emu10k1 *emu = card->private_data; 1248 + 1247 1249 if (emu->port) { /* avoid access to already used hardware */ 1248 1250 snd_emu10k1_fx8010_tram_setup(emu, 0); 1249 1251 snd_emu10k1_done(emu); ··· 1258 1256 cancel_delayed_work_sync(&emu->emu1010.firmware_work); 1259 1257 release_firmware(emu->firmware); 1260 1258 release_firmware(emu->dock_fw); 1261 - if (emu->irq >= 0) 1262 - free_irq(emu->irq, emu); 1263 1259 snd_util_memhdr_free(emu->memhdr); 1264 1260 if (emu->silent_page.area) 1265 1261 snd_dma_free_pages(&emu->silent_page); ··· 1268 1268 #ifdef CONFIG_PM_SLEEP 1269 1269 free_pm_buffer(emu); 1270 1270 #endif 1271 - if (emu->port) 1272 - pci_release_regions(emu->pci); 1273 - if (emu->card_capabilities->ca0151_chip) /* P16V */ 1274 - snd_p16v_free(emu); 1275 - pci_disable_device(emu->pci); 1276 - kfree(emu); 1277 - return 0; 1278 - } 1279 - 1280 - static int snd_emu10k1_dev_free(struct snd_device *device) 1281 - { 1282 - struct snd_emu10k1 *emu = device->device_data; 1283 - return snd_emu10k1_free(emu); 1284 1271 } 1285 1272 1286 1273 static const struct snd_emu_chip_details emu_chip_details[] = { ··· 1769 1782 unsigned short extout_mask, 1770 1783 long max_cache_bytes, 1771 1784 int enable_ir, 1772 - uint subsystem, 1773 - struct snd_emu10k1 **remu) 1785 + uint subsystem) 1774 1786 { 1775 - struct snd_emu10k1 *emu; 1787 + struct snd_emu10k1 *emu = card->private_data; 1776 1788 int idx, err; 1777 1789 int is_audigy; 1778 1790 size_t page_table_size; 1779 1791 __le32 *pgtbl; 1780 1792 unsigned int silent_page; 1781 1793 const struct snd_emu_chip_details *c; 1782 - static const struct snd_device_ops ops = { 1783 - .dev_free = snd_emu10k1_dev_free, 1784 - }; 1785 - 1786 - *remu = NULL; 1787 1794 1788 1795 /* enable PCI device */ 1789 - err = pci_enable_device(pci); 1796 + err = pcim_enable_device(pci); 1790 1797 if (err < 0) 1791 1798 return err; 1792 1799 1793 - emu = kzalloc(sizeof(*emu), GFP_KERNEL); 1794 - if (emu == NULL) { 1795 - pci_disable_device(pci); 1796 - return -ENOMEM; 1797 - } 1800 + card->private_free = snd_emu10k1_free; 1798 1801 emu->card = card; 1799 1802 spin_lock_init(&emu->reg_lock); 1800 1803 spin_lock_init(&emu->emu_lock); ··· 1827 1850 } 1828 1851 if (c->vendor == 0) { 1829 1852 dev_err(card->dev, "emu10k1: Card not recognised\n"); 1830 - kfree(emu); 1831 - pci_disable_device(pci); 1832 1853 return -ENOENT; 1833 1854 } 1834 1855 emu->card_capabilities = c; ··· 1858 1883 dev_err(card->dev, 1859 1884 "architecture does not support PCI busmaster DMA with mask 0x%lx\n", 1860 1885 emu->dma_mask); 1861 - kfree(emu); 1862 - pci_disable_device(pci); 1863 1886 return -ENXIO; 1864 1887 } 1865 1888 if (is_audigy) ··· 1866 1893 emu->gpr_base = FXGPREGBASE; 1867 1894 1868 1895 err = pci_request_regions(pci, "EMU10K1"); 1869 - if (err < 0) { 1870 - kfree(emu); 1871 - pci_disable_device(pci); 1896 + if (err < 0) 1872 1897 return err; 1873 - } 1874 1898 emu->port = pci_resource_start(pci, 0); 1875 1899 1876 1900 emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT; ··· 1875 1905 page_table_size = sizeof(u32) * (emu->address_mode ? MAXPAGES1 : 1876 1906 MAXPAGES0); 1877 1907 if (snd_emu10k1_alloc_pages_maybe_wider(emu, page_table_size, 1878 - &emu->ptb_pages) < 0) { 1879 - err = -ENOMEM; 1880 - goto error; 1881 - } 1908 + &emu->ptb_pages) < 0) 1909 + return -ENOMEM; 1882 1910 dev_dbg(card->dev, "page table address range is %.8lx:%.8lx\n", 1883 1911 (unsigned long)emu->ptb_pages.addr, 1884 1912 (unsigned long)(emu->ptb_pages.addr + emu->ptb_pages.bytes)); ··· 1885 1917 emu->max_cache_pages)); 1886 1918 emu->page_addr_table = vmalloc(array_size(sizeof(unsigned long), 1887 1919 emu->max_cache_pages)); 1888 - if (emu->page_ptr_table == NULL || emu->page_addr_table == NULL) { 1889 - err = -ENOMEM; 1890 - goto error; 1891 - } 1920 + if (!emu->page_ptr_table || !emu->page_addr_table) 1921 + return -ENOMEM; 1892 1922 1893 1923 if (snd_emu10k1_alloc_pages_maybe_wider(emu, EMUPAGESIZE, 1894 - &emu->silent_page) < 0) { 1895 - err = -ENOMEM; 1896 - goto error; 1897 - } 1924 + &emu->silent_page) < 0) 1925 + return -ENOMEM; 1898 1926 dev_dbg(card->dev, "silent page range is %.8lx:%.8lx\n", 1899 1927 (unsigned long)emu->silent_page.addr, 1900 1928 (unsigned long)(emu->silent_page.addr + 1901 1929 emu->silent_page.bytes)); 1902 1930 1903 1931 emu->memhdr = snd_util_memhdr_new(emu->max_cache_pages * PAGE_SIZE); 1904 - if (emu->memhdr == NULL) { 1905 - err = -ENOMEM; 1906 - goto error; 1907 - } 1932 + if (!emu->memhdr) 1933 + return -ENOMEM; 1908 1934 emu->memhdr->block_extra_size = sizeof(struct snd_emu10k1_memblk) - 1909 1935 sizeof(struct snd_util_memblk); 1910 1936 ··· 1916 1954 if (emu->card_capabilities->ca_cardbus_chip) { 1917 1955 err = snd_emu10k1_cardbus_init(emu); 1918 1956 if (err < 0) 1919 - goto error; 1957 + return err; 1920 1958 } 1921 1959 if (emu->card_capabilities->ecard) { 1922 1960 err = snd_emu10k1_ecard_init(emu); 1923 1961 if (err < 0) 1924 - goto error; 1962 + return err; 1925 1963 } else if (emu->card_capabilities->emu_model) { 1926 1964 err = snd_emu10k1_emu1010_init(emu); 1927 - if (err < 0) { 1928 - snd_emu10k1_free(emu); 1965 + if (err < 0) 1929 1966 return err; 1930 - } 1931 1967 } else { 1932 1968 /* 5.1: Enable the additional AC97 Slots. If the emu10k1 version 1933 1969 does not support this, it shouldn't do any harm */ ··· 1939 1979 emu->fx8010.etram_pages.bytes = 0; 1940 1980 1941 1981 /* irq handler must be registered after I/O ports are activated */ 1942 - if (request_irq(pci->irq, snd_emu10k1_interrupt, IRQF_SHARED, 1943 - KBUILD_MODNAME, emu)) { 1944 - err = -EBUSY; 1945 - goto error; 1946 - } 1982 + if (devm_request_irq(&pci->dev, pci->irq, snd_emu10k1_interrupt, 1983 + IRQF_SHARED, KBUILD_MODNAME, emu)) 1984 + return -EBUSY; 1947 1985 emu->irq = pci->irq; 1948 1986 card->sync_irq = emu->irq; 1949 1987 ··· 1980 2022 1981 2023 err = snd_emu10k1_init(emu, enable_ir, 0); 1982 2024 if (err < 0) 1983 - goto error; 2025 + return err; 1984 2026 #ifdef CONFIG_PM_SLEEP 1985 2027 err = alloc_pm_buffer(emu); 1986 2028 if (err < 0) 1987 - goto error; 2029 + return err; 1988 2030 #endif 1989 2031 1990 2032 /* Initialize the effect engine */ 1991 2033 err = snd_emu10k1_init_efx(emu); 1992 2034 if (err < 0) 1993 - goto error; 2035 + return err; 1994 2036 snd_emu10k1_audio_enable(emu); 1995 - 1996 - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, emu, &ops); 1997 - if (err < 0) 1998 - goto error; 1999 2037 2000 2038 #ifdef CONFIG_SND_PROC_FS 2001 2039 snd_emu10k1_proc_init(emu); 2002 2040 #endif 2003 - 2004 - *remu = emu; 2005 2041 return 0; 2006 - 2007 - error: 2008 - snd_emu10k1_free(emu); 2009 - return err; 2010 2042 } 2011 2043 2012 2044 #ifdef CONFIG_PM_SLEEP
+4 -18
sound/pci/emu10k1/p16v.c
··· 290 290 struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); 291 291 struct snd_pcm_runtime *runtime = substream->runtime; 292 292 int channel = substream->pcm->device - emu->p16v_device_offset; 293 - u32 *table_base = (u32 *)(emu->p16v_buffer.area+(8*16*channel)); 293 + u32 *table_base = (u32 *)(emu->p16v_buffer->area+(8*16*channel)); 294 294 u32 period_size_bytes = frames_to_bytes(runtime, runtime->period_size); 295 295 int i; 296 296 u32 tmp; ··· 308 308 runtime->dma_addr, runtime->dma_area, table_base); 309 309 dev_dbg(emu->card->dev, 310 310 "dma_addr=%x, dma_area=%p, dma_bytes(size)=%x\n", 311 - emu->p16v_buffer.addr, emu->p16v_buffer.area, 312 - emu->p16v_buffer.bytes); 311 + emu->p16v_buffer->addr, emu->p16v_buffer->area, 312 + emu->p16v_buffer->bytes); 313 313 #endif /* debug */ 314 314 tmp = snd_emu10k1_ptr_read(emu, A_SPDIF_SAMPLERATE, channel); 315 315 switch (runtime->rate) { ··· 333 333 table_base[(i*2)+1]=period_size_bytes<<16; 334 334 } 335 335 336 - snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_ADDR, channel, emu->p16v_buffer.addr+(8*16*channel)); 336 + snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_ADDR, channel, emu->p16v_buffer->addr+(8*16*channel)); 337 337 snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_SIZE, channel, (runtime->periods - 1) << 19); 338 338 snd_emu10k1_ptr20_write(emu, PLAYBACK_LIST_PTR, channel, 0); 339 339 snd_emu10k1_ptr20_write(emu, PLAYBACK_DMA_ADDR, channel, runtime->dma_addr); ··· 566 566 .trigger = snd_p16v_pcm_trigger_capture, 567 567 .pointer = snd_p16v_pcm_pointer_capture, 568 568 }; 569 - 570 - 571 - int snd_p16v_free(struct snd_emu10k1 *chip) 572 - { 573 - // release the data 574 - if (chip->p16v_buffer.area) { 575 - snd_dma_free_pages(&chip->p16v_buffer); 576 - /* 577 - dev_dbg(chip->card->dev, "period lables free: %p\n", 578 - &chip->p16v_buffer); 579 - */ 580 - } 581 - return 0; 582 - } 583 569 584 570 int snd_p16v_pcm(struct snd_emu10k1 *emu, int device) 585 571 {