ALSA: oxygen: Allocate resources with device-managed APIs
This patch converts the resource management in PCI oxygen drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper, and the page allocations are done with the devres helper. This should give no user-visible functional changes. Link: https://lore.kernel.org/r/20210715075941.23332-44-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
c19935f047
commit
596ae97ab0
@ -854,7 +854,6 @@ static struct pci_driver oxygen_driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.id_table = oxygen_ids,
|
||||
.probe = generic_oxygen_probe,
|
||||
.remove = oxygen_pci_remove,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.driver = {
|
||||
.pm = &oxygen_pci_pm,
|
||||
|
@ -161,7 +161,6 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
const struct pci_device_id *id
|
||||
)
|
||||
);
|
||||
void oxygen_pci_remove(struct pci_dev *pci);
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
extern const struct dev_pm_ops oxygen_pci_pm;
|
||||
#endif
|
||||
|
@ -570,15 +570,10 @@ static void oxygen_card_free(struct snd_card *card)
|
||||
struct oxygen *chip = card->private_data;
|
||||
|
||||
oxygen_shutdown(chip);
|
||||
if (chip->irq >= 0)
|
||||
free_irq(chip->irq, chip);
|
||||
flush_work(&chip->spdif_input_bits_work);
|
||||
flush_work(&chip->gpio_work);
|
||||
chip->model.cleanup(chip);
|
||||
kfree(chip->model_data);
|
||||
mutex_destroy(&chip->mutex);
|
||||
pci_release_regions(chip->pci);
|
||||
pci_disable_device(chip->pci);
|
||||
}
|
||||
|
||||
int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
@ -594,7 +589,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
const struct pci_device_id *pci_id;
|
||||
int err;
|
||||
|
||||
err = snd_card_new(&pci->dev, index, id, owner,
|
||||
err = snd_devm_card_new(&pci->dev, index, id, owner,
|
||||
sizeof(*chip), &card);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@ -610,41 +605,38 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
INIT_WORK(&chip->gpio_work, oxygen_gpio_changed);
|
||||
init_waitqueue_head(&chip->ac97_waitqueue);
|
||||
|
||||
err = pci_enable_device(pci);
|
||||
err = pcim_enable_device(pci);
|
||||
if (err < 0)
|
||||
goto err_card;
|
||||
return err;
|
||||
|
||||
err = pci_request_regions(pci, DRIVER);
|
||||
if (err < 0) {
|
||||
dev_err(card->dev, "cannot reserve PCI resources\n");
|
||||
goto err_pci_enable;
|
||||
return err;
|
||||
}
|
||||
|
||||
if (!(pci_resource_flags(pci, 0) & IORESOURCE_IO) ||
|
||||
pci_resource_len(pci, 0) < OXYGEN_IO_SIZE) {
|
||||
dev_err(card->dev, "invalid PCI I/O range\n");
|
||||
err = -ENXIO;
|
||||
goto err_pci_regions;
|
||||
return -ENXIO;
|
||||
}
|
||||
chip->addr = pci_resource_start(pci, 0);
|
||||
|
||||
pci_id = oxygen_search_pci_id(chip, ids);
|
||||
if (!pci_id) {
|
||||
err = -ENODEV;
|
||||
goto err_pci_regions;
|
||||
}
|
||||
if (!pci_id)
|
||||
return -ENODEV;
|
||||
|
||||
oxygen_restore_eeprom(chip, pci_id);
|
||||
err = get_model(chip, pci_id);
|
||||
if (err < 0)
|
||||
goto err_pci_regions;
|
||||
return err;
|
||||
|
||||
if (chip->model.model_data_size) {
|
||||
chip->model_data = kzalloc(chip->model.model_data_size,
|
||||
chip->model_data = devm_kzalloc(&pci->dev,
|
||||
chip->model.model_data_size,
|
||||
GFP_KERNEL);
|
||||
if (!chip->model_data) {
|
||||
err = -ENOMEM;
|
||||
goto err_pci_regions;
|
||||
}
|
||||
if (!chip->model_data)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pci_set_master(pci);
|
||||
@ -654,11 +646,11 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
oxygen_init(chip);
|
||||
chip->model.init(chip);
|
||||
|
||||
err = request_irq(pci->irq, oxygen_interrupt, IRQF_SHARED,
|
||||
KBUILD_MODNAME, chip);
|
||||
err = devm_request_irq(&pci->dev, pci->irq, oxygen_interrupt,
|
||||
IRQF_SHARED, KBUILD_MODNAME, chip);
|
||||
if (err < 0) {
|
||||
dev_err(card->dev, "cannot grab interrupt %d\n", pci->irq);
|
||||
goto err_card;
|
||||
return err;
|
||||
}
|
||||
chip->irq = pci->irq;
|
||||
card->sync_irq = chip->irq;
|
||||
@ -672,11 +664,11 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
|
||||
err = oxygen_pcm_init(chip);
|
||||
if (err < 0)
|
||||
goto err_card;
|
||||
return err;
|
||||
|
||||
err = oxygen_mixer_init(chip);
|
||||
if (err < 0)
|
||||
goto err_card;
|
||||
return err;
|
||||
|
||||
if (chip->model.device_config & (MIDI_OUTPUT | MIDI_INPUT)) {
|
||||
unsigned int info_flags =
|
||||
@ -689,7 +681,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
chip->addr + OXYGEN_MPU401,
|
||||
info_flags, -1, &chip->midi);
|
||||
if (err < 0)
|
||||
goto err_card;
|
||||
return err;
|
||||
}
|
||||
|
||||
oxygen_proc_init(chip);
|
||||
@ -704,27 +696,13 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
|
||||
err = snd_card_register(card);
|
||||
if (err < 0)
|
||||
goto err_card;
|
||||
return err;
|
||||
|
||||
pci_set_drvdata(pci, card);
|
||||
return 0;
|
||||
|
||||
err_pci_regions:
|
||||
pci_release_regions(pci);
|
||||
err_pci_enable:
|
||||
pci_disable_device(pci);
|
||||
err_card:
|
||||
snd_card_free(card);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(oxygen_pci_probe);
|
||||
|
||||
void oxygen_pci_remove(struct pci_dev *pci)
|
||||
{
|
||||
snd_card_free(pci_get_drvdata(pci));
|
||||
}
|
||||
EXPORT_SYMBOL(oxygen_pci_remove);
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int oxygen_pci_suspend(struct device *dev)
|
||||
{
|
||||
|
@ -137,7 +137,6 @@ static struct pci_driver se6x_driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.id_table = se6x_ids,
|
||||
.probe = se6x_probe,
|
||||
.remove = oxygen_pci_remove,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.driver = {
|
||||
.pm = &oxygen_pci_pm,
|
||||
|
@ -82,7 +82,6 @@ static struct pci_driver xonar_driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.id_table = xonar_ids,
|
||||
.probe = xonar_probe,
|
||||
.remove = oxygen_pci_remove,
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
.driver = {
|
||||
.pm = &oxygen_pci_pm,
|
||||
|
Loading…
Reference in New Issue
Block a user