forked from Minki/linux
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.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
21a9314cf9
commit
0e175f6659
@ -746,13 +746,15 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
|
||||
|
||||
if (joystick_port[dev] == 1) { /* auto-detect */
|
||||
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)
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
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) {
|
||||
@ -763,7 +765,6 @@ static int snd_als4000_create_gameport(struct snd_card_als4000 *acard, int dev)
|
||||
acard->gameport = gp = gameport_allocate_port();
|
||||
if (!gp) {
|
||||
dev_err(&acard->pci->dev, "cannot allocate memory for gameport\n");
|
||||
release_and_free_resource(r);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
@ -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_dev_parent(gp, &acard->pci->dev);
|
||||
gp->io = io_port;
|
||||
gameport_set_port_data(gp, r);
|
||||
|
||||
/* Enable legacy joystick port */
|
||||
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)
|
||||
static void snd_als4000_free_gameport(struct snd_card_als4000 *acard)
|
||||
{
|
||||
if (acard->gameport) {
|
||||
struct resource *r = gameport_get_port_data(acard->gameport);
|
||||
|
||||
gameport_unregister_port(acard->gameport);
|
||||
acard->gameport = NULL;
|
||||
|
||||
/* disable joystick */
|
||||
snd_als4000_set_addr(acard->iobase, 0, 0, 0, 0);
|
||||
|
||||
release_and_free_resource(r);
|
||||
}
|
||||
}
|
||||
#else
|
||||
@ -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);
|
||||
/* free resources */
|
||||
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,
|
||||
@ -832,36 +826,30 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
|
||||
}
|
||||
|
||||
/* enable PCI device */
|
||||
err = pci_enable_device(pci);
|
||||
err = pcim_enable_device(pci);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* check, if we can restrict PCI DMA transfers to 24 bits */
|
||||
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");
|
||||
pci_disable_device(pci);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
err = pci_request_regions(pci, "ALS4000");
|
||||
if (err < 0) {
|
||||
pci_disable_device(pci);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
iobase = pci_resource_start(pci, 0);
|
||||
|
||||
pci_read_config_word(pci, PCI_COMMAND, &word);
|
||||
pci_write_config_word(pci, PCI_COMMAND, word | PCI_COMMAND_IO);
|
||||
pci_set_master(pci);
|
||||
|
||||
err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
|
||||
sizeof(*acard) /* private_data: acard */,
|
||||
&card);
|
||||
if (err < 0) {
|
||||
pci_release_regions(pci);
|
||||
pci_disable_device(pci);
|
||||
err = snd_devm_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE,
|
||||
sizeof(*acard) /* private_data: acard */,
|
||||
&card);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
acard = card->private_data;
|
||||
acard->pci = pci;
|
||||
@ -881,7 +869,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
|
||||
SB_HW_ALS4000,
|
||||
&chip);
|
||||
if (err < 0)
|
||||
goto out_err;
|
||||
return err;
|
||||
acard->chip = chip;
|
||||
|
||||
chip->pci = pci;
|
||||
@ -902,7 +890,7 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
|
||||
if (err < 0) {
|
||||
dev_err(&pci->dev, "no MPU-401 device at 0x%lx?\n",
|
||||
iobase + ALS4K_IOB_30_MIDI_DATA);
|
||||
goto out_err;
|
||||
return err;
|
||||
}
|
||||
/* FIXME: ALS4000 has interesting MPU401 configuration features
|
||||
* at ALS4K_CR1A_MPU401_UART_MODE_CONTROL
|
||||
@ -912,11 +900,11 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
|
||||
|
||||
err = snd_als4000_pcm(chip, 0);
|
||||
if (err < 0)
|
||||
goto out_err;
|
||||
return err;
|
||||
|
||||
err = snd_sbmixer_new(chip);
|
||||
if (err < 0)
|
||||
goto out_err;
|
||||
return err;
|
||||
|
||||
if (snd_opl3_create(card,
|
||||
iobase + ALS4K_IOB_10_ADLIB_ADDR0,
|
||||
@ -928,30 +916,18 @@ static int snd_card_als4000_probe(struct pci_dev *pci,
|
||||
} else {
|
||||
err = snd_opl3_hwdep_new(opl3, 0, 1, NULL);
|
||||
if (err < 0)
|
||||
goto out_err;
|
||||
return err;
|
||||
}
|
||||
|
||||
snd_als4000_create_gameport(acard, dev);
|
||||
|
||||
err = snd_card_register(card);
|
||||
if (err < 0)
|
||||
goto out_err;
|
||||
return err;
|
||||
|
||||
pci_set_drvdata(pci, card);
|
||||
dev++;
|
||||
err = 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));
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -996,7 +972,6 @@ static struct pci_driver als4000_driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.id_table = snd_als4000_ids,
|
||||
.probe = snd_card_als4000_probe,
|
||||
.remove = snd_card_als4000_remove,
|
||||
.driver = {
|
||||
.pm = SND_ALS4000_PM_OPS,
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user