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:
parent
b46b373f40
commit
e7cff0abf9
1 changed files with 26 additions and 48 deletions
|
@ -87,17 +87,13 @@
|
||||||
* struct ep93xx_ac97_info - EP93xx AC97 controller info structure
|
* struct ep93xx_ac97_info - EP93xx AC97 controller info structure
|
||||||
* @lock: mutex serializing access to the bus (slot 1 & 2 ops)
|
* @lock: mutex serializing access to the bus (slot 1 & 2 ops)
|
||||||
* @dev: pointer to the platform device dev structure
|
* @dev: pointer to the platform device dev structure
|
||||||
* @mem: physical memory resource for the registers
|
|
||||||
* @regs: mapped AC97 controller registers
|
* @regs: mapped AC97 controller registers
|
||||||
* @irq: AC97 interrupt number
|
|
||||||
* @done: bus ops wait here for an interrupt
|
* @done: bus ops wait here for an interrupt
|
||||||
*/
|
*/
|
||||||
struct ep93xx_ac97_info {
|
struct ep93xx_ac97_info {
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct resource *mem;
|
|
||||||
void __iomem *regs;
|
void __iomem *regs;
|
||||||
int irq;
|
|
||||||
struct completion done;
|
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)
|
static int __devinit ep93xx_ac97_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct ep93xx_ac97_info *info;
|
struct ep93xx_ac97_info *info;
|
||||||
|
struct resource *res;
|
||||||
|
unsigned int irq;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
info = kzalloc(sizeof(struct ep93xx_ac97_info), GFP_KERNEL);
|
info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
|
||||||
if (!info)
|
if (!info)
|
||||||
return -ENOMEM;
|
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);
|
dev_set_drvdata(&pdev->dev, info);
|
||||||
|
|
||||||
mutex_init(&info->lock);
|
mutex_init(&info->lock);
|
||||||
init_completion(&info->done);
|
init_completion(&info->done);
|
||||||
info->dev = &pdev->dev;
|
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;
|
ep93xx_ac97_info = info;
|
||||||
platform_set_drvdata(pdev, info);
|
platform_set_drvdata(pdev, info);
|
||||||
|
|
||||||
ret = snd_soc_register_dai(&pdev->dev, &ep93xx_ac97_dai);
|
ret = snd_soc_register_dai(&pdev->dev, &ep93xx_ac97_dai);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail_free_irq;
|
goto fail;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail_free_irq:
|
fail:
|
||||||
platform_set_drvdata(pdev, NULL);
|
platform_set_drvdata(pdev, NULL);
|
||||||
free_irq(info->irq, info);
|
ep93xx_ac97_info = NULL;
|
||||||
fail_unmap_mem:
|
dev_set_drvdata(&pdev->dev, NULL);
|
||||||
iounmap(info->regs);
|
|
||||||
fail_release_mem:
|
|
||||||
release_mem_region(info->mem->start, resource_size(info->mem));
|
|
||||||
fail_free_info:
|
|
||||||
kfree(info);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -431,11 +411,9 @@ static int __devexit ep93xx_ac97_remove(struct platform_device *pdev)
|
||||||
/* disable the AC97 controller */
|
/* disable the AC97 controller */
|
||||||
ep93xx_ac97_write_reg(info, AC97GCR, 0);
|
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);
|
platform_set_drvdata(pdev, NULL);
|
||||||
kfree(info);
|
ep93xx_ac97_info = NULL;
|
||||||
|
dev_set_drvdata(&pdev->dev, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue