ASoC: ep93xx-ac97: use devm_* helpers to cleanup probe

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>
This commit is contained in:
H Hartley Sweeten 2012-03-26 16:00:08 -07:00 committed by Mark Brown
parent b46b373f40
commit e7cff0abf9

View file

@ -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;
};
@ -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;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
info->regs = devm_request_and_ioremap(&pdev->dev, res);
if (!info->regs)
return -ENXIO;
irq = platform_get_irq(pdev, 0);
if (!irq)
return -ENODEV;
ret = devm_request_irq(&pdev->dev, irq, ep93xx_ac97_interrupt,
IRQF_TRIGGER_HIGH, pdev->name, info);
if (ret)
goto fail;
dev_set_drvdata(&pdev->dev, info);
mutex_init(&info->lock);
init_completion(&info->done);
info->dev = &pdev->dev;
info->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!info->mem) {
ret = -ENXIO;
goto fail_free_info;
}
info->irq = platform_get_irq(pdev, 0);
if (!info->irq) {
ret = -ENXIO;
goto fail_free_info;
}
if (!request_mem_region(info->mem->start, resource_size(info->mem),
pdev->name)) {
ret = -EBUSY;
goto fail_free_info;
}
info->regs = ioremap(info->mem->start, resource_size(info->mem));
if (!info->regs) {
ret = -ENOMEM;
goto fail_release_mem;
}
ret = request_irq(info->irq, ep93xx_ac97_interrupt, IRQF_TRIGGER_HIGH,
pdev->name, info);
if (ret)
goto fail_unmap_mem;
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;
}
@ -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;
}