From 098493041a2ce8a35eada728e136e5a5edfe24ad Mon Sep 17 00:00:00 2001 From: Takashi Iwai Date: Thu, 15 Jul 2021 09:59:28 +0200 Subject: ALSA: msnd: Allocate resources with device-managed APIs This patch converts the resource management in ISA msnd drivers with devres as a clean up. Each manual resource management is converted with the corresponding devres helper. The remove callback became superfluous and dropped. This should give no user-visible functional changes. Link: https://lore.kernel.org/r/20210715075941.23332-67-tiwai@suse.de Signed-off-by: Takashi Iwai --- sound/isa/msnd/msnd_pinnacle.c | 119 ++++++++++------------------------------- 1 file changed, 28 insertions(+), 91 deletions(-) (limited to 'sound/isa') diff --git a/sound/isa/msnd/msnd_pinnacle.c b/sound/isa/msnd/msnd_pinnacle.c index 69647b41300d..4433a92f08e7 100644 --- a/sound/isa/msnd/msnd_pinnacle.c +++ b/sound/isa/msnd/msnd_pinnacle.c @@ -472,11 +472,6 @@ static int snd_msnd_dsp_full_reset(struct snd_card *card) return rv; } -static int snd_msnd_dev_free(struct snd_device *device) -{ - snd_printdd("snd_msnd_chip_free()\n"); - return 0; -} static int snd_msnd_send_dsp_cmd_chk(struct snd_msnd *chip, u8 cmd) { @@ -528,58 +523,47 @@ static int snd_msnd_attach(struct snd_card *card) { struct snd_msnd *chip = card->private_data; int err; - static const struct snd_device_ops ops = { - .dev_free = snd_msnd_dev_free, - }; - err = request_irq(chip->irq, snd_msnd_interrupt, 0, card->shortname, - chip); + err = devm_request_irq(card->dev, chip->irq, snd_msnd_interrupt, 0, + card->shortname, chip); if (err < 0) { printk(KERN_ERR LOGNAME ": Couldn't grab IRQ %d\n", chip->irq); return err; } card->sync_irq = chip->irq; - if (request_region(chip->io, DSP_NUMIO, card->shortname) == NULL) { - free_irq(chip->irq, chip); + if (!devm_request_region(card->dev, chip->io, DSP_NUMIO, + card->shortname)) return -EBUSY; - } - if (!request_mem_region(chip->base, BUFFSIZE, card->shortname)) { + if (!devm_request_mem_region(card->dev, chip->base, BUFFSIZE, + card->shortname)) { printk(KERN_ERR LOGNAME ": unable to grab memory region 0x%lx-0x%lx\n", chip->base, chip->base + BUFFSIZE - 1); - release_region(chip->io, DSP_NUMIO); - free_irq(chip->irq, chip); return -EBUSY; } - chip->mappedbase = ioremap(chip->base, 0x8000); + chip->mappedbase = devm_ioremap(card->dev, chip->base, 0x8000); if (!chip->mappedbase) { printk(KERN_ERR LOGNAME ": unable to map memory region 0x%lx-0x%lx\n", chip->base, chip->base + BUFFSIZE - 1); - err = -EIO; - goto err_release_region; + return -EIO; } err = snd_msnd_dsp_full_reset(card); if (err < 0) - goto err_release_region; - - /* Register device */ - err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops); - if (err < 0) - goto err_release_region; + return err; err = snd_msnd_pcm(card, 0); if (err < 0) { printk(KERN_ERR LOGNAME ": error creating new PCM device\n"); - goto err_release_region; + return err; } err = snd_msndmix_new(card); if (err < 0) { printk(KERN_ERR LOGNAME ": error creating new Mixer device\n"); - goto err_release_region; + return err; } @@ -595,7 +579,7 @@ static int snd_msnd_attach(struct snd_card *card) if (err < 0) { printk(KERN_ERR LOGNAME ": error creating new Midi device\n"); - goto err_release_region; + return err; } mpu = chip->rmidi->private_data; @@ -610,30 +594,12 @@ static int snd_msnd_attach(struct snd_card *card) err = snd_card_register(card); if (err < 0) - goto err_release_region; + return err; return 0; - -err_release_region: - iounmap(chip->mappedbase); - release_mem_region(chip->base, BUFFSIZE); - release_region(chip->io, DSP_NUMIO); - free_irq(chip->irq, chip); - return err; } -static void snd_msnd_unload(struct snd_card *card) -{ - struct snd_msnd *chip = card->private_data; - - iounmap(chip->mappedbase); - release_mem_region(chip->base, BUFFSIZE); - release_region(chip->io, DSP_NUMIO); - free_irq(chip->irq, chip); - snd_card_free(card); -} - #ifndef MSND_CLASSIC /* Pinnacle/Fiji Logical Device Configuration */ @@ -892,8 +858,8 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) return -ENODEV; } - err = snd_card_new(pdev, index[idx], id[idx], THIS_MODULE, - sizeof(struct snd_msnd), &card); + err = snd_devm_card_new(pdev, index[idx], id[idx], THIS_MODULE, + sizeof(struct snd_msnd), &card); if (err < 0) return err; @@ -934,17 +900,15 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) printk(KERN_INFO LOGNAME ": Non-PnP mode: configuring at port 0x%lx\n", cfg[idx]); - if (!request_region(cfg[idx], 2, "Pinnacle/Fiji Config")) { + if (!devm_request_region(card->dev, cfg[idx], 2, + "Pinnacle/Fiji Config")) { printk(KERN_ERR LOGNAME ": Config port 0x%lx conflict\n", cfg[idx]); - snd_card_free(card); return -EIO; } if (reset[idx]) - if (snd_msnd_pinnacle_cfg_reset(cfg[idx])) { - err = -EIO; - goto cfg_error; - } + if (snd_msnd_pinnacle_cfg_reset(cfg[idx])) + return -EIO; /* DSP */ err = snd_msnd_write_cfg_logical(cfg[idx], 0, @@ -952,7 +916,7 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) irq[idx], mem[idx]); if (err) - goto cfg_error; + return err; /* The following are Pinnacle specific */ @@ -967,7 +931,7 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) mpu_irq[idx], 0); if (err) - goto cfg_error; + return err; } /* IDE */ @@ -982,7 +946,7 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) ide_irq[idx], 0); if (err) - goto cfg_error; + return err; } /* Joystick */ @@ -995,9 +959,8 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) 0, 0); if (err) - goto cfg_error; + return err; } - release_region(cfg[idx], 2); #endif /* MSND_CLASSIC */ @@ -1027,37 +990,22 @@ static int snd_msnd_isa_probe(struct device *pdev, unsigned int idx) err = snd_msnd_probe(card); if (err < 0) { printk(KERN_ERR LOGNAME ": Probe failed\n"); - snd_card_free(card); return err; } err = snd_msnd_attach(card); if (err < 0) { printk(KERN_ERR LOGNAME ": Attach failed\n"); - snd_card_free(card); return err; } dev_set_drvdata(pdev, card); return 0; - -#ifndef MSND_CLASSIC -cfg_error: - release_region(cfg[idx], 2); - snd_card_free(card); - return err; -#endif -} - -static void snd_msnd_isa_remove(struct device *pdev, unsigned int dev) -{ - snd_msnd_unload(dev_get_drvdata(pdev)); } static struct isa_driver snd_msnd_driver = { .match = snd_msnd_isa_match, .probe = snd_msnd_isa_probe, - .remove = snd_msnd_isa_remove, /* FIXME: suspend, resume */ .driver = { .name = DEV_NAME @@ -1107,9 +1055,9 @@ static int snd_msnd_pnp_detect(struct pnp_card_link *pcard, * Create a new ALSA sound card entry, in anticipation * of detecting our hardware ... */ - ret = snd_card_new(&pcard->card->dev, - index[idx], id[idx], THIS_MODULE, - sizeof(struct snd_msnd), &card); + ret = snd_devm_card_new(&pcard->card->dev, + index[idx], id[idx], THIS_MODULE, + sizeof(struct snd_msnd), &card); if (ret < 0) return ret; @@ -1151,28 +1099,18 @@ static int snd_msnd_pnp_detect(struct pnp_card_link *pcard, ret = snd_msnd_probe(card); if (ret < 0) { printk(KERN_ERR LOGNAME ": Probe failed\n"); - goto _release_card; + return ret; } ret = snd_msnd_attach(card); if (ret < 0) { printk(KERN_ERR LOGNAME ": Attach failed\n"); - goto _release_card; + return ret; } pnp_set_card_drvdata(pcard, card); ++idx; return 0; - -_release_card: - snd_card_free(card); - return ret; -} - -static void snd_msnd_pnp_remove(struct pnp_card_link *pcard) -{ - snd_msnd_unload(pnp_get_card_drvdata(pcard)); - pnp_set_card_drvdata(pcard, NULL); } static int isa_registered; @@ -1191,7 +1129,6 @@ static struct pnp_card_driver msnd_pnpc_driver = { .name = "msnd_pinnacle", .id_table = msnd_pnpids, .probe = snd_msnd_pnp_detect, - .remove = snd_msnd_pnp_remove, }; #endif /* CONFIG_PNP */ -- cgit v1.2.3