Skip to content

Commit

Permalink
ASoC: ep93xx-ac97: use devm_* helpers to cleanup probe
Browse files Browse the repository at this point in the history
Use the devm_* helpers to cleanup the probe routine. This also eliminates
having to carry the mem and irq values in the private data for the remove.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Tested-by: Mika Westerberg <mika.westerberg@iki.fi>
Acked-by: Mika Westerberg <mika.westerberg@iki.fi>
Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
  • Loading branch information
H Hartley Sweeten authored and Mark Brown committed Apr 1, 2012
1 parent b46b373 commit e7cff0a
Showing 1 changed file with 26 additions and 48 deletions.
74 changes: 26 additions & 48 deletions sound/soc/ep93xx/ep93xx-ac97.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,17 +87,13 @@
* struct ep93xx_ac97_info - EP93xx AC97 controller info structure
* @lock: mutex serializing access to the bus (slot 1 & 2 ops)
* @dev: pointer to the platform device dev structure
* @mem: physical memory resource for the registers
* @regs: mapped AC97 controller registers
* @irq: AC97 interrupt number
* @done: bus ops wait here for an interrupt
*/
struct ep93xx_ac97_info {
struct mutex lock;
struct device *dev;
struct resource *mem;
void __iomem *regs;
int irq;
struct completion done;
};

Expand Down Expand Up @@ -359,66 +355,50 @@ static struct snd_soc_dai_driver ep93xx_ac97_dai = {
static int __devinit ep93xx_ac97_probe(struct platform_device *pdev)
{
struct ep93xx_ac97_info *info;
struct resource *res;
unsigned int irq;
int ret;

info = kzalloc(sizeof(struct ep93xx_ac97_info), GFP_KERNEL);
info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
if (!info)
return -ENOMEM;

dev_set_drvdata(&pdev->dev, info);

mutex_init(&info->lock);
init_completion(&info->done);
info->dev = &pdev->dev;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;

info->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!info->mem) {
ret = -ENXIO;
goto fail_free_info;
}
info->regs = devm_request_and_ioremap(&pdev->dev, res);
if (!info->regs)
return -ENXIO;

info->irq = platform_get_irq(pdev, 0);
if (!info->irq) {
ret = -ENXIO;
goto fail_free_info;
}
irq = platform_get_irq(pdev, 0);
if (!irq)
return -ENODEV;

if (!request_mem_region(info->mem->start, resource_size(info->mem),
pdev->name)) {
ret = -EBUSY;
goto fail_free_info;
}
ret = devm_request_irq(&pdev->dev, irq, ep93xx_ac97_interrupt,
IRQF_TRIGGER_HIGH, pdev->name, info);
if (ret)
goto fail;

info->regs = ioremap(info->mem->start, resource_size(info->mem));
if (!info->regs) {
ret = -ENOMEM;
goto fail_release_mem;
}
dev_set_drvdata(&pdev->dev, info);

ret = request_irq(info->irq, ep93xx_ac97_interrupt, IRQF_TRIGGER_HIGH,
pdev->name, info);
if (ret)
goto fail_unmap_mem;
mutex_init(&info->lock);
init_completion(&info->done);
info->dev = &pdev->dev;

ep93xx_ac97_info = info;
platform_set_drvdata(pdev, info);

ret = snd_soc_register_dai(&pdev->dev, &ep93xx_ac97_dai);
if (ret)
goto fail_free_irq;
goto fail;

return 0;

fail_free_irq:
fail:
platform_set_drvdata(pdev, NULL);
free_irq(info->irq, info);
fail_unmap_mem:
iounmap(info->regs);
fail_release_mem:
release_mem_region(info->mem->start, resource_size(info->mem));
fail_free_info:
kfree(info);

ep93xx_ac97_info = NULL;
dev_set_drvdata(&pdev->dev, NULL);
return ret;
}

Expand All @@ -431,11 +411,9 @@ static int __devexit ep93xx_ac97_remove(struct platform_device *pdev)
/* disable the AC97 controller */
ep93xx_ac97_write_reg(info, AC97GCR, 0);

free_irq(info->irq, info);
iounmap(info->regs);
release_mem_region(info->mem->start, resource_size(info->mem));
platform_set_drvdata(pdev, NULL);
kfree(info);
ep93xx_ac97_info = NULL;
dev_set_drvdata(&pdev->dev, NULL);

return 0;
}
Expand Down

0 comments on commit e7cff0a

Please sign in to comment.