Commit 0e175f66 authored by Takashi Iwai's avatar Takashi Iwai

ALSA: als4000: Allocate resources with device-managed APIs

This patch converts the resource management in PCI als4000 driver with
devres as a clean up.  Each manual resource management is converted
with the corresponding 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-11-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 21a9314c
...@@ -746,13 +746,15 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev) ...@@ -746,13 +746,15 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
if (joystick_port[dev] == 1) { /* auto-detect */ if (joystick_port[dev] == 1) { /* auto-detect */
for (io_port = 0x200; io_port <= 0x218; io_port += 8) { for (io_port = 0x200; io_port <= 0x218; io_port += 8) {
r = request_region(io_port, 8, "ALS4000 gameport"); r = devm_request_region(&acard->pci->dev, io_port, 8,
"ALS4000 gameport");
if (r) if (r)
break; break;
} }
} else { } else {
io_port = joystick_port[dev]; io_port = joystick_port[dev];
r = request_region(io_port, 8, "ALS4000 gameport"); r = devm_request_region(&acard->pci->dev, io_port, 8,
"ALS4000 gameport");
} }
if (!r) { if (!r) {
...@@ -763,7 +765,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev) ...@@ -763,7 +765,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
acard->gameport = gp = gameport_allocate_port(); acard->gameport = gp = gameport_allocate_port();
if (!gp) { if (!gp) {
dev_err(&acard->pci->dev, "cannot allocate memory for gameport\n"); dev_err(&acard->pci->dev, "cannot allocate memory for gameport\n");
release_and_free_resource(r);
return -ENOMEM; return -ENOMEM;
} }
...@@ -771,7 +772,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev) ...@@ -771,7 +772,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
gameport_set_phys(gp, "pci%s/gameport0", pci_name(acard->pci)); gameport_set_phys(gp, "pci%s/gameport0", pci_name(acard->pci));
gameport_set_dev_parent(gp, &acard->pci->dev); gameport_set_dev_parent(gp, &acard->pci->dev);
gp->io = io_port; gp->io = io_port;
gameport_set_port_data(gp, r);
/* Enable legacy joystick port */ /* Enable legacy joystick port */
snd_als4000_set_addr(acard->iobase, 0, 0, 0, 1); snd_als4000_set_addr(acard->iobase, 0, 0, 0, 1);
...@@ -784,15 +784,11 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev) ...@@ -784,15 +784,11 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
static void snd_als4000_free_gameport(struct snd_card_als4000 *acard) static void snd_als4000_free_gameport(struct snd_card_als4000 *acard)
{ {
if (acard->gameport) { if (acard->gameport) {
struct resource *r = gameport_get_port_data(acard->gameport);
gameport_unregister_port(acard->gameport); gameport_unregister_port(acard->gameport);
acard->gameport = NULL; acard->gameport = NULL;
/* disable joystick */ /* disable joystick */
snd_als4000_set_addr(acard->iobase, 0, 0, 0, 0); snd_als4000_set_addr(acard->iobase, 0, 0, 0, 0);
release_and_free_resource(r);
} }
} }
#else #else
...@@ -808,8 +804,6 @@ static void snd_card_als4000_free( struct snd_card *card ) ...@@ -808,8 +804,6 @@ static void snd_card_als4000_free( struct snd_card *card )
snd_als4k_gcr_write_addr(acard->iobase, ALS4K_GCR8C_MISC_CTRL, 0); snd_als4k_gcr_write_addr(acard->iobase, ALS4K_GCR8C_MISC_CTRL, 0);
/* free resources */ /* free resources */
snd_als4000_free_gameport(acard); snd_als4000_free_gameport(acard);
pci_release_regions(acard->pci);
pci_disable_device(acard->pci);
} }
static int snd_card_als4000_probe(struct pci_dev *pci, static int snd_card_als4000_probe(struct pci_dev *pci,
...@@ -832,36 +826,30 @@ static int snd_card_als4000_probe(struct pci_dev *pci, ...@@ -832,36 +826,30 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
} }
/* enable PCI device */ /* enable PCI device */
err = pci_enable_device(pci); err = pcim_enable_device(pci);
if (err < 0) if (err < 0)
return err; return err;
/* check, if we can restrict PCI DMA transfers to 24 bits */ /* check, if we can restrict PCI DMA transfers to 24 bits */
if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) { if (dma_set_mask_and_coherent(&pci->dev, DMA_BIT_MASK(24))) {
dev_err(&pci->dev, "architecture does not support 24bit PCI busmaster DMA\n"); dev_err(&pci->dev, "architecture does not support 24bit PCI busmaster DMA\n");
pci_disable_device(pci);
return -ENXIO; return -ENXIO;
} }
err = pci_request_regions(pci, "ALS4000"); err = pci_request_regions(pci, "ALS4000");
if (err < 0) { if (err < 0)
pci_disable_device(pci);
return err; return err;
}
iobase = pci_resource_start(pci, 0); iobase = pci_resource_start(pci, 0);
pci_read_config_word(pci, PCI_COMMAND, &word); pci_read_config_word(pci, PCI_COMMAND, &word);
pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO); pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO);
pci_set_master(pci); pci_set_master(pci);
err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
sizeof(*acard) /* private_data: acard */, sizeof(*acard) /* private_data: acard */,
&card); &card);
if (err < 0) { if (err < 0)
pci_release_regions(pci);
pci_disable_device(pci);
return err; return err;
}
acard = card->private_data; acard = card->private_data;
acard->pci = pci; acard->pci = pci;
...@@ -881,7 +869,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci, ...@@ -881,7 +869,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
SB_HW_ALS4000, SB_HW_ALS4000,
&chip); &chip);
if (err < 0) if (err < 0)
goto out_err; return err;
acard->chip = chip; acard->chip = chip;
chip->pci = pci; chip->pci = pci;
...@@ -902,7 +890,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci, ...@@ -902,7 +890,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
if (err < 0) { if (err < 0) {
dev_err(&pci->dev, "no MPU-401 device at 0x%lx?\n", dev_err(&pci->dev, "no MPU-401 device at 0x%lx?\n",
iobase + ALS4K_IOB_30_MIDI_DATA); iobase + ALS4K_IOB_30_MIDI_DATA);
goto out_err; return err;
} }
/* FIXME: ALS4000 has interesting MPU401 configuration features /* FIXME: ALS4000 has interesting MPU401 configuration features
* at ALS4K_CR1A_MPU401_UART_MODE_CONTROL * at ALS4K_CR1A_MPU401_UART_MODE_CONTROL
...@@ -912,11 +900,11 @@ static int snd_card_als4000_probe(struct pci_dev *pci, ...@@ -912,11 +900,11 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
err = snd_als4000_pcm(chip, 0); err = snd_als4000_pcm(chip, 0);
if (err < 0) if (err < 0)
goto out_err; return err;
err = snd_sbmixer_new(chip); err = snd_sbmixer_new(chip);
if (err < 0) if (err < 0)
goto out_err; return err;
if (snd_opl3_create(card, if (snd_opl3_create(card,
iobase + ALS4K_IOB_10_ADLIB_ADDR0, iobase + ALS4K_IOB_10_ADLIB_ADDR0,
...@@ -928,30 +916,18 @@ static int snd_card_als4000_probe(struct pci_dev *pci, ...@@ -928,30 +916,18 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
} else { } else {
err = snd_opl3_hwdep_new(opl3, 0, 1, NULL); err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
if (err < 0) if (err < 0)
goto out_err; return err;
} }
snd_als4000_create_gameport(acard, dev); snd_als4000_create_gameport(acard, dev);
err = snd_card_register(card); err = snd_card_register(card);
if (err < 0) if (err < 0)
goto out_err; return err;
pci_set_drvdata(pci, card); pci_set_drvdata(pci, card);
dev++; dev++;
err = 0; return 0;
goto out;
out_err:
snd_card_free(card);
out:
return err;
}
static void snd_card_als4000_remove(struct pci_dev *pci)
{
snd_card_free(pci_get_drvdata(pci));
} }
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
...@@ -996,7 +972,6 @@ static struct pci_driver als4000_driver = { ...@@ -996,7 +972,6 @@ static struct pci_driver als4000_driver = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
.id_table = snd_als4000_ids, .id_table = snd_als4000_ids,
.probe = snd_card_als4000_probe, .probe = snd_card_als4000_probe,
.remove = snd_card_als4000_remove,
.driver = { .driver = {
.pm = SND_ALS4000_PM_OPS, .pm = SND_ALS4000_PM_OPS,
}, },
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment