Changeset 717 for GPL/trunk/alsa-kernel/pci/cs4281.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/cs4281.c
r703 r717 1272 1272 #endif /* IS_REACHABLE(CONFIG_GAMEPORT) */ 1273 1273 1274 static int snd_cs4281_free(struct cs4281 *chip) 1275 { 1274 static void snd_cs4281_free(struct snd_card *card) 1275 { 1276 struct cs4281 *chip = card->private_data; 1277 1276 1278 snd_cs4281_free_gameport(chip); 1277 1279 … … 1282 1284 /* Sound System Power Management - Turn Everything OFF */ 1283 1285 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);1302 1286 } 1303 1287 … … 1306 1290 static int snd_cs4281_create(struct snd_card *card, 1307 1291 struct pci_dev *pci, 1308 struct cs4281 **rchip,1309 1292 int dual_codec) 1310 1293 { 1311 struct cs4281 *chip; 1312 unsigned int tmp; 1294 struct cs4281 *chip = card->private_data; 1313 1295 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); 1320 1298 if (err < 0) 1321 1299 return err; 1322 chip = kzalloc(sizeof(*chip), GFP_KERNEL);1323 if (chip == NULL) {1324 pci_disable_device(pci);1325 return -ENOMEM;1326 }1327 1300 spin_lock_init(&chip->reg_lock); 1328 1301 chip->card = card; … … 1336 1309 chip->dual_codec = dual_codec; 1337 1310 1311 #ifndef TARGET_OS2 1312 err = pcim_iomap_regions(pci, 0x03, "CS4281"); /* 2 BARs */ 1313 if (err < 0) 1314 return err; 1315 #else 1338 1316 err = pci_request_regions(pci, "CS4281"); 1339 1317 if (err < 0) { … … 1342 1320 return err; 1343 1321 } 1322 #endif 1344 1323 chip->ba0_addr = pci_resource_start(pci, 0); 1345 1324 chip->ba1_addr = pci_resource_start(pci, 1); 1346 1325 1326 #ifndef TARGET_OS2 1327 chip->ba0 = pcim_iomap_table(pci)[0]; 1328 chip->ba1 = pcim_iomap_table(pci)[1]; 1329 #else 1347 1330 chip->ba0 = pci_ioremap_bar(pci, 0); 1348 1331 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)) { 1356 1335 dev_err(card->dev, "unable to grab IRQ %d\n", pci->irq); 1357 snd_cs4281_free(chip);1358 1336 return -ENOMEM; 1359 1337 } 1360 1338 chip->irq = pci->irq; 1361 1339 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) 1372 1344 return err; 1373 }1374 1345 1375 1346 snd_cs4281_proc_init(chip); 1376 1377 *rchip = chip;1378 1347 return 0; 1379 1348 } … … 1875 1844 } 1876 1845 1877 static int snd_cs4281_probe(struct pci_dev *pci,1878 const struct pci_device_id *pci_id)1846 static int __snd_cs4281_probe(struct pci_dev *pci, 1847 const struct pci_device_id *pci_id) 1879 1848 { 1880 1849 static int dev; … … 1891 1860 } 1892 1861 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); 1895 1864 if (err < 0) 1896 1865 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) 1901 1870 return err; 1902 }1903 card->private_data = chip;1904 1871 1905 1872 err = snd_cs4281_mixer(chip); 1906 if (err < 0) { 1907 snd_card_free(card); 1873 if (err < 0) 1908 1874 return err; 1909 }1910 1875 err = snd_cs4281_pcm(chip, 0); 1911 if (err < 0) { 1912 snd_card_free(card); 1876 if (err < 0) 1913 1877 return err; 1914 }1915 1878 err = snd_cs4281_midi(chip, 0); 1916 if (err < 0) { 1917 snd_card_free(card); 1879 if (err < 0) 1918 1880 return err; 1919 }1920 1881 err = snd_opl3_new(card, OPL3_HW_OPL3_CS4281, &opl3); 1921 if (err < 0) { 1922 snd_card_free(card); 1882 if (err < 0) 1923 1883 return err; 1924 }1925 1884 opl3->private_data = chip; 1926 1885 opl3->command = snd_cs4281_opl3_command; 1927 1886 snd_opl3_init(opl3); 1928 1887 err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); 1929 if (err < 0) { 1930 snd_card_free(card); 1888 if (err < 0) 1931 1889 return err; 1932 }1933 1890 snd_cs4281_create_gameport(chip); 1934 1891 strcpy(card->driver, "CS4281"); … … 1940 1897 1941 1898 err = snd_card_register(card); 1942 if (err < 0) { 1943 snd_card_free(card); 1899 if (err < 0) 1944 1900 return err; 1945 }1946 1901 1947 1902 pci_set_drvdata(pci, card); … … 1950 1905 } 1951 1906 1952 static void snd_cs4281_remove(struct pci_dev *pci) 1953 { 1954 snd_card_free(pci_get_drvdata(pci)); 1907 static 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)); 1955 1911 } 1956 1912 … … 2058 2014 .id_table = snd_cs4281_ids, 2059 2015 .probe = snd_cs4281_probe, 2060 .remove = snd_cs4281_remove,2061 2016 .driver = { 2062 2017 .pm = CS4281_PM_OPS,
Note:
See TracChangeset
for help on using the changeset viewer.