Skip to content

Commit

Permalink
ALSA: es1688: Avoid devres management for es1688 object creation
Browse files Browse the repository at this point in the history
The recent refactoring of es1688 object creation with the use of
devres caused a problem with the non-PnP probe of GUS driver, as it
tries to probe multiple times with different parameters  That is, this
object needs the immediate resource release and the devres doesn't fit
for it.

This patch reverts partially the commit for restoring the classic
resource management for es1688 object.

Fixes: 1bb11c1 ("ALSA: es1688: Allocate resources with device-managed APIs")
Reported-by: kernel test robot <[email protected]>
Link: https://lore.kernel.org/r/20210805032513.GA30485@xsang-OptiPlex-9020
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
tiwai committed Aug 5, 2021
1 parent ddddc0d commit df8bcf3
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 9 deletions.
1 change: 1 addition & 0 deletions include/sound/es1688.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

struct snd_es1688 {
unsigned long port; /* port of ESS chip */
struct resource *res_port;
unsigned long mpu_port; /* MPU-401 port of ESS chip */
int irq; /* IRQ number of ESS chip */
int mpu_irq; /* MPU IRQ */
Expand Down
29 changes: 20 additions & 9 deletions sound/isa/es1688/es1688_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -580,6 +580,13 @@ static int snd_es1688_free(struct snd_es1688 *chip)
{
if (chip->hardware != ES1688_HW_UNDEF)
snd_es1688_init(chip, 0);
release_and_free_resource(chip->res_port);
if (chip->irq >= 0)
free_irq(chip->irq, (void *) chip);
if (chip->dma8 >= 0) {
disable_dma(chip->dma8);
free_dma(chip->dma8);
}
return 0;
}

Expand Down Expand Up @@ -617,25 +624,26 @@ int snd_es1688_create(struct snd_card *card,
chip->dma8 = -1;
chip->hardware = ES1688_HW_UNDEF;

if (!devm_request_region(card->dev, port + 4, 12, "ES1688")) {
chip->res_port = request_region(port + 4, 12, "ES1688");
if (chip->res_port == NULL) {
snd_printk(KERN_ERR "es1688: can't grab port 0x%lx\n", port + 4);
return -EBUSY;
err = -EBUSY;
goto exit;
}

err = devm_request_irq(card->dev, irq, snd_es1688_interrupt, 0,
"ES1688", (void *) chip);
err = request_irq(irq, snd_es1688_interrupt, 0, "ES1688", (void *) chip);
if (err < 0) {
snd_printk(KERN_ERR "es1688: can't grab IRQ %d\n", irq);
return err;
goto exit;
}

chip->irq = irq;
card->sync_irq = chip->irq;
err = snd_devm_request_dma(card->dev, dma8, "ES1688");
err = request_dma(dma8, "ES1688");

if (err < 0) {
snd_printk(KERN_ERR "es1688: can't grab DMA8 %d\n", dma8);
return err;
goto exit;
}
chip->dma8 = dma8;

Expand All @@ -651,14 +659,17 @@ int snd_es1688_create(struct snd_card *card,

err = snd_es1688_probe(chip);
if (err < 0)
return err;
goto exit;

err = snd_es1688_init(chip, 1);
if (err < 0)
return err;
goto exit;

/* Register device */
err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
exit:
if (err)
snd_es1688_free(chip);
return err;
}

Expand Down

0 comments on commit df8bcf3

Please sign in to comment.