Skip to content

Commit

Permalink
ALSA: vx: Manage vx_core object with devres
Browse files Browse the repository at this point in the history
The firmware data are also released automatically.

Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
tiwai committed Jul 19, 2021
1 parent 5adfd8c commit a033954
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 25 deletions.
12 changes: 10 additions & 2 deletions sound/drivers/vx/vx_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,11 @@ int snd_vx_resume(struct vx_core *chip)
EXPORT_SYMBOL(snd_vx_resume);
#endif

static void snd_vx_release(struct device *dev, void *data)
{
snd_vx_free_firmware(data);
}

/**
* snd_vx_create - constructor for struct vx_core
* @card: card instance
Expand All @@ -784,6 +789,8 @@ EXPORT_SYMBOL(snd_vx_resume);
* this function allocates the instance and prepare for the hardware
* initialization.
*
* The object is managed via devres, and will be automatically released.
*
* return the instance pointer if successful, NULL in error.
*/
struct vx_core *snd_vx_create(struct snd_card *card,
Expand All @@ -796,8 +803,9 @@ struct vx_core *snd_vx_create(struct snd_card *card,
if (snd_BUG_ON(!card || !hw || !ops))
return NULL;

chip = kzalloc(sizeof(*chip) + extra_size, GFP_KERNEL);
if (! chip)
chip = devres_alloc(snd_vx_release, sizeof(*chip) + extra_size,
GFP_KERNEL);
if (!chip)
return NULL;
mutex_init(&chip->lock);
chip->irq = -1;
Expand Down
1 change: 0 additions & 1 deletion sound/pci/vx222/vx222.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,6 @@ static int snd_vx222_free(struct vx_core *chip)
if (vx->port[0])
pci_release_regions(vx->pci);
pci_disable_device(vx->pci);
kfree(chip);
return 0;
}

Expand Down
22 changes: 0 additions & 22 deletions sound/pcmcia/vx/vxpocket.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,19 +50,6 @@ static void vxpocket_release(struct pcmcia_device *link)
pcmcia_disable_device(link);
}

/*
* destructor, called from snd_card_free_when_closed()
*/
static int snd_vxpocket_dev_free(struct snd_device *device)
{
struct vx_core *chip = device->device_data;

snd_vx_free_firmware(chip);
kfree(chip);
return 0;
}


/*
* Hardware information
*/
Expand Down Expand Up @@ -122,21 +109,12 @@ static int snd_vxpocket_new(struct snd_card *card, int ibl,
{
struct vx_core *chip;
struct snd_vxpocket *vxp;
static const struct snd_device_ops ops = {
.dev_free = snd_vxpocket_dev_free,
};
int err;

chip = snd_vx_create(card, &vxpocket_hw, &snd_vxpocket_ops,
sizeof(struct snd_vxpocket) - sizeof(struct vx_core));
if (!chip)
return -ENOMEM;

err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
if (err < 0) {
kfree(chip);
return err;
}
chip->ibl.size = ibl;

vxp = to_vxpocket(chip);
Expand Down

0 comments on commit a033954

Please sign in to comment.